ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL29ic29sZXRlL2RldmZzIGIvRG9jdW1lbnRhdGlvbi9BQkkvcmVtb3ZlZC9kZXZmcwpzaW1pbGFyaXR5IGluZGV4IDcyJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0FCSS9vYnNvbGV0ZS9kZXZmcwpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9BQkkvcmVtb3ZlZC9kZXZmcwppbmRleCBiOGI4NzM5Li44MTk1YzRlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS9vYnNvbGV0ZS9kZXZmcworKysgYi9Eb2N1bWVudGF0aW9uL0FCSS9yZW1vdmVkL2RldmZzCkBAIC0xLDEzICsxLDEyIEBACiBXaGF0OgkJZGV2ZnMKLURhdGU6CQlKdWx5IDIwMDUKK0RhdGU6CQlKdWx5IDIwMDUgKHNjaGVkdWxlZCksIGZpbmFsbHkgcmVtb3ZlZCBpbiBrZXJuZWwgdjIuNi4xOAogQ29udGFjdDoJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KIERlc2NyaXB0aW9uOgogCWRldmZzIGhhcyBiZWVuIHVubWFpbnRhaW5lZCBmb3IgYSBudW1iZXIgb2YgeWVhcnMsIGhhcyB1bmZpeGFibGUKIAlyYWNlcywgY29udGFpbnMgYSBuYW1pbmcgcG9saWN5IHdpdGhpbiB0aGUga2VybmVsIHRoYXQgaXMKIAlhZ2FpbnN0IHRoZSBMU0IsIGFuZCBjYW4gYmUgcmVwbGFjZWQgYnkgdXNpbmcgdWRldi4KLQlUaGUgZmlsZXMgZnMvZGV2ZnMvKiwgaW5jbHVkZS9saW51eC9kZXZmc19mcyouaCB3aWxsIGJlIHJlbW92ZWQsCisJVGhlIGZpbGVzIGZzL2RldmZzLyosIGluY2x1ZGUvbGludXgvZGV2ZnNfZnMqLmggd2VyZSByZW1vdmVkLAogCWFsb25nIHdpdGggdGhlIHRoZSBhc3NvcnRlZCBkZXZmcyBmdW5jdGlvbiBjYWxscyB0aHJvdWdob3V0IHRoZQogCWtlcm5lbCB0cmVlLgogCiBVc2VyczoKLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1wb3dlciBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg4MmY4MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtcG93ZXIKQEAgLTAsMCArMSw4OCBAQAorV2hhdDoJCS9zeXMvcG93ZXIvCitEYXRlOgkJQXVndXN0IDIwMDYKK0NvbnRhY3Q6CVJhZmFlbCBKLiBXeXNvY2tpIDxyandAc2lzay5wbD4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgL3N5cy9wb3dlciBkaXJlY3Rvcnkgd2lsbCBjb250YWluIGZpbGVzIHRoYXQgd2lsbAorCQlwcm92aWRlIGEgdW5pZmllZCBpbnRlcmZhY2UgdG8gdGhlIHBvd2VyIG1hbmFnZW1lbnQKKwkJc3Vic3lzdGVtLgorCitXaGF0OgkJL3N5cy9wb3dlci9zdGF0ZQorRGF0ZToJCUF1Z3VzdCAyMDA2CitDb250YWN0OglSYWZhZWwgSi4gV3lzb2NraSA8cmp3QHNpc2sucGw+CitEZXNjcmlwdGlvbjoKKwkJVGhlIC9zeXMvcG93ZXIvc3RhdGUgZmlsZSBjb250cm9scyB0aGUgc3lzdGVtIHBvd2VyIHN0YXRlLgorCQlSZWFkaW5nIGZyb20gdGhpcyBmaWxlIHJldHVybnMgd2hhdCBzdGF0ZXMgYXJlIHN1cHBvcnRlZCwKKwkJd2hpY2ggaXMgaGFyZC1jb2RlZCB0byAnc3RhbmRieScgKFBvd2VyLU9uIFN1c3BlbmQpLCAnbWVtJworCQkoU3VzcGVuZC10by1SQU0pLCBhbmQgJ2Rpc2snIChTdXNwZW5kLXRvLURpc2spLgorCisJCVdyaXRpbmcgdG8gdGhpcyBmaWxlIG9uZSBvZiB0aGVzZSBzdHJpbmdzIGNhdXNlcyB0aGUgc3lzdGVtIHRvCisJCXRyYW5zaXRpb24gaW50byB0aGF0IHN0YXRlLiBQbGVhc2Ugc2VlIHRoZSBmaWxlCisJCURvY3VtZW50YXRpb24vcG93ZXIvc3RhdGVzLnR4dCBmb3IgYSBkZXNjcmlwdGlvbiBvZiBlYWNoIG9mCisJCXRoZXNlIHN0YXRlcy4KKworV2hhdDoJCS9zeXMvcG93ZXIvZGlzaworRGF0ZToJCUF1Z3VzdCAyMDA2CitDb250YWN0OglSYWZhZWwgSi4gV3lzb2NraSA8cmp3QHNpc2sucGw+CitEZXNjcmlwdGlvbjoKKwkJVGhlIC9zeXMvcG93ZXIvZGlzayBmaWxlIGNvbnRyb2xzIHRoZSBvcGVyYXRpbmcgbW9kZSBvZiB0aGUKKwkJc3VzcGVuZC10by1kaXNrIG1lY2hhbmlzbS4gIFJlYWRpbmcgZnJvbSB0aGlzIGZpbGUgcmV0dXJucworCQl0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJ5IHdoaWNoIHRoZSBzeXN0ZW0gd2lsbCBiZSBwdXQgdG8KKwkJc2xlZXAgb24gdGhlIG5leHQgc3VzcGVuZC4gIFRoZXJlIGFyZSBmb3VyIG1ldGhvZHMgc3VwcG9ydGVkOgorCQknZmlybXdhcmUnIC0gbWVhbnMgdGhhdCB0aGUgbWVtb3J5IGltYWdlIHdpbGwgYmUgc2F2ZWQgdG8gZGlzaworCQlieSBzb21lIGZpcm13YXJlLCBpbiB3aGljaCBjYXNlIHdlIGFsc28gYXNzdW1lIHRoYXQgdGhlCisJCWZpcm13YXJlIHdpbGwgaGFuZGxlIHRoZSBzeXN0ZW0gc3VzcGVuZC4KKwkJJ3BsYXRmb3JtJyAtIHRoZSBtZW1vcnkgaW1hZ2Ugd2lsbCBiZSBzYXZlZCBieSB0aGUga2VybmVsIGFuZAorCQl0aGUgc3lzdGVtIHdpbGwgYmUgcHV0IHRvIHNsZWVwIGJ5IHRoZSBwbGF0Zm9ybSBkcml2ZXIgKGUuZy4KKwkJQUNQSSBvciBvdGhlciBQTSByZWdpc3RlcnMpLgorCQknc2h1dGRvd24nIC0gdGhlIG1lbW9yeSBpbWFnZSB3aWxsIGJlIHNhdmVkIGJ5IHRoZSBrZXJuZWwgYW5kCisJCXRoZSBzeXN0ZW0gd2lsbCBiZSBwb3dlcmVkIG9mZi4KKwkJJ3JlYm9vdCcgLSB0aGUgbWVtb3J5IGltYWdlIHdpbGwgYmUgc2F2ZWQgYnkgdGhlIGtlcm5lbCBhbmQKKwkJdGhlIHN5c3RlbSB3aWxsIGJlIHJlYm9vdGVkLgorCisJCVRoZSBzdXNwZW5kLXRvLWRpc2sgbWV0aG9kIG1heSBiZSBjaG9zZW4gYnkgd3JpdGluZyB0byB0aGlzCisJCWZpbGUgb25lIG9mIHRoZSBhY2NlcHRlZCBzdHJpbmdzOgorCisJCSdmaXJtd2FyZScKKwkJJ3BsYXRmb3JtJworCQknc2h1dGRvd24nCisJCSdyZWJvb3QnCisKKwkJSXQgd2lsbCBvbmx5IGNoYW5nZSB0byAnZmlybXdhcmUnIG9yICdwbGF0Zm9ybScgaWYgdGhlIHN5c3RlbQorCQlzdXBwb3J0cyB0aGF0LgorCitXaGF0OgkJL3N5cy9wb3dlci9pbWFnZV9zaXplCitEYXRlOgkJQXVndXN0IDIwMDYKK0NvbnRhY3Q6CVJhZmFlbCBKLiBXeXNvY2tpIDxyandAc2lzay5wbD4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgL3N5cy9wb3dlci9pbWFnZV9zaXplIGZpbGUgY29udHJvbHMgdGhlIHNpemUgb2YgdGhlIGltYWdlCisJCWNyZWF0ZWQgYnkgdGhlIHN1c3BlbmQtdG8tZGlzayBtZWNoYW5pc20uICBJdCBjYW4gYmUgd3JpdHRlbiBhCisJCXN0cmluZyByZXByZXNlbnRpbmcgYSBub24tbmVnYXRpdmUgaW50ZWdlciB0aGF0IHdpbGwgYmUgdXNlZAorCQlhcyBhbiB1cHBlciBsaW1pdCBvZiB0aGUgaW1hZ2Ugc2l6ZSwgaW4gYnl0ZXMuICBUaGUga2VybmVsJ3MKKwkJc3VzcGVuZC10by1kaXNrIGNvZGUgd2lsbCBkbyBpdHMgYmVzdCB0byBlbnN1cmUgdGhlIGltYWdlIHNpemUKKwkJd2lsbCBub3QgZXhjZWVkIHRoaXMgbnVtYmVyLiAgSG93ZXZlciwgaWYgaXQgdHVybnMgb3V0IHRvIGJlCisJCWltcG9zc2libGUsIHRoZSBrZXJuZWwgd2lsbCB0cnkgdG8gc3VzcGVuZCBhbnl3YXkgdXNpbmcgdGhlCisJCXNtYWxsZXN0IGltYWdlIHBvc3NpYmxlLiAgSW4gcGFydGljdWxhciwgaWYgIjAiIGlzIHdyaXR0ZW4gdG8KKwkJdGhpcyBmaWxlLCB0aGUgc3VzcGVuZCBpbWFnZSB3aWxsIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLgorCisJCVJlYWRpbmcgZnJvbSB0aGlzIGZpbGUgd2lsbCBkaXNwbGF5IHRoZSBjdXJyZW50IGltYWdlIHNpemUKKwkJbGltaXQsIHdoaWNoIGlzIHNldCB0byA1MDAgTUIgYnkgZGVmYXVsdC4KKworV2hhdDoJCS9zeXMvcG93ZXIvcG1fdHJhY2UKK0RhdGU6CQlBdWd1c3QgMjAwNgorQ29udGFjdDoJUmFmYWVsIEouIFd5c29ja2kgPHJqd0BzaXNrLnBsPgorRGVzY3JpcHRpb246CisJCVRoZSAvc3lzL3Bvd2VyL3BtX3RyYWNlIGZpbGUgY29udHJvbHMgdGhlIGNvZGUgd2hpY2ggc2F2ZXMgdGhlCisJCWxhc3QgUE0gZXZlbnQgcG9pbnQgaW4gdGhlIFJUQyBhY3Jvc3MgcmVib290cywgc28gdGhhdCB5b3UgY2FuCisJCWRlYnVnIGEgbWFjaGluZSB0aGF0IGp1c3QgaGFuZ3MgZHVyaW5nIHN1c3BlbmQgKG9yIG1vcmUKKwkJY29tbW9ubHksIGR1cmluZyByZXN1bWUpLiAgTmFtZWx5LCB0aGUgUlRDIGlzIG9ubHkgdXNlZCB0byBzYXZlCisJCXRoZSBsYXN0IFBNIGV2ZW50IHBvaW50IGlmIHRoaXMgZmlsZSBjb250YWlucyAnMScuICBJbml0aWFsbHkKKwkJaXQgY29udGFpbnMgJzAnIHdoaWNoIG1heSBiZSBjaGFuZ2VkIHRvICcxJyBieSB3cml0aW5nIGEKKwkJc3RyaW5nIHJlcHJlc2VudGluZyBhIG5vbnplcm8gaW50ZWdlciBpbnRvIGl0LgorCisJCVRvIHVzZSB0aGlzIGRlYnVnZ2luZyBmZWF0dXJlIHlvdSBzaG91bGQgYXR0ZW1wdCB0byBzdXNwZW5kCisJCXRoZSBtYWNoaW5lLCB0aGVuIHJlYm9vdCBpdCBhbmQgcnVuCisKKwkJZG1lc2cgLXMgMTAwMDAwMCB8IGdyZXAgJ2hhc2ggbWF0Y2hlcycKKworCQlDQVVUSU9OOiBVc2luZyBpdCB3aWxsIGNhdXNlIHlvdXIgbWFjaGluZSdzIHJlYWwtdGltZSAoQ01PUykKKwkJY2xvY2sgdG8gYmUgc2V0IHRvIGEgcmFuZG9tIGludmFsaWQgdGltZSBhZnRlciBhIHJlc3VtZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay91c2IudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay91c2IudG1wbAppbmRleCAzMjBhZjI1Li4zNjA4NDcyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdXNiLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3VzYi50bXBsCkBAIC00Myw1OSArNDMsNTIgQEAKIAogICAgIDxwYXJhPkEgVW5pdmVyc2FsIFNlcmlhbCBCdXMgKFVTQikgaXMgdXNlZCB0byBjb25uZWN0IGEgaG9zdCwKICAgICBzdWNoIGFzIGEgUEMgb3Igd29ya3N0YXRpb24sIHRvIGEgbnVtYmVyIG9mIHBlcmlwaGVyYWwKLSAgICBkZXZpY2VzLiAgVVNCIHVzZXMgYSB0cmVlIHN0cnVjdHVyZSwgd2l0aCB0aGUgaG9zdCBhdCB0aGUKKyAgICBkZXZpY2VzLiAgVVNCIHVzZXMgYSB0cmVlIHN0cnVjdHVyZSwgd2l0aCB0aGUgaG9zdCBhcyB0aGUKICAgICByb290ICh0aGUgc3lzdGVtJ3MgbWFzdGVyKSwgaHVicyBhcyBpbnRlcmlvciBub2RlcywgYW5kCi0gICAgcGVyaXBoZXJhbCBkZXZpY2VzIGFzIGxlYXZlcyAoYW5kIHNsYXZlcykuCisgICAgcGVyaXBoZXJhbHMgYXMgbGVhdmVzIChhbmQgc2xhdmVzKS4KICAgICBNb2Rlcm4gUENzIHN1cHBvcnQgc2V2ZXJhbCBzdWNoIHRyZWVzIG9mIFVTQiBkZXZpY2VzLCB1c3VhbGx5CiAgICAgb25lIFVTQiAyLjAgdHJlZSAoNDgwIE1iaXQvc2VjIGVhY2gpIHdpdGgKICAgICBhIGZldyBVU0IgMS4xIHRyZWVzICgxMiBNYml0L3NlYyBlYWNoKSB0aGF0IGFyZSB1c2VkIHdoZW4geW91CiAgICAgY29ubmVjdCBhIFVTQiAxLjEgZGV2aWNlIGRpcmVjdGx5IHRvIHRoZSBtYWNoaW5lJ3MgInJvb3QgaHViIi4KICAgICA8L3BhcmE+CiAKLSAgICA8cGFyYT5UaGF0IG1hc3Rlci9zbGF2ZSBhc3ltbWV0cnkgd2FzIGRlc2lnbmVkIGluIHBhcnQgZm9yCi0gICAgZWFzZSBvZiB1c2UuICBJdCBpcyBub3QgcGh5c2ljYWxseSBwb3NzaWJsZSB0byBhc3NlbWJsZQotICAgIChsZWdhbCkgVVNCIGNhYmxlcyBpbmNvcnJlY3RseTogIGFsbCB1cHN0cmVhbSAidG8tdGhlLWhvc3QiCi0gICAgY29ubmVjdG9ycyBhcmUgdGhlIHJlY3Rhbmd1bGFyIHR5cGUsIG1hdGNoaW5nIHRoZSBzb2NrZXRzIG9uCi0gICAgcm9vdCBodWJzLCBhbmQgdGhlIGRvd25zdHJlYW0gdHlwZSBhcmUgdGhlIHNxdWFyaXNoIHR5cGUKLSAgICAob3IgdGhleSBhcmUgYnVpbHQgaW4gdG8gdGhlIHBlcmlwaGVyYWwpLgotICAgIFNvZnR3YXJlIGRvZXNuJ3QgbmVlZCB0byBkZWFsIHdpdGggZGlzdHJpYnV0ZWQgYXV0b2NvbmZpZ3VyYXRpb24KLSAgICBzaW5jZSB0aGUgcHJlLWRlc2lnbmF0ZWQgbWFzdGVyIG5vZGUgbWFuYWdlcyBhbGwgdGhhdC4KLSAgICBBdCB0aGUgZWxlY3RyaWNhbCBsZXZlbCwgYnVzIHByb3RvY29sIG92ZXJoZWFkIGlzIHJlZHVjZWQgYnkKLSAgICBlbGltaW5hdGluZyBhcmJpdHJhdGlvbiBhbmQgbW92aW5nIHNjaGVkdWxpbmcgaW50byBob3N0IHNvZnR3YXJlLgorICAgIDxwYXJhPlRoYXQgbWFzdGVyL3NsYXZlIGFzeW1tZXRyeSB3YXMgZGVzaWduZWQtaW4gZm9yIGEgbnVtYmVyIG9mCisgICAgcmVhc29ucywgb25lIGJlaW5nIGVhc2Ugb2YgdXNlLiAgSXQgaXMgbm90IHBoeXNpY2FsbHkgcG9zc2libGUgdG8KKyAgICBhc3NlbWJsZSAobGVnYWwpIFVTQiBjYWJsZXMgaW5jb3JyZWN0bHk6ICBhbGwgdXBzdHJlYW0gInRvIHRoZSBob3N0IgorICAgIGNvbm5lY3RvcnMgYXJlIHRoZSByZWN0YW5ndWxhciB0eXBlIChtYXRjaGluZyB0aGUgc29ja2V0cyBvbgorICAgIHJvb3QgaHVicyksIGFuZCBhbGwgZG93bnN0cmVhbSBjb25uZWN0b3JzIGFyZSB0aGUgc3F1YXJpc2ggdHlwZQorICAgIChvciB0aGV5IGFyZSBidWlsdCBpbnRvIHRoZSBwZXJpcGhlcmFsKS4KKyAgICBBbHNvLCB0aGUgaG9zdCBzb2Z0d2FyZSBkb2Vzbid0IG5lZWQgdG8gZGVhbCB3aXRoIGRpc3RyaWJ1dGVkCisgICAgYXV0by1jb25maWd1cmF0aW9uIHNpbmNlIHRoZSBwcmUtZGVzaWduYXRlZCBtYXN0ZXIgbm9kZSBtYW5hZ2VzIGFsbCB0aGF0LgorICAgIEFuZCBmaW5hbGx5LCBhdCB0aGUgZWxlY3RyaWNhbCBsZXZlbCwgYnVzIHByb3RvY29sIG92ZXJoZWFkIGlzIHJlZHVjZWQgYnkKKyAgICBlbGltaW5hdGluZyBhcmJpdHJhdGlvbiBhbmQgbW92aW5nIHNjaGVkdWxpbmcgaW50byB0aGUgaG9zdCBzb2Z0d2FyZS4KICAgICA8L3BhcmE+CiAKLSAgICA8cGFyYT5VU0IgMS4wIHdhcyBhbm5vdW5jZWQgaW4gSmFudWFyeSAxOTk2LCBhbmQgd2FzIHJldmlzZWQKKyAgICA8cGFyYT5VU0IgMS4wIHdhcyBhbm5vdW5jZWQgaW4gSmFudWFyeSAxOTk2IGFuZCB3YXMgcmV2aXNlZAogICAgIGFzIFVTQiAxLjEgKHdpdGggaW1wcm92ZW1lbnRzIGluIGh1YiBzcGVjaWZpY2F0aW9uIGFuZAogICAgIHN1cHBvcnQgZm9yIGludGVycnVwdC1vdXQgdHJhbnNmZXJzKSBpbiBTZXB0ZW1iZXIgMTk5OC4KLSAgICBVU0IgMi4wIHdhcyByZWxlYXNlZCBpbiBBcHJpbCAyMDAwLCBpbmNsdWRpbmcgaGlnaCBzcGVlZAotICAgIHRyYW5zZmVycyBhbmQgdHJhbnNhY3Rpb24gdHJhbnNsYXRpbmcgaHVicyAodXNlZCBmb3IgVVNCIDEuMQorICAgIFVTQiAyLjAgd2FzIHJlbGVhc2VkIGluIEFwcmlsIDIwMDAsIGFkZGluZyBoaWdoLXNwZWVkCisgICAgdHJhbnNmZXJzIGFuZCB0cmFuc2FjdGlvbi10cmFuc2xhdGluZyBodWJzICh1c2VkIGZvciBVU0IgMS4xCiAgICAgYW5kIDEuMCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KS4KICAgICA8L3BhcmE+CiAKLSAgICA8cGFyYT5VU0Igc3VwcG9ydCB3YXMgYWRkZWQgdG8gTGludXggZWFybHkgaW4gdGhlIDIuMiBrZXJuZWwgc2VyaWVzCi0gICAgc2hvcnRseSBiZWZvcmUgdGhlIDIuMyBkZXZlbG9wbWVudCBmb3JrZWQgb2ZmLiAgVXBkYXRlcwotICAgIGZyb20gMi4zIHdlcmUgcmVndWxhcmx5IGZvbGRlZCBiYWNrIGludG8gMi4yIHJlbGVhc2VzLCBicmluZ2luZwotICAgIG5ldyBmZWF0dXJlcyBzdWNoIGFzIDxmaWxlbmFtZT4vc2Jpbi9ob3RwbHVnPC9maWxlbmFtZT4gc3VwcG9ydCwKLSAgICBtb3JlIGRyaXZlcnMsIGFuZCBtb3JlIHJvYnVzdG5lc3MuCi0gICAgVGhlIDIuNSBrZXJuZWwgc2VyaWVzIGNvbnRpbnVlZCBzdWNoIGltcHJvdmVtZW50cywgYW5kIGFsc28KLSAgICB3b3JrZWQgb24gVVNCIDIuMCBzdXBwb3J0LAotICAgIGhpZ2hlciBwZXJmb3JtYW5jZSwKLSAgICBiZXR0ZXIgY29uc2lzdGVuY3kgYmV0d2VlbiBob3N0IGNvbnRyb2xsZXIgZHJpdmVycywKLSAgICBBUEkgc2ltcGxpZmljYXRpb24gKHRvIG1ha2UgYnVncyBsZXNzIGxpa2VseSksCi0gICAgYW5kIHByb3ZpZGluZyBpbnRlcm5hbCAia2VybmVsZG9jIiBkb2N1bWVudGF0aW9uLgorICAgIDxwYXJhPktlcm5lbCBkZXZlbG9wZXJzIGFkZGVkIFVTQiBzdXBwb3J0IHRvIExpbnV4IGVhcmx5IGluIHRoZSAyLjIga2VybmVsCisgICAgc2VyaWVzLCBzaG9ydGx5IGJlZm9yZSAyLjMgZGV2ZWxvcG1lbnQgZm9ya2VkLiAgVXBkYXRlcyBmcm9tIDIuMyB3ZXJlCisgICAgcmVndWxhcmx5IGZvbGRlZCBiYWNrIGludG8gMi4yIHJlbGVhc2VzLCB3aGljaCBpbXByb3ZlZCByZWxpYWJpbGl0eSBhbmQKKyAgICBicm91Z2h0IDxmaWxlbmFtZT4vc2Jpbi9ob3RwbHVnPC9maWxlbmFtZT4gc3VwcG9ydCBhcyB3ZWxsIG1vcmUgZHJpdmVycy4KKyAgICBTdWNoIGltcHJvdmVtZW50cyB3ZXJlIGNvbnRpbnVlZCBpbiB0aGUgMi41IGtlcm5lbCBzZXJpZXMsIHdoZXJlIHRoZXkgYWRkZWQKKyAgICBVU0IgMi4wIHN1cHBvcnQsIGltcHJvdmVkIHBlcmZvcm1hbmNlLCBhbmQgbWFkZSB0aGUgaG9zdCBjb250cm9sbGVyIGRyaXZlcnMKKyAgICAoSENEcykgbW9yZSBjb25zaXN0ZW50LiAgVGhleSBhbHNvIHNpbXBsaWZpZWQgdGhlIEFQSSAodG8gbWFrZSBidWdzIGxlc3MKKyAgICBsaWtlbHkpIGFuZCBhZGRlZCBpbnRlcm5hbCAia2VybmVsZG9jIiBkb2N1bWVudGF0aW9uLgogICAgIDwvcGFyYT4KIAogICAgIDxwYXJhPkxpbnV4IGNhbiBydW4gaW5zaWRlIFVTQiBkZXZpY2VzIGFzIHdlbGwgYXMgb24KICAgICB0aGUgaG9zdHMgdGhhdCBjb250cm9sIHRoZSBkZXZpY2VzLgotICAgIEJlY2F1c2UgdGhlIExpbnV4IDIueCBVU0Igc3VwcG9ydCBldm9sdmVkIHRvIHN1cHBvcnQgbWFzcyBtYXJrZXQKLSAgICBwbGF0Zm9ybXMgc3VjaCBhcyBBcHBsZSBNYWNpbnRvc2ggb3IgUEMtY29tcGF0aWJsZSBzeXN0ZW1zLAotICAgIGl0IGRpZG4ndCBhZGRyZXNzIGRlc2lnbiBjb25jZXJucyBmb3IgdGhvc2UgdHlwZXMgb2YgVVNCIHN5c3RlbXMuCi0gICAgU28gaXQgY2FuJ3QgYmUgdXNlZCBpbnNpZGUgbWFzcy1tYXJrZXQgUERBcywgb3Igb3RoZXIgcGVyaXBoZXJhbHMuCi0gICAgVVNCIGRldmljZSBkcml2ZXJzIHJ1bm5pbmcgaW5zaWRlIHRob3NlIExpbnV4IHBlcmlwaGVyYWxzCisgICAgQnV0IFVTQiBkZXZpY2UgZHJpdmVycyBydW5uaW5nIGluc2lkZSB0aG9zZSBwZXJpcGhlcmFscwogICAgIGRvbid0IGRvIHRoZSBzYW1lIHRoaW5ncyBhcyB0aGUgb25lcyBydW5uaW5nIGluc2lkZSBob3N0cywKLSAgICBhbmQgc28gdGhleSd2ZSBiZWVuIGdpdmVuIGEgZGlmZmVyZW50IG5hbWU6Ci0gICAgdGhleSdyZSBjYWxsZWQgPGVtcGhhc2lzPmdhZGdldCBkcml2ZXJzPC9lbXBoYXNpcz4uCi0gICAgVGhpcyBkb2N1bWVudCBkb2VzIG5vdCBwcmVzZW50IGdhZGdldCBkcml2ZXJzLgorICAgIHNvIHRoZXkndmUgYmVlbiBnaXZlbiBhIGRpZmZlcmVudCBuYW1lOgorICAgIDxlbXBoYXNpcz5nYWRnZXQgZHJpdmVyczwvZW1waGFzaXM+LgorICAgIFRoaXMgZG9jdW1lbnQgZG9lcyBub3QgY292ZXIgZ2FkZ2V0IGRyaXZlcnMuCiAgICAgPC9wYXJhPgogCiAgICAgPC9jaGFwdGVyPgpAQCAtMTAzLDE3ICs5NiwxNCBAQAogPGNoYXB0ZXIgaWQ9Imhvc3QiPgogICAgIDx0aXRsZT5VU0IgSG9zdC1TaWRlIEFQSSBNb2RlbDwvdGl0bGU+CiAKLSAgICA8cGFyYT5XaXRoaW4gdGhlIGtlcm5lbCwKLSAgICBob3N0LXNpZGUgZHJpdmVycyBmb3IgVVNCIGRldmljZXMgdGFsayB0byB0aGUgInVzYmNvcmUiIEFQSXMuCi0gICAgVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBwdWJsaWMgInVzYmNvcmUiIEFQSXMsIHRhcmdldHRlZCBhdCB0d28gZGlmZmVyZW50Ci0gICAgbGF5ZXJzIG9mIFVTQiBkcml2ZXIuICBUaG9zZSBhcmUKLSAgICA8ZW1waGFzaXM+Z2VuZXJhbCBwdXJwb3NlPC9lbXBoYXNpcz4gZHJpdmVycywgZXhwb3NlZCB0aHJvdWdoCi0gICAgZHJpdmVyIGZyYW1ld29ya3Mgc3VjaCBhcyBibG9jaywgY2hhcmFjdGVyLCBvciBuZXR3b3JrIGRldmljZXM7Ci0gICAgYW5kIGRyaXZlcnMgdGhhdCBhcmUgPGVtcGhhc2lzPnBhcnQgb2YgdGhlIGNvcmU8L2VtcGhhc2lzPiwKLSAgICB3aGljaCBhcmUgaW52b2x2ZWQgaW4gbWFuYWdpbmcgYSBVU0IgYnVzLgotICAgIFN1Y2ggY29yZSBkcml2ZXJzIGluY2x1ZGUgdGhlIDxlbXBoYXNpcz5odWI8L2VtcGhhc2lzPiBkcml2ZXIsCi0gICAgd2hpY2ggbWFuYWdlcyB0cmVlcyBvZiBVU0IgZGV2aWNlcywgYW5kIHNldmVyYWwgZGlmZmVyZW50IGtpbmRzCi0gICAgb2YgPGVtcGhhc2lzPmhvc3QgY29udHJvbGxlciBkcml2ZXIgKEhDRCk8L2VtcGhhc2lzPiwKKyAgICA8cGFyYT5Ib3N0LXNpZGUgZHJpdmVycyBmb3IgVVNCIGRldmljZXMgdGFsayB0byB0aGUgInVzYmNvcmUiIEFQSXMuCisgICAgVGhlcmUgYXJlIHR3by4gIE9uZSBpcyBpbnRlbmRlZCBmb3IKKyAgICA8ZW1waGFzaXM+Z2VuZXJhbC1wdXJwb3NlPC9lbXBoYXNpcz4gZHJpdmVycyAoZXhwb3NlZCB0aHJvdWdoCisgICAgZHJpdmVyIGZyYW1ld29ya3MpLCBhbmQgdGhlIG90aGVyIGlzIGZvciBkcml2ZXJzIHRoYXQgYXJlCisgICAgPGVtcGhhc2lzPnBhcnQgb2YgdGhlIGNvcmU8L2VtcGhhc2lzPi4KKyAgICBTdWNoIGNvcmUgZHJpdmVycyBpbmNsdWRlIHRoZSA8ZW1waGFzaXM+aHViPC9lbXBoYXNpcz4gZHJpdmVyCisgICAgKHdoaWNoIG1hbmFnZXMgdHJlZXMgb2YgVVNCIGRldmljZXMpIGFuZCBzZXZlcmFsIGRpZmZlcmVudCBraW5kcworICAgIG9mIDxlbXBoYXNpcz5ob3N0IGNvbnRyb2xsZXIgZHJpdmVyczwvZW1waGFzaXM+LAogICAgIHdoaWNoIGNvbnRyb2wgaW5kaXZpZHVhbCBidXNzZXMuCiAgICAgPC9wYXJhPgogCkBAIC0xMjIsMjEgKzExMiwyMSBAQAogICAgICAKICAgICA8aXRlbWl6ZWRsaXN0PgogCi0JPGxpc3RpdGVtPjxwYXJhPlVTQiBzdXBwb3J0cyBmb3VyIGtpbmRzIG9mIGRhdGEgdHJhbnNmZXIKLQkoY29udHJvbCwgYnVsaywgaW50ZXJydXB0LCBhbmQgaXNvY2hyb25vdXMpLiAgVHdvIHRyYW5zZmVyCi0JdHlwZXMgdXNlIGJhbmR3aWR0aCBhcyBpdCdzIGF2YWlsYWJsZSAoY29udHJvbCBhbmQgYnVsayksCi0Jd2hpbGUgdGhlIG90aGVyIHR3byB0eXBlcyBvZiB0cmFuc2ZlciAoaW50ZXJydXB0IGFuZCBpc29jaHJvbm91cykKKwk8bGlzdGl0ZW0+PHBhcmE+VVNCIHN1cHBvcnRzIGZvdXIga2luZHMgb2YgZGF0YSB0cmFuc2ZlcnMKKwkoY29udHJvbCwgYnVsaywgaW50ZXJydXB0LCBhbmQgaXNvY2hyb25vdXMpLiAgVHdvIG9mIHRoZW0gKGNvbnRyb2wKKwlhbmQgYnVsaykgdXNlIGJhbmR3aWR0aCBhcyBpdCdzIGF2YWlsYWJsZSwKKwl3aGlsZSB0aGUgb3RoZXIgdHdvIChpbnRlcnJ1cHQgYW5kIGlzb2Nocm9ub3VzKQogCWFyZSBzY2hlZHVsZWQgdG8gcHJvdmlkZSBndWFyYW50ZWVkIGJhbmR3aWR0aC4KIAk8L3BhcmE+PC9saXN0aXRlbT4KIAogCTxsaXN0aXRlbT48cGFyYT5UaGUgZGV2aWNlIGRlc2NyaXB0aW9uIG1vZGVsIGluY2x1ZGVzIG9uZSBvciBtb3JlCiAJImNvbmZpZ3VyYXRpb25zIiBwZXIgZGV2aWNlLCBvbmx5IG9uZSBvZiB3aGljaCBpcyBhY3RpdmUgYXQgYSB0aW1lLgotCURldmljZXMgdGhhdCBhcmUgY2FwYWJsZSBvZiBoaWdoIHNwZWVkIG9wZXJhdGlvbiBtdXN0IGFsc28gc3VwcG9ydAotCWZ1bGwgc3BlZWQgY29uZmlndXJhdGlvbnMsIGFsb25nIHdpdGggYSB3YXkgdG8gYXNrIGFib3V0IHRoZQotCSJvdGhlciBzcGVlZCIgY29uZmlndXJhdGlvbnMgdGhhdCBtaWdodCBiZSB1c2VkLgorCURldmljZXMgdGhhdCBhcmUgY2FwYWJsZSBvZiBoaWdoLXNwZWVkIG9wZXJhdGlvbiBtdXN0IGFsc28gc3VwcG9ydAorCWZ1bGwtc3BlZWQgY29uZmlndXJhdGlvbnMsIGFsb25nIHdpdGggYSB3YXkgdG8gYXNrIGFib3V0IHRoZQorCSJvdGhlciBzcGVlZCIgY29uZmlndXJhdGlvbnMgd2hpY2ggbWlnaHQgYmUgdXNlZC4KIAk8L3BhcmE+PC9saXN0aXRlbT4KIAotCTxsaXN0aXRlbT48cGFyYT5Db25maWd1cmF0aW9ucyBoYXZlIG9uZSBvciBtb3JlICJpbnRlcmZhY2UiLCBlYWNoCisJPGxpc3RpdGVtPjxwYXJhPkNvbmZpZ3VyYXRpb25zIGhhdmUgb25lIG9yIG1vcmUgImludGVyZmFjZXMiLCBlYWNoCiAJb2Ygd2hpY2ggbWF5IGhhdmUgImFsdGVybmF0ZSBzZXR0aW5ncyIuICBJbnRlcmZhY2VzIG1heSBiZQogCXN0YW5kYXJkaXplZCBieSBVU0IgIkNsYXNzIiBzcGVjaWZpY2F0aW9ucywgb3IgbWF5IGJlIHNwZWNpZmljIHRvCiAJYSB2ZW5kb3Igb3IgZGV2aWNlLjwvcGFyYT4KQEAgLTE2Miw3ICsxNTIsNyBAQAogCTwvcGFyYT48L2xpc3RpdGVtPgogCiAJPGxpc3RpdGVtPjxwYXJhPlRoZSBMaW51eCBVU0IgQVBJIHN1cHBvcnRzIHN5bmNocm9ub3VzIGNhbGxzIGZvcgotCWNvbnRyb2wgYW5kIGJ1bGsgbWVzc2FnaW5nLgorCWNvbnRyb2wgYW5kIGJ1bGsgbWVzc2FnZXMuCiAJSXQgYWxzbyBzdXBwb3J0cyBhc3luY2hub3VzIGNhbGxzIGZvciBhbGwga2luZHMgb2YgZGF0YSB0cmFuc2ZlciwKIAl1c2luZyByZXF1ZXN0IHN0cnVjdHVyZXMgY2FsbGVkICJVUkJzIiAoVVNCIFJlcXVlc3QgQmxvY2tzKS4KIAk8L3BhcmE+PC9saXN0aXRlbT4KQEAgLTQ2MywxNCArNDUzLDI1IEBACiAJICAgIGZpbGUgaW4geW91ciBMaW51eCBrZXJuZWwgc291cmNlcy4KIAkgICAgPC9wYXJhPgogCi0JICAgIDxwYXJhPk90aGVyd2lzZSB0aGUgbWFpbiB1c2UgZm9yIHRoaXMgZmlsZSBmcm9tIHByb2dyYW1zCi0JICAgIGlzIHRvIHBvbGwoKSBpdCB0byBnZXQgbm90aWZpY2F0aW9ucyBvZiB1c2IgZGV2aWNlcwotCSAgICBhcyB0aGV5J3JlIHBsdWdnZWQgb3IgdW5wbHVnZ2VkLgotCSAgICBUbyBzZWUgd2hhdCBjaGFuZ2VkLCB5b3UnZCBuZWVkIHRvIHJlYWQgdGhlIGZpbGUgYW5kCi0JICAgIGNvbXBhcmUgImJlZm9yZSIgYW5kICJhZnRlciIgY29udGVudHMsIHNjYW4gdGhlIGZpbGVzeXN0ZW0sCi0JICAgIG9yIHNlZSBpdHMgaG90cGx1ZyBldmVudC4KLQkgICAgPC9wYXJhPgorCSAgICA8cGFyYT5UaGlzIGZpbGUsIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIHBvbGwoKSBzeXN0ZW0gY2FsbCwgY2FuCisJICAgIGFsc28gYmUgdXNlZCB0byBkZXRlY3Qgd2hlbiBkZXZpY2VzIGFyZSBhZGRlZCBvciByZW1vdmVkOgorPHByb2dyYW1saXN0aW5nPmludCBmZDsKK3N0cnVjdCBwb2xsZmQgcGZkOwogCitmZCA9IG9wZW4oIi9wcm9jL2J1cy91c2IvZGV2aWNlcyIsIE9fUkRPTkxZKTsKK3BmZCA9IHsgZmQsIFBPTExJTiwgMCB9OworZm9yICg7OykgeworCS8qIFRoZSBmaXJzdCB0aW1lIHRocm91Z2gsIHRoaXMgY2FsbCB3aWxsIHJldHVybiBpbW1lZGlhdGVseS4gKi8KKwlwb2xsKCZhbXA7cGZkLCAxLCAtMSk7CisKKwkvKiBUbyBzZWUgd2hhdCdzIGNoYW5nZWQsIGNvbXBhcmUgdGhlIGZpbGUncyBwcmV2aW91cyBhbmQgY3VycmVudAorCSAgIGNvbnRlbnRzIG9yIHNjYW4gdGhlIGZpbGVzeXN0ZW0uICAoU2Nhbm5pbmcgaXMgbW9yZSBwcmVjaXNlLikgKi8KK308L3Byb2dyYW1saXN0aW5nPgorCSAgICBOb3RlIHRoYXQgdGhpcyBiZWhhdmlvciBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBpbmZvcm1hdGlvbmFsCisJICAgIGFuZCBkZWJ1ZyBwdXJwb3Nlcy4gIEl0IHdvdWxkIGJlIG1vcmUgYXBwcm9wcmlhdGUgdG8gdXNlIHByb2dyYW1zCisJICAgIHN1Y2ggYXMgdWRldiBvciBIQUwgdG8gaW5pdGlhbGl6ZSBhIGRldmljZSBvciBzdGFydCBhIHVzZXItbW9kZQorCSAgICBoZWxwZXIgcHJvZ3JhbSwgZm9yIGluc3RhbmNlLgorCSAgICA8L3BhcmE+CiAJPC9zZWN0MT4KIAogCTxzZWN0MT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vSE9XVE8gYi9Eb2N1bWVudGF0aW9uL0hPV1RPCmluZGV4IDkxNWFlOGMuLjFkNjU2MDQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vSE9XVE8KKysrIGIvRG9jdW1lbnRhdGlvbi9IT1dUTwpAQCAtMzU4LDcgKzM1OCw4IEBACiAgIHF1aWx0IHRyZWVzOgogICAgIC0gVVNCLCBQQ0ksIERyaXZlciBDb3JlLCBhbmQgSTJDLCBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBzdXNlLmRlPgogCWtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9wZW9wbGUvZ3JlZ2toL2dyZWdraC0yLjYvCi0KKyAgICAtIHg4Ni02NCwgcGFydGx5IGkzODYsIEFuZGkgS2xlZW4gPGFrQHN1c2UuZGU+CisgICAgICAgIGZ0cC5maXJzdGZsb29yLm9yZzovcHViL2FrL3g4Nl82NC9xdWlsdC8KIAogQnVnIFJlcG9ydGluZwogLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNlcy50eHQKaW5kZXggNjZjNzI1Zi4uYWRkYzY3YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXMudHh0CkBAIC0yNTQzLDYgKzI1NDMsOSBAQAogCQkgNjQgPSAvZGV2L3VzYi9yaW81MDAJRGlhbW9uZCBSaW8gNTAwCiAJCSA2NSA9IC9kZXYvdXNiL3VzYmxjZAlVU0JMQ0QgSW50ZXJmYWNlIChpbmZvQHVzYmxjZC5kZSkKIAkJIDY2ID0gL2Rldi91c2IvY3BhZDAJU3luYXB0aWNzIGNQYWQgKG1vdXNlL0xDRCkKKwkJIDY3ID0gL2Rldi91c2IvYWR1dHV4MAkxc3QgT250cmFrIEFEVSBkZXZpY2UKKwkJICAgIC4uLgorCQkgNzYgPSAvZGV2L3VzYi9hZHV0dXgxMAkxMHRoIE9udHJhayBBRFUgZGV2aWNlCiAJCSA5NiA9IC9kZXYvdXNiL2hpZGRldjAJMXN0IFVTQiBISUQgZGV2aWNlCiAJCSAgICAuLi4KIAkJMTExID0gL2Rldi91c2IvaGlkZGV2MTUJMTZ0aCBVU0IgSElEIGRldmljZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0IGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CmluZGV4IDU1MjUwN2YuLjQzNjY5N2MgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKQEAgLTYsNiArNiwyMSBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorV2hhdDoJL3N5cy9kZXZpY2VzLy4uLi9wb3dlci9zdGF0ZQorCWRldi0+cG93ZXIucG93ZXJfc3RhdGUKKwlkcG1fcnVudGltZV97c3VzcGVuZCxyZXN1bWUpKCkKK1doZW46CUp1bHkgMjAwNworV2h5OglCcm9rZW4gZGVzaWduIGZvciBydW50aW1lIGNvbnRyb2wgb3ZlciBkcml2ZXIgcG93ZXIgc3RhdGVzLCBjb25mdXNpbmcKKwlkcml2ZXItaW50ZXJuYWwgcnVudGltZSBwb3dlciBtYW5hZ2VtZW50IHdpdGg6ICBtZWNoYW5pc21zIHRvIHN1cHBvcnQKKwlzeXN0ZW0td2lkZSBzbGVlcCBzdGF0ZSB0cmFuc2l0aW9uczsgZXZlbnQgY29kZXMgdGhhdCBkaXN0aW5ndWlzaAorCWRpZmZlcmVudCBwaGFzZXMgb2Ygc3dzdXNwICJzbGVlcCIgdHJhbnNpdGlvbnM7IGFuZCB1c2Vyc3BhY2UgcG9saWN5CisJaW5wdXRzLiAgVGhpcyBmcmFtZXdvcmsgd2FzIG5ldmVyIHdpZGVseSB1c2VkLCBhbmQgbW9zdCBhdHRlbXB0cyB0bworCXVzZSBpdCB3ZXJlIGJyb2tlbi4gIERyaXZlcnMgc2hvdWxkIGluc3RlYWQgYmUgZXhwb3NpbmcgZG9tYWluLXNwZWNpZmljCisJaW50ZXJmYWNlcyBlaXRoZXIgdG8ga2VybmVsIG9yIHRvIHVzZXJzcGFjZS4KK1dobzoJUGF2ZWwgTWFjaGVrIDxwYXZlbEBzdXNlLmN6PgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogV2hhdDoJUkFXIGRyaXZlciAoQ09ORklHX1JBV19EUklWRVIpCiBXaGVuOglEZWNlbWJlciAyMDA1CiBXaHk6CWRlY2xhcmVkIG9ic29sZXRlIHNpbmNlIGtlcm5lbCAyLjYuMwpAQCAtNTUsNiArNzAsMTggQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK1doYXQ6CXN5c19zeXNjdGwKK1doZW46CUphbnVhcnkgMjAwNworV2h5OglUaGUgc2FtZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgdGhyb3VnaCAvcHJvYy9zeXMgYW5kIHRoYXQgaXMgdGhlCisJaW50ZXJmYWNlIHVzZXIgc3BhY2UgcHJlZmVycyB0byB1c2UuIEFuZCB0aGVyZSBkbyBub3QgYXBwZWFyIHRvIGJlCisJYW55IGV4aXN0aW5nIHVzZXIgaW4gdXNlciBzcGFjZSBvZiBzeXNfc3lzY3RsLiAgVGhlIGFkZGl0aW9uYWwKKwltYWludGVuYW5jZSBvdmVyaGVhZCBvZiBrZWVwaW5nIGEgc2V0IG9mIGJpbmFyeSBuYW1lcyBnZXRzCisJaW4gdGhlIHdheSBvZiBkb2luZyBhIGdvb2Qgam9iIG9mIG1haW50YWluaW5nIHRoaXMgaW50ZXJmYWNlLgorCitXaG86CUVyaWMgQmllZGVybWFuIDxlYmllZGVybUB4bWlzc2lvbi5jb20+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBXaGF0OglQQ01DSUEgY29udHJvbCBpb2N0bCAobmVlZGVkIGZvciBwY21jaWEtY3MgW2NhcmRtZ3IsIGNhcmRjdGxdKQogV2hlbjoJTm92ZW1iZXIgMjAwNQogRmlsZXM6CWRyaXZlcnMvcGNtY2lhLzogcGNtY2lhX2lvY3RsLmMKQEAgLTIwMiwxNCArMjI5LDYgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVdoYXQ6CVN1cHBvcnQgZm9yIHRoZSBNSVBTIEVWOTYxMDAgZXZhbHVhdGlvbiBib2FyZAotV2hlbjoJU2VwdGVtYmVyIDIwMDYKLVdoeToJRG9lcyBubyBsb25nZXIgYnVpbGQgc2luY2UgYXQgbGVhc3QgTm92ZW1iZXIgMTUsIDIwMDMsIGFwcGFyZW50bHkKLQlubyB1c2VyYmFzZSBsZWZ0LgotV2hvOglSYWxmIEJhZWNobGUgPHJhbGZAbGludXgtbWlwcy5vcmc+Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCiBXaGF0OglTdXBwb3J0IGZvciB0aGUgTW9tZW50dW0gLyBQTUMtU2llcnJhIEphZ3VhciBBVFggZXZhbHVhdGlvbiBib2FyZAogV2hlbjoJU2VwdGVtYmVyIDIwMDYKIFdoeToJRG9lcyBubyBsb25nZXIgYnVpbGQgc2luY2UgcXVpdGUgc29tZSB0aW1lLCBhbmQgd2FzIG5ldmVyIHBvcHVsYXIsCkBAIC0yOTQsMyArMzEzLDI0IEBACiAJSXQgaXMgbm90IGNsZWFyIGlmIGFueW9uZSBpcyBzdGlsbCB1c2luZyBpdC4KIFdobzoJU3RlcGhlbiBIZW1taW5nZXIgPHNoZW1taW5nZXJAb3NkbC5vcmc+CiAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1doYXQ6CVBIWVNERVZQQVRILCBQSFlTREVWQlVTLCBQSFlTREVWRFJJVkVSIGluIHRoZSB1ZXZlbnQgZW52aXJvbm1lbnQKK1doZW46CU9rdG9iZXIgMjAwOAorV2h5OglUaGUgc3RhY2tpbmcgb2YgY2xhc3MgZGV2aWNlcyBtYWtlcyB0aGVzZSB2YWx1ZXMgbWlzbGVhZGluZyBhbmQKKwlpbmNvbnNpc3RlbnQuCisJQ2xhc3MgZGV2aWNlcyBzaG91bGQgbm90IGNhcnJ5IGFueSBvZiB0aGVzZSBwcm9wZXJ0aWVzLCBhbmQgYnVzCisJZGV2aWNlcyBoYXZlIFNVQlNZVEVNIGFuZCBEUklWRVIgYXMgYSByZXBsYWNlbWVudC4KK1dobzoJS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHN1c2UuZGU+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitXaGF0OglpMmMtaXNhCitXaGVuOglEZWNlbWJlciAyMDA2CitXaHk6CWkyYy1pc2EgaXMgYSBub24tc2Vuc2UgYW5kIGRvZXNuJ3QgZml0IGluIHRoZSBkZXZpY2UgZHJpdmVyCisJbW9kZWwuIERyaXZlcnMgcmVseWluZyBvbiBpdCBhcmUgYmV0dGVyIGltcGxlbWVudGVkIGFzIHBsYXRmb3JtCisJZHJpdmVycy4KK1dobzoJSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dCBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKaW5kZXggOTk5MDJhZTYuLjdkYjcxZDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wcm9jLnR4dApAQCAtMTEyNCwxMSArMTEyNCwxNSBAQAogTk1JIHN3aXRjaCB0aGF0IG1vc3QgSUEzMiBzZXJ2ZXJzIGhhdmUgZmlyZXMgdW5rbm93biBOTUkgdXAsIGZvciBleGFtcGxlLgogSWYgYSBzeXN0ZW0gaGFuZ3MgdXAsIHRyeSBwcmVzc2luZyB0aGUgTk1JIHN3aXRjaC4KIAotW05PVEVdCi0gICBUaGlzIGZ1bmN0aW9uIGFuZCBvcHJvZmlsZSBzaGFyZSBhIE5NSSBjYWxsYmFjay4gVGhlcmVmb3JlIHRoaXMgZnVuY3Rpb24KLSAgIGNhbm5vdCBiZSBlbmFibGVkIHdoZW4gb3Byb2ZpbGUgaXMgYWN0aXZhdGVkLgotICAgQW5kIE5NSSB3YXRjaGRvZyB3aWxsIGJlIGRpc2FibGVkIHdoZW4gdGhlIHZhbHVlIGluIHRoaXMgZmlsZSBpcyBzZXQgdG8KLSAgIG5vbi16ZXJvLgorbm1pX3dhdGNoZG9nCistLS0tLS0tLS0tLS0KKworRW5hYmxlcy9EaXNhYmxlcyB0aGUgTk1JIHdhdGNoZG9nIG9uIHg4NiBzeXN0ZW1zLiAgV2hlbiB0aGUgdmFsdWUgaXMgbm9uLXplcm8KK3RoZSBOTUkgd2F0Y2hkb2cgaXMgZW5hYmxlZCBhbmQgd2lsbCBjb250aW51b3VzbHkgdGVzdCBhbGwgb25saW5lIGNwdXMgdG8KK2RldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBzdGlsbCBmdW5jdGlvbmluZyBwcm9wZXJseS4KKworQmVjYXVzZSB0aGUgTk1JIHdhdGNoZG9nIHNoYXJlcyByZWdpc3RlcnMgd2l0aCBvcHJvZmlsZSwgYnkgZGlzYWJsaW5nIHRoZSBOTUkKK3dhdGNoZG9nLCBvcHJvZmlsZSBtYXkgaGF2ZSBtb3JlIHJlZ2lzdGVycyB0byB1dGlsaXplLgogCiAKIDIuNCAvcHJvYy9zeXMvdm0gLSBUaGUgdmlydHVhbCBtZW1vcnkgc3Vic3lzdGVtCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLXZpYXBybyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtdmlhcHJvCmluZGV4IDE2Nzc1NjYuLjI1NjgwMzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtdmlhcHJvCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtdmlhcHJvCkBAIC03LDkgKzcsMTIgQEAKICAgKiBWSUEgVGVjaG5vbG9naWVzLCBJbmMuIFZUODJDNjg2QS9CCiAgICAgRGF0YXNoZWV0OiBTb21ldGltZXMgYXZhaWxhYmxlIGF0IHRoZSBWSUEgd2Vic2l0ZQogCi0gICogVklBIFRlY2hub2xvZ2llcywgSW5jLiBWVDgyMzEsIFZUODIzMywgVlQ4MjMzQSwgVlQ4MjM1LCBWVDgyMzdSCisgICogVklBIFRlY2hub2xvZ2llcywgSW5jLiBWVDgyMzEsIFZUODIzMywgVlQ4MjMzQQogICAgIERhdGFzaGVldDogYXZhaWxhYmxlIG9uIHJlcXVlc3QgZnJvbSBWSUEKIAorICAqIFZJQSBUZWNobm9sb2dpZXMsIEluYy4gVlQ4MjM1LCBWVDgyMzdSLCBWVDgyMzdBLCBWVDgyNTEKKyAgICBEYXRhc2hlZXQ6IGF2YWlsYWJsZSBvbiByZXF1ZXN0IGFuZCB1bmRlciBOREEgZnJvbSBWSUEKKwogQXV0aG9yczoKIAlLefZzdGkgTeRsa2tpIDxrbWFsa2tpQGNjLmh1dC5maT4sCiAJTWFyayBELiBTdHVkZWJha2VyIDxtZHN4eXoxMjNAeWFob28uY29tPiwKQEAgLTM5LDYgKzQyLDggQEAKICBkZXZpY2UgMTEwNjo4MjM1ICAgKFZUODIzMSBmdW5jdGlvbiA0KQogIGRldmljZSAxMTA2OjMxNzcgICAoVlQ4MjM1KQogIGRldmljZSAxMTA2OjMyMjcgICAoVlQ4MjM3UikKKyBkZXZpY2UgMTEwNjozMzM3ICAgKFZUODIzN0EpCisgZGV2aWNlIDExMDY6MzI4NyAgIChWVDgyNTEpCiAKIElmIG5vbmUgb2YgdGhlc2Ugc2hvdyB1cCwgeW91IHNob3VsZCBsb29rIGluIHRoZSBCSU9TIGZvciBzZXR0aW5ncyBsaWtlCiBlbmFibGUgQUNQSSAvIFNNQnVzIG9yIGV2ZW4gVVNCLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvaTJjLXN0dWIgYi9Eb2N1bWVudGF0aW9uL2kyYy9pMmMtc3R1YgppbmRleCBkNmRjYjEzLi45Y2MwODFlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy9pMmMtc3R1YgorKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9pMmMtc3R1YgpAQCAtNiw5ICs2LDEyIEBACiB0eXBlcyBvZiBTTUJ1cyBjb21tYW5kczogd3JpdGUgcXVpY2ssIChyL3cpIGJ5dGUsIChyL3cpIGJ5dGUgZGF0YSwgYW5kCiAoci93KSB3b3JkIGRhdGEuCiAKK1lvdSBuZWVkIHRvIHByb3ZpZGUgYSBjaGlwIGFkZHJlc3MgYXMgYSBtb2R1bGUgcGFyYW1ldGVyIHdoZW4gbG9hZGluZwordGhpcyBkcml2ZXIsIHdoaWNoIHdpbGwgdGhlbiBvbmx5IHJlYWN0IHRvIFNNQnVzIGNvbW1hbmRzIHRvIHRoaXMgYWRkcmVzcy4KKwogTm8gaGFyZHdhcmUgaXMgbmVlZGVkIG5vciBhc3NvY2lhdGVkIHdpdGggdGhpcyBtb2R1bGUuICBJdCB3aWxsIGFjY2VwdCB3cml0ZQotcXVpY2sgY29tbWFuZHMgdG8gYWxsIGFkZHJlc3NlczsgaXQgd2lsbCByZXNwb25kIHRvIHRoZSBvdGhlciBjb21tYW5kcyAoYWxzbwotdG8gYWxsIGFkZHJlc3NlcykgYnkgcmVhZGluZyBmcm9tIG9yIHdyaXRpbmcgdG8gYW4gYXJyYXkgaW4gbWVtb3J5LiAgSXQgd2lsbAorcXVpY2sgY29tbWFuZHMgdG8gb25lIGFkZHJlc3M7IGl0IHdpbGwgcmVzcG9uZCB0byB0aGUgb3RoZXIgY29tbWFuZHMgKGFsc28KK3RvIG9uZSBhZGRyZXNzKSBieSByZWFkaW5nIGZyb20gb3Igd3JpdGluZyB0byBhbiBhcnJheSBpbiBtZW1vcnkuICBJdCB3aWxsCiBhbHNvIHNwYW0gdGhlIGtlcm5lbCBsb2dzIGZvciBldmVyeSBjb21tYW5kIGl0IGhhbmRsZXMuCiAKIEEgcG9pbnRlciByZWdpc3RlciB3aXRoIGF1dG8taW5jcmVtZW50IGlzIGltcGxlbWVudGVkIGZvciBhbGwgYnl0ZQpAQCAtMjEsNiArMjQsMTEgQEAKIAkzLiBsb2FkIHRoZSB0YXJnZXQgc2Vuc29ycyBjaGlwIGRyaXZlciBtb2R1bGUKIAk0LiBvYnNlcnZlIGl0cyBiZWhhdmlvciBpbiB0aGUga2VybmVsIGxvZwogCitQQVJBTUVURVJTOgorCitpbnQgY2hpcF9hZGRyOgorCVRoZSBTTUJ1cyBhZGRyZXNzIHRvIGVtdWxhdGUgYSBjaGlwIGF0LgorCiBDQVZFQVRTOgogCiBUaGVyZSBhcmUgaW5kZXBlbmRlbnQgYXJyYXlzIGZvciBieXRlL2RhdGEgYW5kIHdvcmQvZGF0YSBjb21tYW5kcy4gIERlcGVuZGluZwpAQCAtMzMsNiArNDEsOSBAQAogY2hpcHMpIHRoaXMgbW9kdWxlIHdpbGwgbm90IHdvcmsgd2VsbCAtIGFsdGhvdWdoIGl0IGNvdWxkIGJlIGV4dGVuZGVkIHRvCiBzdXBwb3J0IHRoYXQgcHJldHR5IGVhc2lseS4KIAorT25seSBvbmUgY2hpcCBhZGRyZXNzIGlzIHN1cHBvcnRlZCAtIGFsdGhvdWdoIHRoaXMgbW9kdWxlIGNvdWxkIGJlCitleHRlbmRlZCB0byBzdXBwb3J0IG1vcmUuCisKIElmIHlvdSBzcGFtIGl0IGhhcmQgZW5vdWdoLCBwcmludGsgY2FuIGJlIGxvc3N5LiAgVGhpcyBtb2R1bGUgcmVhbGx5IHdhbnRzCiBzb21ldGhpbmcgbGlrZSByZWxheWZzLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dAppbmRleCBiN2Q2YWJiLi5lMmNiZDU5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlcy50eHQKQEAgLTQyMSw2ICs0MjEsMTEgQEAKIAlUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgaWYgc3VwcGxpZWQgd2lsbCBiZSB1c2VkCiAJaWYgZmlyc3QgYXJndW1lbnQgaXMgbm90IHN1cHBvcnRlZC4KIAorICAgIGFzLWluc3RyCisJYXMtaW5zdHIgY2hlY2tzIGlmIHRoZSBhc3NlbWJsZXIgcmVwb3J0cyBhIHNwZWNpZmljIGluc3RydWN0aW9uCisJYW5kIHRoZW4gb3V0cHV0cyBlaXRoZXIgb3B0aW9uMSBvciBvcHRpb24yCisJQyBlc2NhcGVzIGFyZSBzdXBwb3J0ZWQgaW4gdGhlIHRlc3QgaW5zdHJ1Y3Rpb24KKwogICAgIGNjLW9wdGlvbgogCWNjLW9wdGlvbiBpcyB1c2VkIHRvIGNoZWNrIGlmICQoQ0MpIHN1cHBvcnRzIGEgZ2l2ZW4gb3B0aW9uLCBhbmQgbm90CiAJc3VwcG9ydGVkIHRvIHVzZSBhbiBvcHRpb25hbCBzZWNvbmQgb3B0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCA3NjZhYmRhLi41NDk4MzI0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtNTczLDggKzU3Myw2IEBACiAJZ3NjZD0JCVtIVyxDRF0KIAkJCUZvcm1hdDogPGlvPgogCi0JZ3Q5NjEwMGV0aD0JW05FVF0gTUlQUyBHVDk2MTAwIEFkdmFuY2VkIENvbW11bmljYXRpb24gQ29udHJvbGxlcgotCiAJZ3VzPQkJW0hXLE9TU10KIAkJCUZvcm1hdDogPGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMTY+CiAKQEAgLTEyNDAsNyArMTIzOCwxMSBAQAogCQkJCWJvb3Rsb2FkZXIuIFRoaXMgaXMgY3VycmVudGx5IHVzZWQgb24KIAkJCQlJWFAyMDAwIHN5c3RlbXMgd2hlcmUgdGhlIGJ1cyBoYXMgdG8gYmUKIAkJCQljb25maWd1cmVkIGEgY2VydGFpbiB3YXkgZm9yIGFkanVuY3QgQ1BVcy4KLQorCQlub2Vhcmx5CQlbWDg2XSBEb24ndCBkbyBhbnkgZWFybHkgdHlwZSAxIHNjYW5uaW5nLgorCQkJCVRoaXMgbWlnaHQgaGVscCBvbiBzb21lIGJyb2tlbiBib2FyZHMgd2hpY2gKKwkJCQltYWNoaW5lIGNoZWNrIHdoZW4gc29tZSBkZXZpY2VzJyBjb25maWcgc3BhY2UKKwkJCQlpcyByZWFkLiBCdXQgdmFyaW91cyB3b3JrYXJvdW5kcyBhcmUgZGlzYWJsZWQKKwkJCQlhbmQgc29tZSBJT01NVSBkcml2ZXJzIHdpbGwgbm90IHdvcmsuCiAJcGNtdj0JCVtIVyxQQ01DSUFdIEJhZGdlUEFEIDQKIAogCXBkLgkJW1BBUklERV0KQEAgLTEzNjgsNiArMTM3MCw5IEBACiAJCQlSZXNlcnZlcyBhIGhvbGUgYXQgdGhlIHRvcCBvZiB0aGUga2VybmVsIHZpcnR1YWwKIAkJCWFkZHJlc3Mgc3BhY2UuCiAKKwlyZXNldF9kZXZpY2VzCVtLTkxdIEZvcmNlIGRyaXZlcnMgdG8gcmVzZXQgdGhlIHVuZGVybHlpbmcgZGV2aWNlCisJCQlkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisKIAlyZXN1bWU9CQlbU1dTVVNQXQogCQkJU3BlY2lmeSB0aGUgcGFydGl0aW9uIGRldmljZSBmb3Igc29mdHdhcmUgc3VzcGVuZAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25vbW11LW1tYXAudHh0IGIvRG9jdW1lbnRhdGlvbi9ub21tdS1tbWFwLnR4dAppbmRleCBiODhlYmU0Li43NzE0ZjU3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25vbW11LW1tYXAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbm9tbXUtbW1hcC50eHQKQEAgLTExNiw2ICsxMTYsOSBAQAogICgqKSBBIGxpc3Qgb2YgYWxsIHRoZSBtYXBwaW5ncyBvbiB0aGUgc3lzdGVtIGlzIHZpc2libGUgdGhyb3VnaCAvcHJvYy9tYXBzIGluCiAgICAgIG5vLU1NVSBtb2RlLgogCisgKCopIEEgbGlzdCBvZiBhbGwgdGhlIG1hcHBpbmdzIGluIHVzZSBieSBhIHByb2Nlc3MgaXMgdmlzaWJsZSB0aHJvdWdoCisgICAgIC9wcm9jLzxwaWQ+L21hcHMgaW4gbm8tTU1VIG1vZGUuCisKICAoKikgU3VwcGx5aW5nIE1BUF9GSVhFRCBvciBhIHJlcXVlc3RpbmcgYSBwYXJ0aWN1bGFyIG1hcHBpbmcgYWRkcmVzcyB3aWxsCiAgICAgIHJlc3VsdCBpbiBhbiBlcnJvci4KIApAQCAtMTI1LDYgKzEyOCw0OSBAQAogICAgICBlcnJvciB3aWxsIHJlc3VsdCBpZiB0aGV5IGRvbid0LiBUaGlzIGlzIG1vc3QgbGlrZWx5IHRvIGJlIGVuY291bnRlcmVkCiAgICAgIHdpdGggY2hhcmFjdGVyIGRldmljZSBmaWxlcywgcGlwZXMsIGZpZm9zIGFuZCBzb2NrZXRzLgogCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09CitJTlRFUlBST0NFU1MgU0hBUkVEIE1FTU9SWQorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQm90aCBTWVNWIElQQyBTSE0gc2hhcmVkIG1lbW9yeSBhbmQgUE9TSVggc2hhcmVkIG1lbW9yeSBpcyBzdXBwb3J0ZWQgaW4gTk9NTVUKK21vZGUuICBUaGUgZm9ybWVyIHRocm91Z2ggdGhlIHVzdWFsIG1lY2hhbmlzbSwgdGhlIGxhdHRlciB0aHJvdWdoIGZpbGVzIGNyZWF0ZWQKK29uIHJhbWZzIG9yIHRtcGZzIG1vdW50cy4KKworCis9PT09PT09CitGVVRFWEVTCis9PT09PT09CisKK0Z1dGV4ZXMgYXJlIHN1cHBvcnRlZCBpbiBOT01NVSBtb2RlIGlmIHRoZSBhcmNoIHN1cHBvcnRzIHRoZW0uICBBbiBlcnJvciB3aWxsCitiZSBnaXZlbiBpZiBhbiBhZGRyZXNzIHBhc3NlZCB0byB0aGUgZnV0ZXggc3lzdGVtIGNhbGwgbGllcyBvdXRzaWRlIHRoZQorbWFwcGluZ3MgbWFkZSBieSBhIHByb2Nlc3Mgb3IgaWYgdGhlIG1hcHBpbmcgaW4gd2hpY2ggdGhlIGFkZHJlc3MgbGllcyBkb2VzIG5vdAorc3VwcG9ydCBmdXRleGVzIChzdWNoIGFzIGFuIEkvTyBjaGFyZGV2IG1hcHBpbmcpLgorCisKKz09PT09PT09PT09PT0KK05PLU1NVSBNUkVNQVAKKz09PT09PT09PT09PT0KKworVGhlIG1yZW1hcCgpIGZ1bmN0aW9uIGlzIHBhcnRpYWxseSBzdXBwb3J0ZWQuICBJdCBtYXkgY2hhbmdlIHRoZSBzaXplIG9mIGEKK21hcHBpbmcsIGFuZCBtYXkgbW92ZSBpdFsqXSBpZiBNUkVNQVBfTUFZTU9WRSBpcyBzcGVjaWZpZWQgYW5kIGlmIHRoZSBuZXcgc2l6ZQorb2YgdGhlIG1hcHBpbmcgZXhjZWVkcyB0aGUgc2l6ZSBvZiB0aGUgc2xhYiBvYmplY3QgY3VycmVudGx5IG9jY3VwaWVkIGJ5IHRoZQorbWVtb3J5IHRvIHdoaWNoIHRoZSBtYXBwaW5nIHJlZmVycywgb3IgaWYgYSBzbWFsbGVyIHNsYWIgb2JqZWN0IGNvdWxkIGJlIHVzZWQuCisKK01SRU1BUF9GSVhFRCBpcyBub3Qgc3VwcG9ydGVkLCB0aG91Z2ggaXQgaXMgaWdub3JlZCBpZiB0aGVyZSdzIG5vIGNoYW5nZSBvZgorYWRkcmVzcyBhbmQgdGhlIG9iamVjdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG1vdmVkLgorCitTaGFyZWQgbWFwcGluZ3MgbWF5IG5vdCBiZSBtb3ZlZC4gIFNoYXJlYWJsZSBtYXBwaW5ncyBtYXkgbm90IGJlIG1vdmVkIGVpdGhlciwKK2V2ZW4gaWYgdGhleSBhcmUgbm90IGN1cnJlbnRseSBzaGFyZWQuCisKK1RoZSBtcmVtYXAoKSBmdW5jdGlvbiBtdXN0IGJlIGdpdmVuIGFuIGV4YWN0IG1hdGNoIGZvciBiYXNlIGFkZHJlc3MgYW5kIHNpemUgb2YKK2EgcHJldmlvdXNseSBtYXBwZWQgb2JqZWN0LiAgSXQgbWF5IG5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBob2xlcyBpbiBleGlzdGluZworbWFwcGluZ3MsIG1vdmUgcGFydHMgb2YgZXhpc3RpbmcgbWFwcGluZ3Mgb3IgcmVzaXplIHBhcnRzIG9mIG1hcHBpbmdzLiAgSXQgbXVzdAorYWN0IG9uIGEgY29tcGxldGUgbWFwcGluZy4KKworWypdIE5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorCisKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBQUk9WSURJTkcgU0hBUkVBQkxFIENIQVJBQ1RFUiBERVZJQ0UgU1VQUE9SVAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcGNpZWFlci1ob3d0by50eHQgYi9Eb2N1bWVudGF0aW9uL3BjaWVhZXItaG93dG8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YzI1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3BjaWVhZXItaG93dG8udHh0CkBAIC0wLDAgKzEsMjUzIEBACisgICBUaGUgUENJIEV4cHJlc3MgQWR2YW5jZWQgRXJyb3IgUmVwb3J0aW5nIERyaXZlciBHdWlkZSBIT1dUTworCQlULiBMb25nIE5ndXllbgk8dG9tLmwubmd1eWVuQGludGVsLmNvbT4KKwkJWWFubWluIFpoYW5nCTx5YW5taW4uemhhbmdAaW50ZWwuY29tPgorCQkJCTA3LzI5LzIwMDYKKworCisxLiBPdmVydmlldworCisxLjEgQWJvdXQgdGhpcyBndWlkZQorCitUaGlzIGd1aWRlIGRlc2NyaWJlcyB0aGUgYmFzaWNzIG9mIHRoZSBQQ0kgRXhwcmVzcyBBZHZhbmNlZCBFcnJvcgorUmVwb3J0aW5nIChBRVIpIGRyaXZlciBhbmQgcHJvdmlkZXMgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSBpdCwgYXMKK3dlbGwgYXMgaG93IHRvIGVuYWJsZSB0aGUgZHJpdmVycyBvZiBlbmRwb2ludCBkZXZpY2VzIHRvIGNvbmZvcm0gd2l0aAorUENJIEV4cHJlc3MgQUVSIGRyaXZlci4KKworMS4yIENvcHlyaWdodCCpIEludGVsIENvcnBvcmF0aW9uIDIwMDYuCisKKzEuMyBXaGF0IGlzIHRoZSBQQ0kgRXhwcmVzcyBBRVIgRHJpdmVyPworCitQQ0kgRXhwcmVzcyBlcnJvciBzaWduYWxpbmcgY2FuIG9jY3VyIG9uIHRoZSBQQ0kgRXhwcmVzcyBsaW5rIGl0c2VsZgorb3Igb24gYmVoYWxmIG9mIHRyYW5zYWN0aW9ucyBpbml0aWF0ZWQgb24gdGhlIGxpbmsuIFBDSSBFeHByZXNzCitkZWZpbmVzIHR3byBlcnJvciByZXBvcnRpbmcgcGFyYWRpZ21zOiB0aGUgYmFzZWxpbmUgY2FwYWJpbGl0eSBhbmQKK3RoZSBBZHZhbmNlZCBFcnJvciBSZXBvcnRpbmcgY2FwYWJpbGl0eS4gVGhlIGJhc2VsaW5lIGNhcGFiaWxpdHkgaXMKK3JlcXVpcmVkIG9mIGFsbCBQQ0kgRXhwcmVzcyBjb21wb25lbnRzIHByb3ZpZGluZyBhIG1pbmltdW0gZGVmaW5lZAorc2V0IG9mIGVycm9yIHJlcG9ydGluZyByZXF1aXJlbWVudHMuIEFkdmFuY2VkIEVycm9yIFJlcG9ydGluZworY2FwYWJpbGl0eSBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgUENJIEV4cHJlc3MgYWR2YW5jZWQgZXJyb3IgcmVwb3J0aW5nCitleHRlbmRlZCBjYXBhYmlsaXR5IHN0cnVjdHVyZSBwcm92aWRpbmcgbW9yZSByb2J1c3QgZXJyb3IgcmVwb3J0aW5nLgorCitUaGUgUENJIEV4cHJlc3MgQUVSIGRyaXZlciBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgdG8gc3VwcG9ydCBQQ0kKK0V4cHJlc3MgQWR2YW5jZWQgRXJyb3IgUmVwb3J0aW5nIGNhcGFiaWxpdHkuIFRoZSBQQ0kgRXhwcmVzcyBBRVIKK2RyaXZlciBwcm92aWRlcyB0aHJlZSBiYXNpYyBmdW5jdGlvbnM6CisKKy0JR2F0aGVycyB0aGUgY29tcHJlaGVuc2l2ZSBlcnJvciBpbmZvcm1hdGlvbiBpZiBlcnJvcnMgb2NjdXJyZWQuCistCVJlcG9ydHMgZXJyb3IgdG8gdGhlIHVzZXJzLgorLQlQZXJmb3JtcyBlcnJvciByZWNvdmVyeSBhY3Rpb25zLgorCitBRVIgZHJpdmVyIG9ubHkgYXR0YWNoZXMgcm9vdCBwb3J0cyB3aGljaCBzdXBwb3J0IFBDSS1FeHByZXNzIEFFUgorY2FwYWJpbGl0eS4KKworCisyLiBVc2VyIEd1aWRlCisKKzIuMSBJbmNsdWRlIHRoZSBQQ0kgRXhwcmVzcyBBRVIgUm9vdCBEcml2ZXIgaW50byB0aGUgTGludXggS2VybmVsCisKK1RoZSBQQ0kgRXhwcmVzcyBBRVIgUm9vdCBkcml2ZXIgaXMgYSBSb290IFBvcnQgc2VydmljZSBkcml2ZXIgYXR0YWNoZWQKK3RvIHRoZSBQQ0kgRXhwcmVzcyBQb3J0IEJ1cyBkcml2ZXIuIElmIGEgdXNlciB3YW50cyB0byB1c2UgaXQsIHRoZSBkcml2ZXIKK2hhcyB0byBiZSBjb21waWxlZC4gT3B0aW9uIENPTkZJR19QQ0lFQUVSIHN1cHBvcnRzIHRoaXMgY2FwYWJpbGl0eS4gSXQKK2RlcGVuZHMgb24gQ09ORklHX1BDSUVQT1JUQlVTLCBzbyBwbHMuIHNldCBDT05GSUdfUENJRVBPUlRCVVM9eSBhbmQKK0NPTkZJR19QQ0lFQUVSID0geS4KKworMi4yIExvYWQgUENJIEV4cHJlc3MgQUVSIFJvb3QgRHJpdmVyCitUaGVyZSBpcyBhIGNhc2Ugd2hlcmUgYSBzeXN0ZW0gaGFzIEFFUiBzdXBwb3J0IGluIEJJT1MuIEVuYWJsaW5nIHRoZSBBRVIKK1Jvb3QgZHJpdmVyIGFuZCBoYXZpbmcgQUVSIHN1cHBvcnQgaW4gQklPUyBtYXkgcmVzdWx0IHVucHJlZGljdGFibGUKK2JlaGF2aW9yLiBUbyBhdm9pZCB0aGlzIGNvbmZsaWN0LCBhIHN1Y2Nlc3NmdWwgbG9hZCBvZiB0aGUgQUVSIFJvb3QgZHJpdmVyCityZXF1aXJlcyBBQ1BJIF9PU0Mgc3VwcG9ydCBpbiB0aGUgQklPUyB0byBhbGxvdyB0aGUgQUVSIFJvb3QgZHJpdmVyIHRvCityZXF1ZXN0IGZvciBuYXRpdmUgY29udHJvbCBvZiBBRVIuIFNlZSB0aGUgUENJIEZXIDMuMCBTcGVjaWZpY2F0aW9uIGZvcgorZGV0YWlscyByZWdhcmRpbmcgT1NDIHVzYWdlLiBDdXJyZW50bHksIGxvdHMgb2YgZmlybXdhcmVzIGRvbid0IHByb3ZpZGUKK19PU0Mgc3VwcG9ydCB3aGlsZSB0aGV5IHVzZSBQQ0kgRXhwcmVzcy4gVG8gc3VwcG9ydCBzdWNoIGZpcm13YXJlcywKK2ZvcmNlbG9hZCwgYSBwYXJhbWV0ZXIgb2YgdHlwZSBib29sLCBjb3VsZCBlbmFibGUgQUVSIHRvIGNvbnRpbnVlIHRvCitiZSBpbml0aWF0ZWQgYWx0aG91Z2ggZmlybXdhcmVzIGhhdmUgbm8gX09TQyBzdXBwb3J0LiBUbyBlbmFibGUgdGhlCit3YWxrYXJvdW5kLCBwbHMuIGFkZCBhZXJkcml2ZXIuZm9yY2Vsb2FkPXkgdG8ga2VybmVsIGJvb3QgcGFyYW1ldGVyIGxpbmUKK3doZW4gYm9vdGluZyBrZXJuZWwuIE5vdGUgdGhhdCBmb3JjZWxvYWQ9biBieSBkZWZhdWx0LgorCisyLjMgQUVSIGVycm9yIG91dHB1dAorV2hlbiBhIFBDSS1FIEFFUiBlcnJvciBpcyBjYXB0dXJlZCwgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlIG91dHB1dGVkIHRvCitjb25zb2xlLiBJZiBpdCdzIGEgY29ycmVjdGFibGUgZXJyb3IsIGl0IGlzIG91dHB1dGVkIGFzIGEgd2FybmluZy4KK090aGVyd2lzZSwgaXQgaXMgcHJpbnRlZCBhcyBhbiBlcnJvci4gU28gdXNlcnMgY291bGQgY2hvb3NlIGRpZmZlcmVudAorbG9nIGxldmVsIHRvIGZpbHRlciBvdXQgY29ycmVjdGFibGUgZXJyb3IgbWVzc2FnZXMuCisKK0JlbG93IHNob3dzIGFuIGV4YW1wbGUuCisrLS0tLS0tIFBDSS1FeHByZXNzIERldmljZSBFcnJvciAtLS0tLSsKK0Vycm9yIFNldmVyaXR5ICAgICAgICAgIDogVW5jb3JyZWN0ZWQgKEZhdGFsKQorUENJRSBCdXMgRXJyb3IgdHlwZSAgICAgOiBUcmFuc2FjdGlvbiBMYXllcgorVW5zdXBwb3J0ZWQgUmVxdWVzdCAgICAgOiBGaXJzdAorUmVxdWVzdGVyIElEICAgICAgICAgICAgOiAwNTAwCitWZW5kb3JJRD04MDg2aCwgRGV2aWNlSUQ9MDMyOWgsIEJ1cz0wNWgsIERldmljZT0wMGgsIEZ1bmN0aW9uPTAwaAorVExCIEhlYWRlcjoKKzA0MDAwMDAxIDAwMjAwYTAzIDA1MDEwMDAwIDAwMDUwMTAwCisKK0luIHRoZSBleGFtcGxlLCAnUmVxdWVzdGVyIElEJyBtZWFucyB0aGUgSUQgb2YgdGhlIGRldmljZSB3aG8gc2VuZHMKK3RoZSBlcnJvciBtZXNzYWdlIHRvIHJvb3QgcG9ydC4gUGxzLiByZWZlciB0byBwY2kgZXhwcmVzcyBzcGVjcyBmb3IKK290aGVyIGZpZWxkcy4KKworCiszLiBEZXZlbG9wZXIgR3VpZGUKKworVG8gZW5hYmxlIEFFUiBhd2FyZSBzdXBwb3J0IHJlcXVpcmVzIGEgc29mdHdhcmUgZHJpdmVyIHRvIGNvbmZpZ3VyZQordGhlIEFFUiBjYXBhYmlsaXR5IHN0cnVjdHVyZSB3aXRoaW4gaXRzIGRldmljZSBhbmQgdG8gcHJvdmlkZSBjYWxsYmFja3MuCisKK1RvIHN1cHBvcnQgQUVSIGJldHRlciwgZGV2ZWxvcGVycyBuZWVkIHVuZGVyc3RhbmQgaG93IEFFUiBkb2VzIHdvcmsKK2ZpcnN0bHkuCisKK1BDSSBFeHByZXNzIGVycm9ycyBhcmUgY2xhc3NpZmllZCBpbnRvIHR3byB0eXBlczogY29ycmVjdGFibGUgZXJyb3JzCithbmQgdW5jb3JyZWN0YWJsZSBlcnJvcnMuIFRoaXMgY2xhc3NpZmljYXRpb24gaXMgYmFzZWQgb24gdGhlIGltcGFjdHMKK29mIHRob3NlIGVycm9ycywgd2hpY2ggbWF5IHJlc3VsdCBpbiBkZWdyYWRlZCBwZXJmb3JtYW5jZSBvciBmdW5jdGlvbgorZmFpbHVyZS4KKworQ29ycmVjdGFibGUgZXJyb3JzIHBvc2Ugbm8gaW1wYWN0cyBvbiB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUKK2ludGVyZmFjZS4gVGhlIFBDSSBFeHByZXNzIHByb3RvY29sIGNhbiByZWNvdmVyIHdpdGhvdXQgYW55IHNvZnR3YXJlCitpbnRlcnZlbnRpb24gb3IgYW55IGxvc3Mgb2YgZGF0YS4gVGhlc2UgZXJyb3JzIGFyZSBkZXRlY3RlZCBhbmQKK2NvcnJlY3RlZCBieSBoYXJkd2FyZS4gVW5saWtlIGNvcnJlY3RhYmxlIGVycm9ycywgdW5jb3JyZWN0YWJsZQorZXJyb3JzIGltcGFjdCBmdW5jdGlvbmFsaXR5IG9mIHRoZSBpbnRlcmZhY2UuIFVuY29ycmVjdGFibGUgZXJyb3JzCitjYW4gY2F1c2UgYSBwYXJ0aWN1bGFyIHRyYW5zYWN0aW9uIG9yIGEgcGFydGljdWxhciBQQ0kgRXhwcmVzcyBsaW5rCit0byBiZSB1bnJlbGlhYmxlLiBEZXBlbmRpbmcgb24gdGhvc2UgZXJyb3IgY29uZGl0aW9ucywgdW5jb3JyZWN0YWJsZQorZXJyb3JzIGFyZSBmdXJ0aGVyIGNsYXNzaWZpZWQgaW50byBub24tZmF0YWwgZXJyb3JzIGFuZCBmYXRhbCBlcnJvcnMuCitOb24tZmF0YWwgZXJyb3JzIGNhdXNlIHRoZSBwYXJ0aWN1bGFyIHRyYW5zYWN0aW9uIHRvIGJlIHVucmVsaWFibGUsCitidXQgdGhlIFBDSSBFeHByZXNzIGxpbmsgaXRzZWxmIGlzIGZ1bGx5IGZ1bmN0aW9uYWwuIEZhdGFsIGVycm9ycywgb24KK3RoZSBvdGhlciBoYW5kLCBjYXVzZSB0aGUgbGluayB0byBiZSB1bnJlbGlhYmxlLgorCitXaGVuIEFFUiBpcyBlbmFibGVkLCBhIFBDSSBFeHByZXNzIGRldmljZSB3aWxsIGF1dG9tYXRpY2FsbHkgc2VuZCBhbgorZXJyb3IgbWVzc2FnZSB0byB0aGUgUENJRSByb290IHBvcnQgYWJvdmUgaXQgd2hlbiB0aGUgZGV2aWNlIGNhcHR1cmVzCithbiBlcnJvci4gVGhlIFJvb3QgUG9ydCwgdXBvbiByZWNlaXZpbmcgYW4gZXJyb3IgcmVwb3J0aW5nIG1lc3NhZ2UsCitpbnRlcm5hbGx5IHByb2Nlc3NlcyBhbmQgbG9ncyB0aGUgZXJyb3IgbWVzc2FnZSBpbiBpdHMgUENJIEV4cHJlc3MKK2NhcGFiaWxpdHkgc3RydWN0dXJlLiBFcnJvciBpbmZvcm1hdGlvbiBiZWluZyBsb2dnZWQgaW5jbHVkZXMgc3RvcmluZwordGhlIGVycm9yIHJlcG9ydGluZyBhZ2VudCdzIHJlcXVlc3RvciBJRCBpbnRvIHRoZSBFcnJvciBTb3VyY2UKK0lkZW50aWZpY2F0aW9uIFJlZ2lzdGVycyBhbmQgc2V0dGluZyB0aGUgZXJyb3IgYml0cyBvZiB0aGUgUm9vdCBFcnJvcgorU3RhdHVzIFJlZ2lzdGVyIGFjY29yZGluZ2x5LiBJZiBBRVIgZXJyb3IgcmVwb3J0aW5nIGlzIGVuYWJsZWQgaW4gUm9vdAorRXJyb3IgQ29tbWFuZCBSZWdpc3RlciwgdGhlIFJvb3QgUG9ydCBnZW5lcmF0ZXMgYW4gaW50ZXJydXB0IGlmIGFuCitlcnJvciBpcyBkZXRlY3RlZC4KKworTm90ZSB0aGF0IHRoZSBlcnJvcnMgYXMgZGVzY3JpYmVkIGFib3ZlIGFyZSByZWxhdGVkIHRvIHRoZSBQQ0kgRXhwcmVzcworaGllcmFyY2h5IGFuZCBsaW5rcy4gVGhlc2UgZXJyb3JzIGRvIG5vdCBpbmNsdWRlIGFueSBkZXZpY2Ugc3BlY2lmaWMKK2Vycm9ycyBiZWNhdXNlIGRldmljZSBzcGVjaWZpYyBlcnJvcnMgd2lsbCBzdGlsbCBnZXQgc2VudCBkaXJlY3RseSB0bwordGhlIGRldmljZSBkcml2ZXIuCisKKzMuMSBDb25maWd1cmUgdGhlIEFFUiBjYXBhYmlsaXR5IHN0cnVjdHVyZQorCitBRVIgYXdhcmUgZHJpdmVycyBvZiBQQ0kgRXhwcmVzcyBjb21wb25lbnQgbmVlZCBjaGFuZ2UgdGhlIGRldmljZQorY29udHJvbCByZWdpc3RlcnMgdG8gZW5hYmxlIEFFUi4gVGhleSBhbHNvIGNvdWxkIGNoYW5nZSBBRVIgcmVnaXN0ZXJzLAoraW5jbHVkaW5nIG1hc2sgYW5kIHNldmVyaXR5IHJlZ2lzdGVycy4gSGVscGVyIGZ1bmN0aW9uCitwY2lfZW5hYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nIGNvdWxkIGJlIHVzZWQgdG8gZW5hYmxlIEFFUi4gU2VlCitzZWN0aW9uIDMuMy4KKworMy4yLiBQcm92aWRlIGNhbGxiYWNrcworCiszLjIuMSBjYWxsYmFjayByZXNldF9saW5rIHRvIHJlc2V0IHBjaSBleHByZXNzIGxpbmsKKworVGhpcyBjYWxsYmFjayBpcyB1c2VkIHRvIHJlc2V0IHRoZSBwY2kgZXhwcmVzcyBwaHlzaWNhbCBsaW5rIHdoZW4gYQorZmF0YWwgZXJyb3IgaGFwcGVucy4gVGhlIHJvb3QgcG9ydCBhZXIgc2VydmljZSBkcml2ZXIgcHJvdmlkZXMgYQorZGVmYXVsdCByZXNldF9saW5rIGZ1bmN0aW9uLCBidXQgZGlmZmVyZW50IHVwc3RyZWFtIHBvcnRzIG1pZ2h0CitoYXZlIGRpZmZlcmVudCBzcGVjaWZpY2F0aW9ucyB0byByZXNldCBwY2kgZXhwcmVzcyBsaW5rLCBzbyBhbGwKK3Vwc3RyZWFtIHBvcnRzIHNob3VsZCBwcm92aWRlIHRoZWlyIG93biByZXNldF9saW5rIGZ1bmN0aW9ucy4KKworSW4gc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciwgYSBuZXcgcG9pbnRlciwgcmVzZXRfbGluaywgaXMKK2FkZGVkLgorCitwY2lfZXJzX3Jlc3VsdF90ICgqcmVzZXRfbGluaykgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCitTZWN0aW9uIDMuMi4yLjIgcHJvdmlkZXMgbW9yZSBkZXRhaWxlZCBpbmZvIG9uIHdoZW4gdG8gY2FsbAorcmVzZXRfbGluay4KKworMy4yLjIgUENJIGVycm9yLXJlY292ZXJ5IGNhbGxiYWNrcworCitUaGUgUENJIEV4cHJlc3MgQUVSIFJvb3QgZHJpdmVyIHVzZXMgZXJyb3IgY2FsbGJhY2tzIHRvIGNvb3JkaW5hdGUKK3dpdGggZG93bnN0cmVhbSBkZXZpY2UgZHJpdmVycyBhc3NvY2lhdGVkIHdpdGggYSBoaWVyYXJjaHkgaW4gcXVlc3Rpb24KK3doZW4gcGVyZm9ybWluZyBlcnJvciByZWNvdmVyeSBhY3Rpb25zLgorCitEYXRhIHN0cnVjdCBwY2lfZHJpdmVyIGhhcyBhIHBvaW50ZXIsIGVycl9oYW5kbGVyLCB0byBwb2ludCB0bworcGNpX2Vycm9yX2hhbmRsZXJzIHdobyBjb25zaXN0cyBvZiBhIGNvdXBsZSBvZiBjYWxsYmFjayBmdW5jdGlvbgorcG9pbnRlcnMuIEFFUiBkcml2ZXIgZm9sbG93cyB0aGUgcnVsZXMgZGVmaW5lZCBpbgorcGNpLWVycm9yLXJlY292ZXJ5LnR4dCBleGNlcHQgcGNpIGV4cHJlc3Mgc3BlY2lmaWMgcGFydHMgKGUuZy4KK3Jlc2V0X2xpbmspLiBQbHMuIHJlZmVyIHRvIHBjaS1lcnJvci1yZWNvdmVyeS50eHQgZm9yIGRldGFpbGVkCitkZWZpbml0aW9ucyBvZiB0aGUgY2FsbGJhY2tzLgorCitCZWxvdyBzZWN0aW9ucyBzcGVjaWZ5IHdoZW4gdG8gY2FsbCB0aGUgZXJyb3IgY2FsbGJhY2sgZnVuY3Rpb25zLgorCiszLjIuMi4xIENvcnJlY3RhYmxlIGVycm9ycworCitDb3JyZWN0YWJsZSBlcnJvcnMgcG9zZSBubyBpbXBhY3RzIG9uIHRoZSBmdW5jdGlvbmFsaXR5IG9mCit0aGUgaW50ZXJmYWNlLiBUaGUgUENJIEV4cHJlc3MgcHJvdG9jb2wgY2FuIHJlY292ZXIgd2l0aG91dCBhbnkKK3NvZnR3YXJlIGludGVydmVudGlvbiBvciBhbnkgbG9zcyBvZiBkYXRhLiBUaGVzZSBlcnJvcnMgZG8gbm90CityZXF1aXJlIGFueSByZWNvdmVyeSBhY3Rpb25zLiBUaGUgQUVSIGRyaXZlciBjbGVhcnMgdGhlIGRldmljZSdzCitjb3JyZWN0YWJsZSBlcnJvciBzdGF0dXMgcmVnaXN0ZXIgYWNjb3JkaW5nbHkgYW5kIGxvZ3MgdGhlc2UgZXJyb3JzLgorCiszLjIuMi4yIE5vbi1jb3JyZWN0YWJsZSAobm9uLWZhdGFsIGFuZCBmYXRhbCkgZXJyb3JzCisKK0lmIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGVzIGEgbm9uLWZhdGFsIGVycm9yLCBwZXJmb3JtaW5nIGxpbmsgcmVzZXQKK2F0IHVwc3RyZWFtIGlzIG5vdCByZXF1aXJlZC4gVGhlIEFFUiBkcml2ZXIgY2FsbHMgZXJyb3JfZGV0ZWN0ZWQoZGV2LAorcGNpX2NoYW5uZWxfaW9fbm9ybWFsKSB0byBhbGwgZHJpdmVycyBhc3NvY2lhdGVkIHdpdGhpbiBhIGhpZXJhcmNoeSBpbgorcXVlc3Rpb24uIGZvciBleGFtcGxlLAorRW5kUG9pbnQ8PT0+RG93bnN0cmVhbVBvcnQgQjw9PT5VcHN0cmVhbVBvcnQgQTw9PT5Sb290UG9ydC4KK0lmIFVwc3RyZWFtIHBvcnQgQSBjYXB0dXJlcyBhbiBBRVIgZXJyb3IsIHRoZSBoaWVyYXJjaHkgY29uc2lzdHMgb2YKK0Rvd25zdHJlYW0gcG9ydCBCIGFuZCBFbmRQb2ludC4KKworQSBkcml2ZXIgbWF5IHJldHVybiBQQ0lfRVJTX1JFU1VMVF9DQU5fUkVDT1ZFUiwKK1BDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1QsIG9yIFBDSV9FUlNfUkVTVUxUX05FRURfUkVTRVQsIGRlcGVuZGluZyBvbgord2hldGhlciBpdCBjYW4gcmVjb3ZlciBvciB0aGUgQUVSIGRyaXZlciBjYWxscyBtbWlvX2VuYWJsZWQgYXMgbmV4dC4KKworSWYgYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0ZXMgYSBmYXRhbCBlcnJvciwga2VybmVsIHdpbGwgYnJvYWRjYXN0CitlcnJvcl9kZXRlY3RlZChkZXYsIHBjaV9jaGFubmVsX2lvX2Zyb3plbikgdG8gYWxsIGRyaXZlcnMgd2l0aGluCithIGhpZXJhcmNoeSBpbiBxdWVzdGlvbi4gVGhlbiwgcGVyZm9ybWluZyBsaW5rIHJlc2V0IGF0IHVwc3RyZWFtIGlzCituZWNlc3NhcnkuIEFzIGRpZmZlcmVudCBraW5kcyBvZiBkZXZpY2VzIG1pZ2h0IHVzZSBkaWZmZXJlbnQgYXBwcm9hY2hlcwordG8gcmVzZXQgbGluaywgQUVSIHBvcnQgc2VydmljZSBkcml2ZXIgaXMgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aGUKK2Z1bmN0aW9uIHRvIHJlc2V0IGxpbmsuIEZpcnN0bHksIGtlcm5lbCBsb29rcyBmb3IgaWYgdGhlIHVwc3RyZWFtCitjb21wb25lbnQgaGFzIGFuIGFlciBkcml2ZXIuIElmIGl0IGhhcywga2VybmVsIHVzZXMgdGhlIHJlc2V0X2xpbmsKK2NhbGxiYWNrIG9mIHRoZSBhZXIgZHJpdmVyLiBJZiB0aGUgdXBzdHJlYW0gY29tcG9uZW50IGhhcyBubyBhZXIgZHJpdmVyCithbmQgdGhlIHBvcnQgaXMgZG93bnN0cmVhbSBwb3J0LCB3ZSB3aWxsIHVzZSB0aGUgYWVyIGRyaXZlciBvZiB0aGUKK3Jvb3QgcG9ydCB3aG8gcmVwb3J0cyB0aGUgQUVSIGVycm9yLiBBcyBmb3IgdXBzdHJlYW0gcG9ydHMsCit0aGV5IHNob3VsZCBwcm92aWRlIHRoZWlyIG93biBhZXIgc2VydmljZSBkcml2ZXJzIHdpdGggcmVzZXRfbGluaworZnVuY3Rpb24uIElmIGVycm9yX2RldGVjdGVkIHJldHVybnMgUENJX0VSU19SRVNVTFRfQ0FOX1JFQ09WRVIgYW5kCityZXNldF9saW5rIHJldHVybnMgUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVELCB0aGUgZXJyb3IgaGFuZGxpbmcgZ29lcwordG8gbW1pb19lbmFibGVkLgorCiszLjMgaGVscGVyIGZ1bmN0aW9ucworCiszLjMuMSBpbnQgcGNpX2ZpbmRfYWVyX2NhcGFiaWxpdHkoc3RydWN0IHBjaV9kZXYgKmRldik7CitwY2lfZmluZF9hZXJfY2FwYWJpbGl0eSBsb2NhdGVzIHRoZSBQQ0kgRXhwcmVzcyBBRVIgY2FwYWJpbGl0eQoraW4gdGhlIGRldmljZSBjb25maWd1cmF0aW9uIHNwYWNlLiBJZiB0aGUgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydAorUENJLUV4cHJlc3MgQUVSLCB0aGUgZnVuY3Rpb24gcmV0dXJucyAwLgorCiszLjMuMiBpbnQgcGNpX2VuYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK3BjaV9lbmFibGVfcGNpZV9lcnJvcl9yZXBvcnRpbmcgZW5hYmxlcyB0aGUgZGV2aWNlIHRvIHNlbmQgZXJyb3IKK21lc3NhZ2VzIHRvIHJvb3QgcG9ydCB3aGVuIGFuIGVycm9yIGlzIGRldGVjdGVkLiBOb3RlIHRoYXQgZGV2aWNlcworZG9uJ3QgZW5hYmxlIHRoZSBlcnJvciByZXBvcnRpbmcgYnkgZGVmYXVsdCwgc28gZGV2aWNlIGRyaXZlcnMgbmVlZAorY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGVuYWJsZSBpdC4KKworMy4zLjMgaW50IHBjaV9kaXNhYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworcGNpX2Rpc2FibGVfcGNpZV9lcnJvcl9yZXBvcnRpbmcgZGlzYWJsZXMgdGhlIGRldmljZSB0byBzZW5kIGVycm9yCittZXNzYWdlcyB0byByb290IHBvcnQgd2hlbiBhbiBlcnJvciBpcyBkZXRlY3RlZC4KKworMy4zLjQgaW50IHBjaV9jbGVhbnVwX2Flcl91bmNvcnJlY3RfZXJyb3Jfc3RhdHVzKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworcGNpX2NsZWFudXBfYWVyX3VuY29ycmVjdF9lcnJvcl9zdGF0dXMgY2xlYW51cHMgdGhlIHVuY29ycmVjdGFibGUKK2Vycm9yIHN0YXR1cyByZWdpc3Rlci4KKworMy40IEZyZXF1ZW50IEFza2VkIFF1ZXN0aW9ucworCitROiBXaGF0IGhhcHBlbnMgaWYgYSBQQ0kgRXhwcmVzcyBkZXZpY2UgZHJpdmVyIGRvZXMgbm90IHByb3ZpZGUgYW4KK2Vycm9yIHJlY292ZXJ5IGhhbmRsZXIgKHBjaV9kcml2ZXItPmVycl9oYW5kbGVyIGlzIGVxdWFsIHRvIE5VTEwpPworCitBOiBUaGUgZGV2aWNlcyBhdHRhY2hlZCB3aXRoIHRoZSBkcml2ZXIgd29uJ3QgYmUgcmVjb3ZlcmVkLiBJZiB0aGUKK2Vycm9yIGlzIGZhdGFsLCBrZXJuZWwgd2lsbCBwcmludCBvdXQgd2FybmluZyBtZXNzYWdlcy4gUGxlYXNlIHJlZmVyCit0byBzZWN0aW9uIDMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK1E6IFdoYXQgaGFwcGVucyBpZiBhbiB1cHN0cmVhbSBwb3J0IHNlcnZpY2UgZHJpdmVyIGRvZXMgbm90IHByb3ZpZGUKK2NhbGxiYWNrIHJlc2V0X2xpbms/CisKK0E6IEZhdGFsIGVycm9yIHJlY292ZXJ5IHdpbGwgZmFpbCBpZiB0aGUgZXJyb3JzIGFyZSByZXBvcnRlZCBieSB0aGUKK3Vwc3RyZWFtIHBvcnRzIHdobyBhcmUgYXR0YWNoZWQgYnkgdGhlIHNlcnZpY2UgZHJpdmVyLgorCitROiBIb3cgZG9lcyB0aGlzIGluZnJhc3RydWN0dXJlIGRlYWwgd2l0aCBkcml2ZXIgdGhhdCBpcyBub3QgUENJCitFeHByZXNzIGF3YXJlPworCitBOiBUaGlzIGluZnJhc3RydWN0dXJlIGNhbGxzIHRoZSBlcnJvciBjYWxsYmFjayBmdW5jdGlvbnMgb2YgdGhlCitkcml2ZXIgd2hlbiBhbiBlcnJvciBoYXBwZW5zLiBCdXQgaWYgdGhlIGRyaXZlciBpcyBub3QgYXdhcmUgb2YKK1BDSSBFeHByZXNzLCB0aGUgZGV2aWNlIG1pZ2h0IG5vdCByZXBvcnQgaXRzIG93biBlcnJvcnMgdG8gcm9vdAorcG9ydC4KKworUTogV2hhdCBtb2RpZmljYXRpb25zIHdpbGwgdGhhdCBkcml2ZXIgbmVlZCB0byBtYWtlIGl0IGNvbXBhdGlibGUKK3dpdGggdGhlIFBDSSBFeHByZXNzIEFFUiBSb290IGRyaXZlcj8KKworQTogSXQgY291bGQgY2FsbCB0aGUgaGVscGVyIGZ1bmN0aW9ucyB0byBlbmFibGUgQUVSIGluIGRldmljZXMgYW5kCitjbGVhbnVwIHVuY29ycmVjdGFibGUgc3RhdHVzIHJlZ2lzdGVyLiBQbHMuIHJlZmVyIHRvIHNlY3Rpb24gMy4zLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2RldmljZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9kZXZpY2VzLnR4dAppbmRleCBmYmExZTA1Li5kMGU3OWQ1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL2RldmljZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcG93ZXIvZGV2aWNlcy50eHQKQEAgLTEsMjA4ICsxLDU1MyBAQAorTW9zdCBvZiB0aGUgY29kZSBpbiBMaW51eCBpcyBkZXZpY2UgZHJpdmVycywgc28gbW9zdCBvZiB0aGUgTGludXggcG93ZXIKK21hbmFnZW1lbnQgY29kZSBpcyBhbHNvIGRyaXZlci1zcGVjaWZpYy4gIE1vc3QgZHJpdmVycyB3aWxsIGRvIHZlcnkgbGl0dGxlOworb3RoZXJzLCBlc3BlY2lhbGx5IGZvciBwbGF0Zm9ybXMgd2l0aCBzbWFsbCBiYXR0ZXJpZXMgKGxpa2UgY2VsbCBwaG9uZXMpLAord2lsbCBkbyBhIGxvdC4KIAotRGV2aWNlIFBvd2VyIE1hbmFnZW1lbnQKK1RoaXMgd3JpdGV1cCBnaXZlcyBhbiBvdmVydmlldyBvZiBob3cgZHJpdmVycyBpbnRlcmFjdCB3aXRoIHN5c3RlbS13aWRlCitwb3dlciBtYW5hZ2VtZW50IGdvYWxzLCBlbXBoYXNpemluZyB0aGUgbW9kZWxzIGFuZCBpbnRlcmZhY2VzIHRoYXQgYXJlCitzaGFyZWQgYnkgZXZlcnl0aGluZyB0aGF0IGhvb2tzIHVwIHRvIHRoZSBkcml2ZXIgbW9kZWwgY29yZS4gIFJlYWQgaXQgYXMKK2JhY2tncm91bmQgZm9yIHRoZSBkb21haW4tc3BlY2lmaWMgd29yayB5b3UnZCBkbyB3aXRoIGFueSBzcGVjaWZpYyBkcml2ZXIuCiAKIAotRGV2aWNlIHBvd2VyIG1hbmFnZW1lbnQgZW5jb21wYXNzZXMgdHdvIGFyZWFzIC0gdGhlIGFiaWxpdHkgdG8gc2F2ZQotc3RhdGUgYW5kIHRyYW5zaXRpb24gYSBkZXZpY2UgdG8gYSBsb3ctcG93ZXIgc3RhdGUgd2hlbiB0aGUgc3lzdGVtIGlzCi1lbnRlcmluZyBhIGxvdy1wb3dlciBzdGF0ZTsgYW5kIHRoZSBhYmlsaXR5IHRvIHRyYW5zaXRpb24gYSBkZXZpY2UgdG8KLWEgbG93LXBvd2VyIHN0YXRlIHdoaWxlIHRoZSBzeXN0ZW0gaXMgcnVubmluZyAoYW5kIGluZGVwZW5kZW50bHkgb2YKLWFueSBvdGhlciBwb3dlciBtYW5hZ2VtZW50IGFjdGl2aXR5KS4gCitUd28gTW9kZWxzIGZvciBEZXZpY2UgUG93ZXIgTWFuYWdlbWVudAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0RyaXZlcnMgd2lsbCB1c2Ugb25lIG9yIGJvdGggb2YgdGhlc2UgbW9kZWxzIHRvIHB1dCBkZXZpY2VzIGludG8gbG93LXBvd2VyCitzdGF0ZXM6CisKKyAgICBTeXN0ZW0gU2xlZXAgbW9kZWw6CisJRHJpdmVycyBjYW4gZW50ZXIgbG93IHBvd2VyIHN0YXRlcyBhcyBwYXJ0IG9mIGVudGVyaW5nIHN5c3RlbS13aWRlCisJbG93LXBvd2VyIHN0YXRlcyBsaWtlICJzdXNwZW5kLXRvLXJhbSIsIG9yIChtb3N0bHkgZm9yIHN5c3RlbXMgd2l0aAorCWRpc2tzKSAiaGliZXJuYXRlIiAoc3VzcGVuZC10by1kaXNrKS4KKworCVRoaXMgaXMgc29tZXRoaW5nIHRoYXQgZGV2aWNlLCBidXMsIGFuZCBjbGFzcyBkcml2ZXJzIGNvbGxhYm9yYXRlIG9uCisJYnkgaW1wbGVtZW50aW5nIHZhcmlvdXMgcm9sZS1zcGVjaWZpYyBzdXNwZW5kIGFuZCByZXN1bWUgbWV0aG9kcyB0bworCWNsZWFubHkgcG93ZXIgZG93biBoYXJkd2FyZSBhbmQgc29mdHdhcmUgc3Vic3lzdGVtcywgdGhlbiByZWFjdGl2YXRlCisJdGhlbSB3aXRob3V0IGxvc3Mgb2YgZGF0YS4KKworCVNvbWUgZHJpdmVycyBjYW4gbWFuYWdlIGhhcmR3YXJlIHdha2V1cCBldmVudHMsIHdoaWNoIG1ha2UgdGhlIHN5c3RlbQorCWxlYXZlIHRoYXQgbG93LXBvd2VyIHN0YXRlLiAgVGhpcyBmZWF0dXJlIG1heSBiZSBkaXNhYmxlZCB1c2luZyB0aGUKKwlyZWxldmFudCAvc3lzL2RldmljZXMvLi4uL3Bvd2VyL3dha2V1cCBmaWxlOyBlbmFibGluZyBpdCBtYXkgY29zdCBzb21lCisJcG93ZXIgdXNhZ2UsIGJ1dCBsZXQgdGhlIHdob2xlIHN5c3RlbSBlbnRlciBsb3cgcG93ZXIgc3RhdGVzIG1vcmUgb2Z0ZW4uCisKKyAgICBSdW50aW1lIFBvd2VyIE1hbmFnZW1lbnQgbW9kZWw6CisJRHJpdmVycyBtYXkgYWxzbyBlbnRlciBsb3cgcG93ZXIgc3RhdGVzIHdoaWxlIHRoZSBzeXN0ZW0gaXMgcnVubmluZywKKwlpbmRlcGVuZGVudGx5IG9mIG90aGVyIHBvd2VyIG1hbmFnZW1lbnQgYWN0aXZpdHkuICBVcHN0cmVhbSBkcml2ZXJzCisJd2lsbCBub3JtYWxseSBub3Qga25vdyAob3IgY2FyZSkgaWYgdGhlIGRldmljZSBpcyBpbiBzb21lIGxvdyBwb3dlcgorCXN0YXRlIHdoZW4gaXNzdWluZyByZXF1ZXN0czsgdGhlIGRyaXZlciB3aWxsIGF1dG8tcmVzdW1lIGFueXRoaW5nCisJdGhhdCdzIG5lZWRlZCB3aGVuIGl0IGdldHMgYSByZXF1ZXN0LgorCisJVGhpcyBkb2Vzbid0IGhhdmUsIG9yIG5lZWQgbXVjaCBpbmZyYXN0cnVjdHVyZTsgaXQncyBqdXN0IHNvbWV0aGluZyB5b3UKKwlzaG91bGQgZG8gd2hlbiB3cml0aW5nIHlvdXIgZHJpdmVycy4gIEZvciBleGFtcGxlLCBjbGtfZGlzYWJsZSgpIHVudXNlZAorCWNsb2NrcyBhcyBwYXJ0IG9mIG1pbmltaXppbmcgcG93ZXIgZHJhaW4gZm9yIGN1cnJlbnRseS11bnVzZWQgaGFyZHdhcmUuCisJT2YgY291cnNlLCBzb21ldGltZXMgY2x1c3RlcnMgb2YgZHJpdmVycyB3aWxsIGNvbGxhYm9yYXRlIHdpdGggZWFjaAorCW90aGVyLCB3aGljaCBjb3VsZCBpbnZvbHZlIHRhc2stc3BlY2lmaWMgcG93ZXIgbWFuYWdlbWVudC4KKworVGhlcmUncyBub3QgYSBsb3QgdG8gYmUgc2FpZCBhYm91dCB0aG9zZSBsb3cgcG93ZXIgc3RhdGVzIGV4Y2VwdCB0aGF0IHRoZXkKK2FyZSB2ZXJ5IHN5c3RlbS1zcGVjaWZpYywgYW5kIG9mdGVuIGRldmljZS1zcGVjaWZpYy4gIEFsc28sIHRoYXQgaWYgZW5vdWdoCitkcml2ZXJzIHB1dCB0aGVtc2VsdmVzIGludG8gbG93IHBvd2VyIHN0YXRlcyAoYXQgInJ1bnRpbWUiKSwgdGhlIGVmZmVjdCBtYXkgYmUKK3RoZSBzYW1lIGFzIGVudGVyaW5nIHNvbWUgc3lzdGVtLXdpZGUgbG93LXBvd2VyIHN0YXRlIChzeXN0ZW0gc2xlZXApIC4uLiBhbmQKK3RoYXQgc3luZXJnaWVzIGV4aXN0LCBzbyB0aGF0IHNldmVyYWwgZHJpdmVycyB1c2luZyBydW50aW1lIHBtIG1pZ2h0IHB1dCB0aGUKK3N5c3RlbSBpbnRvIGEgc3RhdGUgd2hlcmUgZXZlbiBkZWVwZXIgcG93ZXIgc2F2aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZS4KKworTW9zdCBzdXNwZW5kZWQgZGV2aWNlcyB3aWxsIGhhdmUgcXVpZXNjZWQgYWxsIEkvTzogIG5vIG1vcmUgRE1BIG9yIGlycXMsIG5vCittb3JlIGRhdGEgcmVhZCBvciB3cml0dGVuLCBhbmQgcmVxdWVzdHMgZnJvbSB1cHN0cmVhbSBkcml2ZXJzIGFyZSBubyBsb25nZXIKK2FjY2VwdGVkLiAgQSBnaXZlbiBidXMgb3IgcGxhdGZvcm0gbWF5IGhhdmUgZGlmZmVyZW50IHJlcXVpcmVtZW50cyB0aG91Z2guCisKK0V4YW1wbGVzIG9mIGhhcmR3YXJlIHdha2V1cCBldmVudHMgaW5jbHVkZSBhbiBhbGFybSBmcm9tIGEgcmVhbCB0aW1lIGNsb2NrLAorbmV0d29yayB3YWtlLW9uLUxBTiBwYWNrZXRzLCBrZXlib2FyZCBvciBtb3VzZSBhY3Rpdml0eSwgYW5kIG1lZGlhIGluc2VydGlvbgorb3IgcmVtb3ZhbCAoZm9yIFBDTUNJQSwgTU1DL1NELCBVU0IsIGFuZCBzbyBvbikuCiAKIAotTWV0aG9kcworSW50ZXJmYWNlcyBmb3IgRW50ZXJpbmcgU3lzdGVtIFNsZWVwIFN0YXRlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorTW9zdCBvZiB0aGUgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlcyBhIGRldmljZSBkcml2ZXIgbmVlZHMgdG8ga25vdyBhYm91dAorcmVsYXRlIHRvIHRoYXQgZmlyc3QgbW9kZWw6ICBlbnRlcmluZyBhIHN5c3RlbS13aWRlIGxvdyBwb3dlciBzdGF0ZSwKK3JhdGhlciB0aGFuIGp1c3QgbWluaW1pemluZyBwb3dlciBjb25zdW1wdGlvbiBieSBvbmUgZGV2aWNlLgogCi1UaGUgbWV0aG9kcyB0byBzdXNwZW5kIGFuZCByZXN1bWUgZGV2aWNlcyByZXNpZGUgaW4gc3RydWN0IGJ1c190eXBlOiAKKworQnVzIERyaXZlciBNZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSBjb3JlIG1ldGhvZHMgdG8gc3VzcGVuZCBhbmQgcmVzdW1lIGRldmljZXMgcmVzaWRlIGluIHN0cnVjdCBidXNfdHlwZS4KK1RoZXNlIGFyZSBtb3N0bHkgb2YgaW50ZXJlc3QgdG8gcGVvcGxlIHdyaXRpbmcgaW5mcmFzdHJ1Y3R1cmUgZm9yIGJ1c3NlcworbGlrZSBQQ0kgb3IgVVNCLCBvciBiZWNhdXNlIHRoZXkgZGVmaW5lIHRoZSBwcmltaXRpdmVzIHRoYXQgZGV2aWNlIGRyaXZlcnMKK21heSBuZWVkIHRvIGFwcGx5IGluIGRvbWFpbi1zcGVjaWZpYyB3YXlzIHRvIHRoZWlyIGRldmljZXM6CiAKIHN0cnVjdCBidXNfdHlwZSB7Ci0gICAgICAgLi4uCi0gICAgICAgaW50ICAgICAgICAgICAgICgqc3VzcGVuZCkoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLSAgICAgICBpbnQgICAgICAgICAgICAgKCpyZXN1bWUpKHN0cnVjdCBkZXZpY2UgKiBkZXYpOworCS4uLgorCWludCAgKCpzdXNwZW5kKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJaW50ICAoKnN1c3BlbmRfbGF0ZSkoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCisJaW50ICAoKnJlc3VtZV9lYXJseSkoc3RydWN0IGRldmljZSAqZGV2KTsKKwlpbnQgICgqcmVzdW1lKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogfTsKIAotRWFjaCBidXMgZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGltcGxlbWVudGluZyB0aGVzZSBtZXRob2RzLCB0cmFuc2xhdGluZwotdGhlIGNhbGwgaW50byBhIGJ1cy1zcGVjaWZpYyByZXF1ZXN0IGFuZCBmb3J3YXJkaW5nIHRoZSBjYWxsIHRvIHRoZQotYnVzLXNwZWNpZmljIGRyaXZlcnMuIEZvciBleGFtcGxlLCBQQ0kgZHJpdmVycyBpbXBsZW1lbnQgc3VzcGVuZCgpIGFuZAotcmVzdW1lKCkgbWV0aG9kcyBpbiBzdHJ1Y3QgcGNpX2RyaXZlci4gVGhlIFBDSSBjb3JlIGlzIHNpbXBseQotcmVzcG9uc2libGUgZm9yIHRyYW5zbGF0aW5nIHRoZSBwb2ludGVycyB0byBQQ0ktc3BlY2lmaWMgb25lcyBhbmQKLWNhbGxpbmcgdGhlIGxvdy1sZXZlbCBkcml2ZXIuCitCdXMgZHJpdmVycyBpbXBsZW1lbnQgdGhvc2UgbWV0aG9kcyBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGhhcmR3YXJlIGFuZAordGhlIGRyaXZlcnMgdXNpbmcgaXQ7IFBDSSB3b3JrcyBkaWZmZXJlbnRseSBmcm9tIFVTQiwgYW5kIHNvIG9uLiAgTm90IG1hbnkKK3Blb3BsZSB3cml0ZSBidXMgZHJpdmVyczsgbW9zdCBkcml2ZXIgY29kZSBpcyBhICJkZXZpY2UgZHJpdmVyIiB0aGF0CitidWlsZHMgb24gdG9wIG9mIGJ1cy1zcGVjaWZpYyBmcmFtZXdvcmsgY29kZS4KIAotVGhpcyBpcyBkb25lIHRvIGEpIGVhc2UgdHJhbnNpdGlvbiB0byB0aGUgbmV3IHBvd2VyIG1hbmFnZW1lbnQgbWV0aG9kcwotYW5kIGxldmVyYWdlIHRoZSBleGlzdGluZyBQTSBjb2RlIGluIHZhcmlvdXMgYnVzIGRyaXZlcnM7IGIpIGFsbG93Ci1idXNlcyB0byBpbXBsZW1lbnQgZ2VuZXJpYyBhbmQgZGVmYXVsdCBQTSByb3V0aW5lcyBmb3IgZGV2aWNlcywgYW5kIGMpCi1tYWtlIHRoZSBmbG93IG9mIGV4ZWN1dGlvbiBvYnZpb3VzIHRvIHRoZSByZWFkZXIuIAorRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2UgZHJpdmVyIGNhbGxzLCBzZWUgdGhlIGRlc2NyaXB0aW9uIGxhdGVyOwordGhleSBhcmUgY2FsbGVkIGluIHBoYXNlcyBmb3IgZXZlcnkgZGV2aWNlLCByZXNwZWN0aW5nIHRoZSBwYXJlbnQtY2hpbGQKK3NlcXVlbmNpbmcgaW4gdGhlIGRyaXZlciBtb2RlbCB0cmVlLiAgTm90ZSB0aGF0IGFzIHRoaXMgaXMgYmVpbmcgd3JpdHRlbiwKK29ubHkgdGhlIHN1c3BlbmQoKSBhbmQgcmVzdW1lKCkgYXJlIHdpZGVseSBhdmFpbGFibGU7IG5vdCBtYW55IGJ1cyBkcml2ZXJzCitsZXZlcmFnZSBhbGwgb2YgdGhvc2UgcGhhc2VzLCBvciBwYXNzIHRoZW0gZG93biB0byBsb3dlciBkcml2ZXIgbGV2ZWxzLgogCiAKLVN5c3RlbSBQb3dlciBNYW5hZ2VtZW50Cisvc3lzL2RldmljZXMvLi4uL3Bvd2VyL3dha2V1cCBmaWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0FsbCBkZXZpY2VzIGluIHRoZSBkcml2ZXIgbW9kZWwgaGF2ZSB0d28gZmxhZ3MgdG8gY29udHJvbCBoYW5kbGluZyBvZgord2FrZXVwIGV2ZW50cywgd2hpY2ggYXJlIGhhcmR3YXJlIHNpZ25hbHMgdGhhdCBjYW4gZm9yY2UgdGhlIGRldmljZSBhbmQvb3IKK3N5c3RlbSBvdXQgb2YgYSBsb3cgcG93ZXIgc3RhdGUuICBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgYnkgYnVzIG9yIGRldmljZQorZHJpdmVyIGNvZGUgdXNpbmcgZGV2aWNlX2luaXRfd2FrZXVwKGRldixjYW5fd2FrZXVwKS4KIAotV2hlbiB0aGUgc3lzdGVtIGVudGVycyBhIGxvdy1wb3dlciBzdGF0ZSwgdGhlIGRldmljZSB0cmVlIGlzIHdhbGtlZCBpbgotYSBkZXB0aC1maXJzdCBmYXNoaW9uIHRvIHRyYW5zaXRpb24gZWFjaCBkZXZpY2UgaW50byBhIGxvdy1wb3dlcgotc3RhdGUuIFRoZSBvcmRlcmluZyBvZiB0aGUgZGV2aWNlIHRyZWUgaXMgZ3VhcmFudGVlZCBieSB0aGUgb3JkZXIgaW4KLXdoaWNoIGRldmljZXMgZ2V0IHJlZ2lzdGVyZWQgLSBjaGlsZHJlbiBhcmUgbmV2ZXIgcmVnaXN0ZXJlZCBiZWZvcmUKLXRoZWlyIGFuY2VzdG9ycywgYW5kIGRldmljZXMgYXJlIHBsYWNlZCBhdCB0aGUgYmFjayBvZiB0aGUgbGlzdCB3aGVuCi1yZWdpc3RlcmVkLiBCeSB3YWxraW5nIHRoZSBsaXN0IGluIHJldmVyc2Ugb3JkZXIsIHdlIGFyZSBndWFyYW50ZWVkIHRvCi1zdXNwZW5kIGRldmljZXMgaW4gdGhlIHByb3BlciBvcmRlci4gCitUaGUgImNhbl93YWtldXAiIGZsYWcganVzdCByZWNvcmRzIHdoZXRoZXIgdGhlIGRldmljZSAoYW5kIGl0cyBkcml2ZXIpIGNhbgorcGh5c2ljYWxseSBzdXBwb3J0IHdha2V1cCBldmVudHMuICBXaGVuIHRoYXQgZmxhZyBpcyBjbGVhciwgdGhlIHN5c2ZzCisid2FrZXVwIiBmaWxlIGlzIGVtcHR5LCBhbmQgZGV2aWNlX21heV93YWtldXAoKSByZXR1cm5zIGZhbHNlLgogCi1EZXZpY2VzIGFyZSBzdXNwZW5kZWQgb25jZSB3aXRoIGludGVycnVwdHMgZW5hYmxlZC4gRHJpdmVycyBhcmUKLWV4cGVjdGVkIHRvIHN0b3AgSS9PIHRyYW5zYWN0aW9ucywgc2F2ZSBkZXZpY2Ugc3RhdGUsIGFuZCBwbGFjZSB0aGUKLWRldmljZSBpbnRvIGEgbG93LXBvd2VyIHN0YXRlLiBEcml2ZXJzIG1heSBzbGVlcCwgYWxsb2NhdGUgbWVtb3J5LAotZXRjLiBhdCB3aWxsLiAKK0ZvciBkZXZpY2VzIHRoYXQgY2FuIGlzc3VlIHdha2V1cCBldmVudHMsIGEgc2VwYXJhdGUgZmxhZyBjb250cm9scyB3aGV0aGVyCit0aGF0IGRldmljZSBzaG91bGQgdHJ5IHRvIHVzZSBpdHMgd2FrZXVwIG1lY2hhbmlzbS4gIFRoZSBpbml0aWFsIHZhbHVlIG9mCitkZXZpY2VfbWF5X3dha2V1cCgpIHdpbGwgYmUgdHJ1ZSwgc28gdGhhdCB0aGUgZGV2aWNlJ3MgIndha2V1cCIgZmlsZSBob2xkcwordGhlIHZhbHVlICJlbmFibGVkIi4gIFVzZXJzcGFjZSBjYW4gY2hhbmdlIHRoYXQgdG8gImRpc2FibGVkIiBzbyB0aGF0CitkZXZpY2VfbWF5X3dha2V1cCgpIHJldHVybnMgZmFsc2U7IG9yIGNoYW5nZSBpdCBiYWNrIHRvICJlbmFibGVkIiAoc28gdGhhdAoraXQgcmV0dXJucyB0cnVlIGFnYWluKS4KIAotU29tZSBkZXZpY2VzIGFyZSBicm9rZW4gYW5kIHdpbGwgaW5ldml0YWJseSBoYXZlIHByb2JsZW1zIHBvd2VyaW5nCi1kb3duIG9yIGRpc2FibGluZyB0aGVtc2VsdmVzIHdpdGggaW50ZXJydXB0cyBlbmFibGVkLiBGb3IgdGhlc2UKLXNwZWNpYWwgY2FzZXMsIHRoZXkgbWF5IHJldHVybiAtRUFHQUlOLiBUaGlzIHdpbGwgcHV0IHRoZSBkZXZpY2Ugb24gYQotbGlzdCB0byBiZSB0YWtlbiBjYXJlIG9mIGxhdGVyLiBXaGVuIGludGVycnVwdHMgYXJlIGRpc2FibGVkLCBiZWZvcmUKLXdlIGVudGVyIHRoZSBsb3ctcG93ZXIgc3RhdGUsIHRoZWlyIGRyaXZlcnMgYXJlIGNhbGxlZCBhZ2FpbiB0byBwdXQKLXRoZWlyIGRldmljZSB0byBzbGVlcC4gCiAKLU9uIHJlc3VtZSwgdGhlIGRldmljZXMgdGhhdCByZXR1cm5lZCAtRUFHQUlOIHdpbGwgYmUgY2FsbGVkIHRvIHBvd2VyCi10aGVtc2VsdmVzIGJhY2sgb24gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLiBPbmNlIGludGVycnVwdHMgaGF2ZSBiZWVuCi1yZS1lbmFibGVkLCB0aGUgcmVzdCBvZiB0aGUgZHJpdmVycyB3aWxsIGJlIGNhbGxlZCB0byByZXN1bWUgdGhlaXIKLWRldmljZXMuIE9uIHJlc3VtZSwgYSBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yIHBvd2VyaW5nIGJhY2sgb24gZWFjaAotZGV2aWNlLCByZXN0b3Jpbmcgc3RhdGUsIGFuZCByZS1lbmFibGluZyBJL08gdHJhbnNhY3Rpb25zIGZvciB0aGF0Ci1kZXZpY2UuIAorRVhBTVBMRTogIFBDSSBEZXZpY2UgRHJpdmVyIE1ldGhvZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQQ0kgZnJhbWV3b3JrIHNvZnR3YXJlIGNhbGxzIHRoZXNlIG1ldGhvZHMgd2hlbiB0aGUgUENJIGRldmljZSBkcml2ZXIgYm91bmQKK3RvIGEgZGV2aWNlIGRldmljZSBoYXMgcHJvdmlkZWQgdGhlbToKIAorc3RydWN0IHBjaV9kcml2ZXIgeworCS4uLgorCWludCAgKCpzdXNwZW5kKShzdHJ1Y3QgcGNpX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQgICgqc3VzcGVuZF9sYXRlKShzdHJ1Y3QgcGNpX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKworCWludCAgKCpyZXN1bWVfZWFybHkpKHN0cnVjdCBwY2lfZGV2aWNlICpwZGV2KTsKKwlpbnQgICgqcmVzdW1lKShzdHJ1Y3QgcGNpX2RldmljZSAqcGRldik7Cit9OworCitEcml2ZXJzIHdpbGwgaW1wbGVtZW50IHRob3NlIG1ldGhvZHMsIGFuZCBjYWxsIFBDSS1zcGVjaWZpYyBwcm9jZWR1cmVzCitsaWtlIHBjaV9zZXRfcG93ZXJfc3RhdGUoKSwgcGNpX2VuYWJsZV93YWtlKCksIHBjaV9zYXZlX3N0YXRlKCksIGFuZAorcGNpX3Jlc3RvcmVfc3RhdGUoKSB0byBtYW5hZ2UgUENJLXNwZWNpZmljIG1lY2hhbmlzbXMuICAoUENJIGNvbmZpZyBzcGFjZQorY291bGQgYmUgc2F2ZWQgZHVyaW5nIGRyaXZlciBwcm9iZSwgaWYgaXQgd2VyZW4ndCBmb3IgdGhlIGZhY3QgdGhhdCBzb21lCitzeXN0ZW1zIHJlbHkgb24gdXNlcnNwYWNlIHR3ZWFraW5nIHVzaW5nIHNldHBjaS4pICBEZXZpY2VzIGFyZSBzdXNwZW5kZWQKK2JlZm9yZSB0aGVpciBicmlkZ2VzIGVudGVyIGxvdyBwb3dlciBzdGF0ZXMsIGFuZCBsaWtld2lzZSBicmlkZ2VzIHJlc3VtZQorYmVmb3JlIHRoZWlyIGRldmljZXMuCisKKworVXBwZXIgTGF5ZXJzIG9mIERyaXZlciBTdGFja3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEZXZpY2UgZHJpdmVycyBnZW5lcmFsbHkgaGF2ZSBhdCBsZWFzdCB0d28gaW50ZXJmYWNlcywgYW5kIHRoZSBtZXRob2RzCitza2V0Y2hlZCBhYm92ZSBhcmUgdGhlIG9uZXMgd2hpY2ggYXBwbHkgdG8gdGhlIGxvd2VyIGxldmVsIChuZWFyZXIgUENJLCBVU0IsCitvciBvdGhlciBidXMgaGFyZHdhcmUpLiAgVGhlIG5ldHdvcmsgYW5kIGJsb2NrIGxheWVycyBhcmUgZXhhbXBsZXMgb2YgdXBwZXIKK2xldmVsIGludGVyZmFjZXMsIGFzIGlzIGEgY2hhcmFjdGVyIGRldmljZSB0YWxraW5nIHRvIHVzZXJzcGFjZS4KKworUG93ZXIgbWFuYWdlbWVudCByZXF1ZXN0cyBub3JtYWxseSBuZWVkIHRvIGZsb3cgdGhyb3VnaCB0aG9zZSB1cHBlciBsZXZlbHMsCit3aGljaCBvZnRlbiB1c2UgZG9tYWluLW9yaWVudGVkIHJlcXVlc3RzIGxpa2UgImJsYW5rIHRoYXQgc2NyZWVuIi4gIEluCitzb21lIGNhc2VzIHRob3NlIHVwcGVyIGxldmVscyB3aWxsIGhhdmUgcG93ZXIgbWFuYWdlbWVudCBpbnRlbGxpZ2VuY2UgdGhhdAorcmVsYXRlcyB0byBlbmQtdXNlciBhY3Rpdml0eSwgb3Igb3RoZXIgZGV2aWNlcyB0aGF0IHdvcmsgaW4gY29vcGVyYXRpb24uCisKK1doZW4gdGhvc2UgaW50ZXJmYWNlcyBhcmUgc3RydWN0dXJlZCB1c2luZyBjbGFzcyBpbnRlcmZhY2VzLCB0aGVyZSBpcyBhCitzdGFuZGFyZCB3YXkgdG8gaGF2ZSB0aGUgdXBwZXIgbGF5ZXIgc3RvcCBpc3N1aW5nIHJlcXVlc3RzIHRvIGEgZ2l2ZW4KK2NsYXNzIGRldmljZSAoYW5kIHJlc3RhcnQgbGF0ZXIpOgorCitzdHJ1Y3QgY2xhc3MgeworCS4uLgorCWludCAgKCpzdXNwZW5kKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJaW50ICAoKnJlc3VtZSkoc3RydWN0IGRldmljZSAqZGV2KTsKK307CisKK1Rob3NlIGNhbGxzIGFyZSBpc3N1ZWQgaW4gc3BlY2lmaWMgcGhhc2VzIG9mIHRoZSBwcm9jZXNzIGJ5IHdoaWNoIHRoZQorc3lzdGVtIGVudGVycyBhIGxvdyBwb3dlciAic3VzcGVuZCIgc3RhdGUsIG9yIHJlc3VtZXMgZnJvbSBpdC4KKworCitDYWxsaW5nIERyaXZlcnMgdG8gRW50ZXIgU3lzdGVtIFNsZWVwIFN0YXRlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1doZW4gdGhlIHN5c3RlbSBlbnRlcnMgYSBsb3cgcG93ZXIgc3RhdGUsIGVhY2ggZGV2aWNlJ3MgZHJpdmVyIGlzIGFza2VkCit0byBzdXNwZW5kIHRoZSBkZXZpY2UgYnkgcHV0dGluZyBpdCBpbnRvIHN0YXRlIGNvbXBhdGlibGUgd2l0aCB0aGUgdGFyZ2V0CitzeXN0ZW0gc3RhdGUuICBUaGF0J3MgdXN1YWxseSBzb21lIHZlcnNpb24gb2YgIm9mZiIsIGJ1dCB0aGUgZGV0YWlscyBhcmUKK3N5c3RlbS1zcGVjaWZpYy4gIEFsc28sIHdha2V1cC1lbmFibGVkIGRldmljZXMgd2lsbCB1c3VhbGx5IHN0YXkgcGFydGx5CitmdW5jdGlvbmFsIGluIG9yZGVyIHRvIHdha2UgdGhlIHN5c3RlbS4KKworV2hlbiB0aGUgc3lzdGVtIGxlYXZlcyB0aGF0IGxvdyBwb3dlciBzdGF0ZSwgdGhlIGRldmljZSdzIGRyaXZlciBpcyBhc2tlZAordG8gcmVzdW1lIGl0LiAgVGhlIHN1c3BlbmQgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFsd2F5cyBnbyB0b2dldGhlciwgYW5kCitib3RoIGFyZSBtdWx0aS1waGFzZSBvcGVyYXRpb25zLgorCitGb3Igc2ltcGxlIGRyaXZlcnMsIHN1c3BlbmQgbWlnaHQgcXVpZXNjZSB0aGUgZGV2aWNlIHVzaW5nIHRoZSBjbGFzcyBjb2RlCithbmQgdGhlbiB0dXJuIGl0cyBoYXJkd2FyZSBhcyAib2ZmIiBhcyBwb3NzaWJsZSB3aXRoIGxhdGVfc3VzcGVuZC4gIFRoZQorbWF0Y2hpbmcgcmVzdW1lIGNhbGxzIHdvdWxkIHRoZW4gY29tcGxldGVseSByZWluaXRpYWxpemUgdGhlIGhhcmR3YXJlCitiZWZvcmUgcmVhY3RpdmF0aW5nIGl0cyBjbGFzcyBJL08gcXVldWVzLgorCitNb3JlIHBvd2VyLWF3YXJlIGRyaXZlcnMgZHJpdmVycyB3aWxsIHVzZSBtb3JlIHRoYW4gb25lIGRldmljZSBsb3cgcG93ZXIKK3N0YXRlLCBlaXRoZXIgYXQgcnVudGltZSBvciBkdXJpbmcgc3lzdGVtIHNsZWVwIHN0YXRlcywgYW5kIG1pZ2h0IHRyaWdnZXIKK3N5c3RlbSB3YWtldXAgZXZlbnRzLgorCisKK0NhbGwgU2VxdWVuY2UgR3VhcmFudGVlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUbyBlbnN1cmUgdGhhdCBicmlkZ2VzIGFuZCBzaW1pbGFyIGxpbmtzIG5lZWRlZCB0byB0YWxrIHRvIGEgZGV2aWNlIGFyZQorYXZhaWxhYmxlIHdoZW4gdGhlIGRldmljZSBpcyBzdXNwZW5kZWQgb3IgcmVzdW1lZCwgdGhlIGRldmljZSB0cmVlIGlzCit3YWxrZWQgaW4gYSBib3R0b20tdXAgb3JkZXIgdG8gc3VzcGVuZCBkZXZpY2VzLiAgQSB0b3AtZG93biBvcmRlciBpcwordXNlZCB0byByZXN1bWUgdGhvc2UgZGV2aWNlcy4KKworVGhlIG9yZGVyaW5nIG9mIHRoZSBkZXZpY2UgdHJlZSBpcyBkZWZpbmVkIGJ5IHRoZSBvcmRlciBpbiB3aGljaCBkZXZpY2VzCitnZXQgcmVnaXN0ZXJlZDogIGEgY2hpbGQgY2FuIG5ldmVyIGJlIHJlZ2lzdGVyZWQsIHByb2JlZCBvciByZXN1bWVkIGJlZm9yZQoraXRzIHBhcmVudDsgYW5kIGNhbid0IGJlIHJlbW92ZWQgb3Igc3VzcGVuZGVkIGFmdGVyIHRoYXQgcGFyZW50LgorCitUaGUgcG9saWN5IGlzIHRoYXQgdGhlIGRldmljZSB0cmVlIHNob3VsZCBtYXRjaCBoYXJkd2FyZSBidXMgdG9wb2xvZ3kuCisoT3IgYXQgbGVhc3QgdGhlIGNvbnRyb2wgYnVzLCBmb3IgZGV2aWNlcyB3aGljaCB1c2UgbXVsdGlwbGUgYnVzc2VzLikKKworCitTdXNwZW5kaW5nIERldmljZXMKKy0tLS0tLS0tLS0tLS0tLS0tLQorU3VzcGVuZGluZyBhIGdpdmVuIGRldmljZSBpcyBkb25lIGluIHNldmVyYWwgcGhhc2VzLiAgU3VzcGVuZGluZyB0aGUKK3N5c3RlbSBhbHdheXMgaW5jbHVkZXMgZXZlcnkgcGhhc2UsIGV4ZWN1dGluZyBjYWxscyBmb3IgZXZlcnkgZGV2aWNlCitiZWZvcmUgdGhlIG5leHQgcGhhc2UgYmVnaW5zLiAgTm90IGFsbCBidXNzZXMgb3IgY2xhc3NlcyBzdXBwb3J0IGFsbAordGhlc2UgY2FsbGJhY2tzOyBhbmQgbm90IGFsbCBkcml2ZXJzIHVzZSBhbGwgdGhlIGNhbGxiYWNrcy4KKworVGhlIHBoYXNlcyBhcmUgc2VlbiBieSBkcml2ZXIgbm90aWZpY2F0aW9ucyBpc3N1ZWQgaW4gdGhpcyBvcmRlcjoKKworICAgMQljbGFzcy5zdXNwZW5kKGRldiwgbWVzc2FnZSkgaXMgY2FsbGVkIGFmdGVyIHRhc2tzIGFyZSBmcm96ZW4sIGZvcgorCWRldmljZXMgYXNzb2NpYXRlZCB3aXRoIGEgY2xhc3MgdGhhdCBoYXMgc3VjaCBhIG1ldGhvZC4gIFRoaXMKKwltZXRob2QgbWF5IHNsZWVwLgorCisJU2luY2UgSS9PIGFjdGl2aXR5IHVzdWFsbHkgY29tZXMgZnJvbSBzdWNoIGhpZ2hlciBsYXllcnMsIHRoaXMgaXMKKwlhIGdvb2QgcGxhY2UgdG8gcXVpZXNjZSBhbGwgZHJpdmVycyBvZiBhIGdpdmVuIHR5cGUgKGFuZCBrZWVwIHN1Y2gKKwljb2RlIG91dCBvZiB0aG9zZSBkcml2ZXJzKS4KKworICAgMglidXMuc3VzcGVuZChkZXYsIG1lc3NhZ2UpIGlzIGNhbGxlZCBuZXh0LiAgVGhpcyBtZXRob2QgbWF5IHNsZWVwLAorCWFuZCBpcyBvZnRlbiBtb3JwaGVkIGludG8gYSBkZXZpY2UgZHJpdmVyIGNhbGwgd2l0aCBidXMtc3BlY2lmaWMKKwlwYXJhbWV0ZXJzIGFuZC9vciBydWxlcy4KKworCVRoaXMgY2FsbCBzaG91bGQgaGFuZGxlIHBhcnRzIG9mIGRldmljZSBzdXNwZW5kIGxvZ2ljIHRoYXQgcmVxdWlyZQorCXNsZWVwaW5nLiAgSXQgcHJvYmFibHkgZG9lcyB3b3JrIHRvIHF1aWVzY2UgdGhlIGRldmljZSB3aGljaCBoYXNuJ3QKKwliZWVuIGFic3RyYWN0ZWQgaW50byBjbGFzcy5zdXNwZW5kKCkgb3IgYnVzLnN1c3BlbmRfbGF0ZSgpLgorCisgICAzCWJ1cy5zdXNwZW5kX2xhdGUoZGV2LCBtZXNzYWdlKSBpcyBjYWxsZWQgd2l0aCBJUlFzIGRpc2FibGVkLCBhbmQKKwl3aXRoIG9ubHkgb25lIENQVSBhY3RpdmUuICBVbnRpbCB0aGUgYnVzLnJlc3VtZV9lYXJseSgpIHBoYXNlCisJY29tcGxldGVzIChzZWUgbGF0ZXIpLCBJUlFzIGFyZSBub3QgZW5hYmxlZCBhZ2Fpbi4gIFRoaXMgbWV0aG9kCisJd29uJ3QgYmUgZXhwb3NlZCBieSBhbGwgYnVzc2VzOyBmb3IgbWVzc2FnZSBiYXNlZCBidXNzZXMgbGlrZSBVU0IsCisJSTJDLCBvciBTUEksIGRldmljZSBpbnRlcmFjdGlvbnMgbm9ybWFsbHkgcmVxdWlyZSBJUlFzLiAgVGhpcyBidXMKKwljYWxsIG1heSBiZSBtb3JwaGVkIGludG8gYSBkcml2ZXIgY2FsbCB3aXRoIGJ1cy1zcGVjaWZpYyBwYXJhbWV0ZXJzLgorCisJVGhpcyBjYWxsIG1pZ2h0IHNhdmUgbG93IGxldmVsIGhhcmR3YXJlIHN0YXRlIHRoYXQgbWlnaHQgb3RoZXJ3aXNlCisJYmUgbG9zdCBpbiB0aGUgdXBjb21pbmcgbG93IHBvd2VyIHN0YXRlLCBhbmQgYWN0dWFsbHkgcHV0IHRoZQorCWRldmljZSBpbnRvIGEgbG93IHBvd2VyIHN0YXRlIC4uLiBzbyB0aGF0IGluIHNvbWUgY2FzZXMgdGhlIGRldmljZQorCW1heSBzdGF5IHBhcnRseSB1c2FibGUgdW50aWwgdGhpcyBsYXRlLiAgVGhpcyAibGF0ZSIgY2FsbCBtYXkgYWxzbworCWhlbHAgd2hlbiBjb3Bpbmcgd2l0aCBoYXJkd2FyZSB0aGF0IGJlaGF2ZXMgYmFkbHkuCisKK1RoZSBwbV9tZXNzYWdlX3QgcGFyYW1ldGVyIGlzIGN1cnJlbnRseSB1c2VkIHRvIHJlZmluZSB0aG9zZSBzZW1hbnRpY3MKKyhkZXNjcmliZWQgbGF0ZXIpLgorCitBdCB0aGUgZW5kIG9mIHRob3NlIHBoYXNlcywgZHJpdmVycyBzaG91bGQgbm9ybWFsbHkgaGF2ZSBzdG9wcGVkIGFsbCBJL08KK3RyYW5zYWN0aW9ucyAoRE1BLCBJUlFzKSwgc2F2ZWQgZW5vdWdoIHN0YXRlIHRoYXQgdGhleSBjYW4gcmUtaW5pdGlhbGl6ZQorb3IgcmVzdG9yZSBwcmV2aW91cyBzdGF0ZSAoYXMgbmVlZGVkIGJ5IHRoZSBoYXJkd2FyZSksIGFuZCBwbGFjZWQgdGhlCitkZXZpY2UgaW50byBhIGxvdy1wb3dlciBzdGF0ZS4gIE9uIG1hbnkgcGxhdGZvcm1zIHRoZXkgd2lsbCBhbHNvIHVzZQorY2xrX2Rpc2FibGUoKSB0byBnYXRlIG9mZiBvbmUgb3IgbW9yZSBjbG9jayBzb3VyY2VzOyBzb21ldGltZXMgdGhleSB3aWxsCithbHNvIHN3aXRjaCBvZmYgcG93ZXIgc3VwcGxpZXMsIG9yIHJlZHVjZSB2b2x0YWdlcy4gIERyaXZlcnMgd2hpY2ggaGF2ZQorcnVudGltZSBQTSBzdXBwb3J0IG1heSBhbHJlYWR5IGhhdmUgcGVyZm9ybWVkIHNvbWUgb3IgYWxsIG9mIHRoZSBzdGVwcworbmVlZGVkIHRvIHByZXBhcmUgZm9yIHRoZSB1cGNvbWluZyBzeXN0ZW0gc2xlZXAgc3RhdGUuCisKK1doZW4gYW55IGRyaXZlciBzZWVzIHRoYXQgaXRzIGRldmljZV9jYW5fd2FrZXVwKGRldiksIGl0IHNob3VsZCBtYWtlIHN1cmUKK3RvIHVzZSB0aGUgcmVsZXZhbnQgaGFyZHdhcmUgc2lnbmFscyB0byB0cmlnZ2VyIGEgc3lzdGVtIHdha2V1cCBldmVudC4KK0ZvciBleGFtcGxlLCBlbmFibGVfaXJxX3dha2UoKSBtaWdodCBpZGVudGlmeSBHUElPIHNpZ25hbHMgaG9va2VkIHVwIHRvCithIHN3aXRjaCBvciBvdGhlciBleHRlcm5hbCBoYXJkd2FyZSwgYW5kIHBjaV9lbmFibGVfd2FrZSgpIGRvZXMgc29tZXRoaW5nCitzaW1pbGFyIGZvciBQQ0kncyBQTUUjIHNpZ25hbC4KKworSWYgYSBkcml2ZXIgKG9yIGJ1cywgb3IgY2xhc3MpIGZhaWxzIGl0IHN1c3BlbmQgbWV0aG9kLCB0aGUgc3lzdGVtIHdvbid0CitlbnRlciB0aGUgZGVzaXJlZCBsb3cgcG93ZXIgc3RhdGU7IGl0IHdpbGwgcmVzdW1lIGFsbCB0aGUgZGV2aWNlcyBpdCdzCitzdXNwZW5kZWQgc28gZmFyLgorCitOb3RlIHRoYXQgZHJpdmVycyBtYXkgbmVlZCB0byBwZXJmb3JtIGRpZmZlcmVudCBhY3Rpb25zIGJhc2VkIG9uIHRoZSB0YXJnZXQKK3N5c3RlbSBsb3dwb3dlci9zbGVlcCBzdGF0ZS4gIEF0IHRoaXMgd3JpdGluZywgdGhlcmUgYXJlIG9ubHkgcGxhdGZvcm0KK3NwZWNpZmljIEFQSXMgdGhyb3VnaCB3aGljaCBkcml2ZXJzIGNvdWxkIGRldGVybWluZSB0aG9zZSB0YXJnZXQgc3RhdGVzLgorCisKK0RldmljZSBMb3cgUG93ZXIgKHN1c3BlbmQpIFN0YXRlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEZXZpY2UgbG93LXBvd2VyIHN0YXRlcyBhcmVuJ3QgdmVyeSBzdGFuZGFyZC4gIE9uZSBkZXZpY2UgbWlnaHQgb25seSBoYW5kbGUKKyJvbiIgYW5kICJvZmYsIHdoaWxlIGFub3RoZXIgbWlnaHQgc3VwcG9ydCBhIGRvemVuIGRpZmZlcmVudCB2ZXJzaW9ucyBvZgorIm9uIiAoaG93IG1hbnkgZW5naW5lcyBhcmUgYWN0aXZlPyksIHBsdXMgYSBzdGF0ZSB0aGF0IGdldHMgYmFjayB0byAib24iCitmYXN0ZXIgdGhhbiBmcm9tIGEgZnVsbCAib2ZmIi4KKworU29tZSBidXNzZXMgZGVmaW5lIHJ1bGVzIGFib3V0IHdoYXQgZGlmZmVyZW50IHN1c3BlbmQgc3RhdGVzIG1lYW4uICBQQ0kKK2dpdmVzIG9uZSBleGFtcGxlOiAgYWZ0ZXIgdGhlIHN1c3BlbmQgc2VxdWVuY2UgY29tcGxldGVzLCBhIG5vbi1sZWdhY3kKK1BDSSBkZXZpY2UgbWF5IG5vdCBwZXJmb3JtIERNQSBvciBpc3N1ZSBJUlFzLCBhbmQgYW55IHdha2V1cCBldmVudHMgaXQKK2lzc3VlcyB3b3VsZCBiZSBpc3N1ZWQgdGhyb3VnaCB0aGUgUE1FIyBidXMgc2lnbmFsLiAgUGx1cywgdGhlcmUgYXJlCitzZXZlcmFsIFBDSS1zdGFuZGFyZCBkZXZpY2Ugc3RhdGVzLCBzb21lIG9mIHdoaWNoIGFyZSBvcHRpb25hbC4KKworSW4gY29udHJhc3QsIGludGVncmF0ZWQgc3lzdGVtLW9uLWNoaXAgcHJvY2Vzc29ycyBvZnRlbiB1c2UgaXJxcyBhcyB0aGUKK3dha2V1cCBldmVudCBzb3VyY2VzIChzbyBkcml2ZXJzIHdvdWxkIGNhbGwgZW5hYmxlX2lycV93YWtlKSBhbmQgbWlnaHQKK2JlIGFibGUgdG8gdHJlYXQgRE1BIGNvbXBsZXRpb24gYXMgYSB3YWtldXAgZXZlbnQgKHNvbWV0aW1lcyBETUEgY2FuIHN0YXkKK2FjdGl2ZSB0b28sIGl0J2Qgb25seSBiZSB0aGUgQ1BVIGFuZCBzb21lIHBlcmlwaGVyYWxzIHRoYXQgc2xlZXApLgorCitTb21lIGRldGFpbHMgaGVyZSBtYXkgYmUgcGxhdGZvcm0tc3BlY2lmaWMuICBTeXN0ZW1zIG1heSBoYXZlIGRldmljZXMgdGhhdAorY2FuIGJlIGZ1bGx5IGFjdGl2ZSBpbiBjZXJ0YWluIHNsZWVwIHN0YXRlcywgc3VjaCBhcyBhbiBMQ0QgZGlzcGxheSB0aGF0J3MKK3JlZnJlc2hlZCB1c2luZyBETUEgd2hpbGUgbW9zdCBvZiB0aGUgc3lzdGVtIGlzIHNsZWVwaW5nIGxpZ2h0bHkgLi4uIGFuZAoraXRzIGZyYW1lIGJ1ZmZlciBtaWdodCBldmVuIGJlIHVwZGF0ZWQgYnkgYSBEU1Agb3Igb3RoZXIgbm9uLUxpbnV4IENQVSB3aGlsZQordGhlIExpbnV4IGNvbnRyb2wgcHJvY2Vzc29yIHN0YXlzIGlkbGUuCisKK01vcmVvdmVyLCB0aGUgc3BlY2lmaWMgYWN0aW9ucyB0YWtlbiBtYXkgZGVwZW5kIG9uIHRoZSB0YXJnZXQgc3lzdGVtIHN0YXRlLgorT25lIHRhcmdldCBzeXN0ZW0gc3RhdGUgbWlnaHQgYWxsb3cgYSBnaXZlbiBkZXZpY2UgdG8gYmUgdmVyeSBvcGVyYXRpb25hbDsKK2Fub3RoZXIgbWlnaHQgcmVxdWlyZSBhIGhhcmQgc2h1dCBkb3duIHdpdGggcmUtaW5pdGlhbGl6YXRpb24gb24gcmVzdW1lLgorQW5kIHR3byBkaWZmZXJlbnQgdGFyZ2V0IHN5c3RlbXMgbWlnaHQgdXNlIHRoZSBzYW1lIGRldmljZSBpbiBkaWZmZXJlbnQKK3dheXM7IHRoZSBhZm9yZW1lbnRpb25lZCBMQ0QgbWlnaHQgYmUgYWN0aXZlIGluIG9uZSBwcm9kdWN0J3MgInN0YW5kYnkiLAorYnV0IGEgZGlmZmVyZW50IHByb2R1Y3QgdXNpbmcgdGhlIHNhbWUgU09DIG1pZ2h0IHdvcmsgZGlmZmVyZW50bHkuCisKKworTWVhbmluZyBvZiBwbV9tZXNzYWdlX3QuZXZlbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQYXJhbWV0ZXJzIHRvIHN1c3BlbmQgY2FsbHMgaW5jbHVkZSB0aGUgZGV2aWNlIGFmZmVjdGVkIGFuZCBhIG1lc3NhZ2Ugb2YKK3R5cGUgcG1fbWVzc2FnZV90LCB3aGljaCBoYXMgb25lIGZpZWxkOiAgdGhlIGV2ZW50LiAgSWYgZHJpdmVyIGRvZXMgbm90CityZWNvZ25pemUgdGhlIGV2ZW50IGNvZGUsIHN1c3BlbmQgY2FsbHMgbWF5IGFib3J0IHRoZSByZXF1ZXN0IGFuZCByZXR1cm4KK2EgbmVnYXRpdmUgZXJybm8uICBIb3dldmVyLCBtb3N0IGRyaXZlcnMgd2lsbCBiZSBmaW5lIGlmIHRoZXkgaW1wbGVtZW50CitQTV9FVkVOVF9TVVNQRU5EIHNlbWFudGljcyBmb3IgYWxsIG1lc3NhZ2VzLgorCitUaGUgZXZlbnQgY29kZXMgYXJlIHVzZWQgdG8gcmVmaW5lIHRoZSBnb2FsIG9mIHN1c3BlbmRpbmcgdGhlIGRldmljZSwgYW5kCittb3N0bHkgbWF0dGVyIHdoZW4gY3JlYXRpbmcgb3IgcmVzdW1pbmcgc3lzdGVtIG1lbW9yeSBpbWFnZSBzbmFwc2hvdHMsIGFzCit1c2VkIHdpdGggc3VzcGVuZC10by1kaXNrOgorCisgICAgUE1fRVZFTlRfU1VTUEVORCAtLSBxdWllc2NlIHRoZSBkcml2ZXIgYW5kIHB1dCBoYXJkd2FyZSBpbnRvIGEgbG93LXBvd2VyCisJc3RhdGUuICBXaGVuIHVzZWQgd2l0aCBzeXN0ZW0gc2xlZXAgc3RhdGVzIGxpa2UgInN1c3BlbmQtdG8tUkFNIiBvcgorCSJzdGFuZGJ5IiwgdGhlIHVwY29taW5nIHJlc3VtZSgpIGNhbGwgd2lsbCBvZnRlbiBiZSBhYmxlIHRvIHJlbHkgb24KKwlzdGF0ZSBrZXB0IGluIGhhcmR3YXJlLCBvciBpc3N1ZSBzeXN0ZW0gd2FrZXVwIGV2ZW50cy4gIFdoZW4gdXNlZAorCWluc3RlYWQgd2l0aCBzdXNwZW5kLXRvLWRpc2ssIGZldyBkZXZpY2VzIHN1cHBvcnQgdGhpcyBjYXBhYmlsaXR5OworCW1vc3QgYXJlIGNvbXBsZXRlbHkgcG93ZXJlZCBvZmYuCisKKyAgICBQTV9FVkVOVF9GUkVFWkUgLS0gcXVpZXNjZSB0aGUgZHJpdmVyLCBidXQgZG9uJ3QgbmVjZXNzYXJpbHkgY2hhbmdlIGludG8KKwlhbnkgbG93IHBvd2VyIG1vZGUuICBBIHN5c3RlbSBzbmFwc2hvdCBpcyBhYm91dCB0byBiZSB0YWtlbiwgb2Z0ZW4KKwlmb2xsb3dlZCBieSBhIGNhbGwgdG8gdGhlIGRyaXZlcidzIHJlc3VtZSgpIG1ldGhvZC4gIE5laXRoZXIgd2FrZXVwCisJZXZlbnRzIG5vciBETUEgYXJlIGFsbG93ZWQuCisKKyAgICBQTV9FVkVOVF9QUkVUSEFXIC0tIHF1aWVzY2UgdGhlIGRyaXZlciwga25vd2luZyB0aGF0IHRoZSB1cGNvbWluZyByZXN1bWUoKQorCXdpbGwgcmVzdG9yZSBhIHN1c3BlbmQtdG8tZGlzayBzbmFwc2hvdCBmcm9tIGEgZGlmZmVyZW50IGtlcm5lbCBpbWFnZS4KKwlEcml2ZXJzIHRoYXQgYXJlIHNtYXJ0IGVub3VnaCB0byBsb29rIGF0IHRoZWlyIGhhcmR3YXJlIHN0YXRlIGR1cmluZworCXJlc3VtZSgpIHByb2Nlc3NpbmcgbmVlZCB0aGF0IHN0YXRlIHRvIGJlIGNvcnJlY3QgLi4uIGEgUFJFVEhBVyBjb3VsZAorCWJlIHVzZWQgdG8gaW52YWxpZGF0ZSB0aGF0IHN0YXRlIChieSByZXNldHRpbmcgdGhlIGRldmljZSksIGxpa2UgYQorCXNodXRkb3duKCkgaW52b2NhdGlvbiB3b3VsZCBiZWZvcmUgYSBrZXhlYygpIG9yIHN5c3RlbSBoYWx0LiAgT3RoZXIKKwlkcml2ZXJzIG1pZ2h0IGhhbmRsZSB0aGlzIHRoZSBzYW1lIHdheSBhcyBQTV9FVkVOVF9GUkVFWkUuICBOZWl0aGVyCisJd2FrZXVwIGV2ZW50cyBub3IgRE1BIGFyZSBhbGxvd2VkLgorCitUbyBlbnRlciAic3RhbmRieSIgKEFDUEkgUzEpIG9yICJTdXNwZW5kIHRvIFJBTSIgKFNUUiwgQUNQSSBTMykgc3RhdGVzLCBvcgordGhlIHNpbWlsYXJseSBuYW1lZCBBUE0gc3RhdGVzLCBvbmx5IFBNX0VWRU5UX1NVU1BFTkQgaXMgdXNlZDsgZm9yICJTdXNwZW5kCit0byBEaXNrIiAoU1RELCBoaWJlcm5hdGUsIEFDUEkgUzQpLCBhbGwgb2YgdGhvc2UgZXZlbnQgY29kZXMgYXJlIHVzZWQuCisKK1RoZXJlJ3MgYWxzbyBQTV9FVkVOVF9PTiwgYSB2YWx1ZSB3aGljaCBuZXZlciBhcHBlYXJzIGFzIGEgc3VzcGVuZCBldmVudAorYnV0IGlzIHNvbWV0aW1lcyB1c2VkIHRvIHJlY29yZCB0aGUgIm5vdCBzdXNwZW5kZWQiIGRldmljZSBzdGF0ZS4KKworCitSZXN1bWluZyBEZXZpY2VzCistLS0tLS0tLS0tLS0tLS0tCitSZXN1bWluZyBpcyBkb25lIGluIG11bHRpcGxlIHBoYXNlcywgbXVjaCBsaWtlIHN1c3BlbmRpbmcsIHdpdGggYWxsCitkZXZpY2VzIHByb2Nlc3NpbmcgZWFjaCBwaGFzZSdzIGNhbGxzIGJlZm9yZSB0aGUgbmV4dCBwaGFzZSBiZWdpbnMuCisKK1RoZSBwaGFzZXMgYXJlIHNlZW4gYnkgZHJpdmVyIG5vdGlmaWNhdGlvbnMgaXNzdWVkIGluIHRoaXMgb3JkZXI6CisKKyAgIDEJYnVzLnJlc3VtZV9lYXJseShkZXYpIGlzIGNhbGxlZCB3aXRoIElSUXMgZGlzYWJsZWQsIGFuZCB3aXRoCisgICAJb25seSBvbmUgQ1BVIGFjdGl2ZS4gIEFzIHdpdGggYnVzLnN1c3BlbmRfbGF0ZSgpLCB0aGlzIG1ldGhvZAorCXdvbid0IGJlIHN1cHBvcnRlZCBvbiBidXNzZXMgdGhhdCByZXF1aXJlIElSUXMgaW4gb3JkZXIgdG8KKwlpbnRlcmFjdCB3aXRoIGRldmljZXMuCisKKwlUaGlzIHJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIGJ1cy5zdXNwZW5kX2xhdGUoKS4KKworICAgMglidXMucmVzdW1lKGRldikgaXMgY2FsbGVkIG5leHQuICBUaGlzIG1heSBiZSBtb3JwaGVkIGludG8gYSBkZXZpY2UKKyAgIAlkcml2ZXIgY2FsbCB3aXRoIGJ1cy1zcGVjaWZpYyBwYXJhbWV0ZXJzOyBpbXBsZW1lbnRhdGlvbnMgbWF5IHNsZWVwLgorCisJVGhpcyByZXZlcnNlcyB0aGUgZWZmZWN0cyBvZiBidXMuc3VzcGVuZCgpLgorCisgICAzCWNsYXNzLnJlc3VtZShkZXYpIGlzIGNhbGxlZCBmb3IgZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggYSBjbGFzcworCXRoYXQgaGFzIHN1Y2ggYSBtZXRob2QuICBJbXBsZW1lbnRhdGlvbnMgbWF5IHNsZWVwLgorCisJVGhpcyByZXZlcnNlcyB0aGUgZWZmZWN0cyBvZiBjbGFzcy5zdXNwZW5kKCksIGFuZCB3b3VsZCB1c3VhbGx5CisJcmVhY3RpdmF0ZSB0aGUgZGV2aWNlJ3MgSS9PIHF1ZXVlLgorCitBdCB0aGUgZW5kIG9mIHRob3NlIHBoYXNlcywgZHJpdmVycyBzaG91bGQgbm9ybWFsbHkgYmUgYXMgZnVuY3Rpb25hbCBhcwordGhleSB3ZXJlIGJlZm9yZSBzdXNwZW5kaW5nOiAgSS9PIGNhbiBiZSBwZXJmb3JtZWQgdXNpbmcgRE1BIGFuZCBJUlFzLCBhbmQKK3RoZSByZWxldmFudCBjbG9ja3MgYXJlIGdhdGVkIG9uLiAgVGhlIGRldmljZSBuZWVkIG5vdCBiZSAiZnVsbHkgb24iOyBpdAorbWlnaHQgYmUgaW4gYSBydW50aW1lIGxvd3Bvd2VyL3N1c3BlbmQgc3RhdGUgdGhhdCBhY3RzIGFzIGlmIGl0IHdlcmUuCisKK0hvd2V2ZXIsIHRoZSBkZXRhaWxzIGhlcmUgbWF5IGFnYWluIGJlIHBsYXRmb3JtLXNwZWNpZmljLiAgRm9yIGV4YW1wbGUsCitzb21lIHN5c3RlbXMgc3VwcG9ydCBtdWx0aXBsZSAicnVuIiBzdGF0ZXMsIGFuZCB0aGUgbW9kZSBpbiBlZmZlY3QgYXQKK3RoZSBlbmQgb2YgcmVzdW1lKCkgbWlnaHQgbm90IGJlIHRoZSBvbmUgd2hpY2ggcHJlY2VkZWQgc3VzcGVuc2lvbi4KK1RoYXQgbWVhbnMgYXZhaWxhYmlsaXR5IG9mIGNlcnRhaW4gY2xvY2tzIG9yIHBvd2VyIHN1cHBsaWVzIGNoYW5nZWQsCit3aGljaCBjb3VsZCBlYXNpbHkgYWZmZWN0IGhvdyBhIGRyaXZlciB3b3Jrcy4KKworCitEcml2ZXJzIG5lZWQgdG8gYmUgYWJsZSB0byBoYW5kbGUgaGFyZHdhcmUgd2hpY2ggaGFzIGJlZW4gcmVzZXQgc2luY2UgdGhlCitzdXNwZW5kIG1ldGhvZHMgd2VyZSBjYWxsZWQsIGZvciBleGFtcGxlIGJ5IGNvbXBsZXRlIHJlaW5pdGlhbGl6YXRpb24uCitUaGlzIG1heSBiZSB0aGUgaGFyZGVzdCBwYXJ0LCBhbmQgdGhlIG9uZSBtb3N0IHByb3RlY3RlZCBieSBOREEnZCBkb2N1bWVudHMKK2FuZCBjaGlwIGVycmF0YS4gIEl0J3Mgc2ltcGxlc3QgaWYgdGhlIGhhcmR3YXJlIHN0YXRlIGhhc24ndCBjaGFuZ2VkIHNpbmNlCit0aGUgc3VzcGVuZCgpIHdhcyBjYWxsZWQsIGJ1dCB0aGF0IGNhbid0IGFsd2F5cyBiZSBndWFyYW50ZWVkLgorCitEcml2ZXJzIG11c3QgYWxzbyBiZSBwcmVwYXJlZCB0byBub3RpY2UgdGhhdCB0aGUgZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQKK3doaWxlIHRoZSBzeXN0ZW0gd2FzIHBvd2VyZWQgb2ZmLCB3aGVuZXZlciB0aGF0J3MgcGh5c2ljYWxseSBwb3NzaWJsZS4KK1BDTUNJQSwgTU1DLCBVU0IsIEZpcmV3aXJlLCBTQ1NJLCBhbmQgZXZlbiBJREUgYXJlIGNvbW1vbiBleGFtcGxlcyBvZiBidXNzZXMKK3doZXJlIGNvbW1vbiBMaW51eCBwbGF0Zm9ybXMgd2lsbCBzZWUgc3VjaCByZW1vdmFsLiAgRGV0YWlscyBvZiBob3cgZHJpdmVycword2lsbCBub3RpY2UgYW5kIGhhbmRsZSBzdWNoIHJlbW92YWxzIGFyZSBjdXJyZW50bHkgYnVzLXNwZWNpZmljLCBhbmQgb2Z0ZW4KK2ludm9sdmUgYSBzZXBhcmF0ZSB0aHJlYWQuCisKKworTm90ZSB0aGF0IHRoZSBidXMtc3BlY2lmaWMgcnVudGltZSBQTSB3YWtldXAgbWVjaGFuaXNtIGNhbiBleGlzdCwgYW5kIG1pZ2h0CitiZSBkZWZpbmVkIHRvIHNoYXJlIHNvbWUgb2YgdGhlIHNhbWUgZHJpdmVyIGNvZGUgYXMgZm9yIHN5c3RlbSB3YWtldXAuICBGb3IKK2V4YW1wbGUsIGEgYnVzLXNwZWNpZmljIGRldmljZSBkcml2ZXIncyByZXN1bWUoKSBtZXRob2QgbWlnaHQgYmUgdXNlZCB0aGVyZSwKK3NvIGl0IHdvdWxkbid0IG9ubHkgYmUgY2FsbGVkIGZyb20gYnVzLnJlc3VtZSgpIGR1cmluZyBzeXN0ZW0td2lkZSB3YWtldXAuCitTZWUgYnVzLXNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IGhvdyBydW50aW1lIHdha2V1cCBldmVudHMgYXJlIGhhbmRsZWQuCisKKworU3lzdGVtIERldmljZXMKKy0tLS0tLS0tLS0tLS0tCiBTeXN0ZW0gZGV2aWNlcyBmb2xsb3cgYSBzbGlnaHRseSBkaWZmZXJlbnQgQVBJLCB3aGljaCBjYW4gYmUgZm91bmQgaW4KIAogCWluY2x1ZGUvbGludXgvc3lzZGV2LmgKIAlkcml2ZXJzL2Jhc2Uvc3lzLmMKIAotU3lzdGVtIGRldmljZXMgd2lsbCBvbmx5IGJlIHN1c3BlbmRlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQsIGFuZAotYWZ0ZXIgYWxsIG90aGVyIGRldmljZXMgaGF2ZSBiZWVuIHN1c3BlbmRlZC4gT24gcmVzdW1lLCB0aGV5IHdpbGwgYmUKLXJlc3VtZWQgYmVmb3JlIGFueSBvdGhlciBkZXZpY2VzLCBhbmQgYWxzbyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCitTeXN0ZW0gZGV2aWNlcyB3aWxsIG9ubHkgYmUgc3VzcGVuZGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCwgYW5kIGFmdGVyCithbGwgb3RoZXIgZGV2aWNlcyBoYXZlIGJlZW4gc3VzcGVuZGVkLiAgT24gcmVzdW1lLCB0aGV5IHdpbGwgYmUgcmVzdW1lZAorYmVmb3JlIGFueSBvdGhlciBkZXZpY2VzLCBhbmQgYWxzbyB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisKK1RoYXQgaXMsIElSUXMgYXJlIGRpc2FibGVkLCB0aGUgc3VzcGVuZF9sYXRlKCkgcGhhc2UgYmVnaW5zLCB0aGVuIHRoZQorc3lzZGV2X2RyaXZlci5zdXNwZW5kKCkgcGhhc2UsIGFuZCB0aGUgc3lzdGVtIGVudGVycyBhIHNsZWVwIHN0YXRlLiAgVGhlbgordGhlIHN5c2Rldl9kcml2ZXIucmVzdW1lKCkgcGhhc2UgYmVnaW5zLCBmb2xsb3dlZCBieSB0aGUgcmVzdW1lX2Vhcmx5KCkKK3BoYXNlLCBhZnRlciB3aGljaCBJUlFzIGFyZSBlbmFibGVkLgorCitDb2RlIHRvIGFjdHVhbGx5IGVudGVyIGFuZCBleGl0IHRoZSBzeXN0ZW0td2lkZSBsb3cgcG93ZXIgc3RhdGUgc29tZXRpbWVzCitpbnZvbHZlcyBoYXJkd2FyZSBkZXRhaWxzIHRoYXQgYXJlIG9ubHkga25vd24gdG8gdGhlIGJvb3QgZmlybXdhcmUsIGFuZAorbWF5IGxlYXZlIGEgQ1BVIHJ1bm5pbmcgc29mdHdhcmUgKGZyb20gU1JBTSBvciBmbGFzaCBtZW1vcnkpIHRoYXQgbW9uaXRvcnMKK3RoZSBzeXN0ZW0gYW5kIG1hbmFnZXMgaXRzIHdha2V1cCBzZXF1ZW5jZS4KIAogCiBSdW50aW1lIFBvd2VyIE1hbmFnZW1lbnQKKz09PT09PT09PT09PT09PT09PT09PT09PQorTWFueSBkZXZpY2VzIGFyZSBhYmxlIHRvIGR5bmFtaWNhbGx5IHBvd2VyIGRvd24gd2hpbGUgdGhlIHN5c3RlbSBpcyBzdGlsbAorcnVubmluZy4gVGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCBmb3IgZGV2aWNlcyB0aGF0IGFyZSBub3QgYmVpbmcgdXNlZCwgYW5kCitjYW4gb2ZmZXIgc2lnbmlmaWNhbnQgcG93ZXIgc2F2aW5ncyBvbiBhIHJ1bm5pbmcgc3lzdGVtLiAgVGhlc2UgZGV2aWNlcworb2Z0ZW4gc3VwcG9ydCBhIHJhbmdlIG9mIHJ1bnRpbWUgcG93ZXIgc3RhdGVzLCB3aGljaCBtaWdodCB1c2UgbmFtZXMgc3VjaAorYXMgIm9mZiIsICJzbGVlcCIsICJpZGxlIiwgImFjdGl2ZSIsIGFuZCBzbyBvbi4gIFRob3NlIHN0YXRlcyB3aWxsIGluIHNvbWUKK2Nhc2VzIChsaWtlIFBDSSkgYmUgcGFydGlhbGx5IGNvbnN0cmFpbmVkIGJ5IGEgYnVzIHRoZSBkZXZpY2UgdXNlcywgYW5kIHdpbGwKK3VzdWFsbHkgaW5jbHVkZSBoYXJkd2FyZSBzdGF0ZXMgdGhhdCBhcmUgYWxzbyB1c2VkIGluIHN5c3RlbSBzbGVlcCBzdGF0ZXMuCiAKLU1hbnkgZGV2aWNlcyBhcmUgYWJsZSB0byBkeW5hbWljYWxseSBwb3dlciBkb3duIHdoaWxlIHRoZSBzeXN0ZW0gaXMKLXN0aWxsIHJ1bm5pbmcuIFRoaXMgZmVhdHVyZSBpcyB1c2VmdWwgZm9yIGRldmljZXMgdGhhdCBhcmUgbm90IGJlaW5nCi11c2VkLCBhbmQgY2FuIG9mZmVyIHNpZ25pZmljYW50IHBvd2VyIHNhdmluZ3Mgb24gYSBydW5uaW5nIHN5c3RlbS4gCitIb3dldmVyLCBub3RlIHRoYXQgaWYgYSBkcml2ZXIgcHV0cyBhIGRldmljZSBpbnRvIGEgcnVudGltZSBsb3cgcG93ZXIgc3RhdGUKK2FuZCB0aGUgc3lzdGVtIHRoZW4gZ29lcyBpbnRvIGEgc3lzdGVtLXdpZGUgc2xlZXAgc3RhdGUsIGl0IG5vcm1hbGx5IG91Z2h0Cit0byByZXN1bWUgaW50byB0aGF0IHJ1bnRpbWUgbG93IHBvd2VyIHN0YXRlIHJhdGhlciB0aGFuICJmdWxsIG9uIi4gIFN1Y2gKK2Rpc3RpbmN0aW9ucyB3b3VsZCBiZSBwYXJ0IG9mIHRoZSBkcml2ZXItaW50ZXJuYWwgc3RhdGUgbWFjaGluZSBmb3IgdGhhdAoraGFyZHdhcmU7IHRoZSB3aG9sZSBwb2ludCBvZiBydW50aW1lIHBvd2VyIG1hbmFnZW1lbnQgaXMgdG8gYmUgc3VyZSB0aGF0Citkcml2ZXJzIGFyZSBkZWNvdXBsZWQgaW4gdGhhdCB3YXkgZnJvbSB0aGUgc3RhdGUgbWFjaGluZSBnb3Zlcm5pbmcgcGhhc2VzCitvZiB0aGUgc3lzdGVtLXdpZGUgcG93ZXIvc2xlZXAgc3RhdGUgdHJhbnNpdGlvbnMuCiAKLUluIGVhY2ggZGV2aWNlJ3MgZGlyZWN0b3J5LCB0aGVyZSBpcyBhICdwb3dlcicgZGlyZWN0b3J5LCB3aGljaAotY29udGFpbnMgYXQgbGVhc3QgYSAnc3RhdGUnIGZpbGUuIFJlYWRpbmcgZnJvbSB0aGlzIGZpbGUgZGlzcGxheXMgd2hhdAotcG93ZXIgc3RhdGUgdGhlIGRldmljZSBpcyBjdXJyZW50bHkgaW4uIFdyaXRpbmcgdG8gdGhpcyBmaWxlIGluaXRpYXRlcwotYSB0cmFuc2l0aW9uIHRvIHRoZSBzcGVjaWZpZWQgcG93ZXIgc3RhdGUsIHdoaWNoIG11c3QgYmUgYSBkZWNpbWFsIGluCi10aGUgcmFuZ2UgMS0zLCBpbmNsdXNpdmU7IG9yIDAgZm9yICdPbicuCiAKLVRoZSBQTSBjb3JlIHdpbGwgY2FsbCB0aGUgLT5zdXNwZW5kKCkgbWV0aG9kIGluIHRoZSBidXNfdHlwZSBvYmplY3QKLXRoYXQgdGhlIGRldmljZSBiZWxvbmdzIHRvIGlmIHRoZSBzcGVjaWZpZWQgc3RhdGUgaXMgbm90IDAsIG9yCi0tPnJlc3VtZSgpIGlmIGl0IGlzLiAKK1Bvd2VyIFNhdmluZyBUZWNobmlxdWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTm9ybWFsbHkgcnVudGltZSBwb3dlciBtYW5hZ2VtZW50IGlzIGhhbmRsZWQgYnkgdGhlIGRyaXZlcnMgd2l0aG91dCBzcGVjaWZpYwordXNlcnNwYWNlIG9yIGtlcm5lbCBpbnRlcnZlbnRpb24sIGJ5IGRldmljZS1hd2FyZSB1c2Ugb2YgdGVjaG5pcXVlcyBsaWtlOgogCi1Ob3RoaW5nIHdpbGwgaGFwcGVuIGlmIHRoZSBzcGVjaWZpZWQgc3RhdGUgaXMgdGhlIHNhbWUgc3RhdGUgdGhlCi1kZXZpY2UgaXMgY3VycmVudGx5IGluLiAKKyAgICBVc2luZyBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBvdGhlciBzeXN0ZW0gbGF5ZXJzCisJLSBzdGF5IGRlZXBseSAib2ZmIiBleGNlcHQgYmV0d2VlbiBvcGVuKCkgYW5kIGNsb3NlKCkKKwktIGlmIHRyYW5zY2VpdmVyL1BIWSBpbmRpY2F0ZXMgIm5vYm9keSBjb25uZWN0ZWQiLCBzdGF5ICJvZmYiCisJLSBhcHBsaWNhdGlvbiBwcm90b2NvbHMgbWF5IGluY2x1ZGUgcG93ZXIgY29tbWFuZHMgb3IgaGludHMKIAotSWYgdGhlIGRldmljZSBpcyBhbHJlYWR5IGluIGEgbG93LXBvd2VyIHN0YXRlLCBhbmQgdGhlIHNwZWNpZmllZCBzdGF0ZQotaXMgYW5vdGhlciwgYnV0IGRpZmZlcmVudCwgbG93LXBvd2VyIHN0YXRlLCB0aGUgLT5yZXN1bWUoKSBtZXRob2Qgd2lsbAotZmlyc3QgYmUgY2FsbGVkIHRvIHBvd2VyIHRoZSBkZXZpY2UgYmFjayBvbiwgdGhlbiAtPnN1c3BlbmQoKSB3aWxsIGJlCi1jYWxsZWQgYWdhaW4gd2l0aCB0aGUgbmV3IHN0YXRlLiAKKyAgICBVc2luZyBmZXdlciBDUFUgY3ljbGVzCisJLSB1c2luZyBETUEgaW5zdGVhZCBvZiBQSU8KKwktIHJlbW92aW5nIHRpbWVycywgb3IgbWFraW5nIHRoZW0gbG93ZXIgZnJlcXVlbmN5CisJLSBzaG9ydGVuaW5nICJob3QiIGNvZGUgcGF0aHMKKwktIGVsaW1pbmF0aW5nIGNhY2hlIG1pc3NlcworCS0gKHNvbWV0aW1lcykgb2ZmbG9hZGluZyB3b3JrIHRvIGRldmljZSBmaXJtd2FyZQogCi1UaGUgZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGZvciBzYXZpbmcgdGhlIHdvcmtpbmcgc3RhdGUgb2YgdGhlIGRldmljZQotYW5kIHB1dHRpbmcgaXQgaW50byB0aGUgbG93LXBvd2VyIHN0YXRlIHNwZWNpZmllZC4gSWYgdGhpcyB3YXMKLXN1Y2Nlc3NmdWwsIGl0IHJldHVybnMgMCwgYW5kIHRoZSBkZXZpY2UncyBwb3dlcl9zdGF0ZSBmaWVsZCBpcwotdXBkYXRlZC4gCisgICAgUmVkdWNpbmcgb3RoZXIgcmVzb3VyY2UgY29zdHMKKwktIGdhdGluZyBvZmYgdW51c2VkIGNsb2NrcyBpbiBzb2Z0d2FyZSAob3IgaGFyZHdhcmUpCisJLSBzd2l0Y2hpbmcgb2ZmIHVudXNlZCBwb3dlciBzdXBwbGllcworCS0gZWxpbWluYXRpbmcgKG9yIGRlbGF5aW5nL21lcmdpbmcpIElSUXMKKwktIHR1bmluZyBETUEgdG8gdXNlIHdvcmQgYW5kL29yIGJ1cnN0IG1vZGVzCiAKLVRoZSBkcml2ZXIgbXVzdCB0YWtlIGNhcmUgdG8ga25vdyB3aGV0aGVyIG9yIG5vdCBpdCBpcyBhYmxlIHRvCi1wcm9wZXJseSByZXN1bWUgdGhlIGRldmljZSwgaW5jbHVkaW5nIGFsbCBzdGVwIG9mIHJlaW5pdGlhbGl6YXRpb24KLW5lY2Vzc2FyeS4gKFRoaXMgaXMgdGhlIGhhcmRlc3QgcGFydCwgYW5kIHRoZSBvbmUgbW9zdCBwcm90ZWN0ZWQgYnkKLU5EQSdkIGRvY3VtZW50cykuIAorICAgIFVzaW5nIGRldmljZS1zcGVjaWZpYyBsb3cgcG93ZXIgc3RhdGVzCisJLSB1c2luZyBsb3dlciB2b2x0YWdlcworCS0gYXZvaWRpbmcgbmVlZGxlc3MgRE1BIHRyYW5zZmVycwogCi1UaGUgZHJpdmVyIG11c3QgYWxzbyB0YWtlIGNhcmUgbm90IHRvIHN1c3BlbmQgYSBkZXZpY2UgdGhhdCBpcwotY3VycmVudGx5IGluIHVzZS4gSXQgaXMgdGhlaXIgcmVzcG9uc2liaWxpdHkgdG8gcHJvdmlkZSB0aGVpciBvd24KLWV4Y2x1c2lvbiBtZWNoYW5pc21zLgorUmVhZCB5b3VyIGhhcmR3YXJlIGRvY3VtZW50YXRpb24gY2FyZWZ1bGx5IHRvIHNlZSB0aGUgb3Bwb3J0dW5pdGllcyB0aGF0CittYXkgYmUgYXZhaWxhYmxlLiAgSWYgeW91IGNhbiwgbWVhc3VyZSB0aGUgYWN0dWFsIHBvd2VyIHVzYWdlIGFuZCBjaGVjaworaXQgYWdhaW5zdCB0aGUgYnVkZ2V0IGVzdGFibGlzaGVkIGZvciB5b3VyIHByb2plY3QuCiAKLVRoZSBydW50aW1lIHBvd2VyIHRyYW5zaXRpb24gaGFwcGVucyB3aXRoIGludGVycnVwdHMgZW5hYmxlZC4gSWYgYQotZGV2aWNlIGNhbm5vdCBzdXBwb3J0IGJlaW5nIHBvd2VyZWQgZG93biB3aXRoIGludGVycnVwdHMsIGl0IG1heQotcmV0dXJuIC1FQUdBSU4gKGFzIGl0IHdvdWxkIGR1cmluZyBhIHN5c3RlbSBwb3dlciBtYW5hZ2VtZW50Ci10cmFuc2l0aW9uKSwgIGJ1dCBpdCB3aWxsIF9ub3RfIGJlIGNhbGxlZCBhZ2FpbiwgYW5kIHRoZSB0cmFuc2FjdGlvbgotd2lsbCBmYWlsLgogCi1UaGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IHRvIGtub3cgd2hhdCBzdGF0ZXMgYSBkZXZpY2Ugb3IgZHJpdmVyCi1zdXBwb3J0cyBhIHByaW9yaS4gVGhpcyB3aWxsIGNoYW5nZSBpbiB0aGUgZnV0dXJlLiAKK0V4YW1wbGVzOiAgVVNCIGhvc3RzLCBzeXN0ZW0gdGltZXIsIHN5c3RlbSBDUFUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1VTQiBob3N0IGNvbnRyb2xsZXJzIG1ha2UgaW50ZXJlc3RpbmcsIGlmIGNvbXBsZXgsIGV4YW1wbGVzLiAgSW4gbWFueSBjYXNlcwordGhlc2UgaGF2ZSBubyB3b3JrIHRvIGRvOiAgbm8gVVNCIGRldmljZXMgYXJlIGNvbm5lY3RlZCwgb3IgYWxsIG9mIHRoZW0gYXJlCitpbiB0aGUgVVNCICJzdXNwZW5kIiBzdGF0ZS4gIExpbnV4IGhvc3QgY29udHJvbGxlciBkcml2ZXJzIGNhbiB0aGVuIGRpc2FibGUKK3BlcmlvZGljIERNQSB0cmFuc2ZlcnMgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgYSBjb25zdGFudCBwb3dlciBkcmFpbiBvbiB0aGUKK21lbW9yeSBzdWJzeXN0ZW0sIGFuZCBlbnRlciBhIHN1c3BlbmQgc3RhdGUuICBJbiBwb3dlci1hd2FyZSBjb250cm9sbGVycywKK2VudGVyaW5nIHRoYXQgc3VzcGVuZCBzdGF0ZSBtYXkgZGlzYWJsZSB0aGUgY2xvY2sgdXNlZCB3aXRoIFVTQiBzaWduYWxpbmcsCitzYXZpbmcgYSBjZXJ0YWluIGFtb3VudCBvZiBwb3dlci4KIAotcG1fbWVzc2FnZV90IG1lYW5pbmcKK1RoZSBjb250cm9sbGVyIHdpbGwgYmUgd29rZW4gZnJvbSB0aGF0IHN0YXRlICh3aXRoIGFuIElSUSkgYnkgY2hhbmdlcyB0byB0aGUKK3NpZ25hbCBzdGF0ZSBvbiB0aGUgZGF0YSBsaW5lcyBvZiBhIGdpdmVuIHBvcnQsIGZvciBleGFtcGxlIGJ5IGFuIGV4aXN0aW5nCitwZXJpcGhlcmFsIHJlcXVlc3RpbmcgInJlbW90ZSB3YWtldXAiIG9yIGJ5IHBsdWdnaW5nIGEgbmV3IHBlcmlwaGVyYWwuICBUaGUKK3NhbWUgd2FrZXVwIG1lY2hhbmlzbSB1c3VhbGx5IHdvcmtzIGZyb20gInN0YW5kYnkiIHNsZWVwIHN0YXRlcywgYW5kIG9uIHNvbWUKK3N5c3RlbXMgYWxzbyBmcm9tICJzdXNwZW5kIHRvIFJBTSIgKG9yIGV2ZW4gInN1c3BlbmQgdG8gZGlzayIpIHN0YXRlcy4KKyhFeGNlcHQgdGhhdCBBQ1BJIG1heSBiZSBpbnZvbHZlZCBpbnN0ZWFkIG9mIG5vcm1hbCBJUlFzLCBvbiBzb21lIGhhcmR3YXJlLikKIAotcG1fbWVzc2FnZV90IGhhcyB0d28gZmllbGRzLiBldmVudCAoIm1ham9yIiksIGFuZCBmbGFncy4gIElmIGRyaXZlcgotZG9lcyBub3Qga25vdyBldmVudCBjb2RlLCBpdCBhYm9ydHMgdGhlIHJlcXVlc3QsIHJldHVybmluZyBlcnJvci4gU29tZQotZHJpdmVycyBtYXkgbmVlZCB0byBkZWFsIHdpdGggc3BlY2lhbCBjYXNlcyBiYXNlZCBvbiB0aGUgYWN0dWFsIHR5cGUKLW9mIHN1c3BlbmQgb3BlcmF0aW9uIGJlaW5nIGRvbmUgYXQgdGhlIHN5c3RlbSBsZXZlbC4gVGhpcyBpcyB3aHkKLXRoZXJlIGFyZSBmbGFncy4KK1N5c3RlbSBkZXZpY2VzIGxpa2UgdGltZXJzIGFuZCBDUFVzIG1heSBoYXZlIHNwZWNpYWwgcm9sZXMgaW4gdGhlIHBsYXRmb3JtCitwb3dlciBtYW5hZ2VtZW50IHNjaGVtZS4gIEZvciBleGFtcGxlLCBzeXN0ZW0gdGltZXJzIHVzaW5nIGEgImR5bmFtaWMgdGljayIKK2FwcHJvYWNoIGRvbid0IGp1c3Qgc2F2ZSBDUFUgY3ljbGVzIChieSBlbGltaW5hdGluZyBuZWVkbGVzcyB0aW1lciBJUlFzKSwKK2J1dCB0aGV5IG1heSBhbHNvIG9wZW4gdGhlIGRvb3IgdG8gdXNpbmcgbG93ZXIgcG93ZXIgQ1BVICJpZGxlIiBzdGF0ZXMgdGhhdAorY29zdCBtb3JlIHRoYW4gYSBqaWZmaWUgdG8gZW50ZXIgYW5kIGV4aXQuICBPbiB4ODYgc3lzdGVtcyB0aGVzZSBhcmUgc3RhdGVzCitsaWtlICJDMyI7IG5vdGUgdGhhdCBwZXJpb2RpYyBETUEgdHJhbnNmZXJzIGZyb20gYSBVU0IgaG9zdCBjb250cm9sbGVyIHdpbGwKK2Fsc28gcHJldmVudCBlbnRyeSB0byBhIEMzIHN0YXRlLCBtdWNoIGxpa2UgYSBwZXJpb2RpYyB0aW1lciBJUlEuCiAKLUV2ZW50IGNvZGVzIGFyZToKK1RoYXQga2luZCBvZiBydW50aW1lIG1lY2hhbmlzbSBpbnRlcmFjdGlvbiBpcyBjb21tb24uICAiU3lzdGVtIE9uIENoaXAiIChTT0MpCitwcm9jZXNzb3JzIG9mdGVuIGhhdmUgbG93IHBvd2VyIGlkbGUgbW9kZXMgdGhhdCBjYW4ndCBiZSBlbnRlcmVkIHVubGVzcworY2VydGFpbiBtZWRpdW0tc3BlZWQgY2xvY2tzIChvZnRlbiAxMiBvciA0OCBNSHopIGFyZSBnYXRlZCBvZmYuICBXaGVuIHRoZQorZHJpdmVycyBnYXRlIHRob3NlIGNsb2NrcyBlZmZlY3RpdmVseSwgdGhlbiB0aGUgc3lzdGVtIGlkbGUgdGFzayBtYXkgYmUgYWJsZQordG8gdXNlIHRoZSBsb3dlciBwb3dlciBpZGxlIG1vZGVzIGFuZCB0aGVyZWJ5IGluY3JlYXNlIGJhdHRlcnkgbGlmZS4KIAotT04gLS0gbm8gbmVlZCB0byBkbyBhbnl0aGluZyBleGNlcHQgc3BlY2lhbCBjYXNlcyBsaWtlIGJyb2tlbgotSFcuCitJZiB0aGUgQ1BVIGNhbiBoYXZlIGEgImNwdWZyZXEiIGRyaXZlciwgdGhlcmUgYWxzbyBtYXkgYmUgb3Bwb3J0dW5pdGllcwordG8gc2hpZnQgdG8gbG93ZXIgdm9sdGFnZSBzZXR0aW5ncyBhbmQgcmVkdWNlIHRoZSBwb3dlciBjb3N0IG9mIGV4ZWN1dGluZworYSBnaXZlbiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLiAgKFdpdGhvdXQgdm9sdGFnZSBhZGp1c3RtZW50LCBpdCdzIHJhcmUKK2ZvciBjcHVmcmVxIHRvIHNhdmUgbXVjaCBwb3dlcjsgdGhlIGNvc3QtcGVyLWluc3RydWN0aW9uIG11c3QgZ28gZG93bi4pCiAKLSMgTk9USUZJQ0FUSU9OIC0tIHByZXR0eSBtdWNoIHNhbWUgYXMgT04/CiAKLUZSRUVaRSAtLSBzdG9wIERNQSBhbmQgaW50ZXJydXB0cywgYW5kIGJlIHByZXBhcmVkIHRvIHJlaW5pdCBIVyBmcm9tCi1zY3JhdGNoLiBUaGF0IHByb2JhYmx5IG1lYW5zIHN0b3AgYWNjZXB0aW5nIHVwc3RyZWFtIHJlcXVlc3RzLCB0aGUKLWFjdHVhbCBwb2xpY3kgb2Ygd2hhdCB0byBkbyB3aXRoIHRoZW0gYmVpbmcgc3BlY2lmaWMgdG8gYSBnaXZlbgotZHJpdmVyLiBJdCdzIGFjY2VwdGFibGUgZm9yIGEgbmV0d29yayBkcml2ZXIgdG8ganVzdCBkcm9wIHBhY2tldHMKLXdoaWxlIGEgYmxvY2sgZHJpdmVyIGlzIGV4cGVjdGVkIHRvIGJsb2NrIHRoZSBxdWV1ZSBzbyBubyByZXF1ZXN0IGlzCi1sb3N0LiAoVXNlIElERSBhcyBhbiBleGFtcGxlIG9uIGhvdyB0byBkbyB0aGF0KS4gRlJFRVpFIHJlcXVpcmVzIG5vCi1wb3dlciBzdGF0ZSBjaGFuZ2UsIGFuZCBpdCdzIGV4cGVjdGVkIGZvciBkcml2ZXJzIHRvIGJlIGFibGUgdG8KLXF1aWNrbHkgdHJhbnNpdGlvbiBiYWNrIHRvIG9wZXJhdGluZyBzdGF0ZS4KKy9zeXMvZGV2aWNlcy8uLi4vcG93ZXIvc3RhdGUgZmlsZXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0ZvciBub3cgeW91IGNhbiBhbHNvIHRlc3Qgc29tZSBvZiB0aGlzIGZ1bmN0aW9uYWxpdHkgdXNpbmcgc3lzZnMuCiAKLVNVU1BFTkQgLS0gbGlrZSBGUkVFWkUsIGJ1dCBhbHNvIHB1dCBoYXJkd2FyZSBpbnRvIGxvdy1wb3dlciBzdGF0ZS4gSWYKLXRoZXJlJ3MgbmVlZCB0byBkaXN0aW5ndWlzaCBzZXZlcmFsIGxldmVscyBvZiBzbGVlcCwgYWRkaXRpb25hbCBmbGFnCi1pcyBwcm9iYWJseSBiZXN0IHdheSB0byBkbyB0aGF0LgorCURFUFJFQ0FURUQ6ICBVU0UgInBvd2VyL3N0YXRlIiBPTkxZIEZPUiBEUklWRVIgVEVTVElORywgQU5ECisJQVZPSUQgVVNJTkcgZGV2LT5wb3dlci5wb3dlcl9zdGF0ZSBJTiBEUklWRVJTLgogCi1UcmFuc2l0aW9ucyBhcmUgb25seSBmcm9tIGEgcmVzdW1lZCBzdGF0ZSB0byBhIHN1c3BlbmRlZCBzdGF0ZSwgbmV2ZXIKLWJldHdlZW4gMiBzdXNwZW5kZWQgc3RhdGVzLiAoT04gLT4gRlJFRVpFIG9yIE9OIC0+IFNVU1BFTkQgY2FuIGhhcHBlbiwKLUZSRUVaRSAtPiBTVVNQRU5EIG9yIFNVU1BFTkQgLT4gRlJFRVpFIGNhbiBub3QpLgorCVRIRVNFIFdJTEwgQkUgUkVNT1ZFRC4gIElGIFRIRSAicG93ZXIvc3RhdGUiIEZJTEUgR0VUUyBSRVBMQUNFRCwKKwlJVCBXSUxMIEJFQ09NRSBTT01FVEhJTkcgQ09VUExFRCBUTyBUSEUgQlVTIE9SIERSSVZFUi4KIAotQWxsIGV2ZW50cyBhcmU6CitJbiBlYWNoIGRldmljZSdzIGRpcmVjdG9yeSwgdGhlcmUgaXMgYSAncG93ZXInIGRpcmVjdG9yeSwgd2hpY2ggY29udGFpbnMKK2F0IGxlYXN0IGEgJ3N0YXRlJyBmaWxlLiAgVGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgZWZmZWN0aXZlbHkgYm9vbGVhbiwKK1BNX0VWRU5UX09OIG9yIFBNX0VWRU5UX1NVU1BFTkQuCiAKLVtOT1RFIE5PVEUgTk9URTogSWYgeW91IGFyZSBkcml2ZXIgYXV0aG9yLCB5b3Ugc2hvdWxkIG5vdCBjYXJlOyB5b3UKLXNob3VsZCBvbmx5IGxvb2sgYXQgZXZlbnQsIGFuZCBpZ25vcmUgZmxhZ3MuXQorICAgKglSZWFkaW5nIGZyb20gdGhpcyBmaWxlIGRpc3BsYXlzIGEgdmFsdWUgY29ycmVzcG9uZGluZyB0bworCXRoZSBwb3dlci5wb3dlcl9zdGF0ZS5ldmVudCBmaWVsZC4gIEFsbCBub256ZXJvIHZhbHVlcyBhcmUKKwlkaXNwbGF5ZWQgYXMgIjIiLCBjb3JyZXNwb25kaW5nIHRvIGEgbG93IHBvd2VyIHN0YXRlOyB6ZXJvCisJaXMgZGlzcGxheWVkIGFzICIwIiwgY29ycmVzcG9uZGluZyB0byBub3JtYWwgb3BlcmF0aW9uLgogCi0jUHJlcGFyZSBmb3Igc3VzcGVuZCAtLSB1c2VybGFuZCBpcyBzdGlsbCBydW5uaW5nIGJ1dCB3ZSBhcmUgZ29pbmcgdG8KLSNlbnRlciBzdXNwZW5kIHN0YXRlLiBUaGlzIGdpdmVzIGRyaXZlcnMgY2hhbmNlIHRvIGxvYWQgZmlybXdhcmUgZnJvbQotI2Rpc2sgYW5kIHN0b3JlIGl0IGluIG1lbW9yeSwgb3IgZG8gb3RoZXIgYWN0aXZpdGllcyB0YWh0IHJlcXVpcmUKLSNvcGVyYXRpbmcgdXNlcmxhbmQsIGFiaWxpdHkgdG8ga21hbGxvYyBHRlBfS0VSTkVMLCBldGMuLi4gQWxsIG9mIHRoZXNlCi0jYXJlIGZvcmJpZGVuIG9uY2UgdGhlIHN1c3BlbmQgZGFuY2UgaXMgc3RhcnRlZC4uIGV2ZW50ID0gT04sIGZsYWdzID0KLSNQUkVQQVJFX1RPX1NVU1BFTkQKKyAgICoJV3JpdGluZyB0byB0aGlzIGZpbGUgaW5pdGlhdGVzIGEgdHJhbnNpdGlvbiB1c2luZyB0aGUKKyAgIAlzcGVjaWZpZWQgZXZlbnQgY29kZSBudW1iZXI7IG9ubHkgJzAnLCAnMicsIGFuZCAnMycgYXJlCisJYWNjZXB0ZWQgKHdpdGhvdXQgYSBuZXdsaW5lKTsgJzInIGFuZCAnMycgYXJlIGJvdGgKKwltYXBwZWQgdG8gUE1fRVZFTlRfU1VTUEVORC4KIAotQXBtIHN0YW5kYnkgLS0gcHJlcGFyZSBmb3IgQVBNIGV2ZW50LiBRdWllc2NlIGRldmljZXMgdG8gbWFrZSBsaWZlCi1lYXNpZXIgZm9yIEFQTSBCSU9TLiBldmVudCA9IEZSRUVaRSwgZmxhZ3MgPSBBUE1fU1RBTkRCWQorT24gd3JpdGVzLCB0aGUgUE0gY29yZSByZWxpZXMgb24gdGhhdCByZWNvcmRlZCBldmVudCBjb2RlIGFuZCB0aGUgZGV2aWNlL2J1cworY2FwYWJpbGl0aWVzIHRvIGRldGVybWluZSB3aGV0aGVyIGl0IHVzZXMgYSBwYXJ0aWFsIHN1c3BlbmQoKSBvciByZXN1bWUoKQorc2VxdWVuY2UgdG8gY2hhbmdlIHRoaW5ncyBzbyB0aGF0IHRoZSByZWNvcmRlZCBldmVudCBjb3JyZXNwb25kcyB0byB0aGUKK251bWVyaWMgcGFyYW1ldGVyLgogCi1BcG0gc3VzcGVuZCAtLSBzYW1lIGFzIEFQTV9TVEFOREJZLCBidXQgaXQgd2Ugc2hvdWxkIHByb2JhYmx5IGF2b2lkCi1zcGlubmluZyBkb3duIGRpc2tzLiBldmVudCA9IEZSRUVaRSwgZmxhZ3MgPSBBUE1fU1VTUEVORAorICAgLQlJZiB0aGUgYnVzIHJlcXVpcmVzIHRoZSBpcnFzLWRpc2FibGVkIHN1c3BlbmRfbGF0ZSgpL3Jlc3VtZV9lYXJseSgpCisJcGhhc2VzLCB3cml0ZXMgZmFpbCBiZWNhdXNlIHRob3NlIG9wZXJhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaGVyZS4KIAotU3lzdGVtIGhhbHQsIHJlYm9vdCAtLSBxdWllc2NlIGRldmljZXMgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgQklPUy4gZXZlbnQKLT0gRlJFRVpFLCBmbGFncyA9IFNZU1RFTV9IQUxUIG9yIFNZU1RFTV9SRUJPT1QKKyAgIC0JSWYgdGhlIHJlY29yZGVkIHZhbHVlIGlzIHRoZSBleHBlY3RlZCB2YWx1ZSwgbm90aGluZyBpcyBkb25lLgogCi1TeXN0ZW0gc2h1dGRvd24gLS0gYXQgbGVhc3QgZGlza3MgbmVlZCB0byBiZSBzcHVuIGRvd24sIG9yIGRhdGEgbWF5IGJlCi1sb3N0LiBRdWllc2NlIGRldmljZXMsIGp1c3QgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IgQklPUy4gZXZlbnQgPQotRlJFRVpFLCBmbGFncyA9IFNZU1RFTV9TSFVURE9XTgorICAgLQlJZiB0aGUgcmVjb3JkZWQgdmFsdWUgaXMgbm9uemVybywgdGhlIGRldmljZSBpcyBwYXJ0aWFsbHkgcmVzdW1lZCwKKwl1c2luZyB0aGUgYnVzLnJlc3VtZSgpIGFuZC9vciBjbGFzcy5yZXN1bWUoKSBtZXRob2RzLgogCi1LZXhlYyAgICAtLSB0dXJuIG9mZiBETUFzIGFuZCBwdXQgaGFyZHdhcmUgaW50byBzb21lIHN0YXRlIHdoZXJlIG5ldwota2VybmVsIGNhbiB0YWtlIG92ZXIuIGV2ZW50ID0gRlJFRVpFLCBmbGFncyA9IEtFWEVDCisgICAtCUlmIHRoZSB0YXJnZXQgdmFsdWUgaXMgbm9uemVybywgdGhlIGRldmljZSBpcyBwYXJ0aWFsbHkgc3VzcGVuZGVkLAorCXVzaW5nIHRoZSBjbGFzcy5zdXNwZW5kKCkgYW5kL29yIGJ1cy5zdXNwZW5kKCkgbWV0aG9kcyBhbmQgdGhlCisJUE1fRVZFTlRfU1VTUEVORCBtZXNzYWdlLgogCi1Qb3dlcmRvd24gYXQgZW5kIG9mIHN3c3VzcCAtLSB2ZXJ5IHNpbWlsYXIgdG8gU1lTVEVNX1NIVVRET1dOLCBleGNlcHQgd2FrZQotbWF5IG5lZWQgdG8gYmUgZW5hYmxlZCBvbiBzb21lIGRldmljZXMuIFRoaXMgYWN0dWFsbHkgaGFzIGF0IGxlYXN0IDMKLXN1YnR5cGVzLCBzeXN0ZW0gY2FuIHJlYm9vdCwgZW50ZXIgUzQgYW5kIGVudGVyIFM1IGF0IHRoZSBlbmQgb2YKLXN3c3VzcC4gZXZlbnQgPSBGUkVFWkUsIGZsYWdzID0gU1dTVVNQIGFuZCBvbmUgb2YgU1lTVEVNX1JFQk9PVCwKLVNZU1RFTV9TSFVURE9XTiwgU1lTVEVNX1M0Ci0KLVN1c3BlbmQgdG8gcmFtICAtLSBwdXQgZGV2aWNlcyBpbnRvIGxvdyBwb3dlciBzdGF0ZS4gZXZlbnQgPSBTVVNQRU5ELAotZmxhZ3MgPSBTVVNQRU5EX1RPX1JBTQotCi1GcmVlemUgZm9yIHN3c3VzcCBzbmFwc2hvdCAtLSBzdG9wIERNQSBhbmQgaW50ZXJydXB0cy4gTm8gbmVlZCB0byBwdXQKLWRldmljZXMgaW50byBsb3cgcG93ZXIgbW9kZSwgYnV0IHlvdSBtdXN0IGJlIGFibGUgdG8gcmVpbml0aWFsaXplCi1kZXZpY2UgZnJvbSBzY3JhdGNoIGluIHJlc3VtZSBtZXRob2QuIFRoaXMgaGFzIHR3byBmbGF2b3JzLCBpdHMgZG9uZQotb25jZSBvbiBzdXNwZW5kaW5nIGtlcm5lbCwgb25jZSBvbiByZXN1bWluZyBrZXJuZWwuIGV2ZW50ID0gRlJFRVpFLAotZmxhZ3MgPSBEVVJJTkdfU1VTUEVORCBvciBEVVJJTkdfUkVTVU1FCi0KLURldmljZSBkZXRhY2ggcmVxdWVzdGVkIGZyb20gL3N5cyAtLSBkZWluaXRpYWxpemUgZGV2aWNlOyBwcm9hYmx5IHNhbWUgYXMKLVNZU1RFTV9TSFVURE9XTiwgSSBkbyBub3QgdW5kZXJzdGFuZCB0aGlzIG9uZSB0b28gbXVjaC4gcHJvYmFibHkgZXZlbnQKLT0gRlJFRVpFLCBmbGFncyA9IERFVl9ERVRBQ0guCi0KLSNUaGVzZSBhcmUgbm90IHJlYWxseSBldmVudHMgc2VudDoKLSMKLSNTeXN0ZW0gZnVsbHkgb24gLS0gZGV2aWNlIGlzIHdvcmtpbmcgbm9ybWFsbHk7IHRoaXMgaXMgcHJvYmFibHkgbmV2ZXIKLSNwYXNzZWQgdG8gc3VzcGVuZCgpIG1ldGhvZC4uLiBldmVudCA9IE9OLCBmbGFncyA9IDAKLSMKLSNSZWFkeSBhZnRlciByZXN1bWUgLS0gdXNlcmxhbmQgaXMgbm93IHJ1bm5pbmcsIGFnYWluLiBUaW1lIHRvIGZyZWUgYW55Ci0jbWVtb3J5IHlvdSBhdGUgZHVyaW5nIHByZXBhcmUgdG8gc3VzcGVuZC4uLiBldmVudCA9IE9OLCBmbGFncyA9Ci0jUkVBRFlfQUZURVJfUkVTVU1FCi0jCitEcml2ZXJzIGhhdmUgbm8gd2F5IHRvIHRlbGwgd2hldGhlciB0aGVpciBzdXNwZW5kKCkgYW5kIHJlc3VtZSgpIGNhbGxzCitoYXZlIGNvbWUgdGhyb3VnaCB0aGUgc3lzZnMgcG93ZXIvc3RhdGUgZmlsZSBvciBhcyBwYXJ0IG9mIGVudGVyaW5nIGEKK3N5c3RlbSBzbGVlcCBzdGF0ZSwgZXhjZXB0IHRoYXQgd2hlbiBhY2Nlc3NlZCB0aHJvdWdoIHN5c2ZzIHRoZSBub3JtYWwKK3BhcmVudC9jaGlsZCBzZXF1ZW5jaW5nIHJ1bGVzIGFyZSBpZ25vcmVkLiAgRHJpdmVycyAoc3VjaCBhcyBidXMsIGJyaWRnZSwKK29yIGh1YiBkcml2ZXJzKSB3aGljaCBleHBvc2UgY2hpbGQgZGV2aWNlcyBtYXkgbmVlZCB0byBlbmZvcmNlIHRob3NlIHJ1bGVzCitvbiB0aGVpciBvd24uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NoL25ldy1tYWNoaW5lLnR4dCBiL0RvY3VtZW50YXRpb24vc2gvbmV3LW1hY2hpbmUudHh0CmluZGV4IGViMmRkMmUuLjczOTg4ZTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2gvbmV3LW1hY2hpbmUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2gvbmV3LW1hY2hpbmUudHh0CkBAIC00MSwxMSArNDEsNiBAQAogICAgICAgICB8CiAJLi4gbW9yZSBib2FyZHMgaGVyZSAuLi4KIAotSXQgc2hvdWxkIGFsc28gYmUgbm90ZWQgdGhhdCBlYWNoIGJvYXJkIGlzIHJlcXVpcmVkIHRvIGhhdmUgc29tZSBjZXJ0YWluCi1oZWFkZXJzLiBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIGlvLmggaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBuZWVkcwotdG8gYmUgcHJvdmlkZWQgZm9yIGVhY2ggYm9hcmQsIGFuZCBjYW4gZ2VuZXJhbGx5IGp1c3QgcmVmZXJlbmNlIGdlbmVyaWMKLWZ1bmN0aW9ucyAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIGlzYV9wb3J0MmFkZHIpLgotCiBOZXh0LCBmb3IgY29tcGFuaW9uIGNoaXBzOgogLgogYC0tIGFyY2gKQEAgLTEwNCwxMiArOTksMTMgQEAKIEJvdGggdGhlIFNvbHV0aW9uIEVuZ2luZSBhbmQgdGhlIGhwNnh4IGJvYXJkcyBhcmUgYW4gZXhhbXBsZSBvZiB0aGlzLgogCiBBZnRlciB5b3UgaGF2ZSBzZXR1cCB5b3VyIG5ldyBhcmNoL3NoL2JvYXJkcy8gZGlyZWN0b3J5LCByZW1lbWJlciB0aGF0IHlvdQotYWxzbyBtdXN0IGFkZCBhIGRpcmVjdG9yeSBpbiBpbmNsdWRlL2FzbS1zaCBmb3IgaGVhZGVycyBsb2NhbGl6ZWQgdG8gdGhpcwotYm9hcmQuIEluIG9yZGVyIHRvIGludGVyb3BlcmF0ZSBzZWFtbGVzc2x5IHdpdGggdGhlIGJ1aWxkIHN5c3RlbSwgaXQncyBiZXN0Ci10byBoYXZlIHRoaXMgZGlyZWN0b3J5IHRoZSBzYW1lIGFzIHRoZSBhcmNoL3NoL2JvYXJkcy8gZGlyZWN0b3J5IG5hbWUsCi10aG91Z2ggaWYgeW91ciBib2FyZCBpcyBhZ2FpbiBwYXJ0IG9mIGEgZmFtaWx5LCB0aGUgYnVpbGQgc3lzdGVtIGhhcyB3YXlzCi1vZiBkZWFsaW5nIHdpdGggdGhpcywgYW5kIHlvdSBjYW4gZmVlbCBmcmVlIHRvIG5hbWUgdGhlIGRpcmVjdG9yeSBhZnRlcgotdGhlIGZhbWlseSBtZW1iZXIgaXRzZWxmLgorc2hvdWxkIGFsc28gYWRkIGEgZGlyZWN0b3J5IGluIGluY2x1ZGUvYXNtLXNoIGZvciBoZWFkZXJzIGxvY2FsaXplZCB0byB0aGlzCitib2FyZCAoaWYgdGhlcmUgYXJlIGdvaW5nIHRvIGJlIG1vcmUgdGhhbiBvbmUpLiBJbiBvcmRlciB0byBpbnRlcm9wZXJhdGUKK3NlYW1sZXNzbHkgd2l0aCB0aGUgYnVpbGQgc3lzdGVtLCBpdCdzIGJlc3QgdG8gaGF2ZSB0aGlzIGRpcmVjdG9yeSB0aGUgc2FtZQorYXMgdGhlIGFyY2gvc2gvYm9hcmRzLyBkaXJlY3RvcnkgbmFtZSwgdGhvdWdoIGlmIHlvdXIgYm9hcmQgaXMgYWdhaW4gcGFydCBvZgorYSBmYW1pbHksIHRoZSBidWlsZCBzeXN0ZW0gaGFzIHdheXMgb2YgZGVhbGluZyB3aXRoIHRoaXMgKHZpYSBpbmNkaXIteQorb3ZlcmxvYWRpbmcpLCBhbmQgeW91IGNhbiBmZWVsIGZyZWUgdG8gbmFtZSB0aGUgZGlyZWN0b3J5IGFmdGVyIHRoZSBmYW1pbHkKK21lbWJlciBpdHNlbGYuCiAKIFRoZXJlIGFyZSBhIGZldyB0aGluZ3MgdGhhdCBlYWNoIGJvYXJkIGlzIHJlcXVpcmVkIHRvIGhhdmUsIGJvdGggaW4gdGhlCiBhcmNoL3NoL2JvYXJkcyBhbmQgdGhlIGluY2x1ZGUvYXNtLXNoLyBoZWlyYXJjaHkuIEluIG9yZGVyIHRvIGJldHRlcgpAQCAtMTIyLDYgKzExOCw3IEBACiAgKiBhcmNoL3NoL2JvYXJkcy92YXBvci9zZXR1cC5jIC0gU2V0dXAgY29kZSBmb3IgaW1hZ2luYXJ5IGJvYXJkCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3J0Yy5oPiAvKiBmb3IgYm9hcmRfdGltZV9pbml0KCkgKi8KIAogY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCiB7CkBAIC0xNTIsNzkgKzE0OSw1NyBAQAogfQogCiBPdXIgbmV3IGltYWdpbmFyeSBib2FyZCB3aWxsIGFsc28gaGF2ZSB0byB0aWUgaW50byB0aGUgbWFjaHZlYyBpbiBvcmRlciBmb3IgaXQKLXRvIGJlIG9mIGFueSB1c2UuIEN1cnJlbnRseSB0aGUgbWFjaHZlYyBpcyBzbG93bHkgb24gaXRzIHdheSBvdXQsIGJ1dCBpcyBzdGlsbAotcmVxdWlyZWQgZm9yIHRoZSB0aW1lIGJlaW5nLiBBcyBzdWNoLCBsZXQgdXMgdGFrZSBhIGxvb2sgYXQgd2hhdCBuZWVkcyB0byBiZQotZG9uZSBmb3IgdGhlIG1hY2h2ZWMgYXNzaWdubWVudC4KK3RvIGJlIG9mIGFueSB1c2UuCiAKIG1hY2h2ZWMgZnVuY3Rpb25zIGZhbGwgaW50byBhIG51bWJlciBvZiBjYXRlZ29yaWVzOgogCiAgLSBJL08gZnVuY3Rpb25zIHRvIElPIG1lbW9yeSAoaW5iIGV0YykgYW5kIFBDSS9tYWluIG1lbW9yeSAocmVhZGIgZXRjKS4KLSAtIEkvTyByZW1hcHBpbmcgZnVuY3Rpb25zIChpb3JlbWFwIGV0YykKLSAtIHNvbWUgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zCi0gLSBhICdoZWFydGJlYXQnIGZ1bmN0aW9uCi0gLSBzb21lIG1pc2NlbGxhbmVvdXMgZmxhZ3MKKyAtIEkvTyBtYXBwaW5nIGZ1bmN0aW9ucyAoaW9wb3J0X21hcCwgaW9wb3J0X3VubWFwLCBldGMpLgorIC0gYSAnaGVhcnRiZWF0JyBmdW5jdGlvbi4KKyAtIFBDSSBhbmQgSVJRIGluaXRpYWxpemF0aW9uIHJvdXRpbmVzLgorIC0gQ29uc2lzdGVudCBhbGxvY2F0b3JzIChmb3IgYm9hcmRzIHRoYXQgbmVlZCBzcGVjaWFsIGFsbG9jYXRvcnMsCisgICBwYXJ0aWN1bGFybHkgZm9yIGFsbG9jYXRpbmcgb3V0IG9mIHNvbWUgYm9hcmQtc3BlY2lmaWMgU1JBTSBmb3IgRE1BCisgICBoYW5kbGVzKS4KIAotVGhlIHRyZWUgY2FuIGJlIGJ1aWx0IGluIHR3byB3YXlzOgotIC0gYXMgYSBmdWxseSBnZW5lcmljIGJ1aWxkLiBBbGwgZHJpdmVycyBhcmUgbGlua2VkIGluLCBhbmQgYWxsIGZ1bmN0aW9ucwotICAgZ28gdGhyb3VnaCB0aGUgbWFjaHZlYwotIC0gYXMgYSBtYWNoaW5lIHNwZWNpZmljIGJ1aWxkLiBJbiB0aGlzIGNhc2Ugb25seSB0aGUgcmVxdWlyZWQgZHJpdmVycwotICAgd2lsbCBiZSBsaW5rZWQgaW4sIGFuZCBzb21lIG1hY3JvcyBtYXkgYmUgcmVkZWZpbmVkIHRvIG5vdCBnbyB0aHJvdWdoCi0gICB0aGUgbWFjaHZlYyB3aGVyZSBwZXJmb3JtYW5jZSBpcyBpbXBvcnRhbnQgKGluIHBhcnRpY3VsYXIgSU8gZnVuY3Rpb25zKS4KK1RoZXJlIGFyZSBtYWNodmVjIGZ1bmN0aW9ucyBhZGRlZCBhbmQgcmVtb3ZlZCBvdmVyIHRpbWUsIHNvIGFsd2F5cyBiZSBzdXJlIHRvCitjb25zdWx0IGluY2x1ZGUvYXNtLXNoL21hY2h2ZWMuaCBmb3IgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1hY2h2ZWMuCiAKLVRoZXJlIGFyZSB0aHJlZSB3YXlzIGluIHdoaWNoIElPIGNhbiBiZSBwZXJmb3JtZWQ6Ci0gLSBub25lIGF0IGFsbC4gVGhpcyBpcyByZWFsbHkgb25seSB1c2VmdWwgZm9yIHRoZSAndW5rbm93bicgbWFjaGluZSB0eXBlLAotICAgd2hpY2ggdXMgZGVzaWduZWQgdG8gcnVuIG9uIGEgbWFjaGluZSBhYm91dCB3aGljaCB3ZSBrbm93IG5vdGhpbmcsIGFuZAotICAgc28gYWxsIGFsbCBJTyBpbnN0cnVjdGlvbnMgZG8gbm90aGluZy4KLSAtIGZ1bGx5IGN1c3RvbS4gSW4gdGhpcyBjYXNlIGFsbCBJTyBmdW5jdGlvbnMgZ28gdG8gYSBtYWNoaW5lIHNwZWNpZmljCi0gICBzZXQgb2YgZnVuY3Rpb25zIHdoaWNoIGNhbiBkbyB3aGF0IHRoZXkgbGlrZQotIC0gYSBnZW5lcmljIHNldCBvZiBmdW5jdGlvbnMuIFRoZXNlIHdpbGwgY29wZSB3aXRoIG1vc3Qgc2l0dWF0aW9ucywKLSAgIGFuZCByZWx5IG9uIGEgc2luZ2xlIGZ1bmN0aW9uLCBtdl9wb3J0MmFkZHIsIHdoaWNoIGlzIGNhbGxlZCB0aHJvdWdoIHRoZQotICAgbWFjaGluZSB2ZWN0b3IsIGFuZCBjb252ZXJ0cyBhbiBJTyBhZGRyZXNzIGludG8gYSBtZW1vcnkgYWRkcmVzcywgd2hpY2gKLSAgIGNhbiBiZSByZWFkIGZyb20vd3JpdHRlbiB0byBkaXJlY3RseS4KK1RoZSBrZXJuZWwgd2lsbCBhdXRvbWF0aWNhbGx5IHdyYXAgaW4gZ2VuZXJpYyByb3V0aW5lcyBmb3IgdW5kZWZpbmVkIGZ1bmN0aW9uCitwb2ludGVycyBpbiB0aGUgbWFjaHZlYyBhdCBib290IHRpbWUsIGFzIG1hY2h2ZWMgZnVuY3Rpb25zIGFyZSByZWZlcmVuY2VkCit1bmNvbmRpdGlvbmFsbHkgdGhyb3VnaG91dCBtb3N0IG9mIHRoZSB0cmVlLiBTb21lIGJvYXJkcyBoYXZlIGluY3JlZGlibHkKK3NwYXJzZSBtYWNodmVjcyAoc3VjaCBhcyB0aGUgZHJlYW1jYXN0IGFuZCBzaDAzKSwgd2hlcmVhcyBvdGhlcnMgbXVzdCBkZWZpbmUKK3ZpcnR1YWxseSBldmVyeXRoaW5nIChydHM3NzUxcjJkKS4KIAotVGh1cyBhZGRpbmcgYSBuZXcgbWFjaGluZSBpbnZvbHZlcyB0aGUgZm9sbG93aW5nIHN0ZXBzIChJIHdpbGwgYXNzdW1lIEkgYW0KLWFkZGluZyBhIG1hY2hpbmUgY2FsbGVkIHZhcG9yKToKK0FkZGluZyBhIG5ldyBtYWNoaW5lIGlzIHJlbGF0aXZlbHkgdHJpdmlhbCAodXNpbmcgdmFwb3IgYXMgYW4gZXhhbXBsZSk6CiAKLSAtIGFkZCBhIG5ldyBmaWxlIGluY2x1ZGUvYXNtLXNoL3ZhcG9yL2lvLmggd2hpY2ggY29udGFpbnMgcHJvdG90eXBlcyBmb3IKK0lmIHRoZSBib2FyZC1zcGVjaWZpYyBkZWZpbml0aW9ucyBhcmUgcXVpdGUgbWluaW1hbGlzdGljLCBhcyBpcyB0aGUgY2FzZSBmb3IKK3RoZSB2YXN0IG1ham9yaXR5IG9mIGJvYXJkcywgc2ltcGx5IGhhdmluZyBhIHNpbmdsZSBib2FyZC1zcGVjaWZpYyBoZWFkZXIgaXMKK3N1ZmZpY2llbnQuCisKKyAtIGFkZCBhIG5ldyBmaWxlIGluY2x1ZGUvYXNtLXNoL3ZhcG9yLmggd2hpY2ggY29udGFpbnMgcHJvdG90eXBlcyBmb3IKICAgIGFueSBtYWNoaW5lIHNwZWNpZmljIElPIGZ1bmN0aW9ucyBwcmVmaXhlZCB3aXRoIHRoZSBtYWNoaW5lIG5hbWUsIGZvcgogICAgZXhhbXBsZSB2YXBvcl9pbmIuIFRoZXNlIHdpbGwgYmUgbmVlZGVkIHdoZW4gZmlsbGluZyBvdXQgdGhlIG1hY2hpbmUKICAgIHZlY3Rvci4KIAotICAgVGhpcyBpcyB0aGUgbWluaW11bSB0aGF0IGlzIHJlcXVpcmVkLCBob3dldmVyIHRoZXJlIGFyZSBhbXBsZQotICAgb3Bwb3J0dW5pdGllcyB0byBvcHRpbWlzZSB0aGlzLiBJbiBwYXJ0aWN1bGFyLCBieSBtYWtpbmcgdGhlIHByb3RvdHlwZXMKLSAgIGlubGluZSBmdW5jdGlvbiBkZWZpbml0aW9ucywgaXQgaXMgcG9zc2libGUgdG8gaW5saW5lIHRoZSBmdW5jdGlvbiB3aGVuCi0gICBidWlsZGluZyBtYWNoaW5lIHNwZWNpZmljIHZlcnNpb25zLiBOb3RlIHRoYXQgdGhlIG1hY2hpbmUgdmVjdG9yCi0gICBmdW5jdGlvbnMgd2lsbCBzdGlsbCBiZSBuZWVkZWQsIHNvIHRoYXQgYSBtb2R1bGUgYnVpbHQgZm9yIGEgZ2VuZXJpYwotICAgc2V0dXAgY2FuIGJlIGxvYWRlZC4KKyAgIE5vdGUgdGhhdCB0aGVzZSBwcm90b3R5cGVzIGFyZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBzZXR0aW5nCisgICBfX0lPX1BSRUZJWCB0byBzb21ldGhpbmcgc2Vuc2libGUuIEEgdHlwaWNhbCBleGFtcGxlIHdvdWxkIGJlOgogCi0gLSBhZGQgYSBuZXcgZmlsZSBhcmNoL3NoL2JvYXJkcy92YXBvci9tYWNoLmMuIFRoaXMgY29udGFpbnMgdGhlIGRlZmluaXRpb24KLSAgIG9mIHRoZSBtYWNoaW5lIHZlY3Rvci4gV2hlbiBidWlsZGluZyB0aGUgbWFjaGluZSBzcGVjaWZpYyB2ZXJzaW9uLCB0aGlzCi0gICB3aWxsIGJlIHRoZSByZWFsIG1hY2hpbmUgdmVjdG9yICh2aWEgYW4gYWxpYXMpLCB3aGlsZSBpbiB0aGUgZ2VuZXJpYwotICAgdmVyc2lvbiBpcyB1c2VkIHRvIGluaXRpYWxpc2UgdGhlIG1hY2hpbmUgdmVjdG9yLCBhbmQgdGhlbiBmcmVlZCwgYnkKLSAgIG1ha2luZyBpdCBpbml0ZGF0YS4gVGhpcyBzaG91bGQgYmUgZGVmaW5lZCBhczoKKwkjZGVmaW5lIF9fSU9fUFJFRklYIHZhcG9yCisgICAJI2luY2x1ZGUgPGFzbS9pb19nZW5lcmljLmg+CiAKLSAgICAgc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3ZhcG9yIF9faW5pdG12ID0gewotICAgICAgIC5tdl9uYW1lID0gInZhcG9yIiwKLSAgICAgfQotICAgICBBTElBU19NVih2YXBvcikKKyAgIHNvbWV3aGVyZSBpbiB0aGUgYm9hcmQtc3BlY2lmaWMgaGVhZGVyLiBBbnkgYm9hcmRzIGJlaW5nIHBvcnRlZCB0aGF0IHN0aWxsCisgICBoYXZlIGEgbGVnYWN5IGlvLmggc2hvdWxkIHJlbW92ZSBpdCBlbnRpcmVseSBhbmQgc3dpdGNoIHRvIHRoZSBuZXcgbW9kZWwuCiAKLSAtIGZpbmFsbHkgYWRkIGEgZmlsZSBhcmNoL3NoL2JvYXJkcy92YXBvci9pby5jLCB3aGljaCBjb250YWlucwotICAgZGVmaW5pdGlvbnMgb2YgdGhlIG1hY2hpbmUgc3BlY2lmaWMgaW8gZnVuY3Rpb25zLgorIC0gQWRkIG1hY2hpbmUgdmVjdG9yIGRlZmluaXRpb25zIHRvIHRoZSBib2FyZCdzIHNldHVwLmMuIEF0IGEgYmFyZSBtaW5pbXVtLAorICAgdGhpcyBtdXN0IGJlIGRlZmluZWQgYXMgc29tZXRoaW5nIGxpa2U6CiAKLUEgbm90ZSBhYm91dCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMuIFRocmVlIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucyBhcmUKLXByb3ZpZGVkIGluIHRoZSBtYWNoaW5lIHZlY3RvcjoKLSAtIG12X2FyY2hfaW5pdCAtIGNhbGxlZCB2ZXJ5IGVhcmx5IG9uIGZyb20gc2V0dXBfYXJjaAotIC0gbXZfaW5pdF9pcnEgLSBjYWxsZWQgZnJvbSBpbml0X0lSUSwgYWZ0ZXIgdGhlIGdlbmVyaWMgU0ggaW50ZXJydXB0Ci0gICBpbml0aWFsaXNhdGlvbgotIC0gbXZfaW5pdF9wY2kgLSBjdXJyZW50bHkgbm90IHVzZWQKKwlzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfdmFwb3IgX19pbml0bXYgPSB7CisJCS5tdl9uYW1lID0gInZhcG9yIiwKKwl9OworCUFMSUFTX01WKHZhcG9yKQogCi1Bbnkgb3RoZXIgcmVtYWluaW5nIGZ1bmN0aW9ucyB3aGljaCBuZWVkIHRvIGJlIGNhbGxlZCBhdCBzdGFydCB1cCBjYW4gYmUKLWFkZGVkIHRvIHRoZSBsaXN0IHVzaW5nIHRoZSBfX2luaXRjYWxscyBtYWNybyAob3IgbW9kdWxlX2luaXQgaWYgdGhlIGNvZGUKLWNhbiBiZSBidWlsdCBhcyBhIG1vZHVsZSkuIE1hbnkgZ2VuZXJpYyBkcml2ZXJzIHByb2JlIHRvIHNlZSBpZiB0aGUgZGV2aWNlCi10aGV5IGFyZSB0YXJnZXRpbmcgaXMgcHJlc2VudCwgaG93ZXZlciB0aGlzIG1heSBub3QgYWx3YXlzIGJlIGFwcHJvcHJpYXRlLAotc28gYSBmbGFnIGNhbiBiZSBhZGRlZCB0byB0aGUgbWFjaGluZSB2ZWN0b3Igd2hpY2ggd2lsbCBiZSBzZXQgb24gdGhvc2UKLW1hY2hpbmVzIHdoaWNoIGhhdmUgdGhlIGhhcmR3YXJlIGluIHF1ZXN0aW9uLCByZWR1Y2luZyB0aGUgcHJvYmUgdG8gYQotc2luZ2xlIGNvbmRpdGlvbmFsLgorIC0gZmluYWxseSBhZGQgYSBmaWxlIGFyY2gvc2gvYm9hcmRzL3ZhcG9yL2lvLmMsIHdoaWNoIGNvbnRhaW5zIGRlZmluaXRpb25zIG9mCisgICB0aGUgbWFjaGluZSBzcGVjaWZpYyBpbyBmdW5jdGlvbnMgKGlmIHRoZXJlIGFyZSBlbm91Z2ggdG8gd2FycmFudCBpdCkuCiAKIDMuIEhvb2tpbmcgaW50byB0aGUgQnVpbGQgU3lzdGVtCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMzAzLDQgKzI3OCwzIEBACiBvbGRjb25maWcgKHByb21wdGluZyB5b3UgZm9yIGFueSBuZXcgb3B0aW9ucyBzaW5jZSB0aGUgdGltZSBvZiBjcmVhdGlvbiksCiBhbmQgc3RhcnQgeW91IG9uIHlvdXIgd2F5IHRvIGhhdmluZyBhIGZ1bmN0aW9uYWwga2VybmVsIGZvciB5b3VyIG5ldwogYm9hcmQuCi0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc2gvcmVnaXN0ZXItYmFua3MudHh0IGIvRG9jdW1lbnRhdGlvbi9zaC9yZWdpc3Rlci1iYW5rcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY3MTlmMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vc2gvcmVnaXN0ZXItYmFua3MudHh0CkBAIC0wLDAgKzEsMzMgQEAKKwlOb3RlcyBvbiByZWdpc3RlciBiYW5rIHVzYWdlIGluIHRoZSBrZXJuZWwKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW50cm9kdWN0aW9uCistLS0tLS0tLS0tLS0KKworVGhlIFNILTMgYW5kIFNILTQgQ1BVIGZhbWlsaWVzIHRyYWRpdGlvbmFsbHkgaW5jbHVkZSBhIHNpbmdsZSBwYXJ0aWFsIHJlZ2lzdGVyCitiYW5rIChzZWxlY3RlZCBieSBTUi5SQiwgb25seSByMCAuLi4gcjcgYXJlIGJhbmtlZCksIHdoZXJlYXMgb3RoZXIgZmFtaWxpZXMKK21heSBoYXZlIG1vcmUgZnVsbC1mZWF0dXJlZCBiYW5raW5nIG9yIHNpbXBseSBubyBzdWNoIGNhcGFiaWxpdGllcyBhdCBhbGwuCisKK1NSLlJCIGJhbmtpbmcKKy0tLS0tLS0tLS0tLS0KKworSW4gdGhlIGNhc2Ugb2YgdGhpcyB0eXBlIG9mIGJhbmtpbmcsIGJhbmtlZCByZWdpc3RlcnMgYXJlIG1hcHBlZCBkaXJlY3RseSB0bworcjAgLi4uIHI3IGlmIFNSLlJCIGlzIHNldCB0byB0aGUgYmFuayB3ZSBhcmUgaW50ZXJlc3RlZCBpbiwgb3RoZXJ3aXNlIGxkYy9zdGMKK2NhbiBzdGlsbCBiZSB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgYmFua2VkIHJlZ2lzdGVycyAoYXMgcjBfYmFuayAuLi4gcjdfYmFuaykKK3doZW4gaW4gdGhlIGNvbnRleHQgb2YgYW5vdGhlciBiYW5rLiBUaGUgZGV2ZWxvcGVyIG11c3Qga2VlcCB0aGUgU1IuUkIgdmFsdWUKK2luIG1pbmQgd2hlbiB3cml0aW5nIGNvZGUgdGhhdCB1dGlsaXplcyB0aGVzZSBiYW5rZWQgcmVnaXN0ZXJzLCBmb3Igb2J2aW91cworcmVhc29ucy4gVXNlcnNwYWNlIGlzIGFsc28gbm90IGFibGUgdG8gcG9rZSBhdCB0aGUgYmFuazEgdmFsdWVzLCBzbyB0aGVzZSBjYW4KK2JlIHVzZWQgcmF0aGVyIGVmZmVjdGl2ZWx5IGFzIHNjcmF0Y2ggcmVnaXN0ZXJzIGJ5IHRoZSBrZXJuZWwuCisKK1ByZXNlbnRseSB0aGUga2VybmVsIHVzZXMgc2V2ZXJhbCBvZiB0aGVzZSByZWdpc3RlcnMuCisKKwktIHIwX2JhbmssIHIxX2JhbmsgKHJlZmVyZW5jZWQgYXMgazAgYW5kIGsxLCB1c2VkIGZvciBzY3JhdGNoCisJICByZWdpc3RlcnMgd2hlbiBkb2luZyBleGNlcHRpb24gaGFuZGxpbmcpLgorCS0gcjJfYmFuayAodXNlZCB0byB0cmFjayB0aGUgRVhQRVZUL0lOVEVWVCBjb2RlKQorCQktIFVzZWQgYnkgZG9fSVJRKCkgYW5kIGZyaWVuZHMgZm9yIGRvaW5nIGlycSBtYXBwaW5nIGJhc2VkIG9mZgorCQkgIG9mIHRoZSBpbnRlcnJ1cHQgZXhjZXB0aW9uIHZlY3RvciBqdW1wIHRhYmxlIG9mZnNldAorCS0gcjZfYmFuayAoZ2xvYmFsIGludGVycnVwdCBtYXNrKQorCQktIFRoZSBTUi5JTUFTSyBpbnRlcnJ1cHQgaGFuZGxlciBtYWtlcyB1c2Ugb2YgdGhpcyB0byBzZXQgdGhlCisJCSAgaW50ZXJydXB0IHByaW9yaXR5IGxldmVsICh1c2VkIGJ5IGxvY2FsX2lycV9lbmFibGUoKSkKKwktIHI3X2JhbmsgKGN1cnJlbnQpCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdXNiL2Vycm9yLWNvZGVzLnR4dCBiL0RvY3VtZW50YXRpb24vdXNiL2Vycm9yLWNvZGVzLnR4dAppbmRleCA4NjdmNGMzLi4zOWM2OGY4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3VzYi9lcnJvci1jb2Rlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi91c2IvZXJyb3ItY29kZXMudHh0CkBAIC05OCwxMyArOTgsMTMgQEAKIAkJCWVycm9yLCBhIGZhaWx1cmUgdG8gcmVzcG9uZCAob2Z0ZW4gY2F1c2VkIGJ5CiAJCQlkZXZpY2UgZGlzY29ubmVjdCksIG9yIHNvbWUgb3RoZXIgZmF1bHQuCiAKLS1FVElNRURPVVQgKCoqKQkJTm8gcmVzcG9uc2UgcGFja2V0IHJlY2VpdmVkIHdpdGhpbiB0aGUgcHJlc2NyaWJlZAorLUVUSU1FICgqKikJCU5vIHJlc3BvbnNlIHBhY2tldCByZWNlaXZlZCB3aXRoaW4gdGhlIHByZXNjcmliZWQKIAkJCWJ1cyB0dXJuLWFyb3VuZCB0aW1lLiAgVGhpcyBlcnJvciBtYXkgaW5zdGVhZCBiZQogCQkJcmVwb3J0ZWQgYXMgLUVQUk9UTyBvciAtRUlMU0VRLgogCi0JCQlOb3RlIHRoYXQgdGhlIHN5bmNocm9ub3VzIFVTQiBtZXNzYWdlIGZ1bmN0aW9ucwotCQkJYWxzbyB1c2UgdGhpcyBjb2RlIHRvIGluZGljYXRlIHRpbWVvdXQgZXhwaXJlZAotCQkJYmVmb3JlIHRoZSB0cmFuc2ZlciBjb21wbGV0ZWQuCistRVRJTUVET1VUCQlTeW5jaHJvbm91cyBVU0IgbWVzc2FnZSBmdW5jdGlvbnMgdXNlIHRoaXMgY29kZQorCQkJdG8gaW5kaWNhdGUgdGltZW91dCBleHBpcmVkIGJlZm9yZSB0aGUgdHJhbnNmZXIKKwkJCWNvbXBsZXRlZCwgYW5kIG5vIG90aGVyIGVycm9yIHdhcyByZXBvcnRlZCBieSBIQy4KIAogLUVQSVBFICgqKikJCUVuZHBvaW50IHN0YWxsZWQuICBGb3Igbm9uLWNvbnRyb2wgZW5kcG9pbnRzLAogCQkJcmVzZXQgdGhpcyBzdGF0dXMgd2l0aCB1c2JfY2xlYXJfaGFsdCgpLgpAQCAtMTYzLDYgKzE2MywzIEBACiB1c2JfY29udHJvbF9tc2coKToKIHVzYl9idWxrX21zZygpOgogLUVUSU1FRE9VVAkJVGltZW91dCBleHBpcmVkIGJlZm9yZSB0aGUgdHJhbnNmZXIgY29tcGxldGVkLgotCQkJSW4gdGhlIGZ1dHVyZSB0aGlzIGNvZGUgbWF5IGNoYW5nZSB0byAtRVRJTUUsCi0JCQl3aG9zZSBkZWZpbml0aW9uIGlzIGEgY2xvc2VyIG1hdGNoIHRvIHRoaXMgc29ydAotCQkJb2YgZXJyb3IuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzYi91c2Itc2VyaWFsLnR4dCBiL0RvY3VtZW50YXRpb24vdXNiL3VzYi1zZXJpYWwudHh0CmluZGV4IDAyYjBmN2IuLmEyZGVlNmUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNiL3VzYi1zZXJpYWwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdXNiL3VzYi1zZXJpYWwudHh0CkBAIC00MzMsNiArNDMzLDExIEBACiAgIFNlZSBodHRwOi8vd3d3LnV1aGF1cy5kZS9saW51eC9wYWxtY29ubmVjdC5odG1sIGZvciB1cC10by1kYXRlCiAgIGluZm9ybWF0aW9uIG9uIHRoaXMgZHJpdmVyLgogCitBSVJjYWJsZSBVU0IgRG9uZ2xlIEJsdWV0b290aCBkcml2ZXIKKyAgSWYgdGhlcmUgaXMgdGhlIGNkY19hY20gZHJpdmVyIGxvYWRlZCBpbiB0aGUgc3lzdGVtLCB5b3Ugd2lsbCBmaW5kIHRoYXQgdGhlCisgIGNkY19hY20gY2xhaW1zIHRoZSBkZXZpY2UgYmVmb3JlIEFJUmNhYmxlIGNhbi4gVGhpcyBpcyBzaW1wbHkgY29ycmVjdGVkCisgIGJ5IHVubG9hZGluZyBib3RoIG1vZHVsZXMgYW5kIHRoZW4gbG9hZGluZyB0aGUgYWlyY2FibGUgbW9kdWxlIGJlZm9yZQorICBjZGNfYWNtIG1vZHVsZQogCiBHZW5lcmljIFNlcmlhbCBkcml2ZXIKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODZfNjQvYm9vdC1vcHRpb25zLnR4dCBiL0RvY3VtZW50YXRpb24veDg2XzY0L2Jvb3Qtb3B0aW9ucy50eHQKaW5kZXggNmRhMjRlNy4uNDMwM2UwYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi94ODZfNjQvYm9vdC1vcHRpb25zLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3g4Nl82NC9ib290LW9wdGlvbnMudHh0CkBAIC0yNDUsNiArMjQ1LDEzIEBACiAJCW5ld2ZhbGxiYWNrOiB1c2UgbmV3IHVud2luZGVyIGJ1dCBmYWxsIGJhY2sgdG8gb2xkIGlmIGl0IGdldHMKIAkJCXN0dWNrIChkZWZhdWx0KQogCisgIGNhbGxfdHJhY2U9W29sZHxib3RofG5ld2ZhbGxiYWNrfG5ld10KKwkJb2xkOiB1c2Ugb2xkIGluZXhhY3QgYmFja3RyYWNlcgorCQluZXc6IHVzZSBuZXcgZXhhY3QgZHdhcmYyIHVud2luZGVyCisgCQlib3RoOiBwcmludCBlbnRyaWVzIGZyb20gYm90aAorCQluZXdmYWxsYmFjazogdXNlIG5ldyB1bndpbmRlciBidXQgZmFsbCBiYWNrIHRvIG9sZCBpZiBpdCBnZXRzCisJCQlzdHVjayAoZGVmYXVsdCkKKwogTWlzYwogCiAgIG5vcmVwbGFjZW1lbnQgIERvbid0IHJlcGxhY2UgaW5zdHJ1Y3Rpb25zIHdpdGggbW9yZSBhcHByb3ByaWF0ZSBvbmVzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Nl82NC9rZXJuZWwtc3RhY2tzIGIvRG9jdW1lbnRhdGlvbi94ODZfNjQva2VybmVsLXN0YWNrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGRmZGRkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi94ODZfNjQva2VybmVsLXN0YWNrcwpAQCAtMCwwICsxLDk5IEBACitNb3N0IG9mIHRoZSB0ZXh0IGZyb20gS2VpdGggT3dlbnMsIGhhY2tlZCBieSBBSworCit4ODZfNjQgcGFnZSBzaXplIChQQUdFX1NJWkUpIGlzIDRLLgorCitMaWtlIGFsbCBvdGhlciBhcmNoaXRlY3R1cmVzLCB4ODZfNjQgaGFzIGEga2VybmVsIHN0YWNrIGZvciBldmVyeQorYWN0aXZlIHRocmVhZC4gIFRoZXNlIHRocmVhZCBzdGFja3MgYXJlIFRIUkVBRF9TSVpFICgyKlBBR0VfU0laRSkgYmlnLgorVGhlc2Ugc3RhY2tzIGNvbnRhaW4gdXNlZnVsIGRhdGEgYXMgbG9uZyBhcyBhIHRocmVhZCBpcyBhbGl2ZSBvciBhCit6b21iaWUuIFdoaWxlIHRoZSB0aHJlYWQgaXMgaW4gdXNlciBzcGFjZSB0aGUga2VybmVsIHN0YWNrIGlzIGVtcHR5CitleGNlcHQgZm9yIHRoZSB0aHJlYWRfaW5mbyBzdHJ1Y3R1cmUgYXQgdGhlIGJvdHRvbS4KKworSW4gYWRkaXRpb24gdG8gdGhlIHBlciB0aHJlYWQgc3RhY2tzLCB0aGVyZSBhcmUgc3BlY2lhbGl6ZWQgc3RhY2tzCithc3NvY2lhdGVkIHdpdGggZWFjaCBjcHUuICBUaGVzZSBzdGFja3MgYXJlIG9ubHkgdXNlZCB3aGlsZSB0aGUga2VybmVsCitpcyBpbiBjb250cm9sIG9uIHRoYXQgY3B1LCB3aGVuIGEgY3B1IHJldHVybnMgdG8gdXNlciBzcGFjZSB0aGUKK3NwZWNpYWxpemVkIHN0YWNrcyBjb250YWluIG5vIHVzZWZ1bCBkYXRhLiAgVGhlIG1haW4gY3B1IHN0YWNrcyBpcworCisqIEludGVycnVwdCBzdGFjay4gIElSUVNUQUNLU0laRQorCisgIFVzZWQgZm9yIGV4dGVybmFsIGhhcmR3YXJlIGludGVycnVwdHMuICBJZiB0aGlzIGlzIHRoZSBmaXJzdCBleHRlcm5hbAorICBoYXJkd2FyZSBpbnRlcnJ1cHQgKGkuZS4gbm90IGEgbmVzdGVkIGhhcmR3YXJlIGludGVycnVwdCkgdGhlbiB0aGUKKyAga2VybmVsIHN3aXRjaGVzIGZyb20gdGhlIGN1cnJlbnQgdGFzayB0byB0aGUgaW50ZXJydXB0IHN0YWNrLiAgTGlrZQorICB0aGUgc3BsaXQgdGhyZWFkIGFuZCBpbnRlcnJ1cHQgc3RhY2tzIG9uIGkzODYgKHdpdGggQ09ORklHXzRLU1RBQ0tTKSwKKyAgdGhpcyBnaXZlcyBtb3JlIHJvb20gZm9yIGtlcm5lbCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyB3aXRob3V0IGhhdmluZworICB0byBpbmNyZWFzZSB0aGUgc2l6ZSBvZiBldmVyeSBwZXIgdGhyZWFkIHN0YWNrLgorCisgIFRoZSBpbnRlcnJ1cHQgc3RhY2sgaXMgYWxzbyB1c2VkIHdoZW4gcHJvY2Vzc2luZyBhIHNvZnRpcnEuCisKK1N3aXRjaGluZyB0byB0aGUga2VybmVsIGludGVycnVwdCBzdGFjayBpcyBkb25lIGJ5IHNvZnR3YXJlIGJhc2VkIG9uIGEKK3BlciBDUFUgaW50ZXJydXB0IG5lc3QgY291bnRlci4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB4ODYtNjQgIklTVCIKK2hhcmR3YXJlIHN0YWNrcyBjYW5ub3QgbmVzdCB3aXRob3V0IHJhY2VzLgorCit4ODZfNjQgYWxzbyBoYXMgYSBmZWF0dXJlIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgb24gaTM4NiwgdGhlIGFiaWxpdHkKK3RvIGF1dG9tYXRpY2FsbHkgc3dpdGNoIHRvIGEgbmV3IHN0YWNrIGZvciBkZXNpZ25hdGVkIGV2ZW50cyBzdWNoIGFzCitkb3VibGUgZmF1bHQgb3IgTk1JLCB3aGljaCBtYWtlcyBpdCBlYXNpZXIgdG8gaGFuZGxlIHRoZXNlIHVudXN1YWwKK2V2ZW50cyBvbiB4ODZfNjQuICBUaGlzIGZlYXR1cmUgaXMgY2FsbGVkIHRoZSBJbnRlcnJ1cHQgU3RhY2sgVGFibGUKKyhJU1QpLiAgVGhlcmUgY2FuIGJlIHVwIHRvIDcgSVNUIGVudHJpZXMgcGVyIGNwdS4gVGhlIElTVCBjb2RlIGlzIGFuCitpbmRleCBpbnRvIHRoZSBUYXNrIFN0YXRlIFNlZ21lbnQgKFRTUyksIHRoZSBJU1QgZW50cmllcyBpbiB0aGUgVFNTCitwb2ludCB0byBkZWRpY2F0ZWQgc3RhY2tzLCBlYWNoIHN0YWNrIGNhbiBiZSBhIGRpZmZlcmVudCBzaXplLgorCitBbiBJU1QgaXMgc2VsZWN0ZWQgYnkgYW4gbm9uLXplcm8gdmFsdWUgaW4gdGhlIElTVCBmaWVsZCBvZiBhbgoraW50ZXJydXB0LWdhdGUgZGVzY3JpcHRvci4gIFdoZW4gYW4gaW50ZXJydXB0IG9jY3VycyBhbmQgdGhlIGhhcmR3YXJlCitsb2FkcyBzdWNoIGEgZGVzY3JpcHRvciwgdGhlIGhhcmR3YXJlIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgbmV3IHN0YWNrCitwb2ludGVyIGJhc2VkIG9uIHRoZSBJU1QgdmFsdWUsIHRoZW4gaW52b2tlcyB0aGUgaW50ZXJydXB0IGhhbmRsZXIuICBJZgorc29mdHdhcmUgd2FudHMgdG8gYWxsb3cgbmVzdGVkIElTVCBpbnRlcnJ1cHRzIHRoZW4gdGhlIGhhbmRsZXIgbXVzdAorYWRqdXN0IHRoZSBJU1QgdmFsdWVzIG9uIGVudHJ5IHRvIGFuZCBleGl0IGZyb20gdGhlIGludGVycnVwdCBoYW5kbGVyLgorKHRoaXMgaXMgb2NjYXNpb25hbGx5IGRvbmUsIGUuZy4gZm9yIGRlYnVnIGV4Y2VwdGlvbnMpCisKK0V2ZW50cyB3aXRoIGRpZmZlcmVudCBJU1QgY29kZXMgKGkuZS4gd2l0aCBkaWZmZXJlbnQgc3RhY2tzKSBjYW4gYmUKK25lc3RlZC4gIEZvciBleGFtcGxlLCBhIGRlYnVnIGludGVycnVwdCBjYW4gc2FmZWx5IGJlIGludGVycnVwdGVkIGJ5IGFuCitOTUkuICBhcmNoL3g4Nl82NC9rZXJuZWwvZW50cnkuUzo6cGFyYW5vaWRlbnRyeSBhZGp1c3RzIHRoZSBzdGFjaworcG9pbnRlcnMgb24gZW50cnkgdG8gYW5kIGV4aXQgZnJvbSBhbGwgSVNUIGV2ZW50cywgaW4gdGhlb3J5IGFsbG93aW5nCitJU1QgZXZlbnRzIHdpdGggdGhlIHNhbWUgY29kZSB0byBiZSBuZXN0ZWQuICBIb3dldmVyIGluIG1vc3QgY2FzZXMsIHRoZQorc3RhY2sgc2l6ZSBhbGxvY2F0ZWQgdG8gYW4gSVNUIGFzc3VtZXMgbm8gbmVzdGluZyBmb3IgdGhlIHNhbWUgY29kZS4KK0lmIHRoYXQgYXNzdW1wdGlvbiBpcyBldmVyIGJyb2tlbiB0aGVuIHRoZSBzdGFja3Mgd2lsbCBiZWNvbWUgY29ycnVwdC4KKworVGhlIGN1cnJlbnRseSBhc3NpZ25lZCBJU1Qgc3RhY2tzIGFyZSA6LQorCisqIFNUQUNLRkFVTFRfU1RBQ0suICBFWENFUFRJT05fU1RLU1ogKFBBR0VfU0laRSkuCisKKyAgVXNlZCBmb3IgaW50ZXJydXB0IDEyIC0gU3RhY2sgRmF1bHQgRXhjZXB0aW9uICgjU1MpLgorCisgIFRoaXMgYWxsb3dzIHRvIHJlY292ZXIgZnJvbSBpbnZhbGlkIHN0YWNrIHNlZ21lbnRzLiBSYXJlbHkKKyAgaGFwcGVucy4KKworKiBET1VCTEVGQVVMVF9TVEFDSy4gIEVYQ0VQVElPTl9TVEtTWiAoUEFHRV9TSVpFKS4KKworICBVc2VkIGZvciBpbnRlcnJ1cHQgOCAtIERvdWJsZSBGYXVsdCBFeGNlcHRpb24gKCNERikuCisKKyAgSW52b2tlZCB3aGVuIGhhbmRsaW5nIGEgZXhjZXB0aW9uIGNhdXNlcyBhbm90aGVyIGV4Y2VwdGlvbi4gSGFwcGVucworICB3aGVuIHRoZSBrZXJuZWwgaXMgdmVyeSBjb25mdXNlZCAoZS5nLiBrZXJuZWwgc3RhY2sgcG9pbnRlciBjb3JydXB0KQorICBVc2luZyBhIHNlcGFyYXRlIHN0YWNrIGFsbG93cyB0byByZWNvdmVyIGZyb20gaXQgd2VsbCBlbm91Z2ggaW4gbWFueQorICBjYXNlcyB0byBzdGlsbCBvdXRwdXQgYW4gb29wcy4KKworKiBOTUlfU1RBQ0suICBFWENFUFRJT05fU1RLU1ogKFBBR0VfU0laRSkuCisKKyAgVXNlZCBmb3Igbm9uLW1hc2thYmxlIGludGVycnVwdHMgKE5NSSkuCisKKyAgTk1JIGNhbiBiZSBkZWxpdmVyZWQgYXQgYW55IHRpbWUsIGluY2x1ZGluZyB3aGVuIHRoZSBrZXJuZWwgaXMgaW4gdGhlCisgIG1pZGRsZSBvZiBzd2l0Y2hpbmcgc3RhY2tzLiAgVXNpbmcgSVNUIGZvciBOTUkgZXZlbnRzIGF2b2lkcyBtYWtpbmcKKyAgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHByZXZpb3VzIHN0YXRlIG9mIHRoZSBrZXJuZWwgc3RhY2suCisKKyogREVCVUdfU1RBQ0suICBERUJVR19TVEtTWgorCisgIFVzZWQgZm9yIGhhcmR3YXJlIGRlYnVnIGludGVycnVwdHMgKGludGVycnVwdCAxKSBhbmQgZm9yIHNvZnR3YXJlCisgIGRlYnVnIGludGVycnVwdHMgKElOVDMpLgorCisgIFdoZW4gZGVidWdnaW5nIGEga2VybmVsLCBkZWJ1ZyBpbnRlcnJ1cHRzIChib3RoIGhhcmR3YXJlIGFuZAorICBzb2Z0d2FyZSkgY2FuIG9jY3VyIGF0IGFueSB0aW1lLiAgVXNpbmcgSVNUIGZvciB0aGVzZSBpbnRlcnJ1cHRzCisgIGF2b2lkcyBtYWtpbmcgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHByZXZpb3VzIHN0YXRlIG9mIHRoZSBrZXJuZWwKKyAgc3RhY2suCisKKyogTUNFX1NUQUNLLiAgRVhDRVBUSU9OX1NUS1NaIChQQUdFX1NJWkUpLgorCisgIFVzZWQgZm9yIGludGVycnVwdCAxOCAtIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uICgjTUMpLgorCisgIE1DRSBjYW4gYmUgZGVsaXZlcmVkIGF0IGFueSB0aW1lLCBpbmNsdWRpbmcgd2hlbiB0aGUga2VybmVsIGlzIGluIHRoZQorICBtaWRkbGUgb2Ygc3dpdGNoaW5nIHN0YWNrcy4gIFVzaW5nIElTVCBmb3IgTUNFIGV2ZW50cyBhdm9pZHMgbWFraW5nCisgIGFzc3VtcHRpb25zIGFib3V0IHRoZSBwcmV2aW91cyBzdGF0ZSBvZiB0aGUga2VybmVsIHN0YWNrLgorCitGb3IgbW9yZSBkZXRhaWxzIHNlZSB0aGUgSW50ZWwgSUEzMiBvciBBTUQgQU1ENjQgYXJjaGl0ZWN0dXJlIG1hbnVhbHMuCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDgwZGFjMDIuLjRjNmM1ZTMgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xMzg1LDkgKzEzODUsMTMgQEAKIGVuZGlmICNpZmVxICgkKG1peGVkLXRhcmdldHMpLDEpCiAKIFBIT05ZICs9IGNoZWNrc3RhY2sga2VybmVscmVsZWFzZSBrZXJuZWx2ZXJzaW9uCisKKyMgVXNlICQoU1VCQVJDSCkgaGVyZSBpbnN0ZWFkIG9mICQoQVJDSCkgc28gdGhhdCB0aGlzIHdvcmtzIGZvciBVTUwuCisjIEluIHRoZSBVTUwgY2FzZSwgJChTVUJBUkNIKSBpcyB0aGUgbmFtZSBvZiB0aGUgdW5kZXJseWluZworIyBhcmNoaXRlY3R1cmUsIHdoaWxlIGZvciBhbGwgb3RoZXIgYXJjaGVzLCBpdCBpcyB0aGUgc2FtZSBhcyAkKEFSQ0gpLgogY2hlY2tzdGFjazoKIAkkKE9CSkRVTVApIC1kIHZtbGludXggJCQoZmluZCAuIC1uYW1lICcqLmtvJykgfCBcCi0JJChQRVJMKSAkKHNyYykvc2NyaXB0cy9jaGVja3N0YWNrLnBsICQoQVJDSCkKKwkkKFBFUkwpICQoc3JjKS9zY3JpcHRzL2NoZWNrc3RhY2sucGwgJChTVUJBUkNIKQogCiBrZXJuZWxyZWxlYXNlOgogCSQoaWYgJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy9rZXJuZWwucmVsZWFzZSksICQoUSllY2hvICQoS0VSTkVMUkVMRUFTRSksIFwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMgYi9hcmNoL2FybS9tYWNoLXB4YS9jb3JnaS5jCmluZGV4IGNjZTI2NTcuLjMzN2MwMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL2NvcmdpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvY29yZ2kuYwpAQCAtMjg0LDIxICsyODQsOSBAQAogLyoKICAqIFVTQiBEZXZpY2UgQ29udHJvbGxlcgogICovCi1zdGF0aWMgdm9pZCBjb3JnaV91ZGNfY29tbWFuZChpbnQgY21kKQotewotCXN3aXRjaChjbWQpCXsKLQljYXNlIFBYQTJYWF9VRENfQ01EX0NPTk5FQ1Q6Ci0JCUdQU1IoQ09SR0lfR1BJT19VU0JfUFVMTFVQKSA9IEdQSU9fYml0KENPUkdJX0dQSU9fVVNCX1BVTExVUCk7Ci0JCWJyZWFrOwotCWNhc2UgUFhBMlhYX1VEQ19DTURfRElTQ09OTkVDVDoKLQkJR1BDUihDT1JHSV9HUElPX1VTQl9QVUxMVVApID0gR1BJT19iaXQoQ09SR0lfR1BJT19VU0JfUFVMTFVQKTsKLQkJYnJlYWs7Ci0JfQotfQotCiBzdGF0aWMgc3RydWN0IHB4YTJ4eF91ZGNfbWFjaF9pbmZvIHVkY19pbmZvIF9faW5pdGRhdGEgPSB7CiAJLyogbm8gY29ubmVjdCBHUElPOyBjb3JnaSBjYW4ndCB0ZWxsIGNvbm5lY3Rpb24gc3RhdHVzICovCi0JLnVkY19jb21tYW5kCQk9IGNvcmdpX3VkY19jb21tYW5kLAorCS5ncGlvX3B1bGx1cAkJPSBDT1JHSV9HUElPX1VTQl9QVUxMVVAsCiB9OwogCiAKQEAgLTM1MCw3ICszMzgsNiBAQAogCWNvcmdpX3NzcF9zZXRfbWFjaGluZm8oJmNvcmdpX3NzcF9tYWNoaW5mbyk7CiAKIAlweGFfZ3Bpb19tb2RlKENPUkdJX0dQSU9fSVJfT04gfCBHUElPX09VVCk7Ci0JcHhhX2dwaW9fbW9kZShDT1JHSV9HUElPX1VTQl9QVUxMVVAgfCBHUElPX09VVCk7CiAJcHhhX2dwaW9fbW9kZShDT1JHSV9HUElPX0hTWU5DIHwgR1BJT19JTik7CiAKICAJcHhhX3NldF91ZGNfaW5mbygmdWRjX2luZm8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL3VzYi5jCmluZGV4IDliODE1MzIuLjdlODA5NjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtb21hcC91c2IuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvdXNiLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC91c2Jfb3RnLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9tbS90bGIuYyBiL2FyY2gvYXZyMzIvbW0vdGxiLmMKaW5kZXggNWQwNTIzYi4uN2IwNzMwNSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tbS90bGIuYworKysgYi9hcmNoL2F2cjMyL21tL3RsYi5jCkBAIC0xNSw3ICsxNSw4IEBACiAKIHZvaWQgc2hvd19kdGxiX2VudHJ5KHVuc2lnbmVkIGludCBpbmRleCkKIHsKLQl1bnNpZ25lZCBpbnQgdGxiZWhpLCB0bGJlaGlfc2F2ZSwgdGxiZWxvLCBtbXVjciwgbW11Y3Jfc2F2ZSwgZmxhZ3M7CisJdW5zaWduZWQgaW50IHRsYmVoaSwgdGxiZWhpX3NhdmUsIHRsYmVsbywgbW11Y3IsIG1tdWNyX3NhdmU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAltbXVjcl9zYXZlID0gc3lzcmVnX3JlYWQoTU1VQ1IpOwpAQCAtMzA1LDcgKzMwNiw4IEBACiAKIHN0YXRpYyBpbnQgdGxiX3Nob3coc3RydWN0IHNlcV9maWxlICp0bGIsIHZvaWQgKnYpCiB7Ci0JdW5zaWduZWQgaW50IHRsYmVoaSwgdGxiZWhpX3NhdmUsIHRsYmVsbywgbW11Y3IsIG1tdWNyX3NhdmUsIGZsYWdzOworCXVuc2lnbmVkIGludCB0bGJlaGksIHRsYmVoaV9zYXZlLCB0bGJlbG8sIG1tdWNyLCBtbXVjcl9zYXZlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyAqaW5kZXggPSB2OwogCiAJaWYgKCppbmRleCA9PSAwKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L0tjb25maWcgYi9hcmNoL2kzODYvS2NvbmZpZwppbmRleCA2MTg5YjBjLi4zZmQyZjI1IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvS2NvbmZpZworKysgYi9hcmNoL2kzODYvS2NvbmZpZwpAQCAtMTY2LDcgKzE2Niw2IEBACiAKIGNvbmZpZyBYODZfR0VORVJJQ0FSQ0gKICAgICAgICBib29sICJHZW5lcmljIGFyY2hpdGVjdHVyZSAoU3VtbWl0LCBiaWdzbXAsIEVTNzAwMCwgZGVmYXVsdCkiCi0gICAgICAgZGVwZW5kcyBvbiBTTVAKICAgICAgICBoZWxwCiAgICAgICAgICAgVGhpcyBvcHRpb24gY29tcGlsZXMgaW4gdGhlIFN1bW1pdCwgYmlnc21wLCBFUzcwMDAsIGRlZmF1bHQgc3ViYXJjaGl0ZWN0dXJlcy4KIAkgIEl0IGlzIGludGVuZGVkIGZvciBhIGdlbmVyaWMgYmluYXJ5IGtlcm5lbC4KQEAgLTI2Myw3ICsyNjIsNyBAQAogCiBjb25maWcgWDg2X1VQX0FQSUMKIAlib29sICJMb2NhbCBBUElDIHN1cHBvcnQgb24gdW5pcHJvY2Vzc29ycyIKLQlkZXBlbmRzIG9uICFTTVAgJiYgIShYODZfVklTV1MgfHwgWDg2X1ZPWUFHRVIpCisJZGVwZW5kcyBvbiAhU01QICYmICEoWDg2X1ZJU1dTIHx8IFg4Nl9WT1lBR0VSIHx8IFg4Nl9HRU5FUklDQVJDSCkKIAloZWxwCiAJICBBIGxvY2FsIEFQSUMgKEFkdmFuY2VkIFByb2dyYW1tYWJsZSBJbnRlcnJ1cHQgQ29udHJvbGxlcikgaXMgYW4KIAkgIGludGVncmF0ZWQgaW50ZXJydXB0IGNvbnRyb2xsZXIgaW4gdGhlIENQVS4gSWYgeW91IGhhdmUgYSBzaW5nbGUtQ1BVCkBAIC0yODgsMTIgKzI4NywxMiBAQAogCiBjb25maWcgWDg2X0xPQ0FMX0FQSUMKIAlib29sCi0JZGVwZW5kcyBvbiBYODZfVVBfQVBJQyB8fCAoKFg4Nl9WSVNXUyB8fCBTTVApICYmICFYODZfVk9ZQUdFUikKKwlkZXBlbmRzIG9uIFg4Nl9VUF9BUElDIHx8ICgoWDg2X1ZJU1dTIHx8IFNNUCkgJiYgIVg4Nl9WT1lBR0VSKSB8fCBYODZfR0VORVJJQ0FSQ0gKIAlkZWZhdWx0IHkKIAogY29uZmlnIFg4Nl9JT19BUElDCiAJYm9vbAotCWRlcGVuZHMgb24gWDg2X1VQX0lPQVBJQyB8fCAoU01QICYmICEoWDg2X1ZJU1dTIHx8IFg4Nl9WT1lBR0VSKSkKKwlkZXBlbmRzIG9uIFg4Nl9VUF9JT0FQSUMgfHwgKFNNUCAmJiAhKFg4Nl9WSVNXUyB8fCBYODZfVk9ZQUdFUikpIHx8IFg4Nl9HRU5FUklDQVJDSAogCWRlZmF1bHQgeQogCiBjb25maWcgWDg2X1ZJU1dTX0FQSUMKQEAgLTQwMiw2ICs0MDEsNyBAQAogCiBjb25maWcgTUlDUk9DT0RFCiAJdHJpc3RhdGUgIi9kZXYvY3B1L21pY3JvY29kZSAtIEludGVsIElBMzIgQ1BVIG1pY3JvY29kZSBzdXBwb3J0IgorCXNlbGVjdCBGV19MT0FERVIKIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSBhbmQgYWxzbyB0byAiL2RldiBmaWxlIHN5c3RlbSBzdXBwb3J0IiBpbiB0aGUKIAkgICdGaWxlIHN5c3RlbXMnIHNlY3Rpb24sIHlvdSB3aWxsIGJlIGFibGUgdG8gdXBkYXRlIHRoZSBtaWNyb2NvZGUgb24KQEAgLTQxNyw2ICs0MTcsMTEgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1pY3JvY29kZS4KIAorY29uZmlnIE1JQ1JPQ09ERV9PTERfSU5URVJGQUNFCisJYm9vbAorCWRlcGVuZHMgb24gTUlDUk9DT0RFCisJZGVmYXVsdCB5CisKIGNvbmZpZyBYODZfTVNSCiAJdHJpc3RhdGUgIi9kZXYvY3B1LyovbXNyIC0gTW9kZWwtc3BlY2lmaWMgcmVnaXN0ZXIgc3VwcG9ydCIKIAloZWxwCkBAIC01OTksMTIgKzYwNCwxMCBAQAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIEFSQ0hfU1BBUlNFTUVNX0VOQUJMRQogCi1zb3VyY2UgIm1tL0tjb25maWciCitjb25maWcgQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAKKwlkZWZfYm9vbCB5CiAKLWNvbmZpZyBIQVZFX0FSQ0hfRUFSTFlfUEZOX1RPX05JRAotCWJvb2wKLQlkZWZhdWx0IHkKLQlkZXBlbmRzIG9uIE5VTUEKK3NvdXJjZSAibW0vS2NvbmZpZyIKIAogY29uZmlnIEhJR0hQVEUKIAlib29sICJBbGxvY2F0ZSAzcmQtbGV2ZWwgcGFnZXRhYmxlcyBmcm9tIGhpZ2htZW0iCkBAIC03NDEsOCArNzQ0LDcgQEAKIHNvdXJjZSBrZXJuZWwvS2NvbmZpZy5oegogCiBjb25maWcgS0VYRUMKLQlib29sICJrZXhlYyBzeXN0ZW0gY2FsbCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWJvb2wgImtleGVjIHN5c3RlbSBjYWxsIgogCWhlbHAKIAkgIGtleGVjIGlzIGEgc3lzdGVtIGNhbGwgdGhhdCBpbXBsZW1lbnRzIHRoZSBhYmlsaXR5IHRvIHNodXRkb3duIHlvdXIKIAkgIGN1cnJlbnQga2VybmVsLCBhbmQgdG8gc3RhcnQgYW5vdGhlciBrZXJuZWwuICBJdCBpcyBsaWtlIGEgcmVib290CkBAIC03NjMsNiArNzY1LDEzIEBACiAJZGVwZW5kcyBvbiBISUdITUVNCiAJaGVscAogCSAgR2VuZXJhdGUgY3Jhc2ggZHVtcCBhZnRlciBiZWluZyBzdGFydGVkIGJ5IGtleGVjLgorICAgICAgICAgIFRoaXMgc2hvdWxkIGJlIG5vcm1hbGx5IG9ubHkgc2V0IGluIHNwZWNpYWwgY3Jhc2ggZHVtcCBrZXJuZWxzCisJICB3aGljaCBhcmUgbG9hZGVkIGluIHRoZSBtYWluIGtlcm5lbCB3aXRoIGtleGVjLXRvb2xzIGludG8KKwkgIGEgc3BlY2lhbGx5IHJlc2VydmVkIHJlZ2lvbiBhbmQgdGhlbiBsYXRlciBleGVjdXRlZCBhZnRlcgorCSAgYSBjcmFzaCBieSBrZHVtcC9rZXhlYy4gVGhlIGNyYXNoIGR1bXAga2VybmVsIG11c3QgYmUgY29tcGlsZWQKKyAgICAgICAgICB0byBhIG1lbW9yeSBhZGRyZXNzIG5vdCB1c2VkIGJ5IHRoZSBtYWluIGtlcm5lbCBvciBCSU9TIHVzaW5nCisgICAgICAgICAgUEhZU0lDQUxfU1RBUlQuCisJICBGb3IgbW9yZSBkZXRhaWxzIHNlZSBEb2N1bWVudGF0aW9uL2tkdW1wL2tkdW1wLnR4dAogCiBjb25maWcgUEhZU0lDQUxfU1RBUlQKIAloZXggIlBoeXNpY2FsIGFkZHJlc3Mgd2hlcmUgdGhlIGtlcm5lbCBpcyBsb2FkZWQiIGlmIChFTUJFRERFRCB8fCBDUkFTSF9EVU1QKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L01ha2VmaWxlIGIvYXJjaC9pMzg2L01ha2VmaWxlCmluZGV4IDNlNGFkYjEuLjdjYzBiMTggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9NYWtlZmlsZQorKysgYi9hcmNoL2kzODYvTWFrZWZpbGUKQEAgLTQ2LDYgKzQ2LDE0IEBACiAjIGEgbG90IG1vcmUgc3RhY2sgZHVlIHRvIHRoZSBsYWNrIG9mIHNoYXJpbmcgb2Ygc3RhY2tsb3RzOgogQ0ZMQUdTCQkJCSs9ICQoc2hlbGwgaWYgWyAkKGNhbGwgY2MtdmVyc2lvbikgLWx0IDA0MDAgXSA7IHRoZW4gZWNobyAkKGNhbGwgY2Mtb3B0aW9uLC1mbm8tdW5pdC1hdC1hLXRpbWUpOyBmaSA7KQogCisjIGRvIGJpbnV0aWxzIHN1cHBvcnQgQ0ZJPworY2ZsYWdzLXkgKz0gJChjYWxsIGFzLWluc3RyLC5jZmlfc3RhcnRwcm9jXG4uY2ZpX2VuZHByb2MsLURDT05GSUdfQVNfQ0ZJPTEsKQorQUZMQUdTICs9ICQoY2FsbCBhcy1pbnN0ciwuY2ZpX3N0YXJ0cHJvY1xuLmNmaV9lbmRwcm9jLC1EQ09ORklHX0FTX0NGST0xLCkKKworIyBpcyAuY2ZpX3NpZ25hbF9mcmFtZSBzdXBwb3J0ZWQgdG9vPworY2ZsYWdzLXkgKz0gJChjYWxsIGFzLWluc3RyLC5jZmlfc3RhcnRwcm9jXG4uY2ZpX2VuZHByb2MsLURDT05GSUdfQVNfQ0ZJPTEsKQorQUZMQUdTICs9ICQoY2FsbCBhcy1pbnN0ciwuY2ZpX3N0YXJ0cHJvY1xuLmNmaV9lbmRwcm9jLC1EQ09ORklHX0FTX0NGST0xLCkKKwogQ0ZMQUdTICs9ICQoY2ZsYWdzLXkpCiAKICMgRGVmYXVsdCBzdWJhcmNoIC5jIGZpbGVzCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC9lZGQuUyBiL2FyY2gvaTM4Ni9ib290L2VkZC5TCmluZGV4IDRiODRlYTIuLjM0MzIxMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9ib290L2VkZC5TCisrKyBiL2FyY2gvaTM4Ni9ib290L2VkZC5TCkBAIC0xNSw0MiArMTUsOTUgQEAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX0VERCkgfHwgZGVmaW5lZChDT05GSUdfRUREX01PRFVMRSkKKworIyBJdCBpcyBhc3N1bWVkIHRoYXQgJWRzID09IElOSVRTRUcgaGVyZQorCiAJbW92YgkkMCwgKEVERF9NQlJfU0lHX05SX0JVRikKIAltb3ZiCSQwLCAoRURETlIpCiAKLSMgQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBmb3IgdHdvIG9wdGlvbnM6CisjIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgZm9yIG9wdGlvbnM6CiAjIGVkZD1vZiAgZGlzYWJsZXMgRUREIGNvbXBsZXRlbHkgIChlZGQ9b2ZmKQogIyBlZGQ9c2sgIHNraXBzIHRoZSBNQlIgdGVzdCAgICAoZWRkPXNraXBtYnIpCisjIGVkZD1vbiAgcmUtZW5hYmxlcyBFREQgKGVkZD1vbikKKwogCXB1c2hsCSVlc2kKLSAgICAJY21wbAkkMCwgJWNzOmNtZF9saW5lX3B0cgotCWp6CWRvbmVfY2wKKwltb3Z3CSRlZGRfbWJyX3NpZ19zdGFydCwgJWRpCSMgRGVmYXVsdCB0byBlZGQ9b24KKwogCW1vdmwJJWNzOihjbWRfbGluZV9wdHIpLCAlZXNpCi0jIGRzOmVzaSBoYXMgdGhlIHBvaW50ZXIgdG8gdGhlIGNvbW1hbmQgbGluZSBub3cKLQltb3ZsCSQoQ09NTUFORF9MSU5FX1NJWkUtNyksICVlY3gKLSMgbG9vcCB0aHJvdWdoIGtlcm5lbCBjb21tYW5kIGxpbmUgb25lIGJ5dGUgYXQgYSB0aW1lCi1jbF9sb29wOgotCWNtcGwJJEVERF9DTF9FUVVBTFMsICglc2kpCisJYW5kbAklZXNpLCAlZXNpCisJanoJb2xkX2NsCQkJIyBPbGQgYm9vdCBwcm90b2NvbD8KKworIyBDb252ZXJ0IHRvIGEgcmVhbC1tb2RlIHBvaW50ZXIgaW4gZnM6c2kKKwltb3ZsCSVlc2ksICVlYXgKKwlzaHJsCSQ0LCAlZWF4CisJbW92dwklYXgsICVmcworCWFuZHcJJDB4ZiwgJXNpCisJam1wCWhhdmVfY2xfcG9pbnRlcgorCisjIE9sZC1zdHlsZSBib290IHByb3RvY29sPworb2xkX2NsOgorCXB1c2gJJWRzCQkJIyBha2EgSU5JVFNFRworCXBvcAklZnMKKworCWNtcHcJJDB4YTMzZiwgKDB4MjApCisJam5lCWRvbmVfY2wJCQkjIE5vIGNvbW1hbmQgbGluZSBhdCBhbGw/CisJbW92dwkoMHgyMiksICVzaQkJIyBQb2ludGVyIHJlbGF0aXZlIHRvIElOSVRTRUcKKworIyBmczpzaSBoYXMgdGhlIHBvaW50ZXIgdG8gdGhlIGNvbW1hbmQgbGluZSBub3cKK2hhdmVfY2xfcG9pbnRlcjoKKworIyBMb29wIHRocm91Z2gga2VybmVsIGNvbW1hbmQgbGluZSBvbmUgYnl0ZSBhdCBhIHRpbWUuICBKdXN0IGluCisjIGNhc2UgdGhlIGxvYWRlciBpcyBidWdneSBhbmQgZmFpbGVkIHRvIG51bGwtdGVybWluYXRlIHRoZSBjb21tYW5kIGxpbmUKKyMgdGVybWluYXRlIGlmIHdlIGdldCBjbG9zZSBlbm91Z2ggdG8gdGhlIGVuZCBvZiB0aGUgc2VnbWVudCB0aGF0IHdlCisjIGNhbm5vdCBmaXQgImVkZD1YWCIuLi4KK2NsX2F0c3BhY2U6CisJY21wdwkkLTUsICVzaQkJIyBXYXRjaCBmb3Igc2VnbWVudCB3cmFwYXJvdW5kCisJamFlCWRvbmVfY2wKKwltb3ZsCSVmczooJXNpKSwgJWVheAorCWFuZGIJJWFsLCAlYWwJCSMgRW5kIG9mIGxpbmU/CisJanoJZG9uZV9jbAorCWNtcGwJJEVERF9DTF9FUVVBTFMsICVlYXgKIAlqeglmb3VuZF9lZGRfZXF1YWxzCi0JaW5jbAklZXNpCi0JbG9vcAljbF9sb29wCi0Jam1wCWRvbmVfY2wKKwljbXBiCSQweDIwLCAlYWwJCSMgPD0gc3BhY2UgY29uc2lkZXIgd2hpdGVzcGFjZQorCWphCWNsX3NraXB3b3JkCisJaW5jdwklc2kKKwlqbXAJY2xfYXRzcGFjZQorCitjbF9za2lwd29yZDoKKwljbXB3CSQtNSwgJXNpCQkjIFdhdGNoIGZvciBzZWdtZW50IHdyYXBhcm91bmQKKwlqYWUJZG9uZV9jbAorCW1vdmIJJWZzOiglc2kpLCAlYWwJCSMgRW5kIG9mIHN0cmluZz8KKwlhbmRiCSVhbCwgJWFsCisJanoJZG9uZV9jbAorCWNtcGIJJDB4MjAsICVhbAorCWpiZQljbF9hdHNwYWNlCisJaW5jdwklc2kKKwlqbXAJY2xfc2tpcHdvcmQKKwogZm91bmRfZWRkX2VxdWFsczoKICMgb25seSBsb29raW5nIGF0IGZpcnN0IHR3byBjaGFyYWN0ZXJzIGFmdGVyIGVxdWFscwotICAgIAlhZGRsCSQ0LCAlZXNpCi0JY21wdwkkRUREX0NMX09GRiwgKCVzaSkJIyBlZGQ9b2YKLQlqeglkb19lZGRfb2ZmCi0JY21wdwkkRUREX0NMX1NLSVAsICglc2kpCSMgZWRkPXNrCi0JanoJZG9fZWRkX3NraXBtYnIKLQlqbXAJZG9uZV9jbAorIyBsYXRlIG92ZXJyaWRlcyBlYXJseSBvbiB0aGUgY29tbWFuZCBsaW5lLCBzbyBrZWVwIGdvaW5nIGFmdGVyIGZpbmRpbmcgc29tZXRoaW5nCisJbW92dwklZnM6NCglc2kpLCAlYXgKKwljbXB3CSRFRERfQ0xfT0ZGLCAlYXgJIyBlZGQ9b2YKKwlqZQlkb19lZGRfb2ZmCisJY21wdwkkRUREX0NMX1NLSVAsICVheAkjIGVkZD1zaworCWplCWRvX2VkZF9za2lwbWJyCisJY21wdwkkRUREX0NMX09OLCAlYXgJCSMgZWRkPW9uCisJamUJZG9fZWRkX29uCisJam1wCWNsX3NraXB3b3JkCiBkb19lZGRfc2tpcG1icjoKLSAgICAJcG9wbAklZXNpCi0Jam1wCWVkZF9zdGFydAorCW1vdncJJGVkZF9zdGFydCwgJWRpCisJam1wCWNsX3NraXB3b3JkCiBkb19lZGRfb2ZmOgotCXBvcGwJJWVzaQotCWptcAllZGRfZG9uZQorCW1vdncJJGVkZF9kb25lLCAlZGkKKwlqbXAJY2xfc2tpcHdvcmQKK2RvX2VkZF9vbjoKKwltb3Z3CSRlZGRfbWJyX3NpZ19zdGFydCwgJWRpCisJam1wCWNsX3NraXB3b3JkCisKIGRvbmVfY2w6CiAJcG9wbAklZXNpCi0KKwlqbXB3CSolZGkKIAogIyBSZWFkIHRoZSBmaXJzdCBzZWN0b3Igb2YgZWFjaCBCSU9TIGRpc2sgZGV2aWNlIGFuZCBzdG9yZSB0aGUgNC1ieXRlIHNpZ25hdHVyZQogZWRkX21icl9zaWdfc3RhcnQ6CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvYm9vdC9zZXR1cC5TIGIvYXJjaC9pMzg2L2Jvb3Qvc2V0dXAuUwppbmRleCBkMmI2ODRjLi4zYWVjNDUzOCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2Jvb3Qvc2V0dXAuUworKysgYi9hcmNoL2kzODYvYm9vdC9zZXR1cC5TCkBAIC00OTQsMTIgKzQ5NCwxMiBAQAogCW1vdncJJWNzLCAlYXgJCQkjIGFrYSBTRVRVUFNFRwogCXN1YncJJERFTFRBX0lOSVRTRUcsICVheAkJIyBha2EgSU5JVFNFRwogCW1vdncJJWF4LCAlZHMKLQltb3Z3CSQwLCAoMHgxZmYpCQkJIyBkZWZhdWx0IGlzIG5vIHBvaW50aW5nIGRldmljZQorCW1vdmIJJDAsICgweDFmZikJCQkjIGRlZmF1bHQgaXMgbm8gcG9pbnRpbmcgZGV2aWNlCiAJaW50CSQweDExCQkJCSMgaW50IDB4MTE6IGVxdWlwbWVudCBsaXN0CiAJdGVzdGIJJDB4MDQsICVhbAkJCSMgY2hlY2sgaWYgbW91c2UgaW5zdGFsbGVkCiAJanoJbm9fcHNtb3VzZQogCi0JbW92dwkkMHhBQSwgKDB4MWZmKQkJCSMgZGV2aWNlIHByZXNlbnQKKwltb3ZiCSQweEFBLCAoMHgxZmYpCQkJIyBkZXZpY2UgcHJlc2VudAogbm9fcHNtb3VzZToKIAogI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9TUEVFRFNURVBfU01JKSB8fCBkZWZpbmVkKENPTkZJR19YODZfU1BFRURTVEVQX1NNSV9NT0RVTEUpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvZGVmY29uZmlnIGIvYXJjaC9pMzg2L2RlZmNvbmZpZwppbmRleCA4OWViYjdhLi4xYTI5YmZhIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvZGVmY29uZmlnCisrKyBiL2FyY2gvaTM4Ni9kZWZjb25maWcKQEAgLTEsNDEgKzEsNTEgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOC1naXQ1CisjIFR1ZSBTZXAgMjYgMDk6MzA6NDcgMjAwNgogIwogQ09ORklHX1g4Nl8zMj15CitDT05GSUdfR0VORVJJQ19USU1FPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorQ09ORklHX1NUQUNLVFJBQ0VfU1VQUE9SVD15CiBDT05GSUdfU0VNQVBIT1JFX1NMRUVQRVJTPXkKIENPTkZJR19YODY9eQogQ09ORklHX01NVT15CiBDT05GSUdfR0VORVJJQ19JU0FfRE1BPXkKIENPTkZJR19HRU5FUklDX0lPTUFQPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0FSQ0hfTUFZX0hBVkVfUENfRkRDPXkKIENPTkZJR19ETUk9eQorQ09ORklHX0RFRkNPTkZJR19MSVNUPSIvbGliL21vZHVsZXMvJFVOQU1FX1JFTEVBU0UvLmNvbmZpZyIKIAogIwogIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKICMKIENPTkZJR19FWFBFUklNRU5UQUw9eQotQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKIENPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIAogIwogIyBHZW5lcmFsIHNldHVwCiAjCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCi0jIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQogQ09ORklHX1NXQVA9eQogQ09ORklHX1NZU1ZJUEM9eQotIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKK0NPTkZJR19QT1NJWF9NUVVFVUU9eQogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX1RBU0tTVEFUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQorIyBDT05GSUdfQ1BVU0VUUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgotQ09ORklHX1VJRDE2PXkKLUNPTkZJR19WTTg2PXkKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1NZU0NUTD15CiBDT05GSUdfS0FMTFNZTVM9eQorQ09ORklHX0tBTExTWU1TX0FMTD15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKIENPTkZJR19IT1RQTFVHPXkKIENPTkZJR19QUklOVEs9eQpAQCAtNDUsMTEgKzU1LDkgQEAKIENPTkZJR19GVVRFWD15CiBDT05GSUdfRVBPTEw9eQogQ09ORklHX1NITUVNPXkKLUNPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAotQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCi1DT05GSUdfQ0NfQUxJR05fTE9PUFM9MAotQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKIENPTkZJR19TTEFCPXkKK0NPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CitDT05GSUdfUlRfTVVURVhFUz15CiAjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKIENPTkZJR19CQVNFX1NNQUxMPTAKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldApAQCAtNjAsNDEgKzY4LDQ1IEBACiBDT05GSUdfTU9EVUxFUz15CiBDT05GSUdfTU9EVUxFX1VOTE9BRD15CiBDT05GSUdfTU9EVUxFX0ZPUkNFX1VOTE9BRD15Ci1DT05GSUdfT0JTT0xFVEVfTU9EUEFSTT15CiAjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogIyBDT05GSUdfS01PRCBpcyBub3Qgc2V0CitDT05GSUdfU1RPUF9NQUNISU5FPXkKIAogIwogIyBCbG9jayBsYXllcgogIwotIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKK0NPTkZJR19MQkQ9eQorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAogCiAjCiAjIElPIFNjaGVkdWxlcnMKICMKIENPTkZJR19JT1NDSEVEX05PT1A9eQotIyBDT05GSUdfSU9TQ0hFRF9BUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JT1NDSEVEX0RFQURMSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKIENPTkZJR19JT1NDSEVEX0NGUT15Ci0jIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0FTPXkKICMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfQ0ZRPXkKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFRkFVTFRfTk9PUCBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQVVMVF9JT1NDSEVEPSJjZnEiCitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJhbnRpY2lwYXRvcnkiCiAKICMKICMgUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzCiAjCi1DT05GSUdfWDg2X1BDPXkKK0NPTkZJR19TTVA9eQorIyBDT05GSUdfWDg2X1BDIGlzIG5vdCBzZXQKICMgQ09ORklHX1g4Nl9FTEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX1g4Nl9WT1lBR0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1g4Nl9OVU1BUSBpcyBub3Qgc2V0CiAjIENPTkZJR19YODZfU1VNTUlUIGlzIG5vdCBzZXQKICMgQ09ORklHX1g4Nl9CSUdTTVAgaXMgbm90IHNldAogIyBDT05GSUdfWDg2X1ZJU1dTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1g4Nl9HRU5FUklDQVJDSCBpcyBub3Qgc2V0CitDT05GSUdfWDg2X0dFTkVSSUNBUkNIPXkKICMgQ09ORklHX1g4Nl9FUzcwMDAgaXMgbm90IHNldAorQ09ORklHX1g4Nl9DWUNMT05FX1RJTUVSPXkKICMgQ09ORklHX00zODYgaXMgbm90IHNldAogIyBDT05GSUdfTTQ4NiBpcyBub3Qgc2V0CiAjIENPTkZJR19NNTg2IGlzIG5vdCBzZXQKQEAgLTEwMiwxMSArMTE0LDExIEBACiAjIENPTkZJR19NNTg2TU1YIGlzIG5vdCBzZXQKICMgQ09ORklHX002ODYgaXMgbm90IHNldAogIyBDT05GSUdfTVBFTlRJVU1JSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NUEVOVElVTUlJSSBpcyBub3Qgc2V0CitDT05GSUdfTVBFTlRJVU1JSUk9eQogIyBDT05GSUdfTVBFTlRJVU1NIGlzIG5vdCBzZXQKICMgQ09ORklHX01QRU5USVVNNCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSzYgaXMgbm90IHNldAotQ09ORklHX01LNz15CisjIENPTkZJR19NSzcgaXMgbm90IHNldAogIyBDT05GSUdfTUs4IGlzIG5vdCBzZXQKICMgQ09ORklHX01DUlVTT0UgaXMgbm90IHNldAogIyBDT05GSUdfTUVGRklDRU9OIGlzIG5vdCBzZXQKQEAgLTExNywxMCArMTI5LDEwIEBACiAjIENPTkZJR19NR0VPREVfTFggaXMgbm90IHNldAogIyBDT05GSUdfTUNZUklYSUlJIGlzIG5vdCBzZXQKICMgQ09ORklHX01WSUFDM18yIGlzIG5vdCBzZXQKLSMgQ09ORklHX1g4Nl9HRU5FUklDIGlzIG5vdCBzZXQKK0NPTkZJR19YODZfR0VORVJJQz15CiBDT05GSUdfWDg2X0NNUFhDSEc9eQogQ09ORklHX1g4Nl9YQUREPXkKLUNPTkZJR19YODZfTDFfQ0FDSEVfU0hJRlQ9NgorQ09ORklHX1g4Nl9MMV9DQUNIRV9TSElGVD03CiBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19YODZfV1BfV09SS1NfT0s9eQpAQCAtMTMxLDI2ICsxNDMsMjggQEAKIENPTkZJR19YODZfR09PRF9BUElDPXkKIENPTkZJR19YODZfSU5URUxfVVNFUkNPUFk9eQogQ09ORklHX1g4Nl9VU0VfUFBST19DSEVDS1NVTT15Ci1DT05GSUdfWDg2X1VTRV8zRE5PVz15CiBDT05GSUdfWDg2X1RTQz15Ci0jIENPTkZJR19IUEVUX1RJTUVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NNUCBpcyBub3Qgc2V0Ci1DT05GSUdfUFJFRU1QVF9OT05FPXkKLSMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKK0NPTkZJR19IUEVUX1RJTUVSPXkKK0NPTkZJR19IUEVUX0VNVUxBVEVfUlRDPXkKK0NPTkZJR19OUl9DUFVTPTMyCitDT05GSUdfU0NIRURfU01UPXkKK0NPTkZJR19TQ0hFRF9NQz15CisjIENPTkZJR19QUkVFTVBUX05PTkUgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZPXkKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAotQ09ORklHX1g4Nl9VUF9BUElDPXkKLUNPTkZJR19YODZfVVBfSU9BUElDPXkKK0NPTkZJR19QUkVFTVBUX0JLTD15CiBDT05GSUdfWDg2X0xPQ0FMX0FQSUM9eQogQ09ORklHX1g4Nl9JT19BUElDPXkKIENPTkZJR19YODZfTUNFPXkKIENPTkZJR19YODZfTUNFX05PTkZBVEFMPXkKLSMgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMIGlzIG5vdCBzZXQKK0NPTkZJR19YODZfTUNFX1A0VEhFUk1BTD15CitDT05GSUdfVk04Nj15CiAjIENPTkZJR19UT1NISUJBIGlzIG5vdCBzZXQKICMgQ09ORklHX0k4SyBpcyBub3Qgc2V0CiAjIENPTkZJR19YODZfUkVCT09URklYVVBTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JQ1JPQ09ERSBpcyBub3Qgc2V0Ci0jIENPTkZJR19YODZfTVNSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1g4Nl9DUFVJRCBpcyBub3Qgc2V0CitDT05GSUdfTUlDUk9DT0RFPXkKK0NPTkZJR19YODZfTVNSPXkKK0NPTkZJR19YODZfQ1BVSUQ9eQogCiAjCiAjIEZpcm13YXJlIERyaXZlcnMKQEAgLTE1OCw2OCArMTcyLDY3IEBACiAjIENPTkZJR19FREQgaXMgbm90IHNldAogIyBDT05GSUdfREVMTF9SQlUgaXMgbm90IHNldAogIyBDT05GSUdfRENEQkFTIGlzIG5vdCBzZXQKLUNPTkZJR19OT0hJR0hNRU09eQotIyBDT05GSUdfSElHSE1FTTRHIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PSElHSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfSElHSE1FTTRHPXkKICMgQ09ORklHX0hJR0hNRU02NEcgaXMgbm90IHNldAotQ09ORklHX1ZNU1BMSVRfM0c9eQotIyBDT05GSUdfVk1TUExJVF8zR19PUFQgaXMgbm90IHNldAotIyBDT05GSUdfVk1TUExJVF8yRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTVNQTElUXzFHIGlzIG5vdCBzZXQKIENPTkZJR19QQUdFX09GRlNFVD0weEMwMDAwMDAwCi1DT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15Ci1DT05GSUdfQVJDSF9TUEFSU0VNRU1fRU5BQkxFPXkKLUNPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0hJR0hNRU09eQogQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQogQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKICMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAogIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CiBDT05GSUdfRkxBVE1FTT15CiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotQ09ORklHX1NQQVJTRU1FTV9TVEFUSUM9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorQ09ORklHX1JFU09VUkNFU182NEJJVD15CisjIENPTkZJR19ISUdIUFRFIGlzIG5vdCBzZXQKICMgQ09ORklHX01BVEhfRU1VTEFUSU9OIGlzIG5vdCBzZXQKIENPTkZJR19NVFJSPXkKICMgQ09ORklHX0VGSSBpcyBub3Qgc2V0CisjIENPTkZJR19JUlFCQUxBTkNFIGlzIG5vdCBzZXQKIENPTkZJR19SRUdQQVJNPXkKLSMgQ09ORklHX1NFQ0NPTVAgaXMgbm90IHNldAotQ09ORklHX0haXzEwMD15Ci0jIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAorQ09ORklHX1NFQ0NPTVA9eQorIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8yNTA9eQogIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0Ci1DT05GSUdfSFo9MTAwCitDT05GSUdfSFo9MjUwCiAjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFTSF9EVU1QIGlzIG5vdCBzZXQKIENPTkZJR19QSFlTSUNBTF9TVEFSVD0weDEwMDAwMAotQ09ORklHX0RPVUJMRUZBVUxUPXkKKyMgQ09ORklHX0hPVFBMVUdfQ1BVIGlzIG5vdCBzZXQKK0NPTkZJR19DT01QQVRfVkRTTz15CitDT05GSUdfQVJDSF9FTkFCTEVfTUVNT1JZX0hPVFBMVUc9eQogCiAjCiAjIFBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyAoQUNQSSwgQVBNKQogIwogQ09ORklHX1BNPXkKLSMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CitDT05GSUdfUE1fTEVHQUNZPXkKICMgQ09ORklHX1BNX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19TT0ZUV0FSRV9TVVNQRU5EPXkKLUNPTkZJR19QTV9TVERfUEFSVElUSU9OPSIiCiAKICMKICMgQUNQSSAoQWR2YW5jZWQgQ29uZmlndXJhdGlvbiBhbmQgUG93ZXIgSW50ZXJmYWNlKSBTdXBwb3J0CiAjCiBDT05GSUdfQUNQST15Ci0jIENPTkZJR19BQ1BJX1NMRUVQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FDUElfQUMgaXMgbm90IHNldAotIyBDT05GSUdfQUNQSV9CQVRURVJZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FDUElfQlVUVE9OIGlzIG5vdCBzZXQKK0NPTkZJR19BQ1BJX0FDPXkKK0NPTkZJR19BQ1BJX0JBVFRFUlk9eQorQ09ORklHX0FDUElfQlVUVE9OPXkKICMgQ09ORklHX0FDUElfVklERU8gaXMgbm90IHNldAogIyBDT05GSUdfQUNQSV9IT1RLRVkgaXMgbm90IHNldAotIyBDT05GSUdfQUNQSV9GQU4gaXMgbm90IHNldAotIyBDT05GSUdfQUNQSV9QUk9DRVNTT1IgaXMgbm90IHNldAorQ09ORklHX0FDUElfRkFOPXkKKyMgQ09ORklHX0FDUElfRE9DSyBpcyBub3Qgc2V0CitDT05GSUdfQUNQSV9QUk9DRVNTT1I9eQorQ09ORklHX0FDUElfVEhFUk1BTD15CiAjIENPTkZJR19BQ1BJX0FTVVMgaXMgbm90IHNldAogIyBDT05GSUdfQUNQSV9JQk0gaXMgbm90IHNldAogIyBDT05GSUdfQUNQSV9UT1NISUJBIGlzIG5vdCBzZXQKLUNPTkZJR19BQ1BJX0JMQUNLTElTVF9ZRUFSPTAKLSMgQ09ORklHX0FDUElfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0FDUElfQkxBQ0tMSVNUX1lFQVI9MjAwMQorQ09ORklHX0FDUElfREVCVUc9eQogQ09ORklHX0FDUElfRUM9eQogQ09ORklHX0FDUElfUE9XRVI9eQogQ09ORklHX0FDUElfU1lTVEVNPXkKLSMgQ09ORklHX1g4Nl9QTV9USU1FUiBpcyBub3Qgc2V0CitDT05GSUdfWDg2X1BNX1RJTUVSPXkKICMgQ09ORklHX0FDUElfQ09OVEFJTkVSIGlzIG5vdCBzZXQKIAogIwpAQCAtMjMwLDcgKzI0Myw0MSBAQAogIwogIyBDUFUgRnJlcXVlbmN5IHNjYWxpbmcKICMKLSMgQ09ORklHX0NQVV9GUkVRIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUT15CitDT05GSUdfQ1BVX0ZSRVFfVEFCTEU9eQorQ09ORklHX0NQVV9GUkVRX0RFQlVHPXkKK0NPTkZJR19DUFVfRlJFUV9TVEFUPXkKKyMgQ09ORklHX0NQVV9GUkVRX1NUQVRfREVUQUlMUyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfUEVSRk9STUFOQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfREVGQVVMVF9HT1ZfVVNFUlNQQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfRlJFUV9HT1ZfUEVSRk9STUFOQ0U9eQorIyBDT05GSUdfQ1BVX0ZSRVFfR09WX1BPV0VSU0FWRSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0ZSRVFfR09WX1VTRVJTUEFDRT15CitDT05GSUdfQ1BVX0ZSRVFfR09WX09OREVNQU5EPXkKKyMgQ09ORklHX0NQVV9GUkVRX0dPVl9DT05TRVJWQVRJVkUgaXMgbm90IHNldAorCisjCisjIENQVUZyZXEgcHJvY2Vzc29yIGRyaXZlcnMKKyMKK0NPTkZJR19YODZfQUNQSV9DUFVGUkVRPXkKKyMgQ09ORklHX1g4Nl9QT1dFUk5PV19LNiBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfUE9XRVJOT1dfSzcgaXMgbm90IHNldAorQ09ORklHX1g4Nl9QT1dFUk5PV19LOD15CitDT05GSUdfWDg2X1BPV0VSTk9XX0s4X0FDUEk9eQorIyBDT05GSUdfWDg2X0dYX1NVU1BNT0QgaXMgbm90IHNldAorIyBDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOTyBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfU1BFRURTVEVQX0lDSCBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfU1BFRURTVEVQX1NNSSBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfUDRfQ0xPQ0tNT0QgaXMgbm90IHNldAorIyBDT05GSUdfWDg2X0NQVUZSRVFfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfTE9OR1JVTiBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfTE9OR0hBVUwgaXMgbm90IHNldAorCisjCisjIHNoYXJlZCBvcHRpb25zCisjCitDT05GSUdfWDg2X0FDUElfQ1BVRlJFUV9QUk9DX0lOVEY9eQorIyBDT05GSUdfWDg2X1NQRUVEU1RFUF9MSUIgaXMgbm90IHNldAogCiAjCiAjIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgTUNBLCBJU0EpCkBAIC0yNDQsMTIgKzI5MSwxMyBAQAogQ09ORklHX1BDSV9ESVJFQ1Q9eQogQ09ORklHX1BDSV9NTUNPTkZJRz15CiAjIENPTkZJR19QQ0lFUE9SVEJVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQ0lfTVNJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BDSV9MRUdBQ1lfUFJPQyBpcyBub3Qgc2V0CitDT05GSUdfUENJX01TST15CisjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAogQ09ORklHX0lTQV9ETUFfQVBJPXkKICMgQ09ORklHX0lTQSBpcyBub3Qgc2V0CiAjIENPTkZJR19NQ0EgaXMgbm90IHNldAogIyBDT05GSUdfU0N4MjAwIGlzIG5vdCBzZXQKK0NPTkZJR19LOF9OQj15CiAKICMKICMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydApAQCAtMjc4LDkzICszMjYsNTQgQEAKICMKICMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19QQUNLRVQ9eQotQ09ORklHX1BBQ0tFVF9NTUFQPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKIENPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX1NVQl9QT0xJQ1kgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15Ci0jIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAorQ09ORklHX0lQX01VTFRJQ0FTVD15CiAjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAogQ09ORklHX0lQX0ZJQl9IQVNIPXkKLSMgQ09ORklHX0lQX1BOUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CisjIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX01ST1VURSBpcyBub3Qgc2V0CiAjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0RJQUcgaXMgbm90IHNldAorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQogIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX1RDUF9DT05HX0JJQz15Ci0KLSMKLSMgSVA6IFZpcnR1YWwgU2VydmVyIENvbmZpZ3VyYXRpb24KLSMKLSMgQ09ORklHX0lQX1ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQVjYgaXMgbm90IHNldAotQ09ORklHX05FVEZJTFRFUj15Ci0jIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAotCi0jCi0jIENvcmUgTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KLSMKLSMgQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LIGlzIG5vdCBzZXQKLUNPTkZJR19ORVRGSUxURVJfWFRBQkxFUz15Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTUFSSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX05GUVVFVUUgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTU1FTlQgaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTk5UUkFDSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRENDUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEggaXMgbm90IHNldAotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD15Ci1DT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BQz15Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTUFSSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUkVBTE0gaXMgbm90IHNldAotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NDVFAgaXMgbm90IHNldAotQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFURT15Ci0jIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU1RSSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9UQ1BNU1MgaXMgbm90IHNldAotCi0jCi0jIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgotIwotQ09ORklHX0lQX05GX0NPTk5UUkFDSz15Ci0jIENPTkZJR19JUF9ORl9DVF9BQ0NUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0NPTk5UUkFDS19NQVJLIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX0NPTk5UUkFDS19FVkVOVFMgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfQ1RfUFJPVE9fU0NUUCBpcyBub3Qgc2V0Ci1DT05GSUdfSVBfTkZfRlRQPXkKLSMgQ09ORklHX0lQX05GX0lSQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9ORVRCSU9TX05TIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX1RGVFAgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfQU1BTkRBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX1BQVFAgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfUVVFVUUgaXMgbm90IHNldAotQ09ORklHX0lQX05GX0lQVEFCTEVTPXkKLSMgQ09ORklHX0lQX05GX01BVENIX0lQUkFOR0UgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfTUFUQ0hfTVVMVElQT1JUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX01BVENIX1RPUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9NQVRDSF9SRUNFTlQgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfTUFUQ0hfRUNOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX01BVENIX0RTQ1AgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfTUFUQ0hfQUhfRVNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX01BVENIX1RUTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9NQVRDSF9PV05FUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9NQVRDSF9BRERSVFlQRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9NQVRDSF9IQVNITElNSVQgaXMgbm90IHNldAotQ09ORklHX0lQX05GX0ZJTFRFUj15Ci0jIENPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9ORl9UQVJHRVRfTE9HPXkKLSMgQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX1RBUkdFVF9UQ1BNU1MgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfTkFUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQX05GX01BTkdMRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JUF9ORl9SQVcgaXMgbm90IHNldAotIyBDT05GSUdfSVBfTkZfQVJQVEFCTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19DVUJJQz15CitDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCitDT05GSUdfSVBWNj15CisjIENPTkZJR19JUFY2X1BSSVZBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9ST1VURVJfUFJFRiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfTUlQNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UVU5ORUw9eQorIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1JPVVRFT1BUSU1JWkFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjZfU1VCVFJFRVMgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9NVUxUSVBMRV9UQUJMRVMgaXMgbm90IHNldAorIyBDT05GSUdfTkVUV09SS19TRUNNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVEZJTFRFUiBpcyBub3Qgc2V0CiAKICMKICMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCkBAIC0zODksNyArMzk4LDYgQEAKICMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKICMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAogIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAogCkBAIC00MDIsNiArNDEwLDcgQEAKICMgTmV0d29yayB0ZXN0aW5nCiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9UQ1BQUk9CRSBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKQEAgLTQxNiw3ICs0MjUsOSBAQAogIwogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKK0NPTkZJR19GV19MT0FERVI9eQorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKIAogIwogIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCkBAIC00MzEsMTMgKzQ0Miw3IEBACiAjCiAjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAogIwotQ09ORklHX1BBUlBPUlQ9eQotQ09ORklHX1BBUlBPUlRfUEM9eQotIyBDT05GSUdfUEFSUE9SVF9TRVJJQUwgaXMgbm90IHNldAotIyBDT05GSUdfUEFSUE9SVF9QQ19GSUZPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BBUlBPUlRfUENfU1VQRVJJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQVJQT1JUX0dTQyBpcyBub3Qgc2V0Ci1DT05GSUdfUEFSUE9SVF8xMjg0PXkKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAogCiAjCiAjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydApAQCAtNDQ3LDggKzQ1Miw3IEBACiAjCiAjIEJsb2NrIGRldmljZXMKICMKLSMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAotIyBDT05GSUdfUEFSSURFIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0ZEPXkKICMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKQEAgLTQ1OSw4ICs0NjMsMTEgQEAKICMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKIENPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfUkFNX0JMT0NLU0laRT0xMDI0CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAogCkBAIC00NzYsNyArNDgzLDcgQEAKICMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9IRF9JREUgaXMgbm90IHNldAogQ09ORklHX0JMS19ERVZfSURFRElTSz15Ci0jIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorQ09ORklHX0lERURJU0tfTVVMVElfTU9ERT15CiBDT05GSUdfQkxLX0RFVl9JREVDRD15CiAjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldApAQCAtNDg2LDEwICs0OTMsMTAgQEAKICMKICMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcwogIwotIyBDT05GSUdfSURFX0dFTkVSSUMgaXMgbm90IHNldAorQ09ORklHX0lERV9HRU5FUklDPXkKICMgQ09ORklHX0JMS19ERVZfQ01ENjQwIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lERVBDST15Ci1DT05GSUdfSURFUENJX1NIQVJFX0lSUT15CisjIENPTkZJR19JREVQQ0lfU0hBUkVfSVJRIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfT0ZGQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9HRU5FUklDIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfT1BUSTYyMSBpcyBub3Qgc2V0CkBAIC01MDAsNyArNTA3LDcgQEAKICMgQ09ORklHX0lERURNQV9PTkxZRElTSyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAogIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9BTUQ3NFhYPXkKICMgQ09ORklHX0JMS19ERVZfQVRJSVhQIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfQ01ENjRYIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfVFJJRkxFWCBpcyBub3Qgc2V0CkBAIC01MTEsNyArNTE4LDcgQEAKICMgQ09ORklHX0JMS19ERVZfSFBUMzRYIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfSFBUMzY2IGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfU0MxMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfUElJWCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9QSUlYPXkKICMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CkBAIC01MjEsNyArNTI4LDcgQEAKICMgQ09ORklHX0JMS19ERVZfU0lTNTUxMyBpcyBub3Qgc2V0CiAjIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKICMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKLUNPTkZJR19CTEtfREVWX1ZJQTgyQ1hYWD15CisjIENPTkZJR19CTEtfREVWX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKIENPTkZJR19CTEtfREVWX0lERURNQT15CiAjIENPTkZJR19JREVETUFfSVZCIGlzIG5vdCBzZXQKQEAgLTUzMyw2ICs1NDAsNyBAQAogIwogIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CiBDT05GSUdfU0NTST15CitDT05GSUdfU0NTSV9ORVRMSU5LPXkKICMgQ09ORklHX1NDU0lfUFJPQ19GUyBpcyBub3Qgc2V0CiAKICMKQEAgLTU0MSw4ICs1NDksOSBAQAogQ09ORklHX0JMS19ERVZfU0Q9eQogIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1NSPXkKKyMgQ09ORklHX0JMS19ERVZfU1JfVkVORE9SIGlzIG5vdCBzZXQKK0NPTkZJR19DSFJfREVWX1NHPXkKICMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKIAogIwpAQCAtNTUzLDI5ICs1NjIsNDQgQEAKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CiAKICMKLSMgU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcworIyBTQ1NJIFRyYW5zcG9ydHMKICMKLSMgQ09ORklHX1NDU0lfU1BJX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfRkNfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfU1BJX0FUVFJTPXkKK0NPTkZJR19TQ1NJX0ZDX0FUVFJTPXkKICMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKIAogIwogIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCiAjCiAjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEPXkKICMgQ09ORklHX1NDU0lfM1dfOVhYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0FDQVJEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQUFDUkFJRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzdYWFggaXMgbm90IHNldAorQ09ORklHX1NDU0lfQUlDN1hYWD15CitDT05GSUdfQUlDN1hYWF9DTURTX1BFUl9ERVZJQ0U9MzIKK0NPTkZJR19BSUM3WFhYX1JFU0VUX0RFTEFZX01TPTUwMDAKK0NPTkZJR19BSUM3WFhYX0RFQlVHX0VOQUJMRT15CitDT05GSUdfQUlDN1hYWF9ERUJVR19NQVNLPTAKK0NPTkZJR19BSUM3WFhYX1JFR19QUkVUVFlfUFJJTlQ9eQogIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAorQ09ORklHX1NDU0lfQUlDNzlYWD15CitDT05GSUdfQUlDNzlYWF9DTURTX1BFUl9ERVZJQ0U9MzIKK0NPTkZJR19BSUM3OVhYX1JFU0VUX0RFTEFZX01TPTQwMDAKKyMgQ09ORklHX0FJQzc5WFhfRU5BQkxFX1JEX1NUUk0gaXMgbm90IHNldAorIyBDT05GSUdfQUlDNzlYWF9ERUJVR19FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX0FJQzc5WFhfREVCVUdfTUFTSz0wCisjIENPTkZJR19BSUM3OVhYX1JFR19QUkVUVFlfUFJJTlQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM5NFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FEVkFOU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKICMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0JVU0xPR0lDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9FQVRBIGlzIG5vdCBzZXQKQEAgLTU4NCwxMSArNjA4LDkgQEAKICMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1BQQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX0lNTSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMT0dJQ19GQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CkBAIC01OTgsMjIgKzYyMCwxMTQgQEAKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogCiAjCisjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycworIworQ09ORklHX0FUQT15CitDT05GSUdfU0FUQV9BSENJPXkKK0NPTkZJR19TQVRBX1NWVz15CitDT05GSUdfQVRBX1BJSVg9eQorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CitDT05GSUdfU0FUQV9OVj15CisjIENPTkZJR19QRENfQURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1FTVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUFJPTUlTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NYNCBpcyBub3Qgc2V0CitDT05GSUdfU0FUQV9TSUw9eQorIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1VMSSBpcyBub3Qgc2V0CitDT05GSUdfU0FUQV9WSUE9eQorIyBDT05GSUdfU0FUQV9WSVRFU1NFIGlzIG5vdCBzZXQKK0NPTkZJR19TQVRBX0lOVEVMX0NPTUJJTkVEPXkKKyMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BVElJWFAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MjAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MzUgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DWVBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfRUZBUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDNYMk4gaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9JVDgyMVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9KTUlDUk9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfVFJJRkxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT0xEUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9OUzg3NDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QRENfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUURJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUkFESVNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NFUlZFUldPUktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUERDMjAyN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TSUw2ODAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9XSU5CT05EIGlzIG5vdCBzZXQKKworIwogIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQogIwotIyBDT05GSUdfTUQgaXMgbm90IHNldAorQ09ORklHX01EPXkKKyMgQ09ORklHX0JMS19ERVZfTUQgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfRE09eQorIyBDT05GSUdfRE1fQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfRE1fU05BUFNIT1QgaXMgbm90IHNldAorIyBDT05GSUdfRE1fTUlSUk9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNX1pFUk8gaXMgbm90IHNldAorIyBDT05GSUdfRE1fTVVMVElQQVRIIGlzIG5vdCBzZXQKIAogIwogIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CiAjCi0jIENPTkZJR19GVVNJT04gaXMgbm90IHNldAotIyBDT05GSUdfRlVTSU9OX1NQSSBpcyBub3Qgc2V0CitDT05GSUdfRlVTSU9OPXkKK0NPTkZJR19GVVNJT05fU1BJPXkKICMgQ09ORklHX0ZVU0lPTl9GQyBpcyBub3Qgc2V0CiAjIENPTkZJR19GVVNJT05fU0FTIGlzIG5vdCBzZXQKK0NPTkZJR19GVVNJT05fTUFYX1NHRT0xMjgKKyMgQ09ORklHX0ZVU0lPTl9DVEwgaXMgbm90IHNldAogCiAjCiAjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKICMKLSMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKK0NPTkZJR19JRUVFMTM5ND15CisKKyMKKyMgU3Vic3lzdGVtIE9wdGlvbnMKKyMKKyMgQ09ORklHX0lFRUUxMzk0X1ZFUkJPU0VERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFMTM5NF9PVUlfREIgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTEzOTRfRVhUUkFfQ09ORklHX1JPTVMgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTEzOTRfRVhQT1JUX0ZVTExfQVBJIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIFRleGFzIEluc3RydW1lbnRzIFBDSUx5bnggcmVxdWlyZXMgSTJDCisjCitDT05GSUdfSUVFRTEzOTRfT0hDSTEzOTQ9eQorCisjCisjIFByb3RvY29sIERyaXZlcnMKKyMKKyMgQ09ORklHX0lFRUUxMzk0X1ZJREVPMTM5NCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFMTM5NF9TQlAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUUxMzk0X0VUSDEzOTQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTEzOTRfRFYxMzk0IGlzIG5vdCBzZXQKK0NPTkZJR19JRUVFMTM5NF9SQVdJTz15CiAKICMKICMgSTJPIGRldmljZSBzdXBwb3J0CkBAIC02NTIsNDYgKzc2Niw2MyBAQAogIwogIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwotIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfVFVMSVA9eQorIyBDT05GSUdfREUyMTA0WCBpcyBub3Qgc2V0CitDT05GSUdfVFVMSVA9eQorIyBDT05GSUdfVFVMSVBfTVdJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTElQX01NSU8gaXMgbm90IHNldAorIyBDT05GSUdfVFVMSVBfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19ERTRYNSBpcyBub3Qgc2V0CisjIENPTkZJR19XSU5CT05EXzg0MCBpcyBub3Qgc2V0CisjIENPTkZJR19ETTkxMDIgaXMgbm90IHNldAorIyBDT05GSUdfVUxJNTI2WCBpcyBub3Qgc2V0CiAjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX1BDST15CiAjIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKICMgQ09ORklHX0FNRDgxMTFfRVRIIGlzIG5vdCBzZXQKICMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAotIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZPUkNFREVUSCBpcyBub3Qgc2V0CitDT05GSUdfQjQ0PXkKK0NPTkZJR19GT1JDRURFVEg9eQorIyBDT05GSUdfRk9SQ0VERVRIX05BUEkgaXMgbm90IHNldAogIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CiBDT05GSUdfRTEwMD15CiAjIENPTkZJR19GRUFMTlggaXMgbm90IHNldAogIyBDT05GSUdfTkFUU0VNSSBpcyBub3Qgc2V0CiAjIENPTkZJR19ORTJLX1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR184MTM5Q1AgaXMgbm90IHNldAotIyBDT05GSUdfODEzOVRPTyBpcyBub3Qgc2V0CitDT05GSUdfODEzOUNQPXkKK0NPTkZJR184MTM5VE9PPXkKKyMgQ09ORklHXzgxMzlUT09fUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT09fVFVORV9UV0lTVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHXzgxMzlUT09fODEyOSBpcyBub3Qgc2V0CisjIENPTkZJR184MTM5X09MRF9SWF9SRVNFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAogIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CiAjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJQV9SSElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfUE9DS0VUIGlzIG5vdCBzZXQKIAogIwogIyBFdGhlcm5ldCAoMTAwMCBNYml0KQogIwogIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKICMgQ09ORklHX0RMMksgaXMgbm90IHNldAotIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorQ09ORklHX0UxMDAwPXkKKyMgQ09ORklHX0UxMDAwX05BUEkgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDBfRElTQUJMRV9QQUNLRVRfU1BMSVQgaXMgbm90IHNldAogIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKICMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CitDT05GSUdfUjgxNjk9eQorIyBDT05GSUdfUjgxNjlfTkFQSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAogIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TS1kyIGlzIG5vdCBzZXQKK0NPTkZJR19TS1kyPXkKICMgQ09ORklHX1NLOThMSU4gaXMgbm90IHNldAogIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKK0NPTkZJR19USUdPTjM9eQorQ09ORklHX0JOWDI9eQorIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCkBAIC02OTksNiArODMwLDcgQEAKICMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldAogIyBDT05GSUdfSVhHQiBpcyBub3Qgc2V0CiAjIENPTkZJR19TMklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKIAogIwogIyBUb2tlbiBSaW5nIGRldmljZXMKQEAgLTcxNiwxNCArODQ4LDE1IEBACiAjIENPTkZJR19XQU4gaXMgbm90IHNldAogIyBDT05GSUdfRkRESSBpcyBub3Qgc2V0CiAjIENPTkZJR19ISVBQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTElQIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTElQIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9GQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAotIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorQ09ORklHX05FVENPTlNPTEU9eQorQ09ORklHX05FVFBPTEw9eQorIyBDT05GSUdfTkVUUE9MTF9SWCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMX1RSQVAgaXMgbm90IHNldAorQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVI9eQogCiAjCiAjIElTRE4gc3Vic3lzdGVtCkBAIC03NDUsOCArODc4LDggQEAKICMKIENPTkZJR19JTlBVVF9NT1VTRURFVj15CiBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVg9eQotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEyODAKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAogIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKIENPTkZJR19JTlBVVF9FVkRFVj15CkBAIC03NzYsNyArOTA5LDYgQEAKIENPTkZJR19TRVJJT19JODA0Mj15CiAjIENPTkZJR19TRVJJT19TRVJQT1JUIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFUklPX0NUODJDNzEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFUklPX1BBUktCRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRVJJT19QQ0lQUzIgaXMgbm90IHNldAogQ09ORklHX1NFUklPX0xJQlBTMj15CiAjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldApAQCAtNzg4LDE0ICs5MjAsMTUgQEAKIENPTkZJR19WVD15CiBDT05GSUdfVlRfQ09OU09MRT15CiBDT05GSUdfSFdfQ09OU09MRT15CisjIENPTkZJR19WVF9IV19DT05TT0xFX0JJTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKIAogIwogIyBTZXJpYWwgZHJpdmVycwogIwogQ09ORklHX1NFUklBTF84MjUwPXkKLSMgQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEUgaXMgbm90IHNldAotIyBDT05GSUdfU0VSSUFMXzgyNTBfQUNQSSBpcyBub3Qgc2V0CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfUENJPXkKIENPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz00CiBDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz00CiAjIENPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRCBpcyBub3Qgc2V0CkBAIC04MDQsMTQgKzkzNywxMSBAQAogIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CiAjCiBDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQogIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CiBDT05GSUdfVU5JWDk4X1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgotQ09ORklHX1BSSU5URVI9eQotIyBDT05GSUdfTFBfQ09OU09MRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUERFViBpcyBub3Qgc2V0Ci0jIENPTkZJR19USVBBUiBpcyBub3Qgc2V0CiAKICMKICMgSVBNSQpAQCAtODIyLDggKzk1MiwxMiBAQAogIyBXYXRjaGRvZyBDYXJkcwogIwogIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAotIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKLUNPTkZJR19OVlJBTT15CitDT05GSUdfSFdfUkFORE9NPXkKK0NPTkZJR19IV19SQU5ET01fSU5URUw9eQorQ09ORklHX0hXX1JBTkRPTV9BTUQ9eQorQ09ORklHX0hXX1JBTkRPTV9HRU9ERT15CitDT05GSUdfSFdfUkFORE9NX1ZJQT15CisjIENPTkZJR19OVlJBTSBpcyBub3Qgc2V0CiBDT05GSUdfUlRDPXkKICMgQ09ORklHX0RUTEsgaXMgbm90IHNldAogIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldApAQCAtODMzLDMxICs5NjcsMjggQEAKICMKICMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCiAjCi0jIENPTkZJR19GVEFQRSBpcyBub3Qgc2V0CiBDT05GSUdfQUdQPXkKICMgQ09ORklHX0FHUF9BTEkgaXMgbm90IHNldAogIyBDT05GSUdfQUdQX0FUSSBpcyBub3Qgc2V0CiAjIENPTkZJR19BR1BfQU1EIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FHUF9BTUQ2NCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BR1BfSU5URUwgaXMgbm90IHNldAorQ09ORklHX0FHUF9BTUQ2ND15CitDT05GSUdfQUdQX0lOVEVMPXkKICMgQ09ORklHX0FHUF9OVklESUEgaXMgbm90IHNldAogIyBDT05GSUdfQUdQX1NJUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BR1BfU1dPUktTIGlzIG5vdCBzZXQKLUNPTkZJR19BR1BfVklBPXkKKyMgQ09ORklHX0FHUF9WSUEgaXMgbm90IHNldAogIyBDT05GSUdfQUdQX0VGRklDRU9OIGlzIG5vdCBzZXQKLUNPTkZJR19EUk09eQotIyBDT05GSUdfRFJNX1RERlggaXMgbm90IHNldAotIyBDT05GSUdfRFJNX1IxMjggaXMgbm90IHNldAotQ09ORklHX0RSTV9SQURFT049eQotIyBDT05GSUdfRFJNX01HQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19EUk1fU0lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RSTV9WSUEgaXMgbm90IHNldAotIyBDT05GSUdfRFJNX1NBVkFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfTVdBVkUgaXMgbm90IHNldAorIyBDT05GSUdfUEM4NzM2eF9HUElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TQ19HUElPIGlzIG5vdCBzZXQKICMgQ09ORklHX0NTNTUzNV9HUElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAotIyBDT05GSUdfSFBFVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IQU5HQ0hFQ0tfVElNRVIgaXMgbm90IHNldAorQ09ORklHX1JBV19EUklWRVI9eQorQ09ORklHX01BWF9SQVdfREVWUz0yNTYKK0NPTkZJR19IUEVUPXkKKyMgQ09ORklHX0hQRVRfUlRDX0lSUSBpcyBub3Qgc2V0CitDT05GSUdfSFBFVF9NTUFQPXkKK0NPTkZJR19IQU5HQ0hFQ0tfVElNRVI9eQogCiAjCiAjIFRQTSBkZXZpY2VzCkBAIC04NjgsNTkgKzk5OSw3IEBACiAjCiAjIEkyQyBzdXBwb3J0CiAjCi1DT05GSUdfSTJDPXkKLUNPTkZJR19JMkNfQ0hBUkRFVj15Ci0KLSMKLSMgSTJDIEFsZ29yaXRobXMKLSMKLUNPTkZJR19JMkNfQUxHT0JJVD15Ci0jIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0Ci0jCi0jIENPTkZJR19JMkNfQUxJMTUzNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxJMTU2MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQUxJMTVYMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfQU1ENzU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19BTUQ4MTExIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19JODAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0Ci1DT05GSUdfSTJDX0lTQT15Ci0jIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUEFSUE9SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfUFJPU0FWQUdFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TQVZBR0U0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDeDIwMF9BQ0IgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19TVFVCIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAotQ09ORklHX0kyQ19WSUFQUk89eQotIyBDT05GSUdfSTJDX1ZPT0RPTzMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX1BDQV9JU0EgaXMgbm90IHNldAotCi0jCi0jIE1pc2NlbGxhbmVvdXMgSTJDIENoaXAgc3VwcG9ydAotIwotIyBDT05GSUdfU0VOU09SU19EUzEzMzcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19EUzEzNzQgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19FRVBST00gaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19SVEM4NTY0IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTUFYNjg3NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19SVENfWDEyMDVfSTJDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAotIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKIAogIwogIyBTUEkgc3VwcG9ydApAQCAtOTMxLDUxICsxMDEwLDEyIEBACiAjCiAjIERhbGxhcydzIDEtd2lyZSBidXMKICMKLSMgQ09ORklHX1cxIGlzIG5vdCBzZXQKIAogIwogIyBIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQKICMKLUNPTkZJR19IV01PTj15Ci1DT05GSUdfSFdNT05fVklEPXkKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfQURNMTAzMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0FETTkyNDAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19BVFhQMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0RTMTYyMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GU0NIRVIgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19GU0NQT1MgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19HTDUxOFNNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfR0w1MjBTTSBpcyBub3Qgc2V0Ci1DT05GSUdfU0VOU09SU19JVDg3PXkKLSMgQ09ORklHX1NFTlNPUlNfTE02MyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNNzUgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTc3IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE03OCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODAgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTgzIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE04NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX0xNODcgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19MTTkwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfTE05MiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19QQzg3MzYwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU0lTNTU5NSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1NNU0M0N00xIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19WVDgyMzEgaXMgbm90IHNldAotIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNzkyRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4M0w3ODVUUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TRU5TT1JTX1c4MzYyN0hGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfSERBUFMgaXMgbm90IHNldAotIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAogCiAjCiAjIE1pc2MgZGV2aWNlcwpAQCAtOTgzLDExNyArMTAyMywzMSBAQAogIyBDT05GSUdfSUJNX0FTTSBpcyBub3Qgc2V0CiAKICMKLSMgTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzCi0jCi0KLSMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCi1DT05GSUdfVklERU9fREVWPXkKLQotIwotIyBWaWRlbyBGb3IgTGludXgKLSMKLQotIwotIyBWaWRlbyBBZGFwdGVycwotIwotIyBDT05GSUdfVklERU9fQURWX0RFQlVHIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX0JUODQ4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX0JXUUNBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19DUUNBTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19XOTk2NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19DUElBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX1NBQTUyNDZBIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX1NBQTUyNDkgaXMgbm90IHNldAotIyBDT05GSUdfVFVORVJfMzAzNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19TVFJBRElTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX1pPUkFOIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19TQUE3MTM0PXkKLSMgQ09ORklHX1ZJREVPX1NBQTcxMzRfQUxTQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19NWEIgaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fRFBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX0hFWElVTV9PUklPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19IRVhJVU1fR0VNSU5JIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX0NYODggaXMgbm90IHNldAotIyBDT05GSUdfVklERU9fRU0yOFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX09WQ0FNQ0hJUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19WSURFT19BVURJT19ERUNPREVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1ZJREVPX0RFQ09ERVIgaXMgbm90IHNldAotCi0jCi0jIFJhZGlvIEFkYXB0ZXJzCi0jCi0jIENPTkZJR19SQURJT19HRU1URUtfUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1JBRElPX01BWElSQURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SQURJT19NQUVTVFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVklERU9fVjRMMj15CiAKICMKICMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwogIwogIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19UVU5FUj15Ci1DT05GSUdfVklERU9fQlVGPXkKLUNPTkZJR19WSURFT19JUj15CisjIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKIAogIwogIyBHcmFwaGljcyBzdXBwb3J0CiAjCi1DT05GSUdfRkI9eQotQ09ORklHX0ZCX0NGQl9GSUxMUkVDVD15Ci1DT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKLUNPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKLSMgQ09ORklHX0ZCX01BQ01PREVTIGlzIG5vdCBzZXQKLUNPTkZJR19GQl9NT0RFX0hFTFBFUlM9eQotIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0NJUlJVUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9QTTIgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQ1lCRVIyMDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0FSQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9BU0lMSUFOVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9JTVNUVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9WR0ExNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9WRVNBIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19TRUxFQ1Q9eQotIyBDT05GSUdfRkJfSEdBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX05WSURJQSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9SSVZBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0k4MTAgaXMgbm90IHNldAotIyBDT05GSUdfRkJfSU5URUwgaXMgbm90IHNldAotIyBDT05GSUdfRkJfTUFUUk9YIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1JBREVPTl9PTEQgaXMgbm90IHNldAotQ09ORklHX0ZCX1JBREVPTj15Ci1DT05GSUdfRkJfUkFERU9OX0kyQz15Ci0jIENPTkZJR19GQl9SQURFT05fREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfRkJfQVRZMTI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0FUWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9TQVZBR0UgaXMgbm90IHNldAotIyBDT05GSUdfRkJfU0lTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX05FT01BR0lDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0tZUk8gaXMgbm90IHNldAotIyBDT05GSUdfRkJfM0RGWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9WT09ET08xIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX0NZQkxBIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZCX1RSSURFTlQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfR0VPREUgaXMgbm90IHNldAotIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CitDT05GSUdfRklSTVdBUkVfRURJRD15CisjIENPTkZJR19GQiBpcyBub3Qgc2V0CiAKICMKICMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CiAjCiBDT05GSUdfVkdBX0NPTlNPTEU9eQorQ09ORklHX1ZHQUNPTl9TT0ZUX1NDUk9MTEJBQ0s9eQorQ09ORklHX1ZHQUNPTl9TT0ZUX1NDUk9MTEJBQ0tfU0laRT0xMjgKK0NPTkZJR19WSURFT19TRUxFQ1Q9eQogQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQotQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEU9eQotIyBDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRV9ST1RBVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19GT05UUyBpcyBub3Qgc2V0Ci1DT05GSUdfRk9OVF84eDg9eQotQ09ORklHX0ZPTlRfOHgxNj15Ci0KLSMKLSMgTG9nbyBjb25maWd1cmF0aW9uCi0jCi0jIENPTkZJR19MT0dPIGlzIG5vdCBzZXQKICMgQ09ORklHX0JBQ0tMSUdIVF9MQ0RfU1VQUE9SVCBpcyBub3Qgc2V0CiAKICMKQEAgLTExMDQsOTcgKzEwNTgsMzAgQEAKICMKICMgQWR2YW5jZWQgTGludXggU291bmQgQXJjaGl0ZWN0dXJlCiAjCi1DT05GSUdfU05EPXkKLUNPTkZJR19TTkRfVElNRVI9eQotQ09ORklHX1NORF9QQ009eQotQ09ORklHX1NORF9SQVdNSURJPXkKLUNPTkZJR19TTkRfU0VRVUVOQ0VSPXkKLSMgQ09ORklHX1NORF9TRVFfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01JWEVSX09TUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfUENNX09TUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfU0VRVUVOQ0VSX09TUyBpcyBub3Qgc2V0Ci1DT05GSUdfU05EX1JUQ1RJTUVSPXkKLUNPTkZJR19TTkRfU0VRX1JUQ1RJTUVSX0RFRkFVTFQ9eQotIyBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TVVBQT1JUX09MRF9BUEkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9ERUJVRyBpcyBub3Qgc2V0Ci0KLSMKLSMgR2VuZXJpYyBkZXZpY2VzCi0jCi1DT05GSUdfU05EX01QVTQwMV9VQVJUPXkKLUNPTkZJR19TTkRfQUM5N19DT0RFQz15Ci1DT05GSUdfU05EX0FDOTdfQlVTPXkKLSMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVklSTUlESSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01QVTQwMSBpcyBub3Qgc2V0Ci0KLSMKLSMgUENJIGRldmljZXMKLSMKLSMgQ09ORklHX1NORF9BRDE4ODkgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FMUzQwMDAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FMSTU0NTEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FUSUlYUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVRJSVhQX01PREVNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BVTg4MTAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0FVODgyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQVU4ODMwIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9BWlQzMzI4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9CVDg3WCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQ0EwMTA2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9DTUlQQ0kgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0NTNDI4MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfQ1M0NlhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9DUzU1MzVBVURJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRU1VMTBLMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRU1VMTBLMVggaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VOUzEzNzAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VOUzEzNzEgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0VTMTkzOCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfRVMxOTY4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9GTTgwMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSERBX0lOVEVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9IRFNQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9IRFNQTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSUNFMTcxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSUNFMTcyNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfSU5URUw4WDAgaXMgbm90IHNldAotIyBDT05GSUdfU05EX0lOVEVMOFgwTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfS09SRzEyMTIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX01BRVNUUk8zIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9NSVhBUlQgaXMgbm90IHNldAotIyBDT05GSUdfU05EX05NMjU2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9QQ1hIUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfUk1FMzIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1JNRTk2IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9STUU5NjUyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9TT05JQ1ZJQkVTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NORF9UUklERU5UIGlzIG5vdCBzZXQKLUNPTkZJR19TTkRfVklBODJYWD15Ci0jIENPTkZJR19TTkRfVklBODJYWF9NT0RFTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTkRfVlgyMjIgaXMgbm90IHNldAotIyBDT05GSUdfU05EX1lNRlBDSSBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIGRldmljZXMKLSMKLSMgQ09ORklHX1NORF9VU0JfQVVESU8gaXMgbm90IHNldAotIyBDT05GSUdfU05EX1VTQl9VU1gyWSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkQgaXMgbm90IHNldAogCiAjCiAjIE9wZW4gU291bmQgU3lzdGVtCiAjCi0jIENPTkZJR19TT1VORF9QUklNRSBpcyBub3Qgc2V0CitDT05GSUdfU09VTkRfUFJJTUU9eQorQ09ORklHX09TU19PQlNPTEVURV9EUklWRVI9eQorIyBDT05GSUdfU09VTkRfQlQ4NzggaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfRU1VMTBLMSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9GVVNJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfRVMxMzcxIGlzIG5vdCBzZXQKK0NPTkZJR19TT1VORF9JQ0g9eQorIyBDT05GSUdfU09VTkRfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9PU1MgaXMgbm90IHNldAogCiAjCiAjIFVTQiBzdXBwb3J0CiAjCiBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQl9BUkNIX0hBU19FSENJPXkKIENPTkZJR19VU0I9eQogIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKIApAQCAtMTIxMywxNyArMTEwMCwxOSBAQAogQ09ORklHX1VTQl9FSENJX0hDRD15CiAjIENPTkZJR19VU0JfRUhDSV9TUExJVF9JU08gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0VIQ0lfUk9PVF9IVUJfVFQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VIQ0lfVFRfTkVXU0NIRUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9PSENJX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQogQ09ORklHX1VTQl9VSENJX0hDRD15CiAjIENPTkZJR19VU0JfU0w4MTFfSENEIGlzIG5vdCBzZXQKIAogIwogIyBVU0IgRGV2aWNlIENsYXNzIGRyaXZlcnMKICMKLSMgQ09ORklHX09CU09MRVRFX09TU19VU0JfRFJJVkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BSSU5URVIgaXMgbm90IHNldAorQ09ORklHX1VTQl9QUklOVEVSPXkKIAogIwogIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCkBAIC0xMjQ4LDIxICsxMTM3LDE3IEBACiAjCiAjIFVTQiBJbnB1dCBEZXZpY2VzCiAjCi0jIENPTkZJR19VU0JfSElEIGlzIG5vdCBzZXQKLQotIwotIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycwotIwotIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAorQ09ORklHX1VTQl9ISUQ9eQorQ09ORklHX1VTQl9ISURJTlBVVD15CisjIENPTkZJR19VU0JfSElESU5QVVRfUE9XRVJCT09LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hJRF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BSVBURUsgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1dBQ09NIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BQ0VDQUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01UT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSVRNVE9VQ0ggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0VHQUxBWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1lFQUxJTksgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1hQQUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUgaXMgbm90IHNldApAQCAtMTI3NywyMSArMTE2Miw2IEBACiAjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAogCiAjCi0jIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1ZJQ0FNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9EU0JSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9FVDYxWDI1MSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSUJNQ0FNIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9LT05JQ0FXQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfT1Y1MTEgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1NFNDAxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TTjlDMTAyIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9TVFY2ODAgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BXQyBpcyBub3Qgc2V0Ci0KLSMKICMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKICMKICMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKQEAgLTEyOTksMTIgKzExNjksMTEgQEAKICMgQ09ORklHX1VTQl9QRUdBU1VTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9SVEw4MTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9VU0JORVQgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01PTiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX01PTj15CiAKICMKICMgVVNCIHBvcnQgZHJpdmVycwogIwotIyBDT05GSUdfVVNCX1VTUzcyMCBpcyBub3Qgc2V0CiAKICMKICMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydApAQCAtMTMyMSwxMCArMTE5MCwxMiBAQAogIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QSElER0VUS0lUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QSElER0VUU0VSVk8gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CkBAIC0xMzQ0LDU2ICsxMjE1LDk2IEBACiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCisjIExFRCBkZXZpY2VzCisjCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRyaXZlcnMKKyMKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKKworIwogIyBJbmZpbmlCYW5kIHN1cHBvcnQKICMKICMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAogCiAjCi0jIFNOIERldmljZXMKKyMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19FREFDIGlzIG5vdCBzZXQKKworIworIyBSZWFsIFRpbWUgQ2xvY2sKKyMKKyMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIEVuZ2luZSBzdXBwb3J0CisjCisjIENPTkZJR19ETUFfRU5HSU5FIGlzIG5vdCBzZXQKKworIworIyBETUEgQ2xpZW50cwogIwogCiAjCi0jIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKQorIyBETUEgRGV2aWNlcwogIwotIyBDT05GSUdfRURBQyBpcyBub3Qgc2V0CiAKICMKICMgRmlsZSBzeXN0ZW1zCiAjCiBDT05GSUdfRVhUMl9GUz15Ci0jIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQyX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorQ09ORklHX1JFSVNFUkZTX0ZTPXkKKyMgQ09ORklHX1JFSVNFUkZTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX1BST0NfSU5GTyBpcyBub3Qgc2V0CitDT05GSUdfUkVJU0VSRlNfRlNfWEFUVFI9eQorQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19SRUlTRVJGU19GU19TRUNVUklUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKK0NPTkZJR19GU19QT1NJWF9BQ0w9eQogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOT1RJRlkgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CiBDT05GSUdfRE5PVElGWT15CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CitDT05GSUdfQVVUT0ZTNF9GUz15CiAjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKIAogIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiBDT05GSUdfSVNPOTY2MF9GUz15Ci1DT05GSUdfSk9MSUVUPXkKLUNPTkZJR19aSVNPRlM9eQotQ09ORklHX1pJU09GU19GUz15CisjIENPTkZJR19KT0xJRVQgaXMgbm90IHNldAorIyBDT05GSUdfWklTT0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CiAKICMKICMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwogIwogQ09ORklHX0ZBVF9GUz15Ci0jIENPTkZJR19NU0RPU19GUyBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfRlM9eQogQ09ORklHX1ZGQVRfRlM9eQotQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTg1MAorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNwogQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgogIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CiAKQEAgLTE0MDQsMTAgKzEzMTUsOSBAQAogQ09ORklHX1BST0NfS0NPUkU9eQogQ09ORklHX1NZU0ZTPXkKIENPTkZJR19UTVBGUz15Ci0jIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAotIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19IVUdFVExCRlM9eQorQ09ORklHX0hVR0VUTEJfUEFHRT15CiBDT05GSUdfUkFNRlM9eQotIyBDT05GSUdfUkVMQVlGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CiAKICMKQEAgLTE0MzAsMTMgKzEzNDAsMjYgQEAKICMKICMgTmV0d29yayBGaWxlIFN5c3RlbXMKICMKLSMgQ09ORklHX05GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorQ09ORklHX05GU0Q9eQorQ09ORklHX05GU0RfVjM9eQorIyBDT05GSUdfTkZTRF9WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTRF9WNCBpcyBub3Qgc2V0CitDT05GSUdfTkZTRF9UQ1A9eQorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAogIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19DSUZTPXkKLSMgQ09ORklHX0NJRlNfU1RBVFMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGU19YQVRUUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTCBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CkBAIC0xNDQ1LDMzICsxMzY4LDE4IEBACiAjCiAjIFBhcnRpdGlvbiBUeXBlcwogIwotQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15Ci0jIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19NU0RPU19QQVJUSVRJT049eQotIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MRE1fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NHSV9QQVJUSVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfVUxUUklYX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TVU5fUEFSVElUSU9OIGlzIG5vdCBzZXQKLSMgQ09ORklHX0tBUk1BX1BBUlRJVElPTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19FRklfUEFSVElUSU9OIGlzIG5vdCBzZXQKIAogIwogIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAogIwogQ09ORklHX05MUz15Ci1DT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMTUiCi0jIENPTkZJR19OTFNfQ09ERVBBR0VfNDM3IGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQogIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKLUNPTkZJR19OTFNfQ09ERVBBR0VfODUwPXkKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKICMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldApAQCAtMTQ5MSw3ICsxMzk5LDcgQEAKICMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAogIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAogIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAotIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfQVNDSUk9eQogQ09ORklHX05MU19JU084ODU5XzE9eQogIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CiAjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKQEAgLTE1MTAsMjAgKzE0MTgsNTAgQEAKICMKICMgSW5zdHJ1bWVudGF0aW9uIFN1cHBvcnQKICMKLSMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKK0NPTkZJR19QUk9GSUxJTkc9eQorQ09ORklHX09QUk9GSUxFPXkKK0NPTkZJR19LUFJPQkVTPXkKIAogIwogIyBLZXJuZWwgaGFja2luZwogIworQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAogQ09ORklHX01BR0lDX1NZU1JRPXkKLSMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0Ci1DT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX1VOVVNFRF9TWU1CT0xTPXkKK0NPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTgKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUlRfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19SVF9NVVRFWF9URVNURVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19SV1NFTVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTE9DS19BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19QUk9WRV9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0hJR0hNRU0gaXMgbm90IHNldAogQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0U9eQorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19GUkFNRV9QT0lOVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19VTldJTkRfSU5GTz15CitDT05GSUdfU1RBQ0tfVU5XSU5EPXkKKyMgQ09ORklHX0ZPUkNFRF9JTkxJTklORyBpcyBub3Qgc2V0CisjIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUIGlzIG5vdCBzZXQKIENPTkZJR19FQVJMWV9QUklOVEs9eQorQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1c9eQorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUk9EQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHXzRLU1RBQ0tTIGlzIG5vdCBzZXQKIENPTkZJR19YODZfRklORF9TTVBfQ09ORklHPXkKIENPTkZJR19YODZfTVBQQVJTRT15CitDT05GSUdfRE9VQkxFRkFVTFQ9eQogCiAjCiAjIFNlY3VyaXR5IG9wdGlvbnMKQEAgLTE1MzcsMTAgKzE0NzUsNiBAQAogIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKIAogIwotIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcwotIwotCi0jCiAjIExpYnJhcnkgcm91dGluZXMKICMKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CkBAIC0xNTQ4LDcgKzE0ODIsMTIgQEAKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1pMSUJfSU5GTEFURT15CitDT05GSUdfUExJU1Q9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRPXkKK0NPTkZJR19YODZfU01QPXkKK0NPTkZJR19YODZfSFQ9eQogQ09ORklHX1g4Nl9CSU9TX1JFQk9PVD15CitDT05GSUdfWDg2X1RSQU1QT0xJTkU9eQogQ09ORklHX0tUSU1FX1NDQUxBUj15CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC9NYWtlZmlsZQppbmRleCA1NDI3YTg0Li4xYTg4NGI2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUKQEAgLTQsNyArNCw3IEBACiAKIGV4dHJhLXkgOj0gaGVhZC5vIGluaXRfdGFzay5vIHZtbGludXgubGRzCiAKLW9iai15CTo9IHByb2Nlc3MubyBzZW1hcGhvcmUubyBzaWduYWwubyBlbnRyeS5vIHRyYXBzLm8gaXJxLm8gXAorb2JqLXkJOj0gcHJvY2Vzcy5vIHNpZ25hbC5vIGVudHJ5Lm8gdHJhcHMubyBpcnEubyBcCiAJCXB0cmFjZS5vIHRpbWUubyBpb3BvcnQubyBsZHQubyBzZXR1cC5vIGk4MjU5Lm8gc3lzX2kzODYubyBcCiAJCXBjaS1kbWEubyBpMzg2X2tzeW1zLm8gaTM4Ny5vIGJvb3RmbGFnLm8gXAogCQlxdWlya3MubyBpODIzNy5vIHRvcG9sb2d5Lm8gYWx0ZXJuYXRpdmUubyBpODI1My5vIHRzYy5vCkBAIC04MSw0ICs4MSw1IEBACiAJJChjYWxsIGlmX2NoYW5nZWQsc3lzY2FsbCkKIAogazgteSAgICAgICAgICAgICAgICAgICAgICArPSAuLi8uLi94ODZfNjQva2VybmVsL2s4Lm8KK3N0YWNrdHJhY2UteQkJICArPSAuLi8uLi94ODZfNjQva2VybmVsL3N0YWNrdHJhY2UubwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvTWFrZWZpbGUgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvTWFrZWZpbGUKaW5kZXggN2U5YWM5OS4uN2Y3YmUwMSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9NYWtlZmlsZQpAQCAtMSw1ICsxLDcgQEAKIG9iai0kKENPTkZJR19BQ1BJKQkJKz0gYm9vdC5vCitpZm5lcSAoJChDT05GSUdfUENJKSwpCiBvYmotJChDT05GSUdfWDg2X0lPX0FQSUMpCSs9IGVhcmx5cXVpcmsubworZW5kaWYKIG9iai0kKENPTkZJR19BQ1BJX1NMRUVQKQkrPSBzbGVlcC5vIHdha2V1cC5vCiAKIGlmbmVxICgkKENPTkZJR19BQ1BJX1BST0NFU1NPUiksKQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMKaW5kZXggZWUwMDNiYy4uMWFhZWE2YSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCkBAIC0yNiw5ICsyNiwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2lvX2FwaWMuaD4KQEAgLTM2LDExICszOSwxNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KIAorc3RhdGljIGludCBfX2luaXRkYXRhIGFjcGlfZm9yY2UgPSAwOworCisjaWZkZWYJQ09ORklHX0FDUEkKK2ludCBhY3BpX2Rpc2FibGVkID0gMDsKKyNlbHNlCitpbnQgYWNwaV9kaXNhYmxlZCA9IDE7CisjZW5kaWYKK0VYUE9SVF9TWU1CT0woYWNwaV9kaXNhYmxlZCk7CisKICNpZmRlZglDT05GSUdfWDg2XzY0CiAKLWV4dGVybiB2b2lkIF9faW5pdCBjbHVzdGVyZWRfYXBpY19jaGVjayh2b2lkKTsKLQotZXh0ZXJuIGludCBnc2lfaXJxX3NoYXJpbmcoaW50IGdzaSk7CiAjaW5jbHVkZSA8YXNtL3Byb3RvLmg+CiAKIHN0YXRpYyBpbmxpbmUgaW50IGFjcGlfbWFkdF9vZW1fY2hlY2soY2hhciAqb2VtX2lkLCBjaGFyICpvZW1fdGFibGVfaWQpIHsgcmV0dXJuIDA7IH0KQEAgLTUwNiwxNiArNTE1LDc2IEBACiAjaWZkZWYgQ09ORklHX0FDUElfSE9UUExVR19DUFUKIGludCBhY3BpX21hcF9sc2FwaWMoYWNwaV9oYW5kbGUgaGFuZGxlLCBpbnQgKnBjcHUpCiB7Ci0JLyogVEJEICovCi0JcmV0dXJuIC1FSU5WQUw7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKKwl1bmlvbiBhY3BpX29iamVjdCAqb2JqOworCXN0cnVjdCBhY3BpX3RhYmxlX2xhcGljICpsYXBpYzsKKwljcHVtYXNrX3QgdG1wX21hcCwgbmV3X21hcDsKKwl1OCBwaHlzaWQ7CisJaW50IGNwdTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAiX01BVCIsIE5VTEwsICZidWZmZXIpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWJ1ZmZlci5sZW5ndGggfHwgIWJ1ZmZlci5wb2ludGVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9iaiA9IGJ1ZmZlci5wb2ludGVyOworCWlmIChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX0JVRkZFUiB8fAorCSAgICBvYmotPmJ1ZmZlci5sZW5ndGggPCBzaXplb2YoKmxhcGljKSkgeworCQlrZnJlZShidWZmZXIucG9pbnRlcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxhcGljID0gKHN0cnVjdCBhY3BpX3RhYmxlX2xhcGljICopb2JqLT5idWZmZXIucG9pbnRlcjsKKworCWlmICgobGFwaWMtPmhlYWRlci50eXBlICE9IEFDUElfTUFEVF9MQVBJQykgfHwKKwkgICAgKCFsYXBpYy0+ZmxhZ3MuZW5hYmxlZCkpIHsKKwkJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwaHlzaWQgPSBsYXBpYy0+aWQ7CisKKwlrZnJlZShidWZmZXIucG9pbnRlcik7CisJYnVmZmVyLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfQlVGRkVSOworCWJ1ZmZlci5wb2ludGVyID0gTlVMTDsKKworCXRtcF9tYXAgPSBjcHVfcHJlc2VudF9tYXA7CisJbXBfcmVnaXN0ZXJfbGFwaWMocGh5c2lkLCBsYXBpYy0+ZmxhZ3MuZW5hYmxlZCk7CisKKwkvKgorCSAqIElmIG1wX3JlZ2lzdGVyX2xhcGljIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZXMgYSBuZXcgbG9naWNhbCBjcHUKKwkgKiBudW1iZXIsIHRoZW4gdGhlIGZvbGxvd2luZyB3aWxsIGdldCB1cyBleGFjdGx5IHdoYXQgd2FzIG1hcHBlZAorCSAqLworCWNwdXNfYW5kbm90KG5ld19tYXAsIGNwdV9wcmVzZW50X21hcCwgdG1wX21hcCk7CisJaWYgKGNwdXNfZW1wdHkobmV3X21hcCkpIHsKKwkJcHJpbnRrICgiVW5hYmxlIHRvIG1hcCBsYXBpYyB0byBsb2dpY2FsIGNwdSBudW1iZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljcHUgPSBmaXJzdF9jcHUobmV3X21hcCk7CisKKwkqcGNwdSA9IGNwdTsKKwlyZXR1cm4gMDsKIH0KIAogRVhQT1JUX1NZTUJPTChhY3BpX21hcF9sc2FwaWMpOwogCiBpbnQgYWNwaV91bm1hcF9sc2FwaWMoaW50IGNwdSkKIHsKLQkvKiBUQkQgKi8KLQlyZXR1cm4gLUVJTlZBTDsKKwlpbnQgaTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCWlmICh4ODZfYWNwaWlkX3RvX2FwaWNpZFtpXSA9PSB4ODZfY3B1X3RvX2FwaWNpZFtjcHVdKSB7CisJCQl4ODZfYWNwaWlkX3RvX2FwaWNpZFtpXSA9IC0xOworCQkJYnJlYWs7CisJCX0KKwl9CisJeDg2X2NwdV90b19hcGljaWRbY3B1XSA9IC0xOworCWNwdV9jbGVhcihjcHUsIGNwdV9wcmVzZW50X21hcCk7CisJbnVtX3Byb2Nlc3NvcnMtLTsKKworCXJldHVybiAoMCk7CiB9CiAKIEVYUE9SVF9TWU1CT0woYWNwaV91bm1hcF9sc2FwaWMpOwpAQCAtNTc5LDYgKzY0OCw4IEBACiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX2hwZXQodW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfaHBldCAqaHBldF90Ymw7CisJc3RydWN0IHJlc291cmNlICpocGV0X3JlczsKKwlyZXNvdXJjZV9zaXplX3QgcmVzX3N0YXJ0OwogCiAJaWYgKCFwaHlzIHx8ICFzaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU5NCwxMiArNjY1LDI2IEBACiAJCSAgICAgICAibWVtb3J5LlxuIik7CiAJCXJldHVybiAtMTsKIAl9CisKKyNkZWZpbmUgSFBFVF9SRVNPVVJDRV9OQU1FX1NJWkUgOQorCWhwZXRfcmVzID0gYWxsb2NfYm9vdG1lbShzaXplb2YoKmhwZXRfcmVzKSArIEhQRVRfUkVTT1VSQ0VfTkFNRV9TSVpFKTsKKwlpZiAoaHBldF9yZXMpIHsKKwkJbWVtc2V0KGhwZXRfcmVzLCAwLCBzaXplb2YoKmhwZXRfcmVzKSk7CisJCWhwZXRfcmVzLT5uYW1lID0gKHZvaWQgKikmaHBldF9yZXNbMV07CisJCWhwZXRfcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9CVVNZOworCQlzbnByaW50ZigoY2hhciAqKWhwZXRfcmVzLT5uYW1lLCBIUEVUX1JFU09VUkNFX05BTUVfU0laRSwKKwkJCSAiSFBFVCAldSIsIGhwZXRfdGJsLT5udW1iZXIpOworCQlocGV0X3Jlcy0+ZW5kID0gKDEgKiAxMDI0KSAtIDE7CisJfQorCiAjaWZkZWYJQ09ORklHX1g4Nl82NAogCXZ4dGltZS5ocGV0X2FkZHJlc3MgPSBocGV0X3RibC0+YWRkci5hZGRybCB8CiAJICAgICgobG9uZylocGV0X3RibC0+YWRkci5hZGRyaCA8PCAzMik7CiAKIAlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiSFBFVCBpZDogJSN4IGJhc2U6ICUjbHhcbiIsCiAJICAgICAgIGhwZXRfdGJsLT5pZCwgdnh0aW1lLmhwZXRfYWRkcmVzcyk7CisKKwlyZXNfc3RhcnQgPSB2eHRpbWUuaHBldF9hZGRyZXNzOwogI2Vsc2UJCQkJLyogWDg2ICovCiAJewogCQlleHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X2FkZHJlc3M7CkBAIC02MDcsOSArNjkyLDE3IEBACiAJCWhwZXRfYWRkcmVzcyA9IGhwZXRfdGJsLT5hZGRyLmFkZHJsOwogCQlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiSFBFVCBpZDogJSN4IGJhc2U6ICUjbHhcbiIsCiAJCSAgICAgICBocGV0X3RibC0+aWQsIGhwZXRfYWRkcmVzcyk7CisKKwkJcmVzX3N0YXJ0ID0gaHBldF9hZGRyZXNzOwogCX0KICNlbmRpZgkJCQkvKiBYODYgKi8KIAorCWlmIChocGV0X3JlcykgeworCQlocGV0X3Jlcy0+c3RhcnQgPSByZXNfc3RhcnQ7CisJCWhwZXRfcmVzLT5lbmQgKz0gcmVzX3N0YXJ0OworCQlpbnNlcnRfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCBocGV0X3Jlcyk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAjZWxzZQpAQCAtODYwLDggKzk1Myw2IEBACiAJcmV0dXJuOwogfQogCi1leHRlcm4gaW50IGFjcGlfZm9yY2U7Ci0KICNpZmRlZiBfX2kzODZfXwogCiBzdGF0aWMgaW50IF9faW5pdCBkaXNhYmxlX2FjcGlfaXJxKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQpAQCAtMTE2MywzICsxMjU0LDc1IEBACiAKIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIGludCBfX2luaXQgcGFyc2VfYWNwaShjaGFyICphcmcpCit7CisJaWYgKCFhcmcpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogImFjcGk9b2ZmIiBkaXNhYmxlcyBib3RoIEFDUEkgdGFibGUgcGFyc2luZyBhbmQgaW50ZXJwcmV0ZXIgKi8KKwlpZiAoc3RyY21wKGFyZywgIm9mZiIpID09IDApIHsKKwkJZGlzYWJsZV9hY3BpKCk7CisJfQorCS8qIGFjcGk9Zm9yY2UgdG8gb3Zlci1yaWRlIGJsYWNrLWxpc3QgKi8KKwllbHNlIGlmIChzdHJjbXAoYXJnLCAiZm9yY2UiKSA9PSAwKSB7CisJCWFjcGlfZm9yY2UgPSAxOworCQlhY3BpX2h0ID0gMTsKKwkJYWNwaV9kaXNhYmxlZCA9IDA7CisJfQorCS8qIGFjcGk9c3RyaWN0IGRpc2FibGVzIG91dC1vZi1zcGVjIHdvcmthcm91bmRzICovCisJZWxzZSBpZiAoc3RyY21wKGFyZywgInN0cmljdCIpID09IDApIHsKKwkJYWNwaV9zdHJpY3QgPSAxOworCX0KKwkvKiBMaW1pdCBBQ1BJIGp1c3QgdG8gYm9vdC10aW1lIHRvIGVuYWJsZSBIVCAqLworCWVsc2UgaWYgKHN0cmNtcChhcmcsICJodCIpID09IDApIHsKKwkJaWYgKCFhY3BpX2ZvcmNlKQorCQkJZGlzYWJsZV9hY3BpKCk7CisJCWFjcGlfaHQgPSAxOworCX0KKwkvKiAiYWNwaT1ub2lycSIgZGlzYWJsZXMgQUNQSSBpbnRlcnJ1cHQgcm91dGluZyAqLworCWVsc2UgaWYgKHN0cmNtcChhcmcsICJub2lycSIpID09IDApIHsKKwkJYWNwaV9ub2lycV9zZXQoKTsKKwl9IGVsc2UgeworCQkvKiBDb3JlIHdpbGwgcHJpbnRrIHdoZW4gd2UgcmV0dXJuIGVycm9yLiAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgiYWNwaSIsIHBhcnNlX2FjcGkpOworCisvKiBGSVhNRTogVXNpbmcgcGNpPSBmb3IgYW4gQUNQSSBwYXJhbWV0ZXIgaXMgYSB0cmF2ZXN0eS4gKi8KK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX3BjaShjaGFyICphcmcpCit7CisJaWYgKGFyZyAmJiBzdHJjbXAoYXJnLCAibm9hY3BpIikgPT0gMCkKKwkJYWNwaV9kaXNhYmxlX3BjaSgpOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oInBjaSIsIHBhcnNlX3BjaSk7CisKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX2FjcGlfc2tpcF90aW1lcl9vdmVycmlkZShjaGFyICphcmcpCit7CisJYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlID0gMTsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUiLCBwYXJzZV9hY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUpOworI2VuZGlmIC8qIENPTkZJR19YODZfSU9fQVBJQyAqLworCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hY3BpX3NjaShjaGFyICpzKQoreworCWlmICghcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFzdHJjbXAocywgImVkZ2UiKSkKKwkJYWNwaV9zY2lfZmxhZ3MudHJpZ2dlciA9IDE7CisJZWxzZSBpZiAoIXN0cmNtcChzLCAibGV2ZWwiKSkKKwkJYWNwaV9zY2lfZmxhZ3MudHJpZ2dlciA9IDM7CisJZWxzZSBpZiAoIXN0cmNtcChzLCAiaGlnaCIpKQorCQlhY3BpX3NjaV9mbGFncy5wb2xhcml0eSA9IDE7CisJZWxzZSBpZiAoIXN0cmNtcChzLCAibG93IikpCisJCWFjcGlfc2NpX2ZsYWdzLnBvbGFyaXR5ID0gMzsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oImFjcGlfc2NpIiwgc2V0dXBfYWNwaV9zY2kpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Vhcmx5cXVpcmsuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9lYXJseXF1aXJrLmMKaW5kZXggMTY0OWExNy4uZmU3OTliMSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Vhcmx5cXVpcmsuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvZWFybHlxdWlyay5jCkBAIC00OCw3ICs0OCwxMSBAQAogCWludCBudW0sIHNsb3QsIGZ1bmM7CiAKIAkvKiBBc3N1bWUgdGhlIG1hY2hpbmUgc3VwcG9ydHMgdHlwZSAxLiBJZiBub3QgaXQgd2lsbCAKLQkgICBhbHdheXMgcmVhZCBmZmZmZmZmZiBhbmQgc2hvdWxkIG5vdCBoYXZlIGFueSBzaWRlIGVmZmVjdC4gKi8KKwkgICBhbHdheXMgcmVhZCBmZmZmZmZmZiBhbmQgc2hvdWxkIG5vdCBoYXZlIGFueSBzaWRlIGVmZmVjdC4KKwkgICBBY3R1YWxseSBhIGZldyBidWdneSBzeXN0ZW1zIGNhbiBtYWNoaW5lIGNoZWNrLiBBbGxvdyB0aGUgdXNlcgorCSAgIHRvIGRpc2FibGUgaXQgYnkgY29tbWFuZCBsaW5lIG9wdGlvbiBhdCBsZWFzdCAtQUsgKi8KKwlpZiAoIWVhcmx5X3BjaV9hbGxvd2VkKCkpCisJCXJldHVybjsKIAogCS8qIFBvb3IgbWFuJ3MgUENJIGRpc2NvdmVyeSAqLwogCWZvciAobnVtID0gMDsgbnVtIDwgMzI7IG51bSsrKSB7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FwaWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jCmluZGV4IDhjODQ0ZDAuLjkwZmFhZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jCkBAIC01Miw3ICs1MiwxOCBAQAogLyoKICAqIEtub2IgdG8gY29udHJvbCBvdXIgd2lsbGluZ25lc3MgdG8gZW5hYmxlIHRoZSBsb2NhbCBBUElDLgogICovCi1pbnQgZW5hYmxlX2xvY2FsX2FwaWMgX19pbml0ZGF0YSA9IDA7IC8qIC0xPWZvcmNlLWRpc2FibGUsICsxPWZvcmNlLWVuYWJsZSAqLworc3RhdGljIGludCBlbmFibGVfbG9jYWxfYXBpYyBfX2luaXRkYXRhID0gMDsgLyogLTE9Zm9yY2UtZGlzYWJsZSwgKzE9Zm9yY2UtZW5hYmxlICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsYXBpY19kaXNhYmxlKHZvaWQpCit7CisJZW5hYmxlX2xvY2FsX2FwaWMgPSAtMTsKKwljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfQVBJQywgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsYXBpY19lbmFibGUodm9pZCkKK3sKKwllbmFibGVfbG9jYWxfYXBpYyA9IDE7Cit9CiAKIC8qCiAgKiBEZWJ1ZyBsZXZlbApAQCAtNTg2LDggKzU5Nyw3IEBACiAJCQlwcmludGsoIk5vIEVTUiBmb3IgODI0ODlEWC5cbiIpOwogCX0KIAotCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpCi0JCXNldHVwX2FwaWNfbm1pX3dhdGNoZG9nKCk7CisJc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2coTlVMTCk7CiAJYXBpY19wbV9hY3RpdmF0ZSgpOwogfQogCkBAIC0xMzczLDMgKzEzODMsMTggQEAKIAogCXJldHVybiAwOwogfQorCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9sYXBpYyhjaGFyICphcmcpCit7CisJbGFwaWNfZW5hYmxlKCk7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgibGFwaWMiLCBwYXJzZV9sYXBpYyk7CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX25vbGFwaWMoY2hhciAqYXJnKQoreworCWxhcGljX2Rpc2FibGUoKTsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJub2xhcGljIiwgcGFyc2Vfbm9sYXBpYyk7CisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2FtZC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvYW1kLmMKaW5kZXggZTZhMmQ2Yi4uZTQ3NTgwOSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvYW1kLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvYW1kLmMKQEAgLTIyLDcgKzIyLDcgQEAKIGV4dGVybiB2b2lkIHZpZGUodm9pZCk7CiBfX2FzbV9fKCIuYWxpZ24gNFxudmlkZTogcmV0Iik7CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2FtZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgaW5pdF9hbWQoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCXUzMiBsLCBoOwogCWludCBtYnl0ZXMgPSBudW1fcGh5c3BhZ2VzID4+ICgyMC1QQUdFX1NISUZUKTsKQEAgLTI0Niw3ICsyNDYsNyBAQAogCQludW1fY2FjaGVfbGVhdmVzID0gMzsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBhbWRfc2l6ZV9jYWNoZShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19jcHVpbml0IGFtZF9zaXplX2NhY2hlKHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMsIHVuc2lnbmVkIGludCBzaXplKQogewogCS8qIEFNRCBlcnJhdGEgVDEzIChvcmRlciAjMjE5MjIpICovCiAJaWYgKChjLT54ODYgPT0gNikpIHsKQEAgLTI1OSw3ICsyNTksNyBAQAogCXJldHVybiBzaXplOwogfQogCi1zdGF0aWMgc3RydWN0IGNwdV9kZXYgYW1kX2NwdV9kZXYgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBhbWRfY3B1X2RldiBfX2NwdWluaXRkYXRhID0gewogCS5jX3ZlbmRvcgk9ICJBTUQiLAogCS5jX2lkZW50IAk9IHsgIkF1dGhlbnRpY0FNRCIgfSwKIAkuY19tb2RlbHMgPSB7CkBAIC0yNzUsNyArMjc1LDYgQEAKIAkJfSwKIAl9LAogCS5jX2luaXQJCT0gaW5pdF9hbWQsCi0JLmNfaWRlbnRpZnkJPSBnZW5lcmljX2lkZW50aWZ5LAogCS5jX3NpemVfY2FjaGUJPSBhbWRfc2l6ZV9jYWNoZSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NlbnRhdXIuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NlbnRhdXIuYwppbmRleCBiZDc1NjI5Li44YzI1MDQ3IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jZW50YXVyLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY2VudGF1ci5jCkBAIC05LDcgKzksNyBAQAogCiAjaWZkZWYgQ09ORklHX1g4Nl9PT1NUT1JFCiAKLXN0YXRpYyB1MzIgX19pbml0IHBvd2VyMih1MzIgeCkKK3N0YXRpYyB1MzIgX19jcHVpbml0IHBvd2VyMih1MzIgeCkKIHsKIAl1MzIgcz0xOwogCXdoaWxlKHM8PXgpCkBAIC0yMiw3ICsyMiw3IEBACiAgKglTZXQgdXAgYW4gYWN0dWFsIE1DUgogICovCiAgCi1zdGF0aWMgdm9pZCBfX2luaXQgY2VudGF1cl9tY3JfaW5zZXJ0KGludCByZWcsIHUzMiBiYXNlLCB1MzIgc2l6ZSwgaW50IGtleSkKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBjZW50YXVyX21jcl9pbnNlcnQoaW50IHJlZywgdTMyIGJhc2UsIHUzMiBzaXplLCBpbnQga2V5KQogewogCXUzMiBsbywgaGk7CiAJCkBAIC00MCw3ICs0MCw3IEBACiAgKglTaG9ydGN1dDogV2Uga25vdyB5b3UgY2FuJ3QgcHV0IDRHaWcgb2YgUkFNIG9uIGEgd2luY2hpcAogICovCiAKLXN0YXRpYyB1MzIgX19pbml0IHJhbXRvcCh2b2lkKQkJLyogMTYzODggKi8KK3N0YXRpYyB1MzIgX19jcHVpbml0IHJhbXRvcCh2b2lkKQkJLyogMTYzODggKi8KIHsKIAlpbnQgaTsKIAl1MzIgdG9wID0gMDsKQEAgLTkxLDcgKzkxLDcgQEAKICAqCUNvbXB1dGUgYSBzZXQgb2YgTUNSJ3MgdG8gZ2l2ZSBtYXhpbXVtIGNvdmVyYWdlCiAgKi8KIAotc3RhdGljIGludCBfX2luaXQgY2VudGF1cl9tY3JfY29tcHV0ZShpbnQgbnIsIGludCBrZXkpCitzdGF0aWMgaW50IF9fY3B1aW5pdCBjZW50YXVyX21jcl9jb21wdXRlKGludCBuciwgaW50IGtleSkKIHsKIAl1MzIgbWVtID0gcmFtdG9wKCk7CiAJdTMyIHJvb3QgPSBwb3dlcjIobWVtKTsKQEAgLTE2Niw3ICsxNjYsNyBAQAogCXJldHVybiBjdDsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGNlbnRhdXJfY3JlYXRlX29wdGltYWxfbWNyKHZvaWQpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgY2VudGF1cl9jcmVhdGVfb3B0aW1hbF9tY3Iodm9pZCkKIHsKIAlpbnQgaTsKIAkvKgpAQCAtMTg5LDcgKzE4OSw3IEBACiAJCXdybXNyKE1TUl9JRFRfTUNSMCtpLCAwLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHdpbmNoaXAyX2NyZWF0ZV9vcHRpbWFsX21jcih2b2lkKQorc3RhdGljIHZvaWQgX19jcHVpbml0IHdpbmNoaXAyX2NyZWF0ZV9vcHRpbWFsX21jcih2b2lkKQogewogCXUzMiBsbywgaGk7CiAJaW50IGk7CkBAIC0yMjcsNyArMjI3LDcgQEAKICAqCUhhbmRsZSB0aGUgTUNSIGtleSBvbiB0aGUgV2luY2hpcCAyLgogICovCiAKLXN0YXRpYyB2b2lkIF9faW5pdCB3aW5jaGlwMl91bnByb3RlY3RfbWNyKHZvaWQpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgd2luY2hpcDJfdW5wcm90ZWN0X21jcih2b2lkKQogewogCXUzMiBsbywgaGk7CiAJdTMyIGtleTsKQEAgLTIzOSw3ICsyMzksNyBAQAogCXdybXNyKE1TUl9JRFRfTUNSX0NUUkwsIGxvLCBoaSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCB3aW5jaGlwMl9wcm90ZWN0X21jcih2b2lkKQorc3RhdGljIHZvaWQgX19jcHVpbml0IHdpbmNoaXAyX3Byb3RlY3RfbWNyKHZvaWQpCiB7CiAJdTMyIGxvLCBoaTsKIAkKQEAgLTI1Nyw3ICsyNTcsNyBAQAogI2RlZmluZSBSTkdfRU5BQkxFRAkoMSA8PCAzKQogI2RlZmluZSBSTkdfRU5BQkxFCSgxIDw8IDYpCS8qIE1TUl9WSUFfUk5HICovCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2MzKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBpbml0X2MzKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAl1MzIgIGxvLCBoaTsKIApAQCAtMzAzLDcgKzMwMyw3IEBACiAJZGlzcGxheV9jYWNoZWluZm8oYyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2NlbnRhdXIoc3RydWN0IGNwdWluZm9feDg2ICpjKQorc3RhdGljIHZvaWQgX19jcHVpbml0IGluaXRfY2VudGF1cihzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJZW51bSB7CiAJCUVDWDg9MTw8MSwKQEAgLTQ0Miw3ICs0NDIsNyBAQAogCX0KIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBjZW50YXVyX3NpemVfY2FjaGUoc3RydWN0IGNwdWluZm9feDg2ICogYywgdW5zaWduZWQgaW50IHNpemUpCitzdGF0aWMgdW5zaWduZWQgaW50IF9fY3B1aW5pdCBjZW50YXVyX3NpemVfY2FjaGUoc3RydWN0IGNwdWluZm9feDg2ICogYywgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJLyogVklBIEMzIENQVXMgKDY3MC02OEYpIG5lZWQgZnVydGhlciBzaGlmdGluZy4gKi8KIAlpZiAoKGMtPng4NiA9PSA2KSAmJiAoKGMtPng4Nl9tb2RlbCA9PSA3KSB8fCAoYy0+eDg2X21vZGVsID09IDgpKSkKQEAgLTQ1Nyw3ICs0NTcsNyBAQAogCXJldHVybiBzaXplOwogfQogCi1zdGF0aWMgc3RydWN0IGNwdV9kZXYgY2VudGF1cl9jcHVfZGV2IF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGNwdV9kZXYgY2VudGF1cl9jcHVfZGV2IF9fY3B1aW5pdGRhdGEgPSB7CiAJLmNfdmVuZG9yCT0gIkNlbnRhdXIiLAogCS5jX2lkZW50CT0geyAiQ2VudGF1ckhhdWxzIiB9LAogCS5jX2luaXQJCT0gaW5pdF9jZW50YXVyLApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY29tbW9uLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwppbmRleCA3MGM4N2RlLi4yNzk5YmFhIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jb21tb24uYwpAQCAtMzYsNyArMzYsNyBAQAogCiBleHRlcm4gaW50IGRpc2FibGVfcHNlOwogCi1zdGF0aWMgdm9pZCBkZWZhdWx0X2luaXQoc3RydWN0IGNwdWluZm9feDg2ICogYykKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBkZWZhdWx0X2luaXQoc3RydWN0IGNwdWluZm9feDg2ICogYykKIHsKIAkvKiBOb3QgbXVjaCB3ZSBjYW4gZG8gaGVyZS4uLiAqLwogCS8qIENoZWNrIGlmIGF0IGxlYXN0IGl0IGhhcyBjcHVpZCAqLwpAQCAtNDksNyArNDksNyBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBjcHVfZGV2IGRlZmF1bHRfY3B1ID0geworc3RhdGljIHN0cnVjdCBjcHVfZGV2IF9fY3B1aW5pdGRhdGEgZGVmYXVsdF9jcHUgPSB7CiAJLmNfaW5pdAk9IGRlZmF1bHRfaW5pdCwKIAkuY192ZW5kb3IgPSAiVW5rbm93biIsCiB9OwpAQCAtMjY1LDcgKzI2NSw3IEBACiAJfQogfQogCi12b2lkIF9fY3B1aW5pdCBnZW5lcmljX2lkZW50aWZ5KHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgZ2VuZXJpY19pZGVudGlmeShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKQogewogCXUzMiB0Zm1zLCB4bHZsOwogCWludCBlYng7CkBAIC02NzUsNyArNjc1LDcgQEAKICNlbmRpZgogCiAJLyogQ2xlYXIgJWZzIGFuZCAlZ3MuICovCi0JYXNtIHZvbGF0aWxlICgieG9ybCAlZWF4LCAlZWF4OyBtb3ZsICVlYXgsICVmczsgbW92bCAlZWF4LCAlZ3MiKTsKKwlhc20gdm9sYXRpbGUgKCJtb3ZsICUwLCAlJWZzOyBtb3ZsICUwLCAlJWdzIiA6IDogInIiICgwKSk7CiAKIAkvKiBDbGVhciBhbGwgNiBkZWJ1ZyByZWdpc3RlcnM6ICovCiAJc2V0X2RlYnVncmVnKDAsIDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1LmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHUuaAppbmRleCA1YTFkNGYxLi4yZjY0MzJjIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHUuaAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHUuaApAQCAtMjQsNyArMjQsNSBAQAogZXh0ZXJuIGludCBnZXRfbW9kZWxfbmFtZShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwogZXh0ZXJuIHZvaWQgZGlzcGxheV9jYWNoZWluZm8oc3RydWN0IGNwdWluZm9feDg2ICpjKTsKIAotZXh0ZXJuIHZvaWQgZ2VuZXJpY19pZGVudGlmeShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKTsKLQogZXh0ZXJuIHZvaWQgZWFybHlfaW50ZWxfd29ya2Fyb3VuZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jeXJpeC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3lyaXguYwppbmRleCBmMDNiN2Y5Li5jMGMzYjU5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jeXJpeC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2N5cml4LmMKQEAgLTEyLDcgKzEyLDcgQEAKIC8qCiAgKiBSZWFkIE5TQy9DeXJpeCBERVZJRCByZWdpc3RlcnMgKERJUikgdG8gZ2V0IG1vcmUgZGV0YWlsZWQgaW5mby4gYWJvdXQgdGhlIENQVQogICovCi1zdGF0aWMgdm9pZCBfX2luaXQgZG9fY3lyaXhfZGV2aWQodW5zaWduZWQgY2hhciAqZGlyMCwgdW5zaWduZWQgY2hhciAqZGlyMSkKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBkb19jeXJpeF9kZXZpZCh1bnNpZ25lZCBjaGFyICpkaXIwLCB1bnNpZ25lZCBjaGFyICpkaXIxKQogewogCXVuc2lnbmVkIGNoYXIgY2NyMiwgY2NyMzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNTIsMjUgKzUyLDI1IEBACiAgKiBBY3R1YWxseSBzaW5jZSBidWdzLmggZG9lc24ndCBldmVuIHJlZmVyZW5jZSB0aGlzIHBlcmhhcHMgc29tZW9uZSBzaG91bGQKICAqIGZpeCB0aGUgZG9jdW1lbnRhdGlvbiA/Pz8KICAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgQ3g4Nl9kaXIwX21zYiBfX2luaXRkYXRhID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIEN4ODZfZGlyMF9tc2IgX19jcHVpbml0ZGF0YSA9IDA7CiAKLXN0YXRpYyBjaGFyIEN4ODZfbW9kZWxbXVs5XSBfX2luaXRkYXRhID0geworc3RhdGljIGNoYXIgQ3g4Nl9tb2RlbFtdWzldIF9fY3B1aW5pdGRhdGEgPSB7CiAJIkN4NDg2IiwgIkN4NDg2IiwgIjV4ODYgIiwgIjZ4ODYiLCAiTWVkaWFHWCAiLCAiNng4Nk1YICIsCiAJIk0gSUkgIiwgIlVua25vd24iCiB9Owotc3RhdGljIGNoYXIgQ3g0ODZfbmFtZVtdWzVdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgY2hhciBDeDQ4Nl9uYW1lW11bNV0gX19jcHVpbml0ZGF0YSA9IHsKIAkiU0xDIiwgIkRMQyIsICJTTEMyIiwgIkRMQzIiLCAiU1J4IiwgIkRSeCIsCiAJIlNSeDIiLCAiRFJ4MiIKIH07Ci1zdGF0aWMgY2hhciBDeDQ4NlNfbmFtZVtdWzRdIF9faW5pdGRhdGEgPSB7CitzdGF0aWMgY2hhciBDeDQ4NlNfbmFtZVtdWzRdIF9fY3B1aW5pdGRhdGEgPSB7CiAJIlMiLCAiUzIiLCAiU2UiLCAiUzJlIgogfTsKLXN0YXRpYyBjaGFyIEN4NDg2RF9uYW1lW11bNF0gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBjaGFyIEN4NDg2RF9uYW1lW11bNF0gX19jcHVpbml0ZGF0YSA9IHsKIAkiRFgiLCAiRFgyIiwgIj8iLCAiPyIsICI/IiwgIkRYNCIKIH07Ci1zdGF0aWMgY2hhciBDeDg2X2NiW10gX19pbml0ZGF0YSA9ICI/LjV4IENvcmUvQnVzIENsb2NrIjsKLXN0YXRpYyBjaGFyIGN5cml4X21vZGVsX211bHQxW10gX19pbml0ZGF0YSA9ICIxMj8/NDMiOwotc3RhdGljIGNoYXIgY3lyaXhfbW9kZWxfbXVsdDJbXSBfX2luaXRkYXRhID0gIjEyMjMzNDQ1IjsKK3N0YXRpYyBjaGFyIEN4ODZfY2JbXSBfX2NwdWluaXRkYXRhID0gIj8uNXggQ29yZS9CdXMgQ2xvY2siOworc3RhdGljIGNoYXIgY3lyaXhfbW9kZWxfbXVsdDFbXSBfX2NwdWluaXRkYXRhID0gIjEyPz80MyI7CitzdGF0aWMgY2hhciBjeXJpeF9tb2RlbF9tdWx0MltdIF9fY3B1aW5pdGRhdGEgPSAiMTIyMzM0NDUiOwogCiAvKgogICogUmVzZXQgdGhlIHNsb3ctbG9vcCAoU0xPUCkgYml0IG9uIHRoZSA2ODYoTCkgd2hpY2ggaXMgc2V0IGJ5IHNvbWUgb2xkCkBAIC04Miw3ICs4Miw3IEBACiAKIGV4dGVybiB2b2lkIGNhbGlicmF0ZV9kZWxheSh2b2lkKSBfX2luaXQ7CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBjaGVja19jeDY4Nl9zbG9wKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBjaGVja19jeDY4Nl9zbG9wKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQpAQCAtMTA3LDcgKzEwNyw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgX19pbml0IHNldF9jeDg2X3Jlb3JkZXIodm9pZCkKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBzZXRfY3g4Nl9yZW9yZGVyKHZvaWQpCiB7CiAJdTggY2NyMzsKIApAQCAtMTIyLDcgKzEyMiw3IEBACiAJc2V0Q3g4NihDWDg2X0NDUjMsIGNjcjMpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2V0X2N4ODZfbWVtd2Iodm9pZCkKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBzZXRfY3g4Nl9tZW13Yih2b2lkKQogewogCXUzMiBjcjA7CiAKQEAgLTEzNyw3ICsxMzcsNyBAQAogCXNldEN4ODYoQ1g4Nl9DQ1IyLCBnZXRDeDg2KENYODZfQ0NSMikgfCAweDE0ICk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBzZXRfY3g4Nl9pbmModm9pZCkKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBzZXRfY3g4Nl9pbmModm9pZCkKIHsKIAl1bnNpZ25lZCBjaGFyIGNjcjM7CiAKQEAgLTE1OCw3ICsxNTgsNyBAQAogICoJQ29uZmlndXJlIGxhdGVyIE1lZGlhR1ggYW5kL29yIEdlb2RlIHByb2Nlc3Nvci4KICAqLwogCi1zdGF0aWMgdm9pZCBfX2luaXQgZ2VvZGVfY29uZmlndXJlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgZ2VvZGVfY29uZmlndXJlKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1OCBjY3IzLCBjY3I0OwpAQCAtMTg0LDE0ICsxODQsMTQgQEAKIAogCiAjaWZkZWYgQ09ORklHX1BDSQotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIF9faW5pdGRhdGEgY3lyaXhfNTV4MFtdID0geworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIF9fY3B1aW5pdGRhdGEgY3lyaXhfNTV4MFtdID0gewogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MTApIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQ1lSSVgsIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUyMCkgfSwKIAl7IH0sCiB9OwogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2N5cml4KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBpbml0X2N5cml4KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAl1bnNpZ25lZCBjaGFyIGRpcjAsIGRpcjBfbXNuLCBkaXIwX2xzbiwgZGlyMSA9IDA7CiAJY2hhciAqYnVmID0gYy0+eDg2X21vZGVsX2lkOwpAQCAtMzQ2LDcgKzM0Niw3IEBACiAvKgogICogSGFuZGxlIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgYnJhbmRlZCBwcm9jZXNzb3JzCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X25zYyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgaW5pdF9uc2Moc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCS8qIFRoZXJlIG1heSBiZSBHWDEgcHJvY2Vzc29ycyBpbiB0aGUgd2lsZCB0aGF0IGFyZSBicmFuZGVkCiAJICogTlNDIGFuZCBub3QgQ3lyaXguCkBAIC0zOTQsNyArMzk0LDcgQEAKIAlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpICh0ZXN0ID4+IDgpID09IDB4MDI7CiB9CiAKLXN0YXRpYyB2b2lkIGN5cml4X2lkZW50aWZ5KHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgY3lyaXhfaWRlbnRpZnkoc3RydWN0IGNwdWluZm9feDg2ICogYykKIHsKIAkvKiBEZXRlY3QgQ3lyaXggd2l0aCBkaXNhYmxlZCBDUFVJRCAqLwogCWlmICggYy0+eDg2ID09IDQgJiYgdGVzdF9jeXJpeF81MmRpdigpICkgewpAQCAtNDI3LDEwICs0MjcsOSBAQAogCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQl9CiAJfQotCWdlbmVyaWNfaWRlbnRpZnkoYyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY3B1X2RldiBjeXJpeF9jcHVfZGV2IF9faW5pdGRhdGEgPSB7CitzdGF0aWMgc3RydWN0IGNwdV9kZXYgY3lyaXhfY3B1X2RldiBfX2NwdWluaXRkYXRhID0gewogCS5jX3ZlbmRvcgk9ICJDeXJpeCIsCiAJLmNfaWRlbnQgCT0geyAiQ3lyaXhJbnN0ZWFkIiB9LAogCS5jX2luaXQJCT0gaW5pdF9jeXJpeCwKQEAgLTQ1MywxMSArNDUyLDEwIEBACiAKIGxhdGVfaW5pdGNhbGwoY3lyaXhfZXhpdF9jcHUpOwogCi1zdGF0aWMgc3RydWN0IGNwdV9kZXYgbnNjX2NwdV9kZXYgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiBuc2NfY3B1X2RldiBfX2NwdWluaXRkYXRhID0gewogCS5jX3ZlbmRvcgk9ICJOU0MiLAogCS5jX2lkZW50IAk9IHsgIkdlb2RlIGJ5IE5TQyIgfSwKIAkuY19pbml0CQk9IGluaXRfbnNjLAotCS5jX2lkZW50aWZ5CT0gZ2VuZXJpY19pZGVudGlmeSwKIH07CiAKIGludCBfX2luaXQgbnNjX2luaXRfY3B1KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvaW50ZWwuYwppbmRleCA1YTJlMjcwLi45NGE5NWFhIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9pbnRlbC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2ludGVsLmMKQEAgLTE5OCw3ICsxOTgsNyBAQAogfQogCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaW50ZWxfc2l6ZV9jYWNoZShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19jcHVpbml0IGludGVsX3NpemVfY2FjaGUoc3RydWN0IGNwdWluZm9feDg2ICogYywgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJLyogSW50ZWwgUElJSSBUdWFsYXRpbi4gVGhpcyBjb21lcyBpbiB0d28gZmxhdm91cnMuCiAJICogT25lIGhhcyAyNTZrYiBvZiBjYWNoZSwgdGhlIG90aGVyIDUxMi4gV2UgaGF2ZSBubyB3YXkKQEAgLTI2Myw3ICsyNjMsNiBAQAogCQl9LAogCX0sCiAJLmNfaW5pdAkJPSBpbml0X2ludGVsLAotCS5jX2lkZW50aWZ5CT0gZ2VuZXJpY19pZGVudGlmeSwKIAkuY19zaXplX2NhY2hlCT0gaW50ZWxfc2l6ZV9jYWNoZSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9NYWtlZmlsZQppbmRleCAzMDgwOGYzLi5mMWViZTFjIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svTWFrZWZpbGUKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL01ha2VmaWxlCkBAIC0xLDIgKzEsMiBAQAotb2JqLXkJPQltY2UubyBrNy5vIHA0Lm8gcDUubyBwNi5vIHdpbmNoaXAubworb2JqLXkJPQltY2UubyBrNy5vIHA0Lm8gcDUubyBwNi5vIHdpbmNoaXAubyB0aGVybV90aHJvdC5vCiBvYmotJChDT05GSUdfWDg2X01DRV9OT05GQVRBTCkJKz0Jbm9uLWZhdGFsLm8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvbWNoZWNrL3A0LmMKaW5kZXggYjk1ZjFiM2QuLjUwNDQzNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay9wNC5jCkBAIC0xMyw2ICsxMyw4IEBACiAjaW5jbHVkZSA8YXNtL21zci5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CiAKKyNpbmNsdWRlIDxhc20vdGhlcm1fdGhyb3QuaD4KKwogI2luY2x1ZGUgIm1jZS5oIgogCiAvKiBhcyBzdXBwb3J0ZWQgYnkgdGhlIFA0L1hlb24gZmFtaWx5ICovCkBAIC00NCwyNSArNDYsMTIgQEAKIC8qIFA0L1hlb24gVGhlcm1hbCB0cmFuc2l0aW9uIGludGVycnVwdCBoYW5kbGVyICovCiBzdGF0aWMgdm9pZCBpbnRlbF90aGVybWFsX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQl1MzIgbCwgaDsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIG5leHRbTlJfQ1BVU107CisJX191NjQgbXNyX3ZhbDsKIAogCWFja19BUElDX2lycSgpOwogCi0JaWYgKHRpbWVfYWZ0ZXIobmV4dFtjcHVdLCBqaWZmaWVzKSkKLQkJcmV0dXJuOwotCi0JbmV4dFtjcHVdID0gamlmZmllcyArIEhaKjU7Ci0JcmRtc3IoTVNSX0lBMzJfVEhFUk1fU1RBVFVTLCBsLCBoKTsKLQlpZiAobCAmIDB4MSkgewotCQlwcmludGsoS0VSTl9FTUVSRyAiQ1BVJWQ6IFRlbXBlcmF0dXJlIGFib3ZlIHRocmVzaG9sZFxuIiwgY3B1KTsKLQkJcHJpbnRrKEtFUk5fRU1FUkcgIkNQVSVkOiBSdW5uaW5nIGluIG1vZHVsYXRlZCBjbG9jayBtb2RlXG4iLAotCQkJCWNwdSk7Ci0JCWFkZF90YWludChUQUlOVF9NQUNISU5FX0NIRUNLKTsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9JTkZPICJDUFUlZDogVGVtcGVyYXR1cmUvc3BlZWQgbm9ybWFsXG4iLCBjcHUpOwotCX0KKwlyZG1zcmwoTVNSX0lBMzJfVEhFUk1fU1RBVFVTLCBtc3JfdmFsKTsKKwl0aGVybV90aHJvdF9wcm9jZXNzKG1zcl92YWwgJiAweDEpOwogfQogCiAvKiBUaGVybWFsIGludGVycnVwdCBoYW5kbGVyIGZvciB0aGlzIENQVSBzZXR1cCAqLwpAQCAtMTIyLDEwICsxMTEsMTMgQEAKIAkKIAlyZG1zciAoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIGwsIGgpOwogCXdybXNyIChNU1JfSUEzMl9NSVNDX0VOQUJMRSwgbCB8ICgxPDwzKSwgaCk7Ci0JCisKIAlsID0gYXBpY19yZWFkIChBUElDX0xWVFRITVIpOwogCWFwaWNfd3JpdGVfYXJvdW5kIChBUElDX0xWVFRITVIsIGwgJiB+QVBJQ19MVlRfTUFTS0VEKTsKIAlwcmludGsgKEtFUk5fSU5GTyAiQ1BVJWQ6IFRoZXJtYWwgbW9uaXRvcmluZyBlbmFibGVkXG4iLCBjcHUpOworCisJLyogZW5hYmxlIHRoZXJtYWwgdGhyb3R0bGUgcHJvY2Vzc2luZyAqLworCWF0b21pY19zZXQoJnRoZXJtX3Rocm90X2VuLCAxKTsKIAlyZXR1cm47CiB9CiAjZW5kaWYgLyogQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svdGhlcm1fdGhyb3QuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L21jaGVjay90aGVybV90aHJvdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNDMwNDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9tY2hlY2svdGhlcm1fdGhyb3QuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZS9jcHUvbWNoZWNrL3RoZXJtX3Rocm90LmMKKyAqCisgKiBUaGVybWFsIHRocm90dGxlIGV2ZW50IHN1cHBvcnQgY29kZSAoc3VjaCBhcyBzeXNsb2cgbWVzc2FnaW5nIGFuZCByYXRlCisgKiBsaW1pdGluZykgdGhhdCB3YXMgZmFjdG9yZWQgb3V0IGZyb20geDg2XzY0IChtY2VfaW50ZWwuYykgYW5kIGkzODYgKHA0LmMpLgorICogVGhpcyBhbGxvd3MgY29uc2lzdGVudCByZXBvcnRpbmcgb2YgQ1BVIHRoZXJtYWwgdGhyb3R0bGUgZXZlbnRzLgorICoKKyAqIE1haW50YWlucyBhIGNvdW50ZXIgaW4gL3N5cyB0aGF0IGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgdGhlcm1hbAorICogZXZlbnRzLCBzdWNoIHRoYXQgdGhlIHVzZXIga25vd3MgaG93IGJhZCB0aGUgdGhlcm1hbCBwcm9ibGVtIG1pZ2h0IGJlCisgKiAoc2luY2UgdGhlIGxvZ2dpbmcgdG8gc3lzbG9nIGFuZCBtY2Vsb2cgaXMgcmF0ZSBsaW1pdGVkKS4KKyAqCisgKiBBdXRob3I6IERtaXRyaXkgWmF2aW4gKGRtaXRyaXl6QGdvb2dsZS5jb20pCisgKgorICogQ3JlZGl0czogQWRhcHRlZCBmcm9tIFp3YW5lIE13YWlrYW1ibydzIG9yaWdpbmFsIGNvZGUgaW4gbWNlX2ludGVsLmMuCisgKiAgICAgICAgICBJbnNwaXJlZCBieSBSb3NzIEJpcm8ncyBhbmQgQWwgQm9yY2hlcnMnIGNvdW50ZXIgY29kZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8YXNtL2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8YXNtL3RoZXJtX3Rocm90Lmg+CisKKy8qIEhvdyBsb25nIHRvIHdhaXQgYmV0d2VlbiByZXBvcnRpbmcgdGhlcm1hbCBldmVudHMgKi8KKyNkZWZpbmUgQ0hFQ0tfSU5URVJWQUwgICAgICAgICAgICAgICgzMDAgKiBIWikKKworc3RhdGljIERFRklORV9QRVJfQ1BVKF9fdTY0LCBuZXh0X2NoZWNrKSA9IElOSVRJQUxfSklGRklFUzsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCB0aGVybWFsX3Rocm90dGxlX2NvdW50KTsKK2F0b21pY190IHRoZXJtX3Rocm90X2VuID0gQVRPTUlDX0lOSVQoMCk7CisKKyNpZmRlZiBDT05GSUdfU1lTRlMKKyNkZWZpbmUgZGVmaW5lX3RoZXJtX3Rocm90X3N5c2Rldl9vbmVfcm8oX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0aWMgU1lTREVWX0FUVFIoX25hbWUsIDA0NDQsIHRoZXJtX3Rocm90X3N5c2Rldl9zaG93XyMjX25hbWUsIE5VTEwpCisKKyNkZWZpbmUgZGVmaW5lX3RoZXJtX3Rocm90X3N5c2Rldl9zaG93X2Z1bmMobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3QgdGhlcm1fdGhyb3Rfc3lzZGV2X3Nob3dfIyNuYW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYnVmKSAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXVuc2lnbmVkIGludCBjcHUgPSBkZXYtPmlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlzc2l6ZV90IHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlwcmVlbXB0X2Rpc2FibGUoKTsgICAgICAgICAgICAgIC8qIENQVSBob3RwbHVnICovICAgICAgICAgICAgICAgICAgICBcCisJaWYgKGNwdV9vbmxpbmUoY3B1KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJICAgICAgcGVyX2NwdSh0aGVybWFsX3Rocm90dGxlXyMjbmFtZSwgY3B1KSk7ICAgICAgICBcCisJZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlyZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXByZWVtcHRfZW5hYmxlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXJldHVybiByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworZGVmaW5lX3RoZXJtX3Rocm90X3N5c2Rldl9zaG93X2Z1bmMoY291bnQpOworZGVmaW5lX3RoZXJtX3Rocm90X3N5c2Rldl9vbmVfcm8oY291bnQpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdGhlcm1hbF90aHJvdHRsZV9hdHRyc1tdID0geworCSZhdHRyX2NvdW50LmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgdGhlcm1hbF90aHJvdHRsZV9hdHRyX2dyb3VwID0geworCS5hdHRycyA9IHRoZXJtYWxfdGhyb3R0bGVfYXR0cnMsCisJLm5hbWUgPSAidGhlcm1hbF90aHJvdHRsZSIKK307CisjZW5kaWYgLyogQ09ORklHX1NZU0ZTICovCisKKy8qKioKKyAqIHRoZXJtX3Rocm90X3Byb2Nlc3MgLSBQcm9jZXNzIHRoZXJtYWwgdGhyb3R0bGluZyBldmVudCBmcm9tIGludGVycnVwdAorICogQGN1cnI6IFdoZXRoZXIgdGhlIGNvbmRpdGlvbiBpcyBjdXJyZW50IG9yIG5vdCAoYm9vbGVhbiksIHNpbmNlIHRoZQorICogICAgICAgIHRoZXJtYWwgaW50ZXJydXB0IG5vcm1hbGx5IGdldHMgY2FsbGVkIGJvdGggd2hlbiB0aGUgdGhlcm1hbAorICogICAgICAgIGV2ZW50IGJlZ2lucyBhbmQgb25jZSB0aGUgZXZlbnQgaGFzIGVuZGVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSB0aGVybWFsIGludGVycnVwdCBhZnRlciB0aGUKKyAqIElSUSBoYXMgYmVlbiBhY2tub3dsZWRnZWQuCisgKgorICogSXQgd2lsbCB0YWtlIGNhcmUgb2YgcmF0ZSBsaW1pdGluZyBhbmQgcHJpbnRpbmcgbWVzc2FnZXMgdG8gdGhlIHN5c2xvZy4KKyAqCisgKiBSZXR1cm5zOiAwIDogRXZlbnQgc2hvdWxkIE5PVCBiZSBmdXJ0aGVyIGxvZ2dlZCwgaS5lLiBzdGlsbCBpbgorICogICAgICAgICAgICAgICJ0aW1lb3V0IiBmcm9tIHByZXZpb3VzIGxvZyBtZXNzYWdlLgorICogICAgICAgICAgMSA6IEV2ZW50IHNob3VsZCBiZSBsb2dnZWQgZnVydGhlciwgYW5kIGEgbWVzc2FnZSBoYXMgYmVlbgorICogICAgICAgICAgICAgIHByaW50ZWQgdG8gdGhlIHN5c2xvZy4KKyAqLworaW50IHRoZXJtX3Rocm90X3Byb2Nlc3MoaW50IGN1cnIpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlfX3U2NCB0bXBfamlmZnMgPSBnZXRfamlmZmllc182NCgpOworCisJaWYgKGN1cnIpCisJCV9fZ2V0X2NwdV92YXIodGhlcm1hbF90aHJvdHRsZV9jb3VudCkrKzsKKworCWlmICh0aW1lX2JlZm9yZTY0KHRtcF9qaWZmcywgX19nZXRfY3B1X3ZhcihuZXh0X2NoZWNrKSkpCisJCXJldHVybiAwOworCisJX19nZXRfY3B1X3ZhcihuZXh0X2NoZWNrKSA9IHRtcF9qaWZmcyArIENIRUNLX0lOVEVSVkFMOworCisJLyogaWYgd2UganVzdCBlbnRlcmVkIHRoZSB0aGVybWFsIGV2ZW50ICovCisJaWYgKGN1cnIpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQ1BVJWQ6IFRlbXBlcmF0dXJlIGFib3ZlIHRocmVzaG9sZCwgIgorCQkgICAgICAgImNwdSBjbG9jayB0aHJvdHRsZWQgKHRvdGFsIGV2ZW50cyA9ICVsdSlcbiIsIGNwdSwKKwkJICAgICAgIF9fZ2V0X2NwdV92YXIodGhlcm1hbF90aHJvdHRsZV9jb3VudCkpOworCisJCWFkZF90YWludChUQUlOVF9NQUNISU5FX0NIRUNLKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9DUklUICJDUFUlZDogVGVtcGVyYXR1cmUvc3BlZWQgbm9ybWFsXG4iLCBjcHUpOworCX0KKworCXJldHVybiAxOworfQorCisjaWZkZWYgQ09ORklHX1NZU0ZTCisvKiBBZGQvUmVtb3ZlIHRoZXJtYWxfdGhyb3R0bGUgaW50ZXJmYWNlIGZvciBDUFUgZGV2aWNlICovCitzdGF0aWMgX19jcHVpbml0IGludCB0aGVybWFsX3Rocm90dGxlX2FkZF9kZXYoc3RydWN0IHN5c19kZXZpY2UgKiBzeXNfZGV2KQoreworCXN5c2ZzX2NyZWF0ZV9ncm91cCgmc3lzX2Rldi0+a29iaiwgJnRoZXJtYWxfdGhyb3R0bGVfYXR0cl9ncm91cCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBfX2NwdWluaXQgaW50IHRoZXJtYWxfdGhyb3R0bGVfcmVtb3ZlX2RldihzdHJ1Y3Qgc3lzX2RldmljZSAqIHN5c19kZXYpCit7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzeXNfZGV2LT5rb2JqLCAmdGhlcm1hbF90aHJvdHRsZV9hdHRyX2dyb3VwKTsKKwlyZXR1cm4gMDsKK30KKworLyogTXV0ZXggcHJvdGVjdGluZyBkZXZpY2UgY3JlYXRpb24gYWdhaW5zdCBDUFUgaG90cGx1ZyAqLworc3RhdGljIERFRklORV9NVVRFWCh0aGVybV9jcHVfbG9jayk7CisKKy8qIEdldCBub3RpZmllZCB3aGVuIGEgY3B1IGNvbWVzIG9uL29mZi4gQmUgaG90cGx1ZyBmcmllbmRseS4gKi8KK3N0YXRpYyBfX2NwdWluaXQgaW50IHRoZXJtYWxfdGhyb3R0bGVfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAorCQkJCQkJICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sCisJCQkJCQkgICB2b2lkICpoY3B1KQoreworCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OworCXN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2OworCisJc3lzX2RldiA9IGdldF9jcHVfc3lzZGV2KGNwdSk7CisJbXV0ZXhfbG9jaygmdGhlcm1fY3B1X2xvY2spOworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBDUFVfT05MSU5FOgorCQl0aGVybWFsX3Rocm90dGxlX2FkZF9kZXYoc3lzX2Rldik7CisJCWJyZWFrOworCWNhc2UgQ1BVX0RFQUQ6CisJCXRoZXJtYWxfdGhyb3R0bGVfcmVtb3ZlX2RldihzeXNfZGV2KTsKKwkJYnJlYWs7CisJfQorCW11dGV4X3VubG9jaygmdGhlcm1fY3B1X2xvY2spOworCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdGhlcm1hbF90aHJvdHRsZV9jcHVfbm90aWZpZXIgPQoreworCS5ub3RpZmllcl9jYWxsID0gdGhlcm1hbF90aHJvdHRsZV9jcHVfY2FsbGJhY2ssCit9OworI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLworCitzdGF0aWMgX19pbml0IGludCB0aGVybWFsX3Rocm90dGxlX2luaXRfZGV2aWNlKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IDA7CisKKwlpZiAoIWF0b21pY19yZWFkKCZ0aGVybV90aHJvdF9lbikpCisJCXJldHVybiAwOworCisJcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZ0aGVybWFsX3Rocm90dGxlX2NwdV9ub3RpZmllcik7CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwltdXRleF9sb2NrKCZ0aGVybV9jcHVfbG9jayk7CisjZW5kaWYKKwkvKiBjb25uZWN0IGxpdmUgQ1BVcyB0byBzeXNmcyAqLworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQl0aGVybWFsX3Rocm90dGxlX2FkZF9kZXYoZ2V0X2NwdV9zeXNkZXYoY3B1KSk7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJbXV0ZXhfdW5sb2NrKCZ0aGVybV9jcHVfbG9jayk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitkZXZpY2VfaW5pdGNhbGwodGhlcm1hbF90aHJvdHRsZV9pbml0X2RldmljZSk7CisjZW5kaWYgLyogQ09ORklHX1NZU0ZTICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9uZXhnZW4uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L25leGdlbi5jCmluZGV4IGFkODdmYTUuLjhiZjIzY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L25leGdlbi5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L25leGdlbi5jCkBAIC0xMCw3ICsxMCw3IEBACiAgKgl0byBoYXZlIENQVUlELiAoVGhhbmtzIHRvIEhlcmJlcnQgT3BwbWFubikKICAqLwogIAotc3RhdGljIGludCBfX2luaXQgZGVlcF9tYWdpY19uZXhnZW5fcHJvYmUodm9pZCkKK3N0YXRpYyBpbnQgX19jcHVpbml0IGRlZXBfbWFnaWNfbmV4Z2VuX3Byb2JlKHZvaWQpCiB7CiAJaW50IHJldDsKIAkKQEAgLTI3LDIxICsyNywyMCBAQAogCXJldHVybiAgcmV0OwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9uZXhnZW4oc3RydWN0IGNwdWluZm9feDg2ICogYykKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBpbml0X25leGdlbihzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKQogewogCWMtPng4Nl9jYWNoZV9zaXplID0gMjU2OyAvKiBBIGZldyBoYWQgMSBNQi4uLiAqLwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbmV4Z2VuX2lkZW50aWZ5KHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgbmV4Z2VuX2lkZW50aWZ5KHN0cnVjdCBjcHVpbmZvX3g4NiAqIGMpCiB7CiAJLyogRGV0ZWN0IE5leEdlbiB3aXRoIG9sZCBoeXBlcmNvZGUgKi8KIAlpZiAoIGRlZXBfbWFnaWNfbmV4Z2VuX3Byb2JlKCkgKSB7CiAJCXN0cmNweShjLT54ODZfdmVuZG9yX2lkLCAiTmV4R2VuRHJpdmVuIik7CiAJfQotCWdlbmVyaWNfaWRlbnRpZnkoYyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY3B1X2RldiBuZXhnZW5fY3B1X2RldiBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBjcHVfZGV2IG5leGdlbl9jcHVfZGV2IF9fY3B1aW5pdGRhdGEgPSB7CiAJLmNfdmVuZG9yCT0gIk5leGdlbiIsCiAJLmNfaWRlbnQJPSB7ICJOZXhHZW5Ecml2ZW4iIH0sCiAJLmNfbW9kZWxzID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvcHJvYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvcHJvYy5jCmluZGV4IGY1NGExNTIuLjc2YWFjMDggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L3Byb2MuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9wcm9jLmMKQEAgLTQ2LDggKzQ2LDggQEAKIAogCQkvKiBJbnRlbC1kZWZpbmVkICgjMikgKi8KIAkJInBuaSIsIE5VTEwsIE5VTEwsICJtb25pdG9yIiwgImRzX2NwbCIsICJ2bXgiLCAic214IiwgImVzdCIsCi0JCSJ0bTIiLCBOVUxMLCAiY2lkIiwgTlVMTCwgTlVMTCwgImN4MTYiLCAieHRwciIsIE5VTEwsCi0JCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJ0bTIiLCAic3NzZTMiLCAiY2lkIiwgTlVMTCwgTlVMTCwgImN4MTYiLCAieHRwciIsIE5VTEwsCisJCU5VTEwsIE5VTEwsICJkY2EiLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAogCiAJCS8qIFZJQS9DeXJpeC9DZW50YXVyLWRlZmluZWQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L3Jpc2UuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L3Jpc2UuYwppbmRleCBkMDhkNWEyLi45MzE3Zjc0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9yaXNlLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvcmlzZS5jCkBAIC01LDcgKzUsNyBAQAogCiAjaW5jbHVkZSAiY3B1LmgiCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3Jpc2Uoc3RydWN0IGNwdWluZm9feDg2ICpjKQorc3RhdGljIHZvaWQgX19jcHVpbml0IGluaXRfcmlzZShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAJcHJpbnRrKCJDUFU6IFJpc2UgaURyYWdvbiIpOwogCWlmIChjLT54ODZfbW9kZWwgPiAyKQpAQCAtMjgsNyArMjgsNyBAQAogCXNldF9iaXQoWDg2X0ZFQVRVUkVfQ1g4LCBjLT54ODZfY2FwYWJpbGl0eSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY3B1X2RldiByaXNlX2NwdV9kZXYgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiByaXNlX2NwdV9kZXYgX19jcHVpbml0ZGF0YSA9IHsKIAkuY192ZW5kb3IJPSAiUmlzZSIsCiAJLmNfaWRlbnQJPSB7ICJSaXNlUmlzZVJpc2UiIH0sCiAJLmNfbW9kZWxzID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvdHJhbnNtZXRhLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS90cmFuc21ldGEuYwppbmRleCA3MjE0YzliLi40MDU2ZmI3IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS90cmFuc21ldGEuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS90cmFuc21ldGEuYwpAQCAtNSw3ICs1LDcgQEAKICNpbmNsdWRlIDxhc20vbXNyLmg+CiAjaW5jbHVkZSAiY3B1LmgiCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3RyYW5zbWV0YShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgaW5pdF90cmFuc21ldGEoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewogCXVuc2lnbmVkIGludCBjYXBfbWFzaywgdWssIG1heCwgZHVtbXk7CiAJdW5zaWduZWQgaW50IGNtc19yZXYxLCBjbXNfcmV2MjsKQEAgLTg1LDEwICs4NSw5IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHRyYW5zbWV0YV9pZGVudGlmeShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKQorc3RhdGljIHZvaWQgX19jcHVpbml0IHRyYW5zbWV0YV9pZGVudGlmeShzdHJ1Y3QgY3B1aW5mb194ODYgKiBjKQogewogCXUzMiB4bHZsOwotCWdlbmVyaWNfaWRlbnRpZnkoYyk7CiAKIAkvKiBUcmFuc21ldGEtZGVmaW5lZCBmbGFnczogbGV2ZWwgMHg4MDg2MDAwMSAqLwogCXhsdmwgPSBjcHVpZF9lYXgoMHg4MDg2MDAwMCk7CkBAIC05OCw3ICs5Nyw3IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IGNwdV9kZXYgdHJhbnNtZXRhX2NwdV9kZXYgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiB0cmFuc21ldGFfY3B1X2RldiBfX2NwdWluaXRkYXRhID0gewogCS5jX3ZlbmRvcgk9ICJUcmFuc21ldGEiLAogCS5jX2lkZW50CT0geyAiR2VudWluZVRNeDg2IiwgIlRyYW5zbWV0YUNQVSIgfSwKIAkuY19pbml0CQk9IGluaXRfdHJhbnNtZXRhLApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvdW1jLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS91bWMuYwppbmRleCAyY2Q5ODhmLi4xYmYzZjg3IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS91bWMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS91bWMuYwpAQCAtNSwxMiArNSw4IEBACiAKIC8qIFVNQyBjaGlwcyBhcHBlYXIgdG8gYmUgb25seSBlaXRoZXIgMzg2IG9yIDQ4Niwgc28gbm8gc3BlY2lhbCBpbml0IHRha2VzIHBsYWNlLgogICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF91bWMoc3RydWN0IGNwdWluZm9feDg2ICogYykKLXsKIAotfQotCi1zdGF0aWMgc3RydWN0IGNwdV9kZXYgdW1jX2NwdV9kZXYgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgY3B1X2RldiB1bWNfY3B1X2RldiBfX2NwdWluaXRkYXRhID0gewogCS5jX3ZlbmRvcgk9ICJVTUMiLAogCS5jX2lkZW50IAk9IHsgIlVNQyBVTUMgVU1DIiB9LAogCS5jX21vZGVscyA9IHsKQEAgLTIxLDcgKzE3LDYgQEAKIAkJICB9CiAJCX0sCiAJfSwKLQkuY19pbml0CQk9IGluaXRfdW1jLAogfTsKIAogaW50IF9faW5pdCB1bWNfaW5pdF9jcHUodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3Jhc2guYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3Jhc2guYwppbmRleCA1Yjk2ZjAzLi42N2QyOTdkIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NyYXNoLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcmFzaC5jCkBAIC0yMiw2ICsyMiw4IEBACiAjaW5jbHVkZSA8YXNtL25taS5oPgogI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KICNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KKwogI2luY2x1ZGUgPG1hY2hfaXBpLmg+CiAKIApAQCAtOTMsMTYgKzk1LDI1IEBACiAjaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKENPTkZJR19YODZfTE9DQUxfQVBJQykKIHN0YXRpYyBhdG9taWNfdCB3YWl0aW5nX2Zvcl9jcmFzaF9pcGk7CiAKLXN0YXRpYyBpbnQgY3Jhc2hfbm1pX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1KQorc3RhdGljIGludCBjcmFzaF9ubWlfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCiB7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CiAJc3RydWN0IHB0X3JlZ3MgZml4ZWRfcmVnczsKKwlpbnQgY3B1OworCisJaWYgKHZhbCAhPSBESUVfTk1JX0lQSSkKKwkJcmV0dXJuIE5PVElGWV9PSzsKKworCXJlZ3MgPSAoKHN0cnVjdCBkaWVfYXJncyAqKWRhdGEpLT5yZWdzOworCWNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAkvKiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGlzIGhhbmRsZXIgaXMgaW52b2tlZCBvbiBjcmFzaGluZyBjcHUuCiAJICogT3RoZXJ3aXNlLCBzeXN0ZW0gd2lsbCBjb21wbGV0ZWx5IGhhbmcuIENyYXNoaW5nIGNwdSBjYW4gZ2V0CiAJICogYW4gTk1JIGlmIHN5c3RlbSB3YXMgaW5pdGlhbGx5IGJvb3RlZCB3aXRoIG5taV93YXRjaGRvZyBwYXJhbWV0ZXIuCiAJICovCiAJaWYgKGNwdSA9PSBjcmFzaGluZ19jcHUpCi0JCXJldHVybiAxOworCQlyZXR1cm4gTk9USUZZX1NUT1A7CiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAogCWlmICghdXNlcl9tb2RlX3ZtKHJlZ3MpKSB7CkBAIC0xMjUsMTMgKzEzNiwxOCBAQAogCXNlbmRfSVBJX2FsbGJ1dHNlbGYoTk1JX1ZFQ1RPUik7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgY3Jhc2hfbm1pX25iID0geworCS5ub3RpZmllcl9jYWxsID0gY3Jhc2hfbm1pX2NhbGxiYWNrLAorfTsKKwogc3RhdGljIHZvaWQgbm1pX3Nob290ZG93bl9jcHVzKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBtc2VjczsKIAogCWF0b21pY19zZXQoJndhaXRpbmdfZm9yX2NyYXNoX2lwaSwgbnVtX29ubGluZV9jcHVzKCkgLSAxKTsKIAkvKiBXb3VsZCBpdCBiZSBiZXR0ZXIgdG8gcmVwbGFjZSB0aGUgdHJhcCB2ZWN0b3IgaGVyZT8gKi8KLQlzZXRfbm1pX2NhbGxiYWNrKGNyYXNoX25taV9jYWxsYmFjayk7CisJaWYgKHJlZ2lzdGVyX2RpZV9ub3RpZmllcigmY3Jhc2hfbm1pX25iKSkKKwkJcmV0dXJuOwkJLyogcmV0dXJuIHdoYXQ/ICovCiAJLyogRW5zdXJlIHRoZSBuZXcgY2FsbGJhY2sgZnVuY3Rpb24gaXMgc2V0IGJlZm9yZSBzZW5kaW5nCiAJICogb3V0IHRoZSBOTUkKIAkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvZW50cnkuUyBiL2FyY2gvaTM4Ni9rZXJuZWwvZW50cnkuUwppbmRleCA4N2Y5ZjYwLi41YTYzZDZmIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9lbnRyeS5TCkBAIC03Niw4ICs3NiwxNSBAQAogTlRfTUFTSwkJPSAweDAwMDA0MDAwCiBWTV9NQVNLCQk9IDB4MDAwMjAwMDAKIAorLyogVGhlc2UgYXJlIHJlcGxhY2VzIGZvciBwYXJhdmlydHVhbGl6YXRpb24gKi8KKyNkZWZpbmUgRElTQUJMRV9JTlRFUlJVUFRTCQljbGkKKyNkZWZpbmUgRU5BQkxFX0lOVEVSUlVQVFMJCXN0aQorI2RlZmluZSBFTkFCTEVfSU5URVJSVVBUU19TWVNFWElUCXN0aTsgc3lzZXhpdAorI2RlZmluZSBJTlRFUlJVUFRfUkVUVVJOCQlpcmV0CisjZGVmaW5lIEdFVF9DUjBfSU5UT19FQVgJCW1vdmwgJWNyMCwgJWVheAorCiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKLSNkZWZpbmUgcHJlZW1wdF9zdG9wCQljbGk7IFRSQUNFX0lSUVNfT0ZGCisjZGVmaW5lIHByZWVtcHRfc3RvcAkJRElTQUJMRV9JTlRFUlJVUFRTOyBUUkFDRV9JUlFTX09GRgogI2Vsc2UKICNkZWZpbmUgcHJlZW1wdF9zdG9wCiAjZGVmaW5lIHJlc3VtZV9rZXJuZWwJCXJlc3RvcmVfbm9jaGVjawpAQCAtMTc2LDE4ICsxODMsMjEgQEAKIAogI2RlZmluZSBSSU5HMF9JTlRfRlJBTUUgXAogCUNGSV9TVEFSVFBST0Mgc2ltcGxlO1wKKwlDRklfU0lHTkFMX0ZSQU1FO1wKIAlDRklfREVGX0NGQSBlc3AsIDMqNDtcCiAJLypDRklfT0ZGU0VUIGNzLCAtMio0OyovXAogCUNGSV9PRkZTRVQgZWlwLCAtMyo0CiAKICNkZWZpbmUgUklORzBfRUNfRlJBTUUgXAogCUNGSV9TVEFSVFBST0Mgc2ltcGxlO1wKKwlDRklfU0lHTkFMX0ZSQU1FO1wKIAlDRklfREVGX0NGQSBlc3AsIDQqNDtcCiAJLypDRklfT0ZGU0VUIGNzLCAtMio0OyovXAogCUNGSV9PRkZTRVQgZWlwLCAtMyo0CiAKICNkZWZpbmUgUklORzBfUFRSRUdTX0ZSQU1FIFwKIAlDRklfU1RBUlRQUk9DIHNpbXBsZTtcCisJQ0ZJX1NJR05BTF9GUkFNRTtcCiAJQ0ZJX0RFRl9DRkEgZXNwLCBPTERFU1AtRUJYO1wKIAkvKkNGSV9PRkZTRVQgY3MsIENTLU9MREVTUDsqL1wKIAlDRklfT0ZGU0VUIGVpcCwgRUlQLU9MREVTUDtcCkBAIC0yMzMsMTAgKzI0MywxMSBAQAogY2hlY2tfdXNlcnNwYWNlOgogCW1vdmwgRUZMQUdTKCVlc3ApLCAlZWF4CQkjIG1peCBFRkxBR1MgYW5kIENTCiAJbW92YiBDUyglZXNwKSwgJWFsCi0JdGVzdGwgJChWTV9NQVNLIHwgMyksICVlYXgKLQlqeiByZXN1bWVfa2VybmVsCisJYW5kbCAkKFZNX01BU0sgfCBTRUdNRU5UX1JQTF9NQVNLKSwgJWVheAorCWNtcGwgJFVTRVJfUlBMLCAlZWF4CisJamIgcmVzdW1lX2tlcm5lbAkJIyBub3QgcmV0dXJuaW5nIHRvIHY4MDg2IG9yIHVzZXJzcGFjZQogRU5UUlkocmVzdW1lX3VzZXJzcGFjZSkKLSAJY2xpCQkJCSMgbWFrZSBzdXJlIHdlIGRvbid0IG1pc3MgYW4gaW50ZXJydXB0CisgCURJU0FCTEVfSU5URVJSVVBUUwkJIyBtYWtlIHN1cmUgd2UgZG9uJ3QgbWlzcyBhbiBpbnRlcnJ1cHQKIAkJCQkJIyBzZXR0aW5nIG5lZWRfcmVzY2hlZCBvciBzaWdwZW5kaW5nCiAJCQkJCSMgYmV0d2VlbiBzYW1wbGluZyBhbmQgdGhlIGlyZXQKIAltb3ZsIFRJX2ZsYWdzKCVlYnApLCAlZWN4CkBAIC0yNDcsNyArMjU4LDcgQEAKIAogI2lmZGVmIENPTkZJR19QUkVFTVBUCiBFTlRSWShyZXN1bWVfa2VybmVsKQotCWNsaQorCURJU0FCTEVfSU5URVJSVVBUUwogCWNtcGwgJDAsVElfcHJlZW1wdF9jb3VudCglZWJwKQkjIG5vbi16ZXJvIHByZWVtcHRfY291bnQgPwogCWpueiByZXN0b3JlX25vY2hlY2sKIG5lZWRfcmVzY2hlZDoKQEAgLTI2Nyw2ICsyNzgsNyBAQAogCSMgc3lzZW50ZXIgY2FsbCBoYW5kbGVyIHN0dWIKIEVOVFJZKHN5c2VudGVyX2VudHJ5KQogCUNGSV9TVEFSVFBST0Mgc2ltcGxlCisJQ0ZJX1NJR05BTF9GUkFNRQogCUNGSV9ERUZfQ0ZBIGVzcCwgMAogCUNGSV9SRUdJU1RFUiBlc3AsIGVicAogCW1vdmwgVFNTX3N5c2VudGVyX2VzcDAoJWVzcCksJWVzcApAQCAtMjc1LDcgKzI4Nyw3IEBACiAJICogTm8gbmVlZCB0byBmb2xsb3cgdGhpcyBpcnFzIG9uL29mZiBzZWN0aW9uOiB0aGUgc3lzY2FsbAogCSAqIGRpc2FibGVkIGlycXMgYW5kIGhlcmUgd2UgZW5hYmxlIGl0IHN0cmFpZ2h0IGFmdGVyIGVudHJ5OgogCSAqLwotCXN0aQorCUVOQUJMRV9JTlRFUlJVUFRTCiAJcHVzaGwgJChfX1VTRVJfRFMpCiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAkvKkNGSV9SRUxfT0ZGU0VUIHNzLCAwKi8KQEAgLTMyMCw3ICszMzIsNyBAQAogCWphZSBzeXNjYWxsX2JhZHN5cwogCWNhbGwgKnN5c19jYWxsX3RhYmxlKCwlZWF4LDQpCiAJbW92bCAlZWF4LEVBWCglZXNwKQotCWNsaQorCURJU0FCTEVfSU5URVJSVVBUUwogCVRSQUNFX0lSUVNfT0ZGCiAJbW92bCBUSV9mbGFncyglZWJwKSwgJWVjeAogCXRlc3R3ICRfVElGX0FMTFdPUktfTUFTSywgJWN4CkBAIC0zMzAsOCArMzQyLDcgQEAKIAltb3ZsIE9MREVTUCglZXNwKSwgJWVjeAogCXhvcmwgJWVicCwlZWJwCiAJVFJBQ0VfSVJRU19PTgotCXN0aQotCXN5c2V4aXQKKwlFTkFCTEVfSU5URVJSVVBUU19TWVNFWElUCiAJQ0ZJX0VORFBST0MKIAogCkBAIC0zNTYsNyArMzY3LDcgQEAKIAljYWxsICpzeXNfY2FsbF90YWJsZSgsJWVheCw0KQogCW1vdmwgJWVheCxFQVgoJWVzcCkJCSMgc3RvcmUgdGhlIHJldHVybiB2YWx1ZQogc3lzY2FsbF9leGl0OgotCWNsaQkJCQkjIG1ha2Ugc3VyZSB3ZSBkb24ndCBtaXNzIGFuIGludGVycnVwdAorCURJU0FCTEVfSU5URVJSVVBUUwkJIyBtYWtlIHN1cmUgd2UgZG9uJ3QgbWlzcyBhbiBpbnRlcnJ1cHQKIAkJCQkJIyBzZXR0aW5nIG5lZWRfcmVzY2hlZCBvciBzaWdwZW5kaW5nCiAJCQkJCSMgYmV0d2VlbiBzYW1wbGluZyBhbmQgdGhlIGlyZXQKIAlUUkFDRV9JUlFTX09GRgpAQCAtMzcxLDggKzM4Miw4IEBACiAJIyBTZWUgY29tbWVudHMgaW4gcHJvY2Vzcy5jOmNvcHlfdGhyZWFkKCkgZm9yIGRldGFpbHMuCiAJbW92YiBPTERTUyglZXNwKSwgJWFoCiAJbW92YiBDUyglZXNwKSwgJWFsCi0JYW5kbCAkKFZNX01BU0sgfCAoNCA8PCA4KSB8IDMpLCAlZWF4Ci0JY21wbCAkKCg0IDw8IDgpIHwgMyksICVlYXgKKwlhbmRsICQoVk1fTUFTSyB8IChTRUdNRU5UX1RJX01BU0sgPDwgOCkgfCBTRUdNRU5UX1JQTF9NQVNLKSwgJWVheAorCWNtcGwgJCgoU0VHTUVOVF9MRFQgPDwgOCkgfCBVU0VSX1JQTCksICVlYXgKIAlDRklfUkVNRU1CRVJfU1RBVEUKIAlqZSBsZHRfc3MJCQkjIHJldHVybmluZyB0byB1c2VyLXNwYWNlIHdpdGggTERUIFNTCiByZXN0b3JlX25vY2hlY2s6CkBAIC0zODEsMTEgKzM5MiwxMSBAQAogCVJFU1RPUkVfUkVHUwogCWFkZGwgJDQsICVlc3AKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKLTE6CWlyZXQKKzE6CUlOVEVSUlVQVF9SRVRVUk4KIC5zZWN0aW9uIC5maXh1cCwiYXgiCiBpcmV0X2V4YzoKIAlUUkFDRV9JUlFTX09OCi0Jc3RpCisJRU5BQkxFX0lOVEVSUlVQVFMKIAlwdXNobCAkMAkJCSMgbm8gZXJyb3IgY29kZQogCXB1c2hsICRkb19pcmV0X2Vycm9yCiAJam1wIGVycm9yX2NvZGUKQEAgLTQwOSw3ICs0MjAsNyBAQAogCSAqIGRvc2VtdSBhbmQgd2luZSBoYXBweS4gKi8KIAlzdWJsICQ4LCAlZXNwCQkjIHJlc2VydmUgc3BhY2UgZm9yIHN3aXRjaDE2IHBvaW50ZXIKIAlDRklfQURKVVNUX0NGQV9PRkZTRVQgOAotCWNsaQorCURJU0FCTEVfSU5URVJSVVBUUwogCVRSQUNFX0lSUVNfT0ZGCiAJbW92bCAlZXNwLCAlZWF4CiAJLyogU2V0IHVwIHRoZSAxNmJpdCBzdGFjayBmcmFtZSB3aXRoIHN3aXRjaDMyIHBvaW50ZXIgb24gdG9wLApAQCAtNDE5LDcgKzQzMCw3IEBACiAJVFJBQ0VfSVJRU19JUkVUCiAJUkVTVE9SRV9SRUdTCiAJbHNzIDIwKzQoJWVzcCksICVlc3AJIyBzd2l0Y2ggdG8gMTZiaXQgc3RhY2sKLTE6CWlyZXQKKzE6CUlOVEVSUlVQVF9SRVRVUk4KIC5zZWN0aW9uIF9fZXhfdGFibGUsImEiCiAJLmFsaWduIDQKIAkubG9uZyAxYixpcmV0X2V4YwpAQCAtNDM0LDcgKzQ0NSw3IEBACiAJanogd29ya19ub3RpZnlzaWcKIHdvcmtfcmVzY2hlZDoKIAljYWxsIHNjaGVkdWxlCi0JY2xpCQkJCSMgbWFrZSBzdXJlIHdlIGRvbid0IG1pc3MgYW4gaW50ZXJydXB0CisJRElTQUJMRV9JTlRFUlJVUFRTCQkjIG1ha2Ugc3VyZSB3ZSBkb24ndCBtaXNzIGFuIGludGVycnVwdAogCQkJCQkjIHNldHRpbmcgbmVlZF9yZXNjaGVkIG9yIHNpZ3BlbmRpbmcKIAkJCQkJIyBiZXR3ZWVuIHNhbXBsaW5nIGFuZCB0aGUgaXJldAogCVRSQUNFX0lSUVNfT0ZGCkBAIC00OTAsNyArNTAxLDcgQEAKIAl0ZXN0YiAkKF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NZU0NBTExfQVVESVR8X1RJRl9TSU5HTEVTVEVQKSwgJWNsCiAJanogd29ya19wZW5kaW5nCiAJVFJBQ0VfSVJRU19PTgotCXN0aQkJCQkjIGNvdWxkIGxldCBkb19zeXNjYWxsX3RyYWNlKCkgY2FsbAorCUVOQUJMRV9JTlRFUlJVUFRTCQkjIGNvdWxkIGxldCBkb19zeXNjYWxsX3RyYWNlKCkgY2FsbAogCQkJCQkjIHNjaGVkdWxlKCkgaW5zdGVhZAogCW1vdmwgJWVzcCwgJWVheAogCW1vdmwgJDEsICVlZHgKQEAgLTU5MSwxMSArNjAyLDkgQEAKIC8qIFRoZSBpbmNsdWRlIGlzIHdoZXJlIGFsbCBvZiB0aGUgU01QIGV0Yy4gaW50ZXJydXB0cyBjb21lIGZyb20gKi8KICNpbmNsdWRlICJlbnRyeV9hcmNoLmgiCiAKLUVOVFJZKGRpdmlkZV9lcnJvcikKLQlSSU5HMF9JTlRfRlJBTUUKLQlwdXNobCAkMAkJCSMgbm8gZXJyb3IgY29kZQotCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0Ci0JcHVzaGwgJGRvX2RpdmlkZV9lcnJvcgorS1BST0JFX0VOVFJZKHBhZ2VfZmF1bHQpCisJUklORzBfRUNfRlJBTUUKKwlwdXNobCAkZG9fcGFnZV9mYXVsdAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CiAJQUxJR04KIGVycm9yX2NvZGU6CkBAIC02NDUsNiArNjU0LDcgQEAKIAljYWxsIColZWRpCiAJam1wIHJldF9mcm9tX2V4Y2VwdGlvbgogCUNGSV9FTkRQUk9DCitLUFJPQkVfRU5EKHBhZ2VfZmF1bHQpCiAKIEVOVFJZKGNvcHJvY2Vzc29yX2Vycm9yKQogCVJJTkcwX0lOVF9GUkFNRQpAQCAtNjY5LDcgKzY3OSw3IEBACiAJcHVzaGwgJC0xCQkJIyBtYXJrIHRoaXMgYXMgYW4gaW50CiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlTQVZFX0FMTAotCW1vdmwgJWNyMCwgJWVheAorCUdFVF9DUjBfSU5UT19FQVgKIAl0ZXN0bCAkMHg0LCAlZWF4CQkjIEVNIChtYXRoIGVtdWxhdGlvbiBiaXQpCiAJam5lIGRldmljZV9ub3RfYXZhaWxhYmxlX2VtdWxhdGUKIAlwcmVlbXB0X3N0b3AKQEAgLTcwMiw5ICs3MTIsMTUgQEAKIAlqbmUgb2s7CQkJCQlcCiBsYWJlbDoJCQkJCQlcCiAJbW92bCBUU1Nfc3lzZW50ZXJfZXNwMCtvZmZzZXQoJWVzcCksJWVzcDsJXAorCUNGSV9ERUZfQ0ZBIGVzcCwgMDsJCQlcCisJQ0ZJX1VOREVGSU5FRCBlaXA7CQkJXAogCXB1c2hmbDsJCQkJCVwKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNDsJCVwKIAlwdXNobCAkX19LRVJORUxfQ1M7CQkJXAotCXB1c2hsICRzeXNlbnRlcl9wYXN0X2VzcAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0OwkJXAorCXB1c2hsICRzeXNlbnRlcl9wYXN0X2VzcDsJCVwKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNDsJCVwKKwlDRklfUkVMX09GRlNFVCBlaXAsIDAKIAogS1BST0JFX0VOVFJZKGRlYnVnKQogCVJJTkcwX0lOVF9GUkFNRQpAQCAtNzIwLDcgKzczNiw4IEBACiAJY2FsbCBkb19kZWJ1ZwogCWptcCByZXRfZnJvbV9leGNlcHRpb24KIAlDRklfRU5EUFJPQwotCS5wcmV2aW91cyAudGV4dAorS1BST0JFX0VORChkZWJ1ZykKKwogLyoKICAqIE5NSSBpcyBkb3VibHkgbmFzdHkuIEl0IGNhbiBoYXBwZW4gX3doaWxlXyB3ZSdyZSBoYW5kbGluZwogICogYSBkZWJ1ZyBmYXVsdCwgYW5kIHRoZSBkZWJ1ZyBmYXVsdCBoYXNuJ3QgeWV0IGJlZW4gYWJsZSB0bwpAQCAtNzI5LDcgKzc0Niw3IEBACiAgKiBjaGVjayB3aGV0aGVyIHdlIGdvdCBhbiBOTUkgb24gdGhlIGRlYnVnIHBhdGggd2hlcmUgdGhlIGRlYnVnCiAgKiBmYXVsdCBoYXBwZW5lZCBvbiB0aGUgc3lzZW50ZXIgcGF0aC4KICAqLwotRU5UUlkobm1pKQorS1BST0JFX0VOVFJZKG5taSkKIAlSSU5HMF9JTlRfRlJBTUUKIAlwdXNobCAlZWF4CiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKQEAgLTc1NCw2ICs3NzEsNyBAQAogCWNtcGwgJHN5c2VudGVyX2VudHJ5LDEyKCVlc3ApCiAJamUgbm1pX2RlYnVnX3N0YWNrX2NoZWNrCiBubWlfc3RhY2tfY29ycmVjdDoKKwkvKiBXZSBoYXZlIGEgUklORzBfSU5UX0ZSQU1FIGhlcmUgKi8KIAlwdXNobCAlZWF4CiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlTQVZFX0FMTApAQCAtNzY0LDkgKzc4MiwxMiBAQAogCUNGSV9FTkRQUk9DCiAKIG5taV9zdGFja19maXh1cDoKKwlSSU5HMF9JTlRfRlJBTUUKIAlGSVhfU1RBQ0soMTIsbm1pX3N0YWNrX2NvcnJlY3QsIDEpCiAJam1wIG5taV9zdGFja19jb3JyZWN0CisKIG5taV9kZWJ1Z19zdGFja19jaGVjazoKKwkvKiBXZSBoYXZlIGEgUklORzBfSU5UX0ZSQU1FIGhlcmUgKi8KIAljbXB3ICRfX0tFUk5FTF9DUywxNiglZXNwKQogCWpuZSBubWlfc3RhY2tfY29ycmVjdAogCWNtcGwgJGRlYnVnLCglZXNwKQpAQCAtNzc3LDggKzc5OCwxMCBAQAogCWptcCBubWlfc3RhY2tfY29ycmVjdAogCiBubWlfMTZiaXRfc3RhY2s6Ci0JUklORzBfSU5UX0ZSQU1FCi0JLyogY3JlYXRlIHRoZSBwb2ludGVyIHRvIGxzcyBiYWNrICovCisJLyogV2UgaGF2ZSBhIFJJTkcwX0lOVF9GUkFNRSBoZXJlLgorCSAqCisJICogY3JlYXRlIHRoZSBwb2ludGVyIHRvIGxzcyBiYWNrCisJICovCiAJcHVzaGwgJXNzCiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlwdXNobCAlZXNwCkBAIC03OTksMTIgKzgyMiwxMyBAQAogCWNhbGwgZG9fbm1pCiAJUkVTVE9SRV9SRUdTCiAJbHNzIDEyKzQoJWVzcCksICVlc3AJCSMgYmFjayB0byAxNmJpdCBzdGFjawotMToJaXJldAorMToJSU5URVJSVVBUX1JFVFVSTgogCUNGSV9FTkRQUk9DCiAuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgogCS5hbGlnbiA0CiAJLmxvbmcgMWIsaXJldF9leGMKIC5wcmV2aW91cworS1BST0JFX0VORChubWkpCiAKIEtQUk9CRV9FTlRSWShpbnQzKQogCVJJTkcwX0lOVF9GUkFNRQpAQCAtODE2LDcgKzg0MCw3IEBACiAJY2FsbCBkb19pbnQzCiAJam1wIHJldF9mcm9tX2V4Y2VwdGlvbgogCUNGSV9FTkRQUk9DCi0JLnByZXZpb3VzIC50ZXh0CitLUFJPQkVfRU5EKGludDMpCiAKIEVOVFJZKG92ZXJmbG93KQogCVJJTkcwX0lOVF9GUkFNRQpAQCAtODgxLDcgKzkwNSw3IEBACiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlqbXAgZXJyb3JfY29kZQogCUNGSV9FTkRQUk9DCi0JLnByZXZpb3VzIC50ZXh0CitLUFJPQkVfRU5EKGdlbmVyYWxfcHJvdGVjdGlvbikKIAogRU5UUlkoYWxpZ25tZW50X2NoZWNrKQogCVJJTkcwX0VDX0ZSQU1FCkBAIC04OTAsMTMgKzkxNCwxNCBAQAogCWptcCBlcnJvcl9jb2RlCiAJQ0ZJX0VORFBST0MKIAotS1BST0JFX0VOVFJZKHBhZ2VfZmF1bHQpCi0JUklORzBfRUNfRlJBTUUKLQlwdXNobCAkZG9fcGFnZV9mYXVsdAorRU5UUlkoZGl2aWRlX2Vycm9yKQorCVJJTkcwX0lOVF9GUkFNRQorCXB1c2hsICQwCQkJIyBubyBlcnJvciBjb2RlCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwlwdXNobCAkZG9fZGl2aWRlX2Vycm9yCiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAlqbXAgZXJyb3JfY29kZQogCUNGSV9FTkRQUk9DCi0JLnByZXZpb3VzIC50ZXh0CiAKICNpZmRlZiBDT05GSUdfWDg2X01DRQogRU5UUlkobWFjaGluZV9jaGVjaykKQEAgLTk0OSw2ICs5NzQsMTkgQEAKIEVORFBST0MoYXJjaF91bndpbmRfaW5pdF9ydW5uaW5nKQogI2VuZGlmCiAKK0VOVFJZKGtlcm5lbF90aHJlYWRfaGVscGVyKQorCXB1c2hsICQwCQkjIGZha2UgcmV0dXJuIGFkZHJlc3MgZm9yIHVud2luZGVyCisJQ0ZJX1NUQVJUUFJPQworCW1vdmwgJWVkeCwlZWF4CisJcHVzaCAlZWR4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwljYWxsIColZWJ4CisJcHVzaCAlZWF4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwljYWxsIGRvX2V4aXQKKwlDRklfRU5EUFJPQworRU5EUFJPQyhrZXJuZWxfdGhyZWFkX2hlbHBlcikKKwogLnNlY3Rpb24gLnJvZGF0YSwiYSIKICNpbmNsdWRlICJzeXNjYWxsX3RhYmxlLlMiCiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaGVhZC5TIGIvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMKaW5kZXggYTZiOGJkOC4uYmU5ZDg4MyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9oZWFkLlMKQEAgLTM3MSw4ICszNzEsNjUgQEAKIAlhZGRsICQ4LCVlZGkKIAlkZWMgJWVjeAogCWpuZSBycF9zaWR0CisKKy5tYWNybwlzZXRfZWFybHlfaGFuZGxlciBoYW5kbGVyLHRyYXBubworCWxlYSBcaGFuZGxlciwlZWR4CisJbW92bCAkKF9fS0VSTkVMX0NTIDw8IDE2KSwlZWF4CisJbW92dyAlZHgsJWF4CisJbW92dyAkMHg4RTAwLCVkeAkvKiBpbnRlcnJ1cHQgZ2F0ZSAtIGRwbD0wLCBwcmVzZW50ICovCisJbGVhIGlkdF90YWJsZSwlZWRpCisJbW92bCAlZWF4LDgqXHRyYXBubyglZWRpKQorCW1vdmwgJWVkeCw4Klx0cmFwbm8rNCglZWRpKQorLmVuZG0KKworCXNldF9lYXJseV9oYW5kbGVyIGhhbmRsZXI9ZWFybHlfZGl2aWRlX2Vycix0cmFwbm89MAorCXNldF9lYXJseV9oYW5kbGVyIGhhbmRsZXI9ZWFybHlfaWxsZWdhbF9vcGNvZGUsdHJhcG5vPTYKKwlzZXRfZWFybHlfaGFuZGxlciBoYW5kbGVyPWVhcmx5X3Byb3RlY3Rpb25fZmF1bHQsdHJhcG5vPTEzCisJc2V0X2Vhcmx5X2hhbmRsZXIgaGFuZGxlcj1lYXJseV9wYWdlX2ZhdWx0LHRyYXBubz0xNAorCiAJcmV0CiAKK2Vhcmx5X2RpdmlkZV9lcnI6CisJeG9yICVlZHgsJWVkeAorCXB1c2hsICQwCS8qIGZha2UgZXJyY29kZSAqLworCWptcCBlYXJseV9mYXVsdAorCitlYXJseV9pbGxlZ2FsX29wY29kZToKKwltb3ZsICQ2LCVlZHgKKwlwdXNobCAkMAkvKiBmYWtlIGVycmNvZGUgKi8KKwlqbXAgZWFybHlfZmF1bHQKKworZWFybHlfcHJvdGVjdGlvbl9mYXVsdDoKKwltb3ZsICQxMywlZWR4CisJam1wIGVhcmx5X2ZhdWx0CisKK2Vhcmx5X3BhZ2VfZmF1bHQ6CisJbW92bCAkMTQsJWVkeAorCWptcCBlYXJseV9mYXVsdAorCitlYXJseV9mYXVsdDoKKwljbGQKKyNpZmRlZiBDT05GSUdfUFJJTlRLCisJbW92bCAkKF9fS0VSTkVMX0RTKSwlZWF4CisJbW92bCAlZWF4LCVkcworCW1vdmwgJWVheCwlZXMKKwljbXBsICQyLGVhcmx5X3JlY3Vyc2lvbl9mbGFnCisJamUgaGx0X2xvb3AKKwlpbmNsIGVhcmx5X3JlY3Vyc2lvbl9mbGFnCisJbW92bCAlY3IyLCVlYXgKKwlwdXNobCAlZWF4CisJcHVzaGwgJWVkeAkJLyogdHJhcG5vICovCisJcHVzaGwgJGZhdWx0X21zZworI2lmZGVmIENPTkZJR19FQVJMWV9QUklOVEsKKwljYWxsIGVhcmx5X3ByaW50aworI2Vsc2UKKwljYWxsIHByaW50aworI2VuZGlmCisjZW5kaWYKK2hsdF9sb29wOgorCWhsdAorCWptcCBobHRfbG9vcAorCiAvKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGludGVycnVwdCAiaGFuZGxlciIgOi0pICovCiAJQUxJR04KIGlnbm9yZV9pbnQ6CkBAIC0zODYsNiArNDQzLDkgQEAKIAltb3ZsICQoX19LRVJORUxfRFMpLCVlYXgKIAltb3ZsICVlYXgsJWRzCiAJbW92bCAlZWF4LCVlcworCWNtcGwgJDIsZWFybHlfcmVjdXJzaW9uX2ZsYWcKKwlqZSBobHRfbG9vcAorCWluY2wgZWFybHlfcmVjdXJzaW9uX2ZsYWcKIAlwdXNobCAxNiglZXNwKQogCXB1c2hsIDI0KCVlc3ApCiAJcHVzaGwgMzIoJWVzcCkKQEAgLTQzMSw5ICs0OTEsMTYgQEAKIAogcmVhZHk6CS5ieXRlIDAKIAorZWFybHlfcmVjdXJzaW9uX2ZsYWc6CisJLmxvbmcgMAorCiBpbnRfbXNnOgogCS5hc2NpeiAiVW5rbm93biBpbnRlcnJ1cHQgb3IgZmF1bHQgYXQgRUlQICVwICVwICVwXG4iCiAKK2ZhdWx0X21zZzoKKwkuYXNjaWkgIkludCAlZDogQ1IyICVwICBlcnIgJXAgIEVJUCAlcCAgQ1MgJXAgIGZsYWdzICVwXG4iCisJLmFzY2l6ICJTdGFjazogJXAgJXAgJXAgJXAgJXAgJXAgJXAgJXBcbiIKKwogLyoKICAqIFRoZSBJRFQgYW5kIEdEVCAnZGVzY3JpcHRvcnMnIGFyZSBhIHN0cmFuZ2UgNDgtYml0IG9iamVjdAogICogb25seSB1c2VkIGJ5IHRoZSBsaWR0IGFuZCBsZ2R0IGluc3RydWN0aW9ucy4gVGhleSBhcmUgbm90CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2k4MjU5LmMgYi9hcmNoL2kzODYva2VybmVsL2k4MjU5LmMKaW5kZXggZDQ3NTZkMS4uZWE1ZjRlNyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYwpAQCAtNDUsNiArNDUsOCBAQAogCiAjZGVmaW5lIHNodXRkb3duXzgyNTlBX2lycQlkaXNhYmxlXzgyNTlBX2lycQogCitzdGF0aWMgaW50IGk4MjU5QV9hdXRvX2VvaTsKKwogc3RhdGljIHZvaWQgbWFza19hbmRfYWNrXzgyNTlBKHVuc2lnbmVkIGludCk7CiAKIHVuc2lnbmVkIGludCBzdGFydHVwXzgyNTlBX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMjUzLDcgKzI1NSw3IEBACiAKIHN0YXRpYyBpbnQgaTgyNTlBX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQogewotCWluaXRfODI1OUEoMCk7CisJaW5pdF84MjU5QShpODI1OUFfYXV0b19lb2kpOwogCXJlc3RvcmVfRUxDUihpcnFfdHJpZ2dlcik7CiAJcmV0dXJuIDA7CiB9CkBAIC0zMDEsNiArMzAzLDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJaTgyNTlBX2F1dG9fZW9pID0gYXV0b19lb2k7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKIAogCW91dGIoMHhmZiwgUElDX01BU1RFUl9JTVIpOwkvKiBtYXNrIGFsbCBvZiA4MjU5QS0xICovCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCmluZGV4IDRmYjMyYzUuLmZkMGRmNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8YXNtL25taS5oPgogCiAjaW5jbHVkZSA8bWFjaF9hcGljLmg+CisjaW5jbHVkZSA8bWFjaF9hcGljZGVmLmg+CiAKICNpbmNsdWRlICJpb19wb3J0cy5oIgogCkBAIC02NSw3ICs2Niw3IEBACiAgKi8KIGludCBucl9pb2FwaWNfcmVnaXN0ZXJzW01BWF9JT19BUElDU107CiAKLWludCBkaXNhYmxlX3RpbWVyX3Bpbl8xIF9faW5pdGRhdGE7CitzdGF0aWMgaW50IGRpc2FibGVfdGltZXJfcGluXzEgX19pbml0ZGF0YTsKIAogLyoKICAqIFJvdWdoIGVzdGltYXRpb24gb2YgaG93IG1hbnkgc2hhcmVkIElSUXMgdGhlcmUgYXJlLCBjYW4KQEAgLTkzLDYgKzk0LDM0IEBACiAjZGVmaW5lIHZlY3Rvcl90b19pcnEodmVjdG9yKQkodmVjdG9yKQogI2VuZGlmCiAKKwordW5pb24gZW50cnlfdW5pb24geworCXN0cnVjdCB7IHUzMiB3MSwgdzI7IH07CisJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7Cit9OworCitzdGF0aWMgc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgaW9hcGljX3JlYWRfZW50cnkoaW50IGFwaWMsIGludCBwaW4pCit7CisJdW5pb24gZW50cnlfdW5pb24gZXU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlldS53MSA9IGlvX2FwaWNfcmVhZChhcGljLCAweDEwICsgMiAqIHBpbik7CisJZXUudzIgPSBpb19hcGljX3JlYWQoYXBpYywgMHgxMSArIDIgKiBwaW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGV1LmVudHJ5OworfQorCitzdGF0aWMgdm9pZCBpb2FwaWNfd3JpdGVfZW50cnkoaW50IGFwaWMsIGludCBwaW4sIHN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bmlvbiBlbnRyeV91bmlvbiBldTsKKwlldS5lbnRyeSA9IGU7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJaW9fYXBpY193cml0ZShhcGljLCAweDEwICsgMipwaW4sIGV1LncxKTsKKwlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTEgKyAyKnBpbiwgZXUudzIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Cit9CisKIC8qCiAgKiBUaGUgY29tbW9uIGNhc2UgaXMgMToxIElSUTwtPnBpbiBtYXBwaW5ncy4gU29tZXRpbWVzIHRoZXJlIGFyZQogICogc2hhcmVkIElTQS1zcGFjZSBJUlFzLCBzbyB3ZSBoYXZlIHRvIHN1cHBvcnQgdGhlbS4gV2UgYXJlIHN1cGVyCkBAIC0yMDAsMTMgKzIyOSw5IEBACiBzdGF0aWMgdm9pZCBjbGVhcl9JT19BUElDX3Bpbih1bnNpZ25lZCBpbnQgYXBpYywgdW5zaWduZWQgaW50IHBpbikKIHsKIAlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlbnRyeTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCQogCS8qIENoZWNrIGRlbGl2ZXJ5X21vZGUgdG8gYmUgc3VyZSB3ZSdyZSBub3QgY2xlYXJpbmcgYW4gU01JIHBpbiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCSooKChpbnQqKSZlbnRyeSkgKyAwKSA9IGlvX2FwaWNfcmVhZChhcGljLCAweDEwICsgMiAqIHBpbik7Ci0JKigoKGludCopJmVudHJ5KSArIDEpID0gaW9fYXBpY19yZWFkKGFwaWMsIDB4MTEgKyAyICogcGluKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWVudHJ5ID0gaW9hcGljX3JlYWRfZW50cnkoYXBpYywgcGluKTsKIAlpZiAoZW50cnkuZGVsaXZlcnlfbW9kZSA9PSBkZXN0X1NNSSkKIAkJcmV0dXJuOwogCkBAIC0yMTUsMTAgKzI0MCw3IEBACiAJICovCiAJbWVtc2V0KCZlbnRyeSwgMCwgc2l6ZW9mKGVudHJ5KSk7CiAJZW50cnkubWFzayA9IDE7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JaW9fYXBpY193cml0ZShhcGljLCAweDEwICsgMiAqIHBpbiwgKigoKGludCAqKSZlbnRyeSkgKyAwKSk7Ci0JaW9fYXBpY193cml0ZShhcGljLCAweDExICsgMiAqIHBpbiwgKigoKGludCAqKSZlbnRyeSkgKyAxKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlpb2FwaWNfd3JpdGVfZW50cnkoYXBpYywgcGluLCBlbnRyeSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNsZWFyX0lPX0FQSUMgKHZvaWQpCkBAIC0xMjgzLDkgKzEzMDUsOCBAQAogCQkJaWYgKCFhcGljICYmIChpcnEgPCAxNikpCiAJCQkJZGlzYWJsZV84MjU5QV9pcnEoaXJxKTsKIAkJfQorCQlpb2FwaWNfd3JpdGVfZW50cnkoYXBpYywgcGluLCBlbnRyeSk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCQlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTErMipwaW4sICooKChpbnQgKikmZW50cnkpKzEpKTsKLQkJaW9fYXBpY193cml0ZShhcGljLCAweDEwKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSswKSk7CiAJCXNldF9uYXRpdmVfaXJxX2luZm8oaXJxLCBUQVJHRVRfQ1BVUyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CiAJfQpAQCAtMTMwMSw3ICsxMzIyLDYgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9FeHRJTlRfSVJRMF9waW4odW5zaWduZWQgaW50IGFwaWMsIHVuc2lnbmVkIGludCBwaW4sIGludCB2ZWN0b3IpCiB7CiAJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCW1lbXNldCgmZW50cnksMCxzaXplb2YoZW50cnkpKTsKIApAQCAtMTMzMSwxMCArMTM1MSw3IEBACiAJLyoKIAkgKiBBZGQgaXQgdG8gdGhlIElPLUFQSUMgaXJxLXJvdXRpbmcgdGFibGU6CiAJICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JaW9fYXBpY193cml0ZShhcGljLCAweDExKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSsxKSk7Ci0JaW9fYXBpY193cml0ZShhcGljLCAweDEwKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSswKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlpb2FwaWNfd3JpdGVfZW50cnkoYXBpYywgcGluLCBlbnRyeSk7CiAKIAllbmFibGVfODI1OUFfaXJxKDApOwogfQpAQCAtMTQ0NCwxMCArMTQ2MSw3IEBACiAJZm9yIChpID0gMDsgaSA8PSByZWdfMDEuYml0cy5lbnRyaWVzOyBpKyspIHsKIAkJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JCSooKChpbnQgKikmZW50cnkpKzApID0gaW9fYXBpY19yZWFkKGFwaWMsIDB4MTAraSoyKTsKLQkJKigoKGludCAqKSZlbnRyeSkrMSkgPSBpb19hcGljX3JlYWQoYXBpYywgMHgxMStpKjIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCQllbnRyeSA9IGlvYXBpY19yZWFkX2VudHJ5KGFwaWMsIGkpOwogCiAJCXByaW50ayhLRVJOX0RFQlVHICIgJTAyeCAlMDNYICUwMlggICIsCiAJCQlpLApAQCAtMTY2NiwxMCArMTY4MCw3IEBACiAJCS8qIFNlZSBpZiBhbnkgb2YgdGhlIHBpbnMgaXMgaW4gRXh0SU5UIG1vZGUgKi8KIAkJZm9yIChwaW4gPSAwOyBwaW4gPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2FwaWNdOyBwaW4rKykgewogCQkJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLQkJCSooKChpbnQgKikmZW50cnkpICsgMCkgPSBpb19hcGljX3JlYWQoYXBpYywgMHgxMCArIDIgKiBwaW4pOwotCQkJKigoKGludCAqKSZlbnRyeSkgKyAxKSA9IGlvX2FwaWNfcmVhZChhcGljLCAweDExICsgMiAqIHBpbik7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCQkJZW50cnkgPSBpb2FwaWNfcmVhZF9lbnRyeShhcGljLCBwaW4pOwogCiAKIAkJCS8qIElmIHRoZSBpbnRlcnJ1cHQgbGluZSBpcyBlbmFibGVkIGFuZCBpbiBFeHRJbnQgbW9kZQpAQCAtMTcyNiw3ICsxNzM3LDYgQEAKIAkgKi8KIAlpZiAoaW9hcGljX2k4MjU5LnBpbiAhPSAtMSkgewogCQlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlbnRyeTsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCQltZW1zZXQoJmVudHJ5LCAwLCBzaXplb2YoZW50cnkpKTsKIAkJZW50cnkubWFzayAgICAgICAgICAgID0gMDsgLyogRW5hYmxlZCAqLwpAQCAtMTc0MywxMiArMTc1Myw3IEBACiAJCS8qCiAJCSAqIEFkZCBpdCB0byB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKIAkJICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCQlpb19hcGljX3dyaXRlKGlvYXBpY19pODI1OS5hcGljLCAweDExKzIqaW9hcGljX2k4MjU5LnBpbiwKLQkJCSooKChpbnQgKikmZW50cnkpKzEpKTsKLQkJaW9fYXBpY193cml0ZShpb2FwaWNfaTgyNTkuYXBpYywgMHgxMCsyKmlvYXBpY19pODI1OS5waW4sCi0JCQkqKCgoaW50ICopJmVudHJ5KSswKSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJCWlvYXBpY193cml0ZV9lbnRyeShpb2FwaWNfaTgyNTkuYXBpYywgaW9hcGljX2k4MjU5LnBpbiwgZW50cnkpOwogCX0KIAlkaXNjb25uZWN0X2JzcF9BUElDKGlvYXBpY19pODI1OS5waW4gIT0gLTEpOwogfQpAQCAtMjIxMywxNyArMjIxOCwxMyBAQAogCWludCBhcGljLCBwaW4sIGk7CiAJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnkwLCBlbnRyeTE7CiAJdW5zaWduZWQgY2hhciBzYXZlX2NvbnRyb2wsIHNhdmVfZnJlcV9zZWxlY3Q7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXBpbiAgPSBmaW5kX2lzYV9pcnFfcGluKDgsIG1wX0lOVCk7CiAJYXBpYyA9IGZpbmRfaXNhX2lycV9hcGljKDgsIG1wX0lOVCk7CiAJaWYgKHBpbiA9PSAtMSkKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JKigoKGludCAqKSZlbnRyeTApICsgMSkgPSBpb19hcGljX3JlYWQoYXBpYywgMHgxMSArIDIgKiBwaW4pOwotCSooKChpbnQgKikmZW50cnkwKSArIDApID0gaW9fYXBpY19yZWFkKGFwaWMsIDB4MTAgKyAyICogcGluKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOworCWVudHJ5MCA9IGlvYXBpY19yZWFkX2VudHJ5KGFwaWMsIHBpbik7CiAJY2xlYXJfSU9fQVBJQ19waW4oYXBpYywgcGluKTsKIAogCW1lbXNldCgmZW50cnkxLCAwLCBzaXplb2YoZW50cnkxKSk7CkBAIC0yMjM2LDEwICsyMjM3LDcgQEAKIAllbnRyeTEudHJpZ2dlciA9IDA7CiAJZW50cnkxLnZlY3RvciA9IDA7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLQlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTEgKyAyICogcGluLCAqKCgoaW50ICopJmVudHJ5MSkgKyAxKSk7Ci0JaW9fYXBpY193cml0ZShhcGljLCAweDEwICsgMiAqIHBpbiwgKigoKGludCAqKSZlbnRyeTEpICsgMCkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJaW9hcGljX3dyaXRlX2VudHJ5KGFwaWMsIHBpbiwgZW50cnkxKTsKIAogCXNhdmVfY29udHJvbCA9IENNT1NfUkVBRChSVENfQ09OVFJPTCk7CiAJc2F2ZV9mcmVxX3NlbGVjdCA9IENNT1NfUkVBRChSVENfRlJFUV9TRUxFQ1QpOwpAQCAtMjI1OCwxMCArMjI1Niw3IEBACiAJQ01PU19XUklURShzYXZlX2ZyZXFfc2VsZWN0LCBSVENfRlJFUV9TRUxFQ1QpOwogCWNsZWFyX0lPX0FQSUNfcGluKGFwaWMsIHBpbik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLQlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTEgKyAyICogcGluLCAqKCgoaW50ICopJmVudHJ5MCkgKyAxKSk7Ci0JaW9fYXBpY193cml0ZShhcGljLCAweDEwICsgMiAqIHBpbiwgKigoKGludCAqKSZlbnRyeTApICsgMCkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJaW9hcGljX3dyaXRlX2VudHJ5KGFwaWMsIHBpbiwgZW50cnkwKTsKIH0KIAogaW50IHRpbWVyX3VzZXNfaW9hcGljX3Bpbl8wOwpAQCAtMjQ2MSwxNyArMjQ1NiwxMiBAQAogewogCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5ICplbnRyeTsKIAlzdHJ1Y3Qgc3lzZnNfaW9hcGljX2RhdGEgKmRhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKIAkKIAlkYXRhID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHN5c2ZzX2lvYXBpY19kYXRhLCBkZXYpOwogCWVudHJ5ID0gZGF0YS0+ZW50cnk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY19yZWdpc3RlcnNbZGV2LT5pZF07IGkgKyssIGVudHJ5ICsrICkgewotCQkqKCgoaW50ICopZW50cnkpICsgMSkgPSBpb19hcGljX3JlYWQoZGV2LT5pZCwgMHgxMSArIDIgKiBpKTsKLQkJKigoKGludCAqKWVudHJ5KSArIDApID0gaW9fYXBpY19yZWFkKGRldi0+aWQsIDB4MTAgKyAyICogaSk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY19yZWdpc3RlcnNbZGV2LT5pZF07IGkgKyspCisJCWVudHJ5W2ldID0gaW9hcGljX3JlYWRfZW50cnkoZGV2LT5pZCwgaSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI0OTMsMTEgKzI0ODMsOSBAQAogCQlyZWdfMDAuYml0cy5JRCA9IG1wX2lvYXBpY3NbZGV2LT5pZF0ubXBjX2FwaWNpZDsKIAkJaW9fYXBpY193cml0ZShkZXYtPmlkLCAwLCByZWdfMDAucmF3KTsKIAl9Ci0JZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY19yZWdpc3RlcnNbZGV2LT5pZF07IGkgKyssIGVudHJ5ICsrICkgewotCQlpb19hcGljX3dyaXRlKGRldi0+aWQsIDB4MTErMippLCAqKCgoaW50ICopZW50cnkpKzEpKTsKLQkJaW9fYXBpY193cml0ZShkZXYtPmlkLCAweDEwKzIqaSwgKigoKGludCAqKWVudHJ5KSswKSk7Ci0JfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY19yZWdpc3RlcnNbZGV2LT5pZF07IGkgKyspCisJCWlvYXBpY193cml0ZV9lbnRyeShkZXYtPmlkLCBpLCBlbnRyeVtpXSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI2OTQsOSArMjY4Miw4IEBACiAJaWYgKCFpb2FwaWMgJiYgKGlycSA8IDE2KSkKIAkJZGlzYWJsZV84MjU5QV9pcnEoaXJxKTsKIAorCWlvYXBpY193cml0ZV9lbnRyeShpb2FwaWMsIHBpbiwgZW50cnkpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCWlvX2FwaWNfd3JpdGUoaW9hcGljLCAweDExKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSsxKSk7Ci0JaW9fYXBpY193cml0ZShpb2FwaWMsIDB4MTArMipwaW4sICooKChpbnQgKikmZW50cnkpKzApKTsKIAlzZXRfbmF0aXZlX2lycV9pbmZvKHVzZV9wY2lfdmVjdG9yKCkgPyBlbnRyeS52ZWN0b3IgOiBpcnEsIFRBUkdFVF9DUFVTKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwogCkBAIC0yNzA0LDMgKzI2OTEsMjUgQEAKIH0KIAogI2VuZGlmIC8qIENPTkZJR19BQ1BJICovCisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX2Rpc2FibGVfdGltZXJfcGluXzEoY2hhciAqYXJnKQoreworCWRpc2FibGVfdGltZXJfcGluXzEgPSAxOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oImRpc2FibGVfdGltZXJfcGluXzEiLCBwYXJzZV9kaXNhYmxlX3RpbWVyX3Bpbl8xKTsKKworc3RhdGljIGludCBfX2luaXQgcGFyc2VfZW5hYmxlX3RpbWVyX3Bpbl8xKGNoYXIgKmFyZykKK3sKKwlkaXNhYmxlX3RpbWVyX3Bpbl8xID0gLTE7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgiZW5hYmxlX3RpbWVyX3Bpbl8xIiwgcGFyc2VfZW5hYmxlX3RpbWVyX3Bpbl8xKTsKKworc3RhdGljIGludCBfX2luaXQgcGFyc2Vfbm9hcGljKGNoYXIgKmFyZykKK3sKKwkvKiBkaXNhYmxlIElPLUFQSUMgKi8KKwlkaXNhYmxlX2lvYXBpY19zZXR1cCgpOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oIm5vYXBpYyIsIHBhcnNlX25vYXBpYyk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL21hY2hpbmVfa2V4ZWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCmluZGV4IDZiMWFlNmIuLjkxOTY2YmEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CkBAIC0yMCw3MCArMjEsMTMgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKICNkZWZpbmUgUEFHRV9BTElHTkVEIF9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXyhQQUdFX1NJWkUpKSkKLQotI2RlZmluZSBMMF9BVFRSIChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlcgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZKQotI2RlZmluZSBMMV9BVFRSIChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlcgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZKQotI2RlZmluZSBMMl9BVFRSIChfUEFHRV9QUkVTRU5UKQotCi0jZGVmaW5lIExFVkVMMF9TSVpFICgxVUwgPDwgMTJVTCkKLQotI2lmbmRlZiBDT05GSUdfWDg2X1BBRQotI2RlZmluZSBMRVZFTDFfU0laRSAoMVVMIDw8IDIyVUwpCi1zdGF0aWMgdTMyIHBndGFibGVfbGV2ZWwxWzEwMjRdIFBBR0VfQUxJR05FRDsKLQotc3RhdGljIHZvaWQgaWRlbnRpdHlfbWFwX3BhZ2UodW5zaWduZWQgbG9uZyBhZGRyZXNzKQotewotCXVuc2lnbmVkIGxvbmcgbGV2ZWwxX2luZGV4LCBsZXZlbDJfaW5kZXg7Ci0JdTMyICpwZ3RhYmxlX2xldmVsMjsKLQotCS8qIEZpbmQgdGhlIGN1cnJlbnQgcGFnZSB0YWJsZSAqLwotCXBndGFibGVfbGV2ZWwyID0gX192YShyZWFkX2NyMygpKTsKLQotCS8qIEZpbmQgdGhlIGluZGV4ZXMgb2YgdGhlIHBoeXNpY2FsIGFkZHJlc3MgdG8gaWRlbnRpdHkgbWFwICovCi0JbGV2ZWwxX2luZGV4ID0gKGFkZHJlc3MgJSBMRVZFTDFfU0laRSkvTEVWRUwwX1NJWkU7Ci0JbGV2ZWwyX2luZGV4ID0gYWRkcmVzcyAvIExFVkVMMV9TSVpFOwotCi0JLyogSWRlbnRpdHkgbWFwIHRoZSBwYWdlIHRhYmxlIGVudHJ5ICovCi0JcGd0YWJsZV9sZXZlbDFbbGV2ZWwxX2luZGV4XSA9IGFkZHJlc3MgfCBMMF9BVFRSOwotCXBndGFibGVfbGV2ZWwyW2xldmVsMl9pbmRleF0gPSBfX3BhKHBndGFibGVfbGV2ZWwxKSB8IEwxX0FUVFI7Ci0KLQkvKiBGbHVzaCB0aGUgdGxiIHNvIHRoZSBuZXcgbWFwcGluZyB0YWtlcyBlZmZlY3QuCi0JICogR2xvYmFsIHRsYiBlbnRyaWVzIGFyZSBub3QgZmx1c2hlZCBidXQgdGhhdCBpcyBub3QgYW4gaXNzdWUuCi0JICovCi0JbG9hZF9jcjMocGd0YWJsZV9sZXZlbDIpOwotfQotCi0jZWxzZQotI2RlZmluZSBMRVZFTDFfU0laRSAoMVVMIDw8IDIxVUwpCi0jZGVmaW5lIExFVkVMMl9TSVpFICgxVUwgPDwgMzBVTCkKLXN0YXRpYyB1NjQgcGd0YWJsZV9sZXZlbDFbNTEyXSBQQUdFX0FMSUdORUQ7Ci1zdGF0aWMgdTY0IHBndGFibGVfbGV2ZWwyWzUxMl0gUEFHRV9BTElHTkVEOwotCi1zdGF0aWMgdm9pZCBpZGVudGl0eV9tYXBfcGFnZSh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCi17Ci0JdW5zaWduZWQgbG9uZyBsZXZlbDFfaW5kZXgsIGxldmVsMl9pbmRleCwgbGV2ZWwzX2luZGV4OwotCXU2NCAqcGd0YWJsZV9sZXZlbDM7Ci0KLQkvKiBGaW5kIHRoZSBjdXJyZW50IHBhZ2UgdGFibGUgKi8KLQlwZ3RhYmxlX2xldmVsMyA9IF9fdmEocmVhZF9jcjMoKSk7Ci0KLQkvKiBGaW5kIHRoZSBpbmRleGVzIG9mIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHRvIGlkZW50aXR5IG1hcCAqLwotCWxldmVsMV9pbmRleCA9IChhZGRyZXNzICUgTEVWRUwxX1NJWkUpL0xFVkVMMF9TSVpFOwotCWxldmVsMl9pbmRleCA9IChhZGRyZXNzICUgTEVWRUwyX1NJWkUpL0xFVkVMMV9TSVpFOwotCWxldmVsM19pbmRleCA9IGFkZHJlc3MgLyBMRVZFTDJfU0laRTsKLQotCS8qIElkZW50aXR5IG1hcCB0aGUgcGFnZSB0YWJsZSBlbnRyeSAqLwotCXBndGFibGVfbGV2ZWwxW2xldmVsMV9pbmRleF0gPSBhZGRyZXNzIHwgTDBfQVRUUjsKLQlwZ3RhYmxlX2xldmVsMltsZXZlbDJfaW5kZXhdID0gX19wYShwZ3RhYmxlX2xldmVsMSkgfCBMMV9BVFRSOwotCXNldF82NGJpdCgmcGd0YWJsZV9sZXZlbDNbbGV2ZWwzX2luZGV4XSwKLQkJCQkJICAgICAgIF9fcGEocGd0YWJsZV9sZXZlbDIpIHwgTDJfQVRUUik7Ci0KLQkvKiBGbHVzaCB0aGUgdGxiIHNvIHRoZSBuZXcgbWFwcGluZyB0YWtlcyBlZmZlY3QuCi0JICogR2xvYmFsIHRsYiBlbnRyaWVzIGFyZSBub3QgZmx1c2hlZCBidXQgdGhhdCBpcyBub3QgYW4gaXNzdWUuCi0JICovCi0JbG9hZF9jcjMocGd0YWJsZV9sZXZlbDMpOwotfQorc3RhdGljIHUzMiBrZXhlY19wZ2RbMTAyNF0gUEFHRV9BTElHTkVEOworI2lmZGVmIENPTkZJR19YODZfUEFFCitzdGF0aWMgdTMyIGtleGVjX3BtZDBbMTAyNF0gUEFHRV9BTElHTkVEOworc3RhdGljIHUzMiBrZXhlY19wbWQxWzEwMjRdIFBBR0VfQUxJR05FRDsKICNlbmRpZgorc3RhdGljIHUzMiBrZXhlY19wdGUwWzEwMjRdIFBBR0VfQUxJR05FRDsKK3N0YXRpYyB1MzIga2V4ZWNfcHRlMVsxMDI0XSBQQUdFX0FMSUdORUQ7CiAKIHN0YXRpYyB2b2lkIHNldF9pZHQodm9pZCAqbmV3aWR0LCBfX3UxNiBsaW1pdCkKIHsKQEAgLTEyNywxNiArNzEsNiBAQAogI3VuZGVmIF9fU1RSCiB9CiAKLXR5cGVkZWYgYXNtbGlua2FnZSBOT1JFVF9UWVBFIHZvaWQgKCpyZWxvY2F0ZV9uZXdfa2VybmVsX3QpKAotCQkJCQl1bnNpZ25lZCBsb25nIGluZGlyZWN0aW9uX3BhZ2UsCi0JCQkJCXVuc2lnbmVkIGxvbmcgcmVib290X2NvZGVfYnVmZmVyLAotCQkJCQl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHJlc3MsCi0JCQkJCXVuc2lnbmVkIGludCBoYXNfcGFlKSBBVFRSSUJfTk9SRVQ7Ci0KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIHJlbG9jYXRlX25ld19rZXJuZWxbXTsKLWV4dGVybiB2b2lkIHJlbG9jYXRlX25ld19rZXJuZWxfZW5kKHZvaWQpOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCByZWxvY2F0ZV9uZXdfa2VybmVsX3NpemU7Ci0KIC8qCiAgKiBBIGFyY2hpdGVjdHVyZSBob29rIGNhbGxlZCB0byB2YWxpZGF0ZSB0aGUKICAqIHByb3Bvc2VkIGltYWdlIGFuZCBwcmVwYXJlIHRoZSBjb250cm9sIHBhZ2VzCkBAIC0xNjksMjUgKzEwMywyOSBAQAogICovCiBOT1JFVF9UWVBFIHZvaWQgbWFjaGluZV9rZXhlYyhzdHJ1Y3Qga2ltYWdlICppbWFnZSkKIHsKLQl1bnNpZ25lZCBsb25nIHBhZ2VfbGlzdDsKLQl1bnNpZ25lZCBsb25nIHJlYm9vdF9jb2RlX2J1ZmZlcjsKLQotCXJlbG9jYXRlX25ld19rZXJuZWxfdCBybms7CisJdW5zaWduZWQgbG9uZyBwYWdlX2xpc3RbUEFHRVNfTlJdOworCXZvaWQgKmNvbnRyb2xfcGFnZTsKIAogCS8qIEludGVycnVwdHMgYXJlbid0IGFjY2VwdGFibGUgd2hpbGUgd2UgcmVib290ICovCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAotCS8qIENvbXB1dGUgc29tZSBvZmZzZXRzICovCi0JcmVib290X2NvZGVfYnVmZmVyID0gcGFnZV90b19wZm4oaW1hZ2UtPmNvbnRyb2xfY29kZV9wYWdlKQotCQkJCQkJCQk8PCBQQUdFX1NISUZUOwotCXBhZ2VfbGlzdCA9IGltYWdlLT5oZWFkOworCWNvbnRyb2xfcGFnZSA9IHBhZ2VfYWRkcmVzcyhpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UpOworCW1lbWNweShjb250cm9sX3BhZ2UsIHJlbG9jYXRlX2tlcm5lbCwgUEFHRV9TSVpFKTsKIAotCS8qIFNldCB1cCBhbiBpZGVudGl0eSBtYXBwaW5nIGZvciB0aGUgcmVib290X2NvZGVfYnVmZmVyICovCi0JaWRlbnRpdHlfbWFwX3BhZ2UocmVib290X2NvZGVfYnVmZmVyKTsKLQotCS8qIGNvcHkgaXQgb3V0ICovCi0JbWVtY3B5KCh2b2lkICopcmVib290X2NvZGVfYnVmZmVyLCByZWxvY2F0ZV9uZXdfa2VybmVsLAotCQkJCQkJcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplKTsKKwlwYWdlX2xpc3RbUEFfQ09OVFJPTF9QQUdFXSA9IF9fcGEoY29udHJvbF9wYWdlKTsKKwlwYWdlX2xpc3RbVkFfQ09OVFJPTF9QQUdFXSA9ICh1bnNpZ25lZCBsb25nKXJlbG9jYXRlX2tlcm5lbDsKKwlwYWdlX2xpc3RbUEFfUEdEXSA9IF9fcGEoa2V4ZWNfcGdkKTsKKwlwYWdlX2xpc3RbVkFfUEdEXSA9ICh1bnNpZ25lZCBsb25nKWtleGVjX3BnZDsKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCXBhZ2VfbGlzdFtQQV9QTURfMF0gPSBfX3BhKGtleGVjX3BtZDApOworCXBhZ2VfbGlzdFtWQV9QTURfMF0gPSAodW5zaWduZWQgbG9uZylrZXhlY19wbWQwOworCXBhZ2VfbGlzdFtQQV9QTURfMV0gPSBfX3BhKGtleGVjX3BtZDEpOworCXBhZ2VfbGlzdFtWQV9QTURfMV0gPSAodW5zaWduZWQgbG9uZylrZXhlY19wbWQxOworI2VuZGlmCisJcGFnZV9saXN0W1BBX1BURV8wXSA9IF9fcGEoa2V4ZWNfcHRlMCk7CisJcGFnZV9saXN0W1ZBX1BURV8wXSA9ICh1bnNpZ25lZCBsb25nKWtleGVjX3B0ZTA7CisJcGFnZV9saXN0W1BBX1BURV8xXSA9IF9fcGEoa2V4ZWNfcHRlMSk7CisJcGFnZV9saXN0W1ZBX1BURV8xXSA9ICh1bnNpZ25lZCBsb25nKWtleGVjX3B0ZTE7CiAKIAkvKiBUaGUgc2VnbWVudCByZWdpc3RlcnMgYXJlIGZ1bm55IHRoaW5ncywgdGhleSBoYXZlIGJvdGggYQogCSAqIHZpc2libGUgYW5kIGFuIGludmlzaWJsZSBwYXJ0LiAgV2hlbmV2ZXIgdGhlIHZpc2libGUgcGFydCBpcwpAQCAtMjA2LDYgKzE0NCwyOCBAQAogCXNldF9pZHQocGh5c190b192aXJ0KDApLDApOwogCiAJLyogbm93IGNhbGwgaXQgKi8KLQlybmsgPSAocmVsb2NhdGVfbmV3X2tlcm5lbF90KSByZWJvb3RfY29kZV9idWZmZXI7Ci0JKCpybmspKHBhZ2VfbGlzdCwgcmVib290X2NvZGVfYnVmZmVyLCBpbWFnZS0+c3RhcnQsIGNwdV9oYXNfcGFlKTsKKwlyZWxvY2F0ZV9rZXJuZWwoKHVuc2lnbmVkIGxvbmcpaW1hZ2UtPmhlYWQsICh1bnNpZ25lZCBsb25nKXBhZ2VfbGlzdCwKKwkJCWltYWdlLT5zdGFydCwgY3B1X2hhc19wYWUpOwogfQorCisvKiBjcmFzaGtlcm5lbD1zaXplQGFkZHIgc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiB0byByZXNlcnZlIGZvcgorICogYSBjcmFzaCBrZXJuZWwuICBCeSByZXNlcnZpbmcgdGhpcyBtZW1vcnkgd2UgZ3VhcmFudGVlCisgKiB0aGF0IGxpbnV4IG5ldmVyIHNldHMgaXQgdXAgYXMgYSBETUEgdGFyZ2V0LgorICogVXNlZnVsIGZvciBob2xkaW5nIGNvZGUgdG8gZG8gc29tZXRoaW5nIGFwcHJvcHJpYXRlCisgKiBhZnRlciBhIGtlcm5lbCBwYW5pYy4KKyAqLworc3RhdGljIGludCBfX2luaXQgcGFyc2VfY3Jhc2hrZXJuZWwoY2hhciAqYXJnKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgYmFzZTsKKwlzaXplID0gbWVtcGFyc2UoYXJnLCAmYXJnKTsKKwlpZiAoKmFyZyA9PSAnQCcpIHsKKwkJYmFzZSA9IG1lbXBhcnNlKGFyZysxLCAmYXJnKTsKKwkJLyogRklYTUU6IERvIEkgd2FudCBhIHNhbml0eSBjaGVjaworCQkgKiB0byB2YWxpZGF0ZSB0aGUgbWVtb3J5IHJhbmdlPworCQkgKi8KKwkJY3Jhc2hrX3Jlcy5zdGFydCA9IGJhc2U7CisJCWNyYXNoa19yZXMuZW5kICAgPSBiYXNlICsgc2l6ZSAtIDE7CisJfQorCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oImNyYXNoa2VybmVsIiwgcGFyc2VfY3Jhc2hrZXJuZWwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9tY2EuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbWNhLmMKaW5kZXggY2Q1NDU2Zi4uZWI1N2E4NSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9tY2EuYworKysgYi9hcmNoL2kzODYva2VybmVsL21jYS5jCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tY2EuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KQEAgLTQxNCw3ICs0MTUsOCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIHZvaWQgbWNhX2hhbmRsZV9ubWlfZGV2aWNlKHN0cnVjdCBtY2FfZGV2aWNlICptY2FfZGV2LCBpbnQgY2hlY2tfZmxhZykKK3N0YXRpYyBfX2twcm9iZXMgdm9pZAorbWNhX2hhbmRsZV9ubWlfZGV2aWNlKHN0cnVjdCBtY2FfZGV2aWNlICptY2FfZGV2LCBpbnQgY2hlY2tfZmxhZykKIHsKIAlpbnQgc2xvdCA9IG1jYV9kZXYtPnNsb3Q7CiAKQEAgLTQ0NCw3ICs0NDYsNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotc3RhdGljIGludCBtY2FfaGFuZGxlX25taV9jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IF9fa3Byb2JlcyBtY2FfaGFuZGxlX25taV9jYWxsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IG1jYV9kZXZpY2UgKm1jYV9kZXYgPSB0b19tY2FfZGV2aWNlKGRldik7CiAJdW5zaWduZWQgY2hhciBwb3M1OwpAQCAtNDYyLDcgKzQ2NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbWNhX2hhbmRsZV9ubWkodm9pZCkKK3ZvaWQgX19rcHJvYmVzIG1jYV9oYW5kbGVfbm1pKHZvaWQpCiB7CiAJLyogRmlyc3QgdHJ5IC0gc2NhbiB0aGUgdmFyaW91cyBhZGFwdGVycyBhbmQgc2VlIGlmIGEgc3BlY2lmaWMKIAkgKiBhZGFwdGVyIHdhcyByZXNwb25zaWJsZSBmb3IgdGhlIGVycm9yLgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9taWNyb2NvZGUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbWljcm9jb2RlLmMKaW5kZXggNDBiNDRjYy4uOWI5NDc5NyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9taWNyb2NvZGUuYworKysgYi9hcmNoL2kzODYva2VybmVsL21pY3JvY29kZS5jCkBAIC0yLDYgKzIsNyBAQAogICoJSW50ZWwgQ1BVIE1pY3JvY29kZSBVcGRhdGUgRHJpdmVyIGZvciBMaW51eAogICoKICAqCUNvcHlyaWdodCAoQykgMjAwMC0yMDA0IFRpZ3JhbiBBaXZhemlhbgorICoJCSAgICAgIDIwMDYJU2hhb2h1YSBMaSA8c2hhb2h1YS5saUBpbnRlbC5jb20+CiAgKgogICoJVGhpcyBkcml2ZXIgYWxsb3dzIHRvIHVwZ3JhZGUgbWljcm9jb2RlIG9uIEludGVsIHByb2Nlc3NvcnMKICAqCWJlbG9uZ2luZyB0byBJQS0zMiBmYW1pbHkgLSBQZW50aXVtUHJvLCBQZW50aXVtIElJLCAKQEAgLTgyLDYgKzgzLDkgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL21zci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC05MSw5ICs5NSw2IEBACiBNT0RVTEVfQVVUSE9SKCJUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotc3RhdGljIGludCB2ZXJib3NlOwotbW9kdWxlX3BhcmFtKHZlcmJvc2UsIGludCwgMDY0NCk7Ci0KICNkZWZpbmUgTUlDUk9DT0RFX1ZFUlNJT04gCSIxLjE0YSIKIAogI2RlZmluZSBERUZBVUxUX1VDT0RFX0RBVEFTSVpFIAkoMjAwMCkgCSAgLyogMjAwMCBieXRlcyAqLwpAQCAtMTIwLDU1ICsxMjEsNDAgQEAKIC8qIG5vIGNvbmN1cnJlbnQgLT53cml0ZSgpcyBhcmUgYWxsb3dlZCBvbiAvZGV2L2NwdS9taWNyb2NvZGUgKi8KIHN0YXRpYyBERUZJTkVfTVVURVgobWljcm9jb2RlX211dGV4KTsKIAotc3RhdGljIHZvaWQgX191c2VyICp1c2VyX2J1ZmZlcjsJLyogdXNlciBhcmVhIG1pY3JvY29kZSBkYXRhIGJ1ZmZlciAqLwotc3RhdGljIHVuc2lnbmVkIGludCB1c2VyX2J1ZmZlcl9zaXplOwkvKiBpdCdzIHNpemUgKi8KLQotdHlwZWRlZiBlbnVtIG1jX2Vycm9yX2NvZGUgewotCU1DX1NVQ0NFU1MgCT0gMCwKLQlNQ19JR05PUkVEIAk9IDEsCi0JTUNfTk9URk9VTkQgCT0gMiwKLQlNQ19NQVJLRUQgCT0gMywKLQlNQ19BTExPQ0FURUQgCT0gNCwKLX0gbWNfZXJyb3JfY29kZV90OwotCiBzdGF0aWMgc3RydWN0IHVjb2RlX2NwdV9pbmZvIHsKKwlpbnQgdmFsaWQ7CiAJdW5zaWduZWQgaW50IHNpZzsKLQl1bnNpZ25lZCBpbnQgcGYsIG9yaWdfcGY7CisJdW5zaWduZWQgaW50IHBmOwogCXVuc2lnbmVkIGludCByZXY7Ci0JdW5zaWduZWQgaW50IGNrc3VtOwotCW1jX2Vycm9yX2NvZGVfdCBlcnI7CiAJbWljcm9jb2RlX3QgKm1jOwogfSB1Y29kZV9jcHVfaW5mb1tOUl9DUFVTXTsKLQkJCQkKLXN0YXRpYyBpbnQgbWljcm9jb2RlX29wZW4gKHN0cnVjdCBpbm9kZSAqdW51c2VkMSwgc3RydWN0IGZpbGUgKnVudXNlZDIpCi17Ci0JcmV0dXJuIGNhcGFibGUoQ0FQX1NZU19SQVdJTykgPyAwIDogLUVQRVJNOwotfQogCi1zdGF0aWMgdm9pZCBjb2xsZWN0X2NwdV9pbmZvICh2b2lkICp1bnVzZWQpCitzdGF0aWMgdm9pZCBjb2xsZWN0X2NwdV9pbmZvKGludCBjcHVfbnVtKQogewotCWludCBjcHVfbnVtID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhICsgY3B1X251bTsKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1X251bTsKIAl1bnNpZ25lZCBpbnQgdmFsWzJdOwogCi0JdWNpLT5zaWcgPSB1Y2ktPnBmID0gdWNpLT5yZXYgPSB1Y2ktPmNrc3VtID0gMDsKLQl1Y2ktPmVyciA9IE1DX05PVEZPVU5EOyAKKwkvKiBXZSBzaG91bGQgYmluZCB0aGUgdGFzayB0byB0aGUgQ1BVICovCisJQlVHX09OKHJhd19zbXBfcHJvY2Vzc29yX2lkKCkgIT0gY3B1X251bSk7CisJdWNpLT5wZiA9IHVjaS0+cmV2ID0gMDsKIAl1Y2ktPm1jID0gTlVMTDsKKwl1Y2ktPnZhbGlkID0gMTsKIAogCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwgfHwgYy0+eDg2IDwgNiB8fAogCSAgICAJY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9JQTY0KSkgewotCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogQ1BVJWQgbm90IGEgY2FwYWJsZSBJbnRlbCBwcm9jZXNzb3JcbiIsIGNwdV9udW0pOworCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogQ1BVJWQgbm90IGEgY2FwYWJsZSBJbnRlbCAiCisJCQkicHJvY2Vzc29yXG4iLCBjcHVfbnVtKTsKKwkJdWNpLT52YWxpZCA9IDA7CiAJCXJldHVybjsKLQl9IGVsc2UgewotCQl1Y2ktPnNpZyA9IGNwdWlkX2VheCgweDAwMDAwMDAxKTsKKwl9CiAKLQkJaWYgKChjLT54ODZfbW9kZWwgPj0gNSkgfHwgKGMtPng4NiA+IDYpKSB7Ci0JCQkvKiBnZXQgcHJvY2Vzc29yIGZsYWdzIGZyb20gTVNSIDB4MTcgKi8KLQkJCXJkbXNyKE1TUl9JQTMyX1BMQVRGT1JNX0lELCB2YWxbMF0sIHZhbFsxXSk7Ci0JCQl1Y2ktPnBmID0gMSA8PCAoKHZhbFsxXSA+PiAxOCkgJiA3KTsKLQkJfQotCQl1Y2ktPm9yaWdfcGYgPSB1Y2ktPnBmOworCXVjaS0+c2lnID0gY3B1aWRfZWF4KDB4MDAwMDAwMDEpOworCisJaWYgKChjLT54ODZfbW9kZWwgPj0gNSkgfHwgKGMtPng4NiA+IDYpKSB7CisJCS8qIGdldCBwcm9jZXNzb3IgZmxhZ3MgZnJvbSBNU1IgMHgxNyAqLworCQlyZG1zcihNU1JfSUEzMl9QTEFURk9STV9JRCwgdmFsWzBdLCB2YWxbMV0pOworCQl1Y2ktPnBmID0gMSA8PCAoKHZhbFsxXSA+PiAxOCkgJiA3KTsKIAl9CiAKIAl3cm1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIDAsIDApOwpAQCAtMTgwLDIxOCArMTY2LDE1OSBAQAogCQkJdWNpLT5zaWcsIHVjaS0+cGYsIHVjaS0+cmV2KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG1hcmtfbWljcm9jb2RlX3VwZGF0ZSAoaW50IGNwdV9udW0sIG1pY3JvY29kZV9oZWFkZXJfdCAqbWNfaGVhZGVyLCBpbnQgc2lnLCBpbnQgcGYsIGludCBja3N1bSkKK3N0YXRpYyBpbmxpbmUgaW50IG1pY3JvY29kZV91cGRhdGVfbWF0Y2goaW50IGNwdV9udW0sCisJbWljcm9jb2RlX2hlYWRlcl90ICptY19oZWFkZXIsIGludCBzaWcsIGludCBwZikKIHsKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1X251bTsKIAotCXByX2RlYnVnKCJNaWNyb2NvZGUgRm91bmQuXG4iKTsKLQlwcl9kZWJ1ZygiICAgSGVhZGVyIFJldmlzaW9uIDB4JXhcbiIsIG1jX2hlYWRlci0+aGRydmVyKTsKLQlwcl9kZWJ1ZygiICAgTG9hZGVyIFJldmlzaW9uIDB4JXhcbiIsIG1jX2hlYWRlci0+bGRydmVyKTsKLQlwcl9kZWJ1ZygiICAgUmV2aXNpb24gMHgleCBcbiIsIG1jX2hlYWRlci0+cmV2KTsKLQlwcl9kZWJ1ZygiICAgRGF0ZSAleC8leC8leFxuIiwKLQkJKChtY19oZWFkZXItPmRhdGUgPj4gMjQgKSAmIDB4ZmYpLAotCQkoKG1jX2hlYWRlci0+ZGF0ZSA+PiAxNiApICYgMHhmZiksCi0JCShtY19oZWFkZXItPmRhdGUgJiAweEZGRkYpKTsKLQlwcl9kZWJ1ZygiICAgU2lnbmF0dXJlIDB4JXhcbiIsIHNpZyk7Ci0JcHJfZGVidWcoIiAgIFR5cGUgMHgleCBGYW1pbHkgMHgleCBNb2RlbCAweCV4IFN0ZXBwaW5nIDB4JXhcbiIsCi0JCSgoc2lnID4+IDEyKSAmIDB4MyksCi0JCSgoc2lnID4+IDgpICYgMHhmKSwKLQkJKChzaWcgPj4gNCkgJiAweGYpLAotCQkoKHNpZyAmIDB4ZikpKTsKLQlwcl9kZWJ1ZygiICAgUHJvY2Vzc29yIEZsYWdzIDB4JXhcbiIsIHBmKTsKLQlwcl9kZWJ1ZygiICAgQ2hlY2tzdW0gMHgleFxuIiwgY2tzdW0pOworCWlmICghc2lnbWF0Y2goc2lnLCB1Y2ktPnNpZywgcGYsIHVjaS0+cGYpCisJCXx8IG1jX2hlYWRlci0+cmV2IDw9IHVjaS0+cmV2KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KIAotCWlmIChtY19oZWFkZXItPnJldiA8IHVjaS0+cmV2KSB7Ci0JCWlmICh1Y2ktPmVyciA9PSBNQ19OT1RGT1VORCkgewotCQkJdWNpLT5lcnIgPSBNQ19JR05PUkVEOwotCQkJdWNpLT5ja3N1bSA9IG1jX2hlYWRlci0+cmV2OwotCQl9IGVsc2UgaWYgKHVjaS0+ZXJyID09IE1DX0lHTk9SRUQgJiYgdWNpLT5ja3N1bSA8IG1jX2hlYWRlci0+cmV2KQotCQkJdWNpLT5ja3N1bSA9IG1jX2hlYWRlci0+cmV2OwotCX0gZWxzZSBpZiAobWNfaGVhZGVyLT5yZXYgPT0gdWNpLT5yZXYpIHsKLQkJaWYgKHVjaS0+ZXJyIDwgTUNfTUFSS0VEKSB7Ci0JCQkvKiBub3RpZnkgdGhlIGNhbGxlciBvZiBzdWNjZXNzIG9uIHRoaXMgY3B1ICovCi0JCQl1Y2ktPmVyciA9IE1DX1NVQ0NFU1M7CitzdGF0aWMgaW50IG1pY3JvY29kZV9zYW5pdHlfY2hlY2sodm9pZCAqbWMpCit7CisJbWljcm9jb2RlX2hlYWRlcl90ICptY19oZWFkZXIgPSBtYzsKKwlzdHJ1Y3QgZXh0ZW5kZWRfc2lndGFibGUgKmV4dF9oZWFkZXIgPSBOVUxMOworCXN0cnVjdCBleHRlbmRlZF9zaWduYXR1cmUgKmV4dF9zaWc7CisJdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplLCBkYXRhX3NpemUsIGV4dF90YWJsZV9zaXplOworCWludCBzdW0sIG9yaWdfc3VtLCBleHRfc2lnY291bnQgPSAwLCBpOworCisJdG90YWxfc2l6ZSA9IGdldF90b3RhbHNpemUobWNfaGVhZGVyKTsKKwlkYXRhX3NpemUgPSBnZXRfZGF0YXNpemUobWNfaGVhZGVyKTsKKwlpZiAoZGF0YV9zaXplICsgTUNfSEVBREVSX1NJWkUgPiB0b3RhbF9zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgIgorCQkJIkJhZCBkYXRhIHNpemUgaW4gbWljcm9jb2RlIGRhdGEgZmlsZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChtY19oZWFkZXItPmxkcnZlciAhPSAxIHx8IG1jX2hlYWRlci0+aGRydmVyICE9IDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISAiCisJCQkiVW5rbm93biBtaWNyb2NvZGUgdXBkYXRlIGZvcm1hdFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlleHRfdGFibGVfc2l6ZSA9IHRvdGFsX3NpemUgLSAoTUNfSEVBREVSX1NJWkUgKyBkYXRhX3NpemUpOworCWlmIChleHRfdGFibGVfc2l6ZSkgeworCQlpZiAoKGV4dF90YWJsZV9zaXplIDwgRVhUX0hFQURFUl9TSVpFKQorCQkgfHwgKChleHRfdGFibGVfc2l6ZSAtIEVYVF9IRUFERVJfU0laRSkgJSBFWFRfU0lHTkFUVVJFX1NJWkUpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhICIKKwkJCQkiU21hbGwgZXh0dGFibGUgc2l6ZSBpbiBtaWNyb2NvZGUgZGF0YSBmaWxlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JfSBlbHNlIGlmICh1Y2ktPmVyciAhPSBNQ19BTExPQ0FURUQgfHwgbWNfaGVhZGVyLT5yZXYgPiB1Y2ktPm1jLT5oZHIucmV2KSB7Ci0JCXByX2RlYnVnKCJtaWNyb2NvZGU6IENQVSVkIGZvdW5kIGEgbWF0Y2hpbmcgbWljcm9jb2RlIHVwZGF0ZSB3aXRoICIKLQkJCSIgcmV2aXNpb24gMHgleCAoY3VycmVudD0weCV4KVxuIiwgY3B1X251bSwgbWNfaGVhZGVyLT5yZXYsIHVjaS0+cmV2KTsKLQkJdWNpLT5ja3N1bSA9IGNrc3VtOwotCQl1Y2ktPnBmID0gcGY7IC8qIGtlZXAgdGhlIG9yaWdpbmFsIG1jIHBmIGZvciBja3N1bSBjYWxjdWxhdGlvbiAqLwotCQl1Y2ktPmVyciA9IE1DX01BUktFRDsgLyogZm91bmQgdGhlIG1hdGNoICovCi0JCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1X251bSkgewotCQkJaWYgKHVjb2RlX2NwdV9pbmZvICsgY3B1X251bSAhPSB1Y2kKLQkJCSAgICAmJiB1Y29kZV9jcHVfaW5mb1tjcHVfbnVtXS5tYyA9PSB1Y2ktPm1jKSB7Ci0JCQkJdWNpLT5tYyA9IE5VTEw7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJCWV4dF9oZWFkZXIgPSBtYyArIE1DX0hFQURFUl9TSVpFICsgZGF0YV9zaXplOworCQlpZiAoZXh0X3RhYmxlX3NpemUgIT0gZXh0dGFibGVfc2l6ZShleHRfaGVhZGVyKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISAiCisJCQkJIkJhZCBleHR0YWJsZSBzaXplIGluIG1pY3JvY29kZSBkYXRhIGZpbGVcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KLQkJaWYgKHVjaS0+bWMgIT0gTlVMTCkgewotCQkJdmZyZWUodWNpLT5tYyk7Ci0JCQl1Y2ktPm1jID0gTlVMTDsKKwkJZXh0X3NpZ2NvdW50ID0gZXh0X2hlYWRlci0+Y291bnQ7CisJfQorCisJLyogY2hlY2sgZXh0ZW5kZWQgdGFibGUgY2hlY2tzdW0gKi8KKwlpZiAoZXh0X3RhYmxlX3NpemUpIHsKKwkJaW50IGV4dF90YWJsZV9zdW0gPSAwOworCQlpbnQgKmV4dF90YWJsZXAgPSAoaW50ICopZXh0X2hlYWRlcjsKKworCQlpID0gZXh0X3RhYmxlX3NpemUgLyBEV1NJWkU7CisJCXdoaWxlIChpLS0pCisJCQlleHRfdGFibGVfc3VtICs9IGV4dF90YWJsZXBbaV07CisJCWlmIChleHRfdGFibGVfc3VtKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtaWNyb2NvZGU6IGFib3J0aW5nLCAiCisJCQkJImJhZCBleHRlbmRlZCBzaWduYXR1cmUgdGFibGUgY2hlY2tzdW1cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9Ci0JcmV0dXJuOworCisJLyogY2FsY3VsYXRlIHRoZSBjaGVja3N1bSAqLworCW9yaWdfc3VtID0gMDsKKwlpID0gKE1DX0hFQURFUl9TSVpFICsgZGF0YV9zaXplKSAvIERXU0laRTsKKwl3aGlsZSAoaS0tKQorCQlvcmlnX3N1bSArPSAoKGludCAqKW1jKVtpXTsKKwlpZiAob3JpZ19zdW0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGFib3J0aW5nLCBiYWQgY2hlY2tzdW1cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCFleHRfdGFibGVfc2l6ZSkKKwkJcmV0dXJuIDA7CisJLyogY2hlY2sgZXh0ZW5kZWQgc2lnbmF0dXJlIGNoZWNrc3VtICovCisJZm9yIChpID0gMDsgaSA8IGV4dF9zaWdjb3VudDsgaSsrKSB7CisJCWV4dF9zaWcgPSAoc3RydWN0IGV4dGVuZGVkX3NpZ25hdHVyZSAqKSgodm9pZCAqKWV4dF9oZWFkZXIKKwkJCSsgRVhUX0hFQURFUl9TSVpFICsgRVhUX1NJR05BVFVSRV9TSVpFICogaSk7CisJCXN1bSA9IG9yaWdfc3VtCisJCQktIChtY19oZWFkZXItPnNpZyArIG1jX2hlYWRlci0+cGYgKyBtY19oZWFkZXItPmNrc3VtKQorCQkJKyAoZXh0X3NpZy0+c2lnICsgZXh0X3NpZy0+cGYgKyBleHRfc2lnLT5ja3N1bSk7CisJCWlmIChzdW0pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBhYm9ydGluZywgYmFkIGNoZWNrc3VtXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZpbmRfbWF0Y2hpbmdfdWNvZGVzICh2b2lkKSAKKy8qCisgKiByZXR1cm4gMCAtIG5vIHVwZGF0ZSBmb3VuZAorICogcmV0dXJuIDEgLSBmb3VuZCB1cGRhdGUKKyAqIHJldHVybiA8IDAgLSBlcnJvcgorICovCitzdGF0aWMgaW50IGdldF9tYWNoaW5nX21pY3JvY29kZSh2b2lkICptYywgaW50IGNwdSkKIHsKLQlpbnQgY3Vyc29yID0gMDsKLQlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHU7CisJbWljcm9jb2RlX2hlYWRlcl90ICptY19oZWFkZXIgPSBtYzsKKwlzdHJ1Y3QgZXh0ZW5kZWRfc2lndGFibGUgKmV4dF9oZWFkZXI7CisJdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplID0gZ2V0X3RvdGFsc2l6ZShtY19oZWFkZXIpOworCWludCBleHRfc2lnY291bnQsIGk7CisJc3RydWN0IGV4dGVuZGVkX3NpZ25hdHVyZSAqZXh0X3NpZzsKKwl2b2lkICpuZXdfbWM7CiAKLQl3aGlsZSAoY3Vyc29yICsgTUNfSEVBREVSX1NJWkUgPCB1c2VyX2J1ZmZlcl9zaXplKSB7Ci0JCW1pY3JvY29kZV9oZWFkZXJfdCBtY19oZWFkZXI7Ci0JCXZvaWQgKm5ld21jID0gTlVMTDsKLQkJaW50IGksIHN1bSwgY3B1X251bSwgYWxsb2NhdGVkX2ZsYWcsIHRvdGFsX3NpemUsIGRhdGFfc2l6ZSwgZXh0X3RhYmxlX3NpemU7CisJaWYgKG1pY3JvY29kZV91cGRhdGVfbWF0Y2goY3B1LCBtY19oZWFkZXIsCisJCQltY19oZWFkZXItPnNpZywgbWNfaGVhZGVyLT5wZikpCisJCWdvdG8gZmluZDsKIAotCQlpZiAoY29weV9mcm9tX3VzZXIoJm1jX2hlYWRlciwgdXNlcl9idWZmZXIgKyBjdXJzb3IsIE1DX0hFQURFUl9TSVpFKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBDYW4gbm90IHJlYWQgdXNlciBkYXRhXG4iKTsKLQkJCWVycm9yID0gLUVGQVVMVDsKLQkJCWdvdG8gb3V0OwotCQl9CisJaWYgKHRvdGFsX3NpemUgPD0gZ2V0X2RhdGFzaXplKG1jX2hlYWRlcikgKyBNQ19IRUFERVJfU0laRSkKKwkJcmV0dXJuIDA7CiAKLQkJdG90YWxfc2l6ZSA9IGdldF90b3RhbHNpemUoJm1jX2hlYWRlcik7Ci0JCWlmICgoY3Vyc29yICsgdG90YWxfc2l6ZSA+IHVzZXJfYnVmZmVyX3NpemUpIHx8ICh0b3RhbF9zaXplIDwgREVGQVVMVF9VQ09ERV9UT1RBTFNJWkUpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIEJhZCBkYXRhIGluIG1pY3JvY29kZSBkYXRhIGZpbGVcbiIpOwotCQkJZXJyb3IgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KKwlleHRfaGVhZGVyID0gKHN0cnVjdCBleHRlbmRlZF9zaWd0YWJsZSAqKShtYyArCisJCQlnZXRfZGF0YXNpemUobWNfaGVhZGVyKSArIE1DX0hFQURFUl9TSVpFKTsKKwlleHRfc2lnY291bnQgPSBleHRfaGVhZGVyLT5jb3VudDsKKwlleHRfc2lnID0gKHN0cnVjdCBleHRlbmRlZF9zaWduYXR1cmUgKikoKHZvaWQgKilleHRfaGVhZGVyCisJCQkrIEVYVF9IRUFERVJfU0laRSk7CisJZm9yIChpID0gMDsgaSA8IGV4dF9zaWdjb3VudDsgaSsrKSB7CisJCWlmIChtaWNyb2NvZGVfdXBkYXRlX21hdGNoKGNwdSwgbWNfaGVhZGVyLAorCQkJCWV4dF9zaWctPnNpZywgZXh0X3NpZy0+cGYpKQorCQkJZ290byBmaW5kOworCQlleHRfc2lnKys7CisJfQorCXJldHVybiAwOworZmluZDoKKwlwcl9kZWJ1ZygibWljcm9jb2RlOiBDUFUgJWQgZm91bmQgYSBtYXRjaGluZyBtaWNyb2NvZGUgdXBkYXRlIHdpdGgiCisJCSIgdmVyc2lvbiAweCV4IChjdXJyZW50PTB4JXgpXG4iLCBjcHUsIG1jX2hlYWRlci0+cmV2LHVjaS0+cmV2KTsKKwluZXdfbWMgPSB2bWFsbG9jKHRvdGFsX3NpemUpOworCWlmICghbmV3X21jKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQ2FuIG5vdCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKLQkJZGF0YV9zaXplID0gZ2V0X2RhdGFzaXplKCZtY19oZWFkZXIpOwotCQlpZiAoKGRhdGFfc2l6ZSArIE1DX0hFQURFUl9TSVpFID4gdG90YWxfc2l6ZSkgfHwgKGRhdGFfc2l6ZSA8IERFRkFVTFRfVUNPREVfREFUQVNJWkUpKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIEJhZCBkYXRhIGluIG1pY3JvY29kZSBkYXRhIGZpbGVcbiIpOwotCQkJZXJyb3IgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KKwkvKiBmcmVlIHByZXZpb3VzIHVwZGF0ZSBmaWxlICovCisJdmZyZWUodWNpLT5tYyk7CiAKLQkJaWYgKG1jX2hlYWRlci5sZHJ2ZXIgIT0gMSB8fCBtY19oZWFkZXIuaGRydmVyICE9IDEpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgVW5rbm93biBtaWNyb2NvZGUgdXBkYXRlIGZvcm1hdFxuIik7Ci0JCQllcnJvciA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1X251bSkgewotCQkJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07Ci0KLQkJCWlmIChzaWdtYXRjaChtY19oZWFkZXIuc2lnLCB1Y2ktPnNpZywgbWNfaGVhZGVyLnBmLCB1Y2ktPm9yaWdfcGYpKQotCQkJCW1hcmtfbWljcm9jb2RlX3VwZGF0ZShjcHVfbnVtLCAmbWNfaGVhZGVyLCBtY19oZWFkZXIuc2lnLCBtY19oZWFkZXIucGYsIG1jX2hlYWRlci5ja3N1bSk7Ci0JCX0KLQotCQlleHRfdGFibGVfc2l6ZSA9IHRvdGFsX3NpemUgLSAoTUNfSEVBREVSX1NJWkUgKyBkYXRhX3NpemUpOwotCQlpZiAoZXh0X3RhYmxlX3NpemUpIHsKLQkJCXN0cnVjdCBleHRlbmRlZF9zaWd0YWJsZSBleHRfaGVhZGVyOwotCQkJc3RydWN0IGV4dGVuZGVkX3NpZ25hdHVyZSBleHRfc2lnOwotCQkJaW50IGV4dF9zaWdjb3VudDsKLQotCQkJaWYgKChleHRfdGFibGVfc2l6ZSA8IEVYVF9IRUFERVJfU0laRSkgCi0JCQkJCXx8ICgoZXh0X3RhYmxlX3NpemUgLSBFWFRfSEVBREVSX1NJWkUpICUgRVhUX1NJR05BVFVSRV9TSVpFKSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQmFkIGRhdGEgaW4gbWljcm9jb2RlIGRhdGEgZmlsZVxuIik7Ci0JCQkJZXJyb3IgPSAtRUlOVkFMOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZleHRfaGVhZGVyLCB1c2VyX2J1ZmZlciArIGN1cnNvciAKLQkJCQkJKyBNQ19IRUFERVJfU0laRSArIGRhdGFfc2l6ZSwgRVhUX0hFQURFUl9TSVpFKSkgewotCQkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQ2FuIG5vdCByZWFkIHVzZXIgZGF0YVxuIik7Ci0JCQkJZXJyb3IgPSAtRUZBVUxUOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJaWYgKGV4dF90YWJsZV9zaXplICE9IGV4dHRhYmxlX3NpemUoJmV4dF9oZWFkZXIpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBCYWQgZGF0YSBpbiBtaWNyb2NvZGUgZGF0YSBmaWxlXG4iKTsKLQkJCQllcnJvciA9IC1FRkFVTFQ7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0KLQkJCWV4dF9zaWdjb3VudCA9IGV4dF9oZWFkZXIuY291bnQ7Ci0JCQkKLQkJCWZvciAoaSA9IDA7IGkgPCBleHRfc2lnY291bnQ7IGkrKykgewotCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmZXh0X3NpZywgdXNlcl9idWZmZXIgKyBjdXJzb3IgKyBNQ19IRUFERVJfU0laRSArIGRhdGFfc2l6ZSArIEVYVF9IRUFERVJfU0laRSAKLQkJCQkJCSsgRVhUX1NJR05BVFVSRV9TSVpFICogaSwgRVhUX1NJR05BVFVSRV9TSVpFKSkgewotCQkJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIENhbiBub3QgcmVhZCB1c2VyIGRhdGFcbiIpOwotCQkJCQllcnJvciA9IC1FRkFVTFQ7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQkJCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdV9udW0pIHsKLQkJCQkJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07Ci0KLQkJCQkJaWYgKHNpZ21hdGNoKGV4dF9zaWcuc2lnLCB1Y2ktPnNpZywgZXh0X3NpZy5wZiwgdWNpLT5vcmlnX3BmKSkgewotCQkJCQkJbWFya19taWNyb2NvZGVfdXBkYXRlKGNwdV9udW0sICZtY19oZWFkZXIsIGV4dF9zaWcuc2lnLCBleHRfc2lnLnBmLCBleHRfc2lnLmNrc3VtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvKiBub3cgY2hlY2sgaWYgYW55IGNwdSBoYXMgbWF0Y2hlZCAqLwotCQlhbGxvY2F0ZWRfZmxhZyA9IDA7Ci0JCXN1bSA9IDA7Ci0JCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1X251bSkgewotCQkJaWYgKHVjb2RlX2NwdV9pbmZvW2NwdV9udW1dLmVyciA9PSBNQ19NQVJLRUQpIHsgCi0JCQkJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07Ci0JCQkJaWYgKCFhbGxvY2F0ZWRfZmxhZykgewotCQkJCQlhbGxvY2F0ZWRfZmxhZyA9IDE7Ci0JCQkJCW5ld21jID0gdm1hbGxvYyh0b3RhbF9zaXplKTsKLQkJCQkJaWYgKCFuZXdtYykgewotCQkJCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBDYW4gbm90IGFsbG9jYXRlIG1lbW9yeVxuIik7Ci0JCQkJCQllcnJvciA9IC1FTk9NRU07Ci0JCQkJCQlnb3RvIG91dDsKLQkJCQkJfQotCQkJCQlpZiAoY29weV9mcm9tX3VzZXIobmV3bWMgKyBNQ19IRUFERVJfU0laRSwgCi0JCQkJCQkJCXVzZXJfYnVmZmVyICsgY3Vyc29yICsgTUNfSEVBREVSX1NJWkUsIAotCQkJCQkJCQl0b3RhbF9zaXplIC0gTUNfSEVBREVSX1NJWkUpKSB7Ci0JCQkJCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogZXJyb3IhIENhbiBub3QgcmVhZCB1c2VyIGRhdGFcbiIpOwotCQkJCQkJdmZyZWUobmV3bWMpOwotCQkJCQkJZXJyb3IgPSAtRUZBVUxUOwotCQkJCQkJZ290byBvdXQ7Ci0JCQkJCX0KLQkJCQkJbWVtY3B5KG5ld21jLCAmbWNfaGVhZGVyLCBNQ19IRUFERVJfU0laRSk7Ci0JCQkJCS8qIGNoZWNrIGV4dGVuZGVkIHRhYmxlIGNoZWNrc3VtICovCi0JCQkJCWlmIChleHRfdGFibGVfc2l6ZSkgewotCQkJCQkJaW50IGV4dF90YWJsZV9zdW0gPSAwOwotCQkJCQkJaW50ICogZXh0X3RhYmxlcCA9ICgoKHZvaWQgKikgbmV3bWMpICsgTUNfSEVBREVSX1NJWkUgKyBkYXRhX3NpemUpOwotCQkJCQkJaSA9IGV4dF90YWJsZV9zaXplIC8gRFdTSVpFOwotCQkJCQkJd2hpbGUgKGktLSkgZXh0X3RhYmxlX3N1bSArPSBleHRfdGFibGVwW2ldOwotCQkJCQkJaWYgKGV4dF90YWJsZV9zdW0pIHsKLQkJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtaWNyb2NvZGU6IGFib3J0aW5nLCBiYWQgZXh0ZW5kZWQgc2lnbmF0dXJlIHRhYmxlIGNoZWNrc3VtXG4iKTsKLQkJCQkJCQl2ZnJlZShuZXdtYyk7Ci0JCQkJCQkJZXJyb3IgPSAtRUlOVkFMOwotCQkJCQkJCWdvdG8gb3V0OwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLyogY2FsY3VsYXRlIHRoZSBjaGVja3N1bSAqLwotCQkJCQlpID0gKE1DX0hFQURFUl9TSVpFICsgZGF0YV9zaXplKSAvIERXU0laRTsKLQkJCQkJd2hpbGUgKGktLSkgc3VtICs9ICgoaW50ICopbmV3bWMpW2ldOwotCQkJCQlzdW0gLT0gKG1jX2hlYWRlci5zaWcgKyBtY19oZWFkZXIucGYgKyBtY19oZWFkZXIuY2tzdW0pOwotCQkJCX0KLQkJCQl1Y29kZV9jcHVfaW5mb1tjcHVfbnVtXS5tYyA9IG5ld21jOwotCQkJCXVjb2RlX2NwdV9pbmZvW2NwdV9udW1dLmVyciA9IE1DX0FMTE9DQVRFRDsgLyogbWMgdXBkYXRlZCAqLwotCQkJCWlmIChzdW0gKyB1Y2ktPnNpZyArIHVjaS0+cGYgKyB1Y2ktPmNrc3VtICE9IDApIHsKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IENQVSVkIGFib3J0aW5nLCBiYWQgY2hlY2tzdW1cbiIsIGNwdV9udW0pOwotCQkJCQllcnJvciA9IC1FSU5WQUw7Ci0JCQkJCWdvdG8gb3V0OwotCQkJCX0KLQkJCX0KLQkJfQotCQljdXJzb3IgKz0gdG90YWxfc2l6ZTsgLyogZ290byB0aGUgbmV4dCB1cGRhdGUgcGF0Y2ggKi8KLQl9IC8qIGVuZCBvZiB3aGlsZSAqLwotb3V0OgotCXJldHVybiBlcnJvcjsKKwltZW1jcHkobmV3X21jLCBtYywgdG90YWxfc2l6ZSk7CisJdWNpLT5tYyA9IG5ld19tYzsKKwlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgZG9fdXBkYXRlX29uZSAodm9pZCAqIHVudXNlZCkKK3N0YXRpYyB2b2lkIGFwcGx5X21pY3JvY29kZShpbnQgY3B1KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IHZhbFsyXTsKLQlpbnQgY3B1X251bSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpbnQgY3B1X251bSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07CiAKLQlpZiAodWNpLT5tYyA9PSBOVUxMKSB7Ci0JCWlmICh2ZXJib3NlKSB7Ci0JCQlpZiAodWNpLT5lcnIgPT0gTUNfU1VDQ0VTUykKLQkJCQlwcmludGsoS0VSTl9JTkZPICJtaWNyb2NvZGU6IENQVSVkIGFscmVhZHkgYXQgcmV2aXNpb24gMHgleFxuIiwKLQkJCQkJY3B1X251bSwgdWNpLT5yZXYpOwotCQkJZWxzZQotCQkJCXByaW50ayhLRVJOX0lORk8gIm1pY3JvY29kZTogTm8gbmV3IG1pY3JvY29kZSBkYXRhIGZvciBDUFUlZFxuIiwgY3B1X251bSk7Ci0JCX0KKwkvKiBXZSBzaG91bGQgYmluZCB0aGUgdGFzayB0byB0aGUgQ1BVICovCisJQlVHX09OKGNwdV9udW0gIT0gY3B1KTsKKworCWlmICh1Y2ktPm1jID09IE5VTEwpCiAJCXJldHVybjsKLQl9CiAKIAkvKiBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBwaHlzaWNhbCB3cml0ZSB0byBNU1IgMHg3OSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZtaWNyb2NvZGVfdXBkYXRlX2xvY2ssIGZsYWdzKTsgICAgICAgICAgCkBAIC00MDgsNjggKzMzNSwxMDcgQEAKIAkvKiBnZXQgdGhlIGN1cnJlbnQgcmV2aXNpb24gZnJvbSBNU1IgMHg4QiAqLwogCXJkbXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgdmFsWzBdLCB2YWxbMV0pOwogCi0JLyogbm90aWZ5IHRoZSBjYWxsZXIgb2Ygc3VjY2VzcyBvbiB0aGlzIGNwdSAqLwotCXVjaS0+ZXJyID0gTUNfU1VDQ0VTUzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWNyb2NvZGVfdXBkYXRlX2xvY2ssIGZsYWdzKTsKLQlwcmludGsoS0VSTl9JTkZPICJtaWNyb2NvZGU6IENQVSVkIHVwZGF0ZWQgZnJvbSByZXZpc2lvbiAiCisJaWYgKHZhbFsxXSAhPSB1Y2ktPm1jLT5oZHIucmV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBDUFUlZCB1cGRhdGVkIGZyb20gcmV2aXNpb24gIgorCQkJIjB4JXggdG8gMHgleCBmYWlsZWRcbiIsIGNwdV9udW0sIHVjaS0+cmV2LCB2YWxbMV0pOworCQlyZXR1cm47CisJfQorCXByX2RlYnVnKCJtaWNyb2NvZGU6IENQVSVkIHVwZGF0ZWQgZnJvbSByZXZpc2lvbiAiCiAJICAgICAgICIweCV4IHRvIDB4JXgsIGRhdGUgPSAlMDh4IFxuIiwgCiAJICAgICAgIGNwdV9udW0sIHVjaS0+cmV2LCB2YWxbMV0sIHVjaS0+bWMtPmhkci5kYXRlKTsKLQlyZXR1cm47CisJdWNpLT5yZXYgPSB2YWxbMV07Cit9CisKKyNpZmRlZiBDT05GSUdfTUlDUk9DT0RFX09MRF9JTlRFUkZBQ0UKK3N0YXRpYyB2b2lkIF9fdXNlciAqdXNlcl9idWZmZXI7CS8qIHVzZXIgYXJlYSBtaWNyb2NvZGUgZGF0YSBidWZmZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdXNlcl9idWZmZXJfc2l6ZTsJLyogaXQncyBzaXplICovCisKK3N0YXRpYyBsb25nIGdldF9uZXh0X3Vjb2RlKHZvaWQgKiptYywgbG9uZyBvZmZzZXQpCit7CisJbWljcm9jb2RlX2hlYWRlcl90IG1jX2hlYWRlcjsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX3NpemU7CisKKwkvKiBObyBtb3JlIGRhdGEgKi8KKwlpZiAob2Zmc2V0ID49IHVzZXJfYnVmZmVyX3NpemUpCisJCXJldHVybiAwOworCWlmIChjb3B5X2Zyb21fdXNlcigmbWNfaGVhZGVyLCB1c2VyX2J1ZmZlciArIG9mZnNldCwgTUNfSEVBREVSX1NJWkUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQ2FuIG5vdCByZWFkIHVzZXIgZGF0YVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwl0b3RhbF9zaXplID0gZ2V0X3RvdGFsc2l6ZSgmbWNfaGVhZGVyKTsKKwlpZiAob2Zmc2V0ICsgdG90YWxfc2l6ZSA+IHVzZXJfYnVmZmVyX3NpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBCYWQgdG90YWwgc2l6ZSBpbiBtaWNyb2NvZGUgIgorCQkJCSJkYXRhIGZpbGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJKm1jID0gdm1hbGxvYyh0b3RhbF9zaXplKTsKKwlpZiAoISptYykKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGNvcHlfZnJvbV91c2VyKCptYywgdXNlcl9idWZmZXIgKyBvZmZzZXQsIHRvdGFsX3NpemUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQ2FuIG5vdCByZWFkIHVzZXIgZGF0YVxuIik7CisJCXZmcmVlKCptYyk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gb2Zmc2V0ICsgdG90YWxfc2l6ZTsKIH0KIAogc3RhdGljIGludCBkb19taWNyb2NvZGVfdXBkYXRlICh2b2lkKQogewotCWludCBpLCBlcnJvcjsKKwlsb25nIGN1cnNvciA9IDA7CisJaW50IGVycm9yID0gMDsKKwl2b2lkICpuZXdfbWM7CisJaW50IGNwdTsKKwljcHVtYXNrX3Qgb2xkOwogCi0JaWYgKG9uX2VhY2hfY3B1KGNvbGxlY3RfY3B1X2luZm8sIE5VTEwsIDEsIDEpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IEVycm9yISBDb3VsZCBub3QgcnVuIG9uIGFsbCBwcm9jZXNzb3JzXG4iKTsKLQkJZXJyb3IgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9CisJb2xkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOwogCi0JaWYgKChlcnJvciA9IGZpbmRfbWF0Y2hpbmdfdWNvZGVzKCkpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBFcnJvciBpbiB0aGUgbWljcm9jb2RlIGRhdGFcbiIpOwotCQlnb3RvIG91dF9mcmVlOwotCX0KKwl3aGlsZSAoKGN1cnNvciA9IGdldF9uZXh0X3Vjb2RlKCZuZXdfbWMsIGN1cnNvcikpID4gMCkgeworCQllcnJvciA9IG1pY3JvY29kZV9zYW5pdHlfY2hlY2sobmV3X21jKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCS8qCisJCSAqIEl0J3MgcG9zc2libGUgdGhlIGRhdGEgZmlsZSBoYXMgbXVsdGlwbGUgbWF0Y2hpbmcgdWNvZGUsCisJCSAqIGxldHMga2VlcCBzZWFyY2hpbmcgdGlsbCB0aGUgbGF0ZXN0IHZlcnNpb24KKwkJICovCisJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwogCi0JaWYgKG9uX2VhY2hfY3B1KGRvX3VwZGF0ZV9vbmUsIE5VTEwsIDEsIDEpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IEVycm9yISBDb3VsZCBub3QgcnVuIG9uIGFsbCBwcm9jZXNzb3JzXG4iKTsKLQkJZXJyb3IgPSAtRUlPOwotCX0KLQotb3V0X2ZyZWU6Ci0JZm9yX2VhY2hfb25saW5lX2NwdShpKSB7Ci0JCWlmICh1Y29kZV9jcHVfaW5mb1tpXS5tYykgewotCQkJaW50IGo7Ci0JCQl2b2lkICp0bXAgPSB1Y29kZV9jcHVfaW5mb1tpXS5tYzsKLQkJCXZmcmVlKHRtcCk7Ci0JCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGopIHsKLQkJCQlpZiAodWNvZGVfY3B1X2luZm9bal0ubWMgPT0gdG1wKQotCQkJCQl1Y29kZV9jcHVfaW5mb1tqXS5tYyA9IE5VTEw7Ci0JCQl9CisJCQlpZiAoIXVjaS0+dmFsaWQpCisJCQkJY29udGludWU7CisJCQlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KGNwdSkpOworCQkJZXJyb3IgPSBnZXRfbWFjaGluZ19taWNyb2NvZGUobmV3X21jLCBjcHUpOworCQkJaWYgKGVycm9yIDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWlmIChlcnJvciA9PSAxKQorCQkJCWFwcGx5X21pY3JvY29kZShjcHUpOwogCQl9Ci0JCWlmICh1Y29kZV9jcHVfaW5mb1tpXS5lcnIgPT0gTUNfSUdOT1JFRCAmJiB2ZXJib3NlKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWljcm9jb2RlOiBDUFUlZCBub3QgJ3VwZ3JhZGluZycgdG8gZWFybGllciByZXZpc2lvbiIKLQkJCSAgICAgICAiIDB4JXggKGN1cnJlbnQ9MHgleClcbiIsIGksIHVjb2RlX2NwdV9pbmZvW2ldLmNrc3VtLCB1Y29kZV9jcHVfaW5mb1tpXS5yZXYpOworCQl2ZnJlZShuZXdfbWMpOwogCX0KIG91dDoKKwlpZiAoY3Vyc29yID4gMCkKKwkJdmZyZWUobmV3X21jKTsKKwlpZiAoY3Vyc29yIDwgMCkKKwkJZXJyb3IgPSBjdXJzb3I7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBvbGQpOwogCXJldHVybiBlcnJvcjsKIH0KIAorc3RhdGljIGludCBtaWNyb2NvZGVfb3BlbiAoc3RydWN0IGlub2RlICp1bnVzZWQxLCBzdHJ1Y3QgZmlsZSAqdW51c2VkMikKK3sKKwlyZXR1cm4gY2FwYWJsZShDQVBfU1lTX1JBV0lPKSA/IDAgOiAtRVBFUk07Cit9CisKIHN0YXRpYyBzc2l6ZV90IG1pY3JvY29kZV93cml0ZSAoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKIHsKIAlzc2l6ZV90IHJldDsKIAotCWlmIChsZW4gPCBERUZBVUxUX1VDT0RFX1RPVEFMU0laRSkgewotCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogbm90IGVub3VnaCBkYXRhXG4iKTsgCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCWlmICgobGVuID4+IFBBR0VfU0hJRlQpID4gbnVtX3BoeXNwYWdlcykgewogCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogdG9vIG11Y2ggZGF0YSAobWF4ICVsZCBwYWdlcylcbiIsIG51bV9waHlzcGFnZXMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlsb2NrX2NwdV9ob3RwbHVnKCk7CiAJbXV0ZXhfbG9jaygmbWljcm9jb2RlX211dGV4KTsKIAogCXVzZXJfYnVmZmVyID0gKHZvaWQgX191c2VyICopIGJ1ZjsKQEAgLTQ4MCw2ICs0NDYsNyBAQAogCQlyZXQgPSAoc3NpemVfdClsZW47CiAKIAltdXRleF91bmxvY2soJm1pY3JvY29kZV9tdXRleCk7CisJdW5sb2NrX2NwdV9ob3RwbHVnKCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDk2LDcgKzQ2Myw3IEBACiAJLmZvcHMJCT0gJm1pY3JvY29kZV9mb3BzLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgbWljcm9jb2RlX2luaXQgKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBtaWNyb2NvZGVfZGV2X2luaXQgKHZvaWQpCiB7CiAJaW50IGVycm9yOwogCkBAIC01MDgsNiArNDc1LDI4MCBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtaWNyb2NvZGVfZGV2X2V4aXQgKHZvaWQpCit7CisJbWlzY19kZXJlZ2lzdGVyKCZtaWNyb2NvZGVfZGV2KTsKK30KKworTU9EVUxFX0FMSUFTX01JU0NERVYoTUlDUk9DT0RFX01JTk9SKTsKKyNlbHNlCisjZGVmaW5lIG1pY3JvY29kZV9kZXZfaW5pdCgpIDAKKyNkZWZpbmUgbWljcm9jb2RlX2Rldl9leGl0KCkgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworc3RhdGljIGxvbmcgZ2V0X25leHRfdWNvZGVfZnJvbV9idWZmZXIodm9pZCAqKm1jLCB2b2lkICpidWYsCisJdW5zaWduZWQgbG9uZyBzaXplLCBsb25nIG9mZnNldCkKK3sKKwltaWNyb2NvZGVfaGVhZGVyX3QgKm1jX2hlYWRlcjsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX3NpemU7CisKKwkvKiBObyBtb3JlIGRhdGEgKi8KKwlpZiAob2Zmc2V0ID49IHNpemUpCisJCXJldHVybiAwOworCW1jX2hlYWRlciA9IChtaWNyb2NvZGVfaGVhZGVyX3QgKikoYnVmICsgb2Zmc2V0KTsKKwl0b3RhbF9zaXplID0gZ2V0X3RvdGFsc2l6ZShtY19oZWFkZXIpOworCisJaWYgKG9mZnNldCArIHRvdGFsX3NpemUgPiBzaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBlcnJvciEgQmFkIGRhdGEgaW4gbWljcm9jb2RlIGRhdGEgZmlsZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCSptYyA9IHZtYWxsb2ModG90YWxfc2l6ZSk7CisJaWYgKCEqbWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGVycm9yISBDYW4gbm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1jcHkoKm1jLCBidWYgKyBvZmZzZXQsIHRvdGFsX3NpemUpOworCXJldHVybiBvZmZzZXQgKyB0b3RhbF9zaXplOworfQorCisvKiBmYWtlIGRldmljZSBmb3IgcmVxdWVzdF9maXJtd2FyZSAqLworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm1pY3JvY29kZV9wZGV2OworCitzdGF0aWMgaW50IGNwdV9yZXF1ZXN0X21pY3JvY29kZShpbnQgY3B1KQoreworCWNoYXIgbmFtZVszMF07CisJc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGEgKyBjcHU7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZTsKKwl2b2lkICpidWY7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWxvbmcgb2Zmc2V0ID0gMDsKKwlpbnQgZXJyb3I7CisJdm9pZCAqbWM7CisKKwkvKiBXZSBzaG91bGQgYmluZCB0aGUgdGFzayB0byB0aGUgQ1BVICovCisJQlVHX09OKGNwdSAhPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlzcHJpbnRmKG5hbWUsImludGVsLXVjb2RlLyUwMngtJTAyeC0lMDJ4IiwKKwkJYy0+eDg2LCBjLT54ODZfbW9kZWwsIGMtPng4Nl9tYXNrKTsKKwllcnJvciA9IHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCBuYW1lLCAmbWljcm9jb2RlX3BkZXYtPmRldik7CisJaWYgKGVycm9yKSB7CisJCXByX2RlYnVnKCJ1Y29kZSBkYXRhIGZpbGUgJXMgbG9hZCBmYWlsZWRcbiIsIG5hbWUpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCWJ1ZiA9ICh2b2lkICopZmlybXdhcmUtPmRhdGE7CisJc2l6ZSA9IGZpcm13YXJlLT5zaXplOworCXdoaWxlICgob2Zmc2V0ID0gZ2V0X25leHRfdWNvZGVfZnJvbV9idWZmZXIoJm1jLCBidWYsIHNpemUsIG9mZnNldCkpCisJCQk+IDApIHsKKwkJZXJyb3IgPSBtaWNyb2NvZGVfc2FuaXR5X2NoZWNrKG1jKTsKKwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisJCWVycm9yID0gZ2V0X21hY2hpbmdfbWljcm9jb2RlKG1jLCBjcHUpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIEl0J3MgcG9zc2libGUgdGhlIGRhdGEgZmlsZSBoYXMgbXVsdGlwbGUgbWF0Y2hpbmcgdWNvZGUsCisJCSAqIGxldHMga2VlcCBzZWFyY2hpbmcgdGlsbCB0aGUgbGF0ZXN0IHZlcnNpb24KKwkJICovCisJCWlmIChlcnJvciA9PSAxKSB7CisJCQlhcHBseV9taWNyb2NvZGUoY3B1KTsKKwkJCWVycm9yID0gMDsKKwkJfQorCQl2ZnJlZShtYyk7CisJfQorCWlmIChvZmZzZXQgPiAwKQorCQl2ZnJlZShtYyk7CisJaWYgKG9mZnNldCA8IDApCisJCWVycm9yID0gb2Zmc2V0OworCXJlbGVhc2VfZmlybXdhcmUoZmlybXdhcmUpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBtaWNyb2NvZGVfaW5pdF9jcHUoaW50IGNwdSkKK3sKKwljcHVtYXNrX3Qgb2xkOworCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHU7CisKKwlvbGQgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7CisKKwlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KGNwdSkpOworCW11dGV4X2xvY2soJm1pY3JvY29kZV9tdXRleCk7CisJY29sbGVjdF9jcHVfaW5mbyhjcHUpOworCWlmICh1Y2ktPnZhbGlkKQorCQljcHVfcmVxdWVzdF9taWNyb2NvZGUoY3B1KTsKKwltdXRleF91bmxvY2soJm1pY3JvY29kZV9tdXRleCk7CisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBvbGQpOworfQorCitzdGF0aWMgdm9pZCBtaWNyb2NvZGVfZmluaV9jcHUoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OworCisJbXV0ZXhfbG9jaygmbWljcm9jb2RlX211dGV4KTsKKwl1Y2ktPnZhbGlkID0gMDsKKwl2ZnJlZSh1Y2ktPm1jKTsKKwl1Y2ktPm1jID0gTlVMTDsKKwltdXRleF91bmxvY2soJm1pY3JvY29kZV9tdXRleCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlbG9hZF9zdG9yZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzeikKK3sKKwlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgZGV2LT5pZDsKKwljaGFyICplbmQ7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmQsIDApOworCWludCBlcnIgPSAwOworCWludCBjcHUgPSBkZXYtPmlkOworCisJaWYgKGVuZCA9PSBidWYpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh2YWwgPT0gMSkgeworCQljcHVtYXNrX3Qgb2xkOworCisJCW9sZCA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKKworCQlsb2NrX2NwdV9ob3RwbHVnKCk7CisJCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoY3B1KSk7CisKKwkJbXV0ZXhfbG9jaygmbWljcm9jb2RlX211dGV4KTsKKwkJaWYgKHVjaS0+dmFsaWQpCisJCQllcnIgPSBjcHVfcmVxdWVzdF9taWNyb2NvZGUoY3B1KTsKKwkJbXV0ZXhfdW5sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOworCQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKKwkJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBvbGQpOworCX0KKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXJldHVybiBzejsKK30KKworc3RhdGljIHNzaXplX3QgdmVyc2lvbl9zaG93KHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgZGV2LT5pZDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIHVjaS0+cmV2KTsKK30KKworc3RhdGljIHNzaXplX3QgcGZfc2hvdyhzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGRldi0+aWQ7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCV4XG4iLCB1Y2ktPnBmKTsKK30KKworc3RhdGljIFNZU0RFVl9BVFRSKHJlbG9hZCwgMDIwMCwgTlVMTCwgcmVsb2FkX3N0b3JlKTsKK3N0YXRpYyBTWVNERVZfQVRUUih2ZXJzaW9uLCAwNDAwLCB2ZXJzaW9uX3Nob3csIE5VTEwpOworc3RhdGljIFNZU0RFVl9BVFRSKHByb2Nlc3Nvcl9mbGFncywgMDQwMCwgcGZfc2hvdywgTlVMTCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptY19kZWZhdWx0X2F0dHJzW10gPSB7CisJJmF0dHJfcmVsb2FkLmF0dHIsCisJJmF0dHJfdmVyc2lvbi5hdHRyLAorCSZhdHRyX3Byb2Nlc3Nvcl9mbGFncy5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1jX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gbWNfZGVmYXVsdF9hdHRycywKKwkubmFtZSA9ICJtaWNyb2NvZGUiLAorfTsKKworc3RhdGljIGludCBtY19zeXNkZXZfYWRkKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2KQoreworCWludCBjcHUgPSBzeXNfZGV2LT5pZDsKKwlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OworCisJaWYgKCFjcHVfb25saW5lKGNwdSkpCisJCXJldHVybiAwOworCXByX2RlYnVnKCJNaWNyb2NvZGU6Q1BVICVkIGFkZGVkXG4iLCBjcHUpOworCW1lbXNldCh1Y2ksIDAsIHNpemVvZigqdWNpKSk7CisJc3lzZnNfY3JlYXRlX2dyb3VwKCZzeXNfZGV2LT5rb2JqLCAmbWNfYXR0cl9ncm91cCk7CisKKwltaWNyb2NvZGVfaW5pdF9jcHUoY3B1KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtY19zeXNkZXZfcmVtb3ZlKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2KQoreworCWludCBjcHUgPSBzeXNfZGV2LT5pZDsKKworCWlmICghY3B1X29ubGluZShjcHUpKQorCQlyZXR1cm4gMDsKKwlwcl9kZWJ1ZygiTWljcm9jb2RlOkNQVSAlZCByZW1vdmVkXG4iLCBjcHUpOworCW1pY3JvY29kZV9maW5pX2NwdShjcHUpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmc3lzX2Rldi0+a29iaiwgJm1jX2F0dHJfZ3JvdXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jX3N5c2Rldl9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwlpbnQgY3B1ID0gZGV2LT5pZDsKKworCWlmICghY3B1X29ubGluZShjcHUpKQorCQlyZXR1cm4gMDsKKwlwcl9kZWJ1ZygiTWljcm9jb2RlOkNQVSAlZCByZXN1bWVkXG4iLCBjcHUpOworCS8qIG9ubHkgQ1BVIDAgd2lsbCBhcHBseSB1Y29kZSBoZXJlICovCisJYXBwbHlfbWljcm9jb2RlKDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN5c2Rldl9kcml2ZXIgbWNfc3lzZGV2X2RyaXZlciA9IHsKKwkuYWRkID0gbWNfc3lzZGV2X2FkZCwKKwkucmVtb3ZlID0gbWNfc3lzZGV2X3JlbW92ZSwKKwkucmVzdW1lID0gbWNfc3lzZGV2X3Jlc3VtZSwKK307CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBfX2NwdWluaXQgaW50CittY19jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7CisJc3RydWN0IHN5c19kZXZpY2UgKnN5c19kZXY7CisKKwlzeXNfZGV2ID0gZ2V0X2NwdV9zeXNkZXYoY3B1KTsKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQ1BVX09OTElORToKKwljYXNlIENQVV9ET1dOX0ZBSUxFRDoKKwkJbWNfc3lzZGV2X2FkZChzeXNfZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgorCQltY19zeXNkZXZfcmVtb3ZlKHN5c19kZXYpOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBtY19jcHVfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBtY19jcHVfY2FsbGJhY2ssCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IG1pY3JvY29kZV9pbml0ICh2b2lkKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gbWljcm9jb2RlX2Rldl9pbml0KCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJbWljcm9jb2RlX3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJtaWNyb2NvZGUiLCAtMSwKKwkJCQkJCQkgTlVMTCwgMCk7CisJaWYgKElTX0VSUihtaWNyb2NvZGVfcGRldikpIHsKKwkJbWljcm9jb2RlX2Rldl9leGl0KCk7CisJCXJldHVybiBQVFJfRVJSKG1pY3JvY29kZV9wZGV2KTsKKwl9CisKKwlsb2NrX2NwdV9ob3RwbHVnKCk7CisJZXJyb3IgPSBzeXNkZXZfZHJpdmVyX3JlZ2lzdGVyKCZjcHVfc3lzZGV2X2NsYXNzLCAmbWNfc3lzZGV2X2RyaXZlcik7CisJdW5sb2NrX2NwdV9ob3RwbHVnKCk7CisJaWYgKGVycm9yKSB7CisJCW1pY3JvY29kZV9kZXZfZXhpdCgpOworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihtaWNyb2NvZGVfcGRldik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJm1jX2NwdV9ub3RpZmllcik7CisKIAlwcmludGsoS0VSTl9JTkZPIAogCQkiSUEtMzIgTWljcm9jb2RlIFVwZGF0ZSBEcml2ZXI6IHYiIE1JQ1JPQ09ERV9WRVJTSU9OICIgPHRpZ3JhbkB2ZXJpdGFzLmNvbT5cbiIpOwogCXJldHVybiAwOwpAQCAtNTE1LDkgKzc1NiwxNiBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbWljcm9jb2RlX2V4aXQgKHZvaWQpCiB7Ci0JbWlzY19kZXJlZ2lzdGVyKCZtaWNyb2NvZGVfZGV2KTsKKwltaWNyb2NvZGVfZGV2X2V4aXQoKTsKKworCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZtY19jcHVfbm90aWZpZXIpOworCisJbG9ja19jcHVfaG90cGx1ZygpOworCXN5c2Rldl9kcml2ZXJfdW5yZWdpc3RlcigmY3B1X3N5c2Rldl9jbGFzcywgJm1jX3N5c2Rldl9kcml2ZXIpOworCXVubG9ja19jcHVfaG90cGx1ZygpOworCisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIobWljcm9jb2RlX3BkZXYpOwogfQogCiBtb2R1bGVfaW5pdChtaWNyb2NvZGVfaW5pdCkKIG1vZHVsZV9leGl0KG1pY3JvY29kZV9leGl0KQotTU9EVUxFX0FMSUFTX01JU0NERVYoTUlDUk9DT0RFX01JTk9SKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvbXBwYXJzZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9tcHBhcnNlLmMKaW5kZXggYTcwYjVmYS4uNDQyYWFmOCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9tcHBhcnNlLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9tcHBhcnNlLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxhc20vaW9fYXBpYy5oPgogCiAjaW5jbHVkZSA8bWFjaF9hcGljLmg+CisjaW5jbHVkZSA8bWFjaF9hcGljZGVmLmg+CiAjaW5jbHVkZSA8bWFjaF9tcHBhcnNlLmg+CiAjaW5jbHVkZSA8Ymlvc19lYmRhLmg+CiAKQEAgLTY4LDcgKzY5LDcgQEAKIC8qIFByb2Nlc3NvciB0aGF0IGlzIGRvaW5nIHRoZSBib290IHVwICovCiB1bnNpZ25lZCBpbnQgYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gLTFVOwogLyogSW50ZXJuYWwgcHJvY2Vzc29yIGNvdW50ICovCi1zdGF0aWMgdW5zaWduZWQgaW50IF9fZGV2aW5pdGRhdGEgbnVtX3Byb2Nlc3NvcnM7Cit1bnNpZ25lZCBpbnQgX19jcHVpbml0ZGF0YSBudW1fcHJvY2Vzc29yczsKIAogLyogQml0bWFzayBvZiBwaHlzaWNhbGx5IGV4aXN0aW5nIENQVXMgKi8KIHBoeXNpZF9tYXNrX3QgcGh5c19jcHVfcHJlc2VudF9tYXA7CkBAIC0yMjgsMTIgKzIyOSwxNCBAQAogCiAJbXBjX29lbV9idXNfaW5mbyhtLCBzdHIsIHRyYW5zbGF0aW9uX3RhYmxlW21wY19yZWNvcmRdKTsKIAorI2lmIE1BWF9NUF9CVVNTRVMgPCAyNTYKIAlpZiAobS0+bXBjX2J1c2lkID49IE1BWF9NUF9CVVNTRVMpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiTVAgdGFibGUgYnVzaWQgdmFsdWUgKCVkKSBmb3IgYnVzdHlwZSAlcyAiCiAJCQkiIGlzIHRvbyBsYXJnZSwgbWF4LiBzdXBwb3J0ZWQgaXMgJWRcbiIsCiAJCQltLT5tcGNfYnVzaWQsIHN0ciwgTUFYX01QX0JVU1NFUyAtIDEpOwogCQlyZXR1cm47CiAJfQorI2VuZGlmCiAKIAlpZiAoc3RybmNtcChzdHIsIEJVU1RZUEVfSVNBLCBzaXplb2YoQlVTVFlQRV9JU0EpLTEpID09IDApIHsKIAkJbXBfYnVzX2lkX3RvX3R5cGVbbS0+bXBjX2J1c2lkXSA9IE1QX0JVU19JU0E7CkBAIC0yOTMsMTkgKzI5Niw2IEBACiAJCQltLT5tcGNfaXJxdHlwZSwgbS0+bXBjX2lycWZsYWcgJiAzLAogCQkJKG0tPm1wY19pcnFmbGFnID4+IDIpICYzLCBtLT5tcGNfc3JjYnVzaWQsCiAJCQltLT5tcGNfc3JjYnVzaXJxLCBtLT5tcGNfZGVzdGFwaWMsIG0tPm1wY19kZXN0YXBpY2xpbnQpOwotCS8qCi0JICogV2VsbCBpdCBzZWVtcyBhbGwgU01QIGJvYXJkcyBpbiBleGlzdGVuY2UKLQkgKiB1c2UgRXh0SU5UL0xWVDEgPT0gTElOVDAgYW5kCi0JICogTk1JL0xWVDIgPT0gTElOVDEgLSB0aGUgZm9sbG93aW5nIGNoZWNrCi0JICogd2lsbCBzaG93IHVzIGlmIHRoaXMgYXNzdW1wdGlvbnMgaXMgZmFsc2UuCi0JICogVW50aWwgdGhlbiB3ZSBkbyBub3QgaGF2ZSB0byBhZGQgYmFnZ2FnZS4KLQkgKi8KLQlpZiAoKG0tPm1wY19pcnF0eXBlID09IG1wX0V4dElOVCkgJiYKLQkJKG0tPm1wY19kZXN0YXBpY2xpbnQgIT0gMCkpCi0JCQlCVUcoKTsKLQlpZiAoKG0tPm1wY19pcnF0eXBlID09IG1wX05NSSkgJiYKLQkJKG0tPm1wY19kZXN0YXBpY2xpbnQgIT0gMSkpCi0JCQlCVUcoKTsKIH0KIAogI2lmZGVmIENPTkZJR19YODZfTlVNQVEKQEAgLTgyMiw4ICs4MTIsNyBAQAogCiAjaWZkZWYgQ09ORklHX0FDUEkKIAotdm9pZCBfX2luaXQgbXBfcmVnaXN0ZXJfbGFwaWNfYWRkcmVzcyAoCi0JdTY0CQkJYWRkcmVzcykKK3ZvaWQgX19pbml0IG1wX3JlZ2lzdGVyX2xhcGljX2FkZHJlc3ModTY0IGFkZHJlc3MpCiB7CiAJbXBfbGFwaWNfYWRkciA9ICh1bnNpZ25lZCBsb25nKSBhZGRyZXNzOwogCkBAIC04MzUsMTMgKzgyNCwxMCBAQAogCURwcmludGsoIkJvb3QgQ1BVID0gJWRcbiIsIGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CiB9CiAKLQotdm9pZCBfX2RldmluaXQgbXBfcmVnaXN0ZXJfbGFwaWMgKAotCXU4CQkJaWQsIAotCXU4CQkJZW5hYmxlZCkKK3ZvaWQgX19kZXZpbml0IG1wX3JlZ2lzdGVyX2xhcGljICh1OCBpZCwgdTggZW5hYmxlZCkKIHsKIAlzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgcHJvY2Vzc29yOwotCWludAkJCWJvb3RfY3B1ID0gMDsKKwlpbnQgYm9vdF9jcHUgPSAwOwogCQogCWlmIChNQVhfQVBJQ1MgLSBpZCA8PSAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlByb2Nlc3NvciAjJWQgaW52YWxpZCAobWF4ICVkKVxuIiwKQEAgLTg3OCwxMSArODY0LDkgQEAKIAl1MzIJCQlwaW5fcHJvZ3JhbW1lZFs0XTsKIH0gbXBfaW9hcGljX3JvdXRpbmdbTUFYX0lPX0FQSUNTXTsKIAotCi1zdGF0aWMgaW50IG1wX2ZpbmRfaW9hcGljICgKLQlpbnQJCQlnc2kpCitzdGF0aWMgaW50IG1wX2ZpbmRfaW9hcGljIChpbnQgZ3NpKQogewotCWludAkJCWkgPSAwOworCWludCBpID0gMDsKIAogCS8qIEZpbmQgdGhlIElPQVBJQyB0aGF0IG1hbmFnZXMgdGhpcyBHU0kuICovCiAJZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY3M7IGkrKykgewpAQCAtODk1LDE1ICs4NzksMTEgQEAKIAogCXJldHVybiAtMTsKIH0KLQkKIAotdm9pZCBfX2luaXQgbXBfcmVnaXN0ZXJfaW9hcGljICgKLQl1OAkJCWlkLCAKLQl1MzIJCQlhZGRyZXNzLAotCXUzMgkJCWdzaV9iYXNlKQordm9pZCBfX2luaXQgbXBfcmVnaXN0ZXJfaW9hcGljKHU4IGlkLCB1MzIgYWRkcmVzcywgdTMyIGdzaV9iYXNlKQogewotCWludAkJCWlkeCA9IDA7Ci0JaW50CQkJdG1waWQ7CisJaW50IGlkeCA9IDA7CisJaW50IHRtcGlkOwogCiAJaWYgKG5yX2lvYXBpY3MgPj0gTUFYX0lPX0FQSUNTKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IE1heCAjIG9mIEkvTyBBUElDcyAoJWQpIGV4Y2VlZGVkICIKQEAgLTk0OSwxNiArOTI5LDEwIEBACiAJCW1wX2lvYXBpY3NbaWR4XS5tcGNfYXBpY3ZlciwgbXBfaW9hcGljc1tpZHhdLm1wY19hcGljYWRkciwKIAkJbXBfaW9hcGljX3JvdXRpbmdbaWR4XS5nc2lfYmFzZSwKIAkJbXBfaW9hcGljX3JvdXRpbmdbaWR4XS5nc2lfZW5kKTsKLQotCXJldHVybjsKIH0KIAotCi12b2lkIF9faW5pdCBtcF9vdmVycmlkZV9sZWdhY3lfaXJxICgKLQl1OAkJCWJ1c19pcnEsCi0JdTgJCQlwb2xhcml0eSwgCi0JdTgJCQl0cmlnZ2VyLCAKLQl1MzIJCQlnc2kpCit2b2lkIF9faW5pdAorbXBfb3ZlcnJpZGVfbGVnYWN5X2lycSh1OCBidXNfaXJxLCB1OCBwb2xhcml0eSwgdTggdHJpZ2dlciwgdTMyIGdzaSkKIHsKIAlzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgaW50c3JjOwogCWludAkJCWlvYXBpYyA9IC0xOwpAQCAtOTk2LDE1ICs5NzAsMTMgQEAKIAltcF9pcnFzW21wX2lycV9lbnRyaWVzXSA9IGludHNyYzsKIAlpZiAoKyttcF9pcnFfZW50cmllcyA9PSBNQVhfSVJRX1NPVVJDRVMpCiAJCXBhbmljKCJNYXggIyBvZiBpcnEgc291cmNlcyBleGNlZWRlZCFcbiIpOwotCi0JcmV0dXJuOwogfQogCiB2b2lkIF9faW5pdCBtcF9jb25maWdfYWNwaV9sZWdhY3lfaXJxcyAodm9pZCkKIHsKIAlzdHJ1Y3QgbXBjX2NvbmZpZ19pbnRzcmMgaW50c3JjOwotCWludAkJCWkgPSAwOwotCWludAkJCWlvYXBpYyA9IC0xOworCWludCBpID0gMDsKKwlpbnQgaW9hcGljID0gLTE7CiAKIAkvKiAKIAkgKiBGYWJyaWNhdGUgdGhlIGxlZ2FjeSBJU0EgYnVzIChidXMgIzMxKS4KQEAgLTEwNzMsMTIgKzEwNDUsMTIgQEAKIAogI2RlZmluZSBNQVhfR1NJX05VTQk0MDk2CiAKLWludCBtcF9yZWdpc3Rlcl9nc2kgKHUzMiBnc2ksIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpCitpbnQgbXBfcmVnaXN0ZXJfZ3NpKHUzMiBnc2ksIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpCiB7Ci0JaW50CQkJaW9hcGljID0gLTE7Ci0JaW50CQkJaW9hcGljX3BpbiA9IDA7Ci0JaW50CQkJaWR4LCBiaXQgPSAwOwotCXN0YXRpYyBpbnQJCXBjaV9pcnEgPSAxNjsKKwlpbnQgaW9hcGljID0gLTE7CisJaW50IGlvYXBpY19waW4gPSAwOworCWludCBpZHgsIGJpdCA9IDA7CisJc3RhdGljIGludCBwY2lfaXJxID0gMTY7CiAJLyoKIAkgKiBNYXBwaW5nIGJldHdlZW4gR2xvYmFsIFN5c3RlbSBJbnRlcnJ1cHMsIHdoaWNoCiAJICogcmVwcmVzZW50IGFsbCBwb3NzaWJsZSBpbnRlcnJ1cHRzLCBhbmQgSVJRcwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMKaW5kZXggYWNiMzUxNC4uZGJkYTcwNiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYworKysgYi9hcmNoL2kzODYva2VybmVsL25taS5jCkBAIC0yMSw4MyArMjEsMTc0IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogCiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9ubWkuaD4KKyNpbmNsdWRlIDxhc20va2RlYnVnLmg+CiAjaW5jbHVkZSA8YXNtL2ludGVsX2FyY2hfcGVyZm1vbi5oPgogCiAjaW5jbHVkZSAibWFjaF90cmFwcy5oIgogCi11bnNpZ25lZCBpbnQgbm1pX3dhdGNoZG9nID0gTk1JX05PTkU7Ci1leHRlcm4gaW50IHVua25vd25fbm1pX3BhbmljOwotc3RhdGljIHVuc2lnbmVkIGludCBubWlfaHogPSBIWjsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbm1pX3BlcmZjdHJfbXNyOwkvKiB0aGUgTVNSIHRvIHJlc2V0IGluIE5NSSBoYW5kbGVyICovCi1zdGF0aWMgdW5zaWduZWQgaW50IG5taV9wNF9jY2NyX3ZhbDsKLWV4dGVybiB2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLQotLyoKLSAqIGxhcGljX25taV9vd25lciB0cmFja3MgdGhlIG93bmVyc2hpcCBvZiB0aGUgbGFwaWMgTk1JIGhhcmR3YXJlOgotICogLSBpdCBtYXkgYmUgcmVzZXJ2ZWQgYnkgc29tZSBvdGhlciBkcml2ZXIsIG9yIG5vdAotICogLSB3aGVuIG5vdCByZXNlcnZlZCBieSBzb21lIG90aGVyIGRyaXZlciwgaXQgbWF5IGJlIHVzZWQgZm9yCi0gKiAgIHRoZSBOTUkgd2F0Y2hkb2csIG9yIG5vdAotICoKLSAqIFRoaXMgaXMgbWFpbnRhaW5lZCBzZXBhcmF0ZWx5IGZyb20gbm1pX2FjdGl2ZSBiZWNhdXNlIHRoZSBOTUkKLSAqIHdhdGNoZG9nIG1heSBhbHNvIGJlIGRyaXZlbiBmcm9tIHRoZSBJL08gQVBJQyB0aW1lci4KKy8qIHBlcmZjdHJfbm1pX293bmVyIHRyYWNrcyB0aGUgb3duZXJzaGlwIG9mIHRoZSBwZXJmY3RyIHJlZ2lzdGVyczoKKyAqIGV2dHNlbF9ubWlfb3duZXIgdHJhY2tzIHRoZSBvd25lcnNoaXAgb2YgdGhlIGV2ZW50IHNlbGVjdGlvbgorICogLSBkaWZmZXJlbnQgcGVyZm9ybWFuY2UgY291bnRlcnMvIGV2ZW50IHNlbGVjdGlvbiBtYXkgYmUgcmVzZXJ2ZWQgZm9yCisgKiAgIGRpZmZlcmVudCBzdWJzeXN0ZW1zIHRoaXMgcmVzZXJ2YXRpb24gc3lzdGVtIGp1c3QgdHJpZXMgdG8gY29vcmRpbmF0ZQorICogICB0aGluZ3MgYSBsaXR0bGUKICAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhsYXBpY19ubWlfb3duZXJfbG9jayk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGxhcGljX25taV9vd25lcjsKLSNkZWZpbmUgTEFQSUNfTk1JX1dBVENIRE9HCSgxPDwwKQotI2RlZmluZSBMQVBJQ19OTUlfUkVTRVJWRUQJKDE8PDEpCitzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgcGVyZmN0cl9ubWlfb3duZXIpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIGV2bnRzZWxfbm1pX293bmVyWzNdKTsKKworLyogdGhpcyBudW1iZXIgaXMgY2FsY3VsYXRlZCBmcm9tIEludGVsJ3MgTVNSX1A0X0NSVV9FU0NSNSByZWdpc3RlciBhbmQgaXQncworICogb2Zmc2V0IGZyb20gTVNSX1A0X0JTVV9FU0NSMC4gIEl0IHdpbGwgYmUgdGhlIG1heCBmb3IgYWxsIHBsYXRmb3JtcyAoZm9yIG5vdykKKyAqLworI2RlZmluZSBOTUlfTUFYX0NPVU5URVJfQklUUyA2NgogCiAvKiBubWlfYWN0aXZlOgotICogKzE6IHRoZSBsYXBpYyBOTUkgd2F0Y2hkb2cgaXMgYWN0aXZlLCBidXQgY2FuIGJlIGRpc2FibGVkCi0gKiAgMDogdGhlIGxhcGljIE5NSSB3YXRjaGRvZyBoYXMgbm90IGJlZW4gc2V0IHVwLCBhbmQgY2Fubm90CisgKiA+MDogdGhlIGxhcGljIE5NSSB3YXRjaGRvZyBpcyBhY3RpdmUsIGJ1dCBjYW4gYmUgZGlzYWJsZWQKKyAqIDwwOiB0aGUgbGFwaWMgTk1JIHdhdGNoZG9nIGhhcyBub3QgYmVlbiBzZXQgdXAsIGFuZCBjYW5ub3QKICAqICAgICBiZSBlbmFibGVkCi0gKiAtMTogdGhlIGxhcGljIE5NSSB3YXRjaGRvZyBpcyBkaXNhYmxlZCwgYnV0IGNhbiBiZSBlbmFibGVkCisgKiAgMDogdGhlIGxhcGljIE5NSSB3YXRjaGRvZyBpcyBkaXNhYmxlZCwgYnV0IGNhbiBiZSBlbmFibGVkCiAgKi8KLWludCBubWlfYWN0aXZlOworYXRvbWljX3Qgbm1pX2FjdGl2ZSA9IEFUT01JQ19JTklUKDApOwkJLyogb3Byb2ZpbGUgdXNlcyB0aGlzICovCiAKLSNkZWZpbmUgSzdfRVZOVFNFTF9FTkFCTEUJKDEgPDwgMjIpCi0jZGVmaW5lIEs3X0VWTlRTRUxfSU5UCQkoMSA8PCAyMCkKLSNkZWZpbmUgSzdfRVZOVFNFTF9PUwkJKDEgPDwgMTcpCi0jZGVmaW5lIEs3X0VWTlRTRUxfVVNSCQkoMSA8PCAxNikKLSNkZWZpbmUgSzdfRVZFTlRfQ1lDTEVTX1BST0NFU1NPUl9JU19SVU5OSU5HCTB4NzYKLSNkZWZpbmUgSzdfTk1JX0VWRU5UCQlLN19FVkVOVF9DWUNMRVNfUFJPQ0VTU09SX0lTX1JVTk5JTkcKK3Vuc2lnbmVkIGludCBubWlfd2F0Y2hkb2cgPSBOTUlfREVGQVVMVDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbm1pX2h6ID0gSFo7CiAKLSNkZWZpbmUgUDZfRVZOVFNFTDBfRU5BQkxFCSgxIDw8IDIyKQotI2RlZmluZSBQNl9FVk5UU0VMX0lOVAkJKDEgPDwgMjApCi0jZGVmaW5lIFA2X0VWTlRTRUxfT1MJCSgxIDw8IDE3KQotI2RlZmluZSBQNl9FVk5UU0VMX1VTUgkJKDEgPDwgMTYpCi0jZGVmaW5lIFA2X0VWRU5UX0NQVV9DTE9DS1NfTk9UX0hBTFRFRAkweDc5Ci0jZGVmaW5lIFA2X05NSV9FVkVOVAkJUDZfRVZFTlRfQ1BVX0NMT0NLU19OT1RfSEFMVEVECitzdHJ1Y3Qgbm1pX3dhdGNoZG9nX2N0bGJsayB7CisJaW50IGVuYWJsZWQ7CisJdTY0IGNoZWNrX2JpdDsKKwl1bnNpZ25lZCBpbnQgY2Njcl9tc3I7CisJdW5zaWduZWQgaW50IHBlcmZjdHJfbXNyOyAgLyogdGhlIE1TUiB0byByZXNldCBpbiBOTUkgaGFuZGxlciAqLworCXVuc2lnbmVkIGludCBldm50c2VsX21zcjsgIC8qIHRoZSBNU1IgdG8gc2VsZWN0IHRoZSBldmVudHMgdG8gaGFuZGxlICovCit9Oworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBubWlfd2F0Y2hkb2dfY3RsYmxrLCBubWlfd2F0Y2hkb2dfY3RsYmxrKTsKIAotI2RlZmluZSBNU1JfUDRfTUlTQ19FTkFCTEUJMHgxQTAKLSNkZWZpbmUgTVNSX1A0X01JU0NfRU5BQkxFX1BFUkZfQVZBSUwJKDE8PDcpCi0jZGVmaW5lIE1TUl9QNF9NSVNDX0VOQUJMRV9QRUJTX1VOQVZBSUwJKDE8PDEyKQotI2RlZmluZSBNU1JfUDRfUEVSRkNUUjAJCTB4MzAwCi0jZGVmaW5lIE1TUl9QNF9DQ0NSMAkJMHgzNjAKLSNkZWZpbmUgUDRfRVNDUl9FVkVOVF9TRUxFQ1QoTikJKChOKTw8MjUpCi0jZGVmaW5lIFA0X0VTQ1JfT1MJCSgxPDwzKQotI2RlZmluZSBQNF9FU0NSX1VTUgkJKDE8PDIpCi0jZGVmaW5lIFA0X0NDQ1JfT1ZGX1BNSTAJKDE8PDI2KQotI2RlZmluZSBQNF9DQ0NSX09WRl9QTUkxCSgxPDwyNykKLSNkZWZpbmUgUDRfQ0NDUl9USFJFU0hPTEQoTikJKChOKTw8MjApCi0jZGVmaW5lIFA0X0NDQ1JfQ09NUExFTUVOVAkoMTw8MTkpCi0jZGVmaW5lIFA0X0NDQ1JfQ09NUEFSRQkJKDE8PDE4KQotI2RlZmluZSBQNF9DQ0NSX1JFUVVJUkVECSgzPDwxNikKLSNkZWZpbmUgUDRfQ0NDUl9FU0NSX1NFTEVDVChOKQkoKE4pPDwxMykKLSNkZWZpbmUgUDRfQ0NDUl9FTkFCTEUJCSgxPDwxMikKLS8qIFNldCB1cCBJUV9DT1VOVEVSMCB0byBiZWhhdmUgbGlrZSBhIGNsb2NrLCBieSBoYXZpbmcgSVFfQ0NDUjAgZmlsdGVyCi0gICBDUlVfRVNDUjAgKHdpdGggYW55IG5vbi1udWxsIGV2ZW50IHNlbGVjdG9yKSB0aHJvdWdoIGEgY29tcGxlbWVudGVkCi0gICBtYXggdGhyZXNob2xkLiBbSUEzMi1Wb2wzLCBTZWN0aW9uIDE0LjkuOV0gKi8KLSNkZWZpbmUgTVNSX1A0X0lRX0NPVU5URVIwCTB4MzBDCi0jZGVmaW5lIFA0X05NSV9DUlVfRVNDUjAJKFA0X0VTQ1JfRVZFTlRfU0VMRUNUKDB4M0YpfFA0X0VTQ1JfT1N8UDRfRVNDUl9VU1IpCi0jZGVmaW5lIFA0X05NSV9JUV9DQ0NSMAlcCi0JKFA0X0NDQ1JfT1ZGX1BNSTB8UDRfQ0NDUl9USFJFU0hPTEQoMTUpfFA0X0NDQ1JfQ09NUExFTUVOVHwJXAotCSBQNF9DQ0NSX0NPTVBBUkV8UDRfQ0NDUl9SRVFVSVJFRHxQNF9DQ0NSX0VTQ1JfU0VMRUNUKDQpfFA0X0NDQ1JfRU5BQkxFKQorLyogbG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGludCB1bmtub3duX25taV9wYW5pY19jYWxsYmFjayhzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGNwdSk7CiAKLSNkZWZpbmUgQVJDSF9QRVJGTU9OX05NSV9FVkVOVF9TRUwJQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1NFTAotI2RlZmluZSBBUkNIX1BFUkZNT05fTk1JX0VWRU5UX1VNQVNLCUFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19VTUFTSworZXh0ZXJuIHZvaWQgc2hvd19yZWdpc3RlcnMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworZXh0ZXJuIGludCB1bmtub3duX25taV9wYW5pYzsKKworLyogY29udmVydHMgYW4gbXNyIHRvIGFuIGFwcHJvcHJpYXRlIHJlc2VydmF0aW9uIGJpdCAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbm1pX3BlcmZjdHJfbXNyX3RvX2JpdCh1bnNpZ25lZCBpbnQgbXNyKQoreworCS8qIHJldHVybnMgdGhlIGJpdCBvZmZzZXQgb2YgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIgcmVnaXN0ZXIgKi8KKwlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgeworCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6CisJCXJldHVybiAobXNyIC0gTVNSX0s3X1BFUkZDVFIwKTsKKwljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCWlmIChjcHVfaGFzKCZib290X2NwdV9kYXRhLCBYODZfRkVBVFVSRV9BUkNIX1BFUkZNT04pKQorCQkJcmV0dXJuIChtc3IgLSBNU1JfQVJDSF9QRVJGTU9OX1BFUkZDVFIwKTsKKworCQlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2KSB7CisJCWNhc2UgNjoKKwkJCXJldHVybiAobXNyIC0gTVNSX1A2X1BFUkZDVFIwKTsKKwkJY2FzZSAxNToKKwkJCXJldHVybiAobXNyIC0gTVNSX1A0X0JQVV9QRVJGQ1RSMCk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGNvbnZlcnRzIGFuIG1zciB0byBhbiBhcHByb3ByaWF0ZSByZXNlcnZhdGlvbiBiaXQgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5taV9ldm50c2VsX21zcl90b19iaXQodW5zaWduZWQgaW50IG1zcikKK3sKKwkvKiByZXR1cm5zIHRoZSBiaXQgb2Zmc2V0IG9mIHRoZSBldmVudCBzZWxlY3Rpb24gcmVnaXN0ZXIgKi8KKwlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgeworCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6CisJCXJldHVybiAobXNyIC0gTVNSX0s3X0VWTlRTRUwwKTsKKwljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCWlmIChjcHVfaGFzKCZib290X2NwdV9kYXRhLCBYODZfRkVBVFVSRV9BUkNIX1BFUkZNT04pKQorCQkJcmV0dXJuIChtc3IgLSBNU1JfQVJDSF9QRVJGTU9OX0VWRU5UU0VMMCk7CisKKwkJc3dpdGNoIChib290X2NwdV9kYXRhLng4NikgeworCQljYXNlIDY6CisJCQlyZXR1cm4gKG1zciAtIE1TUl9QNl9FVk5UU0VMMCk7CisJCWNhc2UgMTU6CisJCQlyZXR1cm4gKG1zciAtIE1TUl9QNF9CU1VfRVNDUjApOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBjaGVja3MgZm9yIGEgYml0IGF2YWlsYWJpbGl0eSAoaGFjayBmb3Igb3Byb2ZpbGUpICovCitpbnQgYXZhaWxfdG9fcmVzcnZfcGVyZmN0cl9ubWlfYml0KHVuc2lnbmVkIGludCBjb3VudGVyKQoreworCUJVR19PTihjb3VudGVyID4gTk1JX01BWF9DT1VOVEVSX0JJVFMpOworCisJcmV0dXJuICghdGVzdF9iaXQoY291bnRlciwgJl9fZ2V0X2NwdV92YXIocGVyZmN0cl9ubWlfb3duZXIpKSk7Cit9CisKKy8qIGNoZWNrcyB0aGUgYW4gbXNyIGZvciBhdmFpbGFiaWxpdHkgKi8KK2ludCBhdmFpbF90b19yZXNydl9wZXJmY3RyX25taSh1bnNpZ25lZCBpbnQgbXNyKQoreworCXVuc2lnbmVkIGludCBjb3VudGVyOworCisJY291bnRlciA9IG5taV9wZXJmY3RyX21zcl90b19iaXQobXNyKTsKKwlCVUdfT04oY291bnRlciA+IE5NSV9NQVhfQ09VTlRFUl9CSVRTKTsKKworCXJldHVybiAoIXRlc3RfYml0KGNvdW50ZXIsICZfX2dldF9jcHVfdmFyKHBlcmZjdHJfbm1pX293bmVyKSkpOworfQorCitpbnQgcmVzZXJ2ZV9wZXJmY3RyX25taSh1bnNpZ25lZCBpbnQgbXNyKQoreworCXVuc2lnbmVkIGludCBjb3VudGVyOworCisJY291bnRlciA9IG5taV9wZXJmY3RyX21zcl90b19iaXQobXNyKTsKKwlCVUdfT04oY291bnRlciA+IE5NSV9NQVhfQ09VTlRFUl9CSVRTKTsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChjb3VudGVyLCAmX19nZXRfY3B1X3ZhcihwZXJmY3RyX25taV9vd25lcikpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCByZWxlYXNlX3BlcmZjdHJfbm1pKHVuc2lnbmVkIGludCBtc3IpCit7CisJdW5zaWduZWQgaW50IGNvdW50ZXI7CisKKwljb3VudGVyID0gbm1pX3BlcmZjdHJfbXNyX3RvX2JpdChtc3IpOworCUJVR19PTihjb3VudGVyID4gTk1JX01BWF9DT1VOVEVSX0JJVFMpOworCisJY2xlYXJfYml0KGNvdW50ZXIsICZfX2dldF9jcHVfdmFyKHBlcmZjdHJfbm1pX293bmVyKSk7Cit9CisKK2ludCByZXNlcnZlX2V2bnRzZWxfbm1pKHVuc2lnbmVkIGludCBtc3IpCit7CisJdW5zaWduZWQgaW50IGNvdW50ZXI7CisKKwljb3VudGVyID0gbm1pX2V2bnRzZWxfbXNyX3RvX2JpdChtc3IpOworCUJVR19PTihjb3VudGVyID4gTk1JX01BWF9DT1VOVEVSX0JJVFMpOworCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGNvdW50ZXIsICZfX2dldF9jcHVfdmFyKGV2bnRzZWxfbm1pX293bmVyKVswXSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCit2b2lkIHJlbGVhc2VfZXZudHNlbF9ubWkodW5zaWduZWQgaW50IG1zcikKK3sKKwl1bnNpZ25lZCBpbnQgY291bnRlcjsKKworCWNvdW50ZXIgPSBubWlfZXZudHNlbF9tc3JfdG9fYml0KG1zcik7CisJQlVHX09OKGNvdW50ZXIgPiBOTUlfTUFYX0NPVU5URVJfQklUUyk7CisKKwljbGVhcl9iaXQoY291bnRlciwgJl9fZ2V0X2NwdV92YXIoZXZudHNlbF9ubWlfb3duZXIpWzBdKTsKK30KKworc3RhdGljIF9fY3B1aW5pdCBpbmxpbmUgaW50IG5taV9rbm93bl9jcHUodm9pZCkKK3sKKwlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgeworCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6CisJCXJldHVybiAoKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSB8fCAoYm9vdF9jcHVfZGF0YS54ODYgPT0gNikpOworCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKKwkJaWYgKGNwdV9oYXMoJmJvb3RfY3B1X2RhdGEsIFg4Nl9GRUFUVVJFX0FSQ0hfUEVSRk1PTikpCisJCQlyZXR1cm4gMTsKKwkJZWxzZQorCQkJcmV0dXJuICgoYm9vdF9jcHVfZGF0YS54ODYgPT0gMTUpIHx8IChib290X2NwdV9kYXRhLng4NiA9PSA2KSk7CisJfQorCXJldHVybiAwOworfQogCiAjaWZkZWYgQ09ORklHX1NNUAogLyogVGhlIHBlcmZvcm1hbmNlIGNvdW50ZXJzIHVzZWQgYnkgTk1JX0xPQ0FMX0FQSUMgZG9uJ3QgdHJpZ2dlciB3aGVuCkBAIC0xMjUsNyArMjE2LDE4IEBACiAJdW5zaWduZWQgaW50ICpwcmV2X25taV9jb3VudDsKIAlpbnQgY3B1OwogCi0JaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfTk9ORSkKKwkvKiBFbmFibGUgTk1JIHdhdGNoZG9nIGZvciBuZXdlciBzeXN0ZW1zLgorICAgICAgICAgICBBY3R1YWxseSBpdCBzaG91bGQgYmUgc2FmZSBmb3IgbW9zdCBzeXN0ZW1zIGJlZm9yZSAyMDA0IHRvbyBleGNlcHQKKwkgICBmb3Igc29tZSBJQk0gc3lzdGVtcyB0aGF0IGNvcnJ1cHQgcmVnaXN0ZXJzIHdoZW4gTk1JIGhhcHBlbnMKKwkgICBkdXJpbmcgU01NLiBVbmZvcnR1bmF0ZWx5IHdlIGRvbid0IGhhdmUgbW9yZSBleGFjdCBpbmZvcm1hdGlvbgorIAkgICBvbiB0aGVzZSBhbmQgdXNlIHRoaXMgY29hcnNlIGNoZWNrLiAqLworCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0RFRkFVTFQgJiYgZG1pX2dldF95ZWFyKERNSV9CSU9TX0RBVEUpID49IDIwMDQpCisJCW5taV93YXRjaGRvZyA9IE5NSV9MT0NBTF9BUElDOworCisJaWYgKChubWlfd2F0Y2hkb2cgPT0gTk1JX05PTkUpIHx8IChubWlfd2F0Y2hkb2cgPT0gTk1JX0RFRkFVTFQpKQorCQlyZXR1cm4gMDsKKworCWlmICghYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpKQogCQlyZXR1cm4gMDsKIAogCXByZXZfbm1pX2NvdW50ID0ga21hbGxvYyhOUl9DUFVTICogc2l6ZW9mKGludCksIEdGUF9LRVJORUwpOwpAQCAtMTQ5LDI1ICsyNTEsNDUgQEAKIAkJaWYgKCFjcHVfaXNzZXQoY3B1LCBjcHVfY2FsbGluX21hcCkpCiAJCQljb250aW51ZTsKICNlbmRpZgorCQlpZiAoIXBlcl9jcHUobm1pX3dhdGNoZG9nX2N0bGJsaywgY3B1KS5lbmFibGVkKQorCQkJY29udGludWU7CiAJCWlmIChubWlfY291bnQoY3B1KSAtIHByZXZfbm1pX2NvdW50W2NwdV0gPD0gNSkgewotCQkJZW5kZmxhZyA9IDE7CiAJCQlwcmludGsoIkNQVSMlZDogTk1JIGFwcGVhcnMgdG8gYmUgc3R1Y2sgKCVkLT4lZCkhXG4iLAogCQkJCWNwdSwKIAkJCQlwcmV2X25taV9jb3VudFtjcHVdLAogCQkJCW5taV9jb3VudChjcHUpKTsKLQkJCW5taV9hY3RpdmUgPSAwOwotCQkJbGFwaWNfbm1pX293bmVyICY9IH5MQVBJQ19OTUlfV0FUQ0hET0c7Ci0JCQlrZnJlZShwcmV2X25taV9jb3VudCk7Ci0JCQlyZXR1cm4gLTE7CisJCQlwZXJfY3B1KG5taV93YXRjaGRvZ19jdGxibGssIGNwdSkuZW5hYmxlZCA9IDA7CisJCQlhdG9taWNfZGVjKCZubWlfYWN0aXZlKTsKIAkJfQogCX0KKwlpZiAoIWF0b21pY19yZWFkKCZubWlfYWN0aXZlKSkgeworCQlrZnJlZShwcmV2X25taV9jb3VudCk7CisJCWF0b21pY19zZXQoJm5taV9hY3RpdmUsIC0xKTsKKwkJcmV0dXJuIC0xOworCX0KIAllbmRmbGFnID0gMTsKIAlwcmludGsoIk9LLlxuIik7CiAKIAkvKiBub3cgdGhhdCB3ZSBrbm93IGl0IHdvcmtzIHdlIGNhbiByZWR1Y2UgTk1JIGZyZXF1ZW5jeSB0bwogCSAgIHNvbWV0aGluZyBtb3JlIHJlYXNvbmFibGU7IG1ha2VzIGEgZGlmZmVyZW5jZSBpbiBzb21lIGNvbmZpZ3MgKi8KLQlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9MT0NBTF9BUElDKQorCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpIHsKKwkJc3RydWN0IG5taV93YXRjaGRvZ19jdGxibGsgKndkID0gJl9fZ2V0X2NwdV92YXIobm1pX3dhdGNoZG9nX2N0bGJsayk7CisKIAkJbm1pX2h6ID0gMTsKKwkJLyoKKwkJICogT24gSW50ZWwgQ1BVcyB3aXRoIEFSQ0hfUEVSRk1PTiBvbmx5IDMyIGJpdHMgaW4gdGhlIGNvdW50ZXIKKwkJICogYXJlIHdyaXRhYmxlLCB3aXRoIGhpZ2hlciBiaXRzIHNpZ24gZXh0ZW5kaW5nIGZyb20gYml0IDMxLgorCQkgKiBTbywgd2UgY2FuIG9ubHkgcHJvZ3JhbSB0aGUgY291bnRlciB3aXRoIDMxIGJpdCB2YWx1ZXMgYW5kCisJCSAqIDMybmQgYml0IHNob3VsZCBiZSAxLCBmb3IgMzMuLiB0byBiZSAxLgorCQkgKiBGaW5kIHRoZSBhcHByb3ByaWF0ZSBubWlfaHoKKwkJICovCisJIAlpZiAod2QtPnBlcmZjdHJfbXNyID09IE1TUl9BUkNIX1BFUkZNT05fUEVSRkNUUjAgJiYKKwkJCSgodTY0KWNwdV9raHogKiAxMDAwKSA+IDB4N2ZmZmZmZmZVTEwpIHsKKwkJCXU2NCBjb3VudCA9ICh1NjQpY3B1X2toeiAqIDEwMDA7CisJCQlkb19kaXYoY291bnQsIDB4N2ZmZmZmZmZVTCk7CisJCQlubWlfaHogPSBjb3VudCArIDE7CisJCX0KKwl9CiAKIAlrZnJlZShwcmV2X25taV9jb3VudCk7CiAJcmV0dXJuIDA7CkBAIC0xODEsMTI0ICszMDMsNzAgQEAKIAogCWdldF9vcHRpb24oJnN0ciwgJm5taSk7CiAKLQlpZiAobm1pID49IE5NSV9JTlZBTElEKQorCWlmICgobm1pID49IE5NSV9JTlZBTElEKSB8fCAobm1pIDwgTk1JX05PTkUpKQogCQlyZXR1cm4gMDsKLQlpZiAobm1pID09IE5NSV9OT05FKQotCQlubWlfd2F0Y2hkb2cgPSBubWk7CiAJLyoKIAkgKiBJZiBhbnkgb3RoZXIgeDg2IENQVSBoYXMgYSBsb2NhbCBBUElDLCB0aGVuCiAJICogcGxlYXNlIHRlc3QgdGhlIE5NSSBzdHVmZiB0aGVyZSBhbmQgc2VuZCBtZSB0aGUKIAkgKiBtaXNzaW5nIGJpdHMuIFJpZ2h0IG5vdyBJbnRlbCBQNi9QNCBhbmQgQU1EIEs3IG9ubHkuCiAJICovCi0JaWYgKChubWkgPT0gTk1JX0xPQ0FMX0FQSUMpICYmCi0JCQkoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpICYmCi0JCQkoYm9vdF9jcHVfZGF0YS54ODYgPT0gNiB8fCBib290X2NwdV9kYXRhLng4NiA9PSAxNSkpCi0JCW5taV93YXRjaGRvZyA9IG5taTsKLQlpZiAoKG5taSA9PSBOTUlfTE9DQUxfQVBJQykgJiYKLQkJCShib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQpICYmCi0JICAJCShib290X2NwdV9kYXRhLng4NiA9PSA2IHx8IGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkKLQkJbm1pX3dhdGNoZG9nID0gbm1pOwotCS8qCi0JICogV2UgY2FuIGVuYWJsZSB0aGUgSU8tQVBJQyB3YXRjaGRvZwotCSAqIHVuY29uZGl0aW9uYWxseS4KLQkgKi8KLQlpZiAobm1pID09IE5NSV9JT19BUElDKSB7Ci0JCW5taV9hY3RpdmUgPSAxOwotCQlubWlfd2F0Y2hkb2cgPSBubWk7Ci0JfQorCWlmICgobm1pID09IE5NSV9MT0NBTF9BUElDKSAmJiAobm1pX2tub3duX2NwdSgpID09IDApKQorCQlyZXR1cm4gMDsgIC8qIG5vIGxhcGljIHN1cHBvcnQgKi8KKwlubWlfd2F0Y2hkb2cgPSBubWk7CiAJcmV0dXJuIDE7CiB9CiAKIF9fc2V0dXAoIm5taV93YXRjaGRvZz0iLCBzZXR1cF9ubWlfd2F0Y2hkb2cpOwogCi1zdGF0aWMgdm9pZCBkaXNhYmxlX2ludGVsX2FyY2hfd2F0Y2hkb2codm9pZCk7Ci0KIHN0YXRpYyB2b2lkIGRpc2FibGVfbGFwaWNfbm1pX3dhdGNoZG9nKHZvaWQpCiB7Ci0JaWYgKG5taV9hY3RpdmUgPD0gMCkKKwlCVUdfT04obm1pX3dhdGNoZG9nICE9IE5NSV9MT0NBTF9BUElDKTsKKworCWlmIChhdG9taWNfcmVhZCgmbm1pX2FjdGl2ZSkgPD0gMCkKIAkJcmV0dXJuOwotCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yKSB7Ci0JY2FzZSBYODZfVkVORE9SX0FNRDoKLQkJd3Jtc3IoTVNSX0s3X0VWTlRTRUwwLCAwLCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBYODZfVkVORE9SX0lOVEVMOgotCQlpZiAoY3B1X2hhcygmYm9vdF9jcHVfZGF0YSwgWDg2X0ZFQVRVUkVfQVJDSF9QRVJGTU9OKSkgewotCQkJZGlzYWJsZV9pbnRlbF9hcmNoX3dhdGNoZG9nKCk7Ci0JCQlicmVhazsKLQkJfQotCQlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2KSB7Ci0JCWNhc2UgNjoKLQkJCWlmIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA+IDB4ZCkKLQkJCQlicmVhazsKIAotCQkJd3Jtc3IoTVNSX1A2X0VWTlRTRUwwLCAwLCAwKTsKLQkJCWJyZWFrOwotCQljYXNlIDE1OgotCQkJaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID4gMHg0KQotCQkJCWJyZWFrOworCW9uX2VhY2hfY3B1KHN0b3BfYXBpY19ubWlfd2F0Y2hkb2csIE5VTEwsIDAsIDEpOwogCi0JCQl3cm1zcihNU1JfUDRfSVFfQ0NDUjAsIDAsIDApOwotCQkJd3Jtc3IoTVNSX1A0X0NSVV9FU0NSMCwgMCwgMCk7Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQl9Ci0Jbm1pX2FjdGl2ZSA9IC0xOwotCS8qIHRlbGwgZG9fbm1pKCkgYW5kIG90aGVycyB0aGF0IHdlJ3JlIG5vdCBhY3RpdmUgYW55IG1vcmUgKi8KLQlubWlfd2F0Y2hkb2cgPSAwOworCUJVR19PTihhdG9taWNfcmVhZCgmbm1pX2FjdGl2ZSkgIT0gMCk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2codm9pZCkKIHsKLQlpZiAobm1pX2FjdGl2ZSA8IDApIHsKLQkJbm1pX3dhdGNoZG9nID0gTk1JX0xPQ0FMX0FQSUM7Ci0JCXNldHVwX2FwaWNfbm1pX3dhdGNoZG9nKCk7Ci0JfQotfQorCUJVR19PTihubWlfd2F0Y2hkb2cgIT0gTk1JX0xPQ0FMX0FQSUMpOwogCi1pbnQgcmVzZXJ2ZV9sYXBpY19ubWkodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgb2xkX293bmVyOworCS8qIGFyZSB3ZSBhbHJlYWR5IGVuYWJsZWQgKi8KKwlpZiAoYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpICE9IDApCisJCXJldHVybjsKIAotCXNwaW5fbG9jaygmbGFwaWNfbm1pX293bmVyX2xvY2spOwotCW9sZF9vd25lciA9IGxhcGljX25taV9vd25lcjsKLQlsYXBpY19ubWlfb3duZXIgfD0gTEFQSUNfTk1JX1JFU0VSVkVEOwotCXNwaW5fdW5sb2NrKCZsYXBpY19ubWlfb3duZXJfbG9jayk7Ci0JaWYgKG9sZF9vd25lciAmIExBUElDX05NSV9SRVNFUlZFRCkKLQkJcmV0dXJuIC1FQlVTWTsKLQlpZiAob2xkX293bmVyICYgTEFQSUNfTk1JX1dBVENIRE9HKQotCQlkaXNhYmxlX2xhcGljX25taV93YXRjaGRvZygpOwotCXJldHVybiAwOwotfQorCS8qIGFyZSB3ZSBsYXBpYyBhd2FyZSAqLworCWlmIChubWlfa25vd25fY3B1KCkgPD0gMCkKKwkJcmV0dXJuOwogCi12b2lkIHJlbGVhc2VfbGFwaWNfbm1pKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IG5ld19vd25lcjsKLQotCXNwaW5fbG9jaygmbGFwaWNfbm1pX293bmVyX2xvY2spOwotCW5ld19vd25lciA9IGxhcGljX25taV9vd25lciAmIH5MQVBJQ19OTUlfUkVTRVJWRUQ7Ci0JbGFwaWNfbm1pX293bmVyID0gbmV3X293bmVyOwotCXNwaW5fdW5sb2NrKCZsYXBpY19ubWlfb3duZXJfbG9jayk7Ci0JaWYgKG5ld19vd25lciAmIExBUElDX05NSV9XQVRDSERPRykKLQkJZW5hYmxlX2xhcGljX25taV93YXRjaGRvZygpOworCW9uX2VhY2hfY3B1KHNldHVwX2FwaWNfbm1pX3dhdGNoZG9nLCBOVUxMLCAwLCAxKTsKKwl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKIH0KIAogdm9pZCBkaXNhYmxlX3RpbWVyX25taV93YXRjaGRvZyh2b2lkKQogewotCWlmICgobm1pX3dhdGNoZG9nICE9IE5NSV9JT19BUElDKSB8fCAobm1pX2FjdGl2ZSA8PSAwKSkKKwlCVUdfT04obm1pX3dhdGNoZG9nICE9IE5NSV9JT19BUElDKTsKKworCWlmIChhdG9taWNfcmVhZCgmbm1pX2FjdGl2ZSkgPD0gMCkKIAkJcmV0dXJuOwogCi0JdW5zZXRfbm1pX2NhbGxiYWNrKCk7Ci0Jbm1pX2FjdGl2ZSA9IC0xOwotCW5taV93YXRjaGRvZyA9IE5NSV9OT05FOworCWRpc2FibGVfaXJxKDApOworCW9uX2VhY2hfY3B1KHN0b3BfYXBpY19ubWlfd2F0Y2hkb2csIE5VTEwsIDAsIDEpOworCisJQlVHX09OKGF0b21pY19yZWFkKCZubWlfYWN0aXZlKSAhPSAwKTsKIH0KIAogdm9pZCBlbmFibGVfdGltZXJfbm1pX3dhdGNoZG9nKHZvaWQpCiB7Ci0JaWYgKG5taV9hY3RpdmUgPCAwKSB7Ci0JCW5taV93YXRjaGRvZyA9IE5NSV9JT19BUElDOworCUJVR19PTihubWlfd2F0Y2hkb2cgIT0gTk1JX0lPX0FQSUMpOworCisJaWYgKGF0b21pY19yZWFkKCZubWlfYWN0aXZlKSA9PSAwKSB7CiAJCXRvdWNoX25taV93YXRjaGRvZygpOwotCQlubWlfYWN0aXZlID0gMTsKKwkJb25fZWFjaF9jcHUoc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2csIE5VTEwsIDAsIDEpOworCQllbmFibGVfaXJxKDApOwogCX0KIH0KIApAQCAtMzA4LDE1ICszNzYsMjAgQEAKIAogc3RhdGljIGludCBsYXBpY19ubWlfc3VzcGVuZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0Jbm1pX3BtX2FjdGl2ZSA9IG5taV9hY3RpdmU7Ci0JZGlzYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKKwkvKiBvbmx5IENQVTAgZ29lcyBoZXJlLCBvdGhlciBDUFVzIHNob3VsZCBiZSBvZmZsaW5lICovCisJbm1pX3BtX2FjdGl2ZSA9IGF0b21pY19yZWFkKCZubWlfYWN0aXZlKTsKKwlzdG9wX2FwaWNfbm1pX3dhdGNoZG9nKE5VTEwpOworCUJVR19PTihhdG9taWNfcmVhZCgmbm1pX2FjdGl2ZSkgIT0gMCk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbGFwaWNfbm1pX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQogewotCWlmIChubWlfcG1fYWN0aXZlID4gMCkKLQkJZW5hYmxlX2xhcGljX25taV93YXRjaGRvZygpOworCS8qIG9ubHkgQ1BVMCBnb2VzIGhlcmUsIG90aGVyIENQVXMgc2hvdWxkIGJlIG9mZmxpbmUgKi8KKwlpZiAobm1pX3BtX2FjdGl2ZSA+IDApIHsKKwkJc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2coTlVMTCk7CisJCXRvdWNoX25taV93YXRjaGRvZygpOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzM2LDcgKzQwOSwxMyBAQAogewogCWludCBlcnJvcjsKIAotCWlmIChubWlfYWN0aXZlID09IDAgfHwgbm1pX3dhdGNoZG9nICE9IE5NSV9MT0NBTF9BUElDKQorCS8qIHNob3VsZCByZWFsbHkgYmUgYSBCVUdfT04gYnV0IGIvYyB0aGlzIGlzIGFuCisJICogaW5pdCBjYWxsLCBpdCBqdXN0IGRvZXNuJ3Qgd29yay4gIC1kY3oKKwkgKi8KKwlpZiAobm1pX3dhdGNoZG9nICE9IE5NSV9MT0NBTF9BUElDKQorCQlyZXR1cm4gMDsKKworCWlmICggYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpIDwgMCApCiAJCXJldHVybiAwOwogCiAJZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJm5taV9zeXNjbGFzcyk7CkBAIC0zNTQsMTM4ICs0MzMsMjY5IEBACiAgKiBPcmlnaW5hbCBjb2RlIHdyaXR0ZW4gYnkgS2VpdGggT3dlbnMuCiAgKi8KIAotc3RhdGljIHZvaWQgY2xlYXJfbXNyX3JhbmdlKHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBpbnQgbikKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvcihpID0gMDsgaSA8IG47ICsraSkKLQkJd3Jtc3IoYmFzZStpLCAwLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVfd2F0Y2hkb2dfY291bnRlcihjb25zdCBjaGFyICpkZXNjcikKK3N0YXRpYyB2b2lkIHdyaXRlX3dhdGNoZG9nX2NvdW50ZXIodW5zaWduZWQgaW50IHBlcmZjdHJfbXNyLCBjb25zdCBjaGFyICpkZXNjcikKIHsKIAl1NjQgY291bnQgPSAodTY0KWNwdV9raHogKiAxMDAwOwogCiAJZG9fZGl2KGNvdW50LCBubWlfaHopOwogCWlmKGRlc2NyKQogCQlEcHJpbnRrKCJzZXR0aW5nICVzIHRvIC0weCUwOEx4XG4iLCBkZXNjciwgY291bnQpOwotCXdybXNybChubWlfcGVyZmN0cl9tc3IsIDAgLSBjb3VudCk7CisJd3Jtc3JsKHBlcmZjdHJfbXNyLCAwIC0gY291bnQpOwogfQogCi1zdGF0aWMgdm9pZCBzZXR1cF9rN193YXRjaGRvZyh2b2lkKQorLyogTm90ZSB0aGF0IHRoZXNlIGV2ZW50cyBkb24ndCB0aWNrIHdoZW4gdGhlIENQVSBpZGxlcy4gVGhpcyBtZWFucworICAgdGhlIGZyZXF1ZW5jeSB2YXJpZXMgd2l0aCBDUFUgbG9hZC4gKi8KKworI2RlZmluZSBLN19FVk5UU0VMX0VOQUJMRQkoMSA8PCAyMikKKyNkZWZpbmUgSzdfRVZOVFNFTF9JTlQJCSgxIDw8IDIwKQorI2RlZmluZSBLN19FVk5UU0VMX09TCQkoMSA8PCAxNykKKyNkZWZpbmUgSzdfRVZOVFNFTF9VU1IJCSgxIDw8IDE2KQorI2RlZmluZSBLN19FVkVOVF9DWUNMRVNfUFJPQ0VTU09SX0lTX1JVTk5JTkcJMHg3NgorI2RlZmluZSBLN19OTUlfRVZFTlQJCUs3X0VWRU5UX0NZQ0xFU19QUk9DRVNTT1JfSVNfUlVOTklORworCitzdGF0aWMgaW50IHNldHVwX2s3X3dhdGNoZG9nKHZvaWQpCiB7CisJdW5zaWduZWQgaW50IHBlcmZjdHJfbXNyLCBldm50c2VsX21zcjsKIAl1bnNpZ25lZCBpbnQgZXZudHNlbDsKKwlzdHJ1Y3Qgbm1pX3dhdGNoZG9nX2N0bGJsayAqd2QgPSAmX19nZXRfY3B1X3ZhcihubWlfd2F0Y2hkb2dfY3RsYmxrKTsKIAotCW5taV9wZXJmY3RyX21zciA9IE1TUl9LN19QRVJGQ1RSMDsKKwlwZXJmY3RyX21zciA9IE1TUl9LN19QRVJGQ1RSMDsKKwlldm50c2VsX21zciA9IE1TUl9LN19FVk5UU0VMMDsKKwlpZiAoIXJlc2VydmVfcGVyZmN0cl9ubWkocGVyZmN0cl9tc3IpKQorCQlnb3RvIGZhaWw7CiAKLQljbGVhcl9tc3JfcmFuZ2UoTVNSX0s3X0VWTlRTRUwwLCA0KTsKLQljbGVhcl9tc3JfcmFuZ2UoTVNSX0s3X1BFUkZDVFIwLCA0KTsKKwlpZiAoIXJlc2VydmVfZXZudHNlbF9ubWkoZXZudHNlbF9tc3IpKQorCQlnb3RvIGZhaWwxOworCisJd3Jtc3JsKHBlcmZjdHJfbXNyLCAwVUwpOwogCiAJZXZudHNlbCA9IEs3X0VWTlRTRUxfSU5UCiAJCXwgSzdfRVZOVFNFTF9PUwogCQl8IEs3X0VWTlRTRUxfVVNSCiAJCXwgSzdfTk1JX0VWRU5UOwogCi0Jd3Jtc3IoTVNSX0s3X0VWTlRTRUwwLCBldm50c2VsLCAwKTsKLQl3cml0ZV93YXRjaGRvZ19jb3VudGVyKCJLN19QRVJGQ1RSMCIpOworCS8qIHNldHVwIHRoZSB0aW1lciAqLworCXdybXNyKGV2bnRzZWxfbXNyLCBldm50c2VsLCAwKTsKKwl3cml0ZV93YXRjaGRvZ19jb3VudGVyKHBlcmZjdHJfbXNyLCAiSzdfUEVSRkNUUjAiKTsKIAlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKIAlldm50c2VsIHw9IEs3X0VWTlRTRUxfRU5BQkxFOwotCXdybXNyKE1TUl9LN19FVk5UU0VMMCwgZXZudHNlbCwgMCk7CisJd3Jtc3IoZXZudHNlbF9tc3IsIGV2bnRzZWwsIDApOworCisJd2QtPnBlcmZjdHJfbXNyID0gcGVyZmN0cl9tc3I7CisJd2QtPmV2bnRzZWxfbXNyID0gZXZudHNlbF9tc3I7CisJd2QtPmNjY3JfbXNyID0gMDsgIC8vdW51c2VkCisJd2QtPmNoZWNrX2JpdCA9IDFVTEw8PDYzOworCXJldHVybiAxOworZmFpbDE6CisJcmVsZWFzZV9wZXJmY3RyX25taShwZXJmY3RyX21zcik7CitmYWlsOgorCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBzZXR1cF9wNl93YXRjaGRvZyh2b2lkKQorc3RhdGljIHZvaWQgc3RvcF9rN193YXRjaGRvZyh2b2lkKQogeworCXN0cnVjdCBubWlfd2F0Y2hkb2dfY3RsYmxrICp3ZCA9ICZfX2dldF9jcHVfdmFyKG5taV93YXRjaGRvZ19jdGxibGspOworCisJd3Jtc3Iod2QtPmV2bnRzZWxfbXNyLCAwLCAwKTsKKworCXJlbGVhc2VfZXZudHNlbF9ubWkod2QtPmV2bnRzZWxfbXNyKTsKKwlyZWxlYXNlX3BlcmZjdHJfbm1pKHdkLT5wZXJmY3RyX21zcik7Cit9CisKKyNkZWZpbmUgUDZfRVZOVFNFTDBfRU5BQkxFCSgxIDw8IDIyKQorI2RlZmluZSBQNl9FVk5UU0VMX0lOVAkJKDEgPDwgMjApCisjZGVmaW5lIFA2X0VWTlRTRUxfT1MJCSgxIDw8IDE3KQorI2RlZmluZSBQNl9FVk5UU0VMX1VTUgkJKDEgPDwgMTYpCisjZGVmaW5lIFA2X0VWRU5UX0NQVV9DTE9DS1NfTk9UX0hBTFRFRAkweDc5CisjZGVmaW5lIFA2X05NSV9FVkVOVAkJUDZfRVZFTlRfQ1BVX0NMT0NLU19OT1RfSEFMVEVECisKK3N0YXRpYyBpbnQgc2V0dXBfcDZfd2F0Y2hkb2codm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcGVyZmN0cl9tc3IsIGV2bnRzZWxfbXNyOwogCXVuc2lnbmVkIGludCBldm50c2VsOworCXN0cnVjdCBubWlfd2F0Y2hkb2dfY3RsYmxrICp3ZCA9ICZfX2dldF9jcHVfdmFyKG5taV93YXRjaGRvZ19jdGxibGspOwogCi0Jbm1pX3BlcmZjdHJfbXNyID0gTVNSX1A2X1BFUkZDVFIwOworCXBlcmZjdHJfbXNyID0gTVNSX1A2X1BFUkZDVFIwOworCWV2bnRzZWxfbXNyID0gTVNSX1A2X0VWTlRTRUwwOworCWlmICghcmVzZXJ2ZV9wZXJmY3RyX25taShwZXJmY3RyX21zcikpCisJCWdvdG8gZmFpbDsKIAotCWNsZWFyX21zcl9yYW5nZShNU1JfUDZfRVZOVFNFTDAsIDIpOwotCWNsZWFyX21zcl9yYW5nZShNU1JfUDZfUEVSRkNUUjAsIDIpOworCWlmICghcmVzZXJ2ZV9ldm50c2VsX25taShldm50c2VsX21zcikpCisJCWdvdG8gZmFpbDE7CisKKwl3cm1zcmwocGVyZmN0cl9tc3IsIDBVTCk7CiAKIAlldm50c2VsID0gUDZfRVZOVFNFTF9JTlQKIAkJfCBQNl9FVk5UU0VMX09TCiAJCXwgUDZfRVZOVFNFTF9VU1IKIAkJfCBQNl9OTUlfRVZFTlQ7CiAKLQl3cm1zcihNU1JfUDZfRVZOVFNFTDAsIGV2bnRzZWwsIDApOwotCXdyaXRlX3dhdGNoZG9nX2NvdW50ZXIoIlA2X1BFUkZDVFIwIik7CisJLyogc2V0dXAgdGhlIHRpbWVyICovCisJd3Jtc3IoZXZudHNlbF9tc3IsIGV2bnRzZWwsIDApOworCXdyaXRlX3dhdGNoZG9nX2NvdW50ZXIocGVyZmN0cl9tc3IsICJQNl9QRVJGQ1RSMCIpOwogCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOwogCWV2bnRzZWwgfD0gUDZfRVZOVFNFTDBfRU5BQkxFOwotCXdybXNyKE1TUl9QNl9FVk5UU0VMMCwgZXZudHNlbCwgMCk7CisJd3Jtc3IoZXZudHNlbF9tc3IsIGV2bnRzZWwsIDApOworCisJd2QtPnBlcmZjdHJfbXNyID0gcGVyZmN0cl9tc3I7CisJd2QtPmV2bnRzZWxfbXNyID0gZXZudHNlbF9tc3I7CisJd2QtPmNjY3JfbXNyID0gMDsgIC8vdW51c2VkCisJd2QtPmNoZWNrX2JpdCA9IDFVTEw8PDM5OworCXJldHVybiAxOworZmFpbDE6CisJcmVsZWFzZV9wZXJmY3RyX25taShwZXJmY3RyX21zcik7CitmYWlsOgorCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBzdG9wX3A2X3dhdGNoZG9nKHZvaWQpCit7CisJc3RydWN0IG5taV93YXRjaGRvZ19jdGxibGsgKndkID0gJl9fZ2V0X2NwdV92YXIobm1pX3dhdGNoZG9nX2N0bGJsayk7CisKKwl3cm1zcih3ZC0+ZXZudHNlbF9tc3IsIDAsIDApOworCisJcmVsZWFzZV9ldm50c2VsX25taSh3ZC0+ZXZudHNlbF9tc3IpOworCXJlbGVhc2VfcGVyZmN0cl9ubWkod2QtPnBlcmZjdHJfbXNyKTsKK30KKworLyogTm90ZSB0aGF0IHRoZXNlIGV2ZW50cyBkb24ndCB0aWNrIHdoZW4gdGhlIENQVSBpZGxlcy4gVGhpcyBtZWFucworICAgdGhlIGZyZXF1ZW5jeSB2YXJpZXMgd2l0aCBDUFUgbG9hZC4gKi8KKworI2RlZmluZSBNU1JfUDRfTUlTQ19FTkFCTEVfUEVSRl9BVkFJTAkoMTw8NykKKyNkZWZpbmUgUDRfRVNDUl9FVkVOVF9TRUxFQ1QoTikJKChOKTw8MjUpCisjZGVmaW5lIFA0X0VTQ1JfT1MJCSgxPDwzKQorI2RlZmluZSBQNF9FU0NSX1VTUgkJKDE8PDIpCisjZGVmaW5lIFA0X0NDQ1JfT1ZGX1BNSTAJKDE8PDI2KQorI2RlZmluZSBQNF9DQ0NSX09WRl9QTUkxCSgxPDwyNykKKyNkZWZpbmUgUDRfQ0NDUl9USFJFU0hPTEQoTikJKChOKTw8MjApCisjZGVmaW5lIFA0X0NDQ1JfQ09NUExFTUVOVAkoMTw8MTkpCisjZGVmaW5lIFA0X0NDQ1JfQ09NUEFSRQkJKDE8PDE4KQorI2RlZmluZSBQNF9DQ0NSX1JFUVVJUkVECSgzPDwxNikKKyNkZWZpbmUgUDRfQ0NDUl9FU0NSX1NFTEVDVChOKQkoKE4pPDwxMykKKyNkZWZpbmUgUDRfQ0NDUl9FTkFCTEUJCSgxPDwxMikKKyNkZWZpbmUgUDRfQ0NDUl9PVkYgCQkoMTw8MzEpCisvKiBTZXQgdXAgSVFfQ09VTlRFUjAgdG8gYmVoYXZlIGxpa2UgYSBjbG9jaywgYnkgaGF2aW5nIElRX0NDQ1IwIGZpbHRlcgorICAgQ1JVX0VTQ1IwICh3aXRoIGFueSBub24tbnVsbCBldmVudCBzZWxlY3RvcikgdGhyb3VnaCBhIGNvbXBsZW1lbnRlZAorICAgbWF4IHRocmVzaG9sZC4gW0lBMzItVm9sMywgU2VjdGlvbiAxNC45LjldICovCisKIHN0YXRpYyBpbnQgc2V0dXBfcDRfd2F0Y2hkb2codm9pZCkKIHsKKwl1bnNpZ25lZCBpbnQgcGVyZmN0cl9tc3IsIGV2bnRzZWxfbXNyLCBjY2NyX21zcjsKKwl1bnNpZ25lZCBpbnQgZXZudHNlbCwgY2Njcl92YWw7CiAJdW5zaWduZWQgaW50IG1pc2NfZW5hYmxlLCBkdW1teTsKKwl1bnNpZ25lZCBpbnQgaHRfbnVtOworCXN0cnVjdCBubWlfd2F0Y2hkb2dfY3RsYmxrICp3ZCA9ICZfX2dldF9jcHVfdmFyKG5taV93YXRjaGRvZ19jdGxibGspOwogCi0JcmRtc3IoTVNSX1A0X01JU0NfRU5BQkxFLCBtaXNjX2VuYWJsZSwgZHVtbXkpOworCXJkbXNyKE1TUl9JQTMyX01JU0NfRU5BQkxFLCBtaXNjX2VuYWJsZSwgZHVtbXkpOwogCWlmICghKG1pc2NfZW5hYmxlICYgTVNSX1A0X01JU0NfRU5BQkxFX1BFUkZfQVZBSUwpKQogCQlyZXR1cm4gMDsKIAotCW5taV9wZXJmY3RyX21zciA9IE1TUl9QNF9JUV9DT1VOVEVSMDsKLQlubWlfcDRfY2Njcl92YWwgPSBQNF9OTUlfSVFfQ0NDUjA7CiAjaWZkZWYgQ09ORklHX1NNUAotCWlmIChzbXBfbnVtX3NpYmxpbmdzID09IDIpCi0JCW5taV9wNF9jY2NyX3ZhbCB8PSBQNF9DQ0NSX09WRl9QTUkxOworCS8qIGRldGVjdCB3aGljaCBoeXBlcnRocmVhZCB3ZSBhcmUgb24gKi8KKwlpZiAoc21wX251bV9zaWJsaW5ncyA9PSAyKSB7CisJCXVuc2lnbmVkIGludCBlYngsIGFwaWNpZDsKKworICAgICAgICAJZWJ4ID0gY3B1aWRfZWJ4KDEpOworCSAgICAgICAgYXBpY2lkID0gKGVieCA+PiAyNCkgJiAweGZmOworICAgICAgICAJaHRfbnVtID0gYXBpY2lkICYgMTsKKwl9IGVsc2UKICNlbmRpZgorCQlodF9udW0gPSAwOwogCi0JaWYgKCEobWlzY19lbmFibGUgJiBNU1JfUDRfTUlTQ19FTkFCTEVfUEVCU19VTkFWQUlMKSkKLQkJY2xlYXJfbXNyX3JhbmdlKDB4M0YxLCAyKTsKLQkvKiBNU1IgMHgzRjAgc2VlbXMgdG8gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgb2YgMHhGQzAwLCBidXQgY3VycmVudAotCSAgIGRvY3MgZG9lc24ndCBmdWxseSBkZWZpbmUgaXQsIHNvIGxlYXZlIGl0IGFsb25lIGZvciBub3cuICovCi0JaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID49IDB4MykgewotCQkvKiBNU1JfUDRfSVFfRVNDUjAvMSAoMHgzYmEvMHgzYmIpIHJlbW92ZWQgKi8KLQkJY2xlYXJfbXNyX3JhbmdlKDB4M0EwLCAyNik7Ci0JCWNsZWFyX21zcl9yYW5nZSgweDNCQywgMyk7Ci0JfSBlbHNlIHsKLQkJY2xlYXJfbXNyX3JhbmdlKDB4M0EwLCAzMSk7Ci0JfQotCWNsZWFyX21zcl9yYW5nZSgweDNDMCwgNik7Ci0JY2xlYXJfbXNyX3JhbmdlKDB4M0M4LCA2KTsKLQljbGVhcl9tc3JfcmFuZ2UoMHgzRTAsIDIpOwotCWNsZWFyX21zcl9yYW5nZShNU1JfUDRfQ0NDUjAsIDE4KTsKLQljbGVhcl9tc3JfcmFuZ2UoTVNSX1A0X1BFUkZDVFIwLCAxOCk7Ci0KLQl3cm1zcihNU1JfUDRfQ1JVX0VTQ1IwLCBQNF9OTUlfQ1JVX0VTQ1IwLCAwKTsKLQl3cm1zcihNU1JfUDRfSVFfQ0NDUjAsIFA0X05NSV9JUV9DQ0NSMCAmIH5QNF9DQ0NSX0VOQUJMRSwgMCk7Ci0Jd3JpdGVfd2F0Y2hkb2dfY291bnRlcigiUDRfSVFfQ09VTlRFUjAiKTsKLQlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKLQl3cm1zcihNU1JfUDRfSVFfQ0NDUjAsIG5taV9wNF9jY2NyX3ZhbCwgMCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRpc2FibGVfaW50ZWxfYXJjaF93YXRjaGRvZyh2b2lkKQotewotCXVuc2lnbmVkIGVieDsKLQotCS8qCi0JICogQ2hlY2sgd2hldGhlciB0aGUgQXJjaGl0ZWN0dXJhbCBQZXJmTW9uIHN1cHBvcnRzCi0JICogVW5oYWx0ZWQgQ29yZSBDeWNsZXMgRXZlbnQgb3Igbm90LgotCSAqIE5PVEU6IENvcnJlc3BvbmRpbmcgYml0ID0gMCBpbiBlYnAgaW5kaWNhdGVzIGV2ZW50IHByZXNlbnQuCisJLyogcGVyZm9ybWFuY2UgY291bnRlcnMgYXJlIHNoYXJlZCByZXNvdXJjZXMKKwkgKiBhc3NpZ24gZWFjaCBoeXBlcnRocmVhZCBpdHMgb3duIHNldAorCSAqIChyZS11c2UgdGhlIEVTQ1IwIHJlZ2lzdGVyLCBzZWVtcyBzYWZlCisJICogYW5kIGtlZXBzIHRoZSBjY2NyX3ZhbCB0aGUgc2FtZSkKIAkgKi8KLQllYnggPSBjcHVpZF9lYngoMTApOwotCWlmICghKGVieCAmIEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19QUkVTRU5UKSkKLQkJd3Jtc3IoTVNSX0FSQ0hfUEVSRk1PTl9FVkVOVFNFTDAsIDAsIDApOworCWlmICghaHRfbnVtKSB7CisJCS8qIGxvZ2ljYWwgY3B1IDAgKi8KKwkJcGVyZmN0cl9tc3IgPSBNU1JfUDRfSVFfUEVSRkNUUjA7CisJCWV2bnRzZWxfbXNyID0gTVNSX1A0X0NSVV9FU0NSMDsKKwkJY2Njcl9tc3IgPSBNU1JfUDRfSVFfQ0NDUjA7CisJCWNjY3JfdmFsID0gUDRfQ0NDUl9PVkZfUE1JMCB8IFA0X0NDQ1JfRVNDUl9TRUxFQ1QoNCk7CisJfSBlbHNlIHsKKwkJLyogbG9naWNhbCBjcHUgMSAqLworCQlwZXJmY3RyX21zciA9IE1TUl9QNF9JUV9QRVJGQ1RSMTsKKwkJZXZudHNlbF9tc3IgPSBNU1JfUDRfQ1JVX0VTQ1IwOworCQljY2NyX21zciA9IE1TUl9QNF9JUV9DQ0NSMTsKKwkJY2Njcl92YWwgPSBQNF9DQ0NSX09WRl9QTUkxIHwgUDRfQ0NDUl9FU0NSX1NFTEVDVCg0KTsKKwl9CisKKwlpZiAoIXJlc2VydmVfcGVyZmN0cl9ubWkocGVyZmN0cl9tc3IpKQorCQlnb3RvIGZhaWw7CisKKwlpZiAoIXJlc2VydmVfZXZudHNlbF9ubWkoZXZudHNlbF9tc3IpKQorCQlnb3RvIGZhaWwxOworCisJZXZudHNlbCA9IFA0X0VTQ1JfRVZFTlRfU0VMRUNUKDB4M0YpCisJIAl8IFA0X0VTQ1JfT1MKKwkJfCBQNF9FU0NSX1VTUjsKKworCWNjY3JfdmFsIHw9IFA0X0NDQ1JfVEhSRVNIT0xEKDE1KQorCQkgfCBQNF9DQ0NSX0NPTVBMRU1FTlQKKwkJIHwgUDRfQ0NDUl9DT01QQVJFCisJCSB8IFA0X0NDQ1JfUkVRVUlSRUQ7CisKKwl3cm1zcihldm50c2VsX21zciwgZXZudHNlbCwgMCk7CisJd3Jtc3IoY2Njcl9tc3IsIGNjY3JfdmFsLCAwKTsKKwl3cml0ZV93YXRjaGRvZ19jb3VudGVyKHBlcmZjdHJfbXNyLCAiUDRfSVFfQ09VTlRFUjAiKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKKwljY2NyX3ZhbCB8PSBQNF9DQ0NSX0VOQUJMRTsKKwl3cm1zcihjY2NyX21zciwgY2Njcl92YWwsIDApOworCXdkLT5wZXJmY3RyX21zciA9IHBlcmZjdHJfbXNyOworCXdkLT5ldm50c2VsX21zciA9IGV2bnRzZWxfbXNyOworCXdkLT5jY2NyX21zciA9IGNjY3JfbXNyOworCXdkLT5jaGVja19iaXQgPSAxVUxMPDwzOTsKKwlyZXR1cm4gMTsKK2ZhaWwxOgorCXJlbGVhc2VfcGVyZmN0cl9ubWkocGVyZmN0cl9tc3IpOworZmFpbDoKKwlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgc3RvcF9wNF93YXRjaGRvZyh2b2lkKQoreworCXN0cnVjdCBubWlfd2F0Y2hkb2dfY3RsYmxrICp3ZCA9ICZfX2dldF9jcHVfdmFyKG5taV93YXRjaGRvZ19jdGxibGspOworCisJd3Jtc3Iod2QtPmNjY3JfbXNyLCAwLCAwKTsKKwl3cm1zcih3ZC0+ZXZudHNlbF9tc3IsIDAsIDApOworCisJcmVsZWFzZV9ldm50c2VsX25taSh3ZC0+ZXZudHNlbF9tc3IpOworCXJlbGVhc2VfcGVyZmN0cl9ubWkod2QtPnBlcmZjdHJfbXNyKTsKK30KKworI2RlZmluZSBBUkNIX1BFUkZNT05fTk1JX0VWRU5UX1NFTAlBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfU0VMCisjZGVmaW5lIEFSQ0hfUEVSRk1PTl9OTUlfRVZFTlRfVU1BU0sJQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1VNQVNLCisKIHN0YXRpYyBpbnQgc2V0dXBfaW50ZWxfYXJjaF93YXRjaGRvZyh2b2lkKQogeworCXVuc2lnbmVkIGludCBlYng7CisJdW5pb24gY3B1aWQxMF9lYXggZWF4OworCXVuc2lnbmVkIGludCB1bnVzZWQ7CisJdW5zaWduZWQgaW50IHBlcmZjdHJfbXNyLCBldm50c2VsX21zcjsKIAl1bnNpZ25lZCBpbnQgZXZudHNlbDsKLQl1bnNpZ25lZCBlYng7CisJc3RydWN0IG5taV93YXRjaGRvZ19jdGxibGsgKndkID0gJl9fZ2V0X2NwdV92YXIobm1pX3dhdGNoZG9nX2N0bGJsayk7CiAKIAkvKgogCSAqIENoZWNrIHdoZXRoZXIgdGhlIEFyY2hpdGVjdHVyYWwgUGVyZk1vbiBzdXBwb3J0cwogCSAqIFVuaGFsdGVkIENvcmUgQ3ljbGVzIEV2ZW50IG9yIG5vdC4KLQkgKiBOT1RFOiBDb3JyZXNwb25kaW5nIGJpdCA9IDAgaW4gZWJwIGluZGljYXRlcyBldmVudCBwcmVzZW50LgorCSAqIE5PVEU6IENvcnJlc3BvbmRpbmcgYml0ID0gMCBpbiBlYnggaW5kaWNhdGVzIGV2ZW50IHByZXNlbnQuCiAJICovCi0JZWJ4ID0gY3B1aWRfZWJ4KDEwKTsKLQlpZiAoKGVieCAmIEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19QUkVTRU5UKSkKLQkJcmV0dXJuIDA7CisJY3B1aWQoMTAsICYoZWF4LmZ1bGwpLCAmZWJ4LCAmdW51c2VkLCAmdW51c2VkKTsKKwlpZiAoKGVheC5zcGxpdC5tYXNrX2xlbmd0aCA8IChBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfSU5ERVgrMSkpIHx8CisJICAgIChlYnggJiBBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfUFJFU0VOVCkpCisJCWdvdG8gZmFpbDsKIAotCW5taV9wZXJmY3RyX21zciA9IE1TUl9BUkNIX1BFUkZNT05fUEVSRkNUUjA7CisJcGVyZmN0cl9tc3IgPSBNU1JfQVJDSF9QRVJGTU9OX1BFUkZDVFIwOworCWV2bnRzZWxfbXNyID0gTVNSX0FSQ0hfUEVSRk1PTl9FVkVOVFNFTDA7CiAKLQljbGVhcl9tc3JfcmFuZ2UoTVNSX0FSQ0hfUEVSRk1PTl9FVkVOVFNFTDAsIDIpOwotCWNsZWFyX21zcl9yYW5nZShNU1JfQVJDSF9QRVJGTU9OX1BFUkZDVFIwLCAyKTsKKwlpZiAoIXJlc2VydmVfcGVyZmN0cl9ubWkocGVyZmN0cl9tc3IpKQorCQlnb3RvIGZhaWw7CisKKwlpZiAoIXJlc2VydmVfZXZudHNlbF9ubWkoZXZudHNlbF9tc3IpKQorCQlnb3RvIGZhaWwxOworCisJd3Jtc3JsKHBlcmZjdHJfbXNyLCAwVUwpOwogCiAJZXZudHNlbCA9IEFSQ0hfUEVSRk1PTl9FVkVOVFNFTF9JTlQKIAkJfCBBUkNIX1BFUkZNT05fRVZFTlRTRUxfT1MKQEAgLTQ5Myw1MSArNzAzLDE0NSBAQAogCQl8IEFSQ0hfUEVSRk1PTl9OTUlfRVZFTlRfU0VMCiAJCXwgQVJDSF9QRVJGTU9OX05NSV9FVkVOVF9VTUFTSzsKIAotCXdybXNyKE1TUl9BUkNIX1BFUkZNT05fRVZFTlRTRUwwLCBldm50c2VsLCAwKTsKLQl3cml0ZV93YXRjaGRvZ19jb3VudGVyKCJJTlRFTF9BUkNIX1BFUkZDVFIwIik7CisJLyogc2V0dXAgdGhlIHRpbWVyICovCisJd3Jtc3IoZXZudHNlbF9tc3IsIGV2bnRzZWwsIDApOworCXdyaXRlX3dhdGNoZG9nX2NvdW50ZXIocGVyZmN0cl9tc3IsICJJTlRFTF9BUkNIX1BFUkZDVFIwIik7CiAJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CiAJZXZudHNlbCB8PSBBUkNIX1BFUkZNT05fRVZFTlRTRUwwX0VOQUJMRTsKLQl3cm1zcihNU1JfQVJDSF9QRVJGTU9OX0VWRU5UU0VMMCwgZXZudHNlbCwgMCk7CisJd3Jtc3IoZXZudHNlbF9tc3IsIGV2bnRzZWwsIDApOworCisJd2QtPnBlcmZjdHJfbXNyID0gcGVyZmN0cl9tc3I7CisJd2QtPmV2bnRzZWxfbXNyID0gZXZudHNlbF9tc3I7CisJd2QtPmNjY3JfbXNyID0gMDsgIC8vdW51c2VkCisJd2QtPmNoZWNrX2JpdCA9IDFVTEwgPDwgKGVheC5zcGxpdC5iaXRfd2lkdGggLSAxKTsKIAlyZXR1cm4gMTsKK2ZhaWwxOgorCXJlbGVhc2VfcGVyZmN0cl9ubWkocGVyZmN0cl9tc3IpOworZmFpbDoKKwlyZXR1cm4gMDsKIH0KIAotdm9pZCBzZXR1cF9hcGljX25taV93YXRjaGRvZyAodm9pZCkKK3N0YXRpYyB2b2lkIHN0b3BfaW50ZWxfYXJjaF93YXRjaGRvZyh2b2lkKQogewotCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yKSB7Ci0JY2FzZSBYODZfVkVORE9SX0FNRDoKLQkJaWYgKGJvb3RfY3B1X2RhdGEueDg2ICE9IDYgJiYgYm9vdF9jcHVfZGF0YS54ODYgIT0gMTUpCi0JCQlyZXR1cm47Ci0JCXNldHVwX2s3X3dhdGNoZG9nKCk7Ci0JCWJyZWFrOwotCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKLQkJaWYgKGNwdV9oYXMoJmJvb3RfY3B1X2RhdGEsIFg4Nl9GRUFUVVJFX0FSQ0hfUEVSRk1PTikpIHsKLQkJCWlmICghc2V0dXBfaW50ZWxfYXJjaF93YXRjaGRvZygpKQorCXVuc2lnbmVkIGludCBlYng7CisJdW5pb24gY3B1aWQxMF9lYXggZWF4OworCXVuc2lnbmVkIGludCB1bnVzZWQ7CisJc3RydWN0IG5taV93YXRjaGRvZ19jdGxibGsgKndkID0gJl9fZ2V0X2NwdV92YXIobm1pX3dhdGNoZG9nX2N0bGJsayk7CisKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgdGhlIEFyY2hpdGVjdHVyYWwgUGVyZk1vbiBzdXBwb3J0cworCSAqIFVuaGFsdGVkIENvcmUgQ3ljbGVzIEV2ZW50IG9yIG5vdC4KKwkgKiBOT1RFOiBDb3JyZXNwb25kaW5nIGJpdCA9IDAgaW4gZWJ4IGluZGljYXRlcyBldmVudCBwcmVzZW50LgorCSAqLworCWNwdWlkKDEwLCAmKGVheC5mdWxsKSwgJmVieCwgJnVudXNlZCwgJnVudXNlZCk7CisJaWYgKChlYXguc3BsaXQubWFza19sZW5ndGggPCAoQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX0lOREVYKzEpKSB8fAorCSAgICAoZWJ4ICYgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1BSRVNFTlQpKQorCQlyZXR1cm47CisKKwl3cm1zcih3ZC0+ZXZudHNlbF9tc3IsIDAsIDApOworCXJlbGVhc2VfZXZudHNlbF9ubWkod2QtPmV2bnRzZWxfbXNyKTsKKwlyZWxlYXNlX3BlcmZjdHJfbm1pKHdkLT5wZXJmY3RyX21zcik7Cit9CisKK3ZvaWQgc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2cgKHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3Qgbm1pX3dhdGNoZG9nX2N0bGJsayAqd2QgPSAmX19nZXRfY3B1X3ZhcihubWlfd2F0Y2hkb2dfY3RsYmxrKTsKKworCS8qIG9ubHkgc3VwcG9ydCBMT0NBTCBhbmQgSU8gQVBJQ3MgZm9yIG5vdyAqLworCWlmICgobm1pX3dhdGNoZG9nICE9IE5NSV9MT0NBTF9BUElDKSAmJgorCSAgICAobm1pX3dhdGNoZG9nICE9IE5NSV9JT19BUElDKSkKKwkgICAgCXJldHVybjsKKworCWlmICh3ZC0+ZW5hYmxlZCA9PSAxKQorCQlyZXR1cm47CisKKwkvKiBjaGVhcCBoYWNrIHRvIHN1cHBvcnQgc3VzcGVuZC9yZXN1bWUgKi8KKwkvKiBpZiBjcHUwIGlzIG5vdCBhY3RpdmUgbmVpdGhlciBzaG91bGQgdGhlIG90aGVyIGNwdXMgKi8KKwlpZiAoKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSAwKSAmJiAoYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpIDw9IDApKQorCQlyZXR1cm47CisKKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9MT0NBTF9BUElDKSB7CisJCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yKSB7CisJCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6CisJCQlpZiAoYm9vdF9jcHVfZGF0YS54ODYgIT0gNiAmJiBib290X2NwdV9kYXRhLng4NiAhPSAxNSkKKwkJCQlyZXR1cm47CisJCQlpZiAoIXNldHVwX2s3X3dhdGNoZG9nKCkpCiAJCQkJcmV0dXJuOwogCQkJYnJlYWs7Ci0JCX0KLQkJc3dpdGNoIChib290X2NwdV9kYXRhLng4NikgewotCQljYXNlIDY6Ci0JCQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAweGQpCi0JCQkJcmV0dXJuOworCQljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCQlpZiAoY3B1X2hhcygmYm9vdF9jcHVfZGF0YSwgWDg2X0ZFQVRVUkVfQVJDSF9QRVJGTU9OKSkgeworCQkJCWlmICghc2V0dXBfaW50ZWxfYXJjaF93YXRjaGRvZygpKQorCQkJCQlyZXR1cm47CisJCQkJYnJlYWs7CisJCQl9CisJCQlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2KSB7CisJCQljYXNlIDY6CisJCQkJaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID4gMHhkKQorCQkJCQlyZXR1cm47CiAKLQkJCXNldHVwX3A2X3dhdGNoZG9nKCk7Ci0JCQlicmVhazsKLQkJY2FzZSAxNToKLQkJCWlmIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA+IDB4NCkKLQkJCQlyZXR1cm47CisJCQkJaWYgKCFzZXR1cF9wNl93YXRjaGRvZygpKQorCQkJCQlyZXR1cm47CisJCQkJYnJlYWs7CisJCQljYXNlIDE1OgorCQkJCWlmIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCA+IDB4NCkKKwkJCQkJcmV0dXJuOwogCi0JCQlpZiAoIXNldHVwX3A0X3dhdGNoZG9nKCkpCisJCQkJaWYgKCFzZXR1cF9wNF93YXRjaGRvZygpKQorCQkJCQlyZXR1cm47CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgogCQkJCXJldHVybjsKKwkJCX0KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcmV0dXJuOwogCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybjsKIAl9Ci0JbGFwaWNfbm1pX293bmVyID0gTEFQSUNfTk1JX1dBVENIRE9HOwotCW5taV9hY3RpdmUgPSAxOworCXdkLT5lbmFibGVkID0gMTsKKwlhdG9taWNfaW5jKCZubWlfYWN0aXZlKTsKK30KKwordm9pZCBzdG9wX2FwaWNfbm1pX3dhdGNoZG9nKHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3Qgbm1pX3dhdGNoZG9nX2N0bGJsayAqd2QgPSAmX19nZXRfY3B1X3ZhcihubWlfd2F0Y2hkb2dfY3RsYmxrKTsKKworCS8qIG9ubHkgc3VwcG9ydCBMT0NBTCBhbmQgSU8gQVBJQ3MgZm9yIG5vdyAqLworCWlmICgobm1pX3dhdGNoZG9nICE9IE5NSV9MT0NBTF9BUElDKSAmJgorCSAgICAobm1pX3dhdGNoZG9nICE9IE5NSV9JT19BUElDKSkKKwkgICAgCXJldHVybjsKKworCWlmICh3ZC0+ZW5hYmxlZCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9MT0NBTF9BUElDKSB7CisJCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yKSB7CisJCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6CisJCQlzdG9wX2s3X3dhdGNoZG9nKCk7CisJCQlicmVhazsKKwkJY2FzZSBYODZfVkVORE9SX0lOVEVMOgorCQkJaWYgKGNwdV9oYXMoJmJvb3RfY3B1X2RhdGEsIFg4Nl9GRUFUVVJFX0FSQ0hfUEVSRk1PTikpIHsKKwkJCQlzdG9wX2ludGVsX2FyY2hfd2F0Y2hkb2coKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODYpIHsKKwkJCWNhc2UgNjoKKwkJCQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAweGQpCisJCQkJCWJyZWFrOworCQkJCXN0b3BfcDZfd2F0Y2hkb2coKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTU6CisJCQkJaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID4gMHg0KQorCQkJCQlicmVhazsKKwkJCQlzdG9wX3A0X3dhdGNoZG9nKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybjsKKwkJfQorCX0KKwl3ZC0+ZW5hYmxlZCA9IDA7CisJYXRvbWljX2RlYygmbm1pX2FjdGl2ZSk7CiB9CiAKIC8qCkBAIC01NzksNyArODgzLDcgQEAKIAogZXh0ZXJuIHZvaWQgZGllX25taShzdHJ1Y3QgcHRfcmVncyAqLCBjb25zdCBjaGFyICptc2cpOwogCi12b2lkIG5taV93YXRjaGRvZ190aWNrIChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCitfX2twcm9iZXMgaW50IG5taV93YXRjaGRvZ190aWNrKHN0cnVjdCBwdF9yZWdzICogcmVncywgdW5zaWduZWQgcmVhc29uKQogewogCiAJLyoKQEAgLTU4OCwxMSArODkyLDIzIEBACiAJICogc21wX3Byb2Nlc3Nvcl9pZCgpLgogCSAqLwogCXVuc2lnbmVkIGludCBzdW07CisJaW50IHRvdWNoZWQgPSAwOwogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IG5taV93YXRjaGRvZ19jdGxibGsgKndkID0gJl9fZ2V0X2NwdV92YXIobm1pX3dhdGNoZG9nX2N0bGJsayk7CisJdTY0IGR1bW15OworCWludCByYz0wOworCisJLyogY2hlY2sgZm9yIG90aGVyIHVzZXJzIGZpcnN0ICovCisJaWYgKG5vdGlmeV9kaWUoRElFX05NSSwgIm5taSIsIHJlZ3MsIHJlYXNvbiwgMiwgU0lHSU5UKQorCQkJPT0gTk9USUZZX1NUT1ApIHsKKwkJcmMgPSAxOworCQl0b3VjaGVkID0gMTsKKwl9CiAKIAlzdW0gPSBwZXJfY3B1KGlycV9zdGF0LCBjcHUpLmFwaWNfdGltZXJfaXJxczsKIAotCWlmIChsYXN0X2lycV9zdW1zW2NwdV0gPT0gc3VtKSB7CisJLyogaWYgdGhlIGFwaWMgdGltZXIgaXNuJ3QgZmlyaW5nLCB0aGlzIGNwdSBpc24ndCBkb2luZyBtdWNoICovCisJaWYgKCF0b3VjaGVkICYmIGxhc3RfaXJxX3N1bXNbY3B1XSA9PSBzdW0pIHsKIAkJLyoKIAkJICogQXlpZWUsIGxvb2tzIGxpa2UgdGhpcyBDUFUgaXMgc3R1Y2sgLi4uCiAJCSAqIHdhaXQgYSBmZXcgSVJRcyAoNSBzZWNvbmRzKSBiZWZvcmUgZG9pbmcgdGhlIG9vcHMgLi4uCkBAIC02MDcsMjcgKzkyMyw1OSBAQAogCQlsYXN0X2lycV9zdW1zW2NwdV0gPSBzdW07CiAJCWFsZXJ0X2NvdW50ZXJbY3B1XSA9IDA7CiAJfQotCWlmIChubWlfcGVyZmN0cl9tc3IpIHsKLQkJaWYgKG5taV9wZXJmY3RyX21zciA9PSBNU1JfUDRfSVFfQ09VTlRFUjApIHsKLQkJCS8qCi0JCQkgKiBQNCBxdWlya3M6Ci0JCQkgKiAtIEFuIG92ZXJmbG93biBwZXJmY3RyIHdpbGwgYXNzZXJ0IGl0cyBpbnRlcnJ1cHQKLQkJCSAqICAgdW50aWwgdGhlIE9WRiBmbGFnIGluIGl0cyBDQ0NSIGlzIGNsZWFyZWQuCi0JCQkgKiAtIExWVFBDIGlzIG1hc2tlZCBvbiBpbnRlcnJ1cHQgYW5kIG11c3QgYmUKLQkJCSAqICAgdW5tYXNrZWQgYnkgdGhlIExWVFBDIGhhbmRsZXIuCisJLyogc2VlIGlmIHRoZSBubWkgd2F0Y2hkb2cgd2VudCBvZmYgKi8KKwlpZiAod2QtPmVuYWJsZWQpIHsKKwkJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfTE9DQUxfQVBJQykgeworCQkJcmRtc3JsKHdkLT5wZXJmY3RyX21zciwgZHVtbXkpOworCQkJaWYgKGR1bW15ICYgd2QtPmNoZWNrX2JpdCl7CisJCQkJLyogdGhpcyB3YXNuJ3QgYSB3YXRjaGRvZyB0aW1lciBpbnRlcnJ1cHQgKi8KKwkJCQlnb3RvIGRvbmU7CisJCQl9CisKKwkJCS8qIG9ubHkgSW50ZWwgUDQgdXNlcyB0aGUgY2NjciBtc3IgKi8KKwkgCQlpZiAod2QtPmNjY3JfbXNyICE9IDApIHsKKwkgCQkJLyoKKwkgCQkJICogUDQgcXVpcmtzOgorCSAJCQkgKiAtIEFuIG92ZXJmbG93biBwZXJmY3RyIHdpbGwgYXNzZXJ0IGl0cyBpbnRlcnJ1cHQKKwkgCQkJICogICB1bnRpbCB0aGUgT1ZGIGZsYWcgaW4gaXRzIENDQ1IgaXMgY2xlYXJlZC4KKwkgCQkJICogLSBMVlRQQyBpcyBtYXNrZWQgb24gaW50ZXJydXB0IGFuZCBtdXN0IGJlCisJIAkJCSAqICAgdW5tYXNrZWQgYnkgdGhlIExWVFBDIGhhbmRsZXIuCisJIAkJCSAqLworCQkJCXJkbXNybCh3ZC0+Y2Njcl9tc3IsIGR1bW15KTsKKwkJCQlkdW1teSAmPSB+UDRfQ0NDUl9PVkY7CisJIAkJCXdybXNybCh3ZC0+Y2Njcl9tc3IsIGR1bW15KTsKKwkgCQkJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisJIAkJfQorCQkJZWxzZSBpZiAod2QtPnBlcmZjdHJfbXNyID09IE1TUl9QNl9QRVJGQ1RSMCB8fAorCQkJCSB3ZC0+cGVyZmN0cl9tc3IgPT0gTVNSX0FSQ0hfUEVSRk1PTl9QRVJGQ1RSMCkgeworCQkJCS8qIFA2IGJhc2VkIFBlbnRpdW0gTSBuZWVkIHRvIHJlLXVubWFzaworCQkJCSAqIHRoZSBhcGljIHZlY3RvciBidXQgaXQgZG9lc24ndCBodXJ0CisJCQkJICogb3RoZXIgUDYgdmFyaWFudC4KKwkJCQkgKiBBcmNoUGVyZm9tL0NvcmUgRHVvIGFsc28gbmVlZHMgdGhpcyAqLworCQkJCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOworCQkJfQorCQkJLyogc3RhcnQgdGhlIGN5Y2xlIG92ZXIgYWdhaW4gKi8KKwkJCXdyaXRlX3dhdGNoZG9nX2NvdW50ZXIod2QtPnBlcmZjdHJfbXNyLCBOVUxMKTsKKwkJCXJjID0gMTsKKwkJfSBlbHNlIGlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0lPX0FQSUMpIHsKKwkJCS8qIGRvbid0IGtub3cgaG93IHRvIGFjY3VyYXRlbHkgY2hlY2sgZm9yIHRoaXMuCisJCQkgKiBqdXN0IGFzc3VtZSBpdCB3YXMgYSB3YXRjaGRvZyB0aW1lciBpbnRlcnJ1cHQKKwkJCSAqIFRoaXMgbWF0Y2hlcyB0aGUgb2xkIGJlaGF2aW91ci4KIAkJCSAqLwotCQkJd3Jtc3IoTVNSX1A0X0lRX0NDQ1IwLCBubWlfcDRfY2Njcl92YWwsIDApOwotCQkJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisJCQlyYyA9IDE7CiAJCX0KLQkJZWxzZSBpZiAobm1pX3BlcmZjdHJfbXNyID09IE1TUl9QNl9QRVJGQ1RSMCB8fAotCQkgICAgICAgICBubWlfcGVyZmN0cl9tc3IgPT0gTVNSX0FSQ0hfUEVSRk1PTl9QRVJGQ1RSMCkgewotCQkJLyogT25seSBQNiBiYXNlZCBQZW50aXVtIE0gbmVlZCB0byByZS11bm1hc2sKLQkJCSAqIHRoZSBhcGljIHZlY3RvciBidXQgaXQgZG9lc24ndCBodXJ0Ci0JCQkgKiBvdGhlciBQNiB2YXJpYW50ICovCi0JCQlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKLQkJfQotCQl3cml0ZV93YXRjaGRvZ19jb3VudGVyKE5VTEwpOwogCX0KK2RvbmU6CisJcmV0dXJuIHJjOworfQorCitpbnQgZG9fbm1pX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICogcmVncywgaW50IGNwdSkKK3sKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisJaWYgKHVua25vd25fbm1pX3BhbmljKQorCQlyZXR1cm4gdW5rbm93bl9ubWlfcGFuaWNfY2FsbGJhY2socmVncywgY3B1KTsKKyNlbmRpZgorCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX1NZU0NUTApAQCAtNjM3LDM2ICs5ODUsNDYgQEAKIAl1bnNpZ25lZCBjaGFyIHJlYXNvbiA9IGdldF9ubWlfcmVhc29uKCk7CiAJY2hhciBidWZbNjRdOwogCi0JaWYgKCEocmVhc29uICYgMHhjMCkpIHsKLQkJc3ByaW50ZihidWYsICJOTUkgcmVjZWl2ZWQgZm9yIHVua25vd24gcmVhc29uICUwMnhcbiIsIHJlYXNvbik7Ci0JCWRpZV9ubWkocmVncywgYnVmKTsKLQl9CisJc3ByaW50ZihidWYsICJOTUkgcmVjZWl2ZWQgZm9yIHVua25vd24gcmVhc29uICUwMnhcbiIsIHJlYXNvbik7CisJZGllX25taShyZWdzLCBidWYpOwogCXJldHVybiAwOwogfQogCiAvKgotICogcHJvYyBoYW5kbGVyIGZvciAvcHJvYy9zeXMva2VybmVsL3Vua25vd25fbm1pX3BhbmljCisgKiBwcm9jIGhhbmRsZXIgZm9yIC9wcm9jL3N5cy9rZXJuZWwvbm1pCiAgKi8KLWludCBwcm9jX3Vua25vd25fbm1pX3BhbmljKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbGUsCitpbnQgcHJvY19ubWlfZW5hYmxlZChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpCiB7CiAJaW50IG9sZF9zdGF0ZTsKIAotCW9sZF9zdGF0ZSA9IHVua25vd25fbm1pX3BhbmljOworCW5taV93YXRjaGRvZ19lbmFibGVkID0gKGF0b21pY19yZWFkKCZubWlfYWN0aXZlKSA+IDApID8gMSA6IDA7CisJb2xkX3N0YXRlID0gbm1pX3dhdGNoZG9nX2VuYWJsZWQ7CiAJcHJvY19kb2ludHZlYyh0YWJsZSwgd3JpdGUsIGZpbGUsIGJ1ZmZlciwgbGVuZ3RoLCBwcG9zKTsKLQlpZiAoISFvbGRfc3RhdGUgPT0gISF1bmtub3duX25taV9wYW5pYykKKwlpZiAoISFvbGRfc3RhdGUgPT0gISFubWlfd2F0Y2hkb2dfZW5hYmxlZCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAodW5rbm93bl9ubWlfcGFuaWMpIHsKLQkJaWYgKHJlc2VydmVfbGFwaWNfbm1pKCkgPCAwKSB7Ci0JCQl1bmtub3duX25taV9wYW5pYyA9IDA7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9IGVsc2UgewotCQkJc2V0X25taV9jYWxsYmFjayh1bmtub3duX25taV9wYW5pY19jYWxsYmFjayk7Ci0JCX0KKwlpZiAoYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpIDwgMCkgeworCQlwcmludGsoIEtFUk5fV0FSTklORyAiTk1JIHdhdGNoZG9nIGlzIHBlcm1hbmVudGx5IGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfREVGQVVMVCkgeworCQlpZiAobm1pX2tub3duX2NwdSgpID4gMCkKKwkJCW5taV93YXRjaGRvZyA9IE5NSV9MT0NBTF9BUElDOworCQllbHNlCisJCQlubWlfd2F0Y2hkb2cgPSBOTUlfSU9fQVBJQzsKKwl9CisKKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9MT0NBTF9BUElDKSB7CisJCWlmIChubWlfd2F0Y2hkb2dfZW5hYmxlZCkKKwkJCWVuYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKKwkJZWxzZQorCQkJZGlzYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKIAl9IGVsc2UgewotCQlyZWxlYXNlX2xhcGljX25taSgpOwotCQl1bnNldF9ubWlfY2FsbGJhY2soKTsKKwkJcHJpbnRrKCBLRVJOX1dBUk5JTkcKKwkJCSJOTUkgd2F0Y2hkb2cgZG9lc24ndCBrbm93IHdoYXQgaGFyZHdhcmUgdG8gdG91Y2hcbiIpOworCQlyZXR1cm4gLUVJTzsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC02NzUsNyArMTAzMywxMSBAQAogCiBFWFBPUlRfU1lNQk9MKG5taV9hY3RpdmUpOwogRVhQT1JUX1NZTUJPTChubWlfd2F0Y2hkb2cpOwotRVhQT1JUX1NZTUJPTChyZXNlcnZlX2xhcGljX25taSk7Ci1FWFBPUlRfU1lNQk9MKHJlbGVhc2VfbGFwaWNfbm1pKTsKK0VYUE9SVF9TWU1CT0woYXZhaWxfdG9fcmVzcnZfcGVyZmN0cl9ubWkpOworRVhQT1JUX1NZTUJPTChhdmFpbF90b19yZXNydl9wZXJmY3RyX25taV9iaXQpOworRVhQT1JUX1NZTUJPTChyZXNlcnZlX3BlcmZjdHJfbm1pKTsKK0VYUE9SVF9TWU1CT0wocmVsZWFzZV9wZXJmY3RyX25taSk7CitFWFBPUlRfU1lNQk9MKHJlc2VydmVfZXZudHNlbF9ubWkpOworRVhQT1JUX1NZTUJPTChyZWxlYXNlX2V2bnRzZWxfbm1pKTsKIEVYUE9SVF9TWU1CT0woZGlzYWJsZV90aW1lcl9ubWlfd2F0Y2hkb2cpOwogRVhQT1JUX1NZTUJPTChlbmFibGVfdGltZXJfbm1pX3dhdGNoZG9nKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggODY1N2M3My4uOGMxOTBjYSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0zMjAsMTUgKzMyMSw2IEBACiAgKiB0aGUgImFyZ3MiLgogICovCiBleHRlcm4gdm9pZCBrZXJuZWxfdGhyZWFkX2hlbHBlcih2b2lkKTsKLV9fYXNtX18oIi5zZWN0aW9uIC50ZXh0XG4iCi0JIi5hbGlnbiA0XG4iCi0JImtlcm5lbF90aHJlYWRfaGVscGVyOlxuXHQiCi0JIm1vdmwgJWVkeCwlZWF4XG5cdCIKLQkicHVzaGwgJWVkeFxuXHQiCi0JImNhbGwgKiVlYnhcblx0IgotCSJwdXNobCAlZWF4XG5cdCIKLQkiY2FsbCBkb19leGl0XG4iCi0JIi5wcmV2aW91cyIpOwogCiAvKgogICogQ3JlYXRlIGEga2VybmVsIHRocmVhZApAQCAtMzQ2LDcgKzMzOCw3IEBACiAJcmVncy54ZXMgPSBfX1VTRVJfRFM7CiAJcmVncy5vcmlnX2VheCA9IC0xOwogCXJlZ3MuZWlwID0gKHVuc2lnbmVkIGxvbmcpIGtlcm5lbF90aHJlYWRfaGVscGVyOwotCXJlZ3MueGNzID0gX19LRVJORUxfQ1M7CisJcmVncy54Y3MgPSBfX0tFUk5FTF9DUyB8IGdldF9rZXJuZWxfcnBsKCk7CiAJcmVncy5lZmxhZ3MgPSBYODZfRUZMQUdTX0lGIHwgWDg2X0VGTEFHU19TRiB8IFg4Nl9FRkxBR1NfUEYgfCAweDI7CiAKIAkvKiBPaywgY3JlYXRlIHRoZSBuZXcgcHJvY2Vzcy4uICovCkBAIC05MDUsNyArODk3LDcgQEAKIAogdW5zaWduZWQgbG9uZyBhcmNoX2FsaWduX3N0YWNrKHVuc2lnbmVkIGxvbmcgc3ApCiB7Ci0JaWYgKHJhbmRvbWl6ZV92YV9zcGFjZSkKKwlpZiAoIShjdXJyZW50LT5wZXJzb25hbGl0eSAmIEFERFJfTk9fUkFORE9NSVpFKSAmJiByYW5kb21pemVfdmFfc3BhY2UpCiAJCXNwIC09IGdldF9yYW5kb21faW50KCkgJSA4MTkyOwogCXJldHVybiBzcCAmIH4weGY7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wdHJhY2UuYwppbmRleCBkM2RiMDNmLi43NzVmNTBlIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvcHRyYWNlLmMKQEAgLTE4NSwxNyArMTg1LDE3IEBACiAJcmV0dXJuIGFkZHI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlzX2F0X3BvcGYoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaW5saW5lIGludCBpc19zZXR0aW5nX3RyYXBfZmxhZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgaSwgY29waWVkOwotCXVuc2lnbmVkIGNoYXIgb3Bjb2RlWzE2XTsKKwl1bnNpZ25lZCBjaGFyIG9wY29kZVsxNV07CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gY29udmVydF9laXBfdG9fbGluZWFyKGNoaWxkLCByZWdzKTsKIAogCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCBvcGNvZGUsIHNpemVvZihvcGNvZGUpLCAwKTsKIAlmb3IgKGkgPSAwOyBpIDwgY29waWVkOyBpKyspIHsKIAkJc3dpdGNoIChvcGNvZGVbaV0pIHsKLQkJLyogcG9wZiAqLwotCQljYXNlIDB4OWQ6CisJCS8qIHBvcGYgYW5kIGlyZXQgKi8KKwkJY2FzZSAweDlkOiBjYXNlIDB4Y2Y6CiAJCQlyZXR1cm4gMTsKIAkJLyogb3Bjb2RlIGFuZCBhZGRyZXNzIHNpemUgcHJlZml4ZXMgKi8KIAkJY2FzZSAweDY2OiBjYXNlIDB4Njc6CkBAIC0yNDcsNyArMjQ3LDcgQEAKIAkgKiBkb24ndCBtYXJrIGl0IGFzIGJlaW5nICJ1cyIgdGhhdCBzZXQgaXQsIHNvIHRoYXQgd2UKIAkgKiB3b24ndCBjbGVhciBpdCBieSBoYW5kIGxhdGVyLgogCSAqLwotCWlmIChpc19hdF9wb3BmKGNoaWxkLCByZWdzKSkKKwlpZiAoaXNfc2V0dGluZ190cmFwX2ZsYWcoY2hpbGQsIHJlZ3MpKQogCQlyZXR1cm47CiAJCiAJY2hpbGQtPnB0cmFjZSB8PSBQVF9EVFJBQ0U7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TIGIvYXJjaC9pMzg2L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwppbmRleCBkMzEyNjE2Li5mMTUxZDZmIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKQEAgLTcsMTYgKzcsMTM4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgogCi0JLyoKLQkgKiBNdXN0IGJlIHJlbG9jYXRhYmxlIFBJQyBjb2RlIGNhbGxhYmxlIGFzIGEgQyBmdW5jdGlvbiwgdGhhdCBvbmNlCi0JICogaXQgc3RhcnRzIGNhbiBub3QgdXNlIHRoZSBwcmV2aW91cyBwcm9jZXNzZXMgc3RhY2suCi0JICovCi0JLmdsb2JsIHJlbG9jYXRlX25ld19rZXJuZWwKKy8qCisgKiBNdXN0IGJlIHJlbG9jYXRhYmxlIFBJQyBjb2RlIGNhbGxhYmxlIGFzIGEgQyBmdW5jdGlvbgorICovCisKKyNkZWZpbmUgUFRSKHgpICh4IDw8IDIpCisjZGVmaW5lIFBBR0VfQUxJR05FRCAoMSA8PCBQQUdFX1NISUZUKQorI2RlZmluZSBQQUdFX0FUVFIgMHg2MyAvKiBfUEFHRV9QUkVTRU5UfF9QQUdFX1JXfF9QQUdFX0FDQ0VTU0VEfF9QQUdFX0RJUlRZICovCisjZGVmaW5lIFBBRV9QR0RfQVRUUiAweDAxIC8qIF9QQUdFX1BSRVNFTlQgKi8KKworCS50ZXh0CisJLmFsaWduIFBBR0VfQUxJR05FRAorCS5nbG9ibCByZWxvY2F0ZV9rZXJuZWwKK3JlbG9jYXRlX2tlcm5lbDoKKwltb3ZsCTgoJWVzcCksICVlYnAgLyogbGlzdCBvZiBwYWdlcyAqLworCisjaWZkZWYgQ09ORklHX1g4Nl9QQUUKKwkvKiBtYXAgdGhlIGNvbnRyb2wgcGFnZSBhdCBpdHMgdmlydHVhbCBhZGRyZXNzICovCisKKwltb3ZsCVBUUihWQV9QR0QpKCVlYnApLCAlZWRpCisJbW92bAlQVFIoVkFfQ09OVFJPTF9QQUdFKSglZWJwKSwgJWVheAorCWFuZGwJJDB4YzAwMDAwMDAsICVlYXgKKwlzaHJsCSQyNywgJWVheAorCWFkZGwJJWVkaSwgJWVheAorCisJbW92bAlQVFIoUEFfUE1EXzApKCVlYnApLCAlZWR4CisJb3JsCSRQQUVfUEdEX0FUVFIsICVlZHgKKwltb3ZsCSVlZHgsICglZWF4KQorCisJbW92bAlQVFIoVkFfUE1EXzApKCVlYnApLCAlZWRpCisJbW92bAlQVFIoVkFfQ09OVFJPTF9QQUdFKSglZWJwKSwgJWVheAorCWFuZGwJJDB4M2ZlMDAwMDAsICVlYXgKKwlzaHJsCSQxOCwgJWVheAorCWFkZGwJJWVkaSwgJWVheAorCisJbW92bAlQVFIoUEFfUFRFXzApKCVlYnApLCAlZWR4CisJb3JsCSRQQUdFX0FUVFIsICVlZHgKKwltb3ZsCSVlZHgsICglZWF4KQorCisJbW92bAlQVFIoVkFfUFRFXzApKCVlYnApLCAlZWRpCisJbW92bAlQVFIoVkFfQ09OVFJPTF9QQUdFKSglZWJwKSwgJWVheAorCWFuZGwJJDB4MDAxZmYwMDAsICVlYXgKKwlzaHJsCSQ5LCAlZWF4CisJYWRkbAklZWRpLCAlZWF4CisKKwltb3ZsCVBUUihQQV9DT05UUk9MX1BBR0UpKCVlYnApLCAlZWR4CisJb3JsCSRQQUdFX0FUVFIsICVlZHgKKwltb3ZsCSVlZHgsICglZWF4KQorCisJLyogaWRlbnRpdHkgbWFwIHRoZSBjb250cm9sIHBhZ2UgYXQgaXRzIHBoeXNpY2FsIGFkZHJlc3MgKi8KKworCW1vdmwJUFRSKFZBX1BHRCkoJWVicCksICVlZGkKKwltb3ZsCVBUUihQQV9DT05UUk9MX1BBR0UpKCVlYnApLCAlZWF4CisJYW5kbAkkMHhjMDAwMDAwMCwgJWVheAorCXNocmwJJDI3LCAlZWF4CisJYWRkbAklZWRpLCAlZWF4CisKKwltb3ZsCVBUUihQQV9QTURfMSkoJWVicCksICVlZHgKKwlvcmwJJFBBRV9QR0RfQVRUUiwgJWVkeAorCW1vdmwJJWVkeCwgKCVlYXgpCisKKwltb3ZsCVBUUihWQV9QTURfMSkoJWVicCksICVlZGkKKwltb3ZsCVBUUihQQV9DT05UUk9MX1BBR0UpKCVlYnApLCAlZWF4CisJYW5kbAkkMHgzZmUwMDAwMCwgJWVheAorCXNocmwJJDE4LCAlZWF4CisJYWRkbAklZWRpLCAlZWF4CisKKwltb3ZsCVBUUihQQV9QVEVfMSkoJWVicCksICVlZHgKKwlvcmwJJFBBR0VfQVRUUiwgJWVkeAorCW1vdmwJJWVkeCwgKCVlYXgpCisKKwltb3ZsCVBUUihWQV9QVEVfMSkoJWVicCksICVlZGkKKwltb3ZsCVBUUihQQV9DT05UUk9MX1BBR0UpKCVlYnApLCAlZWF4CisJYW5kbAkkMHgwMDFmZjAwMCwgJWVheAorCXNocmwJJDksICVlYXgKKwlhZGRsCSVlZGksICVlYXgKKworCW1vdmwJUFRSKFBBX0NPTlRST0xfUEFHRSkoJWVicCksICVlZHgKKwlvcmwJJFBBR0VfQVRUUiwgJWVkeAorCW1vdmwJJWVkeCwgKCVlYXgpCisjZWxzZQorCS8qIG1hcCB0aGUgY29udHJvbCBwYWdlIGF0IGl0cyB2aXJ0dWFsIGFkZHJlc3MgKi8KKworCW1vdmwJUFRSKFZBX1BHRCkoJWVicCksICVlZGkKKwltb3ZsCVBUUihWQV9DT05UUk9MX1BBR0UpKCVlYnApLCAlZWF4CisJYW5kbAkkMHhmZmMwMDAwMCwgJWVheAorCXNocmwJJDIwLCAlZWF4CisJYWRkbAklZWRpLCAlZWF4CisKKwltb3ZsCVBUUihQQV9QVEVfMCkoJWVicCksICVlZHgKKwlvcmwJJFBBR0VfQVRUUiwgJWVkeAorCW1vdmwJJWVkeCwgKCVlYXgpCisKKwltb3ZsCVBUUihWQV9QVEVfMCkoJWVicCksICVlZGkKKwltb3ZsCVBUUihWQV9DT05UUk9MX1BBR0UpKCVlYnApLCAlZWF4CisJYW5kbAkkMHgwMDNmZjAwMCwgJWVheAorCXNocmwJJDEwLCAlZWF4CisJYWRkbAklZWRpLCAlZWF4CisKKwltb3ZsCVBUUihQQV9DT05UUk9MX1BBR0UpKCVlYnApLCAlZWR4CisJb3JsCSRQQUdFX0FUVFIsICVlZHgKKwltb3ZsCSVlZHgsICglZWF4KQorCisJLyogaWRlbnRpdHkgbWFwIHRoZSBjb250cm9sIHBhZ2UgYXQgaXRzIHBoeXNpY2FsIGFkZHJlc3MgKi8KKworCW1vdmwJUFRSKFZBX1BHRCkoJWVicCksICVlZGkKKwltb3ZsCVBUUihQQV9DT05UUk9MX1BBR0UpKCVlYnApLCAlZWF4CisJYW5kbAkkMHhmZmMwMDAwMCwgJWVheAorCXNocmwJJDIwLCAlZWF4CisJYWRkbAklZWRpLCAlZWF4CisKKwltb3ZsCVBUUihQQV9QVEVfMSkoJWVicCksICVlZHgKKwlvcmwJJFBBR0VfQVRUUiwgJWVkeAorCW1vdmwJJWVkeCwgKCVlYXgpCisKKwltb3ZsCVBUUihWQV9QVEVfMSkoJWVicCksICVlZGkKKwltb3ZsCVBUUihQQV9DT05UUk9MX1BBR0UpKCVlYnApLCAlZWF4CisJYW5kbAkkMHgwMDNmZjAwMCwgJWVheAorCXNocmwJJDEwLCAlZWF4CisJYWRkbAklZWRpLCAlZWF4CisKKwltb3ZsCVBUUihQQV9DT05UUk9MX1BBR0UpKCVlYnApLCAlZWR4CisJb3JsCSRQQUdFX0FUVFIsICVlZHgKKwltb3ZsCSVlZHgsICglZWF4KQorI2VuZGlmCisKIHJlbG9jYXRlX25ld19rZXJuZWw6CiAJLyogcmVhZCB0aGUgYXJndW1lbnRzIGFuZCBzYXkgZ29vZGJ5ZSB0byB0aGUgc3RhY2sgKi8KIAltb3ZsICA0KCVlc3ApLCAlZWJ4IC8qIHBhZ2VfbGlzdCAqLwotCW1vdmwgIDgoJWVzcCksICVlYnAgLyogcmVib290X2NvZGVfYnVmZmVyICovCisJbW92bCAgOCglZXNwKSwgJWVicCAvKiBsaXN0IG9mIHBhZ2VzICovCiAJbW92bCAgMTIoJWVzcCksICVlZHggLyogc3RhcnQgYWRkcmVzcyAqLwogCW1vdmwgIDE2KCVlc3ApLCAlZWN4IC8qIGNwdV9oYXNfcGFlICovCiAKQEAgLTI0LDExICsxNDYsMjYgQEAKIAlwdXNobCAkMAogCXBvcGZsCiAKLQkvKiBzZXQgYSBuZXcgc3RhY2sgYXQgdGhlIGJvdHRvbSBvZiBvdXIgcGFnZS4uLiAqLwotCWxlYSAgIDQwOTYoJWVicCksICVlc3AKKwkvKiBnZXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBjb250cm9sIHBhZ2Ugbm93ICovCisJLyogdGhpcyBpcyBpbXBvc3NpYmxlIGFmdGVyIHBhZ2UgdGFibGUgc3dpdGNoICovCisJbW92bAlQVFIoUEFfQ09OVFJPTF9QQUdFKSglZWJwKSwgJWVkaQogCi0JLyogc3RvcmUgdGhlIHBhcmFtZXRlcnMgYmFjayBvbiB0aGUgc3RhY2sgKi8KLQlwdXNobCAgICVlZHggLyogc3RvcmUgdGhlIHN0YXJ0IGFkZHJlc3MgKi8KKwkvKiBzd2l0Y2ggdG8gbmV3IHNldCBvZiBwYWdlIHRhYmxlcyAqLworCW1vdmwJUFRSKFBBX1BHRCkoJWVicCksICVlYXgKKwltb3ZsCSVlYXgsICVjcjMKKworCS8qIHNldHVwIGEgbmV3IHN0YWNrIGF0IHRoZSBlbmQgb2YgdGhlIHBoeXNpY2FsIGNvbnRyb2wgcGFnZSAqLworCWxlYQk0MDk2KCVlZGkpLCAlZXNwCisKKwkvKiBqdW1wIHRvIGlkZW50aXR5IG1hcHBlZCBwYWdlICovCisJbW92bCAgICAlZWRpLCAlZWF4CisJYWRkbCAgICAkKGlkZW50aXR5X21hcHBlZCAtIHJlbG9jYXRlX2tlcm5lbCksICVlYXgKKwlwdXNobCAgICVlYXgKKwlyZXQKKworaWRlbnRpdHlfbWFwcGVkOgorCS8qIHN0b3JlIHRoZSBzdGFydCBhZGRyZXNzIG9uIHRoZSBzdGFjayAqLworCXB1c2hsICAgJWVkeAogCiAJLyogU2V0IGNyMCB0byBhIGtub3duIHN0YXRlOgogCSAqIDMxIDAgPT0gUGFnaW5nIGRpc2FibGVkCkBAIC0xMTMsOCArMjUwLDMgQEAKIAl4b3JsICAgICVlZGksICVlZGkKIAl4b3JsICAgICVlYnAsICVlYnAKIAlyZXQKLXJlbG9jYXRlX25ld19rZXJuZWxfZW5kOgotCi0JLmdsb2JsIHJlbG9jYXRlX25ld19rZXJuZWxfc2l6ZQotcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplOgotCS5sb25nIHJlbG9jYXRlX25ld19rZXJuZWxfZW5kIC0gcmVsb2NhdGVfbmV3X2tlcm5lbApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zZW1hcGhvcmUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2VtYXBob3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MzUyYzMuLjAwMDAwMDAKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zZW1hcGhvcmUuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogaTM4NiBzZW1hcGhvcmUgaW1wbGVtZW50YXRpb24uCi0gKgotICogKEMpIENvcHlyaWdodCAxOTk5IExpbnVzIFRvcnZhbGRzCi0gKgotICogUG9ydGlvbnMgQ29weXJpZ2h0IDE5OTkgUmVkIEhhdCwgSW5jLgotICoKLSAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogcncgc2VtYXBob3JlcyBpbXBsZW1lbnRlZCBOb3ZlbWJlciAxOTk5IGJ5IEJlbmphbWluIExhSGFpc2UgPGJjcmxAa3ZhY2sub3JnPgotICovCi0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgotCi0vKgotICogVGhlIHNlbWFwaG9yZSBvcGVyYXRpb25zIGhhdmUgYSBzcGVjaWFsIGNhbGxpbmcgc2VxdWVuY2UgdGhhdAotICogYWxsb3cgdXMgdG8gZG8gYSBzaW1wbGVyIGluLWxpbmUgdmVyc2lvbiBvZiB0aGVtLiBUaGVzZSByb3V0aW5lcwotICogbmVlZCB0byBjb252ZXJ0IHRoYXQgc2VxdWVuY2UgYmFjayBpbnRvIHRoZSBDIHNlcXVlbmNlIHdoZW4KLSAqIHRoZXJlIGlzIGNvbnRlbnRpb24gb24gdGhlIHNlbWFwaG9yZS4KLSAqCi0gKiAlZWF4IGNvbnRhaW5zIHRoZSBzZW1hcGhvcmUgcG9pbnRlciBvbiBlbnRyeS4gU2F2ZSB0aGUgQy1jbG9iYmVyZWQKLSAqIHJlZ2lzdGVycyAoJWVheCwgJWVkeCBhbmQgJWVjeCkgZXhjZXB0ICVlYXggd2hpc2ggaXMgZWl0aGVyIGEgcmV0dXJuCi0gKiB2YWx1ZSBvciBqdXN0IGNsb2JiZXJlZC4uCi0gKi8KLWFzbSgKLSIuc2VjdGlvbiAuc2NoZWQudGV4dFxuIgotIi5hbGlnbiA0XG4iCi0iLmdsb2JsIF9fZG93bl9mYWlsZWRcbiIKLSJfX2Rvd25fZmFpbGVkOlxuXHQiCi0jaWYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKLQkicHVzaGwgJWVicFxuXHQiCi0JIm1vdmwgICVlc3AsJWVicFxuXHQiCi0jZW5kaWYKLQkicHVzaGwgJWVkeFxuXHQiCi0JInB1c2hsICVlY3hcblx0IgotCSJjYWxsIF9fZG93blxuXHQiCi0JInBvcGwgJWVjeFxuXHQiCi0JInBvcGwgJWVkeFxuXHQiCi0jaWYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKLQkibW92bCAlZWJwLCVlc3Bcblx0IgotCSJwb3BsICVlYnBcblx0IgotI2VuZGlmCi0JInJldCIKLSk7Ci0KLWFzbSgKLSIuc2VjdGlvbiAuc2NoZWQudGV4dFxuIgotIi5hbGlnbiA0XG4iCi0iLmdsb2JsIF9fZG93bl9mYWlsZWRfaW50ZXJydXB0aWJsZVxuIgotIl9fZG93bl9mYWlsZWRfaW50ZXJydXB0aWJsZTpcblx0IgotI2lmIGRlZmluZWQoQ09ORklHX0ZSQU1FX1BPSU5URVIpCi0JInB1c2hsICVlYnBcblx0IgotCSJtb3ZsICAlZXNwLCVlYnBcblx0IgotI2VuZGlmCi0JInB1c2hsICVlZHhcblx0IgotCSJwdXNobCAlZWN4XG5cdCIKLQkiY2FsbCBfX2Rvd25faW50ZXJydXB0aWJsZVxuXHQiCi0JInBvcGwgJWVjeFxuXHQiCi0JInBvcGwgJWVkeFxuXHQiCi0jaWYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKLQkibW92bCAlZWJwLCVlc3Bcblx0IgotCSJwb3BsICVlYnBcblx0IgotI2VuZGlmCi0JInJldCIKLSk7Ci0KLWFzbSgKLSIuc2VjdGlvbiAuc2NoZWQudGV4dFxuIgotIi5hbGlnbiA0XG4iCi0iLmdsb2JsIF9fZG93bl9mYWlsZWRfdHJ5bG9ja1xuIgotIl9fZG93bl9mYWlsZWRfdHJ5bG9jazpcblx0IgotI2lmIGRlZmluZWQoQ09ORklHX0ZSQU1FX1BPSU5URVIpCi0JInB1c2hsICVlYnBcblx0IgotCSJtb3ZsICAlZXNwLCVlYnBcblx0IgotI2VuZGlmCi0JInB1c2hsICVlZHhcblx0IgotCSJwdXNobCAlZWN4XG5cdCIKLQkiY2FsbCBfX2Rvd25fdHJ5bG9ja1xuXHQiCi0JInBvcGwgJWVjeFxuXHQiCi0JInBvcGwgJWVkeFxuXHQiCi0jaWYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikKLQkibW92bCAlZWJwLCVlc3Bcblx0IgotCSJwb3BsICVlYnBcblx0IgotI2VuZGlmCi0JInJldCIKLSk7Ci0KLWFzbSgKLSIuc2VjdGlvbiAuc2NoZWQudGV4dFxuIgotIi5hbGlnbiA0XG4iCi0iLmdsb2JsIF9fdXBfd2FrZXVwXG4iCi0iX191cF93YWtldXA6XG5cdCIKLQkicHVzaGwgJWVkeFxuXHQiCi0JInB1c2hsICVlY3hcblx0IgotCSJjYWxsIF9fdXBcblx0IgotCSJwb3BsICVlY3hcblx0IgotCSJwb3BsICVlZHhcblx0IgotCSJyZXQiCi0pOwotCi0vKgotICogcncgc3BpbmxvY2sgZmFsbGJhY2tzCi0gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19TTVApCi1hc20oCi0iLnNlY3Rpb24gLnNjaGVkLnRleHRcbiIKLSIuYWxpZ24JNFxuIgotIi5nbG9ibAlfX3dyaXRlX2xvY2tfZmFpbGVkXG4iCi0iX193cml0ZV9sb2NrX2ZhaWxlZDpcblx0IgotCUxPQ0tfUFJFRklYICJhZGRsCSQiIFJXX0xPQ0tfQklBU19TVFIgIiwoJWVheClcbiIKLSIxOglyZXA7IG5vcFxuXHQiCi0JImNtcGwJJCIgUldfTE9DS19CSUFTX1NUUiAiLCglZWF4KVxuXHQiCi0JImpuZQkxYlxuXHQiCi0JTE9DS19QUkVGSVggInN1YmwJJCIgUldfTE9DS19CSUFTX1NUUiAiLCglZWF4KVxuXHQiCi0JImpueglfX3dyaXRlX2xvY2tfZmFpbGVkXG5cdCIKLQkicmV0IgotKTsKLQotYXNtKAotIi5zZWN0aW9uIC5zY2hlZC50ZXh0XG4iCi0iLmFsaWduCTRcbiIKLSIuZ2xvYmwJX19yZWFkX2xvY2tfZmFpbGVkXG4iCi0iX19yZWFkX2xvY2tfZmFpbGVkOlxuXHQiCi0JTE9DS19QUkVGSVggImluY2wJKCVlYXgpXG4iCi0iMToJcmVwOyBub3Bcblx0IgotCSJjbXBsCSQxLCglZWF4KVxuXHQiCi0JImpzCTFiXG5cdCIKLQlMT0NLX1BSRUZJWCAiZGVjbAkoJWVheClcblx0IgotCSJqcwlfX3JlYWRfbG9ja19mYWlsZWRcblx0IgotCSJyZXQiCi0pOwotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3NldHVwLmMgYi9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKaW5kZXggMTZkOTk0NC4uODE0Y2RlYiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYwpAQCAtOTAsMTggKzkwLDYgQEAKIAogdW5zaWduZWQgbG9uZyBtbXVfY3I0X2ZlYXR1cmVzOwogCi0jaWZkZWYJQ09ORklHX0FDUEkKLQlpbnQgYWNwaV9kaXNhYmxlZCA9IDA7Ci0jZWxzZQotCWludCBhY3BpX2Rpc2FibGVkID0gMTsKLSNlbmRpZgotRVhQT1JUX1NZTUJPTChhY3BpX2Rpc2FibGVkKTsKLQotI2lmZGVmCUNPTkZJR19BQ1BJCi1pbnQgX19pbml0ZGF0YSBhY3BpX2ZvcmNlID0gMDsKLWV4dGVybiBhY3BpX2ludGVycnVwdF9mbGFncwlhY3BpX3NjaV9mbGFnczsKLSNlbmRpZgotCiAvKiBmb3IgTUNBLCBidXQgYW55b25lIGVsc2UgY2FuIHVzZSBpdCBpZiB0aGV5IHdhbnQgKi8KIHVuc2lnbmVkIGludCBtYWNoaW5lX2lkOwogI2lmZGVmIENPTkZJR19NQ0EKQEAgLTE0OSw3ICsxMzcsNiBAQAogc3RydWN0IGU4MjBtYXAgZTgyMDsKIAogZXh0ZXJuIHZvaWQgZWFybHlfY3B1X2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBnZW5lcmljX2FwaWNfcHJvYmUoY2hhciAqKTsKIGV4dGVybiBpbnQgcm9vdF9tb3VudGZsYWdzOwogCiB1bnNpZ25lZCBsb25nIHNhdmVkX3ZpZGVvbW9kZTsKQEAgLTcwMSwyMzggKzY4OCwxMzIgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBfX2luaXQgcGFyc2VfY21kbGluZV9lYXJseSAoY2hhciAqKiBjbWRsaW5lX3ApCitzdGF0aWMgaW50IF9faW5pdGRhdGEgdXNlcl9kZWZpbmVkX21lbW1hcCA9IDA7CisKKy8qCisgKiAibWVtPW5vcGVudGl1bSIgZGlzYWJsZXMgdGhlIDRNQiBwYWdlIHRhYmxlcy4KKyAqICJtZW09WFhYW2tLbU1dIiBkZWZpbmVzIGEgbWVtb3J5IHJlZ2lvbiBmcm9tIEhJR0hfTUVNCisgKiB0byA8bWVtPiwgb3ZlcnJpZGluZyB0aGUgYmlvcyBzaXplLgorICogIm1lbW1hcD1YWFhbS2ttTV1AWFhYW0trbU1dIiBkZWZpbmVzIGEgbWVtb3J5IHJlZ2lvbiBmcm9tCisgKiA8c3RhcnQ+IHRvIDxzdGFydD4rPG1lbT4sIG92ZXJyaWRpbmcgdGhlIGJpb3Mgc2l6ZS4KKyAqCisgKiBIUEEgdGVsbHMgbWUgYm9vdGxvYWRlcnMgbmVlZCB0byBwYXJzZSBtZW09LCBzbyBubyBuZXcKKyAqIG9wdGlvbiBzaG91bGQgYmUgbWVtPSAgW2Fsc28gc2VlIERvY3VtZW50YXRpb24vaTM4Ni9ib290LnR4dF0KKyAqLworc3RhdGljIGludCBfX2luaXQgcGFyc2VfbWVtKGNoYXIgKmFyZykKIHsKLQljaGFyIGMgPSAnICcsICp0byA9IGNvbW1hbmRfbGluZSwgKmZyb20gPSBzYXZlZF9jb21tYW5kX2xpbmU7Ci0JaW50IGxlbiA9IDA7Ci0JaW50IHVzZXJkZWYgPSAwOworCWlmICghYXJnKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIFNhdmUgdW5wYXJzZWQgY29tbWFuZCBsaW5lIGNvcHkgZm9yIC9wcm9jL2NtZGxpbmUgKi8KLQlzYXZlZF9jb21tYW5kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkUtMV0gPSAnXDAnOwotCi0JZm9yICg7OykgewotCQlpZiAoYyAhPSAnICcpCi0JCQlnb3RvIG5leHRfY2hhcjsKLQkJLyoKLQkJICogIm1lbT1ub3BlbnRpdW0iIGRpc2FibGVzIHRoZSA0TUIgcGFnZSB0YWJsZXMuCi0JCSAqICJtZW09WFhYW2tLbU1dIiBkZWZpbmVzIGEgbWVtb3J5IHJlZ2lvbiBmcm9tIEhJR0hfTUVNCi0JCSAqIHRvIDxtZW0+LCBvdmVycmlkaW5nIHRoZSBiaW9zIHNpemUuCi0JCSAqICJtZW1tYXA9WFhYW0trbU1dQFhYWFtLa21NXSIgZGVmaW5lcyBhIG1lbW9yeSByZWdpb24gZnJvbQotCQkgKiA8c3RhcnQ+IHRvIDxzdGFydD4rPG1lbT4sIG92ZXJyaWRpbmcgdGhlIGJpb3Mgc2l6ZS4KLQkJICoKLQkJICogSFBBIHRlbGxzIG1lIGJvb3Rsb2FkZXJzIG5lZWQgdG8gcGFyc2UgbWVtPSwgc28gbm8gbmV3Ci0JCSAqIG9wdGlvbiBzaG91bGQgYmUgbWVtPSAgW2Fsc28gc2VlIERvY3VtZW50YXRpb24vaTM4Ni9ib290LnR4dF0KKwlpZiAoc3RyY21wKGFyZywgIm5vcGVudGl1bSIpID09IDApIHsKKwkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX1BTRSwgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7CisJCWRpc2FibGVfcHNlID0gMTsKKwl9IGVsc2UgeworCQkvKiBJZiB0aGUgdXNlciBzcGVjaWZpZXMgbWVtb3J5IHNpemUsIHdlCisJCSAqIGxpbWl0IHRoZSBCSU9TLXByb3ZpZGVkIG1lbW9yeSBtYXAgdG8KKwkJICogdGhhdCBzaXplLiBleGFjdG1hcCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5CisJCSAqIHRoZSBleGFjdCBtYXAuIG1lbT1udW1iZXIgY2FuIGJlIHVzZWQgdG8KKwkJICogdHJpbSB0aGUgZXhpc3RpbmcgbWVtb3J5IG1hcC4KIAkJICovCi0JCWlmICghbWVtY21wKGZyb20sICJtZW09IiwgNCkpIHsKLQkJCWlmICh0byAhPSBjb21tYW5kX2xpbmUpCi0JCQkJdG8tLTsKLQkJCWlmICghbWVtY21wKGZyb20rNCwgIm5vcGVudGl1bSIsIDkpKSB7Ci0JCQkJZnJvbSArPSA5KzQ7Ci0JCQkJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX1BTRSwgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7Ci0JCQkJZGlzYWJsZV9wc2UgPSAxOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBJZiB0aGUgdXNlciBzcGVjaWZpZXMgbWVtb3J5IHNpemUsIHdlCi0JCQkJICogbGltaXQgdGhlIEJJT1MtcHJvdmlkZWQgbWVtb3J5IG1hcCB0bwotCQkJCSAqIHRoYXQgc2l6ZS4gZXhhY3RtYXAgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQotCQkJCSAqIHRoZSBleGFjdCBtYXAuIG1lbT1udW1iZXIgY2FuIGJlIHVzZWQgdG8KLQkJCQkgKiB0cmltIHRoZSBleGlzdGluZyBtZW1vcnkgbWFwLgotCQkJCSAqLwotCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBtZW1fc2l6ZTsKKwkJdW5zaWduZWQgbG9uZyBsb25nIG1lbV9zaXplOwogIAotCQkJCW1lbV9zaXplID0gbWVtcGFyc2UoZnJvbSs0LCAmZnJvbSk7Ci0JCQkJbGltaXRfcmVnaW9ucyhtZW1fc2l6ZSk7Ci0JCQkJdXNlcmRlZj0xOwotCQkJfQotCQl9Ci0KLQkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAibWVtbWFwPSIsIDcpKSB7Ci0JCQlpZiAodG8gIT0gY29tbWFuZF9saW5lKQotCQkJCXRvLS07Ci0JCQlpZiAoIW1lbWNtcChmcm9tKzcsICJleGFjdG1hcCIsIDgpKSB7Ci0jaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKLQkJCQkvKiBJZiB3ZSBhcmUgZG9pbmcgYSBjcmFzaCBkdW1wLCB3ZQotCQkJCSAqIHN0aWxsIG5lZWQgdG8ga25vdyB0aGUgcmVhbCBtZW0KLQkJCQkgKiBzaXplIGJlZm9yZSBvcmlnaW5hbCBtZW1vcnkgbWFwIGlzCi0JCQkJICogcmVzZXQuCi0JCQkJICovCi0JCQkJZmluZF9tYXhfcGZuKCk7Ci0JCQkJc2F2ZWRfbWF4X3BmbiA9IG1heF9wZm47Ci0jZW5kaWYKLQkJCQlmcm9tICs9IDgrNzsKLQkJCQllODIwLm5yX21hcCA9IDA7Ci0JCQkJdXNlcmRlZiA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCS8qIElmIHRoZSB1c2VyIHNwZWNpZmllcyBtZW1vcnkgc2l6ZSwgd2UKLQkJCQkgKiBsaW1pdCB0aGUgQklPUy1wcm92aWRlZCBtZW1vcnkgbWFwIHRvCi0JCQkJICogdGhhdCBzaXplLiBleGFjdG1hcCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5Ci0JCQkJICogdGhlIGV4YWN0IG1hcC4gbWVtPW51bWJlciBjYW4gYmUgdXNlZCB0bwotCQkJCSAqIHRyaW0gdGhlIGV4aXN0aW5nIG1lbW9yeSBtYXAuCi0JCQkJICovCi0JCQkJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0X2F0LCBtZW1fc2l6ZTsKLSAKLQkJCQltZW1fc2l6ZSA9IG1lbXBhcnNlKGZyb20rNywgJmZyb20pOwotCQkJCWlmICgqZnJvbSA9PSAnQCcpIHsKLQkJCQkJc3RhcnRfYXQgPSBtZW1wYXJzZShmcm9tKzEsICZmcm9tKTsKLQkJCQkJYWRkX21lbW9yeV9yZWdpb24oc3RhcnRfYXQsIG1lbV9zaXplLCBFODIwX1JBTSk7Ci0JCQkJfSBlbHNlIGlmICgqZnJvbSA9PSAnIycpIHsKLQkJCQkJc3RhcnRfYXQgPSBtZW1wYXJzZShmcm9tKzEsICZmcm9tKTsKLQkJCQkJYWRkX21lbW9yeV9yZWdpb24oc3RhcnRfYXQsIG1lbV9zaXplLCBFODIwX0FDUEkpOwotCQkJCX0gZWxzZSBpZiAoKmZyb20gPT0gJyQnKSB7Ci0JCQkJCXN0YXJ0X2F0ID0gbWVtcGFyc2UoZnJvbSsxLCAmZnJvbSk7Ci0JCQkJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0X2F0LCBtZW1fc2l6ZSwgRTgyMF9SRVNFUlZFRCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbGltaXRfcmVnaW9ucyhtZW1fc2l6ZSk7Ci0JCQkJCXVzZXJkZWY9MTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQllbHNlIGlmICghbWVtY21wKGZyb20sICJub2V4ZWM9IiwgNykpCi0JCQlub2V4ZWNfc2V0dXAoZnJvbSArIDcpOwotCi0KLSNpZmRlZiAgQ09ORklHX1g4Nl9TTVAKLQkJLyoKLQkJICogSWYgdGhlIEJJT1MgZW51bWVyYXRlcyBwaHlzaWNhbCBwcm9jZXNzb3JzIGJlZm9yZSBsb2dpY2FsLAotCQkgKiBtYXhjcHVzPU4gYXQgZW51bWVyYXRpb24tdGltZSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIEhULgotCQkgKi8KLQkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAibWF4Y3B1cz0iLCA4KSkgewotCQkJZXh0ZXJuIHVuc2lnbmVkIGludCBtYXhjcHVzOwotCi0JCQltYXhjcHVzID0gc2ltcGxlX3N0cnRvdWwoZnJvbSArIDgsIE5VTEwsIDApOwotCQl9Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19BQ1BJCi0JCS8qICJhY3BpPW9mZiIgZGlzYWJsZXMgYm90aCBBQ1BJIHRhYmxlIHBhcnNpbmcgYW5kIGludGVycHJldGVyICovCi0JCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImFjcGk9b2ZmIiwgOCkpIHsKLQkJCWRpc2FibGVfYWNwaSgpOwotCQl9Ci0KLQkJLyogYWNwaT1mb3JjZSB0byBvdmVyLXJpZGUgYmxhY2stbGlzdCAqLwotCQllbHNlIGlmICghbWVtY21wKGZyb20sICJhY3BpPWZvcmNlIiwgMTApKSB7Ci0JCQlhY3BpX2ZvcmNlID0gMTsKLQkJCWFjcGlfaHQgPSAxOwotCQkJYWNwaV9kaXNhYmxlZCA9IDA7Ci0JCX0KLQotCQkvKiBhY3BpPXN0cmljdCBkaXNhYmxlcyBvdXQtb2Ytc3BlYyB3b3JrYXJvdW5kcyAqLwotCQllbHNlIGlmICghbWVtY21wKGZyb20sICJhY3BpPXN0cmljdCIsIDExKSkgewotCQkJYWNwaV9zdHJpY3QgPSAxOwotCQl9Ci0KLQkJLyogTGltaXQgQUNQSSBqdXN0IHRvIGJvb3QtdGltZSB0byBlbmFibGUgSFQgKi8KLQkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiYWNwaT1odCIsIDcpKSB7Ci0JCQlpZiAoIWFjcGlfZm9yY2UpCi0JCQkJZGlzYWJsZV9hY3BpKCk7Ci0JCQlhY3BpX2h0ID0gMTsKLQkJfQotCQkKLQkJLyogInBjaT1ub2FjcGkiIGRpc2FibGUgQUNQSSBJUlEgcm91dGluZyBhbmQgUENJIHNjYW4gKi8KLQkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAicGNpPW5vYWNwaSIsIDEwKSkgewotCQkJYWNwaV9kaXNhYmxlX3BjaSgpOwotCQl9Ci0JCS8qICJhY3BpPW5vaXJxIiBkaXNhYmxlcyBBQ1BJIGludGVycnVwdCByb3V0aW5nICovCi0JCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImFjcGk9bm9pcnEiLCAxMCkpIHsKLQkJCWFjcGlfbm9pcnFfc2V0KCk7Ci0JCX0KLQotCQllbHNlIGlmICghbWVtY21wKGZyb20sICJhY3BpX3NjaT1lZGdlIiwgMTMpKQotCQkJYWNwaV9zY2lfZmxhZ3MudHJpZ2dlciA9ICAxOwotCi0JCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImFjcGlfc2NpPWxldmVsIiwgMTQpKQotCQkJYWNwaV9zY2lfZmxhZ3MudHJpZ2dlciA9IDM7Ci0KLQkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiYWNwaV9zY2k9aGlnaCIsIDEzKSkKLQkJCWFjcGlfc2NpX2ZsYWdzLnBvbGFyaXR5ID0gMTsKLQotCQllbHNlIGlmICghbWVtY21wKGZyb20sICJhY3BpX3NjaT1sb3ciLCAxMikpCi0JCQlhY3BpX3NjaV9mbGFncy5wb2xhcml0eSA9IDM7Ci0KLSNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKLQkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlIiwgMjQpKQotCQkJYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlID0gMTsKLQotCQlpZiAoIW1lbWNtcChmcm9tLCAiZGlzYWJsZV90aW1lcl9waW5fMSIsIDE5KSkKLQkJCWRpc2FibGVfdGltZXJfcGluXzEgPSAxOwotCQlpZiAoIW1lbWNtcChmcm9tLCAiZW5hYmxlX3RpbWVyX3Bpbl8xIiwgMTgpKQotCQkJZGlzYWJsZV90aW1lcl9waW5fMSA9IC0xOwotCi0JCS8qIGRpc2FibGUgSU8tQVBJQyAqLwotCQllbHNlIGlmICghbWVtY21wKGZyb20sICJub2FwaWMiLCA2KSkKLQkJCWRpc2FibGVfaW9hcGljX3NldHVwKCk7Ci0jZW5kaWYgLyogQ09ORklHX1g4Nl9JT19BUElDICovCi0jZW5kaWYgLyogQ09ORklHX0FDUEkgKi8KLQotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCQkvKiBlbmFibGUgbG9jYWwgQVBJQyAqLwotCQllbHNlIGlmICghbWVtY21wKGZyb20sICJsYXBpYyIsIDUpKQotCQkJbGFwaWNfZW5hYmxlKCk7Ci0KLQkJLyogZGlzYWJsZSBsb2NhbCBBUElDICovCi0JCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgIm5vbGFwaWMiLCA2KSkKLQkJCWxhcGljX2Rpc2FibGUoKTsKLSNlbmRpZiAvKiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMgKi8KLQotI2lmZGVmIENPTkZJR19LRVhFQwotCQkvKiBjcmFzaGtlcm5lbD1zaXplQGFkZHIgc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiB0byByZXNlcnZlIGZvcgotCQkgKiBhIGNyYXNoIGtlcm5lbC4gIEJ5IHJlc2VydmluZyB0aGlzIG1lbW9yeSB3ZSBndWFyYW50ZWUKLQkJICogdGhhdCBsaW51eCBuZXZlciBzZXQncyBpdCB1cCBhcyBhIERNQSB0YXJnZXQuCi0JCSAqIFVzZWZ1bCBmb3IgaG9sZGluZyBjb2RlIHRvIGRvIHNvbWV0aGluZyBhcHByb3ByaWF0ZQotCQkgKiBhZnRlciBhIGtlcm5lbCBwYW5pYy4KLQkJICovCi0JCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImNyYXNoa2VybmVsPSIsIDEyKSkgewotCQkJdW5zaWduZWQgbG9uZyBzaXplLCBiYXNlOwotCQkJc2l6ZSA9IG1lbXBhcnNlKGZyb20rMTIsICZmcm9tKTsKLQkJCWlmICgqZnJvbSA9PSAnQCcpIHsKLQkJCQliYXNlID0gbWVtcGFyc2UoZnJvbSsxLCAmZnJvbSk7Ci0JCQkJLyogRklYTUU6IERvIEkgd2FudCBhIHNhbml0eSBjaGVjawotCQkJCSAqIHRvIHZhbGlkYXRlIHRoZSBtZW1vcnkgcmFuZ2U/Ci0JCQkJICovCi0JCQkJY3Jhc2hrX3Jlcy5zdGFydCA9IGJhc2U7Ci0JCQkJY3Jhc2hrX3Jlcy5lbmQgICA9IGJhc2UgKyBzaXplIC0gMTsKLQkJCX0KLQkJfQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BST0NfVk1DT1JFCi0JCS8qIGVsZmNvcmVoZHI9IHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgZWxmIGNvcmUgaGVhZGVyCi0JCSAqIHN0b3JlZCBieSB0aGUgY3Jhc2hlZCBrZXJuZWwuCi0JCSAqLwotCQllbHNlIGlmICghbWVtY21wKGZyb20sICJlbGZjb3JlaGRyPSIsIDExKSkKLQkJCWVsZmNvcmVoZHJfYWRkciA9IG1lbXBhcnNlKGZyb20rMTEsICZmcm9tKTsKLSNlbmRpZgotCi0JCS8qCi0JCSAqIGhpZ2htZW09c2l6ZSBmb3JjZXMgaGlnaG1lbSB0byBiZSBleGFjdGx5ICdzaXplJyBieXRlcy4KLQkJICogVGhpcyB3b3JrcyBldmVuIG9uIGJveGVzIHRoYXQgaGF2ZSBubyBoaWdobWVtIG90aGVyd2lzZS4KLQkJICogVGhpcyBhbHNvIHdvcmtzIHRvIHJlZHVjZSBoaWdobWVtIHNpemUgb24gYmlnZ2VyIGJveGVzLgotCQkgKi8KLQkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiaGlnaG1lbT0iLCA4KSkKLQkJCWhpZ2htZW1fcGFnZXMgPSBtZW1wYXJzZShmcm9tKzgsICZmcm9tKSA+PiBQQUdFX1NISUZUOwotCQotCQkvKgotCQkgKiB2bWFsbG9jPXNpemUgZm9yY2VzIHRoZSB2bWFsbG9jIGFyZWEgdG8gYmUgZXhhY3RseSAnc2l6ZScKLQkJICogYnl0ZXMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW5jcmVhc2UgKG9yIGRlY3JlYXNlKSB0aGUKLQkJICogdm1hbGxvYyBhcmVhIC0gdGhlIGRlZmF1bHQgaXMgMTI4bS4KLQkJICovCi0JCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgInZtYWxsb2M9IiwgOCkpCi0JCQlfX1ZNQUxMT0NfUkVTRVJWRSA9IG1lbXBhcnNlKGZyb20rOCwgJmZyb20pOwotCi0JbmV4dF9jaGFyOgotCQljID0gKihmcm9tKyspOwotCQlpZiAoIWMpCi0JCQlicmVhazsKLQkJaWYgKENPTU1BTkRfTElORV9TSVpFIDw9ICsrbGVuKQotCQkJYnJlYWs7Ci0JCSoodG8rKykgPSBjOworCQltZW1fc2l6ZSA9IG1lbXBhcnNlKGFyZywgJmFyZyk7CisJCWxpbWl0X3JlZ2lvbnMobWVtX3NpemUpOworCQl1c2VyX2RlZmluZWRfbWVtbWFwID0gMTsKIAl9Ci0JKnRvID0gJ1wwJzsKLQkqY21kbGluZV9wID0gY29tbWFuZF9saW5lOwotCWlmICh1c2VyZGVmKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInVzZXItZGVmaW5lZCBwaHlzaWNhbCBSQU0gbWFwOlxuIik7Ci0JCXByaW50X21lbW9yeV9tYXAoInVzZXIiKTsKLQl9CisJcmV0dXJuIDA7CiB9CitlYXJseV9wYXJhbSgibWVtIiwgcGFyc2VfbWVtKTsKKworc3RhdGljIGludCBfX2luaXQgcGFyc2VfbWVtbWFwKGNoYXIgKmFyZykKK3sKKwlpZiAoIWFyZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3RyY21wKGFyZywgImV4YWN0bWFwIikgPT0gMCkgeworI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisJCS8qIElmIHdlIGFyZSBkb2luZyBhIGNyYXNoIGR1bXAsIHdlCisJCSAqIHN0aWxsIG5lZWQgdG8ga25vdyB0aGUgcmVhbCBtZW0KKwkJICogc2l6ZSBiZWZvcmUgb3JpZ2luYWwgbWVtb3J5IG1hcCBpcworCQkgKiByZXNldC4KKwkJICovCisJCWZpbmRfbWF4X3BmbigpOworCQlzYXZlZF9tYXhfcGZuID0gbWF4X3BmbjsKKyNlbmRpZgorCQllODIwLm5yX21hcCA9IDA7CisJCXVzZXJfZGVmaW5lZF9tZW1tYXAgPSAxOworCX0gZWxzZSB7CisJCS8qIElmIHRoZSB1c2VyIHNwZWNpZmllcyBtZW1vcnkgc2l6ZSwgd2UKKwkJICogbGltaXQgdGhlIEJJT1MtcHJvdmlkZWQgbWVtb3J5IG1hcCB0bworCQkgKiB0aGF0IHNpemUuIGV4YWN0bWFwIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKKwkJICogdGhlIGV4YWN0IG1hcC4gbWVtPW51bWJlciBjYW4gYmUgdXNlZCB0bworCQkgKiB0cmltIHRoZSBleGlzdGluZyBtZW1vcnkgbWFwLgorCQkgKi8KKwkJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0X2F0LCBtZW1fc2l6ZTsKKworCQltZW1fc2l6ZSA9IG1lbXBhcnNlKGFyZywgJmFyZyk7CisJCWlmICgqYXJnID09ICdAJykgeworCQkJc3RhcnRfYXQgPSBtZW1wYXJzZShhcmcrMSwgJmFyZyk7CisJCQlhZGRfbWVtb3J5X3JlZ2lvbihzdGFydF9hdCwgbWVtX3NpemUsIEU4MjBfUkFNKTsKKwkJfSBlbHNlIGlmICgqYXJnID09ICcjJykgeworCQkJc3RhcnRfYXQgPSBtZW1wYXJzZShhcmcrMSwgJmFyZyk7CisJCQlhZGRfbWVtb3J5X3JlZ2lvbihzdGFydF9hdCwgbWVtX3NpemUsIEU4MjBfQUNQSSk7CisJCX0gZWxzZSBpZiAoKmFyZyA9PSAnJCcpIHsKKwkJCXN0YXJ0X2F0ID0gbWVtcGFyc2UoYXJnKzEsICZhcmcpOworCQkJYWRkX21lbW9yeV9yZWdpb24oc3RhcnRfYXQsIG1lbV9zaXplLCBFODIwX1JFU0VSVkVEKTsKKwkJfSBlbHNlIHsKKwkJCWxpbWl0X3JlZ2lvbnMobWVtX3NpemUpOworCQkJdXNlcl9kZWZpbmVkX21lbW1hcCA9IDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgibWVtbWFwIiwgcGFyc2VfbWVtbWFwKTsKKworI2lmZGVmIENPTkZJR19QUk9DX1ZNQ09SRQorLyogZWxmY29yZWhkcj0gc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBlbGYgY29yZSBoZWFkZXIKKyAqIHN0b3JlZCBieSB0aGUgY3Jhc2hlZCBrZXJuZWwuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX2VsZmNvcmVoZHIoY2hhciAqYXJnKQoreworCWlmICghYXJnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVsZmNvcmVoZHJfYWRkciA9IG1lbXBhcnNlKGFyZywgJmFyZyk7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgiZWxmY29yZWhkciIsIHBhcnNlX2VsZmNvcmVoZHIpOworI2VuZGlmIC8qIENPTkZJR19QUk9DX1ZNQ09SRSAqLworCisvKgorICogaGlnaG1lbT1zaXplIGZvcmNlcyBoaWdobWVtIHRvIGJlIGV4YWN0bHkgJ3NpemUnIGJ5dGVzLgorICogVGhpcyB3b3JrcyBldmVuIG9uIGJveGVzIHRoYXQgaGF2ZSBubyBoaWdobWVtIG90aGVyd2lzZS4KKyAqIFRoaXMgYWxzbyB3b3JrcyB0byByZWR1Y2UgaGlnaG1lbSBzaXplIG9uIGJpZ2dlciBib3hlcy4KKyAqLworc3RhdGljIGludCBfX2luaXQgcGFyc2VfaGlnaG1lbShjaGFyICphcmcpCit7CisJaWYgKCFhcmcpCisJCXJldHVybiAtRUlOVkFMOworCisJaGlnaG1lbV9wYWdlcyA9IG1lbXBhcnNlKGFyZywgJmFyZykgPj4gUEFHRV9TSElGVDsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJoaWdobWVtIiwgcGFyc2VfaGlnaG1lbSk7CisKKy8qCisgKiB2bWFsbG9jPXNpemUgZm9yY2VzIHRoZSB2bWFsbG9jIGFyZWEgdG8gYmUgZXhhY3RseSAnc2l6ZScKKyAqIGJ5dGVzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGluY3JlYXNlIChvciBkZWNyZWFzZSkgdGhlCisgKiB2bWFsbG9jIGFyZWEgLSB0aGUgZGVmYXVsdCBpcyAxMjhtLgorICovCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV92bWFsbG9jKGNoYXIgKmFyZykKK3sKKwlpZiAoIWFyZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlfX1ZNQUxMT0NfUkVTRVJWRSA9IG1lbXBhcnNlKGFyZywgJmFyZyk7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgidm1hbGxvYyIsIHBhcnNlX3ZtYWxsb2MpOwogCiAvKgogICogcmVzZXJ2ZXRvcD1zaXplIHJlc2VydmVzIGEgaG9sZSBhdCB0aGUgdG9wIG9mIHRoZSBrZXJuZWwgYWRkcmVzcyBzcGFjZSB3aGljaApAQCAtMTE4OSw2ICsxMDcwLDE0IEBACiAJfQogCXByaW50ayhLRVJOX05PVElDRSAiJWxkTUIgSElHSE1FTSBhdmFpbGFibGUuXG4iLAogCQlwYWdlc190b19tYihoaWdoZW5kX3BmbiAtIGhpZ2hzdGFydF9wZm4pKTsKKwludW1fcGh5c3BhZ2VzID0gaGlnaGVuZF9wZm47CisJaGlnaF9tZW1vcnkgPSAodm9pZCAqKSBfX3ZhKGhpZ2hzdGFydF9wZm4gKiBQQUdFX1NJWkUgLSAxKSArIDE7CisjZWxzZQorCW51bV9waHlzcGFnZXMgPSBtYXhfbG93X3BmbjsKKwloaWdoX21lbW9yeSA9ICh2b2lkICopIF9fdmEobWF4X2xvd19wZm4gKiBQQUdFX1NJWkUgLSAxKSArIDE7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRkxBVE1FTQorCW1heF9tYXBuciA9IG51bV9waHlzcGFnZXM7CiAjZW5kaWYKIAlwcmludGsoS0VSTl9OT1RJQ0UgIiVsZE1CIExPV01FTSBhdmFpbGFibGUuXG4iLAogCQkJcGFnZXNfdG9fbWIobWF4X2xvd19wZm4pKTsKQEAgLTEyMDAsMjIgKzEwODksMjAgQEAKIAogdm9pZCBfX2luaXQgem9uZV9zaXplc19pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyB6b25lc19zaXplW01BWF9OUl9aT05FU10gPSB7IDAsIH07Ci0JdW5zaWduZWQgaW50IG1heF9kbWEsIGxvdzsKLQotCW1heF9kbWEgPSB2aXJ0X3RvX3BoeXMoKGNoYXIgKilNQVhfRE1BX0FERFJFU1MpID4+IFBBR0VfU0hJRlQ7Ci0JbG93ID0gbWF4X2xvd19wZm47Ci0KLQlpZiAobG93IDwgbWF4X2RtYSkKLQkJem9uZXNfc2l6ZVtaT05FX0RNQV0gPSBsb3c7Ci0JZWxzZSB7Ci0JCXpvbmVzX3NpemVbWk9ORV9ETUFdID0gbWF4X2RtYTsKLQkJem9uZXNfc2l6ZVtaT05FX05PUk1BTF0gPSBsb3cgLSBtYXhfZG1hOwogI2lmZGVmIENPTkZJR19ISUdITUVNCi0JCXpvbmVzX3NpemVbWk9ORV9ISUdITUVNXSA9IGhpZ2hlbmRfcGZuIC0gbG93OworCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdID0geworCQkJdmlydF90b19waHlzKChjaGFyICopTUFYX0RNQV9BRERSRVNTKSA+PiBQQUdFX1NISUZULAorCQkJbWF4X2xvd19wZm4sCisJCQloaWdoZW5kX3Bmbn07CisJYWRkX2FjdGl2ZV9yYW5nZSgwLCAwLCBoaWdoZW5kX3Bmbik7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdID0geworCQkJdmlydF90b19waHlzKChjaGFyICopTUFYX0RNQV9BRERSRVNTKSA+PiBQQUdFX1NISUZULAorCQkJbWF4X2xvd19wZm59OworCWFkZF9hY3RpdmVfcmFuZ2UoMCwgMCwgbWF4X2xvd19wZm4pOwogI2VuZGlmCi0JfQotCWZyZWVfYXJlYV9pbml0KHpvbmVzX3NpemUpOworCisJZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7CiB9CiAjZWxzZQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19pbml0IHNldHVwX21lbW9yeSh2b2lkKTsKQEAgLTE1MTgsMTcgKzE0MDUsMTUgQEAKIAlkYXRhX3Jlc291cmNlLnN0YXJ0ID0gdmlydF90b19waHlzKF9ldGV4dCk7CiAJZGF0YV9yZXNvdXJjZS5lbmQgPSB2aXJ0X3RvX3BoeXMoX2VkYXRhKS0xOwogCi0JcGFyc2VfY21kbGluZV9lYXJseShjbWRsaW5lX3ApOworCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CiAKLSNpZmRlZiBDT05GSUdfRUFSTFlfUFJJTlRLCi0JewotCQljaGFyICpzID0gc3Ryc3RyKCpjbWRsaW5lX3AsICJlYXJseXByaW50az0iKTsKLQkJaWYgKHMpIHsKLQkJCXNldHVwX2Vhcmx5X3ByaW50ayhzdHJjaHIocywgJz0nKSArIDEpOwotCQkJcHJpbnRrKCJlYXJseSBjb25zb2xlIGVuYWJsZWRcbiIpOwotCQl9CisJaWYgKHVzZXJfZGVmaW5lZF9tZW1tYXApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidXNlci1kZWZpbmVkIHBoeXNpY2FsIFJBTSBtYXA6XG4iKTsKKwkJcHJpbnRfbWVtb3J5X21hcCgidXNlciIpOwogCX0KLSNlbmRpZgorCisJc3RybGNweShjb21tYW5kX2xpbmUsIHNhdmVkX2NvbW1hbmRfbGluZSwgQ09NTUFORF9MSU5FX1NJWkUpOworCSpjbWRsaW5lX3AgPSBjb21tYW5kX2xpbmU7CiAKIAltYXhfbG93X3BmbiA9IHNldHVwX21lbW9yeSgpOwogCkBAIC0xNTU3LDcgKzE0NDIsNyBAQAogCWRtaV9zY2FuX21hY2hpbmUoKTsKIAogI2lmZGVmIENPTkZJR19YODZfR0VORVJJQ0FSQ0gKLQlnZW5lcmljX2FwaWNfcHJvYmUoKmNtZGxpbmVfcCk7CisJZ2VuZXJpY19hcGljX3Byb2JlKCk7CiAjZW5kaWYJCiAJaWYgKGVmaV9lbmFibGVkKQogCQllZmlfbWFwX21lbW1hcCgpOwpAQCAtMTU2OSw5ICsxNDU0LDExIEBACiAJYWNwaV9ib290X3RhYmxlX2luaXQoKTsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BDSQogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogCWNoZWNrX2FjcGlfcGNpKCk7CS8qIENoZWNrcyBtb3JlIHRoYW4ganVzdCBBQ1BJIGFjdHVhbGx5ICovCiAjZW5kaWYKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FDUEkKIAlhY3BpX2Jvb3RfaW5pdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYwppbmRleCBlZmUwNzk5Li4wMjBkODczIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYworKysgYi9hcmNoL2kzODYva2VybmVsL3NtcGJvb3QuYwpAQCAtMTc3LDYgKzE3Nyw5IEBACiAJICovCiAJaWYgKChjLT54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EKSAmJiAoYy0+eDg2ID09IDYpKSB7CiAKKwkJaWYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPT0gMSkKKwkJCWdvdG8gdmFsaWRfazc7CisKIAkJLyogQXRobG9uIDY2MC82NjEgaXMgdmFsaWQuICovCQogCQlpZiAoKGMtPng4Nl9tb2RlbD09NikgJiYgKChjLT54ODZfbWFzaz09MCkgfHwgKGMtPng4Nl9tYXNrPT0xKSkpCiAJCQlnb3RvIHZhbGlkX2s3OwpAQCAtMTM3Niw3ICsxMzc5LDggQEAKIAkgKi8KIAlpZiAoY3B1ID09IDApCiAJCXJldHVybiAtRUJVU1k7Ci0KKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9MT0NBTF9BUElDKQorCQlzdG9wX2FwaWNfbm1pX3dhdGNoZG9nKE5VTEwpOwogCWNsZWFyX2xvY2FsX0FQSUMoKTsKIAkvKiBBbGxvdyBhbnkgcXVldWVkIHRpbWVyIGludGVycnVwdHMgdG8gZ2V0IHNlcnZpY2VkICovCiAJbG9jYWxfaXJxX2VuYWJsZSgpOwpAQCAtMTQ5MCwzICsxNDk0LDE2IEBACiAJLyogSVBJIGZvciBnZW5lcmljIGZ1bmN0aW9uIGNhbGwgKi8KIAlzZXRfaW50cl9nYXRlKENBTExfRlVOQ1RJT05fVkVDVE9SLCBjYWxsX2Z1bmN0aW9uX2ludGVycnVwdCk7CiB9CisKKy8qCisgKiBJZiB0aGUgQklPUyBlbnVtZXJhdGVzIHBoeXNpY2FsIHByb2Nlc3NvcnMgYmVmb3JlIGxvZ2ljYWwsCisgKiBtYXhjcHVzPU4gYXQgZW51bWVyYXRpb24tdGltZSBjYW4gYmUgdXNlZCB0byBkaXNhYmxlIEhULgorICovCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9tYXhjcHVzKGNoYXIgKmFyZykKK3sKKwlleHRlcm4gdW5zaWduZWQgaW50IG1heGNwdXM7CisKKwltYXhjcHVzID0gc2ltcGxlX3N0cnRvdWwoYXJnLCBOVUxMLCAwKTsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJtYXhjcHVzIiwgcGFyc2VfbWF4Y3B1cyk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3NyYXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3JhdC5jCmluZGV4IDgzZGI0MTEuLjMyNDEzMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvc3JhdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3JhdC5jCkBAIC01NCw4ICs1NCw2IEBACiBzdGF0aWMgc3RydWN0IG5vZGVfbWVtb3J5X2NodW5rX3Mgbm9kZV9tZW1vcnlfY2h1bmtbTUFYQ0hVTktTXTsKIAogc3RhdGljIGludCBudW1fbWVtb3J5X2NodW5rczsJCS8qIHRvdGFsIG51bWJlciBvZiBtZW1vcnkgY2h1bmtzICovCi1zdGF0aWMgaW50IHpob2xlc19zaXplX2luaXQ7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyB6aG9sZXNfc2l6ZVtNQVhfTlVNTk9ERVMgKiBNQVhfTlJfWk9ORVNdOwogCiBleHRlcm4gdm9pZCAqIGJvb3RfaW9yZW1hcCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKIApAQCAtMTM1LDQ3ICsxMzMsNiBAQAogCQkgImVuYWJsZWQgYW5kIHJlbW92YWJsZSIgOiAiZW5hYmxlZCIgKSApOwogfQogCi0vKiBUYWtlIGEgY2h1bmsgb2YgcGFnZXMgZnJvbSBwYWdlIGZyYW1lIGNzdGFydCB0byBjZW5kIGFuZCBjb3VudCB0aGUgbnVtYmVyCi0gKiBvZiBwYWdlcyBpbiBlYWNoIHpvbmUsIHJldHVybmVkIHZpYSB6b25lc1tdLgotICovCi1zdGF0aWMgX19pbml0IHZvaWQgY2h1bmtfdG9fem9uZXModW5zaWduZWQgbG9uZyBjc3RhcnQsIHVuc2lnbmVkIGxvbmcgY2VuZCwgCi0JCXVuc2lnbmVkIGxvbmcgKnpvbmVzKQotewotCXVuc2lnbmVkIGxvbmcgbWF4X2RtYTsKLQlleHRlcm4gdW5zaWduZWQgbG9uZyBtYXhfbG93X3BmbjsKLQotCWludCB6OwotCXVuc2lnbmVkIGxvbmcgcmVuZDsKLQotCS8qIEZJWE1FOiBNQVhfRE1BX0FERFJFU1MgYW5kIG1heF9sb3dfcGZuIGFyZSB0cnlpbmcgdG8gcHJvdmlkZQotCSAqIHNpbWlsYXJseSBzY29wZWQgaW5mb3JtYXRpb24gYW5kIHNob3VsZCBiZSBoYW5kbGVkIGluIGEgY29uc2lzdGFudAotCSAqIG1hbm5lci4KLQkgKi8KLQltYXhfZG1hID0gdmlydF90b19waHlzKChjaGFyICopTUFYX0RNQV9BRERSRVNTKSA+PiBQQUdFX1NISUZUOwotCi0JLyogU3BsaXQgdGhlIGhvbGUgaW50byB0aGUgem9uZXMgaW4gd2hpY2ggaXQgZmFsbHMuICBSZXBlYXRlZGx5Ci0JICogdGFrZSB0aGUgc2VnbWVudCBpbiB3aGljaCB0aGUgcmVtYWluaW5nIGhvbGUgc3RhcnRzLCByb3VuZCBpdAotCSAqIHRvIHRoZSBlbmQgb2YgdGhhdCB6b25lLgotCSAqLwotCW1lbXNldCh6b25lcywgMCwgTUFYX05SX1pPTkVTICogc2l6ZW9mKGxvbmcpKTsKLQl3aGlsZSAoY3N0YXJ0IDwgY2VuZCkgewotCQlpZiAoY3N0YXJ0IDwgbWF4X2RtYSkgewotCQkJeiA9IFpPTkVfRE1BOwotCQkJcmVuZCA9IChjZW5kIDwgbWF4X2RtYSk/IGNlbmQgOiBtYXhfZG1hOwotCi0JCX0gZWxzZSBpZiAoY3N0YXJ0IDwgbWF4X2xvd19wZm4pIHsKLQkJCXogPSBaT05FX05PUk1BTDsKLQkJCXJlbmQgPSAoY2VuZCA8IG1heF9sb3dfcGZuKT8gY2VuZCA6IG1heF9sb3dfcGZuOwotCi0JCX0gZWxzZSB7Ci0JCQl6ID0gWk9ORV9ISUdITUVNOwotCQkJcmVuZCA9IGNlbmQ7Ci0JCX0KLQkJem9uZXNbel0gKz0gcmVuZCAtIGNzdGFydDsKLQkJY3N0YXJ0ID0gcmVuZDsKLQl9Ci19Ci0KIC8qCiAgKiBUaGUgU1JBVCB0YWJsZSBhbHdheXMgbGlzdHMgYXNjZW5kaW5nIGFkZHJlc3Nlcywgc28gY2FuIGFsd2F5cwogICogYXNzdW1lIHRoYXQgdGhlIGZpcnN0ICJzdGFydCIgYWRkcmVzcyB0aGF0IHlvdSBzZWUgaXMgdGhlIHJlYWwKQEAgLTIyMCw3ICsxNzcsNiBAQAogCiAJbWVtc2V0KHB4bV9iaXRtYXAsIDAsIHNpemVvZihweG1fYml0bWFwKSk7CS8qIGluaXQgcHJveGltaXR5IGRvbWFpbiBiaXRtYXAgKi8KIAltZW1zZXQobm9kZV9tZW1vcnlfY2h1bmssIDAsIHNpemVvZihub2RlX21lbW9yeV9jaHVuaykpOwotCW1lbXNldCh6aG9sZXNfc2l6ZSwgMCwgc2l6ZW9mKHpob2xlc19zaXplKSk7CiAKIAludW1fbWVtb3J5X2NodW5rcyA9IDA7CiAJd2hpbGUgKHAgPCBlbmQpIHsKQEAgLTI4NCw2ICsyNDAsNyBAQAogCQlwcmludGsoImNodW5rICVkIG5pZCAlZCBzdGFydF9wZm4gJTA4bHggZW5kX3BmbiAlMDhseFxuIiwKIAkJICAgICAgIGosIGNodW5rLT5uaWQsIGNodW5rLT5zdGFydF9wZm4sIGNodW5rLT5lbmRfcGZuKTsKIAkJbm9kZV9yZWFkX2NodW5rKGNodW5rLT5uaWQsIGNodW5rKTsKKwkJYWRkX2FjdGl2ZV9yYW5nZShjaHVuay0+bmlkLCBjaHVuay0+c3RhcnRfcGZuLCBjaHVuay0+ZW5kX3Bmbik7CiAJfQogIAogCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgewpAQCAtMzkyLDU3ICszNDksNyBAQAogCQlyZXR1cm4gYWNwaTIwX3BhcnNlX3NyYXQoKHN0cnVjdCBhY3BpX3RhYmxlX3NyYXQgKiloZWFkZXIpOwogCX0KIG91dF9lcnI6CisJcmVtb3ZlX2FsbF9hY3RpdmVfcmFuZ2VzKCk7CiAJcHJpbnRrKCJmYWlsZWQgdG8gZ2V0IE5VTUEgbWVtb3J5IGluZm9ybWF0aW9uIGZyb20gU1JBVCB0YWJsZVxuIik7CiAJcmV0dXJuIDA7CiB9Ci0KLS8qIEZvciBlYWNoIG5vZGUgcnVuIHRoZSBtZW1vcnkgbGlzdCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBhcmUKLSAqIGFueSBtZW1vcnkgaG9sZXMuICBGb3IgZWFjaCBob2xlIGRldGVybWluZSB3aGljaCBaT05FIHRoZXkgZmFsbAotICogaW50by4KLSAqCi0gKiBOT1RFIzE6IHRoaXMgcmVxdWlyZXMga25vd2xlZGdlIG9mIHRoZSB6b25lIGJvdW5kcmllcyBhbmQgc28KLSAqIF9jYW5ub3RfIGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhvc2UgYXJlIGNhbGN1bGF0ZWQgaW4gc2V0dXBfbWVtb3J5LgotICogCi0gKiBOT1RFIzI6IHdlIHJlbHkgb24gdGhlIGZhY3QgdGhhdCB0aGUgbWVtb3J5IGNodW5rcyBhcmUgb3JkZXJlZCBieQotICogc3RhcnQgcGZuIG51bWJlciBkdXJpbmcgc2V0dXAuCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBnZXRfemhvbGVzX2luaXQodm9pZCkKLXsKLQlpbnQgbmlkOwotCWludCBjOwotCWludCBmaXJzdDsKLQl1bnNpZ25lZCBsb25nIGVuZCA9IDA7Ci0KLQlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKLQkJZmlyc3QgPSAxOwotCQlmb3IgKGMgPSAwOyBjIDwgbnVtX21lbW9yeV9jaHVua3M7IGMrKyl7Ci0JCQlpZiAobm9kZV9tZW1vcnlfY2h1bmtbY10ubmlkID09IG5pZCkgewotCQkJCWlmIChmaXJzdCkgewotCQkJCQllbmQgPSBub2RlX21lbW9yeV9jaHVua1tjXS5lbmRfcGZuOwotCQkJCQlmaXJzdCA9IDA7Ci0KLQkJCQl9IGVsc2UgewotCQkJCQkvKiBSZWNvcmQgYW55IGdhcCBiZXR3ZWVuIHRoaXMgY2h1bmsKLQkJCQkJICogYW5kIHRoZSBwcmV2aW91cyBjaHVuayBvbiB0aGlzIG5vZGUKLQkJCQkJICogYWdhaW5zdCB0aGUgem9uZXMgaXQgc3BhbnMuCi0JCQkJCSAqLwotCQkJCQljaHVua190b196b25lcyhlbmQsCi0JCQkJCQlub2RlX21lbW9yeV9jaHVua1tjXS5zdGFydF9wZm4sCi0JCQkJCQkmemhvbGVzX3NpemVbbmlkICogTUFYX05SX1pPTkVTXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQotCi11bnNpZ25lZCBsb25nICogX19pbml0IGdldF96aG9sZXNfc2l6ZShpbnQgbmlkKQotewotCWlmICghemhvbGVzX3NpemVfaW5pdCkgewotCQl6aG9sZXNfc2l6ZV9pbml0Kys7Ci0JCWdldF96aG9sZXNfaW5pdCgpOwotCX0KLQlpZiAobmlkID49IE1BWF9OVU1OT0RFUyB8fCAhbm9kZV9vbmxpbmUobmlkKSkKLQkJcHJpbnRrKCIlczogbmlkID0gJWQgaXMgaW52YWxpZC9vZmZsaW5lLiBudW1fb25saW5lX25vZGVzID0gJWQiLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBuaWQsIG51bV9vbmxpbmVfbm9kZXMoKSk7Ci0JcmV0dXJuICZ6aG9sZXNfc2l6ZVtuaWQgKiBNQVhfTlJfWk9ORVNdOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zdGFja3RyYWNlLmMgYi9hcmNoL2kzODYva2VybmVsL3N0YWNrdHJhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYyYTAzNy4uMDAwMDAwMAotLS0gYS9hcmNoL2kzODYva2VybmVsL3N0YWNrdHJhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBhcmNoL2kzODYva2VybmVsL3N0YWNrdHJhY2UuYwotICoKLSAqIFN0YWNrIHRyYWNlIG1hbmFnZW1lbnQgZnVuY3Rpb25zCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNiBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhY2t0cmFjZS5oPgotCi1zdGF0aWMgaW5saW5lIGludCB2YWxpZF9zdGFja19wdHIoc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbywgdm9pZCAqcCkKLXsKLQlyZXR1cm4JcCA+ICh2b2lkICopdGluZm8gJiYKLQkJcCA8ICh2b2lkICopdGluZm8gKyBUSFJFQURfU0laRSAtIDM7Ci19Ci0KLS8qCi0gKiBTYXZlIHN0YWNrLWJhY2t0cmFjZSBhZGRyZXNzZXMgaW50byBhIHN0YWNrX3RyYWNlIGJ1ZmZlcjoKLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCi1zYXZlX2NvbnRleHRfc3RhY2soc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSwgdW5zaWduZWQgaW50IHNraXAsCi0JCSAgIHN0cnVjdCB0aHJlYWRfaW5mbyAqdGluZm8sIHVuc2lnbmVkIGxvbmcgKnN0YWNrLAotCQkgICB1bnNpZ25lZCBsb25nIGVicCkKLXsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0KLSNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgotCXdoaWxlICh2YWxpZF9zdGFja19wdHIodGluZm8sICh2b2lkICopZWJwKSkgewotCQlhZGRyID0gKih1bnNpZ25lZCBsb25nICopKGVicCArIDQpOwotCQlpZiAoIXNraXApCi0JCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IGFkZHI7Ci0JCWVsc2UKLQkJCXNraXAtLTsKLQkJaWYgKHRyYWNlLT5ucl9lbnRyaWVzID49IHRyYWNlLT5tYXhfZW50cmllcykKLQkJCWJyZWFrOwotCQkvKgotCQkgKiBicmVhayBvdXQgb2YgcmVjdXJzaXZlIGVudHJpZXMgKHN1Y2ggYXMKLQkJICogZW5kX29mX3N0YWNrX3N0b3BfdW53aW5kX2Z1bmN0aW9uKToKLQkgCSAqLwotCQlpZiAoZWJwID09ICoodW5zaWduZWQgbG9uZyAqKWVicCkKLQkJCWJyZWFrOwotCi0JCWVicCA9ICoodW5zaWduZWQgbG9uZyAqKWVicDsKLQl9Ci0jZWxzZQotCXdoaWxlICh2YWxpZF9zdGFja19wdHIodGluZm8sIHN0YWNrKSkgewotCQlhZGRyID0gKnN0YWNrKys7Ci0JCWlmIChfX2tlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpIHsKLQkJCWlmICghc2tpcCkKLQkJCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IGFkZHI7Ci0JCQllbHNlCi0JCQkJc2tpcC0tOwotCQkJaWYgKHRyYWNlLT5ucl9lbnRyaWVzID49IHRyYWNlLT5tYXhfZW50cmllcykKLQkJCQlicmVhazsKLQkJfQotCX0KLSNlbmRpZgotCi0JcmV0dXJuIGVicDsKLX0KLQotLyoKLSAqIFNhdmUgc3RhY2stYmFja3RyYWNlIGFkZHJlc3NlcyBpbnRvIGEgc3RhY2tfdHJhY2UgYnVmZmVyLgotICogSWYgYWxsX2NvbnRleHRzIGlzIHNldCwgYWxsIGNvbnRleHRzIChoYXJkaXJxLCBzb2Z0aXJxIGFuZCBwcm9jZXNzKQotICogYXJlIHNhdmVkLiBJZiBub3Qgc2V0IHRoZW4gb25seSB0aGUgY3VycmVudCBjb250ZXh0IGlzIHNhdmVkLgotICovCi12b2lkIHNhdmVfc3RhY2tfdHJhY2Uoc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSwKLQkJICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgYWxsX2NvbnRleHRzLAotCQkgICAgICB1bnNpZ25lZCBpbnQgc2tpcCkKLXsKLQl1bnNpZ25lZCBsb25nIGVicDsKLQl1bnNpZ25lZCBsb25nICpzdGFjayA9ICZlYnA7Ci0KLQlXQVJOX09OKHRyYWNlLT5ucl9lbnRyaWVzIHx8ICF0cmFjZS0+bWF4X2VudHJpZXMpOwotCi0JaWYgKCF0YXNrIHx8IHRhc2sgPT0gY3VycmVudCkgewotCQkvKiBHcmFiIGVicCByaWdodCBmcm9tIG91ciByZWdzOiAqLwotCQlhc20gKCJtb3ZsICUlZWJwLCAlMCIgOiAiPXIiIChlYnApKTsKLQl9IGVsc2UgewotCQkvKiBlYnAgaXMgdGhlIGxhc3QgcmVnIHB1c2hlZCBieSBzd2l0Y2hfdG8oKTogKi8KLQkJZWJwID0gKih1bnNpZ25lZCBsb25nICopIHRhc2stPnRocmVhZC5lc3A7Ci0JfQotCi0Jd2hpbGUgKDEpIHsKLQkJc3RydWN0IHRocmVhZF9pbmZvICpjb250ZXh0ID0gKHN0cnVjdCB0aHJlYWRfaW5mbyAqKQotCQkJCSgodW5zaWduZWQgbG9uZylzdGFjayAmICh+KFRIUkVBRF9TSVpFIC0gMSkpKTsKLQotCQllYnAgPSBzYXZlX2NvbnRleHRfc3RhY2sodHJhY2UsIHNraXAsIGNvbnRleHQsIHN0YWNrLCBlYnApOwotCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopY29udGV4dC0+cHJldmlvdXNfZXNwOwotCQlpZiAoIWFsbF9jb250ZXh0cyB8fCAhc3RhY2sgfHwKLQkJCQl0cmFjZS0+bnJfZW50cmllcyA+PSB0cmFjZS0+bWF4X2VudHJpZXMpCi0JCQlicmVhazsKLQkJdHJhY2UtPmVudHJpZXNbdHJhY2UtPm5yX2VudHJpZXMrK10gPSBVTE9OR19NQVg7Ci0JCWlmICh0cmFjZS0+bnJfZW50cmllcyA+PSB0cmFjZS0+bWF4X2VudHJpZXMpCi0JCQlicmVhazsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZS5TIGIvYXJjaC9pMzg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKaW5kZXggZGQ2M2Q0Ny4uN2U2MzlmNyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKQEAgLTMxNywzICszMTcsNCBAQAogCS5sb25nIHN5c190ZWUJCQkvKiAzMTUgKi8KIAkubG9uZyBzeXNfdm1zcGxpY2UKIAkubG9uZyBzeXNfbW92ZV9wYWdlcworCS5sb25nIHN5c19nZXRjcHUKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMKaW5kZXggMTMwMmU0YS4uODY5NDRhYyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90aW1lLmMKQEAgLTEzMCwxOCArMTMwLDMzIEBACiAKIGludCB0aW1lcl9hY2s7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19TTVApICYmIGRlZmluZWQoQ09ORklHX0ZSQU1FX1BPSU5URVIpCiB1bnNpZ25lZCBsb25nIHByb2ZpbGVfcGMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBwYyA9IGluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7CiAKLQlpZiAoIXVzZXJfbW9kZV92bShyZWdzKSAmJiBpbl9sb2NrX2Z1bmN0aW9ucyhwYykpCisjaWZkZWYgQ09ORklHX1NNUAorCWlmICghdXNlcl9tb2RlX3ZtKHJlZ3MpICYmIGluX2xvY2tfZnVuY3Rpb25zKHBjKSkgeworI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCiAJCXJldHVybiAqKHVuc2lnbmVkIGxvbmcgKikocmVncy0+ZWJwICsgNCk7Ci0KKyNlbHNlCisJCXVuc2lnbmVkIGxvbmcgKnNwOworCQlpZiAoKHJlZ3MtPnhjcyAmIDMpID09IDApCisJCQlzcCA9ICh1bnNpZ25lZCBsb25nICopJnJlZ3MtPmVzcDsKKwkJZWxzZQorCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKXJlZ3MtPmVzcDsKKwkJLyogUmV0dXJuIGFkZHJlc3MgaXMgZWl0aGVyIGRpcmVjdGx5IGF0IHN0YWNrIHBvaW50ZXIKKwkJICAgb3IgYWJvdmUgYSBzYXZlZCBlZmxhZ3MuIEVmbGFncyBoYXMgYml0cyAyMi0zMSB6ZXJvLAorCQkgICBrZXJuZWwgYWRkcmVzc2VzIGRvbid0LiAqLworIAkJaWYgKHNwWzBdID4+IDIyKQorCQkJcmV0dXJuIHNwWzBdOworCQlpZiAoc3BbMV0gPj4gMjIpCisJCQlyZXR1cm4gc3BbMV07CisjZW5kaWYKKwl9CisjZW5kaWYKIAlyZXR1cm4gcGM7CiB9CiBFWFBPUlRfU1lNQk9MKHByb2ZpbGVfcGMpOwotI2VuZGlmCiAKIC8qCiAgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBhYm92ZSwgZXhjZXB0IHdlIF9hbHNvXyBzYXZlIHRoZSBjdXJyZW50CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RvcG9sb2d5LmMgYi9hcmNoL2kzODYva2VybmVsL3RvcG9sb2d5LmMKaW5kZXggZTJlMjgxZC4uMDdkNmRhMyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90b3BvbG9neS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgogI2luY2x1ZGUgPGFzbS9jcHUuaD4KIAogc3RhdGljIHN0cnVjdCBpMzg2X2NwdSBjcHVfZGV2aWNlc1tOUl9DUFVTXTsKQEAgLTU1LDM0ICs1NiwxOCBAQAogRVhQT1JUX1NZTUJPTChhcmNoX3VucmVnaXN0ZXJfY3B1KTsKICNlbmRpZiAvKkNPTkZJR19IT1RQTFVHX0NQVSovCiAKLQorc3RhdGljIGludCBfX2luaXQgdG9wb2xvZ3lfaW5pdCh2b2lkKQoreworCWludCBpOwogCiAjaWZkZWYgQ09ORklHX05VTUEKLSNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KLQotc3RhdGljIGludCBfX2luaXQgdG9wb2xvZ3lfaW5pdCh2b2lkKQotewotCWludCBpOwotCiAJZm9yX2VhY2hfb25saW5lX25vZGUoaSkKIAkJcmVnaXN0ZXJfb25lX25vZGUoaSk7Ci0KLQlmb3JfZWFjaF9wcmVzZW50X2NwdShpKQotCQlhcmNoX3JlZ2lzdGVyX2NwdShpKTsKLQlyZXR1cm4gMDsKLX0KLQotI2Vsc2UgLyogIUNPTkZJR19OVU1BICovCi0KLXN0YXRpYyBpbnQgX19pbml0IHRvcG9sb2d5X2luaXQodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpCi0JCWFyY2hfcmVnaXN0ZXJfY3B1KGkpOwotCXJldHVybiAwOwotfQotCiAjZW5kaWYgLyogQ09ORklHX05VTUEgKi8KIAorCWZvcl9lYWNoX3ByZXNlbnRfY3B1KGkpCisJCWFyY2hfcmVnaXN0ZXJfY3B1KGkpOworCXJldHVybiAwOworfQorCiBzdWJzeXNfaW5pdGNhbGwodG9wb2xvZ3lfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMgYi9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKaW5kZXggNGZjYzY2OTAuLmExMzAzN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC91bndpbmQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKICNpZmRlZiBDT05GSUdfRUlTQQogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgpAQCAtNDAsNyArNDEsNiBAQAogCiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vZGVidWdyZWcuaD4KQEAgLTUxLDYgKzUxLDcgQEAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KICNpbmNsdWRlIDxhc20va2RlYnVnLmg+CisjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCkBAIC0xMTgsMjYgKzExOSwxNiBAQAogCQlwIDwgKHZvaWQgKil0aW5mbyArIFRIUkVBRF9TSVpFIC0gMzsKIH0KIAotLyoKLSAqIFByaW50IG9uZSBhZGRyZXNzL3N5bWJvbCBlbnRyaWVzIHBlciBsaW5lLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfYWRkcl9hbmRfc3ltYm9sKHVuc2lnbmVkIGxvbmcgYWRkciwgY2hhciAqbG9nX2x2bCkKLXsKLQlwcmludGsoIiBbPCUwOGx4Pl0gIiwgYWRkcik7Ci0KLQlwcmludF9zeW1ib2woIiVzXG4iLCBhZGRyKTsKLX0KLQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHByaW50X2NvbnRleHRfc3RhY2soc3RydWN0IHRocmVhZF9pbmZvICp0aW5mbywKIAkJCQl1bnNpZ25lZCBsb25nICpzdGFjaywgdW5zaWduZWQgbG9uZyBlYnAsCi0JCQkJY2hhciAqbG9nX2x2bCkKKwkJCQlzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgKm9wcywgdm9pZCAqZGF0YSkKIHsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAKICNpZmRlZglDT05GSUdfRlJBTUVfUE9JTlRFUgogCXdoaWxlICh2YWxpZF9zdGFja19wdHIodGluZm8sICh2b2lkICopZWJwKSkgewogCQlhZGRyID0gKih1bnNpZ25lZCBsb25nICopKGVicCArIDQpOwotCQlwcmludF9hZGRyX2FuZF9zeW1ib2woYWRkciwgbG9nX2x2bCk7CisJCW9wcy0+YWRkcmVzcyhkYXRhLCBhZGRyKTsKIAkJLyoKIAkJICogYnJlYWsgb3V0IG9mIHJlY3Vyc2l2ZSBlbnRyaWVzIChzdWNoIGFzCiAJCSAqIGVuZF9vZl9zdGFja19zdG9wX3Vud2luZF9mdW5jdGlvbik6CkBAIC0xNTAsMzAgKzE0MSwzNyBAQAogCXdoaWxlICh2YWxpZF9zdGFja19wdHIodGluZm8sIHN0YWNrKSkgewogCQlhZGRyID0gKnN0YWNrKys7CiAJCWlmIChfX2tlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpCi0JCQlwcmludF9hZGRyX2FuZF9zeW1ib2woYWRkciwgbG9nX2x2bCk7CisJCQlvcHMtPmFkZHJlc3MoZGF0YSwgYWRkcik7CiAJfQogI2VuZGlmCiAJcmV0dXJuIGVicDsKIH0KIAorc3RydWN0IG9wc19hbmRfZGF0YSB7CisJc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHM7CisJdm9pZCAqZGF0YTsKK307CisKIHN0YXRpYyBhc21saW5rYWdlIGludAotc2hvd190cmFjZV91bndpbmQoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvLCB2b2lkICpsb2dfbHZsKQorZHVtcF90cmFjZV91bndpbmQoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvLCB2b2lkICpkYXRhKQogeworCXN0cnVjdCBvcHNfYW5kX2RhdGEgKm9hZCA9IChzdHJ1Y3Qgb3BzX2FuZF9kYXRhICopZGF0YTsKIAlpbnQgbiA9IDA7CiAKIAl3aGlsZSAodW53aW5kKGluZm8pID09IDAgJiYgVU5XX1BDKGluZm8pKSB7CiAJCW4rKzsKLQkJcHJpbnRfYWRkcl9hbmRfc3ltYm9sKFVOV19QQyhpbmZvKSwgbG9nX2x2bCk7CisJCW9hZC0+b3BzLT5hZGRyZXNzKG9hZC0+ZGF0YSwgVU5XX1BDKGluZm8pKTsKIAkJaWYgKGFyY2hfdW53X3VzZXJfbW9kZShpbmZvKSkKIAkJCWJyZWFrOwogCX0KIAlyZXR1cm4gbjsKIH0KIAotc3RhdGljIHZvaWQgc2hvd190cmFjZV9sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhY2ssIGNoYXIgKmxvZ19sdmwpCit2b2lkIGR1bXBfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKwkgICAgICAgIHVuc2lnbmVkIGxvbmcgKnN0YWNrLAorCQlzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgKm9wcywgdm9pZCAqZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIGVicDsKKwl1bnNpZ25lZCBsb25nIGVicCA9IDA7CiAKIAlpZiAoIXRhc2spCiAJCXRhc2sgPSBjdXJyZW50OwpAQCAtMTgxLDU0ICsxNzksMTE2IEBACiAJaWYgKGNhbGxfdHJhY2UgPj0gMCkgewogCQlpbnQgdW53X3JldCA9IDA7CiAJCXN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyBpbmZvOworCQlzdHJ1Y3Qgb3BzX2FuZF9kYXRhIG9hZCA9IHsgLm9wcyA9IG9wcywgLmRhdGEgPSBkYXRhIH07CiAKIAkJaWYgKHJlZ3MpIHsKIAkJCWlmICh1bndpbmRfaW5pdF9mcmFtZV9pbmZvKCZpbmZvLCB0YXNrLCByZWdzKSA9PSAwKQotCQkJCXVud19yZXQgPSBzaG93X3RyYWNlX3Vud2luZCgmaW5mbywgbG9nX2x2bCk7CisJCQkJdW53X3JldCA9IGR1bXBfdHJhY2VfdW53aW5kKCZpbmZvLCAmb2FkKTsKIAkJfSBlbHNlIGlmICh0YXNrID09IGN1cnJlbnQpCi0JCQl1bndfcmV0ID0gdW53aW5kX2luaXRfcnVubmluZygmaW5mbywgc2hvd190cmFjZV91bndpbmQsIGxvZ19sdmwpOworCQkJdW53X3JldCA9IHVud2luZF9pbml0X3J1bm5pbmcoJmluZm8sIGR1bXBfdHJhY2VfdW53aW5kLCAmb2FkKTsKIAkJZWxzZSB7CiAJCQlpZiAodW53aW5kX2luaXRfYmxvY2tlZCgmaW5mbywgdGFzaykgPT0gMCkKLQkJCQl1bndfcmV0ID0gc2hvd190cmFjZV91bndpbmQoJmluZm8sIGxvZ19sdmwpOworCQkJCXVud19yZXQgPSBkdW1wX3RyYWNlX3Vud2luZCgmaW5mbywgJm9hZCk7CiAJCX0KIAkJaWYgKHVud19yZXQgPiAwKSB7CiAJCQlpZiAoY2FsbF90cmFjZSA9PSAxICYmICFhcmNoX3Vud191c2VyX21vZGUoJmluZm8pKSB7Ci0JCQkJcHJpbnRfc3ltYm9sKCJEV0FSRjIgdW53aW5kZXIgc3R1Y2sgYXQgJXNcbiIsCisJCQkJb3BzLT53YXJuaW5nX3N5bWJvbChkYXRhLCAiRFdBUkYyIHVud2luZGVyIHN0dWNrIGF0ICVzXG4iLAogCQkJCQkgICAgIFVOV19QQygmaW5mbykpOwogCQkJCWlmIChVTldfU1AoJmluZm8pID49IFBBR0VfT0ZGU0VUKSB7Ci0JCQkJCXByaW50aygiTGVmdG92ZXIgaW5leGFjdCBiYWNrdHJhY2U6XG4iKTsKKwkJCQkJb3BzLT53YXJuaW5nKGRhdGEsICJMZWZ0b3ZlciBpbmV4YWN0IGJhY2t0cmFjZTpcbiIpOwogCQkJCQlzdGFjayA9ICh2b2lkICopVU5XX1NQKCZpbmZvKTsKKwkJCQkJaWYgKCFzdGFjaykKKwkJCQkJCXJldHVybjsKKwkJCQkJZWJwID0gVU5XX0ZQKCZpbmZvKTsKIAkJCQl9IGVsc2UKLQkJCQkJcHJpbnRrKCJGdWxsIGluZXhhY3QgYmFja3RyYWNlIGFnYWluOlxuIik7CisJCQkJCW9wcy0+d2FybmluZyhkYXRhLCAiRnVsbCBpbmV4YWN0IGJhY2t0cmFjZSBhZ2FpbjpcbiIpOwogCQkJfSBlbHNlIGlmIChjYWxsX3RyYWNlID49IDEpCiAJCQkJcmV0dXJuOwogCQkJZWxzZQotCQkJCXByaW50aygiRnVsbCBpbmV4YWN0IGJhY2t0cmFjZSBhZ2FpbjpcbiIpOworCQkJCW9wcy0+d2FybmluZyhkYXRhLCAiRnVsbCBpbmV4YWN0IGJhY2t0cmFjZSBhZ2FpbjpcbiIpOwogCQl9IGVsc2UKLQkJCXByaW50aygiSW5leGFjdCBiYWNrdHJhY2U6XG4iKTsKKwkJCW9wcy0+d2FybmluZyhkYXRhLCAiSW5leGFjdCBiYWNrdHJhY2U6XG4iKTsKKwl9CisJaWYgKCFzdGFjaykgeworCQl1bnNpZ25lZCBsb25nIGR1bW15OworCQlzdGFjayA9ICZkdW1teTsKKwkJaWYgKHRhc2sgJiYgdGFzayAhPSBjdXJyZW50KQorCQkJc3RhY2sgPSAodW5zaWduZWQgbG9uZyAqKXRhc2stPnRocmVhZC5lc3A7CiAJfQogCi0JaWYgKHRhc2sgPT0gY3VycmVudCkgewotCQkvKiBHcmFiIGVicCByaWdodCBmcm9tIG91ciByZWdzICovCi0JCWFzbSAoIm1vdmwgJSVlYnAsICUwIiA6ICI9ciIgKGVicCkgOiApOwotCX0gZWxzZSB7Ci0JCS8qIGVicCBpcyB0aGUgbGFzdCByZWcgcHVzaGVkIGJ5IHN3aXRjaF90byAqLwotCQllYnAgPSAqKHVuc2lnbmVkIGxvbmcgKikgdGFzay0+dGhyZWFkLmVzcDsKKyNpZmRlZiBDT05GSUdfRlJBTUVfUE9JTlRFUgorCWlmICghZWJwKSB7CisJCWlmICh0YXNrID09IGN1cnJlbnQpIHsKKwkJCS8qIEdyYWIgZWJwIHJpZ2h0IGZyb20gb3VyIHJlZ3MgKi8KKwkJCWFzbSAoIm1vdmwgJSVlYnAsICUwIiA6ICI9ciIgKGVicCkgOiApOworCQl9IGVsc2UgeworCQkJLyogZWJwIGlzIHRoZSBsYXN0IHJlZyBwdXNoZWQgYnkgc3dpdGNoX3RvICovCisJCQllYnAgPSAqKHVuc2lnbmVkIGxvbmcgKikgdGFzay0+dGhyZWFkLmVzcDsKKwkJfQogCX0KKyNlbmRpZgogCiAJd2hpbGUgKDEpIHsKIAkJc3RydWN0IHRocmVhZF9pbmZvICpjb250ZXh0OwogCQljb250ZXh0ID0gKHN0cnVjdCB0aHJlYWRfaW5mbyAqKQogCQkJKCh1bnNpZ25lZCBsb25nKXN0YWNrICYgKH4oVEhSRUFEX1NJWkUgLSAxKSkpOwotCQllYnAgPSBwcmludF9jb250ZXh0X3N0YWNrKGNvbnRleHQsIHN0YWNrLCBlYnAsIGxvZ19sdmwpOworCQllYnAgPSBwcmludF9jb250ZXh0X3N0YWNrKGNvbnRleHQsIHN0YWNrLCBlYnAsIG9wcywgZGF0YSk7CisJCS8qIFNob3VsZCBiZSBhZnRlciB0aGUgbGluZSBiZWxvdywgYnV0IHNvbWV3aGVyZQorCQkgICBpbiBlYXJseSBib290IGNvbnRleHQgY29tZXMgb3V0IGNvcnJ1cHRlZCBhbmQgd2UKKwkJICAgY2FuJ3QgcmVmZXJlbmNlIGl0IC1BSyAqLworCQlpZiAob3BzLT5zdGFjayhkYXRhLCAiSVJRIikgPCAwKQorCQkJYnJlYWs7CiAJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcqKWNvbnRleHQtPnByZXZpb3VzX2VzcDsKIAkJaWYgKCFzdGFjaykKIAkJCWJyZWFrOwotCQlwcmludGsoIiVzID09PT09PT09PT09PT09PT09PT09PT09XG4iLCBsb2dfbHZsKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MKGR1bXBfdHJhY2UpOwogCi12b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyAqIHN0YWNrKQorc3RhdGljIHZvaWQKK3ByaW50X3RyYWNlX3dhcm5pbmdfc3ltYm9sKHZvaWQgKmRhdGEsIGNoYXIgKm1zZywgdW5zaWduZWQgbG9uZyBzeW1ib2wpCit7CisJcHJpbnRrKGRhdGEpOworCXByaW50X3N5bWJvbChtc2csIHN5bWJvbCk7CisJcHJpbnRrKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF90cmFjZV93YXJuaW5nKHZvaWQgKmRhdGEsIGNoYXIgKm1zZykKK3sKKwlwcmludGsoIiVzJXNcbiIsIChjaGFyICopZGF0YSwgbXNnKTsKK30KKworc3RhdGljIGludCBwcmludF90cmFjZV9zdGFjayh2b2lkICpkYXRhLCBjaGFyICpuYW1lKQoreworCXJldHVybiAwOworfQorCisvKgorICogUHJpbnQgb25lIGFkZHJlc3Mvc3ltYm9sIGVudHJpZXMgcGVyIGxpbmUuCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X3RyYWNlX2FkZHJlc3Modm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXByaW50aygiJXMgWzwlMDhseD5dICIsIChjaGFyICopZGF0YSwgYWRkcik7CisJcHJpbnRfc3ltYm9sKCIlc1xuIiwgYWRkcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgcHJpbnRfdHJhY2Vfb3BzID0geworCS53YXJuaW5nID0gcHJpbnRfdHJhY2Vfd2FybmluZywKKwkud2FybmluZ19zeW1ib2wgPSBwcmludF90cmFjZV93YXJuaW5nX3N5bWJvbCwKKwkuc3RhY2sgPSBwcmludF90cmFjZV9zdGFjaywKKwkuYWRkcmVzcyA9IHByaW50X3RyYWNlX2FkZHJlc3MsCit9OworCitzdGF0aWMgdm9pZAorc2hvd190cmFjZV9sb2dfbHZsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCSAgIHVuc2lnbmVkIGxvbmcgKiBzdGFjaywgY2hhciAqbG9nX2x2bCkKK3sKKwlkdW1wX3RyYWNlKHRhc2ssIHJlZ3MsIHN0YWNrLCAmcHJpbnRfdHJhY2Vfb3BzLCBsb2dfbHZsKTsKKwlwcmludGsoIiVzID09PT09PT09PT09PT09PT09PT09PT09XG4iLCBsb2dfbHZsKTsKK30KKwordm9pZCBzaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCXVuc2lnbmVkIGxvbmcgKiBzdGFjaykKIHsKIAlzaG93X3RyYWNlX2xvZ19sdmwodGFzaywgcmVncywgc3RhY2ssICIiKTsKIH0KQEAgLTI5MSw4ICszNTEsOSBAQAogCQlzcyA9IHJlZ3MtPnhzcyAmIDB4ZmZmZjsKIAl9CiAJcHJpbnRfbW9kdWxlcygpOwotCXByaW50ayhLRVJOX0VNRVJHICJDUFU6ICAgICVkXG5FSVA6ICAgICUwNHg6WzwlMDhseD5dICAgICVzIFZMSVxuIgotCQkJIkVGTEFHUzogJTA4bHggICAoJXMgJS4qcykgXG4iLAorCXByaW50ayhLRVJOX0VNRVJHICJDUFU6ICAgICVkXG4iCisJCUtFUk5fRU1FUkcgIkVJUDogICAgJTA0eDpbPCUwOGx4Pl0gICAgJXMgVkxJXG4iCisJCUtFUk5fRU1FUkcgIkVGTEFHUzogJTA4bHggICAoJXMgJS4qcylcbiIsCiAJCXNtcF9wcm9jZXNzb3JfaWQoKSwgMHhmZmZmICYgcmVncy0+eGNzLCByZWdzLT5laXAsCiAJCXByaW50X3RhaW50ZWQoKSwgcmVncy0+ZWZsYWdzLCBzeXN0ZW1fdXRzbmFtZS5yZWxlYXNlLAogCQkoaW50KXN0cmNzcG4oc3lzdGVtX3V0c25hbWUudmVyc2lvbiwgIiAiKSwKQEAgLTM0OCw3ICs0MDksNyBAQAogCiAJaWYgKGVpcCA8IFBBR0VfT0ZGU0VUKQogCQlyZXR1cm47Ci0JaWYgKF9fZ2V0X3VzZXIodWQyLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopZWlwKSkKKwlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3MoKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKWVpcCwgdWQyKSkKIAkJcmV0dXJuOwogCWlmICh1ZDIgIT0gMHgwYjBmKQogCQlyZXR1cm47CkBAIC0zNjEsNyArNDIyLDggQEAKIAkJY2hhciAqZmlsZTsKIAkJY2hhciBjOwogCi0JCWlmIChfX2dldF91c2VyKGxpbmUsICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikoZWlwICsgMikpKQorCQlpZiAocHJvYmVfa2VybmVsX2FkZHJlc3MoKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKShlaXAgKyAyKSwKKwkJCQkJbGluZSkpCiAJCQlicmVhazsKIAkJaWYgKF9fZ2V0X3VzZXIoZmlsZSwgKGNoYXIgKiBfX3VzZXIgKikoZWlwICsgNCkpIHx8CiAJCSAgICAodW5zaWduZWQgbG9uZylmaWxlIDwgUEFHRV9PRkZTRVQgfHwgX19nZXRfdXNlcihjLCBmaWxlKSkKQEAgLTYzNCwxOCArNjk2LDI0IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBtZW1fcGFyaXR5X2Vycm9yKHVuc2lnbmVkIGNoYXIgcmVhc29uLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCitzdGF0aWMgX19rcHJvYmVzIHZvaWQKK21lbV9wYXJpdHlfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICogcmVncykKIHsKLQlwcmludGsoS0VSTl9FTUVSRyAiVWhodWguIE5NSSByZWNlaXZlZC4gRGF6ZWQgYW5kIGNvbmZ1c2VkLCBidXQgdHJ5aW5nICIKLQkJCSJ0byBjb250aW51ZVxuIik7CisJcHJpbnRrKEtFUk5fRU1FUkcgIlVoaHVoLiBOTUkgcmVjZWl2ZWQgZm9yIHVua25vd24gcmVhc29uICUwMnggb24gIgorCQkiQ1BVICVkLlxuIiwgcmVhc29uLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXByaW50ayhLRVJOX0VNRVJHICJZb3UgcHJvYmFibHkgaGF2ZSBhIGhhcmR3YXJlIHByb2JsZW0gd2l0aCB5b3VyIFJBTSAiCiAJCQkiY2hpcHNcbiIpOworCWlmIChwYW5pY19vbl91bnJlY292ZXJlZF9ubWkpCisgICAgICAgICAgICAgICAgcGFuaWMoIk5NSTogTm90IGNvbnRpbnVpbmciKTsKKworCXByaW50ayhLRVJOX0VNRVJHICJEYXplZCBhbmQgY29uZnVzZWQsIGJ1dCB0cnlpbmcgdG8gY29udGludWVcbiIpOwogCiAJLyogQ2xlYXIgYW5kIGRpc2FibGUgdGhlIG1lbW9yeSBwYXJpdHkgZXJyb3IgbGluZS4gKi8KIAljbGVhcl9tZW1fZXJyb3IocmVhc29uKTsKIH0KIAotc3RhdGljIHZvaWQgaW9fY2hlY2tfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3N0YXRpYyBfX2twcm9iZXMgdm9pZAoraW9fY2hlY2tfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICogcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIGk7CiAKQEAgLTY2MSw3ICs3MjksOCBAQAogCW91dGIocmVhc29uLCAweDYxKTsKIH0KIAotc3RhdGljIHZvaWQgdW5rbm93bl9ubWlfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3N0YXRpYyBfX2twcm9iZXMgdm9pZAordW5rbm93bl9ubWlfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICogcmVncykKIHsKICNpZmRlZiBDT05GSUdfTUNBCiAJLyogTWlnaHQgYWN0dWFsbHkgYmUgYWJsZSB0byBmaWd1cmUgb3V0IHdoYXQgdGhlIGd1aWx0eSBwYXJ0eQpAQCAtNjcxLDE1ICs3NDAsMTggQEAKIAkJcmV0dXJuOwogCX0KICNlbmRpZgotCXByaW50aygiVWhodWguIE5NSSByZWNlaXZlZCBmb3IgdW5rbm93biByZWFzb24gJTAyeCBvbiBDUFUgJWQuXG4iLAotCQlyZWFzb24sIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JcHJpbnRrKCJEYXplZCBhbmQgY29uZnVzZWQsIGJ1dCB0cnlpbmcgdG8gY29udGludWVcbiIpOwotCXByaW50aygiRG8geW91IGhhdmUgYSBzdHJhbmdlIHBvd2VyIHNhdmluZyBtb2RlIGVuYWJsZWQ/XG4iKTsKKwlwcmludGsoS0VSTl9FTUVSRyAiVWhodWguIE5NSSByZWNlaXZlZCBmb3IgdW5rbm93biByZWFzb24gJTAyeCBvbiAiCisJCSJDUFUgJWQuXG4iLCByZWFzb24sIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJcHJpbnRrKEtFUk5fRU1FUkcgIkRvIHlvdSBoYXZlIGEgc3RyYW5nZSBwb3dlciBzYXZpbmcgbW9kZSBlbmFibGVkP1xuIik7CisJaWYgKHBhbmljX29uX3VucmVjb3ZlcmVkX25taSkKKyAgICAgICAgICAgICAgICBwYW5pYygiTk1JOiBOb3QgY29udGludWluZyIpOworCisJcHJpbnRrKEtFUk5fRU1FUkcgIkRhemVkIGFuZCBjb25mdXNlZCwgYnV0IHRyeWluZyB0byBjb250aW51ZVxuIik7CiB9CiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobm1pX3ByaW50X2xvY2spOwogCi12b2lkIGRpZV9ubWkgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBjb25zdCBjaGFyICptc2cpCit2b2lkIF9fa3Byb2JlcyBkaWVfbm1pKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBjb25zdCBjaGFyICptc2cpCiB7CiAJaWYgKG5vdGlmeV9kaWUoRElFX05NSVdBVENIRE9HLCBtc2csIHJlZ3MsIDAsIDIsIFNJR0lOVCkgPT0KIAkgICAgTk9USUZZX1NUT1ApCkBAIC03MTEsNyArNzgzLDcgQEAKIAlkb19leGl0KFNJR1NFR1YpOwogfQogCi1zdGF0aWMgdm9pZCBkZWZhdWx0X2RvX25taShzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCitzdGF0aWMgX19rcHJvYmVzIHZvaWQgZGVmYXVsdF9kb19ubWkoc3RydWN0IHB0X3JlZ3MgKiByZWdzKQogewogCXVuc2lnbmVkIGNoYXIgcmVhc29uID0gMDsKIApAQCAtNzI4LDEyICs4MDAsMTIgQEAKIAkJICogT2ssIHNvIHRoaXMgaXMgbm9uZSBvZiB0aGUgZG9jdW1lbnRlZCBOTUkgc291cmNlcywKIAkJICogc28gaXQgbXVzdCBiZSB0aGUgTk1JIHdhdGNoZG9nLgogCQkgKi8KLQkJaWYgKG5taV93YXRjaGRvZykgewotCQkJbm1pX3dhdGNoZG9nX3RpY2socmVncyk7CisJCWlmIChubWlfd2F0Y2hkb2dfdGljayhyZWdzLCByZWFzb24pKQogCQkJcmV0dXJuOwotCQl9CisJCWlmICghZG9fbm1pX2NhbGxiYWNrKHJlZ3MsIHNtcF9wcm9jZXNzb3JfaWQoKSkpCiAjZW5kaWYKLQkJdW5rbm93bl9ubWlfZXJyb3IocmVhc29uLCByZWdzKTsKKwkJCXVua25vd25fbm1pX2Vycm9yKHJlYXNvbiwgcmVncyk7CisKIAkJcmV0dXJuOwogCX0KIAlpZiAobm90aWZ5X2RpZShESUVfTk1JLCAibm1pIiwgcmVncywgcmVhc29uLCAyLCBTSUdJTlQpID09IE5PVElGWV9TVE9QKQpAQCAtNzQ5LDE0ICs4MjEsNyBAQAogCXJlYXNzZXJ0X25taSgpOwogfQogCi1zdGF0aWMgaW50IGR1bW15X25taV9jYWxsYmFjayhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGludCBjcHUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0gCi1zdGF0aWMgbm1pX2NhbGxiYWNrX3Qgbm1pX2NhbGxiYWNrID0gZHVtbXlfbm1pX2NhbGxiYWNrOwotIAotZmFzdGNhbGwgdm9pZCBkb19ubWkoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCitmYXN0Y2FsbCBfX2twcm9iZXMgdm9pZCBkb19ubWkoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBsb25nIGVycm9yX2NvZGUpCiB7CiAJaW50IGNwdTsKIApAQCAtNzY2LDI1ICs4MzEsMTEgQEAKIAogCSsrbm1pX2NvdW50KGNwdSk7CiAKLQlpZiAoIXJjdV9kZXJlZmVyZW5jZShubWlfY2FsbGJhY2spKHJlZ3MsIGNwdSkpCi0JCWRlZmF1bHRfZG9fbm1pKHJlZ3MpOworCWRlZmF1bHRfZG9fbm1pKHJlZ3MpOwogCiAJbm1pX2V4aXQoKTsKIH0KIAotdm9pZCBzZXRfbm1pX2NhbGxiYWNrKG5taV9jYWxsYmFja190IGNhbGxiYWNrKQotewotCXZtYWxsb2Nfc3luY19hbGwoKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIobm1pX2NhbGxiYWNrLCBjYWxsYmFjayk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzZXRfbm1pX2NhbGxiYWNrKTsKLQotdm9pZCB1bnNldF9ubWlfY2FsbGJhY2sodm9pZCkKLXsKLQlubWlfY2FsbGJhY2sgPSBkdW1teV9ubWlfY2FsbGJhY2s7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh1bnNldF9ubWlfY2FsbGJhY2spOwotCiAjaWZkZWYgQ09ORklHX0tQUk9CRVMKIGZhc3RjYWxsIHZvaWQgX19rcHJvYmVzIGRvX2ludDMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyb3JfY29kZSkKIHsKQEAgLTExMjQsMjAgKzExNzUsNiBAQAogfQogI2VuZGlmCiAKLSNkZWZpbmUgX3NldF9nYXRlKGdhdGVfYWRkcix0eXBlLGRwbCxhZGRyLHNlZykgXAotZG8geyBcCi0gIGludCBfX2QwLCBfX2QxOyBcCi0gIF9fYXNtX18gX192b2xhdGlsZV9fICgibW92dyAlJWR4LCUlYXhcblx0IiBcCi0JIm1vdncgJTQsJSVkeFxuXHQiIFwKLQkibW92bCAlJWVheCwlMFxuXHQiIFwKLQkibW92bCAlJWVkeCwlMSIgXAotCToiPW0iICgqKChsb25nICopIChnYXRlX2FkZHIpKSksIFwKLQkgIj1tIiAoKigxKyhsb25nICopIChnYXRlX2FkZHIpKSksICI9JmEiIChfX2QwKSwgIj0mZCIgKF9fZDEpIFwKLQk6ImkiICgoc2hvcnQpICgweDgwMDArKGRwbDw8MTMpKyh0eXBlPDw4KSkpLCBcCi0JICIzIiAoKGNoYXIgKikgKGFkZHIpKSwiMiIgKChzZWcpIDw8IDE2KSk7IFwKLX0gd2hpbGUgKDApCi0KLQogLyoKICAqIFRoaXMgbmVlZHMgdG8gdXNlICdpZHRfdGFibGUnIHJhdGhlciB0aGFuICdpZHQnLCBhbmQKICAqIHRodXMgdXNlIHRoZSBfbm9ubWFwcGVkXyB2ZXJzaW9uIG9mIHRoZSBJRFQsIGFzIHRoZQpAQCAtMTE0Niw3ICsxMTgzLDcgQEAKICAqLwogdm9pZCBzZXRfaW50cl9nYXRlKHVuc2lnbmVkIGludCBuLCB2b2lkICphZGRyKQogewotCV9zZXRfZ2F0ZShpZHRfdGFibGUrbiwxNCwwLGFkZHIsX19LRVJORUxfQ1MpOworCV9zZXRfZ2F0ZShuLCBERVNDVFlQRV9JTlQsIGFkZHIsIF9fS0VSTkVMX0NTKTsKIH0KIAogLyoKQEAgLTExNTQsMjIgKzExOTEsMjIgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIHNldF9zeXN0ZW1faW50cl9nYXRlKHVuc2lnbmVkIGludCBuLCB2b2lkICphZGRyKQogewotCV9zZXRfZ2F0ZShpZHRfdGFibGUrbiwgMTQsIDMsIGFkZHIsIF9fS0VSTkVMX0NTKTsKKwlfc2V0X2dhdGUobiwgREVTQ1RZUEVfSU5UIHwgREVTQ1RZUEVfRFBMMywgYWRkciwgX19LRVJORUxfQ1MpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0X3RyYXBfZ2F0ZSh1bnNpZ25lZCBpbnQgbiwgdm9pZCAqYWRkcikKIHsKLQlfc2V0X2dhdGUoaWR0X3RhYmxlK24sMTUsMCxhZGRyLF9fS0VSTkVMX0NTKTsKKwlfc2V0X2dhdGUobiwgREVTQ1RZUEVfVFJBUCwgYWRkciwgX19LRVJORUxfQ1MpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0X3N5c3RlbV9nYXRlKHVuc2lnbmVkIGludCBuLCB2b2lkICphZGRyKQogewotCV9zZXRfZ2F0ZShpZHRfdGFibGUrbiwxNSwzLGFkZHIsX19LRVJORUxfQ1MpOworCV9zZXRfZ2F0ZShuLCBERVNDVFlQRV9UUkFQIHwgREVTQ1RZUEVfRFBMMywgYWRkciwgX19LRVJORUxfQ1MpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0X3Rhc2tfZ2F0ZSh1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IGdkdF9lbnRyeSkKIHsKLQlfc2V0X2dhdGUoaWR0X3RhYmxlK24sNSwwLDAsKGdkdF9lbnRyeTw8MykpOworCV9zZXRfZ2F0ZShuLCBERVNDVFlQRV9UQVNLLCAodm9pZCAqKTAsIChnZHRfZW50cnk8PDMpKTsKIH0KIAogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RzYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC90c2MuYwppbmRleCA3ZTBkOGRhLi5iOGZhMGE4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3RzYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdHNjLmMKQEAgLTE5Miw3ICsxOTIsNyBAQAogCiBFWFBPUlRfU1lNQk9MKHJlY2FsaWJyYXRlX2NwdV9raHopOwogCi12b2lkIHRzY19pbml0KHZvaWQpCit2b2lkIF9faW5pdCB0c2NfaW5pdCh2b2lkKQogewogCWlmICghY3B1X2hhc190c2MgfHwgdHNjX2Rpc2FibGUpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9saWIvTWFrZWZpbGUgYi9hcmNoL2kzODYvbGliL01ha2VmaWxlCmluZGV4IDkxNDkzM2UuLmQ4NmE1NDggMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9pMzg2L2xpYi9NYWtlZmlsZQpAQCAtNCw2ICs0LDYgQEAKIAogCiBsaWIteSA9IGNoZWNrc3VtLm8gZGVsYXkubyB1c2VyY29weS5vIGdldHVzZXIubyBwdXR1c2VyLm8gbWVtY3B5Lm8gc3Ryc3RyLm8gXAotCWJpdG9wcy5vCisJYml0b3BzLm8gc2VtYXBob3JlLm8KIAogbGliLSQoQ09ORklHX1g4Nl9VU0VfM0ROT1cpICs9IG1teC5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbGliL3NlbWFwaG9yZS5TIGIvYXJjaC9pMzg2L2xpYi9zZW1hcGhvcmUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWY4MGI1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2xpYi9zZW1hcGhvcmUuUwpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIGkzODYgc2VtYXBob3JlIGltcGxlbWVudGF0aW9uLgorICoKKyAqIChDKSBDb3B5cmlnaHQgMTk5OSBMaW51cyBUb3J2YWxkcworICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAxOTk5IFJlZCBIYXQsIEluYy4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIHJ3IHNlbWFwaG9yZXMgaW1wbGVtZW50ZWQgTm92ZW1iZXIgMTk5OSBieSBCZW5qYW1pbiBMYUhhaXNlIDxiY3JsQGt2YWNrLm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9yd2xvY2suaD4KKyNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUtYXNtLmk+CisjaW5jbHVkZSA8YXNtL2ZyYW1lLmk+CisjaW5jbHVkZSA8YXNtL2R3YXJmMi5oPgorCisvKgorICogVGhlIHNlbWFwaG9yZSBvcGVyYXRpb25zIGhhdmUgYSBzcGVjaWFsIGNhbGxpbmcgc2VxdWVuY2UgdGhhdAorICogYWxsb3cgdXMgdG8gZG8gYSBzaW1wbGVyIGluLWxpbmUgdmVyc2lvbiBvZiB0aGVtLiBUaGVzZSByb3V0aW5lcworICogbmVlZCB0byBjb252ZXJ0IHRoYXQgc2VxdWVuY2UgYmFjayBpbnRvIHRoZSBDIHNlcXVlbmNlIHdoZW4KKyAqIHRoZXJlIGlzIGNvbnRlbnRpb24gb24gdGhlIHNlbWFwaG9yZS4KKyAqCisgKiAlZWF4IGNvbnRhaW5zIHRoZSBzZW1hcGhvcmUgcG9pbnRlciBvbiBlbnRyeS4gU2F2ZSB0aGUgQy1jbG9iYmVyZWQKKyAqIHJlZ2lzdGVycyAoJWVheCwgJWVkeCBhbmQgJWVjeCkgZXhjZXB0ICVlYXggd2hpc2ggaXMgZWl0aGVyIGEgcmV0dXJuCisgKiB2YWx1ZSBvciBqdXN0IGNsb2JiZXJlZC4uCisgKi8KKwkuc2VjdGlvbiAuc2NoZWQudGV4dAorRU5UUlkoX19kb3duX2ZhaWxlZCkKKwlDRklfU1RBUlRQUk9DCisJRlJBTUUKKwlwdXNobCAlZWR4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwlDRklfUkVMX09GRlNFVCBlZHgsMAorCXB1c2hsICVlY3gKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAorCUNGSV9SRUxfT0ZGU0VUIGVjeCwwCisJY2FsbCBfX2Rvd24KKwlwb3BsICVlY3gKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKKwlDRklfUkVTVE9SRSBlY3gKKwlwb3BsICVlZHgKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKKwlDRklfUkVTVE9SRSBlZHgKKwlFTkRGUkFNRQorCXJldAorCUNGSV9FTkRQUk9DCisJRU5EKF9fZG93bl9mYWlsZWQpCisKK0VOVFJZKF9fZG93bl9mYWlsZWRfaW50ZXJydXB0aWJsZSkKKwlDRklfU1RBUlRQUk9DCisJRlJBTUUKKwlwdXNobCAlZWR4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwlDRklfUkVMX09GRlNFVCBlZHgsMAorCXB1c2hsICVlY3gKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAorCUNGSV9SRUxfT0ZGU0VUIGVjeCwwCisJY2FsbCBfX2Rvd25faW50ZXJydXB0aWJsZQorCXBvcGwgJWVjeAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNAorCUNGSV9SRVNUT1JFIGVjeAorCXBvcGwgJWVkeAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNAorCUNGSV9SRVNUT1JFIGVkeAorCUVOREZSQU1FCisJcmV0CisJQ0ZJX0VORFBST0MKKwlFTkQoX19kb3duX2ZhaWxlZF9pbnRlcnJ1cHRpYmxlKQorCitFTlRSWShfX2Rvd25fZmFpbGVkX3RyeWxvY2spCisJQ0ZJX1NUQVJUUFJPQworCUZSQU1FCisJcHVzaGwgJWVkeAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CisJQ0ZJX1JFTF9PRkZTRVQgZWR4LDAKKwlwdXNobCAlZWN4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwlDRklfUkVMX09GRlNFVCBlY3gsMAorCWNhbGwgX19kb3duX3RyeWxvY2sKKwlwb3BsICVlY3gKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKKwlDRklfUkVTVE9SRSBlY3gKKwlwb3BsICVlZHgKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKKwlDRklfUkVTVE9SRSBlZHgKKwlFTkRGUkFNRQorCXJldAorCUNGSV9FTkRQUk9DCisJRU5EKF9fZG93bl9mYWlsZWRfdHJ5bG9jaykKKworRU5UUlkoX191cF93YWtldXApCisJQ0ZJX1NUQVJUUFJPQworCUZSQU1FCisJcHVzaGwgJWVkeAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CisJQ0ZJX1JFTF9PRkZTRVQgZWR4LDAKKwlwdXNobCAlZWN4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwlDRklfUkVMX09GRlNFVCBlY3gsMAorCWNhbGwgX191cAorCXBvcGwgJWVjeAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNAorCUNGSV9SRVNUT1JFIGVjeAorCXBvcGwgJWVkeAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNAorCUNGSV9SRVNUT1JFIGVkeAorCUVOREZSQU1FCisJcmV0CisJQ0ZJX0VORFBST0MKKwlFTkQoX191cF93YWtldXApCisKKy8qCisgKiBydyBzcGlubG9jayBmYWxsYmFja3MKKyAqLworI2lmZGVmIENPTkZJR19TTVAKK0VOVFJZKF9fd3JpdGVfbG9ja19mYWlsZWQpCisJQ0ZJX1NUQVJUUFJPQyBzaW1wbGUKKwlGUkFNRQorMjogCUxPQ0tfUFJFRklYCisJYWRkbAkkIFJXX0xPQ0tfQklBUywoJWVheCkKKzE6CXJlcDsgbm9wCisJY21wbAkkIFJXX0xPQ0tfQklBUywoJWVheCkKKwlqbmUJMWIKKwlMT0NLX1BSRUZJWAorCXN1YmwJJCBSV19MT0NLX0JJQVMsKCVlYXgpCisJam56CTJiCisJRU5ERlJBTUUKKwlyZXQKKwlDRklfRU5EUFJPQworCUVORChfX3dyaXRlX2xvY2tfZmFpbGVkKQorCitFTlRSWShfX3JlYWRfbG9ja19mYWlsZWQpCisJQ0ZJX1NUQVJUUFJPQworCUZSQU1FCisyOiAJTE9DS19QUkVGSVgKKwlpbmNsCSglZWF4KQorMToJcmVwOyBub3AKKwljbXBsCSQxLCglZWF4KQorCWpzCTFiCisJTE9DS19QUkVGSVgKKwlkZWNsCSglZWF4KQorCWpzCTJiCisJRU5ERlJBTUUKKwlyZXQKKwlDRklfRU5EUFJPQworCUVORChfX3JlYWRfbG9ja19mYWlsZWQpCisKKyNlbmRpZgorCisvKiBGaXggdXAgc3BlY2lhbCBjYWxsaW5nIGNvbnZlbnRpb25zICovCitFTlRSWShjYWxsX3J3c2VtX2Rvd25fcmVhZF9mYWlsZWQpCisJQ0ZJX1NUQVJUUFJPQworCXB1c2ggJWVjeAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CisJQ0ZJX1JFTF9PRkZTRVQgZWN4LDAKKwlwdXNoICVlZHgKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAorCUNGSV9SRUxfT0ZGU0VUIGVkeCwwCisJY2FsbCByd3NlbV9kb3duX3JlYWRfZmFpbGVkCisJcG9wICVlZHgKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKKwlwb3AgJWVjeAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNAorCXJldAorCUNGSV9FTkRQUk9DCisJRU5EKGNhbGxfcndzZW1fZG93bl9yZWFkX2ZhaWxlZCkKKworRU5UUlkoY2FsbF9yd3NlbV9kb3duX3dyaXRlX2ZhaWxlZCkKKwlDRklfU1RBUlRQUk9DCisJcHVzaCAlZWN4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwlDRklfUkVMX09GRlNFVCBlY3gsMAorCWNhbGxsIHJ3c2VtX2Rvd25fd3JpdGVfZmFpbGVkCisJcG9wICVlY3gKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKKwlyZXQKKwlDRklfRU5EUFJPQworCUVORChjYWxsX3J3c2VtX2Rvd25fd3JpdGVfZmFpbGVkKQorCitFTlRSWShjYWxsX3J3c2VtX3dha2UpCisJQ0ZJX1NUQVJUUFJPQworCWRlY3cgJWR4ICAgIC8qIGRvIG5vdGhpbmcgaWYgc3RpbGwgb3V0c3RhbmRpbmcgYWN0aXZlIHJlYWRlcnMgKi8KKwlqbnogMWYKKwlwdXNoICVlY3gKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAorCUNGSV9SRUxfT0ZGU0VUIGVjeCwwCisJY2FsbCByd3NlbV93YWtlCisJcG9wICVlY3gKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKKzE6CXJldAorCUNGSV9FTkRQUk9DCisJRU5EKGNhbGxfcndzZW1fd2FrZSkKKworLyogRml4IHVwIHNwZWNpYWwgY2FsbGluZyBjb252ZW50aW9ucyAqLworRU5UUlkoY2FsbF9yd3NlbV9kb3duZ3JhZGVfd2FrZSkKKwlDRklfU1RBUlRQUk9DCisJcHVzaCAlZWN4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKKwlDRklfUkVMX09GRlNFVCBlY3gsMAorCXB1c2ggJWVkeAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CisJQ0ZJX1JFTF9PRkZTRVQgZWR4LDAKKwljYWxsIHJ3c2VtX2Rvd25ncmFkZV93YWtlCisJcG9wICVlZHgKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKKwlwb3AgJWVjeAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNAorCXJldAorCUNGSV9FTkRQUk9DCisJRU5EKGNhbGxfcndzZW1fZG93bmdyYWRlX3dha2UpCisKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvYmlnc21wLmMgYi9hcmNoL2kzODYvbWFjaC1nZW5lcmljL2JpZ3NtcC5jCmluZGV4IGVmN2E2ZTYuLjMzZDlmOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvYmlnc21wLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9iaWdzbXAuYwpAQCAtNSw2ICs1LDcgQEAKICNkZWZpbmUgQVBJQ19ERUZJTklUSU9OIDEKICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CiAjaW5jbHVkZSA8YXNtL2dlbmFwaWMuaD4KICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC1nZW5lcmljL2VzNzAwMC5jIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9lczcwMDAuYwppbmRleCA4NDVjZGQwLi5hYTE0NGQ4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC1nZW5lcmljL2VzNzAwMC5jCisrKyBiL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvZXM3MDAwLmMKQEAgLTQsNiArNCw3IEBACiAjZGVmaW5lIEFQSUNfREVGSU5JVElPTiAxCiAjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgogI2luY2x1ZGUgPGFzbS9nZW5hcGljLmg+CiAjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9wcm9iZS5jIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9wcm9iZS5jCmluZGV4IGJjZDFiY2YuLjk0YjFmZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvcHJvYmUuYworKysgYi9hcmNoL2kzODYvbWFjaC1nZW5lcmljL3Byb2JlLmMKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CiAjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgogI2luY2x1ZGUgPGFzbS9hcGljZGVmLmg+CkBAIC0yOSw3ICszMCwyNCBAQAogCU5VTEwsCiB9OwogCi1zdGF0aWMgaW50IGNtZGxpbmVfYXBpYzsKK3N0YXRpYyBpbnQgY21kbGluZV9hcGljIF9faW5pdGRhdGE7CitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9hcGljKGNoYXIgKmFyZykKK3sKKwlpbnQgaTsKKworCWlmICghYXJnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGFwaWNfcHJvYmVbaV07IGkrKykgeworCQlpZiAoIXN0cmNtcChhcGljX3Byb2JlW2ldLT5uYW1lLCBhcmcpKSB7CisJCQlnZW5hcGljID0gYXBpY19wcm9iZVtpXTsKKwkJCWNtZGxpbmVfYXBpYyA9IDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KK2Vhcmx5X3BhcmFtKCJhcGljIiwgcGFyc2VfYXBpYyk7CiAKIHZvaWQgX19pbml0IGdlbmVyaWNfYmlnc21wX3Byb2JlKHZvaWQpCiB7CkBAIC00OCw0MCArNjYsMjAgQEAKIAkJfQogfQogCi12b2lkIF9faW5pdCBnZW5lcmljX2FwaWNfcHJvYmUoY2hhciAqY29tbWFuZF9saW5lKSAKK3ZvaWQgX19pbml0IGdlbmVyaWNfYXBpY19wcm9iZSh2b2lkKQogeyAKLQljaGFyICpzOwotCWludCBpOwotCWludCBjaGFuZ2VkID0gMDsKLQotCXMgPSBzdHJzdHIoY29tbWFuZF9saW5lLCAiYXBpYz0iKTsKLQlpZiAocyAmJiAocyA9PSBjb21tYW5kX2xpbmUgfHwgaXNzcGFjZShzWy0xXSkpKSB7IAotCQljaGFyICpwID0gc3RyY2hyKHMsICcgJyksIG9sZDsgCi0JCWlmICghcCkKLQkJCXAgPSBzdHJjaHIocywgJ1wwJyk7IAotCQlvbGQgPSAqcDsgCi0JCSpwID0gMDsgCi0JCWZvciAoaSA9IDA7ICFjaGFuZ2VkICYmIGFwaWNfcHJvYmVbaV07IGkrKykgewotCQkJaWYgKCFzdHJjbXAoYXBpY19wcm9iZVtpXS0+bmFtZSwgcys1KSkgeyAKLQkJCQljaGFuZ2VkID0gMTsKKwlpZiAoIWNtZGxpbmVfYXBpYykgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgYXBpY19wcm9iZVtpXTsgaSsrKSB7CisJCQlpZiAoYXBpY19wcm9iZVtpXS0+cHJvYmUoKSkgewogCQkJCWdlbmFwaWMgPSBhcGljX3Byb2JlW2ldOworCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0JCWlmICghY2hhbmdlZCkKLQkJCXByaW50ayhLRVJOX0VSUiAiVW5rbm93biBnZW5hcGljIGAlcycgc3BlY2lmaWVkLlxuIiwgcyk7Ci0JCSpwID0gb2xkOwotCQljbWRsaW5lX2FwaWMgPSBjaGFuZ2VkOwotCX0gCi0JZm9yIChpID0gMDsgIWNoYW5nZWQgJiYgYXBpY19wcm9iZVtpXTsgaSsrKSB7IAotCQlpZiAoYXBpY19wcm9iZVtpXS0+cHJvYmUoKSkgewotCQkJY2hhbmdlZCA9IDE7Ci0JCQlnZW5hcGljID0gYXBpY19wcm9iZVtpXTsgCi0JCX0gCisJCS8qIE5vdCB2aXNpYmxlIHdpdGhvdXQgZWFybHkgY29uc29sZSAqLworCQlpZiAoIWFwaWNfcHJvYmVbaV0pCisJCQlwYW5pYygiRGlkbid0IGZpbmQgYW4gQVBJQyBkcml2ZXIiKTsKIAl9Ci0JLyogTm90IHZpc2libGUgd2l0aG91dCBlYXJseSBjb25zb2xlICovIAotCWlmICghY2hhbmdlZCkgCi0JCXBhbmljKCJEaWRuJ3QgZmluZCBhbiBBUElDIGRyaXZlciIpOyAKLQogCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIEFQSUMgZHJpdmVyICVzXG4iLCBnZW5hcGljLT5uYW1lKTsKIH0gCiAKQEAgLTExOSw3ICsxMTcsOSBAQAogCXJldHVybiAwOwkKIH0KIAorI2lmZGVmIENPTkZJR19TTVAKIGludCBoYXJkX3NtcF9wcm9jZXNzb3JfaWQodm9pZCkKIHsKIAlyZXR1cm4gZ2VuYXBpYy0+Z2V0X2FwaWNfaWQoKih1bnNpZ25lZCBsb25nICopKEFQSUNfQkFTRStBUElDX0lEKSk7CiB9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvc3VtbWl0LmMgYi9hcmNoL2kzODYvbWFjaC1nZW5lcmljL3N1bW1pdC5jCmluZGV4IGI3MzUwMWQuLmY3ZTVkNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLWdlbmVyaWMvc3VtbWl0LmMKKysrIGIvYXJjaC9pMzg2L21hY2gtZ2VuZXJpYy9zdW1taXQuYwpAQCAtNCw2ICs0LDcgQEAKICNkZWZpbmUgQVBJQ19ERUZJTklUSU9OIDEKICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CiAjaW5jbHVkZSA8YXNtL2dlbmFwaWMuaD4KICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vZGlzY29udGlnLmMgYi9hcmNoL2kzODYvbW0vZGlzY29udGlnLmMKaW5kZXggZmI1ZDhiNy4uNTFlMzczOSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL2Rpc2NvbnRpZy5jCisrKyBiL2FyY2gvaTM4Ni9tbS9kaXNjb250aWcuYwpAQCAtMTU3LDIxICsxNTcsNiBAQAogCQlCVUcoKTsKIH0KIAotLyogRmluZCB0aGUgb3duaW5nIG5vZGUgZm9yIGEgcGZuLiAqLwotaW50IGVhcmx5X3Bmbl90b19uaWQodW5zaWduZWQgbG9uZyBwZm4pCi17Ci0JaW50IG5pZDsKLQotCWZvcl9lYWNoX25vZGUobmlkKSB7Ci0JCWlmIChub2RlX2VuZF9wZm5bbmlkXSA9PSAwKQotCQkJYnJlYWs7Ci0JCWlmIChub2RlX3N0YXJ0X3BmbltuaWRdIDw9IHBmbiAmJiBub2RlX2VuZF9wZm5bbmlkXSA+PSBwZm4pCi0JCQlyZXR1cm4gbmlkOwotCX0KLQotCXJldHVybiAwOwotfQotCiAvKiAKICAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBnX2RhdGFfdCBmb3IgdGhpcyBub2RlIHZpYSBhIGNydWRlIHByZS1ib290bWVtCiAgKiBtZXRob2QuICBGb3Igbm9kZSB6ZXJvIHRha2UgdGhpcyBmcm9tIHRoZSBib3R0b20gb2YgbWVtb3J5LCBmb3IKQEAgLTIyNyw2ICsyMTIsOCBAQAogCXVuc2lnbmVkIGxvbmcgcGZuOwogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CisJCXVuc2lnbmVkIG9sZF9lbmRfcGZuID0gbm9kZV9lbmRfcGZuW25pZF07CisKIAkJLyoKIAkJICogVGhlIGFjcGkvc3JhdCBub2RlIGluZm8gY2FuIHNob3cgaG90LWFkZCBtZW1yb3kgem9uZXMKIAkJICogd2hlcmUgbWVtb3J5IGNvdWxkIGJlIGFkZGVkIGJ1dCBub3QgY3VycmVudGx5IHByZXNlbnQuCkBAIC0yNzYsNiArMjYzLDcgQEAKIAogCQlub2RlX2VuZF9wZm5bbmlkXSAtPSBzaXplOwogCQlub2RlX3JlbWFwX3N0YXJ0X3BmbltuaWRdID0gbm9kZV9lbmRfcGZuW25pZF07CisJCXNocmlua19hY3RpdmVfcmFuZ2UobmlkLCBvbGRfZW5kX3Bmbiwgbm9kZV9lbmRfcGZuW25pZF0pOwogCX0KIAlwcmludGsoIlJlc2VydmluZyB0b3RhbCBvZiAlbGQgcGFnZXMgZm9yIG51bWEgS1ZBIHJlbWFwXG4iLAogCQkJcmVzZXJ2ZV9wYWdlcyk7CkBAIC0zMjIsNiArMzEwLDExIEBACiAJCWhpZ2hzdGFydF9wZm4gPSBzeXN0ZW1fbWF4X2xvd19wZm47CiAJcHJpbnRrKEtFUk5fTk9USUNFICIlbGRNQiBISUdITUVNIGF2YWlsYWJsZS5cbiIsCiAJICAgICAgIHBhZ2VzX3RvX21iKGhpZ2hlbmRfcGZuIC0gaGlnaHN0YXJ0X3BmbikpOworCW51bV9waHlzcGFnZXMgPSBoaWdoZW5kX3BmbjsKKwloaWdoX21lbW9yeSA9ICh2b2lkICopIF9fdmEoaGlnaHN0YXJ0X3BmbiAqIFBBR0VfU0laRSAtIDEpICsgMTsKKyNlbHNlCisJbnVtX3BoeXNwYWdlcyA9IHN5c3RlbV9tYXhfbG93X3BmbjsKKwloaWdoX21lbW9yeSA9ICh2b2lkICopIF9fdmEoc3lzdGVtX21heF9sb3dfcGZuICogUEFHRV9TSVpFIC0gMSkgKyAxOwogI2VuZGlmCiAJcHJpbnRrKEtFUk5fTk9USUNFICIlbGRNQiBMT1dNRU0gYXZhaWxhYmxlLlxuIiwKIAkJCXBhZ2VzX3RvX21iKHN5c3RlbV9tYXhfbG93X3BmbikpOwpAQCAtMzY0LDQ1ICszNTcsMjIgQEAKIHZvaWQgX19pbml0IHpvbmVfc2l6ZXNfaW5pdCh2b2lkKQogewogCWludCBuaWQ7CisJdW5zaWduZWQgbG9uZyBtYXhfem9uZV9wZm5zW01BWF9OUl9aT05FU10gPSB7CisJCXZpcnRfdG9fcGh5cygoY2hhciAqKU1BWF9ETUFfQUREUkVTUykgPj4gUEFHRV9TSElGVCwKKwkJbWF4X2xvd19wZm4sCisJCWhpZ2hlbmRfcGZuCisJfTsKIAotCi0JZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7Ci0JCXVuc2lnbmVkIGxvbmcgem9uZXNfc2l6ZVtNQVhfTlJfWk9ORVNdID0gezAsIH07Ci0JCXVuc2lnbmVkIGxvbmcgKnpob2xlc19zaXplOwotCQl1bnNpZ25lZCBpbnQgbWF4X2RtYTsKLQotCQl1bnNpZ25lZCBsb25nIGxvdyA9IG1heF9sb3dfcGZuOwotCQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gbm9kZV9zdGFydF9wZm5bbmlkXTsKLQkJdW5zaWduZWQgbG9uZyBoaWdoID0gbm9kZV9lbmRfcGZuW25pZF07Ci0KLQkJbWF4X2RtYSA9IHZpcnRfdG9fcGh5cygoY2hhciAqKU1BWF9ETUFfQUREUkVTUykgPj4gUEFHRV9TSElGVDsKLQotCQlpZiAobm9kZV9oYXNfb25saW5lX21lbShuaWQpKXsKLQkJCWlmIChzdGFydCA+IGxvdykgewotI2lmZGVmIENPTkZJR19ISUdITUVNCi0JCQkJQlVHX09OKHN0YXJ0ID4gaGlnaCk7Ci0JCQkJem9uZXNfc2l6ZVtaT05FX0hJR0hNRU1dID0gaGlnaCAtIHN0YXJ0OwotI2VuZGlmCi0JCQl9IGVsc2UgewotCQkJCWlmIChsb3cgPCBtYXhfZG1hKQotCQkJCQl6b25lc19zaXplW1pPTkVfRE1BXSA9IGxvdzsKLQkJCQllbHNlIHsKLQkJCQkJQlVHX09OKG1heF9kbWEgPiBsb3cpOwotCQkJCQlCVUdfT04obG93ID4gaGlnaCk7Ci0JCQkJCXpvbmVzX3NpemVbWk9ORV9ETUFdID0gbWF4X2RtYTsKLQkJCQkJem9uZXNfc2l6ZVtaT05FX05PUk1BTF0gPSBsb3cgLSBtYXhfZG1hOwotI2lmZGVmIENPTkZJR19ISUdITUVNCi0JCQkJCXpvbmVzX3NpemVbWk9ORV9ISUdITUVNXSA9IGhpZ2ggLSBsb3c7Ci0jZW5kaWYKLQkJCQl9Ci0JCQl9CisJLyogSWYgU1JBVCBoYXMgbm90IHJlZ2lzdGVyZWQgbWVtb3J5LCByZWdpc3RlciBpdCBub3cgKi8KKwlpZiAoZmluZF9tYXhfcGZuX3dpdGhfYWN0aXZlX3JlZ2lvbnMoKSA9PSAwKSB7CisJCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgeworCQkJaWYgKG5vZGVfaGFzX29ubGluZV9tZW0obmlkKSkKKwkJCQlhZGRfYWN0aXZlX3JhbmdlKG5pZCwgbm9kZV9zdGFydF9wZm5bbmlkXSwKKwkJCQkJCQlub2RlX2VuZF9wZm5bbmlkXSk7CiAJCX0KLQotCQl6aG9sZXNfc2l6ZSA9IGdldF96aG9sZXNfc2l6ZShuaWQpOwotCi0JCWZyZWVfYXJlYV9pbml0X25vZGUobmlkLCBOT0RFX0RBVEEobmlkKSwgem9uZXNfc2l6ZSwgc3RhcnQsCi0JCQkJemhvbGVzX3NpemUpOwogCX0KKworCWZyZWVfYXJlYV9pbml0X25vZGVzKG1heF96b25lX3BmbnMpOwogCXJldHVybjsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2V4dGFibGUuYyBiL2FyY2gvaTM4Ni9tbS9leHRhYmxlLmMKaW5kZXggZGUwM2M1NC4uMGNlNGYyMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL2V4dGFibGUuYworKysgYi9hcmNoL2kzODYvbW0vZXh0YWJsZS5jCkBAIC0xMSw3ICsxMSw3IEBACiAJY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqZml4dXA7CiAKICNpZmRlZiBDT05GSUdfUE5QQklPUwotCWlmICh1bmxpa2VseSgocmVncy0+eGNzICYgfjE1KSA9PSAoR0RUX0VOVFJZX1BOUEJJT1NfQkFTRSA8PCAzKSkpCisJaWYgKHVubGlrZWx5KFNFR01FTlRfSVNfUE5QX0NPREUocmVncy0+eGNzKSkpCiAJewogCQlleHRlcm4gdTMyIHBucF9iaW9zX2ZhdWx0X2VpcCwgcG5wX2Jpb3NfZmF1bHRfZXNwOwogCQlleHRlcm4gdTMyIHBucF9iaW9zX2lzX3V0dGVyX2NyYXA7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vZmF1bHQuYyBiL2FyY2gvaTM4Ni9tbS9mYXVsdC5jCmluZGV4IGY3Mjc5NDYuLjVlMTdhM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tbS9mYXVsdC5jCisrKyBiL2FyY2gvaTM4Ni9tbS9mYXVsdC5jCkBAIC0yNywyMSArMjcsMjQgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9kZXNjLmg+CiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAKIGV4dGVybiB2b2lkIGRpZShjb25zdCBjaGFyICosc3RydWN0IHB0X3JlZ3MgKixsb25nKTsKIAotI2lmZGVmIENPTkZJR19LUFJPQkVTCi1BVE9NSUNfTk9USUZJRVJfSEVBRChub3RpZnlfcGFnZV9mYXVsdF9jaGFpbik7CitzdGF0aWMgQVRPTUlDX05PVElGSUVSX0hFQUQobm90aWZ5X3BhZ2VfZmF1bHRfY2hhaW4pOworCiBpbnQgcmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQogewogCXZtYWxsb2Nfc3luY19hbGwoKTsKIAlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZub3RpZnlfcGFnZV9mYXVsdF9jaGFpbiwgbmIpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfcGFnZV9mYXVsdF9ub3RpZmllcik7CiAKIGludCB1bnJlZ2lzdGVyX3BhZ2VfZmF1bHRfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKIHsKIAlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJm5vdGlmeV9wYWdlX2ZhdWx0X2NoYWluLCBuYik7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh1bnJlZ2lzdGVyX3BhZ2VfZmF1bHRfbm90aWZpZXIpOwogCiBzdGF0aWMgaW5saW5lIGludCBub3RpZnlfcGFnZV9mYXVsdChlbnVtIGRpZV92YWwgdmFsLCBjb25zdCBjaGFyICpzdHIsCiAJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIsIGludCB0cmFwLCBpbnQgc2lnKQpAQCAtNTUsMTQgKzU4LDYgQEAKIAl9OwogCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmbm90aWZ5X3BhZ2VfZmF1bHRfY2hhaW4sIHZhbCwgJmFyZ3MpOwogfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IG5vdGlmeV9wYWdlX2ZhdWx0KGVudW0gZGllX3ZhbCB2YWwsIGNvbnN0IGNoYXIgKnN0ciwKLQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVyciwgaW50IHRyYXAsIGludCBzaWcpCi17Ci0JcmV0dXJuIE5PVElGWV9ET05FOwotfQotI2VuZGlmCi0KIAogLyoKICAqIFVubG9jayBhbnkgc3BpbmxvY2tzIHdoaWNoIHdpbGwgcHJldmVudCB1cyBmcm9tIGdldHRpbmcgdGhlCkBAIC0xMTksMTAgKzExNCwxMCBAQAogCX0KIAogCS8qIFRoZSBzdGFuZGFyZCBrZXJuZWwvdXNlciBhZGRyZXNzIHNwYWNlIGxpbWl0LiAqLwotCSplaXBfbGltaXQgPSAoc2VnICYgMykgPyBVU0VSX0RTLnNlZyA6IEtFUk5FTF9EUy5zZWc7CisJKmVpcF9saW1pdCA9IHVzZXJfbW9kZShyZWdzKSA/IFVTRVJfRFMuc2VnIDogS0VSTkVMX0RTLnNlZzsKIAkKIAkvKiBCeSBmYXIgdGhlIG1vc3QgY29tbW9uIGNhc2VzLiAqLwotCWlmIChsaWtlbHkoc2VnID09IF9fVVNFUl9DUyB8fCBzZWcgPT0gX19LRVJORUxfQ1MpKQorCWlmIChsaWtlbHkoU0VHTUVOVF9JU19GTEFUX0NPREUoc2VnKSkpCiAJCXJldHVybiBlaXA7CiAKIAkvKiBDaGVjayB0aGUgc2VnbWVudCBleGlzdHMsIGlzIHdpdGhpbiB0aGUgY3VycmVudCBMRFQvR0RUIHNpemUsCkBAIC00MzYsMTEgKzQzMSw3IEBACiAJd3JpdGUgPSAwOwogCXN3aXRjaCAoZXJyb3JfY29kZSAmIDMpIHsKIAkJZGVmYXVsdDoJLyogMzogd3JpdGUsIHByZXNlbnQgKi8KLSNpZmRlZiBURVNUX1ZFUklGWV9BUkVBCi0JCQlpZiAocmVncy0+Y3MgPT0gS0VSTkVMX0NTKQotCQkJCXByaW50aygiV1AgZmF1bHQgYXQgJTA4bHhcbiIsIHJlZ3MtPmVpcCk7Ci0jZW5kaWYKLQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQljYXNlIDI6CQkvKiB3cml0ZSwgbm90IHByZXNlbnQgKi8KIAkJCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCiAJCQkJZ290byBiYWRfYXJlYTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9oaWdobWVtLmMgYi9hcmNoL2kzODYvbW0vaGlnaG1lbS5jCmluZGV4IGI2ZWI0ZGMuLmJhNDQwMDAgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tbS9oaWdobWVtLmMKKysrIGIvYXJjaC9pMzg2L21tL2hpZ2htZW0uYwpAQCAtNTQsNyArNTQsNyBAQAogCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSAodW5zaWduZWQgbG9uZykga3ZhZGRyICYgUEFHRV9NQVNLOwogCWVudW0gZml4ZWRfYWRkcmVzc2VzIGlkeCA9IHR5cGUgKyBLTV9UWVBFX05SKnNtcF9wcm9jZXNzb3JfaWQoKTsKIAotCWlmICh2YWRkciA8IEZJWEFERFJfU1RBUlQpIHsgLy8gRklYTUUKKwlpZiAodmFkZHIgPj0gUEFHRV9PRkZTRVQgJiYgdmFkZHIgPCAodW5zaWduZWQgbG9uZyloaWdoX21lbW9yeSkgewogCQlkZWNfcHJlZW1wdF9jb3VudCgpOwogCQlwcmVlbXB0X2NoZWNrX3Jlc2NoZWQoKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21tL2luaXQuYyBiL2FyY2gvaTM4Ni9tbS9pbml0LmMKaW5kZXggZWZkMGJjZC4uNGE1YTkxNCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL2luaXQuYworKysgYi9hcmNoL2kzODYvbW0vaW5pdC5jCkBAIC00MzUsMTYgKzQzNSwyMiBAQAogICogb24gICAgICBFbmFibGUKICAqIG9mZiAgICAgRGlzYWJsZQogICovCi12b2lkIF9faW5pdCBub2V4ZWNfc2V0dXAoY29uc3QgY2hhciAqc3RyKQorc3RhdGljIGludCBfX2luaXQgbm9leGVjX3NldHVwKGNoYXIgKnN0cikKIHsKLQlpZiAoIXN0cm5jbXAoc3RyLCAib24iLDIpICYmIGNwdV9oYXNfbngpIHsKLQkJX19zdXBwb3J0ZWRfcHRlX21hc2sgfD0gX1BBR0VfTlg7Ci0JCWRpc2FibGVfbnggPSAwOwotCX0gZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCJvZmYiLDMpKSB7CisJaWYgKCFzdHIgfHwgIXN0cmNtcChzdHIsICJvbiIpKSB7CisJCWlmIChjcHVfaGFzX254KSB7CisJCQlfX3N1cHBvcnRlZF9wdGVfbWFzayB8PSBfUEFHRV9OWDsKKwkJCWRpc2FibGVfbnggPSAwOworCQl9CisJfSBlbHNlIGlmICghc3RyY21wKHN0ciwib2ZmIikpIHsKIAkJZGlzYWJsZV9ueCA9IDE7CiAJCV9fc3VwcG9ydGVkX3B0ZV9tYXNrICY9IH5fUEFHRV9OWDsKLQl9CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7CiB9CitlYXJseV9wYXJhbSgibm9leGVjIiwgbm9leGVjX3NldHVwKTsKIAogaW50IG54X2VuYWJsZWQgPSAwOwogI2lmZGVmIENPTkZJR19YODZfUEFFCkBAIC01NTIsMTggKzU1OCw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2V0X21heF9tYXBucl9pbml0KHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX0hJR0hNRU0KLQludW1fcGh5c3BhZ2VzID0gaGlnaGVuZF9wZm47Ci0jZWxzZQotCW51bV9waHlzcGFnZXMgPSBtYXhfbG93X3BmbjsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19GTEFUTUVNCi0JbWF4X21hcG5yID0gbnVtX3BoeXNwYWdlczsKLSNlbmRpZgotfQotCiBzdGF0aWMgc3RydWN0IGtjb3JlX2xpc3Qga2NvcmVfbWVtLCBrY29yZV92bWFsbG9jOyAKIAogdm9pZCBfX2luaXQgbWVtX2luaXQodm9pZCkKQEAgLTU5MCwxNCArNTg0LDYgQEAKIAl9CiAjZW5kaWYKICAKLQlzZXRfbWF4X21hcG5yX2luaXQoKTsKLQotI2lmZGVmIENPTkZJR19ISUdITUVNCi0JaGlnaF9tZW1vcnkgPSAodm9pZCAqKSBfX3ZhKGhpZ2hzdGFydF9wZm4gKiBQQUdFX1NJWkUgLSAxKSArIDE7Ci0jZWxzZQotCWhpZ2hfbWVtb3J5ID0gKHZvaWQgKikgX192YShtYXhfbG93X3BmbiAqIFBBR0VfU0laRSAtIDEpICsgMTsKLSNlbmRpZgotCiAJLyogdGhpcyB3aWxsIHB1dCBhbGwgbG93IG1lbW9yeSBvbnRvIHRoZSBmcmVlbGlzdHMgKi8KIAl0b3RhbHJhbV9wYWdlcyArPSBmcmVlX2FsbF9ib290bWVtKCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfaW50LmMgYi9hcmNoL2kzODYvb3Byb2ZpbGUvbm1pX2ludC5jCmluZGV4IDVmOGRjOGEuLjM3MDBlZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfaW50LmMKKysrIGIvYXJjaC9pMzg2L29wcm9maWxlL25taV9pbnQuYwpAQCAtMTcsMTQgKzE3LDE1IEBACiAjaW5jbHVkZSA8YXNtL25taS5oPgogI2luY2x1ZGUgPGFzbS9tc3IuaD4KICNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KICAKICNpbmNsdWRlICJvcF9jb3VudGVyLmgiCiAjaW5jbHVkZSAib3BfeDg2X21vZGVsLmgiCi0gCisKIHN0YXRpYyBzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgY29uc3QgKiBtb2RlbDsKIHN0YXRpYyBzdHJ1Y3Qgb3BfbXNycyBjcHVfbXNyc1tOUl9DUFVTXTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHNhdmVkX2x2dHBjW05SX0NQVVNdOwotIAorCiBzdGF0aWMgaW50IG5taV9zdGFydCh2b2lkKTsKIHN0YXRpYyB2b2lkIG5taV9zdG9wKHZvaWQpOwogCkBAIC04MiwxMyArODMsMjQgQEAKICNkZWZpbmUgZXhpdF9kcml2ZXJmcygpIGRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAotCi1zdGF0aWMgaW50IG5taV9jYWxsYmFjayhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGludCBjcHUpCitzdGF0aWMgaW50IHByb2ZpbGVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCiB7Ci0JcmV0dXJuIG1vZGVsLT5jaGVja19jdHJzKHJlZ3MsICZjcHVfbXNyc1tjcHVdKTsKKwlzdHJ1Y3QgZGllX2FyZ3MgKmFyZ3MgPSAoc3RydWN0IGRpZV9hcmdzICopZGF0YTsKKwlpbnQgcmV0ID0gTk9USUZZX0RPTkU7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCXN3aXRjaCh2YWwpIHsKKwljYXNlIERJRV9OTUk6CisJCWlmIChtb2RlbC0+Y2hlY2tfY3RycyhhcmdzLT5yZWdzLCAmY3B1X21zcnNbY3B1XSkpCisJCQlyZXQgPSBOT1RJRllfU1RPUDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7CiB9Ci0gCi0gCisKIHN0YXRpYyB2b2lkIG5taV9jcHVfc2F2ZV9yZWdpc3RlcnMoc3RydWN0IG9wX21zcnMgKiBtc3JzKQogewogCXVuc2lnbmVkIGludCBjb25zdCBucl9jdHJzID0gbW9kZWwtPm51bV9jb3VudGVyczsKQEAgLTk4LDE1ICsxMTAsMTkgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBucl9jdHJzOyArK2kpIHsKLQkJcmRtc3IoY291bnRlcnNbaV0uYWRkciwKLQkJCWNvdW50ZXJzW2ldLnNhdmVkLmxvdywKLQkJCWNvdW50ZXJzW2ldLnNhdmVkLmhpZ2gpOworCQlpZiAoY291bnRlcnNbaV0uYWRkcil7CisJCQlyZG1zcihjb3VudGVyc1tpXS5hZGRyLAorCQkJCWNvdW50ZXJzW2ldLnNhdmVkLmxvdywKKwkJCQljb3VudGVyc1tpXS5zYXZlZC5oaWdoKTsKKwkJfQogCX0KICAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfY3RybHM7ICsraSkgewotCQlyZG1zcihjb250cm9sc1tpXS5hZGRyLAotCQkJY29udHJvbHNbaV0uc2F2ZWQubG93LAotCQkJY29udHJvbHNbaV0uc2F2ZWQuaGlnaCk7CisJCWlmIChjb250cm9sc1tpXS5hZGRyKXsKKwkJCXJkbXNyKGNvbnRyb2xzW2ldLmFkZHIsCisJCQkJY29udHJvbHNbaV0uc2F2ZWQubG93LAorCQkJCWNvbnRyb2xzW2ldLnNhdmVkLmhpZ2gpOworCQl9CiAJfQogfQogCkBAIC0xNzAsMjcgKzE4NiwyOSBAQAogCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOwogfQogCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHByb2ZpbGVfZXhjZXB0aW9uc19uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHByb2ZpbGVfZXhjZXB0aW9uc19ub3RpZnksCisJLm5leHQgPSBOVUxMLAorCS5wcmlvcml0eSA9IDAKK307CiAKIHN0YXRpYyBpbnQgbm1pX3NldHVwKHZvaWQpCiB7CisJaW50IGVycj0wOworCiAJaWYgKCFhbGxvY2F0ZV9tc3JzKCkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JLyogV2Ugd2FsayBhIHRoaW4gbGluZSBiZXR3ZWVuIGxhdyBhbmQgcmFwZSBoZXJlLgotCSAqIFdlIG5lZWQgdG8gYmUgY2FyZWZ1bCB0byBpbnN0YWxsIG91ciBOTUkgaGFuZGxlcgotCSAqIHdpdGhvdXQgYWN0dWFsbHkgdHJpZ2dlcmluZyBhbnkgTk1JcyBhcyB0aGlzIHdpbGwKLQkgKiBicmVhayB0aGUgY29yZSBjb2RlIGhvcnJpZmljYWxseS4KLQkgKi8KLQlpZiAocmVzZXJ2ZV9sYXBpY19ubWkoKSA8IDApIHsKKwlpZiAoKGVyciA9IHJlZ2lzdGVyX2RpZV9ub3RpZmllcigmcHJvZmlsZV9leGNlcHRpb25zX25iKSkpewogCQlmcmVlX21zcnMoKTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0dXJuIGVycjsKIAl9CisKIAkvKiBXZSBuZWVkIHRvIHNlcmlhbGl6ZSBzYXZlIGFuZCBzZXR1cCBmb3IgSFQgYmVjYXVzZSB0aGUgc3Vic2V0CiAJICogb2YgbXNycyBhcmUgZGlzdGluY3QgZm9yIHNhdmUgYW5kIHNldHVwIG9wZXJhdGlvbnMKIAkgKi8KIAlvbl9lYWNoX2NwdShubWlfc2F2ZV9yZWdpc3RlcnMsIE5VTEwsIDAsIDEpOwogCW9uX2VhY2hfY3B1KG5taV9jcHVfc2V0dXAsIE5VTEwsIDAsIDEpOwotCXNldF9ubWlfY2FsbGJhY2sobm1pX2NhbGxiYWNrKTsKIAlubWlfZW5hYmxlZCA9IDE7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMDUsMTUgKzIyMywxOSBAQAogCXVuc2lnbmVkIGludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IG5yX2N0cmxzOyArK2kpIHsKLQkJd3Jtc3IoY29udHJvbHNbaV0uYWRkciwKLQkJCWNvbnRyb2xzW2ldLnNhdmVkLmxvdywKLQkJCWNvbnRyb2xzW2ldLnNhdmVkLmhpZ2gpOworCQlpZiAoY29udHJvbHNbaV0uYWRkcil7CisJCQl3cm1zcihjb250cm9sc1tpXS5hZGRyLAorCQkJCWNvbnRyb2xzW2ldLnNhdmVkLmxvdywKKwkJCQljb250cm9sc1tpXS5zYXZlZC5oaWdoKTsKKwkJfQogCX0KICAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfY3RyczsgKytpKSB7Ci0JCXdybXNyKGNvdW50ZXJzW2ldLmFkZHIsCi0JCQljb3VudGVyc1tpXS5zYXZlZC5sb3csCi0JCQljb3VudGVyc1tpXS5zYXZlZC5oaWdoKTsKKwkJaWYgKGNvdW50ZXJzW2ldLmFkZHIpeworCQkJd3Jtc3IoY291bnRlcnNbaV0uYWRkciwKKwkJCQljb3VudGVyc1tpXS5zYXZlZC5sb3csCisJCQkJY291bnRlcnNbaV0uc2F2ZWQuaGlnaCk7CisJCX0KIAl9CiB9CiAgCkBAIC0yMzQsNiArMjU2LDcgQEAKIAlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIHNhdmVkX2x2dHBjW2NwdV0pOwogCWFwaWNfd3JpdGUoQVBJQ19MVlRFUlIsIHYpOwogCW5taV9yZXN0b3JlX3JlZ2lzdGVycyhtc3JzKTsKKwltb2RlbC0+c2h1dGRvd24obXNycyk7CiB9CiAKICAKQEAgLTI0MSw4ICsyNjQsNyBAQAogewogCW5taV9lbmFibGVkID0gMDsKIAlvbl9lYWNoX2NwdShubWlfY3B1X3NodXRkb3duLCBOVUxMLCAwLCAxKTsKLQl1bnNldF9ubWlfY2FsbGJhY2soKTsKLQlyZWxlYXNlX2xhcGljX25taSgpOworCXVucmVnaXN0ZXJfZGllX25vdGlmaWVyKCZwcm9maWxlX2V4Y2VwdGlvbnNfbmIpOwogCWZyZWVfbXNycygpOwogfQogCkBAIC0yODQsNiArMzA2LDE0IEBACiAJCXN0cnVjdCBkZW50cnkgKiBkaXI7CiAJCWNoYXIgYnVmWzRdOwogIAorIAkJLyogcXVpY2sgbGl0dGxlIGhhY2sgdG8gX25vdF8gZXhwb3NlIGEgY291bnRlciBpZiBpdCBpcyBub3QKKwkJICogYXZhaWxhYmxlIGZvciB1c2UuICBUaGlzIHNob3VsZCBwcm90ZWN0IHVzZXJzcGFjZSBhcHAuCisJCSAqIE5PVEU6ICBhc3N1bWVzIDE6MSBtYXBwaW5nIGhlcmUgKHRoYXQgY291bnRlcnMgYXJlIG9yZ2FuaXplZAorCQkgKiAgICAgICAgc2VxdWVudGlhbGx5IGluIHRoZWlyIHN0cnVjdCBhc3NpZ25tZW50KS4KKwkJICovCisJCWlmICh1bmxpa2VseSghYXZhaWxfdG9fcmVzcnZfcGVyZmN0cl9ubWlfYml0KGkpKSkKKwkJCWNvbnRpbnVlOworCiAJCXNucHJpbnRmKGJ1ZiwgIHNpemVvZihidWYpLCAiJWQiLCBpKTsKIAkJZGlyID0gb3Byb2ZpbGVmc19ta2RpcihzYiwgcm9vdCwgYnVmKTsKIAkJb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGRpciwgImVuYWJsZWQiLCAmY291bnRlcl9jb25maWdbaV0uZW5hYmxlZCk7IApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L29wcm9maWxlL25taV90aW1lcl9pbnQuYyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMKaW5kZXggOTMwYTExMi4uYWJmMGJhNSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L29wcm9maWxlL25taV90aW1lcl9pbnQuYworKysgYi9hcmNoL2kzODYvb3Byb2ZpbGUvbm1pX3RpbWVyX2ludC5jCkBAIC0xNywzNCArMTcsNDkgQEAKICNpbmNsdWRlIDxhc20vbm1pLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgogIAotc3RhdGljIGludCBubWlfdGltZXJfY2FsbGJhY2soc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBpbnQgY3B1KQorc3RhdGljIGludCBwcm9maWxlX3RpbWVyX2V4Y2VwdGlvbnNfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCiB7Ci0Jb3Byb2ZpbGVfYWRkX3NhbXBsZShyZWdzLCAwKTsKLQlyZXR1cm4gMTsKKwlzdHJ1Y3QgZGllX2FyZ3MgKmFyZ3MgPSAoc3RydWN0IGRpZV9hcmdzICopZGF0YTsKKwlpbnQgcmV0ID0gTk9USUZZX0RPTkU7CisKKwlzd2l0Y2godmFsKSB7CisJY2FzZSBESUVfTk1JOgorCQlvcHJvZmlsZV9hZGRfc2FtcGxlKGFyZ3MtPnJlZ3MsIDApOworCQlyZXQgPSBOT1RJRllfU1RPUDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcHJvZmlsZV90aW1lcl9leGNlcHRpb25zX25iID0geworCS5ub3RpZmllcl9jYWxsID0gcHJvZmlsZV90aW1lcl9leGNlcHRpb25zX25vdGlmeSwKKwkubmV4dCA9IE5VTEwsCisJLnByaW9yaXR5ID0gMAorfTsKKwogc3RhdGljIGludCB0aW1lcl9zdGFydCh2b2lkKQogewotCWRpc2FibGVfdGltZXJfbm1pX3dhdGNoZG9nKCk7Ci0Jc2V0X25taV9jYWxsYmFjayhubWlfdGltZXJfY2FsbGJhY2spOworCWlmIChyZWdpc3Rlcl9kaWVfbm90aWZpZXIoJnByb2ZpbGVfdGltZXJfZXhjZXB0aW9uc19uYikpCisJCXJldHVybiAxOwogCXJldHVybiAwOwogfQogCiAKIHN0YXRpYyB2b2lkIHRpbWVyX3N0b3Aodm9pZCkKIHsKLQllbmFibGVfdGltZXJfbm1pX3dhdGNoZG9nKCk7Ci0JdW5zZXRfbm1pX2NhbGxiYWNrKCk7CisJdW5yZWdpc3Rlcl9kaWVfbm90aWZpZXIoJnByb2ZpbGVfdGltZXJfZXhjZXB0aW9uc19uYik7CiAJc3luY2hyb25pemVfc2NoZWQoKTsgIC8qIEFsbG93IGFscmVhZHktc3RhcnRlZCBOTUlzIHRvIGNvbXBsZXRlLiAqLwogfQogCiAKIGludCBfX2luaXQgb3Bfbm1pX3RpbWVyX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKiBvcHMpCiB7Ci0JZXh0ZXJuIGludCBubWlfYWN0aXZlOwotCi0JaWYgKG5taV9hY3RpdmUgPD0gMCkKKwlpZiAoKG5taV93YXRjaGRvZyAhPSBOTUlfSU9fQVBJQykgfHwgKGF0b21pY19yZWFkKCZubWlfYWN0aXZlKSA8PSAwKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlvcHMtPnN0YXJ0ID0gdGltZXJfc3RhcnQ7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfbW9kZWxfYXRobG9uLmMgYi9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfbW9kZWxfYXRobG9uLmMKaW5kZXggNjkzYmRlYS4uMzA1N2ExOSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L29wcm9maWxlL29wX21vZGVsX2F0aGxvbi5jCisrKyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hdGhsb24uYwpAQCAtMjEsMTAgKzIxLDEyIEBACiAjZGVmaW5lIE5VTV9DT1VOVEVSUyA0CiAjZGVmaW5lIE5VTV9DT05UUk9MUyA0CiAKKyNkZWZpbmUgQ1RSX0lTX1JFU0VSVkVEKG1zcnMsYykgKG1zcnMtPmNvdW50ZXJzWyhjKV0uYWRkciA/IDEgOiAwKQogI2RlZmluZSBDVFJfUkVBRChsLGgsbXNycyxjKSBkbyB7cmRtc3IobXNycy0+Y291bnRlcnNbKGMpXS5hZGRyLCAobCksIChoKSk7fSB3aGlsZSAoMCkKICNkZWZpbmUgQ1RSX1dSSVRFKGwsbXNycyxjKSBkbyB7d3Jtc3IobXNycy0+Y291bnRlcnNbKGMpXS5hZGRyLCAtKHVuc2lnbmVkIGludCkobCksIC0xKTt9IHdoaWxlICgwKQogI2RlZmluZSBDVFJfT1ZFUkZMT1dFRChuKSAoISgobikgJiAoMVU8PDMxKSkpCiAKKyNkZWZpbmUgQ1RSTF9JU19SRVNFUlZFRChtc3JzLGMpIChtc3JzLT5jb250cm9sc1soYyldLmFkZHIgPyAxIDogMCkKICNkZWZpbmUgQ1RSTF9SRUFEKGwsaCxtc3JzLGMpIGRvIHtyZG1zcihtc3JzLT5jb250cm9sc1soYyldLmFkZHIsIChsKSwgKGgpKTt9IHdoaWxlICgwKQogI2RlZmluZSBDVFJMX1dSSVRFKGwsaCxtc3JzLGMpIGRvIHt3cm1zcihtc3JzLT5jb250cm9sc1soYyldLmFkZHIsIChsKSwgKGgpKTt9IHdoaWxlICgwKQogI2RlZmluZSBDVFJMX1NFVF9BQ1RJVkUobikgKG4gfD0gKDE8PDIyKSkKQEAgLTQwLDE1ICs0MiwyMSBAQAogIAogc3RhdGljIHZvaWQgYXRobG9uX2ZpbGxfaW5fYWRkcmVzc2VzKHN0cnVjdCBvcF9tc3JzICogY29uc3QgbXNycykKIHsKLQltc3JzLT5jb3VudGVyc1swXS5hZGRyID0gTVNSX0s3X1BFUkZDVFIwOwotCW1zcnMtPmNvdW50ZXJzWzFdLmFkZHIgPSBNU1JfSzdfUEVSRkNUUjE7Ci0JbXNycy0+Y291bnRlcnNbMl0uYWRkciA9IE1TUl9LN19QRVJGQ1RSMjsKLQltc3JzLT5jb3VudGVyc1szXS5hZGRyID0gTVNSX0s3X1BFUkZDVFIzOworCWludCBpOwogCi0JbXNycy0+Y29udHJvbHNbMF0uYWRkciA9IE1TUl9LN19FVk5UU0VMMDsKLQltc3JzLT5jb250cm9sc1sxXS5hZGRyID0gTVNSX0s3X0VWTlRTRUwxOwotCW1zcnMtPmNvbnRyb2xzWzJdLmFkZHIgPSBNU1JfSzdfRVZOVFNFTDI7Ci0JbXNycy0+Y29udHJvbHNbM10uYWRkciA9IE1TUl9LN19FVk5UU0VMMzsKKwlmb3IgKGk9MDsgaSA8IE5VTV9DT1VOVEVSUzsgaSsrKSB7CisJCWlmIChyZXNlcnZlX3BlcmZjdHJfbm1pKE1TUl9LN19QRVJGQ1RSMCArIGkpKQorCQkJbXNycy0+Y291bnRlcnNbaV0uYWRkciA9IE1TUl9LN19QRVJGQ1RSMCArIGk7CisJCWVsc2UKKwkJCW1zcnMtPmNvdW50ZXJzW2ldLmFkZHIgPSAwOworCX0KKworCWZvciAoaT0wOyBpIDwgTlVNX0NPTlRST0xTOyBpKyspIHsKKwkJaWYgKHJlc2VydmVfZXZudHNlbF9ubWkoTVNSX0s3X0VWTlRTRUwwICsgaSkpCisJCQltc3JzLT5jb250cm9sc1tpXS5hZGRyID0gTVNSX0s3X0VWTlRTRUwwICsgaTsKKwkJZWxzZQorCQkJbXNycy0+Y29udHJvbHNbaV0uYWRkciA9IDA7CisJfQogfQogCiAgCkBAIC01OSwxOSArNjcsMjMgQEAKICAKIAkvKiBjbGVhciBhbGwgY291bnRlcnMgKi8KIAlmb3IgKGkgPSAwIDsgaSA8IE5VTV9DT05UUk9MUzsgKytpKSB7CisJCWlmICh1bmxpa2VseSghQ1RSTF9JU19SRVNFUlZFRChtc3JzLGkpKSkKKwkJCWNvbnRpbnVlOwogCQlDVFJMX1JFQUQobG93LCBoaWdoLCBtc3JzLCBpKTsKIAkJQ1RSTF9DTEVBUihsb3cpOwogCQlDVFJMX1dSSVRFKGxvdywgaGlnaCwgbXNycywgaSk7CiAJfQotCQorCiAJLyogYXZvaWQgYSBmYWxzZSBkZXRlY3Rpb24gb2YgY3RyIG92ZXJmbG93cyBpbiBOTUkgaGFuZGxlciAqLwogCWZvciAoaSA9IDA7IGkgPCBOVU1fQ09VTlRFUlM7ICsraSkgeworCQlpZiAodW5saWtlbHkoIUNUUl9JU19SRVNFUlZFRChtc3JzLGkpKSkKKwkJCWNvbnRpbnVlOwogCQlDVFJfV1JJVEUoMSwgbXNycywgaSk7CiAJfQogCiAJLyogZW5hYmxlIGFjdGl2ZSBjb3VudGVycyAqLwogCWZvciAoaSA9IDA7IGkgPCBOVU1fQ09VTlRFUlM7ICsraSkgewotCQlpZiAoY291bnRlcl9jb25maWdbaV0uZW5hYmxlZCkgeworCQlpZiAoKGNvdW50ZXJfY29uZmlnW2ldLmVuYWJsZWQpICYmIChDVFJfSVNfUkVTRVJWRUQobXNycyxpKSkpIHsKIAkJCXJlc2V0X3ZhbHVlW2ldID0gY291bnRlcl9jb25maWdbaV0uY291bnQ7CiAKIAkJCUNUUl9XUklURShjb3VudGVyX2NvbmZpZ1tpXS5jb3VudCwgbXNycywgaSk7CkBAIC05OCw2ICsxMTAsOCBAQAogCWludCBpOwogCiAJZm9yIChpID0gMCA7IGkgPCBOVU1fQ09VTlRFUlM7ICsraSkgeworCQlpZiAoIXJlc2V0X3ZhbHVlW2ldKQorCQkJY29udGludWU7CiAJCUNUUl9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7CiAJCWlmIChDVFJfT1ZFUkZMT1dFRChsb3cpKSB7CiAJCQlvcHJvZmlsZV9hZGRfc2FtcGxlKHJlZ3MsIGkpOwpAQCAtMTMyLDEyICsxNDYsMjcgQEAKIAkvKiBTdWJ0bGU6IHN0b3Agb24gYWxsIGNvdW50ZXJzIHRvIGF2b2lkIHJhY2Ugd2l0aAogCSAqIHNldHRpbmcgb3VyIHBtIGNhbGxiYWNrICovCiAJZm9yIChpID0gMCA7IGkgPCBOVU1fQ09VTlRFUlMgOyArK2kpIHsKKwkJaWYgKCFyZXNldF92YWx1ZVtpXSkKKwkJCWNvbnRpbnVlOwogCQlDVFJMX1JFQUQobG93LCBoaWdoLCBtc3JzLCBpKTsKIAkJQ1RSTF9TRVRfSU5BQ1RJVkUobG93KTsKIAkJQ1RSTF9XUklURShsb3csIGhpZ2gsIG1zcnMsIGkpOwogCX0KIH0KIAorc3RhdGljIHZvaWQgYXRobG9uX3NodXRkb3duKHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDAgOyBpIDwgTlVNX0NPVU5URVJTIDsgKytpKSB7CisJCWlmIChDVFJfSVNfUkVTRVJWRUQobXNycyxpKSkKKwkJCXJlbGVhc2VfcGVyZmN0cl9ubWkoTVNSX0s3X1BFUkZDVFIwICsgaSk7CisJfQorCWZvciAoaSA9IDAgOyBpIDwgTlVNX0NPTlRST0xTIDsgKytpKSB7CisJCWlmIChDVFJMX0lTX1JFU0VSVkVEKG1zcnMsaSkpCisJCQlyZWxlYXNlX2V2bnRzZWxfbm1pKE1TUl9LN19FVk5UU0VMMCArIGkpOworCX0KK30KIAogc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0IG9wX2F0aGxvbl9zcGVjID0gewogCS5udW1fY291bnRlcnMgPSBOVU1fQ09VTlRFUlMsCkBAIC0xNDYsNSArMTc1LDYgQEAKIAkuc2V0dXBfY3RycyA9ICZhdGhsb25fc2V0dXBfY3RycywKIAkuY2hlY2tfY3RycyA9ICZhdGhsb25fY2hlY2tfY3RycywKIAkuc3RhcnQgPSAmYXRobG9uX3N0YXJ0LAotCS5zdG9wID0gJmF0aGxvbl9zdG9wCisJLnN0b3AgPSAmYXRobG9uX3N0b3AsCisJLnNodXRkb3duID0gJmF0aGxvbl9zaHV0ZG93bgogfTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF9tb2RlbF9wNC5jIGIvYXJjaC9pMzg2L29wcm9maWxlL29wX21vZGVsX3A0LmMKaW5kZXggN2M2MWQzNS4uNDc5MjU5MiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L29wcm9maWxlL29wX21vZGVsX3A0LmMKKysrIGIvYXJjaC9pMzg2L29wcm9maWxlL29wX21vZGVsX3A0LmMKQEAgLTMyLDcgKzMyLDcgQEAKICNkZWZpbmUgTlVNX0NPTlRST0xTX0hUMiAoTlVNX0VTQ1JTX0hUMiArIE5VTV9DQ0NSU19IVDIpCiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzID0gTlVNX0NPVU5URVJTX05PTl9IVDsKLQorc3RhdGljIHVuc2lnbmVkIGludCBudW1fY29udHJvbHMgPSBOVU1fQ09OVFJPTFNfTk9OX0hUOwogCiAvKiB0aGlzIGhhcyB0byBiZSBjaGVja2VkIGR5bmFtaWNhbGx5IHNpbmNlIHRoZQogICAgaHlwZXItdGhyZWFkZWRuZXNzIG9mIGEgY2hpcCBpcyBkaXNjb3ZlcmVkIGF0CkBAIC00MCw4ICs0MCwxMCBAQAogc3RhdGljIGlubGluZSB2b2lkIHNldHVwX251bV9jb3VudGVycyh2b2lkKQogewogI2lmZGVmIENPTkZJR19TTVAKLQlpZiAoc21wX251bV9zaWJsaW5ncyA9PSAyKQorCWlmIChzbXBfbnVtX3NpYmxpbmdzID09IDIpewogCQludW1fY291bnRlcnMgPSBOVU1fQ09VTlRFUlNfSFQyOworCQludW1fY29udHJvbHMgPSBOVU1fQ09OVFJPTFNfSFQyOworCX0KICNlbmRpZgogfQogCkBAIC05NywxNSArOTksNiBAQAogCiAjZGVmaW5lIE5VTV9VTlVTRURfQ0NDUlMJTlVNX0NDQ1JTX05PTl9IVCAtIE5VTV9DT1VOVEVSU19OT05fSFQKIAotLyogQWxsIGNjY3Igd2UgZG9uJ3QgdXNlLiAqLwotc3RhdGljIGludCBwNF91bnVzZWRfY2NjcltOVU1fVU5VU0VEX0NDQ1JTXSA9IHsKLQlNU1JfUDRfQlBVX0NDQ1IxLAlNU1JfUDRfQlBVX0NDQ1IzLAotCU1TUl9QNF9NU19DQ0NSMSwJTVNSX1A0X01TX0NDQ1IzLAotCU1TUl9QNF9GTEFNRV9DQ0NSMSwJTVNSX1A0X0ZMQU1FX0NDQ1IzLAotCU1TUl9QNF9JUV9DQ0NSMCwJTVNSX1A0X0lRX0NDQ1IxLAotCU1TUl9QNF9JUV9DQ0NSMiwJTVNSX1A0X0lRX0NDQ1IzCi19OwotCiAvKiBwNCBldmVudCBjb2RlcyBpbiBsaWJvcC9vcF9ldmVudC5oIGFyZSBpbmRpY2VzIGludG8gdGhpcyB0YWJsZS4gKi8KIAogc3RhdGljIHN0cnVjdCBwNF9ldmVudF9iaW5kaW5nIHA0X2V2ZW50c1tOVU1fRVZFTlRTXSA9IHsKQEAgLTM3Miw2ICszNjUsOCBAQAogI2RlZmluZSBDQ0NSX09WRl9QKGNjY3IpICgoY2NjcikgJiAoMVU8PDMxKSkKICNkZWZpbmUgQ0NDUl9DTEVBUl9PVkYoY2NjcikgKChjY2NyKSAmPSAofigxVTw8MzEpKSkKIAorI2RlZmluZSBDVFJMX0lTX1JFU0VSVkVEKG1zcnMsYykgKG1zcnMtPmNvbnRyb2xzWyhjKV0uYWRkciA/IDEgOiAwKQorI2RlZmluZSBDVFJfSVNfUkVTRVJWRUQobXNycyxjKSAobXNycy0+Y291bnRlcnNbKGMpXS5hZGRyID8gMSA6IDApCiAjZGVmaW5lIENUUl9SRUFEKGwsaCxpKSBkbyB7cmRtc3IocDRfY291bnRlcnNbKGkpXS5jb3VudGVyX2FkZHJlc3MsIChsKSwgKGgpKTt9IHdoaWxlICgwKQogI2RlZmluZSBDVFJfV1JJVEUobCxpKSBkbyB7d3Jtc3IocDRfY291bnRlcnNbKGkpXS5jb3VudGVyX2FkZHJlc3MsIC0odTMyKShsKSwgLTEpO30gd2hpbGUgKDApCiAjZGVmaW5lIENUUl9PVkVSRkxPV19QKGN0cikgKCEoKGN0cikgJiAweDgwMDAwMDAwKSkKQEAgLTQwMSwyOSArMzk2LDM0IEBACiBzdGF0aWMgdm9pZCBwNF9maWxsX2luX2FkZHJlc3NlcyhzdHJ1Y3Qgb3BfbXNycyAqIGNvbnN0IG1zcnMpCiB7CiAJdW5zaWduZWQgaW50IGk7IAotCXVuc2lnbmVkIGludCBhZGRyLCBzdGFnOworCXVuc2lnbmVkIGludCBhZGRyLCBjY2NyYWRkciwgc3RhZzsKIAogCXNldHVwX251bV9jb3VudGVycygpOwogCXN0YWcgPSBnZXRfc3RhZ2dlcigpOwogCi0JLyogdGhlIGNvdW50ZXIgcmVnaXN0ZXJzIHdlIHBheSBhdHRlbnRpb24gdG8gKi8KKwkvKiBpbml0aWFsaXplIHNvbWUgcmVnaXN0ZXJzICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7Ci0JCW1zcnMtPmNvdW50ZXJzW2ldLmFkZHIgPSAKLQkJCXA0X2NvdW50ZXJzW1ZJUlRfQ1RSKHN0YWcsIGkpXS5jb3VudGVyX2FkZHJlc3M7CisJCW1zcnMtPmNvdW50ZXJzW2ldLmFkZHIgPSAwOwogCX0KLQotCS8qIEZJWE1FOiBiYWQgZmVlbGluZywgd2UgZG9uJ3Qgc2F2ZSB0aGUgMTAgY291bnRlcnMgd2UgZG9uJ3QgdXNlLiAqLwotCi0JLyogMTggQ0NDUiByZWdpc3RlcnMgKi8KLQlmb3IgKGkgPSAwLCBhZGRyID0gTVNSX1A0X0JQVV9DQ0NSMCArIHN0YWc7Ci0JICAgICBhZGRyIDw9IE1TUl9QNF9JUV9DQ0NSNTsgKytpLCBhZGRyICs9IGFkZHJfaW5jcmVtZW50KCkpIHsKLQkJbXNycy0+Y29udHJvbHNbaV0uYWRkciA9IGFkZHI7CisJZm9yIChpID0gMDsgaSA8IG51bV9jb250cm9sczsgKytpKSB7CisJCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSAwOwogCX0KIAkKKwkvKiB0aGUgY291bnRlciAmIGNjY3IgcmVnaXN0ZXJzIHdlIHBheSBhdHRlbnRpb24gdG8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpIHsKKwkJYWRkciA9IHA0X2NvdW50ZXJzW1ZJUlRfQ1RSKHN0YWcsIGkpXS5jb3VudGVyX2FkZHJlc3M7CisJCWNjY3JhZGRyID0gcDRfY291bnRlcnNbVklSVF9DVFIoc3RhZywgaSldLmNjY3JfYWRkcmVzczsKKwkJaWYgKHJlc2VydmVfcGVyZmN0cl9ubWkoYWRkcikpeworCQkJbXNycy0+Y291bnRlcnNbaV0uYWRkciA9IGFkZHI7CisJCQltc3JzLT5jb250cm9sc1tpXS5hZGRyID0gY2NjcmFkZHI7CisJCX0KKwl9CisKIAkvKiA0MyBFU0NSIHJlZ2lzdGVycyBpbiB0aHJlZSBvciBmb3VyIGRpc2NvbnRpZ3VvdXMgZ3JvdXAgKi8KIAlmb3IgKGFkZHIgPSBNU1JfUDRfQlNVX0VTQ1IwICsgc3RhZzsKIAkgICAgIGFkZHIgPCBNU1JfUDRfSVFfRVNDUjA7ICsraSwgYWRkciArPSBhZGRyX2luY3JlbWVudCgpKSB7Ci0JCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSBhZGRyOworCQlpZiAocmVzZXJ2ZV9ldm50c2VsX25taShhZGRyKSkKKwkJCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSBhZGRyOwogCX0KIAogCS8qIG5vIElRX0VTQ1IwLzEgb24gc29tZSBtb2RlbHMsIHdlIHNhdmUgYSBzZWNvbmRlIHRpbWUgQlNVX0VTQ1IwLzEKQEAgLTQzMSw0NyArNDMxLDU3IEBACiAJaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsID49IDB4MykgewogCQlmb3IgKGFkZHIgPSBNU1JfUDRfQlNVX0VTQ1IwICsgc3RhZzsKIAkJICAgICBhZGRyIDw9IE1TUl9QNF9CU1VfRVNDUjE7ICsraSwgYWRkciArPSBhZGRyX2luY3JlbWVudCgpKSB7Ci0JCQltc3JzLT5jb250cm9sc1tpXS5hZGRyID0gYWRkcjsKKwkJCWlmIChyZXNlcnZlX2V2bnRzZWxfbm1pKGFkZHIpKQorCQkJCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSBhZGRyOwogCQl9CiAJfSBlbHNlIHsKIAkJZm9yIChhZGRyID0gTVNSX1A0X0lRX0VTQ1IwICsgc3RhZzsKIAkJICAgICBhZGRyIDw9IE1TUl9QNF9JUV9FU0NSMTsgKytpLCBhZGRyICs9IGFkZHJfaW5jcmVtZW50KCkpIHsKLQkJCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSBhZGRyOworCQkJaWYgKHJlc2VydmVfZXZudHNlbF9ubWkoYWRkcikpCisJCQkJbXNycy0+Y29udHJvbHNbaV0uYWRkciA9IGFkZHI7CiAJCX0KIAl9CiAKIAlmb3IgKGFkZHIgPSBNU1JfUDRfUkFUX0VTQ1IwICsgc3RhZzsKIAkgICAgIGFkZHIgPD0gTVNSX1A0X1NTVV9FU0NSMDsgKytpLCBhZGRyICs9IGFkZHJfaW5jcmVtZW50KCkpIHsKLQkJbXNycy0+Y29udHJvbHNbaV0uYWRkciA9IGFkZHI7CisJCWlmIChyZXNlcnZlX2V2bnRzZWxfbm1pKGFkZHIpKQorCQkJbXNycy0+Y29udHJvbHNbaV0uYWRkciA9IGFkZHI7CiAJfQogCQogCWZvciAoYWRkciA9IE1TUl9QNF9NU19FU0NSMCArIHN0YWc7CiAJICAgICBhZGRyIDw9IE1TUl9QNF9UQ19FU0NSMTsgKytpLCBhZGRyICs9IGFkZHJfaW5jcmVtZW50KCkpIHsgCi0JCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSBhZGRyOworCQlpZiAocmVzZXJ2ZV9ldm50c2VsX25taShhZGRyKSkKKwkJCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSBhZGRyOwogCX0KIAkKIAlmb3IgKGFkZHIgPSBNU1JfUDRfSVhfRVNDUjAgKyBzdGFnOwogCSAgICAgYWRkciA8PSBNU1JfUDRfQ1JVX0VTQ1IzOyArK2ksIGFkZHIgKz0gYWRkcl9pbmNyZW1lbnQoKSkgeyAKLQkJbXNycy0+Y29udHJvbHNbaV0uYWRkciA9IGFkZHI7CisJCWlmIChyZXNlcnZlX2V2bnRzZWxfbm1pKGFkZHIpKQorCQkJbXNycy0+Y29udHJvbHNbaV0uYWRkciA9IGFkZHI7CiAJfQogCiAJLyogdGhlcmUgYXJlIDIgcmVtYWluaW5nIG5vbi1jb250aWd1b3VzbHkgbG9jYXRlZCBFU0NScyAqLwogCiAJaWYgKG51bV9jb3VudGVycyA9PSBOVU1fQ09VTlRFUlNfTk9OX0hUKSB7CQkKIAkJLyogc3RhbmRhcmQgbm9uLUhUIENQVXMgaGFuZGxlIGJvdGggcmVtYWluaW5nIEVTQ1JzKi8KLQkJbXNycy0+Y29udHJvbHNbaSsrXS5hZGRyID0gTVNSX1A0X0NSVV9FU0NSNTsKLQkJbXNycy0+Y29udHJvbHNbaSsrXS5hZGRyID0gTVNSX1A0X0NSVV9FU0NSNDsKKwkJaWYgKHJlc2VydmVfZXZudHNlbF9ubWkoTVNSX1A0X0NSVV9FU0NSNSkpCisJCQltc3JzLT5jb250cm9sc1tpKytdLmFkZHIgPSBNU1JfUDRfQ1JVX0VTQ1I1OworCQlpZiAocmVzZXJ2ZV9ldm50c2VsX25taShNU1JfUDRfQ1JVX0VTQ1I0KSkKKwkJCW1zcnMtPmNvbnRyb2xzW2krK10uYWRkciA9IE1TUl9QNF9DUlVfRVNDUjQ7CiAKIAl9IGVsc2UgaWYgKHN0YWcgPT0gMCkgewogCQkvKiBIVCBDUFVzIGdpdmUgdGhlIGZpcnN0IHJlbWFpbmRlciB0byB0aGUgZXZlbiB0aHJlYWQsIGFzCiAJCSAgIHRoZSAzMm5kIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQkJbXNycy0+Y29udHJvbHNbaSsrXS5hZGRyID0gTVNSX1A0X0NSVV9FU0NSNDsKKwkJaWYgKHJlc2VydmVfZXZudHNlbF9ubWkoTVNSX1A0X0NSVV9FU0NSNCkpCisJCQltc3JzLT5jb250cm9sc1tpKytdLmFkZHIgPSBNU1JfUDRfQ1JVX0VTQ1I0OwogCiAJfSBlbHNlIHsKIAkJLyogYW5kIHR3byBjb3BpZXMgb2YgdGhlIHNlY29uZCB0byB0aGUgb2RkIHRocmVhZCwKIAkJICAgZm9yIHRoZSAyMnN0IGFuZCAyM25kIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0JCW1zcnMtPmNvbnRyb2xzW2krK10uYWRkciA9IE1TUl9QNF9DUlVfRVNDUjU7Ci0JCW1zcnMtPmNvbnRyb2xzW2krK10uYWRkciA9IE1TUl9QNF9DUlVfRVNDUjU7CisJCWlmIChyZXNlcnZlX2V2bnRzZWxfbm1pKE1TUl9QNF9DUlVfRVNDUjUpKSB7CisJCQltc3JzLT5jb250cm9sc1tpKytdLmFkZHIgPSBNU1JfUDRfQ1JVX0VTQ1I1OworCQkJbXNycy0+Y29udHJvbHNbaSsrXS5hZGRyID0gTVNSX1A0X0NSVV9FU0NSNTsKKwkJfQogCX0KIH0KIApAQCAtNTQ0LDcgKzU1NCw2IEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgaW50IGxvdywgaGlnaDsKLQl1bnNpZ25lZCBpbnQgYWRkcjsKIAl1bnNpZ25lZCBpbnQgc3RhZzsKIAogCXN0YWcgPSBnZXRfc3RhZ2dlcigpOwpAQCAtNTU3LDU5ICs1NjYsMjQgQEAKIAogCS8qIGNsZWFyIHRoZSBjY2NycyB3ZSB3aWxsIHVzZSAqLwogCWZvciAoaSA9IDAgOyBpIDwgbnVtX2NvdW50ZXJzIDsgaSsrKSB7CisJCWlmICh1bmxpa2VseSghQ1RSTF9JU19SRVNFUlZFRChtc3JzLGkpKSkKKwkJCWNvbnRpbnVlOwogCQlyZG1zcihwNF9jb3VudGVyc1tWSVJUX0NUUihzdGFnLCBpKV0uY2Njcl9hZGRyZXNzLCBsb3csIGhpZ2gpOwogCQlDQ0NSX0NMRUFSKGxvdyk7CiAJCUNDQ1JfU0VUX1JFUVVJUkVEX0JJVFMobG93KTsKIAkJd3Jtc3IocDRfY291bnRlcnNbVklSVF9DVFIoc3RhZywgaSldLmNjY3JfYWRkcmVzcywgbG93LCBoaWdoKTsKIAl9CiAKLQkvKiBjbGVhciBjY2NycyBvdXRzaWRlIG91ciBjb25jZXJuICovCi0JZm9yIChpID0gc3RhZyA7IGkgPCBOVU1fVU5VU0VEX0NDQ1JTIDsgaSArPSBhZGRyX2luY3JlbWVudCgpKSB7Ci0JCXJkbXNyKHA0X3VudXNlZF9jY2NyW2ldLCBsb3csIGhpZ2gpOwotCQlDQ0NSX0NMRUFSKGxvdyk7Ci0JCUNDQ1JfU0VUX1JFUVVJUkVEX0JJVFMobG93KTsKLQkJd3Jtc3IocDRfdW51c2VkX2NjY3JbaV0sIGxvdywgaGlnaCk7Ci0JfQotCiAJLyogY2xlYXIgYWxsIGVzY3JzIChpbmNsdWRpbmcgdGhvc2Ugb3V0c2lkZSBvdXIgY29uY2VybikgKi8KLQlmb3IgKGFkZHIgPSBNU1JfUDRfQlNVX0VTQ1IwICsgc3RhZzsKLQkgICAgIGFkZHIgPCAgTVNSX1A0X0lRX0VTQ1IwOyBhZGRyICs9IGFkZHJfaW5jcmVtZW50KCkpIHsKLQkJd3Jtc3IoYWRkciwgMCwgMCk7CisJZm9yIChpID0gbnVtX2NvdW50ZXJzOyBpIDwgbnVtX2NvbnRyb2xzOyBpKyspIHsKKwkJaWYgKHVubGlrZWx5KCFDVFJMX0lTX1JFU0VSVkVEKG1zcnMsaSkpKQorCQkJY29udGludWU7CisJCXdybXNyKG1zcnMtPmNvbnRyb2xzW2ldLmFkZHIsIDAsIDApOwogCX0KIAotCS8qIE9uIG9sZGVyIG1vZGVscyBjbGVhciBhbHNvIE1TUl9QNF9JUV9FU0NSMC8xICovCi0JaWYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsIDwgMHgzKSB7Ci0JCXdybXNyKE1TUl9QNF9JUV9FU0NSMCwgMCwgMCk7Ci0JCXdybXNyKE1TUl9QNF9JUV9FU0NSMSwgMCwgMCk7Ci0JfQotCi0JZm9yIChhZGRyID0gTVNSX1A0X1JBVF9FU0NSMCArIHN0YWc7Ci0JICAgICBhZGRyIDw9IE1TUl9QNF9TU1VfRVNDUjA7ICsraSwgYWRkciArPSBhZGRyX2luY3JlbWVudCgpKSB7Ci0JCXdybXNyKGFkZHIsIDAsIDApOwotCX0KLQkKLQlmb3IgKGFkZHIgPSBNU1JfUDRfTVNfRVNDUjAgKyBzdGFnOwotCSAgICAgYWRkciA8PSBNU1JfUDRfVENfRVNDUjE7IGFkZHIgKz0gYWRkcl9pbmNyZW1lbnQoKSl7IAotCQl3cm1zcihhZGRyLCAwLCAwKTsKLQl9Ci0JCi0JZm9yIChhZGRyID0gTVNSX1A0X0lYX0VTQ1IwICsgc3RhZzsKLQkgICAgIGFkZHIgPD0gTVNSX1A0X0NSVV9FU0NSMzsgYWRkciArPSBhZGRyX2luY3JlbWVudCgpKXsgCi0JCXdybXNyKGFkZHIsIDAsIDApOwotCX0KLQotCWlmIChudW1fY291bnRlcnMgPT0gTlVNX0NPVU5URVJTX05PTl9IVCkgewkJCi0JCXdybXNyKE1TUl9QNF9DUlVfRVNDUjQsIDAsIDApOwotCQl3cm1zcihNU1JfUDRfQ1JVX0VTQ1I1LCAwLCAwKTsKLQl9IGVsc2UgaWYgKHN0YWcgPT0gMCkgewotCQl3cm1zcihNU1JfUDRfQ1JVX0VTQ1I0LCAwLCAwKTsKLQl9IGVsc2UgewotCQl3cm1zcihNU1JfUDRfQ1JVX0VTQ1I1LCAwLCAwKTsKLQl9CQkKLQkKIAkvKiBzZXR1cCBhbGwgY291bnRlcnMgKi8KIAlmb3IgKGkgPSAwIDsgaSA8IG51bV9jb3VudGVycyA7ICsraSkgewotCQlpZiAoY291bnRlcl9jb25maWdbaV0uZW5hYmxlZCkgeworCQlpZiAoKGNvdW50ZXJfY29uZmlnW2ldLmVuYWJsZWQpICYmIChDVFJMX0lTX1JFU0VSVkVEKG1zcnMsaSkpKSB7CiAJCQlyZXNldF92YWx1ZVtpXSA9IGNvdW50ZXJfY29uZmlnW2ldLmNvdW50OwogCQkJcG1jX3NldHVwX29uZV9wNF9jb3VudGVyKGkpOwogCQkJQ1RSX1dSSVRFKGNvdW50ZXJfY29uZmlnW2ldLmNvdW50LCBWSVJUX0NUUihzdGFnLCBpKSk7CkBAIC02OTYsMTIgKzY3MCwzMiBAQAogCXN0YWcgPSBnZXRfc3RhZ2dlcigpOwogCiAJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CisJCWlmICghcmVzZXRfdmFsdWVbaV0pCisJCQljb250aW51ZTsKIAkJQ0NDUl9SRUFEKGxvdywgaGlnaCwgVklSVF9DVFIoc3RhZywgaSkpOwogCQlDQ0NSX1NFVF9ESVNBQkxFKGxvdyk7CiAJCUNDQ1JfV1JJVEUobG93LCBoaWdoLCBWSVJUX0NUUihzdGFnLCBpKSk7CiAJfQogfQogCitzdGF0aWMgdm9pZCBwNF9zaHV0ZG93bihzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwIDsgaSA8IG51bV9jb3VudGVycyA7ICsraSkgeworCQlpZiAoQ1RSX0lTX1JFU0VSVkVEKG1zcnMsaSkpCisJCQlyZWxlYXNlX3BlcmZjdHJfbm1pKG1zcnMtPmNvdW50ZXJzW2ldLmFkZHIpOworCX0KKwkvKiBzb21lIG9mIHRoZSBjb250cm9sIHJlZ2lzdGVycyBhcmUgc3BlY2lhbGx5IHJlc2VydmVkIGluCisJICogY29uanVuY3Rpb24gd2l0aCB0aGUgY291bnRlciByZWdpc3RlcnMgKGhlbmNlIHRoZSBzdGFydGluZyBvZmZzZXQpLgorCSAqIFRoaXMgc2F2ZXMgYSBmZXcgYml0cy4KKwkgKi8KKwlmb3IgKGkgPSBudW1fY291bnRlcnMgOyBpIDwgbnVtX2NvbnRyb2xzIDsgKytpKSB7CisJCWlmIChDVFJMX0lTX1JFU0VSVkVEKG1zcnMsaSkpCisJCQlyZWxlYXNlX2V2bnRzZWxfbm1pKG1zcnMtPmNvbnRyb2xzW2ldLmFkZHIpOworCX0KK30KKwogCiAjaWZkZWYgQ09ORklHX1NNUAogc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0IG9wX3A0X2h0Ml9zcGVjID0gewpAQCAtNzExLDcgKzcwNSw4IEBACiAJLnNldHVwX2N0cnMgPSAmcDRfc2V0dXBfY3RycywKIAkuY2hlY2tfY3RycyA9ICZwNF9jaGVja19jdHJzLAogCS5zdGFydCA9ICZwNF9zdGFydCwKLQkuc3RvcCA9ICZwNF9zdG9wCisJLnN0b3AgPSAmcDRfc3RvcCwKKwkuc2h1dGRvd24gPSAmcDRfc2h1dGRvd24KIH07CiAjZW5kaWYKIApAQCAtNzIyLDUgKzcxNyw2IEBACiAJLnNldHVwX2N0cnMgPSAmcDRfc2V0dXBfY3RycywKIAkuY2hlY2tfY3RycyA9ICZwNF9jaGVja19jdHJzLAogCS5zdGFydCA9ICZwNF9zdGFydCwKLQkuc3RvcCA9ICZwNF9zdG9wCisJLnN0b3AgPSAmcDRfc3RvcCwKKwkuc2h1dGRvd24gPSAmcDRfc2h1dGRvd24KIH07CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfbW9kZWxfcHByby5jIGIvYXJjaC9pMzg2L29wcm9maWxlL29wX21vZGVsX3Bwcm8uYwppbmRleCA1YzNhYjRiLi5mODhlMDViIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfbW9kZWxfcHByby5jCisrKyBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF9tb2RlbF9wcHJvLmMKQEAgLTIyLDEwICsyMiwxMiBAQAogI2RlZmluZSBOVU1fQ09VTlRFUlMgMgogI2RlZmluZSBOVU1fQ09OVFJPTFMgMgogCisjZGVmaW5lIENUUl9JU19SRVNFUlZFRChtc3JzLGMpIChtc3JzLT5jb3VudGVyc1soYyldLmFkZHIgPyAxIDogMCkKICNkZWZpbmUgQ1RSX1JFQUQobCxoLG1zcnMsYykgZG8ge3JkbXNyKG1zcnMtPmNvdW50ZXJzWyhjKV0uYWRkciwgKGwpLCAoaCkpO30gd2hpbGUgKDApCiAjZGVmaW5lIENUUl9XUklURShsLG1zcnMsYykgZG8ge3dybXNyKG1zcnMtPmNvdW50ZXJzWyhjKV0uYWRkciwgLSh1MzIpKGwpLCAtMSk7fSB3aGlsZSAoMCkKICNkZWZpbmUgQ1RSX09WRVJGTE9XRUQobikgKCEoKG4pICYgKDFVPDwzMSkpKQogCisjZGVmaW5lIENUUkxfSVNfUkVTRVJWRUQobXNycyxjKSAobXNycy0+Y29udHJvbHNbKGMpXS5hZGRyID8gMSA6IDApCiAjZGVmaW5lIENUUkxfUkVBRChsLGgsbXNycyxjKSBkbyB7cmRtc3IoKG1zcnMtPmNvbnRyb2xzWyhjKV0uYWRkciksIChsKSwgKGgpKTt9IHdoaWxlICgwKQogI2RlZmluZSBDVFJMX1dSSVRFKGwsaCxtc3JzLGMpIGRvIHt3cm1zcigobXNycy0+Y29udHJvbHNbKGMpXS5hZGRyKSwgKGwpLCAoaCkpO30gd2hpbGUgKDApCiAjZGVmaW5lIENUUkxfU0VUX0FDVElWRShuKSAobiB8PSAoMTw8MjIpKQpAQCAtNDEsMTEgKzQzLDIxIEBACiAgCiBzdGF0aWMgdm9pZCBwcHJvX2ZpbGxfaW5fYWRkcmVzc2VzKHN0cnVjdCBvcF9tc3JzICogY29uc3QgbXNycykKIHsKLQltc3JzLT5jb3VudGVyc1swXS5hZGRyID0gTVNSX1A2X1BFUkZDVFIwOwotCW1zcnMtPmNvdW50ZXJzWzFdLmFkZHIgPSBNU1JfUDZfUEVSRkNUUjE7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaSA8IE5VTV9DT1VOVEVSUzsgaSsrKSB7CisJCWlmIChyZXNlcnZlX3BlcmZjdHJfbm1pKE1TUl9QNl9QRVJGQ1RSMCArIGkpKQorCQkJbXNycy0+Y291bnRlcnNbaV0uYWRkciA9IE1TUl9QNl9QRVJGQ1RSMCArIGk7CisJCWVsc2UKKwkJCW1zcnMtPmNvdW50ZXJzW2ldLmFkZHIgPSAwOworCX0KIAkKLQltc3JzLT5jb250cm9sc1swXS5hZGRyID0gTVNSX1A2X0VWTlRTRUwwOwotCW1zcnMtPmNvbnRyb2xzWzFdLmFkZHIgPSBNU1JfUDZfRVZOVFNFTDE7CisJZm9yIChpPTA7IGkgPCBOVU1fQ09OVFJPTFM7IGkrKykgeworCQlpZiAocmVzZXJ2ZV9ldm50c2VsX25taShNU1JfUDZfRVZOVFNFTDAgKyBpKSkKKwkJCW1zcnMtPmNvbnRyb2xzW2ldLmFkZHIgPSBNU1JfUDZfRVZOVFNFTDAgKyBpOworCQllbHNlCisJCQltc3JzLT5jb250cm9sc1tpXS5hZGRyID0gMDsKKwl9CiB9CiAKIApAQCAtNTYsNiArNjgsOCBAQAogCiAJLyogY2xlYXIgYWxsIGNvdW50ZXJzICovCiAJZm9yIChpID0gMCA7IGkgPCBOVU1fQ09OVFJPTFM7ICsraSkgeworCQlpZiAodW5saWtlbHkoIUNUUkxfSVNfUkVTRVJWRUQobXNycyxpKSkpCisJCQljb250aW51ZTsKIAkJQ1RSTF9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7CiAJCUNUUkxfQ0xFQVIobG93KTsKIAkJQ1RSTF9XUklURShsb3csIGhpZ2gsIG1zcnMsIGkpOwpAQCAtNjMsMTIgKzc3LDE0IEBACiAJCiAJLyogYXZvaWQgYSBmYWxzZSBkZXRlY3Rpb24gb2YgY3RyIG92ZXJmbG93cyBpbiBOTUkgaGFuZGxlciAqLwogCWZvciAoaSA9IDA7IGkgPCBOVU1fQ09VTlRFUlM7ICsraSkgeworCQlpZiAodW5saWtlbHkoIUNUUl9JU19SRVNFUlZFRChtc3JzLGkpKSkKKwkJCWNvbnRpbnVlOwogCQlDVFJfV1JJVEUoMSwgbXNycywgaSk7CiAJfQogCiAJLyogZW5hYmxlIGFjdGl2ZSBjb3VudGVycyAqLwogCWZvciAoaSA9IDA7IGkgPCBOVU1fQ09VTlRFUlM7ICsraSkgewotCQlpZiAoY291bnRlcl9jb25maWdbaV0uZW5hYmxlZCkgeworCQlpZiAoKGNvdW50ZXJfY29uZmlnW2ldLmVuYWJsZWQpICYmIChDVFJfSVNfUkVTRVJWRUQobXNycyxpKSkpIHsKIAkJCXJlc2V0X3ZhbHVlW2ldID0gY291bnRlcl9jb25maWdbaV0uY291bnQ7CiAKIAkJCUNUUl9XUklURShjb3VudGVyX2NvbmZpZ1tpXS5jb3VudCwgbXNycywgaSk7CkBAIC04MSw2ICs5Nyw4IEBACiAJCQlDVFJMX1NFVF9VTShsb3csIGNvdW50ZXJfY29uZmlnW2ldLnVuaXRfbWFzayk7CiAJCQlDVFJMX1NFVF9FVkVOVChsb3csIGNvdW50ZXJfY29uZmlnW2ldLmV2ZW50KTsKIAkJCUNUUkxfV1JJVEUobG93LCBoaWdoLCBtc3JzLCBpKTsKKwkJfSBlbHNlIHsKKwkJCXJlc2V0X3ZhbHVlW2ldID0gMDsKIAkJfQogCX0KIH0KQEAgLTkzLDYgKzExMSw4IEBACiAJaW50IGk7CiAgCiAJZm9yIChpID0gMCA7IGkgPCBOVU1fQ09VTlRFUlM7ICsraSkgeworCQlpZiAoIXJlc2V0X3ZhbHVlW2ldKQorCQkJY29udGludWU7CiAJCUNUUl9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7CiAJCWlmIChDVFJfT1ZFUkZMT1dFRChsb3cpKSB7CiAJCQlvcHJvZmlsZV9hZGRfc2FtcGxlKHJlZ3MsIGkpOwpAQCAtMTE4LDE4ICsxMzgsMzggQEAKIHN0YXRpYyB2b2lkIHBwcm9fc3RhcnQoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQogewogCXVuc2lnbmVkIGludCBsb3csaGlnaDsKLQlDVFJMX1JFQUQobG93LCBoaWdoLCBtc3JzLCAwKTsKLQlDVFJMX1NFVF9BQ1RJVkUobG93KTsKLQlDVFJMX1dSSVRFKGxvdywgaGlnaCwgbXNycywgMCk7CisKKwlpZiAocmVzZXRfdmFsdWVbMF0pIHsKKwkJQ1RSTF9SRUFEKGxvdywgaGlnaCwgbXNycywgMCk7CisJCUNUUkxfU0VUX0FDVElWRShsb3cpOworCQlDVFJMX1dSSVRFKGxvdywgaGlnaCwgbXNycywgMCk7CisJfQogfQogCiAKIHN0YXRpYyB2b2lkIHBwcm9fc3RvcChzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpCiB7CiAJdW5zaWduZWQgaW50IGxvdyxoaWdoOwotCUNUUkxfUkVBRChsb3csIGhpZ2gsIG1zcnMsIDApOwotCUNUUkxfU0VUX0lOQUNUSVZFKGxvdyk7Ci0JQ1RSTF9XUklURShsb3csIGhpZ2gsIG1zcnMsIDApOworCisJaWYgKHJlc2V0X3ZhbHVlWzBdKSB7CisJCUNUUkxfUkVBRChsb3csIGhpZ2gsIG1zcnMsIDApOworCQlDVFJMX1NFVF9JTkFDVElWRShsb3cpOworCQlDVFJMX1dSSVRFKGxvdywgaGlnaCwgbXNycywgMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcHJvX3NodXRkb3duKHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDAgOyBpIDwgTlVNX0NPVU5URVJTIDsgKytpKSB7CisJCWlmIChDVFJfSVNfUkVTRVJWRUQobXNycyxpKSkKKwkJCXJlbGVhc2VfcGVyZmN0cl9ubWkoTVNSX1A2X1BFUkZDVFIwICsgaSk7CisJfQorCWZvciAoaSA9IDAgOyBpIDwgTlVNX0NPTlRST0xTIDsgKytpKSB7CisJCWlmIChDVFJMX0lTX1JFU0VSVkVEKG1zcnMsaSkpCisJCQlyZWxlYXNlX2V2bnRzZWxfbm1pKE1TUl9QNl9FVk5UU0VMMCArIGkpOworCX0KIH0KIAogCkBAIC0xNDAsNSArMTgwLDYgQEAKIAkuc2V0dXBfY3RycyA9ICZwcHJvX3NldHVwX2N0cnMsCiAJLmNoZWNrX2N0cnMgPSAmcHByb19jaGVja19jdHJzLAogCS5zdGFydCA9ICZwcHJvX3N0YXJ0LAotCS5zdG9wID0gJnBwcm9fc3RvcAorCS5zdG9wID0gJnBwcm9fc3RvcCwKKwkuc2h1dGRvd24gPSAmcHByb19zaHV0ZG93bgogfTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF94ODZfbW9kZWwuaCBiL2FyY2gvaTM4Ni9vcHJvZmlsZS9vcF94ODZfbW9kZWwuaAppbmRleCAxMjNiN2U5Li5hYmIxYWE5IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvb3Byb2ZpbGUvb3BfeDg2X21vZGVsLmgKKysrIGIvYXJjaC9pMzg2L29wcm9maWxlL29wX3g4Nl9tb2RlbC5oCkBAIC00MCw2ICs0MCw3IEBACiAJCXN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycyk7CiAJdm9pZCAoKnN0YXJ0KShzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpOwogCXZvaWQgKCpzdG9wKShzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpOworCXZvaWQgKCpzaHV0ZG93bikoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKTsKIH07CiAKIGV4dGVybiBzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgY29uc3Qgb3BfcHByb19zcGVjOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9NYWtlZmlsZSBiL2FyY2gvaTM4Ni9wY2kvTWFrZWZpbGUKaW5kZXggNjJhZDc1Yy4uMTU5NGQyZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9NYWtlZmlsZQorKysgYi9hcmNoL2kzODYvcGNpL01ha2VmaWxlCkBAIC0xMSw0ICsxMSw0IEBACiBwY2ktJChDT05GSUdfWDg2X1ZJU1dTKQkJOj0gdmlzd3MubyBmaXh1cC5vCiBwY2ktJChDT05GSUdfWDg2X05VTUFRKQkJOj0gbnVtYS5vIGlycS5vCiAKLW9iai15CQkJCSs9ICQocGNpLXkpIGNvbW1vbi5vCitvYmoteQkJCQkrPSAkKHBjaS15KSBjb21tb24ubyBlYXJseS5vCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2NvbW1vbi5jIGIvYXJjaC9pMzg2L3BjaS9jb21tb24uYwppbmRleCAwYTM2MmUzLi42OGJjZTE5NCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9jb21tb24uYworKysgYi9hcmNoL2kzODYvcGNpL2NvbW1vbi5jCkBAIC0yNDIsNiArMjQyLDEwIEBACiAJCWFjcGlfbm9pcnFfc2V0KCk7CiAJCXJldHVybiBOVUxMOwogCX0KKwllbHNlIGlmICghc3RyY21wKHN0ciwgIm5vZWFybHkiKSkgeworCQlwY2lfcHJvYmUgfD0gUENJX1BST0JFX05PRUFSTFk7CisJCXJldHVybiBOVUxMOworCX0KICNpZm5kZWYgQ09ORklHX1g4Nl9WSVNXUwogCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAidXNlcGlycW1hc2siKSkgewogCQlwY2lfcHJvYmUgfD0gUENJX1VTRV9QSVJRX01BU0s7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL2RpcmVjdC5jIGIvYXJjaC9pMzg2L3BjaS9kaXJlY3QuYwppbmRleCA1ZDgxZmI1Li41YWNmMGI0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL2RpcmVjdC5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvZGlyZWN0LmMKQEAgLTI1NCw3ICsyNTQsMTYgQEAKIAlyZXR1cm4gd29ya3M7CiB9CiAKLXZvaWQgX19pbml0IHBjaV9kaXJlY3RfaW5pdCh2b2lkKQordm9pZCBfX2luaXQgcGNpX2RpcmVjdF9pbml0KGludCB0eXBlKQoreworCXByaW50ayhLRVJOX0lORk8gIlBDSTogVXNpbmcgY29uZmlndXJhdGlvbiB0eXBlICVkXG4iLCB0eXBlKTsKKwlpZiAodHlwZSA9PSAxKQorCQlyYXdfcGNpX29wcyA9ICZwY2lfZGlyZWN0X2NvbmYxOworCWVsc2UKKwkJcmF3X3BjaV9vcHMgPSAmcGNpX2RpcmVjdF9jb25mMjsKK30KKworaW50IF9faW5pdCBwY2lfZGlyZWN0X3Byb2JlKHZvaWQpCiB7CiAJc3RydWN0IHJlc291cmNlICpyZWdpb24sICpyZWdpb24yOwogCkBAIC0yNjQsMTkgKzI3MywxNiBAQAogCWlmICghcmVnaW9uKQogCQlnb3RvIHR5cGUyOwogCi0JaWYgKHBjaV9jaGVja190eXBlMSgpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlBDSTogVXNpbmcgY29uZmlndXJhdGlvbiB0eXBlIDFcbiIpOwotCQlyYXdfcGNpX29wcyA9ICZwY2lfZGlyZWN0X2NvbmYxOwotCQlyZXR1cm47Ci0JfQorCWlmIChwY2lfY2hlY2tfdHlwZTEoKSkKKwkJcmV0dXJuIDE7CiAJcmVsZWFzZV9yZXNvdXJjZShyZWdpb24pOwogCiAgdHlwZTI6CiAJaWYgKChwY2lfcHJvYmUgJiBQQ0lfUFJPQkVfQ09ORjIpID09IDApCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJcmVnaW9uID0gcmVxdWVzdF9yZWdpb24oMHhDRjgsIDQsICJQQ0kgY29uZjIiKTsKIAlpZiAoIXJlZ2lvbikKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAlyZWdpb24yID0gcmVxdWVzdF9yZWdpb24oMHhDMDAwLCAweDEwMDAsICJQQ0kgY29uZjIiKTsKIAlpZiAoIXJlZ2lvbjIpCiAJCWdvdG8gZmFpbDI7CkBAIC0yODQsMTAgKzI5MCwxMSBAQAogCWlmIChwY2lfY2hlY2tfdHlwZTIoKSkgewogCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFVzaW5nIGNvbmZpZ3VyYXRpb24gdHlwZSAyXG4iKTsKIAkJcmF3X3BjaV9vcHMgPSAmcGNpX2RpcmVjdF9jb25mMjsKLQkJcmV0dXJuOworCQlyZXR1cm4gMjsKIAl9CiAKIAlyZWxlYXNlX3Jlc291cmNlKHJlZ2lvbjIpOwogIGZhaWwyOgogCXJlbGVhc2VfcmVzb3VyY2UocmVnaW9uKTsKKwlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvZWFybHkuYyBiL2FyY2gvaTM4Ni9wY2kvZWFybHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTNkNmM4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L3BjaS9lYXJseS5jCkBAIC0wLDAgKzEsNTIgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vcGNpLWRpcmVjdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgInBjaS5oIgorCisvKiBEaXJlY3QgUENJIGFjY2Vzcy4gVGhpcyBpcyB1c2VkIGZvciBQQ0kgYWNjZXNzZXMgaW4gZWFybHkgYm9vdCBiZWZvcmUKKyAgIHRoZSBQQ0kgc3Vic3lzdGVtIHdvcmtzLiAqLworCisjZGVmaW5lIFBEcHJpbnRrKHguLi4pCisKK3UzMiByZWFkX3BjaV9jb25maWcodTggYnVzLCB1OCBzbG90LCB1OCBmdW5jLCB1OCBvZmZzZXQpCit7CisJdTMyIHY7CisJb3V0bCgweDgwMDAwMDAwIHwgKGJ1czw8MTYpIHwgKHNsb3Q8PDExKSB8IChmdW5jPDw4KSB8IG9mZnNldCwgMHhjZjgpOworCXYgPSBpbmwoMHhjZmMpOworCWlmICh2ICE9IDB4ZmZmZmZmZmYpCisJCVBEcHJpbnRrKCIleCByZWFkaW5nIDQgZnJvbSAleDogJXhcbiIsIHNsb3QsIG9mZnNldCwgdik7CisJcmV0dXJuIHY7Cit9CisKK3U4IHJlYWRfcGNpX2NvbmZpZ19ieXRlKHU4IGJ1cywgdTggc2xvdCwgdTggZnVuYywgdTggb2Zmc2V0KQoreworCXU4IHY7CisJb3V0bCgweDgwMDAwMDAwIHwgKGJ1czw8MTYpIHwgKHNsb3Q8PDExKSB8IChmdW5jPDw4KSB8IG9mZnNldCwgMHhjZjgpOworCXYgPSBpbmIoMHhjZmMgKyAob2Zmc2V0JjMpKTsKKwlQRHByaW50aygiJXggcmVhZGluZyAxIGZyb20gJXg6ICV4XG4iLCBzbG90LCBvZmZzZXQsIHYpOworCXJldHVybiB2OworfQorCit1MTYgcmVhZF9wY2lfY29uZmlnXzE2KHU4IGJ1cywgdTggc2xvdCwgdTggZnVuYywgdTggb2Zmc2V0KQoreworCXUxNiB2OworCW91dGwoMHg4MDAwMDAwMCB8IChidXM8PDE2KSB8IChzbG90PDwxMSkgfCAoZnVuYzw8OCkgfCBvZmZzZXQsIDB4Y2Y4KTsKKwl2ID0gaW53KDB4Y2ZjICsgKG9mZnNldCYyKSk7CisJUERwcmludGsoIiV4IHJlYWRpbmcgMiBmcm9tICV4OiAleFxuIiwgc2xvdCwgb2Zmc2V0LCB2KTsKKwlyZXR1cm4gdjsKK30KKwordm9pZCB3cml0ZV9wY2lfY29uZmlnKHU4IGJ1cywgdTggc2xvdCwgdTggZnVuYywgdTggb2Zmc2V0LAorCQkJCSAgICB1MzIgdmFsKQoreworCVBEcHJpbnRrKCIleCB3cml0aW5nIHRvICV4OiAleFxuIiwgc2xvdCwgb2Zmc2V0LCB2YWwpOworCW91dGwoMHg4MDAwMDAwMCB8IChidXM8PDE2KSB8IChzbG90PDwxMSkgfCAoZnVuYzw8OCkgfCBvZmZzZXQsIDB4Y2Y4KTsKKwlvdXRsKHZhbCwgMHhjZmMpOworfQorCitpbnQgZWFybHlfcGNpX2FsbG93ZWQodm9pZCkKK3sKKwlyZXR1cm4gKHBjaV9wcm9iZSAmIChQQ0lfUFJPQkVfQ09ORjF8UENJX1BST0JFX05PRUFSTFkpKSA9PQorCQkJUENJX1BST0JFX0NPTkYxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9pbml0LmMgYi9hcmNoL2kzODYvcGNpL2luaXQuYwppbmRleCA1MTA4N2E5Li5kMDI4ZTFiIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL2luaXQuYworKysgYi9hcmNoL2kzODYvcGNpL2luaXQuYwpAQCAtNiw4ICs2LDEzIEBACiAgICBpbiB0aGUgcmlnaHQgc2VxdWVuY2UgZnJvbSBoZXJlLiAqLwogc3RhdGljIF9faW5pdCBpbnQgcGNpX2FjY2Vzc19pbml0KHZvaWQpCiB7CisJaW50IHR5cGUgPSAwOworCisjaWZkZWYgQ09ORklHX1BDSV9ESVJFQ1QKKwl0eXBlID0gcGNpX2RpcmVjdF9wcm9iZSgpOworI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BDSV9NTUNPTkZJRwotCXBjaV9tbWNmZ19pbml0KCk7CisJcGNpX21tY2ZnX2luaXQodHlwZSk7CiAjZW5kaWYKIAlpZiAocmF3X3BjaV9vcHMpCiAJCXJldHVybiAwOwpAQCAtMjEsNyArMjYsNyBAQAogCSAqIGZhaWxzLgogCSAqLwogI2lmZGVmIENPTkZJR19QQ0lfRElSRUNUCi0JcGNpX2RpcmVjdF9pbml0KCk7CisJcGNpX2RpcmVjdF9pbml0KHR5cGUpOwogI2VuZGlmCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL21tY29uZmlnLmMgYi9hcmNoL2kzODYvcGNpL21tY29uZmlnLmMKaW5kZXggOTcyMTgwZi4uMDViZThkYiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9tbWNvbmZpZy5jCisrKyBiL2FyY2gvaTM4Ni9wY2kvbW1jb25maWcuYwpAQCAtMTUxLDYgKzE1MSwzOCBAQAogCS53cml0ZSA9CXBjaV9tbWNmZ193cml0ZSwKIH07CiAKKworc3RhdGljIF9faW5pdCB2b2lkIHBjaV9tbWNmZ19pbnNlcnRfcmVzb3VyY2VzKHZvaWQpCit7CisjZGVmaW5lIFBDSV9NTUNGR19SRVNPVVJDRV9OQU1FX0xFTiAxOQorCWludCBpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWNoYXIgKm5hbWVzOworCXVuc2lnbmVkIG51bV9idXNlczsKKworCXJlcyA9IGtjYWxsb2MoUENJX01NQ0ZHX1JFU09VUkNFX05BTUVfTEVOICsgc2l6ZW9mKCpyZXMpLAorCQkJcGNpX21tY2ZnX2NvbmZpZ19udW0sIEdGUF9LRVJORUwpOworCisJaWYgKCFyZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IFVuYWJsZSB0byBhbGxvY2F0ZSBNTUNPTkZJRyByZXNvdXJjZXNcbiIpOworCQlyZXR1cm47CisJfQorCisJbmFtZXMgPSAodm9pZCAqKSZyZXNbcGNpX21tY2ZnX2NvbmZpZ19udW1dOworCWZvciAoaSA9IDA7IGkgPCBwY2lfbW1jZmdfY29uZmlnX251bTsgaSsrLCByZXMrKykgeworCQludW1fYnVzZXMgPSBwY2lfbW1jZmdfY29uZmlnW2ldLmVuZF9idXNfbnVtYmVyIC0KKwkJICAgIHBjaV9tbWNmZ19jb25maWdbaV0uc3RhcnRfYnVzX251bWJlciArIDE7CisJCXJlcy0+bmFtZSA9IG5hbWVzOworCQlzbnByaW50ZihuYW1lcywgUENJX01NQ0ZHX1JFU09VUkNFX05BTUVfTEVOLCAiUENJIE1NQ09ORklHICV1IiwKKwkJCXBjaV9tbWNmZ19jb25maWdbaV0ucGNpX3NlZ21lbnRfZ3JvdXBfbnVtYmVyKTsKKwkJcmVzLT5zdGFydCA9IHBjaV9tbWNmZ19jb25maWdbaV0uYmFzZV9hZGRyZXNzOworCQlyZXMtPmVuZCA9IHJlcy0+c3RhcnQgKyAobnVtX2J1c2VzIDw8IDIwKSAtIDE7CisJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWTsKKwkJaW5zZXJ0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgcmVzKTsKKwkJbmFtZXMgKz0gUENJX01NQ0ZHX1JFU09VUkNFX05BTUVfTEVOOworCX0KK30KKwogLyogSzggc3lzdGVtcyBoYXZlIHNvbWUgZGV2aWNlcyAodHlwaWNhbGx5IGluIHRoZSBidWlsdGluIG5vcnRoYnJpZGdlKQogICAgdGhhdCBhcmUgb25seSBhY2Nlc3NpYmxlIHVzaW5nIHR5cGUxCiAgICBOb3JtYWxseSB0aGlzIGNhbiBiZSBleHByZXNzZWQgaW4gdGhlIE1DRkcgYnkgbm90IGxpc3RpbmcgdGhlbQpAQCAtMTg3LDcgKzIxOSw5IEBACiAJfQogfQogCi12b2lkIF9faW5pdCBwY2lfbW1jZmdfaW5pdCh2b2lkKQorCisKK3ZvaWQgX19pbml0IHBjaV9tbWNmZ19pbml0KGludCB0eXBlKQogewogCWlmICgocGNpX3Byb2JlICYgUENJX1BST0JFX01NQ09ORikgPT0gMCkKIAkJcmV0dXJuOwpAQCAtMTk4LDcgKzIzMiw5IEBACiAJICAgIChwY2lfbW1jZmdfY29uZmlnWzBdLmJhc2VfYWRkcmVzcyA9PSAwKSkKIAkJcmV0dXJuOwogCi0JaWYgKCFlODIwX2FsbF9tYXBwZWQocGNpX21tY2ZnX2NvbmZpZ1swXS5iYXNlX2FkZHJlc3MsCisJLyogT25seSBkbyB0aGlzIGNoZWNrIHdoZW4gdHlwZSAxIHdvcmtzLiBJZiBpdCBkb2Vzbid0IHdvcmsKKwkgICBhc3N1bWUgd2UgcnVuIG9uIGEgTWFjIGFuZCBhbHdheXMgdXNlIE1DRkcgKi8KKwlpZiAodHlwZSA9PSAxICYmICFlODIwX2FsbF9tYXBwZWQocGNpX21tY2ZnX2NvbmZpZ1swXS5iYXNlX2FkZHJlc3MsCiAJCQlwY2lfbW1jZmdfY29uZmlnWzBdLmJhc2VfYWRkcmVzcyArIE1NQ09ORklHX0FQRVJfTUlOLAogCQkJRTgyMF9SRVNFUlZFRCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IEJJT1MgQnVnOiBNQ0ZHIGFyZWEgYXQgJXggaXMgbm90IEU4MjAtcmVzZXJ2ZWRcbiIsCkBAIC0yMTIsNCArMjQ4LDUgQEAKIAlwY2lfcHJvYmUgPSAocGNpX3Byb2JlICYgflBDSV9QUk9CRV9NQVNLKSB8IFBDSV9QUk9CRV9NTUNPTkY7CiAKIAl1bnJlYWNoYWJsZV9kZXZpY2VzKCk7CisJcGNpX21tY2ZnX2luc2VydF9yZXNvdXJjZXMoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvcGNpLmggYi9hcmNoL2kzODYvcGNpL3BjaS5oCmluZGV4IGJmNGU3OTMuLjE4MTRmNzQgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvcGNpLmgKKysrIGIvYXJjaC9pMzg2L3BjaS9wY2kuaApAQCAtMTcsNiArMTcsNyBAQAogI2RlZmluZSBQQ0lfUFJPQkVfQ09ORjIJCTB4MDAwNAogI2RlZmluZSBQQ0lfUFJPQkVfTU1DT05GCTB4MDAwOAogI2RlZmluZSBQQ0lfUFJPQkVfTUFTSwkJMHgwMDBmCisjZGVmaW5lIFBDSV9QUk9CRV9OT0VBUkxZCTB4MDAxMAogCiAjZGVmaW5lIFBDSV9OT19TT1JUCQkweDAxMDAKICNkZWZpbmUgUENJX0JJT1NfU09SVAkJMHgwMjAwCkBAIC04MSw3ICs4Miw5IEBACiBleHRlcm4gaW50IHBjaV9jb25mMV9yZWFkKHVuc2lnbmVkIGludCBzZWcsIHVuc2lnbmVkIGludCBidXMsCiAJCQkgIHVuc2lnbmVkIGludCBkZXZmbiwgaW50IHJlZywgaW50IGxlbiwgdTMyICp2YWx1ZSk7CiAKLWV4dGVybiB2b2lkIHBjaV9kaXJlY3RfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgcGNpX2RpcmVjdF9wcm9iZSh2b2lkKTsKK2V4dGVybiB2b2lkIHBjaV9kaXJlY3RfaW5pdChpbnQgdHlwZSk7CiBleHRlcm4gdm9pZCBwY2lfcGNiaW9zX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBwY2lfbW1jZmdfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHBjaV9tbWNmZ19pbml0KGludCB0eXBlKTsKIGV4dGVybiB2b2lkIHBjaWJpb3Nfc29ydCh2b2lkKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L0tjb25maWcgYi9hcmNoL2lhNjQvS2NvbmZpZwppbmRleCBmNTIxZjJmLi4wYjdmNzAxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvS2NvbmZpZworKysgYi9hcmNoL2lhNjQvS2NvbmZpZwpAQCAtMzU2LDYgKzM1Niw5IEBACiAJICBNQVhfTlVNTk9ERVMgd2lsbCBiZSAyXihUaGlzIHZhbHVlKS4KIAkgIElmIGluIGRvdWJ0LCB1c2UgdGhlIGRlZmF1bHQuCiAKK2NvbmZpZyBBUkNIX1BPUFVMQVRFU19OT0RFX01BUAorCWRlZl9ib29sIHkKKwogIyBWSVJUVUFMX01FTV9NQVAgYW5kIEZMQVRfTk9ERV9NRU1fTUFQIGFyZSBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudC4KICMgVklSVFVBTF9NRU1fTUFQIGhhcyBiZWVuIHJldGFpbmVkIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuCiBjb25maWcgVklSVFVBTF9NRU1fTUFQCkBAIC00MjAsNiArNDIzLDE0IEBACiBjb25maWcgU0dJX1NOCiAJZGVmX2Jvb2wgeSBpZiAoSUE2NF9TR0lfU04yIHx8IElBNjRfR0VORVJJQykKIAorY29uZmlnIElBNjRfRVNJCisJYm9vbCAiRVNJIChFeHRlbnNpYmxlIFNBTCBJbnRlcmZhY2UpIHN1cHBvcnQiCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHN1cHBvcnQgaXMgYnVpbHQgaW50byB0aGUga2VybmVsIHRvCisJICBtYWtlIEVTSSBjYWxscy4gIEVTSSBjYWxscyBhcmUgdXNlZCB0byBzdXBwb3J0IHZlbmRvci1zcGVjaWZpYworCSAgZmlybXdhcmUgZXh0ZW5zaW9ucywgc3VjaCBhcyB0aGUgYWJpbGl0eSB0byBpbmplY3QgbWVtb3J5LWVycm9ycworCSAgZm9yIHRlc3QtcHVycG9zZXMuICBJZiB5b3UncmUgdW5zdXJlLCBzYXkgTi4KKwogc291cmNlICJkcml2ZXJzL3NuL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9maXJtd2FyZS9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2lhMzIvc3lzX2lhMzIuYyBiL2FyY2gvaWE2NC9pYTMyL3N5c19pYTMyLmMKaW5kZXggNmFhM2M1MS4uYmRkYmQyMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2lhMzIvc3lzX2lhMzIuYworKysgYi9hcmNoL2lhNjQvaWEzMi9zeXNfaWEzMi5jCkBAIC0xOTQyLDcgKzE5NDIsNyBAQAogCXVuc2lnbmVkIGludAlfX3VudXNlZFs0XTsKIH07CiAKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCisjaWZkZWYgQ09ORklHX1NZU0NUTF9TWVNDQUxMCiBhc21saW5rYWdlIGxvbmcKIHN5czMyX3N5c2N0bCAoc3RydWN0IHN5c2N0bDMyIF9fdXNlciAqYXJncykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2lhNjQva2VybmVsL01ha2VmaWxlCmluZGV4IGFkODIxNWEuLjMxNDk3NDkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtMzIsNiArMzIsMTEgQEAKIG9iai0kKENPTkZJR19BVURJVCkJCSs9IGF1ZGl0Lm8KIG1jYV9yZWNvdmVyeS15CQkJKz0gbWNhX2Rydi5vIG1jYV9kcnZfYXNtLm8KIAorb2JqLSQoQ09ORklHX0lBNjRfRVNJKQkJKz0gZXNpLm8KK2lmbmVxICgkKENPTkZJR19JQTY0X0VTSSksKQorb2JqLXkJCQkJKz0gZXNpX3N0dWIubwkjIG11c3QgYmUgaW4ga2VybmVsIHByb3BlcgorZW5kaWYKKwogIyBUaGUgZ2F0ZSBEU08gaW1hZ2UgaXMgYnVpbHQgdXNpbmcgYSBzcGVjaWFsIGxpbmtlciBzY3JpcHQuCiB0YXJnZXRzICs9IGdhdGUuc28gZ2F0ZS1zeW1zLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCmluZGV4IGZlZjA2NTcuLjEyNzAxY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKQEAgLTE2MDUsOCArMTYwNSw4IEBACiAJZGF0YTggc3lzX25pX3N5c2NhbGwJCQkvLyAxMjk1IHJlc2VydmVkIGZvciBwcG9sbAogCWRhdGE4IHN5c191bnNoYXJlCiAJZGF0YTggc3lzX3NwbGljZQotCWRhdGE4IHN5c19uaV9zeXNjYWxsCQkJLy8gcmVzZXJ2ZWQgZm9yIHNldF9yb2J1c3RfbGlzdAotCWRhdGE4IHN5c19uaV9zeXNjYWxsCQkJLy8gcmVzZXJ2ZWQgZm9yIGdldF9yb2J1c3RfbGlzdAorCWRhdGE4IHN5c19zZXRfcm9idXN0X2xpc3QKKwlkYXRhOCBzeXNfZ2V0X3JvYnVzdF9saXN0CiAJZGF0YTggc3lzX3N5bmNfZmlsZV9yYW5nZQkJLy8gMTMwMAogCWRhdGE4IHN5c190ZWUKIAlkYXRhOCBzeXNfdm1zcGxpY2UKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZXNpLmMgYi9hcmNoL2lhNjQva2VybmVsL2VzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZjRlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2lhNjQva2VybmVsL2VzaS5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogRXh0ZW5zaWJsZSBTQUwgSW50ZXJmYWNlIChFU0kpIHN1cHBvcnQgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEhld2xldHQtUGFja2FyZCBDbworICogCUFsZXggV2lsbGlhbXNvbiA8YWxleC53aWxsaWFtc29uQGhwLmNvbT4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgPGFzbS9lc2kuaD4KKyNpbmNsdWRlIDxhc20vc2FsLmg+CisKK01PRFVMRV9BVVRIT1IoIkFsZXggV2lsbGlhbXNvbiA8YWxleC53aWxsaWFtc29uQGhwLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRXh0ZW5zaWJsZSBTQUwgSW50ZXJmYWNlIChFU0kpIHN1cHBvcnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZSBNT0RVTEVfTkFNRQkiZXNpIgorCisjZGVmaW5lIEVTSV9UQUJMRV9HVUlECQkJCQlcCisgICAgRUZJX0dVSUQoMHg0M0VBNThEQywgMHhDRjI4LCAweDRiMDYsIDB4QjMsCQlcCisJICAgICAweDkxLCAweEI3LCAweDUwLCAweDU5LCAweDM0LCAweDJCLCAweEQ0KQorCitlbnVtIGVzaV9zeXN0YWJfZW50cnlfdHlwZSB7CisJRVNJX0RFU0NfRU5UUllfUE9JTlQgPSAwCit9OworCisvKgorICogRW50cnkgdHlwZToJU2l6ZToKKyAqCTAJNDgKKyAqLworI2RlZmluZSBFU0lfREVTQ19TSVpFKHR5cGUpCSJcMDYwIlsodW5zaWduZWQpICh0eXBlKV0KKwordHlwZWRlZiBzdHJ1Y3QgaWE2NF9lc2lfZGVzY19lbnRyeV9wb2ludCB7CisJdTggdHlwZTsKKwl1OCByZXNlcnZlZDFbMTVdOworCXU2NCBlc2lfcHJvYzsKKwl1NjQgZ3A7CisJZWZpX2d1aWRfdCBndWlkOworfSBpYTY0X2VzaV9kZXNjX2VudHJ5X3BvaW50X3Q7CisKK3N0cnVjdCBwZGVzYyB7CisJdm9pZCAqYWRkcjsKKwl2b2lkICpncDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWE2NF9zYWxfc3lzdGFiICplc2lfc3lzdGFiOworCitzdGF0aWMgaW50IF9faW5pdCBlc2lfaW5pdCAodm9pZCkKK3sKKwllZmlfY29uZmlnX3RhYmxlX3QgKmNvbmZpZ190YWJsZXM7CisJc3RydWN0IGlhNjRfc2FsX3N5c3RhYiAqc3lzdGFiOworCXVuc2lnbmVkIGxvbmcgZXNpID0gMDsKKwljaGFyICpwOworCWludCBpOworCisJY29uZmlnX3RhYmxlcyA9IF9fdmEoZWZpLnN5c3RhYi0+dGFibGVzKTsKKworCWZvciAoaSA9IDA7IGkgPCAoaW50KSBlZmkuc3lzdGFiLT5ucl90YWJsZXM7ICsraSkgeworCQlpZiAoZWZpX2d1aWRjbXAoY29uZmlnX3RhYmxlc1tpXS5ndWlkLCBFU0lfVEFCTEVfR1VJRCkgPT0gMCkgeworCQkJZXNpID0gY29uZmlnX3RhYmxlc1tpXS50YWJsZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFlc2kpCisJCXJldHVybiAtRU5PREVWOzsKKworCXN5c3RhYiA9IF9fdmEoZXNpKTsKKworCWlmIChzdHJuY21wKHN5c3RhYi0+c2lnbmF0dXJlLCAiRVNJVCIsIDQpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJiYWQgc2lnbmF0dXJlIGluIEVTSSBzeXN0ZW0gdGFibGUhIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXAgPSAoY2hhciAqKSAoc3lzdGFiICsgMSk7CisJZm9yIChpID0gMDsgaSA8IHN5c3RhYi0+ZW50cnlfY291bnQ7IGkrKykgeworCQkvKgorCQkgKiBUaGUgZmlyc3QgYnl0ZSBvZiBlYWNoIGVudHJ5IHR5cGUgY29udGFpbnMgdGhlIHR5cGUKKwkJICogZGVzY3JpcHRvci4KKwkJICovCisJCXN3aXRjaCAoKnApIHsKKwkJICAgICAgY2FzZSBFU0lfREVTQ19FTlRSWV9QT0lOVDoKKwkJCWJyZWFrOworCQkgICAgICBkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5rb3duIHRhYmxlIHR5cGUgJWQgZm91bmQgaW4gIgorCQkJICAgICAgICJFU0kgdGFibGUsIGlnbm9yaW5nIHJlc3Qgb2YgdGFibGVcbiIsICpwKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJcCArPSBFU0lfREVTQ19TSVpFKCpwKTsKKwl9CisKKwllc2lfc3lzdGFiID0gc3lzdGFiOworCXJldHVybiAwOworfQorCisKK2ludCBpYTY0X2VzaV9jYWxsIChlZmlfZ3VpZF90IGd1aWQsIHN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgKmlzcnZwLAorCQkgICBlbnVtIGVzaV9wcm9jX3R5cGUgcHJvY190eXBlLCB1NjQgZnVuYywKKwkJICAgdTY0IGFyZzEsIHU2NCBhcmcyLCB1NjQgYXJnMywgdTY0IGFyZzQsIHU2NCBhcmc1LCB1NjQgYXJnNiwKKwkJICAgdTY0IGFyZzcpCit7CisJc3RydWN0IGlhNjRfZnByZWcgZnJbNl07CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaW50IGk7CisJY2hhciAqcDsKKworCWlmICghZXNpX3N5c3RhYikKKwkJcmV0dXJuIC0xOworCisJcCA9IChjaGFyICopIChlc2lfc3lzdGFiICsgMSk7CisJZm9yIChpID0gMDsgaSA8IGVzaV9zeXN0YWItPmVudHJ5X2NvdW50OyBpKyspIHsKKwkJaWYgKCpwID09IEVTSV9ERVNDX0VOVFJZX1BPSU5UKSB7CisJCQlpYTY0X2VzaV9kZXNjX2VudHJ5X3BvaW50X3QgKmVzaSA9ICh2b2lkICopcDsKKwkJCWlmICghZWZpX2d1aWRjbXAoZ3VpZCwgZXNpLT5ndWlkKSkgeworCQkJCWlhNjRfc2FsX2hhbmRsZXIgZXNpX3Byb2M7CisJCQkJc3RydWN0IHBkZXNjIHBkZXNjOworCisJCQkJcGRlc2MuYWRkciA9IF9fdmEoZXNpLT5lc2lfcHJvYyk7CisJCQkJcGRlc2MuZ3AgPSBfX3ZhKGVzaS0+Z3ApOworCisJCQkJZXNpX3Byb2MgPSAoaWE2NF9zYWxfaGFuZGxlcikgJnBkZXNjOworCisJCQkJaWE2NF9zYXZlX3NjcmF0Y2hfZnByZWdzKGZyKTsKKwkJCQlpZiAocHJvY190eXBlID09IEVTSV9QUk9DX1NFUklBTElaRUQpCisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzYWxfbG9jaywgZmxhZ3MpOworCQkJCWVsc2UgaWYgKHByb2NfdHlwZSA9PSBFU0lfUFJPQ19NUF9TQUZFKQorCQkJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQkJZWxzZQorCQkJCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJCQkqaXNydnAgPSAoKmVzaV9wcm9jKShmdW5jLCBhcmcxLCBhcmcyLCBhcmczLAorCQkJCQkJICAgICBhcmc0LCBhcmc1LCBhcmc2LCBhcmc3KTsKKwkJCQlpZiAocHJvY190eXBlID09IEVTSV9QUk9DX1NFUklBTElaRUQpCisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNhbF9sb2NrLAorCQkJCQkJCSAgICAgICBmbGFncyk7CisJCQkJZWxzZSBpZiAocHJvY190eXBlID09IEVTSV9QUk9DX01QX1NBRkUpCisJCQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCQllbHNlCisJCQkJCXByZWVtcHRfZW5hYmxlKCk7CisJCQkJaWE2NF9sb2FkX3NjcmF0Y2hfZnByZWdzKGZyKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlwICs9IEVTSV9ERVNDX1NJWkUoKnApOworCX0KKwlyZXR1cm4gLTE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpYTY0X2VzaV9jYWxsKTsKKworaW50IGlhNjRfZXNpX2NhbGxfcGh5cyAoZWZpX2d1aWRfdCBndWlkLCBzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsICppc3J2cCwKKwkJCXU2NCBmdW5jLCB1NjQgYXJnMSwgdTY0IGFyZzIsIHU2NCBhcmczLCB1NjQgYXJnNCwKKwkJCXU2NCBhcmc1LCB1NjQgYXJnNiwgdTY0IGFyZzcpCit7CisJc3RydWN0IGlhNjRfZnByZWcgZnJbNl07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1NjQgZXNpX3BhcmFtc1s4XTsKKwljaGFyICpwOworCWludCBpOworCisJaWYgKCFlc2lfc3lzdGFiKQorCQlyZXR1cm4gLTE7CisKKwlwID0gKGNoYXIgKikgKGVzaV9zeXN0YWIgKyAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgZXNpX3N5c3RhYi0+ZW50cnlfY291bnQ7IGkrKykgeworCQlpZiAoKnAgPT0gRVNJX0RFU0NfRU5UUllfUE9JTlQpIHsKKwkJCWlhNjRfZXNpX2Rlc2NfZW50cnlfcG9pbnRfdCAqZXNpID0gKHZvaWQgKilwOworCQkJaWYgKCFlZmlfZ3VpZGNtcChndWlkLCBlc2ktPmd1aWQpKSB7CisJCQkJaWE2NF9zYWxfaGFuZGxlciBlc2lfcHJvYzsKKwkJCQlzdHJ1Y3QgcGRlc2MgcGRlc2M7CisKKwkJCQlwZGVzYy5hZGRyID0gKHZvaWQgKillc2ktPmVzaV9wcm9jOworCQkJCXBkZXNjLmdwID0gKHZvaWQgKillc2ktPmdwOworCisJCQkJZXNpX3Byb2MgPSAoaWE2NF9zYWxfaGFuZGxlcikgJnBkZXNjOworCisJCQkJZXNpX3BhcmFtc1swXSA9IGZ1bmM7CisJCQkJZXNpX3BhcmFtc1sxXSA9IGFyZzE7CisJCQkJZXNpX3BhcmFtc1syXSA9IGFyZzI7CisJCQkJZXNpX3BhcmFtc1szXSA9IGFyZzM7CisJCQkJZXNpX3BhcmFtc1s0XSA9IGFyZzQ7CisJCQkJZXNpX3BhcmFtc1s1XSA9IGFyZzU7CisJCQkJZXNpX3BhcmFtc1s2XSA9IGFyZzY7CisJCQkJZXNpX3BhcmFtc1s3XSA9IGFyZzc7CisJCQkJaWE2NF9zYXZlX3NjcmF0Y2hfZnByZWdzKGZyKTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc2FsX2xvY2ssIGZsYWdzKTsKKwkJCQkqaXNydnAgPSBlc2lfY2FsbF9waHlzKGVzaV9wcm9jLCBlc2lfcGFyYW1zKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYWxfbG9jaywgZmxhZ3MpOworCQkJCWlhNjRfbG9hZF9zY3JhdGNoX2ZwcmVncyhmcik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJcCArPSBFU0lfREVTQ19TSVpFKCpwKTsKKwl9CisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWE2NF9lc2lfY2FsbF9waHlzKTsKKworc3RhdGljIHZvaWQgX19leGl0IGVzaV9leGl0ICh2b2lkKQoreworfQorCittb2R1bGVfaW5pdChlc2lfaW5pdCk7Cittb2R1bGVfZXhpdChlc2lfZXhpdCk7CS8qIG1ha2VzIG1vZHVsZSByZW1vdmFibGUuLi4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZXNpX3N0dWIuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZXNpX3N0dWIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjNkNmMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lc2lfc3R1Yi5TCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBFU0kgY2FsbCBzdHViLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBIZXdsZXR0LVBhY2thcmQgQ28KKyAqCUFsZXggV2lsbGlhbXNvbiA8YWxleC53aWxsaWFtc29uQGhwLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBFRkkgY2FsbCBzdHViIGJ5IERhdmlkIE1vc2Jlcmdlci4gIFRoZSBzdHViIGlzIHZpcnR1YWxseQorICogaWRlbnRpY2FsIHRvIHRoZSBvbmUgZm9yIEVGSSBwaHlzLW1vZGUgY2FsbHMsIGV4Y2VwdCB0aGF0IEVTSQorICogY2FsbHMgbWF5IGhhdmUgdXAgdG8gOCBhcmd1bWVudHMsIHNvIHRoZXkgZ2V0IHBhc3NlZCB0byB0aGlzIHJvdXRpbmUKKyAqIHRocm91Z2ggbWVtb3J5LgorICoKKyAqIFRoaXMgc3R1YiBhbGxvd3MgdXMgdG8gbWFrZSBFU0kgY2FsbHMgaW4gcGh5c2ljYWwgbW9kZSB3aXRoIGludGVycnVwdHMKKyAqIHR1cm5lZCBvZmYuICBFU0kgY2FsbHMgbWF5IG5vdCBzdXBwb3J0IGNhbGxpbmcgZnJvbSB2aXJ0dWFsIG1vZGUuCisgKgorICogR29vZ2xlIGZvciAiRXh0ZW5zaWJsZSBTQUwgc3BlY2lmaWNhdGlvbiIgZm9yIGEgZG9jdW1lbnQgZGVzY3JpYmluZyB0aGUKKyAqIEVTSSBzdGFuZGFyZC4KKyAqLworCisvKgorICogUFNSIHNldHRpbmdzIGFzIHBlciBTQUwgc3BlYyAoQ2hhcHRlciA4IGluIHRoZSAiSUEtNjQgU3lzdGVtCisgKiBBYnN0cmFjdGlvbiBMYXllciBTcGVjaWZpY2F0aW9uIiwgcmV2aXNpb24gMi42ZSkuICBOb3RlIHRoYXQKKyAqIHBzci5kZmwgYW5kIHBzci5kZmggTVVTVCBiZSBjbGVhcmVkLCBkZXNwaXRlIHdoYXQgdGhpcyBtYW51YWwgc2F5cy4KKyAqIE90aGVyd2lzZSwgU0FMIGRpZXMgd2hlbmV2ZXIgaXQncyB0cnlpbmcgdG8gZG8gYW4gSUEtMzIgQklPUyBjYWxsCisgKiAodGhlIGJyLmlhIGluc3RydWN0aW9uIGZhaWxzIHVubGVzcyBwc3IuZGZsIGFuZCBwc3IuZGZoIGFyZQorICogY2xlYXJlZCkuICBGb3J0dW5hdGVseSwgU0FMIHByb21pc2VzIG5vdCB0byB0b3VjaCB0aGUgZmxvYXRpbmcKKyAqIHBvaW50IHJlZ3MsIHNvIGF0IGxlYXN0IHdlIGRvbid0IGhhdmUgdG8gc2F2ZSBmMi1mMTI3LgorICovCisjZGVmaW5lIFBTUl9CSVRTX1RPX0NMRUFSCQkJCQkJXAorCShJQTY0X1BTUl9JIHwgSUE2NF9QU1JfSVQgfCBJQTY0X1BTUl9EVCB8IElBNjRfUFNSX1JUIHwJCVwKKwkgSUE2NF9QU1JfREQgfCBJQTY0X1BTUl9TUyB8IElBNjRfUFNSX1JJIHwgSUE2NF9QU1JfRUQgfAlcCisJIElBNjRfUFNSX0RGTCB8IElBNjRfUFNSX0RGSCkKKworI2RlZmluZSBQU1JfQklUU19UT19TRVQJCQkJCQkJXAorCShJQTY0X1BTUl9CTikKKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vYXNtbWFjcm8uaD4KKworLyoKKyAqIElucHV0czoKKyAqCWluMCA9IGFkZHJlc3Mgb2YgZnVuY3Rpb24gZGVzY3JpcHRvciBvZiBFU0kgcm91dGluZSB0byBjYWxsCisgKglpbjEgPSBhZGRyZXNzIG9mIGFycmF5IG9mIEVTSSBwYXJhbWV0ZXJzCisgKgorICogT3V0cHV0czoKKyAqCXI4ID0gcmVzdWx0IHJldHVybmVkIGJ5IGNhbGxlZCBmdW5jdGlvbgorICovCitHTE9CQUxfRU5UUlkoZXNpX2NhbGxfcGh5cykKKwkucHJvbG9ndWUgQVNNX1VOV19QUkxHX1JQfEFTTV9VTldfUFJMR19QRlMsIEFTTV9VTldfUFJMR19HUlNBVkUoMikKKwlhbGxvYyBsb2MxPWFyLnBmcywyLDcsOCwwCisJbGQ4IHIyPVtpbjBdLDgJCQkvLyBsb2FkIEVTSSBmdW5jdGlvbidzIGVudHJ5IHBvaW50CisJbW92IGxvYzA9cnAKKwkuYm9keQorCTs7CisJbGQ4IG91dDA9W2luMV0sOAkJLy8gRVNJIHBhcmFtcyBsb2FkZWQgZnJvbSBhcnJheQorCTs7CQkJCS8vIHBhc3NpbmcgYWxsIGFzIGlucHV0cyBkb2Vzbid0IHdvcmsKKwlsZDggb3V0MT1baW4xXSw4CisJOzsKKwlsZDggb3V0Mj1baW4xXSw4CisJOzsKKwlsZDggb3V0Mz1baW4xXSw4CisJOzsKKwlsZDggb3V0ND1baW4xXSw4CisJOzsKKwlsZDggb3V0NT1baW4xXSw4CisJOzsKKwlsZDggb3V0Nj1baW4xXSw4CisJOzsKKwlsZDggb3V0Nz1baW4xXQorCW1vdiBsb2MyPWdwCQkJLy8gc2F2ZSBnbG9iYWwgcG9pbnRlcgorCW1vdiBsb2M0PWFyLnJzYwkJCS8vIHNhdmUgUlNFIGNvbmZpZ3VyYXRpb24KKwltb3YgYXIucnNjPTAJCQkvLyBwdXQgUlNFIGluIGVuZm9yY2VkIGxhenksIExFIG1vZGUKKwk7OworCWxkOCBncD1baW4wXQkJCS8vIGxvYWQgRVNJIGZ1bmN0aW9uJ3MgZ2xvYmFsIHBvaW50ZXIKKwltb3ZsIHIxNj1QU1JfQklUU19UT19DTEVBUgorCW1vdiBsb2MzPXBzcgkJCS8vIHNhdmUgcHJvY2Vzc29yIHN0YXR1cyB3b3JkCisJbW92bCByMTc9UFNSX0JJVFNfVE9fU0VUCisJOzsKKwlvciBsb2MzPWxvYzMscjE3CisJbW92IGI2PXIyCisJOzsKKwlhbmRjbSByMTY9bG9jMyxyMTYJLy8gZ2V0IHBzciB3aXRoIElULCBEVCwgYW5kIFJUIGJpdHMgY2xlYXJlZAorCWJyLmNhbGwuc3B0ay5tYW55IHJwPWlhNjRfc3dpdGNoX21vZGVfcGh5cworLnJldDA6CW1vdiBsb2M1PXIxOQkJCS8vIG9sZCBhci5ic3AKKwltb3YgbG9jNj1yMjAJCQkvLyBvbGQgc3AKKwlici5jYWxsLnNwdGsubWFueSBycD1iNgkJLy8gY2FsbCB0aGUgRVNJIGZ1bmN0aW9uCisucmV0MToJbW92IGFyLnJzYz0wCQkJLy8gcHV0IFJTRSBpbiBlbmZvcmNlZCBsYXp5LCBMRSBtb2RlCisJbW92IHIxNj1sb2MzCQkJLy8gc2F2ZSB2aXJ0dWFsIG1vZGUgcHNyCisJbW92IHIxOT1sb2M1CQkJLy8gc2F2ZSB2aXJ0dWFsIG1vZGUgYnNwc3RvcmUKKwltb3YgcjIwPWxvYzYJCQkvLyBzYXZlIHZpcnR1YWwgbW9kZSBzcAorCWJyLmNhbGwuc3B0ay5tYW55IHJwPWlhNjRfc3dpdGNoX21vZGVfdmlydCAvLyByZXR1cm4gdG8gdmlydHVhbCBtb2RlCisucmV0MjoJbW92IGFyLnJzYz1sb2M0CQkJLy8gcmVzdG9yZSBSU0UgY29uZmlndXJhdGlvbgorCW1vdiBhci5wZnM9bG9jMQorCW1vdiBycD1sb2MwCisJbW92IGdwPWxvYzIKKwlici5yZXQuc3B0ay5tYW55IHJwCitFTkQoZXNpX2NhbGxfcGh5cykKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaWE2NF9rc3ltcy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9pYTY0X2tzeW1zLmMKaW5kZXggM2VhZDIwZi4uODc5YzE4MSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9pYTY0X2tzeW1zLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9pYTY0X2tzeW1zLmMKQEAgLTEwNSw1ICsxMDUsOSBAQAogIyBlbmRpZgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19JQTY0X0VTSSkgfHwgZGVmaW5lZChDT05GSUdfSUE2NF9FU0lfTU9EVUxFKQorZXh0ZXJuIHZvaWQgZXNpX2NhbGxfcGh5cyAodm9pZCk7CitFWFBPUlRfU1lNQk9MX0dQTChlc2lfY2FsbF9waHlzKTsKKyNlbmRpZgogZXh0ZXJuIGNoYXIgaWE2NF9pdnRbXTsKIEVYUE9SVF9TWU1CT0woaWE2NF9pdnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9rcHJvYmVzLmMgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwppbmRleCA3ODE5NjBmLi4xNjllYzNhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2twcm9iZXMuYwpAQCAtMTM2LDEwICsxMzYsOCBAQAogc3RhdGljIGludCBfX2twcm9iZXMgdW5zdXBwb3J0ZWRfaW5zdCh1aW50IHRlbXBsYXRlLCB1aW50ICBzbG90LAogCQkJCSAgICAgIHVpbnQgbWFqb3Jfb3Bjb2RlLAogCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcga3Byb2JlX2luc3QsCi0JCQkJICAgICAgc3RydWN0IGtwcm9iZSAqcCkKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcC0+YWRkcjsKLQogCWlmIChidW5kbGVfZW5jb2RpbmdbdGVtcGxhdGVdW3Nsb3RdID09IEkpIHsKIAkJc3dpdGNoIChtYWpvcl9vcGNvZGUpIHsKIAkJCWNhc2UgMHgwOiAvL0lfVU5JVF9NSVNDX09QQ09ERToKQEAgLTIxNyw3ICsyMTUsNyBAQAogCQkJCQkgc3RydWN0IGtwcm9iZSAqcCkKIHsKIAl1bnNpZ25lZCBsb25nIGJyZWFrX2luc3QgPSBCUkVBS19JTlNUOwotCWJ1bmRsZV90ICpidW5kbGUgPSAmcC0+YWluc24uaW5zbi5idW5kbGU7CisJYnVuZGxlX3QgKmJ1bmRsZSA9ICZwLT5vcGNvZGUuYnVuZGxlOwogCiAJLyoKIAkgKiBDb3B5IHRoZSBvcmlnaW5hbCBrcHJvYmVfaW5zdCBxdWFsaWZ5aW5nIHByZWRpY2F0ZShxcCkKQEAgLTQyMywxMSArNDIxLDkgQEAKIAl1bnNpZ25lZCBsb25nICprcHJvYmVfYWRkciA9ICh1bnNpZ25lZCBsb25nICopKGFkZHIgJiB+MHhGVUxMKTsKIAl1bnNpZ25lZCBsb25nIGtwcm9iZV9pbnN0PTA7CiAJdW5zaWduZWQgaW50IHNsb3QgPSBhZGRyICYgMHhmLCB0ZW1wbGF0ZSwgbWFqb3Jfb3Bjb2RlID0gMDsKLQlidW5kbGVfdCAqYnVuZGxlID0gJnAtPmFpbnNuLmluc24uYnVuZGxlOworCWJ1bmRsZV90ICpidW5kbGU7CiAKLQltZW1jcHkoJnAtPm9wY29kZS5idW5kbGUsIGtwcm9iZV9hZGRyLCBzaXplb2YoYnVuZGxlX3QpKTsKLQltZW1jcHkoJnAtPmFpbnNuLmluc24uYnVuZGxlLCBrcHJvYmVfYWRkciwgc2l6ZW9mKGJ1bmRsZV90KSk7Ci0KKwlidW5kbGUgPSAmKChrcHJvYmVfb3Bjb2RlX3QgKilrcHJvYmVfYWRkciktPmJ1bmRsZTsKICAJdGVtcGxhdGUgPSBidW5kbGUtPnF1YWQwLnRlbXBsYXRlOwogCiAJaWYodmFsaWRfa3Byb2JlX2FkZHIodGVtcGxhdGUsIHNsb3QsIGFkZHIpKQpAQCAtNDQwLDMwICs0MzYsMzAgQEAKIAkvKiBHZXQga3Byb2JlX2luc3QgYW5kIG1ham9yX29wY29kZSBmcm9tIHRoZSBidW5kbGUgKi8KIAlnZXRfa3Byb2JlX2luc3QoYnVuZGxlLCBzbG90LCAma3Byb2JlX2luc3QsICZtYWpvcl9vcGNvZGUpOwogCi0JaWYgKHVuc3VwcG9ydGVkX2luc3QodGVtcGxhdGUsIHNsb3QsIG1ham9yX29wY29kZSwga3Byb2JlX2luc3QsIHApKQorCWlmICh1bnN1cHBvcnRlZF9pbnN0KHRlbXBsYXRlLCBzbG90LCBtYWpvcl9vcGNvZGUsIGtwcm9iZV9pbnN0LCBhZGRyKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCisKKwlwLT5haW5zbi5pbnNuID0gZ2V0X2luc25fc2xvdCgpOworCWlmICghcC0+YWluc24uaW5zbikKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtY3B5KCZwLT5vcGNvZGUsIGtwcm9iZV9hZGRyLCBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CisJbWVtY3B5KHAtPmFpbnNuLmluc24sIGtwcm9iZV9hZGRyLCBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CisKIAlwcmVwYXJlX2JyZWFrX2luc3QodGVtcGxhdGUsIHNsb3QsIG1ham9yX29wY29kZSwga3Byb2JlX2luc3QsIHApOwogCiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19rcHJvYmVzIGZsdXNoX2luc25fc2xvdChzdHJ1Y3Qga3Byb2JlICpwKQotewotCXVuc2lnbmVkIGxvbmcgYXJtX2FkZHI7Ci0KLQlhcm1fYWRkciA9ICgodW5zaWduZWQgbG9uZykmcC0+b3Bjb2RlLmJ1bmRsZSkgJiB+MHhGVUxMOwotCWZsdXNoX2ljYWNoZV9yYW5nZShhcm1fYWRkciwgYXJtX2FkZHIgKyBzaXplb2YoYnVuZGxlX3QpKTsKLX0KLQogdm9pZCBfX2twcm9iZXMgYXJjaF9hcm1fa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpcC0+YWRkcjsKIAl1bnNpZ25lZCBsb25nIGFybV9hZGRyID0gYWRkciAmIH4weEZVTEw7CiAKLQlmbHVzaF9pbnNuX3Nsb3QocCk7Ci0JbWVtY3B5KChjaGFyICopYXJtX2FkZHIsICZwLT5haW5zbi5pbnNuLmJ1bmRsZSwgc2l6ZW9mKGJ1bmRsZV90KSk7Ci0JZmx1c2hfaWNhY2hlX3JhbmdlKGFybV9hZGRyLCBhcm1fYWRkciArIHNpemVvZihidW5kbGVfdCkpOworCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylwLT5haW5zbi5pbnNuLAorCQkJKHVuc2lnbmVkIGxvbmcpcC0+YWluc24uaW5zbiArIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKKwltZW1jcHkoKGNoYXIgKilhcm1fYWRkciwgJnAtPm9wY29kZSwgc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpOworCWZsdXNoX2ljYWNoZV9yYW5nZShhcm1fYWRkciwgYXJtX2FkZHIgKyBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CiB9CiAKIHZvaWQgX19rcHJvYmVzIGFyY2hfZGlzYXJtX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQpAQCAtNDcxLDExICs0NjcsMTggQEAKIAl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylwLT5hZGRyOwogCXVuc2lnbmVkIGxvbmcgYXJtX2FkZHIgPSBhZGRyICYgfjB4RlVMTDsKIAotCS8qIHAtPm9wY29kZSBjb250YWlucyB0aGUgb3JpZ2luYWwgdW5hbHRlcmVkIGJ1bmRsZSAqLwotCW1lbWNweSgoY2hhciAqKSBhcm1fYWRkciwgKGNoYXIgKikgJnAtPm9wY29kZS5idW5kbGUsIHNpemVvZihidW5kbGVfdCkpOwotCWZsdXNoX2ljYWNoZV9yYW5nZShhcm1fYWRkciwgYXJtX2FkZHIgKyBzaXplb2YoYnVuZGxlX3QpKTsKKwkvKiBwLT5haW5zbi5pbnNuIGNvbnRhaW5zIHRoZSBvcmlnaW5hbCB1bmFsdGVyZWQga3Byb2JlX29wY29kZV90ICovCisJbWVtY3B5KChjaGFyICopIGFybV9hZGRyLCAoY2hhciAqKSBwLT5haW5zbi5pbnNuLAorCQkJCQkgc2l6ZW9mKGtwcm9iZV9vcGNvZGVfdCkpOworCWZsdXNoX2ljYWNoZV9yYW5nZShhcm1fYWRkciwgYXJtX2FkZHIgKyBzaXplb2Yoa3Byb2JlX29wY29kZV90KSk7CiB9CiAKK3ZvaWQgX19rcHJvYmVzIGFyY2hfcmVtb3ZlX2twcm9iZShzdHJ1Y3Qga3Byb2JlICpwKQoreworCW11dGV4X2xvY2soJmtwcm9iZV9tdXRleCk7CisJZnJlZV9pbnNuX3Nsb3QocC0+YWluc24uaW5zbik7CisJbXV0ZXhfdW5sb2NrKCZrcHJvYmVfbXV0ZXgpOworfQogLyoKICAqIFdlIGFyZSByZXN1bWluZyBleGVjdXRpb24gYWZ0ZXIgYSBzaW5nbGUgc3RlcCBmYXVsdCwgc28gdGhlIHB0X3JlZ3MKICAqIHN0cnVjdHVyZSByZWZsZWN0cyB0aGUgcmVnaXN0ZXIgc3RhdGUgYWZ0ZXIgd2UgZXhlY3V0ZWQgdGhlIGluc3RydWN0aW9uCkBAIC00ODYsMTIgKzQ4OSwxMiBAQAogICovCiBzdGF0aWMgdm9pZCBfX2twcm9iZXMgcmVzdW1lX2V4ZWN1dGlvbihzdHJ1Y3Qga3Byb2JlICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSAgCXVuc2lnbmVkIGxvbmcgYnVuZGxlX2FkZHIgPSAoKHVuc2lnbmVkIGxvbmcpICgmcC0+b3Bjb2RlLmJ1bmRsZSkpICYgfjB4RlVMTDsKKyAgCXVuc2lnbmVkIGxvbmcgYnVuZGxlX2FkZHIgPSAodW5zaWduZWQgbG9uZykgKCZwLT5haW5zbi5pbnNuLT5idW5kbGUpOwogICAJdW5zaWduZWQgbG9uZyByZXN1bWVfYWRkciA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHIgJiB+MHhGVUxMOwogIAl1bnNpZ25lZCBsb25nIHRlbXBsYXRlOwogIAlpbnQgc2xvdCA9ICgodW5zaWduZWQgbG9uZylwLT5hZGRyICYgMHhmKTsKIAotCXRlbXBsYXRlID0gcC0+b3Bjb2RlLmJ1bmRsZS5xdWFkMC50ZW1wbGF0ZTsKKwl0ZW1wbGF0ZSA9IHAtPmFpbnNuLmluc24tPmJ1bmRsZS5xdWFkMC50ZW1wbGF0ZTsKIAogIAlpZiAoc2xvdCA9PSAxICYmIGJ1bmRsZV9lbmNvZGluZ1t0ZW1wbGF0ZV1bMV0gPT0gTCkKICAJCXNsb3QgPSAyOwpAQCAtNTUzLDcgKzU1Niw3IEBACiAKIHN0YXRpYyB2b2lkIF9fa3Byb2JlcyBwcmVwYXJlX3NzKHN0cnVjdCBrcHJvYmUgKnAsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXVuc2lnbmVkIGxvbmcgYnVuZGxlX2FkZHIgPSAodW5zaWduZWQgbG9uZykgJnAtPm9wY29kZS5idW5kbGU7CisJdW5zaWduZWQgbG9uZyBidW5kbGVfYWRkciA9ICh1bnNpZ25lZCBsb25nKSAmcC0+YWluc24uaW5zbi0+YnVuZGxlOwogCXVuc2lnbmVkIGxvbmcgc2xvdCA9ICh1bnNpZ25lZCBsb25nKXAtPmFkZHIgJiAweGY7CiAKIAkvKiBzaW5nbGUgc3RlcCBpbmxpbmUgaWYgYnJlYWsgaW5zdHJ1Y3Rpb24gKi8KQEAgLTc2OCw2ICs3NzEsMTIgQEAKIAkJICovCiAJCWlmIChjdXItPmZhdWx0X2hhbmRsZXIgJiYgY3VyLT5mYXVsdF9oYW5kbGVyKGN1ciwgcmVncywgdHJhcG5yKSkKIAkJCXJldHVybiAxOworCQkvKgorCQkgKiBJbiBjYXNlIHRoZSB1c2VyLXNwZWNpZmllZCBmYXVsdCBoYW5kbGVyIHJldHVybmVkCisJCSAqIHplcm8sIHRyeSB0byBmaXggdXAuCisJCSAqLworCQlpZiAoaWE2NF9kb25lX3dpdGhfZXhjZXB0aW9uKHJlZ3MpKQorCQkJcmV0dXJuIDE7CiAKIAkJLyoKIAkJICogTGV0IGlhNjRfZG9fcGFnZV9mYXVsdCgpIGZpeCBpdC4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMgYi9hcmNoL2lhNjQva2VybmVsL21jYS5jCmluZGV4IDJmYmU0NTMuLmJmYmQ4OTggMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2EuYwpAQCAtNTQsNiArNTQsOSBAQAogICoKICAqIDIwMDUtMTAtMDcgS2VpdGggT3dlbnMgPGthb3NAc2dpLmNvbT4KICAqCSAgICAgIEFkZCBub3RpZnlfZGllKCkgaG9va3MuCisgKgorICogMjAwNi0wOS0xNSBIaWRldG9zaGkgU2V0byA8c2V0by5oaWRldG9zaGlAanAuZnVqaXRzdS5jb20+CisgKiAJICAgICAgQWRkIHByaW50aW5nIHN1cHBvcnQgZm9yIE1DQS9JTklULgogICovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0xMzYsMTEgKzEzOSwxNzUgQEAKIAogc3RhdGljIGludCBtY2FfaW5pdCBfX2luaXRkYXRhOwogCisvKgorICogbGltaXRlZCAmIGRlbGF5ZWQgcHJpbnRpbmcgc3VwcG9ydCBmb3IgTUNBL0lOSVQgaGFuZGxlcgorICovCisKKyNkZWZpbmUgbXByaW50ayhmbXQuLi4pIGlhNjRfbWNhX3ByaW50ayhmbXQpCisKKyNkZWZpbmUgTUxPR0JVRl9TSVpFICg1MTIrMjU2Kk5SX0NQVVMpCisjZGVmaW5lIE1MT0dCVUZfTVNHTUFYIDI1Ngorc3RhdGljIGNoYXIgbWxvZ2J1ZltNTE9HQlVGX1NJWkVdOworc3RhdGljIERFRklORV9TUElOTE9DSyhtbG9nYnVmX3dsb2NrKTsJLyogbWNhIGNvbnRleHQgb25seSAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhtbG9nYnVmX3Jsb2NrKTsJLyogbm9ybWFsIGNvbnRleHQgb25seSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbWxvZ2J1Zl9zdGFydDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1sb2didWZfZW5kOworc3RhdGljIHVuc2lnbmVkIGludCBtbG9nYnVmX2ZpbmlzaGVkID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1sb2didWZfdGltZXN0YW1wID0gMDsKKworc3RhdGljIGludCBsb2dsZXZlbF9zYXZlID0gLTE7CisjZGVmaW5lIEJSRUFLX0xPR0xFVkVMKF9fY29uc29sZV9sb2dsZXZlbCkJCVwKKwlvb3BzX2luX3Byb2dyZXNzID0gMTsJCQkJXAorCWlmIChsb2dsZXZlbF9zYXZlIDwgMCkJCQkJXAorCQlsb2dsZXZlbF9zYXZlID0gX19jb25zb2xlX2xvZ2xldmVsOwlcCisJX19jb25zb2xlX2xvZ2xldmVsID0gMTU7CisKKyNkZWZpbmUgUkVTVE9SRV9MT0dMRVZFTChfX2NvbnNvbGVfbG9nbGV2ZWwpCQlcCisJaWYgKGxvZ2xldmVsX3NhdmUgPj0gMCkgewkJCVwKKwkJX19jb25zb2xlX2xvZ2xldmVsID0gbG9nbGV2ZWxfc2F2ZTsJXAorCQlsb2dsZXZlbF9zYXZlID0gLTE7CQkJXAorCX0JCQkJCQlcCisJbWxvZ2J1Zl9maW5pc2hlZCA9IDA7CQkJCVwKKwlvb3BzX2luX3Byb2dyZXNzID0gMDsKKworLyoKKyAqIFB1c2ggbWVzc2FnZXMgaW50byBidWZmZXIsIHByaW50IHRoZW0gbGF0ZXIgaWYgbm90IHVyZ2VudC4KKyAqLwordm9pZCBpYTY0X21jYV9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBwcmludGVkX2xlbjsKKwljaGFyIHRlbXBfYnVmW01MT0dCVUZfTVNHTUFYXTsKKwljaGFyICpwOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlwcmludGVkX2xlbiA9IHZzY25wcmludGYodGVtcF9idWYsIHNpemVvZih0ZW1wX2J1ZiksIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJLyogQ29weSB0aGUgb3V0cHV0IGludG8gbWxvZ2J1ZiAqLworCWlmIChvb3BzX2luX3Byb2dyZXNzKSB7CisJCS8qIG1sb2didWYgd2FzIGFiYW5kb25lZCwgdXNlIHByaW50ayBkaXJlY3RseSBpbnN0ZWFkLiAqLworCQlwcmludGsodGVtcF9idWYpOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmbWxvZ2J1Zl93bG9jayk7CisJCWZvciAocCA9IHRlbXBfYnVmOyAqcDsgcCsrKSB7CisJCQl1bnNpZ25lZCBsb25nIG5leHQgPSAobWxvZ2J1Zl9lbmQgKyAxKSAlIE1MT0dCVUZfU0laRTsKKwkJCWlmIChuZXh0ICE9IG1sb2didWZfc3RhcnQpIHsKKwkJCQltbG9nYnVmW21sb2didWZfZW5kXSA9ICpwOworCQkJCW1sb2didWZfZW5kID0gbmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJLyogYnVmZmVyIGZ1bGwgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQltbG9nYnVmW21sb2didWZfZW5kXSA9ICdcMCc7CisJCXNwaW5fdW5sb2NrKCZtbG9nYnVmX3dsb2NrKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlhNjRfbWNhX3ByaW50ayk7CisKKy8qCisgKiBQcmludCBidWZmZXJlZCBtZXNzYWdlcy4KKyAqICBOT1RFOiBjYWxsIHRoaXMgYWZ0ZXIgcmV0dXJuaW5nIG5vcm1hbCBjb250ZXh0LiAoZXguIGZyb20gc2FsaW5mb2QpCisgKi8KK3ZvaWQgaWE2NF9tbG9nYnVmX2R1bXAodm9pZCkKK3sKKwljaGFyIHRlbXBfYnVmW01MT0dCVUZfTVNHTUFYXTsKKwljaGFyICpwOworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgcHJpbnRlZF9sZW47CisKKwkvKiBHZXQgb3V0cHV0IGZyb20gbWxvZ2J1ZiAqLworCXdoaWxlIChtbG9nYnVmX3N0YXJ0ICE9IG1sb2didWZfZW5kKSB7CisJCXRlbXBfYnVmWzBdID0gJ1wwJzsKKwkJcCA9IHRlbXBfYnVmOworCQlwcmludGVkX2xlbiA9IDA7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1sb2didWZfcmxvY2ssIGZsYWdzKTsKKworCQlpbmRleCA9IG1sb2didWZfc3RhcnQ7CisJCXdoaWxlIChpbmRleCAhPSBtbG9nYnVmX2VuZCkgeworCQkJKnAgPSBtbG9nYnVmW2luZGV4XTsKKwkJCWluZGV4ID0gKGluZGV4ICsgMSkgJSBNTE9HQlVGX1NJWkU7CisJCQlpZiAoISpwKQorCQkJCWJyZWFrOworCQkJcCsrOworCQkJaWYgKCsrcHJpbnRlZF9sZW4gPj0gTUxPR0JVRl9NU0dNQVggLSAxKQorCQkJCWJyZWFrOworCQl9CisJCSpwID0gJ1wwJzsKKwkJaWYgKHRlbXBfYnVmWzBdKQorCQkJcHJpbnRrKHRlbXBfYnVmKTsKKwkJbWxvZ2J1Zl9zdGFydCA9IGluZGV4OworCisJCW1sb2didWZfdGltZXN0YW1wID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWxvZ2J1Zl9ybG9jaywgZmxhZ3MpOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWE2NF9tbG9nYnVmX2R1bXApOworCisvKgorICogQ2FsbCB0aGlzIGlmIHN5c3RlbSBpcyBnb2luZyB0byBkb3duIG9yIGlmIGltbWVkaWF0ZSBmbHVzaGluZyBtZXNzYWdlcyB0bworICogY29uc29sZSBpcyByZXF1aXJlZC4gKGV4LiByZWNvdmVyeSB3YXMgZmFpbGVkLCBjcmFzaCBkdW1wIGlzIGdvaW5nIHRvIGJlCisgKiBpbnZva2VkLCBsb25nLXdhaXQgcmVuZGV6dm91cyBldGMuKQorICogIE5PVEU6IHRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIG1vbmFyY2guCisgKi8KK3N0YXRpYyB2b2lkIGlhNjRfbWxvZ2J1Zl9maW5pc2goaW50IHdhaXQpCit7CisJQlJFQUtfTE9HTEVWRUwoY29uc29sZV9sb2dsZXZlbCk7CisKKwlzcGluX2xvY2tfaW5pdCgmbWxvZ2J1Zl9ybG9jayk7CisJaWE2NF9tbG9nYnVmX2R1bXAoKTsKKwlwcmludGsoS0VSTl9FTUVSRyAibWxvZ2J1Zl9maW5pc2g6IHByaW50aW5nIHN3aXRjaGVkIHRvIHVyZ2VudCBtb2RlLCAiCisJCSJNQ0EvSU5JVCBtaWdodCBiZSBkb2RneSBvciBmYWlsLlxuIik7CisKKwlpZiAoIXdhaXQpCisJCXJldHVybjsKKworCS8qIHdhaXQgZm9yIGNvbnNvbGUgKi8KKwlwcmludGsoIkRlbGF5aW5nIGZvciA1IHNlY29uZHMuLi5cbiIpOworCXVkZWxheSg1KjEwMDAwMDApOworCisJbWxvZ2J1Zl9maW5pc2hlZCA9IDE7Cit9CitFWFBPUlRfU1lNQk9MKGlhNjRfbWxvZ2J1Zl9maW5pc2gpOworCisvKgorICogUHJpbnQgYnVmZmVyZWQgbWVzc2FnZXMgZnJvbSBJTklUIGNvbnRleHQuCisgKi8KK3N0YXRpYyB2b2lkIGlhNjRfbWxvZ2J1Zl9kdW1wX2Zyb21faW5pdCh2b2lkKQoreworCWlmIChtbG9nYnVmX2ZpbmlzaGVkKQorCQlyZXR1cm47CisKKwlpZiAobWxvZ2J1Zl90aW1lc3RhbXAgJiYgKG1sb2didWZfdGltZXN0YW1wICsgMzAqSFogPiBqaWZmaWVzKSkgeworCQlwcmludGsoS0VSTl9FUlIgIklOSVQ6IG1sb2didWZfZHVtcCBpcyBpbnRlcnJ1cHRlZCBieSBJTklUICIKKwkJCSIgYW5kIHRoZSBzeXN0ZW0gc2VlbXMgdG8gYmUgbWVzc2VkIHVwLlxuIik7CisJCWlhNjRfbWxvZ2J1Zl9maW5pc2goMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXNwaW5fdHJ5bG9jaygmbWxvZ2J1Zl9ybG9jaykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJTklUOiBtbG9nYnVmX2R1bXAgaXMgaW50ZXJydXB0ZWQgYnkgSU5JVC4gIgorCQkJIkdlbmVyYXRlZCBtZXNzYWdlcyBvdGhlciB0aGFuIHN0YWNrIGR1bXAgd2lsbCBiZSAiCisJCQkiYnVmZmVyZWQgdG8gbWxvZ2J1ZiBhbmQgd2lsbCBiZSBwcmludGVkIGxhdGVyLlxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiSU5JVDogSWYgbWVzc2FnZXMgd291bGQgbm90IHByaW50ZWQgYWZ0ZXIgIgorCQkJInRoaXMgSU5JVCwgd2FpdCAzMHNlYyBhbmQgYXNzZXJ0IElOSVQgYWdhaW4uXG4iKTsKKwkJaWYgKCFtbG9nYnVmX3RpbWVzdGFtcCkKKwkJCW1sb2didWZfdGltZXN0YW1wID0gamlmZmllczsKKwkJcmV0dXJuOworCX0KKwlzcGluX3VubG9jaygmbWxvZ2J1Zl9ybG9jayk7CisJaWE2NF9tbG9nYnVmX2R1bXAoKTsKK30KIAogc3RhdGljIHZvaWQgaW5saW5lCiBpYTY0X21jYV9zcGluKGNvbnN0IGNoYXIgKmZ1bmMpCiB7Ci0JcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiBzcGlubmluZyBoZXJlLCBub3QgcmV0dXJuaW5nIHRvIFNBTFxuIiwgZnVuYyk7CisJaWYgKG1vbmFyY2hfY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJaWE2NF9tbG9nYnVmX2ZpbmlzaCgwKTsKKwltcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiBzcGlubmluZyBoZXJlLCBub3QgcmV0dXJuaW5nIHRvIFNBTFxuIiwgZnVuYyk7CiAJd2hpbGUgKDEpCiAJCWNwdV9yZWxheCgpOwogfQpAQCAtMzQ0LDkgKzUxMSw2IEBACiAJLyogU0FMIHNwZWMgc3RhdGVzIHRoaXMgc2hvdWxkIHJ1biB3LyBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKLQkvKiBHZXQgdGhlIENQRSBlcnJvciByZWNvcmQgYW5kIGxvZyBpdCAqLwotCWlhNjRfbWNhX2xvZ19zYWxfZXJyb3JfcmVjb3JkKFNBTF9JTkZPX1RZUEVfQ1BFKTsKLQogCXNwaW5fbG9jaygmY3BlX2hpc3RvcnlfbG9jayk7CiAJaWYgKCFjcGVfcG9sbF9lbmFibGVkICYmIGNwZV92ZWN0b3IgPj0gMCkgewogCkBAIC0zNzUsNyArNTM5LDcgQEAKIAkJCW1vZF90aW1lcigmY3BlX3BvbGxfdGltZXIsIGppZmZpZXMgKyBNSU5fQ1BFX1BPTExfSU5URVJWQUwpOwogCiAJCQkvKiBsb2NrIGFscmVhZHkgcmVsZWFzZWQsIGdldCBvdXQgbm93ICovCi0JCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQlnb3RvIG91dDsKIAkJfSBlbHNlIHsKIAkJCWNwZV9oaXN0b3J5W2luZGV4KytdID0gbm93OwogCQkJaWYgKGluZGV4ID09IENQRV9ISVNUT1JZX0xFTkdUSCkKQEAgLTM4Myw2ICs1NDcsMTAgQEAKIAkJfQogCX0KIAlzcGluX3VubG9jaygmY3BlX2hpc3RvcnlfbG9jayk7CitvdXQ6CisJLyogR2V0IHRoZSBDUEUgZXJyb3IgcmVjb3JkIGFuZCBsb2cgaXQgKi8KKwlpYTY0X21jYV9sb2dfc2FsX2Vycm9yX3JlY29yZChTQUxfSU5GT19UWVBFX0NQRSk7CisKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTk4OCwxOCArMTE1NiwyMiBAQAogCX0KIAlpZiAoIW1pc3NpbmcpCiAJCWdvdG8gYWxsX2luOwotCXByaW50ayhLRVJOX0lORk8gIk9TICVzIHNsYXZlIGRpZCBub3QgcmVuZGV6dm91cyBvbiBjcHUiLCB0eXBlKTsKKwkvKgorCSAqIE1heWJlIHNsYXZlKHMpIGRlYWQuIFByaW50IGJ1ZmZlcmVkIG1lc3NhZ2VzIGltbWVkaWF0ZWx5LgorCSAqLworCWlhNjRfbWxvZ2J1Zl9maW5pc2goMCk7CisJbXByaW50ayhLRVJOX0lORk8gIk9TICVzIHNsYXZlIGRpZCBub3QgcmVuZGV6dm91cyBvbiBjcHUiLCB0eXBlKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGMpIHsKIAkJaWYgKGMgPT0gbW9uYXJjaCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoaWE2NF9tY19pbmZvLmltaV9yZW5kZXpfY2hlY2tpbltjXSA9PSBJQTY0X01DQV9SRU5ERVpfQ0hFQ0tJTl9OT1RET05FKQotCQkJcHJpbnRrKCIgJWQiLCBjKTsKKwkJCW1wcmludGsoIiAlZCIsIGMpOwogCX0KLQlwcmludGsoIlxuIik7CisJbXByaW50aygiXG4iKTsKIAlyZXR1cm47CiAKIGFsbF9pbjoKLQlwcmludGsoS0VSTl9JTkZPICJBbGwgT1MgJXMgc2xhdmVzIGhhdmUgcmVhY2hlZCByZW5kZXp2b3VzXG4iLCB0eXBlKTsKKwltcHJpbnRrKEtFUk5fSU5GTyAiQWxsIE9TICVzIHNsYXZlcyBoYXZlIHJlYWNoZWQgcmVuZGV6dm91c1xuIiwgdHlwZSk7CiAJcmV0dXJuOwogfQogCkBAIC0xMDI3LDEwICsxMTk5LDggQEAKIAlzdHJ1Y3QgaWE2NF9tY2Ffbm90aWZ5X2RpZSBuZCA9CiAJCXsgLnNvcyA9IHNvcywgLm1vbmFyY2hfY3B1ID0gJm1vbmFyY2hfY3B1IH07CiAKLQlvb3BzX2luX3Byb2dyZXNzID0gMTsJLyogRklYTUU6IG1ha2UgcHJpbnRrIE5NSS9NQ0EvSU5JVCBzYWZlICovCi0JY29uc29sZV9sb2dsZXZlbCA9IDE1OwkvKiBtYWtlIHN1cmUgcHJpbnRrcyBtYWtlIGl0IHRvIGNvbnNvbGUgKi8KLQlwcmludGsoS0VSTl9JTkZPICJFbnRlcmVkIE9TIE1DQSBoYW5kbGVyLiBQU1A9JWx4IGNwdT0lZCBtb25hcmNoPSVsZFxuIiwKLQkJc29zLT5wcm9jX3N0YXRlX3BhcmFtLCBjcHUsIHNvcy0+bW9uYXJjaCk7CisJbXByaW50ayhLRVJOX0lORk8gIkVudGVyZWQgT1MgTUNBIGhhbmRsZXIuIFBTUD0lbHggY3B1PSVkICIKKwkJIm1vbmFyY2g9JWxkXG4iLCBzb3MtPnByb2Nfc3RhdGVfcGFyYW0sIGNwdSwgc29zLT5tb25hcmNoKTsKIAogCXByZXZpb3VzX2N1cnJlbnQgPSBpYTY0X21jYV9tb2RpZnlfb3JpZ2luYWxfc3RhY2socmVncywgc3csIHNvcywgIk1DQSIpOwogCW1vbmFyY2hfY3B1ID0gY3B1OwpAQCAtMTA2Niw2ICsxMjM2LDkgQEAKIAkJcmgtPnNldmVyaXR5ID0gc2FsX2xvZ19zZXZlcml0eV9jb3JyZWN0ZWQ7CiAJCWlhNjRfc2FsX2NsZWFyX3N0YXRlX2luZm8oU0FMX0lORk9fVFlQRV9NQ0EpOwogCQlzb3MtPm9zX3N0YXR1cyA9IElBNjRfTUNBX0NPUlJFQ1RFRDsKKwl9IGVsc2UgeworCQkvKiBEdW1wIGJ1ZmZlcmVkIG1lc3NhZ2UgdG8gY29uc29sZSAqLworCQlpYTY0X21sb2didWZfZmluaXNoKDEpOwogCX0KIAlpZiAobm90aWZ5X2RpZShESUVfTUNBX01PTkFSQ0hfTEVBVkUsICJNQ0EiLCByZWdzLCAobG9uZykmbmQsIDAsIHJlY292ZXIpCiAJCQk9PSBOT1RJRllfU1RPUCkKQEAgLTExMDYsOSArMTI3OSw2IEBACiAJLyogU0FMIHNwZWMgc3RhdGVzIHRoaXMgc2hvdWxkIHJ1biB3LyBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKLQkvKiBHZXQgdGhlIENNQyBlcnJvciByZWNvcmQgYW5kIGxvZyBpdCAqLwotCWlhNjRfbWNhX2xvZ19zYWxfZXJyb3JfcmVjb3JkKFNBTF9JTkZPX1RZUEVfQ01DKTsKLQogCXNwaW5fbG9jaygmY21jX2hpc3RvcnlfbG9jayk7CiAJaWYgKCFjbWNfcG9sbGluZ19lbmFibGVkKSB7CiAJCWludCBpLCBjb3VudCA9IDE7IC8qIHdlIGtub3cgMSBoYXBwZW5lZCBub3cgKi8KQEAgLTExNDEsNyArMTMxMSw3IEBACiAJCQltb2RfdGltZXIoJmNtY19wb2xsX3RpbWVyLCBqaWZmaWVzICsgQ01DX1BPTExfSU5URVJWQUwpOwogCiAJCQkvKiBsb2NrIGFscmVhZHkgcmVsZWFzZWQsIGdldCBvdXQgbm93ICovCi0JCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQlnb3RvIG91dDsKIAkJfSBlbHNlIHsKIAkJCWNtY19oaXN0b3J5W2luZGV4KytdID0gbm93OwogCQkJaWYgKGluZGV4ID09IENNQ19ISVNUT1JZX0xFTkdUSCkKQEAgLTExNDksNiArMTMxOSwxMCBAQAogCQl9CiAJfQogCXNwaW5fdW5sb2NrKCZjbWNfaGlzdG9yeV9sb2NrKTsKK291dDoKKwkvKiBHZXQgdGhlIENNQyBlcnJvciByZWNvcmQgYW5kIGxvZyBpdCAqLworCWlhNjRfbWNhX2xvZ19zYWxfZXJyb3JfcmVjb3JkKFNBTF9JTkZPX1RZUEVfQ01DKTsKKwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMTMwNSw2ICsxNDc5LDE1IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqdDsKIAlpZiAodmFsICE9IERJRV9JTklUX01PTkFSQ0hfUFJPQ0VTUykKIAkJcmV0dXJuIE5PVElGWV9ET05FOworCisJLyoKKwkgKiBGSVhNRTogbWxvZ2J1ZiB3aWxsIGJyaW0gb3ZlciB3aXRoIElOSVQgc3RhY2sgZHVtcHMuCisJICogVG8gZW5hYmxlIHNob3dfc3RhY2sgZnJvbSBJTklULCB3ZSB1c2Ugb29wc19pbl9wcm9ncmVzcyB3aGljaCBzaG91bGQKKwkgKiBiZSB1c2VkIGluIHJlYWwgb29wcy4gVGhpcyB3b3VsZCBjYXVzZSBzb21ldGhpbmcgd3JvbmcgYWZ0ZXIgSU5JVC4KKwkgKi8KKwlCUkVBS19MT0dMRVZFTChjb25zb2xlX2xvZ2xldmVsKTsKKwlpYTY0X21sb2didWZfZHVtcF9mcm9tX2luaXQoKTsKKwogCXByaW50ayhLRVJOX0VSUiAiUHJvY2Vzc2VzIGludGVycnVwdGVkIGJ5IElOSVQgLSIpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoYykgewogCQlzdHJ1Y3QgaWE2NF9zYWxfb3Nfc3RhdGUgKnM7CkBAIC0xMzI2LDYgKzE1MDksOCBAQAogCQl9IHdoaWxlX2VhY2hfdGhyZWFkIChnLCB0KTsKIAkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogCX0KKwkvKiBGSVhNRTogVGhpcyB3aWxsIG5vdCByZXN0b3JlIHphcHBlZCBwcmludGsgbG9ja3MuICovCisJUkVTVE9SRV9MT0dMRVZFTChjb25zb2xlX2xvZ2xldmVsKTsKIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CiAKQEAgLTEzNTcsMTIgKzE1NDIsOSBAQAogCXN0cnVjdCBpYTY0X21jYV9ub3RpZnlfZGllIG5kID0KIAkJeyAuc29zID0gc29zLCAubW9uYXJjaF9jcHUgPSAmbW9uYXJjaF9jcHUgfTsKIAotCW9vcHNfaW5fcHJvZ3Jlc3MgPSAxOwkvKiBGSVhNRTogbWFrZSBwcmludGsgTk1JL01DQS9JTklUIHNhZmUgKi8KLQljb25zb2xlX2xvZ2xldmVsID0gMTU7CS8qIG1ha2Ugc3VyZSBwcmludGtzIG1ha2UgaXQgdG8gY29uc29sZSAqLwotCiAJKHZvaWQpIG5vdGlmeV9kaWUoRElFX0lOSVRfRU5URVIsICJJTklUIiwgcmVncywgKGxvbmcpJm5kLCAwLCAwKTsKIAotCXByaW50ayhLRVJOX0lORk8gIkVudGVyZWQgT1MgSU5JVCBoYW5kbGVyLiBQU1A9JWx4IGNwdT0lZCBtb25hcmNoPSVsZFxuIiwKKwltcHJpbnRrKEtFUk5fSU5GTyAiRW50ZXJlZCBPUyBJTklUIGhhbmRsZXIuIFBTUD0lbHggY3B1PSVkIG1vbmFyY2g9JWxkXG4iLAogCQlzb3MtPnByb2Nfc3RhdGVfcGFyYW0sIGNwdSwgc29zLT5tb25hcmNoKTsKIAlzYWxpbmZvX2xvZ193YWtldXAoU0FMX0lORk9fVFlQRV9JTklULCBOVUxMLCAwLCAwKTsKIApAQCAtMTM3NSw3ICsxNTU3LDcgQEAKIAkgKiBmaXggdGhlaXIgcHJvbXMgYW5kIGdldCB0aGVpciBjdXN0b21lcnMgdXBkYXRlZC4KIAkgKi8KIAlpZiAoIXNvcy0+bW9uYXJjaCAmJiBhdG9taWNfYWRkX3JldHVybigxLCAmc2xhdmVzKSA9PSBudW1fb25saW5lX2NwdXMoKSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUHJvbW90aW5nIGNwdSAlZCB0byBtb25hcmNoLlxuIiwKKwkJbXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBQcm9tb3RpbmcgY3B1ICVkIHRvIG1vbmFyY2guXG4iLAogCQkgICAgICAgX19GVU5DVElPTl9fLCBjcHUpOwogCQlhdG9taWNfZGVjKCZzbGF2ZXMpOwogCQlzb3MtPm1vbmFyY2ggPSAxOwpAQCAtMTM4Nyw3ICsxNTY5LDcgQEAKIAkgKiBmaXggdGhlaXIgcHJvbXMgYW5kIGdldCB0aGVpciBjdXN0b21lcnMgdXBkYXRlZC4KIAkgKi8KIAlpZiAoc29zLT5tb25hcmNoICYmIGF0b21pY19hZGRfcmV0dXJuKDEsICZtb25hcmNocykgPiAxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBEZW1vdGluZyBjcHUgJWQgdG8gc2xhdmUuXG4iLAorCQltcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IERlbW90aW5nIGNwdSAlZCB0byBzbGF2ZS5cbiIsCiAJCQkgICAgICAgX19GVU5DVElPTl9fLCBjcHUpOwogCQlhdG9taWNfZGVjKCZtb25hcmNocyk7CiAJCXNvcy0+bW9uYXJjaCA9IDA7CkBAIC0xNDA4LDcgKzE1OTAsNyBAQAogCQlpZiAobm90aWZ5X2RpZShESUVfSU5JVF9TTEFWRV9MRUFWRSwgIklOSVQiLCByZWdzLCAobG9uZykmbmQsIDAsIDApCiAJCQkJPT0gTk9USUZZX1NUT1ApCiAJCQlpYTY0X21jYV9zcGluKF9fRlVOQ1RJT05fXyk7Ci0JCXByaW50aygiU2xhdmUgb24gY3B1ICVkIHJldHVybmluZyB0byBub3JtYWwgc2VydmljZS5cbiIsIGNwdSk7CisJCW1wcmludGsoIlNsYXZlIG9uIGNwdSAlZCByZXR1cm5pbmcgdG8gbm9ybWFsIHNlcnZpY2UuXG4iLCBjcHUpOwogCQlzZXRfY3Vycl90YXNrKGNwdSwgcHJldmlvdXNfY3VycmVudCk7CiAJCWlhNjRfbWNfaW5mby5pbWlfcmVuZGV6X2NoZWNraW5bY3B1XSA9IElBNjRfTUNBX1JFTkRFWl9DSEVDS0lOX05PVERPTkU7CiAJCWF0b21pY19kZWMoJnNsYXZlcyk7CkBAIC0xNDI2LDcgKzE2MDgsNyBAQAogCSAqIHNhbWUgc2VyaWFsIGxpbmUsIHRoZSB1c2VyIHdpbGwgbmVlZCBzb21lIHRpbWUgdG8gc3dpdGNoIG91dCBvZiB0aGUgQk1DIGJlZm9yZQogCSAqIHRoZSBkdW1wIGJlZ2lucy4KIAkgKi8KLQlwcmludGsoIkRlbGF5aW5nIGZvciA1IHNlY29uZHMuLi5cbiIpOworCW1wcmludGsoIkRlbGF5aW5nIGZvciA1IHNlY29uZHMuLi5cbiIpOwogCXVkZWxheSg1KjEwMDAwMDApOwogCWlhNjRfd2FpdF9mb3Jfc2xhdmVzKGNwdSwgIklOSVQiKTsKIAkvKiBJZiBub2JvZHkgaW50ZXJjZXB0cyBESUVfSU5JVF9NT05BUkNIX1BST0NFU1MgdGhlbiB3ZSBkcm9wIHRocm91Z2gKQEAgLTE0MzksNyArMTYyMSw3IEBACiAJaWYgKG5vdGlmeV9kaWUoRElFX0lOSVRfTU9OQVJDSF9MRUFWRSwgIklOSVQiLCByZWdzLCAobG9uZykmbmQsIDAsIDApCiAJCQk9PSBOT1RJRllfU1RPUCkKIAkJaWE2NF9tY2Ffc3BpbihfX0ZVTkNUSU9OX18pOwotCXByaW50aygiXG5JTklUIGR1bXAgY29tcGxldGUuICBNb25hcmNoIG9uIGNwdSAlZCByZXR1cm5pbmcgdG8gbm9ybWFsIHNlcnZpY2UuXG4iLCBjcHUpOworCW1wcmludGsoIlxuSU5JVCBkdW1wIGNvbXBsZXRlLiAgTW9uYXJjaCBvbiBjcHUgJWQgcmV0dXJuaW5nIHRvIG5vcm1hbCBzZXJ2aWNlLlxuIiwgY3B1KTsKIAlhdG9taWNfZGVjKCZtb25hcmNocyk7CiAJc2V0X2N1cnJfdGFzayhjcHUsIHByZXZpb3VzX2N1cnJlbnQpOwogCW1vbmFyY2hfY3B1ID0gLTE7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL21jYV9hc20uUyBiL2FyY2gvaWE2NC9rZXJuZWwvbWNhX2FzbS5TCmluZGV4IDk2MDQ3NDkuLmM2YjYwN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhX2FzbS5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvbWNhX2FzbS5TCkBAIC0xMDI1LDE4ICsxMDI1LDEzIEBACiAKIGlhNjRfc2V0X2tlcm5lbF9yZWdpc3RlcnM6CiAJYWRkIHRlbXAzPU1DQV9TUF9PRkZTRVQsIHIzCi0JYWRkIHRlbXA0PU1DQV9TT1NfT0ZGU0VUK1NPUyhPU19HUCksIHIzCiAJbW92IGIwPXIyCQkvLyBzYXZlIHJldHVybiBhZGRyZXNzCiAJR0VUX0lBNjRfTUNBX0RBVEEodGVtcDEpCiAJOzsKLQlhZGQgdGVtcDQ9dGVtcDQsIHRlbXAxCS8vICZzdHJ1Y3QgaWE2NF9zYWxfb3Nfc3RhdGUub3NfZ3AKIAlhZGQgcjEyPXRlbXAxLCB0ZW1wMwkvLyBrZXJuZWwgc3RhY2sgcG9pbnRlciBvbiBNQ0EvSU5JVCBzdGFjawogCWFkZCByMTM9dGVtcDEsIHIzCS8vIHNldCBjdXJyZW50IHRvIHN0YXJ0IG9mIE1DQS9JTklUIHN0YWNrCiAJYWRkIHIyMD10ZW1wMSwgcjMJLy8gcGh5c2ljYWwgc3RhcnQgb2YgTUNBL0lOSVQgc3RhY2sKIAk7OwotCWxkOCByMT1bdGVtcDRdCQkvLyBPUyBHUCBmcm9tIFNBTCBPUyBzdGF0ZQotCTs7Ci0JREFUQV9QQV9UT19WQShyMSx0ZW1wMSkKIAlEQVRBX1BBX1RPX1ZBKHIxMix0ZW1wMikKIAlEQVRBX1BBX1RPX1ZBKHIxMyx0ZW1wMykKIAk7OwpAQCAtMTA2Nyw2ICsxMDYyLDEwIEBACiAJbW92IGNyLml0aXI9cjE4CiAJbW92IGNyLmlmYT1yMTMKIAltb3YgcjIwPUlBNjRfVFJfQ1VSUkVOVF9TVEFDSworCisJbW92bCByMTc9RlBTUl9ERUZBVUxUCisJOzsKKwltb3YubSBhci5mcHNyPXIxNwkJCS8vIHNldCBhci5mcHNyIHRvIGtlcm5lbCBkZWZhdWx0IHZhbHVlCiAJOzsKIAlpdHIuZCBkdHJbcjIwXT1yMjEKIAk7OwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9tY2FfZHJ2LmMgYi9hcmNoL2lhNjQva2VybmVsL21jYV9kcnYuYwppbmRleCA4ZGI2ZTBjLi5hNDUwMDlkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL21jYV9kcnYuYworKysgYi9hcmNoL2lhNjQva2VybmVsL21jYV9kcnYuYwpAQCAtNzksMTQgKzc5LDMwIEBACiBmYXRhbF9tY2EoY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJdmFfbGlzdCBhcmdzOworCWNoYXIgYnVmWzI1Nl07CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXZwcmludGsoZm10LCBhcmdzKTsKKwl2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzKTsKIAl2YV9lbmQoYXJncyk7CisJaWE2NF9tY2FfcHJpbnRrKEtFUk5fQUxFUlQgIk1DQTogJXNcbiIsIGJ1Zik7CiAKIAlyZXR1cm4gTUNBX05PVF9SRUNPVkVSRUQ7CiB9CiAKK3N0YXRpYyBpbnQKK21jYV9yZWNvdmVyZWQoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWNoYXIgYnVmWzI1Nl07CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlpYTY0X21jYV9wcmludGsoS0VSTl9JTkZPICJNQ0E6ICVzXG4iLCBidWYpOworCisJcmV0dXJuIE1DQV9SRUNPVkVSRUQ7Cit9CisKIC8qKgogICogbWNhX3BhZ2VfaXNvbGF0ZSAtIGlzb2xhdGUgYSBwb2lzb25lZCBwYWdlIGluIG9yZGVyIG5vdCB0byB1c2UgaXQgbGF0ZXIKICAqIEBwYWRkcjoJcG9pc29uZWQgbWVtb3J5IGxvY2F0aW9uCkBAIC0xNDAsNiArMTU2LDcgQEAKIHZvaWQKIG1jYV9oYW5kbGVyX2JoKHVuc2lnbmVkIGxvbmcgcGFkZHIsIHZvaWQgKmlpcCwgdW5zaWduZWQgbG9uZyBpcHNyKQogeworCWlhNjRfbWxvZ2J1Zl9kdW1wKCk7CiAJcHJpbnRrKEtFUk5fRVJSICJPU19NQ0E6IHByb2Nlc3MgW2NwdSAlZCwgcGlkOiAlZCwgdWlkOiAlZCwgIgogCQkiaWlwOiAlcCwgcHNyOiAweCVseCxwYWRkcjogMHglbHhdKCVzKSBlbmNvdW50ZXJzIE1DQS5cbiIsCiAJCXJhd19zbXBfcHJvY2Vzc29yX2lkKCksIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+dWlkLApAQCAtNDQwLDcgKzQ1Nyw3IEBACiAKIAkvKiBJcyB0YXJnZXQgYWRkcmVzcyB2YWxpZD8gKi8KIAlpZiAoIXBiY2ktPnR2KQotCQlyZXR1cm4gZmF0YWxfbWNhKEtFUk5fQUxFUlQgIk1DQTogdGFyZ2V0IGFkZHJlc3Mgbm90IHZhbGlkXG4iKTsKKwkJcmV0dXJuIGZhdGFsX21jYSgidGFyZ2V0IGFkZHJlc3Mgbm90IHZhbGlkIik7CiAKIAkvKgogCSAqIGNwdSByZWFkIG9yIG1lbW9yeS1tYXBwZWQgaW8gcmVhZApAQCAtNDU4LDcgKzQ3NSw3IEBACiAKIAkvKiBJcyBtaW5zdGF0ZSB2YWxpZD8gKi8KIAlpZiAoIXBlaWR4X2JvdHRvbShwZWlkeCkgfHwgIShwZWlkeF9ib3R0b20ocGVpZHgpLT52YWxpZC5taW5zdGF0ZSkpCi0JCXJldHVybiBmYXRhbF9tY2EoS0VSTl9BTEVSVCAiTUNBOiBtaW5zdGF0ZSBub3QgdmFsaWRcbiIpOworCQlyZXR1cm4gZmF0YWxfbWNhKCJtaW5zdGF0ZSBub3QgdmFsaWQiKTsKIAlwc3IxID0oc3RydWN0IGlhNjRfcHNyICopJihwZWlkeF9taW5zdGF0ZV9hcmVhKHBlaWR4KS0+cG1zYV9pcHNyKTsKIAlwc3IyID0oc3RydWN0IGlhNjRfcHNyICopJihwZWlkeF9taW5zdGF0ZV9hcmVhKHBlaWR4KS0+cG1zYV94cHNyKTsKIApAQCAtNDkyLDEzICs1MDksMTQgQEAKIAkJCXBzcjItPmJuICA9IDE7CiAJCQlwc3IyLT5pICA9IDA7CiAKLQkJCXJldHVybiBNQ0FfUkVDT1ZFUkVEOworCQkJcmV0dXJuIG1jYV9yZWNvdmVyZWQoInVzZXIgbWVtb3J5IGNvcnJ1cHRpb24uICIKKwkJCQkia2lsbCBhZmZlY3RlZCBwcm9jZXNzIC0gcmVjb3ZlcmVkLiIpOwogCQl9CiAKIAl9CiAKLQlyZXR1cm4gZmF0YWxfbWNhKEtFUk5fQUxFUlQgIk1DQToga2VybmVsIGNvbnRleHQgbm90IHJlY292ZXJlZCwiCi0JCQkgICIgaWlwIDB4JWx4XG4iLCBwbXNhLT5wbXNhX2lpcCk7CisJcmV0dXJuIGZhdGFsX21jYSgia2VybmVsIGNvbnRleHQgbm90IHJlY292ZXJlZCwgaWlwIDB4JWx4XG4iLAorCQkJIHBtc2EtPnBtc2FfaWlwKTsKIH0KIAogLyoqCkBAIC01ODQsMTMgKzYwMiwxMyBAQAogCSAqIFRoZSBtYWNoaW5lIGNoZWNrIGlzIGNvcnJlY3RlZC4KIAkgKi8KIAlpZiAocHNwLT5jbSA9PSAxKQotCQlyZXR1cm4gTUNBX1JFQ09WRVJFRDsKKwkJcmV0dXJuIG1jYV9yZWNvdmVyZWQoIm1hY2hpbmUgY2hlY2sgaXMgYWxyZWFkeSBjb3JyZWN0ZWQuIik7CiAKIAkvKgogCSAqIFRoZSBlcnJvciB3YXMgbm90IGNvbnRhaW5lZC4gIFNvZnR3YXJlIG11c3QgYmUgcmVzZXQuCiAJICovCiAJaWYgKHBzcC0+dXMgfHwgcHNwLT5jaSA9PSAwKQotCQlyZXR1cm4gZmF0YWxfbWNhKEtFUk5fQUxFUlQgIk1DQTogZXJyb3Igbm90IGNvbnRhaW5lZFxuIik7CisJCXJldHVybiBmYXRhbF9tY2EoImVycm9yIG5vdCBjb250YWluZWQiKTsKIAogCS8qCiAJICogVGhlIGNhY2hlIGNoZWNrIGFuZCBidXMgY2hlY2sgYml0cyBoYXZlIGZvdXIgcG9zc2libGUgc3RhdGVzCkBAIC02MDEsMjIgKzYxOSwyMiBAQAogCSAqICAgIDEgIDEJTWVtb3J5IGVycm9yLCBhdHRlbXB0IHJlY292ZXJ5CiAJICovCiAJaWYgKHBzcC0+YmMgPT0gMCB8fCBwYmNpID09IE5VTEwpCi0JCXJldHVybiBmYXRhbF9tY2EoS0VSTl9BTEVSVCAiTUNBOiBObyBidXMgY2hlY2tcbiIpOworCQlyZXR1cm4gZmF0YWxfbWNhKCJObyBidXMgY2hlY2siKTsKIAogCS8qCiAJICogU29ycnksIHdlIGNhbm5vdCBoYW5kbGUgc28gbWFueS4KIAkgKi8KIAlpZiAocGVpZHhfYnVzX2NoZWNrX251bShwZWlkeCkgPiAxKQotCQlyZXR1cm4gZmF0YWxfbWNhKEtFUk5fQUxFUlQgIk1DQTogVG9vIG1hbnkgYnVzIGNoZWNrc1xuIik7CisJCXJldHVybiBmYXRhbF9tY2EoIlRvbyBtYW55IGJ1cyBjaGVja3MiKTsKIAkvKgogCSAqIFdlbGwsIGhlcmUgaXMgb25seSBvbmUgYnVzIGVycm9yLgogCSAqLwogCWlmIChwYmNpLT5pYikKLQkJcmV0dXJuIGZhdGFsX21jYShLRVJOX0FMRVJUICJNQ0E6IEludGVybmFsIEJ1cyBlcnJvclxuIik7CisJCXJldHVybiBmYXRhbF9tY2EoIkludGVybmFsIEJ1cyBlcnJvciIpOwogCWlmIChwYmNpLT5jYykKLQkJcmV0dXJuIGZhdGFsX21jYShLRVJOX0FMRVJUICJNQ0E6IENhY2hlLWNhY2hlIGVycm9yXG4iKTsKKwkJcmV0dXJuIGZhdGFsX21jYSgiQ2FjaGUtY2FjaGUgZXJyb3IiKTsKIAlpZiAocGJjaS0+ZWIgJiYgcGJjaS0+YnNpID4gMCkKLQkJcmV0dXJuIGZhdGFsX21jYShLRVJOX0FMRVJUICJNQ0E6IEV4dGVybmFsIGJ1cyBjaGVjayBmYXRhbCBzdGF0dXNcbiIpOworCQlyZXR1cm4gZmF0YWxfbWNhKCJFeHRlcm5hbCBidXMgY2hlY2sgZmF0YWwgc3RhdHVzIik7CiAKIAkvKgogCSAqIFRoaXMgaXMgYSBsb2NhbCBNQ0EgYW5kIGVzdGltYXRlZCBhcyByZWNvdmVyYmxlIGV4dGVybmFsIGJ1cyBlcnJvci4KQEAgLTYyOCw3ICs2NDYsNyBAQAogCS8qCiAJICogT24gYWNjb3VudCBvZiBzdHJhbmdlIFNBTCBlcnJvciByZWNvcmQsIHdlIGNhbm5vdCByZWNvdmVyLgogCSAqLwotCXJldHVybiBmYXRhbF9tY2EoS0VSTl9BTEVSVCAiTUNBOiBTdHJhbmdlIFNBTCByZWNvcmRcbiIpOworCXJldHVybiBmYXRhbF9tY2EoIlN0cmFuZ2UgU0FMIHJlY29yZCIpOwogfQogCiAvKioKQEAgLTY1NywxMCArNjc1LDEwIEBACiAKIAkgLyogTm93LCBPUyBjYW4gcmVjb3ZlciB3aGVuIHRoZXJlIGlzIG9uZSBwcm9jZXNzb3IgZXJyb3Igc2VjdGlvbiAqLwogCWlmIChuX3Byb2NfZXJyID4gMSkKLQkJcmV0dXJuIGZhdGFsX21jYShLRVJOX0FMRVJUICJNQ0E6IFRvbyBNYW55IEVycm9yc1xuIik7CisJCXJldHVybiBmYXRhbF9tY2EoIlRvbyBNYW55IEVycm9ycyIpOwogCWVsc2UgaWYgKG5fcHJvY19lcnIgPT0gMCkKLQkJLyogV2VpcmQgU0FMIHJlY29yZCAuLi4gV2UgbmVlZCBub3QgdG8gcmVjb3ZlciAqLwotCQlyZXR1cm4gZmF0YWxfbWNhKEtFUk5fQUxFUlQgIk1DQTogV2VpcmQgU0FMIHJlY29yZFxuIik7CisJCS8qIFdlaXJkIFNBTCByZWNvcmQgLi4uIFdlIGNhbid0IGRvIGFueXRoaW5nICovCisJCXJldHVybiBmYXRhbF9tY2EoIldlaXJkIFNBTCByZWNvcmQiKTsKIAogCS8qIE1ha2UgaW5kZXggb2YgcHJvY2Vzc29yIGVycm9yIHNlY3Rpb24gKi8KIAltY2FfbWFrZV9wZWlkeCgoc2FsX2xvZ19wcm9jZXNzb3JfaW5mb190KikKQEAgLTY3MSw3ICs2ODksNyBAQAogCiAJLyogQ2hlY2sgd2hldGhlciBNQ0EgaXMgZ2xvYmFsIG9yIG5vdCAqLwogCWlmIChpc19tY2FfZ2xvYmFsKCZwZWlkeCwgJnBiY2ksIHNvcykpCi0JCXJldHVybiBmYXRhbF9tY2EoS0VSTl9BTEVSVCAiTUNBOiBnbG9iYWwgTUNBXG4iKTsKKwkJcmV0dXJuIGZhdGFsX21jYSgiZ2xvYmFsIE1DQSIpOwogCQogCS8qIFRyeSB0byByZWNvdmVyIGEgcHJvY2Vzc29yIGVycm9yICovCiAJcmV0dXJuIHJlY292ZXJfZnJvbV9wcm9jZXNzb3JfZXJyb3IocGxhdGZvcm1fZXJyLCAmc2xpZHgsICZwZWlkeCwKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhX2Rydi5oIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2FfZHJ2LmgKaW5kZXggMzFhMmU1Mi4uYzg1ZTk0MyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9tY2FfZHJ2LmgKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9tY2FfZHJ2LmgKQEAgLTExOCwzICsxMTgsNyBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IG1jYV90YWJsZV9lbnRyeSAqc2VhcmNoX21jYV90YWJsZXMgKHVuc2lnbmVkIGxvbmcgYWRkcik7CiBleHRlcm4gaW50IG1jYV9yZWNvdmVyX3JhbmdlKHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHZvaWQgaWE2NF9tY2FfcHJpbnRrKGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKKwkgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworZXh0ZXJuIHZvaWQgaWE2NF9tbG9nYnVmX2R1bXAodm9pZCk7CisKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jIGIvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMKaW5kZXggN2JiNzY5Ni4uMjgxMDA0ZiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9wZXJmbW9uLmMKQEAgLTYzLDYgKzYzLDkgQEAKIAogI2RlZmluZSBQRk1fSU5WQUxJRF9BQ1RJVkFUSU9OCSh+MFVMKQogCisjZGVmaW5lIFBGTV9OVU1fUE1DX1JFR1MJNjQJLyogUE1DIHNhdmUgYXJlYSBmb3IgY3R4c3cgKi8KKyNkZWZpbmUgUEZNX05VTV9QTURfUkVHUwk2NAkvKiBQTUQgc2F2ZSBhcmVhIGZvciBjdHhzdyAqLworCiAvKgogICogZGVwdGggb2YgbWVzc2FnZSBxdWV1ZQogICovCkBAIC0yOTcsMTQgKzMwMCwxNyBAQAogCXVuc2lnbmVkIGxvbmcJCWN0eF9yZWxvYWRfcG1jc1s0XTsJLyogYml0bWFzayBvZiBmb3JjZSByZWxvYWQgUE1DIG9uIGN0eHN3IGluICovCiAJdW5zaWduZWQgbG9uZwkJY3R4X3VzZWRfbW9uaXRvcnNbNF07CS8qIGJpdG1hc2sgb2YgbW9uaXRvciBQTUMgYmVpbmcgdXNlZCAqLwogCi0JdW5zaWduZWQgbG9uZwkJY3R4X3BtY3NbSUE2NF9OVU1fUE1DX1JFR1NdOwkvKiAgc2F2ZWQgY29waWVzIG9mIFBNQyB2YWx1ZXMgKi8KKwl1bnNpZ25lZCBsb25nCQljdHhfcG1jc1tQRk1fTlVNX1BNQ19SRUdTXTsJLyogIHNhdmVkIGNvcGllcyBvZiBQTUMgdmFsdWVzICovCiAKIAl1bnNpZ25lZCBpbnQJCWN0eF91c2VkX2licnNbMV07CQkvKiBiaXRtYXNrIG9mIHVzZWQgSUJSIChzcGVlZHVwIGN0eHN3IGluKSAqLwogCXVuc2lnbmVkIGludAkJY3R4X3VzZWRfZGJyc1sxXTsJCS8qIGJpdG1hc2sgb2YgdXNlZCBEQlIgKHNwZWVkdXAgY3R4c3cgaW4pICovCiAJdW5zaWduZWQgbG9uZwkJY3R4X2RicnNbSUE2NF9OVU1fREJHX1JFR1NdOwkvKiBEQlIgdmFsdWVzIChjYWNoZSkgd2hlbiBub3QgbG9hZGVkICovCiAJdW5zaWduZWQgbG9uZwkJY3R4X2licnNbSUE2NF9OVU1fREJHX1JFR1NdOwkvKiBJQlIgdmFsdWVzIChjYWNoZSkgd2hlbiBub3QgbG9hZGVkICovCiAKLQlwZm1fY291bnRlcl90CQljdHhfcG1kc1tJQTY0X05VTV9QTURfUkVHU107IC8qIHNvZnR3YXJlIHN0YXRlIGZvciBQTURTICovCisJcGZtX2NvdW50ZXJfdAkJY3R4X3BtZHNbUEZNX05VTV9QTURfUkVHU107IC8qIHNvZnR3YXJlIHN0YXRlIGZvciBQTURTICovCisKKwl1bnNpZ25lZCBsb25nCQl0aF9wbWNzW1BGTV9OVU1fUE1DX1JFR1NdOwkvKiBQTUMgdGhyZWFkIHNhdmUgc3RhdGUgKi8KKwl1bnNpZ25lZCBsb25nCQl0aF9wbWRzW1BGTV9OVU1fUE1EX1JFR1NdOwkvKiBQTUQgdGhyZWFkIHNhdmUgc3RhdGUgKi8KIAogCXU2NAkJCWN0eF9zYXZlZF9wc3JfdXA7CS8qIG9ubHkgY29udGFpbnMgcHNyLnVwIHZhbHVlICovCiAKQEAgLTg2OCw3ICs4NzQsNiBAQAogcGZtX21hc2tfbW9uaXRvcmluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJcGZtX2NvbnRleHRfdCAqY3R4ID0gUEZNX0dFVF9DVFgodGFzayk7Ci0Jc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRoID0gJnRhc2stPnRocmVhZDsKIAl1bnNpZ25lZCBsb25nIG1hc2ssIHZhbCwgb3ZmbF9tYXNrOwogCWludCBpOwogCkBAIC04ODksNyArODk0LDcgQEAKIAkgKiBTbyBpbiBib3RoIGNhc2VzLCB0aGUgbGl2ZSByZWdpc3RlciBjb250YWlucyB0aGUgb3duZXIncwogCSAqIHN0YXRlLiBXZSBjYW4gT05MWSB0b3VjaCB0aGUgUE1VIHJlZ2lzdGVycyBhbmQgTk9UIHRoZSBQU1IuCiAJICoKLQkgKiBBcyBhIGNvbnNlcXVlbmNlIHRvIHRoaXMgY2FsbCwgdGhlIHRocmVhZC0+cG1kc1tdIGFycmF5CisJICogQXMgYSBjb25zZXF1ZW5jZSB0byB0aGlzIGNhbGwsIHRoZSBjdHgtPnRoX3BtZHNbXSBhcnJheQogCSAqIGNvbnRhaW5zIHN0YWxlIGluZm9ybWF0aW9uIHdoaWNoIG11c3QgYmUgaWdub3JlZAogCSAqIHdoZW4gY29udGV4dCBpcyByZWxvYWRlZCBBTkQgbW9uaXRvcmluZyBpcyBhY3RpdmUgKHNlZQogCSAqIHBmbV9yZXN0YXJ0KS4KQEAgLTkyNCw5ICs5MjksOSBAQAogCW1hc2sgPSBjdHgtPmN0eF91c2VkX21vbml0b3JzWzBdID4+IFBNVV9GSVJTVF9DT1VOVEVSOwogCWZvcihpPSBQTVVfRklSU1RfQ09VTlRFUjsgbWFzazsgaSsrLCBtYXNrPj49MSkgewogCQlpZiAoKG1hc2sgJiAweDEpID09IDBVTCkgY29udGludWU7Ci0JCWlhNjRfc2V0X3BtYyhpLCB0aC0+cG1jc1tpXSAmIH4weGZVTCk7Ci0JCXRoLT5wbWNzW2ldICY9IH4weGZVTDsKLQkJRFBSSU5UX292ZmwoKCJwbWNbJWRdPTB4JWx4XG4iLCBpLCB0aC0+cG1jc1tpXSkpOworCQlpYTY0X3NldF9wbWMoaSwgY3R4LT50aF9wbWNzW2ldICYgfjB4ZlVMKTsKKwkJY3R4LT50aF9wbWNzW2ldICY9IH4weGZVTDsKKwkJRFBSSU5UX292ZmwoKCJwbWNbJWRdPTB4JWx4XG4iLCBpLCBjdHgtPnRoX3BtY3NbaV0pKTsKIAl9CiAJLyoKIAkgKiBtYWtlIGFsbCBvZiB0aGlzIHZpc2libGUKQEAgLTk0Myw3ICs5NDgsNiBAQAogcGZtX3Jlc3RvcmVfbW9uaXRvcmluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJcGZtX2NvbnRleHRfdCAqY3R4ID0gUEZNX0dFVF9DVFgodGFzayk7Ci0Jc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRoID0gJnRhc2stPnRocmVhZDsKIAl1bnNpZ25lZCBsb25nIG1hc2ssIG92ZmxfbWFzazsKIAl1bnNpZ25lZCBsb25nIHBzciwgdmFsOwogCWludCBpLCBpc19zeXN0ZW07CkBAIC0xMDA5LDkgKzEwMTMsOSBAQAogCW1hc2sgPSBjdHgtPmN0eF91c2VkX21vbml0b3JzWzBdID4+IFBNVV9GSVJTVF9DT1VOVEVSOwogCWZvcihpPSBQTVVfRklSU1RfQ09VTlRFUjsgbWFzazsgaSsrLCBtYXNrPj49MSkgewogCQlpZiAoKG1hc2sgJiAweDEpID09IDBVTCkgY29udGludWU7Ci0JCXRoLT5wbWNzW2ldID0gY3R4LT5jdHhfcG1jc1tpXTsKLQkJaWE2NF9zZXRfcG1jKGksIHRoLT5wbWNzW2ldKTsKLQkJRFBSSU5UKCgiWyVkXSBwbWNbJWRdPTB4JWx4XG4iLCB0YXNrLT5waWQsIGksIHRoLT5wbWNzW2ldKSk7CisJCWN0eC0+dGhfcG1jc1tpXSA9IGN0eC0+Y3R4X3BtY3NbaV07CisJCWlhNjRfc2V0X3BtYyhpLCBjdHgtPnRoX3BtY3NbaV0pOworCQlEUFJJTlQoKCJbJWRdIHBtY1slZF09MHglbHhcbiIsIHRhc2stPnBpZCwgaSwgY3R4LT50aF9wbWNzW2ldKSk7CiAJfQogCWlhNjRfc3Jsel9kKCk7CiAKQEAgLTEwNzAsNyArMTA3NCw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIHBmbV9jb3B5X3BtZHMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBwZm1fY29udGV4dF90ICpjdHgpCiB7Ci0Jc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCA9ICZ0YXNrLT50aHJlYWQ7CiAJdW5zaWduZWQgbG9uZyBvdmZsX3ZhbCA9IHBtdV9jb25mLT5vdmZsX3ZhbDsKIAl1bnNpZ25lZCBsb25nIG1hc2sgPSBjdHgtPmN0eF9hbGxfcG1kc1swXTsKIAl1bnNpZ25lZCBsb25nIHZhbDsKQEAgLTEwOTIsMTEgKzEwOTUsMTEgQEAKIAkJCWN0eC0+Y3R4X3BtZHNbaV0udmFsID0gdmFsICYgfm92ZmxfdmFsOwogCQkJIHZhbCAmPSBvdmZsX3ZhbDsKIAkJfQotCQl0aHJlYWQtPnBtZHNbaV0gPSB2YWw7CisJCWN0eC0+dGhfcG1kc1tpXSA9IHZhbDsKIAogCQlEUFJJTlQoKCJwbWRbJWRdPTB4JWx4IHNvZnRfdmFsPTB4JWx4XG4iLAogCQkJaSwKLQkJCXRocmVhZC0+cG1kc1tpXSwKKwkJCWN0eC0+dGhfcG1kc1tpXSwKIAkJCWN0eC0+Y3R4X3BtZHNbaV0udmFsKSk7CiAJfQogfQpAQCAtMTEwNyw3ICsxMTEwLDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogcGZtX2NvcHlfcG1jcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHBmbV9jb250ZXh0X3QgKmN0eCkKIHsKLQlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdGhyZWFkID0gJnRhc2stPnRocmVhZDsKIAl1bnNpZ25lZCBsb25nIG1hc2sgPSBjdHgtPmN0eF9hbGxfcG1jc1swXTsKIAlpbnQgaTsKIApAQCAtMTExNSw4ICsxMTE3LDggQEAKIAogCWZvciAoaT0wOyBtYXNrOyBpKyssIG1hc2s+Pj0xKSB7CiAJCS8qIG1hc2tpbmcgMCB3aXRoIG92ZmxfdmFsIHlpZWxkcyAwICovCi0JCXRocmVhZC0+cG1jc1tpXSA9IGN0eC0+Y3R4X3BtY3NbaV07Ci0JCURQUklOVCgoInBtY1slZF09MHglbHhcbiIsIGksIHRocmVhZC0+cG1jc1tpXSkpOworCQljdHgtPnRoX3BtY3NbaV0gPSBjdHgtPmN0eF9wbWNzW2ldOworCQlEUFJJTlQoKCJwbWNbJWRdPTB4JWx4XG4iLCBpLCBjdHgtPnRoX3BtY3NbaV0pKTsKIAl9CiB9CiAKQEAgLTI4NjAsNyArMjg2Miw2IEBACiBzdGF0aWMgaW50CiBwZm1fd3JpdGVfcG1jcyhwZm1fY29udGV4dF90ICpjdHgsIHZvaWQgKmFyZywgaW50IGNvdW50LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdGhyZWFkID0gTlVMTDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAJcGZhcmdfcmVnX3QgKnJlcSA9IChwZmFyZ19yZWdfdCAqKWFyZzsKIAl1bnNpZ25lZCBsb25nIHZhbHVlLCBwbWNfcG07CkBAIC0yODgxLDcgKzI4ODIsNiBAQAogCWlmIChzdGF0ZSA9PSBQRk1fQ1RYX1pPTUJJRSkgcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoaXNfbG9hZGVkKSB7Ci0JCXRocmVhZCA9ICZ0YXNrLT50aHJlYWQ7CiAJCS8qCiAJCSAqIEluIHN5c3RlbSB3aWRlIGFuZCB3aGVuIHRoZSBjb250ZXh0IGlzIGxvYWRlZCwgYWNjZXNzIGNhbiBvbmx5IGhhcHBlbgogCQkgKiB3aGVuIHRoZSBjYWxsZXIgaXMgcnVubmluZyBvbiB0aGUgQ1BVIGJlaW5nIG1vbml0b3JlZCBieSB0aGUgc2Vzc2lvbi4KQEAgLTMwMzYsNyArMzAzNiw3IEBACiAJCSAqCiAJCSAqIFRoZSB2YWx1ZSBpbiBjdHhfcG1jc1tdIGNhbiBvbmx5IGJlIGNoYW5nZWQgaW4gcGZtX3dyaXRlX3BtY3MoKS4KIAkJICoKLQkJICogVGhlIHZhbHVlIGluIHRocmVhZC0+cG1jc1tdIG1heSBiZSBtb2RpZmllZCBvbiBvdmVyZmxvdywgaS5lLiwgIHdoZW4KKwkJICogVGhlIHZhbHVlIGluIHRoX3BtY3NbXSBtYXkgYmUgbW9kaWZpZWQgb24gb3ZlcmZsb3csIGkuZS4sICB3aGVuCiAJCSAqIG1vbml0b3JpbmcgbmVlZHMgdG8gYmUgc3RvcHBlZC4KIAkJICovCiAJCWlmIChpc19tb25pdG9yKSBDVFhfVVNFRF9NT05JVE9SKGN0eCwgMVVMIDw8IGNudW0pOwpAQCAtMzA1MCw3ICszMDUwLDcgQEAKIAkJCS8qCiAJCQkgKiB3cml0ZSB0aHJlYWQgc3RhdGUKIAkJCSAqLwotCQkJaWYgKGlzX3N5c3RlbSA9PSAwKSB0aHJlYWQtPnBtY3NbY251bV0gPSB2YWx1ZTsKKwkJCWlmIChpc19zeXN0ZW0gPT0gMCkgY3R4LT50aF9wbWNzW2NudW1dID0gdmFsdWU7CiAKIAkJCS8qCiAJCQkgKiB3cml0ZSBoYXJkd2FyZSByZWdpc3RlciBpZiB3ZSBjYW4KQEAgLTMxMDIsNyArMzEwMiw2IEBACiBzdGF0aWMgaW50CiBwZm1fd3JpdGVfcG1kcyhwZm1fY29udGV4dF90ICpjdHgsIHZvaWQgKmFyZywgaW50IGNvdW50LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdGhyZWFkID0gTlVMTDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CiAJcGZhcmdfcmVnX3QgKnJlcSA9IChwZmFyZ19yZWdfdCAqKWFyZzsKIAl1bnNpZ25lZCBsb25nIHZhbHVlLCBod192YWx1ZSwgb3ZmbF9tYXNrOwpAQCAtMzEyNiw3ICszMTI1LDYgQEAKIAkgKiB0aGUgb3duZXIgb2YgdGhlIGxvY2FsIFBNVS4KIAkgKi8KIAlpZiAobGlrZWx5KGlzX2xvYWRlZCkpIHsKLQkJdGhyZWFkID0gJnRhc2stPnRocmVhZDsKIAkJLyoKIAkJICogSW4gc3lzdGVtIHdpZGUgYW5kIHdoZW4gdGhlIGNvbnRleHQgaXMgbG9hZGVkLCBhY2Nlc3MgY2FuIG9ubHkgaGFwcGVuCiAJCSAqIHdoZW4gdGhlIGNhbGxlciBpcyBydW5uaW5nIG9uIHRoZSBDUFUgYmVpbmcgbW9uaXRvcmVkIGJ5IHRoZSBzZXNzaW9uLgpAQCAtMzIzNCw3ICszMjMyLDcgQEAKIAkJCS8qCiAJCSAJICogd3JpdGUgdGhyZWFkIHN0YXRlCiAJCSAJICovCi0JCQlpZiAoaXNfc3lzdGVtID09IDApIHRocmVhZC0+cG1kc1tjbnVtXSA9IGh3X3ZhbHVlOworCQkJaWYgKGlzX3N5c3RlbSA9PSAwKSBjdHgtPnRoX3BtZHNbY251bV0gPSBod192YWx1ZTsKIAogCQkJLyoKIAkJCSAqIHdyaXRlIGhhcmR3YXJlIHJlZ2lzdGVyIGlmIHdlIGNhbgpAQCAtMzMwMCw3ICszMjk4LDYgQEAKIHN0YXRpYyBpbnQKIHBmbV9yZWFkX3BtZHMocGZtX2NvbnRleHRfdCAqY3R4LCB2b2lkICphcmcsIGludCBjb3VudCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCA9IE5VTEw7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwogCXVuc2lnbmVkIGxvbmcgdmFsID0gMFVMLCBsdmFsLCBvdmZsX21hc2ssIHN2YWw7CiAJcGZhcmdfcmVnX3QgKnJlcSA9IChwZmFyZ19yZWdfdCAqKWFyZzsKQEAgLTMzMjQsNyArMzMyMSw2IEBACiAJaWYgKHN0YXRlID09IFBGTV9DVFhfWk9NQklFKSByZXR1cm4gLUVJTlZBTDsKIAogCWlmIChsaWtlbHkoaXNfbG9hZGVkKSkgewotCQl0aHJlYWQgPSAmdGFzay0+dGhyZWFkOwogCQkvKgogCQkgKiBJbiBzeXN0ZW0gd2lkZSBhbmQgd2hlbiB0aGUgY29udGV4dCBpcyBsb2FkZWQsIGFjY2VzcyBjYW4gb25seSBoYXBwZW4KIAkJICogd2hlbiB0aGUgY2FsbGVyIGlzIHJ1bm5pbmcgb24gdGhlIENQVSBiZWluZyBtb25pdG9yZWQgYnkgdGhlIHNlc3Npb24uCkBAIC0zMzg2LDcgKzMzODIsNyBAQAogCQkJICogaWYgY29udGV4dCBpcyB6b21iaWUsIHRoZW4gdGFzayBkb2VzIG5vdCBleGlzdCBhbnltb3JlLgogCQkJICogSW4gdGhpcyBjYXNlLCB3ZSB1c2UgdGhlIGZ1bGwgdmFsdWUgc2F2ZWQgaW4gdGhlIGNvbnRleHQgKHBmbV9mbHVzaF9yZWdzKCkpLgogCQkJICovCi0JCQl2YWwgPSBpc19sb2FkZWQgPyB0aHJlYWQtPnBtZHNbY251bV0gOiAwVUw7CisJCQl2YWwgPSBpc19sb2FkZWQgPyBjdHgtPnRoX3BtZHNbY251bV0gOiAwVUw7CiAJCX0KIAkJcmRfZnVuYyA9IHBtdV9jb25mLT5wbWRfZGVzY1tjbnVtXS5yZWFkX2NoZWNrOwogCkBAIC00MzU1LDggKzQzNTEsOCBAQAogCXBmbV9jb3B5X3BtZHModGFzaywgY3R4KTsKIAlwZm1fY29weV9wbWNzKHRhc2ssIGN0eCk7CiAKLQlwbWNzX3NvdXJjZSA9IHRocmVhZC0+cG1jczsKLQlwbWRzX3NvdXJjZSA9IHRocmVhZC0+cG1kczsKKwlwbWNzX3NvdXJjZSA9IGN0eC0+dGhfcG1jczsKKwlwbWRzX3NvdXJjZSA9IGN0eC0+dGhfcG1kczsKIAogCS8qCiAJICogYWx3YXlzIHRoZSBjYXNlIGZvciBzeXN0ZW0td2lkZQpAQCAtNTg2NSwxNCArNTg2MSwxMiBAQAogcGZtX3NhdmVfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7CiAJcGZtX2NvbnRleHRfdCAqY3R4OwotCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTY0IHBzcjsKIAogCiAJY3R4ID0gUEZNX0dFVF9DVFgodGFzayk7CiAJaWYgKGN0eCA9PSBOVUxMKSByZXR1cm47Ci0JdCA9ICZ0YXNrLT50aHJlYWQ7CiAKIAkvKgogIAkgKiB3ZSBhbHdheXMgY29tZSBoZXJlIHdpdGggaW50ZXJydXB0cyBBTFJFQURZIGRpc2FibGVkIGJ5CkBAIC01OTMwLDE5ICs1OTI0LDE5IEBACiAJICogZ3VhcmFudGVlIHdlIHdpbGwgYmUgc2NoZWR1bGUgYXQgdGhhdCBzYW1lCiAJICogQ1BVIGFnYWluLgogCSAqLwotCXBmbV9zYXZlX3BtZHModC0+cG1kcywgY3R4LT5jdHhfdXNlZF9wbWRzWzBdKTsKKwlwZm1fc2F2ZV9wbWRzKGN0eC0+dGhfcG1kcywgY3R4LT5jdHhfdXNlZF9wbWRzWzBdKTsKIAogCS8qCiAJICogc2F2ZSBwbWMwIGlhNjRfc3Jsel9kKCkgZG9uZSBpbiBwZm1fc2F2ZV9wbWRzKCkKIAkgKiB3ZSB3aWxsIG5lZWQgaXQgb24gdGhlIHJlc3RvcmUgcGF0aCB0byBjaGVjawogCSAqIGZvciBwZW5kaW5nIG92ZXJmbG93LgogCSAqLwotCXQtPnBtY3NbMF0gPSBpYTY0X2dldF9wbWMoMCk7CisJY3R4LT50aF9wbWNzWzBdID0gaWE2NF9nZXRfcG1jKDApOwogCiAJLyoKIAkgKiB1bmZyZWV6ZSBQTVUgaWYgaGFkIHBlbmRpbmcgb3ZlcmZsb3dzCiAJICovCi0JaWYgKHQtPnBtY3NbMF0gJiB+MHgxVUwpIHBmbV91bmZyZWV6ZV9wbXUoKTsKKwlpZiAoY3R4LT50aF9wbWNzWzBdICYgfjB4MVVMKSBwZm1fdW5mcmVlemVfcG11KCk7CiAKIAkvKgogCSAqIGZpbmFsbHksIGFsbG93IGNvbnRleHQgYWNjZXNzLgpAQCAtNTk4Nyw3ICs1OTgxLDYgQEAKIHBmbV9sYXp5X3NhdmVfcmVncyAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCXBmbV9jb250ZXh0X3QgKmN0eDsKLQlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJeyB1NjQgcHNyICA9IHBmbV9nZXRfcHNyKCk7CkBAIC01OTk1LDcgKzU5ODgsNiBAQAogCX0KIAogCWN0eCA9IFBGTV9HRVRfQ1RYKHRhc2spOwotCXQgICA9ICZ0YXNrLT50aHJlYWQ7CiAKIAkvKgogCSAqIHdlIG5lZWQgdG8gbWFzayBQTVUgb3ZlcmZsb3cgaGVyZSB0bwpAQCAtNjAyMCwxOSArNjAxMiwxOSBAQAogCS8qCiAJICogc2F2ZSBhbGwgdGhlIHBtZHMgd2UgdXNlCiAJICovCi0JcGZtX3NhdmVfcG1kcyh0LT5wbWRzLCBjdHgtPmN0eF91c2VkX3BtZHNbMF0pOworCXBmbV9zYXZlX3BtZHMoY3R4LT50aF9wbWRzLCBjdHgtPmN0eF91c2VkX3BtZHNbMF0pOwogCiAJLyoKIAkgKiBzYXZlIHBtYzAgaWE2NF9zcmx6X2QoKSBkb25lIGluIHBmbV9zYXZlX3BtZHMoKQogCSAqIGl0IGlzIG5lZWRlZCB0byBjaGVjayBmb3IgcGVuZGVkIG92ZXJmbG93CiAJICogb24gdGhlIHJlc3RvcmUgcGF0aAogCSAqLwotCXQtPnBtY3NbMF0gPSBpYTY0X2dldF9wbWMoMCk7CisJY3R4LT50aF9wbWNzWzBdID0gaWE2NF9nZXRfcG1jKDApOwogCiAJLyoKIAkgKiB1bmZyZWV6ZSBQTVUgaWYgaGFkIHBlbmRpbmcgb3ZlcmZsb3dzCiAJICovCi0JaWYgKHQtPnBtY3NbMF0gJiB+MHgxVUwpIHBmbV91bmZyZWV6ZV9wbXUoKTsKKwlpZiAoY3R4LT50aF9wbWNzWzBdICYgfjB4MVVMKSBwZm1fdW5mcmVlemVfcG11KCk7CiAKIAkvKgogCSAqIG5vdyBnZXQgY2FuIHVubWFzayBQTVUgaW50ZXJydXB0cywgdGhleSB3aWxsCkBAIC02MDUxLDcgKzYwNDMsNiBAQAogcGZtX2xvYWRfcmVncyAoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCXBmbV9jb250ZXh0X3QgKmN0eDsKLQlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdDsKIAl1bnNpZ25lZCBsb25nIHBtY19tYXNrID0gMFVMLCBwbWRfbWFzayA9IDBVTDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXU2NCBwc3IsIHBzcl91cDsKQEAgLTYwNjIsMTEgKzYwNTMsMTAgQEAKIAogCUJVR19PTihHRVRfUE1VX09XTkVSKCkpOwogCi0JdCAgICAgPSAmdGFzay0+dGhyZWFkOwogCS8qCiAJICogcG9zc2libGUgb24gdW5sb2FkCiAJICovCi0JaWYgKHVubGlrZWx5KCh0LT5mbGFncyAmIElBNjRfVEhSRUFEX1BNX1ZBTElEKSA9PSAwKSkgcmV0dXJuOworCWlmICh1bmxpa2VseSgodGFzay0+dGhyZWFkLmZsYWdzICYgSUE2NF9USFJFQURfUE1fVkFMSUQpID09IDApKSByZXR1cm47CiAKIAkvKgogIAkgKiB3ZSBhbHdheXMgY29tZSBoZXJlIHdpdGggaW50ZXJydXB0cyBBTFJFQURZIGRpc2FibGVkIGJ5CkBAIC02MTQ4LDIxICs2MTM4LDIxIEBACiAJICoKIAkgKiBYWFg6IG9wdGltaXplIGhlcmUKIAkgKi8KLQlpZiAocG1kX21hc2spIHBmbV9yZXN0b3JlX3BtZHModC0+cG1kcywgcG1kX21hc2spOwotCWlmIChwbWNfbWFzaykgcGZtX3Jlc3RvcmVfcG1jcyh0LT5wbWNzLCBwbWNfbWFzayk7CisJaWYgKHBtZF9tYXNrKSBwZm1fcmVzdG9yZV9wbWRzKGN0eC0+dGhfcG1kcywgcG1kX21hc2spOworCWlmIChwbWNfbWFzaykgcGZtX3Jlc3RvcmVfcG1jcyhjdHgtPnRoX3BtY3MsIHBtY19tYXNrKTsKIAogCS8qCiAJICogY2hlY2sgZm9yIHBlbmRpbmcgb3ZlcmZsb3cgYXQgdGhlIHRpbWUgdGhlIHN0YXRlCiAJICogd2FzIHNhdmVkLgogCSAqLwotCWlmICh1bmxpa2VseShQTUMwX0hBU19PVkZMKHQtPnBtY3NbMF0pKSkgeworCWlmICh1bmxpa2VseShQTUMwX0hBU19PVkZMKGN0eC0+dGhfcG1jc1swXSkpKSB7CiAJCS8qCiAJCSAqIHJlbG9hZCBwbWMwIHdpdGggdGhlIG92ZXJmbG93IGluZm9ybWF0aW9uCiAJCSAqIE9uIE1jS2lubGV5IFBNVSwgdGhpcyB3aWxsIHRyaWdnZXIgYSBQTVUgaW50ZXJydXB0CiAJCSAqLwotCQlpYTY0X3NldF9wbWMoMCwgdC0+cG1jc1swXSk7CisJCWlhNjRfc2V0X3BtYygwLCBjdHgtPnRoX3BtY3NbMF0pOwogCQlpYTY0X3NybHpfZCgpOwotCQl0LT5wbWNzWzBdID0gMFVMOworCQljdHgtPnRoX3BtY3NbMF0gPSAwVUw7CiAKIAkJLyoKIAkJICogd2lsbCByZXBsYXkgdGhlIFBNVSBpbnRlcnJ1cHQKQEAgLTYyMTUsNyArNjIwNSw2IEBACiB2b2lkCiBwZm1fbG9hZF9yZWdzIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0Jc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnQ7CiAJcGZtX2NvbnRleHRfdCAqY3R4OwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqb3duZXI7CiAJdW5zaWduZWQgbG9uZyBwbWRfbWFzaywgcG1jX21hc2s7CkBAIC02MjI0LDcgKzYyMTMsNiBAQAogCiAJb3duZXIgPSBHRVRfUE1VX09XTkVSKCk7CiAJY3R4ICAgPSBQRk1fR0VUX0NUWCh0YXNrKTsKLQl0ICAgICA9ICZ0YXNrLT50aHJlYWQ7CiAJcHNyICAgPSBwZm1fZ2V0X3BzcigpOwogCiAJQlVHX09OKHBzciAmIChJQTY0X1BTUl9VUHxJQTY0X1BTUl9QUCkpOwpAQCAtNjI4NywyMiArNjI3NSwyMiBAQAogCSAqLwogCXBtY19tYXNrID0gY3R4LT5jdHhfYWxsX3BtY3NbMF07CiAKLQlwZm1fcmVzdG9yZV9wbWRzKHQtPnBtZHMsIHBtZF9tYXNrKTsKLQlwZm1fcmVzdG9yZV9wbWNzKHQtPnBtY3MsIHBtY19tYXNrKTsKKwlwZm1fcmVzdG9yZV9wbWRzKGN0eC0+dGhfcG1kcywgcG1kX21hc2spOworCXBmbV9yZXN0b3JlX3BtY3MoY3R4LT50aF9wbWNzLCBwbWNfbWFzayk7CiAKIAkvKgogCSAqIGNoZWNrIGZvciBwZW5kaW5nIG92ZXJmbG93IGF0IHRoZSB0aW1lIHRoZSBzdGF0ZQogCSAqIHdhcyBzYXZlZC4KIAkgKi8KLQlpZiAodW5saWtlbHkoUE1DMF9IQVNfT1ZGTCh0LT5wbWNzWzBdKSkpIHsKKwlpZiAodW5saWtlbHkoUE1DMF9IQVNfT1ZGTChjdHgtPnRoX3BtY3NbMF0pKSkgewogCQkvKgogCQkgKiByZWxvYWQgcG1jMCB3aXRoIHRoZSBvdmVyZmxvdyBpbmZvcm1hdGlvbgogCQkgKiBPbiBNY0tpbmxleSBQTVUsIHRoaXMgd2lsbCB0cmlnZ2VyIGEgUE1VIGludGVycnVwdAogCQkgKi8KLQkJaWE2NF9zZXRfcG1jKDAsIHQtPnBtY3NbMF0pOworCQlpYTY0X3NldF9wbWMoMCwgY3R4LT50aF9wbWNzWzBdKTsKIAkJaWE2NF9zcmx6X2QoKTsKIAotCQl0LT5wbWNzWzBdID0gMFVMOworCQljdHgtPnRoX3BtY3NbMF0gPSAwVUw7CiAKIAkJLyoKIAkJICogd2lsbCByZXBsYXkgdGhlIFBNVSBpbnRlcnJ1cHQKQEAgLTYzNzcsMTEgKzYzNjUsMTEgQEAKIAkJICovCiAJCXBmbV91bmZyZWV6ZV9wbXUoKTsKIAl9IGVsc2UgewotCQlwbWMwID0gdGFzay0+dGhyZWFkLnBtY3NbMF07CisJCXBtYzAgPSBjdHgtPnRoX3BtY3NbMF07CiAJCS8qCiAJCSAqIGNsZWFyIHdoYXRldmVyIG92ZXJmbG93IHN0YXR1cyBiaXRzIHRoZXJlIHdlcmUKIAkJICovCi0JCXRhc2stPnRocmVhZC5wbWNzWzBdID0gMDsKKwkJY3R4LT50aF9wbWNzWzBdID0gMDsKIAl9CiAJb3ZmbF92YWwgPSBwbXVfY29uZi0+b3ZmbF92YWw7CiAJLyoKQEAgLTY0MDIsNyArNjM5MCw3IEBACiAJCS8qCiAJCSAqIGNhbiBhY2Nlc3MgUE1VIGFsd2F5cyB0cnVlIGluIHN5c3RlbSB3aWRlIG1vZGUKIAkJICovCi0JCXZhbCA9IHBtZF92YWwgPSBjYW5fYWNjZXNzX3BtdSA/IGlhNjRfZ2V0X3BtZChpKSA6IHRhc2stPnRocmVhZC5wbWRzW2ldOworCQl2YWwgPSBwbWRfdmFsID0gY2FuX2FjY2Vzc19wbXUgPyBpYTY0X2dldF9wbWQoaSkgOiBjdHgtPnRoX3BtZHNbaV07CiAKIAkJaWYgKFBNRF9JU19DT1VOVElORyhpKSkgewogCQkJRFBSSU5UKCgiWyVkXSBwbWRbJWRdIGN0eF9wbWQ9MHglbHggaHdfcG1kPTB4JWx4XG4iLApAQCAtNjQzNCw3ICs2NDIyLDcgQEAKIAogCQlEUFJJTlQoKCJbJWRdIGN0eF9wbWRbJWRdPTB4JWx4ICBwbWRfdmFsPTB4JWx4XG4iLCB0YXNrLT5waWQsIGksIHZhbCwgcG1kX3ZhbCkpOwogCi0JCWlmIChpc19zZWxmKSB0YXNrLT50aHJlYWQucG1kc1tpXSA9IHBtZF92YWw7CisJCWlmIChpc19zZWxmKSBjdHgtPnRoX3BtZHNbaV0gPSBwbWRfdmFsOwogCiAJCWN0eC0+Y3R4X3BtZHNbaV0udmFsID0gdmFsOwogCX0KQEAgLTY2NzgsNyArNjY2Niw3IEBACiAJICAgICAgIGZmeihwbXVfY29uZi0+b3ZmbF92YWwpKTsKIAogCS8qIHNhbml0eSBjaGVjayAqLwotCWlmIChwbXVfY29uZi0+bnVtX3BtZHMgPj0gSUE2NF9OVU1fUE1EX1JFR1MgfHwgcG11X2NvbmYtPm51bV9wbWNzID49IElBNjRfTlVNX1BNQ19SRUdTKSB7CisJaWYgKHBtdV9jb25mLT5udW1fcG1kcyA+PSBQRk1fTlVNX1BNRF9SRUdTIHx8IHBtdV9jb25mLT5udW1fcG1jcyA+PSBQRk1fTlVNX1BNQ19SRUdTKSB7CiAJCXByaW50ayhLRVJOX0VSUiAicGVyZm1vbjogbm90IGVub3VnaCBwbWMvcG1kLCBwZXJmbW9uIGRpc2FibGVkXG4iKTsKIAkJcG11X2NvbmYgPSBOVUxMOwogCQlyZXR1cm4gLTE7CkBAIC02NzUzLDcgKzY3NDEsNiBAQAogZHVtcF9wbXVfc3RhdGUoY29uc3QgY2hhciAqZnJvbSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7Ci0Jc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnQ7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CiAJcGZtX2NvbnRleHRfdCAqY3R4OwogCXVuc2lnbmVkIGxvbmcgcHNyLCBkY3IsIGluZm8sIGZsYWdzOwpAQCAtNjc5OCwxNiArNjc4NSwxNCBAQAogCWlhNjRfcHNyKHJlZ3MpLT51cCA9IDA7CiAJaWE2NF9wc3IocmVncyktPnBwID0gMDsKIAotCXQgPSAmY3VycmVudC0+dGhyZWFkOwotCiAJZm9yIChpPTE7IFBNQ19JU19MQVNUKGkpID09IDA7IGkrKykgewogCQlpZiAoUE1DX0lTX0lNUEwoaSkgPT0gMCkgY29udGludWU7Ci0JCXByaW50aygiLT5DUFUlZCBwbWNbJWRdPTB4JWx4IHRocmVhZF9wbWNbJWRdPTB4JWx4XG4iLCB0aGlzX2NwdSwgaSwgaWE2NF9nZXRfcG1jKGkpLCBpLCB0LT5wbWNzW2ldKTsKKwkJcHJpbnRrKCItPkNQVSVkIHBtY1slZF09MHglbHggdGhyZWFkX3BtY1slZF09MHglbHhcbiIsIHRoaXNfY3B1LCBpLCBpYTY0X2dldF9wbWMoaSksIGksIGN0eC0+dGhfcG1jc1tpXSk7CiAJfQogCiAJZm9yIChpPTE7IFBNRF9JU19MQVNUKGkpID09IDA7IGkrKykgewogCQlpZiAoUE1EX0lTX0lNUEwoaSkgPT0gMCkgY29udGludWU7Ci0JCXByaW50aygiLT5DUFUlZCBwbWRbJWRdPTB4JWx4IHRocmVhZF9wbWRbJWRdPTB4JWx4XG4iLCB0aGlzX2NwdSwgaSwgaWE2NF9nZXRfcG1kKGkpLCBpLCB0LT5wbWRzW2ldKTsKKwkJcHJpbnRrKCItPkNQVSVkIHBtZFslZF09MHglbHggdGhyZWFkX3BtZFslZF09MHglbHhcbiIsIHRoaXNfY3B1LCBpLCBpYTY0X2dldF9wbWQoaSksIGksIGN0eC0+dGhfcG1kc1tpXSk7CiAJfQogCiAJaWYgKGN0eCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9zYWxpbmZvLmMgYi9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYwppbmRleCA5MDY1ZjBmLi5lNjNiOGNhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYworKysgYi9hcmNoL2lhNjQva2VybmVsL3NhbGluZm8uYwpAQCAtMjY2LDYgKzI2Niw3IEBACiAvKiBDaGVjayBmb3Igb3V0c3RhbmRpbmcgTUNBL0lOSVQgcmVjb3JkcyBldmVyeSBtaW51dGUgKGFyYml0cmFyeSkgKi8KICNkZWZpbmUgU0FMSU5GT19USU1FUl9ERUxBWSAoNjAqSFopCiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc2FsaW5mb190aW1lcjsKK2V4dGVybiB2b2lkIGlhNjRfbWxvZ2J1Zl9kdW1wKHZvaWQpOwogCiBzdGF0aWMgdm9pZAogc2FsaW5mb190aW1lb3V0X2NoZWNrKHN0cnVjdCBzYWxpbmZvX2RhdGEgKmRhdGEpCkBAIC0yODMsNiArMjg0LDcgQEAKIHN0YXRpYyB2b2lkCiBzYWxpbmZvX3RpbWVvdXQgKHVuc2lnbmVkIGxvbmcgYXJnKQogeworCWlhNjRfbWxvZ2J1Zl9kdW1wKCk7CiAJc2FsaW5mb190aW1lb3V0X2NoZWNrKHNhbGluZm9fZGF0YSArIFNBTF9JTkZPX1RZUEVfTUNBKTsKIAlzYWxpbmZvX3RpbWVvdXRfY2hlY2soc2FsaW5mb19kYXRhICsgU0FMX0lORk9fVFlQRV9JTklUKTsKIAlzYWxpbmZvX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgU0FMSU5GT19USU1FUl9ERUxBWTsKQEAgLTMzMiw2ICszMzQsOCBAQAogCWlmIChjcHUgPT0gLTEpCiAJCWdvdG8gcmV0cnk7CiAKKwlpYTY0X21sb2didWZfZHVtcCgpOworCiAJLyogZm9yIG5leHQgcmVhZCwgc3RhcnQgY2hlY2tpbmcgYXQgbmV4dCBDUFUgKi8KIAlkYXRhLT5jcHVfY2hlY2sgPSBjcHU7CiAJaWYgKCsrZGF0YS0+Y3B1X2NoZWNrID09IE5SX0NQVVMpCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKaW5kZXggN2FkMGQ5Yy4uODRmOTNjMCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYwpAQCAtNTA5LDcgKzUwOSw3IEBACiAJCXsgMVVMIDw8IDEsICJzcG9udGFuZW91cyBkZWZlcnJhbCJ9LAogCQl7IDFVTCA8PCAyLCAiMTYtYnl0ZSBhdG9taWMgb3BzIiB9CiAJfTsKLQljaGFyIGZhbWlseVszMl0sIGZlYXR1cmVzWzEyOF0sICpjcCwgc2VwOworCWNoYXIgZmVhdHVyZXNbMTI4XSwgKmNwLCBzZXA7CiAJc3RydWN0IGNwdWluZm9faWE2NCAqYyA9IHY7CiAJdW5zaWduZWQgbG9uZyBtYXNrOwogCXVuc2lnbmVkIGxvbmcgcHJvY19mcmVxOwpAQCAtNTE3LDEyICs1MTcsNiBAQAogCiAJbWFzayA9IGMtPmZlYXR1cmVzOwogCi0Jc3dpdGNoIChjLT5mYW1pbHkpIHsKLQkgICAgICBjYXNlIDB4MDc6CW1lbWNweShmYW1pbHksICJJdGFuaXVtIiwgOCk7IGJyZWFrOwotCSAgICAgIGNhc2UgMHgxZjoJbWVtY3B5KGZhbWlseSwgIkl0YW5pdW0gMiIsIDEwKTsgYnJlYWs7Ci0JICAgICAgZGVmYXVsdDoJCXNwcmludGYoZmFtaWx5LCAiJXUiLCBjLT5mYW1pbHkpOyBicmVhazsKLQl9Ci0KIAkvKiBidWlsZCB0aGUgZmVhdHVyZSBzdHJpbmc6ICovCiAJbWVtY3B5KGZlYXR1cmVzLCAiIHN0YW5kYXJkIiwgMTApOwogCWNwID0gZmVhdHVyZXM7CkBAIC01NTMsOCArNTQ3LDkgQEAKIAkJICAgInByb2Nlc3NvciAgOiAlZFxuIgogCQkgICAidmVuZG9yICAgICA6ICVzXG4iCiAJCSAgICJhcmNoICAgICAgIDogSUEtNjRcbiIKLQkJICAgImZhbWlseSAgICAgOiAlc1xuIgorCQkgICAiZmFtaWx5ICAgICA6ICV1XG4iCiAJCSAgICJtb2RlbCAgICAgIDogJXVcbiIKKwkJICAgIm1vZGVsIG5hbWUgOiAlc1xuIgogCQkgICAicmV2aXNpb24gICA6ICV1XG4iCiAJCSAgICJhcmNocmV2ICAgIDogJXVcbiIKIAkJICAgImZlYXR1cmVzICAgOiVzXG4iCS8qIGRvbid0IGNoYW5nZSB0aGlzLS0taXQgX2lzXyByaWdodCEgKi8KQEAgLTU2Myw3ICs1NTgsOCBAQAogCQkgICAiY3B1IE1IeiAgICA6ICVsdS4lMDZsdVxuIgogCQkgICAiaXRjIE1IeiAgICA6ICVsdS4lMDZsdVxuIgogCQkgICAiQm9nb01JUFMgICA6ICVsdS4lMDJsdVxuIiwKLQkJICAgY3B1bnVtLCBjLT52ZW5kb3IsIGZhbWlseSwgYy0+bW9kZWwsIGMtPnJldmlzaW9uLCBjLT5hcmNocmV2LAorCQkgICBjcHVudW0sIGMtPnZlbmRvciwgYy0+ZmFtaWx5LCBjLT5tb2RlbCwKKwkJICAgYy0+bW9kZWxfbmFtZSwgYy0+cmV2aXNpb24sIGMtPmFyY2hyZXYsCiAJCSAgIGZlYXR1cmVzLCBjLT5wcG4sIGMtPm51bWJlciwKIAkJICAgcHJvY19mcmVxIC8gMTAwMCwgcHJvY19mcmVxICUgMTAwMCwKIAkJICAgYy0+aXRjX2ZyZXEgLyAxMDAwMDAwLCBjLT5pdGNfZnJlcSAlIDEwMDAwMDAsCkBAIC02MTEsNiArNjA3LDMxIEBACiAJLnNob3cgPQkJc2hvd19jcHVpbmZvCiB9OwogCitzdGF0aWMgY2hhciBicmFuZG5hbWVbMTI4XTsKKworc3RhdGljIGNoYXIgKiBfX2NwdWluaXQKK2dldF9tb2RlbF9uYW1lKF9fdTggZmFtaWx5LCBfX3U4IG1vZGVsKQoreworCWNoYXIgYnJhbmRbMTI4XTsKKworCWlmIChpYTY0X3BhbF9nZXRfYnJhbmRfaW5mbyhicmFuZCkpIHsKKwkJaWYgKGZhbWlseSA9PSAweDcpCisJCQltZW1jcHkoYnJhbmQsICJNZXJjZWQiLCA3KTsKKwkJZWxzZSBpZiAoZmFtaWx5ID09IDB4MWYpIHN3aXRjaCAobW9kZWwpIHsKKwkJCWNhc2UgMDogbWVtY3B5KGJyYW5kLCAiTWNLaW5sZXkiLCA5KTsgYnJlYWs7CisJCQljYXNlIDE6IG1lbWNweShicmFuZCwgIk1hZGlzb24iLCA4KTsgYnJlYWs7CisJCQljYXNlIDI6IG1lbWNweShicmFuZCwgIk1hZGlzb24gdXAgdG8gOU0gY2FjaGUiLCAyMyk7IGJyZWFrOworCQl9IGVsc2UKKwkJCW1lbWNweShicmFuZCwgIlVua25vd24iLCA4KTsKKwl9CisJaWYgKGJyYW5kbmFtZVswXSA9PSAnXDAnKQorCQlyZXR1cm4gc3RyY3B5KGJyYW5kbmFtZSwgYnJhbmQpOworCWVsc2UgaWYgKHN0cmNtcChicmFuZG5hbWUsIGJyYW5kKSA9PSAwKQorCQlyZXR1cm4gYnJhbmRuYW1lOworCWVsc2UKKwkJcmV0dXJuIGtzdHJkdXAoYnJhbmQsIEdGUF9LRVJORUwpOworfQorCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQKIGlkZW50aWZ5X2NwdSAoc3RydWN0IGNwdWluZm9faWE2NCAqYykKIHsKQEAgLTY0MCw3ICs2NjEsNiBAQAogCXBhbF9zdGF0dXNfdCBzdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBpbXBsX3ZhX21zYiA9IDUwLCBwaHlzX2FkZHJfc2l6ZSA9IDQ0OwkvKiBJdGFuaXVtIGRlZmF1bHRzICovCiAJaW50IGk7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgNTsgKytpKQogCQljcHVpZC5iaXRzW2ldID0gaWE2NF9nZXRfY3B1aWQoaSk7CiAKQEAgLTY2Myw2ICs2ODMsNyBAQAogCWMtPmZhbWlseSA9IGNwdWlkLmZpZWxkLmZhbWlseTsKIAljLT5hcmNocmV2ID0gY3B1aWQuZmllbGQuYXJjaHJldjsKIAljLT5mZWF0dXJlcyA9IGNwdWlkLmZpZWxkLmZlYXR1cmVzOworCWMtPm1vZGVsX25hbWUgPSBnZXRfbW9kZWxfbmFtZShjLT5mYW1pbHksIGMtPm1vZGVsKTsKIAogCXN0YXR1cyA9IGlhNjRfcGFsX3ZtX3N1bW1hcnkoJnZtMSwgJnZtMik7CiAJaWYgKHN0YXR1cyA9PSBQQUxfU1RBVFVTX1NVQ0NFU1MpIHsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zbXBib290LmMKaW5kZXggNjIwM2VkNC4uZjdkN2Y1NiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9zbXBib290LmMKQEAgLTg3OSwzICs4NzksMjcgQEAKIAljLT5jb3JlX2lkID0gaW5mby5sb2cxX2NpZDsKIAljLT50aHJlYWRfaWQgPSBpbmZvLmxvZzFfdGlkOwogfQorCisvKgorICogcmV0dXJucyBub24gemVybywgaWYgbXVsdGktdGhyZWFkaW5nIGlzIGVuYWJsZWQKKyAqIG9uIGF0IGxlYXN0IG9uZSBwaHlzaWNhbCBwYWNrYWdlLiBEdWUgdG8gaG90cGx1ZyBjcHUKKyAqIGFuZCAobWF4Y3B1cz0pLCBhbGwgdGhyZWFkcyBtYXkgbm90IG5lY2Vzc2FyaWx5IGJlIGVuYWJsZWQKKyAqIGV2ZW4gdGhvdWdoIHRoZSBwcm9jZXNzb3Igc3VwcG9ydHMgbXVsdGktdGhyZWFkaW5nLgorICovCitpbnQgaXNfbXVsdGl0aHJlYWRpbmdfZW5hYmxlZCh2b2lkKQoreworCWludCBpLCBqOworCisJZm9yX2VhY2hfcHJlc2VudF9jcHUoaSkgeworCQlmb3JfZWFjaF9wcmVzZW50X2NwdShqKSB7CisJCQlpZiAoaiA9PSBpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKChjcHVfZGF0YShqKS0+c29ja2V0X2lkID09IGNwdV9kYXRhKGkpLT5zb2NrZXRfaWQpKSB7CisJCQkJaWYgKGNwdV9kYXRhKGopLT5jb3JlX2lkID09IGNwdV9kYXRhKGkpLT5jb3JlX2lkKQorCQkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlzX211bHRpdGhyZWFkaW5nX2VuYWJsZWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC90b3BvbG9neS5jIGIvYXJjaC9pYTY0L2tlcm5lbC90b3BvbG9neS5jCmluZGV4IDA1YmRmN2EuLjU2MjliNDUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvdG9wb2xvZ3kuYworKysgYi9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMKQEAgLTM2LDEwICszNiw4IEBACiAJICovCiAJaWYgKCFjYW5fY3BlaV9yZXRhcmdldCgpICYmIGlzX2NwdV9jcGVpX3RhcmdldChudW0pKQogCQlzeXNmc19jcHVzW251bV0uY3B1Lm5vX2NvbnRyb2wgPSAxOwotI2lmZGVmIENPTkZJR19OVU1BCiAJbWFwX2NwdV90b19ub2RlKG51bSwgbm9kZV9jcHVpZFtudW1dLm5pZCk7CiAjZW5kaWYKLSNlbmRpZgogCiAJcmV0dXJuIHJlZ2lzdGVyX2NwdSgmc3lzZnNfY3B1c1tudW1dLmNwdSwgbnVtKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvaWE2NC9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA1YjBkNWY2Li5iM2IyZTM4IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xODQsNyArMTg0LDkgQEAKIAkgICooLmRhdGEuZ2F0ZSkKIAkgIF9fc3RvcF9nYXRlX3NlY3Rpb24gPSAuOwogCX0KLSAgLiA9IEFMSUdOKFBBR0VfU0laRSk7CQkvKiBtYWtlIHN1cmUgdGhlIGdhdGUgcGFnZSBkb2Vzbid0IGV4cG9zZSBrZXJuZWwgZGF0YSAqLworICAuID0gQUxJR04oUEFHRV9TSVpFKTsJCS8qIG1ha2Ugc3VyZSB0aGUgZ2F0ZSBwYWdlIGRvZXNuJ3QgZXhwb3NlCisgIAkJCQkgKiBrZXJuZWwgZGF0YQorCQkJCSAqLwogCiAgIC5kYXRhLnJlYWRfbW9zdGx5IDogQVQoQUREUiguZGF0YS5yZWFkX21vc3RseSkgLSBMT0FEX09GRlNFVCkKICAgICAgICAgeyAqKC5kYXRhLnJlYWRfbW9zdGx5KSB9CkBAIC0yMDIsNyArMjA0LDkgQEAKIAkJKiguZGF0YS5wZXJjcHUpCiAJCV9fcGVyX2NwdV9lbmQgPSAuOwogCX0KLSAgLiA9IF9fcGh5c19wZXJfY3B1X3N0YXJ0ICsgUEVSQ1BVX1BBR0VfU0laRTsJLyogZW5zdXJlIHBlcmNwdSBkYXRhIGZpdHMgaW50byBwZXJjcHUgcGFnZSBzaXplICovCisgIC4gPSBfX3BoeXNfcGVyX2NwdV9zdGFydCArIFBFUkNQVV9QQUdFX1NJWkU7CS8qIGVuc3VyZSBwZXJjcHUgZGF0YSBmaXRzCisgIAkJCQkJCSAqIGludG8gcGVyY3B1IHBhZ2Ugc2l6ZQorCQkJCQkJICovCiAKICAgZGF0YSA6IHsgfSA6ZGF0YQogICAuZGF0YSA6IEFUKEFERFIoLmRhdGEpIC0gTE9BRF9PRkZTRVQpCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vY29udGlnLmMgYi9hcmNoL2lhNjQvbW0vY29udGlnLmMKaW5kZXggZTAwNDE0My4uZGFmOTc3ZiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2NvbnRpZy5jCisrKyBiL2FyY2gvaWE2NC9tbS9jb250aWcuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGFzbS9tY2EuaD4KIAogI2lmZGVmIENPTkZJR19WSVJUVUFMX01FTV9NQVAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG51bV9kbWFfcGh5c3BhZ2VzOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4X2dhcDsKICNlbmRpZgogCkBAIC00MSwxMCArNDAsMTEgQEAKIAlpbnQgaSwgdG90YWwgPSAwLCByZXNlcnZlZCA9IDA7CiAJaW50IHNoYXJlZCA9IDAsIGNhY2hlZCA9IDA7CiAKLQlwcmludGsoIk1lbS1pbmZvOlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiTWVtLWluZm86XG4iKTsKIAlzaG93X2ZyZWVfYXJlYXMoKTsKIAotCXByaW50aygiRnJlZSBzd2FwOiAgICAgICAlNmxka0JcbiIsIG5yX3N3YXBfcGFnZXM8PChQQUdFX1NISUZULTEwKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiRnJlZSBzd2FwOiAgICAgICAlNmxka0JcbiIsCisJICAgICAgIG5yX3N3YXBfcGFnZXM8PChQQUdFX1NISUZULTEwKSk7CiAJaSA9IG1heF9tYXBucjsKIAlmb3IgKGkgPSAwOyBpIDwgbWF4X21hcG5yOyBpKyspIHsKIAkJaWYgKCFwZm5fdmFsaWQoaSkpIHsKQEAgLTYzLDEyICs2MywxMiBAQAogCQllbHNlIGlmIChwYWdlX2NvdW50KG1lbV9tYXAgKyBpKSkKIAkJCXNoYXJlZCArPSBwYWdlX2NvdW50KG1lbV9tYXAgKyBpKSAtIDE7CiAJfQotCXByaW50aygiJWQgcGFnZXMgb2YgUkFNXG4iLCB0b3RhbCk7Ci0JcHJpbnRrKCIlZCByZXNlcnZlZCBwYWdlc1xuIiwgcmVzZXJ2ZWQpOwotCXByaW50aygiJWQgcGFnZXMgc2hhcmVkXG4iLCBzaGFyZWQpOwotCXByaW50aygiJWQgcGFnZXMgc3dhcCBjYWNoZWRcbiIsIGNhY2hlZCk7Ci0JcHJpbnRrKCIlbGQgcGFnZXMgaW4gcGFnZSB0YWJsZSBjYWNoZVxuIiwKLQkJcGd0YWJsZV9xdWlja2xpc3RfdG90YWxfc2l6ZSgpKTsKKwlwcmludGsoS0VSTl9JTkZPICIlZCBwYWdlcyBvZiBSQU1cbiIsIHRvdGFsKTsKKwlwcmludGsoS0VSTl9JTkZPICIlZCByZXNlcnZlZCBwYWdlc1xuIiwgcmVzZXJ2ZWQpOworCXByaW50ayhLRVJOX0lORk8gIiVkIHBhZ2VzIHNoYXJlZFxuIiwgc2hhcmVkKTsKKwlwcmludGsoS0VSTl9JTkZPICIlZCBwYWdlcyBzd2FwIGNhY2hlZFxuIiwgY2FjaGVkKTsKKwlwcmludGsoS0VSTl9JTkZPICIlbGQgcGFnZXMgaW4gcGFnZSB0YWJsZSBjYWNoZVxuIiwKKwkgICAgICAgcGd0YWJsZV9xdWlja2xpc3RfdG90YWxfc2l6ZSgpKTsKIH0KIAogLyogcGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUgYm9vdG1lbSBtYXAgaXMgbG9jYXRlZCAqLwpAQCAtMjE4LDE4ICsyMTgsNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1ZJUlRVQUxfTUVNX01BUAotc3RhdGljIGludAotY291bnRfZG1hX3BhZ2VzICh1NjQgc3RhcnQsIHU2NCBlbmQsIHZvaWQgKmFyZykKLXsKLQl1bnNpZ25lZCBsb25nICpjb3VudCA9IGFyZzsKLQotCWlmIChzdGFydCA8IE1BWF9ETUFfQUREUkVTUykKLQkJKmNvdW50ICs9IChtaW4oZW5kLCBNQVhfRE1BX0FERFJFU1MpIC0gc3RhcnQpID4+IFBBR0VfU0hJRlQ7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogLyoKICAqIFNldCB1cCB0aGUgcGFnZSB0YWJsZXMuCiAgKi8KQEAgLTIzOCw0NSArMjI2LDIyIEBACiBwYWdpbmdfaW5pdCAodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIG1heF9kbWE7Ci0JdW5zaWduZWQgbG9uZyB6b25lc19zaXplW01BWF9OUl9aT05FU107Ci0jaWZkZWYgQ09ORklHX1ZJUlRVQUxfTUVNX01BUAotCXVuc2lnbmVkIGxvbmcgemhvbGVzX3NpemVbTUFYX05SX1pPTkVTXTsKLSNlbmRpZgotCi0JLyogaW5pdGlhbGl6ZSBtZW1fbWFwW10gKi8KLQotCW1lbXNldCh6b25lc19zaXplLCAwLCBzaXplb2Yoem9uZXNfc2l6ZSkpOworCXVuc2lnbmVkIGxvbmcgbmlkID0gMDsKKwl1bnNpZ25lZCBsb25nIG1heF96b25lX3BmbnNbTUFYX05SX1pPTkVTXTsKIAogCW51bV9waHlzcGFnZXMgPSAwOwogCWVmaV9tZW1tYXBfd2Fsayhjb3VudF9wYWdlcywgJm51bV9waHlzcGFnZXMpOwogCiAJbWF4X2RtYSA9IHZpcnRfdG9fcGh5cygodm9pZCAqKSBNQVhfRE1BX0FERFJFU1MpID4+IFBBR0VfU0hJRlQ7CisJbWF4X3pvbmVfcGZuc1taT05FX0RNQV0gPSBtYXhfZG1hOworCW1heF96b25lX3BmbnNbWk9ORV9OT1JNQUxdID0gbWF4X2xvd19wZm47CiAKICNpZmRlZiBDT05GSUdfVklSVFVBTF9NRU1fTUFQCi0JbWVtc2V0KHpob2xlc19zaXplLCAwLCBzaXplb2YoemhvbGVzX3NpemUpKTsKLQotCW51bV9kbWFfcGh5c3BhZ2VzID0gMDsKLQllZmlfbWVtbWFwX3dhbGsoY291bnRfZG1hX3BhZ2VzLCAmbnVtX2RtYV9waHlzcGFnZXMpOwotCi0JaWYgKG1heF9sb3dfcGZuIDwgbWF4X2RtYSkgewotCQl6b25lc19zaXplW1pPTkVfRE1BXSA9IG1heF9sb3dfcGZuOwotCQl6aG9sZXNfc2l6ZVtaT05FX0RNQV0gPSBtYXhfbG93X3BmbiAtIG51bV9kbWFfcGh5c3BhZ2VzOwotCX0gZWxzZSB7Ci0JCXpvbmVzX3NpemVbWk9ORV9ETUFdID0gbWF4X2RtYTsKLQkJemhvbGVzX3NpemVbWk9ORV9ETUFdID0gbWF4X2RtYSAtIG51bV9kbWFfcGh5c3BhZ2VzOwotCQlpZiAobnVtX3BoeXNwYWdlcyA+IG51bV9kbWFfcGh5c3BhZ2VzKSB7Ci0JCQl6b25lc19zaXplW1pPTkVfTk9STUFMXSA9IG1heF9sb3dfcGZuIC0gbWF4X2RtYTsKLQkJCXpob2xlc19zaXplW1pPTkVfTk9STUFMXSA9Ci0JCQkJKChtYXhfbG93X3BmbiAtIG1heF9kbWEpIC0KLQkJCQkgKG51bV9waHlzcGFnZXMgLSBudW1fZG1hX3BoeXNwYWdlcykpOwotCQl9Ci0JfQotCisJZWZpX21lbW1hcF93YWxrKHJlZ2lzdGVyX2FjdGl2ZV9yYW5nZXMsICZuaWQpOwogCWVmaV9tZW1tYXBfd2FsayhmaW5kX2xhcmdlc3RfaG9sZSwgKHU2NCAqKSZtYXhfZ2FwKTsKIAlpZiAobWF4X2dhcCA8IExBUkdFX0dBUCkgewogCQl2bWVtX21hcCA9IChzdHJ1Y3QgcGFnZSAqKSAwOwotCQlmcmVlX2FyZWFfaW5pdF9ub2RlKDAsIE5PREVfREFUQSgwKSwgem9uZXNfc2l6ZSwgMCwKLQkJCQkgICAgemhvbGVzX3NpemUpOworCQlmcmVlX2FyZWFfaW5pdF9ub2RlcyhtYXhfem9uZV9wZm5zKTsKIAl9IGVsc2UgewogCQl1bnNpZ25lZCBsb25nIG1hcF9zaXplOwogCkBAIC0yODgsMjAgKzI1MywxOSBAQAogCQl2bWVtX21hcCA9IChzdHJ1Y3QgcGFnZSAqKSB2bWFsbG9jX2VuZDsKIAkJZWZpX21lbW1hcF93YWxrKGNyZWF0ZV9tZW1fbWFwX3BhZ2VfdGFibGUsIE5VTEwpOwogCi0JCU5PREVfREFUQSgwKS0+bm9kZV9tZW1fbWFwID0gdm1lbV9tYXA7Ci0JCWZyZWVfYXJlYV9pbml0X25vZGUoMCwgTk9ERV9EQVRBKDApLCB6b25lc19zaXplLAotCQkJCSAgICAwLCB6aG9sZXNfc2l6ZSk7CisJCS8qCisJCSAqIGFsbG9jX25vZGVfbWVtX21hcCBtYWtlcyBhbiBhZGp1c3RtZW50IGZvciBtZW1fbWFwCisJCSAqIHdoaWNoIGlzbid0IGNvbXBhdGlibGUgd2l0aCB2bWVtX21hcC4KKwkJICovCisJCU5PREVfREFUQSgwKS0+bm9kZV9tZW1fbWFwID0gdm1lbV9tYXAgKworCQkJZmluZF9taW5fcGZuX3dpdGhfYWN0aXZlX3JlZ2lvbnMoKTsKKwkJZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7CiAKIAkJcHJpbnRrKCJWaXJ0dWFsIG1lbV9tYXAgc3RhcnRzIGF0IDB4JXBcbiIsIG1lbV9tYXApOwogCX0KICNlbHNlIC8qICFDT05GSUdfVklSVFVBTF9NRU1fTUFQICovCi0JaWYgKG1heF9sb3dfcGZuIDwgbWF4X2RtYSkKLQkJem9uZXNfc2l6ZVtaT05FX0RNQV0gPSBtYXhfbG93X3BmbjsKLQllbHNlIHsKLQkJem9uZXNfc2l6ZVtaT05FX0RNQV0gPSBtYXhfZG1hOwotCQl6b25lc19zaXplW1pPTkVfTk9STUFMXSA9IG1heF9sb3dfcGZuIC0gbWF4X2RtYTsKLQl9Ci0JZnJlZV9hcmVhX2luaXQoem9uZXNfc2l6ZSk7CisJYWRkX2FjdGl2ZV9yYW5nZSgwLCAwLCBtYXhfbG93X3Bmbik7CisJZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7CiAjZW5kaWYgLyogIUNPTkZJR19WSVJUVUFMX01FTV9NQVAgKi8KIAl6ZXJvX3BhZ2VfbWVtbWFwX3B0ciA9IHZpcnRfdG9fcGFnZShpYTY0X2ltdmEoZW1wdHlfemVyb19wYWdlKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vZGlzY29udGlnLmMgYi9hcmNoL2lhNjQvbW0vZGlzY29udGlnLmMKaW5kZXggZDI2MGJmZi4uZDQ5N2I2YiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2Rpc2NvbnRpZy5jCisrKyBiL2FyY2gvaWE2NC9tbS9kaXNjb250aWcuYwpAQCAtNTQ3LDE1ICs1NDcsMTYgQEAKIAl1bnNpZ25lZCBsb25nIHRvdGFsX3ByZXNlbnQgPSAwOwogCXBnX2RhdGFfdCAqcGdkYXQ7CiAKLQlwcmludGsoIk1lbS1pbmZvOlxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiTWVtLWluZm86XG4iKTsKIAlzaG93X2ZyZWVfYXJlYXMoKTsKLQlwcmludGsoIkZyZWUgc3dhcDogICAgICAgJTZsZGtCXG4iLCBucl9zd2FwX3BhZ2VzPDwoUEFHRV9TSElGVC0xMCkpOworCXByaW50ayhLRVJOX0lORk8gIkZyZWUgc3dhcDogICAgICAgJTZsZGtCXG4iLAorCSAgICAgICBucl9zd2FwX3BhZ2VzPDwoUEFHRV9TSElGVC0xMCkpOworCXByaW50ayhLRVJOX0lORk8gIk5vZGUgbWVtb3J5IGluIHBhZ2VzOlxuIik7CiAJZm9yX2VhY2hfb25saW5lX3BnZGF0KHBnZGF0KSB7CiAJCXVuc2lnbmVkIGxvbmcgcHJlc2VudDsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJaW50IHNoYXJlZCA9IDAsIGNhY2hlZCA9IDAsIHJlc2VydmVkID0gMDsKIAotCQlwcmludGsoIk5vZGUgSUQ6ICVkXG4iLCBwZ2RhdC0+bm9kZV9pZCk7CiAJCXBnZGF0X3Jlc2l6ZV9sb2NrKHBnZGF0LCAmZmxhZ3MpOwogCQlwcmVzZW50ID0gcGdkYXQtPm5vZGVfcHJlc2VudF9wYWdlczsKIAkJZm9yKGkgPSAwOyBpIDwgcGdkYXQtPm5vZGVfc3Bhbm5lZF9wYWdlczsgaSsrKSB7CkBAIC01NzksMTggKzU4MCwxNyBAQAogCQl0b3RhbF9yZXNlcnZlZCArPSByZXNlcnZlZDsKIAkJdG90YWxfY2FjaGVkICs9IGNhY2hlZDsKIAkJdG90YWxfc2hhcmVkICs9IHNoYXJlZDsKLQkJcHJpbnRrKCJcdCVsZCBwYWdlcyBvZiBSQU1cbiIsIHByZXNlbnQpOwotCQlwcmludGsoIlx0JWQgcmVzZXJ2ZWQgcGFnZXNcbiIsIHJlc2VydmVkKTsKLQkJcHJpbnRrKCJcdCVkIHBhZ2VzIHNoYXJlZFxuIiwgc2hhcmVkKTsKLQkJcHJpbnRrKCJcdCVkIHBhZ2VzIHN3YXAgY2FjaGVkXG4iLCBjYWNoZWQpOworCQlwcmludGsoS0VSTl9JTkZPICJOb2RlICU0ZDogIFJBTTogJTExbGQsIHJzdmQ6ICU4ZCwgIgorCQkgICAgICAgInNocmQ6ICUxMGQsIHN3cGQ6ICUxMGRcbiIsIHBnZGF0LT5ub2RlX2lkLAorCQkgICAgICAgcHJlc2VudCwgcmVzZXJ2ZWQsIHNoYXJlZCwgY2FjaGVkKTsKIAl9Ci0JcHJpbnRrKCIlbGQgcGFnZXMgb2YgUkFNXG4iLCB0b3RhbF9wcmVzZW50KTsKLQlwcmludGsoIiVkIHJlc2VydmVkIHBhZ2VzXG4iLCB0b3RhbF9yZXNlcnZlZCk7Ci0JcHJpbnRrKCIlZCBwYWdlcyBzaGFyZWRcbiIsIHRvdGFsX3NoYXJlZCk7Ci0JcHJpbnRrKCIlZCBwYWdlcyBzd2FwIGNhY2hlZFxuIiwgdG90YWxfY2FjaGVkKTsKLQlwcmludGsoIlRvdGFsIG9mICVsZCBwYWdlcyBpbiBwYWdlIHRhYmxlIGNhY2hlXG4iLAotCQlwZ3RhYmxlX3F1aWNrbGlzdF90b3RhbF9zaXplKCkpOwotCXByaW50aygiJWQgZnJlZSBidWZmZXIgcGFnZXNcbiIsIG5yX2ZyZWVfYnVmZmVyX3BhZ2VzKCkpOworCXByaW50ayhLRVJOX0lORk8gIiVsZCBwYWdlcyBvZiBSQU1cbiIsIHRvdGFsX3ByZXNlbnQpOworCXByaW50ayhLRVJOX0lORk8gIiVkIHJlc2VydmVkIHBhZ2VzXG4iLCB0b3RhbF9yZXNlcnZlZCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiJWQgcGFnZXMgc2hhcmVkXG4iLCB0b3RhbF9zaGFyZWQpOworCXByaW50ayhLRVJOX0lORk8gIiVkIHBhZ2VzIHN3YXAgY2FjaGVkXG4iLCB0b3RhbF9jYWNoZWQpOworCXByaW50ayhLRVJOX0lORk8gIlRvdGFsIG9mICVsZCBwYWdlcyBpbiBwYWdlIHRhYmxlIGNhY2hlXG4iLAorCSAgICAgICBwZ3RhYmxlX3F1aWNrbGlzdF90b3RhbF9zaXplKCkpOworCXByaW50ayhLRVJOX0lORk8gIiVkIGZyZWUgYnVmZmVyIHBhZ2VzXG4iLCBucl9mcmVlX2J1ZmZlcl9wYWdlcygpKTsKIH0KIAogLyoqCkBAIC02NTQsNiArNjU0LDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGVuZCA9IHN0YXJ0ICsgbGVuOwogCisJYWRkX2FjdGl2ZV9yYW5nZShub2RlLCBzdGFydCA+PiBQQUdFX1NISUZULCBlbmQgPj4gUEFHRV9TSElGVCk7CiAJbWVtX2RhdGFbbm9kZV0ubnVtX3BoeXNwYWdlcyArPSBsZW4gPj4gUEFHRV9TSElGVDsKIAlpZiAoc3RhcnQgPD0gX19wYShNQVhfRE1BX0FERFJFU1MpKQogCQltZW1fZGF0YVtub2RlXS5udW1fZG1hX3BoeXNwYWdlcyArPQpAQCAtNjc4LDEwICs2NzksMTAgQEAKIHZvaWQgX19pbml0IHBhZ2luZ19pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXhfZG1hOwotCXVuc2lnbmVkIGxvbmcgem9uZXNfc2l6ZVtNQVhfTlJfWk9ORVNdOwotCXVuc2lnbmVkIGxvbmcgemhvbGVzX3NpemVbTUFYX05SX1pPTkVTXTsKIAl1bnNpZ25lZCBsb25nIHBmbl9vZmZzZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgbWF4X3BmbiA9IDA7CiAJaW50IG5vZGU7CisJdW5zaWduZWQgbG9uZyBtYXhfem9uZV9wZm5zW01BWF9OUl9aT05FU107CiAKIAltYXhfZG1hID0gdmlydF90b19waHlzKCh2b2lkICopIE1BWF9ETUFfQUREUkVTUykgPj4gUEFHRV9TSElGVDsKIApAQCAtNjk4LDQ3ICs2OTksMjAgQEAKICNlbmRpZgogCiAJZm9yX2VhY2hfb25saW5lX25vZGUobm9kZSkgewotCQltZW1zZXQoem9uZXNfc2l6ZSwgMCwgc2l6ZW9mKHpvbmVzX3NpemUpKTsKLQkJbWVtc2V0KHpob2xlc19zaXplLCAwLCBzaXplb2YoemhvbGVzX3NpemUpKTsKLQogCQludW1fcGh5c3BhZ2VzICs9IG1lbV9kYXRhW25vZGVdLm51bV9waHlzcGFnZXM7Ci0KLQkJaWYgKG1lbV9kYXRhW25vZGVdLm1pbl9wZm4gPj0gbWF4X2RtYSkgewotCQkJLyogQWxsIG9mIHRoaXMgbm9kZSdzIG1lbW9yeSBpcyBhYm92ZSBaT05FX0RNQSAqLwotCQkJem9uZXNfc2l6ZVtaT05FX05PUk1BTF0gPSBtZW1fZGF0YVtub2RlXS5tYXhfcGZuIC0KLQkJCQltZW1fZGF0YVtub2RlXS5taW5fcGZuOwotCQkJemhvbGVzX3NpemVbWk9ORV9OT1JNQUxdID0gbWVtX2RhdGFbbm9kZV0ubWF4X3BmbiAtCi0JCQkJbWVtX2RhdGFbbm9kZV0ubWluX3BmbiAtCi0JCQkJbWVtX2RhdGFbbm9kZV0ubnVtX3BoeXNwYWdlczsKLQkJfSBlbHNlIGlmIChtZW1fZGF0YVtub2RlXS5tYXhfcGZuIDwgbWF4X2RtYSkgewotCQkJLyogQWxsIG9mIHRoaXMgbm9kZSdzIG1lbW9yeSBpcyBpbiBaT05FX0RNQSAqLwotCQkJem9uZXNfc2l6ZVtaT05FX0RNQV0gPSBtZW1fZGF0YVtub2RlXS5tYXhfcGZuIC0KLQkJCQltZW1fZGF0YVtub2RlXS5taW5fcGZuOwotCQkJemhvbGVzX3NpemVbWk9ORV9ETUFdID0gbWVtX2RhdGFbbm9kZV0ubWF4X3BmbiAtCi0JCQkJbWVtX2RhdGFbbm9kZV0ubWluX3BmbiAtCi0JCQkJbWVtX2RhdGFbbm9kZV0ubnVtX2RtYV9waHlzcGFnZXM7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBUaGlzIG5vZGUgaGFzIG1lbW9yeSBpbiBib3RoIHpvbmVzICovCi0JCQl6b25lc19zaXplW1pPTkVfRE1BXSA9IG1heF9kbWEgLQotCQkJCW1lbV9kYXRhW25vZGVdLm1pbl9wZm47Ci0JCQl6aG9sZXNfc2l6ZVtaT05FX0RNQV0gPSB6b25lc19zaXplW1pPTkVfRE1BXSAtCi0JCQkJbWVtX2RhdGFbbm9kZV0ubnVtX2RtYV9waHlzcGFnZXM7Ci0JCQl6b25lc19zaXplW1pPTkVfTk9STUFMXSA9IG1lbV9kYXRhW25vZGVdLm1heF9wZm4gLQotCQkJCW1heF9kbWE7Ci0JCQl6aG9sZXNfc2l6ZVtaT05FX05PUk1BTF0gPSB6b25lc19zaXplW1pPTkVfTk9STUFMXSAtCi0JCQkJKG1lbV9kYXRhW25vZGVdLm51bV9waHlzcGFnZXMgLQotCQkJCSBtZW1fZGF0YVtub2RlXS5udW1fZG1hX3BoeXNwYWdlcyk7Ci0JCX0KLQogCQlwZm5fb2Zmc2V0ID0gbWVtX2RhdGFbbm9kZV0ubWluX3BmbjsKIAogI2lmZGVmIENPTkZJR19WSVJUVUFMX01FTV9NQVAKIAkJTk9ERV9EQVRBKG5vZGUpLT5ub2RlX21lbV9tYXAgPSB2bWVtX21hcCArIHBmbl9vZmZzZXQ7CiAjZW5kaWYKLQkJZnJlZV9hcmVhX2luaXRfbm9kZShub2RlLCBOT0RFX0RBVEEobm9kZSksIHpvbmVzX3NpemUsCi0JCQkJICAgIHBmbl9vZmZzZXQsIHpob2xlc19zaXplKTsKKwkJaWYgKG1lbV9kYXRhW25vZGVdLm1heF9wZm4gPiBtYXhfcGZuKQorCQkJbWF4X3BmbiA9IG1lbV9kYXRhW25vZGVdLm1heF9wZm47CiAJfQogCisJbWF4X3pvbmVfcGZuc1taT05FX0RNQV0gPSBtYXhfZG1hOworCW1heF96b25lX3BmbnNbWk9ORV9OT1JNQUxdID0gbWF4X3BmbjsKKwlmcmVlX2FyZWFfaW5pdF9ub2RlcyhtYXhfem9uZV9wZm5zKTsKKwogCXplcm9fcGFnZV9tZW1tYXBfcHRyID0gdmlydF90b19wYWdlKGlhNjRfaW12YShlbXB0eV96ZXJvX3BhZ2UpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2luaXQuYyBiL2FyY2gvaWE2NC9tbS9pbml0LmMKaW5kZXggMzA2MTdjYy4uZmY4N2E1YyAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2luaXQuYworKysgYi9hcmNoL2lhNjQvbW0vaW5pdC5jCkBAIC01OTMsNiArNTkzLDE4IEBACiAJbGFzdF9lbmQgPSBlbmQ7CiAJcmV0dXJuIDA7CiB9CisKK2ludCBfX2luaXQKK3JlZ2lzdGVyX2FjdGl2ZV9yYW5nZXModTY0IHN0YXJ0LCB1NjQgZW5kLCB2b2lkICpuaWQpCit7CisJQlVHX09OKG5pZCA9PSBOVUxMKTsKKwlCVUdfT04oKih1bnNpZ25lZCBsb25nICopbmlkID49IE1BWF9OVU1OT0RFUyk7CisKKwlhZGRfYWN0aXZlX3JhbmdlKCoodW5zaWduZWQgbG9uZyAqKW5pZCwKKwkJCQlfX3BhKHN0YXJ0KSA+PiBQQUdFX1NISUZULAorCQkJCV9fcGEoZW5kKSA+PiBQQUdFX1NISUZUKTsKKwlyZXR1cm4gMDsKK30KICNlbmRpZiAvKiBDT05GSUdfVklSVFVBTF9NRU1fTUFQICovCiAKIHN0YXRpYyBpbnQgX19pbml0CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvcGNpL3BjaS5jIGIvYXJjaC9pYTY0L3BjaS9wY2kuYwppbmRleCA2MGI0NWU3Li4xNWM3YzY3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvcGNpL3BjaS5jCisrKyBiL2FyY2gvaWE2NC9wY2kvcGNpLmMKQEAgLTU2Miw3ICs1NjIsOCBAQAogdm9pZAogcGNpYmlvc19kaXNhYmxlX2RldmljZSAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKLQlhY3BpX3BjaV9pcnFfZGlzYWJsZShkZXYpOworCWlmIChkZXYtPmlzX2VuYWJsZWQpCisJCWFjcGlfcGNpX2lycV9kaXNhYmxlKGRldik7CiB9CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvYnRlLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL2J0ZS5jCmluZGV4IDI3ZGVlNDUuLjdmNzNhZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvYnRlLmMKKysrIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9idGUuYwpAQCAtMjc3LDggKzI3Nyw3IEBACiAJfQogCiAJLyogdGVtcG9yYXJ5IGJ1ZmZlciB1c2VkIGR1cmluZyB1bmFsaWduZWQgdHJhbnNmZXJzICovCi0JYnRlQmxvY2tfdW5hbGlnbmVkID0ga21hbGxvYyhsZW4gKyAzICogTDFfQ0FDSEVfQllURVMsCi0JCQkJICAgICBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJYnRlQmxvY2tfdW5hbGlnbmVkID0ga21hbGxvYyhsZW4gKyAzICogTDFfQ0FDSEVfQllURVMsIEdGUF9LRVJORUwpOwogCWlmIChidGVCbG9ja191bmFsaWduZWQgPT0gTlVMTCkgewogCQlyZXR1cm4gQlRFRkFJTF9OT1RBVkFJTDsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvS2NvbmZpZyBiL2FyY2gvbWlwcy9LY29uZmlnCmluZGV4IDMzMGY2YWIuLjMwNzUwYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9LY29uZmlnCisrKyBiL2FyY2gvbWlwcy9LY29uZmlnCkBAIC0xMjYsNyArMTI2LDcgQEAKIAlzZWxlY3QgSVJRX0NQVQogCXNlbGVjdCBJUlFfQ1BVX1JNN0sKIAlzZWxlY3QgSVJRX0NQVV9STTlLCi0Jc2VsZWN0IFNFUklBTF9STTkwMDAKKwlzZWxlY3QgTUlQU19STTkxMjIKIAlzZWxlY3QgU1lTX0hBU19DUFVfUk05MDAwCiAJc2VsZWN0IFNZU19TVVBQT1JUU18zMkJJVF9LRVJORUwKIAlzZWxlY3QgU1lTX1NVUFBPUlRTXzY0QklUX0tFUk5FTApAQCAtMjAzLDI2ICsyMDMsNiBAQAogCSAgPGh0dHA6Ly93d3cubWFydmVsbC5jb20vPi4gIFNheSBZIGhlcmUgaWYgeW91IHdpc2ggdG8gYnVpbGQgYQogCSAga2VybmVsIGZvciB0aGlzIHBsYXRmb3JtLgogCi1jb25maWcgTUlQU19FVjk2MTAwCi0JYm9vbCAiR2FsaWxlbyBFVjk2MTAwIEV2YWx1YXRpb24gYm9hcmQgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKLQlzZWxlY3QgRE1BX05PTkNPSEVSRU5UCi0Jc2VsZWN0IEhXX0hBU19QQ0kKLQlzZWxlY3QgSVJRX0NQVQotCXNlbGVjdCBNSVBTX0dUOTYxMDAKLQlzZWxlY3QgUk03MDAwX0NQVV9TQ0FDSEUKLQlzZWxlY3QgU1dBUF9JT19TUEFDRQotCXNlbGVjdCBTWVNfSEFTX0NQVV9SNTAwMAotCXNlbGVjdCBTWVNfSEFTX0NQVV9STTcwMDAKLQlzZWxlY3QgU1lTX1NVUFBPUlRTXzMyQklUX0tFUk5FTAotCXNlbGVjdCBTWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMIGlmIEVYUEVSSU1FTlRBTAotCXNlbGVjdCBTWVNfU1VQUE9SVFNfQklHX0VORElBTgotCWhlbHAKLQkgIFRoaXMgaXMgYW4gZXZhbHVhdGlvbiBib2FyZCBiYXNlZCBvbiB0aGUgR2FsaWxlbyBHVC05NjEwMCBMQU4vV0FOCi0JICBjb21tdW5pY2F0aW9ucyBjb250cm9sbGVycyBjb250YWluaW5nIGEgTUlQUyBSNTAwMCBjb21wYXRpYmxlIGNvcmUKLQkgIHJ1bm5pbmcgYXQgODNNSHouIFRoZWlyIHdlYnNpdGUgaXMgPGh0dHA6Ly93d3cubWFydmVsbC5jb20vPi4gU2F5IFkKLQkgIGhlcmUgaWYgeW91IHdpc2ggdG8gYnVpbGQgYSBrZXJuZWwgZm9yIHRoaXMgcGxhdGZvcm0uCi0KIGNvbmZpZyBNSVBTX0lWUgogCWJvb2wgIkdsb2Jlc3BhbiBJVlIgYm9hcmQiCiAJc2VsZWN0IERNQV9OT05DT0hFUkVOVApAQCAtOTc0LDYgKzk1NCwxMiBAQAogCWJvb2wKIAlzZWxlY3QgSEFTX1RYWDlfU0VSSUFMCiAKK2NvbmZpZyBNSVBTX1JNOTEyMgorCWJvb2wKKwlzZWxlY3QgU0VSSUFMX1JNOTAwMAorCXNlbGVjdCBHUElfUk05MDAwCisJc2VsZWN0IFdEVF9STTkwMDAKKwogY29uZmlnIFBDSV9NQVJWRUxMCiAJYm9vbAogCkBAIC0xMDI0LDYgKzEwMTAsMTUgQEAKIAlkZXBlbmRzIG9uIE1BUktFSU5TCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBTRVJJQUxfUk05MDAwCisJYm9vbAorCitjb25maWcgR1BJX1JNOTAwMAorCWJvb2wKKworY29uZmlnIFdEVF9STTkwMDAKKwlib29sCisKICMKICMgVW5mb3J0dW5hdGVseSBub3QgYWxsIEdUNjQxMjAgc3lzdGVtcyBydW4gdGhlIGNoaXAgYXQgdGhlIHNhbWUgY2xvY2suCiAjIEFzIHRoZSB1c2VyIGZvciB0aGUgY2xvY2sgcmF0ZSBhbmQgdHJ5IHRvIG1pbmltaXplIHRoZSBhdmFpbGFibGUgb3B0aW9ucy4KQEAgLTEwNTQsMTAgKzEwNDksNiBAQAogCWRlcGVuZHMgb24gTUlQU19QQjE1MDAgfHwgTUlQU19QQjExMDAgfHwgTUlQU19QQjEwMDAKIAlkZWZhdWx0IG4KIAotY29uZmlnIE1JUFNfR1Q5NjEwMAotCWJvb2wKLQlzZWxlY3QgTUlQU19HVDY0MTIwCi0KIGNvbmZpZyBJVDgxNzJfQ0lSCiAJYm9vbAogCWRlcGVuZHMgb24gTUlQU19JVEU4MTcyIHx8IE1JUFNfSVZSCkBAIC0xNTI3LDYgKzE1MTgsNyBAQAogCXNlbGVjdCBDUFVfTUlQU1IyX1NSUwogCXNlbGVjdCBNSVBTX01UCiAJc2VsZWN0IFNNUAorCXNlbGVjdCBTWVNfU1VQUE9SVFNfU01QCiAJaGVscAogCSAgVGhpcyBpcyBhIGtlcm5lbCBtb2RlbCB3aGljaCBpcyBrbm93biBhIFNNVEMgb3IgbGF0ZWx5IGhhcyBiZWVuCiAJICBtYXJrZXRlc2VkIGludG8gU01WUC4KQEAgLTE1MzgsNiArMTUzMCw3IEBACiAJc2VsZWN0IENQVV9NSVBTUjJfU1JTCiAJc2VsZWN0IE1JUFNfTVQKIAlzZWxlY3QgU01QCisJc2VsZWN0IFNZU19TVVBQT1JUU19TTVAKIAloZWxwCiAJICBUaGlzIGlzIGEga2VybmVsIG1vZGVsIHdoaWNoIGlzIGFsc28ga25vd24gYSBWU01QIG9yIGxhdGVseQogCSAgaGFzIGJlZW4gbWFya2V0ZXNlZCBpbnRvIFNNVlAuCkBAIC0xNjQ5LDkgKzE2NDIsNyBAQAogCWRlZmF1bHQgeQogCiBjb25maWcgSVJRX1BFUl9DUFUKLQlkZXBlbmRzIG9uIFNNUAogCWJvb2wKLQlkZWZhdWx0IHkKIAogIwogIyAtIEhpZ2htZW0gb25seSBtYWtlcyBzZW5zZSBmb3IgdGhlIDMyLWJpdCBrZXJuZWwuCkBAIC0xNzE5LDYgKzE3MTAsNyBAQAogY29uZmlnIFNNUAogCWJvb2wgIk11bHRpLVByb2Nlc3Npbmcgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNZU19TVVBQT1JUU19TTVAKKwlzZWxlY3QgSVJRX1BFUl9DUFUKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3Igc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiBvbmUgQ1BVLiBJZiB5b3UgaGF2ZQogCSAgYSBzeXN0ZW0gd2l0aCBvbmx5IG9uZSBDUFUsIGxpa2UgbW9zdCBwZXJzb25hbCBjb21wdXRlcnMsIHNheSBOLiBJZgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL01ha2VmaWxlIGIvYXJjaC9taXBzL01ha2VmaWxlCmluZGV4IGQzMzNjZTQuLmU1MjE4MjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvTWFrZWZpbGUKQEAgLTI4MCwxMyArMjgwLDYgQEAKIGxvYWQtJChDT05GSUdfTUlQU19FVjY0MTIwKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKIAogIwotIyBHYWxpbGVvIEVWOTYxMDAgQm9hcmQKLSMKLWNvcmUtJChDT05GSUdfTUlQU19FVjk2MTAwKQkrPSBhcmNoL21pcHMvZ2FsaWxlby1ib2FyZHMvZXY5NjEwMC8KLWNmbGFncy0kKENPTkZJR19NSVBTX0VWOTYxMDApCSs9IC1JaW5jbHVkZS9hc20tbWlwcy9tYWNoLWV2OTYxMDAKLWxvYWQtJChDT05GSUdfTUlQU19FVjk2MTAwKQkrPSAweGZmZmZmZmZmODAxMDAwMDAKLQotIwogIyBXaW5kIFJpdmVyIFBQTUMgQm9hcmQgKDRLQyArIEdUNjQxMjApCiAjCiBjb3JlLSQoQ09ORklHX1dSX1BQTUMpCQkrPSBhcmNoL21pcHMvZ3Q2NDEyMC93cnBwbWMvCkBAIC0zMzAsNiArMzIzLDcgQEAKICMgTUlQUyBTRUFEIGJvYXJkCiAjCiBjb3JlLSQoQ09ORklHX01JUFNfU0VBRCkJKz0gYXJjaC9taXBzL21pcHMtYm9hcmRzL3NlYWQvCitjZmxhZ3MtJChDT05GSUdfTUlQU19TRUFEKQkrPSAtSWluY2x1ZGUvYXNtLW1pcHMvbWFjaC1taXBzCiBsb2FkLSQoQ09ORklHX01JUFNfU0VBRCkJKz0gMHhmZmZmZmZmZjgwMTAwMDAwCiAKICMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9hdTEwMDAvZGIxeDAwL01ha2VmaWxlIGIvYXJjaC9taXBzL2F1MTAwMC9kYjF4MDAvTWFrZWZpbGUKaW5kZXggNGM3ZDc2My4uNTFkNjJiZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2F1MTAwMC9kYjF4MDAvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL2F1MTAwMC9kYjF4MDAvTWFrZWZpbGUKQEAgLTYsNCArNiwzIEBACiAjIE1ha2VmaWxlIGZvciB0aGUgQWxjaGVteSBTZW1pY29uZHVjdG9yIERiMXgwMCBib2FyZC4KIAogbGliLXkgOj0gaW5pdC5vIGJvYXJkX3NldHVwLm8gaXJxbWFwLm8KLW9iai0kKENPTkZJR19XTTk3WFhfQ09NT0RVTEUpICs9IG1pcmFnZV90cy5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvYXUxMDAwL2RiMXgwMC9taXJhZ2VfdHMuYyBiL2FyY2gvbWlwcy9hdTEwMDAvZGIxeDAwL21pcmFnZV90cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTQyZGNmLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9hdTEwMDAvZGIxeDAwL21pcmFnZV90cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL21pcHMvYXUxMDAwL2RiMXgwMC9taXJhZ2VfdHMuYwotICoKLSAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgotICoJR2x1ZSBiZXR3ZWVuIE1pcmFnZSBib2FyZC1zcGVjaWZpYyB0b3VjaHNjcmVlbiBwaWVjZXMKLSAqCWFuZCBnZW5lcmljIFdvbGZzb24gQ29kZWMgdG91Y2hzY3JlZW4gc3VwcG9ydC4KLSAqCi0gKglCYXNlZCBvbiBwYjExMDBfdHMuYyB1c2VkIGluIEh5ZHJvZ2VuIElJLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBFbWJlZGRlZCBFZGdlLCBMTEMKLSAqCQlkYW5AZW1iZWRkZWRlZGdlLmNvbQotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUJIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mCSB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQlMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRAkgIGBgQVMJSVMnJyBBTkQgICBBTlkJRVhQUkVTUyBPUiBJTVBMSUVECi0gKiAgV0FSUkFOVElFUywJICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCi0gKiAgTk8JRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUJIExJQUJMRSBGT1IgQU5ZCSAgRElSRUNULCBJTkRJUkVDVCwKLSAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqICBOT1QgTElNSVRFRAkgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUwlPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwJT1IgUFJPRklUUzsgT1IJQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgkgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9hdTEwMDAuaD4KLQotLyoKLSAqICBJbXBvcnRlZCBpbnRlcmZhY2UgdG8gV29sZnNvbiBDb2RlYyBkcml2ZXIuCi0gKi8KLWV4dGVybiB2b2lkICp3bTk3eHhfdHNfZ2V0X2hhbmRsZShpbnQgd2hpY2gpOwotZXh0ZXJuIGludCB3bTk3eHhfdHNfcmVhZHkodm9pZCogdHNfaGFuZGxlKTsKLWV4dGVybiB2b2lkIHdtOTd4eF90c19zZXRfY2FsKHZvaWQqIHRzX2hhbmRsZSwgaW50IHhzY2FsZSwgaW50IHh0cmFucywgaW50IHlzY2FsZSwgaW50IHl0cmFucyk7Ci1leHRlcm4gdTE2IHdtOTd4eF90c19nZXRfYWM5Nyh2b2lkKiB0c19oYW5kbGUsIHU4IHJlZyk7Ci1leHRlcm4gdm9pZCB3bTk3eHhfdHNfc2V0X2FjOTcodm9pZCogdHNfaGFuZGxlLCB1OCByZWcsIHUxNiB2YWwpOwotZXh0ZXJuIGludCB3bTk3eHhfdHNfcmVhZF9kYXRhKHZvaWQqIHRzX2hhbmRsZSwgbG9uZyogeCwgbG9uZyogeSwgbG9uZyogcHJlc3N1cmUpOwotZXh0ZXJuIHZvaWQgd205N3h4X3RzX3NlbmRfZGF0YSh2b2lkKiB0c19oYW5kbGUsIGxvbmcgeCwgbG9uZyB5LCBsb25nIHopOwotCi1pbnQgd205N3h4X2NvbW9kdWxlX3ByZXNlbnQgPSAxOwotCi0KLSNkZWZpbmUgVFNfTkFNRSAibWlyYWdlX3RzIgotCi0jZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fRVJSIFRTX05BTUUgIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKLSNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyBUU19OQU1FICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCi0jZGVmaW5lIHdhcm4oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgVFNfTkFNRSAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQotI2RlZmluZSBEUFJJTlRLKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoIiVzOiAiIGZvcm1hdCAiXG4iLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmcpCi0KLQotI2RlZmluZSBQRU5fRE9XTl9JUlEJQVUxMDAwX0dQSU9fNwotCi1zdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICp0c190YXNrID0gMDsKLXN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04odHNfY29tcGxldGUpOwotc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHBlbmRvd25fd2FpdCk7Ci0KLSNpZmRlZiBDT05GSUdfV005N1hYX0ZJVkVXSVJFVFMKLXN0YXRpYyBpbnQgcmVsZWFzZV9wcmVzc3VyZSA9IDE7Ci0jZWxzZQotc3RhdGljIGludCByZWxlYXNlX3ByZXNzdXJlID0gNTA7Ci0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgbG9uZyB4OwotICAgbG9uZyB5OwotfSBET1dOX0VWRU5UOwotCi0jZGVmaW5lIFNBTVBMRV9SQVRFCTUwCS8qIHNhbXBsZXMgcGVyIHNlY29uZCAqLwotI2RlZmluZSBQRU5fREVCT1VOQ0UJNQkvKiBzYW1wbGVzIGZvciBzZXR0bGluZyAtIGZuIG9mIFNBTVBMRV9SQVRFICovCi0jZGVmaW5lIFBFTl9VUF9USU1FT1VUCTEwCS8qIGluIHNlY29uZHMgKi8KLSNkZWZpbmUgUEVOX1VQX1NFVFRMRQk1CS8qIHNhbXBsZXMgcGVyIHNlY29uZCAqLwotCi1zdGF0aWMgc3RydWN0IHsKLQlpbnQgeHNjYWxlOwotCWludCB4dHJhbnM7Ci0JaW50IHlzY2FsZTsKLQlpbnQgeXRyYW5zOwotfSBtaXJhZ2VfdHNfY2FsID0KLXsKLSNpZiAwCi0JLnhzY2FsZSAgID0gODQsCi0JLnh0cmFucyA9IC0xNTcsCi0JLnlzY2FsZSAgID0gNjYsCi0JLnl0cmFucyA9IC0xNTAsCi0jZWxzZQotCS54c2NhbGUgICA9IDg0LAotCS54dHJhbnMgPSAtMTUwLAotCS55c2NhbGUgICA9IDY2LAotCS55dHJhbnMgPSAtMTQ2LAotI2VuZGlmCi19OwotCi0KLXN0YXRpYyB2b2lkIHBlbmRvd25faXJxKGludCBpcnFuciwgdm9pZCAqZGV2aWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotLy9EUFJJTlRLKCJnb3Qgb25lIDB4JXgiLCBhdV9yZWFkbChTWVNfUElOU1RBVEVSRCkpOwotCXdha2VfdXAoJnBlbmRvd25fd2FpdCk7Ci19Ci0KLXN0YXRpYyBpbnQgdHNfdGhyZWFkKHZvaWQgKmlkKQotewotCXN0YXRpYyBpbnQgcGVuX3dhc19kb3duID0gMDsKLQlzdGF0aWMgRE9XTl9FVkVOVCBwZW5feHk7Ci0JbG9uZyB4LCB5LCB6OwotCXZvaWQgKnRzOwkvKiBoYW5kbGUgKi8KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7Ci0JaW50IHRpbWVvdXQgPSBIWiAvIFNBTVBMRV9SQVRFOwotCi0JdHNfdGFzayA9IHRzazsKLQotCWRhZW1vbml6ZSgpOwotCXRzay0+dHR5ID0gTlVMTDsKLQl0c2stPnBvbGljeSA9IFNDSEVEX0ZJRk87Ci0JdHNrLT5ydF9wcmlvcml0eSA9IDE7Ci0Jc3RyY3B5KHRzay0+Y29tbSwgInRvdWNoc2NyZWVuIik7Ci0KLQkvKiBvbmx5IHdhbnQgdG8gcmVjZWl2ZSBTSUdLSUxMICovCi0Jc3Bpbl9sb2NrX2lycSgmdHNrLT5zaWdtYXNrX2xvY2spOwotCXNpZ2luaXRzZXRpbnYoJnRzay0+YmxvY2tlZCwgc2lnbWFzayhTSUdLSUxMKSk7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcodHNrKTsKLQlzcGluX3VubG9ja19pcnEoJnRzay0+c2lnbWFza19sb2NrKTsKLQotCS8qIGdldCBoYW5kbGUgZm9yIGNvZGVjICovCi0JdHMgPSB3bTk3eHhfdHNfZ2V0X2hhbmRsZSgwKTsKLQotCS8qIHByb2NlZWQgb25seSBhZnRlciBldmVyeWJvZHkgaXMgcmVhZHkgKi8KLQl3YWl0X2V2ZW50X3RpbWVvdXQocGVuZG93bl93YWl0LCB3bTk3eHhfdHNfcmVhZHkodHMpLCBIWi80KTsKLQotCS8qIGJvYXJkLXNwZWNpZmljIGNhbGlicmF0aW9uICovCi0Jd205N3h4X3RzX3NldF9jYWwodHMsCi0JCQltaXJhZ2VfdHNfY2FsLnhzY2FsZSwKLQkJCW1pcmFnZV90c19jYWwueHRyYW5zLAotCQkJbWlyYWdlX3RzX2NhbC55c2NhbGUsCi0JCQltaXJhZ2VfdHNfY2FsLnl0cmFucyk7Ci0KLQkvKiByb3V0ZSBXb2xmc29uIHBlbmRvd24gaW50ZXJydXB0cyB0byBvdXIgR1BJTyAqLwotCWF1X3N5bmMoKTsKLQl3bTk3eHhfdHNfc2V0X2FjOTcodHMsIDB4NGMsIHdtOTd4eF90c19nZXRfYWM5Nyh0cywgMHg0YykgJiB+MHgwMDA4KTsKLQlhdV9zeW5jKCk7Ci0Jd205N3h4X3RzX3NldF9hYzk3KHRzLCAweDU2LCB3bTk3eHhfdHNfZ2V0X2FjOTcodHMsIDB4NTYpICYgfjB4MDAwOCk7Ci0JYXVfc3luYygpOwotCXdtOTd4eF90c19zZXRfYWM5Nyh0cywgMHg1Miwgd205N3h4X3RzX2dldF9hYzk3KHRzLCAweDUyKSB8IDB4MjAwOCk7Ci0JYXVfc3luYygpOwotCi0JZm9yICg7OykgewotCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJnBlbmRvd25fd2FpdCwgdGltZW91dCk7Ci0JCWRpc2FibGVfaXJxKFBFTl9ET1dOX0lSUSk7Ci0JCWlmIChzaWduYWxfcGVuZGluZyh0c2spKSB7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIHJlYWQgY29kZWMgKi8KLQkJaWYgKCF3bTk3eHhfdHNfcmVhZF9kYXRhKHRzLCAmeCwgJnksICZ6KSkKLQkJCXogPSAwOwkvKiB0cmVhdCBuby1kYXRhIGFuZCBwZW4tdXAgdGhlIHNhbWUgKi8KLQotCQlpZiAoc2lnbmFsX3BlbmRpbmcodHNrKSkgewotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoeiA+PSByZWxlYXNlX3ByZXNzdXJlKSB7Ci0JCQl5ID0gfnk7CS8qIHRvcCB0byBib3R0b20gKi8KLQkJCWlmIChwZW5fd2FzX2Rvd24gPiAxIC8qJiYgcGVuX3dhc19kb3duIDwgUEVOX0RFQk9VTkNFKi8pIHsvL1RIWFhYCi0JCQkJLyogYm91bmNlID8gKi8KLQkJCQl4ID0gcGVuX3h5Lng7Ci0JCQkJeSA9IHBlbl94eS55OwotCQkJCS0tcGVuX3dhc19kb3duOwotCQkJfSBlbHNlIGlmIChwZW5fd2FzX2Rvd24gPD0gMSkgewotCQkJCXBlbl94eS54ID0geDsKLQkJCQlwZW5feHkueSA9IHk7Ci0JCQkJaWYgKHBlbl93YXNfZG93bikKLQkJCQkJd205N3h4X3RzX3NlbmRfZGF0YSh0cywgeCwgeSwgeik7Ci0JCQkJcGVuX3dhc19kb3duID0gUEVOX0RFQk9VTkNFOwotCQkJfQotCQkJLy93bTk3eHhfdHNfc2VuZF9kYXRhKHRzLCB4LCB5LCB6KTsKLQkJCXRpbWVvdXQgPSBIWiAvIFNBTVBMRV9SQVRFOwotCQl9IGVsc2UgewotCQkJaWYgKHBlbl93YXNfZG93bikgewotCQkJCWlmICgtLXBlbl93YXNfZG93bikKLQkJCQkJeiA9IHJlbGVhc2VfcHJlc3N1cmU7Ci0JCQkJZWxzZSAvL1RIWFhYCi0JCQkJd205N3h4X3RzX3NlbmRfZGF0YSh0cywgcGVuX3h5LngsIHBlbl94eS55LCB6KTsKLQkJCX0KLQkJCS8qIFRoZSBwZW5kb3duIHNpZ25hbCB0YWtlcyBzb21lIHRpbWUgdG8gc2V0dGxlIGFmdGVyCi0JCQkgKiByZWFkaW5nIHRoZSBwZW4gcHJlc3N1cmUgc28gd2FpdCBhIGxpdHRsZQotCQkJICogYmVmb3JlIGVuYWJsaW5nIHRoZSBwZW4uCi0JCQkgKi8KLQkJCWlmICghIHBlbl93YXNfZG93bikgewotLy8JCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZwZW5kb3duX3dhaXQsIEhaIC8gUEVOX1VQX1NFVFRMRSk7Ci0JCQkJdGltZW91dCA9IEhaICogUEVOX1VQX1RJTUVPVVQ7Ci0JCQl9Ci0JCX0KLQkJZW5hYmxlX2lycShQRU5fRE9XTl9JUlEpOwotCX0KLQllbmFibGVfaXJxKFBFTl9ET1dOX0lSUSk7Ci0JdHNfdGFzayA9IE5VTEw7Ci0JY29tcGxldGUoJnRzX2NvbXBsZXRlKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgdHNfbWlyYWdlX2luaXQodm9pZCkKLXsKLQlpbnQgcmV0OwotCi0JLyogcGVuIGRvd24gc2lnbmFsIGlzIGNvbm5lY3RlZCB0byBHUElPIDcgKi8KLQotCXJldCA9IHJlcXVlc3RfaXJxKFBFTl9ET1dOX0lSUSwgcGVuZG93bl9pcnEsIDAsICJ0cy1wZW5kb3duIiwgTlVMTCk7Ci0JaWYgKHJldCkgewotCQllcnIoInVuYWJsZSB0byBnZXQgcGVuZG93biBpcnElZDogWyVkXSIsIFBFTl9ET1dOX0lSUSwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlsb2NrX2tlcm5lbCgpOwotCXJldCA9IGtlcm5lbF90aHJlYWQodHNfdGhyZWFkLCBOVUxMLCBDTE9ORV9GUyB8IENMT05FX0ZJTEVTKTsKLQlpZiAocmV0IDwgMCkgewotCQl1bmxvY2tfa2VybmVsKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXVubG9ja19rZXJuZWwoKTsKLQotCWluZm8oIk1pcmFnZSB0b3VjaHNjcmVlbiBJUlEgaW5pdGlhbGl6ZWQuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHRzX21pcmFnZV9leGl0KHZvaWQpCi17Ci0JaWYgKHRzX3Rhc2spIHsKLQkJc2VuZF9zaWcoU0lHS0lMTCwgdHNfdGFzaywgMSk7Ci0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJnRzX2NvbXBsZXRlKTsKLQl9Ci0KLQlmcmVlX2lycShQRU5fRE9XTl9JUlEsIE5VTEwpOwotfQotCi1tb2R1bGVfaW5pdCh0c19taXJhZ2VfaW5pdCk7Ci1tb2R1bGVfZXhpdCh0c19taXJhZ2VfZXhpdCk7Ci0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9iYXNsZXIvZXhjaXRlL2V4Y2l0ZV9kZXZpY2UuYyBiL2FyY2gvbWlwcy9iYXNsZXIvZXhjaXRlL2V4Y2l0ZV9kZXZpY2UuYwppbmRleCBiYmI0ZWE0Li5jYzFjZTc3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvYmFzbGVyL2V4Y2l0ZS9leGNpdGVfZGV2aWNlLmMKKysrIGIvYXJjaC9taXBzL2Jhc2xlci9leGNpdGUvZXhjaXRlX2RldmljZS5jCkBAIC02OCw3ICs2OCw3IEBACiAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZQotCWV4Y2l0ZV9jdHJfcmVzb3VyY2UgPSB7CisJZXhjaXRlX2N0cl9yZXNvdXJjZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IHsKIAkJLm5hbWUJCT0gIkdQSSBjb3VudGVycyIsCiAJCS5zdGFydAkJPSAwLAogCQkuZW5kCQk9IDUsCkBAIC03Nyw3ICs3Nyw3IEBACiAJCS5zaWJsaW5nCT0gTlVMTCwKIAkJLmNoaWxkCQk9IE5VTEwKIAl9LAotCWV4Y2l0ZV9ncGlzbGljZV9yZXNvdXJjZSA9IHsKKwlleGNpdGVfZ3Bpc2xpY2VfcmVzb3VyY2UgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgPSB7CiAJCS5uYW1lCQk9ICJHUEkgc2xpY2VzIiwKIAkJLnN0YXJ0CQk9IDAsCiAJCS5lbmQJCT0gMSwKQEAgLTg2LDcgKzg2LDcgQEAKIAkJLnNpYmxpbmcJPSBOVUxMLAogCQkuY2hpbGQJCT0gTlVMTAogCX0sCi0JZXhjaXRlX21kaW9fY2hhbm5lbF9yZXNvdXJjZSA9IHsKKwlleGNpdGVfbWRpb19jaGFubmVsX3Jlc291cmNlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gewogCQkubmFtZQkJPSAiTURJTyBjaGFubmVscyIsCiAJCS5zdGFydAkJPSAwLAogCQkuZW5kCQk9IDEsCkBAIC05NSw3ICs5NSw3IEBACiAJCS5zaWJsaW5nCT0gTlVMTCwKIAkJLmNoaWxkCQk9IE5VTEwKIAl9LAotCWV4Y2l0ZV9maWZvbWVtX3Jlc291cmNlID0geworCWV4Y2l0ZV9maWZvbWVtX3Jlc291cmNlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gewogCQkubmFtZQkJPSAiRklGTyBtZW1vcnkiLAogCQkuc3RhcnQJCT0gMCwKIAkJLmVuZAkJPSA3NjcsCkBAIC0xMDQsNyArMTA0LDcgQEAKIAkJLnNpYmxpbmcJPSBOVUxMLAogCQkuY2hpbGQJCT0gTlVMTAogCX0sCi0JZXhjaXRlX3NjcmFtX3Jlc291cmNlID0geworCWV4Y2l0ZV9zY3JhbV9yZXNvdXJjZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IHsKIAkJLm5hbWUJCT0gIlNjcmF0Y2ggUkFNIiwKIAkJLnN0YXJ0CQk9IEVYQ0lURV9QSFlTX1NDUkFNLAogCQkuZW5kCQk9IEVYQ0lURV9QSFlTX1NDUkFNICsgRVhDSVRFX1NJWkVfU0NSQU0gLSAxLApAQCAtMTEzLDcgKzExMyw3IEBACiAJCS5zaWJsaW5nCT0gTlVMTCwKIAkJLmNoaWxkCQk9IE5VTEwKIAl9LAotCWV4Y2l0ZV9mcGdhX3Jlc291cmNlID0geworCWV4Y2l0ZV9mcGdhX3Jlc291cmNlIF9fYXR0cmlidXRlX18oKHVudXNlZCkpID0gewogCQkubmFtZQkJPSAiU3lzdGVtIEZQR0EiLAogCQkuc3RhcnQJCT0gRVhDSVRFX1BIWVNfRlBHQSwKIAkJLmVuZAkJPSBFWENJVEVfUEhZU19GUEdBICsgRVhDSVRFX1NJWkVfRlBHQSAtIDEsCkBAIC0xMjIsNyArMTIyLDcgQEAKIAkJLnNpYmxpbmcJPSBOVUxMLAogCQkuY2hpbGQJCT0gTlVMTAogCX0sCi0JZXhjaXRlX25hbmRfcmVzb3VyY2UgPSB7CisJZXhjaXRlX25hbmRfcmVzb3VyY2UgX19hdHRyaWJ1dGVfXygodW51c2VkKSkgPSB7CiAJCS5uYW1lCQk9ICJOQU5EIGZsYXNoIGNvbnRyb2wiLAogCQkuc3RhcnQJCT0gRVhDSVRFX1BIWVNfTkFORCwKIAkJLmVuZAkJPSBFWENJVEVfUEhZU19OQU5EICsgRVhDSVRFX1NJWkVfTkFORCAtIDEsCkBAIC0xMzEsNyArMTMxLDcgQEAKIAkJLnNpYmxpbmcJPSBOVUxMLAogCQkuY2hpbGQJCT0gTlVMTAogCX0sCi0JZXhjaXRlX3RpdGFuX3Jlc291cmNlID0geworCWV4Y2l0ZV90aXRhbl9yZXNvdXJjZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IHsKIAkJLm5hbWUJCT0gIlRJVEFOIHJlZ2lzdGVycyIsCiAJCS5zdGFydAkJPSBFWENJVEVfUEhZU19USVRBTiwKIAkJLmVuZAkJPSBFWENJVEVfUEhZU19USVRBTiArIEVYQ0lURV9TSVpFX1RJVEFOIC0gMSwKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2F0bGFzX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2F0bGFzX2RlZmNvbmZpZwppbmRleCA1NDI3NDA2Li5kMzcwNTI4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9hdGxhc19kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvYXRsYXNfZGVmY29uZmlnCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKQEAgLTExOTMsNyArMTE5Miw3IEBACiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQogIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvYmlnc3VyX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2JpZ3N1cl9kZWZjb25maWcKaW5kZXggODg3ZmQ5NS4uZTEyYTQ3NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvYmlnc3VyX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9iaWdzdXJfZGVmY29uZmlnCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2NhcGNlbGxhX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2NhcGNlbGxhX2RlZmNvbmZpZwppbmRleCBhMDEzNDRmLi5iZmFkZTlhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9jYXBjZWxsYV9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvY2FwY2VsbGFfZGVmY29uZmlnCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2NvYmFsdF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9jb2JhbHRfZGVmY29uZmlnCmluZGV4IGM5NTY4MjQuLjRiYWYyZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2NvYmFsdF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvY29iYWx0X2RlZmNvbmZpZwpAQCAtMjUsNyArMjUsNiBAQAogQ09ORklHX01JUFNfQ09CQUxUPXkKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApAQCAtODI4LDcgKzgyNyw3IEBACiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQogIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMDAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTAwMF9kZWZjb25maWcKaW5kZXggYzJmMzNkMy4uOTNjY2ExNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMDAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9kYjEwMDBfZGVmY29uZmlnCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2RiMTEwMF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9kYjExMDBfZGVmY29uZmlnCmluZGV4IDhjNDRkMTYuLmZmZDk5MjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2RiMTEwMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMTAwX2RlZmNvbmZpZwpAQCAtMjUsNyArMjUsNiBAQAogIyBDT05GSUdfTUlQU19DT0JBTFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9ERUNTVEFUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfRVY2NDEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0VWOTYxMDAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVlIgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVEU4MTcyIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfSkFaWiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9kYjEyMDBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxMjAwX2RlZmNvbmZpZwppbmRleCBjMTM3NjhlLi42M2VhYzVlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9kYjEyMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTIwMF9kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxNTAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RiMTUwMF9kZWZjb25maWcKaW5kZXggOGFlYTczZi4uMjVhMDk1ZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZGIxNTAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9kYjE1MDBfZGVmY29uZmlnCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2RiMTU1MF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9kYjE1NTBfZGVmY29uZmlnCmluZGV4IDkwY2NiNzMuLmRkYTQ2OWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2RiMTU1MF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGIxNTUwX2RlZmNvbmZpZwpAQCAtMjUsNyArMjUsNiBAQAogIyBDT05GSUdfTUlQU19DT0JBTFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9ERUNTVEFUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfRVY2NDEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0VWOTYxMDAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVlIgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVEU4MTcyIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfSkFaWiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9kZGI1NDc3X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2RkYjU0NzdfZGVmY29uZmlnCmluZGV4IGI1OThjZjAuLmZjZDNkZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2RkYjU0NzdfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2RkYjU0NzdfZGVmY29uZmlnCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2RlY3N0YXRpb25fZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGVjc3RhdGlvbl9kZWZjb25maWcKaW5kZXggNTk3MTUwYi4uODY4M2UwZCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZGVjc3RhdGlvbl9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvZGVjc3RhdGlvbl9kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKIENPTkZJR19NQUNIX0RFQ1NUQVRJT049eQogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2U1NV9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9lNTVfZGVmY29uZmlnCmluZGV4IGZhMjk5NmIuLjRhY2U2MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2U1NV9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvZTU1X2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOC1yYzEKLSMgVGh1IEp1bCAgNiAxMDowNDowMiAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTgtcmMyCisjIFR1ZSBKdWwgMjUgMjM6MTU6MDMgMjAwNgogIwogQ09ORklHX01JUFM9eQogCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKQEAgLTIyNyw3ICsyMjYsNiBAQAogIwogIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CiAjCi0jIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAogCiAjCiAjIFBDSSBIb3RwbHVnIFN1cHBvcnQKQEAgLTI1NCw3ICsyNTIsNiBAQAogIwogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU19IWVBFUlZJU09SIGlzIG5vdCBzZXQKIAogIwpAQCAtMjg0LDYgKzI4MSw3IEBACiBDT05GSUdfQkxLX0RFVl9SQU09bQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CitDT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKICMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogCkBAIC02NDMsNiArNjQxLDcgQEAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKICMgQ09ORklHX01BR0lDX1NZU1JRIGlzIG5vdCBzZXQKICMgQ09ORklHX1VOVVNFRF9TWU1CT0xTIGlzIG5vdCBzZXQKQEAgLTY1MCw3ICs2NDksNyBAQAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19DUk9TU0NPTVBJTEU9eQotQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5VlIwLDE5MjAwIG1lbT04TSIKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVZSMCwxOTIwMCBpZGUwPTB4MWYwLDB4M2Y2LDQwIG1lbT04TSIKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9lbW1hMnJoX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL2VtbWEycmhfZGVmY29uZmlnCmluZGV4IDM3NWIyYWMuLjU4NDdjOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2VtbWEycmhfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2VtbWEycmhfZGVmY29uZmlnCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2V2NjQxMjBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZXY2NDEyMF9kZWZjb25maWcKaW5kZXggYjBhZmMxMS4uYmM0YzRmMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZXY2NDEyMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvZXY2NDEyMF9kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiBDT05GSUdfTUlQU19FVjY0MTIwPXkKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2V2OTYxMDBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZXY5NjEwMF9kZWZjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZGMxMGYuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvZXY5NjEwMF9kZWZjb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw4NTAgKzAsMCBAQAotIwotIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE4LXJjMQotIyBUaHUgSnVsICA2IDEwOjA0OjA1IDIwMDYKLSMKLUNPTkZJR19NSVBTPXkKLQotIwotIyBNYWNoaW5lIHNlbGVjdGlvbgotIwotIyBDT05GSUdfTUlQU19NVFgxIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfQk9TUE9SVVMgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19QQjEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19QQjExMDAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19QQjE1MDAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19QQjE1NTAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19QQjEyMDAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19EQjEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19EQjExMDAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19EQjE1MDAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19EQjE1NTAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19EQjEyMDAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19NSVJBR0UgaXMgbm90IHNldAotIyBDT05GSUdfQkFTTEVSX0VYQ0lURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLUNPTkZJR19NSVBTX0VWOTYxMDA9eQotIyBDT05GSUdfTUlQU19JVlIgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19JVEU4MTcyIGlzIG5vdCBzZXQKLSMgQ09ORklHX01BQ0hfSkFaWiBpcyBub3Qgc2V0Ci0jIENPTkZJR19MQVNBVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0FUTEFTIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfTUFMVEEgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19TRUFEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1dSX1BQTUMgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19TSU0gaXMgbm90IHNldAotIyBDT05GSUdfTU9NRU5DT19KQUdVQVJfQVRYIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PTUVOQ09fT0NFTE9UIGlzIG5vdCBzZXQKLSMgQ09ORklHX01PTUVOQ09fT0NFTE9UXzMgaXMgbm90IHNldAotIyBDT05GSUdfTU9NRU5DT19PQ0VMT1RfQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NT01FTkNPX09DRUxPVF9HIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfWFhTMTUwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QTlg4NTUwX1YyUENJIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BOWDg1NTBfSkJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0REQjU0NzcgaXMgbm90IHNldAotIyBDT05GSUdfTUFDSF9WUjQxWFggaXMgbm90IHNldAotIyBDT05GSUdfUE1DX1lPU0VNSVRFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1FFTVUgaXMgbm90IHNldAotIyBDT05GSUdfTUFSS0VJTlMgaXMgbm90IHNldAotIyBDT05GSUdfU0dJX0lQMjIgaXMgbm90IHNldAotIyBDT05GSUdfU0dJX0lQMjcgaXMgbm90IHNldAotIyBDT05GSUdfU0dJX0lQMzIgaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX0JJR1NVUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSUJZVEVfU1dBUk0gaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX1NFTlRPU0EgaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX1JIT05FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJQllURV9DQVJNRUwgaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX1BUU1dBUk0gaXMgbm90IHNldAotIyBDT05GSUdfU0lCWVRFX0xJVFRMRVNVUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSUJZVEVfQ1JISU5FIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NJQllURV9DUkhPTkUgaXMgbm90IHNldAotIyBDT05GSUdfU05JX1JNMjAwX1BDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19UT1NISUJBX0pNUjM5MjcgaXMgbm90IHNldAotIyBDT05GSUdfVE9TSElCQV9SQlRYNDkyNyBpcyBub3Qgc2V0Ci0jIENPTkZJR19UT1NISUJBX1JCVFg0OTM4IGlzIG5vdCBzZXQKLUNPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKLUNPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQotQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15Ci1DT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQotQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15Ci1DT05GSUdfRE1BX05PTkNPSEVSRU5UPXkKLUNPTkZJR19ETUFfTkVFRF9QQ0lfTUFQX1NUQVRFPXkKLUNPTkZJR19DUFVfQklHX0VORElBTj15Ci0jIENPTkZJR19DUFVfTElUVExFX0VORElBTiBpcyBub3Qgc2V0Ci1DT05GSUdfU1lTX1NVUFBPUlRTX0JJR19FTkRJQU49eQotQ09ORklHX0lSUV9DUFU9eQotQ09ORklHX01JUFNfR1Q2NDEyMD15Ci1DT05GSUdfU1dBUF9JT19TUEFDRT15Ci1DT05GSUdfTUlQU19HVDk2MTAwPXkKLUNPTkZJR19NSVBTX0wxX0NBQ0hFX1NISUZUPTUKLQotIwotIyBDUFUgc2VsZWN0aW9uCi0jCi0jIENPTkZJR19DUFVfTUlQUzMyX1IxIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9NSVBTMzJfUjIgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX01JUFM2NF9SMSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfTUlQUzY0X1IyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SMzAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfVFgzOVhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9WUjQxWFggaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1I0MzAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SNFgwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfVFg0OVhYIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SNTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfUjU0MzIgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1I2MDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9ORVZBREEgaXMgbm90IHNldAotIyBDT05GSUdfQ1BVX1I4MDAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NQVV9SMTAwMDAgaXMgbm90IHNldAotQ09ORklHX0NQVV9STTcwMDA9eQotIyBDT05GSUdfQ1BVX1JNOTAwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUFVfU0IxIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNfSEFTX0NQVV9SNTAwMD15Ci1DT05GSUdfU1lTX0hBU19DUFVfUk03MDAwPXkKLUNPTkZJR19TWVNfU1VQUE9SVFNfMzJCSVRfS0VSTkVMPXkKLUNPTkZJR19TWVNfU1VQUE9SVFNfNjRCSVRfS0VSTkVMPXkKLUNPTkZJR19DUFVfU1VQUE9SVFNfMzJCSVRfS0VSTkVMPXkKLUNPTkZJR19DUFVfU1VQUE9SVFNfNjRCSVRfS0VSTkVMPXkKLQotIwotIyBLZXJuZWwgdHlwZQotIwotQ09ORklHXzMyQklUPXkKLSMgQ09ORklHXzY0QklUIGlzIG5vdCBzZXQKLUNPTkZJR19QQUdFX1NJWkVfNEtCPXkKLSMgQ09ORklHX1BBR0VfU0laRV84S0IgaXMgbm90IHNldAotIyBDT05GSUdfUEFHRV9TSVpFXzE2S0IgaXMgbm90IHNldAotIyBDT05GSUdfUEFHRV9TSVpFXzY0S0IgaXMgbm90IHNldAotQ09ORklHX0JPQVJEX1NDQUNIRT15Ci1DT05GSUdfUk03MDAwX0NQVV9TQ0FDSEU9eQotQ09ORklHX0NQVV9IQVNfUFJFRkVUQ0g9eQotQ09ORklHX01JUFNfTVRfRElTQUJMRUQ9eQotIyBDT05GSUdfTUlQU19NVF9TTVRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfTVRfU01QIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfVlBFX0xPQURFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR182NEJJVF9QSFlTX0FERFIgaXMgbm90IHNldAotQ09ORklHX0NQVV9IQVNfTExTQz15Ci1DT05GSUdfQ1BVX0hBU19TWU5DPXkKLUNPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKLUNPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15Ci1DT05GSUdfQ1BVX1NVUFBPUlRTX0hJR0hNRU09eQotQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQotQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQotQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKLSMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAotIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0Ci1DT05GSUdfRkxBVE1FTT15Ci1DT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQotIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0Ci1DT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAotIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0haXzQ4IGlzIG5vdCBzZXQKLSMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19IWl8xMjggaXMgbm90IHNldAotIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0haXzI1NiBpcyBub3Qgc2V0Ci1DT05GSUdfSFpfMTAwMD15Ci0jIENPTkZJR19IWl8xMDI0IGlzIG5vdCBzZXQKLUNPTkZJR19TWVNfU1VQUE9SVFNfQVJCSVRfSFo9eQotQ09ORklHX0haPTEwMDAKLUNPTkZJR19QUkVFTVBUX05PTkU9eQotIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAotIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0Ci1DT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgotCi0jCi0jIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucwotIwotQ09ORklHX0VYUEVSSU1FTlRBTD15Ci1DT05GSUdfQlJPS0VOX09OX1NNUD15Ci1DT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCi0KLSMKLSMgR2VuZXJhbCBzZXR1cAotIwotQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgotQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKLUNPTkZJR19TV0FQPXkKLUNPTkZJR19TWVNWSVBDPXkKLSMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKLUNPTkZJR19TWVNDVEw9eQotIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAotIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAotQ09ORklHX1JFTEFZPXkKLUNPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCi0jIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0Ci1DT05GSUdfRU1CRURERUQ9eQotQ09ORklHX0tBTExTWU1TPXkKLSMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAotIyBDT05GSUdfSE9UUExVRyBpcyBub3Qgc2V0Ci1DT05GSUdfUFJJTlRLPXkKLUNPTkZJR19CVUc9eQotQ09ORklHX0VMRl9DT1JFPXkKLUNPTkZJR19CQVNFX0ZVTEw9eQotQ09ORklHX1JUX01VVEVYRVM9eQotQ09ORklHX0ZVVEVYPXkKLUNPTkZJR19FUE9MTD15Ci1DT05GSUdfU0hNRU09eQotQ09ORklHX1NMQUI9eQotQ09ORklHX1ZNX0VWRU5UX0NPVU5URVJTPXkKLSMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAotQ09ORklHX0JBU0VfU01BTEw9MAotIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0Ci0KLSMKLSMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKLSMKLUNPTkZJR19NT0RVTEVTPXkKLUNPTkZJR19NT0RVTEVfVU5MT0FEPXkKLSMgQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQgaXMgbm90IHNldAotQ09ORklHX01PRFZFUlNJT05TPXkKLUNPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEw9eQotIyBDT05GSUdfS01PRCBpcyBub3Qgc2V0Ci0KLSMKLSMgQmxvY2sgbGF5ZXIKLSMKLSMgQ09ORklHX0xCRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0xTRiBpcyBub3Qgc2V0Ci0KLSMKLSMgSU8gU2NoZWR1bGVycwotIwotQ09ORklHX0lPU0NIRURfTk9PUD15Ci1DT05GSUdfSU9TQ0hFRF9BUz15Ci1DT05GSUdfSU9TQ0hFRF9ERUFETElORT15Ci1DT05GSUdfSU9TQ0hFRF9DRlE9eQotQ09ORklHX0RFRkFVTFRfQVM9eQotIyBDT05GSUdfREVGQVVMVF9ERUFETElORSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAotQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iYW50aWNpcGF0b3J5IgotCi0jCi0jIEJ1cyBvcHRpb25zIChQQ0ksIFBDTUNJQSwgRUlTQSwgSVNBLCBUQykKLSMKLUNPTkZJR19IV19IQVNfUENJPXkKLSMgQ09ORklHX1BDSSBpcyBub3Qgc2V0Ci1DT05GSUdfTU1VPXkKLQotIwotIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0Ci0jCi0jIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAotCi0jCi0jIFBDSSBIb3RwbHVnIFN1cHBvcnQKLSMKLQotIwotIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cwotIwotQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAotQ09ORklHX1RSQURfU0lHTkFMUz15Ci0KLSMKLSMgTmV0d29ya2luZwotIwotQ09ORklHX05FVD15Ci0KLSMKLSMgTmV0d29ya2luZyBvcHRpb25zCi0jCi0jIENPTkZJR19ORVRERUJVRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QQUNLRVQgaXMgbm90IHNldAotQ09ORklHX1VOSVg9eQotQ09ORklHX1hGUk09eQotQ09ORklHX1hGUk1fVVNFUj1tCi1DT05GSUdfTkVUX0tFWT15Ci1DT05GSUdfSU5FVD15Ci0jIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldAotIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9GSUJfSEFTSD15Ci1DT05GSUdfSVBfUE5QPXkKLSMgQ09ORklHX0lQX1BOUF9ESENQIGlzIG5vdCBzZXQKLUNPTkZJR19JUF9QTlBfQk9PVFA9eQotIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FSUEQgaXMgbm90IHNldAotIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKLUNPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9bQotQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD1tCi1DT05GSUdfSU5FVF9ESUFHPXkKLUNPTkZJR19JTkVUX1RDUF9ESUFHPXkKLSMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19UQ1BfQ09OR19CSUM9eQotIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAotQ09ORklHX05FVFdPUktfU0VDTUFSSz15Ci0jIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAotCi0jCi0jIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQotIwotIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0Ci0KLSMKLSMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCi0jCi0jIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKLQotIwotIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKLSMKLSMgQ09ORklHX1RJUEMgaXMgbm90IHNldAotIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKLSMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lQWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19YMjUgaXMgbm90IHNldAotIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKLQotIwotIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKLSMKLSMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0Ci0KLSMKLSMgTmV0d29yayB0ZXN0aW5nCi0jCi0jIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lSREEgaXMgbm90IHNldAotIyBDT05GSUdfQlQgaXMgbm90IHNldAotQ09ORklHX0lFRUU4MDIxMT1tCi0jIENPTkZJR19JRUVFODAyMTFfREVCVUcgaXMgbm90IHNldAotQ09ORklHX0lFRUU4MDIxMV9DUllQVF9XRVA9bQotQ09ORklHX0lFRUU4MDIxMV9DUllQVF9DQ01QPW0KLUNPTkZJR19JRUVFODAyMTFfU09GVE1BQz1tCi0jIENPTkZJR19JRUVFODAyMTFfU09GVE1BQ19ERUJVRyBpcyBub3Qgc2V0Ci1DT05GSUdfV0lSRUxFU1NfRVhUPXkKLQotIwotIyBEZXZpY2UgRHJpdmVycwotIwotCi0jCi0jIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKLSMKLUNPTkZJR19TVEFOREFMT05FPXkKLUNPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKLSMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0Ci0KLSMKLSMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgotIwotQ09ORklHX0NPTk5FQ1RPUj1tCi0KLSMKLSMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQotIwotIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKLQotIwotIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKLSMKLSMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAotCi0jCi0jIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAotIwotCi0jCi0jIEJsb2NrIGRldmljZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0xPT1AgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9SQU0gaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAotQ09ORklHX0NEUk9NX1BLVENEVkQ9bQotQ09ORklHX0NEUk9NX1BLVENEVkRfQlVGRkVSUz04Ci0jIENPTkZJR19DRFJPTV9QS1RDRFZEX1dDQUNIRSBpcyBub3Qgc2V0Ci1DT05GSUdfQVRBX09WRVJfRVRIPW0KLQotIwotIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0Ci0jCi0jIENPTkZJR19JREUgaXMgbm90IHNldAotCi0jCi0jIFNDU0kgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19SQUlEX0FUVFJTPW0KLSMgQ09ORklHX1NDU0kgaXMgbm90IHNldAotCi0jCi0jIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCi0jCi0jIENPTkZJR19NRCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAotIwotIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKLQotIwotIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0Ci0jCi0KLSMKLSMgSTJPIGRldmljZSBzdXBwb3J0Ci0jCi0KLSMKLSMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAotIwotQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAotIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0Ci0jIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAotIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKLQotIwotIyBQSFkgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19QSFlMSUI9bQotCi0jCi0jIE1JSSBQSFkgZGV2aWNlIGRyaXZlcnMKLSMKLUNPTkZJR19NQVJWRUxMX1BIWT1tCi1DT05GSUdfREFWSUNPTV9QSFk9bQotQ09ORklHX1FTRU1JX1BIWT1tCi1DT05GSUdfTFhUX1BIWT1tCi1DT05GSUdfQ0lDQURBX1BIWT1tCi1DT05GSUdfVklURVNTRV9QSFk9bQotQ09ORklHX1NNU0NfUEhZPW0KLQotIwotIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKLSMKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKLUNPTkZJR19NSVBTX0dUOTYxMDBFVEg9eQotIyBDT05GSUdfRE05MDAwIGlzIG5vdCBzZXQKLQotIwotIyBFdGhlcm5ldCAoMTAwMCBNYml0KQotIwotCi0jCi0jIEV0aGVybmV0ICgxMDAwMCBNYml0KQotIwotCi0jCi0jIFRva2VuIFJpbmcgZGV2aWNlcwotIwotCi0jCi0jIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQotIwotIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKLQotIwotIyBXYW4gaW50ZXJmYWNlcwotIwotIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTElQIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKLSMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAotIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0Ci0KLSMKLSMgSVNETiBzdWJzeXN0ZW0KLSMKLSMgQ09ORklHX0lTRE4gaXMgbm90IHNldAotCi0jCi0jIFRlbGVwaG9ueSBTdXBwb3J0Ci0jCi0jIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0Ci0KLSMKLSMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKLSMKLUNPTkZJR19JTlBVVD15Ci0KLSMKLSMgVXNlcmxhbmQgaW50ZXJmYWNlcwotIwotQ09ORklHX0lOUFVUX01PVVNFREVWPXkKLUNPTkZJR19JTlBVVF9NT1VTRURFVl9QU0FVWD15Ci1DT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1g9MTAyNAotQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9ZPTc2OAotIyBDT05GSUdfSU5QVVRfSk9ZREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX1RTREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWREVWIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKLQotIwotIyBJbnB1dCBEZXZpY2UgRHJpdmVycwotIwotIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAotIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgSS9PIHBvcnRzCi0jCi1DT05GSUdfU0VSSU89eQotIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAotQ09ORklHX1NFUklPX1NFUlBPUlQ9eQotIyBDT05GSUdfU0VSSU9fTElCUFMyIGlzIG5vdCBzZXQKLUNPTkZJR19TRVJJT19SQVc9bQotIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAotCi0jCi0jIENoYXJhY3RlciBkZXZpY2VzCi0jCi1DT05GSUdfVlQ9eQotQ09ORklHX1ZUX0NPTlNPTEU9eQotQ09ORklHX0hXX0NPTlNPTEU9eQotQ09ORklHX1ZUX0hXX0NPTlNPTEVfQklORElORz15Ci0jIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAotCi0jCi0jIFNlcmlhbCBkcml2ZXJzCi0jCi1DT05GSUdfU0VSSUFMXzgyNTA9eQotQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQotQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKLUNPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKLSMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKLQotIwotIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0Ci0jCi1DT05GSUdfU0VSSUFMX0NPUkU9eQotQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQotQ09ORklHX1VOSVg5OF9QVFlTPXkKLUNPTkZJR19MRUdBQ1lfUFRZUz15Ci1DT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKLQotIwotIyBJUE1JCi0jCi0jIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAotCi0jCi0jIFdhdGNoZG9nIENhcmRzCi0jCi0jIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV19SQU5ET00gaXMgbm90IHNldAotIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKLSMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAotIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCi0jIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKLQotIwotIyBUUE0gZGV2aWNlcwotIwotIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0Ci0KLSMKLSMgSTJDIHN1cHBvcnQKLSMKLSMgQ09ORklHX0kyQyBpcyBub3Qgc2V0Ci0KLSMKLSMgU1BJIHN1cHBvcnQKLSMKLSMgQ09ORklHX1NQSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKLQotIwotIyBEYWxsYXMncyAxLXdpcmUgYnVzCi0jCi0jIENPTkZJR19XMSBpcyBub3Qgc2V0Ci0KLSMKLSMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0Ci0jCi0jIENPTkZJR19IV01PTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAotCi0jCi0jIE1pc2MgZGV2aWNlcwotIwotCi0jCi0jIE11bHRpbWVkaWEgZGV2aWNlcwotIwotIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKLUNPTkZJR19WSURFT19WNEwyPXkKLQotIwotIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCi0jCi0jIENPTkZJR19EVkIgaXMgbm90IHNldAotCi0jCi0jIEdyYXBoaWNzIHN1cHBvcnQKLSMKLSMgQ09ORklHX0ZJUk1XQVJFX0VESUQgaXMgbm90IHNldAotIyBDT05GSUdfRkIgaXMgbm90IHNldAotCi0jCi0jIENvbnNvbGUgZGlzcGxheSBkcml2ZXIgc3VwcG9ydAotIwotIyBDT05GSUdfVkdBX0NPTlNPTEUgaXMgbm90IHNldAotQ09ORklHX0RVTU1ZX0NPTlNPTEU9eQotCi0jCi0jIFNvdW5kCi0jCi0jIENPTkZJR19TT1VORCBpcyBub3Qgc2V0Ci0KLSMKLSMgVVNCIHN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9BUkNIX0hBU19IQ0QgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0kgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0kgaXMgbm90IHNldAotCi0jCi0jIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKLSMKLQotIwotIyBVU0IgR2FkZ2V0IFN1cHBvcnQKLSMKLSMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAotCi0jCi0jIE1NQy9TRCBDYXJkIHN1cHBvcnQKLSMKLSMgQ09ORklHX01NQyBpcyBub3Qgc2V0Ci0KLSMKLSMgTEVEIGRldmljZXMKLSMKLSMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKLQotIwotIyBMRUQgZHJpdmVycwotIwotCi0jCi0jIExFRCBUcmlnZ2VycwotIwotCi0jCi0jIEluZmluaUJhbmQgc3VwcG9ydAotIwotCi0jCi0jIEVEQUMgLSBlcnJvciBkZXRlY3Rpb24gYW5kIHJlcG9ydGluZyAoUkFTKSAoRVhQRVJJTUVOVEFMKQotIwotCi0jCi0jIFJlYWwgVGltZSBDbG9jawotIwotIyBDT05GSUdfUlRDX0NMQVNTIGlzIG5vdCBzZXQKLQotIwotIyBETUEgRW5naW5lIHN1cHBvcnQKLSMKLSMgQ09ORklHX0RNQV9FTkdJTkUgaXMgbm90IHNldAotCi0jCi0jIERNQSBDbGllbnRzCi0jCi0KLSMKLSMgRE1BIERldmljZXMKLSMKLQotIwotIyBGaWxlIHN5c3RlbXMKLSMKLUNPTkZJR19FWFQyX0ZTPXkKLSMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAotIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAotIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKLSMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0Ci1DT05GSUdfSU5PVElGWT15Ci1DT05GSUdfSU5PVElGWV9VU0VSPXkKLSMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKLUNPTkZJR19ETk9USUZZPXkKLSMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19GVVNFX0ZTPW0KLQotIwotIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0Ci0KLSMKLSMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcwotIwotIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBQc2V1ZG8gZmlsZXN5c3RlbXMKLSMKLUNPTkZJR19QUk9DX0ZTPXkKLUNPTkZJR19QUk9DX0tDT1JFPXkKLUNPTkZJR19TWVNGUz15Ci0jIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAotQ09ORklHX1JBTUZTPXkKLSMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCi0jCi0jIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAotIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKLQotIwotIyBOZXR3b3JrIEZpbGUgU3lzdGVtcwotIwotQ09ORklHX05GU19GUz15Ci0jIENPTkZJR19ORlNfVjMgaXMgbm90IHNldAotIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKLUNPTkZJR19ST09UX05GUz15Ci1DT05GSUdfTE9DS0Q9eQotQ09ORklHX05GU19DT01NT049eQotQ09ORklHX1NVTlJQQz15Ci0jIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAotIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX0RFQlVHMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAotIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAotCi0jCi0jIFBhcnRpdGlvbiBUeXBlcwotIwotIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKLUNPTkZJR19NU0RPU19QQVJUSVRJT049eQotCi0jCi0jIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0Ci0jCi0jIENPTkZJR19OTFMgaXMgbm90IHNldAotCi0jCi0jIFByb2ZpbGluZyBzdXBwb3J0Ci0jCi0jIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAotCi0jCi0jIEtlcm5lbCBoYWNraW5nCi0jCi0jIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAotQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKLSMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKLUNPTkZJR19DUk9TU0NPTVBJTEU9eQotQ09ORklHX0NNRExJTkU9IiIKLQotIwotIyBTZWN1cml0eSBvcHRpb25zCi0jCi1DT05GSUdfS0VZUz15Ci1DT05GSUdfS0VZU19ERUJVR19QUk9DX0tFWVM9eQotIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAotCi0jCi0jIENyeXB0b2dyYXBoaWMgb3B0aW9ucwotIwotQ09ORklHX0NSWVBUTz15Ci1DT05GSUdfQ1JZUFRPX0hNQUM9eQotQ09ORklHX0NSWVBUT19OVUxMPW0KLUNPTkZJR19DUllQVE9fTUQ0PW0KLUNPTkZJR19DUllQVE9fTUQ1PW0KLUNPTkZJR19DUllQVE9fU0hBMT1tCi1DT05GSUdfQ1JZUFRPX1NIQTI1Nj1tCi1DT05GSUdfQ1JZUFRPX1NIQTUxMj1tCi1DT05GSUdfQ1JZUFRPX1dQNTEyPW0KLUNPTkZJR19DUllQVE9fVEdSMTkyPW0KLUNPTkZJR19DUllQVE9fREVTPW0KLUNPTkZJR19DUllQVE9fQkxPV0ZJU0g9bQotQ09ORklHX0NSWVBUT19UV09GSVNIPW0KLUNPTkZJR19DUllQVE9fU0VSUEVOVD1tCi1DT05GSUdfQ1JZUFRPX0FFUz1tCi1DT05GSUdfQ1JZUFRPX0NBU1Q1PW0KLUNPTkZJR19DUllQVE9fQ0FTVDY9bQotQ09ORklHX0NSWVBUT19URUE9bQotQ09ORklHX0NSWVBUT19BUkM0PW0KLUNPTkZJR19DUllQVE9fS0hBWkFEPW0KLUNPTkZJR19DUllQVE9fQU5VQklTPW0KLUNPTkZJR19DUllQVE9fREVGTEFURT1tCi1DT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDPW0KLUNPTkZJR19DUllQVE9fQ1JDMzJDPW0KLSMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKLQotIwotIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcwotIwotCi0jCi0jIExpYnJhcnkgcm91dGluZXMKLSMKLSMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0Ci1DT05GSUdfQ1JDMTY9bQotQ09ORklHX0NSQzMyPW0KLUNPTkZJR19MSUJDUkMzMkM9bQotQ09ORklHX1pMSUJfSU5GTEFURT1tCi1DT05GSUdfWkxJQl9ERUZMQVRFPW0KLUNPTkZJR19QTElTVD15CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9leGNpdGVfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvZXhjaXRlX2RlZmNvbmZpZwppbmRleCAwNDVlYmQwLi5lYjg3Y2JiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9leGNpdGVfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2V4Y2l0ZV9kZWZjb25maWcKQEAgLTI2LDcgKzI2LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvaXAyMl9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9pcDIyX2RlZmNvbmZpZwppbmRleCBlZjE2ZDFmLi5jYzliMjRlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9pcDIyX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9pcDIyX2RlZmNvbmZpZwpAQCAtMjUsNyArMjUsNiBAQAogIyBDT05GSUdfTUlQU19DT0JBTFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9ERUNTVEFUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfRVY2NDEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0VWOTYxMDAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVlIgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVEU4MTcyIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfSkFaWiBpcyBub3Qgc2V0CkBAIC0xMDEzLDcgKzEwMTIsNyBAQAogQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1BST0NfS0NPUkU9eQogQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKICMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2lwMjdfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvaXAyN19kZWZjb25maWcKaW5kZXggNGJmMWVlNy4uNTAwOTJiYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvaXAyN19kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvaXAyN19kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApAQCAtOTAwLDcgKzg5OSw3IEBACiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQogIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvaXAzMl9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9pcDMyX2RlZmNvbmZpZwppbmRleCBmODNkYzA5Li5kZWMyYmE2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9pcDMyX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9pcDMyX2RlZmNvbmZpZwpAQCAtMjUsNyArMjUsNiBAQAogIyBDT05GSUdfTUlQU19DT0JBTFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9ERUNTVEFUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfRVY2NDEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0VWOTYxMDAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVlIgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVEU4MTcyIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfSkFaWiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9pdDgxNzJfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvaXQ4MTcyX2RlZmNvbmZpZwppbmRleCBhOTFkNzJhLi4zN2Y5ZGQ3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9pdDgxNzJfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL2l0ODE3Ml9kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKIENPTkZJR19NSVBTX0lURTgxNzI9eQogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2l2cl9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9pdnJfZGVmY29uZmlnCmluZGV4IGNlYmM2NzIuLjE4ODc0YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2l2cl9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvaXZyX2RlZmNvbmZpZwpAQCAtMjUsNyArMjUsNiBAQAogIyBDT05GSUdfTUlQU19DT0JBTFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9ERUNTVEFUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfRVY2NDEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0VWOTYxMDAgaXMgbm90IHNldAogQ09ORklHX01JUFNfSVZSPXkKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvamFndWFyLWF0eF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9qYWd1YXItYXR4X2RlZmNvbmZpZwppbmRleCA1ZDllYjExLi45ZjFlMzA0IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9qYWd1YXItYXR4X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9qYWd1YXItYXR4X2RlZmNvbmZpZwpAQCAtMjUsNyArMjUsNiBAQAogIyBDT05GSUdfTUlQU19DT0JBTFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9ERUNTVEFUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfRVY2NDEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0VWOTYxMDAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVlIgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVEU4MTcyIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfSkFaWiBpcyBub3Qgc2V0CkBAIC03MzEsNyArNzMwLDcgQEAKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19QUk9DX0tDT1JFPXkKIENPTkZJR19TWVNGUz15Ci0jIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKIENPTkZJR19SQU1GUz15CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL2ptcjM5MjdfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3Mvam1yMzkyN19kZWZjb25maWcKaW5kZXggYmU0NWE5MC4uZmRlZDNmNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3Mvam1yMzkyN19kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3Mvam1yMzkyN19kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvbGFzYXQyMDBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbGFzYXQyMDBfZGVmY29uZmlnCmluZGV4IDY0ZGM5ZjQuLjMyMGI4Y2QgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL2xhc2F0MjAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9sYXNhdDIwMF9kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApAQCAtOTA1LDcgKzkwNCw3IEBACiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQogIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvbWFsdGFfZGVmY29uZmlnCmluZGV4IDI2OTBiYWYuLjBiYTFlZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL21hbHRhX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9tYWx0YV9kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApAQCAtMTIzMCw3ICsxMjI5LDcgQEAKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19QUk9DX0tDT1JFPXkKIENPTkZJR19TWVNGUz15Ci0jIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKIENPTkZJR19SQU1GUz15CiAjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9taXBzc2ltX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL21pcHNzaW1fZGVmY29uZmlnCmluZGV4IGMyOTg5NzkuLmFkYmVlYWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL21pcHNzaW1fZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL21pcHNzaW1fZGVmY29uZmlnCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL21wYzMweF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9tcGMzMHhfZGVmY29uZmlnCmluZGV4IDkzOGIzOGEuLjc5ZmQ1NDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL21wYzMweF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvbXBjMzB4X2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOC1yYzEKLSMgVGh1IEp1bCAgNiAxMDowNDoxNSAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTgtcmMyCisjIFR1ZSBKdWwgMjUgMjM6MTY6NDYgMjAwNgogIwogQ09ORklHX01JUFM9eQogCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKQEAgLTcxLDcgKzcwLDYgQEAKIENPTkZJR19WSUNUT1JfTVBDMzBYPXkKICMgQ09ORklHX1pBT19DQVBDRUxMQSBpcyBub3Qgc2V0CiBDT05GSUdfUENJX1ZSNDFYWD15Ci1DT05GSUdfVlJDNDE3Mz15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQpAQCAtMTY4LDYgKzE2Niw3IEBACiBDT05GSUdfU1lTVklQQz15CiAjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CisjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTD15CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CkBAIC04NDEsNyArODQwLDcgQEAKICMgQ09ORklHX1VTQl9MRUdPVE9XRVIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xDRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9DWTdDNjMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QSElER0VUS0lUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QSElER0VUU0VSVk8gaXMgbm90IHNldApAQCAtOTgyLDcgKzk4MSw2IEBACiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NJRlNfREVCVUcyIGlzIG5vdCBzZXQKICMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CkBAIC0xMDA3LDYgKzEwMDUsNyBAQAogIwogIyBLZXJuZWwgaGFja2luZwogIworQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQ9eQogIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldApAQCAtMTAxNCw3ICsxMDEzLDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JPU1NDT01QSUxFPXkKLUNPTkZJR19DTURMSU5FPSJtZW09MzJNIGNvbnNvbGU9dHR5VlIwLDE5MjAwIgorQ09ORklHX0NNRExJTkU9Im1lbT0zMk0gY29uc29sZT10dHlWUjAsMTkyMDAgaWRlMD0weDE3MCwweDM3Niw3MyIKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfM19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfM19kZWZjb25maWcKaW5kZXggZWM1NzU4Zi4uNGQ4N2RhMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90XzNfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF8zX2RlZmNvbmZpZwpAQCAtMjUsNyArMjUsNiBAQAogIyBDT05GSUdfTUlQU19DT0JBTFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9ERUNTVEFUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfRVY2NDEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0VWOTYxMDAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVlIgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVEU4MTcyIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfSkFaWiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfY19kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfY19kZWZjb25maWcKaW5kZXggMGQzM2Q4Ny4uYTdhYzJiMCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2NfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9jX2RlZmNvbmZpZwpAQCAtMjUsNyArMjUsNiBAQAogIyBDT05GSUdfTUlQU19DT0JBTFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9ERUNTVEFUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfRVY2NDEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0VWOTYxMDAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVlIgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVEU4MTcyIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfSkFaWiBpcyBub3Qgc2V0CkBAIC03NzQsNyArNzczLDcgQEAKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19QUk9DX0tDT1JFPXkKIENPTkZJR19TWVNGUz15Ci0jIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKIENPTkZJR19SQU1GUz15CiAjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2RlZmNvbmZpZwppbmRleCA0Yjk5OTEwLi44NTNlN2JiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApAQCAtNzIzLDcgKzcyMiw3IEBACiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQogIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2dfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3Mvb2NlbG90X2dfZGVmY29uZmlnCmluZGV4IDgyN2IzNDQuLjg1MjRlZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL29jZWxvdF9nX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9vY2Vsb3RfZ19kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApAQCAtNzc3LDcgKzc3Niw3IEBACiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQogIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvcGIxMTAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3BiMTEwMF9kZWZjb25maWcKaW5kZXggOWVkNjBmZS4uMWExNmU5MiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvcGIxMTAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9wYjExMDBfZGVmY29uZmlnCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3BiMTUwMF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9wYjE1MDBfZGVmY29uZmlnCmluZGV4IDY3NzQyNTQuLjllYThlZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3BiMTUwMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvcGIxNTAwX2RlZmNvbmZpZwpAQCAtMjUsNyArMjUsNiBAQAogIyBDT05GSUdfTUlQU19DT0JBTFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9ERUNTVEFUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfRVY2NDEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0VWOTYxMDAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVlIgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVEU4MTcyIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfSkFaWiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9wYjE1NTBfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvcGIxNTUwX2RlZmNvbmZpZwppbmRleCAxYWZlNWJmLi5jNGExNTg5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9wYjE1NTBfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3BiMTU1MF9kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvcG54ODU1MC1qYnNfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvcG54ODU1MC1qYnNfZGVmY29uZmlnCmluZGV4IGFjNjE2YzguLjFjYmYyNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3BueDg1NTAtamJzX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLWpic19kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvcG54ODU1MC12MnBjaV9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLXYycGNpX2RlZmNvbmZpZwppbmRleCBhOGViNTFiLi5iZWMzMGIxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLXYycGNpX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9wbng4NTUwLXYycGNpX2RlZmNvbmZpZwpAQCAtMjUsNyArMjUsNiBAQAogIyBDT05GSUdfTUlQU19DT0JBTFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9ERUNTVEFUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfRVY2NDEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0VWOTYxMDAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVlIgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVEU4MTcyIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfSkFaWiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy9xZW11X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3FlbXVfZGVmY29uZmlnCmluZGV4IDZhNjNhMTEuLmY1Zjc5OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3FlbXVfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3FlbXVfZGVmY29uZmlnCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKQEAgLTY4Nyw3ICs2ODYsNyBAQAogQ09ORklHX1BST0NfRlM9eQogQ09ORklHX1BST0NfS0NPUkU9eQogQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CiAjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAogQ09ORklHX1JBTUZTPXkKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvcmJobWE0NTAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3JiaG1hNDUwMF9kZWZjb25maWcKaW5kZXggNjc3OWY0NC4uMmY1NjUwMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvcmJobWE0NTAwX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9yYmhtYTQ1MDBfZGVmY29uZmlnCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3JtMjAwX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3JtMjAwX2RlZmNvbmZpZwppbmRleCBiNzgyNmQzLi40ZmVlOTBiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy9ybTIwMF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3Mvcm0yMDBfZGVmY29uZmlnCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKQEAgLTE0NDIsNyArMTQ0MSw3IEBACiBDT05GSUdfUFJPQ19GUz15CiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfU1lTRlM9eQotIyBDT05GSUdfVE1QRlMgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQogIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvc2IxMjUwLXN3YXJtX2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3NiMTI1MC1zd2FybV9kZWZjb25maWcKaW5kZXggNjI1YzFjNi4uOTA0MWYwOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3Mvc2IxMjUwLXN3YXJtX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy9zYjEyNTAtc3dhcm1fZGVmY29uZmlnCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3NlYWRfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3Mvc2VhZF9kZWZjb25maWcKaW5kZXggNDQwMWI2MC4uMDJhYmIyZiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3Mvc2VhZF9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3Mvc2VhZF9kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjI2X2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9jb25maWdzL3RiMDIyNl9kZWZjb25maWcKaW5kZXggMmJhNGUyNS4uY2EzZDBjNCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjI2X2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy90YjAyMjZfZGVmY29uZmlnCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jb25maWdzL3RiMDIyOV9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy90YjAyMjlfZGVmY29uZmlnCmluZGV4IGZjOGE0MDcuLjRlMjAwOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3RiMDIyOV9kZWZjb25maWcKKysrIGIvYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjI5X2RlZmNvbmZpZwpAQCAtMjUsNyArMjUsNiBAQAogIyBDT05GSUdfTUlQU19DT0JBTFQgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9ERUNTVEFUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfRVY2NDEyMCBpcyBub3Qgc2V0Ci0jIENPTkZJR19NSVBTX0VWOTYxMDAgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVlIgaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19JVEU4MTcyIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfSkFaWiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy90YjAyODdfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MvdGIwMjg3X2RlZmNvbmZpZwppbmRleCBlZmZjYjYzLi41MzVhODEzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy90YjAyODdfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3RiMDI4N19kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3Mvd29ya3BhZF9kZWZjb25maWcgYi9hcmNoL21pcHMvY29uZmlncy93b3JrcGFkX2RlZmNvbmZpZwppbmRleCA0ODkxZDAyLi4zYTNlZjIwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy93b3JrcGFkX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy93b3JrcGFkX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOC1yYzEKLSMgVGh1IEp1bCAgNiAxMDowNDoyMSAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTgtcmMyCisjIFR1ZSBKdWwgMjUgMjM6MTM6MDQgMjAwNgogIwogQ09ORklHX01JUFM9eQogCkBAIC0yNSw3ICsyNSw2IEBACiAjIENPTkZJR19NSVBTX0NPQkFMVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0RFQ1NUQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfTUlQU19FVjY0MTIwIGlzIG5vdCBzZXQKLSMgQ09ORklHX01JUFNfRVY5NjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lWUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0lURTgxNzIgaXMgbm90IHNldAogIyBDT05GSUdfTUFDSF9KQVpaIGlzIG5vdCBzZXQKQEAgLTE2Niw2ICsxNjUsNyBAQAogQ09ORklHX1NZU1ZJUEM9eQogIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVEFTS1NUQVRTIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVEw9eQogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldApAQCAtMzc5LDYgKzM3OSw3IEBACiBDT05GSUdfQkxLX0RFVl9SQU09bQogQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CiBDT05GSUdfQkxLX0RFVl9SQU1fU0laRT00MDk2CitDT05GSUdfQkxLX0RFVl9SQU1fQkxPQ0tTSVpFPTEwMjQKICMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKICMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKQEAgLTg1NSw3ICs4NTYsNiBAQAogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DSUZTX0RFQlVHMiBpcyBub3Qgc2V0CiAjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAogIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldApAQCAtODgwLDYgKzg4MCw3IEBACiAjCiAjIEtlcm5lbCBoYWNraW5nCiAjCitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CkBAIC04ODcsNyArODg4LDcgQEAKIENPTkZJR19MT0dfQlVGX1NISUZUPTE0CiAjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1JPU1NDT01QSUxFPXkKLUNPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVZSMCwxOTIwMCBtZW09MTZNIgorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5VlIwLDE5MjAwIGlkZTA9MHgxNzAsMHgzNzYsNDkgbWVtPTE2TSIKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY29uZmlncy93cnBwbWNfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3Mvd3JwcG1jX2RlZmNvbmZpZwppbmRleCAzZTRiMTZiLi5lNmIxZGVhIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY29uZmlncy93cnBwbWNfZGVmY29uZmlnCisrKyBiL2FyY2gvbWlwcy9jb25maWdzL3dycHBtY19kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2NvbmZpZ3MveW9zZW1pdGVfZGVmY29uZmlnIGIvYXJjaC9taXBzL2NvbmZpZ3MveW9zZW1pdGVfZGVmY29uZmlnCmluZGV4IDNhNjhkOGEuLjA2YTA3MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9jb25maWdzL3lvc2VtaXRlX2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvY29uZmlncy95b3NlbWl0ZV9kZWZjb25maWcKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2RlZmNvbmZpZyBiL2FyY2gvbWlwcy9kZWZjb25maWcKaW5kZXggZmZmNmZjYy4uY2M5YjI0ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2RlZmNvbmZpZworKysgYi9hcmNoL21pcHMvZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAogIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE4LXJjMQotIyBUaHUgSnVsICA2IDA5OjQ5OjMzIDIwMDYKKyMgVGh1IEp1bCAgNiAxMDowNDoxMCAyMDA2CiAjCiBDT05GSUdfTUlQUz15CiAKQEAgLTI1LDcgKzI1LDYgQEAKICMgQ09ORklHX01JUFNfQ09CQUxUIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQ0hfREVDU1RBVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19NSVBTX0VWNjQxMjAgaXMgbm90IHNldAotIyBDT05GSUdfTUlQU19FVjk2MTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVZSIGlzIG5vdCBzZXQKICMgQ09ORklHX01JUFNfSVRFODE3MiBpcyBub3Qgc2V0CiAjIENPTkZJR19NQUNIX0pBWlogaXMgbm90IHNldApAQCAtMTAxMyw3ICsxMDEyLDcgQEAKIENPTkZJR19QUk9DX0ZTPXkKIENPTkZJR19QUk9DX0tDT1JFPXkKIENPTkZJR19TWVNGUz15Ci0jIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CitDT05GSUdfVE1QRlM9eQogIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKIENPTkZJR19SQU1GUz15CiAjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZ2FsaWxlby1ib2FyZHMvZXY5NjEwMC9NYWtlZmlsZSBiL2FyY2gvbWlwcy9nYWxpbGVvLWJvYXJkcy9ldjk2MTAwL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDg2OGVjLi4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9nYWxpbGVvLWJvYXJkcy9ldjk2MTAwL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jCi0jICBDb3B5cmlnaHQgMjAwMCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSMgIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotIyAgICAgCXBwb3BvdkBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCi0jCi0jIE1ha2VmaWxlIGZvciB0aGUgR2FsaWxlbyBFVjk2MTAwIGJvYXJkLgotIwotCi1vYmoteQkJKz0gaW5pdC5vIGlycS5vIHB1dHMubyByZXNldC5vIHRpbWUubyBzZXR1cC5vCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZ2FsaWxlby1ib2FyZHMvZXY5NjEwMC9pbml0LmMgYi9hcmNoL21pcHMvZ2FsaWxlby1ib2FyZHMvZXY5NjEwMC9pbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMWZlOWIuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2dhbGlsZW8tYm9hcmRzL2V2OTYxMDAvaW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMCBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KLSAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgotICogICAgICAgICAJcHBvcG92QG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20KLSAqCi0gKiBUaGlzIGZpbGUgd2FzIGRlcml2ZWQgZnJvbSBDYXJzdGVuIExhbmdnYWFyZCdzCi0gKiBhcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy9nZW5lcmljLmMKLSAqCi0gKiBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20KLSAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCi0gKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKLSAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgotI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgotI2luY2x1ZGUgPGFzbS9ndDY0MTIwLmg+Ci0KLQotLyogRW52aXJvbm1lbnQgdmFyaWFibGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCWNoYXIgKm5hbWU7Ci0JY2hhciAqdmFsOwotfSB0X2Vudl92YXI7Ci0KLWludCBwcm9tX2FyZ2M7Ci1jaGFyICoqcHJvbV9hcmd2LCAqKnByb21fZW52cDsKLQotaW50IGluaXRfZGVidWcgPSAwOwotCi1jaGFyICogX19pbml0IHByb21fZ2V0Y21kbGluZSh2b2lkKQotewotCXJldHVybiAmKGFyY3NfY21kbGluZVswXSk7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgX19pbml0IHByb21fZnJlZV9wcm9tX21lbW9yeSh2b2lkKQotewotCXJldHVybiAwOwotfQotCi12b2lkICBfX2luaXQgcHJvbV9pbml0X2NtZGxpbmUodm9pZCkKLXsKLQljaGFyICpjcDsKLQlpbnQgYWN0cjsKLQotCWFjdHIgPSAxOyAvKiBBbHdheXMgaWdub3JlIGFyZ3ZbMF0gKi8KLQotCWNwID0gJihhcmNzX2NtZGxpbmVbMF0pOwotCXdoaWxlKGFjdHIgPCBwcm9tX2FyZ2MpIHsKLQkgICAgICAgIHN0cmNweShjcCwgcHJvbV9hcmd2W2FjdHJdKTsKLQkJY3AgKz0gc3RybGVuKHByb21fYXJndlthY3RyXSk7Ci0JCSpjcCsrID0gJyAnOwotCQlhY3RyKys7Ci0JfQotCWlmIChjcCAhPSAmKGFyY3NfY21kbGluZVswXSkpIC8qIGdldCByaWQgb2YgdHJhaWxpbmcgc3BhY2UgKi8KLQkJLS1jcDsKLQkqY3AgPSAnXDAnOwotfQotCi1jaGFyICpwcm9tX2dldGVudihjaGFyICplbnZuYW1lKQotewotCS8qCi0JICogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCi0JICovCi0KLQl0X2Vudl92YXIgKmVudiA9ICh0X2Vudl92YXIgKikgcHJvbV9lbnZwOwotCWludCBpOwotCi0JaSA9IHN0cmxlbihlbnZuYW1lKTsKLQotCXdoaWxlIChlbnYtPm5hbWUpIHsKLQkJaWYgKHN0cm5jbXAoZW52bmFtZSwgZW52LT5uYW1lLCBpKSA9PSAwKSB7Ci0JCQlyZXR1cm4gKGVudi0+dmFsKTsKLQkJfQotCQllbnYrKzsKLQl9Ci0JcmV0dXJuIChOVUxMKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIHN0cjJoZXhudW0odW5zaWduZWQgY2hhciBjKQotewotCWlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKLQkJcmV0dXJuIGMgLSAnMCc7Ci0JaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ2YnKQotCQlyZXR1cm4gYyAtICdhJyArIDEwOwotCXJldHVybiAwOwkJLyogZm9vICovCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdHIyZWFkZHIodW5zaWduZWQgY2hhciAqZWEsIHVuc2lnbmVkIGNoYXIgKnN0cikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKLQkJdW5zaWduZWQgY2hhciBudW07Ci0KLQkJaWYgKCgqc3RyID09ICcuJykgfHwgKCpzdHIgPT0gJzonKSkKLQkJCXN0cisrOwotCQludW0gPSBzdHIyaGV4bnVtKCpzdHIrKykgPDwgNDsKLQkJbnVtIHw9IChzdHIyaGV4bnVtKCpzdHIrKykpOwotCQllYVtpXSA9IG51bTsKLQl9Ci19Ci0KLWludCBnZXRfZXRoZXJuZXRfYWRkcihjaGFyICpldGhlcm5ldF9hZGRyKQotewotCWNoYXIgKmV0aGFkZHJfc3RyOwotCi0JZXRoYWRkcl9zdHIgPSBwcm9tX2dldGVudigiZXRoYWRkciIpOwotCWlmICghZXRoYWRkcl9zdHIpIHsKLQkJcHJpbnRrKCJldGhhZGRyIG5vdCBzZXQgaW4gYm9vdCBwcm9tXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzdHIyZWFkZHIoZXRoZXJuZXRfYWRkciwgZXRoYWRkcl9zdHIpOwotCi0JaWYgKGluaXRfZGVidWcgPiAxKSB7Ci0JCWludCBpOwotCQlwcmludGsoImdldF9ldGhlcm5ldF9hZGRyOiAiKTsKLQkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLQkJCXByaW50aygiJTAyeDoiLAotCQkJICAgICAgICh1bnNpZ25lZCBjaGFyKSAqKGV0aGVybmV0X2FkZHIgKyBpKSk7Ci0JCXByaW50aygiJTAyeFxuIiwgKihldGhlcm5ldF9hZGRyICsgaSkpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKLXsKLQlyZXR1cm4gIkdhbGlsZW8gRVY5NjEwMCI7Ci19Ci0KLXZvaWQgX19pbml0IHByb21faW5pdCh2b2lkKQotewotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnVhcnQ7Ci0JY2hhciBwcGJ1Zls4XTsKLQotCXByb21fYXJnYyA9IGZ3X2FyZzA7Ci0JcHJvbV9hcmd2ID0gKGNoYXIgKiopIGZ3X2FyZzE7Ci0JcHJvbV9lbnZwID0gKGNoYXIgKiopIGZ3X2FyZzI7Ci0KLQltaXBzX21hY2hncm91cCA9IE1BQ0hfR1JPVVBfR0FMSUxFTzsKLQltaXBzX21hY2h0eXBlID0gTUFDSF9FVjk2MTAwOwotCi0JcHJvbV9pbml0X2NtZGxpbmUoKTsKLQotCS8qIDMyIE1CIHVwZ3JhZGFibGUgKi8KLQlhZGRfbWVtb3J5X3JlZ2lvbigwLCAzMiA8PCAyMCwgQk9PVF9NRU1fUkFNKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9nYWxpbGVvLWJvYXJkcy9ldjk2MTAwL2lycS5jIGIvYXJjaC9taXBzL2dhbGlsZW8tYm9hcmRzL2V2OTYxMDAvaXJxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNWQ2NzIuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2dhbGlsZW8tYm9hcmRzL2V2OTYxMDAvaXJxLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDAgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqICAgICAgICAgCXBwb3BvdkBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCi0gKgotICogVGhpcyBmaWxlIHdhcyBkZXJpdmVkIGZyb20gQ2Fyc3RlbiBMYW5nZ2FhcmQncwotICogYXJjaC9taXBzL21pcHMtYm9hcmRzL2F0bGFzL2F0bGFzX2ludC5jLgotICoKLSAqIENhcnN0ZW4gTGFuZ2dhYXJkLCBjYXJzdGVubEBtaXBzLmNvbQotICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lycV9jcHUuaD4KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZmZ6OCh1bnNpZ25lZCBpbnQgd29yZCkKLXsKLQl1bnNpZ25lZCBsb25nIGs7Ci0KLQlrID0gNzsKLQlpZiAod29yZCAmIDB4MGZVTCkgeyBrIC09IDQ7ICB3b3JkIDw8PSA0OyAgfQotCWlmICh3b3JkICYgMHgzMFVMKSB7IGsgLT0gMjsgIHdvcmQgPDw9IDI7ICB9Ci0JaWYgKHdvcmQgJiAweDQwVUwpIHsgayAtPSAxOyB9Ci0KLQlyZXR1cm4gazsKLX0KLQotZXh0ZXJuIHZvaWQgbWlwc190aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotCi1hc21saW5rYWdlIHZvaWQgZXY5NjEwMF9jcHVfaXJxKHVuc2lnbmVkIGludCBwZW5kaW5nLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlkb19JUlEoZmZ6OChwZW5kaW5nID4+IDgpLCByZWdzKTsKLX0KLQotYXNtbGlua2FnZSB2b2lkIHBsYXRfaXJxX2Rpc3BhdGNoKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXVuc2lnbmVkIGludCBwZW5kaW5nID0gcmVhZF9jMF9jYXVzZSgpICYgcmVhZF9jMF9zdGF0dXMoKSAmIFNUMF9JTTsKLQotCWlmIChwZW5kaW5nICYgQ0FVU0VGX0lQNykKLQkJbWlwc190aW1lcl9pbnRlcnJ1cHQocmVncyk7Ci0JZWxzZSBpZiAocGVuZGluZykKLQkJZXY5NjEwMF9jcHVfaXJxKHBlbmRpbmcsIHJlZ3MpOwotCWVsc2UKLQkJc3B1cmlvdXNfaW50ZXJydXB0KHJlZ3MpOwotfQotCi12b2lkIF9faW5pdCBhcmNoX2luaXRfaXJxKHZvaWQpCi17Ci0JbWlwc19jcHVfaXJxX2luaXQoMCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZ2FsaWxlby1ib2FyZHMvZXY5NjEwMC9wdXRzLmMgYi9hcmNoL21pcHMvZ2FsaWxlby1ib2FyZHMvZXY5NjEwMC9wdXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZGM2ZDEuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL2dhbGlsZW8tYm9hcmRzL2V2OTYxMDAvcHV0cy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLQotLyoKLSAqIERlYnVnIHJvdXRpbmVzIHdoaWNoIGRpcmVjdGx5IGFjY2VzcyB0aGUgdWFydC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vZ3Q2NDEyMC5oPgotCi0KLS8vI2RlZmluZSBTRVJJQUxfQkFTRSAgICBFVjk2MTAwX1VBUlQwX1JFR1NfQkFTRQotI2RlZmluZSBTRVJJQUxfQkFTRSAgICAweEJEMDAwMDIwCi0jZGVmaW5lIE5TMTY1NTBfQkFTRSAgIFNFUklBTF9CQVNFCi0KLSNkZWZpbmUgU0VSQV9DTUQgICAgICAgMHgwRAotI2RlZmluZSBTRVJBX0RBVEEgICAgICAweDA4Ci0vLyNkZWZpbmUgU0VSQl9DTUQgICAgICAgMHgwNQotI2RlZmluZSBTRVJCX0NNRCAgICAgICAyMAotI2RlZmluZSBTRVJCX0RBVEEgICAgICAweDAwCi0jZGVmaW5lIFRYX0JVU1kgICAgICAgIDB4MjAKLQotI2RlZmluZSBUSU1FT1VUICAgIDB4ZmZmZgotI3VuZGVmIFNMT1dfRE9XTgotCi1zdGF0aWMgY29uc3QgY2hhciBkaWdpdHNbMTZdID0gIjAxMjM0NTY3ODlhYmNkZWYiOwotc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKmNvbnN0IGNvbTEgPSAodW5zaWduZWQgY2hhciAqKSBTRVJJQUxfQkFTRTsKLQotCi0jaWZkZWYgU0xPV19ET1dOCi1zdGF0aWMgaW5saW5lIHZvaWQgc2xvd19kb3duKCkKLXsKLQlpbnQgazsKLQlmb3IgKGsgPSAwOyBrIDwgMTAwMDA7IGsrKyk7Ci19Ci0jZWxzZQotI2RlZmluZSBzbG93X2Rvd24oKQotI2VuZGlmCi0KLXZvaWQgcHV0Y2goY29uc3QgdW5zaWduZWQgY2hhciBjKQotewotCXVuc2lnbmVkIGNoYXIgY2g7Ci0JaW50IGkgPSAwOwotCi0JZG8gewotCQljaCA9IGNvbTFbU0VSQl9DTURdOwotCQlzbG93X2Rvd24oKTsKLQkJaSsrOwotCQlpZiAoaSA+IFRJTUVPVVQpIHsKLQkJCWJyZWFrOwotCQl9Ci0JfSB3aGlsZSAoMCA9PSAoY2ggJiBUWF9CVVNZKSk7Ci0JY29tMVtTRVJCX0RBVEFdID0gYzsKLX0KLQotdm9pZCBwdXRjaGFyKGNvbnN0IHVuc2lnbmVkIGNoYXIgYykKLXsKLQl1bnNpZ25lZCBjaGFyIGNoOwotCWludCBpID0gMDsKLQotCWRvIHsKLQkJY2ggPSBjb20xW1NFUkJfQ01EXTsKLQkJc2xvd19kb3duKCk7Ci0JCWkrKzsKLQkJaWYgKGkgPiBUSU1FT1VUKSB7Ci0JCQlicmVhazsKLQkJfQotCX0gd2hpbGUgKDAgPT0gKGNoICYgVFhfQlVTWSkpOwotCWNvbTFbU0VSQl9EQVRBXSA9IGM7Ci19Ci0KLXZvaWQgcHV0cyh1bnNpZ25lZCBjaGFyICpjcCkKLXsKLQl1bnNpZ25lZCBjaGFyIGNoOwotCWludCBpID0gMDsKLQotCXdoaWxlICgqY3ApIHsKLQkJZG8gewotCQkJY2ggPSBjb20xW1NFUkJfQ01EXTsKLQkJCXNsb3dfZG93bigpOwotCQkJaSsrOwotCQkJaWYgKGkgPiBUSU1FT1VUKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gd2hpbGUgKDAgPT0gKGNoICYgVFhfQlVTWSkpOwotCQljb20xW1NFUkJfREFUQV0gPSAqY3ArKzsKLQl9Ci0JcHV0Y2goJ1xyJyk7Ci0JcHV0Y2goJ1xuJyk7Ci19Ci0KLXZvaWQgZnB1dHModW5zaWduZWQgY2hhciAqY3ApCi17Ci0JdW5zaWduZWQgY2hhciBjaDsKLQlpbnQgaSA9IDA7Ci0KLQl3aGlsZSAoKmNwKSB7Ci0KLQkJZG8gewotCQkJY2ggPSBjb20xW1NFUkJfQ01EXTsKLQkJCXNsb3dfZG93bigpOwotCQkJaSsrOwotCQkJaWYgKGkgPiBUSU1FT1VUKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0gd2hpbGUgKDAgPT0gKGNoICYgVFhfQlVTWSkpOwotCQljb20xW1NFUkJfREFUQV0gPSAqY3ArKzsKLQl9Ci19Ci0KLQotdm9pZCBwdXQ2NCh1aW50NjRfdCB1bCkKLXsKLQlpbnQgY250OwotCXVuc2lnbmVkIGNoOwotCi0JY250ID0gMTY7CQkvKiAxNiBuaWJibGVzIGluIGEgNjQgYml0IGxvbmcgKi8KLQlwdXRjaCgnMCcpOwotCXB1dGNoKCd4Jyk7Ci0JZG8gewotCQljbnQtLTsKLQkJY2ggPSAodW5zaWduZWQgY2hhcikgKHVsID4+IGNudCAqIDQpICYgMHgwRjsKLQkJcHV0Y2goZGlnaXRzW2NoXSk7Ci0JfSB3aGlsZSAoY250ID4gMCk7Ci19Ci0KLXZvaWQgcHV0MzIodW5zaWduZWQgdSkKLXsKLQlpbnQgY250OwotCXVuc2lnbmVkIGNoOwotCi0JY250ID0gODsJCS8qIDggbmliYmxlcyBpbiBhIDMyIGJpdCBsb25nICovCi0JcHV0Y2goJzAnKTsKLQlwdXRjaCgneCcpOwotCWRvIHsKLQkJY250LS07Ci0JCWNoID0gKHVuc2lnbmVkIGNoYXIpICh1ID4+IGNudCAqIDQpICYgMHgwRjsKLQkJcHV0Y2goZGlnaXRzW2NoXSk7Ci0JfSB3aGlsZSAoY250ID4gMCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvZ2FsaWxlby1ib2FyZHMvZXY5NjEwMC9yZXNldC5jIGIvYXJjaC9taXBzL2dhbGlsZW8tYm9hcmRzL2V2OTYxMDAvcmVzZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmOWI3Zi4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvZ2FsaWxlby1ib2FyZHMvZXY5NjEwMC9yZXNldC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgotICoJR2FsaWxlbyBFVjk2MTAwIHJlc2V0IHJvdXRpbmVzLgotICoKLSAqIENvcHlyaWdodCAyMDAwIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCi0gKiAgICAgICAgIAlwcG9wb3ZAbXZpc3RhLmNvbSBvciBzb3VyY2VAbXZpc3RhLmNvbQotICoKLSAqIFRoaXMgZmlsZSB3YXMgZGVyaXZlZCBmcm9tIENhcnN0ZW4gTGFuZ2dhYXJkJ3MKLSAqIGFyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3Jlc2V0LmMKLSAqCi0gKiBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20KLSAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCi0gKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKLSAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vcmVib290Lmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9ndDY0MTIwLmg+Ci0KLXN0YXRpYyB2b2lkIG1pcHNfbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNvbW1hbmQpOwotc3RhdGljIHZvaWQgbWlwc19tYWNoaW5lX2hhbHQodm9pZCk7Ci0KLXN0YXRpYyB2b2lkIG1pcHNfbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNvbW1hbmQpCi17Ci0Jc2V0X2MwX3N0YXR1cyhTVDBfQkVWIHwgU1QwX0VSTCk7Ci0JY2hhbmdlX2MwX2NvbmZpZyhDT05GX0NNX0NNQVNLLCBDT05GX0NNX1VOQ0FDSEVEKTsKLQlmbHVzaF9jYWNoZV9hbGwoKTsKLQl3cml0ZV9jMF93aXJlZCgwKTsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygianJcdCUwIjo6InIiKDB4YmZjMDAwMDApKTsKLQl3aGlsZSAoMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1pcHNfbWFjaGluZV9oYWx0KHZvaWQpCi17Ci0JcHJpbnRrKEtFUk5fTk9USUNFICJZb3UgY2FuIHNhZmVseSB0dXJuIG9mZiB0aGUgcG93ZXJcbiIpOwotCXdoaWxlICgxKQotCQlfX2FzbV9fKCIuc2V0XHRtaXBzM1xuXHQiCi0JICAgICAgICAgICAgICAgICJ3YWl0XG5cdCIKLQkJCSIuc2V0XHRtaXBzMCIpOwotfQotCi12b2lkIG1pcHNfcmVib290X3NldHVwKHZvaWQpCi17Ci0JX21hY2hpbmVfcmVzdGFydCA9IG1pcHNfbWFjaGluZV9yZXN0YXJ0OwotCV9tYWNoaW5lX2hhbHQgPSBtaXBzX21hY2hpbmVfaGFsdDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9nYWxpbGVvLWJvYXJkcy9ldjk2MTAwL3NldHVwLmMgYi9hcmNoL21pcHMvZ2FsaWxlby1ib2FyZHMvZXY5NjEwMC9zZXR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzlhZDU1Li4wMDAwMDAwCi0tLSBhL2FyY2gvbWlwcy9nYWxpbGVvLWJvYXJkcy9ldjk2MTAwL3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoKLSAqIEJSSUVGIE1PRFVMRSBERVNDUklQVElPTgotICoJR2FsaWxlbyBFVjk2MTAwIHNldHVwLgotICoKLSAqIENvcHlyaWdodCAyMDAwIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCi0gKiAgICAgICAgIAlwcG9wb3ZAbXZpc3RhLmNvbSBvciBzb3VyY2VAbXZpc3RhLmNvbQotICoKLSAqIFRoaXMgZmlsZSB3YXMgZGVyaXZlZCBmcm9tIENhcnN0ZW4gTGFuZ2dhYXJkJ3MKLSAqIGFyY2gvbWlwcy9taXBzLWJvYXJkcy9hdGxhcy9hdGxhc19zZXR1cC5jLgotICoKLSAqIENhcnN0ZW4gTGFuZ2dhYXJkLCBjYXJzdGVubEBtaXBzLmNvbQotICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotI2luY2x1ZGUgPGFzbS9jcHUuaD4KLSNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KLSNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2RlbGF5Lmg+Ci0jaW5jbHVkZSA8YXNtL2d0NjQxMjAuaD4KLSNpbmNsdWRlIDxhc20vZ2FsaWxlby1ib2FyZHMvZXY5NjEwMGludC5oPgotCi0KLWV4dGVybiBjaGFyICpfX2luaXQgcHJvbV9nZXRjbWRsaW5lKHZvaWQpOwotCi1leHRlcm4gdm9pZCBtaXBzX3JlYm9vdF9zZXR1cCh2b2lkKTsKLQotdW5zaWduZWQgY2hhciBtYWNfMF8xWzEyXTsKLQotdm9pZCBfX2luaXQgcGxhdF9tZW1fc2V0dXAodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgY29uZmlnID0gcmVhZF9jMF9jb25maWcoKTsKLQl1bnNpZ25lZCBpbnQgc3RhdHVzID0gcmVhZF9jMF9zdGF0dXMoKTsKLQl1bnNpZ25lZCBpbnQgaW5mbyA9IHJlYWRfYzBfaW5mbygpOwotCXUzMiB0bXA7Ci0KLQljaGFyICphcmdwdHI7Ci0KLQljbGVhcl9jMF9zdGF0dXMoU1QwX0ZSKTsKLQotCWlmIChjb25maWcgJiAweDgpCi0JCXByaW50aygiU2Vjb25kYXJ5IGNhY2hlIGlzIGVuYWJsZWRcbiIpOwotCWVsc2UKLQkJcHJpbnRrKCJTZWNvbmRhcnkgY2FjaGUgaXMgZGlzYWJsZWRcbiIpOwotCi0JaWYgKHN0YXR1cyAmICgxIDw8IDI3KSkKLQkJcHJpbnRrKCJVc2VyLW1vZGUgY2FjaGUgb3BzIGVuYWJsZWRcbiIpOwotCWVsc2UKLQkJcHJpbnRrKCJVc2VyLW1vZGUgY2FjaGUgb3BzIGRpc2FibGVkXG4iKTsKLQotCXByaW50aygiQ1AwIGluZm8gcmVnOiAleFxuIiwgKHVuc2lnbmVkKSBpbmZvKTsKLQlpZiAoaW5mbyAmICgxIDw8IDI4KSkKLQkJcHJpbnRrKCJidXJzdCBtb2RlIFNjYWNoZSBSQU1TXG4iKTsKLQllbHNlCi0JCXByaW50aygicGlwZWxpbmVkIFNjYWNoZSBSQU1TXG4iKTsKLQotCWlmIChpbmZvICYgMHgxKQotCQlwcmludGsoIkF0b21pYyBFbmFibGUgaXMgc2V0XG4iKTsKLQotCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOwotI2lmZGVmIENPTkZJR19TRVJJQUxfQ09OU09MRQotCWlmIChzdHJzdHIoYXJncHRyLCAiY29uc29sZT0iKSA9PSBOVUxMKSB7Ci0JCWFyZ3B0ciA9IHByb21fZ2V0Y21kbGluZSgpOwotCQlzdHJjYXQoYXJncHRyLCAiIGNvbnNvbGU9dHR5UzAsMTE1MjAwIik7Ci0JfQotI2VuZGlmCi0KLQltaXBzX3JlYm9vdF9zZXR1cCgpOwotCi0Jc2V0X2lvX3BvcnRfYmFzZShLU0VHMSk7Ci0JaW9wb3J0X3Jlc291cmNlLnN0YXJ0ID0gR1RfUENJX0lPX0JBU0U7Ci0JaW9wb3J0X3Jlc291cmNlLmVuZCA9IEdUX1BDSV9JT19CQVNFICsgMHgwMWZmZmZmZjsKLQotI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAotCVJPT1RfREVWID0gTUtERVYoUkFNRElTS19NQUpPUiwgMCk7Ci0jZW5kaWYKLQotCi0JLyoKLQkgKiBTZXR1cCBHVCBjb250cm9sbGVyIG1hc3RlciBiaXQgc28gd2UgY2FuIGRvIGNvbmZpZyBjeWNsZXMKLQkgKi8KLQotCS8qIENsZWFyIGNhdXNlIHJlZ2lzdGVyIGJpdHMgKi8KLQlHVF9XUklURShHVF9JTlRSQ0FVU0VfT0ZTLCB+KEdUX0lOVFJDQVVTRV9NQVNBQk9SVDBfQklUIHwKLQkJCQkgICAgIEdUX0lOVFJDQVVTRV9UQVJBQk9SVDBfQklUKSk7Ci0JLyogU2V0dXAgYWRkcmVzcyAqLwotCUdUX1dSSVRFKEdUX1BDSTBfQ0ZHQUREUl9PRlMsCi0JCSAoMCA8PCBHVF9QQ0kwX0NGR0FERFJfQlVTTlVNX1NIRikgfAotCQkgKDAgPDwgR1RfUENJMF9DRkdBRERSX0ZVTkNUTlVNX1NIRikgfAotCQkgKChQQ0lfQ09NTUFORCAvIDQpIDw8IEdUX1BDSTBfQ0ZHQUREUl9SRUdOVU1fU0hGKSB8Ci0JCSBHVF9QQ0kwX0NGR0FERFJfQ09ORklHRU5fQklUKTsKLQotCXVkZWxheSgyKTsKLQl0bXAgPSBHVF9SRUFEKEdUX1BDSTBfQ0ZHREFUQV9PRlMpOwotCi0JdG1wIHw9IChQQ0lfQ09NTUFORF9JTyB8IFBDSV9DT01NQU5EX01FTU9SWSB8Ci0JCVBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX1NFUlIpOwotCUdUX1dSSVRFKEdUX1BDSTBfQ0ZHQUREUl9PRlMsCi0JCSAoMCA8PCBHVF9QQ0kwX0NGR0FERFJfQlVTTlVNX1NIRikgfAotCQkgKDAgPDwgR1RfUENJMF9DRkdBRERSX0ZVTkNUTlVNX1NIRikgfAotCQkgKChQQ0lfQ09NTUFORCAvIDQpIDw8IEdUX1BDSTBfQ0ZHQUREUl9SRUdOVU1fU0hGKSB8Ci0JCSBHVF9QQ0kwX0NGR0FERFJfQ09ORklHRU5fQklUKTsKLQl1ZGVsYXkoMik7Ci0JR1RfV1JJVEUoR1RfUENJMF9DRkdEQVRBX09GUywgdG1wKTsKLQotCS8qIFNldHVwIGFkZHJlc3MgKi8KLQlHVF9XUklURShHVF9QQ0kwX0NGR0FERFJfT0ZTLAotCQkgKDAgPDwgR1RfUENJMF9DRkdBRERSX0JVU05VTV9TSEYpIHwKLQkJICgwIDw8IEdUX1BDSTBfQ0ZHQUREUl9GVU5DVE5VTV9TSEYpIHwKLQkJICgoUENJX0NPTU1BTkQgLyA0KSA8PCBHVF9QQ0kwX0NGR0FERFJfUkVHTlVNX1NIRikgfAotCQkgR1RfUENJMF9DRkdBRERSX0NPTkZJR0VOX0JJVCk7Ci0KLQl1ZGVsYXkoMik7Ci0JdG1wID0gR1RfUkVBRChHVF9QQ0kwX0NGR0RBVEFfT0ZTKTsKLX0KLQotdW5zaWduZWQgc2hvcnQgZ2V0X2d0X2RldmlkKHZvaWQpCi17Ci0JdTMyIGd0X2RldmlkOwotCi0JLyogRmlndXJlIG91dCBpZiB0aGlzIGlzIGEgZ3Q5NjEwMCBvciBndDk2MTAwQSAqLwotCUdUX1dSSVRFKEdUX1BDSTBfQ0ZHQUREUl9PRlMsCi0JCSAoMCA8PCBHVF9QQ0kwX0NGR0FERFJfQlVTTlVNX1NIRikgfAotCQkgKDAgPDwgR1RfUENJMF9DRkdBRERSX0ZVTkNUTlVNX1NIRikgfAotCQkgKChQQ0lfVkVORE9SX0lEIC8gNCkgPDwgR1RfUENJMF9DRkdBRERSX1JFR05VTV9TSEYpIHwKLQkJIEdUX1BDSTBfQ0ZHQUREUl9DT05GSUdFTl9CSVQpOwotCi0JdWRlbGF5KDQpOwotCWd0X2RldmlkID0gR1RfUkVBRChHVF9QQ0kwX0NGR0RBVEFfT0ZTKTsKLQotCXJldHVybiBndF9kZXZpZCA+PiAxNjsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9nYWxpbGVvLWJvYXJkcy9ldjk2MTAwL3RpbWUuYyBiL2FyY2gvbWlwcy9nYWxpbGVvLWJvYXJkcy9ldjk2MTAwL3RpbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNiZTg0Mi4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvZ2FsaWxlby1ib2FyZHMvZXY5NjEwMC90aW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCi0gKglHYWxpbGVvIEVWOTYxMDAgcnRjIHJvdXRpbmVzLgotICoKLSAqIENvcHlyaWdodCAyMDAwIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCi0gKiAgICAgICAgIAlwcG9wb3ZAbXZpc3RhLmNvbSBvciBzb3VyY2VAbXZpc3RhLmNvbQotICoKLSAqIFRoaXMgZmlsZSB3YXMgZGVyaXZlZCBmcm9tIENhcnN0ZW4gTGFuZ2dhYXJkJ3MKLSAqIGFyY2gvbWlwcy9taXBzLWJvYXJkcy9hdGxhcy9hdGxhc19ydGMuYy4KLSAqCi0gKiBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20KLSAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCi0gKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKLSAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC90aW1leC5oPgotCi0jaW5jbHVkZSA8YXNtL21pcHNyZWdzLmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS90aW1lLmg+Ci0KLQotI2RlZmluZSBBTExJTlRTIChJRV9JUlEwIHwgSUVfSVJRMSB8IElFX0lSUTIgfCBJRV9JUlEzIHwgSUVfSVJRNCB8IElFX0lSUTUpCi0KLWV4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHdhbGxfamlmZmllczsKLXVuc2lnbmVkIGxvbmcgbWlzc2VkX2hlYXJ0X2JlYXRzID0gMDsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgcjRrX29mZnNldDsgLyogQW1vdW50IHRvIGluY3JlbWVudCBjb21wYXJlIHJlZyBlYWNoIHRpbWUgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHI0a19jdXI7ICAgIC8qIFdoYXQgY291bnRlciBzaG91bGQgYmUgYXQgbmV4dCB0aW1lciBpcnEgKi8KLQotc3RhdGljIGlubGluZSB2b2lkIGFja19yNGt0aW1lcih1bnNpZ25lZCBsb25nIG5ld3ZhbCkKLXsKLQl3cml0ZV9jMF9jb21wYXJlKG5ld3ZhbCk7Ci19Ci0KLS8qCi0gKiBUaGVyZSBhcmUgYSBsb3Qgb2YgY29uY2VwdHVhbGx5IGJyb2tlbiB2ZXJzaW9ucyBvZiB0aGUgTUlQUyB0aW1lciBpbnRlcnJ1cHQKLSAqIGhhbmRsZXIgZmxvYXRpbmcgYXJvdW5kLiAgVGhpcyBvbmUgaXMgcmF0aGVyIGRpZmZlcmVudCwgYnV0IHRoZSBhbGdvcml0aG0KLSAqIGlzIHByb2JhYmx5IG1vcmUgcm9idXN0LgotICovCi12b2lkIG1pcHNfdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotICAgICAgICBpbnQgaXJxID0gNzsgLyogRklYIE1FICovCi0KLQlpZiAocjRrX29mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICBnb3RvIG51bGw7Ci0gICAgICAgIH0KLQotCWRvIHsKLQkJa3N0YXRfdGhpc19jcHUuaXJxc1tpcnFdKys7Ci0JCWRvX3RpbWVyKHJlZ3MpOwotI2lmbmRlZiBDT05GSUdfU01QCi0JCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShyZWdzKSk7Ci0jZW5kaWYKLQkJcjRrX2N1ciArPSByNGtfb2Zmc2V0OwotCQlhY2tfcjRrdGltZXIocjRrX2N1cik7Ci0KLQl9IHdoaWxlICgoKHVuc2lnbmVkIGxvbmcpcmVhZF9jMF9jb3VudCgpCi0gICAgICAgICAgICAgICAgICAgIC0gcjRrX2N1cikgPCAweDdmZmZmZmZmKTsKLQlyZXR1cm47Ci0KLW51bGw6Ci0JYWNrX3I0a3RpbWVyKDApOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvY3B1LXByb2JlLmMKaW5kZXggYWEyY2FhNi4uOWZiZjg0MyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9jcHUtcHJvYmUuYworKysgYi9hcmNoL21pcHMva2VybmVsL2NwdS1wcm9iZS5jCkBAIC0zOCwxNSArMzgsNDAgQEAKIAogc3RhdGljIHZvaWQgcjM5eHhfd2FpdCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgY2ZnID0gcmVhZF9jMF9jb25mKCk7Ci0Jd3JpdGVfYzBfY29uZihjZmcgfCBUWDM5X0NPTkZfSEFMVCk7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlpZiAoIW5lZWRfcmVzY2hlZCgpKQorCQl3cml0ZV9jMF9jb25mKHJlYWRfYzBfY29uZigpIHwgVFgzOV9DT05GX0hBTFQpOworCWxvY2FsX2lycV9lbmFibGUoKTsKIH0KIAorLyoKKyAqIFRoZXJlIGlzIGEgcmFjZSB3aGVuIFdBSVQgaW5zdHJ1Y3Rpb24gZXhlY3V0ZWQgd2l0aCBpbnRlcnJ1cHQKKyAqIGVuYWJsZWQuCisgKiBCdXQgaXQgaXMgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IHdoZXRlciB0aGUgcGlwZWxpZSByZXN0YXJ0cyB3aGVuCisgKiBhIG5vbi1lbmFibGVkIGludGVycnVwdCBpcyByZXF1ZXN0ZWQuCisgKi8KIHN0YXRpYyB2b2lkIHI0a193YWl0KHZvaWQpCiB7Ci0JX19hc21fXygiLnNldFx0bWlwczNcblx0IgotCQkid2FpdFxuXHQiCi0JCSIuc2V0XHRtaXBzMCIpOworCV9fYXNtX18oIgkuc2V0CW1pcHMzCQkJXG4iCisJCSIJd2FpdAkJCQlcbiIKKwkJIgkuc2V0CW1pcHMwCQkJXG4iKTsKK30KKworLyoKKyAqIFRoaXMgdmFyaWFudCBpcyBwcmVmZXJhYmxlIGFzIGl0IGFsbG93cyB0ZXN0aW5nIG5lZWRfcmVzY2hlZCBhbmQgZ29pbmcgdG8KKyAqIHNsZWVwIGRlcGVuZGluZyBvbiB0aGUgb3V0Y29tZSBhdG9taWNhbGx5LiAgVW5mb3J0dW5hdGVseSB0aGUgIkl0IGlzCisgKiBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQgd2hldGhlciB0aGUgcGlwZWxpbmUgcmVzdGFydHMgd2hlbiBhIG5vbi1lbmFibGVkCisgKiBpbnRlcnJ1cHQgaXMgcmVxdWVzdGVkIiByZXN0cmljdGlvbiBpbiB0aGUgTUlQUzMyL01JUFM2NCBhcmNoaXRlY3R1cmUgbWFrZXMKKyAqIHVzaW5nIHRoaXMgdmVyc2lvbiBhIGdhbWJsZS4KKyAqLworc3RhdGljIHZvaWQgcjRrX3dhaXRfaXJxb2ZmKHZvaWQpCit7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlpZiAoIW5lZWRfcmVzY2hlZCgpKQorCQlfX2FzbV9fKCIJLnNldAltaXBzMwkJXG4iCisJCQkiCXdhaXQJCQlcbiIKKwkJCSIJLnNldAltaXBzMAkJXG4iKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CiB9CiAKIC8qIFRoZSBBdTF4eHggd2FpdCBpcyBhdmFpbGFibGUgb25seSBpZiB1c2luZyAzMmtoeiBjb3VudGVyIG9yCkBAIC01NiwxNyArODEsMTcgQEAKIHN0YXRpYyB2b2lkIGF1MWtfd2FpdCh2b2lkKQogewogCS8qIHVzaW5nIHRoZSB3YWl0IGluc3RydWN0aW9uIG1ha2VzIENQMCBjb3VudGVyIHVudXNhYmxlICovCi0JX19hc21fXygiLnNldCBtaXBzM1xuXHQiCi0JCSJjYWNoZSAweDE0LCAwKCUwKVxuXHQiCi0JCSJjYWNoZSAweDE0LCAzMiglMClcblx0IgotCQkic3luY1xuXHQiCi0JCSJub3Bcblx0IgotCQkid2FpdFxuXHQiCi0JCSJub3Bcblx0IgotCQkibm9wXG5cdCIKLQkJIm5vcFxuXHQiCi0JCSJub3Bcblx0IgotCQkiLnNldCBtaXBzMFxuXHQiCisJX19hc21fXygiCS5zZXQJbWlwczMJCQlcbiIKKwkJIgljYWNoZQkweDE0LCAwKCUwKQkJXG4iCisJCSIJY2FjaGUJMHgxNCwgMzIoJTApCQlcbiIKKwkJIglzeW5jCQkJCVxuIgorCQkiCW5vcAkJCQlcbiIKKwkJIgl3YWl0CQkJCVxuIgorCQkiCW5vcAkJCQlcbiIKKwkJIglub3AJCQkJXG4iCisJCSIJbm9wCQkJCVxuIgorCQkiCW5vcAkJCQlcbiIKKwkJIgkuc2V0CW1pcHMwCQkJXG4iCiAJCTogOiAiciIgKGF1MWtfd2FpdCkpOwogfQogCkBAIC0xMTEsNyArMTM2LDYgQEAKIAljYXNlIENQVV9ORVZBREE6CiAJY2FzZSBDUFVfUk03MDAwOgogCWNhc2UgQ1BVX1JNOTAwMDoKLQljYXNlIENQVV9UWDQ5WFg6CiAJY2FzZSBDUFVfNEtDOgogCWNhc2UgQ1BVXzRLRUM6CiAJY2FzZSBDUFVfNEtTQzoKQEAgLTEyNSw2ICsxNDksMTAgQEAKIAkJY3B1X3dhaXQgPSByNGtfd2FpdDsKIAkJcHJpbnRrKCIgYXZhaWxhYmxlLlxuIik7CiAJCWJyZWFrOworCWNhc2UgQ1BVX1RYNDlYWDoKKwkJY3B1X3dhaXQgPSByNGtfd2FpdF9pcnFvZmY7CisJCXByaW50aygiIGF2YWlsYWJsZS5cbiIpOworCQlicmVhazsKIAljYXNlIENQVV9BVTEwMDA6CiAJY2FzZSBDUFVfQVUxMTAwOgogCWNhc2UgQ1BVX0FVMTUwMDoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaXJpeHNpZy5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcml4c2lnLmMKaW5kZXggNjc2ZTg2OC4uMjEzMjQ4NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pcml4c2lnLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pcml4c2lnLmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KIAogI3VuZGVmIERFQlVHX1NJRwogCkBAIC0xNzIsMTEgKzE3MywxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWFzbWxpbmthZ2UgaW50IGRvX2lyaXhfc2lnbmFsKHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQordm9pZCBkb19pcml4X3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qga19zaWdhY3Rpb24ga2E7CiAJc2lnaW5mb190IGluZm87CiAJaW50IHNpZ25yOworCXNpZ3NldF90ICpvbGRzZXQ7CiAKIAkvKgogCSAqIFdlIHdhbnQgdGhlIGNvbW1vbiBjYXNlIHRvIGdvIGZhc3QsIHdoaWNoIGlzIHdoeSB3ZSBtYXkgaW4gY2VydGFpbgpAQCAtMTg0LDE5ICsxODYsMjggQEAKIAkgKiBpZiBzby4KIAkgKi8KIAlpZiAoIXVzZXJfbW9kZShyZWdzKSkKLQkJcmV0dXJuIDE7CisJCXJldHVybjsKIAotCWlmICh0cnlfdG9fZnJlZXplKCkpCi0JCWdvdG8gbm9fc2lnbmFsOwotCi0JaWYgKCFvbGRzZXQpCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCisJCW9sZHNldCA9ICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrOworCWVsc2UKIAkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7CiAKIAlzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdzLCBOVUxMKTsKLQlpZiAoc2lnbnIgPiAwKQotCQlyZXR1cm4gaGFuZGxlX3NpZ25hbChzaWduciwgJmluZm8sICZrYSwgb2xkc2V0LCByZWdzKTsKKwlpZiAoc2lnbnIgPiAwKSB7CisJCS8qIFdoZWUhICBBY3R1YWxseSBkZWxpdmVyIHRoZSBzaWduYWwuICAqLworCQlpZiAoaGFuZGxlX3NpZ25hbChzaWduciwgJmluZm8sICZrYSwgb2xkc2V0LCByZWdzKSA9PSAwKSB7CisJCQkvKiBhIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZDsgdGhlIHNhdmVkCisJCQkgKiBzaWdtYXNrIHdpbGwgaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgc2lnbmFsIGZyYW1lLAorCQkJICogYW5kIHdpbGwgYmUgcmVzdG9yZWQgYnkgc2lncmV0dXJuLCBzbyB3ZSBjYW4gc2ltcGx5CisJCQkgKiBjbGVhciB0aGUgVElGX1JFU1RPUkVfU0lHTUFTSyBmbGFnICovCisJCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJfQogCi1ub19zaWduYWw6CisJCXJldHVybjsKKwl9CisKIAkvKgogCSAqIFdobydzIGNvZGUgZG9lc24ndCBjb25mb3JtIHRvIHRoZSByZXN0YXJ0YWJsZSBzeXNjYWxsIGNvbnZlbnRpb24KIAkgKiBkaWVzIGhlcmUhISEgIFRoZSBsaSBpbnN0cnVjdGlvbiwgYSBzaW5nbGUgbWFjaGluZSBpbnN0cnVjdGlvbiwKQEAgLTIwOCw4ICsyMTksMjIgQEAKIAkJICAgIHJlZ3MtPnJlZ3NbMl0gPT0gRVJFU1RBUlROT0lOVFIpIHsKIAkJCXJlZ3MtPmNwMF9lcGMgLT0gODsKIAkJfQorCQlpZiAocmVncy0+cmVnc1syXSA9PSBFUkVTVEFSVF9SRVNUQVJUQkxPQ0spIHsKKwkJCXJlZ3MtPnJlZ3NbMl0gPSBfX05SX3Jlc3RhcnRfc3lzY2FsbDsKKwkJCXJlZ3MtPnJlZ3NbN10gPSByZWdzLT5yZWdzWzI2XTsKKwkJCXJlZ3MtPmNwMF9lcGMgLT0gNDsKKwkJfQorCQlyZWdzLT5yZWdzWzBdID0gMDsJLyogRG9uJ3QgZGVhbCB3aXRoIHRoaXMgYWdhaW4uICAqLwogCX0KLQlyZXR1cm4gMDsKKworCS8qCisJKiBJZiB0aGVyZSdzIG5vIHNpZ25hbCB0byBkZWxpdmVyLCB3ZSBqdXN0IHB1dCB0aGUgc2F2ZWQgc2lnbWFzaworCSogYmFjaworCSovCisJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpIHsKKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmY3VycmVudC0+c2F2ZWRfc2lnbWFzaywgTlVMTCk7CisJfQogfQogCiBhc21saW5rYWdlIHZvaWQKQEAgLTI5OCw2ICszMjMsOSBAQAogCWludCBfdW51c2VkMFsyXTsKIH07CiAKKyNkZWZpbmUgU0lHX1NFVE1BU0szMgkyNTYJLyogR29vZGllIGZyb20gU0dJIGZvciBCU0QgY29tcGF0aWJpbGl0eToKKwkJCQkgICBzZXQgb25seSB0aGUgbG93IDMyIGJpdCBvZiB0aGUgc2lnc2V0LiAgKi8KKwogI2lmZGVmIERFQlVHX1NJRwogc3RhdGljIGlubGluZSB2b2lkIGR1bXBfc2lnYWN0X2lyaXg1KHN0cnVjdCBzaWdhY3RfaXJpeDUgKnApCiB7CkBAIC00MTMsNyArNDQxLDcgQEAKIAogYXNtbGlua2FnZSBpbnQgaXJpeF9zaWdzdXNwZW5kKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXNpZ3NldF90IHNhdmVzZXQsIG5ld3NldDsKKwlzaWdzZXRfdCBuZXdzZXQ7CiAJc2lnc2V0X3QgX191c2VyICp1c2V0OwogCiAJdXNldCA9IChzaWdzZXRfdCBfX3VzZXIgKikgcmVncy0+cmVnc1s0XTsKQEAgLTQyMiwxOCArNDUwLDE1IEBACiAJc2lnZGVsc2V0bWFzaygmbmV3c2V0LCB+X0JMT0NLQUJMRSk7CiAKIAlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQlzYXZlc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKKwljdXJyZW50LT5zYXZlZF9zaWdtYXNrID0gY3VycmVudC0+YmxvY2tlZDsKIAljdXJyZW50LT5ibG9ja2VkID0gbmV3c2V0OwogCXJlY2FsY19zaWdwZW5kaW5nKCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAotCXJlZ3MtPnJlZ3NbMl0gPSAtRUlOVFI7Ci0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0JCWlmIChkb19pcml4X3NpZ25hbCgmc2F2ZXNldCwgcmVncykpCi0JCQlyZXR1cm4gLUVJTlRSOwotCX0KKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZSgpOworCXNldF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwlyZXR1cm4gLUVSRVNUQVJUTk9IQU5EOwogfQogCiAvKiBoYXRlIGhhdGUgaGF0ZS4uLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9saW51eDMyLmMgYi9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYwppbmRleCA0NTBhYzU5Li40M2IxMTYyIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYworKysgYi9hcmNoL21pcHMva2VybmVsL2xpbnV4MzIuYwpAQCAtOTkxLDcgKzk5MSw3IEBACiAJdW5zaWduZWQgaW50IF9fdW51c2VkWzRdOwogfTsKIAotI2lmZGVmIENPTkZJR19TWVNDVEwKKyNpZmRlZiBDT05GSUdfU1lTQ1RMX1NZU0NBTEwKIAogYXNtbGlua2FnZSBsb25nIHN5czMyX3N5c2N0bChzdHJ1Y3Qgc3lzY3RsX2FyZ3MzMiBfX3VzZXIgKmFyZ3MpCiB7CkBAIC0xMDMyLDcgKzEwMzIsNyBAQAogCXJldHVybiBlcnJvcjsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKyNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMX1NZU0NBTEwgKi8KIAogYXNtbGlua2FnZSBsb25nIHN5czMyX25ld3VuYW1lKHN0cnVjdCBuZXdfdXRzbmFtZSBfX3VzZXIgKiBuYW1lKQogewpAQCAtMTI5Niw5ICsxMjk2LDMgQEAKIAlyZXR1cm4gZG9fZm9yayhjbG9uZV9mbGFncywgbmV3c3AsICZyZWdzLCAwLAogCSAgICAgICAgICAgICAgIHBhcmVudF90aWRwdHIsIGNoaWxkX3RpZHB0cik7CiB9Ci0KLWV4dGVybiBhc21saW5rYWdlIHZvaWQgc3lzX3NldF90aHJlYWRfYXJlYSh1MzIgYWRkcik7Ci1hc21saW5rYWdlIHZvaWQgc3lzMzJfc2V0X3RocmVhZF9hcmVhKHUzMiBhZGRyKQotewotCXN5c19zZXRfdGhyZWFkX2FyZWEoQUEoYWRkcikpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYwppbmRleCA3YWI2N2Y3Li4yNjEzYTBkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL21pcHMva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjczLDEwNCArMjczLDEwNyBAQAogCXJldHVybiBkb19mb3JrKGZsYWdzIHwgQ0xPTkVfVk0gfCBDTE9ORV9VTlRSQUNFRCwgMCwgJnJlZ3MsIDAsIE5VTEwsIE5VTEwpOwogfQogCi1zdGF0aWMgc3RydWN0IG1pcHNfZnJhbWVfaW5mbyB7Ci0Jdm9pZCAqZnVuYzsKLQl1bnNpZ25lZCBsb25nIGZ1bmNfc2l6ZTsKLQlpbnQgZnJhbWVfc2l6ZTsKLQlpbnQgcGNfb2Zmc2V0OwotfSAqc2NoZWR1bGVfZnJhbWUsIG1maW5mb1s2NF07Ci1zdGF0aWMgaW50IG1maW5mb19udW07CisvKgorICoKKyAqLworc3RydWN0IG1pcHNfZnJhbWVfaW5mbyB7CisJdm9pZAkJKmZ1bmM7CisJdW5zaWduZWQgbG9uZwlmdW5jX3NpemU7CisJaW50CQlmcmFtZV9zaXplOworCWludAkJcGNfb2Zmc2V0OworfTsKIAotc3RhdGljIGludCBfX2luaXQgZ2V0X2ZyYW1lX2luZm8oc3RydWN0IG1pcHNfZnJhbWVfaW5mbyAqaW5mbykKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3JhX3NhdmVfaW5zKHVuaW9uIG1pcHNfaW5zdHJ1Y3Rpb24gKmlwKQogewotCWludCBpOwotCXZvaWQgKmZ1bmMgPSBpbmZvLT5mdW5jOwotCXVuaW9uIG1pcHNfaW5zdHJ1Y3Rpb24gKmlwID0gKHVuaW9uIG1pcHNfaW5zdHJ1Y3Rpb24gKilmdW5jOwotCWluZm8tPnBjX29mZnNldCA9IC0xOwotCWluZm8tPmZyYW1lX3NpemUgPSAwOwotCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKywgaXArKykgewotCQkvKiBpZiBqYWwsIGphbHIsIGpyLCBzdG9wLiAqLwotCQlpZiAoaXAtPmpfZm9ybWF0Lm9wY29kZSA9PSBqYWxfb3AgfHwKLQkJICAgIChpcC0+cl9mb3JtYXQub3Bjb2RlID09IHNwZWNfb3AgJiYKLQkJICAgICAoaXAtPnJfZm9ybWF0LmZ1bmMgPT0gamFscl9vcCB8fAotCQkgICAgICBpcC0+cl9mb3JtYXQuZnVuYyA9PSBqcl9vcCkpKQotCQkJYnJlYWs7CisJLyogc3cgLyBzZCAkcmEsIG9mZnNldCgkc3ApICovCisJcmV0dXJuIChpcC0+aV9mb3JtYXQub3Bjb2RlID09IHN3X29wIHx8IGlwLT5pX2Zvcm1hdC5vcGNvZGUgPT0gc2Rfb3ApICYmCisJCWlwLT5pX2Zvcm1hdC5ycyA9PSAyOSAmJgorCQlpcC0+aV9mb3JtYXQucnQgPT0gMzE7Cit9CiAKLQkJaWYgKGluZm8tPmZ1bmNfc2l6ZSAmJiBpID49IGluZm8tPmZ1bmNfc2l6ZSAvIDQpCi0JCQlicmVhazsKLQkJaWYgKAotI2lmZGVmIENPTkZJR18zMkJJVAotCQkgICAgaXAtPmlfZm9ybWF0Lm9wY29kZSA9PSBhZGRpdV9vcCAmJgotI2VuZGlmCi0jaWZkZWYgQ09ORklHXzY0QklUCi0JCSAgICBpcC0+aV9mb3JtYXQub3Bjb2RlID09IGRhZGRpdV9vcCAmJgotI2VuZGlmCi0JCSAgICBpcC0+aV9mb3JtYXQucnMgPT0gMjkgJiYKLQkJICAgIGlwLT5pX2Zvcm1hdC5ydCA9PSAyOSkgewotCQkJLyogYWRkaXUvZGFkZGl1IHNwLHNwLC1pbW0gKi8KLQkJCWlmIChpbmZvLT5mcmFtZV9zaXplKQotCQkJCWNvbnRpbnVlOwotCQkJaW5mby0+ZnJhbWVfc2l6ZSA9IC0gaXAtPmlfZm9ybWF0LnNpbW1lZGlhdGU7Ci0JCX0KK3N0YXRpYyBpbmxpbmUgaW50IGlzX2phbF9qYWxyX2pyX2lucyh1bmlvbiBtaXBzX2luc3RydWN0aW9uICppcCkKK3sKKwlpZiAoaXAtPmpfZm9ybWF0Lm9wY29kZSA9PSBqYWxfb3ApCisJCXJldHVybiAxOworCWlmIChpcC0+cl9mb3JtYXQub3Bjb2RlICE9IHNwZWNfb3ApCisJCXJldHVybiAwOworCXJldHVybiBpcC0+cl9mb3JtYXQuZnVuYyA9PSBqYWxyX29wIHx8IGlwLT5yX2Zvcm1hdC5mdW5jID09IGpyX29wOworfQogCi0JCWlmICgKLSNpZmRlZiBDT05GSUdfMzJCSVQKLQkJICAgIGlwLT5pX2Zvcm1hdC5vcGNvZGUgPT0gc3dfb3AgJiYKLSNlbmRpZgotI2lmZGVmIENPTkZJR182NEJJVAotCQkgICAgaXAtPmlfZm9ybWF0Lm9wY29kZSA9PSBzZF9vcCAmJgotI2VuZGlmCi0JCSAgICBpcC0+aV9mb3JtYXQucnMgPT0gMjkgJiYKLQkJICAgIGlwLT5pX2Zvcm1hdC5ydCA9PSAzMSkgewotCQkJLyogc3cgLyBzZCAkcmEsIG9mZnNldCgkc3ApICovCi0JCQlpZiAoaW5mby0+cGNfb2Zmc2V0ICE9IC0xKQotCQkJCWNvbnRpbnVlOwotCQkJaW5mby0+cGNfb2Zmc2V0ID0KLQkJCQlpcC0+aV9mb3JtYXQuc2ltbWVkaWF0ZSAvIHNpemVvZihsb25nKTsKLQkJfQotCX0KLQlpZiAoaW5mby0+cGNfb2Zmc2V0ID09IC0xIHx8IGluZm8tPmZyYW1lX3NpemUgPT0gMCkgewotCQlpZiAoZnVuYyA9PSBzY2hlZHVsZSkKLQkJCXByaW50aygiQ2FuJ3QgYW5hbHl6ZSBwcm9sb2d1ZSBjb2RlIGF0ICVwXG4iLCBmdW5jKTsKLQkJaW5mby0+cGNfb2Zmc2V0ID0gLTE7Ci0JCWluZm8tPmZyYW1lX3NpemUgPSAwOwotCX0KLQorc3RhdGljIGlubGluZSBpbnQgaXNfc3BfbW92ZV9pbnModW5pb24gbWlwc19pbnN0cnVjdGlvbiAqaXApCit7CisJLyogYWRkaXUvZGFkZGl1IHNwLHNwLC1pbW0gKi8KKwlpZiAoaXAtPmlfZm9ybWF0LnJzICE9IDI5IHx8IGlwLT5pX2Zvcm1hdC5ydCAhPSAyOSkKKwkJcmV0dXJuIDA7CisJaWYgKGlwLT5pX2Zvcm1hdC5vcGNvZGUgPT0gYWRkaXVfb3AgfHwgaXAtPmlfZm9ybWF0Lm9wY29kZSA9PSBkYWRkaXVfb3ApCisJCXJldHVybiAxOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGdldF9mcmFtZV9pbmZvKHN0cnVjdCBtaXBzX2ZyYW1lX2luZm8gKmluZm8pCit7CisJdW5pb24gbWlwc19pbnN0cnVjdGlvbiAqaXAgPSBpbmZvLT5mdW5jOworCXVuc2lnbmVkIG1heF9pbnNucyA9IGluZm8tPmZ1bmNfc2l6ZSAvIHNpemVvZih1bmlvbiBtaXBzX2luc3RydWN0aW9uKTsKKwl1bnNpZ25lZCBpOworCisJaW5mby0+cGNfb2Zmc2V0ID0gLTE7CisJaW5mby0+ZnJhbWVfc2l6ZSA9IDA7CisKKwlpZiAoIWlwKQorCQlnb3RvIGVycjsKKworCWlmIChtYXhfaW5zbnMgPT0gMCkKKwkJbWF4X2luc25zID0gMTI4VTsJLyogdW5rbm93biBmdW5jdGlvbiBzaXplICovCisJbWF4X2luc25zID0gbWluKDEyOFUsIG1heF9pbnNucyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2luc25zOyBpKyssIGlwKyspIHsKKworCQlpZiAoaXNfamFsX2phbHJfanJfaW5zKGlwKSkKKwkJCWJyZWFrOworCQlpZiAoIWluZm8tPmZyYW1lX3NpemUpIHsKKwkJCWlmIChpc19zcF9tb3ZlX2lucyhpcCkpCisJCQkJaW5mby0+ZnJhbWVfc2l6ZSA9IC0gaXAtPmlfZm9ybWF0LnNpbW1lZGlhdGU7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoaW5mby0+cGNfb2Zmc2V0ID09IC0xICYmIGlzX3JhX3NhdmVfaW5zKGlwKSkgeworCQkJaW5mby0+cGNfb2Zmc2V0ID0KKwkJCQlpcC0+aV9mb3JtYXQuc2ltbWVkaWF0ZSAvIHNpemVvZihsb25nKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChpbmZvLT5mcmFtZV9zaXplICYmIGluZm8tPnBjX29mZnNldCA+PSAwKSAvKiBuZXN0ZWQgKi8KKwkJcmV0dXJuIDA7CisJaWYgKGluZm8tPnBjX29mZnNldCA8IDApIC8qIGxlYWYgKi8KKwkJcmV0dXJuIDE7CisJLyogcHJvbG9ndWUgc2VlbXMgYm9nZ3VzLi4uICovCitlcnI6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgc3RydWN0IG1pcHNfZnJhbWVfaW5mbyBzY2hlZHVsZV9tZmkgX19yZWFkX21vc3RseTsKKwogc3RhdGljIGludCBfX2luaXQgZnJhbWVfaW5mb19pbml0KHZvaWQpCiB7Ci0JaW50IGk7CisJdW5zaWduZWQgbG9uZyBzaXplID0gMDsKICNpZmRlZiBDT05GSUdfS0FMTFNZTVMKKwl1bnNpZ25lZCBsb25nIG9mczsKIAljaGFyICptb2RuYW1lOwogCWNoYXIgbmFtZWJ1ZltLU1lNX05BTUVfTEVOICsgMV07Ci0JdW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZSwgb2ZzOwotCWV4dGVybiBjaGFyIF9fc2NoZWRfdGV4dF9zdGFydFtdLCBfX3NjaGVkX3RleHRfZW5kW107Ci0JZXh0ZXJuIGNoYXIgX19sb2NrX3RleHRfc3RhcnRbXSwgX19sb2NrX3RleHRfZW5kW107CiAKLQlzdGFydCA9ICh1bnNpZ25lZCBsb25nKV9fc2NoZWRfdGV4dF9zdGFydDsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtZmluZm8pOyBpKyspIHsKLQkJaWYgKHN0YXJ0ID09ICh1bnNpZ25lZCBsb25nKXNjaGVkdWxlKQotCQkJc2NoZWR1bGVfZnJhbWUgPSAmbWZpbmZvW2ldOwotCQlpZiAoIWthbGxzeW1zX2xvb2t1cChzdGFydCwgJnNpemUsICZvZnMsICZtb2RuYW1lLCBuYW1lYnVmKSkKLQkJCWJyZWFrOwotCQltZmluZm9baV0uZnVuYyA9ICh2b2lkICopKHN0YXJ0ICsgb2ZzKTsKLQkJbWZpbmZvW2ldLmZ1bmNfc2l6ZSA9IHNpemU7Ci0JCXN0YXJ0ICs9IHNpemUgLSBvZnM7Ci0JCWlmIChzdGFydCA+PSAodW5zaWduZWQgbG9uZylfX2xvY2tfdGV4dF9lbmQpCi0JCQlicmVhazsKLQkJaWYgKHN0YXJ0ID09ICh1bnNpZ25lZCBsb25nKV9fc2NoZWRfdGV4dF9lbmQpCi0JCQlzdGFydCA9ICh1bnNpZ25lZCBsb25nKV9fbG9ja190ZXh0X3N0YXJ0OwotCX0KLSNlbHNlCi0JbWZpbmZvWzBdLmZ1bmMgPSBzY2hlZHVsZTsKLQlzY2hlZHVsZV9mcmFtZSA9ICZtZmluZm9bMF07CisJa2FsbHN5bXNfbG9va3VwKCh1bnNpZ25lZCBsb25nKXNjaGVkdWxlLCAmc2l6ZSwgJm9mcywgJm1vZG5hbWUsIG5hbWVidWYpOwogI2VuZGlmCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWZpbmZvKSAmJiBtZmluZm9baV0uZnVuYzsgaSsrKQotCQlnZXRfZnJhbWVfaW5mbygmbWZpbmZvW2ldKTsKKwlzY2hlZHVsZV9tZmkuZnVuYyA9IHNjaGVkdWxlOworCXNjaGVkdWxlX21maS5mdW5jX3NpemUgPSBzaXplOwogCi0JbWZpbmZvX251bSA9IGk7CisJZ2V0X2ZyYW1lX2luZm8oJnNjaGVkdWxlX21maSk7CisKKwkvKgorCSAqIFdpdGhvdXQgc2NoZWR1bGUoKSBmcmFtZSBpbmZvLCByZXN1bHQgZ2l2ZW4gYnkKKwkgKiB0aHJlYWRfc2F2ZWRfcGMoKSBhbmQgZ2V0X3djaGFuKCkgYXJlIG5vdCByZWxpYWJsZS4KKwkgKi8KKwlpZiAoc2NoZWR1bGVfbWZpLnBjX29mZnNldCA8IDApCisJCXByaW50aygiQ2FuJ3QgYW5hbHl6ZSBzY2hlZHVsZSgpIHByb2xvZ3VlIGF0ICVwXG4iLCBzY2hlZHVsZSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzg2LDU0ICszODksODYgQEAKIAkvKiBOZXcgYm9ybiBwcm9jZXNzZXMgYXJlIGEgc3BlY2lhbCBjYXNlICovCiAJaWYgKHQtPnJlZzMxID09ICh1bnNpZ25lZCBsb25nKSByZXRfZnJvbV9mb3JrKQogCQlyZXR1cm4gdC0+cmVnMzE7Ci0KLQlpZiAoIXNjaGVkdWxlX2ZyYW1lIHx8IHNjaGVkdWxlX2ZyYW1lLT5wY19vZmZzZXQgPCAwKQorCWlmIChzY2hlZHVsZV9tZmkucGNfb2Zmc2V0IDwgMCkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuICgodW5zaWduZWQgbG9uZyAqKXQtPnJlZzI5KVtzY2hlZHVsZV9mcmFtZS0+cGNfb2Zmc2V0XTsKKwlyZXR1cm4gKCh1bnNpZ25lZCBsb25nICopdC0+cmVnMjkpW3NjaGVkdWxlX21maS5wY19vZmZzZXRdOwogfQogCi0vKiBnZXRfd2NoYW4gLSBhIG1haW50ZW5hbmNlIG5pZ2h0bWFyZV5XXldwYWluIGluIHRoZSBhc3MgLi4uICAqLwotdW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKQorCisjaWZkZWYgQ09ORklHX0tBTExTWU1TCisvKiB1c2VkIGJ5IHNob3dfYmFja3RyYWNlKCkgKi8KK3Vuc2lnbmVkIGxvbmcgdW53aW5kX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3AsCisJCQkgICB1bnNpZ25lZCBsb25nIHBjLCB1bnNpZ25lZCBsb25nIHJhKQogewogCXVuc2lnbmVkIGxvbmcgc3RhY2tfcGFnZTsKLQl1bnNpZ25lZCBsb25nIHBjOwotI2lmZGVmIENPTkZJR19LQUxMU1lNUwotCXVuc2lnbmVkIGxvbmcgZnJhbWU7Ci0jZW5kaWYKKwlzdHJ1Y3QgbWlwc19mcmFtZV9pbmZvIGluZm87CisJY2hhciAqbW9kbmFtZTsKKwljaGFyIG5hbWVidWZbS1NZTV9OQU1FX0xFTiArIDFdOworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgb2ZzOworCWludCBsZWFmOwogCi0JaWYgKCFwIHx8IHAgPT0gY3VycmVudCB8fCBwLT5zdGF0ZSA9PSBUQVNLX1JVTk5JTkcpCisJc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZSh0YXNrKTsKKwlpZiAoIXN0YWNrX3BhZ2UpCiAJCXJldHVybiAwOwogCi0Jc3RhY2tfcGFnZSA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKTsKLQlpZiAoIXN0YWNrX3BhZ2UgfHwgIW1maW5mb19udW0pCisJaWYgKCFrYWxsc3ltc19sb29rdXAocGMsICZzaXplLCAmb2ZzLCAmbW9kbmFtZSwgbmFtZWJ1ZikpCisJCXJldHVybiAwOworCS8qCisJICogUmV0dXJuIHJhIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cmVkIGF0IHRoZSBmaXJzdCBpbnN0cnVjdGlvbgorCSAqLworCWlmICh1bmxpa2VseShvZnMgPT0gMCkpCisJCXJldHVybiByYTsKKworCWluZm8uZnVuYyA9ICh2b2lkICopKHBjIC0gb2ZzKTsKKwlpbmZvLmZ1bmNfc2l6ZSA9IG9mczsJLyogYW5hbHl6ZSBmcm9tIHN0YXJ0IHRvIG9mcyAqLworCWxlYWYgPSBnZXRfZnJhbWVfaW5mbygmaW5mbyk7CisJaWYgKGxlYWYgPCAwKQogCQlyZXR1cm4gMDsKIAotCXBjID0gdGhyZWFkX3NhdmVkX3BjKHApOwotI2lmZGVmIENPTkZJR19LQUxMU1lNUwotCWlmICghaW5fc2NoZWRfZnVuY3Rpb25zKHBjKSkKLQkJcmV0dXJuIHBjOworCWlmICgqc3AgPCBzdGFja19wYWdlIHx8CisJICAgICpzcCArIGluZm8uZnJhbWVfc2l6ZSA+IHN0YWNrX3BhZ2UgKyBUSFJFQURfU0laRSAtIDMyKQorCQlyZXR1cm4gMDsKIAotCWZyYW1lID0gcC0+dGhyZWFkLnJlZzI5ICsgc2NoZWR1bGVfZnJhbWUtPmZyYW1lX3NpemU7Ci0JZG8gewotCQlpbnQgaTsKKwlpZiAobGVhZikKKwkJLyoKKwkJICogRm9yIHNvbWUgZXh0cmVtZSBjYXNlcywgZ2V0X2ZyYW1lX2luZm8oKSBjYW4KKwkJICogY29uc2lkZXIgd3JvbmdseSBhIG5lc3RlZCBmdW5jdGlvbiBhcyBhIGxlYWYKKwkJICogb25lLiBJbiB0aGF0IGNhc2VzIGF2b2lkIHRvIHJldHVybiBhbHdheXMgdGhlCisJCSAqIHNhbWUgdmFsdWUuCisJCSAqLworCQlwYyA9IHBjICE9IHJhID8gcmEgOiAwOworCWVsc2UKKwkJcGMgPSAoKHVuc2lnbmVkIGxvbmcgKikoKnNwKSlbaW5mby5wY19vZmZzZXRdOwogCi0JCWlmIChmcmFtZSA8IHN0YWNrX3BhZ2UgfHwgZnJhbWUgPiBzdGFja19wYWdlICsgVEhSRUFEX1NJWkUgLSAzMikKLQkJCXJldHVybiAwOwotCi0JCWZvciAoaSA9IG1maW5mb19udW0gLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKHBjID49ICh1bnNpZ25lZCBsb25nKSBtZmluZm9baV0uZnVuYykKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoaSA8IDApCi0JCQlicmVhazsKLQotCQlwYyA9ICgodW5zaWduZWQgbG9uZyAqKWZyYW1lKVttZmluZm9baV0ucGNfb2Zmc2V0XTsKLQkJaWYgKCFtZmluZm9baV0uZnJhbWVfc2l6ZSkKLQkJCWJyZWFrOwotCQlmcmFtZSArPSBtZmluZm9baV0uZnJhbWVfc2l6ZTsKLQl9IHdoaWxlIChpbl9zY2hlZF9mdW5jdGlvbnMocGMpKTsKKwkqc3AgKz0gaW5mby5mcmFtZV9zaXplOworCXJldHVybiBfX2tlcm5lbF90ZXh0X2FkZHJlc3MocGMpID8gcGMgOiAwOworfQogI2VuZGlmCiAKKy8qCisgKiBnZXRfd2NoYW4gLSBhIG1haW50ZW5hbmNlIG5pZ2h0bWFyZV5XXldwYWluIGluIHRoZSBhc3MgLi4uCisgKi8KK3Vuc2lnbmVkIGxvbmcgZ2V0X3djaGFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwl1bnNpZ25lZCBsb25nIHBjID0gMDsKKyNpZmRlZiBDT05GSUdfS0FMTFNZTVMKKwl1bnNpZ25lZCBsb25nIHNwOworI2VuZGlmCisKKwlpZiAoIXRhc2sgfHwgdGFzayA9PSBjdXJyZW50IHx8IHRhc2stPnN0YXRlID09IFRBU0tfUlVOTklORykKKwkJZ290byBvdXQ7CisJaWYgKCF0YXNrX3N0YWNrX3BhZ2UodGFzaykpCisJCWdvdG8gb3V0OworCisJcGMgPSB0aHJlYWRfc2F2ZWRfcGModGFzayk7CisKKyNpZmRlZiBDT05GSUdfS0FMTFNZTVMKKwlzcCA9IHRhc2stPnRocmVhZC5yZWcyOSArIHNjaGVkdWxlX21maS5mcmFtZV9zaXplOworCisJd2hpbGUgKGluX3NjaGVkX2Z1bmN0aW9ucyhwYykpCisJCXBjID0gdW53aW5kX3N0YWNrKHRhc2ssICZzcCwgcGMsIDApOworI2VuZGlmCisKK291dDoKIAlyZXR1cm4gcGM7CiB9Ci0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUyBiL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUwppbmRleCBiYTFiY2Q4Li5lNzE3ODUxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TCkBAIC02NjIsNiArNjYyLDggQEAKIAlzeXMJc3lzX3RlZQkJCTQKIAlzeXMJc3lzX3Ztc3BsaWNlCQk0CiAJc3lzCXN5c19tb3ZlX3BhZ2VzCQk2CisJc3lzCXN5c19zZXRfcm9idXN0X2xpc3QJMgorCXN5cwlzeXNfZ2V0X3JvYnVzdF9saXN0CTMKIAkuZW5kbQogCiAJLyogV2UgcHJlLWNvbXB1dGUgdGhlIG51bWJlciBvZiBfaW5zdHJ1Y3Rpb25fIGJ5dGVzIG5lZWRlZCB0bwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtNjQuUwppbmRleCA5MzllMTcyZC4uNGMyMmQwYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LTY0LlMKQEAgLTQ2NiwzICs0NjYsNSBAQAogCVBUUglzeXNfdGVlCQkJCS8qIDUyNjUgKi8KIAlQVFIJc3lzX3Ztc3BsaWNlCiAJUFRSCXN5c19tb3ZlX3BhZ2VzCisJUFRSCXN5c19zZXRfcm9idXN0X2xpc3QKKwlQVFIJc3lzX2dldF9yb2J1c3RfbGlzdApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW4zMi5TIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW4zMi5TCmluZGV4IDk4YWJiYzUuLmYyNWMyYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1uMzIuUworKysgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbjMyLlMKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCVBUUglzeXNfY2Fwc2V0CiAJUFRSCXN5czMyX3J0X3NpZ3BlbmRpbmcJCS8qIDYxMjUgKi8KIAlQVFIJY29tcGF0X3N5c19ydF9zaWd0aW1lZHdhaXQKLQlQVFIJc3lzX3J0X3NpZ3F1ZXVlaW5mbworCVBUUglzeXMzMl9ydF9zaWdxdWV1ZWluZm8KIAlQVFIJc3lzbjMyX3J0X3NpZ3N1c3BlbmQKIAlQVFIJc3lzMzJfc2lnYWx0c3RhY2sKIAlQVFIJY29tcGF0X3N5c191dGltZQkJLyogNjEzMCAqLwpAQCAtMzkwLDUgKzM5MCw3IEBACiAJUFRSCXN5c19zcGxpY2UKIAlQVFIJc3lzX3N5bmNfZmlsZV9yYW5nZQogCVBUUglzeXNfdGVlCi0JUFRSCXN5c192bXNwbGljZQkJCS8qIDYyNzEgKi8KKwlQVFIJc3lzX3Ztc3BsaWNlCQkJLyogNjI3MCAqLwogCVBUUglzeXNfbW92ZV9wYWdlcworCVBUUgljb21wYXRfc3lzX3NldF9yb2J1c3RfbGlzdAorCVBUUgljb21wYXRfc3lzX2dldF9yb2J1c3RfbGlzdApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW8zMi5TIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDY0LW8zMi5TCmluZGV4IDUwNWM5ZWUuLjI4OGVlNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGw2NC1vMzIuUworKysgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsNjQtbzMyLlMKQEAgLTQ5OCw3ICs0OTgsNyBAQAogCVBUUglzeXNfbWtub2RhdAkJCS8qIDQyOTAgKi8KIAlQVFIJc3lzX2ZjaG93bmF0CiAJUFRSCWNvbXBhdF9zeXNfZnV0aW1lc2F0Ci0JUFRSCWNvbXBhdF9zeXNfbmV3ZnN0YXRhdAorCVBUUglzeXNfbmV3ZnN0YXRhdAogCVBUUglzeXNfdW5saW5rYXQKIAlQVFIJc3lzX3JlbmFtZWF0CQkJLyogNDI5NSAqLwogCVBUUglzeXNfbGlua2F0CkBAIC01MTQsNCArNTE0LDYgQEAKIAlQVFIJc3lzX3RlZQogCVBUUglzeXNfdm1zcGxpY2UKIAlQVFIJY29tcGF0X3N5c19tb3ZlX3BhZ2VzCisJUFRSCWNvbXBhdF9zeXNfc2V0X3JvYnVzdF9saXN0CisJUFRSCWNvbXBhdF9zeXNfZ2V0X3JvYnVzdF9saXN0CS8qIDQzMTAgKi8KIAkuc2l6ZQlzeXNfY2FsbF90YWJsZSwuLXN5c19jYWxsX3RhYmxlCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NldHVwLmMgYi9hcmNoL21pcHMva2VybmVsL3NldHVwLmMKaW5kZXggOGMyYjU5Ni4uZmRiYjUwOCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYwpAQCAtMTAsMjkgKzEwLDE1IEBACiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLgogICogQ29weXJpZ2h0IChDKSAyMDAwIDIwMDEsIDIwMDIgIE1hY2llaiBXLiBSb3p5Y2tpCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0cmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KIAogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KQEAgLTk2LDYgKzgyLDEyIEBACiAJaW50IHggPSBib290X21lbV9tYXAubnJfbWFwOwogCXN0cnVjdCBib290X21lbV9tYXBfZW50cnkgKnByZXYgPSBib290X21lbV9tYXAubWFwICsgeCAtIDE7CiAKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoc3RhcnQgKyBzaXplIDwgc3RhcnQpIHsKKwkJcHJpbnRrKCJUcnlpbmcgdG8gYWRkIGFuIGludmFsaWQgbWVtb3J5IHJlZ2lvbiwgc2tpcHBlZFxuIik7CisJCXJldHVybjsKKwl9CisKIAkvKgogCSAqIFRyeSB0byBtZXJnZSB3aXRoIHByZXZpb3VzIGVudHJ5IGlmIGFueS4gIFRoaXMgaXMgZmFyIGxlc3MgdGhhbgogCSAqIHBlcmZlY3QgYnV0IGlzIHN1ZmZpY2llbnQgZm9yIG1vc3QgcmVhbCB3b3JsZCBjYXNlcy4KQEAgLTE0MywxNjcgKzEzNSwxMzIgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwYXJzZV9jbWRsaW5lX2Vhcmx5KHZvaWQpCisvKgorICogTWFuYWdlIGluaXRyZAorICovCisjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECisKK3N0YXRpYyBpbnQgX19pbml0IHJkX3N0YXJ0X2Vhcmx5KGNoYXIgKnApCiB7Ci0JY2hhciBjID0gJyAnLCAqdG8gPSBjb21tYW5kX2xpbmUsICpmcm9tID0gc2F2ZWRfY29tbWFuZF9saW5lOwotCXVuc2lnbmVkIGxvbmcgc3RhcnRfYXQsIG1lbV9zaXplOwotCWludCBsZW4gPSAwOwotCWludCB1c2VybWVtID0gMDsKLQotCXByaW50aygiRGV0ZXJtaW5lZCBwaHlzaWNhbCBSQU0gbWFwOlxuIik7Ci0JcHJpbnRfbWVtb3J5X21hcCgpOwotCi0JZm9yICg7OykgewotCQkvKgotCQkgKiAibWVtPVhYWFtrS21NXSIgZGVmaW5lcyBhIG1lbW9yeSByZWdpb24gZnJvbQotCQkgKiAwIHRvIDxYWFg+LCBvdmVycmlkaW5nIHRoZSBkZXRlcm1pbmVkIHNpemUuCi0JCSAqICJtZW09WFhYW0trbU1dQFlZWVtLa21NXSIgZGVmaW5lcyBhIG1lbW9yeSByZWdpb24gZnJvbQotCQkgKiA8WVlZPiB0byA8WVlZPis8WFhYPiwgb3ZlcnJpZGluZyB0aGUgZGV0ZXJtaW5lZCBzaXplLgotCQkgKi8KLQkJaWYgKGMgPT0gJyAnICYmICFtZW1jbXAoZnJvbSwgIm1lbT0iLCA0KSkgewotCQkJaWYgKHRvICE9IGNvbW1hbmRfbGluZSkKLQkJCQl0by0tOwotCQkJLyoKLQkJCSAqIElmIGEgdXNlciBzcGVjaWZpZXMgbWVtb3J5IHNpemUsIHdlCi0JCQkgKiBibG93IGF3YXkgYW55IGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCi0JCQkgKiBzaXplLgotCQkJICovCi0JCQlpZiAodXNlcm1lbSA9PSAwKSB7Ci0JCQkJYm9vdF9tZW1fbWFwLm5yX21hcCA9IDA7Ci0JCQkJdXNlcm1lbSA9IDE7Ci0JCQl9Ci0JCQltZW1fc2l6ZSA9IG1lbXBhcnNlKGZyb20gKyA0LCAmZnJvbSk7Ci0JCQlpZiAoKmZyb20gPT0gJ0AnKQotCQkJCXN0YXJ0X2F0ID0gbWVtcGFyc2UoZnJvbSArIDEsICZmcm9tKTsKLQkJCWVsc2UKLQkJCQlzdGFydF9hdCA9IDA7Ci0JCQlhZGRfbWVtb3J5X3JlZ2lvbihzdGFydF9hdCwgbWVtX3NpemUsIEJPT1RfTUVNX1JBTSk7Ci0JCX0KLQkJYyA9ICooZnJvbSsrKTsKLQkJaWYgKCFjKQotCQkJYnJlYWs7Ci0JCWlmIChDTF9TSVpFIDw9ICsrbGVuKQotCQkJYnJlYWs7Ci0JCSoodG8rKykgPSBjOwotCX0KLQkqdG8gPSAnXDAnOwotCi0JaWYgKHVzZXJtZW0pIHsKLQkJcHJpbnRrKCJVc2VyLWRlZmluZWQgcGh5c2ljYWwgUkFNIG1hcDpcbiIpOwotCQlwcmludF9tZW1vcnlfbWFwKCk7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIGludCBwYXJzZV9yZF9jbWRsaW5lKHVuc2lnbmVkIGxvbmcqIHJkX3N0YXJ0LCB1bnNpZ25lZCBsb25nKiByZF9lbmQpCi17Ci0JLyoKLQkgKiAicmRfc3RhcnQ9MHhOTk5OTk5OTiIgZGVmaW5lcyB0aGUgbWVtb3J5IGFkZHJlc3Mgb2YgYW4gaW5pdHJkCi0JICogInJkX3NpemU9MHhOTiIgaXQncyBzaXplCi0JICovCi0JdW5zaWduZWQgbG9uZyBzdGFydCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBzaXplID0gMDsKLQl1bnNpZ25lZCBsb25nIGVuZDsKLQljaGFyIGNtZF9saW5lW0NMX1NJWkVdOwotCWNoYXIgKnN0YXJ0X3N0cjsKLQljaGFyICpzaXplX3N0cjsKLQljaGFyICp0bXA7Ci0KLQlzdHJjcHkoY21kX2xpbmUsIGNvbW1hbmRfbGluZSk7Ci0JKmNvbW1hbmRfbGluZSA9IDA7Ci0JdG1wID0gY21kX2xpbmU7Ci0JLyogSWdub3JlICJyZF9zdGFydD0iIHN0cmluZ3MgaW4gb3RoZXIgcGFyYW1ldGVycy4gKi8KLQlzdGFydF9zdHIgPSBzdHJzdHIoY21kX2xpbmUsICJyZF9zdGFydD0iKTsKLQlpZiAoc3RhcnRfc3RyICYmIHN0YXJ0X3N0ciAhPSBjbWRfbGluZSAmJiAqKHN0YXJ0X3N0ciAtIDEpICE9ICcgJykKLQkJc3RhcnRfc3RyID0gc3Ryc3RyKHN0YXJ0X3N0ciwgIiByZF9zdGFydD0iKTsKLQl3aGlsZSAoc3RhcnRfc3RyKSB7Ci0JCWlmIChzdGFydF9zdHIgIT0gY21kX2xpbmUpCi0JCQlzdHJuY2F0KGNvbW1hbmRfbGluZSwgdG1wLCBzdGFydF9zdHIgLSB0bXApOwotCQlzdGFydCA9IG1lbXBhcnNlKHN0YXJ0X3N0ciArIDksICZzdGFydF9zdHIpOwotCQl0bXAgPSBzdGFydF9zdHIgKyAxOwotCQlzdGFydF9zdHIgPSBzdHJzdHIoc3RhcnRfc3RyLCAiIHJkX3N0YXJ0PSIpOwotCX0KLQlpZiAoKnRtcCkKLQkJc3RyY2F0KGNvbW1hbmRfbGluZSwgdG1wKTsKLQotCXN0cmNweShjbWRfbGluZSwgY29tbWFuZF9saW5lKTsKLQkqY29tbWFuZF9saW5lID0gMDsKLQl0bXAgPSBjbWRfbGluZTsKLQkvKiBJZ25vcmUgInJkX3NpemUiIHN0cmluZ3MgaW4gb3RoZXIgcGFyYW1ldGVycy4gKi8KLQlzaXplX3N0ciA9IHN0cnN0cihjbWRfbGluZSwgInJkX3NpemU9Iik7Ci0JaWYgKHNpemVfc3RyICYmIHNpemVfc3RyICE9IGNtZF9saW5lICYmICooc2l6ZV9zdHIgLSAxKSAhPSAnICcpCi0JCXNpemVfc3RyID0gc3Ryc3RyKHNpemVfc3RyLCAiIHJkX3NpemU9Iik7Ci0Jd2hpbGUgKHNpemVfc3RyKSB7Ci0JCWlmIChzaXplX3N0ciAhPSBjbWRfbGluZSkKLQkJCXN0cm5jYXQoY29tbWFuZF9saW5lLCB0bXAsIHNpemVfc3RyIC0gdG1wKTsKLQkJc2l6ZSA9IG1lbXBhcnNlKHNpemVfc3RyICsgOCwgJnNpemVfc3RyKTsKLQkJdG1wID0gc2l6ZV9zdHIgKyAxOwotCQlzaXplX3N0ciA9IHN0cnN0cihzaXplX3N0ciwgIiByZF9zaXplPSIpOwotCX0KLQlpZiAoKnRtcCkKLQkJc3RyY2F0KGNvbW1hbmRfbGluZSwgdG1wKTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gbWVtcGFyc2UocCwgJnApOwogCiAjaWZkZWYgQ09ORklHXzY0QklUCiAJLyogSEFDSzogR3Vlc3MgaWYgdGhlIHNpZ24gZXh0ZW5zaW9uIHdhcyBmb3Jnb3R0ZW4gKi8KIAlpZiAoc3RhcnQgPiAweDAwMDAwMDAwODAwMDAwMDAgJiYgc3RhcnQgPCAweDAwMDAwMDAwZmZmZmZmZmYpCiAJCXN0YXJ0IHw9IDB4ZmZmZmZmZmYwMDAwMDAwMFVMOwogI2VuZGlmCisJaW5pdHJkX3N0YXJ0ID0gc3RhcnQ7CisJaW5pdHJkX2VuZCArPSBzdGFydDsKIAotCWVuZCA9IHN0YXJ0ICsgc2l6ZTsKLQlpZiAoc3RhcnQgJiYgZW5kKSB7Ci0JCSpyZF9zdGFydCA9IHN0YXJ0OwotCQkqcmRfZW5kID0gZW5kOwotCQlyZXR1cm4gMTsKLQl9CiAJcmV0dXJuIDA7CiB9CitlYXJseV9wYXJhbSgicmRfc3RhcnQiLCByZF9zdGFydF9lYXJseSk7CiAKLSNkZWZpbmUgTUFYTUVNCQlISUdITUVNX1NUQVJUCi0jZGVmaW5lIE1BWE1FTV9QRk4JUEZOX0RPV04oTUFYTUVNKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYm9vdG1lbV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCByZF9zaXplX2Vhcmx5KGNoYXIgKnApCiB7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF9wZm47Ci0JdW5zaWduZWQgbG9uZyByZXNlcnZlZF9lbmQgPSAodW5zaWduZWQgbG9uZykmX2VuZDsKLSNpZm5kZWYgQ09ORklHX1NHSV9JUDI3Ci0JdW5zaWduZWQgbG9uZyBmaXJzdF91c2FibGVfcGZuOwotCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9zaXplOwotCWludCBpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECi0JaW50IGluaXRyZF9yZXNlcnZlX2Jvb3RtZW0gPSAwOworCWluaXRyZF9lbmQgKz0gbWVtcGFyc2UocCwgJnApOwogCi0JLyogQm9hcmQgc3BlY2lmaWMgY29kZSBzaG91bGQgaGF2ZSBzZXQgdXAgaW5pdHJkX3N0YXJ0IGFuZCBpbml0cmRfZW5kICovCi0gCVJPT1RfREVWID0gUm9vdF9SQU0wOwotCWlmIChwYXJzZV9yZF9jbWRsaW5lKCZpbml0cmRfc3RhcnQsICZpbml0cmRfZW5kKSkgewotCQlyZXNlcnZlZF9lbmQgPSBtYXgocmVzZXJ2ZWRfZW5kLCBpbml0cmRfZW5kKTsKLQkJaW5pdHJkX3Jlc2VydmVfYm9vdG1lbSA9IDE7Ci0JfSBlbHNlIHsKLQkJdW5zaWduZWQgbG9uZyB0bXA7Ci0JCXUzMiAqaW5pdHJkX2hlYWRlcjsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJyZF9zaXplIiwgcmRfc2l6ZV9lYXJseSk7CiAKLQkJdG1wID0gKChyZXNlcnZlZF9lbmQgKyBQQUdFX1NJWkUtMSkgJiBQQUdFX01BU0spIC0gc2l6ZW9mKHUzMikgKiAyOwotCQlpZiAodG1wIDwgcmVzZXJ2ZWRfZW5kKQotCQkJdG1wICs9IFBBR0VfU0laRTsKLQkJaW5pdHJkX2hlYWRlciA9ICh1MzIgKil0bXA7Ci0JCWlmIChpbml0cmRfaGVhZGVyWzBdID09IDB4NDk0RTUyNDQpIHsKLQkJCWluaXRyZF9zdGFydCA9ICh1bnNpZ25lZCBsb25nKSZpbml0cmRfaGVhZGVyWzJdOwotCQkJaW5pdHJkX2VuZCA9IGluaXRyZF9zdGFydCArIGluaXRyZF9oZWFkZXJbMV07Ci0JCQlyZXNlcnZlZF9lbmQgPSBtYXgocmVzZXJ2ZWRfZW5kLCBpbml0cmRfZW5kKTsKLQkJCWluaXRyZF9yZXNlcnZlX2Jvb3RtZW0gPSAxOwotCQl9Ci0JfQotI2VuZGlmCS8qIENPTkZJR19CTEtfREVWX0lOSVRSRCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGluaXRfaW5pdHJkKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB0bXAsIGVuZCwgc2l6ZTsKKwl1MzIgKmluaXRyZF9oZWFkZXI7CisKKwlST09UX0RFViA9IFJvb3RfUkFNMDsKIAogCS8qCi0JICogUGFydGlhbGx5IHVzZWQgcGFnZXMgYXJlIG5vdCB1c2FibGUgLSB0aHVzCi0JICogd2UgYXJlIHJvdW5kaW5nIHVwd2FyZHMuCisJICogQm9hcmQgc3BlY2lmaWMgY29kZSBvciBjb21tYW5kIGxpbmUgcGFyc2VyIHNob3VsZCBoYXZlCisJICogYWxyZWFkeSBzZXQgdXAgaW5pdHJkX3N0YXJ0IGFuZCBpbml0cmRfZW5kLiBJbiB0aGVzZSBjYXNlcworCSAqIHBlcmZvbSBzYW5pdHkgY2hlY2tzIGFuZCB1c2UgdGhlbSBpZiBhbGwgbG9va3MgZ29vZC4KIAkgKi8KLQlzdGFydF9wZm4gPSBQRk5fVVAoQ1BIWVNBRERSKHJlc2VydmVkX2VuZCkpOworCXNpemUgPSBpbml0cmRfZW5kIC0gaW5pdHJkX3N0YXJ0OworCWlmIChpbml0cmRfZW5kID09IDAgfHwgc2l6ZSA9PSAwKSB7CisJCWluaXRyZF9zdGFydCA9IDA7CisJCWluaXRyZF9lbmQgPSAwOworCX0gZWxzZQorCQlyZXR1cm4gaW5pdHJkX2VuZDsKIAotI2lmbmRlZiBDT05GSUdfU0dJX0lQMjcKLQkvKiBGaW5kIHRoZSBoaWdoZXN0IHBhZ2UgZnJhbWUgbnVtYmVyIHdlIGhhdmUgYXZhaWxhYmxlLiAgKi8KLQltYXhfcGZuID0gMDsKLQlmaXJzdF91c2FibGVfcGZuID0gLTFVTDsKKwllbmQgPSAodW5zaWduZWQgbG9uZykmX2VuZDsKKwl0bXAgPSBQQUdFX0FMSUdOKGVuZCkgLSBzaXplb2YodTMyKSAqIDI7CisJaWYgKHRtcCA8IGVuZCkKKwkJdG1wICs9IFBBR0VfU0laRTsKKworCWluaXRyZF9oZWFkZXIgPSAodTMyICopdG1wOworCWlmIChpbml0cmRfaGVhZGVyWzBdID09IDB4NDk0RTUyNDQpIHsKKwkJaW5pdHJkX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpJmluaXRyZF9oZWFkZXJbMl07CisJCWluaXRyZF9lbmQgPSBpbml0cmRfc3RhcnQgKyBpbml0cmRfaGVhZGVyWzFdOworCX0KKwlyZXR1cm4gaW5pdHJkX2VuZDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGZpbmFsaXplX2luaXRyZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGluaXRyZF9lbmQgLSBpbml0cmRfc3RhcnQ7CisKKwlpZiAoc2l6ZSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkluaXRyZCBub3QgZm91bmQgb3IgZW1wdHkiKTsKKwkJZ290byBkaXNhYmxlOworCX0KKwlpZiAoQ1BIWVNBRERSKGluaXRyZF9lbmQpID4gUEZOX1BIWVMobWF4X2xvd19wZm4pKSB7CisJCXByaW50aygiSW5pdHJkIGV4dGVuZHMgYmV5b25kIGVuZCBvZiBtZW1vcnkiKTsKKwkJZ290byBkaXNhYmxlOworCX0KKworCXJlc2VydmVfYm9vdG1lbShDUEhZU0FERFIoaW5pdHJkX3N0YXJ0KSwgc2l6ZSk7CisJaW5pdHJkX2JlbG93X3N0YXJ0X29rID0gMTsKKworCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWwgcmFtZGlzayBhdDogMHglbHggKCVsdSBieXRlcylcbiIsCisJICAgICAgIGluaXRyZF9zdGFydCwgc2l6ZSk7CisJcmV0dXJuOworZGlzYWJsZToKKwlwcmludGsoIiAtIGRpc2FibGluZyBpbml0cmRcbiIpOworCWluaXRyZF9zdGFydCA9IDA7CisJaW5pdHJkX2VuZCA9IDA7Cit9CisKKyNlbHNlICAvKiAhQ09ORklHX0JMS19ERVZfSU5JVFJEICovCisKKyNkZWZpbmUgaW5pdF9pbml0cmQoKQkJMAorI2RlZmluZSBmaW5hbGl6ZV9pbml0cmQoKQlkbyB7fSB3aGlsZSAoMCkKKworI2VuZGlmCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBib290bWVtIGFsbG9jYXRvci4gSXQgYWxzbyBzZXR1cCBpbml0cmQgcmVsYXRlZCBkYXRhCisgKiBpZiBuZWVkZWQuCisgKi8KKyNpZmRlZiBDT05GSUdfU0dJX0lQMjcKKworc3RhdGljIHZvaWQgX19pbml0IGJvb3RtZW1faW5pdCh2b2lkKQoreworCWluaXRfaW5pdHJkKCk7CisJZmluYWxpemVfaW5pdHJkKCk7Cit9CisKKyNlbHNlICAvKiAhQ09ORklHX1NHSV9JUDI3ICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBib290bWVtX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlc2VydmVkX2VuZDsKKwl1bnNpZ25lZCBsb25nIGhpZ2hlc3QgPSAwOworCXVuc2lnbmVkIGxvbmcgbWFwc3RhcnQgPSAtMVVMOworCXVuc2lnbmVkIGxvbmcgYm9vdG1hcF9zaXplOworCWludCBpOworCisJLyoKKwkgKiBJbml0IGFueSBkYXRhIHJlbGF0ZWQgdG8gaW5pdHJkLiBJdCdzIGEgbm9wIGlmIElOSVRSRCBpcworCSAqIG5vdCBzZWxlY3RlZC4gT25jZSB0aGF0IGRvbmUgd2UgY2FuIGRldGVybWluZSB0aGUgbG93IGJvdW5kCisJICogb2YgdXNhYmxlIG1lbW9yeS4KKwkgKi8KKwlyZXNlcnZlZF9lbmQgPSBpbml0X2luaXRyZCgpOworCXJlc2VydmVkX2VuZCA9IFBGTl9VUChDUEhZU0FERFIobWF4KHJlc2VydmVkX2VuZCwgKHVuc2lnbmVkIGxvbmcpJl9lbmQpKSk7CisKKwkvKgorCSAqIEZpbmQgdGhlIGhpZ2hlc3QgcGFnZSBmcmFtZSBudW1iZXIgd2UgaGF2ZSBhdmFpbGFibGUuCisJICovCiAJZm9yIChpID0gMDsgaSA8IGJvb3RfbWVtX21hcC5ucl9tYXA7IGkrKykgewogCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CiAKQEAgLTMxMiw1NiArMjY5LDM4IEBACiAKIAkJc3RhcnQgPSBQRk5fVVAoYm9vdF9tZW1fbWFwLm1hcFtpXS5hZGRyKTsKIAkJZW5kID0gUEZOX0RPV04oYm9vdF9tZW1fbWFwLm1hcFtpXS5hZGRyCi0JCSAgICAgICsgYm9vdF9tZW1fbWFwLm1hcFtpXS5zaXplKTsKKwkJCQkrIGJvb3RfbWVtX21hcC5tYXBbaV0uc2l6ZSk7CiAKLQkJaWYgKHN0YXJ0ID49IGVuZCkKKwkJaWYgKGVuZCA+IGhpZ2hlc3QpCisJCQloaWdoZXN0ID0gZW5kOworCQlpZiAoZW5kIDw9IHJlc2VydmVkX2VuZCkKIAkJCWNvbnRpbnVlOwotCQlpZiAoZW5kID4gbWF4X3BmbikKLQkJCW1heF9wZm4gPSBlbmQ7Ci0JCWlmIChzdGFydCA8IGZpcnN0X3VzYWJsZV9wZm4pIHsKLQkJCWlmIChzdGFydCA+IHN0YXJ0X3BmbikgewotCQkJCWZpcnN0X3VzYWJsZV9wZm4gPSBzdGFydDsKLQkJCX0gZWxzZSBpZiAoZW5kID4gc3RhcnRfcGZuKSB7Ci0JCQkJZmlyc3RfdXNhYmxlX3BmbiA9IHN0YXJ0X3BmbjsKLQkJCX0KLQkJfQorCQlpZiAoc3RhcnQgPj0gbWFwc3RhcnQpCisJCQljb250aW51ZTsKKwkJbWFwc3RhcnQgPSBtYXgocmVzZXJ2ZWRfZW5kLCBzdGFydCk7CiAJfQogCiAJLyoKIAkgKiBEZXRlcm1pbmUgbG93IGFuZCBoaWdoIG1lbW9yeSByYW5nZXMKIAkgKi8KLQltYXhfbG93X3BmbiA9IG1heF9wZm47Ci0JaWYgKG1heF9sb3dfcGZuID4gTUFYTUVNX1BGTikgewotCQltYXhfbG93X3BmbiA9IE1BWE1FTV9QRk47Ci0jaWZuZGVmIENPTkZJR19ISUdITUVNCi0JCS8qIE1heGltdW0gbWVtb3J5IHVzYWJsZSBpcyB3aGF0IGlzIGRpcmVjdGx5IGFkZHJlc3NhYmxlICovCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgIldhcm5pbmcgb25seSAlbGRNQiB3aWxsIGJlIHVzZWQuXG4iLAotCQkgICAgICAgTUFYTUVNID4+IDIwKTsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVXNlIGEgSElHSE1FTSBlbmFibGVkIGtlcm5lbC5cbiIpOwotI2VuZGlmCi0JfQotCisJaWYgKGhpZ2hlc3QgPiBQRk5fRE9XTihISUdITUVNX1NUQVJUKSkgewogI2lmZGVmIENPTkZJR19ISUdITUVNCi0JLyoKLQkgKiBDcnVkZSwgd2UgcmVhbGx5IHNob3VsZCBtYWtlIGEgYmV0dGVyIGF0dGVtcHQgYXQgZGV0ZWN0aW5nCi0JICogaGlnaHN0YXJ0X3BmbgotCSAqLwotCWhpZ2hzdGFydF9wZm4gPSBoaWdoZW5kX3BmbiA9IG1heF9wZm47Ci0JaWYgKG1heF9wZm4gPiBNQVhNRU1fUEZOKSB7Ci0JCWhpZ2hzdGFydF9wZm4gPSBNQVhNRU1fUEZOOwotCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVsZE1CIEhJR0hNRU0gYXZhaWxhYmxlLlxuIiwKLQkJICAgICAgIChoaWdoZW5kX3BmbiAtIGhpZ2hzdGFydF9wZm4pID4+ICgyMCAtIFBBR0VfU0hJRlQpKTsKLQl9CisJCWhpZ2hzdGFydF9wZm4gPSBQRk5fRE9XTihISUdITUVNX1NUQVJUKTsKKwkJaGlnaGVuZF9wZm4gPSBoaWdoZXN0OwogI2VuZGlmCisJCWhpZ2hlc3QgPSBQRk5fRE9XTihISUdITUVNX1NUQVJUKTsKKwl9CiAKLQkvKiBJbml0aWFsaXplIHRoZSBib290LXRpbWUgYWxsb2NhdG9yIHdpdGggbG93IG1lbW9yeSBvbmx5LiAgKi8KLQlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW0oZmlyc3RfdXNhYmxlX3BmbiwgbWF4X2xvd19wZm4pOworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgYm9vdC10aW1lIGFsbG9jYXRvciB3aXRoIGxvdyBtZW1vcnkgb25seS4KKwkgKi8KKwlib290bWFwX3NpemUgPSBpbml0X2Jvb3RtZW0obWFwc3RhcnQsIGhpZ2hlc3QpOwogCiAJLyoKIAkgKiBSZWdpc3RlciBmdWxseSBhdmFpbGFibGUgbG93IFJBTSBwYWdlcyB3aXRoIHRoZSBib290bWVtIGFsbG9jYXRvci4KIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgYm9vdF9tZW1fbWFwLm5yX21hcDsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgY3Vycl9wZm4sIGxhc3RfcGZuLCBzaXplOworCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQsIHNpemU7CiAKIAkJLyoKIAkJICogUmVzZXJ2ZSB1c2FibGUgbWVtb3J5LgpAQCAtMzY5LDg1ICszMDgsNTAgQEAKIAkJaWYgKGJvb3RfbWVtX21hcC5tYXBbaV0udHlwZSAhPSBCT09UX01FTV9SQU0pCiAJCQljb250aW51ZTsKIAotCQkvKgotCQkgKiBXZSBhcmUgcm91bmRpbmcgdXAgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdXNhYmxlIG1lbW9yeToKLQkJICovCi0JCWN1cnJfcGZuID0gUEZOX1VQKGJvb3RfbWVtX21hcC5tYXBbaV0uYWRkcik7Ci0JCWlmIChjdXJyX3BmbiA+PSBtYXhfbG93X3BmbikKLQkJCWNvbnRpbnVlOwotCQlpZiAoY3Vycl9wZm4gPCBzdGFydF9wZm4pCi0JCQljdXJyX3BmbiA9IHN0YXJ0X3BmbjsKLQotCQkvKgotCQkgKiAuLi4gYW5kIGF0IHRoZSBlbmQgb2YgdGhlIHVzYWJsZSByYW5nZSBkb3dud2FyZHM6Ci0JCSAqLwotCQlsYXN0X3BmbiA9IFBGTl9ET1dOKGJvb3RfbWVtX21hcC5tYXBbaV0uYWRkcgorCQlzdGFydCA9IFBGTl9VUChib290X21lbV9tYXAubWFwW2ldLmFkZHIpOworCQllbmQgICA9IFBGTl9ET1dOKGJvb3RfbWVtX21hcC5tYXBbaV0uYWRkcgogCQkJCSAgICArIGJvb3RfbWVtX21hcC5tYXBbaV0uc2l6ZSk7Ci0KLQkJaWYgKGxhc3RfcGZuID4gbWF4X2xvd19wZm4pCi0JCQlsYXN0X3BmbiA9IG1heF9sb3dfcGZuOworCQkvKgorCQkgKiBXZSBhcmUgcm91bmRpbmcgdXAgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdXNhYmxlIG1lbW9yeQorCQkgKiBhbmQgYXQgdGhlIGVuZCBvZiB0aGUgdXNhYmxlIHJhbmdlIGRvd253YXJkcy4KKwkJICovCisJCWlmIChzdGFydCA+PSBtYXhfbG93X3BmbikKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RhcnQgPCByZXNlcnZlZF9lbmQpCisJCQlzdGFydCA9IHJlc2VydmVkX2VuZDsKKwkJaWYgKGVuZCA+IG1heF9sb3dfcGZuKQorCQkJZW5kID0gbWF4X2xvd19wZm47CiAKIAkJLyoKLQkJICogT25seSByZWdpc3RlciBsb3dtZW0gcGFydCBvZiBsb3dtZW0gc2VnbWVudCB3aXRoIGJvb3RtZW0uCisJCSAqIC4uLiBmaW5hbGx5LCBpcyB0aGUgYXJlYSBnb2luZyBhd2F5PwogCQkgKi8KLQkJc2l6ZSA9IGxhc3RfcGZuIC0gY3Vycl9wZm47Ci0JCWlmIChjdXJyX3BmbiA+IFBGTl9ET1dOKEhJR0hNRU1fU1RBUlQpKQorCQlpZiAoZW5kIDw9IHN0YXJ0KQogCQkJY29udGludWU7Ci0JCWlmIChjdXJyX3BmbiArIHNpemUgLSAxID4gUEZOX0RPV04oSElHSE1FTV9TVEFSVCkpCi0JCQlzaXplID0gUEZOX0RPV04oSElHSE1FTV9TVEFSVCkgLSBjdXJyX3BmbjsKLQkJaWYgKCFzaXplKQotCQkJY29udGludWU7Ci0KLQkJLyoKLQkJICogLi4uIGZpbmFsbHksIGRpZCBhbGwgdGhlIHJvdW5kaW5nIGFuZCBwbGF5aW5nCi0JCSAqIGFyb3VuZCBqdXN0IG1ha2UgdGhlIGFyZWEgZ28gYXdheT8KLQkJICovCi0JCWlmIChsYXN0X3BmbiA8PSBjdXJyX3BmbikKLQkJCWNvbnRpbnVlOworCQlzaXplID0gZW5kIC0gc3RhcnQ7CiAKIAkJLyogUmVnaXN0ZXIgbG93bWVtIHJhbmdlcyAqLwotCQlmcmVlX2Jvb3RtZW0oUEZOX1BIWVMoY3Vycl9wZm4pLCBQRk5fUEhZUyhzaXplKSk7Ci0JCW1lbW9yeV9wcmVzZW50KDAsIGN1cnJfcGZuLCBjdXJyX3BmbiArIHNpemUgLSAxKTsKKwkJZnJlZV9ib290bWVtKFBGTl9QSFlTKHN0YXJ0KSwgc2l6ZSA8PCBQQUdFX1NISUZUKTsKKwkJbWVtb3J5X3ByZXNlbnQoMCwgc3RhcnQsIGVuZCk7CiAJfQogCi0JLyogUmVzZXJ2ZSB0aGUgYm9vdG1hcCBtZW1vcnkuICAqLwotCXJlc2VydmVfYm9vdG1lbShQRk5fUEhZUyhmaXJzdF91c2FibGVfcGZuKSwgYm9vdG1hcF9zaXplKTsKLSNlbmRpZiAvKiBDT05GSUdfU0dJX0lQMjcgKi8KKwkvKgorCSAqIFJlc2VydmUgdGhlIGJvb3RtYXAgbWVtb3J5LgorCSAqLworCXJlc2VydmVfYm9vdG1lbShQRk5fUEhZUyhtYXBzdGFydCksIGJvb3RtYXBfc2l6ZSk7CiAKLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLQlpbml0cmRfYmVsb3dfc3RhcnRfb2sgPSAxOwotCWlmIChpbml0cmRfc3RhcnQpIHsKLQkJdW5zaWduZWQgbG9uZyBpbml0cmRfc2l6ZSA9ICgodW5zaWduZWQgY2hhciAqKWluaXRyZF9lbmQpIC0KLQkJCSgodW5zaWduZWQgY2hhciAqKWluaXRyZF9zdGFydCk7Ci0JCWNvbnN0IGludCB3aWR0aCA9IHNpemVvZihsb25nKSAqIDI7Ci0KLQkJcHJpbnRrKCJJbml0aWFsIHJhbWRpc2sgYXQ6IDB4JXAgKCVsdSBieXRlcylcbiIsCi0JCSAgICAgICAodm9pZCAqKWluaXRyZF9zdGFydCwgaW5pdHJkX3NpemUpOwotCi0JCWlmIChDUEhZU0FERFIoaW5pdHJkX2VuZCkgPiBQRk5fUEhZUyhtYXhfbG93X3BmbikpIHsKLQkJCXByaW50aygiaW5pdHJkIGV4dGVuZHMgYmV5b25kIGVuZCBvZiBtZW1vcnkgIgotCQkJICAgICAgICIoMHglMCpMeCA+IDB4JTAqTHgpXG5kaXNhYmxpbmcgaW5pdHJkXG4iLAotCQkJICAgICAgIHdpZHRoLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIENQSFlTQUREUihpbml0cmRfZW5kKSwKLQkJCSAgICAgICB3aWR0aCwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBQRk5fUEhZUyhtYXhfbG93X3BmbikpOwotCQkJaW5pdHJkX3N0YXJ0ID0gaW5pdHJkX2VuZCA9IDA7Ci0JCQlpbml0cmRfcmVzZXJ2ZV9ib290bWVtID0gMDsKLQkJfQotCi0JCWlmIChpbml0cmRfcmVzZXJ2ZV9ib290bWVtKQotCQkJcmVzZXJ2ZV9ib290bWVtKENQSFlTQUREUihpbml0cmRfc3RhcnQpLCBpbml0cmRfc2l6ZSk7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lOSVRSRCAgKi8KKwkvKgorCSAqIFJlc2VydmUgaW5pdHJkIG1lbW9yeSBpZiBuZWVkZWQuCisJICovCisJZmluYWxpemVfaW5pdHJkKCk7CiB9CiAKKyNlbmRpZgkvKiBDT05GSUdfU0dJX0lQMjcgKi8KKwogLyoKICAqIGFyY2hfbWVtX2luaXQgLSBpbml0aWFsaXplIG1lbW9yeSBtYW5hZ21lbnQgc3Vic3lzdGVtCiAgKgogICogIG8gcGxhdF9tZW1fc2V0dXAoKSBkZXRlY3RzIHRoZSBtZW1vcnkgY29uZmlndXJhdGlvbiBhbmQgd2lsbCByZWNvcmQgZGV0ZWN0ZWQKICAqICAgIG1lbW9yeSBhcmVhcyB1c2luZyBhZGRfbWVtb3J5X3JlZ2lvbi4KLSAqICBvIHBhcnNlX2NtZGxpbmVfZWFybHkoKSBwYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBmb3IgbWVtPSBvcHRpb25zIHdoaWNoLAotICogICAgaWZmIGRldGVjdGVkLCB3aWxsIG92ZXJyaWRlIHRoZSByZXN1bHRzIG9mIHRoZSBhdXRvbWF0aWMgZGV0ZWN0aW9uLgogICoKICAqIEF0IHRoaXMgc3RhZ2UgdGhlIG1lbW9yeSBjb25maWd1cmF0aW9uIG9mIHRoZSBzeXN0ZW0gaXMga25vd24gdG8gdGhlCiAgKiBrZXJuZWwgYnV0IGdlbmVyaWMgbWVtb3J5IG1hbmFnbWVudCBzeXN0ZW0gaXMgc3RpbGwgZW50aXJlbHkgdW5pbml0aWFsaXplZC4KQEAgLTQ2NSwyNSArMzY5LDU5IEBACiAgKiBpbml0aWFsaXphdGlvbiBob29rIGZvciBhbnl0aGluZyBlbHNlIHdhcyBpbnRyb2R1Y2VkLgogICovCiAKLWV4dGVybiB2b2lkIHBsYXRfbWVtX3NldHVwKHZvaWQpOworc3RhdGljIGludCB1c2VybWVtIF9faW5pdGRhdGEgPSAwOworCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9wYXJzZV9tZW0oY2hhciAqcCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBzaXplOworCisJLyoKKwkgKiBJZiBhIHVzZXIgc3BlY2lmaWVzIG1lbW9yeSBzaXplLCB3ZQorCSAqIGJsb3cgYXdheSBhbnkgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKKwkgKiBzaXplLgorCSAqLworCWlmICh1c2VybWVtID09IDApIHsKKwkJYm9vdF9tZW1fbWFwLm5yX21hcCA9IDA7CisJCXVzZXJtZW0gPSAxOworIAl9CisJc3RhcnQgPSAwOworCXNpemUgPSBtZW1wYXJzZShwLCAmcCk7CisJaWYgKCpwID09ICdAJykKKwkJc3RhcnQgPSBtZW1wYXJzZShwICsgMSwgJnApOworCisJYWRkX21lbW9yeV9yZWdpb24oc3RhcnQsIHNpemUsIEJPT1RfTUVNX1JBTSk7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgibWVtIiwgZWFybHlfcGFyc2VfbWVtKTsKIAogc3RhdGljIHZvaWQgX19pbml0IGFyY2hfbWVtX2luaXQoY2hhciAqKmNtZGxpbmVfcCkKIHsKKwlleHRlcm4gdm9pZCBwbGF0X21lbV9zZXR1cCh2b2lkKTsKKwogCS8qIGNhbGwgYm9hcmQgc2V0dXAgcm91dGluZSAqLwogCXBsYXRfbWVtX3NldHVwKCk7CiAKKwlwcmludGsoIkRldGVybWluZWQgcGh5c2ljYWwgUkFNIG1hcDpcbiIpOworCXByaW50X21lbW9yeV9tYXAoKTsKKwogCXN0cmxjcHkoY29tbWFuZF9saW5lLCBhcmNzX2NtZGxpbmUsIHNpemVvZihjb21tYW5kX2xpbmUpKTsKIAlzdHJsY3B5KHNhdmVkX2NvbW1hbmRfbGluZSwgY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7CiAKIAkqY21kbGluZV9wID0gY29tbWFuZF9saW5lOwogCi0JcGFyc2VfY21kbGluZV9lYXJseSgpOworCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CisKKwlpZiAodXNlcm1lbSkgeworCQlwcmludGsoIlVzZXItZGVmaW5lZCBwaHlzaWNhbCBSQU0gbWFwOlxuIik7CisJCXByaW50X21lbW9yeV9tYXAoKTsKKwl9CisKIAlib290bWVtX2luaXQoKTsKIAlzcGFyc2VfaW5pdCgpOwogCXBhZ2luZ19pbml0KCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByZXNvdXJjZV9pbml0KHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgcmVzb3VyY2VfaW5pdCh2b2lkKQogewogCWludCBpOwogCkBAIC01MDQsMTAgKzQ0MiwxMCBAQAogCiAJCXN0YXJ0ID0gYm9vdF9tZW1fbWFwLm1hcFtpXS5hZGRyOwogCQllbmQgPSBib290X21lbV9tYXAubWFwW2ldLmFkZHIgKyBib290X21lbV9tYXAubWFwW2ldLnNpemUgLSAxOwotCQlpZiAoc3RhcnQgPj0gTUFYTUVNKQorCQlpZiAoc3RhcnQgPj0gSElHSE1FTV9TVEFSVCkKIAkJCWNvbnRpbnVlOwotCQlpZiAoZW5kID49IE1BWE1FTSkKLQkJCWVuZCA9IE1BWE1FTSAtIDE7CisJCWlmIChlbmQgPj0gSElHSE1FTV9TVEFSVCkKKwkJCWVuZCA9IEhJR0hNRU1fU1RBUlQgLSAxOwogCiAJCXJlcyA9IGFsbG9jX2Jvb3RtZW0oc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSkpOwogCQlzd2l0Y2ggKGJvb3RfbWVtX21hcC5tYXBbaV0udHlwZSkgewpAQCAtNTM2LDkgKzQ3NCw2IEBACiAJfQogfQogCi0jdW5kZWYgTUFYTUVNCi0jdW5kZWYgTUFYTUVNX1BGTgotCiB2b2lkIF9faW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCiB7CiAJY3B1X3Byb2JlKCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwuYwppbmRleCA2YjRkOWJlLi5iOWQzNThlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsLmMKQEAgLTQyNCwxNSArNDI0LDExIEBACiAJaWYgKCF1c2VyX21vZGUocmVncykpCiAJCXJldHVybjsKIAotCWlmICh0cnlfdG9fZnJlZXplKCkpCi0JCWdvdG8gbm9fc2lnbmFsOwotCiAJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCiAJCW9sZHNldCA9ICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrOwogCWVsc2UKIAkJb2xkc2V0ID0gJmN1cnJlbnQtPmJsb2NrZWQ7CiAKLQogCXNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOwogCWlmIChzaWduciA+IDApIHsKIAkJLyogV2hlZSEgIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCkBAIC00NDYsOSArNDQyLDEwIEBACiAJCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKIAkJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKIAkJfQorCisJCXJldHVybjsKIAl9CiAKLW5vX3NpZ25hbDoKIAkvKgogCSAqIFdobydzIGNvZGUgZG9lc24ndCBjb25mb3JtIHRvIHRoZSByZXN0YXJ0YWJsZSBzeXNjYWxsIGNvbnZlbnRpb24KIAkgKiBkaWVzIGhlcmUhISEgIFRoZSBsaSBpbnN0cnVjdGlvbiwgYSBzaW5nbGUgbWFjaGluZSBpbnN0cnVjdGlvbiwKQEAgLTQ2Niw2ICs0NjMsNyBAQAogCQkJcmVncy0+cmVnc1s3XSA9IHJlZ3MtPnJlZ3NbMjZdOwogCQkJcmVncy0+Y3AwX2VwYyAtPSA0OwogCQl9CisJCXJlZ3MtPnJlZ3NbMF0gPSAwOwkvKiBEb24ndCBkZWFsIHdpdGggdGhpcyBhZ2Fpbi4gICovCiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsMzIuYyBiL2FyY2gvbWlwcy9rZXJuZWwvc2lnbmFsMzIuYwppbmRleCBmMzJhMjI5Li5jODZhNWRkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NpZ25hbDMyLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zaWduYWwzMi5jCkBAIC04MTUsOSArODE1LDYgQEAKIAlpZiAoIXVzZXJfbW9kZShyZWdzKSkKIAkJcmV0dXJuOwogCi0JaWYgKHRyeV90b19mcmVlemUoKSkKLQkJZ290byBub19zaWduYWw7Ci0KIAlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKIAkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7CiAJZWxzZQpAQCAtODM2LDkgKzgzMywxMCBAQAogCQkJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSykpCiAJCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CiAJCX0KKworCQlyZXR1cm47CiAJfQogCi1ub19zaWduYWw6CiAJLyoKIAkgKiBXaG8ncyBjb2RlIGRvZXNuJ3QgY29uZm9ybSB0byB0aGUgcmVzdGFydGFibGUgc3lzY2FsbCBjb252ZW50aW9uCiAJICogZGllcyBoZXJlISEhICBUaGUgbGkgaW5zdHJ1Y3Rpb24sIGEgc2luZ2xlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24sCkBAIC04NTYsNiArODU0LDcgQEAKIAkJCXJlZ3MtPnJlZ3NbN10gPSByZWdzLT5yZWdzWzI2XTsKIAkJCXJlZ3MtPmNwMF9lcGMgLT0gNDsKIAkJfQorCQlyZWdzLT5yZWdzWzBdID0gMDsJLyogRG9uJ3QgZGVhbCB3aXRoIHRoaXMgYWdhaW4uICAqLwogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3NtcC1tdC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zbXAtbXQuYwppbmRleCA5MzQyOWE0Li43NjYyNTNjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtcC1tdC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvc21wLW10LmMKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQkJCXdyaXRlX3ZwZV9jMF9jb25maWcoIHJlYWRfYzBfY29uZmlnKCkpOwogCiAJCQkJLyogbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBzb2Z0d2FyZSBpbnRlcnJ1cHRzIHBlbmRpbmcgKi8KLQkJCQl3cml0ZV92cGVfYzBfY2F1c2UocmVhZF92cGVfYzBfY2F1c2UoKSAmIH4oQ19TVzF8Q19TVzApKTsKKwkJCQl3cml0ZV92cGVfYzBfY2F1c2UoMCk7CiAKIAkJCQkvKiBQcm9wYWdhdGUgQ29uZmlnNyAqLwogCQkJCXdyaXRlX3ZwZV9jMF9jb25maWc3KHJlYWRfYzBfY29uZmlnNygpKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvc210Yy1hc20uUyBiL2FyY2gvbWlwcy9rZXJuZWwvc210Yy1hc20uUwppbmRleCA0Y2MzZGVhLi43NmNiMzFkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3NtdGMtYXNtLlMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9zbXRjLWFzbS5TCkBAIC04LDcgKzgsNyBAQAogI2luY2x1ZGUgPGFzbS9yZWdkZWYuaD4KICNpbmNsdWRlIDxhc20vYXNtbWFjcm8uaD4KICNpbmNsdWRlIDxhc20vc3RhY2tmcmFtZS5oPgotI2luY2x1ZGUgPGFzbS9zdGFja2ZyYW1lLmg+CisjaW5jbHVkZSA8YXNtL2lycWZsYWdzLmg+CiAKIC8qCiAgKiAiU29mdHdhcmUgSW50ZXJydXB0IiBsaW5rYWdlLgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zeXNjYWxsLmMgYi9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYwppbmRleCAwNzIxMzE0Li45OTUxMjQwIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYworKysgYi9hcmNoL21pcHMva2VybmVsL3N5c2NhbGwuYwpAQCAtMjYzLDcgKzI2Myw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi12b2lkIHN5c19zZXRfdGhyZWFkX2FyZWEodW5zaWduZWQgbG9uZyBhZGRyKQorYXNtbGlua2FnZSBpbnQgc3lzX3NldF90aHJlYWRfYXJlYSh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IHRhc2tfdGhyZWFkX2luZm8oY3VycmVudCk7CiAKQEAgLTI3MSw2ICsyNzEsOCBAQAogCiAJLyogSWYgc29tZSBmdXR1cmUgTUlQUyBpbXBsZW1lbnRhdGlvbiBoYXMgdGhpcyByZWdpc3RlciBpbiBoYXJkd2FyZSwKIAkgKiB3ZSB3aWxsIG5lZWQgdG8gdXBkYXRlIGl0IGhlcmUgKGFuZCBpbiBjb250ZXh0IHN3aXRjaGVzKS4gICovCisKKwlyZXR1cm4gMDsKIH0KIAogYXNtbGlua2FnZSBpbnQgX3N5c19zeXNtaXBzKGludCBjbWQsIGxvbmcgYXJnMSwgaW50IGFyZzIsIGludCBhcmczKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCmluZGV4IDk1NGExOTguLmU1MWQ4ZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2JyYW5jaC5oPgpAQCAtNzIsMjggKzczLDY4IEBACiB2b2lkICgqYm9hcmRfZWp0YWdfaGFuZGxlcl9zZXR1cCkodm9pZCk7CiB2b2lkICgqYm9hcmRfYmluZF9laWNfaW50ZXJydXB0KShpbnQgaXJxLCBpbnQgcmVnc2V0KTsKIAotLyoKLSAqIFRoZXNlIGNvbnN0YW50IGlzIGZvciBzZWFyY2hpbmcgZm9yIHBvc3NpYmxlIG1vZHVsZSB0ZXh0IHNlZ21lbnRzLgotICogTU9EVUxFX1JBTkdFIGlzIGEgZ3Vlc3Mgb2YgaG93IG11Y2ggc3BhY2UgaXMgbGlrZWx5IHRvIGJlIHZtYWxsb2NlZC4KLSAqLwotI2RlZmluZSBNT0RVTEVfUkFOR0UgKDgqMTAyNCoxMDI0KQorCitzdGF0aWMgdm9pZCBzaG93X3Jhd19iYWNrdHJhY2UodW5zaWduZWQgbG9uZyByZWcyOSkKK3sKKwl1bnNpZ25lZCBsb25nICpzcCA9ICh1bnNpZ25lZCBsb25nICopcmVnMjk7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJcHJpbnRrKCJDYWxsIFRyYWNlOiIpOworI2lmZGVmIENPTkZJR19LQUxMU1lNUworCXByaW50aygiXG4iKTsKKyNlbmRpZgorCXdoaWxlICgha3N0YWNrX2VuZChzcCkpIHsKKwkJYWRkciA9ICpzcCsrOworCQlpZiAoX19rZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpKQorCQkJcHJpbnRfaXBfc3ltKGFkZHIpOworCX0KKwlwcmludGsoIlxuIik7Cit9CisKKyNpZmRlZiBDT05GSUdfS0FMTFNZTVMKK3N0YXRpYyBpbnQgcmF3X3Nob3dfdHJhY2U7CitzdGF0aWMgaW50IF9faW5pdCBzZXRfcmF3X3Nob3dfdHJhY2UoY2hhciAqc3RyKQoreworCXJhd19zaG93X3RyYWNlID0gMTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoInJhd19zaG93X3RyYWNlIiwgc2V0X3Jhd19zaG93X3RyYWNlKTsKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdW53aW5kX3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyAqc3AsCisJCQkJICB1bnNpZ25lZCBsb25nIHBjLCB1bnNpZ25lZCBsb25nIHJhKTsKKworc3RhdGljIHZvaWQgc2hvd19iYWNrdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHNwID0gcmVncy0+cmVnc1syOV07CisJdW5zaWduZWQgbG9uZyByYSA9IHJlZ3MtPnJlZ3NbMzFdOworCXVuc2lnbmVkIGxvbmcgcGMgPSByZWdzLT5jcDBfZXBjOworCisJaWYgKHJhd19zaG93X3RyYWNlIHx8ICFfX2tlcm5lbF90ZXh0X2FkZHJlc3MocGMpKSB7CisJCXNob3dfcmF3X2JhY2t0cmFjZShzcCk7CisJCXJldHVybjsKKwl9CisJcHJpbnRrKCJDYWxsIFRyYWNlOlxuIik7CisJZG8geworCQlwcmludF9pcF9zeW0ocGMpOworCQlwYyA9IHVud2luZF9zdGFjayh0YXNrLCAmc3AsIHBjLCByYSk7CisJCXJhID0gMDsKKwl9IHdoaWxlIChwYyk7CisJcHJpbnRrKCJcbiIpOworfQorI2Vsc2UKKyNkZWZpbmUgc2hvd19iYWNrdHJhY2UodGFzaywgcikgc2hvd19yYXdfYmFja3RyYWNlKChyKS0+cmVnc1syOV0pOworI2VuZGlmCiAKIC8qCiAgKiBUaGlzIHJvdXRpbmUgYWJ1c2VzIGdldF91c2VyKCkvcHV0X3VzZXIoKSB0byByZWZlcmVuY2UgcG9pbnRlcnMKICAqIHdpdGggYXQgbGVhc3QgYSBiaXQgb2YgZXJyb3IgY2hlY2tpbmcgLi4uCiAgKi8KLXZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnNwKQorc3RhdGljIHZvaWQgc2hvd19zdGFja3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJY29uc3QgaW50IGZpZWxkID0gMiAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKIAlsb25nIHN0YWNrZGF0YTsKIAlpbnQgaTsKLQotCWlmICghc3ApIHsKLQkJaWYgKHRhc2sgJiYgdGFzayAhPSBjdXJyZW50KQotCQkJc3AgPSAodW5zaWduZWQgbG9uZyAqKSB0YXNrLT50aHJlYWQucmVnMjk7Ci0JCWVsc2UKLQkJCXNwID0gKHVuc2lnbmVkIGxvbmcgKikgJnNwOwotCX0KKwl1bnNpZ25lZCBsb25nICpzcCA9ICh1bnNpZ25lZCBsb25nICopcmVncy0+cmVnc1syOV07CiAKIAlwcmludGsoIlN0YWNrIDoiKTsKIAlpID0gMDsKQEAgLTExNCwzMiArMTU1LDQ4IEBACiAJCWkrKzsKIAl9CiAJcHJpbnRrKCJcbiIpOworCXNob3dfYmFja3RyYWNlKHRhc2ssIHJlZ3MpOwogfQogCi12b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzdGFjaykKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBwcmVwYXJlX2ZyYW1ldHJhY2Uoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JY29uc3QgaW50IGZpZWxkID0gMiAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0KLQlpZiAoIXN0YWNrKSB7Ci0JCWlmICh0YXNrICYmIHRhc2sgIT0gY3VycmVudCkKLQkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKikgdGFzay0+dGhyZWFkLnJlZzI5OwotCQllbHNlCi0JCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopICZzdGFjazsKLQl9Ci0KLQlwcmludGsoIkNhbGwgVHJhY2U6Iik7Ci0jaWZkZWYgQ09ORklHX0tBTExTWU1TCi0JcHJpbnRrKCJcbiIpOworCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiLnNldCBwdXNoXG5cdCIKKwkJIi5zZXQgbm9hdFxuXHQiCisjaWZkZWYgQ09ORklHXzY0QklUCisJCSIxOiBkbGEgJDEsIDFiXG5cdCIKKwkJInNkICQxLCAlMFxuXHQiCisJCSJzZCAkMjksICUxXG5cdCIKKwkJInNkICQzMSwgJTJcblx0IgorI2Vsc2UKKwkJIjE6IGxhICQxLCAxYlxuXHQiCisJCSJzdyAkMSwgJTBcblx0IgorCQkic3cgJDI5LCAlMVxuXHQiCisJCSJzdyAkMzEsICUyXG5cdCIKICNlbmRpZgotCXdoaWxlICgha3N0YWNrX2VuZChzdGFjaykpIHsKLQkJYWRkciA9ICpzdGFjaysrOwotCQlpZiAoX19rZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpKSB7Ci0JCQlwcmludGsoIiBbPCUwKmx4Pl0gIiwgZmllbGQsIGFkZHIpOwotCQkJcHJpbnRfc3ltYm9sKCIlc1xuIiwgYWRkcik7CisJCSIuc2V0IHBvcFxuXHQiCisJCTogIj1tIiAocmVncy0+Y3AwX2VwYyksCisJCSI9bSIgKHJlZ3MtPnJlZ3NbMjldKSwgIj1tIiAocmVncy0+cmVnc1szMV0pCisJCTogOiAibWVtb3J5Iik7Cit9CisKK3ZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnNwKQoreworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CisJaWYgKHNwKSB7CisJCXJlZ3MucmVnc1syOV0gPSAodW5zaWduZWQgbG9uZylzcDsKKwkJcmVncy5yZWdzWzMxXSA9IDA7CisJCXJlZ3MuY3AwX2VwYyA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHRhc2sgJiYgdGFzayAhPSBjdXJyZW50KSB7CisJCQlyZWdzLnJlZ3NbMjldID0gdGFzay0+dGhyZWFkLnJlZzI5OworCQkJcmVncy5yZWdzWzMxXSA9IDA7CisJCQlyZWdzLmNwMF9lcGMgPSB0YXNrLT50aHJlYWQucmVnMzE7CisJCX0gZWxzZSB7CisJCQlwcmVwYXJlX2ZyYW1ldHJhY2UoJnJlZ3MpOwogCQl9CiAJfQotCXByaW50aygiXG4iKTsKKwlzaG93X3N0YWNrdHJhY2UodGFzaywgJnJlZ3MpOwogfQogCiAvKgpAQCAtMTQ3LDkgKzIwNCwxNSBAQAogICovCiB2b2lkIGR1bXBfc3RhY2sodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHN0YWNrOworCXN0cnVjdCBwdF9yZWdzIHJlZ3M7CiAKLQlzaG93X3RyYWNlKGN1cnJlbnQsICZzdGFjayk7CisJLyoKKwkgKiBSZW1vdmUgYW55IGdhcmJhZ2UgdGhhdCBtYXkgYmUgaW4gcmVncyAoc3BlY2lhbGx5IGZ1bmMKKwkgKiBhZGRyZXNzZXMpIHRvIGF2b2lkIHNob3dfcmF3X2JhY2t0cmFjZSgpIHRvIHJlcG9ydCB0aGVtCisJICovCisJbWVtc2V0KCZyZWdzLCAwLCBzaXplb2YocmVncykpOworCXByZXBhcmVfZnJhbWV0cmFjZSgmcmVncyk7CisJc2hvd19iYWNrdHJhY2UoY3VycmVudCwgJnJlZ3MpOwogfQogCiBFWFBPUlRfU1lNQk9MKGR1bXBfc3RhY2spOwpAQCAtMjY4LDggKzMzMSw3IEBACiAJcHJpbnRfbW9kdWxlcygpOwogCXByaW50aygiUHJvY2VzcyAlcyAocGlkOiAlZCwgdGhyZWFkaW5mbz0lcCwgdGFzaz0lcClcbiIsCiAJICAgICAgICBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGN1cnJlbnRfdGhyZWFkX2luZm8oKSwgY3VycmVudCk7Ci0Jc2hvd19zdGFjayhjdXJyZW50LCAobG9uZyAqKSByZWdzLT5yZWdzWzI5XSk7Ci0Jc2hvd190cmFjZShjdXJyZW50LCAobG9uZyAqKSByZWdzLT5yZWdzWzI5XSk7CisJc2hvd19zdGFja3RyYWNlKGN1cnJlbnQsIHJlZ3MpOwogCXNob3dfY29kZSgodW5zaWduZWQgaW50ICopIHJlZ3MtPmNwMF9lcGMpOwogCXByaW50aygiXG4iKTsKIH0KQEAgLTI5Miw2ICszNTQsMTYgQEAKIAlwcmludGsoIiVzWyMlZF06XG4iLCBzdHIsICsrZGllX2NvdW50ZXIpOwogCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOwogCXNwaW5fdW5sb2NrX2lycSgmZGllX2xvY2spOworCisJaWYgKGluX2ludGVycnVwdCgpKQorCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIGluIGludGVycnVwdCIpOworCisJaWYgKHBhbmljX29uX29vcHMpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIkZhdGFsIGV4Y2VwdGlvbjogcGFuaWMgaW4gNSBzZWNvbmRzXG4iKTsKKwkJc3NsZWVwKDUpOworCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIik7CisJfQorCiAJZG9fZXhpdChTSUdTRUdWKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC92cGUuYyBiL2FyY2gvbWlwcy9rZXJuZWwvdnBlLmMKaW5kZXggOWVlMGVjMi4uNTFkZGQyMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC92cGUuYworKysgYi9hcmNoL21pcHMva2VybmVsL3ZwZS5jCkBAIC03NjgsMTAgKzc2OCwxNiBAQAogCSAqLwogIAl3cml0ZV90Y19jMF90Y2JpbmQoKHJlYWRfdGNfYzBfdGNiaW5kKCkgJiB+VENCSU5EX0NVUlZQRSkgfCB2LT5taW5vcik7CiAKKwl3cml0ZV92cGVfYzBfdnBlY29uZjAocmVhZF92cGVfYzBfdnBlY29uZjAoKSAmIH4oVlBFQ09ORjBfVlBBKSk7CisKKwliYWNrX3RvX2JhY2tfYzBfaGF6YXJkKCk7CisKICAgICAgICAgLyogU2V0IHVwIHRoZSBYVEMgYml0IGluIHZwZWNvbmYwIHRvIHBvaW50IGF0IG91ciB0YyAqLwogICAgICAgICB3cml0ZV92cGVfYzBfdnBlY29uZjAoIChyZWFkX3ZwZV9jMF92cGVjb25mMCgpICYgfihWUEVDT05GMF9YVEMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHQtPmluZGV4IDw8IFZQRUNPTkYwX1hUQ19TSElGVCkpOwogCisJYmFja190b19iYWNrX2MwX2hhemFyZCgpOworCiAgICAgICAgIC8qIGVuYWJsZSB0aGlzIFZQRSAqLwogICAgICAgICB3cml0ZV92cGVfYzBfdnBlY29uZjAocmVhZF92cGVfYzBfdnBlY29uZjAoKSB8IFZQRUNPTkYwX1ZQQSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9hdGxhcy9hdGxhc19pbnQuYyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9hdGxhcy9hdGxhc19pbnQuYwppbmRleCBmYjI1ZTAzLi5hMDIwYTNjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvYXRsYXMvYXRsYXNfaW50LmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2F0bGFzL2F0bGFzX2ludC5jCkBAIC0xLDYgKzEsOCBAQAogLyoKLSAqIENhcnN0ZW4gTGFuZ2dhYXJkLCBjYXJzdGVubEBtaXBzLmNvbQotICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDYgIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuCisgKglBbGwgcmlnaHRzIHJlc2VydmVkLgorICoJQXV0aG9yczogQ2Fyc3RlbiBMYW5nZ2FhcmQgPGNhcnN0ZW5sQG1pcHMuY29tPgorICoJCSBNYWNpZWogVy4gUm96eWNraSA8bWFjcm9AbWlwcy5jb20+CiAgKgogICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgKgpAQCAtMjUsMTcgKzI3LDIwIEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogCi0jaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9nZGItc3R1Yi5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnFfY3B1Lmg+CisjaW5jbHVkZSA8YXNtL21zYzAxX2ljLmg+CisKICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvYXRsYXMuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvYXRsYXNpbnQuaD4KLSNpbmNsdWRlIDxhc20vZ2RiLXN0dWIuaD4KLQorI2luY2x1ZGUgPGFzbS9taXBzLWJvYXJkcy9nZW5lcmljLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgYXRsYXNfaWN0cmxfcmVncyAqYXRsYXNfaHcwX2ljcmVnczsKIApAQCAtNDcsMTMgKzUyLDEzIEBACiAKIHZvaWQgZGlzYWJsZV9hdGxhc19pcnEodW5zaWduZWQgaW50IGlycV9ucikKIHsKLQlhdGxhc19odzBfaWNyZWdzLT5pbnRyc3RlbiA9ICgxIDw8IChpcnFfbnItQVRMQVNJTlRfQkFTRSkpOworCWF0bGFzX2h3MF9pY3JlZ3MtPmludHJzdGVuID0gMSA8PCAoaXJxX25yIC0gQVRMQVNfSU5UX0JBU0UpOwogCWlvYigpOwogfQogCiB2b2lkIGVuYWJsZV9hdGxhc19pcnEodW5zaWduZWQgaW50IGlycV9ucikKIHsKLQlhdGxhc19odzBfaWNyZWdzLT5pbnRzZXRlbiA9ICgxIDw8IChpcnFfbnItQVRMQVNJTlRfQkFTRSkpOworCWF0bGFzX2h3MF9pY3JlZ3MtPmludHNldGVuID0gMSA8PCAoaXJxX25yIC0gQVRMQVNfSU5UX0JBU0UpOwogCWlvYigpOwogfQogCkBAIC0xMDcsNyArMTEyLDcgQEAKIAlpZiAodW5saWtlbHkoaW50X3N0YXR1cyA9PSAwKSkKIAkJcmV0dXJuOwogCi0JaXJxID0gQVRMQVNJTlRfQkFTRSArIGxzMWJpdDMyKGludF9zdGF0dXMpOworCWlycSA9IEFUTEFTX0lOVF9CQVNFICsgbHMxYml0MzIoaW50X3N0YXR1cyk7CiAKIAlERUJVR19JTlQoImF0bGFzX2h3MF9pcnFkaXNwYXRjaDogaXJxPSVkXG4iLCBpcnEpOwogCkBAIC0xNjEsMTUgKzE2NiwxNCBAQAogfQogCiAvKgotICogSVJRcyBvbiB0aGUgQXRsYXMgYm9hcmQgbG9vayBiYXNpY2FsbHkgKGJhcnJpbmcgc29mdHdhcmUgSVJRcyB3aGljaCB3ZQotICogZG9uJ3QgdXNlIGF0IGFsbCBhbmQgYWxsIGV4dGVybmFsIGludGVycnVwdCBzb3VyY2VzIGFyZSBjb21iaW5lZCB0b2dldGhlcgotICogb24gaGFyZHdhcmUgaW50ZXJydXB0IDAgKE1JUFMgSVJRIDIpKSBsaWtlOgorICogSVJRcyBvbiB0aGUgQXRsYXMgYm9hcmQgbG9vayBiYXNpY2FsbHkgbGlrZSAoYWxsIGV4dGVybmFsIGludGVycnVwdAorICogc291cmNlcyBhcmUgY29tYmluZWQgdG9nZXRoZXIgb24gaGFyZHdhcmUgaW50ZXJydXB0IDAgKE1JUFMgSVJRIDIpKToKICAqCi0gKglNSVBTIElSUQlTb3VyY2UKKyAqICAgICAgTUlQUyBJUlEgICAgICAgIFNvdXJjZQogICogICAgICAtLS0tLS0tLSAgICAgICAgLS0tLS0tCi0gKiAgICAgICAgICAgICAwCVNvZnR3YXJlIChpZ25vcmVkKQotICogICAgICAgICAgICAgMSAgICAgICAgU29mdHdhcmUgKGlnbm9yZWQpCi0gKiAgICAgICAgICAgICAyICAgICAgICBDb21iaW5lZCBoYXJkd2FyZSBpbnRlcnJ1cHQgKGh3MCkKKyAqICAgICAgICAgICAgIDAgICAgICAgIFNvZnR3YXJlIDAgKHJlc2NoZWR1bGUgSVBJIG9uIE1UKQorICogICAgICAgICAgICAgMSAgICAgICAgU29mdHdhcmUgMSAocmVtb3RlIGNhbGwgSVBJIG9uIE1UKQorICogICAgICAgICAgICAgMiAgICAgICAgQ29tYmluZWQgQXRsYXMgaGFyZHdhcmUgaW50ZXJydXB0IChodzApCiAgKiAgICAgICAgICAgICAzICAgICAgICBIYXJkd2FyZSAoaWdub3JlZCkKICAqICAgICAgICAgICAgIDQgICAgICAgIEhhcmR3YXJlIChpZ25vcmVkKQogICogICAgICAgICAgICAgNSAgICAgICAgSGFyZHdhcmUgKGlnbm9yZWQpCkBAIC0xNzksNyArMTgzLDcgQEAKICAqIFdlIGhhbmRsZSB0aGUgSVJRIGFjY29yZGluZyB0byBfb3VyXyBwcmlvcml0eSB3aGljaCBpczoKICAqCiAgKiBIaWdoZXN0IC0tLS0gICAgIFI0ayBUaW1lcgotICogTG93ZXN0ICAtLS0tICAgICBDb21iaW5lZCBoYXJkd2FyZSBpbnRlcnJ1cHQKKyAqIExvd2VzdCAgLS0tLSAgICAgU29mdHdhcmUgMAogICoKICAqIHRoZW4gd2UganVzdCByZXR1cm4sIGlmIG11bHRpcGxlIElSUXMgYXJlIHBlbmRpbmcgdGhlbiB3ZSB3aWxsIGp1c3QgdGFrZQogICogYW5vdGhlciBleGNlcHRpb24sIGJpZyBkZWFsLgpAQCAtMTkzLDE3ICsxOTcsMTkgQEAKIAogCWlmIChpcnEgPT0gTUlQU0NQVV9JTlRfQVRMQVMpCiAJCWF0bGFzX2h3MF9pcnFkaXNwYXRjaChyZWdzKTsKLQllbHNlIGlmIChpcnEgPiAwKQorCWVsc2UgaWYgKGlycSA+PSAwKQogCQlkb19JUlEoTUlQU0NQVV9JTlRfQkFTRSArIGlycSwgcmVncyk7CiAJZWxzZQogCQlzcHVyaW91c19pbnRlcnJ1cHQocmVncyk7CiB9CiAKLXZvaWQgX19pbml0IGFyY2hfaW5pdF9pcnEodm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2F0bGFzX2lycXMgKGludCBiYXNlKQogewogCWludCBpOwogCi0JYXRsYXNfaHcwX2ljcmVncyA9IChzdHJ1Y3QgYXRsYXNfaWN0cmxfcmVncyAqKWlvcmVtYXAgKEFUTEFTX0lDVFJMX1JFR1NfQkFTRSwgc2l6ZW9mKHN0cnVjdCBhdGxhc19pY3RybF9yZWdzICopKTsKKwlhdGxhc19odzBfaWNyZWdzID0gKHN0cnVjdCBhdGxhc19pY3RybF9yZWdzICopCisJCQkgICBpb3JlbWFwKEFUTEFTX0lDVFJMX1JFR1NfQkFTRSwKKwkJCQkgICBzaXplb2Yoc3RydWN0IGF0bGFzX2ljdHJsX3JlZ3MgKikpOwogCiAJLyoKIAkgKiBNYXNrIG91dCBhbGwgaW50ZXJydXB0IGJ5IHdyaXRpbmcgIjEiIHRvIGFsbCBiaXQgcG9zaXRpb24gaW4KQEAgLTIxMSw3ICsyMTcsNyBAQAogCSAqLwogCWF0bGFzX2h3MF9pY3JlZ3MtPmludHJzdGVuID0gMHhmZmZmZmZmZjsKIAotCWZvciAoaSA9IEFUTEFTSU5UX0JBU0U7IGkgPD0gQVRMQVNJTlRfRU5EOyBpKyspIHsKKwlmb3IgKGkgPSBBVExBU19JTlRfQkFTRTsgaSA8PSBBVExBU19JTlRfRU5EOyBpKyspIHsKIAkJaXJxX2Rlc2NbaV0uc3RhdHVzCT0gSVJRX0RJU0FCTEVEOwogCQlpcnFfZGVzY1tpXS5hY3Rpb24JPSAwOwogCQlpcnFfZGVzY1tpXS5kZXB0aAk9IDE7CkBAIC0yMTksMyArMjI1LDYyIEBACiAJCXNwaW5fbG9ja19pbml0KCZpcnFfZGVzY1tpXS5sb2NrKTsKIAl9CiB9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGF0bGFzaXJxID0geworCS5oYW5kbGVyID0gbm9fYWN0aW9uLAorCS5uYW1lID0gIkF0bGFzIGNhc2NhZGUiCit9OworCittc2NfaXJxbWFwX3QgX19pbml0ZGF0YSBtc2NfaXJxbWFwW10gPSB7CisJe01TQzAxQ19JTlRfVE1SLAkJTVNDMDFfSVJRX0VER0UsIDB9LAorCXtNU0MwMUNfSU5UX1BDSSwJCU1TQzAxX0lSUV9MRVZFTCwgMH0sCit9OworaW50IF9faW5pdGRhdGEgbXNjX25yX2lycXMgPSBzaXplb2YobXNjX2lycW1hcCkgLyBzaXplb2YoKm1zY19pcnFtYXApOworCittc2NfaXJxbWFwX3QgX19pbml0ZGF0YSBtc2NfZWljaXJxbWFwW10gPSB7CisJe01TQzAxRV9JTlRfU1cwLAkJTVNDMDFfSVJRX0xFVkVMLCAwfSwKKwl7TVNDMDFFX0lOVF9TVzEsCQlNU0MwMV9JUlFfTEVWRUwsIDB9LAorCXtNU0MwMUVfSU5UX0FUTEFTLAkJTVNDMDFfSVJRX0xFVkVMLCAwfSwKKwl7TVNDMDFFX0lOVF9UTVIsCQlNU0MwMV9JUlFfRURHRSwgMH0sCisJe01TQzAxRV9JTlRfUENJLAkJTVNDMDFfSVJRX0xFVkVMLCAwfSwKKwl7TVNDMDFFX0lOVF9QRVJGQ1RSLAkJTVNDMDFfSVJRX0xFVkVMLCAwfSwKKwl7TVNDMDFFX0lOVF9DUFVDVFIsCQlNU0MwMV9JUlFfTEVWRUwsIDB9Cit9OworaW50IF9faW5pdGRhdGEgbXNjX25yX2VpY2lycXMgPSBzaXplb2YobXNjX2VpY2lycW1hcCkgLyBzaXplb2YoKm1zY19laWNpcnFtYXApOworCit2b2lkIF9faW5pdCBhcmNoX2luaXRfaXJxKHZvaWQpCit7CisJaW5pdF9hdGxhc19pcnFzKEFUTEFTX0lOVF9CQVNFKTsKKworCWlmICghY3B1X2hhc192ZWljKQorCQltaXBzX2NwdV9pcnFfaW5pdChNSVBTQ1BVX0lOVF9CQVNFKTsKKworCXN3aXRjaChtaXBzX3JldmlzaW9uX2NvcmlkKSB7CisJY2FzZSBNSVBTX1JFVklTSU9OX0NPUklEX0NPUkVfTVNDOgorCWNhc2UgTUlQU19SRVZJU0lPTl9DT1JJRF9DT1JFX0ZQR0EyOgorCWNhc2UgTUlQU19SRVZJU0lPTl9DT1JJRF9DT1JFX0ZQR0EzOgorCWNhc2UgTUlQU19SRVZJU0lPTl9DT1JJRF9DT1JFXzI0SzoKKwljYXNlIE1JUFNfUkVWSVNJT05fQ09SSURfQ09SRV9FTVVMX01TQzoKKwkJaWYgKGNwdV9oYXNfdmVpYykKKwkJCWluaXRfbXNjX2lycXMgKE1TQzAxRV9JTlRfQkFTRSwKKwkJCQkgICAgICAgbXNjX2VpY2lycW1hcCwgbXNjX25yX2VpY2lycXMpOworCQllbHNlCisJCQlpbml0X21zY19pcnFzIChNU0MwMUNfSU5UX0JBU0UsCisJCQkJICAgICAgIG1zY19pcnFtYXAsIG1zY19ucl9pcnFzKTsKKwl9CisKKworCWlmIChjcHVfaGFzX3ZlaWMpIHsKKwkJc2V0X3ZpX2hhbmRsZXIgKE1TQzAxRV9JTlRfQVRMQVMsIGF0bGFzX2h3MF9pcnFkaXNwYXRjaCk7CisJCXNldHVwX2lycSAoTVNDMDFFX0lOVF9CQVNFICsgTVNDMDFFX0lOVF9BVExBUywgJmF0bGFzaXJxKTsKKwl9IGVsc2UgaWYgKGNwdV9oYXNfdmludCkgeworCQlzZXRfdmlfaGFuZGxlciAoTUlQU0NQVV9JTlRfQVRMQVMsIGF0bGFzX2h3MF9pcnFkaXNwYXRjaCk7CisjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQworCQlzZXR1cF9pcnFfc210YyAoTUlQU0NQVV9JTlRfQkFTRSArIE1JUFNDUFVfSU5UX0FUTEFTLAorCQkJCSZhdGxhc2lycSwgKDB4MTAwIDw8IE1JUFNDUFVfSU5UX0FUTEFTKSk7CisjZWxzZSAvKiBOb3QgU01UQyAqLworCQlzZXR1cF9pcnEoTUlQU0NQVV9JTlRfQkFTRSArIE1JUFNDUFVfSU5UX0FUTEFTLCAmYXRsYXNpcnEpOworI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVEMgKi8KKwl9IGVsc2UKKwkJc2V0dXBfaXJxKE1JUFNDUFVfSU5UX0JBU0UgKyBNSVBTQ1BVX0lOVF9BVExBUywgJmF0bGFzaXJxKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9hdGxhcy9hdGxhc19zZXR1cC5jIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2F0bGFzL2F0bGFzX3NldHVwLmMKaW5kZXggOTg3MWE5MS4uMGM2YjBjZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21pcHMtYm9hcmRzL2F0bGFzL2F0bGFzX3NldHVwLmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2F0bGFzL2F0bGFzX3NldHVwLmMKQEAgLTc3LDcgKzc3LDcgQEAKICNlbHNlCiAJcy5pb2Jhc2UgPSBBVExBU19VQVJUX1JFR1NfQkFTRSszOwogI2VuZGlmCi0Jcy5pcnEgPSBBVExBU0lOVF9VQVJUOworCXMuaXJxID0gQVRMQVNfSU5UX1VBUlQ7CiAJcy51YXJ0Y2xrID0gQVRMQVNfQkFTRV9CQVVEICogMTY7CiAJcy5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVCB8IFVQRl9BVVRPX0lSUTsKIAlzLmlvdHlwZSA9IFVQSU9fUE9SVDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3RpbWUuYyBiL2FyY2gvbWlwcy9taXBzLWJvYXJkcy9nZW5lcmljL3RpbWUuYwppbmRleCA1NTdiZjk2Li44ZDE1ODYxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbWlwcy1ib2FyZHMvZ2VuZXJpYy90aW1lLmMKKysrIGIvYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvdGltZS5jCkBAIC00MSw4ICs0MSwxMyBAQAogCiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL2dlbmVyaWMuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvcHJvbS5oPgorCisjaWZkZWYgQ09ORklHX01JUFNfQVRMQVMKKyNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvYXRsYXNpbnQuaD4KKyNlbmRpZgorI2lmZGVmIENPTkZJR19NSVBTX01BTFRBCiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL21hbHRhaW50Lmg+Ci0jaW5jbHVkZSA8YXNtL21jMTQ2ODE4LXRpbWUuaD4KKyNlbmRpZgogCiB1bnNpZ25lZCBsb25nIGNwdV9raHo7CiAKQEAgLTkyLDEwICs5Nyw5IEBACiBpcnFyZXR1cm5fdCBtaXBzX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JaW50IHIyID0gY3B1X2hhc19taXBzX3IyOwogCiAjaWZkZWYgQ09ORklHX01JUFNfTVRfU01UQwotICAgICAgICAvKgorCS8qCiAJICogIEluIGFuIFNNVEMgc3lzdGVtLCBvbmUgQ291bnQvQ29tcGFyZSBzZXQgZXhpc3RzIHBlciBWUEUuCiAJICogIFdoaWNoIFRDIHdpdGhpbiBhIFZQRSBnZXRzIHRoZSBpbnRlcnJ1cHQgaXMgZXNzZW50aWFsbHkKIAkgKiAgcmFuZG9tIC0gd2Ugb25seSBrbm93IHRoYXQgaXQgc2hvdWxkbid0IGJlIG9uZSB3aXRoCkBAIC0xMDgsMjkgKzExMiw0NiBAQAogCSAqICB0aGUgZ2VuZXJhbCBNSVBTIHRpbWVyX2ludGVycnVwdCByb3V0aW5lLgogCSAqLwogCisJaW50IHZwZmxhZ3M7CisKIAkvKgotCSAqIERWUEUgaXMgbmVjZXNzYXJ5IHNvIGxvbmcgYXMgY3Jvc3MtVlBFIGludGVycnVwdHMKLQkgKiBhcmUgZG9uZSB2aWEgcmVhZC1tb2RpZnktd3JpdGUgb2YgQ2F1c2UgcmVnaXN0ZXIuCisJICogV2UgY291bGQgYmUgaGVyZSBkdWUgdG8gdGltZXIgaW50ZXJydXB0LAorCSAqIHBlcmYgY291bnRlciBvdmVyZmxvdywgb3IgYm90aC4KIAkgKi8KLQlpbnQgdnBmbGFncyA9IGR2cGUoKTsKLQl3cml0ZV9jMF9jb21wYXJlIChyZWFkX2MwX2NvdW50KCkgLSAxKTsKLQljbGVhcl9jMF9jYXVzZShDUFVDVFJfSU1BU0tCSVQpOwotCWV2cGUodnBmbGFncyk7CisJaWYgKHJlYWRfYzBfY2F1c2UoKSAmICgxIDw8IDI2KSkKKwkJcGVyZl9pcnEocmVncyk7CiAKLQlpZiAoY3B1X2RhdGFbY3B1XS52cGVfaWQgPT0gMCkgewotCQl0aW1lcl9pbnRlcnJ1cHQoaXJxLCBkZXZfaWQsIHJlZ3MpOwotCQlzY3JvbGxfZGlzcGxheV9tZXNzYWdlKCk7Ci0JfSBlbHNlCi0JCXdyaXRlX2MwX2NvbXBhcmUgKHJlYWRfYzBfY291bnQoKSArICggbWlwc19ocHRfZnJlcXVlbmN5L0haKSk7Ci0Jc210Y190aW1lcl9icm9hZGNhc3QoY3B1X2RhdGFbY3B1XS52cGVfaWQpOwotCi0JaWYgKGNwdSAhPSAwKQorCWlmIChyZWFkX2MwX2NhdXNlKCkgJiAoMSA8PCAzMCkpIHsKKwkJLyogSWYgdGltZXIgaW50ZXJydXB0LCBtYWtlIGl0IGRlLWFzc2VydCAqLworCQl3cml0ZV9jMF9jb21wYXJlIChyZWFkX2MwX2NvdW50KCkgLSAxKTsKIAkJLyoKLQkJICogT3RoZXIgQ1BVcyBzaG91bGQgZG8gcHJvZmlsaW5nIGFuZCBwcm9jZXNzIGFjY291bnRpbmcKKwkJICogRFZQRSBpcyBuZWNlc3Nhcnkgc28gbG9uZyBhcyBjcm9zcy1WUEUgaW50ZXJydXB0cworCQkgKiBhcmUgZG9uZSB2aWEgcmVhZC1tb2RpZnktd3JpdGUgb2YgQ2F1c2UgcmVnaXN0ZXIuCiAJCSAqLwotCQlsb2NhbF90aW1lcl9pbnRlcnJ1cHQoaXJxLCBkZXZfaWQsIHJlZ3MpOwotCisJCXZwZmxhZ3MgPSBkdnBlKCk7CisJCWNsZWFyX2MwX2NhdXNlKENQVUNUUl9JTUFTS0JJVCk7CisJCWV2cGUodnBmbGFncyk7CisJCS8qCisJCSAqIFRoZXJlIGFyZSB0aGluZ3Mgd2Ugb25seSB3YW50IHRvIGRvIG9uY2UgcGVyIHRpY2sKKwkJICogaW4gYW4gIk1QIiBzeXN0ZW0uICAgT25lIFRDIG9mIGVhY2ggVlBFIHdpbGwgdGFrZQorCQkgKiB0aGUgYWN0dWFsIHRpbWVyIGludGVycnVwdC4gIFRoZSBvdGhlcnMgd2lsbCBnZXQKKwkJICogdGltZXIgYnJvYWRjYXN0IElQSXMuIFdlIHVzZSB3aG9ldmVyIGl0IGlzIHRoYXQgdGFrZXMKKwkJICogdGhlIHRpY2sgb24gVlBFIDAgdG8gcnVuIHRoZSBmdWxsIHRpbWVyX2ludGVycnVwdCgpLgorCQkgKi8KKwkJaWYgKGNwdV9kYXRhW2NwdV0udnBlX2lkID09IDApIHsKKwkJCQl0aW1lcl9pbnRlcnJ1cHQoaXJxLCBOVUxMLCByZWdzKTsKKwkJCQlzbXRjX3RpbWVyX2Jyb2FkY2FzdChjcHVfZGF0YVtjcHVdLnZwZV9pZCk7CisJCQkJc2Nyb2xsX2Rpc3BsYXlfbWVzc2FnZSgpOworCQl9IGVsc2UgeworCQkJd3JpdGVfYzBfY29tcGFyZShyZWFkX2MwX2NvdW50KCkgKworCQkJICAgICAgICAgICAgICAgICAobWlwc19ocHRfZnJlcXVlbmN5L0haKSk7CisJCQlsb2NhbF90aW1lcl9pbnRlcnJ1cHQoaXJxLCBkZXZfaWQsIHJlZ3MpOworCQkJc210Y190aW1lcl9icm9hZGNhc3QoY3B1X2RhdGFbY3B1XS52cGVfaWQpOworCQl9CisJfQogI2Vsc2UgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLworCWludCByMiA9IGNwdV9oYXNfbWlwc19yMjsKKwogCWlmIChjcHUgPT0gMCkgewogCQkvKgogCQkgKiBDUFUgMCBoYW5kbGVzIHRoZSBnbG9iYWwgdGltZXIgaW50ZXJydXB0IGpvYiBhbmQgcHJvY2VzcwpAQCAtMTYxLDkgKzE4Miw4IEBACiAJCSAqLwogCQlsb2NhbF90aW1lcl9pbnRlcnJ1cHQoaXJxLCBkZXZfaWQsIHJlZ3MpOwogCX0KLSNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCi0KIG91dDoKKyNlbmRpZiAvKiBDT05GSUdfTUlQU19NVF9TTVRDICovCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vYy1yM2suYyBiL2FyY2gvbWlwcy9tbS9jLXIzay5jCmluZGV4IGJiMDQxYTIuLmUxZjM1ZWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9jLXIzay5jCisrKyBiL2FyY2gvbWlwcy9tbS9jLXIzay5jCkBAIC0zMzUsNyArMzM1LDcgQEAKIAlmbHVzaF9jYWNoZV9tbSA9IHIza19mbHVzaF9jYWNoZV9tbTsKIAlmbHVzaF9jYWNoZV9yYW5nZSA9IHIza19mbHVzaF9jYWNoZV9yYW5nZTsKIAlmbHVzaF9jYWNoZV9wYWdlID0gcjNrX2ZsdXNoX2NhY2hlX3BhZ2U7Ci0JZmx1c2hfaWNhY2hlX3BhZ2UgPSByM2tfZmx1c2hfaWNhY2hlX3BhZ2U7CisJX19mbHVzaF9pY2FjaGVfcGFnZSA9IHIza19mbHVzaF9pY2FjaGVfcGFnZTsKIAlmbHVzaF9pY2FjaGVfcmFuZ2UgPSByM2tfZmx1c2hfaWNhY2hlX3JhbmdlOwogCiAJZmx1c2hfY2FjaGVfc2lndHJhbXAgPSByM2tfZmx1c2hfY2FjaGVfc2lndHJhbXA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vYy1yNGsuYyBiL2FyY2gvbWlwcy9tbS9jLXI0ay5jCmluZGV4IDA2OTgwM2YuLjBiMmRhNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9jLXI0ay5jCisrKyBiL2FyY2gvbWlwcy9tbS9jLXI0ay5jCkBAIC04OSw3ICs4OSw3IEBACiAJYmxhc3RfZGNhY2hlMzJfcGFnZShhZGRyKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHI0a19ibGFzdF9kY2FjaGVfcGFnZV9zZXR1cCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IHI0a19ibGFzdF9kY2FjaGVfcGFnZV9zZXR1cCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgIGRjX2xzaXplID0gY3B1X2RjYWNoZV9saW5lX3NpemUoKTsKIApAQCAtMTAzLDcgKzEwMyw3IEBACiAKIHN0YXRpYyB2b2lkICgqIHI0a19ibGFzdF9kY2FjaGVfcGFnZV9pbmRleGVkKSh1bnNpZ25lZCBsb25nIGFkZHIpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcjRrX2JsYXN0X2RjYWNoZV9wYWdlX2luZGV4ZWRfc2V0dXAodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCByNGtfYmxhc3RfZGNhY2hlX3BhZ2VfaW5kZXhlZF9zZXR1cCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZGNfbHNpemUgPSBjcHVfZGNhY2hlX2xpbmVfc2l6ZSgpOwogCkBAIC0xMTcsNyArMTE3LDcgQEAKIAogc3RhdGljIHZvaWQgKCogcjRrX2JsYXN0X2RjYWNoZSkodm9pZCk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByNGtfYmxhc3RfZGNhY2hlX3NldHVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgcjRrX2JsYXN0X2RjYWNoZV9zZXR1cCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZGNfbHNpemUgPSBjcHVfZGNhY2hlX2xpbmVfc2l6ZSgpOwogCkBAIC0yMDIsNyArMjAyLDcgQEAKIAogc3RhdGljIHZvaWQgKCogcjRrX2JsYXN0X2ljYWNoZV9wYWdlKSh1bnNpZ25lZCBsb25nIGFkZHIpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcjRrX2JsYXN0X2ljYWNoZV9wYWdlX3NldHVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgcjRrX2JsYXN0X2ljYWNoZV9wYWdlX3NldHVwKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBpY19sc2l6ZSA9IGNwdV9pY2FjaGVfbGluZV9zaXplKCk7CiAKQEAgLTIxOSw3ICsyMTksNyBAQAogCiBzdGF0aWMgdm9pZCAoKiByNGtfYmxhc3RfaWNhY2hlX3BhZ2VfaW5kZXhlZCkodW5zaWduZWQgbG9uZyBhZGRyKTsKIAotc3RhdGljIGlubGluZSB2b2lkIHI0a19ibGFzdF9pY2FjaGVfcGFnZV9pbmRleGVkX3NldHVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgcjRrX2JsYXN0X2ljYWNoZV9wYWdlX2luZGV4ZWRfc2V0dXAodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGljX2xzaXplID0gY3B1X2ljYWNoZV9saW5lX3NpemUoKTsKIApAQCAtMjQzLDcgKzI0Myw3IEBACiAKIHN0YXRpYyB2b2lkICgqIHI0a19ibGFzdF9pY2FjaGUpKHZvaWQpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcjRrX2JsYXN0X2ljYWNoZV9zZXR1cCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IHI0a19ibGFzdF9pY2FjaGVfc2V0dXAodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGljX2xzaXplID0gY3B1X2ljYWNoZV9saW5lX3NpemUoKTsKIApAQCAtMjY0LDcgKzI2NCw3IEBACiAKIHN0YXRpYyB2b2lkICgqIHI0a19ibGFzdF9zY2FjaGVfcGFnZSkodW5zaWduZWQgbG9uZyBhZGRyKTsKIAotc3RhdGljIGlubGluZSB2b2lkIHI0a19ibGFzdF9zY2FjaGVfcGFnZV9zZXR1cCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IHI0a19ibGFzdF9zY2FjaGVfcGFnZV9zZXR1cCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgc2NfbHNpemUgPSBjcHVfc2NhY2hlX2xpbmVfc2l6ZSgpOwogCkBAIC0yODIsNyArMjgyLDcgQEAKIAogc3RhdGljIHZvaWQgKCogcjRrX2JsYXN0X3NjYWNoZV9wYWdlX2luZGV4ZWQpKHVuc2lnbmVkIGxvbmcgYWRkcik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByNGtfYmxhc3Rfc2NhY2hlX3BhZ2VfaW5kZXhlZF9zZXR1cCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IHI0a19ibGFzdF9zY2FjaGVfcGFnZV9pbmRleGVkX3NldHVwKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBzY19sc2l6ZSA9IGNwdV9zY2FjaGVfbGluZV9zaXplKCk7CiAKQEAgLTMwMCw3ICszMDAsNyBAQAogCiBzdGF0aWMgdm9pZCAoKiByNGtfYmxhc3Rfc2NhY2hlKSh2b2lkKTsKIAotc3RhdGljIGlubGluZSB2b2lkIHI0a19ibGFzdF9zY2FjaGVfc2V0dXAodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCByNGtfYmxhc3Rfc2NhY2hlX3NldHVwKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBzY19sc2l6ZSA9IGNwdV9zY2FjaGVfbGluZV9zaXplKCk7CiAKQEAgLTQ3NSw3ICs0NzUsNyBAQAogCQl9CiAJfQogCWlmIChleGVjKSB7Ci0JCWlmIChjcHVfaGFzX3Z0YWdfaWNhY2hlKSB7CisJCWlmIChjcHVfaGFzX3Z0YWdfaWNhY2hlICYmIG1tID09IGN1cnJlbnQtPmFjdGl2ZV9tbSkgewogCQkJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCQkJaWYgKGNwdV9jb250ZXh0KGNwdSwgbW0pICE9IDApCkBAIC01OTksNyArNTk5LDcgQEAKIAkgKiBXZSdyZSBub3Qgc3VyZSBvZiB0aGUgdmlydHVhbCBhZGRyZXNzKGVzKSBpbnZvbHZlZCBoZXJlLCBzbwogCSAqIHdlIGhhdmUgdG8gZmx1c2ggdGhlIGVudGlyZSBJLWNhY2hlLgogCSAqLwotCWlmIChjcHVfaGFzX3Z0YWdfaWNhY2hlKSB7CisJaWYgKGNwdV9oYXNfdnRhZ19pY2FjaGUgJiYgdm1hLT52bV9tbSA9PSBjdXJyZW50LT5hY3RpdmVfbW0pIHsKIAkJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCQlpZiAoY3B1X2NvbnRleHQoY3B1LCB2bWEtPnZtX21tKSAhPSAwKQpAQCAtMTIyMSw3ICsxMjIxLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjb2hlcmVuY3lfc2V0dXAodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBjb2hlcmVuY3lfc2V0dXAodm9pZCkKIHsKIAljaGFuZ2VfYzBfY29uZmlnKENPTkZfQ01fQ01BU0ssIENPTkZfQ01fREVGQVVMVCk7CiAKQEAgLTEyNDIsNyArMTI0Miw3IEBACiAJCWNsZWFyX2MwX2NvbmZpZyhDT05GX0NVKTsKIAkJYnJlYWs7CiAJLyoKLQkgKiBXZSBuZWVkIHRvIGNhdGNoIHRoZSBlYWxyeSBBbGNoZW15IFNPQ3Mgd2l0aAorCSAqIFdlIG5lZWQgdG8gY2F0Y2ggdGhlIGVhcmx5IEFsY2hlbXkgU09DcyB3aXRoCiAJICogdGhlIHdyaXRlLW9ubHkgY29fY29uZmlnLm9kIGJpdCBhbmQgc2V0IGl0IGJhY2sgdG8gb25lLi4uCiAJICovCiAJY2FzZSBDUFVfQVUxMDAwOiAvKiByZXYuIERBLCBIQSwgSEIgKi8KQEAgLTEyOTEsNyArMTI5MSw3IEBACiAJX19mbHVzaF9jYWNoZV9hbGwJPSByNGtfX19mbHVzaF9jYWNoZV9hbGw7CiAJZmx1c2hfY2FjaGVfbW0JCT0gcjRrX2ZsdXNoX2NhY2hlX21tOwogCWZsdXNoX2NhY2hlX3BhZ2UJPSByNGtfZmx1c2hfY2FjaGVfcGFnZTsKLQlmbHVzaF9pY2FjaGVfcGFnZQk9IHI0a19mbHVzaF9pY2FjaGVfcGFnZTsKKwlfX2ZsdXNoX2ljYWNoZV9wYWdlCT0gcjRrX2ZsdXNoX2ljYWNoZV9wYWdlOwogCWZsdXNoX2NhY2hlX3JhbmdlCT0gcjRrX2ZsdXNoX2NhY2hlX3JhbmdlOwogCiAJZmx1c2hfY2FjaGVfc2lndHJhbXAJPSByNGtfZmx1c2hfY2FjaGVfc2lndHJhbXA7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vYy1zYjEuYyBiL2FyY2gvbWlwcy9tbS9jLXNiMS5jCmluZGV4IDJkNzFlZmIuLjE2YmFkN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9tbS9jLXNiMS5jCisrKyBiL2FyY2gvbWlwcy9tbS9jLXNiMS5jCkBAIC0xNTUsNiArMTU1LDI2IEBACiB9CiAKIC8qCisgKiBJbnZhbGlkYXRlIGEgcmFuZ2Ugb2YgdGhlIGljYWNoZS4gIFRoZSBhZGRyZXNzZXMgYXJlIHZpcnR1YWwsIGFuZAorICogdGhlIGNhY2hlIGlzIHZpcnR1YWxseSBpbmRleGVkIGFuZCB0YWdnZWQuICBIb3dldmVyLCB3ZSBkb24ndAorICogbmVjZXNzYXJpbHkgaGF2ZSB0aGUgcmlnaHQgQVNJRCBjb250ZXh0LCBzbyB1c2UgaW5kZXggb3BzIGluc3RlYWQKKyAqIG9mIGhpdCBvcHMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3NiMV9mbHVzaF9pY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwKKwl1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlzdGFydCAmPSB+KGljYWNoZV9saW5lX3NpemUgLSAxKTsKKwllbmQgPSAoZW5kICsgaWNhY2hlX2xpbmVfc2l6ZSAtIDEpICYgfihpY2FjaGVfbGluZV9zaXplIC0gMSk7CisKKwl3aGlsZSAoc3RhcnQgIT0gZW5kKSB7CisJCWNhY2hlX3NldF9vcChJbmRleF9JbnZhbGlkYXRlX0ksIHN0YXJ0ICYgaWNhY2hlX2luZGV4X21hc2spOworCQlzdGFydCArPSBpY2FjaGVfbGluZV9zaXplOworCX0KKwltaXNwcmVkaWN0KCk7CisJc3luYygpOworfQorCisvKgogICogRmx1c2ggdGhlIGljYWNoZSBmb3IgYSBnaXZlbiBwaHlzaWNhbCBwYWdlLiAgTmVlZCB0byB3cml0ZWJhY2sgdGhlCiAgKiBkY2FjaGUgZmlyc3QsIHRoZW4gaW52YWxpZGF0ZSB0aGUgaWNhY2hlLiAgSWYgdGhlIHBhZ2UgaXNuJ3QKICAqIGV4ZWN1dGFibGUsIG5vdGhpbmcgaXMgcmVxdWlyZWQuCkBAIC0xNzMsOCArMTkzLDExIEBACiAJLyoKIAkgKiBCdW1waW5nIHRoZSBBU0lEIGlzIHByb2JhYmx5IGNoZWFwZXIgdGhhbiB0aGUgZmx1c2ggLi4uCiAJICovCi0JaWYgKGNwdV9jb250ZXh0KGNwdSwgdm1hLT52bV9tbSkgIT0gMCkKLQkJZHJvcF9tbXVfY29udGV4dCh2bWEtPnZtX21tLCBjcHUpOworCWlmICh2bWEtPnZtX21tID09IGN1cnJlbnQtPmFjdGl2ZV9tbSkgeworCQlpZiAoY3B1X2NvbnRleHQoY3B1LCB2bWEtPnZtX21tKSAhPSAwKQorCQkJZHJvcF9tbXVfY29udGV4dCh2bWEtPnZtX21tLCBjcHUpOworCX0gZWxzZQorCQlfX3NiMV9mbHVzaF9pY2FjaGVfcmFuZ2UoYWRkciwgYWRkciArIFBBR0VfU0laRSk7CiB9CiAKICNpZmRlZiBDT05GSUdfU01QCkBAIC0yMTAsMjYgKzIzMyw2IEBACiAJX19hdHRyaWJ1dGVfXygoYWxpYXMoImxvY2FsX3NiMV9mbHVzaF9jYWNoZV9wYWdlIikpKTsKICNlbmRpZgogCi0vKgotICogSW52YWxpZGF0ZSBhIHJhbmdlIG9mIHRoZSBpY2FjaGUuICBUaGUgYWRkcmVzc2VzIGFyZSB2aXJ0dWFsLCBhbmQKLSAqIHRoZSBjYWNoZSBpcyB2aXJ0dWFsbHkgaW5kZXhlZCBhbmQgdGFnZ2VkLiAgSG93ZXZlciwgd2UgZG9uJ3QKLSAqIG5lY2Vzc2FyaWx5IGhhdmUgdGhlIHJpZ2h0IEFTSUQgY29udGV4dCwgc28gdXNlIGluZGV4IG9wcyBpbnN0ZWFkCi0gKiBvZiBoaXQgb3BzLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zYjFfZmx1c2hfaWNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsCi0JdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0Jc3RhcnQgJj0gfihpY2FjaGVfbGluZV9zaXplIC0gMSk7Ci0JZW5kID0gKGVuZCArIGljYWNoZV9saW5lX3NpemUgLSAxKSAmIH4oaWNhY2hlX2xpbmVfc2l6ZSAtIDEpOwotCi0Jd2hpbGUgKHN0YXJ0ICE9IGVuZCkgewotCQljYWNoZV9zZXRfb3AoSW5kZXhfSW52YWxpZGF0ZV9JLCBzdGFydCAmIGljYWNoZV9pbmRleF9tYXNrKTsKLQkJc3RhcnQgKz0gaWNhY2hlX2xpbmVfc2l6ZTsKLQl9Ci0JbWlzcHJlZGljdCgpOwotCXN5bmMoKTsKLX0KLQogCiAvKgogICogSW52YWxpZGF0ZSBhbGwgY2FjaGVzIG9uIHRoaXMgQ1BVCkBAIC0zMjYsOSArMzI5LDEyIEBACiAJICogSWYgdGhlcmUncyBhIGNvbnRleHQsIGJ1bXAgdGhlIEFTSUQgKGNoZWFwZXIgdGhhbiBhIGZsdXNoLAogCSAqIHNpbmNlIHdlIGRvbid0IGtub3cgVkFzISkKIAkgKi8KLQlpZiAoY3B1X2NvbnRleHQoY3B1LCB2bWEtPnZtX21tKSAhPSAwKSB7Ci0JCWRyb3BfbW11X2NvbnRleHQodm1hLT52bV9tbSwgY3B1KTsKLQl9CisJaWYgKHZtYS0+dm1fbW0gPT0gY3VycmVudC0+YWN0aXZlX21tKSB7CisJCWlmIChjcHVfY29udGV4dChjcHUsIHZtYS0+dm1fbW0pICE9IDApCisJCQlkcm9wX21tdV9jb250ZXh0KHZtYS0+dm1fbW0sIGNwdSk7CisJfSBlbHNlCisJCV9fc2IxX2ZsdXNoX2ljYWNoZV9yYW5nZShzdGFydCwgc3RhcnQgKyBQQUdFX1NJWkUpOworCiB9CiAKICNpZmRlZiBDT05GSUdfU01QCkBAIC01MjAsNyArNTI2LDcgQEAKIAogCS8qIFRoZXNlIHJvdXRpbmVzIGFyZSBmb3IgSWNhY2hlIGNvaGVyZW5jZSB3aXRoIHRoZSBEY2FjaGUgKi8KIAlmbHVzaF9pY2FjaGVfcmFuZ2UgPSBzYjFfZmx1c2hfaWNhY2hlX3JhbmdlOwotCWZsdXNoX2ljYWNoZV9wYWdlID0gc2IxX2ZsdXNoX2ljYWNoZV9wYWdlOworCV9fZmx1c2hfaWNhY2hlX3BhZ2UgPSBzYjFfZmx1c2hfaWNhY2hlX3BhZ2U7CiAJZmx1c2hfaWNhY2hlX2FsbCA9IF9fc2IxX2ZsdXNoX2ljYWNoZV9hbGw7IC8qIGxvY2FsIG9ubHkgKi8KIAogCS8qIFRoaXMgaW1wbGllcyBhbiBJY2FjaGUgZmx1c2ggdG9vLCBzbyBjYW4ndCBiZSBub3AnZWQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jLXR4MzkuYyBiL2FyY2gvbWlwcy9tbS9jLXR4MzkuYwppbmRleCA1ZGZjOWIxLi45MzJhMDlkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vYy10eDM5LmMKKysrIGIvYXJjaC9taXBzL21tL2MtdHgzOS5jCkBAIC0zODIsNyArMzgyLDcgQEAKIAkJZmx1c2hfY2FjaGVfbW0JCT0gKHZvaWQgKikgdHgzOWhfZmx1c2hfaWNhY2hlX2FsbDsKIAkJZmx1c2hfY2FjaGVfcmFuZ2UJPSAodm9pZCAqKSB0eDM5aF9mbHVzaF9pY2FjaGVfYWxsOwogCQlmbHVzaF9jYWNoZV9wYWdlCT0gKHZvaWQgKikgdHgzOWhfZmx1c2hfaWNhY2hlX2FsbDsKLQkJZmx1c2hfaWNhY2hlX3BhZ2UJPSAodm9pZCAqKSB0eDM5aF9mbHVzaF9pY2FjaGVfYWxsOworCQlfX2ZsdXNoX2ljYWNoZV9wYWdlCT0gKHZvaWQgKikgdHgzOWhfZmx1c2hfaWNhY2hlX2FsbDsKIAkJZmx1c2hfaWNhY2hlX3JhbmdlCT0gKHZvaWQgKikgdHgzOWhfZmx1c2hfaWNhY2hlX2FsbDsKIAogCQlmbHVzaF9jYWNoZV9zaWd0cmFtcAk9ICh2b2lkICopIHR4MzloX2ZsdXNoX2ljYWNoZV9hbGw7CkBAIC00MDgsNyArNDA4LDcgQEAKIAkJZmx1c2hfY2FjaGVfbW0gPSB0eDM5X2ZsdXNoX2NhY2hlX21tOwogCQlmbHVzaF9jYWNoZV9yYW5nZSA9IHR4MzlfZmx1c2hfY2FjaGVfcmFuZ2U7CiAJCWZsdXNoX2NhY2hlX3BhZ2UgPSB0eDM5X2ZsdXNoX2NhY2hlX3BhZ2U7Ci0JCWZsdXNoX2ljYWNoZV9wYWdlID0gdHgzOV9mbHVzaF9pY2FjaGVfcGFnZTsKKwkJX19mbHVzaF9pY2FjaGVfcGFnZSA9IHR4MzlfZmx1c2hfaWNhY2hlX3BhZ2U7CiAJCWZsdXNoX2ljYWNoZV9yYW5nZSA9IHR4MzlfZmx1c2hfaWNhY2hlX3JhbmdlOwogCiAJCWZsdXNoX2NhY2hlX3NpZ3RyYW1wID0gdHgzOV9mbHVzaF9jYWNoZV9zaWd0cmFtcDsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9jYWNoZS5jIGIvYXJjaC9taXBzL21tL2NhY2hlLmMKaW5kZXggZGRkM2EyZC4uNDBjOGIwMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2NhY2hlLmMKKysrIGIvYXJjaC9taXBzL21tL2NhY2hlLmMKQEAgLTI1LDcgKzI1LDcgQEAKIHZvaWQgKCpmbHVzaF9jYWNoZV9wYWdlKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBwYWdlLAogCXVuc2lnbmVkIGxvbmcgcGZuKTsKIHZvaWQgKCpmbHVzaF9pY2FjaGVfcmFuZ2UpKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKLXZvaWQgKCpmbHVzaF9pY2FjaGVfcGFnZSkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlKTsKK3ZvaWQgKCpfX2ZsdXNoX2ljYWNoZV9wYWdlKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHBhZ2UgKnBhZ2UpOwogCiAvKiBNSVBTIHNwZWNpZmljIGNhY2hlIG9wZXJhdGlvbnMgKi8KIHZvaWQgKCpmbHVzaF9jYWNoZV9zaWd0cmFtcCkodW5zaWduZWQgbG9uZyBhZGRyKTsKQEAgLTcwLDYgKzcwLDggQEAKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2VfbWFwcGluZyhwYWdlKTsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAKKwlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpCisJCXJldHVybjsKIAlpZiAobWFwcGluZyAmJiAhbWFwcGluZ19tYXBwZWQobWFwcGluZykpIHsKIAkJU2V0UGFnZURjYWNoZURpcnR5KHBhZ2UpOwogCQlyZXR1cm47CkBAIC05MSwxNiArOTMsMTYgQEAKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAl1bnNpZ25lZCBsb25nIHBmbiwgYWRkcjsKKwlpbnQgZXhlYyA9ICh2bWEtPnZtX2ZsYWdzICYgVk1fRVhFQykgJiYgIWNwdV9oYXNfaWNfZmlsbHNfZl9kYzsKIAogCXBmbiA9IHB0ZV9wZm4ocHRlKTsKLQlpZiAocGZuX3ZhbGlkKHBmbikgJiYgKHBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pLCBwYWdlX21hcHBpbmcocGFnZSkpICYmCi0JICAgIFBhZ2VfZGNhY2hlX2RpcnR5KHBhZ2UpKSB7Ci0JCWlmIChwYWdlc19kb19hbGlhcygodW5zaWduZWQgbG9uZylwYWdlX2FkZHJlc3MocGFnZSksCi0JCSAgICAgICAgICAgICAgICAgICBhZGRyZXNzICYgUEFHRV9NQVNLKSkgewotCQkJYWRkciA9ICh1bnNpZ25lZCBsb25nKSBwYWdlX2FkZHJlc3MocGFnZSk7CisJaWYgKHVubGlrZWx5KCFwZm5fdmFsaWQocGZuKSkpCisJCXJldHVybjsKKwlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwlpZiAocGFnZV9tYXBwaW5nKHBhZ2UpICYmIFBhZ2VfZGNhY2hlX2RpcnR5KHBhZ2UpKSB7CisJCWFkZHIgPSAodW5zaWduZWQgbG9uZykgcGFnZV9hZGRyZXNzKHBhZ2UpOworCQlpZiAoZXhlYyB8fCBwYWdlc19kb19hbGlhcyhhZGRyLCBhZGRyZXNzICYgUEFHRV9NQVNLKSkKIAkJCWZsdXNoX2RhdGFfY2FjaGVfcGFnZShhZGRyKTsKLQkJfQotCiAJCUNsZWFyUGFnZURjYWNoZURpcnR5KHBhZ2UpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tbS9mYXVsdC5jIGIvYXJjaC9taXBzL21tL2ZhdWx0LmMKaW5kZXggZTNhNjE3Mi4uYTRmOGM0NSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL21tL2ZhdWx0LmMKKysrIGIvYXJjaC9taXBzL21tL2ZhdWx0LmMKQEAgLTg5LDcgKzg5LDcgQEAKIAkJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSkKIAkJCWdvdG8gYmFkX2FyZWE7CiAJfSBlbHNlIHsKLQkJaWYgKCEodm1hLT52bV9mbGFncyAmIChWTV9SRUFEIHwgVk1fRVhFQykpKQorCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgKFZNX1JFQUQgfCBWTV9XUklURSB8IFZNX0VYRUMpKSkKIAkJCWdvdG8gYmFkX2FyZWE7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vdGxiLXI0ay5jIGIvYXJjaC9taXBzL21tL3RsYi1yNGsuYwppbmRleCAyY2RlMWI3Li4yZTBlMjFlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vdGxiLXI0ay5jCisrKyBiL2FyY2gvbWlwcy9tbS90bGItcjRrLmMKQEAgLTI2LDExICsyNiw2IEBACiAgKi8KICNkZWZpbmUgVU5JUVVFX0VOVFJZSEkoaWR4KSAoQ0tTRUcwICsgKChpZHgpIDw8IChQQUdFX1NISUZUICsgMSkpKQogCi0vKiBDUDAgaGF6YXJkIGF2b2lkYW5jZS4gKi8KLSNkZWZpbmUgQkFSUklFUiBfX2FzbV9fIF9fdm9sYXRpbGVfXygiLnNldCBub3Jlb3JkZXJcblx0IiBcCi0JCQkJICAgICAibm9wOyBub3A7IG5vcDsgbm9wOyBub3A7IG5vcDtcblx0IiBcCi0JCQkJICAgICAiLnNldCByZW9yZGVyXG5cdCIpCi0KIC8qIEF0b21pY2l0eSBhbmQgaW50ZXJydXB0YWJpbGl0eSAqLwogI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVEMKIApAQCAtMTI2LDcgKzEyMSw3IEBACiAJCQkJc3RhcnQgKz0gKFBBR0VfU0laRSA8PCAxKTsKIAkJCQltdGMwX3RsYndfaGF6YXJkKCk7CiAJCQkJdGxiX3Byb2JlKCk7Ci0JCQkJQkFSUklFUjsKKwkJCQl0bGJfcHJvYmVfaGF6YXJkKCk7CiAJCQkJaWR4ID0gcmVhZF9jMF9pbmRleCgpOwogCQkJCXdyaXRlX2MwX2VudHJ5bG8wKDApOwogCQkJCXdyaXRlX2MwX2VudHJ5bG8xKDApOwpAQCAtMTY4LDcgKzE2Myw3IEBACiAJCQlzdGFydCArPSAoUEFHRV9TSVpFIDw8IDEpOwogCQkJbXRjMF90bGJ3X2hhemFyZCgpOwogCQkJdGxiX3Byb2JlKCk7Ci0JCQlCQVJSSUVSOworCQkJdGxiX3Byb2JlX2hhemFyZCgpOwogCQkJaWR4ID0gcmVhZF9jMF9pbmRleCgpOwogCQkJd3JpdGVfYzBfZW50cnlsbzAoMCk7CiAJCQl3cml0ZV9jMF9lbnRyeWxvMSgwKTsKQEAgLTIwMiw3ICsxOTcsNyBAQAogCQl3cml0ZV9jMF9lbnRyeWhpKHBhZ2UgfCBuZXdwaWQpOwogCQltdGMwX3RsYndfaGF6YXJkKCk7CiAJCXRsYl9wcm9iZSgpOwotCQlCQVJSSUVSOworCQl0bGJfcHJvYmVfaGF6YXJkKCk7CiAJCWlkeCA9IHJlYWRfYzBfaW5kZXgoKTsKIAkJd3JpdGVfYzBfZW50cnlsbzAoMCk7CiAJCXdyaXRlX2MwX2VudHJ5bG8xKDApOwpAQCAtMjM1LDcgKzIzMCw3IEBACiAJd3JpdGVfYzBfZW50cnloaShwYWdlKTsKIAltdGMwX3RsYndfaGF6YXJkKCk7CiAJdGxiX3Byb2JlKCk7Ci0JQkFSUklFUjsKKwl0bGJfcHJvYmVfaGF6YXJkKCk7CiAJaWR4ID0gcmVhZF9jMF9pbmRleCgpOwogCXdyaXRlX2MwX2VudHJ5bG8wKDApOwogCXdyaXRlX2MwX2VudHJ5bG8xKDApOwpAQCAtMjc5LDcgKzI3NCw3IEBACiAJcGdkcCA9IHBnZF9vZmZzZXQodm1hLT52bV9tbSwgYWRkcmVzcyk7CiAJbXRjMF90bGJ3X2hhemFyZCgpOwogCXRsYl9wcm9iZSgpOwotCUJBUlJJRVI7CisJdGxiX3Byb2JlX2hhemFyZCgpOwogCXB1ZHAgPSBwdWRfb2Zmc2V0KHBnZHAsIGFkZHJlc3MpOwogCXBtZHAgPSBwbWRfb2Zmc2V0KHB1ZHAsIGFkZHJlc3MpOwogCWlkeCA9IHJlYWRfYzBfaW5kZXgoKTsKQEAgLTMyMCw3ICszMTUsNyBAQAogCXBnZHAgPSBwZ2Rfb2Zmc2V0KHZtYS0+dm1fbW0sIGFkZHJlc3MpOwogCW10YzBfdGxid19oYXphcmQoKTsKIAl0bGJfcHJvYmUoKTsKLQlCQVJSSUVSOworCXRsYl9wcm9iZV9oYXphcmQoKTsKIAlwbWRwID0gcG1kX29mZnNldChwZ2RwLCBhZGRyZXNzKTsKIAlpZHggPSByZWFkX2MwX2luZGV4KCk7CiAJcHRlcCA9IHB0ZV9vZmZzZXRfbWFwKHBtZHAsIGFkZHJlc3MpOwpAQCAtMzUxLDcgKzM0Niw3IEBACiAJd2lyZWQgPSByZWFkX2MwX3dpcmVkKCk7CiAJd3JpdGVfYzBfd2lyZWQod2lyZWQgKyAxKTsKIAl3cml0ZV9jMF9pbmRleCh3aXJlZCk7Ci0JQkFSUklFUjsKKwl0bGJ3X3VzZV9oYXphcmQoKTsJLyogV2hhdCBpcyB0aGUgaGF6YXJkIGhlcmU/ICovCiAJd3JpdGVfYzBfcGFnZW1hc2socGFnZW1hc2spOwogCXdyaXRlX2MwX2VudHJ5aGkoZW50cnloaSk7CiAJd3JpdGVfYzBfZW50cnlsbzAoZW50cnlsbzApOwpAQCAtMzYxLDcgKzM1Niw3IEBACiAJdGxid191c2VfaGF6YXJkKCk7CiAKIAl3cml0ZV9jMF9lbnRyeWhpKG9sZF9jdHgpOwotCUJBUlJJRVI7CisJdGxid191c2VfaGF6YXJkKCk7CS8qIFdoYXQgaXMgdGhlIGhhemFyZCBoZXJlPyAqLwogCXdyaXRlX2MwX3BhZ2VtYXNrKG9sZF9wYWdlbWFzayk7CiAJbG9jYWxfZmx1c2hfdGxiX2FsbCgpOwogCUVYSVRfQ1JJVElDQUwoZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9NYWtlZmlsZSBiL2FyY2gvbWlwcy9wY2kvTWFrZWZpbGUKaW5kZXggMzVkNTkyNy4uZWRlZmE5NyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3BjaS9NYWtlZmlsZQorKysgYi9hcmNoL21pcHMvcGNpL01ha2VmaWxlCkBAIC0xMSw3ICsxMSw2IEBACiBvYmotJChDT05GSUdfTUlQU19CT05JVE82NCkJKz0gb3BzLWJvbml0bzY0Lm8KIG9iai0kKENPTkZJR19NSVBTX0dUNjQxMTEpCSs9IG9wcy1ndDY0MTExLm8KIG9iai0kKENPTkZJR19NSVBTX0dUNjQxMjApCSs9IG9wcy1ndDY0MTIwLm8KLW9iai0kKENPTkZJR19NSVBTX0dUOTYxMDApCSs9IG9wcy1ndDk2MTAwLm8KIG9iai0kKENPTkZJR19QQ0lfTUFSVkVMTCkJKz0gb3BzLW1hcnZlbGwubwogb2JqLSQoQ09ORklHX01JUFNfTVNDKQkJKz0gb3BzLW1zYy5vCiBvYmotJChDT05GSUdfTUlQU19OSUxFNCkJKz0gb3BzLW5pbGU0Lm8KQEAgLTI4LDggKzI3LDcgQEAKIG9iai0kKENPTkZJR19MQVNBVCkJCSs9IHBjaS1sYXNhdC5vCiBvYmotJChDT05GSUdfTUlQU19BVExBUykJKz0gZml4dXAtYXRsYXMubwogb2JqLSQoQ09ORklHX01JUFNfQ09CQUxUKQkrPSBmaXh1cC1jb2JhbHQubwotb2JqLSQoQ09ORklHX01JUFNfRVY5NjEwMCkJKz0gZml4dXAtZXY2NDEyMC5vCi1vYmotJChDT05GSUdfTUlQU19FVjk2MTAwKQkrPSBmaXh1cC1ldjk2MTAwLm8gcGNpLWV2OTYxMDAubworb2JqLSQoQ09ORklHX01JUFNfRVY2NDEyMCkJKz0gZml4dXAtZXY2NDEyMC5vCiBvYmotJChDT05GSUdfTUlQU19JVEU4MTcyKQkrPSBmaXh1cC1pdGU4MTcyZy5vCiBvYmotJChDT05GSUdfTUlQU19JVlIpCQkrPSBmaXh1cC1pdnIubwogb2JqLSQoQ09ORklHX1NPQ19BVTE1MDApCSs9IGZpeHVwLWF1MTAwMC5vIG9wcy1hdTEwMDAubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9maXh1cC1hdGxhcy5jIGIvYXJjaC9taXBzL3BjaS9maXh1cC1hdGxhcy5jCmluZGV4IDQzOTUxMGEuLmM2Y2Q2ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvZml4dXAtYXRsYXMuYworKysgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLWF0bGFzLmMKQEAgLTIxLDE2ICsyMSwxNiBAQAogCiAjaW5jbHVkZSA8YXNtL21pcHMtYm9hcmRzL2F0bGFzaW50Lmg+CiAKLSNkZWZpbmUgUENJQQkJQVRMQVNJTlRfUENJQQotI2RlZmluZSBQQ0lCCQlBVExBU0lOVF9QQ0lCCi0jZGVmaW5lIFBDSUMJCUFUTEFTSU5UX1BDSUMKLSNkZWZpbmUgUENJRAkJQVRMQVNJTlRfUENJRAotI2RlZmluZSBJTlRBCQlBVExBU0lOVF9JTlRBCi0jZGVmaW5lIElOVEIJCUFUTEFTSU5UX0lOVEIKLSNkZWZpbmUgRVRICQlBVExBU0lOVF9FVEgKLSNkZWZpbmUgSU5UQwkJQVRMQVNJTlRfSU5UQwotI2RlZmluZSBTQ1NJCQlBVExBU0lOVF9TQ1NJCi0jZGVmaW5lIElOVEQJCUFUTEFTSU5UX0lOVEQKKyNkZWZpbmUgUENJQQkJQVRMQVNfSU5UX1BDSUEKKyNkZWZpbmUgUENJQgkJQVRMQVNfSU5UX1BDSUIKKyNkZWZpbmUgUENJQwkJQVRMQVNfSU5UX1BDSUMKKyNkZWZpbmUgUENJRAkJQVRMQVNfSU5UX1BDSUQKKyNkZWZpbmUgSU5UQQkJQVRMQVNfSU5UX0lOVEEKKyNkZWZpbmUgSU5UQgkJQVRMQVNfSU5UX0lOVEIKKyNkZWZpbmUgRVRICQlBVExBU19JTlRfRVRICisjZGVmaW5lIElOVEMJCUFUTEFTX0lOVF9JTlRDCisjZGVmaW5lIFNDU0kJCUFUTEFTX0lOVF9TQ1NJCisjZGVmaW5lIElOVEQJCUFUTEFTX0lOVF9JTlRECiAKIHN0YXRpYyBjaGFyIGlycV90YWJbXVs1XSBfX2luaXRkYXRhID0gewogCS8qICAgICAgSU5UQSAgICBJTlRCICAgIElOVEMgICAgSU5URCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL3BjaS9maXh1cC1ldjk2MTAwLmMgYi9hcmNoL21pcHMvcGNpL2ZpeHVwLWV2OTYxMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJiYzk3Ny4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvcGNpL2ZpeHVwLWV2OTYxMDAuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qCi0gKgotICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCi0gKglFVjk2MTAwIEJvYXJkIHNwZWNpZmljIHBjaSBmaXh1cHMuCi0gKgotICogQ29weXJpZ2h0IDIwMDEgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqICAgICAgICAgCXBwb3BvdkBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRISVMgIFNPRlRXQVJFICBJUyBQUk9WSURFRCAgIGBgQVMgIElTJycgQU5EICAgQU5ZICBFWFBSRVNTIE9SIElNUExJRUQKLSAqICBXQVJSQU5USUVTLCAgIElOQ0xVRElORywgQlVUIE5PVCAgTElNSVRFRCAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4KLSAqICBOTyAgRVZFTlQgIFNIQUxMICAgVEhFIEFVVEhPUiAgQkUgICAgTElBQkxFIEZPUiBBTlkgICBESVJFQ1QsIElORElSRUNULAotICogIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogIE5PVCBMSU1JVEVEICAgVE8sIFBST0NVUkVNRU5UIE9GICBTVUJTVElUVVRFIEdPT0RTICBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogIFVTRSwgREFUQSwgIE9SIFBST0ZJVFM7IE9SICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlICB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICovCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0KLXN0YXRpYyBjaGFyIGlycV90YWJfZXY5NjEwMFtdWzVdIF9faW5pdGRhdGEgPSB7Ci0gWzhdID0geyAwLCA1LCA1LCA1LCA1IH0sCi0gWzldID0geyAwLCAyLCAyLCAyLCAyIH0KLX07Ci0KLWludCBfX2luaXQgcGNpYmlvc19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKLXsKLQlyZXR1cm4gaXJxX3RhYl9ldjk2MTAwW3Nsb3RdW3Bpbl07Ci19Ci0KLS8qIERvIHBsYXRmb3JtIHNwZWNpZmljIGRldmljZSBpbml0aWFsaXphdGlvbiBhdCBwY2lfZW5hYmxlX2RldmljZSgpIHRpbWUgKi8KLWludCBwY2liaW9zX3BsYXRfZGV2X2luaXQoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvb3BzLWF1MTAwMC5jIGIvYXJjaC9taXBzL3BjaS9vcHMtYXUxMDAwLmMKaW5kZXggMGMwYzFlNjUuLjhhZTQ2NDggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvb3BzLWF1MTAwMC5jCisrKyBiL2FyY2gvbWlwcy9wY2kvb3BzLWF1MTAwMC5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAlpZiAoZmlyc3RfY2ZnKSB7CiAJCS8qIHJlc2VydmUgYSB3aXJlZCBlbnRyeSBmb3IgcGNpIGNvbmZpZyBhY2Nlc3NlcyAqLwogCQlmaXJzdF9jZmcgPSAwOwotCQlwY2lfY2ZnX3ZtID0gZ2V0X3ZtX2FyZWEoMHgyMDAwLCAwKTsKKwkJcGNpX2NmZ192bSA9IGdldF92bV9hcmVhKDB4MjAwMCwgVk1fSU9SRU1BUCk7CiAJCWlmICghcGNpX2NmZ192bSkKIAkJCXBhbmljIChLRVJOX0VSUiAiUENJIHVuYWJsZSB0byBnZXQgdm0gYXJlYVxuIik7CiAJCXBjaV9jZmdfd2lyZWRfZW50cnkgPSByZWFkX2MwX3dpcmVkKCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvcGNpL29wcy1ndDk2MTAwLmMgYi9hcmNoL21pcHMvcGNpL29wcy1ndDk2MTAwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNGVhNjYuLjAwMDAwMDAKLS0tIGEvYXJjaC9taXBzL3BjaS9vcHMtZ3Q5NjEwMC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKgotICogQlJJRUYgTU9EVUxFIERFU0NSSVBUSU9OCi0gKglHYWxpbGVvIEVWOTYxMDAgYm9hcmQgc3BlY2lmaWMgcGNpIHN1cHBvcnQuCi0gKgotICogQ29weXJpZ2h0IDIwMDAgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqICAgICAgICAgCXBwb3BvdkBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCi0gKgotICogVGhpcyBmaWxlIHdhcyBkZXJpdmVkIGZyb20gQ2Fyc3RlbiBMYW5nZ2FhcmQncwotICogYXJjaC9taXBzL21pcHMtYm9hcmRzL2dlbmVyaWMvcGNpLmMKLSAqCi0gKiBDYXJzdGVuIExhbmdnYWFyZCwgY2Fyc3RlbmxAbWlwcy5jb20KLSAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCi0gKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKLSAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL2RlbGF5Lmg+Ci0jaW5jbHVkZSA8YXNtL2d0NjQxMjAuaD4KLSNpbmNsdWRlIDxhc20vZ2FsaWxlby1ib2FyZHMvZXY5NjEwMC5oPgotCi0jZGVmaW5lIFBDSV9BQ0NFU1NfUkVBRCAgMAotI2RlZmluZSBQQ0lfQUNDRVNTX1dSSVRFIDEKLQotc3RhdGljIGludCBzdGF0aWMgZ3Q5NjEwMF9jb25maWdfYWNjZXNzKHVuc2lnbmVkIGNoYXIgYWNjZXNzX3R5cGUsCi0Jc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgd2hlcmUsIHUzMiAqIGRhdGEpCi17Ci0JdW5zaWduZWQgY2hhciBidXMgPSBidXMtPm51bWJlcjsKLQl1MzIgaW50cjsKLQotCS8qCi0JICogQmVjYXVzZSBvZiBhIGJ1ZyBpbiB0aGUgZ2FsaWxlbyAoZm9yIHNsb3QgMzEpLgotCSAqLwotCWlmIChidXMgPT0gMCAmJiBkZXZmbiA+PSBQQ0lfREVWRk4oMzEsIDApKQotCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwotCi0JLyogQ2xlYXIgY2F1c2UgcmVnaXN0ZXIgYml0cyAqLwotCUdUX1dSSVRFKEdUX0lOVFJDQVVTRV9PRlMsIH4oR1RfSU5UUkNBVVNFX01BU0FCT1JUMF9CSVQgfAotCQkJCSAgICAgR1RfSU5UUkNBVVNFX1RBUkFCT1JUMF9CSVQpKTsKLQotCS8qIFNldHVwIGFkZHJlc3MgKi8KLQlHVF9XUklURShHVF9QQ0kwX0NGR0FERFJfT0ZTLAotCQkgKGJ1cyA8PCBHVF9QQ0kwX0NGR0FERFJfQlVTTlVNX1NIRikgfAotCQkgKGRldmZuIDw8IEdUX1BDSTBfQ0ZHQUREUl9GVU5DVE5VTV9TSEYpIHwKLQkJICgod2hlcmUgLyA0KSA8PCBHVF9QQ0kwX0NGR0FERFJfUkVHTlVNX1NIRikgfAotCQkgR1RfUENJMF9DRkdBRERSX0NPTkZJR0VOX0JJVCk7Ci0JdWRlbGF5KDIpOwotCi0KLQlpZiAoYWNjZXNzX3R5cGUgPT0gUENJX0FDQ0VTU19XUklURSkgewotCQlpZiAoZGV2Zm4gIT0gMCkKLQkJCSpkYXRhID0gbGUzMl90b19jcHUoKmRhdGEpOwotCQlHVF9XUklURShHVF9QQ0kwX0NGR0RBVEFfT0ZTLCAqZGF0YSk7Ci0JfSBlbHNlIHsKLQkJKmRhdGEgPSBHVF9SRUFEKEdUX1BDSTBfQ0ZHREFUQV9PRlMpOwotCQlpZiAoZGV2Zm4gIT0gMCkKLQkJCSpkYXRhID0gbGUzMl90b19jcHUoKmRhdGEpOwotCX0KLQotCXVkZWxheSgyKTsKLQotCS8qIENoZWNrIGZvciBtYXN0ZXIgb3IgdGFyZ2V0IGFib3J0ICovCi0JaW50ciA9IEdUX1JFQUQoR1RfSU5UUkNBVVNFX09GUyk7Ci0KLQlpZiAoaW50ciAmIChHVF9JTlRSQ0FVU0VfTUFTQUJPUlQwX0JJVCB8IEdUX0lOVFJDQVVTRV9UQVJBQk9SVDBfQklUKSkgewotCQkvKiBFcnJvciBvY2N1cmVkICovCi0KLQkJLyogQ2xlYXIgYml0cyAqLwotCQlHVF9XUklURShHVF9JTlRSQ0FVU0VfT0ZTLCB+KEdUX0lOVFJDQVVTRV9NQVNBQk9SVDBfQklUIHwKLQkJCQkJICAgICBHVF9JTlRSQ0FVU0VfVEFSQUJPUlQwX0JJVCkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKgotICogV2UgY2FuJ3QgYWRkcmVzcyA4IGFuZCAxNiBiaXQgd29yZHMgZGlyZWN0bHkuICBJbnN0ZWFkIHdlIGhhdmUgdG8KLSAqIHJlYWQvd3JpdGUgYSAzMmJpdCB3b3JkIGFuZCBtYXNrL21vZGlmeSB0aGUgZGF0YSB3ZSBhY3R1YWxseSB3YW50LgotICovCi1zdGF0aWMgaW50IGd0OTYxMDBfcGNpYmlvc19yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKLQlpbnQgd2hlcmUsIGludCBzaXplLCB1MzIgKiB2YWwpCi17Ci0JdTMyIGRhdGEgPSAwOwotCi0JaWYgKGd0OTYxMDBfY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1JFQUQsIGJ1cywgZGV2Zm4sIHdoZXJlLCAmZGF0YSkpCi0JCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7Ci0KLQlzd2l0Y2ggKHNpemUpIHsKLQljYXNlIDE6Ci0JCSp2YWwgPSAoZGF0YSA+PiAoKHdoZXJlICYgMykgPDwgMykpICYgMHhmZjsKLQkJYnJlYWs7Ci0KLQljYXNlIDI6Ci0JCSp2YWwgPSAoZGF0YSA+PiAoKHdoZXJlICYgMykgPDwgMykpICYgMHhmZmZmOwotCQlicmVhazsKLQotCWNhc2UgNDoKLQkJKnZhbCA9IGRhdGE7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50IGd0OTYxMDBfcGNpYmlvc193cml0ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCi0JaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKLXsKLQl1MzIgZGF0YSA9IDA7Ci0KLQlzd2l0Y2ggKHNpemUpIHsKLQljYXNlIDE6Ci0JCWlmIChndDk2MTAwX2NvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19SRUFELCBidXMsIGRldmZuLCB3aGVyZSwgJmRhdGEpKQotCQkJcmV0dXJuIC0xOwotCi0JCWRhdGEgPSAoZGF0YSAmIH4oMHhmZiA8PCAoKHdoZXJlICYgMykgPDwgMykpKSB8Ci0JCSAgICAgICAodmFsIDw8ICgod2hlcmUgJiAzKSA8PCAzKSk7Ci0KLQkJaWYgKGd0OTYxMDBfY29uZmlnX2FjY2VzcyhQQ0lfQUNDRVNTX1dSSVRFLCBidXMsIGRldmZuLCB3aGVyZSwgJmRhdGEpKQotCQkJcmV0dXJuIC0xOwotCi0JCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci0KLQljYXNlIDI6Ci0JCWlmIChndDk2MTAwX2NvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19SRUFELCBidXMsIGRldmZuLCB3aGVyZSwgJmRhdGEpKQotCQkJcmV0dXJuIC0xOwotCi0JCWRhdGEgPSAoZGF0YSAmIH4oMHhmZmZmIDw8ICgod2hlcmUgJiAzKSA8PCAzKSkpIHwKLQkJICAgICAgICh2YWwgPDwgKCh3aGVyZSAmIDMpIDw8IDMpKTsKLQotCQlpZiAoZ3Q5NjEwMF9jb25maWdfYWNjZXNzKFBDSV9BQ0NFU1NfV1JJVEUsIGRldiwgd2hlcmUsICZkYXRhKSkKLQkJCXJldHVybiAtMTsKLQotCi0JCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci0KLQljYXNlIDQ6Ci0JCWlmIChndDk2MTAwX2NvbmZpZ19hY2Nlc3MoUENJX0FDQ0VTU19XUklURSwgZGV2LCB3aGVyZSwgJnZhbCkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQl9Ci19Ci0KLXN0cnVjdCBwY2lfb3BzIGd0OTYxMDBfcGNpX29wcyA9IHsKLQkucmVhZAk9IGd0OTYxMDBfcGNpYmlvc19yZWFkLAotCS53cml0ZQk9IGd0OTYxMDBfcGNpYmlvc193cml0ZQotfTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLWV2OTYxMDAuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLWV2OTYxMDAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk0NTdlYS4uMDAwMDAwMAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaS1ldjk2MTAwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDAgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCi0gKiBBdXRob3I6IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqICAgICAgICAgCXBwb3BvdkBtdmlzdGEuY29tIG9yIHNvdXJjZUBtdmlzdGEuY29tCi0gKgotICogQ2Fyc3RlbiBMYW5nZ2FhcmQsIGNhcnN0ZW5sQG1pcHMuY29tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBNSVBTIFRlY2hub2xvZ2llcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECi0gKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCi0gKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKLSAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KLSAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHBjaV9pb19yZXNvdXJjZSA9IHsKLQkubmFtZQk9ICJpbyBwY2kgSU8gc3BhY2UiLAotCS5zdGFydAk9IDB4MTAwMDAwMDAsCi0JLmVuZAk9IDB4MTFmZmZmZmYsCi0JLmZsYWdzCT0gSU9SRVNPVVJDRV9JTwotfTsKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBwY2lfbWVtX3Jlc291cmNlID0gewotCS5uYW1lCT0gImV4dCBwY2kgbWVtb3J5IHNwYWNlIiwKLQkuc3RhcnQJPSAweDEyMDAwMDAwLAotCS5lbmQJPSAweDEzZmZmZmZmLAotCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNCi19OwotCi1leHRlcm4gc3RydWN0IHBjaV9vcHMgZ3Q5NjEwMF9wY2lfb3BzOwotCi1zdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgZXY5NjEwMF9jb250cm9sbGVyID0gewotCS5wY2lfb3BzCT0gJmd0OTYxMDBfcGNpX29wcywKLQkuaW9fcmVzb3VyY2UJPSAmcGNpX2lvX3Jlc291cmNlLAotCS5tZW1fcmVzb3VyY2UJPSAmcGNpX21lbV9yZXNvdXJjZSwKLX07Ci0KLXN0YXRpYyB2b2lkIGV2OTYxMDBfcGNpX2luaXQodm9pZCkKLXsKLQlyZWdpc3Rlcl9wY2lfY29udHJvbGxlcigmZXY5NjEwMF9jb250cm9sbGVyKTsKLX0KLQotYXJjaF9pbml0Y2FsbChldjk2MTAwX3BjaV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLWlwMjcuYyBiL2FyY2gvbWlwcy9wY2kvcGNpLWlwMjcuYwppbmRleCA4MGViOWFmLi40MDVjZTAxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvcGNpL3BjaS1pcDI3LmMKKysrIGIvYXJjaC9taXBzL3BjaS9wY2ktaXAyNy5jCkBAIC0xNiw4ICsxNiw2IEBACiAjaW5jbHVkZSA8YXNtL3NuL2ludHIuaD4KICNpbmNsdWRlIDxhc20vc24vc24wL2h1Yi5oPgogCi1leHRlcm4gdW5zaWduZWQgaW50IGFsbG9jYXRlX2lycW5vKHZvaWQpOwotCiAvKgogICogTWF4ICNQQ0kgYnVzc2VzIHdlIGNhbiBoYW5kbGU7IGllLCBtYXggI1BDSSBicmlkZ2VzLgogICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvaXJxLmMgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvaXJxLmMKaW5kZXggZWQzMjVmMC4uYTAyMjJmYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL2lycS5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9pcnEuYwpAQCAtNDY5LDIxICs0NjksNiBAQAogCiAjZW5kaWYgCS8qIENPTkZJR19LR0RCICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IGRjbHoodW5zaWduZWQgbG9uZyBsb25nIHgpCi17Ci0JaW50IGx6OwotCi0JX19hc21fXyAoCi0JIgkuc2V0CXB1c2gJCQkJCQlcbiIKLQkiCS5zZXQJbWlwczY0CQkJCQkJXG4iCi0JIglkY2x6CSUwLCAlMQkJCQkJCVxuIgotCSIJLnNldAlwb3AJCQkJCQlcbiIKLQk6ICI9ciIgKGx6KQotCTogInIiICh4KSk7Ci0KLQlyZXR1cm4gbHo7Ci19Ci0KIGV4dGVybiB2b2lkIGJjbTE0ODBfdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGV4dGVybiB2b2lkIGJjbTE0ODBfbWFpbGJveF9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIHZvaWQgYmNtMTQ4MF9rZ2RiX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CkBAIC01MzYsOSArNTIxLDkgQEAKIAogCQlpZiAobWFza19oKSB7CiAJCQlpZiAobWFza19oIF4gMSkKLQkJCQlkb19JUlEoNjMgLSBkY2x6KG1hc2tfaCksIHJlZ3MpOworCQkJCWRvX0lSUShmbHM2NChtYXNrX2gpIC0gMSwgcmVncyk7CiAJCQllbHNlCi0JCQkJZG9fSVJRKDEyNyAtIGRjbHoobWFza19sKSwgcmVncyk7CisJCQkJZG9fSVJRKDYzICsgZmxzNjQobWFza19sKSwgcmVncyk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL3NiMTI1MC9pcnEuYyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2lycS5jCmluZGV4IDFkZTcxYWQuLmE0NTFiNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2lycS5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2lycS5jCkBAIC00MTksMjEgKzQxOSw2IEBACiAKICNlbmRpZiAJLyogQ09ORklHX0tHREIgKi8KIAotc3RhdGljIGlubGluZSBpbnQgZGNseih1bnNpZ25lZCBsb25nIGxvbmcgeCkKLXsKLQlpbnQgbHo7Ci0KLQlfX2FzbV9fICgKLQkiCS5zZXQJcHVzaAkJCQkJCVxuIgotCSIJLnNldAltaXBzNjQJCQkJCQlcbiIKLQkiCWRjbHoJJTAsICUxCQkJCQkJXG4iCi0JIgkuc2V0CXBvcAkJCQkJCVxuIgotCTogIj1yIiAobHopCi0JOiAiciIgKHgpKTsKLQotCXJldHVybiBsejsKLX0KLQogZXh0ZXJuIHZvaWQgc2IxMjUwX3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gdm9pZCBzYjEyNTBfbWFpbGJveF9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIHZvaWQgc2IxMjUwX2tnZGJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKQEAgLTQ5MCw2ICs0NzUsNiBAQAogCQltYXNrID0gX19yYXdfcmVhZHEoSU9BRERSKEFfSU1SX1JFR0lTVEVSKHNtcF9wcm9jZXNzb3JfaWQoKSwKIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUl9JTVJfSU5URVJSVVBUX1NUQVRVU19CQVNFKSkpOwogCQlpZiAobWFzaykKLQkJCWRvX0lSUSg2MyAtIGRjbHoobWFzayksIHJlZ3MpOworCQkJZG9fSVJRKGZsczY0KG1hc2spIC0gMSwgcmVncyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwppbmRleCBkZTFlZjJmLi5hMGRkMWIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwpAQCAtNzMxLDExICs3MzEsMTAgQEAKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBTTVAgJiYgUFBDX1BTRVJJRVMKIAotc291cmNlICJtbS9LY29uZmlnIgotCi1jb25maWcgSEFWRV9BUkNIX0VBUkxZX1BGTl9UT19OSUQKK2NvbmZpZyBBUkNIX1BPUFVMQVRFU19OT0RFX01BUAogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIE5FRURfTVVMVElQTEVfTk9ERVMKKworc291cmNlICJtbS9LY29uZmlnIgogCiBjb25maWcgQVJDSF9NRU1PUllfUFJPQkUKIAlkZWZfYm9vbCB5CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c19wcGMzMi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNfcHBjMzIuYwppbmRleCAyZTI5Mjg2Li41ZTM5MWZjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c19wcGMzMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzX3BwYzMyLmMKQEAgLTc0MCw3ICs3NDAsNyBAQAogCXJldHVybiBzeXNfdW1hc2soKGludCltYXNrKTsKIH0KIAotI2lmZGVmIENPTkZJR19TWVNDVEwKKyNpZmRlZiBDT05GSUdfU1lTQ1RMX1NZU0NBTEwKIHN0cnVjdCBfX3N5c2N0bF9hcmdzMzIgewogCXUzMiBuYW1lOwogCWludCBubGVuOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21lbS5jIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCmluZGV4IGVlYmQ4YjguLjE2ZmUwMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKQEAgLTI1NiwyMCArMjU2LDIyIEBACiAKIAlib290X21hcHNpemUgPSBpbml0X2Jvb3RtZW0oc3RhcnQgPj4gUEFHRV9TSElGVCwgdG90YWxfcGFnZXMpOwogCisJLyogQWRkIGFjdGl2ZSByZWdpb25zIHdpdGggdmFsaWQgUEZOcyAqLworCWZvciAoaSA9IDA7IGkgPCBsbWIubWVtb3J5LmNudDsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuOworCQlzdGFydF9wZm4gPSBsbWIubWVtb3J5LnJlZ2lvbltpXS5iYXNlID4+IFBBR0VfU0hJRlQ7CisJCWVuZF9wZm4gPSBzdGFydF9wZm4gKyBsbWJfc2l6ZV9wYWdlcygmbG1iLm1lbW9yeSwgaSk7CisJCWFkZF9hY3RpdmVfcmFuZ2UoMCwgc3RhcnRfcGZuLCBlbmRfcGZuKTsKKwl9CisKIAkvKiBBZGQgYWxsIHBoeXNpY2FsIG1lbW9yeSB0byB0aGUgYm9vdG1lbSBtYXAsIG1hcmsgZWFjaCBhcmVhCiAJICogcHJlc2VudC4KIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbG1iLm1lbW9yeS5jbnQ7IGkrKykgewotCQl1bnNpZ25lZCBsb25nIGJhc2UgPSBsbWIubWVtb3J5LnJlZ2lvbltpXS5iYXNlOwotCQl1bnNpZ25lZCBsb25nIHNpemUgPSBsbWJfc2l6ZV9ieXRlcygmbG1iLm1lbW9yeSwgaSk7CiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KLQkJaWYgKGJhc2UgPj0gdG90YWxfbG93bWVtKQotCQkJY29udGludWU7Ci0JCWlmIChiYXNlICsgc2l6ZSA+IHRvdGFsX2xvd21lbSkKLQkJCXNpemUgPSB0b3RhbF9sb3dtZW0gLSBiYXNlOworCWZyZWVfYm9vdG1lbV93aXRoX2FjdGl2ZV9yZWdpb25zKDAsIHRvdGFsX2xvd21lbSA+PiBQQUdFX1NISUZUKTsKKyNlbHNlCisJZnJlZV9ib290bWVtX3dpdGhfYWN0aXZlX3JlZ2lvbnMoMCwgbWF4X3Bmbik7CiAjZW5kaWYKLQkJZnJlZV9ib290bWVtKGJhc2UsIHNpemUpOwotCX0KIAogCS8qIHJlc2VydmUgdGhlIHNlY3Rpb25zIHdlJ3JlIGFscmVhZHkgdXNpbmcgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbG1iLnJlc2VydmVkLmNudDsgaSsrKQpAQCAtMjc3LDkgKzI3OSw4IEBACiAJCQkJbG1iX3NpemVfYnl0ZXMoJmxtYi5yZXNlcnZlZCwgaSkpOwogCiAJLyogWFhYIG5lZWQgdG8gY2xpcCB0aGlzIGlmIHVzaW5nIGhpZ2htZW0/ICovCi0JZm9yIChpID0gMDsgaSA8IGxtYi5tZW1vcnkuY250OyBpKyspCi0JCW1lbW9yeV9wcmVzZW50KDAsIGxtYl9zdGFydF9wZm4oJmxtYi5tZW1vcnksIGkpLAotCQkJICAgICAgIGxtYl9lbmRfcGZuKCZsbWIubWVtb3J5LCBpKSk7CisJc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMoMCk7CisKIAlpbml0X2Jvb3RtZW1fZG9uZSA9IDE7CiB9CiAKQEAgLTI4OCwxMCArMjg5LDkgQEAKICAqLwogdm9pZCBfX2luaXQgcGFnaW5nX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHpvbmVzX3NpemVbTUFYX05SX1pPTkVTXTsKLQl1bnNpZ25lZCBsb25nIHpob2xlc19zaXplW01BWF9OUl9aT05FU107CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9yYW0gPSBsbWJfcGh5c19tZW1fc2l6ZSgpOwogCXVuc2lnbmVkIGxvbmcgdG9wX29mX3JhbSA9IGxtYl9lbmRfb2ZfRFJBTSgpOworCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdOwogCiAjaWZkZWYgQ09ORklHX0hJR0hNRU0KIAltYXBfcGFnZShQS01BUF9CQVNFLCAwLCAwKTsJLyogWFhYIGdyb3NzICovCkBAIC0zMDcsMjYgKzMwNywxMyBAQAogCSAgICAgICB0b3Bfb2ZfcmFtLCB0b3RhbF9yYW0pOwogCXByaW50ayhLRVJOX0RFQlVHICJNZW1vcnkgaG9sZSBzaXplOiAlbGRNQlxuIiwKIAkgICAgICAgKHRvcF9vZl9yYW0gLSB0b3RhbF9yYW0pID4+IDIwKTsKLQkvKgotCSAqIEFsbCBwYWdlcyBhcmUgRE1BLWFibGUgc28gd2UgcHV0IHRoZW0gYWxsIGluIHRoZSBETUEgem9uZS4KLQkgKi8KLQltZW1zZXQoem9uZXNfc2l6ZSwgMCwgc2l6ZW9mKHpvbmVzX3NpemUpKTsKLQltZW1zZXQoemhvbGVzX3NpemUsIDAsIHNpemVvZih6aG9sZXNfc2l6ZSkpOwotCi0Jem9uZXNfc2l6ZVtaT05FX0RNQV0gPSB0b3Bfb2ZfcmFtID4+IFBBR0VfU0hJRlQ7Ci0JemhvbGVzX3NpemVbWk9ORV9ETUFdID0gKHRvcF9vZl9yYW0gLSB0b3RhbF9yYW0pID4+IFBBR0VfU0hJRlQ7Ci0KICNpZmRlZiBDT05GSUdfSElHSE1FTQotCXpvbmVzX3NpemVbWk9ORV9ETUFdID0gdG90YWxfbG93bWVtID4+IFBBR0VfU0hJRlQ7Ci0Jem9uZXNfc2l6ZVtaT05FX0hJR0hNRU1dID0gKHRvdGFsX21lbW9yeSAtIHRvdGFsX2xvd21lbSkgPj4gUEFHRV9TSElGVDsKLQl6aG9sZXNfc2l6ZVtaT05FX0hJR0hNRU1dID0gKHRvcF9vZl9yYW0gLSB0b3RhbF9yYW0pID4+IFBBR0VfU0hJRlQ7CisJbWF4X3pvbmVfcGZuc1swXSA9IHRvdGFsX2xvd21lbSA+PiBQQUdFX1NISUZUOworCW1heF96b25lX3BmbnNbMV0gPSB0b3Bfb2ZfcmFtID4+IFBBR0VfU0hJRlQ7CiAjZWxzZQotCXpvbmVzX3NpemVbWk9ORV9ETUFdID0gdG9wX29mX3JhbSA+PiBQQUdFX1NISUZUOwotCXpob2xlc19zaXplW1pPTkVfRE1BXSA9ICh0b3Bfb2ZfcmFtIC0gdG90YWxfcmFtKSA+PiBQQUdFX1NISUZUOwotI2VuZGlmIC8qIENPTkZJR19ISUdITUVNICovCi0KLQlmcmVlX2FyZWFfaW5pdF9ub2RlKDAsIE5PREVfREFUQSgwKSwgem9uZXNfc2l6ZSwKLQkJCSAgICBfX3BhKFBBR0VfT0ZGU0VUKSA+PiBQQUdFX1NISUZULCB6aG9sZXNfc2l6ZSk7CisJbWF4X3pvbmVfcGZuc1swXSA9IHRvcF9vZl9yYW0gPj4gUEFHRV9TSElGVDsKKyNlbmRpZgorCWZyZWVfYXJlYV9pbml0X25vZGVzKG1heF96b25lX3BmbnMpOwogfQogI2VuZGlmIC8qICEgQ09ORklHX05FRURfTVVMVElQTEVfTk9ERVMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL251bWEuYyBiL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKaW5kZXggNmMwZjFjNy4uNDNjMjcyMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL251bWEuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCkBAIC0zOSw5NiArMzksNiBAQAogc3RhdGljIGludCBtaW5fY29tbW9uX2RlcHRoOwogc3RhdGljIGludCBuX21lbV9hZGRyX2NlbGxzLCBuX21lbV9zaXplX2NlbGxzOwogCi0vKgotICogV2UgbmVlZCBzb21ld2hlcmUgdG8gc3RvcmUgc3RhcnQvZW5kL25vZGUgZm9yIGVhY2ggcmVnaW9uIHVudGlsIHdlIGhhdmUKLSAqIGFsbG9jYXRlZCB0aGUgcmVhbCBub2RlX2RhdGEgc3RydWN0dXJlcy4KLSAqLwotI2RlZmluZSBNQVhfUkVHSU9OUwkoTUFYX0xNQl9SRUdJT05TKjIpCi1zdGF0aWMgc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbjsKLQl1bnNpZ25lZCBsb25nIGVuZF9wZm47Ci0JaW50IG5pZDsKLX0gaW5pdF9ub2RlX2RhdGFbTUFYX1JFR0lPTlNdIF9faW5pdGRhdGE7Ci0KLWludCBfX2luaXQgZWFybHlfcGZuX3RvX25pZCh1bnNpZ25lZCBsb25nIHBmbikKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGluaXRfbm9kZV9kYXRhW2ldLmVuZF9wZm47IGkrKykgewotCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IGluaXRfbm9kZV9kYXRhW2ldLnN0YXJ0X3BmbjsKLQkJdW5zaWduZWQgbG9uZyBlbmRfcGZuID0gaW5pdF9ub2RlX2RhdGFbaV0uZW5kX3BmbjsKLQotCQlpZiAoKHN0YXJ0X3BmbiA8PSBwZm4pICYmIChwZm4gPCBlbmRfcGZuKSkKLQkJCXJldHVybiBpbml0X25vZGVfZGF0YVtpXS5uaWQ7Ci0JfQotCi0JcmV0dXJuIC0xOwotfQotCi12b2lkIF9faW5pdCBhZGRfcmVnaW9uKHVuc2lnbmVkIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBwYWdlcykKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWRiZygiYWRkX3JlZ2lvbiBuaWQgJWQgc3RhcnRfcGZuIDB4JWx4IHBhZ2VzIDB4JWx4XG4iLAotCQluaWQsIHN0YXJ0X3BmbiwgcGFnZXMpOwotCi0JZm9yIChpID0gMDsgaW5pdF9ub2RlX2RhdGFbaV0uZW5kX3BmbjsgaSsrKSB7Ci0JCWlmIChpbml0X25vZGVfZGF0YVtpXS5uaWQgIT0gbmlkKQotCQkJY29udGludWU7Ci0JCWlmIChpbml0X25vZGVfZGF0YVtpXS5lbmRfcGZuID09IHN0YXJ0X3BmbikgewotCQkJaW5pdF9ub2RlX2RhdGFbaV0uZW5kX3BmbiArPSBwYWdlczsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoaW5pdF9ub2RlX2RhdGFbaV0uc3RhcnRfcGZuID09IChzdGFydF9wZm4gKyBwYWdlcykpIHsKLQkJCWluaXRfbm9kZV9kYXRhW2ldLnN0YXJ0X3BmbiAtPSBwYWdlczsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qCi0JICogTGVhdmUgbGFzdCBlbnRyeSBOVUxMIHNvIHdlIGRvbnQgaXRlcmF0ZSBvZmYgdGhlIGVuZCAod2UgdXNlCi0JICogZW50cnkuZW5kX3BmbiB0byB0ZXJtaW5hdGUgdGhlIHdhbGspLgotCSAqLwotCWlmIChpID49IChNQVhfUkVHSU9OUyAtIDEpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiV0FSTklORzogdG9vIG1hbnkgbWVtb3J5IHJlZ2lvbnMgaW4gIgotCQkJCSJudW1hIGNvZGUsIHRydW5jYXRpbmdcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaW5pdF9ub2RlX2RhdGFbaV0uc3RhcnRfcGZuID0gc3RhcnRfcGZuOwotCWluaXRfbm9kZV9kYXRhW2ldLmVuZF9wZm4gPSBzdGFydF9wZm4gKyBwYWdlczsKLQlpbml0X25vZGVfZGF0YVtpXS5uaWQgPSBuaWQ7Ci19Ci0KLS8qIFdlIGFzc3VtZSBpbml0X25vZGVfZGF0YSBoYXMgbm8gb3ZlcmxhcHBpbmcgcmVnaW9ucyAqLwotdm9pZCBfX2luaXQgZ2V0X3JlZ2lvbih1bnNpZ25lZCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nICpzdGFydF9wZm4sCi0JCSAgICAgICB1bnNpZ25lZCBsb25nICplbmRfcGZuLCB1bnNpZ25lZCBsb25nICpwYWdlc19wcmVzZW50KQotewotCXVuc2lnbmVkIGludCBpOwotCi0JKnN0YXJ0X3BmbiA9IC0xVUw7Ci0JKmVuZF9wZm4gPSAqcGFnZXNfcHJlc2VudCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpbml0X25vZGVfZGF0YVtpXS5lbmRfcGZuOyBpKyspIHsKLQkJaWYgKGluaXRfbm9kZV9kYXRhW2ldLm5pZCAhPSBuaWQpCi0JCQljb250aW51ZTsKLQotCQkqcGFnZXNfcHJlc2VudCArPSBpbml0X25vZGVfZGF0YVtpXS5lbmRfcGZuIC0KLQkJCWluaXRfbm9kZV9kYXRhW2ldLnN0YXJ0X3BmbjsKLQotCQlpZiAoaW5pdF9ub2RlX2RhdGFbaV0uc3RhcnRfcGZuIDwgKnN0YXJ0X3BmbikKLQkJCSpzdGFydF9wZm4gPSBpbml0X25vZGVfZGF0YVtpXS5zdGFydF9wZm47Ci0KLQkJaWYgKGluaXRfbm9kZV9kYXRhW2ldLmVuZF9wZm4gPiAqZW5kX3BmbikKLQkJCSplbmRfcGZuID0gaW5pdF9ub2RlX2RhdGFbaV0uZW5kX3BmbjsKLQl9Ci0KLQkvKiBXZSBkaWRudCBmaW5kIGEgbWF0Y2hpbmcgcmVnaW9uLCByZXR1cm4gc3RhcnQvZW5kIGFzIDAgKi8KLQlpZiAoKnN0YXJ0X3BmbiA9PSAtMVVMKQotCQkqc3RhcnRfcGZuID0gMDsKLX0KLQogc3RhdGljIHZvaWQgX19jcHVpbml0IG1hcF9jcHVfdG9fbm9kZShpbnQgY3B1LCBpbnQgbm9kZSkKIHsKIAludW1hX2NwdV9sb29rdXBfdGFibGVbY3B1XSA9IG5vZGU7CkBAIC00NjgsOCArMzc4LDggQEAKIAkJCQljb250aW51ZTsKIAkJfQogCi0JCWFkZF9yZWdpb24obmlkLCBzdGFydCA+PiBQQUdFX1NISUZULAotCQkJICAgc2l6ZSA+PiBQQUdFX1NISUZUKTsKKwkJYWRkX2FjdGl2ZV9yYW5nZShuaWQsIHN0YXJ0ID4+IFBBR0VfU0hJRlQsCisJCQkJKHN0YXJ0ID4+IFBBR0VfU0hJRlQpICsgKHNpemUgPj4gUEFHRV9TSElGVCkpOwogCiAJCWlmICgtLXJhbmdlcykKIAkJCWdvdG8gbmV3X3JhbmdlOwpAQCAtNDgyLDYgKzM5Miw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyB0b3Bfb2ZfcmFtID0gbG1iX2VuZF9vZl9EUkFNKCk7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9yYW0gPSBsbWJfcGh5c19tZW1fc2l6ZSgpOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuOwogCXVuc2lnbmVkIGludCBpOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgIlRvcCBvZiBSQU06IDB4JWx4LCBUb3RhbCBSQU06IDB4JWx4XG4iLApAQCAtNDg5LDkgKzQwMCwxMSBAQAogCXByaW50ayhLRVJOX0RFQlVHICJNZW1vcnkgaG9sZSBzaXplOiAlbGRNQlxuIiwKIAkgICAgICAgKHRvcF9vZl9yYW0gLSB0b3RhbF9yYW0pID4+IDIwKTsKIAotCWZvciAoaSA9IDA7IGkgPCBsbWIubWVtb3J5LmNudDsgKytpKQotCQlhZGRfcmVnaW9uKDAsIGxtYi5tZW1vcnkucmVnaW9uW2ldLmJhc2UgPj4gUEFHRV9TSElGVCwKLQkJCSAgIGxtYl9zaXplX3BhZ2VzKCZsbWIubWVtb3J5LCBpKSk7CisJZm9yIChpID0gMDsgaSA8IGxtYi5tZW1vcnkuY250OyArK2kpIHsKKwkJc3RhcnRfcGZuID0gbG1iLm1lbW9yeS5yZWdpb25baV0uYmFzZSA+PiBQQUdFX1NISUZUOworCQllbmRfcGZuID0gc3RhcnRfcGZuICsgbG1iX3NpemVfcGFnZXMoJmxtYi5tZW1vcnksIGkpOworCQlhZGRfYWN0aXZlX3JhbmdlKDAsIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CisJfQogCW5vZGVfc2V0X29ubGluZSgwKTsKIH0KIApAQCAtNjMwLDExICs1NDMsMTEgQEAKIAkJCSAgKHZvaWQgKikodW5zaWduZWQgbG9uZylib290X2NwdWlkKTsKIAogCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgewotCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbiwgcGFnZXNfcHJlc2VudDsKKwkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGVuZF9wZm47CiAJCXVuc2lnbmVkIGxvbmcgYm9vdG1lbV9wYWRkcjsKIAkJdW5zaWduZWQgbG9uZyBib290bWFwX3BhZ2VzOwogCi0JCWdldF9yZWdpb24obmlkLCAmc3RhcnRfcGZuLCAmZW5kX3BmbiwgJnBhZ2VzX3ByZXNlbnQpOworCQlnZXRfcGZuX3JhbmdlX2Zvcl9uaWQobmlkLCAmc3RhcnRfcGZuLCAmZW5kX3Bmbik7CiAKIAkJLyogQWxsb2NhdGUgdGhlIG5vZGUgc3RydWN0dXJlIG5vZGUgbG9jYWwgaWYgcG9zc2libGUgKi8KIAkJTk9ERV9EQVRBKG5pZCkgPSBjYXJlZnVsX2FsbG9jYXRpb24obmlkLApAQCAtNjY3LDE5ICs1ODAsNyBAQAogCQlpbml0X2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobmlkKSwgYm9vdG1lbV9wYWRkciA+PiBQQUdFX1NISUZULAogCQkJCSAgc3RhcnRfcGZuLCBlbmRfcGZuKTsKIAotCQkvKiBBZGQgZnJlZSByZWdpb25zIG9uIHRoaXMgbm9kZSAqLwotCQlmb3IgKGkgPSAwOyBpbml0X25vZGVfZGF0YVtpXS5lbmRfcGZuOyBpKyspIHsKLQkJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKLQotCQkJaWYgKGluaXRfbm9kZV9kYXRhW2ldLm5pZCAhPSBuaWQpCi0JCQkJY29udGludWU7Ci0KLQkJCXN0YXJ0ID0gaW5pdF9ub2RlX2RhdGFbaV0uc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQ7Ci0JCQllbmQgPSBpbml0X25vZGVfZGF0YVtpXS5lbmRfcGZuIDw8IFBBR0VfU0hJRlQ7Ci0KLQkJCWRiZygiZnJlZV9ib290bWVtICVseCAlbHhcbiIsIHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0gIAkJCWZyZWVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShuaWQpLCBzdGFydCwgZW5kIC0gc3RhcnQpOwotCQl9CisJCWZyZWVfYm9vdG1lbV93aXRoX2FjdGl2ZV9yZWdpb25zKG5pZCwgZW5kX3Bmbik7CiAKIAkJLyogTWFyayByZXNlcnZlZCByZWdpb25zIG9uIHRoaXMgbm9kZSAqLwogCQlmb3IgKGkgPSAwOyBpIDwgbG1iLnJlc2VydmVkLmNudDsgaSsrKSB7CkBAIC03MTAsNDQgKzYxMSwxNiBAQAogCQkJfQogCQl9CiAKLQkJLyogQWRkIHJlZ2lvbnMgaW50byBzcGFyc2VtZW0gKi8KLQkJZm9yIChpID0gMDsgaW5pdF9ub2RlX2RhdGFbaV0uZW5kX3BmbjsgaSsrKSB7Ci0JCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7Ci0KLQkJCWlmIChpbml0X25vZGVfZGF0YVtpXS5uaWQgIT0gbmlkKQotCQkJCWNvbnRpbnVlOwotCi0JCQlzdGFydCA9IGluaXRfbm9kZV9kYXRhW2ldLnN0YXJ0X3BmbjsKLQkJCWVuZCA9IGluaXRfbm9kZV9kYXRhW2ldLmVuZF9wZm47Ci0KLQkJCW1lbW9yeV9wcmVzZW50KG5pZCwgc3RhcnQsIGVuZCk7Ci0JCX0KKwkJc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMobmlkKTsKIAl9CiB9CiAKIHZvaWQgX19pbml0IHBhZ2luZ19pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyB6b25lc19zaXplW01BWF9OUl9aT05FU107Ci0JdW5zaWduZWQgbG9uZyB6aG9sZXNfc2l6ZVtNQVhfTlJfWk9ORVNdOwotCWludCBuaWQ7Ci0KLQltZW1zZXQoem9uZXNfc2l6ZSwgMCwgc2l6ZW9mKHpvbmVzX3NpemUpKTsKLQltZW1zZXQoemhvbGVzX3NpemUsIDAsIHNpemVvZih6aG9sZXNfc2l6ZSkpOwotCi0JZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7Ci0JCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuLCBwYWdlc19wcmVzZW50OwotCi0JCWdldF9yZWdpb24obmlkLCAmc3RhcnRfcGZuLCAmZW5kX3BmbiwgJnBhZ2VzX3ByZXNlbnQpOwotCi0JCXpvbmVzX3NpemVbWk9ORV9ETUFdID0gZW5kX3BmbiAtIHN0YXJ0X3BmbjsKLQkJemhvbGVzX3NpemVbWk9ORV9ETUFdID0gem9uZXNfc2l6ZVtaT05FX0RNQV0gLSBwYWdlc19wcmVzZW50OwotCi0JCWRiZygiZnJlZV9hcmVhX2luaXQgbm9kZSAlZCAlbHggJWx4IChob2xlOiAlbHgpXG4iLCBuaWQsCi0JCSAgICB6b25lc19zaXplW1pPTkVfRE1BXSwgc3RhcnRfcGZuLCB6aG9sZXNfc2l6ZVtaT05FX0RNQV0pOwotCi0JCWZyZWVfYXJlYV9pbml0X25vZGUobmlkLCBOT0RFX0RBVEEobmlkKSwgem9uZXNfc2l6ZSwgc3RhcnRfcGZuLAotCQkJCSAgICB6aG9sZXNfc2l6ZSk7Ci0JfQorCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdID0geworCQkJCWxtYl9lbmRfb2ZfRFJBTSgpID4+IFBBR0VfU0hJRlQKKwl9OworCWZyZWVfYXJlYV9pbml0X25vZGVzKG1heF96b25lX3BmbnMpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBlYXJseV9udW1hKGNoYXIgKnApCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jCmluZGV4IDdiNDU3MjguLjM5NTBkZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jCkBAIC04Miw3ICs4Miw2IEBACiAJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CiAJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7Ci0JaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIG91dDoKQEAgLTEyMCw3ICsxMTksNyBAQAogCXJldCA9IDA7CiAJaW5vZGUtPmlfb3AgPSAmc3B1ZnNfZmlsZV9pb3BzOwogCWlub2RlLT5pX2ZvcCA9IGZvcHM7Ci0JaW5vZGUtPnUuZ2VuZXJpY19pcCA9IFNQVUZTX0koaW5vZGUpLT5pX2N0eCA9IGdldF9zcHVfY29udGV4dChjdHgpOworCWlub2RlLT5pX3ByaXZhdGUgPSBTUFVGU19JKGlub2RlKS0+aV9jdHggPSBnZXRfc3B1X2NvbnRleHQoY3R4KTsKIAlkX2FkZChkZW50cnksIGlub2RlKTsKIG91dDoKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2h2Q2FsbF9pbnN0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZDYWxsX2luc3QuYwppbmRleCA2NDFlNjUxLi40NDZlMTdkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZDYWxsX2luc3QuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZDYWxsX2luc3QuYwpAQCAtODUsNyArODUsNyBAQAogCiAJcmMgPSBzZXFfb3BlbihmaWxlLCAmaGNhbGxfaW5zdF9zZXFfb3BzKTsKIAlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc2VxLT5wcml2YXRlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPnUuZ2VuZXJpY19pcDsKKwlzZXEtPnByaXZhdGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOwogCiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYwppbmRleCBiNjA0OTI2Li43MjM5NzJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYwpAQCAtMzM5LDcgKzMzOSw3IEBACiAJZm9yIChwb3MgPSByZWFkYihkZXZiYXNlICsgUENJX0NBUEFCSUxJVFlfTElTVCk7IHBvcyAhPSAwOwogCSAgICAgcG9zID0gcmVhZGIoZGV2YmFzZSArIHBvcyArIFBDSV9DQVBfTElTVF9ORVhUKSkgewogCQl1OCBpZCA9IHJlYWRiKGRldmJhc2UgKyBwb3MgKyBQQ0lfQ0FQX0xJU1RfSUQpOwotCQlpZiAoaWQgPT0gUENJX0NBUF9JRF9IVF9JUlFDT05GKSB7CisJCWlmIChpZCA9PSBQQ0lfQ0FQX0lEX0hUKSB7CiAJCQlpZCA9IHJlYWRiKGRldmJhc2UgKyBwb3MgKyAzKTsKIAkJCWlmIChpZCA9PSAweDgwKQogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvS2NvbmZpZyBiL2FyY2gvcHBjL0tjb25maWcKaW5kZXggOGZhMTBjZi4uZmRkOWU3YiAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvS2NvbmZpZworKysgYi9hcmNoL3BwYy9LY29uZmlnCkBAIC05NTMsNiArOTUzLDkgQEAKIGNvbmZpZyBISUdITUVNCiAJYm9vbCAiSGlnaCBtZW1vcnkgc3VwcG9ydCIKIAorY29uZmlnIEFSQ0hfUE9QVUxBVEVTX05PREVfTUFQCisJZGVmX2Jvb2wgeQorCiBzb3VyY2Uga2VybmVsL0tjb25maWcuaHoKIHNvdXJjZSBrZXJuZWwvS2NvbmZpZy5wcmVlbXB0CiBzb3VyY2UgIm1tL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3BwYy9tbS9pbml0LmMgYi9hcmNoL3BwYy9tbS9pbml0LmMKaW5kZXggNTIzMzkyZC4uNDEwMjAwMCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvbW0vaW5pdC5jCisrKyBiL2FyY2gvcHBjL21tL2luaXQuYwpAQCAtMzU4LDggKzM1OCw4IEBACiAgKi8KIHZvaWQgX19pbml0IHBhZ2luZ19pbml0KHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyB6b25lc19zaXplW01BWF9OUl9aT05FU10sIGk7Ci0KKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKKwl1bnNpZ25lZCBsb25nIG1heF96b25lX3BmbnNbTUFYX05SX1pPTkVTXTsKICNpZmRlZiBDT05GSUdfSElHSE1FTQogCW1hcF9wYWdlKFBLTUFQX0JBU0UsIDAsIDApOwkvKiBYWFggZ3Jvc3MgKi8KIAlwa21hcF9wYWdlX3RhYmxlID0gcHRlX29mZnNldF9rZXJuZWwocG1kX29mZnNldChwZ2Rfb2Zmc2V0X2sKQEAgLTM2OSwxOSArMzY5LDE4IEBACiAJCQkoS01BUF9GSVhfQkVHSU4pLCBLTUFQX0ZJWF9CRUdJTiksIEtNQVBfRklYX0JFR0lOKTsKIAlrbWFwX3Byb3QgPSBQQUdFX0tFUk5FTDsKICNlbmRpZiAvKiBDT05GSUdfSElHSE1FTSAqLwotCi0JLyoKLQkgKiBBbGwgcGFnZXMgYXJlIERNQS1hYmxlIHNvIHdlIHB1dCB0aGVtIGFsbCBpbiB0aGUgRE1BIHpvbmUuCi0JICovCi0Jem9uZXNfc2l6ZVtaT05FX0RNQV0gPSB0b3RhbF9sb3dtZW0gPj4gUEFHRV9TSElGVDsKLQlmb3IgKGkgPSAxOyBpIDwgTUFYX05SX1pPTkVTOyBpKyspCi0JCXpvbmVzX3NpemVbaV0gPSAwOworCS8qIEFsbCBwYWdlcyBhcmUgRE1BLWFibGUgc28gd2UgcHV0IHRoZW0gYWxsIGluIHRoZSBETUEgem9uZS4gKi8KKwlzdGFydF9wZm4gPSBfX3BhKFBBR0VfT0ZGU0VUKSA+PiBQQUdFX1NISUZUOworCWVuZF9wZm4gPSBzdGFydF9wZm4gKyAodG90YWxfbWVtb3J5ID4+IFBBR0VfU0hJRlQpOworCWFkZF9hY3RpdmVfcmFuZ2UoMCwgc3RhcnRfcGZuLCBlbmRfcGZuKTsKIAogI2lmZGVmIENPTkZJR19ISUdITUVNCi0Jem9uZXNfc2l6ZVtaT05FX0hJR0hNRU1dID0gKHRvdGFsX21lbW9yeSAtIHRvdGFsX2xvd21lbSkgPj4gUEFHRV9TSElGVDsKKwltYXhfem9uZV9wZm5zWzBdID0gdG90YWxfbG93bWVtID4+IFBBR0VfU0hJRlQ7CisJbWF4X3pvbmVfcGZuc1sxXSA9IHRvdGFsX21lbW9yeSA+PiBQQUdFX1NISUZUOworI2Vsc2UKKwltYXhfem9uZV9wZm5zWzBdID0gdG90YWxfbWVtb3J5ID4+IFBBR0VfU0hJRlQ7CiAjZW5kaWYgLyogQ09ORklHX0hJR0hNRU0gKi8KLQotCWZyZWVfYXJlYV9pbml0KHpvbmVzX3NpemUpOworCWZyZWVfYXJlYV9pbml0X25vZGVzKG1heF96b25lX3BmbnMpOwogfQogCiB2b2lkIF9faW5pdCBtZW1faW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2h5cGZzL2lub2RlLmMgYi9hcmNoL3MzOTAvaHlwZnMvaW5vZGUuYwppbmRleCBiZGFkZTVmLi44MTNmYzIxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaHlwZnMvaW5vZGUuYworKysgYi9hcmNoL3MzOTAvaHlwZnMvaW5vZGUuYwpAQCAtOTEsNyArOTEsNiBAQAogCQlyZXQtPmlfbW9kZSA9IG1vZGU7CiAJCXJldC0+aV91aWQgPSBoeXBmc19pbmZvLT51aWQ7CiAJCXJldC0+aV9naWQgPSBoeXBmc19pbmZvLT5naWQ7Ci0JCXJldC0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCQlyZXQtPmlfYmxvY2tzID0gMDsKIAkJcmV0LT5pX2F0aW1lID0gcmV0LT5pX210aW1lID0gcmV0LT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQlpZiAobW9kZSAmIFNfSUZESVIpCkBAIC0xMDQsMTMgKzEwMywxMyBAQAogCiBzdGF0aWMgdm9pZCBoeXBmc19kcm9wX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0Ja2ZyZWUoaW5vZGUtPnUuZ2VuZXJpY19pcCk7CisJa2ZyZWUoaW5vZGUtPmlfcHJpdmF0ZSk7CiAJZ2VuZXJpY19kZWxldGVfaW5vZGUoaW5vZGUpOwogfQogCiBzdGF0aWMgaW50IGh5cGZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0JY2hhciAqZGF0YSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT51LmdlbmVyaWNfaXA7CisJY2hhciAqZGF0YSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CiAJc3RydWN0IGh5cGZzX3NiX2luZm8gKmZzX2luZm87CiAKIAlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKQEAgLTM1Miw3ICszNTEsNyBAQAogCQlwYXJlbnQtPmRfaW5vZGUtPmlfbmxpbmsrKzsKIAl9IGVsc2UKIAkJQlVHKCk7Ci0JaW5vZGUtPnUuZ2VuZXJpY19pcCA9IGRhdGE7CisJaW5vZGUtPmlfcHJpdmF0ZSA9IGRhdGE7CiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKIAlkZ2V0KGRlbnRyeSk7CiAJcmV0dXJuIGRlbnRyeTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMgYi9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9saW51eC5jCmluZGV4IDc4NWM5ZjcuLjkxYjI4ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X2xpbnV4LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jb21wYXRfbGludXguYwpAQCAtNzA4LDcgKzcwOCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2lmZGVmIENPTkZJR19TWVNDVEwKKyNpZmRlZiBDT05GSUdfU1lTQ1RMX1NZU0NBTEwKIHN0cnVjdCBfX3N5c2N0bF9hcmdzMzIgewogCXUzMiBuYW1lOwogCWludCBubGVuOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9kZWJ1Zy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9kZWJ1Zy5jCmluZGV4IDdiYTIwOTIuLjQzZjNkMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZGVidWcuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2RlYnVnLmMKQEAgLTYwMyw3ICs2MDMsNyBAQAogCWRlYnVnX2luZm9fdCAqZGVidWdfaW5mbywgKmRlYnVnX2luZm9fc25hcHNob3Q7CiAKIAlkb3duKCZkZWJ1Z19sb2NrKTsKLQlkZWJ1Z19pbmZvID0gKHN0cnVjdCBkZWJ1Z19pbmZvKilmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwOworCWRlYnVnX2luZm8gPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOwogCS8qIGZpbmQgZGVidWcgdmlldyAqLwogCWZvciAoaSA9IDA7IGkgPCBERUJVR19NQVhfVklFV1M7IGkrKykgewogCQlpZiAoIWRlYnVnX2luZm8tPnZpZXdzW2ldKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zdGFja3RyYWNlLmMgYi9hcmNoL3MzOTAva2VybmVsL3N0YWNrdHJhY2UuYwppbmRleCBkZTgzZjM4Li5kOTQyOGEwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3N0YWNrdHJhY2UuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3N0YWNrdHJhY2UuYwpAQCAtNTksOSArNTksNyBAQAogCX0KIH0KIAotdm9pZCBzYXZlX3N0YWNrX3RyYWNlKHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UsCi0JCSAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IGFsbF9jb250ZXh0cywKLQkJICAgICAgdW5zaWduZWQgaW50IHNraXApCit2b2lkIHNhdmVfc3RhY2tfdHJhY2Uoc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgc3AgYXNtICgiMTUiKTsKIAl1bnNpZ25lZCBsb25nIG9yaWdfc3A7CkBAIC02OSwyMiArNjcsMjMgQEAKIAlzcCAmPSBQU1dfQUREUl9JTlNOOwogCW9yaWdfc3AgPSBzcDsKIAotCXNwID0gc2F2ZV9jb250ZXh0X3N0YWNrKHRyYWNlLCAmc2tpcCwgc3AsCisJc3AgPSBzYXZlX2NvbnRleHRfc3RhY2sodHJhY2UsICZ0cmFjZS0+c2tpcCwgc3AsCiAJCQkJUzM5MF9sb3djb3JlLnBhbmljX3N0YWNrIC0gUEFHRV9TSVpFLAogCQkJCVMzOTBfbG93Y29yZS5wYW5pY19zdGFjayk7Ci0JaWYgKChzcCAhPSBvcmlnX3NwKSAmJiAhYWxsX2NvbnRleHRzKQorCWlmICgoc3AgIT0gb3JpZ19zcCkgJiYgIXRyYWNlLT5hbGxfY29udGV4dHMpCiAJCXJldHVybjsKLQlzcCA9IHNhdmVfY29udGV4dF9zdGFjayh0cmFjZSwgJnNraXAsIHNwLAorCXNwID0gc2F2ZV9jb250ZXh0X3N0YWNrKHRyYWNlLCAmdHJhY2UtPnNraXAsIHNwLAogCQkJCVMzOTBfbG93Y29yZS5hc3luY19zdGFjayAtIEFTWU5DX1NJWkUsCiAJCQkJUzM5MF9sb3djb3JlLmFzeW5jX3N0YWNrKTsKLQlpZiAoKHNwICE9IG9yaWdfc3ApICYmICFhbGxfY29udGV4dHMpCisJaWYgKChzcCAhPSBvcmlnX3NwKSAmJiAhdHJhY2UtPmFsbF9jb250ZXh0cykKIAkJcmV0dXJuOwogCWlmICh0YXNrKQotCQlzYXZlX2NvbnRleHRfc3RhY2sodHJhY2UsICZza2lwLCBzcCwKKwkJc2F2ZV9jb250ZXh0X3N0YWNrKHRyYWNlLCAmdHJhY2UtPnNraXAsIHNwLAogCQkJCSAgICh1bnNpZ25lZCBsb25nKSB0YXNrX3N0YWNrX3BhZ2UodGFzayksCiAJCQkJICAgKHVuc2lnbmVkIGxvbmcpIHRhc2tfc3RhY2tfcGFnZSh0YXNrKSArIFRIUkVBRF9TSVpFKTsKIAllbHNlCi0JCXNhdmVfY29udGV4dF9zdGFjayh0cmFjZSwgJnNraXAsIHNwLCBTMzkwX2xvd2NvcmUudGhyZWFkX2luZm8sCisJCXNhdmVfY29udGV4dF9zdGFjayh0cmFjZSwgJnRyYWNlLT5za2lwLCBzcCwKKwkJCQkgICBTMzkwX2xvd2NvcmUudGhyZWFkX2luZm8sCiAJCQkJICAgUzM5MF9sb3djb3JlLnRocmVhZF9pbmZvICsgVEhSRUFEX1NJWkUpOwogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCAxYTBkYjFkLi4xY2M1YzliIDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC04LDYgKzgsNyBAQAogY29uZmlnIFNVUEVSSAogCWJvb2wKIAlkZWZhdWx0IHkKKwlzZWxlY3QgRU1CRURERUQKIAloZWxwCiAJICBUaGUgU3VwZXJIIGlzIGEgUklTQyBwcm9jZXNzb3IgdGFyZ2V0ZWQgZm9yIHVzZSBpbiBlbWJlZGRlZCBzeXN0ZW1zCiAJICBhbmQgY29uc3VtZXIgZWxlY3Ryb25pY3M7IGl0IHdhcyBhbHNvIHVzZWQgaW4gdGhlIFNlZ2EgRHJlYW1jYXN0CkBAIC01MSwxOCArNTIsMjMgQEAKIAogbWVudSAiU3lzdGVtIHR5cGUiCiAKK2NvbmZpZyBTT0xVVElPTl9FTkdJTkUKKwlib29sCisKIGNob2ljZQogCXByb21wdCAiU3VwZXJIIHN5c3RlbSB0eXBlIgogCWRlZmF1bHQgU0hfVU5LTk9XTgogCiBjb25maWcgU0hfU09MVVRJT05fRU5HSU5FCiAJYm9vbCAiU29sdXRpb25FbmdpbmUiCisJc2VsZWN0IFNPTFVUSU9OX0VOR0lORQogCWhlbHAKIAkgIFNlbGVjdCBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpIFNINzcwOQogCSAgb3IgU0g3NzUwIGV2YWx1YXRpb24gYm9hcmQuCiAKIGNvbmZpZyBTSF83NzUxX1NPTFVUSU9OX0VOR0lORQogCWJvb2wgIlNvbHV0aW9uRW5naW5lNzc1MSIKKwlzZWxlY3QgU09MVVRJT05fRU5HSU5FCiAJc2VsZWN0IENQVV9TVUJUWVBFX1NINzc1MQogCWhlbHAKIAkgIFNlbGVjdCA3NzUxIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3NzUxCkBAIC03MCwxNyArNzYsMjcgQEAKIAogY29uZmlnIFNIXzczMDBfU09MVVRJT05fRU5HSU5FCiAJYm9vbCAiU29sdXRpb25FbmdpbmU3MzAwIgorCXNlbGVjdCBTT0xVVElPTl9FTkdJTkUKIAlzZWxlY3QgQ1BVX1NVQlRZUEVfU0g3MzAwCiAJaGVscAotCSAgU2VsZWN0IDczMDAgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaSBTSDczMDAoU0gtTW9iaWxlIFYpCi0JICBldmFsdWF0aW9uIGJvYXJkLgorCSAgU2VsZWN0IDczMDAgU29sdXRpb25FbmdpbmUgaWYgY29uZmlndXJpbmcgZm9yIGEgSGl0YWNoaQorCSAgU0g3MzAwKFNILU1vYmlsZSBWKSBldmFsdWF0aW9uIGJvYXJkLgorCitjb25maWcgU0hfNzM0M19TT0xVVElPTl9FTkdJTkUKKwlib29sICJTb2x1dGlvbkVuZ2luZTczNDMiCisJc2VsZWN0IFNPTFVUSU9OX0VOR0lORQorCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDczNDMKKwloZWxwCisJICBTZWxlY3QgNzM0MyBTb2x1dGlvbkVuZ2luZSBpZiBjb25maWd1cmluZyBmb3IgYSBIaXRhY2hpCisJICBTSDczNDMgKFNILU1vYmlsZSAzQVMpIGV2YWx1YXRpb24gYm9hcmQuCiAKIGNvbmZpZyBTSF83MzE4MF9TT0xVVElPTl9FTkdJTkUKICAgICAgICBib29sICJTb2x1dGlvbkVuZ2luZTczMTgwIgotICAgICAgIHNlbGVjdCBDUFVfU1VCVFlQRV9TSDczMTgwCi0gICAgICAgaGVscAotICAgICAgICAgU2VsZWN0IDczMTgwIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkgU0g3MzE4MChTSC1Nb2JpbGUgMykKLSAgICAgICAgIGV2YWx1YXRpb24gYm9hcmQuCisJc2VsZWN0IFNPTFVUSU9OX0VOR0lORQorCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDczMTgwCisJaGVscAorCSAgU2VsZWN0IDczMTgwIFNvbHV0aW9uRW5naW5lIGlmIGNvbmZpZ3VyaW5nIGZvciBhIEhpdGFjaGkKKwkgIFNINzMxODAoU0gtTW9iaWxlIDMpIGV2YWx1YXRpb24gYm9hcmQuCiAKIGNvbmZpZyBTSF83NzUxX1NZU1RFTUgKIAlib29sICJTeXN0ZW1INzc1MVIiCkBAIC04OSwxMiArMTA1LDYgQEAKIAkgIFNlbGVjdCBTeXN0ZW1IIGlmIHlvdSBhcmUgY29uZmlndXJpbmcgZm9yIGEgUmVuZXNhcyBTeXN0ZW1ICiAJICA3NzUxUiBldmFsdWF0aW9uIGJvYXJkLgogCi1jb25maWcgU0hfU1RCMV9IQVJQCi0JYm9vbCAiU1RCMV9IYXJwIgotCi1jb25maWcgU0hfU1RCMV9PVkVSRFJJVkUKLQlib29sICJTVEIxX092ZXJkcml2ZSIKLQogY29uZmlnIFNIX0hQNlhYCiAJYm9vbCAiSFA2WFgiCiAJaGVscApAQCAtMTAyLDE5ICsxMTIsNiBAQAogCSAgTW9yZSBpbmZvcm1hdGlvbiAoaGFyZHdhcmUgb25seSkgYXQKIAkgIDxodHRwOi8vd3d3LmhwLmNvbS9qb3JuYWRhLz4uCiAKLWNvbmZpZyBTSF9DUVJFRUsKLQlib29sICJDcVJFRUsiCi0JaGVscAotCSAgU2VsZWN0IENxUkVFSyBpZiBjb25maWd1cmluZyBmb3IgYSBDcVJFRUsgU0g3NzA4IG9yIFNINzc1MC4KLQkgIE1vcmUgaW5mb3JtYXRpb24gYXQKLQkgIDxodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL2Vjb3MvaGFyZHdhcmUuaHRtbCNTdXBlckg+LgotCi1jb25maWcgU0hfRE1JREEKLQlib29sICJETUlEQSIKLQloZWxwCi0JICBTZWxlY3QgRE1JREEgaWYgY29uZmlndXJpbmcgZm9yIGEgRGF0YU15dGUgNDAwMCBJbmR1c3RyaWFsCi0JICBEaWdpdGFsIEFzc2lzdGFudC4gTW9yZSBpbmZvcm1hdGlvbiBhdCA8aHR0cDovL3d3dy5kbWlkYS5jb20vPi4KLQogY29uZmlnIFNIX0VDMzEwNAogCWJvb2wgIkVDMzEwNCIKIAloZWxwCkBAIC0xMzYsMjUgKzEzMyw5IEBACiAJICA8aHR0cDovL3d3dy5tMTduLm9yZy9saW51eC1zaC9kcmVhbWNhc3QvPi4gIFRoZXJlIGlzIGEKIAkgIERyZWFtY2FzdCBwcm9qZWN0IGlzIGF0IDxodHRwOi8vbGludXhkYy5zb3VyY2Vmb3JnZS5uZXQvPi4KIAotY29uZmlnIFNIX0NBVDY4NzAxCi0JYm9vbCAiQ0FUNjg3MDEiCi0KIGNvbmZpZyBTSF9CSUdTVVIKIAlib29sICJCaWdTdXIiCiAKLWNvbmZpZyBTSF9TSDIwMDAKLQlib29sICJTSDIwMDAiCi0Jc2VsZWN0IENQVV9TVUJUWVBFX1NINzcwOQotCWhlbHAKLQkgIFNILTIwMDAgaXMgYSBzaW5nbGUtYm9hcmQgY29tcHV0ZXIgYmFzZWQgYXJvdW5kIFNINzcwOUEgY2hpcAotCSAgaW50ZW5kZWQgZm9yIGVtYmVkZGVkIGFwcGxpY2F0aW9ucy4KLQkgIEl0IGhhcyBhbiBFdGhlcm5ldCBpbnRlcmZhY2UgKENTODkwMEEpLCBkaXJlY3QgY29ubmVjdGVkCi0JICBDb21wYWN0IEZsYXNoIHNvY2tldCwgdGhyZWUgc2VyaWFsIHBvcnRzIGFuZCBQQy0xMDQgYnVzLgotCSAgTW9yZSBpbmZvcm1hdGlvbiBhdCA8aHR0cDovL3NoMjAwMC5zaC1saW51eC5vcmc+LgotCi1jb25maWcgU0hfQURYCi0JYm9vbCAiQURYIgotCiBjb25maWcgU0hfTVBDMTIxMQogCWJvb2wgIkludGVyZmFjZSBNUEMxMjExIgogCWhlbHAKQEAgLTE4NCw2ICsxNjUsMTMgQEAKIAkgIFNlbGVjdCBIUzc3NTFSVk9JUCBpZiBjb25maWd1cmluZyBmb3IgYSBSZW5lc2FzIFRlY2hub2xvZ3kKIAkgIFNhbGVzIFZvSVAgYm9hcmQuCiAKK2NvbmZpZyBTSF83NzEwVk9JUEdXCisJYm9vbCAiU0g3NzEwLVZPSVAtR1ciCisJc2VsZWN0IENQVV9TVUJUWVBFX1NINzcxMAorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBidWlsZCBhIGtlcm5lbCBmb3IgdGhlIFNINzcxMCBiYXNlZAorCSAgVk9JUCBHVy4KKwogY29uZmlnIFNIX1JUUzc3NTFSMkQKIAlib29sICJSVFM3NzUxUjJEIgogCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3NTFSCkBAIC0yMjIsNiArMjEwLDEyIEBACiAJICBTZWxlY3QgVGl0YW4gaWYgeW91IGFyZSBjb25maWd1cmluZyBmb3IgYSBOaW1ibGUgTWljcm9zeXN0ZW1zCiAJICBOZXRFbmdpbmUgTlA1MVIuCiAKK2NvbmZpZyBTSF9TSE1JTgorCWJvb2wgIlNITUlOIgorCXNlbGVjdCBDUFVfU1VCVFlQRV9TSDc3MDYKKwloZWxwCisJICBTZWxlY3QgU0hNSU4gaWYgY29uZmlndXJlaW5nIGZvciB0aGUgU0hNSU4gYm9hcmQKKwogY29uZmlnIFNIX1VOS05PV04KIAlib29sICJCYXJlQ1BVIgogCWhlbHAKQEAgLTIzOCwzNSArMjMyLDkgQEAKIAogc291cmNlICJhcmNoL3NoL21tL0tjb25maWciCiAKLWNvbmZpZyBNRU1PUllfU1RBUlQKLQloZXggIlBoeXNpY2FsIG1lbW9yeSBzdGFydCBhZGRyZXNzIgotCWRlZmF1bHQgIjB4MDgwMDAwMDAiCi0JLS0taGVscC0tLQotCSAgQ29tcHV0ZXJzIGJ1aWx0IHdpdGggSGl0YWNoaSBTdXBlckggcHJvY2Vzc29ycyBhbHdheXMKLQkgIG1hcCB0aGUgUk9NIHN0YXJ0aW5nIGF0IGFkZHJlc3MgemVyby4gIEJ1dCB0aGUgcHJvY2Vzc29yCi0JICBkb2VzIG5vdCBzcGVjaWZ5IHRoZSByYW5nZSB0aGF0IFJBTSB0YWtlcy4KLQotCSAgVGhlIHBoeXNpY2FsIG1lbW9yeSAoUkFNKSBzdGFydCBhZGRyZXNzIHdpbGwgYmUgYXV0b21hdGljYWxseQotCSAgc2V0IHRvIDA4MDAwMDAwLiBPdGhlciBwbGF0Zm9ybXMsIHN1Y2ggYXMgdGhlIFNvbHV0aW9uIEVuZ2luZQotCSAgYm9hcmRzIHR5cGljYWxseSBtYXAgUkFNIGF0IDBDMDAwMDAwLgotCi0JICBUd2VhayB0aGlzIG9ubHkgd2hlbiBwb3J0aW5nIHRvIGEgbmV3IG1hY2hpbmUgd2hpY2ggZG9lcyBub3QKLQkgIGFscmVhZHkgaGF2ZSBhIGRlZmNvbmZpZy4gQ2hhbmdpbmcgaXQgZnJvbSB0aGUga25vd24gY29ycmVjdAotCSAgdmFsdWUgb24gYW55IG9mIHRoZSBrbm93biBzeXN0ZW1zIHdpbGwgb25seSBsZWFkIHRvIGRpc2FzdGVyLgotCi1jb25maWcgTUVNT1JZX1NJWkUKLQloZXggIlBoeXNpY2FsIG1lbW9yeSBzaXplIgotCWRlZmF1bHQgIjB4MDA0MDAwMDAiCi0JaGVscAotCSAgVGhpcyBzZXRzIHRoZSBkZWZhdWx0IG1lbW9yeSBzaXplIGFzc3VtZWQgYnkgeW91ciBTSCBrZXJuZWwuIEl0IGNhbgotCSAgYmUgb3ZlcnJpZGRlbiBhcyBub3JtYWwgYnkgdGhlICdtZW09JyBhcmd1bWVudCBvbiB0aGUga2VybmVsIGNvbW1hbmQKLQkgIGxpbmUuIElmIHVuc3VyZSwgY29uc3VsdCB5b3VyIGJvYXJkIHNwZWNpZmljYXRpb25zIG9yIGp1c3QgbGVhdmUgaXQKLQkgIGFzIDB4MDA0MDAwMDAgd2hpY2ggd2FzIHRoZSBkZWZhdWx0IHZhbHVlIGJlZm9yZSB0aGlzIGJlY2FtZQotCSAgY29uZmlndXJhYmxlLgotCiBjb25maWcgQ0ZfRU5BQkxFUgogCWJvb2wgIkNvbXBhY3QgRmxhc2ggRW5hYmxlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gU0hfQURYIHx8IFNIX1NPTFVUSU9OX0VOR0lORSB8fCBTSF9VTktOT1dOIHx8IFNIX0NBVDY4NzAxIHx8IFNIX1NIMDMKKwlkZXBlbmRzIG9uIFNIX1NPTFVUSU9OX0VOR0lORSB8fCBTSF9VTktOT1dOIHx8IFNIX1NIMDMKIAktLS1oZWxwLS0tCiAJICBDb21wYWN0IEZsYXNoIGlzIGEgc21hbGwsIHJlbW92YWJsZSBtYXNzIHN0b3JhZ2UgZGV2aWNlIGludHJvZHVjZWQKIAkgIGluIDE5OTQgb3JpZ2luYWxseSBhcyBhIFBDTUNJQSBkZXZpY2UuICBJZiB5b3Ugc2F5IGBZJyBoZXJlLCB5b3UKQEAgLTI5NCw3ICsyNjIsNyBAQAogCSAgLSAiQXJlYTUiIGlmIENvbXBhY3RGbGFzaCBpcyBjb25uZWN0ZWQgdG8gQXJlYSA1ICgweDE0MDAwMDAwKQogCSAgLSAiQXJlYTYiIGlmIGl0IGlzIGNvbm5lY3RlZCB0byBBcmVhIDYgKDB4MTgwMDAwMDApCiAKLQkgICJBcmVhNiIgd2lsbCB3b3JrIGZvciBtb3N0IGJvYXJkcy4gRm9yIEFEWCwgc2VsZWN0ICJBcmVhNSIuCisJICAiQXJlYTYiIHdpbGwgd29yayBmb3IgbW9zdCBib2FyZHMuCiAKIGNvbmZpZyBDRl9BUkVBNgogCWJvb2wgIkFyZWE2IgpAQCAtMzE2LDE5ICsyODQsNiBAQAogCSAgZW5kaWFuIGJ5dGUgb3JkZXIuIFRoZXNlIG1vZGVzIHJlcXVpcmUgZGlmZmVyZW50IGtlcm5lbHMuIFNheSBZIGlmCiAJICB5b3VyIG1hY2hpbmUgaXMgbGl0dGxlIGVuZGlhbiwgTiBpZiBpdCdzIGEgYmlnIGVuZGlhbiBtYWNoaW5lLgogCi0jIFRoZSBTSDc3NTAgUlRDIG1vZHVsZSBpcyBkaXNhYmxlZCBpbiB0aGUgRHJlYW1jYXN0Ci1jb25maWcgU0hfUlRDCi0JYm9vbAotCWRlcGVuZHMgb24gIVNIX0RSRUFNQ0FTVCAmJiAhU0hfU0FUVVJOICYmICFTSF83MzAwX1NPTFVUSU9OX0VOR0lORSAmJiBcCi0JCSAgICFTSF83MzE4MF9TT0xVVElPTl9FTkdJTkUgJiYgIVNIX0xBTkRJU0sgJiYgXAotCQkgICAhU0hfUjc3ODBSUAotCWRlZmF1bHQgeQotCWhlbHAKLQkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIGFsbG93IHRoZSBMaW51eCBrZXJuZWwgdG8gZW11bGF0ZQotCSAgUEMncyBSVEMuCi0KLQkgIElmIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBTSF9GUFUKIAlib29sICJGUFUgc3VwcG9ydCIKIAlkZXBlbmRzIG9uICFDUFVfU0gzCkBAIC0zMzksMTQgKzI5NCwyMiBAQAogCiAJICBUaGlzIG9wdGlvbiBtdXN0IGJlIHNldCBpbiBvcmRlciB0byBlbmFibGUgdGhlIEZQVS4KIAorY29uZmlnIFNIX0ZQVV9FTVUKKwlib29sICJGUFUgZW11bGF0aW9uIHN1cHBvcnQiCisJZGVwZW5kcyBvbiAhU0hfRlBVICYmIEVYUEVSSU1FTlRBTAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIGVuYWJsZSBzdXBwb3J0IGZvciBzb2Z0d2FyZSBGUFUgZW11bGF0aW9uLgorCSAgTW9zdCBTSC0zIHVzZXJzIHdpbGwgd2FudCB0byBzYXkgWSBoZXJlLCB3aGVyZWFzIG1vc3QgU0gtNCB1c2VycyB3aWxsCisJICB3YW50IHRvIHNheSBOLgorCiBjb25maWcgU0hfRFNQCiAJYm9vbCAiRFNQIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAhQ1BVX1NINAotCWRlZmF1bHQgeQorCWRlZmF1bHQgeSBpZiBTSDRBTF9EU1AgfHwgIUNQVV9TSDQKKwlkZWZhdWx0IG4KIAloZWxwCiAJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCBlbmFibGUgc3VwcG9ydCBmb3IgU0ggcHJvY2Vzc29ycyB0aGF0Ci0JICBoYXZlIERTUCB1bml0cyAoaWUsIFNIMi1EU1AgYW5kIFNIMy1EU1ApLiBJdCBpcyBzYWZlIHRvIHNheSBZIGhlcmUKLQkgIGJ5IGRlZmF1bHQsIGFzIHRoZSBleGlzdGFuY2Ugb2YgdGhlIERTUCB3aWxsIGJlIHByb2JlZCBhdCBydW50aW1lLgorCSAgaGF2ZSBEU1AgdW5pdHMgKGllLCBTSDItRFNQLCBTSDMtRFNQLCBhbmQgU0g0QUwtRFNQKS4KIAogCSAgVGhpcyBvcHRpb24gbXVzdCBiZSBzZXQgaW4gb3JkZXIgdG8gZW5hYmxlIHRoZSBEU1AuCiAKQEAgLTM3Myw2ICszMzYsOSBAQAogY29uZmlnIENQVV9IQVNfUElOVF9JUlEKIAlib29sCiAKK2NvbmZpZyBDUFVfSEFTX01BU0tSRUdfSVJRCisJYm9vbAorCiBjb25maWcgQ1BVX0hBU19JTlRDMl9JUlEKIAlib29sCiAKQEAgLTQwMCwxNiArMzY2LDE5IEBACiAKIGVuZG1lbnUKIAotI3NvdXJjZSAiYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9LY29uZmlnIgorc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL0tjb25maWciCiAKLSNzb3VyY2UgImFyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9LY29uZmlnIgorc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvS2NvbmZpZyIKKworc291cmNlICJhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvS2NvbmZpZyIKIAogY29uZmlnIFNIX1BDTEtfRlJFUQogCWludCAiUGVyaXBoZXJhbCBjbG9jayBmcmVxdWVuY3kgKGluIEh6KSIKIAlkZWZhdWx0ICI1MDAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3NzUwIHx8IENQVV9TVUJUWVBFX1NINzc4MAogCWRlZmF1bHQgIjYwMDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDc3NTEKLQlkZWZhdWx0ICIzMzMzMzMzMyIgaWYgQ1BVX1NVQlRZUEVfU0g3MzAwIHx8IENQVV9TVUJUWVBFX1NINzc3MCB8fCBDUFVfU1VCVFlQRV9TSDc3NjAKLQlkZWZhdWx0ICIyNzAwMDAwMCIgaWYgQ1BVX1NVQlRZUEVfU0g3MzE4MAorCWRlZmF1bHQgIjMzMzMzMzMzIiBpZiBDUFVfU1VCVFlQRV9TSDczMDAgfHwgQ1BVX1NVQlRZUEVfU0g3NzcwIHx8IFwKKwkJCSAgICAgIENQVV9TVUJUWVBFX1NINzc2MAorCWRlZmF1bHQgIjI3MDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDczMTgwIHx8IENQVV9TVUJUWVBFX1NINzM0MwogCWRlZmF1bHQgIjY2MDAwMDAwIiBpZiBDUFVfU1VCVFlQRV9TSDRfMjAyCiAJaGVscAogCSAgVGhpcyBvcHRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBwZXJpcGhlcmFsIGNsb2NrIGZyZXF1ZW5jeS4KQEAgLTQ0MCwxMCArNDA5LDggQEAKIAogY29uZmlnIEhFQVJUQkVBVAogCWJvb2wgIkhlYXJ0YmVhdCBMRUQiCi0JZGVwZW5kcyBvbiBTSF9NUEMxMjExIHx8IFNIX1NIMDMgfHwgU0hfQ0FUNjg3MDEgfHwgXAotCQkgICBTSF9TVEIxX0hBUlAgfHwgU0hfU1RCMV9PVkVSRFJJVkUgfHwgU0hfQklHU1VSIHx8IFwKLQkJICAgU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUgfHwgU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUgfHwgXAotCQkgICBTSF83MzE4MF9TT0xVVElPTl9FTkdJTkUgfHwgU0hfU09MVVRJT05fRU5HSU5FIHx8IFwKKwlkZXBlbmRzIG9uIFNIX01QQzEyMTEgfHwgU0hfU0gwMyB8fCBcCisJCSAgIFNIX0JJR1NVUiB8fCBTT0xVVElPTl9FTkdJTkUgfHwgXAogCQkgICBTSF9SVFM3NzUxUjJEIHx8IFNIX1NINDIwMl9NSUNST0RFViB8fCBTSF9MQU5ESVNLCiAJaGVscAogCSAgVXNlIHRoZSBwb3dlci1vbiBMRUQgb24geW91ciBtYWNoaW5lIGFzIGEgbG9hZCBtZXRlci4gIFRoZSBleGFjdApAQCAtNDU5LDYgKzQyNiw4IEBACiAKIG1lbnUgIktlcm5lbCBmZWF0dXJlcyIKIAorc291cmNlIGtlcm5lbC9LY29uZmlnLmh6CisKIGNvbmZpZyBLRVhFQwogCWJvb2wgImtleGVjIHN5c3RlbSBjYWxsIChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCkBAIC00NzYsMTAgKzQ0NSw2IEBACiAJICBzdXBwb3J0LiAgQXMgb2YgdGhpcyB3cml0aW5nIHRoZSBleGFjdCBoYXJkd2FyZSBpbnRlcmZhY2UgaXMKIAkgIHN0cm9uZ2x5IGluIGZsdXgsIHNvIG5vIGdvb2QgcmVjb21tZW5kYXRpb24gY2FuIGJlIG1hZGUuCiAKLWNvbmZpZyBQUkVFTVBUCi0JYm9vbCAiUHJlZW1wdGlibGUgS2VybmVsIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCi0KIGNvbmZpZyBTTVAKIAlib29sICJTeW1tZXRyaWMgbXVsdGktcHJvY2Vzc2luZyBzdXBwb3J0IgogCS0tLWhlbHAtLS0KQEAgLTUxNSw2ICs0ODAsOCBAQAogCSAgVGhpcyBpcyBwdXJlbHkgdG8gc2F2ZSBtZW1vcnkgLSBlYWNoIHN1cHBvcnRlZCBDUFUgYWRkcwogCSAgYXBwcm94aW1hdGVseSBlaWdodCBraWxvYnl0ZXMgdG8gdGhlIGtlcm5lbCBpbWFnZS4KIAorc291cmNlICJrZXJuZWwvS2NvbmZpZy5wcmVlbXB0IgorCiBjb25maWcgQ1BVX0hBU19TUl9SQgogCWJvb2wgIkNQVSBoYXMgU1IuUkIiCiAJZGVwZW5kcyBvbiBDUFVfU0gzIHx8IENQVV9TSDQKQEAgLTYzNiw2ICs2MDMsMTYgQEAKIAogZW5kbWVudQogCittZW51ICJQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEVYUEVSSU1FTlRBTCkiCitkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCitzb3VyY2Uga2VybmVsL3Bvd2VyL0tjb25maWcKKworY29uZmlnIEFQTQorCWJvb2wgIkFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQgRW11bGF0aW9uIgorCWRlcGVuZHMgb24gUE0KK2VuZG1lbnUKKwogc291cmNlICJuZXQvS2NvbmZpZyIKIAogc291cmNlICJkcml2ZXJzL0tjb25maWciCmRpZmYgLS1naXQgYS9hcmNoL3NoL0tjb25maWcuZGVidWcgYi9hcmNoL3NoL0tjb25maWcuZGVidWcKaW5kZXggOGZiMzFhYi4uNDg0NzllMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvc2gvS2NvbmZpZy5kZWJ1ZwpAQCAtMzAsOCArMzAsMzUgQEAKIAkgIHdoZW4gdGhlIGtlcm5lbCBtYXkgY3Jhc2ggb3IgaGFuZyBiZWZvcmUgdGhlIHNlcmlhbCBjb25zb2xlIGlzCiAJICBpbml0aWFsaXNlZC4gSWYgdW5zdXJlLCBzYXkgTi4KIAorY29uZmlnIERFQlVHX1NUQUNLT1ZFUkZMT1cKKwlib29sICJDaGVjayBmb3Igc3RhY2sgb3ZlcmZsb3dzIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJaGVscAorCSAgVGhpcyBvcHRpb24gd2lsbCBjYXVzZSBtZXNzYWdlcyB0byBiZSBwcmludGVkIGlmIGZyZWUgc3RhY2sgc3BhY2UKKwkgIGRyb3BzIGJlbG93IGEgY2VydGFpbiBsaW1pdC4KKworY29uZmlnIERFQlVHX1NUQUNLX1VTQUdFCisJYm9vbCAiU3RhY2sgdXRpbGl6YXRpb24gaW5zdHJ1bWVudGF0aW9uIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJaGVscAorCSAgRW5hYmxlcyB0aGUgZGlzcGxheSBvZiB0aGUgbWluaW11bSBhbW91bnQgb2YgZnJlZSBzdGFjayB3aGljaCBlYWNoCisJICB0YXNrIGhhcyBldmVyIGhhZCBhdmFpbGFibGUgaW4gdGhlIHN5c3JxLVQgYW5kIHN5c3JxLVAgZGVidWcgb3V0cHV0LgorCisJICBUaGlzIG9wdGlvbiB3aWxsIHNsb3cgZG93biBwcm9jZXNzIGNyZWF0aW9uIHNvbWV3aGF0LgorCitjb25maWcgNEtTVEFDS1MKKwlib29sICJVc2UgNEtiIGZvciBrZXJuZWwgc3RhY2tzIGluc3RlYWQgb2YgOEtiIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgdGhlIGtlcm5lbCB3aWxsIHVzZSBhIDRLYiBzdGFja3NpemUgZm9yIHRoZQorCSAga2VybmVsIHN0YWNrIGF0dGFjaGVkIHRvIGVhY2ggcHJvY2Vzcy90aHJlYWQuIFRoaXMgZmFjaWxpdGF0ZXMKKwkgIHJ1bm5pbmcgbW9yZSB0aHJlYWRzIG9uIGEgc3lzdGVtIGFuZCBhbHNvIHJlZHVjZXMgdGhlIHByZXNzdXJlCisJICBvbiB0aGUgVk0gc3Vic3lzdGVtIGZvciBoaWdoZXIgb3JkZXIgYWxsb2NhdGlvbnMuIFRoaXMgb3B0aW9uCisJICB3aWxsIGFsc28gdXNlIElSUSBzdGFja3MgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIHJlZHVjZWQgc3RhY2tzcGFjZS4KKwogY29uZmlnIEtHREIKIAlib29sICJJbmNsdWRlIEtHREIga2VybmVsIGRlYnVnZ2VyIgorCXNlbGVjdCBGUkFNRV9QT0lOVEVSCiAJaGVscAogCSAgSW5jbHVkZSBpbi1rZXJuZWwgaG9va3MgZm9yIGtnZGIsIHRoZSBMaW51eCBrZXJuZWwgc291cmNlIGxldmVsCiAJICBkZWJ1Z2dlci4gIFNlZSA8aHR0cDovL2tnZGIuc291cmNlZm9yZ2UubmV0Lz4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCkBAIC0xMTIsMTMgKzEzOSw0IEBACiAKIGVuZG1lbnUKIAotY29uZmlnIEZSQU1FX1BPSU5URVIKLQlib29sICJDb21waWxlIHRoZSBrZXJuZWwgd2l0aCBmcmFtZSBwb2ludGVycyIKLQlkZWZhdWx0IHkgaWYgS0dEQgotCWhlbHAKLQkgIElmIHlvdSBzYXkgWSBoZXJlIHRoZSByZXN1bHRpbmcga2VybmVsIGltYWdlIHdpbGwgYmUgc2xpZ2h0bHkgbGFyZ2VyCi0JICBhbmQgc2xvd2VyLCBidXQgaXQgd2lsbCBnaXZlIHZlcnkgdXNlZnVsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KLQkgIElmIHlvdSBkb24ndCBkZWJ1ZyB0aGUga2VybmVsLCB5b3UgY2FuIHNheSBOLCBidXQgd2UgbWF5IG5vdCBiZSBhYmxlCi0JICB0byBzb2x2ZSBwcm9ibGVtcyB3aXRob3V0IGZyYW1lIHBvaW50ZXJzLgotCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3NoL01ha2VmaWxlIGIvYXJjaC9zaC9NYWtlZmlsZQppbmRleCBlNDY3YTQ1Li4yNmQ2MmZmIDEwMDY0NAotLS0gYS9hcmNoL3NoL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvTWFrZWZpbGUKQEAgLTE4LDExICsxOCwxMyBAQAogY2ZsYWdzLSQoQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOKQk6PSAtbWwKIAogaXNhLXkJCQkJCTo9IGFueQoraXNhLSQoQ09ORklHX1NIX0RTUCkJCQk6PSBzaAogaXNhLSQoQ09ORklHX0NQVV9TSDIpCQkJOj0gc2gyCitpc2EtJChDT05GSUdfQ1BVX1NIMkEpCQkJOj0gc2gyYQogaXNhLSQoQ09ORklHX0NQVV9TSDMpCQkJOj0gc2gzCiBpc2EtJChDT05GSUdfQ1BVX1NINCkJCQk6PSBzaDQKIGlzYS0kKENPTkZJR19DUFVfU0g0QSkJCQk6PSBzaDRhCi1pc2EtJChDT05GSUdfQ1BVX1NIMkEpCQkJOj0gc2gyYQoraXNhLSQoQ09ORklHX0NQVV9TSDRBTF9EU1ApCQk6PSBzaDRhbAogCiBpc2EtJChDT05GSUdfU0hfRFNQKQkJCTo9ICQoaXNhLXkpLWRzcAogCkBAIC0zMCw5ICszMiwxMSBAQAogaXNhLXkJCQk6PSAkKGlzYS15KS1ub21tdQogZW5kaWYKIAoraWZuZGVmIENPTkZJR19TSF9EU1AKIGlmbmRlZiBDT05GSUdfU0hfRlBVCiBpc2EteQkJCTo9ICQoaXNhLXkpLW5vZnB1CiBlbmRpZgorZW5kaWYKIAogY2ZsYWdzLXkJKz0gJChjYWxsIGFzLW9wdGlvbiwtV2EkKGNvbW1hKS1pc2E9JChpc2EteSksKQogCkBAIC03OSwyNCArODMsMTkgQEAKIExJQkdDQyA6PSAkKHNoZWxsICQoQ0MpICQoQ0ZMQUdTKSAtcHJpbnQtbGliZ2NjLWZpbGUtbmFtZSkKIAogY29yZS15CQkJCSs9IGFyY2gvc2gva2VybmVsLyBhcmNoL3NoL21tLworY29yZS0kKENPTkZJR19TSF9GUFVfRU1VKQkrPSBhcmNoL3NoL21hdGgtZW11LwogCiAjIEJvYXJkcwogbWFjaGRpci0kKENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUpCQk6PSBzZS83NzB4CiBtYWNoZGlyLSQoQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FKQk6PSBzZS83NzUxCiBtYWNoZGlyLSQoQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FKQk6PSBzZS83MzAwCittYWNoZGlyLSQoQ09ORklHX1NIXzczNDNfU09MVVRJT05fRU5HSU5FKQk6PSBzZS83MzQzCiBtYWNoZGlyLSQoQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSkJOj0gc2UvNzMxODAKLW1hY2hkaXItJChDT05GSUdfU0hfU1RCMV9IQVJQKQkJCTo9IGhhcnAKLW1hY2hkaXItJChDT05GSUdfU0hfU1RCMV9PVkVSRFJJVkUpCQk6PSBvdmVyZHJpdmUKIG1hY2hkaXItJChDT05GSUdfU0hfSFA2WFgpCQkJOj0gaHA2eHgKLW1hY2hkaXItJChDT05GSUdfU0hfQ1FSRUVLKQkJCTo9IGNxcmVlawotbWFjaGRpci0kKENPTkZJR19TSF9ETUlEQSkJCQk6PSBkbWlkYQogbWFjaGRpci0kKENPTkZJR19TSF9FQzMxMDQpCQkJOj0gZWMzMTA0CiBtYWNoZGlyLSQoQ09ORklHX1NIX1NBVFVSTikJCQk6PSBzYXR1cm4KIG1hY2hkaXItJChDT05GSUdfU0hfRFJFQU1DQVNUKQkJCTo9IGRyZWFtY2FzdAotbWFjaGRpci0kKENPTkZJR19TSF9DQVQ2ODcwMSkJCQk6PSBjYXQ2ODcwMQogbWFjaGRpci0kKENPTkZJR19TSF9CSUdTVVIpCQkJOj0gYmlnc3VyCi1tYWNoZGlyLSQoQ09ORklHX1NIX1NIMjAwMCkJCQk6PSBzaDIwMDAKLW1hY2hkaXItJChDT05GSUdfU0hfQURYKQkJCTo9IGFkeAogbWFjaGRpci0kKENPTkZJR19TSF9NUEMxMjExKQkJCTo9IG1wYzEyMTEKIG1hY2hkaXItJChDT05GSUdfU0hfU0gwMykJCQk6PSBzaDAzCiBtYWNoZGlyLSQoQ09ORklHX1NIX1NFQ1VSRUVER0U1NDEwKQkJOj0gc25hcGdlYXIKQEAgLTEwNCwxNiArMTAzLDE2IEBACiBtYWNoZGlyLSQoQ09ORklHX1NIX1JUUzc3NTFSMkQpCQkJOj0gcmVuZXNhcy9ydHM3NzUxcjJkCiBtYWNoZGlyLSQoQ09ORklHX1NIXzc3NTFfU1lTVEVNSCkJCTo9IHJlbmVzYXMvc3lzdGVtaAogbWFjaGRpci0kKENPTkZJR19TSF9FRE9TSzc3MDUpCQkJOj0gcmVuZXNhcy9lZG9zazc3MDUKK21hY2hkaXItJChDT05GSUdfU0hfUjc3ODBSUCkJCQk6PSByZW5lc2FzL3I3NzgwcnAKK21hY2hkaXItJChDT05GSUdfU0hfNzcxMFZPSVBHVykJCQk6PSByZW5lc2FzL3NoNzcxMHZvaXBndwogbWFjaGRpci0kKENPTkZJR19TSF9TSDQyMDJfTUlDUk9ERVYpCQk6PSBzdXBlcmgvbWljcm9kZXYKK21hY2hkaXItJChDT05GSUdfU0hfTEFORElTSykJCQk6PSBsYW5kaXNrCittYWNoZGlyLSQoQ09ORklHX1NIX1RJVEFOKQkJCTo9IHRpdGFuCittYWNoZGlyLSQoQ09ORklHX1NIX1NITUlOKQkJCTo9IHNobWluCiBtYWNoZGlyLSQoQ09ORklHX1NIX1VOS05PV04pCQkJOj0gdW5rbm93bgogCiBpbmNkaXIteQkJCTo9ICQobm90ZGlyICQobWFjaGRpci15KSkKLQotaW5jZGlyLSQoQ09ORklHX1NIX1NPTFVUSU9OX0VOR0lORSkJCTo9IHNlCi1pbmNkaXItJChDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUpCTo9IHNlNzc1MQotaW5jZGlyLSQoQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FKSAgICAgICAgOj0gc2U3MzAwCi1pbmNkaXItJChDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FKQk6PSBzZTczMTgwCi1pbmNkaXItJChDT05GSUdfU0hfSFA2MDApCQkJOj0gaHA2eHgKK2luY2Rpci0kKENPTkZJR19TSF9IUDZYWCkJCQk6PSBocDZ4eAogCiBpZm5lcSAoJChtYWNoZGlyLXkpLCkKIGNvcmUteQkJCQkrPSBhcmNoL3NoL2JvYXJkcy8kKG1hY2hkaXIteSkvCkBAIC0xMzcsMTcgKzEzNiwxNCBAQAogCiBDUFBGTEFHU192bWxpbnV4LmxkcyA6PSAtdHJhZGl0aW9uYWwKIAotaWZuZXEgKCQoS0JVSUxEX1NSQyksKQogaW5jZGlyLXByZWZpeAk6PSAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLXNoLwotZWxzZQotaW5jZGlyLXByZWZpeAk6PQotZW5kaWYKIAogIwlVcGRhdGUgbWFjaGluZSBhcmNoIGFuZCBwcm9jIHN5bWxpbmtzIGlmIHNvbWV0aGluZyB3aGljaCBhZmZlY3RzCiAjCXRoZW0gY2hhbmdlZC4gIFdlIHVzZSAuYXJjaCBhbmQgLm1hY2ggdG8gaW5kaWNhdGUgd2hlbiB0aGV5IHdlcmUKICMJdXBkYXRlZCBsYXN0LCBvdGhlcndpc2UgbWFrZSB1c2VzIHRoZSB0YXJnZXQgZGlyZWN0b3J5IG10aW1lLgogCi1pbmNsdWRlL2FzbS1zaC8uY3B1OiAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnL2NwdS8qLmgpIGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZgoraW5jbHVkZS9hc20tc2gvLmNwdTogJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy9jcHUvKi5oKSBcCisJCSAgICAgaW5jbHVkZS9jb25maWcvYXV0by5jb25mIEZPUkNFCiAJQGVjaG8gJyAgU1lNTElOSyBpbmNsdWRlL2FzbS1zaC9jcHUgLT4gaW5jbHVkZS9hc20tc2gvJChjcHVpbmNkaXIteSknCiAJJChRKWlmIFsgISAtZCBpbmNsdWRlL2FzbS1zaCBdOyB0aGVuIG1rZGlyIC1wIGluY2x1ZGUvYXNtLXNoOyBmaQogCSQoUSlsbiAtZnNuICQoaW5jZGlyLXByZWZpeCkkKGNwdWluY2Rpci15KSBpbmNsdWRlL2FzbS1zaC9jcHUKQEAgLTE1Nyw3ICsxNTMsOCBAQAogIwlkb24ndCwganVzdCByZWZlcmVuY2UgdGhlIHBhcmVudCBkaXJlY3Rvcnkgc28gdGhlIHNlbWFudGljcyBhcmUKICMJa2VwdCByb3VnaGx5IHRoZSBzYW1lLgogCi1pbmNsdWRlL2FzbS1zaC8ubWFjaDogJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy9zaC8qLmgpIGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZgoraW5jbHVkZS9hc20tc2gvLm1hY2g6ICQod2lsZGNhcmQgaW5jbHVkZS9jb25maWcvc2gvKi5oKSBcCisJCSAgICAgIGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZiBGT1JDRQogCUBlY2hvIC1uICcgIFNZTUxJTksgaW5jbHVkZS9hc20tc2gvbWFjaCAtPiAnCiAJJChRKWlmIFsgISAtZCBpbmNsdWRlL2FzbS1zaCBdOyB0aGVuIG1rZGlyIC1wIGluY2x1ZGUvYXNtLXNoOyBmaQogCSQoUSlpZiBbIC1kICQoaW5jZGlyLXByZWZpeCkkKGluY2Rpci15KSBdOyB0aGVuIFwKQEAgLTE3MCw3ICsxNjcsNyBAQAogCWZpCiAJQHRvdWNoICRACiAKLWFyY2hwcmVwYXJlOiBtYWtldG9vbHMgaW5jbHVkZS9hc20tc2gvLmNwdSBpbmNsdWRlL2FzbS1zaC8ubWFjaAorYXJjaHByZXBhcmU6IGluY2x1ZGUvYXNtLXNoLy5jcHUgaW5jbHVkZS9hc20tc2gvLm1hY2ggbWFrZXRvb2xzCiAKIFBIT05ZICs9IG1ha2V0b29scyBGT1JDRQogbWFrZXRvb2xzOiAgaW5jbHVkZS9saW51eC92ZXJzaW9uLmggRk9SQ0UKQEAgLTE5MSw0ICsxODgsMyBAQAogZGVmaW5lIGFyY2hoZWxwCiAJQGVjaG8gJyAgekltYWdlIAkgICAgICAgICAgIC0gQ29tcHJlc3NlZCBrZXJuZWwgaW1hZ2UgKGFyY2gvc2gvYm9vdC96SW1hZ2UpJwogZW5kZWYKLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYWR4L01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvYWR4L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjFjNTMxLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL2FkeC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgQURYIGJvYXJkcwotIwotCi1vYmoteQkgOj0gc2V0dXAubyBpcnEubyBpcnFfbWFza3JlcS5vCi0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2FkeC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL2FkeC9pcnEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjYTQwOS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9hZHgvaXJxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvYWR4L2lycS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAxIEEmRCBDby4sIEx0ZC4KLSAqCi0gKiBJL08gcm91dGluZSBhbmQgc2V0dXAgcm91dGluZXMgZm9yIEEmRCBBRFggQm9hcmQKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQotdm9pZCBpbml0X2FkeF9JUlEodm9pZCkKLXsKLSAgICAgICAgaW50IGk7Ci0KLS8qICAgICAgcHJpbnRrKCJpbml0X2FkeF9JUlEoKVxuIik7Ki8KLSAgICAgICAgLyogc2V0dXAgaXJxX21hc2tfcmVnaXN0ZXIgKi8KLSAgICAgICAgaXJxX21hc2tfcmVnaXN0ZXIgPSAodW5zaWduZWQgc2hvcnQgKikweGE2MDAwMDA4OwotCi0gICAgICAgIC8qIGNvdmVyIGFsbCBleHRlcm5hbCBpbnRlcnJ1cHQgYXJlYSBieSBtYXNrcmVnX2lycV90eXBlCi0gICAgICAgICAqIChBY3R1YWxseSwgaXJxMTUgZG9lc24ndCBleGlzdCkKLSAgICAgICAgICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbWFrZV9tYXNrcmVnX2lycShpKTsKLSAgICAgICAgICAgICAgICBkaXNhYmxlX2lycShpKTsKLSAgICAgICAgfQotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYWR4L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9hZHgvc2V0dXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzOGQ5NS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9hZHgvc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qIAotICogbGludXgvYXJjaC9zaC9ib2FyZC9hZHgvc2V0dXAuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSBBJkQgQ28uLCBMdGQuCi0gKgotICogSS9PIHJvdXRpbmUgYW5kIHNldHVwIHJvdXRpbmVzIGZvciBBJkQgQURYIEJvYXJkCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi1leHRlcm4gdm9pZCBpbml0X2FkeF9JUlEodm9pZCk7Ci1leHRlcm4gdm9pZCAqY2ZfaW9fYmFzZTsKLQotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICJBJkQgQURYIjsKLX0KLQotdW5zaWduZWQgbG9uZyBhZHhfaXNhX3BvcnQyYWRkcih1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLQkvKiBDb21wYWN0Rmxhc2ggKElERSkgKi8KLQlpZiAoKChvZmZzZXQgPj0gMHgxZjApICYmIChvZmZzZXQgPD0gMHgxZjcpKSB8fCAob2Zmc2V0ID09IDB4M2Y2KSkgewotCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpY2ZfaW9fYmFzZSArIG9mZnNldDsKLQl9Ci0KLQkvKiBldGgwICovCi0JaWYgKChvZmZzZXQgPj0gMHgzMDApICYmIChvZmZzZXQgPD0gMHgzMGYpKSB7Ci0JCXJldHVybiAweGE1MDAwMDAwICsgb2Zmc2V0OwkvKiBDT01NIEJPQVJEIChBUkVBMSkgKi8KLQl9Ci0KLQlyZXR1cm4gb2Zmc2V0ICsgMHhiMDAwMDAwMDsgLyogSU9CVVMgKEFSRUEgNCkqLwotfQotCi0vKgotICogVGhlIE1hY2hpbmUgVmVjdG9yCi0gKi8KLQotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2FkeCBfX2luaXRtdiA9IHsKLQkubXZfbnJfaXJxcwkJPSA0OCwKLQkubXZfaXNhX3BvcnQyYWRkcgk9IGFkeF9pc2FfcG9ydDJhZGRyLAotCS5tdl9pbml0X2lycQkJPSBpbml0X2FkeF9JUlEsCi19OwotQUxJQVNfTVYoYWR4KQotCi1pbnQgX19pbml0IHBsYXRmb3JtX3NldHVwKHZvaWQpCi17Ci0JLyogTm90aGluZyB0byBzZWUgaGVyZSAuLiAqLwotCXJldHVybiAwOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvaXJxLmMKaW5kZXggYWM5NDZhMi4uMWFiMDRkYSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2JpZ3N1ci9pcnEuYwpAQCAtMTksNiArMTksNyBAQAogICogSVJRIGZ1bmN0aW9ucyBmb3IgYSBIaXRhY2hpIEJpZyBTdXIgRXZhbHVhdGlvbiBCb2FyZC4KICAqCiAgKi8KKyN1bmRlZiBERUJVRwogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTQxLDEwICs0Miw4IEBACiAjdW5kZWYgQklHU1VSX0RFQlVHCiAKICNpZmRlZiBCSUdTVVJfREVCVUcKLSNkZWZpbmUgRFBSSU5USyhhcmdzLi4uKSAgICAgICAgcHJpbnRrKGFyZ3MpCiAjZGVmaW5lIERJUFJJTlRLKG4sIGFyZ3MuLi4pICAgIGlmIChCSUdTVVJfREVCVUc+KG4pKSBwcmludGsoYXJncykKICNlbHNlCi0jZGVmaW5lIERQUklOVEsoYXJncy4uLikKICNkZWZpbmUgRElQUklOVEsobiwgYXJncy4uLikKICNlbmRpZiAvKiBCSUdTVVJfREVCVUcgKi8KIApAQCAtNjAsNDUgKzU5LDM5IEBACiAvKiBMZXZlbCAxIElSUSByb3V0aW5lcyAqLwogc3RhdGljIHZvaWQgZGlzYWJsZV9iaWdzdXJfbDFpcnEodW5zaWduZWQgaW50IGlycSkKIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKICAgICAgICAgdW5zaWduZWQgY2hhciBtYXNrOwogICAgICAgICB1bnNpZ25lZCBpbnQgbWFza19wb3J0ID0gKChpcnEgLSBCSUdTVVJfSVJRX0xPVykvOCkgPyBCSUdTVVJfSVJMTVIxIDogQklHU1VSX0lSTE1SMDsKICAgICAgICAgdW5zaWduZWQgY2hhciBiaXQgPSAgKDEgPDwgKChpcnEgLSBNR0FURV9JUlFfTE9XKSU4KSApOwogCiAgICAgICAgIGlmKGlycSA+PSBCSUdTVVJfSVJRX0xPVyAmJiBpcnEgPCBCSUdTVVJfSVJRX0hJR0gpIHsKLSAgICAgICAgICAgICAgICBEUFJJTlRLKCJEaXNhYmxlIEwxIElSUSAlZFxuIiwgaXJxKTsKKyAgICAgICAgICAgICAgICBwcl9kZWJ1ZygiRGlzYWJsZSBMMSBJUlEgJWRcbiIsIGlycSk7CiAgICAgICAgICAgICAgICAgRElQUklOVEsoMiwiZGlzYWJsZV9iaWdzdXJfbDFpcnE6IElNUj0weCUwOHggbWFzaz0weCV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgbWFza19wb3J0LCBiaXQpOwotICAgICAgICAgICAgICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAogICAgICAgICAgICAgICAgIC8qIERpc2FibGUgSVJRIC0gc2V0IG1hc2sgYml0ICovCiAgICAgICAgICAgICAgICAgbWFzayA9IGluYihtYXNrX3BvcnQpIHwgYml0OwogICAgICAgICAgICAgICAgIG91dGIobWFzaywgbWFza19wb3J0KTsKLSAgICAgICAgICAgICAgICBsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIERQUklOVEsoImRpc2FibGVfYmlnc3VyX2wxaXJxOiBJbnZhbGlkIElSUSAlZFxuIiwgaXJxKTsKKyAgICAgICAgcHJfZGVidWcoImRpc2FibGVfYmlnc3VyX2wxaXJxOiBJbnZhbGlkIElSUSAlZFxuIiwgaXJxKTsKIH0KIAogc3RhdGljIHZvaWQgZW5hYmxlX2JpZ3N1cl9sMWlycSh1bnNpZ25lZCBpbnQgaXJxKQogewotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogICAgICAgICB1bnNpZ25lZCBjaGFyIG1hc2s7CiAgICAgICAgIHVuc2lnbmVkIGludCBtYXNrX3BvcnQgPSAoKGlycSAtIEJJR1NVUl9JUlFfTE9XKS84KSA/IEJJR1NVUl9JUkxNUjEgOiBCSUdTVVJfSVJMTVIwOwogICAgICAgICB1bnNpZ25lZCBjaGFyIGJpdCA9ICAoMSA8PCAoKGlycSAtIE1HQVRFX0lSUV9MT1cpJTgpICk7CiAKICAgICAgICAgaWYoaXJxID49IEJJR1NVUl9JUlFfTE9XICYmIGlycSA8IEJJR1NVUl9JUlFfSElHSCkgewotICAgICAgICAgICAgICAgIERQUklOVEsoIkVuYWJsZSBMMSBJUlEgJWRcbiIsIGlycSk7CisgICAgICAgICAgICAgICAgcHJfZGVidWcoIkVuYWJsZSBMMSBJUlEgJWRcbiIsIGlycSk7CiAgICAgICAgICAgICAgICAgRElQUklOVEsoMiwiZW5hYmxlX2JpZ3N1cl9sMWlycTogSU1SPTB4JTA4eCBtYXNrPTB4JXhcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3BvcnQsIGJpdCk7Ci0gICAgICAgICAgICAgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBMMSBJUlEgLSBjbGVhciBtYXNrIGJpdCAqLwogICAgICAgICAgICAgICAgIG1hc2sgPSBpbmIobWFza19wb3J0KSAmIH5iaXQ7CiAgICAgICAgICAgICAgICAgb3V0YihtYXNrLCBtYXNrX3BvcnQpOwotICAgICAgICAgICAgICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgRFBSSU5USygiZW5hYmxlX2JpZ3N1cl9sMWlycTogSW52YWxpZCBJUlEgJWRcbiIsIGlycSk7CisgICAgICAgIHByX2RlYnVnKCJlbmFibGVfYmlnc3VyX2wxaXJxOiBJbnZhbGlkIElSUSAlZFxuIiwgaXJxKTsKIH0KIAogCkBAIC0xMjYsNTEgKzExOSw0NSBAQAogLyogTGV2ZWwgMiBJUlEgcm91dGluZXMgKi8KIHN0YXRpYyB2b2lkIGRpc2FibGVfYmlnc3VyX2wyaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICAgICAgIHVuc2lnbmVkIGNoYXIgbWFzazsKICAgICAgICAgdW5zaWduZWQgY2hhciBiaXQgPSAxIDw8ICgoaXJxLUJJR1NVUl8yTkRMVkxfSVJRX0xPVyklOCk7CiAgICAgICAgIHVuc2lnbmVkIGludCBtYXNrX3BvcnQgPSBpbXJfYmFzZSAtIFJFR19OVU0oaXJxKSppbXJfb2Zmc2V0OwogCi0gICAgaWYoaXJxID49IEJJR1NVUl8yTkRMVkxfSVJRX0xPVyAmJiBpcnEgPCBCSUdTVVJfMk5ETFZMX0lSUV9ISUdIKSB7Ci0gICAgICAgICAgICAgICAgRFBSSU5USygiRGlzYWJsZSBMMiBJUlEgJWRcbiIsIGlycSk7CisJaWYoaXJxID49IEJJR1NVUl8yTkRMVkxfSVJRX0xPVyAmJiBpcnEgPCBCSUdTVVJfMk5ETFZMX0lSUV9ISUdIKSB7CisgICAgICAgICAgICAgICAgcHJfZGVidWcoIkRpc2FibGUgTDIgSVJRICVkXG4iLCBpcnEpOwogICAgICAgICAgICAgICAgIERJUFJJTlRLKDIsImRpc2FibGVfYmlnc3VyX2wyaXJxOiBJTVI9MHglMDh4IG1hc2s9MHgleFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfcG9ydCwgYml0KTsKLSAgICAgICAgICAgICAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKICAgICAgICAgICAgICAgICAvKiBEaXNhYmxlIEwyIElSUSAtIHNldCBtYXNrIGJpdCAqLwogICAgICAgICAgICAgICAgIG1hc2sgPSBpbmIobWFza19wb3J0KSB8IGJpdDsKICAgICAgICAgICAgICAgICBvdXRiKG1hc2ssIG1hc2tfcG9ydCk7Ci0gICAgICAgICAgICAgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBEUFJJTlRLKCJkaXNhYmxlX2JpZ3N1cl9sMmlycTogSW52YWxpZCBJUlEgJWRcbiIsIGlycSk7CisgICAgICAgIHByX2RlYnVnKCJkaXNhYmxlX2JpZ3N1cl9sMmlycTogSW52YWxpZCBJUlEgJWRcbiIsIGlycSk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9iaWdzdXJfbDJpcnEodW5zaWduZWQgaW50IGlycSkKIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKICAgICAgICAgdW5zaWduZWQgY2hhciBtYXNrOwogICAgICAgICB1bnNpZ25lZCBjaGFyIGJpdCA9IDEgPDwgKChpcnEtQklHU1VSXzJORExWTF9JUlFfTE9XKSU4KTsKICAgICAgICAgdW5zaWduZWQgaW50IG1hc2tfcG9ydCA9IGltcl9iYXNlIC0gUkVHX05VTShpcnEpKmltcl9vZmZzZXQ7CiAKLSAgICBpZihpcnEgPj0gQklHU1VSXzJORExWTF9JUlFfTE9XICYmIGlycSA8IEJJR1NVUl8yTkRMVkxfSVJRX0hJR0gpIHsKLSAgICAgICAgICAgICAgICBEUFJJTlRLKCJFbmFibGUgTDIgSVJRICVkXG4iLCBpcnEpOworCWlmKGlycSA+PSBCSUdTVVJfMk5ETFZMX0lSUV9MT1cgJiYgaXJxIDwgQklHU1VSXzJORExWTF9JUlFfSElHSCkgeworICAgICAgICAgICAgICAgIHByX2RlYnVnKCJFbmFibGUgTDIgSVJRICVkXG4iLCBpcnEpOwogICAgICAgICAgICAgICAgIERJUFJJTlRLKDIsImVuYWJsZV9iaWdzdXJfbDJpcnE6IElNUj0weCUwOHggbWFzaz0weCV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgbWFza19wb3J0LCBiaXQpOwotICAgICAgICAgICAgICAgIGxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAogICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBMMiBJUlEgLSBjbGVhciBtYXNrIGJpdCAqLwogICAgICAgICAgICAgICAgIG1hc2sgPSBpbmIobWFza19wb3J0KSAmIH5iaXQ7CiAgICAgICAgICAgICAgICAgb3V0YihtYXNrLCBtYXNrX3BvcnQpOwotICAgICAgICAgICAgICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgRFBSSU5USygiZW5hYmxlX2JpZ3N1cl9sMmlycTogSW52YWxpZCBJUlEgJWRcbiIsIGlycSk7CisgICAgICAgIHByX2RlYnVnKCJlbmFibGVfYmlnc3VyX2wyaXJxOiBJbnZhbGlkIElSUSAlZFxuIiwgaXJxKTsKIH0KIAogc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX2JpZ3N1cih1bnNpZ25lZCBpbnQgaXJxKQogewotICAgICAgICBEUFJJTlRLKCJtYXNrX2FuZF9hY2tfYmlnc3VyIElSUSAlZFxuIiwgaXJxKTsKKyAgICAgICAgcHJfZGVidWcoIm1hc2tfYW5kX2Fja19iaWdzdXIgSVJRICVkXG4iLCBpcnEpOwogICAgICAgICBpZihpcnEgPj0gQklHU1VSX0lSUV9MT1cgJiYgaXJxIDwgQklHU1VSX0lSUV9ISUdIKQogICAgICAgICAgICAgICAgIGRpc2FibGVfYmlnc3VyX2wxaXJxKGlycSk7CiAgICAgICAgIGVsc2UKQEAgLTE3OSw3ICsxNjYsNyBAQAogCiBzdGF0aWMgdm9pZCBlbmRfYmlnc3VyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotICAgICAgICBEUFJJTlRLKCJlbmRfYmlnc3VyX2lycSBJUlEgJWRcbiIsIGlycSk7CisgICAgICAgIHByX2RlYnVnKCJlbmRfYmlnc3VyX2lycSBJUlEgJWRcbiIsIGlycSk7CiAgICAgICAgIGlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKSB7CiAgICAgICAgICAgICAgICAgaWYoaXJxID49IEJJR1NVUl9JUlFfTE9XICYmIGlycSA8IEJJR1NVUl9JUlFfSElHSCkKICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZV9iaWdzdXJfbDFpcnEoaXJxKTsKQEAgLTE5Myw3ICsxODAsNyBAQAogICAgICAgICB1OCBtYXNrOwogICAgICAgICB1MzIgcmVnOwogCi0gICAgICAgIERQUklOVEsoInN0YXJ0dXBfYmlnc3VyX2lycSBJUlEgJWRcbiIsIGlycSk7CisgICAgICAgIHByX2RlYnVnKCJzdGFydHVwX2JpZ3N1cl9pcnEgSVJRICVkXG4iLCBpcnEpOwogCiAgICAgICAgIGlmKGlycSA+PSBCSUdTVVJfSVJRX0xPVyAmJiBpcnEgPCBCSUdTVVJfSVJRX0hJR0gpIHsKICAgICAgICAgICAgICAgICAvKiBFbmFibGUgdGhlIEwxIElSUSAqLwpAQCAtMjE4LDcgKzIwNSw3IEBACiAKIHN0YXRpYyB2b2lkIHNodXRkb3duX2JpZ3N1cl9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLSAgICAgICAgRFBSSU5USygic2h1dGRvd25fYmlnc3VyX2lycSBJUlEgJWRcbiIsIGlycSk7CisgICAgICAgIHByX2RlYnVnKCJzaHV0ZG93bl9iaWdzdXJfaXJxIElSUSAlZFxuIiwgaXJxKTsKICAgICAgICAgaWYoaXJxID49IEJJR1NVUl9JUlFfTE9XICYmIGlycSA8IEJJR1NVUl9JUlFfSElHSCkKICAgICAgICAgICAgICAgICBkaXNhYmxlX2JpZ3N1cl9sMWlycShpcnEpOwogICAgICAgICBlbHNlCkBAIC0yNjAsNyArMjQ3LDcgQEAKICAgICAgICAgICAgICAgICBkaXNhYmxlX2JpZ3N1cl9sMWlycShpcnEpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBEUFJJTlRLKCJtYWtlX2JpZ3N1cl9sMWlzcjogYmFkIGlycSwgJWRcbiIsIGlycSk7CisgICAgICAgIHByX2RlYnVnKCJtYWtlX2JpZ3N1cl9sMWlzcjogYmFkIGlycSwgJWRcbiIsIGlycSk7CiAgICAgICAgIHJldHVybjsKIH0KIApAQCAtMjc3LDcgKzI2NCw3IEBACiAgICAgICAgICAgICAgICAgZGlzYWJsZV9iaWdzdXJfbDJpcnEoaXJxKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgRFBSSU5USygibWFrZV9iaWdzdXJfbDJpc3I6IGJhZCBpcnEsICVkXG4iLCBpcnEpOworICAgICAgICBwcl9kZWJ1ZygibWFrZV9iaWdzdXJfbDJpc3I6IGJhZCBpcnEsICVkXG4iLCBpcnEpOwogICAgICAgICByZXR1cm47CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2JpZ3N1ci9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL3NldHVwLmMKaW5kZXggZGZlZWRlOS4uOTcxMWMyMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL3NldHVwLmMKQEAgLTQxLDMxICs0MSw3IEBACiAvLwkJQmlnIFN1ciBJbml0IFJvdXRpbmVzCQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLWNvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQotewotCXJldHVybiAiQmlnIFN1ciI7Ci19Ci0KLS8qCi0gKiBUaGUgTWFjaGluZSBWZWN0b3IKLSAqLwotZXh0ZXJuIHZvaWQgaGVhcnRiZWF0X2JpZ3N1cih2b2lkKTsKLWV4dGVybiB2b2lkIGluaXRfYmlnc3VyX0lSUSh2b2lkKTsKLQotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2JpZ3N1ciBfX2luaXRtdiA9IHsKLQkubXZfbnJfaXJxcwkJPSBOUl9JUlFTLCAgICAgLy8gRGVmaW5lZCBpbiA8YXNtL2lycS5oPgotCi0JLm12X2lzYV9wb3J0MmFkZHIJPSBiaWdzdXJfaXNhX3BvcnQyYWRkciwKLQkubXZfaXJxX2RlbXV4ICAgICAgIAk9IGJpZ3N1cl9pcnFfZGVtdXgsCi0KLQkubXZfaW5pdF9pcnEJCT0gaW5pdF9iaWdzdXJfSVJRLAotI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKLQkubXZfaGVhcnRiZWF0CQk9IGhlYXJ0YmVhdF9iaWdzdXIsCi0jZW5kaWYKLX07Ci1BTElBU19NVihiaWdzdXIpCi0KLWludCBfX2luaXQgcGxhdGZvcm1fc2V0dXAodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBiaWdzdXJfc2V0dXAoY2hhciAqKmNtZGxpbmVfcCkKIHsKIAkvKiBNYXNrIGFsbCAybmQgbGV2ZWwgSVJRJ3MgKi8KIAlvdXRiKC0xLEJJR1NVUl9JTVIwKTsKQEAgLTg5LDcgKzY1LDI0IEBACiAJb3V0dygxLCBCSUdTVVJfRVRIUisweGUpOwogCS8qIHNldCB0aGUgSU8gcG9ydCB0byBCSUdTVVJfRVRIRVJfSU9QT1JUICovCiAJb3V0dyhCSUdTVVJfRVRIRVJfSU9QT1JUPDwzLCBCSUdTVVJfRVRIUisweDIpOwotCi0JcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBUaGUgTWFjaGluZSBWZWN0b3IKKyAqLworZXh0ZXJuIHZvaWQgaGVhcnRiZWF0X2JpZ3N1cih2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRfYmlnc3VyX0lSUSh2b2lkKTsKKworc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2JpZ3N1ciBfX2luaXRtdiA9IHsKKwkubXZfbmFtZQkJPSAiQmlnIFN1ciIsCisJLm12X3NldHVwCQk9IGJpZ3N1cl9zZXR1cCwKKworCS5tdl9pc2FfcG9ydDJhZGRyCT0gYmlnc3VyX2lzYV9wb3J0MmFkZHIsCisJLm12X2lycV9kZW11eCAgICAgICAJPSBiaWdzdXJfaXJxX2RlbXV4LAorCisJLm12X2luaXRfaXJxCQk9IGluaXRfYmlnc3VyX0lSUSwKKyNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCisJLm12X2hlYXJ0YmVhdAkJPSBoZWFydGJlYXRfYmlnc3VyLAorI2VuZGlmCit9OworQUxJQVNfTVYoYmlnc3VyKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvY2F0Njg3MDEvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9jYXQ2ODcwMS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJjMWRlMC4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9jYXQ2ODcwMS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdGhlIENBVC02ODcwMSBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUga2VybmVsCi0jCi0KLW9iai15CSA6PSBzZXR1cC5vIGlycS5vCi0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2NhdDY4NzAxL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvY2F0Njg3MDEvaXJxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YTZkMTguLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvY2F0Njg3MDEvaXJxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvY2F0Njg3MDEvaXJxLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgIE5paWJlIFl1dGFrYQotICogICAgICAgICAgICAgICAyMDAxICBZdXRhcm8gRWJpaGFyYQotICoKLSAqIFNldHVwIHJvdXRpbmVzIGZvciBBLU9ORSBDb3JwIENBVC02ODcwMSBTSDc3MDggQm9hcmQKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLQotaW50IGNhdDY4NzAxX2lycV9kZW11eChpbnQgaXJxKQotewotICAgICAgICBpZihpcnE9PTEzKSByZXR1cm4gMTQ7Ci0gICAgICAgIGlmKGlycT09NykgIHJldHVybiAxMDsKLSAgICAgICAgcmV0dXJuIGlycTsKLX0KLQotdm9pZCBpbml0X2NhdDY4NzAxX0lSUSgpCi17Ci0gICAgICAgIG1ha2VfaW1hc2tfaXJxKDEwKTsKLSAgICAgICAgbWFrZV9pbWFza19pcnEoMTQpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvY2F0Njg3MDEvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL2NhdDY4NzAxL3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZTUxNzUuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvY2F0Njg3MDEvc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qIAotICogbGludXgvYXJjaC9zaC9ib2FyZHMvY2F0Njg3MDEvc2V0dXAuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAgTmlpYmUgWXV0YWthCi0gKiAgICAgICAgICAgICAgIDIwMDEgIFl1dGFybyBFYmloYXJhCi0gKgotICogU2V0dXAgcm91dGluZXMgZm9yIEEtT05FIENvcnAgQ0FULTY4NzAxIFNINzcwOCBCb2FyZAotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKLXsKLQlyZXR1cm4gIkNBVC02ODcwMSI7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi12b2lkIGhlYXJ0YmVhdF9jYXQ2ODcwMSgpCi17Ci0gICAgICAgIHN0YXRpYyB1bnNpZ25lZCBpbnQgY250ID0gMCwgcGVyaW9kID0gMCAsIGJpdCA9IDA7Ci0gICAgICAgIGNudCArPSAxOwotICAgICAgICBpZiAoY250IDwgcGVyaW9kKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNudCA9IDA7Ci0KLSAgICAgICAgLyogR28gdGhyb3VnaCB0aGUgcG9pbnRzIChyb3VnaGx5ISk6Ci0gICAgICAgICAqIGYoMCk9MTAsIGYoMSk9MTYsIGYoMik9MjAsIGYoNSk9MzUsZihpbmYpLT4xMTAKLSAgICAgICAgICovCi0gICAgICAgIHBlcmlvZCA9IDExMCAtICggKDMwMDw8RlNISUZUKS8KLSAgICAgICAgICAgICAgICAgICAgICAgICAoKGF2ZW5ydW5bMF0vNSkgKyAoMzw8RlNISUZUKSkgKTsKLQotCWlmKGJpdCl7IGJpdD0wOyB9ZWxzZXsgYml0PTE7IH0KLQlvdXR3KGJpdDw8MTUsMHgzZmUpOwotfQotI2VuZGlmIC8qIENPTkZJR19IRUFSVEJFQVQgKi8KLQotdW5zaWduZWQgbG9uZyBjYXQ2ODcwMV9pc2FfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQotewotCS8qIENvbXBhY3RGbGFzaCAoSURFKSAqLwotCWlmICgoKG9mZnNldCA+PSAweDFmMCkgJiYgKG9mZnNldCA8PSAweDFmNykpIHx8IChvZmZzZXQ9PTB4M2Y2KSkKLQkJcmV0dXJuIDB4YmEwMDAwMDAgKyBvZmZzZXQ7Ci0KLQkvKiBJTlBVVCBQT1JUICovCi0JaWYgKChvZmZzZXQgPj0gMHgzZmMpICYmIChvZmZzZXQgPD0gMHgzZmQpKQotCQlyZXR1cm4gMHhiNDAwNzAwMCArIG9mZnNldDsKLQotCS8qIE9VVFBVVCBQT1JUICovCi0JaWYgKChvZmZzZXQgPj0gMHgzZmUpICYmIChvZmZzZXQgPD0gMHgzZmYpKQotCQlyZXR1cm4gMHhiNDAwNzQwMCArIG9mZnNldDsKLQotCXJldHVybiBvZmZzZXQgKyAweGI0MDAwMDAwOyAvKiBvdGhlciBJL08gKEVSRUEgNSkqLwotfQotCi0vKgotICogVGhlIE1hY2hpbmUgVmVjdG9yCi0gKi8KLQotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2NhdDY4NzAxIF9faW5pdG12ID0gewotCS5tdl9ucl9pcnFzCQk9IDMyLAotCS5tdl9pc2FfcG9ydDJhZGRyCT0gY2F0Njg3MDFfaXNhX3BvcnQyYWRkciwKLQkubXZfaXJxX2RlbXV4CQk9IGNhdDY4NzAxX2lycV9kZW11eCwKLQotCS5tdl9pbml0X2lycQkJPSBpbml0X2NhdDY4NzAxX0lSUSwKLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0JLm12X2hlYXJ0YmVhdAkJPSBoZWFydGJlYXRfY2F0Njg3MDEsCi0jZW5kaWYKLX07Ci1BTElBU19NVihjYXQ2ODcwMSkKLQotaW50IF9faW5pdCBwbGF0Zm9ybV9zZXR1cCh2b2lkKQotewotCS8qIGR1bW15IHJlYWQgZXJlYTUgKENTODkwMEEpICovCi19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2NxcmVlay9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL2NxcmVlay9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3ODhhOC4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9jcXJlZWsvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBDcVJFRUsgc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbAotIwotCi1vYmoteQkgOj0gc2V0dXAubyBpcnEubwotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9jcXJlZWsvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9jcXJlZWsvaXJxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NTVhZGMuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvY3FyZWVrL2lycS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qICRJZDogaXJxLmMsdiAxLjEuMi40IDIwMDIvMTEvMDQgMjA6MzM6NTYgbGV0aGFsIEV4cCAkCi0gKgotICogYXJjaC9zaC9ib2FyZHMvY3FyZWVrL2lycS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwICBOaWliZSBZdXRha2EKLSAqCi0gKiBDcVJFRUsgSURFL0lTQSBCcmlkZ2UgU3VwcG9ydC4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPGFzbS9jcXJlZWsvY3FyZWVrLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lvX2dlbmVyaWMuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlY19pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL3J0Yy5oPgotCi1zdHJ1Y3QgY3FyZWVrX2lycV9kYXRhIHsKLQl1bnNpZ25lZCBzaG9ydCBtYXNrX3BvcnQ7CS8qIFBvcnQgb2YgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLQl1bnNpZ25lZCBzaG9ydCBzdGF0X3BvcnQ7CS8qIFBvcnQgb2YgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLwotCXVuc2lnbmVkIHNob3J0IGJpdDsJCS8qIFZhbHVlIG9mIHRoZSBiaXQgKi8KLX07Ci1zdGF0aWMgc3RydWN0IGNxcmVla19pcnFfZGF0YSBjcXJlZWtfaXJxX2RhdGFbTlJfSVJRU107Ci0KLXN0YXRpYyB2b2lkIGRpc2FibGVfY3FyZWVrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgc2hvcnQgbWFzazsKLQl1bnNpZ25lZCBzaG9ydCBtYXNrX3BvcnQgPSBjcXJlZWtfaXJxX2RhdGFbaXJxXS5tYXNrX3BvcnQ7Ci0JdW5zaWduZWQgc2hvcnQgYml0ID0gY3FyZWVrX2lycV9kYXRhW2lycV0uYml0OwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCS8qIERpc2FibGUgSVJRICovCi0JbWFzayA9IGludyhtYXNrX3BvcnQpICYgfmJpdDsKLQlvdXR3X3AobWFzaywgbWFza19wb3J0KTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9jcXJlZWtfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBzaG9ydCBtYXNrOwotCXVuc2lnbmVkIHNob3J0IG1hc2tfcG9ydCA9IGNxcmVla19pcnFfZGF0YVtpcnFdLm1hc2tfcG9ydDsKLQl1bnNpZ25lZCBzaG9ydCBiaXQgPSBjcXJlZWtfaXJxX2RhdGFbaXJxXS5iaXQ7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JLyogRW5hYmxlIElSUSAqLwotCW1hc2sgPSBpbncobWFza19wb3J0KSB8IGJpdDsKLQlvdXR3X3AobWFzaywgbWFza19wb3J0KTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19jcXJlZWsodW5zaWduZWQgaW50IGlycSkKLXsKLQl1bnNpZ25lZCBzaG9ydCBzdGF0X3BvcnQgPSBjcXJlZWtfaXJxX2RhdGFbaXJxXS5zdGF0X3BvcnQ7Ci0JdW5zaWduZWQgc2hvcnQgYml0ID0gY3FyZWVrX2lycV9kYXRhW2lycV0uYml0OwotCi0JZGlzYWJsZV9jcXJlZWtfaXJxKGlycSk7Ci0JLyogQ2xlYXIgSVJRIChpdCBtaWdodCBiZSBlZGdlIElSUSkgKi8KLQlpbncoc3RhdF9wb3J0KTsKLQlvdXR3X3AoYml0LCBzdGF0X3BvcnQpOwotfQotCi1zdGF0aWMgdm9pZCBlbmRfY3FyZWVrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQotCQllbmFibGVfY3FyZWVrX2lycShpcnEpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfY3FyZWVrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoteyAKLQllbmFibGVfY3FyZWVrX2lycShpcnEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzaHV0ZG93bl9jcXJlZWtfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZGlzYWJsZV9jcXJlZWtfaXJxKGlycSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgY3FyZWVrX2lycV90eXBlID0gewotCS50eXBlbmFtZSA9ICJDcVJFRUstSVJRIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfY3FyZWVrX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9jcXJlZWtfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfY3FyZWVrX2lycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfY3FyZWVrX2lycSwKLQkuYWNrID0gbWFza19hbmRfYWNrX2NxcmVlaywKLQkuZW5kID0gZW5kX2NxcmVla19pcnEKLX07Ci0KLWludCBjcXJlZWtfaGFzX2lkZSwgY3FyZWVrX2hhc19pc2E7Ci0KLS8qIFhYWDogVGhpcyBpcyBqdXN0IGZvciB0ZXN0IGZvciBteSBORTIwMDAgSVNBIGJvYXJkCi0gICBXaGF0IHdlIHJlYWxseSBuZWVkIGlzIHZpcnR1YWxpemVkIElSUSBhbmQgZGVtdWx0aXBsZXhlciBsaWtlIEhQNjAwIHBvcnQgKi8KLXZvaWQgX19pbml0IGluaXRfY3FyZWVrX0lSUSh2b2lkKQotewotCWlmIChjcXJlZWtfaGFzX2lkZSkgewotCQljcXJlZWtfaXJxX2RhdGFbMTRdLm1hc2tfcG9ydCA9IEJSSURHRV9JREVfSU5UUl9NQVNLOwotCQljcXJlZWtfaXJxX2RhdGFbMTRdLnN0YXRfcG9ydCA9IEJSSURHRV9JREVfSU5UUl9TVEFUOwotCQljcXJlZWtfaXJxX2RhdGFbMTRdLmJpdCA9IDE7Ci0KLQkJaXJxX2Rlc2NbMTRdLmNoaXAgPSAmY3FyZWVrX2lycV90eXBlOwotCQlpcnFfZGVzY1sxNF0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlpcnFfZGVzY1sxNF0uYWN0aW9uID0gMDsKLQkJaXJxX2Rlc2NbMTRdLmRlcHRoID0gMTsKLQotCQlkaXNhYmxlX2NxcmVla19pcnEoMTQpOwotCX0KLQotCWlmIChjcXJlZWtfaGFzX2lzYSkgewotCQljcXJlZWtfaXJxX2RhdGFbMTBdLm1hc2tfcG9ydCA9IEJSSURHRV9JU0FfSU5UUl9NQVNLOwotCQljcXJlZWtfaXJxX2RhdGFbMTBdLnN0YXRfcG9ydCA9IEJSSURHRV9JU0FfSU5UUl9TVEFUOwotCQljcXJlZWtfaXJxX2RhdGFbMTBdLmJpdCA9ICgxIDw8IDEwKTsKLQotCQkvKiBYWFg6IEVyci4uLiB3ZSBtYXkgbmVlZCBkZW11bHRpcGxleGVyIGZvciBJU0EgaXJxLi4uICovCi0JCWlycV9kZXNjWzEwXS5jaGlwID0gJmNxcmVla19pcnFfdHlwZTsKLQkJaXJxX2Rlc2NbMTBdLnN0YXR1cyA9IElSUV9ESVNBQkxFRDsKLQkJaXJxX2Rlc2NbMTBdLmFjdGlvbiA9IDA7Ci0JCWlycV9kZXNjWzEwXS5kZXB0aCA9IDE7Ci0KLQkJZGlzYWJsZV9jcXJlZWtfaXJxKDEwKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2NxcmVlay9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvY3FyZWVrL3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZjRlZDkuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvY3FyZWVrL3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyogJElkOiBzZXR1cC5jLHYgMS41IDIwMDMvMDgvMDQgMDE6NTE6NTggbGV0aGFsIEV4cCAkCi0gKgotICogYXJjaC9zaC9rZXJuZWwvc2V0dXBfY3FyZWVrLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgIE5paWJlIFl1dGFrYQotICoKLSAqIENxUkVFSyBJREUvSVNBIEJyaWRnZSBTdXBwb3J0LgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2gvY3FyZWVrLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaW9fZ2VuZXJpYy5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vcnRjLmg+Ci0KLSNkZWZpbmUgSURFX09GRlNFVCAweEE0MDAwMDAwVUwKLSNkZWZpbmUgSVNBX09GRlNFVCAweEE0QTAwMDAwVUwKLQotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICJDcVJFRUsiOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjcXJlZWtfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgcG9ydCkKLXsKLQlpZiAoMHgwMDAwPD1wb3J0ICYmIHBvcnQ8PTB4MDA0MCkKLQkJcmV0dXJuIElERV9PRkZTRVQgKyBwb3J0OwotCWlmICgoMHgwMWYwPD1wb3J0ICYmIHBvcnQ8PTB4MDFmNykgfHwgcG9ydCA9PSAweDAzZjYpCi0JCXJldHVybiBJREVfT0ZGU0VUICsgcG9ydDsKLQotCXJldHVybiBJU0FfT0ZGU0VUICsgcG9ydDsKLX0KLQotLyoKLSAqIFRoZSBNYWNoaW5lIFZlY3RvcgotICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfY3FyZWVrIF9faW5pdG12ID0gewotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpCi0JLm12X25yX2lycXMJCT0gNDgsCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDgpCi0JLm12X25yX2lycXMJCT0gMzIsCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpCi0JLm12X25yX2lycXMJCT0gNjEsCi0jZW5kaWYKLQotCS5tdl9pbml0X2lycQkJPSBpbml0X2NxcmVla19JUlEsCi0KLQkubXZfaXNhX3BvcnQyYWRkcgk9IGNxcmVla19wb3J0MmFkZHIsCi19OwotQUxJQVNfTVYoY3FyZWVrKQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgYm9hcmQKLSAqLwotdm9pZCBfX2luaXQgcGxhdGZvcm1fc2V0dXAodm9pZCkKLXsKLQlpbnQgaTsKLS8qIHVkZWxheSBpcyBub3QgYXZhaWxhYmxlIGF0IHNldHVwIHRpbWUgeWV0Li4uICovCi0jZGVmaW5lIERFTEFZKCkgZG8ge2ZvciAoaT0wOyBpPDEwMDAwOyBpKyspIGN0cmxfaW53KDB4YTAwMDAwMDApO30gd2hpbGUoMCkKLQotCWlmICgoaW53IChCUklER0VfRkVBVFVSRSkgJiAxKSkgeyAvKiBXZSBoYXZlIElERSBpbnRlcmZhY2UgKi8KLQkJb3V0d19wKDAsIEJSSURHRV9JREVfSU5UUl9MVkwpOwotCQlvdXR3X3AoMCwgQlJJREdFX0lERV9JTlRSX01BU0spOwotCi0JCW91dHdfcCgwLCBCUklER0VfSURFX0NUUkwpOwotCQlERUxBWSgpOwotCi0JCW91dHdfcCgweDgwMDAsIEJSSURHRV9JREVfQ1RSTCk7Ci0JCURFTEFZKCk7Ci0KLQkJb3V0d19wKDB4ZmZmZiwgQlJJREdFX0lERV9JTlRSX1NUQVQpOyAvKiBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCi0JCW91dHdfcCgweDBmLTE0LCBCUklER0VfSURFX0lOVFJfTFZMKTsgLyogVXNlIDE0IElQUiAqLwotCQlvdXR3X3AoMSwgQlJJREdFX0lERV9JTlRSX01BU0spOyAvKiBFbmFibGUgaW50ZXJydXB0ICovCi0JCWNxcmVla19oYXNfaWRlPTE7Ci0JfQotCi0JaWYgKChpbncgKEJSSURHRV9GRUFUVVJFKSAmIDIpKSB7IC8qIFdlIGhhdmUgSVNBIGludGVyZmFjZSAqLwotCQlvdXR3X3AoMCwgQlJJREdFX0lTQV9JTlRSX0xWTCk7Ci0JCW91dHdfcCgwLCBCUklER0VfSVNBX0lOVFJfTUFTSyk7Ci0KLQkJb3V0d19wKDAsIEJSSURHRV9JU0FfQ1RSTCk7Ci0JCURFTEFZKCk7Ci0JCW91dHdfcCgweDgwMDAsIEJSSURHRV9JU0FfQ1RSTCk7Ci0JCURFTEFZKCk7Ci0KLQkJb3V0d19wKDB4ZmZmZiwgQlJJREdFX0lTQV9JTlRSX1NUQVQpOyAvKiBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCi0JCW91dHdfcCgweDBmLTEwLCBCUklER0VfSVNBX0lOVFJfTFZMKTsgLyogVXNlIDEwIElQUiAqLwotCQlvdXR3X3AoMHhmZmY4LCBCUklER0VfSVNBX0lOVFJfTUFTSyk7IC8qIEVuYWJsZSBpbnRlcnJ1cHQgKi8KLQkJY3FyZWVrX2hhc19pc2E9MTsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJDcVJFRUsgU2V0dXAgKElERT0lZCwgSVNBPSVkKS4uLmRvbmVcbiIsIGNxcmVla19oYXNfaWRlLCBjcXJlZWtfaGFzX2lzYSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2RtaWRhL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvZG1pZGEvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OTk5YWEuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvZG1pZGEvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMKLSMgTWFrZWZpbGUgZm9yIHRoZSBEYXRhTXl0ZSBJbmR1c3RyaWFsIERpZ2l0YWwgQXNzaXN0YW50KHRtKSBzcGVjaWZpYyBwYXJ0cwotIyBvZiB0aGUga2VybmVsCi0jCi0KLW9iai15CSA6PSBtYWNoLm8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvZG1pZGEvbWFjaC5jIGIvYXJjaC9zaC9ib2FyZHMvZG1pZGEvbWFjaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDNhMjVmOS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9kbWlkYS9tYWNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvZG1pZGEvbWFjaC5jCi0gKgotICogYnkgR3JlZyBCYW5rcyA8Z2JhbmtzQHBvY2tldHBlbmd1aW5zLmNvbT4KLSAqIChjKSAyMDAwIFBvY2tldFBlbmd1aW5zIEluYwotICoKLSAqIERlcml2ZWQgZnJvbSBtYWNoX2hwNjAwLmMsIHdoaWNoIGJvcmUgdGhlIG1lc3NhZ2U6Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3R1YXJ0IE1lbmVmeSAoc3R1YXJ0Lm1lbmVmeUBzdC5jb20pCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIE1hY2hpbmUgdmVjdG9yIGZvciB0aGUgRGF0YU15dGUgSW5kdXN0cmlhbCBEaWdpdGFsIEFzc2lzdGFudCh0bSkuCi0gKiBTZWUgaHR0cDovL3d3dy5kbWlkYS5jb20KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0jaW5jbHVkZSA8YXNtL3J0Yy5oPgotI2luY2x1ZGUgPGFzbS9tYWNodmVjX2luaXQuaD4KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9oZDY0NDY1L2hkNjQ0NjUuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLS8qCi0gKiBUaGUgTWFjaGluZSBWZWN0b3IKLSAqLwotCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfZG1pZGEgX19pbml0bXYgPSB7Ci0JLm12X25yX2lycXMJCT0gSEQ2NDQ2NV9JUlFfQkFTRStIRDY0NDY1X0lSUV9OVU0sCi0KLQkubXZfaW5iCQkJPSBoZDY0NDY1X2luYiwKLQkubXZfaW53CQkJPSBoZDY0NDY1X2ludywKLQkubXZfaW5sCQkJPSBoZDY0NDY1X2lubCwKLQkubXZfb3V0YgkJPSBoZDY0NDY1X291dGIsCi0JLm12X291dHcJCT0gaGQ2NDQ2NV9vdXR3LAotCS5tdl9vdXRsCQk9IGhkNjQ0NjVfb3V0bCwKLQotCS5tdl9pbmJfcAkJPSBoZDY0NDY1X2luYl9wLAotCS5tdl9pbndfcAkJPSBoZDY0NDY1X2ludywKLQkubXZfaW5sX3AJCT0gaGQ2NDQ2NV9pbmwsCi0JLm12X291dGJfcAkJPSBoZDY0NDY1X291dGJfcCwKLQkubXZfb3V0d19wCQk9IGhkNjQ0NjVfb3V0dywKLQkubXZfb3V0bF9wCQk9IGhkNjQ0NjVfb3V0bCwKLQotCS5tdl9pbnNiCQk9IGhkNjQ0NjVfaW5zYiwKLQkubXZfaW5zdwkJPSBoZDY0NDY1X2luc3csCi0JLm12X2luc2wJCT0gaGQ2NDQ2NV9pbnNsLAotCS5tdl9vdXRzYgkJPSBoZDY0NDY1X291dHNiLAotCS5tdl9vdXRzdwkJPSBoZDY0NDY1X291dHN3LAotCS5tdl9vdXRzbAkJPSBoZDY0NDY1X291dHNsLAotCi0JLm12X2lycV9kZW11eAkJPSBoZDY0NDY1X2lycV9kZW11eCwKLX07Ci1BTElBU19NVihkbWlkYSkKLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvZHJlYW1jYXN0L2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvZHJlYW1jYXN0L2lycS5jCmluZGV4IGIxMGE2YjEuLjViZjAxZjggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2RyZWFtY2FzdC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3QvaXJxLmMKQEAgLTEwLDcgKzEwLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2RyZWFtY2FzdC9zeXNhc2ljLmg+CkBAIC0yNiwxMCArMjUsMTAgQEAKICAgIGV2ZW50LgogCiAgICBUaGVyZSBhcmUgdGhyZWUgMzItYml0IEVTUnMgbG9jYXRlZCBhdCAweGEwNWY4OTAwIC0gMHhhMDVmNjkwOC4gIEV2ZW50Ci0gICB0eXBlcyBjYW4gYmUgZm91bmQgaW4gaW5jbHVkZS9hc20tc2gvZGNfc3lzYXNpYy5oLiAgVGhlcmUgYXJlIHRocmVlIGdyb3VwcwotICAgb2YgRU1ScyB0aGF0IHBhcmFsbGVsIHRoZSBFU1JzLiAgRWFjaCBFTVIgZ3JvdXAgY29ycmVzcG9uZHMgdG8gYW4gSVJRLCBzbwotICAgMHhhMDVmNjkxMCAtIDB4YTA1ZjY5MTggdHJpZ2dlcnMgSVJRIDEzLCAweGEwNWY2OTIwIC0gMHhhMDVmNjkyOCB0cmlnZ2VycwotICAgSVJRIDExLCBhbmQgMHhhMDVmNjkzMCAtIDB4YTA1ZjY5MzggdHJpZ2dlcnMgSVJRIDkuCisgICB0eXBlcyBjYW4gYmUgZm91bmQgaW4gaW5jbHVkZS9hc20tc2gvZHJlYW1jYXN0L3N5c2FzaWMuaC4gVGhlcmUgYXJlIHRocmVlCisgICBncm91cHMgb2YgRU1ScyB0aGF0IHBhcmFsbGVsIHRoZSBFU1JzLiAgRWFjaCBFTVIgZ3JvdXAgY29ycmVzcG9uZHMgdG8gYW4KKyAgIElSUSwgc28gMHhhMDVmNjkxMCAtIDB4YTA1ZjY5MTggdHJpZ2dlcnMgSVJRIDEzLCAweGEwNWY2OTIwIC0gMHhhMDVmNjkyOAorICAgdHJpZ2dlcnMgSVJRIDExLCBhbmQgMHhhMDVmNjkzMCAtIDB4YTA1ZjY5MzggdHJpZ2dlcnMgSVJRIDkuCiAKICAgIEluIHRoZSBrZXJuZWwsIHRoZXNlIGV2ZW50cyBhcmUgbWFwcGVkIHRvIHZpcnR1YWwgSVJRcyBzbyB0aGF0IGRyaXZlcnMgY2FuCiAgICByZXNwb25kIHRvIHRoZW0gYXMgdGhleSB3b3VsZCBhIG5vcm1hbCBpbnRlcnJ1cHQuICBJbiBvcmRlciB0byBrZWVwIHRoaXMKQEAgLTU3LDI5ICs1NiwyMyBAQAogLyogRGlzYWJsZSB0aGUgaGFyZHdhcmUgZXZlbnQgYnkgbWFza2luZyBpdHMgYml0IGluIGl0cyBFTVIgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX3N5c3RlbWFzaWNfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICAgICAgIF9fdTMyIGVtciA9IEVNUl9CQVNFICsgKExFVkVMKGlycSkgPDwgNCkgKyAoTEVWRUwoaXJxKSA8PCAyKTsKICAgICAgICAgX191MzIgbWFzazsKIAotICAgICAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAgICAgICAgIG1hc2sgPSBpbmwoZW1yKTsKICAgICAgICAgbWFzayAmPSB+KDEgPDwgRVZFTlRfQklUKGlycSkpOwogICAgICAgICBvdXRsKG1hc2ssIGVtcik7Ci0gICAgICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogLyogRW5hYmxlIHRoZSBoYXJkd2FyZSBldmVudCBieSBzZXR0aW5nIGl0cyBiaXQgaW4gaXRzIEVNUiAqLwogc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9zeXN0ZW1hc2ljX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogICAgICAgICBfX3UzMiBlbXIgPSBFTVJfQkFTRSArIChMRVZFTChpcnEpIDw8IDQpICsgKExFVkVMKGlycSkgPDwgMik7CiAgICAgICAgIF9fdTMyIG1hc2s7CiAKLSAgICAgICAgbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogICAgICAgICBtYXNrID0gaW5sKGVtcik7CiAgICAgICAgIG1hc2sgfD0gKDEgPDwgRVZFTlRfQklUKGlycSkpOwogICAgICAgICBvdXRsKG1hc2ssIGVtcik7Ci0gICAgICAgIGxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogLyogQWNrbm93bGVkZ2UgYSBoYXJkd2FyZSBldmVudCBieSB3cml0aW5nIGl0cyBiaXQgYmFjayB0byBpdHMgRVNSICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3QvcnRjLmMgYi9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3QvcnRjLmMKaW5kZXggMzc5ZGUxNi4uYjNhODc2YSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvZHJlYW1jYXN0L3J0Yy5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2RyZWFtY2FzdC9ydGMuYwpAQCAtMSw0ICsxLDUgQEAKLS8qIGFyY2gvc2gva2VybmVsL3J0Yy1haWNhLmMKKy8qCisgKiBhcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3QvcnRjLmMKICAqCiAgKiBEcmVhbWNhc3QgQUlDQSBSVEMgcm91dGluZXMuCiAgKgpAQCAtMTAsMTUgKzExLDEyIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLQorI2luY2x1ZGUgPGFzbS9ydGMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotZXh0ZXJuIHZvaWQgKCpydGNfZ2V0X3RpbWUpKHN0cnVjdCB0aW1lc3BlYyAqKTsKLWV4dGVybiBpbnQgKCpydGNfc2V0X3RpbWUpKGNvbnN0IHRpbWVfdCk7Ci0KIC8qIFRoZSBBSUNBIFJUQyBoYXMgYW4gRXBvY2ggb2YgMS8xLzE5NTAsIHNvIHdlIG11c3Qgc3VidHJhY3QgMjAgeWVhcnMgKGluCi0gICBzZWNvbmRzIHRvIGdldCB0aGUgc3RhbmRhcmQgVW5peCBFcG9jaCB3aGVuIGdldHRpbmcgdGhlIHRpbWUsIGFuZCBhZGQgMjAKLSAgIHllYXJzIHdoZW4gc2V0dGluZyB0aGUgdGltZS4gKi8KKyAgIHNlY29uZHMpIHRvIGdldCB0aGUgc3RhbmRhcmQgVW5peCBFcG9jaCB3aGVuIGdldHRpbmcgdGhlIHRpbWUsIGFuZCBhZGQKKyAgIDIwIHllYXJzIHdoZW4gc2V0dGluZyB0aGUgdGltZS4gKi8KICNkZWZpbmUgVFdFTlRZX1lFQVJTICgoMjAgKiAzNjVMVSArIDUpICogODY0MDApCiAKIC8qIFRoZSBBSUNBIFJUQyBpcyByZXByZXNlbnRlZCBieSBhIDMyLWJpdCBzZWNvbmRzIGNvdW50ZXIgc3RvcmVkIGluIDIgMTYtYml0CkBAIC0zMiw3ICszMCw4IEBACiAgKgogICogR3JhYnMgdGhlIGN1cnJlbnQgUlRDIHNlY29uZHMgY291bnRlciBhbmQgYWRqdXN0cyBpdCB0byB0aGUgVW5peCBFcG9jaC4KICAqLwotdm9pZCBhaWNhX3J0Y19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0cykgewordm9pZCBhaWNhX3J0Y19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0cykKK3sKIAl1bnNpZ25lZCBsb25nIHZhbDEsIHZhbDI7CiAKIAlkbyB7CkBAIC01NSw3ICs1NCw4IEBACiAgKgogICogQWRqdXN0cyB0aGUgZ2l2ZW4gQHR2IHRvIHRoZSBBSUNBIEVwb2NoIGFuZCBzZXRzIHRoZSBSVEMgc2Vjb25kcyBjb3VudGVyLgogICovCi1pbnQgYWljYV9ydGNfc2V0dGltZW9mZGF5KGNvbnN0IHRpbWVfdCBzZWNzKSB7CitpbnQgYWljYV9ydGNfc2V0dGltZW9mZGF5KGNvbnN0IHRpbWVfdCBzZWNzKQorewogCXVuc2lnbmVkIGxvbmcgdmFsMSwgdmFsMjsKIAl1bnNpZ25lZCBsb25nIGFkaiA9IHNlY3MgKyBUV0VOVFlfWUVBUlM7CiAKQEAgLTc1LDcgKzc1LDcgQEAKIAogdm9pZCBhaWNhX3RpbWVfaW5pdCh2b2lkKQogewotCXJ0Y19nZXRfdGltZSA9IGFpY2FfcnRjX2dldHRpbWVvZmRheTsKLQlydGNfc2V0X3RpbWUgPSBhaWNhX3J0Y19zZXR0aW1lb2ZkYXk7CisJcnRjX3NoX2dldF90aW1lID0gYWljYV9ydGNfZ2V0dGltZW9mZGF5OworCXJ0Y19zaF9zZXRfdGltZSA9IGFpY2FfcnRjX3NldHRpbWVvZmRheTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvZHJlYW1jYXN0L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYwppbmRleCAwMDI3YjgwLi5mMTMwMTdlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9kcmVhbWNhc3Qvc2V0dXAuYwpAQCAtMjIsNDEgKzIyLDIxIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9ydGMuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9tYWNodmVjX2luaXQuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9zeXNhc2ljLmg+CiAKIGV4dGVybiBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgc3lzdGVtYXNpY19pbnQ7Ci0vKiBYWFg6IE1vdmUgdGhpcyBpbnRvIGl0J3MgcHJvcGVyIGhlYWRlci4gKi8KLWV4dGVybiB2b2lkICgqYm9hcmRfdGltZV9pbml0KSh2b2lkKTsKIGV4dGVybiB2b2lkIGFpY2FfdGltZV9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBnYXBzcGNpX2luaXQodm9pZCk7CiBleHRlcm4gaW50IHN5c3RlbWFzaWNfaXJxX2RlbXV4KGludCk7CiAKLXZvaWQgKmRyZWFtY2FzdF9jb25zaXN0ZW50X2FsbG9jKHN0cnVjdCBkZXZpY2UgKiwgc2l6ZV90LCBkbWFfYWRkcl90ICosIGludCk7Cit2b2lkICpkcmVhbWNhc3RfY29uc2lzdGVudF9hbGxvYyhzdHJ1Y3QgZGV2aWNlICosIHNpemVfdCwgZG1hX2FkZHJfdCAqLCBnZnBfdCk7CiBpbnQgZHJlYW1jYXN0X2NvbnNpc3RlbnRfZnJlZShzdHJ1Y3QgZGV2aWNlICosIHNpemVfdCwgdm9pZCAqLCBkbWFfYWRkcl90KTsKIAotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICJTZWdhIERyZWFtY2FzdCI7Ci19Ci0KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9kcmVhbWNhc3QgX19pbml0bXYgPSB7Ci0JLm12X25yX2lycXMJCT0gTlJfSVJRUywKLQotCS5tdl9pcnFfZGVtdXgJCT0gc3lzdGVtYXNpY19pcnFfZGVtdXgsCi0KLSNpZmRlZiBDT05GSUdfUENJCi0JLm12X2NvbnNpc3RlbnRfYWxsb2MJPSBkcmVhbWNhc3RfY29uc2lzdGVudF9hbGxvYywKLQkubXZfY29uc2lzdGVudF9mcmVlCT0gZHJlYW1jYXN0X2NvbnNpc3RlbnRfZnJlZSwKLSNlbmRpZgotfTsKLUFMSUFTX01WKGRyZWFtY2FzdCkKLQotaW50IF9faW5pdCBwbGF0Zm9ybV9zZXR1cCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGRyZWFtY2FzdF9zZXR1cChjaGFyICoqY21kbGluZV9wKQogewogCWludCBpOwogCkBAIC03OCw2ICs1OCwxNiBAQAogCWlmIChnYXBzcGNpX2luaXQoKSA8IDApCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdBUFNQQ0kgd2FzIG5vdCBkZXRlY3RlZC5cbiIpOwogI2VuZGlmCi0KLQlyZXR1cm4gMDsKIH0KKworc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2RyZWFtY2FzdCBfX2luaXRtdiA9IHsKKwkubXZfbmFtZQkJPSAiU2VnYSBEcmVhbWNhc3QiLAorCS5tdl9zZXR1cAkJPSBkcmVhbWNhc3Rfc2V0dXAsCisJLm12X2lycV9kZW11eAkJPSBzeXN0ZW1hc2ljX2lycV9kZW11eCwKKworI2lmZGVmIENPTkZJR19QQ0kKKwkubXZfY29uc2lzdGVudF9hbGxvYwk9IGRyZWFtY2FzdF9jb25zaXN0ZW50X2FsbG9jLAorCS5tdl9jb25zaXN0ZW50X2ZyZWUJPSBkcmVhbWNhc3RfY29uc2lzdGVudF9mcmVlLAorI2VuZGlmCit9OworQUxJQVNfTVYoZHJlYW1jYXN0KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvZWMzMTA0L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9lYzMxMDQvc2V0dXAuYwppbmRleCA0YjNlZjE2Li45MDJiYzk3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9lYzMxMDQvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9lYzMxMDQvc2V0dXAuYwpAQCAtMjEsMjIgKzIxLDM2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9lYzMxMDQuaD4KIAotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgZWMzMTA0X3NldHVwKGNoYXIgKipjbWRsaW5lX3ApCiB7Ci0JcmV0dXJuICJFQzMxMDQiOworCWNoYXIgc3RyWzhdOworCWludCBpOworCisJZm9yIChpPTA7IGk8ODsgaSsrKQorCQlzdHJbaV0gPSBjdHJsX3JlYWRiKEVDMzEwNF9CQVNFICsgaSk7CisKKwlmb3IgKGkgPSBFQzMxMDRfSVJRQkFTRTsgaSA8IEVDMzEwNF9JUlFCQVNFICsgMzI7IGkrKykKKwkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZlYzMxMDRfaW50OworCisJcHJpbnRrKCJpbml0aWFsaXppbmcgRUMzMTA0IFwiJS44c1wiIGF0ICUwOHgsIElSUSAlZCwgSVJRIGJhc2UgJWRcbiIsCisJICAgICAgIHN0ciwgRUMzMTA0X0JBU0UsIEVDMzEwNF9JUlEsIEVDMzEwNF9JUlFCQVNFKTsKKworCS8qIG1hc2sgYWxsIGludGVycnVwdHMuICB0aGlzIHNob3VsZCBoYXZlIGJlZW4gZG9uZSBieSB0aGUgYm9vdAorCSAqIGxvYWRlciBmb3IgdXMgYnV0IHdlIHdhbnQgdG8gYmUgc3VyZSAuLi4gKi8KKwljdHJsX3dyaXRlbCgweGZmZmZmZmZmLCBFQzMxMDRfSU1SKTsKIH0KIAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi0KIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9lYzMxMDQgX19pbml0bXYgPSB7CisJLm12X25hbWUJPSAiRUMzMTA0IiwKKwkubXZfc2V0dXAJPSBlYzMxMDRfc2V0dXAsCiAJLm12X25yX2lycXMJPSA5NiwKIAogCS5tdl9pbmIJCT0gZWMzMTA0X2luYiwKQEAgLTQ4LDMxICs2Miw0IEBACiAKIAkubXZfaXJxX2RlbXV4CT0gZWMzMTA0X2lycV9kZW11eCwKIH07Ci0KIEFMSUFTX01WKGVjMzEwNCkKLQotaW50IF9faW5pdCBwbGF0Zm9ybV9zZXR1cCh2b2lkKQotewotCWNoYXIgc3RyWzhdOwotCWludCBpOwotCQotCWlmICgwKQotCQlyZXR1cm4gMDsKLQotCWZvciAoaT0wOyBpPDg7IGkrKykKLQkJc3RyW2ldID0gY3RybF9yZWFkYihFQzMxMDRfQkFTRSArIGkpOwotCi0JZm9yIChpID0gRUMzMTA0X0lSUUJBU0U7IGkgPCBFQzMxMDRfSVJRQkFTRSArIDMyOyBpKyspCi0JCWlycV9kZXNjW2ldLmNoaXAgPSAmZWMzMTA0X2ludDsKLQotCXByaW50aygiaW5pdGlhbGl6aW5nIEVDMzEwNCBcIiUuOHNcIiBhdCAlMDh4LCBJUlEgJWQsIElSUSBiYXNlICVkXG4iLAotCSAgICAgICBzdHIsIEVDMzEwNF9CQVNFLCBFQzMxMDRfSVJRLCBFQzMxMDRfSVJRQkFTRSk7Ci0KLQotCS8qIG1hc2sgYWxsIGludGVycnVwdHMuICB0aGlzIHNob3VsZCBoYXZlIGJlZW4gZG9uZSBieSB0aGUgYm9vdAotCSAqIGxvYWRlciBmb3IgdXMgYnV0IHdlIHdhbnQgdG8gYmUgc3VyZSAuLi4gKi8KLQljdHJsX3dyaXRlbCgweGZmZmZmZmZmLCBFQzMxMDRfSU1SKTsKLQkKLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaGFycC9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL2hhcnAvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNzUzZDMuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvaGFycC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgU1RNaWNyb2VsZWN0cm9uaWNzIGJvYXJkIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwKLSMKLQotb2JqLXkgOj0gaXJxLm8gc2V0dXAubyBtYWNoLm8gbGVkLm8KLQotb2JqLSQoQ09ORklHX1BDSSkgKz0gcGNpZG1hLm8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaGFycC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL2hhcnAvaXJxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YmI0MWMuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvaGFycC9pcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBKLiBNY2theSAoZGF2aWQubWNrYXlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKgotICogTG9va3MgYWZ0ZXIgaW50ZXJydXB0cyBvbiB0aGUgSEFSUCBib2FyZC4KLSAqCi0gKiBCYXNlcyBvbiB0aGUgSVBSIGlycSBzeXN0ZW0KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9oYXJwL2hhcnAuaD4KLQotCi0jZGVmaW5lIE5VTV9FWFRFUk5BTF9JUlFTIDE2Ci0KLS8vIEVhcmx5IHZlcnNpb25zIG9mIHRoZSBTVEIxIE92ZXJkcml2ZSByZXF1aXJlZCB0aGlzIG5hc3R5IGZyaWcKLS8vI2RlZmluZSBJTlZFUlRfSU5UTUFTS19XUklURVMKLQotc3RhdGljIHZvaWQgZW5hYmxlX2hhcnBfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIHZvaWQgZGlzYWJsZV9oYXJwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLQotLyogc2h1dGRvd24gaXMgc2FtZSBhcyAiZGlzYWJsZSIgKi8KLSNkZWZpbmUgc2h1dGRvd25faGFycF9pcnEgZGlzYWJsZV9oYXJwX2lycQotCi1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfaGFycCh1bnNpZ25lZCBpbnQpOwotc3RhdGljIHZvaWQgZW5kX2hhcnBfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfaGFycF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfaGFycF9pcnEoaXJxKTsKLQlyZXR1cm4gMDsJCS8qIG5ldmVyIGFueXRoaW5nIHBlbmRpbmcgKi8KLX0KLQotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBoYXJwX2lycV90eXBlID0gewotCS50eXBlbmFtZSA9ICJIYXJwLUlSUSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX2hhcnBfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX2hhcnBfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfaGFycF9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX2hhcnBfaXJxLAotCS5hY2sgPSBtYXNrX2FuZF9hY2tfaGFycCwKLQkuZW5kID0gZW5kX2hhcnBfaXJxCi19OwotCi1zdGF0aWMgdm9pZCBkaXNhYmxlX2hhcnBfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgdmFsLCBmbGFnczsKLQl1bnNpZ25lZCBtYXNrUmVnOwotCXVuc2lnbmVkIG1hc2s7Ci0JaW50IHByaTsKLQotCWlmIChpcnEgPCAwIHx8IGlycSA+PSBOVU1fRVhURVJOQUxfSVJRUykKLQkJcmV0dXJuOwotCi0JcHJpID0gMTUgLSBpcnE7Ci0KLQlpZiAocHJpIDwgOCkgewotCQltYXNrUmVnID0gRVBMRF9JTlRNQVNLMDsKLQl9IGVsc2UgewotCQltYXNrUmVnID0gRVBMRF9JTlRNQVNLMTsKLQkJcHJpIC09IDg7Ci0JfQotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCW1hc2sgPSBjdHJsX2lubChtYXNrUmVnKTsKLQltYXNrICY9ICh+KDEgPDwgcHJpKSk7Ci0jaWYgZGVmaW5lZChJTlZFUlRfSU5UTUFTS19XUklURVMpCi0JbWFzayBePSAweGZmOwotI2VuZGlmCi0JY3RybF9vdXRsKG1hc2ssIG1hc2tSZWcpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgZW5hYmxlX2hhcnBfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgZmxhZ3M7Ci0JdW5zaWduZWQgbWFza1JlZzsKLQl1bnNpZ25lZCBtYXNrOwotCWludCBwcmk7Ci0KLQlpZiAoaXJxIDwgMCB8fCBpcnEgPj0gTlVNX0VYVEVSTkFMX0lSUVMpCi0JCXJldHVybjsKLQotCXByaSA9IDE1IC0gaXJxOwotCi0JaWYgKHByaSA8IDgpIHsKLQkJbWFza1JlZyA9IEVQTERfSU5UTUFTSzA7Ci0JfSBlbHNlIHsKLQkJbWFza1JlZyA9IEVQTERfSU5UTUFTSzE7Ci0JCXByaSAtPSA4OwotCX0KLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQltYXNrID0gY3RybF9pbmwobWFza1JlZyk7Ci0KLQotCW1hc2sgfD0gKDEgPDwgcHJpKTsKLQotI2lmIGRlZmluZWQoSU5WRVJUX0lOVE1BU0tfV1JJVEVTKQotCW1hc2sgXj0gMHhmZjsKLSNlbmRpZgotCWN0cmxfb3V0bChtYXNrLCBtYXNrUmVnKTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbnMgc2V0cyB0aGUgZGVzaXJlZCBpcnEgaGFuZGxlciB0byBiZSBhbiBvdmVyZHJpdmUgdHlwZSAqLwotc3RhdGljIHZvaWQgX19pbml0IG1ha2VfaGFycF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKLQlpcnFfZGVzY1tpcnFdLmNoaXAgPSAmaGFycF9pcnFfdHlwZTsKLQlkaXNhYmxlX2hhcnBfaXJxKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19oYXJwKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZGlzYWJsZV9oYXJwX2lycShpcnEpOwotfQotCi1zdGF0aWMgdm9pZCBlbmRfaGFycF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfaGFycF9pcnEoaXJxKTsKLX0KLQotdm9pZCBfX2luaXQgaW5pdF9oYXJwX2lycSh2b2lkKQotewotCWludCBpOwotCi0jaWYgIWRlZmluZWQoSU5WRVJUX0lOVE1BU0tfV1JJVEVTKQotCS8vIE9uIHRoZSBoYXJwIHRoZXNlIGFyZSBzZXQgdG8gZW5hYmxlIGFuIGludGVycnVwdAotCWN0cmxfb3V0bCgweDAwLCBFUExEX0lOVE1BU0swKTsKLQljdHJsX291dGwoMHgwMCwgRVBMRF9JTlRNQVNLMSk7Ci0jZWxzZQotCS8vIE9uIHRoZSBPdmVyZHJpdmUgdGhlIGRhdGEgaXMgaW52ZXJ0ZWQgYmVmb3JlIGJlaW5nIHN0b3JlZCBpbiB0aGUgcmVnCi0JY3RybF9vdXRsKDB4ZmYsIEVQTERfSU5UTUFTSzApOwotCWN0cmxfb3V0bCgweGZmLCBFUExEX0lOVE1BU0sxKTsKLSNlbmRpZgotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9FWFRFUk5BTF9JUlFTOyBpKyspIHsKLQkJbWFrZV9oYXJwX2lycShpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9oYXJwL2xlZC5jIGIvYXJjaC9zaC9ib2FyZHMvaGFycC9sZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViN2IzOS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9oYXJwL2xlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvc2gvc3Rib2FyZHMvbGVkLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3R1YXJ0IE1lbmVmeSA8c3R1YXJ0Lm1lbmVmeUBzdC5jb20+Ci0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBTVDQwU1RCMSBIQVJQIGFuZCBjb21wYXRpYmxlIGNvZGUuCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9oYXJwL2hhcnAuaD4KLQotLyogSGFycDogRmxhc2ggTEQxMCAoZnJvbnQgcGFubmVsKSBjb25uZWN0ZWQgdG8gRVBMRCAoSUM4KSAqLwotLyogT3ZlcmRyaXZlOiBGbGFzaCBMRDEgKGZyb250IHBhbmVsKSBjb25uZWN0ZWQgdG8gRVBMRCAoSUM0KSAqLwotLyogV29ya3MgZm9yIEhBUlAgYW5kIG92ZXJkcml2ZSAqLwotc3RhdGljIHZvaWQgbWFjaF9sZWQoaW50IHBvc2l0aW9uLCBpbnQgdmFsdWUpCi17Ci0JaWYgKHZhbHVlKSB7Ci0JCWN0cmxfb3V0bChFUExEX0xFRF9PTiwgRVBMRF9MRUQpOwotCX0gZWxzZSB7Ci0JCWN0cmxfb3V0bChFUExEX0xFRF9PRkYsIEVQTERfTEVEKTsKLQl9Ci19Ci0KLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0vKiBhY3RzIGxpa2UgYW4gYWN0dWFsIGhlYXJ0IGJlYXQgLS0gaWUgdGh1bXAtdGh1bXAtcGF1c2UuLi4gKi8KLXZvaWQgaGVhcnRiZWF0X2hhcnAodm9pZCkKLXsKLQlzdGF0aWMgdW5zaWduZWQgY250ID0gMCwgcGVyaW9kID0gMCwgZGlzdCA9IDA7Ci0KLQlpZiAoY250ID09IDAgfHwgY250ID09IGRpc3QpCi0JCW1hY2hfbGVkKCAtMSwgMSk7Ci0JZWxzZSBpZiAoY250ID09IDcgfHwgY250ID09IGRpc3QrNykKLQkJbWFjaF9sZWQoIC0xLCAwKTsKLQotCWlmICgrK2NudCA+IHBlcmlvZCkgewotCQljbnQgPSAwOwotCQkvKiBUaGUgaHlwZXJib2xpYyBmdW5jdGlvbiBiZWxvdyBtb2RpZmllcyB0aGUgaGVhcnRiZWF0IHBlcmlvZAotCQkgKiBsZW5ndGggaW4gZGVwZW5kZW5jeSBvZiB0aGUgY3VycmVudCAoNW1pbikgbG9hZC4gSXQgZ29lcwotCQkgKiB0aHJvdWdoIHRoZSBwb2ludHMgZigwKT0xMjYsIGYoMSk9ODYsIGYoNSk9NTEsCi0JCSAqIGYoaW5mKS0+MzAuICovCi0JCXBlcmlvZCA9ICgoNjcyPDxGU0hJRlQpLyg1KmF2ZW5ydW5bMF0rKDc8PEZTSElGVCkpKSArIDMwOwotCQlkaXN0ID0gcGVyaW9kIC8gNDsKLQl9Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hhcnAvbWFjaC5jIGIvYXJjaC9zaC9ib2FyZHMvaGFycC9tYWNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NDZkZDEuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvaGFycC9tYWNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvaGFycC9tYWNoLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3R1YXJ0IE1lbmVmeSAoc3R1YXJ0Lm1lbmVmeUBzdC5jb20pCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIE1hY2hpbmUgdmVjdG9yIGZvciB0aGUgU1RNaWNyb2VsZWN0cm9uaWNzIFNUQjEgSEFSUCBhbmQgY29tcGF0aWJsZSBib2FyZHMKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vcnRjLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWNfaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9oZDY0NDY1L2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2hkNjQ0NjUvaGQ2NDQ2NS5oPgotCi12b2lkIHNldHVwX2hhcnAodm9pZCk7Ci12b2lkIGluaXRfaGFycF9pcnEodm9pZCk7Ci12b2lkIGhlYXJ0YmVhdF9oYXJwKHZvaWQpOwotCi0vKgotICogVGhlIE1hY2hpbmUgVmVjdG9yCi0gKi8KLQotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X2hhcnAgX19pbml0bXYgPSB7Ci0JLm12X25yX2lycXMJCT0gODkgKyBIRDY0NDY1X0lSUV9OVU0sCi0KLQkubXZfaW5iCQkJPSBoZDY0NDY1X2luYiwKLQkubXZfaW53CQkJPSBoZDY0NDY1X2ludywKLQkubXZfaW5sCQkJPSBoZDY0NDY1X2lubCwKLQkubXZfb3V0YgkJPSBoZDY0NDY1X291dGIsCi0JLm12X291dHcJCT0gaGQ2NDQ2NV9vdXR3LAotCS5tdl9vdXRsCQk9IGhkNjQ0NjVfb3V0bCwKLQotCS5tdl9pbmJfcAkJPSBoZDY0NDY1X2luYl9wLAotCS5tdl9pbndfcAkJPSBoZDY0NDY1X2ludywKLQkubXZfaW5sX3AJCT0gaGQ2NDQ2NV9pbmwsCi0JLm12X291dGJfcAkJPSBoZDY0NDY1X291dGJfcCwKLQkubXZfb3V0d19wCQk9IGhkNjQ0NjVfb3V0dywKLQkubXZfb3V0bF9wCQk9IGhkNjQ0NjVfb3V0bCwKLQotCS5tdl9pbnNiCQk9IGhkNjQ0NjVfaW5zYiwKLQkubXZfaW5zdwkJPSBoZDY0NDY1X2luc3csCi0JLm12X2luc2wJCT0gaGQ2NDQ2NV9pbnNsLAotCS5tdl9vdXRzYgkJPSBoZDY0NDY1X291dHNiLAotCS5tdl9vdXRzdwkJPSBoZDY0NDY1X291dHN3LAotCS5tdl9vdXRzbAkJPSBoZDY0NDY1X291dHNsLAotCi0gICAgICAgIC5tdl9pc2FfcG9ydDJhZGRyICAgICAgID0gaGQ2NDQ2NV9pc2FfcG9ydDJhZGRyLAotCi0jaWZkZWYgQ09ORklHX1BDSQotCS5tdl9pbml0X2lycQkJPSBpbml0X2hhcnBfaXJxLAotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCS5tdl9oZWFydGJlYXQJCT0gaGVhcnRiZWF0X2hhcnAsCi0jZW5kaWYKLX07Ci0KLUFMSUFTX01WKGhhcnApCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9oYXJwL3BjaWRtYS5jIGIvYXJjaC9zaC9ib2FyZHMvaGFycC9wY2lkbWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1MzExMy4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9oYXJwL3BjaWRtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgRGF2aWQgSi4gTWNrYXkgKGRhdmlkLm1ja2F5QHN0LmNvbSkKLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICoKLSAqIER5bmFtaWMgRE1BIG1hcHBpbmcgc3VwcG9ydC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KLQotCi12b2lkICpwY2lfYWxsb2NfY29uc2lzdGVudChzdHJ1Y3QgcGNpX2RldiAqaHdkZXYsIHNpemVfdCBzaXplLAotCQkJICAgZG1hX2FkZHJfdCAqIGRtYV9oYW5kbGUpCi17Ci0Jdm9pZCAqcmV0OwotCWludCBnZnAgPSBHRlBfQVRPTUlDOwotCi0JcmV0ID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhnZnAsIGdldF9vcmRlcihzaXplKSk7Ci0KLQlpZiAocmV0ICE9IE5VTEwpIHsKLQkgICAgICAgIC8qIElzIGl0IG5lY2Nlc3NhcnkgdG8gZG8gdGhlIG1lbXNldD8gKi8KLQkJbWVtc2V0KHJldCwgMCwgc2l6ZSk7Ci0JCSpkbWFfaGFuZGxlID0gdmlydF90b19idXMocmV0KTsKLQl9Ci0JLyogV2UgbXVzdCBmbHVzaCB0aGUgY2FjaGUgYmVmb3JlIHdlIHBhc3MgaXQgb24gdG8gdGhlIGRldmljZSAqLwotCWZsdXNoX2NhY2hlX2FsbCgpOwotCXJldHVybiAgUDJTRUdBRERSKHJldCk7Ci19Ci0KLXZvaWQgcGNpX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3QgcGNpX2RldiAqaHdkZXYsIHNpemVfdCBzaXplLAotCQkJIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCi17Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgcDFhZGRyPVAxU0VHQUREUigodW5zaWduZWQgbG9uZyl2YWRkcik7Ci0KLQlmcmVlX3BhZ2VzKHAxYWRkciwgZ2V0X29yZGVyKHNpemUpKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hhcnAvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL2hhcnAvc2V0dXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg2ZTQ1MC4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9oYXJwL3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogYXJjaC9zaC9zdGJvYXJkL3NldHVwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgU3R1YXJ0IE1lbmVmeSAoc3R1YXJ0Lm1lbmVmeUBzdC5jb20pCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIFNUTWljcm9lbGVjdHJvbmljcyBTVDQwU1RCMSBIQVJQIGFuZCBjb21wYXRpYmxlIHN1cHBvcnQuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaGFycC9oYXJwLmg+Ci0KLWNvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQotewotCXJldHVybiAiU1RCMSBIYXJwIjsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIGJvYXJkCi0gKi8KLWludCBfX2luaXQgcGxhdGZvcm1fc2V0dXAodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfU0hfU1RCMV9IQVJQCi0JdW5zaWduZWQgbG9uZyBpYzhfdmVyc2lvbiwgaWMzNl92ZXJzaW9uOwotCi0JaWM4X3ZlcnNpb24gPSBjdHJsX2lubChFUExEX1JFVklEMik7Ci0JaWMzNl92ZXJzaW9uID0gY3RybF9pbmwoRVBMRF9SRVZJRDEpOwotCi0gICAgICAgIHByaW50aygiU1RNaWNyb2VsZWN0cm9uaWNzIFNUQjEgSEFSUCBpbml0aWFsaXNhdG9uXG4iKTsKLSAgICAgICAgcHJpbnRrKCJFUExEIHZlcnNpb25zOiBJQzg6ICVkLiUwMmQsIElDMzY6ICVkLiUwMmRcbiIsCi0gICAgICAgICAgICAgICAoaWM4X3ZlcnNpb24gPj4gNCkgJiAweGYsIGljOF92ZXJzaW9uICYgMHhmLAotICAgICAgICAgICAgICAgKGljMzZfdmVyc2lvbiA+PiA0KSAmIDB4ZiwgaWMzNl92ZXJzaW9uICYgMHhmKTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX1NIX1NUQjFfT1ZFUkRSSVZFKQotCXVuc2lnbmVkIGxvbmcgdmVyc2lvbjsKLQotCXZlcnNpb24gPSBjdHJsX2lubChFUExEX1JFVklEKTsKLQotICAgICAgICBwcmludGsoIlNUTWljcm9lbGVjdHJvbmljcyBTVEIxIE92ZXJkcml2ZSBpbml0aWFsaXNhdG9uXG4iKTsKLSAgICAgICAgcHJpbnRrKCJFUExEIHZlcnNpb246ICVkLiUwMmRcbiIsCi0JICAgICAgICh2ZXJzaW9uID4+IDQpICYgMHhmLCB2ZXJzaW9uICYgMHhmKTsKLSNlbHNlCi0jZXJyb3IgVW5kZWZpbmVkIG1hY2hpbmUKLSNlbmRpZgotIAotICAgICAgICAvKiBDdXJyZW50bHkgYWxsIFNUQjEgY2hpcHMgaGF2ZSBwcm9ibGVtcyB3aXRoIHRoZSBzbGVlcCBpbnN0cnVjdGlvbiwKLSAgICAgICAgICogc28gZGlzYWJsZSBpdCBoZXJlLgotICAgICAgICAgKi8KLQlkaXNhYmxlX2hsdCgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEKLSAqCi0gKiBUaGlzIGlzIGJvYXJkIHNwZWNpZmljIGFuZCByZXR1cm5zIHRoZSBJUlEgZm9yIGEgZ2l2ZW4gUENJIGRldmljZS4KLSAqIEl0IGlzIHVzZWQgYnkgdGhlIFBDSSBjb2RlIChhcmNoL3NoL2tlcm5lbC9zdDQwX3BjaSopCi0gKgotICovCi0KLSNkZWZpbmUgSEFSUF9QQ0lfSVJRICAgIDEKLSNkZWZpbmUgSEFSUF9CUklER0VfSVJRIDIKLSNkZWZpbmUgT1ZFUkRSSVZFX1NMT1QwX0lSUSAwCi0KLQotaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQotewotCXN3aXRjaCAoc2xvdCkgewotI2lmZGVmIENPTkZJR19TSF9TVEIxX0hBUlAKLQljYXNlIDI6CQkvKlRoaXMgaXMgdGhlIFBDSSBzbG90IG9uIHRoZSAqLwotCQlyZXR1cm4gSEFSUF9QQ0lfSVJROwotCWNhc2UgMToJCS8qIHRoaXMgaXMgdGhlIGJyaWRnZSAqLwotCQlyZXR1cm4gSEFSUF9CUklER0VfSVJROwotI2VsaWYgZGVmaW5lZChDT05GSUdfU0hfU1RCMV9PVkVSRFJJVkUpCi0JY2FzZSAxOgotCWNhc2UgMjoKLQljYXNlIDM6Ci0JCXJldHVybiBzbG90IC0gMTsKLSNlbHNlCi0jZXJyb3IgVW5rbm93biBib2FyZAotI2VuZGlmCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC0xOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9NYWtlZmlsZQppbmRleCA5MjdmZTBhLi5mZjFiN2Y1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9NYWtlZmlsZQpAQCAtMiw1ICsyLDYgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBIUDZ4eCBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUga2VybmVsCiAjCiAKLW9iai15CSA6PSBtYWNoLm8gc2V0dXAubwotCitvYmoteQkgCQk6PSBzZXR1cC5vCitvYmotJChDT05GSUdfUE0pCSs9IHBtLm8gcG1fd2FrZXVwLm8KK29iai0kKENPTkZJR19BUE0pCSs9IGhwNnh4X2FwbS5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDZ4eF9hcG0uYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L2hwNnh4X2FwbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMGU3MTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9ocDZ4eF9hcG0uYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIGJpb3MtbGVzcyBBUE0gZHJpdmVyIGZvciBocDY4MAorICoKKyAqIENvcHlyaWdodCAyMDA1IChjKSBBbmRyaXkgU2t1bHlzaCA8YXNrdWx5c2hAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYXBtX2Jpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2FwbS5oPgorI2luY2x1ZGUgPGFzbS9hZGMuaD4KKyNpbmNsdWRlIDxhc20vaHA2eHgvaHA2eHguaD4KKworI2RlZmluZSBTSDc3MDlfUEdEUgkJCTB4YTQwMDAxMmMKKworI2RlZmluZSBBUE1fQ1JJVElDQUwJCQkxMAorI2RlZmluZSBBUE1fTE9XCQkJCTMwCisKKyNkZWZpbmUgSFA2ODBfQkFUVEVSWV9NQVgJCTg3NQorI2RlZmluZSBIUDY4MF9CQVRURVJZX01JTgkJNjAwCisjZGVmaW5lIEhQNjgwX0JBVFRFUllfQUNfT04JCTkwMAorCisjZGVmaW5lIE1PRE5BTUUgImhwNngwX2FwbSIKKworc3RhdGljIGludCBocDZ4MF9hcG1fZ2V0X2luZm8oY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IGZwb3MsIGludCBsZW5ndGgpCit7CisJdTggcGdkcjsKKwljaGFyICpwOworCWludCBiYXR0ZXJ5X3N0YXR1czsKKwlpbnQgYmF0dGVyeV9mbGFnOworCWludCBhY19saW5lX3N0YXR1czsKKwlpbnQgdGltZV91bml0cyA9IEFQTV9CQVRURVJZX0xJRkVfVU5LTk9XTjsKKworCWludCBiYXR0ZXJ5ID0gYWRjX3NpbmdsZShBRENfQ0hBTk5FTF9CQVRURVJZKTsKKwlpbnQgYmFja3VwID0gYWRjX3NpbmdsZShBRENfQ0hBTk5FTF9CQUNLVVApOworCWludCBjaGFyZ2luZyA9IGFkY19zaW5nbGUoQURDX0NIQU5ORUxfQ0hBUkdFKTsKKwlpbnQgcGVyY2VudGFnZTsKKworCXBlcmNlbnRhZ2UgPSAxMDAgKiAoYmF0dGVyeSAtIEhQNjgwX0JBVFRFUllfTUlOKSAvCisJCQkgICAoSFA2ODBfQkFUVEVSWV9NQVggLSBIUDY4MF9CQVRURVJZX01JTik7CisKKwlhY19saW5lX3N0YXR1cyA9IChiYXR0ZXJ5ID4gSFA2ODBfQkFUVEVSWV9BQ19PTikgPworCQkJIEFQTV9BQ19PTkxJTkUgOiBBUE1fQUNfT0ZGTElORTsKKworCXAgPSBidWY7CisKKwlwZ2RyID0gY3RybF9pbmIoU0g3NzA5X1BHRFIpOworCWlmIChwZ2RyICYgUEdEUl9NQUlOX0JBVFRFUllfT1VUKSB7CisJCWJhdHRlcnlfc3RhdHVzID0gQVBNX0JBVFRFUllfU1RBVFVTX05PVF9QUkVTRU5UOworCQliYXR0ZXJ5X2ZsYWcgPSAweDgwOworCQlwZXJjZW50YWdlID0gLTE7CisJfSBlbHNlIGlmIChjaGFyZ2luZyA8IDggKSB7CisJCWJhdHRlcnlfc3RhdHVzID0gQVBNX0JBVFRFUllfU1RBVFVTX0NIQVJHSU5HOworCQliYXR0ZXJ5X2ZsYWcgPSAweDA4OworCQlhY19saW5lX3N0YXR1cyA9IDB4ZmY7CisJfSBlbHNlIGlmIChwZXJjZW50YWdlIDw9IEFQTV9DUklUSUNBTCkgeworCQliYXR0ZXJ5X3N0YXR1cyA9IEFQTV9CQVRURVJZX1NUQVRVU19DUklUSUNBTDsKKwkJYmF0dGVyeV9mbGFnID0gMHgwNDsKKwl9IGVsc2UgaWYgKHBlcmNlbnRhZ2UgPD0gQVBNX0xPVykgeworCQliYXR0ZXJ5X3N0YXR1cyA9IEFQTV9CQVRURVJZX1NUQVRVU19MT1c7CisJCWJhdHRlcnlfZmxhZyA9IDB4MDI7CisJfSBlbHNlIHsKKwkJYmF0dGVyeV9zdGF0dXMgPSBBUE1fQkFUVEVSWV9TVEFUVVNfSElHSDsKKwkJYmF0dGVyeV9mbGFnID0gMHgwMTsKKwl9CisKKwlwICs9IHNwcmludGYocCwgIjEuMCAxLjIgMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4ICVkJSUgJWQgJXNcbiIsCisJCSAgICAgQVBNXzMyX0JJVF9TVVBQT1JULAorCQkgICAgIGFjX2xpbmVfc3RhdHVzLAorCQkgICAgIGJhdHRlcnlfc3RhdHVzLAorCQkgICAgIGJhdHRlcnlfZmxhZywKKwkJICAgICBwZXJjZW50YWdlLAorCQkgICAgIHRpbWVfdW5pdHMsCisJCSAgICAgIm1pbiIpOworCXAgKz0gc3ByaW50ZihwLCAiYmF0PSVkIGJhY2t1cD0lZCBjaGFyZ2U9JWRcbiIsCisJCSAgICAgYmF0dGVyeSwgYmFja3VwLCBjaGFyZ2luZyk7CisKKwlyZXR1cm4gcCAtIGJ1ZjsKK30KKworc3RhdGljIGlycXJldHVybl90IGhwNngwX2FwbV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAoIWFwbV9zdXNwZW5kZWQpCisJCWFwbV9xdWV1ZV9ldmVudChBUE1fVVNFUl9TVVNQRU5EKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2luaXQgaHA2eDBfYXBtX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcmVxdWVzdF9pcnEoSFA2ODBfQlROX0lSUSwgaHA2eDBfYXBtX2ludGVycnVwdCwKKwkJCSAgU0FfSU5URVJSVVBULCBNT0ROQU1FLCAwKTsKKwlpZiAodW5saWtlbHkocmV0IDwgMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE1PRE5BTUUgIjogSVJRICVkIHJlcXVlc3QgZmFpbGVkXG4iLAorCQkgICAgICAgSFA2ODBfQlROX0lSUSk7CisJCXJldHVybiByZXQ7CisJfQorCisJYXBtX2dldF9pbmZvID0gaHA2eDBfYXBtX2dldF9pbmZvOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGhwNngwX2FwbV9leGl0KHZvaWQpCit7CisJZnJlZV9pcnEoSFA2ODBfQlROX0lSUSwgMCk7CisJYXBtX2dldF9pbmZvID0gMDsKK30KKworbW9kdWxlX2luaXQoaHA2eDBfYXBtX2luaXQpOworbW9kdWxlX2V4aXQoaHA2eDBfYXBtX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBZHJpeSBTa3VseXNoIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImhwNnh4IEFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3BtLmMgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNTAxYmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9wbS5jCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBocDZ4MCBQb3dlciBNYW5hZ2VtZW50IFJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEFuZHJpeSBTa3VseXNoIDxhc2t1bHN5aEBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+CisjaW5jbHVkZSA8YXNtL2hwNnh4L2hwNnh4Lmg+CisjaW5jbHVkZSA8YXNtL2NwdS9kYWMuaD4KKyNpbmNsdWRlIDxhc20vcG0uaD4KKworI2RlZmluZSBTVEJDUgkJMHhmZmZmZmY4MgorI2RlZmluZSBTVEJDUjIJCTB4ZmZmZmZmODgKKworc3RhdGljIGludCBocDZ4MF9wbV9lbnRlcihzdXNwZW5kX3N0YXRlX3Qgc3RhdGUpCit7CisJdTggc3RiY3IsIHN0YmNyMjsKKyNpZmRlZiBDT05GSUdfSEQ2NDQ2MV9FTkFCTEVSCisJdTggc2NyOworCXUxNiBoZDY0NDYxX3N0YmNyOworI2VuZGlmCisKKwlpZiAoc3RhdGUgIT0gUE1fU1VTUEVORF9NRU0pCisJCXJldHVybiAtRUlOVkFMOworCisjaWZkZWYgQ09ORklHX0hENjQ0NjFfRU5BQkxFUgorCW91dGIoMCwgSEQ2NDQ2MV9QQ0MxQ1NDSUVSKTsKKworCXNjciA9IGluYihIRDY0NDYxX1BDQzFTQ1IpOworCXNjciB8PSBIRDY0NDYxX1BDQ1NDUl9WQ0MxOworCW91dGIoc2NyLCBIRDY0NDYxX1BDQzFTQ1IpOworCisJaGQ2NDQ2MV9zdGJjciA9IGludyhIRDY0NDYxX1NUQkNSKTsKKwloZDY0NDYxX3N0YmNyIHw9IEhENjQ0NjFfU1RCQ1JfU1BDMVNUOworCW91dHcoaGQ2NDQ2MV9zdGJjciwgSEQ2NDQ2MV9TVEJDUik7CisjZW5kaWYKKworCWN0cmxfb3V0YigweDFmLCBEQUNSKTsKKworCXN0YmNyID0gY3RybF9pbmIoU1RCQ1IpOworCWN0cmxfb3V0YigweDAxLCBTVEJDUik7CisKKwlzdGJjcjIgPSBjdHJsX2luYihTVEJDUjIpOworCWN0cmxfb3V0YigweDdmICwgU1RCQ1IyKTsKKworCW91dHcoMHhmMDdmLCBIRDY0NDYxX1NDUFVDUik7CisKKwlwbV9lbnRlcigpOworCisJb3V0dygwLCBIRDY0NDYxX1NDUFVDUik7CisJY3RybF9vdXRiKHN0YmNyLCBTVEJDUik7CisJY3RybF9vdXRiKHN0YmNyMiwgU1RCQ1IyKTsKKworI2lmZGVmIENPTkZJR19IRDY0NDYxX0VOQUJMRVIKKwloZDY0NDYxX3N0YmNyID0gaW53KEhENjQ0NjFfU1RCQ1IpOworCWhkNjQ0NjFfc3RiY3IgJj0gfkhENjQ0NjFfU1RCQ1JfU1BDMVNUOworCW91dHcoaGQ2NDQ2MV9zdGJjciwgSEQ2NDQ2MV9TVEJDUik7CisKKwlvdXRiKDB4NGMsIEhENjQ0NjFfUENDMUNTQ0lFUik7CisJb3V0YigweDAwLCBIRDY0NDYxX1BDQzFDU0NSKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgdG8gUE1fRElTS19GSVJNV0FSRSBzbyB3ZSBjYW4gcXVpY2tseSB2ZXRvIHN1c3BlbmQtdG8tZGlzay4KKyAqLworc3RhdGljIHN0cnVjdCBwbV9vcHMgaHA2eDBfcG1fb3BzID0geworCS5wbV9kaXNrX21vZGUJPSBQTV9ESVNLX0ZJUk1XQVJFLAorCS5lbnRlcgkJPSBocDZ4MF9wbV9lbnRlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGhwNngwX3BtX2luaXQodm9pZCkKK3sKKwlwbV9zZXRfb3BzKCZocDZ4MF9wbV9vcHMpOworCXJldHVybiAwOworfQorCitsYXRlX2luaXRjYWxsKGhwNngwX3BtX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvcG1fd2FrZXVwLlMgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9wbV93YWtldXAuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWU5YmYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9ib2FyZHMvaHA2eHgvcG1fd2FrZXVwLlMKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBBbmRyaXkgU2t1bHlzaCA8YXNrdWxzeWhAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9jcHUvbW11X2NvbnRleHQuaD4KKworI2RlZmluZSBrMAlyMAorI2RlZmluZSBrMQlyMQorI2RlZmluZSBrMglyMgorI2RlZmluZSBrMwlyMworI2RlZmluZSBrNAlyNAorCisvKgorICogS2VybmVsIG1vZGUgcmVnaXN0ZXIgdXNhZ2U6CisgKglrMAlzY3JhdGNoCisgKglrMQlzY3JhdGNoCisgKglrMglzY3JhdGNoIChFeGNlcHRpb24gY29kZSkKKyAqCWszCXNjcmF0Y2ggKFJldHVybiBhZGRyZXNzKQorICoJazQJc2NyYXRjaAorICoJazUJcmVzZXJ2ZWQKKyAqCWs2CUdsb2JhbCBJbnRlcnJ1cHQgTWFzayAoMC0tMTUgPDwgNCkKKyAqCWs3CUNVUlJFTlRfVEhSRUFEX0lORk8gKHBvaW50ZXIgdG8gY3VycmVudCB0aHJlYWQgaW5mbykKKyAqLworCitFTlRSWSh3YWtldXBfc3RhcnQpCishIGNsZWFyIFNUQlkgYml0CisJbW92CSMtMTI2LCBrMgorICAgCWFuZAkjMTI3LCBrMAorCW1vdi5iCWswLCBAazIKKyEgZW5hYmxlIHJlZnJlc2gKKwltb3YubAk1ZiwgazEKKwltb3Yudwk2ZiwgazAKKyAgCW1vdi53CWswLCBAazEKKyEganVtcCB0byBoYW5kbGVyCisJbW92LmwJMmYsIGsyCisJbW92LmwJM2YsIGszCisJbW92LmwJQGsyLCBrMgorCisJbW92LmwJNGYsIGsxCisJam1wCUBrMQorCW5vcAorCisJLmFsaWduCTIKKzE6CS5sb25nCUVYUEVWVAorMjoJLmxvbmcJSU5URVZUCiszOgkubG9uZwlyZXRfZnJvbV9pcnEKKzQ6CS5sb25nCWhhbmRsZV9leGNlcHRpb24KKzU6CS5sb25nCTB4ZmZmZmZmNjgKKzY6CS53b3JkCTB4MDUyNAorCitFTlRSWSh3YWtldXBfZW5kKQorCW5vcApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL2hwNnh4L3NldHVwLmMKaW5kZXggNzFmMzE1Ni4uNjBhYjE3YSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvaHA2eHgvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9ocDZ4eC9zZXR1cC5jCkBAIC04LDIyICs4LDIyIEBACiAgKgogICogU2V0dXAgY29kZSBmb3IgYW4gSFA2ODAgIChpbnRlcm5hbCBwZXJpcGhlcmlhbHMgb25seSkKICAqLwotCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2hkNjQ0NjEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2hwNnh4L2hwNnh4Lmg+CiAjaW5jbHVkZSA8YXNtL2NwdS9kYWMuaD4KIAotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICJIUDZ4eCI7Ci19CisjZGVmaW5lCVNDUENSCTB4YTQwMDAxMTYKKyNkZWZpbmUgU0NQRFIJMHhhNDAwMDEzNgogCi1pbnQgX19pbml0IHBsYXRmb3JtX3NldHVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgaHA2eHhfc2V0dXAoY2hhciAqKmNtZGxpbmVfcCkKIHsKIAl1OCB2ODsKIAl1MTYgdjsKKwogCXYgPSBpbncoSEQ2NDQ2MV9TVEJDUik7CiAJdiB8PSBIRDY0NDYxX1NUQkNSX1NVUlRTVCB8IEhENjQ0NjFfU1RCQ1JfU0lSU1QgfAogCSAgICBIRDY0NDYxX1NUQkNSX1NUTTFTVCB8IEhENjQ0NjFfU1RCQ1JfU1RNMFNUIHwKQEAgLTUwLDUgKzUwLDUxIEBACiAJdjggJj0gfkRBQ1JfREFFOwogCWN0cmxfb3V0Yih2OCxEQUNSKTsKIAotCXJldHVybiAwOworCXY4ID0gY3RybF9pbmIoU0NQRFIpOworCXY4IHw9IFNDUERSX1RTX1NDQU5fWCB8IFNDUERSX1RTX1NDQU5fWTsKKwl2OCAmPSB+U0NQRFJfVFNfU0NBTl9FTkFCTEU7CisJY3RybF9vdXRiKHY4LCBTQ1BEUik7CisKKwl2ID0gY3RybF9pbncoU0NQQ1IpOworCXYgJj0gflNDUENSX1RTX01BU0s7CisJdiB8PSBTQ1BDUl9UU19FTkFCTEU7CisJY3RybF9vdXR3KHYsIFNDUENSKTsKIH0KKworLyoKKyAqIFhYWDogVGhpcyBpcyBzdHVwaWQsIHdlIHNob3VsZCBoYXZlIGEgZ2VuZXJpYyBtYWNoaW5lIHZlY3RvciBmb3IgdGhlIGNjaGlwcworICogYW5kIGp1c3Qgd3JhcCB0aGUgcGxhdGZvcm0gc2V0dXAgY29kZSBpbiB0byB0aGlzLCBhcyBpdCdzIHRoZSBvbmx5IHRoaW5nCisgKiB0aGF0IGVuZHMgdXAgYmVpbmcgZGlmZmVyZW50LgorICovCitzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfaHA2eHggX19pbml0bXYgPSB7CisJLm12X25hbWUgPSAiaHA2eHgiLAorCS5tdl9zZXR1cCA9IGhwNnh4X3NldHVwLAorCS5tdl9ucl9pcnFzID0gSEQ2NDQ2MV9JUlFCQVNFICsgSEQ2NDQ2MV9JUlFfTlVNLAorCisJLm12X2luYiA9IGhkNjQ0NjFfaW5iLAorCS5tdl9pbncgPSBoZDY0NDYxX2ludywKKwkubXZfaW5sID0gaGQ2NDQ2MV9pbmwsCisJLm12X291dGIgPSBoZDY0NDYxX291dGIsCisJLm12X291dHcgPSBoZDY0NDYxX291dHcsCisJLm12X291dGwgPSBoZDY0NDYxX291dGwsCisKKwkubXZfaW5iX3AgPSBoZDY0NDYxX2luYl9wLAorCS5tdl9pbndfcCA9IGhkNjQ0NjFfaW53LAorCS5tdl9pbmxfcCA9IGhkNjQ0NjFfaW5sLAorCS5tdl9vdXRiX3AgPSBoZDY0NDYxX291dGJfcCwKKwkubXZfb3V0d19wID0gaGQ2NDQ2MV9vdXR3LAorCS5tdl9vdXRsX3AgPSBoZDY0NDYxX291dGwsCisKKwkubXZfaW5zYiA9IGhkNjQ0NjFfaW5zYiwKKwkubXZfaW5zdyA9IGhkNjQ0NjFfaW5zdywKKwkubXZfaW5zbCA9IGhkNjQ0NjFfaW5zbCwKKwkubXZfb3V0c2IgPSBoZDY0NDYxX291dHNiLAorCS5tdl9vdXRzdyA9IGhkNjQ0NjFfb3V0c3csCisJLm12X291dHNsID0gaGQ2NDQ2MV9vdXRzbCwKKworCS5tdl9yZWFkdyA9IGhkNjQ0NjFfcmVhZHcsCisJLm12X3dyaXRldyA9IGhkNjQ0NjFfd3JpdGV3LAorCisJLm12X2lycV9kZW11eCA9IGhkNjQ0NjFfaXJxX2RlbXV4LAorfTsKK0FMSUFTX01WKGhwNnh4KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL2xhbmRpc2svTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllNGJlYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvYm9hcmRzL2xhbmRpc2svTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisjCisjIE1ha2VmaWxlIGZvciBJLU8gREFUQSBERVZJQ0UsIElOQy4gIkxBTkRJU0sgU2VyaWVzIgorIworCitvYmoteQkgOj0gc2V0dXAubyBpby5vIGlycS5vIHJ0Yy5vIGxhbmRpc2tfcHdiLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2xhbmRpc2svaW8uYyBiL2FyY2gvc2gvYm9hcmRzL2xhbmRpc2svaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjQ5OGI0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9pby5jCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9pby5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxICBJYW4gZGEgU2lsdmEsIEplcmVteSBTaWVnZWwKKyAqIEJhc2VkIGxhcmdlbHkgb24gaW9fc2UuYy4KKyAqCisgKiBJL08gcm91dGluZSBmb3IgSS1PIERhdGEgRGV2aWNlLCBJbmMuIExBTkRJU0suCisgKgorICogSW5pdGlhbCB2ZXJzaW9uIG9ubHkgdG8gc3VwcG9ydCBMQU4gYWNjZXNzOyBzb21lCisgKiBwbGFjZWhvbGRlciBjb2RlIGZyb20gaW9fbGFuZGlzay5jIGxlZnQgaW4gd2l0aCB0aGUKKyAqIGV4cGVjdGF0aW9uIG9mIGxhdGVyIFN1cGVySU8gYW5kIFBDTUNJQSBhY2Nlc3MuCisgKi8KKy8qCisgKiBtb2RpZmVkIGJ5IGtvZ2lpZGVuYQorICogMjAwNS4wMy4wMworICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vbGFuZGlzay9pb2RhdGFfbGFuZGlzay5oPgorI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworZXh0ZXJuIHZvaWQgKmFyZWE1X2lvX2Jhc2U7CS8qIEFyZWEgNSBJL08gQmFzZSBhZGRyZXNzICovCitleHRlcm4gdm9pZCAqYXJlYTZfaW9fYmFzZTsJLyogQXJlYSA2IEkvTyBCYXNlIGFkZHJlc3MgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBvcnQyYWRyKHVuc2lnbmVkIGludCBwb3J0KQoreworCWlmICgoMHgxZjAgPD0gcG9ydCAmJiBwb3J0IDwgMHgxZjgpIHx8IHBvcnQgPT0gMHgzZjYpCisJCWlmIChwb3J0ID09IDB4M2Y2KQorCQkJcmV0dXJuICgodW5zaWduZWQgbG9uZylhcmVhNV9pb19iYXNlICsgMHgyYyk7CisJCWVsc2UKKwkJCXJldHVybiAoKHVuc2lnbmVkIGxvbmcpYXJlYTVfaW9fYmFzZSArIFBBX1BJREVfT0ZGU0VUICsKKwkJCQkoKHBvcnQgLSAweDFmMCkgPDwgMSkpOworCWVsc2UgaWYgKCgweDE3MCA8PSBwb3J0ICYmIHBvcnQgPCAweDE3OCkgfHwgcG9ydCA9PSAweDM3NikKKwkJaWYgKHBvcnQgPT0gMHgzNzYpCisJCQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKWFyZWE2X2lvX2Jhc2UgKyAweDJjKTsKKwkJZWxzZQorCQkJcmV0dXJuICgodW5zaWduZWQgbG9uZylhcmVhNl9pb19iYXNlICsgUEFfU0lERV9PRkZTRVQgKworCQkJCSgocG9ydCAtIDB4MTcwKSA8PCAxKSk7CisJZWxzZQorCQltYXliZWJhZGlvKCh1bnNpZ25lZCBsb25nKXBvcnQpOworCisJcmV0dXJuIHBvcnQ7Cit9CisKKy8qCisgKiBHZW5lcmFsIG91dGxpbmU6IHJlbWFwIHJlYWxseSBsb3cgc3R1ZmYgW2V2ZW50dWFsbHldIHRvIFN1cGVySU8sCisgKiBzdHVmZiBpbiBQQ0kgSU8gc3BhY2UgKGF0IG9yIGFib3ZlIHdpbmRvdyBhdCBwY2kuaDpQQ0lCSU9TX01JTl9JTykKKyAqIGlzIG1hcHBlZCB0aHJvdWdoIHRoZSBQQ0kgSU8gd2luZG93LiAgU3R1ZmYgd2l0aCBoaWdoIGJpdHMgKFBYU0VHKQorICogc2hvdWxkIGJlIHdheSBiZXlvbmQgdGhlIHdpbmRvdywgYW5kIGlzIHVzZWQgIHcvbyB0cmFuc2xhdGlvbiBmb3IKKyAqIGNvbXBhdGliaWxpdHkuCisgKi8KK3U4IGxhbmRpc2tfaW5iKHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlpZiAoUFhTRUcocG9ydCkpCisJCXJldHVybiBjdHJsX2luYihwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQorCQlyZXR1cm4gY3RybF9pbmIocGNpX2lvYWRkcihwb3J0KSk7CisKKwlyZXR1cm4gY3RybF9pbncocG9ydDJhZHIocG9ydCkpICYgMHhmZjsKK30KKwordTggbGFuZGlza19pbmJfcCh1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJdTggdjsKKworCWlmIChQWFNFRyhwb3J0KSkKKwkJdiA9IGN0cmxfaW5iKHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisJCXYgPSBjdHJsX2luYihwY2lfaW9hZGRyKHBvcnQpKTsKKwllbHNlCisJCXYgPSBjdHJsX2ludyhwb3J0MmFkcihwb3J0KSkgJiAweGZmOworCisJY3RybF9kZWxheSgpOworCisJcmV0dXJuIHY7Cit9CisKK3UxNiBsYW5kaXNrX2ludyh1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJaWYgKFBYU0VHKHBvcnQpKQorCQlyZXR1cm4gY3RybF9pbncocG9ydCk7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKwkJcmV0dXJuIGN0cmxfaW53KHBjaV9pb2FkZHIocG9ydCkpOworCWVsc2UKKwkJbWF5YmViYWRpbyhwb3J0KTsKKworCXJldHVybiAwOworfQorCit1MzIgbGFuZGlza19pbmwodW5zaWduZWQgbG9uZyBwb3J0KQoreworCWlmIChQWFNFRyhwb3J0KSkKKwkJcmV0dXJuIGN0cmxfaW5sKHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisJCXJldHVybiBjdHJsX2lubChwY2lfaW9hZGRyKHBvcnQpKTsKKwllbHNlCisJCW1heWJlYmFkaW8ocG9ydCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBsYW5kaXNrX291dGIodTggdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlpZiAoUFhTRUcocG9ydCkpCisJCWN0cmxfb3V0Yih2YWx1ZSwgcG9ydCk7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKwkJY3RybF9vdXRiKHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKKwllbHNlCisJCWN0cmxfb3V0dyh2YWx1ZSwgcG9ydDJhZHIocG9ydCkpOworfQorCit2b2lkIGxhbmRpc2tfb3V0Yl9wKHU4IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJaWYgKFBYU0VHKHBvcnQpKQorCQljdHJsX291dGIodmFsdWUsIHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisJCWN0cmxfb3V0Yih2YWx1ZSwgcGNpX2lvYWRkcihwb3J0KSk7CisJZWxzZQorCQljdHJsX291dHcodmFsdWUsIHBvcnQyYWRyKHBvcnQpKTsKKwljdHJsX2RlbGF5KCk7Cit9CisKK3ZvaWQgbGFuZGlza19vdXR3KHUxNiB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCWlmIChQWFNFRyhwb3J0KSkKKwkJY3RybF9vdXR3KHZhbHVlLCBwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQorCQljdHJsX291dHcodmFsdWUsIHBjaV9pb2FkZHIocG9ydCkpOworCWVsc2UKKwkJbWF5YmViYWRpbyhwb3J0KTsKK30KKwordm9pZCBsYW5kaXNrX291dGwodTMyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJaWYgKFBYU0VHKHBvcnQpKQorCQljdHJsX291dGwodmFsdWUsIHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisJCWN0cmxfb3V0bCh2YWx1ZSwgcGNpX2lvYWRkcihwb3J0KSk7CisJZWxzZQorCQltYXliZWJhZGlvKHBvcnQpOworfQorCit2b2lkIGxhbmRpc2tfaW5zYih1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKyAgICAgICAgdm9sYXRpbGUgdTE2ICpwOworICAgICAgICB1OCAqYnVmID0gZHN0OworCisgICAgICAgIGlmIChQWFNFRyhwb3J0KSkgeworICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudC0tKQorICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZisrID0gKih2b2xhdGlsZSB1OCAqKXBvcnQ7CisJfSBlbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKSB7CisgICAgICAgICAgICAgICAgdm9sYXRpbGUgdTggKmJwID0gKHZvbGF0aWxlIHU4ICopcGNpX2lvYWRkcihwb3J0KTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudC0tKQorICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZisrID0gKmJwOworCX0gZWxzZSB7CisgICAgICAgICAgICAgICAgcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0MmFkcihwb3J0KTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoY291bnQtLSkKKyAgICAgICAgICAgICAgICAgICAgICAgICpidWYrKyA9ICpwICYgMHhmZjsKKwl9Cit9CisKK3ZvaWQgbGFuZGlza19pbnN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworICAgICAgICB2b2xhdGlsZSB1MTYgKnA7CisgICAgICAgIHUxNiAqYnVmID0gZHN0OworCisJaWYgKFBYU0VHKHBvcnQpKQorCQlwID0gKHZvbGF0aWxlIHUxNiAqKXBvcnQ7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKwkJcCA9ICh2b2xhdGlsZSB1MTYgKilwY2lfaW9hZGRyKHBvcnQpOworCWVsc2UKKwkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0MmFkcihwb3J0KTsKKwl3aGlsZSAoY291bnQtLSkKKwkJKmJ1ZisrID0gKnA7Cit9CisKK3ZvaWQgbGFuZGlza19pbnNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworICAgICAgICB1MzIgKmJ1ZiA9IGRzdDsKKworCWlmIChpc19wY2lfaW9hZGRyKHBvcnQpKSB7CisgICAgICAgICAgICAgICAgdm9sYXRpbGUgdTMyICpwID0gKHZvbGF0aWxlIHUzMiAqKXBjaV9pb2FkZHIocG9ydCk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoY291bnQtLSkKKyAgICAgICAgICAgICAgICAgICAgICAgICpidWYrKyA9ICpwOworCX0gZWxzZQorCQltYXliZWJhZGlvKHBvcnQpOworfQorCit2b2lkIGxhbmRpc2tfb3V0c2IodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisgICAgICAgIHZvbGF0aWxlIHUxNiAqcDsKKyAgICAgICAgY29uc3QgdTggKmJ1ZiA9IHNyYzsKKworCWlmIChQWFNFRyhwb3J0KSkKKyAgICAgICAgICAgICAgICB3aGlsZSAoY291bnQtLSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxfb3V0YigqYnVmKyssIHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpIHsKKyAgICAgICAgICAgICAgICB2b2xhdGlsZSB1OCAqYnAgPSAodm9sYXRpbGUgdTggKilwY2lfaW9hZGRyKHBvcnQpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKGNvdW50LS0pCisgICAgICAgICAgICAgICAgICAgICAgICAqYnAgPSAqYnVmKys7CisJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwID0gKHZvbGF0aWxlIHUxNiAqKXBvcnQyYWRyKHBvcnQpOworICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudC0tKQorICAgICAgICAgICAgICAgICAgICAgICAgKnAgPSAqYnVmKys7CisJfQorfQorCit2b2lkIGxhbmRpc2tfb3V0c3codW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisgICAgICAgIHZvbGF0aWxlIHUxNiAqcDsKKyAgICAgICAgY29uc3QgdTE2ICpidWYgPSBzcmM7CisKKwlpZiAoUFhTRUcocG9ydCkpCisgICAgICAgICAgICAgICAgcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0OworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisgICAgICAgICAgICAgICAgcCA9ICh2b2xhdGlsZSB1MTYgKilwY2lfaW9hZGRyKHBvcnQpOworCWVsc2UKKyAgICAgICAgICAgICAgICBwID0gKHZvbGF0aWxlIHUxNiAqKXBvcnQyYWRyKHBvcnQpOworCisgICAgICAgIHdoaWxlIChjb3VudC0tKQorICAgICAgICAgICAgICAgICpwID0gKmJ1ZisrOworfQorCit2b2lkIGxhbmRpc2tfb3V0c2wodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisgICAgICAgIGNvbnN0IHUzMiAqYnVmID0gc3JjOworCisJaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpIHsKKyAgICAgICAgICAgICAgICB2b2xhdGlsZSB1MzIgKnAgPSAodm9sYXRpbGUgdTMyICopcGNpX2lvYWRkcihwb3J0KTsKKworICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudC0tKQorICAgICAgICAgICAgICAgICAgICAgICAgKnAgPSAqYnVmKys7CisJfSBlbHNlCisJCW1heWJlYmFkaW8ocG9ydCk7Cit9CisKK3ZvaWQgX19pb21lbSAqbGFuZGlza19pb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IHNpemUpCit7CisgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgX19pb21lbSAqKXBvcnQ7CisgICAgICAgIGVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICh2b2lkIF9faW9tZW0gKilwY2lfaW9hZGRyKHBvcnQpOworCisgICAgICAgIHJldHVybiAodm9pZCBfX2lvbWVtICopcG9ydDJhZHIocG9ydCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9sYW5kaXNrL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDA2ZDY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9pcnEuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9pcnEuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAgSWFuIGRhIFNpbHZhLCBKZXJlbXkgU2llZ2VsCisgKiBCYXNlZCBsYXJnZWx5IG9uIGlvX3NlLmMuCisgKgorICogSS9PIHJvdXRpbmUgZm9yIEktTyBEYXRhIERldmljZSwgSW5jLiBMQU5ESVNLLgorICoKKyAqIEluaXRpYWwgdmVyc2lvbiBvbmx5IHRvIHN1cHBvcnQgTEFOIGFjY2Vzczsgc29tZQorICogcGxhY2Vob2xkZXIgY29kZSBmcm9tIGlvX2xhbmRpc2suYyBsZWZ0IGluIHdpdGggdGhlCisgKiBleHBlY3RhdGlvbiBvZiBsYXRlciBTdXBlcklPIGFuZCBQQ01DSUEgYWNjZXNzLgorICovCisvKgorICogbW9kaWZpZWQgYnkga29naWlkZW5hCisgKiAyMDA1LjAzLjAzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2xhbmRpc2svaW9kYXRhX2xhbmRpc2suaD4KKworc3RhdGljIHZvaWQgZW5hYmxlX2xhbmRpc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpOworc3RhdGljIHZvaWQgZGlzYWJsZV9sYW5kaXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKworLyogc2h1dGRvd24gaXMgc2FtZSBhcyAiZGlzYWJsZSIgKi8KKyNkZWZpbmUgc2h1dGRvd25fbGFuZGlza19pcnEgZGlzYWJsZV9sYW5kaXNrX2lycQorCitzdGF0aWMgdm9pZCBhY2tfbGFuZGlza19pcnEodW5zaWduZWQgaW50IGlycSk7CitzdGF0aWMgdm9pZCBlbmRfbGFuZGlza19pcnEodW5zaWduZWQgaW50IGlycSk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9sYW5kaXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWVuYWJsZV9sYW5kaXNrX2lycShpcnEpOworCXJldHVybiAwOwkJLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLworfQorCitzdGF0aWMgdm9pZCBkaXNhYmxlX2xhbmRpc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisJdW5zaWduZWQgY2hhciBtYXNrID0gMHhmZiBeICgweDAxIDw8IChpcnEgLSA1KSk7CisKKwkvKiBTZXQgdGhlIHByaW9yaXR5IGluIElQUiB0byAwICovCisJdmFsID0gY3RybF9pbmIoUEFfSU1BU0spOworCXZhbCAmPSBtYXNrOworCWN0cmxfb3V0Yih2YWwsIFBBX0lNQVNLKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX2xhbmRpc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgY2hhciB2YWw7CisJdW5zaWduZWQgY2hhciB2YWx1ZSA9ICgweDAxIDw8IChpcnEgLSA1KSk7CisKKwkvKiBTZXQgcHJpb3JpdHkgaW4gSVBSIGJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgKi8KKwl2YWwgPSBjdHJsX2luYihQQV9JTUFTSyk7CisJdmFsIHw9IHZhbHVlOworCWN0cmxfb3V0Yih2YWwsIFBBX0lNQVNLKTsKK30KKworc3RhdGljIHZvaWQgYWNrX2xhbmRpc2tfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJZGlzYWJsZV9sYW5kaXNrX2lycShpcnEpOworfQorCitzdGF0aWMgdm9pZCBlbmRfbGFuZGlza19pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUQgfCBJUlFfSU5QUk9HUkVTUykpKQorCQllbmFibGVfbGFuZGlza19pcnEoaXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBsYW5kaXNrX2lycV90eXBlID0geworCS50eXBlbmFtZSA9ICJMQU5ESVNLIElSUSIsCisJLnN0YXJ0dXAgPSBzdGFydHVwX2xhbmRpc2tfaXJxLAorCS5zaHV0ZG93biA9IHNodXRkb3duX2xhbmRpc2tfaXJxLAorCS5lbmFibGUgPSBlbmFibGVfbGFuZGlza19pcnEsCisJLmRpc2FibGUgPSBkaXNhYmxlX2xhbmRpc2tfaXJxLAorCS5hY2sgPSBhY2tfbGFuZGlza19pcnEsCisJLmVuZCA9IGVuZF9sYW5kaXNrX2lycQorfTsKKworc3RhdGljIHZvaWQgbWFrZV9sYW5kaXNrX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOworCWlycV9kZXNjW2lycV0uaGFuZGxlciA9ICZsYW5kaXNrX2lycV90eXBlOworCWRpc2FibGVfbGFuZGlza19pcnEoaXJxKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgSVJRIHNldHRpbmcKKyAqLwordm9pZCBfX2luaXQgaW5pdF9sYW5kaXNrX0lSUSh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gNTsgaSA8IDE0OyBpKyspCisJCW1ha2VfbGFuZGlza19pcnEoaSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9sYW5kaXNrL2xhbmRpc2tfcHdiLmMgYi9hcmNoL3NoL2JvYXJkcy9sYW5kaXNrL2xhbmRpc2tfcHdiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1Y2I1NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvYm9hcmRzL2xhbmRpc2svbGFuZGlza19wd2IuYwpAQCAtMCwwICsxLDM0OCBAQAorLyoKKyAqIGFyY2gvc2gvYm9hcmRzL2xhbmRpc2svbGFuZGlza19wd2IuYyAtLSBkcml2ZXIgZm9yIHRoZSBQb3dlciBjb250cm9sIHN3aXRjaC4KKyAqCisgKiBUaGlzIGRyaXZlciB3aWxsIGFsc28gc3VwcG9ydCB0aGUgSS1PIERBVEEgRGV2aWNlLCBJbmMuIExBTkRJU0sgQm9hcmQuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weWxpZ2h0IChDKSAyMDAyIEF0b20gQ3JlYXRlIEVuZ2luZWVyaW5nIENvLiwgTHRkLgorICoKKyAqIExFRCBjb250cm9sIGRyaXZlIGZ1bmN0aW9uIGFkZGVkIGJ5IGtvZ2lpZGVuYQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vbGFuZGlzay9pb2RhdGFfbGFuZGlzay5oPgorCisjZGVmaW5lIFNIVVRET1dOX0JUTl9NSU5PUgkxCS8qIFNodXRkb3duIGJ1dHRvbiBkZXZpY2UgbWlub3Igbm8uICovCisjZGVmaW5lIExFRF9NSU5PUgkgICAgICAgMjEJLyogTEVEIG1pbm9yIG5vLiAqLworI2RlZmluZSBCVE5fTUlOT1IJICAgICAgIDIyCS8qIEJVVFRPTiBtaW5vciBuby4gKi8KKyNkZWZpbmUgR0lPX01JTk9SCSAgICAgICA0MAkvKiBHSU8gbWlub3Igbm8uICovCisKK3N0YXRpYyBpbnQgb3BlbkNudDsKK3N0YXRpYyBpbnQgb3BlbkNudExFRDsKK3N0YXRpYyBpbnQgb3BlbkNudEdpbzsKK3N0YXRpYyBpbnQgb3BlbkNudEJ0bjsKK3N0YXRpYyBpbnQgbGFuZGlza19idG47CitzdGF0aWMgaW50IGxhbmRpc2tfYnRuY3RybHBpZDsKKy8qCisgKiBGdW5jdGlvbnMgcHJvdG90eXBlcworICovCisKK3N0YXRpYyBpbnQgZ2lvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworc3RhdGljIGludCBzd2Rydl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWludCBtaW5vcjsKKworCW1pbm9yID0gTUlOT1IoaW5vZGUtPmlfcmRldik7CisJZmlscC0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKiltaW5vcjsKKworCWlmIChtaW5vciA9PSBTSFVURE9XTl9CVE5fTUlOT1IpIHsKKwkJaWYgKG9wZW5DbnQgPiAwKSB7CisJCQlyZXR1cm4gLUVBTFJFQURZOworCQl9IGVsc2UgeworCQkJb3BlbkNudCsrOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgaWYgKG1pbm9yID09IExFRF9NSU5PUikgeworCQlpZiAob3BlbkNudExFRCA+IDApIHsKKwkJCXJldHVybiAtRUFMUkVBRFk7CisJCX0gZWxzZSB7CisJCQlvcGVuQ250TEVEKys7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSBpZiAobWlub3IgPT0gQlROX01JTk9SKSB7CisJCWlmIChvcGVuQ250QnRuID4gMCkgeworCQkJcmV0dXJuIC1FQUxSRUFEWTsKKwkJfSBlbHNlIHsKKwkJCW9wZW5DbnRCdG4rKzsKKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIGlmIChtaW5vciA9PSBHSU9fTUlOT1IpIHsKKwkJaWYgKG9wZW5DbnRHaW8gPiAwKSB7CisJCQlyZXR1cm4gLUVBTFJFQURZOworCQl9IGVsc2UgeworCQkJb3BlbkNudEdpbysrOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIC1FTk9FTlQ7CisKK30KKworc3RhdGljIGludCBzd2Rydl9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpbnQgbWlub3I7CisKKwltaW5vciA9IE1JTk9SKGlub2RlLT5pX3JkZXYpOworCWlmIChtaW5vciA9PSBTSFVURE9XTl9CVE5fTUlOT1IpIHsKKwkJb3BlbkNudC0tOworCX0gZWxzZSBpZiAobWlub3IgPT0gTEVEX01JTk9SKSB7CisJCW9wZW5DbnRMRUQtLTsKKwl9IGVsc2UgaWYgKG1pbm9yID09IEJUTl9NSU5PUikgeworCQlvcGVuQ250QnRuLS07CisJfSBlbHNlIGlmIChtaW5vciA9PSBHSU9fTUlOT1IpIHsKKwkJb3BlbkNudEdpby0tOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzd2Rydl9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyICpidWZmLCBzaXplX3QgY291bnQsCisJCSAgICAgIGxvZmZfdCAqIHBwb3MpCit7CisJaW50IG1pbm9yOworCW1pbm9yID0gKGludCkoZmlscC0+cHJpdmF0ZV9kYXRhKTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHZvaWQgKilidWZmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKG1pbm9yID09IFNIVVRET1dOX0JUTl9NSU5PUikgeworCQlpZiAobGFuZGlza19idG4gJiAweDEwKSB7CisJCQlwdXRfdXNlcigxLCBidWZmKTsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3dkcnZfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgKmJ1ZmYsIHNpemVfdCBjb3VudCwKKwkJICAgICAgIGxvZmZfdCAqIHBwb3MpCit7CisJaW50IG1pbm9yOworCW1pbm9yID0gKGludCkoZmlscC0+cHJpdmF0ZV9kYXRhKTsKKworCWlmIChtaW5vciA9PSBTSFVURE9XTl9CVE5fTUlOT1IpIHsKKwkJcmV0dXJuIGNvdW50OworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzd19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlsYW5kaXNrX2J0biA9ICgweDBmZiAmICh+Y3RybF9pbmIoUEFfU1RBVFVTKSkpOworCWRpc2FibGVfaXJxKElSUV9CVVRUT04pOworCWRpc2FibGVfaXJxKElSUV9QT1dFUik7CisJY3RybF9vdXRiKDB4MDAsIFBBX1BXUklOVF9DTFIpOworCisJaWYgKGxhbmRpc2tfYnRuY3RybHBpZCAhPSAwKSB7CisJCWtpbGxfcHJvYyhsYW5kaXNrX2J0bmN0cmxwaWQsIFNJR1VTUjEsIDEpOworCQlsYW5kaXNrX2J0bmN0cmxwaWQgPSAwOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3dkcnZfZm9wcyA9IHsKKwkucmVhZCA9IHN3ZHJ2X3JlYWQsCS8qIHJlYWQgKi8KKwkud3JpdGUgPSBzd2Rydl93cml0ZSwJLyogd3JpdGUgKi8KKwkub3BlbiA9IHN3ZHJ2X29wZW4sCS8qIG9wZW4gKi8KKwkucmVsZWFzZSA9IHN3ZHJ2X2Nsb3NlLAkvKiByZWxlYXNlICovCisJLmlvY3RsID0gZ2lvX2lvY3RsLAkvKiBpb2N0bCAqLworCit9OworCitzdGF0aWMgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0KKyAgICBLRVJOX0lORk8gIkxBTkRJU0sgYW5kIFVTTC01UCBCdXR0b24sIExFRCBhbmQgR0lPIGRyaXZlciBpbml0aWFsaXplZFxuIjsKKworaW50IF9faW5pdCBzd2Rydl9pbml0KHZvaWQpCit7CisJaW50IGVycm9yOworCisJcHJpbnRrKCIlcyIsIGJhbm5lcik7CisKKwlvcGVuQ250ID0gMDsKKwlvcGVuQ250TEVEID0gMDsKKwlvcGVuQ250QnRuID0gMDsKKwlvcGVuQ250R2lvID0gMDsKKwlsYW5kaXNrX2J0biA9IDA7CisJbGFuZGlza19idG5jdHJscGlkID0gMDsKKworCWlmICgoZXJyb3IgPSByZWdpc3Rlcl9jaHJkZXYoU0hVVERPV05fQlROX01BSk9SLCAic3dkcnYiLCAmc3dkcnZfZm9wcykpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgIkJ1dHRvbiwgTEVEIGFuZCBHSU8gZHJpdmVyOkNvdWxkbid0IHJlZ2lzdGVyIGRyaXZlciwgZXJyb3I9JWRcbiIsCisJCSAgICAgICBlcnJvcik7CisJCXJldHVybiAxOworCX0KKworCWlmIChyZXF1ZXN0X2lycShJUlFfUE9XRVIsIHN3X2ludGVycnVwdCwgMCwgIlNIVVRET1dOU1dJVENIIiwgTlVMTCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gZ2V0IElSUSAxMS5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHJlcXVlc3RfaXJxKElSUV9CVVRUT04sIHN3X2ludGVycnVwdCwgMCwgIlVTTC01UCBCVVRUT04iLCBOVUxMKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBnZXQgSVJRIDEyLlxuIik7CisJCXJldHVybiAxOworCX0KKwljdHJsX291dGIoMHgwMCwgUEFfUFdSSU5UX0NMUik7CisKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQoc3dkcnZfaW5pdCk7CisKKy8qCisgKiBnaW8gZHJpdmVyCisgKgorICovCisKKyNpbmNsdWRlIDxhc20vbGFuZGlzay9naW8uaD4KKworc3RhdGljIGludCBnaW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG1pbm9yOworCXVuc2lnbmVkIGludCBkYXRhLCBtYXNrOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgYWRkciA9IDA7CisKKwltaW5vciA9IChpbnQpKGZpbHAtPnByaXZhdGVfZGF0YSk7CisKKwkvKiBhY2Nlc3MgY29udHJvbCAqLworCWlmIChtaW5vciA9PSBHSU9fTUlOT1IpIHsKKwkJOworCX0gZWxzZSBpZiAobWlub3IgPT0gTEVEX01JTk9SKSB7CisJCWlmICgoKGNtZCAmIDB4MGZmKSA+PSA5KSAmJiAoKGNtZCAmIDB4MGZmKSA8IDIwKSkgeworCQkJOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYgKG1pbm9yID09IEJUTl9NSU5PUikgeworCQlpZiAoKChjbWQgJiAweDBmZikgPj0gMjApICYmICgoY21kICYgMHgwZmYpIDwgMzApKSB7CisJCQk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjbWQgJiAweDAxKSB7CS8qIHdyaXRlICovCisJCWlmIChjb3B5X2Zyb21fdXNlcigmZGF0YSwgKGludCAqKWFyZywgc2l6ZW9mKGludCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBHSU9EUlZfSU9DU0dJT1NFVEFERFI6CS8qIGFkZHJlcyBzZXQgKi8KKwkJYWRkciA9IGRhdGE7CisJCWJyZWFrOworCisJY2FzZSBHSU9EUlZfSU9DU0dJT0RBVEExOgkvKiB3cml0ZSBieXRlICovCisJCWN0cmxfb3V0YigodW5zaWduZWQgY2hhcikoMHgwZmYgJiBkYXRhKSwgYWRkcik7CisJCWJyZWFrOworCisJY2FzZSBHSU9EUlZfSU9DU0dJT0RBVEEyOgkvKiB3cml0ZSB3b3JkICovCisJCWlmIChhZGRyICYgMHgwMSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJY3RybF9vdXR3KCh1bnNpZ25lZCBzaG9ydCBpbnQpKDB4MGZmZmYgJiBkYXRhKSwgYWRkcik7CisJCWJyZWFrOworCisJY2FzZSBHSU9EUlZfSU9DU0dJT0RBVEE0OgkvKiB3cml0ZSBsb25nICovCisJCWlmIChhZGRyICYgMHgwMykgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJY3RybF9vdXRsKGRhdGEsIGFkZHIpOworCQlicmVhazsKKworCWNhc2UgR0lPRFJWX0lPQ0dHSU9EQVRBMToJLyogcmVhZCBieXRlICovCisJCWRhdGEgPSBjdHJsX2luYihhZGRyKTsKKwkJYnJlYWs7CisKKwljYXNlIEdJT0RSVl9JT0NHR0lPREFUQTI6CS8qIHJlYWQgd29yZCAqLworCQlpZiAoYWRkciAmIDB4MDEpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWRhdGEgPSBjdHJsX2ludyhhZGRyKTsKKwkJYnJlYWs7CisKKwljYXNlIEdJT0RSVl9JT0NHR0lPREFUQTQ6CS8qIHJlYWQgbG9uZyAqLworCQlpZiAoYWRkciAmIDB4MDMpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWRhdGEgPSBjdHJsX2lubChhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBHSU9EUlZfSU9DU0dJT19MRUQ6CS8qIHdyaXRlICovCisJCW1hc2sgPSAoKGRhdGEgJiAweDAwZmZmZmZmKSA8PCA4KQorCQkgICAgfCAoKGRhdGEgJiAweDAwMDBmZmZmKSA8PCAxNikKKwkJICAgIHwgKChkYXRhICYgMHgwMDAwMDBmZikgPDwgMjQpOworCQlsYW5kaXNrX2xlZHBhcmFtID0gZGF0YSAmICh+bWFzayk7CisJCWlmIChsYW5kaXNrX2FyY2ggPT0gMCkgewkvKiBhcmNoID09IGxhbmRpc2sgKi8KKwkJCWxhbmRpc2tfbGVkcGFyYW0gJj0gMHgwMzAzMDMwMzsKKwkJCW1hc2sgPSAofihsYW5kaXNrX2xlZHBhcmFtID4+IDIyKSkgJiAweDAwMGM7CisJCQlsYW5kaXNrX2xlZHBhcmFtIHw9IG1hc2s7CisJCX0gZWxzZSB7CSAgICAgICAgICAgICAgICAvKiBhcmNoID09IHVzbC01cCAqLworCQkJbWFzayA9IChsYW5kaXNrX2xlZHBhcmFtID4+IDI0KSAmIDB4MDAwMTsKKwkJCWxhbmRpc2tfbGVkcGFyYW0gfD0gbWFzazsKKwkJCWxhbmRpc2tfbGVkcGFyYW0gJj0gMHgwMDdmN2Y3ZjsKKwkJfQorCQlsYW5kaXNrX2xlZHBhcmFtIHw9IDB4ODA7CisJCWJyZWFrOworCWNhc2UgR0lPRFJWX0lPQ0dHSU9fTEVEOgkvKiByZWFkICovCisJCWRhdGEgPSBsYW5kaXNrX2xlZHBhcmFtOworCQlpZiAobGFuZGlza19hcmNoID09IDApIHsJLyogYXJjaCA9PSBsYW5kaXNrICovCisJCQlkYXRhICY9IDB4MDMwMzAzMDM7CisJCX0gZWxzZSB7CSAgICAgICAgICAgICAgICAvKiBhcmNoID09IHVzbC01cCAqLworCQkJOworCQl9CisJCWRhdGEgJj0gKH4weDA4MCk7CisJCWJyZWFrOworCWNhc2UgR0lPRFJWX0lPQ1NHSU9fQlVaWkVSOgkvKiB3cml0ZSAqLworCQlsYW5kaXNrX2J1enplcnBhcmFtID0gZGF0YTsKKwkJbGFuZGlza19sZWRwYXJhbSB8PSAweDgwOworCQlicmVhazsKKwljYXNlIEdJT0RSVl9JT0NHR0lPX0xBTkRJU0s6CS8qIHJlYWQgKi8KKwkJZGF0YSA9IGxhbmRpc2tfYXJjaCAmIDB4MDE7CisJCWJyZWFrOworCWNhc2UgR0lPRFJWX0lPQ0dHSU9fQlROOgkvKiByZWFkICovCisJCWRhdGEgPSAoMHgwZmYgJiBjdHJsX2luYihQQV9QV1JJTlRfQ0xSKSk7CisJCWRhdGEgPDw9IDg7CisJCWRhdGEgfD0gKDB4MGZmICYgY3RybF9pbmIoUEFfSU1BU0spKTsKKwkJZGF0YSA8PD0gODsKKwkJZGF0YSB8PSAoMHgwZmYgJiBsYW5kaXNrX2J0bik7CisJCWRhdGEgPDw9IDg7CisJCWRhdGEgfD0gKDB4MGZmICYgKH5jdHJsX2luYihQQV9TVEFUVVMpKSk7CisJCWJyZWFrOworCWNhc2UgR0lPRFJWX0lPQ1NHSU9fQlROUElEOgkvKiB3cml0ZSAqLworCQlsYW5kaXNrX2J0bmN0cmxwaWQgPSBkYXRhOworCQlsYW5kaXNrX2J0biA9IDA7CisJCWlmIChpcnFfZGVzY1tJUlFfQlVUVE9OXS5kZXB0aCkgeworCQkJZW5hYmxlX2lycShJUlFfQlVUVE9OKTsKKwkJfQorCQlpZiAoaXJxX2Rlc2NbSVJRX1BPV0VSXS5kZXB0aCkgeworCQkJZW5hYmxlX2lycShJUlFfUE9XRVIpOworCQl9CisJCWJyZWFrOworCWNhc2UgR0lPRFJWX0lPQ0dHSU9fQlROUElEOgkvKiByZWFkICovCisJCWRhdGEgPSBsYW5kaXNrX2J0bmN0cmxwaWQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwl9CisKKwlpZiAoKGNtZCAmIDB4MDEpID09IDApIHsJLyogcmVhZCAqLworCQlpZiAoY29weV90b191c2VyKChpbnQgKilhcmcsICZkYXRhLCBzaXplb2YoaW50KSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbGFuZGlzay9ydGMuYyBiL2FyY2gvc2gvYm9hcmRzL2xhbmRpc2svcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzViYTcyNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvYm9hcmRzL2xhbmRpc2svcnRjLmMKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIGFyY2gvc2gvYm9hcmRzL2xhbmRpc2svcnRjLmMgLS0gIFJUQyBzdXBwb3J0CisgKgorICogIENvcHlyaWdodCAoQykgMjAwMCAgUGhpbGlwcCBSdW1wZiA8cHJ1bXBmQHR1eC5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBUZXRzdXlhIE9rYWRhICYgTmlpYmUgWXV0YWthCisgKi8KKy8qCisgKiBtb2RpZmVkIGJ5IGtvZ2lpZGVuYQorICogMjAwNS4wOS4xNgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGFzbS9ydGMuaD4KKworZXh0ZXJuIHNwaW5sb2NrX3QgcnRjX2xvY2s7CisKK2V4dGVybiB2b2lkCityczVjMzEzX3NldF9jbW9zX3RpbWUodW5zaWduZWQgaW50IEJDRF95ciwgdW5zaWduZWQgaW50IEJDRF9tb24sCisJCSAgICAgIHVuc2lnbmVkIGludCBCQ0RfZGF5LCB1bnNpZ25lZCBpbnQgQkNEX2hyLAorCQkgICAgICB1bnNpZ25lZCBpbnQgQkNEX21pbiwgdW5zaWduZWQgaW50IEJDRF9zZWMpOworCitleHRlcm4gdW5zaWduZWQgbG9uZworcnM1YzMxM19nZXRfY21vc190aW1lKHVuc2lnbmVkIGludCAqQkNEX3lyLCB1bnNpZ25lZCBpbnQgKkJDRF9tb24sCisJCSAgICAgIHVuc2lnbmVkIGludCAqQkNEX2RheSwgdW5zaWduZWQgaW50ICpCQ0RfaHIsCisJCSAgICAgIHVuc2lnbmVkIGludCAqQkNEX21pbiwgdW5zaWduZWQgaW50ICpCQ0Rfc2VjKTsKKwordm9pZCBsYW5kaXNrX3J0Y19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWVzcGVjICp0dikKK3sKKwl1bnNpZ25lZCBpbnQgQkNEX3lyLCBCQ0RfbW9uLCBCQ0RfZGF5LCBCQ0RfaHIsIEJDRF9taW4sIEJDRF9zZWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOworCXR2LT50dl9zZWMgPSByczVjMzEzX2dldF9jbW9zX3RpbWUKKwkgICAgKCZCQ0RfeXIsICZCQ0RfbW9uLCAmQkNEX2RheSwgJkJDRF9ociwgJkJDRF9taW4sICZCQ0Rfc2VjKTsKKwl0di0+dHZfbnNlYyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKK30KKworaW50IGxhbmRpc2tfcnRjX3NldHRpbWVvZmRheShjb25zdCB0aW1lX3Qgc2VjcykKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgcmVhbF9zZWNvbmRzLCByZWFsX21pbnV0ZXMsIGNtb3NfbWludXRlczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbm93dGltZSA9IHNlY3M7CisJdW5zaWduZWQgaW50IEJDRF95ciwgQkNEX21vbiwgQkNEX2RheSwgQkNEX2hyLCBCQ0RfbWluLCBCQ0Rfc2VjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CisKKwlyczVjMzEzX2dldF9jbW9zX3RpbWUKKwkgICgmQkNEX3lyLCAmQkNEX21vbiwgJkJDRF9kYXksICZCQ0RfaHIsICZCQ0RfbWluLCAmQkNEX3NlYyk7CisJY21vc19taW51dGVzID0gQkNEX21pbjsKKwlCQ0RfVE9fQklOKGNtb3NfbWludXRlcyk7CisKKwkvKgorCSAqIHNpbmNlIHdlJ3JlIG9ubHkgYWRqdXN0aW5nIG1pbnV0ZXMgYW5kIHNlY29uZHMsCisJICogZG9uJ3QgaW50ZXJmZXJlIHdpdGggaG91ciBvdmVyZmxvdy4gVGhpcyBhdm9pZHMKKwkgKiBtZXNzaW5nIHdpdGggdW5rbm93biB0aW1lIHpvbmVzIGJ1dCByZXF1aXJlcyB5b3VyCisJICogUlRDIG5vdCB0byBiZSBvZmYgYnkgbW9yZSB0aGFuIDE1IG1pbnV0ZXMKKwkgKi8KKwlyZWFsX3NlY29uZHMgPSBub3d0aW1lICUgNjA7CisJcmVhbF9taW51dGVzID0gbm93dGltZSAvIDYwOworCWlmICgoKGFicyhyZWFsX21pbnV0ZXMgLSBjbW9zX21pbnV0ZXMpICsgMTUpIC8gMzApICYgMSkKKwkJcmVhbF9taW51dGVzICs9IDMwOwkvKiBjb3JyZWN0IGZvciBoYWxmIGhvdXIgdGltZSB6b25lICovCisJcmVhbF9taW51dGVzICU9IDYwOworCisJaWYgKGFicyhyZWFsX21pbnV0ZXMgLSBjbW9zX21pbnV0ZXMpIDwgMzApIHsKKwkJQklOX1RPX0JDRChyZWFsX3NlY29uZHMpOworCQlCSU5fVE9fQkNEKHJlYWxfbWludXRlcyk7CisJCXJzNWMzMTNfc2V0X2Ntb3NfdGltZShCQ0RfeXIsIEJDRF9tb24sIEJDRF9kYXksIEJDRF9ociwKKwkJCQkgICAgICByZWFsX21pbnV0ZXMsIHJlYWxfc2Vjb25kcyk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgInNldF9ydGNfdGltZTogY2FuJ3QgdXBkYXRlIGZyb20gJWQgdG8gJWRcbiIsCisJCSAgICAgICBjbW9zX21pbnV0ZXMsIHJlYWxfbWludXRlcyk7CisJCXJldHZhbCA9IC0xOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldHZhbDsKK30KKwordm9pZCBsYW5kaXNrX3RpbWVfaW5pdCh2b2lkKQoreworCXJ0Y19zaF9nZXRfdGltZSA9IGxhbmRpc2tfcnRjX2dldHRpbWVvZmRheTsKKwlydGNfc2hfc2V0X3RpbWUgPSBsYW5kaXNrX3J0Y19zZXR0aW1lb2ZkYXk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9sYW5kaXNrL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9sYW5kaXNrL3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3YjllMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvYm9hcmRzL2xhbmRpc2svc2V0dXAuYwpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIGFyY2gvc2gvYm9hcmRzL2xhbmRpc2svc2V0dXAuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBLYXp1bW90byBLb2ppbWEKKyAqIENvcHlyaWdodCAoQykgMjAwMiBQYXVsIE11bmR0CisgKgorICogSS1PIERBVEEgRGV2aWNlLCBJbmMuIExBTkRJU0sgU3VwcG9ydC4KKyAqCisgKiBNb2RpZmllZCBmb3IgTEFORElTSyBieQorICogQXRvbSBDcmVhdGUgRW5naW5lZXJpbmcgQ28uLCBMdGQuIDIwMDIuCisgKgorICogbW9kaWZlZCBieSBrb2dpaWRlbmEKKyAqIDIwMDUuMDkuMTYKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KKyNpbmNsdWRlIDxhc20vcnRjLmg+CisjaW5jbHVkZSA8YXNtL2xhbmRpc2svaW9kYXRhX2xhbmRpc2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKwordm9pZCBsYW5kaXNrX3RpbWVfaW5pdCh2b2lkKTsKK3ZvaWQgaW5pdF9sYW5kaXNrX0lSUSh2b2lkKTsKKworaW50IGxhbmRpc2tfbGVkcGFyYW07CitpbnQgbGFuZGlza19idXp6ZXJwYXJhbTsKK2ludCBsYW5kaXNrX2FyY2g7CisKKy8qIGN5Y2xlIHRoZSBsZWQncyBpbiB0aGUgY2xhc2ljIGtuaWdodHJpZGVyL3N1biBwYXR0ZXJuICovCitzdGF0aWMgdm9pZCBoZWFydGJlYXRfbGFuZGlzayh2b2lkKQoreworCXN0YXRpYyB1bnNpZ25lZCBpbnQgY250ID0gMCwgYmxpbmsgPSAweDAwLCBwZXJpb2QgPSAyNTsKKyAgICAgICAgdm9sYXRpbGUgdTggKnAgPSAodm9sYXRpbGUgdTggKilQQV9MRUQ7CisJY2hhciBkYXRhOworCisgICAgICAgIGlmICgobGFuZGlza19sZWRwYXJhbSAmIDB4MDgwKSA9PSAwKQorCQlyZXR1cm47CisKKwljbnQgKz0gMTsKKworICAgICAgICBpZiAoY250IDwgcGVyaW9kKQorCQlyZXR1cm47CisKKwljbnQgPSAwOworCWJsaW5rKys7CisKKwlkYXRhID0gKGJsaW5rICYgMHgwMSkgPyAobGFuZGlza19sZWRwYXJhbSA+PiAxNikgOiAwOworCWRhdGEgfD0gKGJsaW5rICYgMHgwMikgPyAobGFuZGlza19sZWRwYXJhbSA+PiA4KSA6IDA7CisJZGF0YSB8PSBsYW5kaXNrX2xlZHBhcmFtOworCisJLyogYnV6emVyICovCisJaWYgKGxhbmRpc2tfYnV6emVycGFyYW0gJiAweDEpIHsKKwkJZGF0YSB8PSAweDgwOworCX0gZWxzZSB7CisJCWRhdGEgJj0gMHg3ZjsKKwl9CisJKnAgPSBkYXRhOworCisgICAgICAgIGlmICgoKGxhbmRpc2tfbGVkcGFyYW0gJiAweDAwN2Y3ZjAwKSA9PSAwKSAmJgorICAgICAgICAgICAgIChsYW5kaXNrX2J1enplcnBhcmFtID09IDApKQorCQlsYW5kaXNrX2xlZHBhcmFtICY9ICh+MHgwMDgwKTsKKworCWxhbmRpc2tfYnV6emVycGFyYW0gPj49IDE7Cit9CisKK3N0YXRpYyB2b2lkIGxhbmRpc2tfcG93ZXJfb2ZmKHZvaWQpCit7CisgICAgICAgIGN0cmxfb3V0YigweDAxLCBQQV9TSFVURE9XTik7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3VzbDVwKHZvaWQpCit7CisgICAgICAgIHZvbGF0aWxlIHU4ICpwID0gKHZvbGF0aWxlIHU4ICopUEFfTEVEOworICAgICAgICB1OCB0bXAxLCB0bXAyOworCisgICAgICAgIHRtcDEgPSAqcDsKKyAgICAgICAgKnAgPSAweDQwOworICAgICAgICB0bXAyID0gKnA7CisgICAgICAgICpwID0gdG1wMTsKKworICAgICAgICBsYW5kaXNrX2FyY2ggPSAodG1wMiA9PSAweDQwKTsKKyAgICAgICAgaWYgKGxhbmRpc2tfYXJjaCA9PSAxKSB7CisgICAgICAgICAgICAgICAgLyogYXJjaCA9PSB1c2wtNXAgKi8KKyAgICAgICAgICAgICAgICBsYW5kaXNrX2xlZHBhcmFtID0gMHgwMDAwMDM4MDsKKyAgICAgICAgICAgICAgICBsYW5kaXNrX2xlZHBhcmFtIHw9ICh0bXAxICYgMHgwN2MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGFyY2ggPT0gbGFuZGlzayAqLworICAgICAgICAgICAgICAgIGxhbmRpc2tfbGVkcGFyYW0gPSAweDAyMDAwMTgwOworICAgICAgICAgICAgICAgIGxhbmRpc2tfbGVkcGFyYW0gfD0gMHgwNDsKKyAgICAgICAgfQorfQorCit2b2lkICphcmVhNV9pb19iYXNlOwordm9pZCAqYXJlYTZfaW9fYmFzZTsKKworc3RhdGljIGludCBfX2luaXQgbGFuZGlza19jZl9pbml0KHZvaWQpCit7CisJcGdwcm90X3QgcHJvdDsKKwl1bnNpZ25lZCBsb25nIHBhZGRyYmFzZSwgcHNpemU7CisKKwkvKiBvcGVuIEkvTyBhcmVhIHdpbmRvdyAqLworCXBhZGRyYmFzZSA9IHZpcnRfdG9fcGh5cygodm9pZCAqKVBBX0FSRUE1X0lPKTsKKwlwc2l6ZSA9IFBBR0VfU0laRTsKKwlwcm90ID0gUEFHRV9LRVJORUxfUENDKDEsIF9QQUdFX1BDQ19JTzE2KTsKKwlhcmVhNV9pb19iYXNlID0gcDNfaW9yZW1hcChwYWRkcmJhc2UsIHBzaXplLCBwcm90LnBncHJvdCk7CisJaWYgKCFhcmVhNV9pb19iYXNlKSB7CisJCXByaW50aygiYWxsb2NhdGVfY2ZfYXJlYSA6IGNhbid0IG9wZW4gQ0YgSS9PIHdpbmRvdyFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwYWRkcmJhc2UgPSB2aXJ0X3RvX3BoeXMoKHZvaWQgKilQQV9BUkVBNl9JTyk7CisJcHNpemUgPSBQQUdFX1NJWkU7CisJcHJvdCA9IFBBR0VfS0VSTkVMX1BDQygwLCBfUEFHRV9QQ0NfSU8xNik7CisJYXJlYTZfaW9fYmFzZSA9IHAzX2lvcmVtYXAocGFkZHJiYXNlLCBwc2l6ZSwgcHJvdC5wZ3Byb3QpOworCWlmICghYXJlYTZfaW9fYmFzZSkgeworCQlwcmludGsoImFsbG9jYXRlX2NmX2FyZWEgOiBjYW4ndCBvcGVuIEhERCBJL08gd2luZG93IVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIkFsbG9jYXRlIEFyZWE1LzYgc3VjY2Vzcy5cbiIpOworCisJLyogWFhYIDogZG8gd2UgbmVlZCBhdHRyaWJ1dGUgYW5kIGNvbW1vbi1tZW1vcnkgYXJlYSBhbHNvPyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBsYW5kaXNrX3NldHVwKGNoYXIgKipjbWRsaW5lX3ApCit7CisJZGV2aWNlX2luaXRjYWxsKGxhbmRpc2tfY2ZfaW5pdCk7CisKKwlsYW5kaXNrX2J1enplcnBhcmFtID0gMDsKKwljaGVja191c2w1cCgpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSS1PIERBVEEgREVWSUNFLCBJTkMuIFwiTEFORElTSyBTZXJpZXNcIiBzdXBwb3J0LlxuIik7CisKKwlib2FyZF90aW1lX2luaXQgPSBsYW5kaXNrX3RpbWVfaW5pdDsKKwlwbV9wb3dlcl9vZmYgPSBsYW5kaXNrX3Bvd2VyX29mZjsKK30KKworLyoKKyAqIFRoZSBNYWNoaW5lIFZlY3RvcgorICovCitzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfbGFuZGlzayBfX2luaXRtdiA9IHsKKwkubXZfbmFtZSA9ICJMQU5ESVNLIiwKKwkubXZfc2V0dXAgPSBsYW5kaXNrX3NldHVwLAorCS5tdl9ucl9pcnFzID0gNzIsCisJLm12X2luYiA9IGxhbmRpc2tfaW5iLAorCS5tdl9pbncgPSBsYW5kaXNrX2ludywKKwkubXZfaW5sID0gbGFuZGlza19pbmwsCisJLm12X291dGIgPSBsYW5kaXNrX291dGIsCisJLm12X291dHcgPSBsYW5kaXNrX291dHcsCisJLm12X291dGwgPSBsYW5kaXNrX291dGwsCisJLm12X2luYl9wID0gbGFuZGlza19pbmJfcCwKKwkubXZfaW53X3AgPSBsYW5kaXNrX2ludywKKwkubXZfaW5sX3AgPSBsYW5kaXNrX2lubCwKKwkubXZfb3V0Yl9wID0gbGFuZGlza19vdXRiX3AsCisJLm12X291dHdfcCA9IGxhbmRpc2tfb3V0dywKKwkubXZfb3V0bF9wID0gbGFuZGlza19vdXRsLAorCS5tdl9pbnNiID0gbGFuZGlza19pbnNiLAorCS5tdl9pbnN3ID0gbGFuZGlza19pbnN3LAorCS5tdl9pbnNsID0gbGFuZGlza19pbnNsLAorCS5tdl9vdXRzYiA9IGxhbmRpc2tfb3V0c2IsCisJLm12X291dHN3ID0gbGFuZGlza19vdXRzdywKKwkubXZfb3V0c2wgPSBsYW5kaXNrX291dHNsLAorCS5tdl9pb3BvcnRfbWFwID0gbGFuZGlza19pb3BvcnRfbWFwLAorCS5tdl9pbml0X2lycSA9IGluaXRfbGFuZGlza19JUlEsCisjaWZkZWYgQ09ORklHX0hFQVJUQkVBVAorCS5tdl9oZWFydGJlYXQgPSBoZWFydGJlYXRfbGFuZGlzaywKKyNlbmRpZgorfTsKK0FMSUFTX01WKGxhbmRpc2spCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL3J0Yy5jIGIvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9ydGMuYwppbmRleCBhNzZjNjU1Li4wM2IxMjNhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL3J0Yy5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvcnRjLmMKQEAgLTEzMCw3ICsxMzAsNyBAQAogCiB2b2lkIG1wYzEyMTFfdGltZV9pbml0KHZvaWQpCiB7Ci0JcnRjX2dldF90aW1lID0gbXBjMTIxMV9ydGNfZ2V0dGltZW9mZGF5OwotCXJ0Y19zZXRfdGltZSA9IG1wYzEyMTFfcnRjX3NldHRpbWVvZmRheTsKKwlydGNfc2hfZ2V0X3RpbWUgPSBtcGMxMjExX3J0Y19nZXR0aW1lb2ZkYXk7CisJcnRjX3NoX3NldF90aW1lID0gbXBjMTIxMV9ydGNfc2V0dGltZW9mZGF5OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL3NldHVwLmMKaW5kZXggMmJmYjIyMS4uOGViNWQ0MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvc2V0dXAuYwpAQCAtMTAsMTQgKzEwLDEyIEBACiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL21wYzEyMTEvbXBjMTIxMS5oPgogI2luY2x1ZGUgPGFzbS9tcGMxMjExL3BjaS5oPgogI2luY2x1ZGUgPGFzbS9tcGMxMjExL20xNTQzYy5oPgogCi0KIC8qIEFMSTE1WDMgU01CdXMgYWRkcmVzcyBvZmZzZXRzICovCiAjZGVmaW5lIFNNQkhTVFNUUyAgICgwICsgMHgzMTAwKQogI2RlZmluZSBTTUJIU1RDTlQgICAoMSArIDB4MzEwMCkKQEAgLTUwLDExICs0OCw2IEBACiAjZGVmaW5lIEFMSTE1WDNfU1RTX1RFUk0JMHg4MAkvKiB0ZXJtaW5hdGVkIGJ5IGFib3J0ICovCiAjZGVmaW5lIEFMSTE1WDNfU1RTX0VSUgkJMHhFMAkvKiBhbGwgdGhlIGJhZCBlcnJvciBiaXRzICovCiAKLWNvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQotewotCXJldHVybiAiSW50ZXJmYWNlIE1QQy0xMjExKENUUC9QQ0kvTVBDLVNIMDIpIjsKLX0KLQogc3RhdGljIHZvaWQgX19pbml0IHBjaV93cml0ZV9jb25maWcodW5zaWduZWQgbG9uZyBidXNObywKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBkZXZObywKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBmbmNObywKQEAgLTgwLDkgKzczLDYgQEAKIAogc3RhdGljIHZvaWQgZGlzYWJsZV9tcGMxMjExX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzYXZlX2FuZF9jbGkoZmxhZ3MpOwogCWlmKCBpcnEgPCA4KSB7CiAJCW1faXJxX21hc2sgfD0gKDEgPDwgaXJxKTsKIAkJb3V0YihtX2lycV9tYXNrLEk4MjU5X01fTVIpOwpAQCAtOTAsMTYgKzgwLDExIEBACiAJCXNfaXJxX21hc2sgfD0gKDEgPDwgKGlycSAtIDgpKTsKIAkJb3V0YihzX2lycV9tYXNrLEk4MjU5X1NfTVIpOwogCX0KLQlyZXN0b3JlX2ZsYWdzKGZsYWdzKTsKIAogfQogCiBzdGF0aWMgdm9pZCBlbmFibGVfbXBjMTIxMV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc2F2ZV9hbmRfY2xpKGZsYWdzKTsKLQogCWlmKCBpcnEgPCA4KSB7CiAJCW1faXJxX21hc2sgJj0gfigxIDw8IGlycSk7CiAJCW91dGIobV9pcnFfbWFzayxJODI1OV9NX01SKTsKQEAgLTEwNyw3ICs5Miw2IEBACiAJCXNfaXJxX21hc2sgJj0gfigxIDw8IChpcnEgLSA4KSk7CiAJCW91dGIoc19pcnFfbWFzayxJODI1OV9TX01SKTsKIAl9Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG1wYzEyMTFfaXJxX3JlYWwodW5zaWduZWQgaW50IGlycSkKQEAgLTEzMSwxMCArMTE1LDYgQEAKIAogc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX21wYzEyMTEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc2F2ZV9hbmRfY2xpKGZsYWdzKTsKLQogCWlmKGlycSA8IDgpIHsKIAkJaWYobV9pcnFfbWFzayAmICgxPDxpcnEpKXsKIAkJICBpZighbXBjMTIxMV9pcnFfcmVhbChpcnEpKXsKQEAgLTE2Miw3ICsxNDIsNiBAQAogCQlvdXRiKDB4NjArKGlycS04KSxJODI1OV9TX0NSKTsgCS8qIEVPSSAqLwogCQlvdXRiKDB4NjArMixJODI1OV9NX0NSKTsKIAl9Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGVuZF9tcGMxMjExX2lycSh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMjE5LDcgKzE5OCw3IEBACiAJcmV0dXJuIGlycTsKIH0KIAotdm9pZCBfX2luaXQgaW5pdF9tcGMxMjExX0lSUSh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGluaXRfbXBjMTIxMV9JUlEodm9pZCkKIHsKIAlpbnQgaTsKIAkvKgpAQCAtMjU1LDIzICsyMzQsMTIgQEAKIAl9CiB9CiAKLS8qCi0gIEluaXRpYWxpemUgdGhlIGJvYXJkCi0qLwotCi0KLXN0YXRpYyB2b2lkIGRlbGF5ICh2b2lkKQotewotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0IHRtcDsKLQl0bXAgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopIDB4YTAwMDAwMDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlbGF5MTAwMCAodm9pZCkKK3N0YXRpYyB2b2lkIGRlbGF5MTAwMCh2b2lkKQogewogCWludCBpOwogCiAJZm9yIChpPTA7IGk8MTAwMDsgaSsrKQotCQlkZWxheSAoKTsKKwkJY3RybF9kZWxheSgpOwogfQogCiBzdGF0aWMgaW50IHB1dF9zbWJfYmxrKHVuc2lnbmVkIGNoYXIgKnAsIGludCBhZGRyZXNzLCBpbnQgY29tbWFuZCwgaW50IG5vKQpAQCAtMzE0LDI2ICsyODIsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFRoZSBNYWNoaW5lIFZlY3RvcgotICovCi0KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9tcGMxMjExIF9faW5pdG12ID0gewotCS5tdl9ucl9pcnFzCQk9IDQ4LAotCS5tdl9pcnFfZGVtdXgJCT0gbXBjMTIxMV9pcnFfZGVtdXgsCi0JLm12X2luaXRfaXJxCQk9IGluaXRfbXBjMTIxMV9JUlEsCi0KLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0JLm12X2hlYXJ0YmVhdAkJPSBoZWFydGJlYXRfbXBjMTIxMSwKLSNlbmRpZgotfTsKLQotQUxJQVNfTVYobXBjMTIxMSkKLQogLyogYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9ydGMuYyAqLwogdm9pZCBtcGMxMjExX3RpbWVfaW5pdCh2b2lkKTsKIAotaW50IF9faW5pdCBwbGF0Zm9ybV9zZXR1cCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IG1wYzEyMTFfc2V0dXAoY2hhciAqKmNtZGxpbmVfcCkKIHsKIAl1bnNpZ25lZCBjaGFyIHNwZF9idWZbMTI4XTsKIApAQCAtMzU3LDMgKzMwOSwxOCBAQAogCXJldHVybiAwOwogfQogCisvKgorICogVGhlIE1hY2hpbmUgVmVjdG9yCisgKi8KK3N0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9tcGMxMjExIF9faW5pdG12ID0geworCS5tdl9uYW1lCQk9ICJJbnRlcmZhY2UgTVBDLTEyMTEoQ1RQL1BDSS9NUEMtU0gwMikiLAorCS5tdl9zZXR1cAkJPSBtcGMxMjExX3NldHVwLAorCS5tdl9ucl9pcnFzCQk9IDQ4LAorCS5tdl9pcnFfZGVtdXgJCT0gbXBjMTIxMV9pcnFfZGVtdXgsCisJLm12X2luaXRfaXJxCQk9IGluaXRfbXBjMTIxMV9JUlEsCisKKyNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCisJLm12X2hlYXJ0YmVhdAkJPSBoZWFydGJlYXRfbXBjMTIxMSwKKyNlbmRpZgorfTsKK0FMSUFTX01WKG1wYzEyMTEpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NWYwM2IuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB0aGUgU1RNaWNyb2VsZWN0cm9uaWNzIE92ZXJkcml2ZSBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUga2VybmVsCi0jCi0KLW9iai15CSA6PSBtYWNoLm8gc2V0dXAubyBpby5vIGlycS5vIGxlZC5vCi0KLW9iai0kKENPTkZJR19QQ0kpICs9IGZwZ2EubyBnYWxpbGVvLm8gcGNpZG1hLm8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL2ZwZ2EuYyBiL2FyY2gvc2gvYm9hcmRzL292ZXJkcml2ZS9mcGdhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1NmMyMzkuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL2ZwZ2EuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCBEYXZpZCBKLiBNY2theSAoZGF2aWQubWNrYXlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKgotICogVGhpcyBmaWxlIGhhbmRsZXMgcHJvZ3JhbW1pbmcgdXAgdGhlIEFsdGVyYSBGbGV4MTBLIHRoYXQgaW50ZXJmYWNlcyB0bwotICogdGhlIEdhbGlsZW8sIGFuZCBkb2VzIHRoZSBQUy8yIGtleWJvYXJkIGFuZCBtb3VzZQotICoKLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0KLQotI2luY2x1ZGUgPGFzbS9vdmVyZHJpdmVyL2d0NjQxMTEuaD4KLSNpbmNsdWRlIDxhc20vb3ZlcmRyaXZlL292ZXJkcml2ZS5oPgotI2luY2x1ZGUgPGFzbS9vdmVyZHJpdmUvZnBnYS5oPgotCi0jZGVmaW5lIEZQR0FfTm90Q29uZmlnSGlnaCgpICAoKkZQR0FfQ29udHJvbFJlZykgPSAoKkZQR0FfQ29udHJvbFJlZykgfCBFTkFCTEVfRlBHQV9CSVQKLSNkZWZpbmUgRlBHQV9Ob3RDb25maWdMb3coKSAgICgqRlBHQV9Db250cm9sUmVnKSA9ICgqRlBHQV9Db250cm9sUmVnKSAmIFJFU0VUX0ZQR0FfTUFTSwotCi0vKiBJIG5lZWQgdG8gZmluZCBvdXQgd2hhdCAoaWYgYW55KSB0aGUgcmVhbCBkZWxheSBmYWN0b3IgaGVyZSBpcyAqLwotLyogVGhlIGRlbGF5IGlzIGRlZmluYXRlbHkgbm90IGNyaXRpY2FsICovCi0jZGVmaW5lIGxvbmdfZGVsYXkoKSB7aW50IGk7Zm9yKGk9MDtpPDEwMDAwO2krKyk7fQotI2RlZmluZSBzaG9ydF9kZWxheSgpIHtpbnQgaTtmb3IoaT0wO2k8MTAwO2krKyk7fQotCi1zdGF0aWMgdm9pZCBfX2luaXQgcHJvZ3JhbV9vdmVyZHJpdmVfZnBnYShjb25zdCB1bnNpZ25lZCBjaGFyICpmcGdhY29kZSwKLQkJCQkJICBpbnQgc2l6ZSkKLXsKLQlpbnQgdGltZW91dCA9IDA7Ci0JaW50IGksIGo7Ci0JdW5zaWduZWQgY2hhciBiOwotCXN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpGUEdBX0NvbnRyb2xSZWcgPQotCSAgICAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoT1ZFUkRSSVZFX0NUUkwpOwotCXN0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICpGUEdBX1Byb2dyYW1SZWcgPQotCSAgICAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAoRlBHQV9EQ0xLX0FERFJFU1MpOwotCi0JcHJpbnRrKCJGUEdBOiAgQ29tbWVuY2luZyBGUEdBIFByb2dyYW1taW5nXG4iKTsKLQotCS8qIFRoZSBQQ0kgcmVzZXQgYnV0IE1VU1QgYmUgbG93IHdoZW4gcHJvZ3JhbW1pbmcgdGhlIEZQR0EgISEhICovCi0JYiA9ICgqRlBHQV9Db250cm9sUmVnKSAmIFJFU0VUX1BDSV9NQVNLOwotCi0JKCpGUEdBX0NvbnRyb2xSZWcpID0gYjsKLQotCS8qIFByZXBhcmUgRlBHQSB0byBwcm9ncmFtICovCi0KLQlGUEdBX05vdENvbmZpZ0hpZ2goKTsKLQlsb25nX2RlbGF5KCk7Ci0KLQlGUEdBX05vdENvbmZpZ0xvdygpOwotCXNob3J0X2RlbGF5KCk7Ci0KLQl3aGlsZSAoKCpGUEdBX1Byb2dyYW1SZWcgJiBGUEdBX05PVF9TVEFUVVMpICE9IDApIHsKLQkJcHJpbnRrKCJGUEdBOiAgV2FpdGluZyBmb3IgTm90U3RhdHVzIHRvIGdvIExvdyAuLi4gXG4iKTsKLQl9Ci0KLQlGUEdBX05vdENvbmZpZ0hpZ2goKTsKLQotCS8qIFdhaXQgZm9yIEZQR0EgInJlYWR5IHRvIGJlIHByb2dyYW1tZWQiIHNpZ25hbCAqLwotCXByaW50aygiRlBHQTogIFdhaXRpbmcgZm9yIE5vdFN0YXR1cyB0byBnbyBoaWdoIChGUEdBIHJlYWR5KS4uLiBcbiIpOwotCi0JZm9yICh0aW1lb3V0ID0gMDsKLQkgICAgICgoKCpGUEdBX1Byb2dyYW1SZWcgJiBGUEdBX05PVF9TVEFUVVMpID09IDApCi0JICAgICAgJiYgKHRpbWVvdXQgPCBGUEdBX1RJTUVPVVQpKTsgdGltZW91dCsrKTsKLQotCS8qIENoZWNrIGlmIHRpbWVvdXQgY29uZGl0aW9uIG9jY3VyZWQgLSBpLmUuIGFuIGVycm9yICovCi0KLQlpZiAodGltZW91dCA9PSBGUEdBX1RJTUVPVVQpIHsKLQkJcHJpbnRrCi0JCSAgICAoIkZQR0E6ICBGYWlsZWQgdG8gcHJvZ3JhbSAtIFRpbWVvdXQgd2FpdGluZyBmb3Igbm90U1RBVFVTIHRvIGdvIGhpZ2hcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJpbnRrKCJGUEdBOiAgQ29weWluZyBkYXRhIHRvIEZQR0EgLi4uICVkIGJ5dGVzXG4iLCBzaXplKTsKLQotCS8qIENvcHkgYXJyYXkgdG8gRlBHQSAtIGJpdCBhdCBhIHRpbWUgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJdm9sYXRpbGUgdW5zaWduZWQgdyA9IDA7Ci0KLQkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgewotCQkJKkZQR0FfUHJvZ3JhbVJlZyA9IChmcGdhY29kZVtpXSA+PiBqKSAmIDB4MDE7Ci0JCQlzaG9ydF9kZWxheSgpOwotCQl9Ci0JCWlmICgoaSAmIDB4M2ZmKSA9PSAwKSB7Ci0JCQlwcmludGsoIi4iKTsKLQkJfQotCX0KLQotCS8qIFdhaXRpbmcgZm9yIENPTkZET05FIHRvIGdvIGhpZ2ggLSBtZWFucyB0aGUgcHJvZ3JhbSBpcyBjb21wbGV0ZSAgKi8KLQotCWZvciAodGltZW91dCA9IDA7Ci0JICAgICAoKCgqRlBHQV9Qcm9ncmFtUmVnICYgRlBHQV9DT05GRE9ORSkgPT0gMCkKLQkgICAgICAmJiAodGltZW91dCA8IEZQR0FfVElNRU9VVCkpOyB0aW1lb3V0KyspIHsKLQotCQkqRlBHQV9Qcm9ncmFtUmVnID0gMHgwOwotCQlsb25nX2RlbGF5KCk7Ci0JfQotCi0JaWYgKHRpbWVvdXQgPT0gRlBHQV9USU1FT1VUKSB7Ci0JCXByaW50awotCQkgICAgKCJGUEdBOiAgRmFpbGVkIHRvIHByb2dyYW0gLSBUaW1lb3V0IHdhaXRpbmcgZm9yIENPTkZET05FIHRvIGdvIGhpZ2hcbiIpOwotCQlyZXR1cm47Ci0JfSBlbHNlIHsJCS8qIENsb2NrIGFub3RoZXIgMTAgdGltZXMgLSBnZXRzIHRoZSBkZXZpY2UgaW50byBhIHdvcmtpbmcgc3RhdGUgICAgICAqLwotCQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQkJKkZQR0FfUHJvZ3JhbVJlZyA9IDB4MDsKLQkJCXNob3J0X2RlbGF5KCk7Ci0JCX0KLQl9Ci0KLQlwcmludGsoIkZQR0E6ICBQcm9ncmFtbWluZyBjb21wbGV0ZVxuIik7Ci19Ci0KLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgX19pbml0IGZwZ2Fjb2RlW10gPSB7Ci0jaW5jbHVkZSAiLi9vdmVyZHJpdmUudHRmIgkvKiBDb2RlIGZyb20gbWF4cGx1czIgY29tcGlsZXIgKi8KLQksIDAsIDAKLX07Ci0KLQotaW50IF9faW5pdCBpbml0X292ZXJkcml2ZV9mcGdhKHZvaWQpCi17Ci0JcHJvZ3JhbV9vdmVyZHJpdmVfZnBnYShmcGdhY29kZSwgc2l6ZW9mKGZwZ2Fjb2RlKSk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL292ZXJkcml2ZS9nYWxpbGVvLmMgYi9hcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvZ2FsaWxlby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWU0ODk3Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL292ZXJkcml2ZS9nYWxpbGVvLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1ODcgKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgSi4gTWNrYXkgKGRhdmlkLm1ja2F5QHN0LmNvbSkKLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgUENJIHJvdXRpbmVzIHJlcXVpcmVkIGZvciB0aGUgR2FsaWxlbyBHVDY0MTEgCi0gKiBQQ0kgYnJpZGdlIGFzIHVzZWQgb24gdGhlIE9yaW9uIGFuZCBPdmVyZHJpdmUgYm9hcmRzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vb3ZlcmRyaXZlL292ZXJkcml2ZS5oPgotI2luY2x1ZGUgPGFzbS9vdmVyZHJpdmUvZ3Q2NDExMS5oPgotCi0KLS8qIEFmdGVyIGJvb3QsIHdlIHNoaWZ0IHRoZSBHYWxpbGVvIHJlZ2lzdGVycyBzbyB0aGF0IHRoZXkgYXBwZWFyIAotICogaW4gQkFOSzYsIGFsb25nIHdpdGggSU8gc3BhY2UuIFRoaXMgbWVhbnMgd2UgY2FuIGhhdmUgb25lIGNvbnRpbmdvdXMKLSAqIGx1bXAgb2YgUENJIGFkZHJlc3Mgc3BhY2Ugd2l0aG91dCB0aGVzZSByZWdpc3RlcnMgYXBwZWFyaW5nIGluIHRoZSAKLSAqIG1pZGRsZSBvZiB0aGVtIAotICovCi0KLSNkZWZpbmUgR1Q2NDExMV9CQVNFX0FERFJFU1MgIDB4YmIwMDAwMDAKLSNkZWZpbmUgR1Q2NDExMV9JT19CQVNFX0FERFJFU1MgIDB4MTAwMAotLyogVGhlIEdUNjQxMTEgcmVnaXN0ZXJzIGFwcGVhciBhdCB0aGlzIGFkZHJlc3MgdG8gdGhlIFNINCBhZnRlciByZXNldCAqLwotI2RlZmluZSBSRVNFVF9HVDY0MTExX0JBU0VfQUREUkVTUyAgICAgICAgICAgMHhiNDAwMDAwMAotCi0vKiBNYWNyb3MgdXNlZCB0byBhY2Nlc3MgdGhlIEdhbGlsZW8gcmVnaXN0ZXJzICovCi0jZGVmaW5lIFJFU0VUX0dUNjQxMTFfUkVHKHgpIChSRVNFVF9HVDY0MTExX0JBU0VfQUREUkVTUyt4KQotI2RlZmluZSBHVDY0MTExX1JFRyh4KSAoR1Q2NDExMV9CQVNFX0FERFJFU1MreCkKLQotI2RlZmluZSBSRVNFVF9HVF9XUklURSh4LHYpIHdyaXRlbCgodiksUkVTRVRfR1Q2NDExMV9SRUcoeCkpCi0KLSNkZWZpbmUgUkVTRVRfR1RfUkVBRCh4KSByZWFkbChSRVNFVF9HVDY0MTExX1JFRyh4KSkKLQotI2RlZmluZSBHVF9XUklURSh4LHYpIHdyaXRlbCgodiksR1Q2NDExMV9SRUcoeCkpCi0jZGVmaW5lIEdUX1dSSVRFX0JZVEUoeCx2KSB3cml0ZWIoKHYpLEdUNjQxMTFfUkVHKHgpKQotI2RlZmluZSBHVF9XUklURV9TSE9SVCh4LHYpIHdyaXRldygodiksR1Q2NDExMV9SRUcoeCkpCi0KLSNkZWZpbmUgR1RfUkVBRCh4KSAgICByZWFkbChHVDY0MTExX1JFRyh4KSkKLSNkZWZpbmUgR1RfUkVBRF9CWVRFKHgpICByZWFkYihHVDY0MTExX1JFRyh4KSkKLSNkZWZpbmUgR1RfUkVBRF9TSE9SVCh4KSByZWFkdyhHVDY0MTExX1JFRyh4KSkKLQotCi0vKiBXaGVyZSB0aGUgdmFyaW91cyBTSCBiYW5rcyBzdGFydCBhdCAqLwotI2RlZmluZSBTSF9CQU5LNF9BRFIgMHhiMDAwMDAwMAotI2RlZmluZSBTSF9CQU5LNV9BRFIgMHhiNDAwMDAwMAotI2RlZmluZSBTSF9CQU5LNl9BRFIgMHhiODAwMDAwMAotCi0vKiBNYXNrcyBvdXQgZXZlcnl0aGluZyBidXQgbGluZXMgMjgsMjcsMjYgKi8KLSNkZWZpbmUgQkFOS19TRUxFQ1RfTUFTSyAweDFjMDAwMDAwCi0KLSNkZWZpbmUgU0g0X1RPX0JBTksoeCkgKCAoeCkgJiBCQU5LX1NFTEVDVF9NQVNLKQotCi0vKiAKLSAqIE1hc2tzIHVzZWQgZm9yIGFkZHJlc3MgY29udmVyc2Fpb24uIEJhbmsgNiBpcyB1c2VkIGZvciBJTyBhbmQgCi0gKiBoYXMgYWxsIHRoZSBhZGRyZXNzIGJpdHMgemVyb2VkIGJ5IHRoZSBGUEdBLiBTcGVjaWFsIGNhc2UgdGhpcwotICovCi0jZGVmaW5lIE1FTU9SWV9CQU5LX01BU0sgMHgxZmZmZmZmZgotI2RlZmluZSBJT19CQU5LX01BU0sgIDB4MDNmZmZmZmYKLQotLyogTWFyayBiYW5rIDYgYXMgdGhlIGJhbmsgdXNlZCBmb3IgSU8uIFlvdSBjYW4gY2hhbmdlIHRoaXMgaW4gdGhlIEZQR0EgY29kZQotICogaWYgeW91IHdhbnQgCi0gKi8KLSNkZWZpbmUgSU9fQkFOS19BRFIgUENJX0dUSU9fQkFTRQotCi0vKiBXaWxsIHNlbGVjdCB0aGUgY29ycmVjdCBtYXNrIHRvIGFwcGx5IGRlcGVuZGluZyBvbiB0aGUgU0gkIGFkZHJlc3MgKi8KLSNkZWZpbmUgU0VMRUNUX0JBTktfTUFTSyh4KSBcCi0gICAoIChTSDRfVE9fQkFOSyh4KT09U0g0X1RPX0JBTksoSU9fQkFOS19BRFIpKSA/IElPX0JBTktfTUFTSyA6IE1FTU9SWV9CQU5LX01BU0spCi0KLS8qIENvbnZlcnRzIGJldHdlZW4gUENJIHNwYWNlIGFuZCBQMiByZWdpb24gKi8KLSNkZWZpbmUgU0g0X1RPX1BDSSh4KSAoKHgpJlNFTEVDVF9CQU5LX01BU0soeCkpCi0KLS8qIFZhcmlvdXMgbWFjcm9zIGZvciBmaWd1cmluZyBvdXQgd2hhdCB0byBzdGljayBpbiB0aGUgR2FsaWxlbyByZWdpc3RlcnMuIAotICogWW91ICpyZWFsbHkqIGRvbid0IHdhbnQgdG8gZmlndXJlIHRoaXMgc3R1ZmYgb3V0IGJ5IGhhbmQsIHlvdSBhbHdheXMgZ2V0Ci0gKiBpdCB3cm9uZwotICovCi0jZGVmaW5lIEdUX01FTV9MT19BRFIoeCkgKCgoKHVuc2lnbmVkKSgoeCkmU0VMRUNUX0JBTktfTUFTSyh4KSkpPj4yMSkmMHg3ZmYpCi0jZGVmaW5lIEdUX01FTV9ISV9BRFIoeCkgKCgoKHVuc2lnbmVkKSgoeCkmU0VMRUNUX0JBTktfTUFTSyh4KSkpPj4yMSkmMHg3ZikKLSNkZWZpbmUgR1RfTUVNX1NVQl9BRFIoeCkgKCgoKHVuc2lnbmVkKSgoeCkmU0VMRUNUX0JBTktfTUFTSyh4KSkpPj4yMCkmMHhmZikKLQotI2RlZmluZSBQUk9HUkFNX0hJX0xPKGJsb2NrLGEscykgXAotICAgIEdUX1dSSVRFKGJsb2NrIyNfTE9fREVDX0FEUixHVF9NRU1fTE9fQURSKGEpKTtcCi0gICAgR1RfV1JJVEUoYmxvY2sjI19ISV9ERUNfQURSLEdUX01FTV9ISV9BRFIoYStzLTEpKQotCi0jZGVmaW5lIFBST0dSQU1fU1VCX0hJX0xPKGJsb2NrLGEscykgXAotICAgIEdUX1dSSVRFKGJsb2NrIyNfTE9fREVDX0FEUixHVF9NRU1fU1VCX0FEUihhKSk7XAotICAgIEdUX1dSSVRFKGJsb2NrIyNfSElfREVDX0FEUixHVF9NRU1fU1VCX0FEUihhK3MtMSkpCi0KLS8qIFdlIG5lZWQgdG8gc2V0IHRoZSBzaXplLCBhbmQgdGhlIG9mZnNldCByZWdpc3RlciAqLwotCi0jZGVmaW5lIEdUX0JBUl9NQVNLKHgpICgoeCkmfjB4ZmZmKQotCi0vKiBNYWNybyB0byBzZXQgdXAgdGhlIEJBUiBpbiB0aGUgR2FsaWxlby4gRXNzZW50aWFsbHkgdXNlZCBmb3IgdGhlIERSQU0gKi8KLSNkZWZpbmUgUFJPR1JBTV9HVF9CQVIoYmxvY2ssYSxzKSBcCi0gIEdUX1dSSVRFKFBDSV8jI2Jsb2NrIyNfQkFOS19TSVpFLEdUX0JBUl9NQVNLKChzLTEpKSk7XAotICB3cml0ZV9jb25maWdfdG9fZ2FsaWxlbyhQQ0lfQ09ORklHXyMjYmxvY2sjI19CQVNFX0FEUixcCi0JCQkgICAgIEdUX0JBUl9NQVNLKGEpKQotCi0jZGVmaW5lIERJU0FCTEVfR1RfQkFSKGJsb2NrKSBcCi0gIEdUX1dSSVRFKFBDSV8jI2Jsb2NrIyNfQkFOS19TSVpFLDApLFwKLSAgR1RfQ09ORklHX1dSSVRFKFBDSV9DT05GSUdfIyNibG9jayMjX0JBU0VfQURSLFwKLSAgICAweDgwMDAwMDAwKQotCi0vKiBNYWNyb3MgdG8gZGlzYWJsZSB0aGluZ3Mgd2UgYXJlIG5vdCBnb2luZyB0byB1c2UgKi8KLSNkZWZpbmUgRElTQUJMRV9ERUNPREUoeCkgR1RfV1JJVEUoeCMjX0xPX0RFQ19BRFIsMHg3ZmYpO1wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfV1JJVEUoeCMjX0hJX0RFQ19BRFIsMHgwMCkKLQotI2RlZmluZSBESVNBQkxFX1NVQl9ERUNPREUoeCkgR1RfV1JJVEUoeCMjX0xPX0RFQ19BRFIsMHhmZik7XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1RfV1JJVEUoeCMjX0hJX0RFQ19BRFIsMHgwMCkKLQotc3RhdGljIHZvaWQgX19pbml0IHJlc2V0X3BjaSh2b2lkKQotewotCS8qIFNldCBSRVNFVF9QQ0kgYml0IGhpZ2ggKi8KLQl3cml0ZWIocmVhZGIoT1ZFUkRSSVZFX0NUUkwpIHwgRU5BQkxFX1BDSV9CSVQsIE9WRVJEUklWRV9DVFJMKTsKLQl1ZGVsYXkoMjUwKTsKLQotCS8qIFNldCBSRVNFVF9QQ0kgYml0IGxvdyAqLwotCXdyaXRlYihyZWFkYihPVkVSRFJJVkVfQ1RSTCkgJiBSRVNFVF9QQ0lfTUFTSywgT1ZFUkRSSVZFX0NUUkwpOwotCXVkZWxheSgyNTApOwotCi0Jd3JpdGViKHJlYWRiKE9WRVJEUklWRV9DVFJMKSB8IEVOQUJMRV9QQ0lfQklULCBPVkVSRFJJVkVfQ1RSTCk7Ci0JdWRlbGF5KDI1MCk7Ci19Ci0KLXN0YXRpYyBpbnQgd3JpdGVfY29uZmlnX3RvX2dhbGlsZW8oaW50IHdoZXJlLCB1MzIgdmFsKTsKLSNkZWZpbmUgR1RfQ09ORklHX1dSSVRFKHdoZXJlLHZhbCkgd3JpdGVfY29uZmlnX3RvX2dhbGlsZW8od2hlcmUsdmFsKQotCi0jZGVmaW5lIEVOQUJMRV9QQ0lfRFJBTQotCi0KLSNpZmRlZiBURVNUX0RSQU0KLS8qIFRlc3QgZnVuY3Rpb24gdG8gY2hlY2sgb3V0IGlmIHRoZSBQQ0kgRFJBTSBpcyB3b3JraW5nIE9LICovCi1zdGF0aWMgaW50ICAvKiBfX2luaXQgKi8gdGVzdF9kcmFtKHVuc2lnbmVkICpiYXNlLCB1bnNpZ25lZCBzaXplKQotewotCXVuc2lnbmVkICpwID0gYmFzZTsKLQl1bnNpZ25lZCAqZW5kID0gKHVuc2lnbmVkICopICgoKHVuc2lnbmVkKSBiYXNlKSArIHNpemUpOwotCXVuc2lnbmVkIHc7Ci0KLQlmb3IgKHAgPSBiYXNlOyBwIDwgZW5kOyBwKyspIHsKLQkJKnAgPSAweGZmZmZmZmZmOwotCQlpZiAoKnAgIT0gMHhmZmZmZmZmZikgewotCQkJcHJpbnRrKCJBQUFSR0ggLXdyaXRlIGZhaWxlZCEhISBhdCAlcCBpcyAleFxuIiwgcCwKLQkJCSAgICAgICAqcCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkqcCA9IDB4MDsKLQkJaWYgKCpwICE9IDB4MCkgewotCQkJcHJpbnRrKCJBQUFSR0ggLXdyaXRlIGZhaWxlZCEhIVxuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCWZvciAocCA9IGJhc2U7IHAgPCBlbmQ7IHArKykgewotCQkqcCA9ICh1bnNpZ25lZCkgcDsKLQkJaWYgKCpwICE9ICh1bnNpZ25lZCkgcCkgewotCQkJcHJpbnRrKCJGYWlsZWQgYXQgMHglcCwgYWN0dWFsbHkgaXMgMHgleFxuIiwgcCwKLQkJCSAgICAgICAqcCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCWZvciAocCA9IGJhc2U7IHAgPCBlbmQ7IHArKykgewotCQl3ID0gKCh1bnNpZ25lZCkgcCAmIDB4ZmZmZjAwMDApOwotCQkqcCA9IHcgfCAodyA+PiAxNik7Ci0JfQotCi0JZm9yIChwID0gYmFzZTsgcCA8IGVuZDsgcCsrKSB7Ci0JCXcgPSAoKHVuc2lnbmVkKSBwICYgMHhmZmZmMDAwMCk7Ci0JCXcgfD0gKHcgPj4gMTYpOwotCQlpZiAoKnAgIT0gdykgewotCQkJcHJpbnRrCi0JCQkgICAgKCJGYWlsZWQgYXQgMHglcCwgc2hvdWxkIGJlIDB4JXggYWN0dWFsbHkgaXMgMHgleFxuIiwKLQkJCSAgICAgcCwgdywgKnApOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLSNlbmRpZgotCi0KLS8qIEZ1bmN0aW9uIHRvIHNldCB1cCBhbmQgaW5pdGlhbGlzZSB0aGUgZ2FsaWxlby4gVGhpcyBzZXRzIHVwIHRoZSBCQVJTLAotICogbWFwcyB0aGUgRFJBTSBpbnRvIHRoZSBhZGRyZXNzIHNwYWNlIGV0YyxldGMKLSAqLwotaW50IF9faW5pdCBnYWxpbGVvX2luaXQodm9pZCkKLXsKLQlyZXNldF9wY2koKTsKLQotCS8qIE5vdyBzaGlmdCB0aGUgZ2FsaWxlbyByZWdzIGludG8gdGhpcyBibG9jayAqLwotCVJFU0VUX0dUX1dSSVRFKElOVEVSTkFMX1NQQUNFX0RFQywKLQkJICAgICAgIEdUX01FTV9MT19BRFIoR1Q2NDExMV9CQVNFX0FERFJFU1MpKTsKLQotCS8qIFNob3VsZCBoYXZlIGEgc2FuaXR5IGNoZWNrIGhlcmUsIHRoYXQgeW91IGNhbiByZWFkIGJhY2sgIGF0IHRoZSBuZXcKLQkgKiBhZGRyZXNzIHdoYXQgeW91IGp1c3Qgd3JvdGUgCi0JICovCi0KLQkvKiBEaXNhYmxlIGRlY29kZSBmb3IgYWxsIHJlZ2lvbnMgKi8KLQlESVNBQkxFX0RFQ09ERShSQVMxMCk7Ci0JRElTQUJMRV9ERUNPREUoUkFTMzIpOwotCURJU0FCTEVfREVDT0RFKENTMjApOwotCURJU0FCTEVfREVDT0RFKENTMyk7Ci0JRElTQUJMRV9ERUNPREUoUENJX0lPKTsKLQlESVNBQkxFX0RFQ09ERShQQ0lfTUVNMCk7Ci0JRElTQUJMRV9ERUNPREUoUENJX01FTTEpOwotCi0JLyogRGlzYWJsZSBhbGwgQkFSUyAqLwotCUdUX1dSSVRFKEJBUl9FTkFCTEVfQURSLCAweDFmZik7Ci0JRElTQUJMRV9HVF9CQVIoUkFTMTApOwotCURJU0FCTEVfR1RfQkFSKFJBUzMyKTsKLQlESVNBQkxFX0dUX0JBUihDUzIwKTsKLQlESVNBQkxFX0dUX0JBUihDUzMpOwotCi0JLyogVGVsbCB0aGUgQkFSIHdoZXJlIHRoZSBJTyByZWdpc3RlcnMgbm93IGFyZSAqLwotCUdUX0NPTkZJR19XUklURShQQ0lfQ09ORklHX0lOVF9SRUdfSU9fQURSLEdUX0JBUl9NQVNLKAotCQkJCQkgICAgKEdUNjQxMTFfSU9fQkFTRV9BRERSRVNTICYKLQkJCQkJICAgICBJT19CQU5LX01BU0spKSk7Ci0JLyogc2V0IHVwIGEgMTEyIE1iIGRlY29kZSAqLwotCVBST0dSQU1fSElfTE8oUENJX01FTTAsIFNIX0JBTks0X0FEUiwgMTEyICogMTAyNCAqIDEwMjQpOwotCi0JLyogU2V0IHVwIGEgMzIgTUIgaW8gc3BhY2UgZGVjb2RlICovCi0JUFJPR1JBTV9ISV9MTyhQQ0lfSU8sIElPX0JBTktfQURSLCAzMiAqIDEwMjQgKiAxMDI0KTsKLQotI2lmZGVmIEVOQUJMRV9QQ0lfRFJBTQotCS8qIFByb2dyYW0gdXAgdGhlIERSQU0gY29uZmlndXJhdGlvbiAtIHRoZXJlIGlzIERSQU0gb25seSBpbiBiYW5rIDAgKi8KLQkvKiBOb3cgc2V0IHVwIHRoZSBEUkFNIGRlY29kZSAqLwotCVBST0dSQU1fSElfTE8oUkFTMTAsIFBDSV9EUkFNX0JBU0UsIFBDSV9EUkFNX1NJWkUpOwotCS8qIEFuZCB0aGUgc3ViIGRlY29kZSAqLwotCVBST0dSQU1fU1VCX0hJX0xPKFJBUzAsIFBDSV9EUkFNX0JBU0UsIFBDSV9EUkFNX1NJWkUpOwotCi0JRElTQUJMRV9TVUJfREVDT0RFKFJBUzEpOwotCi0JLyogU2V0IHJlZnJlc2ggcmF0ZSAqLwotCUdUX1dSSVRFKERSQU1fQkFOSzBfUEFSTVMsIDB4M2YpOwotCUdUX1dSSVRFKERSQU1fQ0ZHLCAweDEwMCk7Ci0KLQkvKiB3ZSBoYXZlIHRvIGxvYiBvZmYgdGhlIHRvcCBiaXRzIHJlbWVtZWJlciEhICovCi0JUFJPR1JBTV9HVF9CQVIoUkFTMTAsIFNINF9UT19QQ0koUENJX0RSQU1fQkFTRSksIFBDSV9EUkFNX1NJWkUpOwotCi0jZW5kaWYKLQotCS8qIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gZGVjb2RpbmcgUkFTMTAgYW5kIHRoZSBHYWxpbGVvJ3MgaW50ZXJuYWwgCi0JICogcmVnaXN0ZXJzIChhcyBJTykgb24gdGhlIFBDSSBidXMKLQkgKi8KLSNpZmRlZiBFTkFCTEVfUENJX0RSQU0KLQlHVF9XUklURShCQVJfRU5BQkxFX0FEUiwgKH4oKDEgPDwgOCkgfCAoMSA8PCAzKSkpICYgMHgxZmYpOwotI2Vsc2UKLQlHVF9XUklURShCQVJfRU5BQkxFX0FEUiwgKH4oMSA8PCAzKSkgJiAweDFmZik7Ci0jZW5kaWYKLQotCS8qIENoYW5nZSB0aGUgY2xhc3MgY29kZSB0byBob3N0IGJyaWRnZSwgaXQgYWN0dWFsbHkgcG93ZXJzIHVwIAotCSAqIGFzIGEgbWVtb3J5IGNvbnRyb2xsZXIKLSAgICAgICAgICovCi0JR1RfQ09ORklHX1dSSVRFKDgsIDB4MDYwMDAwMTEpOwotCi0JLyogQWxsb3cgdGhlIGdhbGlsZW8gdG8gbWFzdGVyIHRoZSBQQ0kgYnVzICovCi0JR1RfQ09ORklHX1dSSVRFKFBDSV9DT01NQU5ELAotCQkJUENJX0NPTU1BTkRfTUVNT1JZIHwgUENJX0NPTU1BTkRfTUFTVEVSIHwKLQkJCVBDSV9DT01NQU5EX0lPKTsKLQotCi0jaWYgMAotICAgICAgICBwcmludGsoIlRlc3RpbmcgUENJIERSQU0gLSAiKTsKLQlpZih0ZXN0X2RyYW0oUENJX0RSQU1fQkFTRSxQQ0lfRFJBTV9TSVpFKSkgewotCQlwcmludGsoIlBhc3NlZFxuIik7Ci0JfWVsc2UgewotCQlwcmludGsoIkZBSUxFRFxuIik7Ci0JfQotI2VuZGlmCi0JcmV0dXJuIDA7Ci0KLX0KLQotCi0jZGVmaW5lIFNFVF9DT05GSUdfQklUUyhidXMsZGV2Zm4sd2hlcmUpXAotICAoKDE8PDMxKSB8ICgoYnVzKSA8PCAxNikgfCAoKGRldmZuKSA8PCA4KSB8ICgod2hlcmUpICYgfjMpKQotCi0jZGVmaW5lIENPTkZJR19DTUQoZGV2LCB3aGVyZSkgU0VUX0NPTkZJR19CSVRTKChkZXYpLT5idXMtPm51bWJlciwoZGV2KS0+ZGV2Zm4sd2hlcmUpCi0KLS8qIFRoaXMgd3JpdGUgdG8gdGhlIGdhbGlsZW8gY29uZmlnIHJlZ2lzdGVycywgdW5saWtlIHRoZSBmdW5jdGlvbnMgYmVsb3csIGNhbgotICogYmUgdXNlZCBiZWZvcmUgdGhlIFBDSSBzdWJzeXN0ZW0gaGFzIHN0YXJ0ZWQgdXAKLSAqLwotc3RhdGljIGludCBfX2luaXQgd3JpdGVfY29uZmlnX3RvX2dhbGlsZW8oaW50IHdoZXJlLCB1MzIgdmFsKQotewotCUdUX1dSSVRFKFBDSV9DRkdfQURSLCBTRVRfQ09ORklHX0JJVFMoMCwgMCwgd2hlcmUpKTsKLQotCUdUX1dSSVRFKFBDSV9DRkdfREFUQSwgdmFsKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogV2UgZXhjbHVkZSB0aGUgZ2FsaWxlbyBhbmQgc2xvdCAzMSwgdGhlIGdhbGlsZW8gYmVjYXVzZSBJIGRvbid0IGtub3cgaG93IHRvIHN0b3AKLSAqIHRoZSBzZXR1cCBjb2RlIHNoYWdnaW5nIHVwIHRoZSBzZXR1cCBJIGhhdmUgZG9uZSBvbiBpdCwgYW5kIDMxIGJlY2F1c2UgdGhlIHdob2xlCi0gKiB0aGluZyBsb2NrcyB1cCBpZiB5b3UgdHJ5IHRvIGFjY2VzcyB0aGF0IHNsb3QgKHdoaWNoIGRvZXNuJ3QgZXhpc3Qgb2YgY291cnNlIGFueXdheQotICovCi0KLSNkZWZpbmUgRVhDTFVERURfREVWKGRldikgKChkZXYtPmJ1cy0+bnVtYmVyPT0wKSAmJiAoKFBDSV9TTE9UKGRldi0+ZGV2Zm4pPT0wKSB8fCAoUENJX1NMT1QoZGV2LT5kZXZmbikgPT0gMzEpKSkKLQotc3RhdGljIGludCBnYWxpbGVvX3JlYWRfY29uZmlnX2J5dGUoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHdoZXJlLAotCQkJCSAgICB1OCAqIHZhbCkKLXsKLQotICAgICAgICAKLQkvKiBJIHN1c3BlY3QgdGhpcyBkb2Vzbid0IHdvcmsgYmVjYXVzZSB0aGlzIGRyaXZlcyBhIHNwZWNpYWwgY3ljbGUgPyAqLwotCWlmIChFWENMVURFRF9ERVYoZGV2KSkgewotCQkqdmFsID0gMHhmZjsKLQkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQl9Ci0JLyogU3RhcnQgdGhlIGNvbmZpZyBjeWNsZSAqLwotCUdUX1dSSVRFKFBDSV9DRkdfQURSLCBDT05GSUdfQ01EKGRldiwgd2hlcmUpKTsKLQkvKiBSZWFkIGJhY2sgdGhlIHJlc3VsdCAqLwotCSp2YWwgPSBHVF9SRUFEX0JZVEUoUENJX0NGR19EQVRBICsgKHdoZXJlICYgMykpOwotCi0JcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLX0KLQotCi1zdGF0aWMgaW50IGdhbGlsZW9fcmVhZF9jb25maWdfd29yZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgd2hlcmUsCi0JCQkJICAgIHUxNiAqIHZhbCkKLXsKLQotICAgICAgICBpZiAoRVhDTFVERURfREVWKGRldikpIHsKLQkJKnZhbCA9IDB4ZmZmZjsKLQkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQl9Ci0KLQlHVF9XUklURShQQ0lfQ0ZHX0FEUiwgQ09ORklHX0NNRChkZXYsIHdoZXJlKSk7Ci0JKnZhbCA9IEdUX1JFQURfU0hPUlQoUENJX0NGR19EQVRBICsgKHdoZXJlICYgMikpOwotCi0JcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLX0KLQotCi1zdGF0aWMgaW50IGdhbGlsZW9fcmVhZF9jb25maWdfZHdvcmQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHdoZXJlLAotCQkJCSAgICAgdTMyICogdmFsKQotewotCWlmIChFWENMVURFRF9ERVYoZGV2KSkgewotCQkqdmFsID0gMHhmZmZmZmZmZjsKLQkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLQl9Ci0KLQlHVF9XUklURShQQ0lfQ0ZHX0FEUiwgQ09ORklHX0NNRChkZXYsIHdoZXJlKSk7Ci0JKnZhbCA9IEdUX1JFQUQoUENJX0NGR19EQVRBKTsKLQotCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19Ci0KLXN0YXRpYyBpbnQgZ2FsaWxlb193cml0ZV9jb25maWdfYnl0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgd2hlcmUsCi0JCQkJICAgICB1OCB2YWwpCi17Ci0JR1RfV1JJVEUoUENJX0NGR19BRFIsIENPTkZJR19DTUQoZGV2LCB3aGVyZSkpOwotCi0JR1RfV1JJVEVfQllURShQQ0lfQ0ZHX0RBVEEgKyAod2hlcmUgJiAzKSwgdmFsKTsKLQotCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19Ci0KLQotc3RhdGljIGludCBnYWxpbGVvX3dyaXRlX2NvbmZpZ193b3JkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCB3aGVyZSwKLQkJCQkgICAgIHUxNiB2YWwpCi17Ci0JR1RfV1JJVEUoUENJX0NGR19BRFIsIENPTkZJR19DTUQoZGV2LCB3aGVyZSkpOwotCi0JR1RfV1JJVEVfU0hPUlQoUENJX0NGR19EQVRBICsgKHdoZXJlICYgMiksIHZhbCk7Ci0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi1zdGF0aWMgaW50IGdhbGlsZW9fd3JpdGVfY29uZmlnX2R3b3JkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCB3aGVyZSwKLQkJCQkgICAgICB1MzIgdmFsKQotewotCUdUX1dSSVRFKFBDSV9DRkdfQURSLCBDT05GSUdfQ01EKGRldiwgd2hlcmUpKTsKLQotCUdUX1dSSVRFKFBDSV9DRkdfREFUQSwgdmFsKTsKLQotCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX29wcyBwY2lfY29uZmlnX29wcyA9IHsKLQlnYWxpbGVvX3JlYWRfY29uZmlnX2J5dGUsCi0JZ2FsaWxlb19yZWFkX2NvbmZpZ193b3JkLAotCWdhbGlsZW9fcmVhZF9jb25maWdfZHdvcmQsCi0JZ2FsaWxlb193cml0ZV9jb25maWdfYnl0ZSwKLQlnYWxpbGVvX3dyaXRlX2NvbmZpZ193b3JkLAotCWdhbGlsZW9fd3JpdGVfY29uZmlnX2R3b3JkCi19OwotCi0KLS8qIEV2ZXJ5dGhpbmcgaGFuZ3Mgb2ZmIHRoaXMgKi8KLXN0YXRpYyBzdHJ1Y3QgcGNpX2J1cyAqcGNpX3Jvb3RfYnVzOwotCi0KLXN0YXRpYyB1OCBfX2luaXQgbm9fc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqIHBpbikKLXsKLQlyZXR1cm4gUENJX1NMT1QoZGV2LT5kZXZmbik7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1hcF9vZF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQotewotCS8qIFNsb3QgMTogR2FsaWxlbyAKLQkgKiBTbG90IDI6IFBDSSBTbG90IDEKLQkgKiBTbG90IDM6IFBDSSBTbG90IDIKLQkgKiBTbG90IDQ6IEVTUwotCSAqLwotCXN3aXRjaCAoc2xvdCkgewotCWNhc2UgMjogCi0JCXJldHVybiBPVkVSRFJJVkVfUENJX0lSUTE7Ci0JY2FzZSAzOgotCQkvKiBOb3RlIHRoaXMgYXNzdW1lcyB5b3UgaGF2ZSBhIGhhY2tlZCBjYXJkIGluIHNsb3QgMiAqLwotCQlyZXR1cm4gT1ZFUkRSSVZFX1BDSV9JUlEyOwotCWNhc2UgNDoKLQkJcmV0dXJuIE9WRVJEUklWRV9FU1NfSVJROwotCWRlZmF1bHQ6Ci0JCS8qIHByaW50aygiUENJOiBVbmV4cGVjdGVkIElSUSBtYXBwaW5nIHJlcXVlc3QgZm9yIHNsb3QgJWRcbiIsIHNsb3QpOyAqLwotCQlyZXR1cm4gLTE7Ci0JfQotfQotCi0KLQotdm9pZCBfX2luaXQKLXBjaWJpb3NfZml4dXBfcGJ1c19yYW5nZXMoc3RydWN0IHBjaV9idXMgKmJ1cywgc3RydWN0IHBidXNfc2V0X3Jhbmdlc19kYXRhICpyYW5nZXMpCi17Ci0gICAgICAgIHJhbmdlcy0+aW9fc3RhcnQgLT0gYnVzLT5yZXNvdXJjZVswXS0+c3RhcnQ7Ci0gICAgICAgIHJhbmdlcy0+aW9fZW5kIC09IGJ1cy0+cmVzb3VyY2VbMF0tPnN0YXJ0OwotICAgICAgICByYW5nZXMtPm1lbV9zdGFydCAtPSBidXMtPnJlc291cmNlWzFdLT5zdGFydDsKLSAgICAgICAgcmFuZ2VzLT5tZW1fZW5kIC09IGJ1cy0+cmVzb3VyY2VbMV0tPnN0YXJ0OwotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBwY2lfZml4dXBfaWRlX2Jhc2VzKHN0cnVjdCBwY2lfZGV2ICpkKQotewotCWludCBpOwotCi0JLyoKLQkgKiBQQ0kgSURFIGNvbnRyb2xsZXJzIHVzZSBub24tc3RhbmRhcmQgSS9PIHBvcnQgZGVjb2RpbmcsIHJlc3BlY3QgaXQuCi0JICovCi0JaWYgKChkLT5jbGFzcyA+PiA4KSAhPSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpCi0JCXJldHVybjsKLQlwcmludGsoIlBDSTogSURFIGJhc2UgYWRkcmVzcyBmaXh1cCBmb3IgJXNcbiIsIHBjaV9uYW1lKGQpKTsKLQlmb3IoaT0wOyBpPDQ7IGkrKykgewotCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZC0+cmVzb3VyY2VbaV07Ci0JCWlmICgoci0+c3RhcnQgJiB+MHg4MCkgPT0gMHgzNzQpIHsKLQkJCXItPnN0YXJ0IHw9IDI7Ci0JCQlyLT5lbmQgPSByLT5zdGFydDsKLQkJfQotCX0KLX0KLURFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZml4dXBfaWRlX2Jhc2VzKTsKLQotdm9pZCBfX2luaXQgcGNpYmlvc19pbml0KHZvaWQpCi17Ci0Jc3RhdGljIHN0cnVjdCByZXNvdXJjZSBnYWxpbyxnYWxtZW07Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgdGhlIHJlZ2lzdGVycyB1c2VkIGJ5IHRoZSBHYWxpbGVvICovCi0gICAgICAgIGdhbGlvLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKLSAgICAgICAgZ2FsaW8ubmFtZSAgPSAiR2FsaWxlbyBHVDY0MDExIjsKLSAgICAgICAgZ2FsbWVtLmZsYWdzID0gSU9SRVNPVVJDRV9NRU18SU9SRVNPVVJDRV9QUkVGRVRDSDsKLSAgICAgICAgZ2FsbWVtLm5hbWUgID0gIkdhbGlsZW8gR1Q2NDAxMSBEUkFNIjsKLQotICAgICAgICBhbGxvY2F0ZV9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLCAmZ2FsaW8sIDI1NiwKLQkJICAgIEdUNjQxMTFfSU9fQkFTRV9BRERSRVNTLEdUNjQxMTFfSU9fQkFTRV9BRERSRVNTKzI1NiwgMjU2LCBOVUxMLCBOVUxMKTsKLSAgICAgICAgYWxsb2NhdGVfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmZ2FsbWVtLFBDSV9EUkFNX1NJWkUsCi0JCSAgICBQSFlTQUREUihQQ0lfRFJBTV9CQVNFKSwgUEhZU0FERFIoUENJX0RSQU1fQkFTRSkrUENJX0RSQU1fU0laRSwgCi0JCQkgICAgIFBDSV9EUkFNX1NJWkUsIE5VTEwsIE5VTEwpOwotCi0gIAkvKiBvaywgZG8gdGhlIHNjYW4gbWFuICovCi0JcGNpX3Jvb3RfYnVzID0gcGNpX3NjYW5fYnVzKDAsICZwY2lfY29uZmlnX29wcywgTlVMTCk7Ci0KLSAgICAgICAgcGNpX2Fzc2lnbl91bmFzc2lnbmVkX3Jlc291cmNlcygpOwotCXBjaV9maXh1cF9pcnFzKG5vX3N3aXp6bGUsIG1hcF9vZF9pcnEpOwotCi0jaWZkZWYgVEVTVF9EUkFNCi0gICAgICAgIHByaW50aygiVGVzdGluZyBQQ0kgRFJBTSAtICIpOwotCWlmKHRlc3RfZHJhbShQQ0lfRFJBTV9CQVNFLFBDSV9EUkFNX1NJWkUpKSB7Ci0JCXByaW50aygiUGFzc2VkXG4iKTsKLQl9ZWxzZSB7Ci0JCXByaW50aygiRkFJTEVEXG4iKTsKLQl9Ci0jZW5kaWYKLQotfQotCi1jaGFyICogX19pbml0IHBjaWJpb3Nfc2V0dXAoY2hhciAqc3RyKQotewotCXJldHVybiBzdHI7Ci19Ci0KLQotCi1pbnQgcGNpYmlvc19lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0KLQl1MTYgY21kLCBvbGRfY21kOwotCWludCBpZHg7Ci0Jc3RydWN0IHJlc291cmNlICpyOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgJmNtZCk7Ci0Jb2xkX2NtZCA9IGNtZDsKLQlmb3IgKGlkeCA9IDA7IGlkeCA8IDY7IGlkeCsrKSB7Ci0JCXIgPSBkZXYtPnJlc291cmNlICsgaWR4OwotCQlpZiAoIXItPnN0YXJ0ICYmIHItPmVuZCkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIlBDSTogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSIKLQkJCSAgICAgICAiIG9mIHJlc291cmNlIGNvbGxpc2lvbnNcbiIsCi0JCQkgICAgICAgcGNpX25hbWUoZGV2KSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQotCQkJY21kIHw9IFBDSV9DT01NQU5EX0lPOwotCQlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKLQkJCWNtZCB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7Ci0JfQotCWlmIChjbWQgIT0gb2xkX2NtZCkgewotCQlwcmludGsoIlBDSTogZW5hYmxpbmcgZGV2aWNlICVzICglMDR4IC0+ICUwNHgpXG4iLAotCQkgICAgICAgcGNpX25hbWUoZGV2KSwgb2xkX2NtZCwgY21kKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsIGNtZCk7Ci0JfQotCXJldHVybiAwOwotCi19Ci0KLS8qIFdlIHNob3VsZCBkbyBzb21lIG9wdGltaXNhdGlvbiB3b3JrIGhlcmUgSSB0aGluay4gT2sgZm9yIG5vdyB0aG91Z2ggKi8KLXZvaWQgX19pbml0IHBjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCi17Ci0KLX0KLQotdm9pZCBwY2liaW9zX2FsaWduX3Jlc291cmNlKHZvaWQgKmRhdGEsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAotCQkJICAgIHJlc291cmNlX3NpemVfdCBzaXplKQotewotfQotCi12b2lkIF9faW5pdCBwY2liaW9zX3VwZGF0ZV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsCi0JCQkgICAgIHN0cnVjdCByZXNvdXJjZSAqcmVzLCBpbnQgcmVzb3VyY2UpCi17Ci0KLQl1bnNpZ25lZCBsb25nIHdoZXJlLCBzaXplOwotCXUzMiByZWc7Ci0JCi0KLQlwcmludGsoIlBDSTogQXNzaWduaW5nICUzcyAlMDhseCB0byAlc1xuIiwKLQkgICAgICAgcmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8gPyAiSU8iIDogIk1FTSIsCi0JICAgICAgIHJlcy0+c3RhcnQsIGRldi0+bmFtZSk7Ci0KLQl3aGVyZSA9IFBDSV9CQVNFX0FERFJFU1NfMCArIHJlc291cmNlICogNDsKLQlzaXplID0gcmVzLT5lbmQgLSByZXMtPnN0YXJ0OwotCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgd2hlcmUsICZyZWcpOwotCXJlZyA9IChyZWcgJiBzaXplKSB8ICgoKHUzMikgKHJlcy0+c3RhcnQgLSByb290LT5zdGFydCkpICYgfnNpemUpOwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCB3aGVyZSwgcmVnKTsKLX0KLQotCi12b2lkIF9faW5pdCBwY2liaW9zX3VwZGF0ZV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGlycSkKLXsKLQlwcmludGsoIlBDSTogQXNzaWduaW5nIElSUSAlMDJkIHRvICVzXG4iLCBpcnEsIGRldi0+bmFtZSk7Ci0JcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOwotfQotCi0vKgotICogIElmIHdlIHNldCB1cCBhIGRldmljZSBmb3IgYnVzIG1hc3RlcmluZywgd2UgbmVlZCB0byBjaGVjayB0aGUgbGF0ZW5jeQotICogIHRpbWVyIGFzIGNlcnRhaW4gY3JhcHB5IEJJT1NlcyBmb3JnZXQgdG8gc2V0IGl0IHByb3Blcmx5LgotICovCi11bnNpZ25lZCBpbnQgcGNpYmlvc19tYXhfbGF0ZW5jeSA9IDI1NTsKLQotdm9pZCBwY2liaW9zX3NldF9tYXN0ZXIoc3RydWN0IHBjaV9kZXYgKmRldikKLXsKLQl1OCBsYXQ7Ci0JcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJmxhdCk7Ci0JaWYgKGxhdCA8IDE2KQotCQlsYXQgPSAoNjQgPD0gcGNpYmlvc19tYXhfbGF0ZW5jeSkgPyA2NCA6IHBjaWJpb3NfbWF4X2xhdGVuY3k7Ci0JZWxzZSBpZiAobGF0ID4gcGNpYmlvc19tYXhfbGF0ZW5jeSkKLQkJbGF0ID0gcGNpYmlvc19tYXhfbGF0ZW5jeTsKLQllbHNlCi0JCXJldHVybjsKLQlwcmludGsoIlBDSTogU2V0dGluZyBsYXRlbmN5IHRpbWVyIG9mIGRldmljZSAlcyB0byAlZFxuIiwgcGNpX25hbWUoZGV2KSwgbGF0KTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgbGF0KTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL292ZXJkcml2ZS9pby5jIGIvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL2lvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NzFiNmIuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgSi4gTWNrYXkgKGRhdmlkLm1ja2F5QHN0LmNvbSkKLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgSS9PIHJvdXRpbmVzIGZvciB1c2Ugb24gdGhlIG92ZXJkcml2ZSBib2FyZAotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0KLSNpbmNsdWRlIDxhc20vb3ZlcmRyaXZlL292ZXJkcml2ZS5oPgotCi0vKgotICogcmVhZFgvd3JpdGVYKCkgYXJlIHVzZWQgdG8gYWNjZXNzIG1lbW9yeSBtYXBwZWQgZGV2aWNlcy4gT24gc29tZQotICogYXJjaGl0ZWN0dXJlcyB0aGUgbWVtb3J5IG1hcHBlZCBJTyBzdHVmZiBuZWVkcyB0byBiZSBhY2Nlc3NlZAotICogZGlmZmVyZW50bHkuIE9uIHRoZSBTdXBlckggYXJjaGl0ZWN0dXJlLCB3ZSBqdXN0IHJlYWQvd3JpdGUgdGhlCi0gKiBtZW1vcnkgbG9jYXRpb24gZGlyZWN0bHkuCi0gKi8KLQotI2RlZmluZSBkcHJpbnRrKHguLi4pCi0KLS8qIFRyYW5zbGF0ZXMgYW4gSU8gYWRkcmVzcyB0byB3aGVyZSBpdCBpcyBtYXBwZWQgaW4gbWVtb3J5ICovCi0KLSNkZWZpbmUgaW9fYWRkcih4KSAoKCh1bnNpZ25lZCkoeCkpfFBDSV9HVElPX0JBU0UpCi0KLXVuc2lnbmVkIGNoYXIgb2RfaW5iKHVuc2lnbmVkIGxvbmcgcG9ydCkKLXsKLWRwcmludGsoIm9kX2luYigleClcbiIsIHBvcnQpOwotCXJldHVybiByZWFkYihpb19hZGRyKHBvcnQpKSAmIDB4ZmY7Ci19Ci0KLQotdW5zaWduZWQgc2hvcnQgb2RfaW53KHVuc2lnbmVkIGxvbmcgcG9ydCkKLXsKLWRwcmludGsoIm9kX2ludygleClcbiIsIHBvcnQpOwotCXJldHVybiByZWFkdyhpb19hZGRyKHBvcnQpKSAmIDB4ZmZmZjsKLX0KLQotdW5zaWduZWQgaW50IG9kX2lubCh1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci1kcHJpbnRrKCJvZF9pbmwoJXgpXG4iLCBwb3J0KTsKLQlyZXR1cm4gcmVhZGwoaW9fYWRkcihwb3J0KSk7Ci19Ci0KLXZvaWQgb2Rfb3V0Yih1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci1kcHJpbnRrKCJvZF9vdXRiKCV4LCAleClcbiIsIHZhbHVlLCBwb3J0KTsKLQl3cml0ZWIodmFsdWUsIGlvX2FkZHIocG9ydCkpOwotfQotCi12b2lkIG9kX291dHcodW5zaWduZWQgc2hvcnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKLXsKLWRwcmludGsoIm9kX291dHcoJXgsICV4KVxuIiwgdmFsdWUsIHBvcnQpOwotCXdyaXRldyh2YWx1ZSwgaW9fYWRkcihwb3J0KSk7Ci19Ci0KLXZvaWQgb2Rfb3V0bCh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKLXsKLWRwcmludGsoIm9kX291dGwoJXgsICV4KVxuIiwgdmFsdWUsIHBvcnQpOwotCXdyaXRlbCh2YWx1ZSwgaW9fYWRkcihwb3J0KSk7Ci19Ci0KLS8qIFRoaXMgaXMgaG9ycmlibGUgYXQgdGhlIG1vbWVudCAtIG5lZWRzIG1vcmUgd29yayB0byBkbyBzb21ldGhpbmcgc2Vuc2libGUgKi8KLSNkZWZpbmUgSU9fREVMQVkoKSB1ZGVsYXkoMTApCi0KLSNkZWZpbmUgT1VUX0RFTEFZKHgsdHlwZSkgXAotdm9pZCBvZF9vdXQjI3gjI19wKHVuc2lnbmVkIHR5cGUgdmFsdWUsdW5zaWduZWQgbG9uZyBwb3J0KXtvdXQjI3godmFsdWUscG9ydCk7SU9fREVMQVkoKTt9Ci0KLSNkZWZpbmUgSU5fREVMQVkoeCx0eXBlKSBcCi11bnNpZ25lZCB0eXBlIG9kX2luIyN4IyNfcCh1bnNpZ25lZCBsb25nIHBvcnQpIHt1bnNpZ25lZCB0eXBlIHRtcD1pbiMjeChwb3J0KTtJT19ERUxBWSgpO3JldHVybiB0bXA7fQotCi0KLU9VVF9ERUxBWShiLGNoYXIpCi1PVVRfREVMQVkodyxzaG9ydCkKLU9VVF9ERUxBWShsLGludCkKLQotSU5fREVMQVkoYixjaGFyKQotSU5fREVMQVkodyxzaG9ydCkKLUlOX0RFTEFZKGwsaW50KQotCi0KLS8qICBOb3cgZm9yIHRoZSBzdHJpbmcgdmVyc2lvbiBvZiB0aGVzZSBmdW5jdGlvbnMgKi8KLXZvaWQgb2Rfb3V0c2IodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQotewotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKSBhZGRyOwotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHArKykgewotCQlvdXRiKCpwLCBwb3J0KTsKLQl9Ci19Ci0KLQotdm9pZCBvZF9pbnNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgYWRkcjsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBwKyspIHsKLQkJKnAgPSBpbmIocG9ydCk7Ci0JfQotfQotCi0vKiBGb3IgdGhlIDE2IGFuZCAzMiBiaXQgc3RyaW5nIGZ1bmN0aW9ucywgd2UgaGF2ZSB0byB3b3JyeSBhYm91dCBhbGlnbm1lbnQuCi0gKiBUaGUgU0ggZG9lcyBub3QgZG8gdW5hbGlnbmVkIGFjY2Vzc2VzLCBzbyB3ZSBoYXZlIHRvIHJlYWQgYXMgYnl0ZXMgYW5kCi0gKiB0aGVuIHdyaXRlIGFzIGEgd29yZCBvciBkd29yZC4gCi0gKiBUaGlzIGNhbiBiZSBvcHRpbWlzZWQgYSBsb3QgbW9yZSwgZXNwZWNpYWxseSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgZGF0YQotICogaXMgYWxpZ25lZAotICovCi0KLXZvaWQgb2Rfb3V0c3codW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQotewotCWludCBpOwotCXVuc2lnbmVkIHNob3J0IHRtcDsKLQl1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgYWRkcjsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBwICs9IDIpIHsKLQkJdG1wID0gKCpwKSB8ICgoKihwICsgMSkpIDw8IDgpOwotCQlvdXR3KHRtcCwgcG9ydCk7Ci0JfQotfQotCi0KLXZvaWQgb2RfaW5zdyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgc2hvcnQgdG1wOwotCXVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKSBhZGRyOwotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHAgKz0gMikgewotCQl0bXAgPSBpbncocG9ydCk7Ci0JCXBbMF0gPSB0bXAgJiAweGZmOwotCQlwWzFdID0gKHRtcCA+PiA4KSAmIDB4ZmY7Ci0JfQotfQotCi0KLXZvaWQgb2Rfb3V0c2wodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQotewotCWludCBpOwotCXVuc2lnbmVkIHRtcDsKLQl1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgYWRkcjsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBwICs9IDQpIHsKLQkJdG1wID0gKCpwKSB8ICgoKihwICsgMSkpIDw8IDgpIHwgKCgqKHAgKyAyKSkgPDwgMTYpIHwKLQkJICAgICAgKCgqKHAgKyAzKSkgPDwgMjQpOwotCQlvdXRsKHRtcCwgcG9ydCk7Ci0JfQotfQotCi0KLXZvaWQgb2RfaW5zbCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgdG1wOwotCXVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKSBhZGRyOwotCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyssIHAgKz0gNCkgewotCQl0bXAgPSBpbmwocG9ydCk7Ci0JCXBbMF0gPSB0bXAgJiAweGZmOwotCQlwWzFdID0gKHRtcCA+PiA4KSAmIDB4ZmY7Ci0JCXBbMl0gPSAodG1wID4+IDE2KSAmIDB4ZmY7Ci0JCXBbM10gPSAodG1wID4+IDI0KSAmIDB4ZmY7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvaXJxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNzMwYzcuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL2lycS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEouIE1ja2F5IChkYXZpZC5tY2theUBzdC5jb20pCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqCi0gKiBMb29rcyBhZnRlciBpbnRlcnJ1cHRzIG9uIHRoZSBvdmVyZHJpdmUgYm9hcmQuCi0gKgotICogQmFzZXMgb24gdGhlIElQUiBpcnEgc3lzdGVtCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLQotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLQotI2luY2x1ZGUgPGFzbS9vdmVyZHJpdmUvb3ZlcmRyaXZlLmg+Ci0KLXN0cnVjdCBvZF9kYXRhIHsKLQlpbnQgb3ZlcmRyaXZlX2lycTsKLQlpbnQgaXJxX21hc2s7Ci19OwotCi0jZGVmaW5lIE5VTV9FWFRFUk5BTF9JUlFTIDE2Ci0jZGVmaW5lIEVYVEVSTkFMX0lSUV9OT1RfSU5fVVNFICgtMSkKLSNkZWZpbmUgRVhURVJOQUxfSVJRX05PVF9BU1NJR05FRCAoLTEpCi0KLS8qCi0gKiBUaGlzIHRhYmxlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoYXQgdG8gcHJvZ3JhbSBpbnRvIHRoZSBGUEdBJ3MgQ1QgcmVnaXN0ZXIKLSAqIGZvciB0aGUgc3BlY2lmaWVkIExpbnV4IElSUS4KLSAqCi0gKiBUaGUgaXJxX21hc2sgZ2l2ZXMgdGhlIGludGVycnVwdCBudW1iZXIgZnJvbSB0aGUgUENJIGJvYXJkIChQQ0lfSW50KDY6MCkpCi0gKiBidXQgaXMgb25lIGdyZWF0ZXIgdGhhbiB0aGF0IGJlY2F1c2UgdGhlIGJlY2F1c2UgdGhlIEZQR0EgdHJlYXRzIDAKLSAqIGFzIGRpc2FibGVkLCBhIHZhbHVlIG9mIDEgYXNzZXJ0cyBQQ0lfSW50MCwgYW5kIHNvIG9uLgotICoKLSAqIFRoZSBvdmVyZHJpdmVfaXJxIHNwZWNpZmllcyB3aGljaCBvZiB0aGUgZWlnaHQgaW50ZXJydXB0IHNvdXJjZXMgZ2VuZXJhdGVzCi0gKiB0aGF0IGludGVycnVwdCwgYW5kIGJ1dCBpcyBtdWx0aXBsaWVkIGJ5IGZvdXIgdG8gZ2l2ZSB0aGUgYml0IG9mZnNldCBpbnRvCi0gKiB0aGUgQ1QgcmVnaXN0ZXIuCi0gKgotICogVGhlIHNldmVuIGludGVycnVwdHMgbGV2ZWxzIChTSDQgSVJMJ3MpIHdlIGhhdmUgYXZhaWxhYmxlIGhlcmUgaXMgaGFyZHdpcmVkCi0gKiBieSB0aGUgRVBMRC4gVGhlIGFzc2lnbm1lbnRzIGhlcmUgb2Ygd2hpY2ggUENJIGludGVycnVwdCBnZW5lcmF0ZXMgZWFjaAotICogbGV2ZWwgaXMgYXJiaXRhcnkuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgb2RfZGF0YSBvZF9kYXRhX3RhYmxlW05VTV9FWFRFUk5BTF9JUlFTXSA9IHsKLQkvKiAgICBvdmVyZHJpdmVfaXJxICAgICAgICwgaXJxX21hc2sgKi8KLQl7RVhURVJOQUxfSVJRX05PVF9BU1NJR05FRCwgRVhURVJOQUxfSVJRX05PVF9JTl9VU0V9LAkvKiAwICovCi0Je0VYVEVSTkFMX0lSUV9OT1RfQVNTSUdORUQsIDd9LAkvKiAxICovCi0Je0VYVEVSTkFMX0lSUV9OT1RfQVNTSUdORUQsIDZ9LAkvKiAyICovCi0Je0VYVEVSTkFMX0lSUV9OT1RfQVNTSUdORUQsIEVYVEVSTkFMX0lSUV9OT1RfSU5fVVNFfSwJLyogMyAqLwotCXtFWFRFUk5BTF9JUlFfTk9UX0FTU0lHTkVELCA1fSwJLyogNCAqLwotCXtFWFRFUk5BTF9JUlFfTk9UX0FTU0lHTkVELCBFWFRFUk5BTF9JUlFfTk9UX0lOX1VTRX0sCS8qIDUgKi8KLQl7RVhURVJOQUxfSVJRX05PVF9BU1NJR05FRCwgRVhURVJOQUxfSVJRX05PVF9JTl9VU0V9LAkvKiA2ICovCi0Je0VYVEVSTkFMX0lSUV9OT1RfQVNTSUdORUQsIDR9LAkvKiA3ICovCi0Je0VYVEVSTkFMX0lSUV9OT1RfQVNTSUdORUQsIEVYVEVSTkFMX0lSUV9OT1RfSU5fVVNFfSwJLyogOCAqLwotCXtFWFRFUk5BTF9JUlFfTk9UX0FTU0lHTkVELCBFWFRFUk5BTF9JUlFfTk9UX0lOX1VTRX0sCS8qIDkgKi8KLQl7RVhURVJOQUxfSVJRX05PVF9BU1NJR05FRCwgM30sCS8qIDEwICovCi0Je0VYVEVSTkFMX0lSUV9OT1RfQVNTSUdORUQsIDJ9LAkvKiAxMSAqLwotCXtFWFRFUk5BTF9JUlFfTk9UX0FTU0lHTkVELCBFWFRFUk5BTF9JUlFfTk9UX0lOX1VTRX0sCS8qIDEyICovCi0Je0VYVEVSTkFMX0lSUV9OT1RfQVNTSUdORUQsIDF9LAkvKiAxMyAqLwotCXtFWFRFUk5BTF9JUlFfTk9UX0FTU0lHTkVELCBFWFRFUk5BTF9JUlFfTk9UX0lOX1VTRX0sCS8qIDE0ICovCi0Je0VYVEVSTkFMX0lSUV9OT1RfQVNTSUdORUQsIEVYVEVSTkFMX0lSUV9OT1RfSU5fVVNFfQkvKiAxNSAqLwotfTsKLQotc3RhdGljIHZvaWQgc2V0X29kX2RhdGEoaW50IG92ZXJkcml2ZV9pcnEsIGludCBpcnEpCi17Ci0JaWYgKGlycSA+PSBOVU1fRVhURVJOQUxfSVJRUyB8fCBpcnEgPCAwKQotCQlyZXR1cm47Ci0Jb2RfZGF0YV90YWJsZVtpcnFdLm92ZXJkcml2ZV9pcnEgPSBvdmVyZHJpdmVfaXJxIDw8IDI7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9vZF9pcnEodW5zaWduZWQgaW50IGlycSk7Ci12b2lkIGRpc2FibGVfb2RfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotCi0vKiBzaHV0ZG93biBpcyBzYW1lIGFzICJkaXNhYmxlIiAqLwotI2RlZmluZSBzaHV0ZG93bl9vZF9pcnEgZGlzYWJsZV9vZF9pcnEKLQotc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX29kKHVuc2lnbmVkIGludCk7Ci1zdGF0aWMgdm9pZCBlbmRfb2RfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfb2RfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZW5hYmxlX29kX2lycShpcnEpOwotCXJldHVybiAwOwkJLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLwotfQotCi1zdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIG9kX2lycV90eXBlID0gewotCS50eXBlbmFtZSA9ICJPdmVyZHJpdmUtSVJRIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfb2RfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX29kX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX29kX2lycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfb2RfaXJxLAotCS5hY2sgPSBtYXNrX2FuZF9hY2tfb2QsCi0JLmVuZCA9IGVuZF9vZF9pcnEKLX07Ci0KLXN0YXRpYyB2b2lkIGRpc2FibGVfb2RfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JdW5zaWduZWQgdmFsLCBmbGFnczsKLQlpbnQgb3ZlcmRyaXZlX2lycTsKLQl1bnNpZ25lZCBtYXNrOwotCi0JLyogTm90IGEgdmFsaWQgaW50ZXJydXB0ICovCi0JaWYgKGlycSA8IDAgfHwgaXJxID49IE5VTV9FWFRFUk5BTF9JUlFTKQotCQlyZXR1cm47Ci0KLSAgICAgICAgLyogSXMgaXMgbmVjZXNzYXJ5IHRvIHVzZSBhIGNsaSBoZXJlPyBXb3VsZCBhIHNwaW5sb2NrIG5vdCBiZSAKLSAgICAgICAgICogbXJvZSBlZmZpY2llbnQ/Ci0gICAgICAgICAqLwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlvdmVyZHJpdmVfaXJxID0gb2RfZGF0YV90YWJsZVtpcnFdLm92ZXJkcml2ZV9pcnE7Ci0JaWYgKG92ZXJkcml2ZV9pcnEgIT0gRVhURVJOQUxfSVJRX05PVF9BU1NJR05FRCkgewotCQltYXNrID0gfigweDcgPDwgb3ZlcmRyaXZlX2lycSk7Ci0JCXZhbCA9IGN0cmxfaW5sKE9WRVJEUklWRV9JTlRfQ1QpOwotCQl2YWwgJj0gbWFzazsKLQkJY3RybF9vdXRsKHZhbCwgT1ZFUkRSSVZFX0lOVF9DVCk7Ci0JfQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgZW5hYmxlX29kX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIHZhbCwgZmxhZ3M7Ci0JaW50IG92ZXJkcml2ZV9pcnE7Ci0JdW5zaWduZWQgbWFzazsKLQotCS8qIE5vdCBhIHZhbGlkIGludGVycnVwdCAqLwotCWlmIChpcnEgPCAwIHx8IGlycSA+PSBOVU1fRVhURVJOQUxfSVJRUykKLQkJcmV0dXJuOwotCi0JLyogU2V0IHByaW9yaXR5IGluIE9EIGJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JLyogVGhpcyBvbmUgaXMgbm90IGluIHVzZSBjdXJyZW50bHkgKi8KLQlvdmVyZHJpdmVfaXJxID0gb2RfZGF0YV90YWJsZVtpcnFdLm92ZXJkcml2ZV9pcnE7Ci0JaWYgKG92ZXJkcml2ZV9pcnEgIT0gRVhURVJOQUxfSVJRX05PVF9BU1NJR05FRCkgewotCQl2YWwgPSBjdHJsX2lubChPVkVSRFJJVkVfSU5UX0NUKTsKLQkJbWFzayA9IH4oMHg3IDw8IG92ZXJkcml2ZV9pcnEpOwotCQl2YWwgJj0gbWFzazsKLQkJbWFzayA9IG9kX2RhdGFfdGFibGVbaXJxXS5pcnFfbWFzayA8PCBvdmVyZHJpdmVfaXJxOwotCQl2YWwgfD0gbWFzazsKLQkJY3RybF9vdXRsKHZhbCwgT1ZFUkRSSVZFX0lOVF9DVCk7Ci0JfQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotCi0KLS8qIHRoaXMgZnVuY3Rpb25zIHNldHMgdGhlIGRlc2lyZWQgaXJxIGhhbmRsZXIgdG8gYmUgYW4gb3ZlcmRyaXZlIHR5cGUgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBtYWtlX29kX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOwotCWlycV9kZXNjW2lycV0uY2hpcCA9ICZvZF9pcnFfdHlwZTsKLQlkaXNhYmxlX29kX2lycShpcnEpOwotfQotCi0KLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19vZCh1bnNpZ25lZCBpbnQgaXJxKQotewotCWRpc2FibGVfb2RfaXJxKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuZF9vZF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQllbmFibGVfb2RfaXJxKGlycSk7Ci19Ci0KLXZvaWQgX19pbml0IGluaXRfb3ZlcmRyaXZlX2lycSh2b2lkKQotewotCWludCBpOwotCi0JLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLwotCWN0cmxfb3V0bCgwLCBPVkVSRFJJVkVfSU5UX0NUKTsKLQotCS8qIFVwZGF0ZSBpbnRlcnJ1cHQgcGluIG1vZGUgdG8gdXNlIGVuY29kZWQgaW50ZXJydXB0cyAqLwotCWkgPSBjdHJsX2ludyhJTlRDX0lDUik7Ci0JaSAmPSB+SU5UQ19JQ1JfSVJMTTsKLQljdHJsX291dHcoaSwgSU5UQ19JQ1IpOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9FWFRFUk5BTF9JUlFTOyBpKyspIHsKLQkJaWYgKG9kX2RhdGFfdGFibGVbaV0uaXJxX21hc2sgIT0gRVhURVJOQUxfSVJRX05PVF9JTl9VU0UpIHsKLQkJCW1ha2Vfb2RfaXJxKGkpOwotCQl9IGVsc2UgaWYgKGkgIT0gMTUpIHsJLy8gQ2Fubm90IHVzZSBpbWFzayBvbiBsZXZlbCAxNQotCQkJbWFrZV9pbWFza19pcnEoaSk7Ci0JCX0KLQl9Ci0KLQkvKiBTZXQgdXAgdGhlIGludGVycnVwdHMgKi8KLQlzZXRfb2RfZGF0YShPVkVSRFJJVkVfUENJX0lOVEEsIE9WRVJEUklWRV9QQ0lfSVJRMSk7Ci0Jc2V0X29kX2RhdGEoT1ZFUkRSSVZFX1BDSV9JTlRCLCBPVkVSRFJJVkVfUENJX0lSUTIpOwotCXNldF9vZF9kYXRhKE9WRVJEUklWRV9BVURJT19JTlQsIE9WRVJEUklWRV9FU1NfSVJRKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL292ZXJkcml2ZS9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL292ZXJkcml2ZS9sZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwZDdmMi4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvbGVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9vdmVyZHJpdmUvbGVkLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgU3R1YXJ0IE1lbmVmeSA8c3R1YXJ0Lm1lbmVmeUBzdC5jb20+Ci0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhbiBPdmVyZHJpdmUgc3BlY2lmaWMgTEVEIGZlYXR1cmUuCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vb3ZlcmRyaXZlL292ZXJkcml2ZS5oPgotCi1zdGF0aWMgdm9pZCBtYWNoX2xlZChpbnQgcG9zaXRpb24sIGludCB2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGxvbmcgcmVnOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQotCXJlZyA9IHJlYWRsKE9WRVJEUklWRV9DVFJMKTsKLQlpZiAodmFsdWUpIHsKLQkJcmVnIHw9ICgxPDwzKTsKLQl9IGVsc2UgewotCQlyZWcgJj0gfigxPDwzKTsKLQl9Ci0Jd3JpdGVsKHJlZywgT1ZFUkRSSVZFX0NUUkwpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotLyogYWN0cyBsaWtlIGFuIGFjdHVhbCBoZWFydCBiZWF0IC0tIGllIHRodW1wLXRodW1wLXBhdXNlLi4uICovCi12b2lkIGhlYXJ0YmVhdF9vZCh2b2lkKQotewotCXN0YXRpYyB1bnNpZ25lZCBjbnQgPSAwLCBwZXJpb2QgPSAwLCBkaXN0ID0gMDsKLQotCWlmIChjbnQgPT0gMCB8fCBjbnQgPT0gZGlzdCkKLQkJbWFjaF9sZWQoIC0xLCAxKTsKLQllbHNlIGlmIChjbnQgPT0gNyB8fCBjbnQgPT0gZGlzdCs3KQotCQltYWNoX2xlZCggLTEsIDApOwotCi0JaWYgKCsrY250ID4gcGVyaW9kKSB7Ci0JCWNudCA9IDA7Ci0JCS8qIFRoZSBoeXBlcmJvbGljIGZ1bmN0aW9uIGJlbG93IG1vZGlmaWVzIHRoZSBoZWFydGJlYXQgcGVyaW9kCi0JCSAqIGxlbmd0aCBpbiBkZXBlbmRlbmN5IG9mIHRoZSBjdXJyZW50ICg1bWluKSBsb2FkLiBJdCBnb2VzCi0JCSAqIHRocm91Z2ggdGhlIHBvaW50cyBmKDApPTEyNiwgZigxKT04NiwgZig1KT01MSwKLQkJICogZihpbmYpLT4zMC4gKi8KLQkJcGVyaW9kID0gKCg2NzI8PEZTSElGVCkvKDUqYXZlbnJ1blswXSsoNzw8RlNISUZUKSkpICsgMzA7Ci0JCWRpc3QgPSBwZXJpb2QgLyA0OwotCX0KLX0KLSNlbmRpZiAvKiBDT05GSUdfSEVBUlRCRUFUICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvbWFjaC5jIGIvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL21hY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgzNGEwMy4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvbWFjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvc2gvb3ZlcmRyaXZlL21hY2guYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBTdHVhcnQgTWVuZWZ5IChzdHVhcnQubWVuZWZ5QHN0LmNvbSkKLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogTWFjaGluZSB2ZWN0b3IgZm9yIHRoZSBTVE1pY3JvZWxlY3Ryb25pY3MgT3ZlcmRyaXZlCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0jaW5jbHVkZSA8YXNtL3J0Yy5oPgotI2luY2x1ZGUgPGFzbS9tYWNodmVjX2luaXQuaD4KLQotI2luY2x1ZGUgPGFzbS9pb191bmtub3duLmg+Ci0jaW5jbHVkZSA8YXNtL2lvX2dlbmVyaWMuaD4KLSNpbmNsdWRlIDxhc20vb3ZlcmRyaXZlL2lvLmg+Ci0KLXZvaWQgaGVhcnRiZWF0X29kKHZvaWQpOwotdm9pZCBpbml0X292ZXJkcml2ZV9pcnEodm9pZCk7Ci12b2lkIGdhbGlsZW9fcGNpYmlvc19pbml0KHZvaWQpOwotCi0vKgotICogVGhlIE1hY2hpbmUgVmVjdG9yCi0gKi8KLQotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X29kIF9faW5pdG12ID0gewotCS5tdl9ucl9pcnFzCQk9IDQ4LAotCi0JLm12X2luYgkJCT0gb2RfaW5iLAotCS5tdl9pbncJCQk9IG9kX2ludywKLQkubXZfaW5sCQkJPSBvZF9pbmwsCi0JLm12X291dGIJCT0gb2Rfb3V0YiwKLQkubXZfb3V0dwkJPSBvZF9vdXR3LAotCS5tdl9vdXRsCQk9IG9kX291dGwsCi0KLQkubXZfaW5iX3AJCT0gb2RfaW5iX3AsCi0JLm12X2lud19wCQk9IG9kX2lud19wLAotCS5tdl9pbmxfcAkJPSBvZF9pbmxfcCwKLQkubXZfb3V0Yl9wCQk9IG9kX291dGJfcCwKLQkubXZfb3V0d19wCQk9IG9kX291dHdfcCwKLQkubXZfb3V0bF9wCQk9IG9kX291dGxfcCwKLQotCS5tdl9pbnNiCQk9IG9kX2luc2IsCi0JLm12X2luc3cJCT0gb2RfaW5zdywKLQkubXZfaW5zbAkJPSBvZF9pbnNsLAotCS5tdl9vdXRzYgkJPSBvZF9vdXRzYiwKLQkubXZfb3V0c3cJCT0gb2Rfb3V0c3csCi0JLm12X291dHNsCQk9IG9kX291dHNsLAotCi0jaWZkZWYgQ09ORklHX1BDSQotCS5tdl9pbml0X2lycQkJPSBpbml0X292ZXJkcml2ZV9pcnEsCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0JLm12X2hlYXJ0YmVhdAkJPSBoZWFydGJlYXRfb2QsCi0jZW5kaWYKLX07Ci0KLUFMSUFTX01WKG9kKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL3BjaWRtYS5jIGIvYXJjaC9zaC9ib2FyZHMvb3ZlcmRyaXZlL3BjaWRtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzliZmVkLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL292ZXJkcml2ZS9wY2lkbWEuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEouIE1ja2F5IChkYXZpZC5tY2theUBzdC5jb20pCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqCi0gKiBEeW5hbWljIERNQSBtYXBwaW5nIHN1cHBvcnQuCi0gKgotICogT24gdGhlIG92ZXJkcml2ZSwgd2UgY2FuIG9ubHkgRE1BIGZyb20gbWVtb3J5IGJlaGluZCB0aGUgUENJIGJ1cyEKLSAqIHRoaXMgbWVhbnMgdGhhdCBhbGwgRE1BJ2FibGUgbWVtb3J5IG11c3QgY29tZSBmcm9tIHRoZXJlLiAKLSAqIHRoaXMgcmVzdHJpY3Rpb24gd2lsbCBub3QgYXBwbHkgdG8gbGF0ZXIgYm9hcmRzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0KLXZvaWQgKnBjaV9hbGxvY19jb25zaXN0ZW50KHN0cnVjdCBwY2lfZGV2ICpod2Rldiwgc2l6ZV90IHNpemUsCi0JCQkgICBkbWFfYWRkcl90ICogZG1hX2hhbmRsZSkKLXsKLQl2b2lkICpyZXQ7Ci0JaW50IGdmcCA9IEdGUF9BVE9NSUM7Ci0KLSAgICAgICAgcHJpbnRrKCJCVUc6IHBjaV9hbGxvY19jb25zaXN0ZW50KCkgY2FsbGVkIC0gbm90IHlldCBzdXBwb3J0ZWRcbiIpOwotCS8qIFdlIEFMV0FZUyBuZWVkIERNQSBtZW1vcnkgb24gdGhlIG92ZXJkcml2ZSBoYXJkd2FyZSwKLQkgKiBkdWUgdG8gaXQncyBleHRyZW1lIHdlaXJkbmVzcwotCSAqIE5lZWQgdG8gZmx1c2ggdGhlIGNhY2hlIGhlcmUgYXMgd2VsbCwgc2luY2UgdGhlIG1lbW9yeQotCSAqIGNhbiBzdGlsbCBiZSBzZWVuIHRocm91Z2ggdGhlIGNhY2hlIQotCSAqLwotCWdmcCB8PSBHRlBfRE1BOwotCXJldCA9ICh2b2lkICopIF9fZ2V0X2ZyZWVfcGFnZXMoZ2ZwLCBnZXRfb3JkZXIoc2l6ZSkpOwotCi0JaWYgKHJldCAhPSBOVUxMKSB7Ci0JCW1lbXNldChyZXQsIDAsIHNpemUpOwotCQkqZG1hX2hhbmRsZSA9IHZpcnRfdG9fYnVzKHJldCk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgcGNpX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3QgcGNpX2RldiAqaHdkZXYsIHNpemVfdCBzaXplLAotCQkJIHZvaWQgKnZhZGRyLCBkbWFfYWRkcl90IGRtYV9oYW5kbGUpCi17Ci0JZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdmFkZHIsIGdldF9vcmRlcihzaXplKSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9vdmVyZHJpdmUvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL292ZXJkcml2ZS9zZXR1cC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2E3NzQ0Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL292ZXJkcml2ZS9zZXR1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIGFyY2gvc2gvb3ZlcmRyaXZlL3NldHVwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3R1YXJ0IE1lbmVmeSAoc3R1YXJ0Lm1lbmVmeUBzdC5jb20pCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIFNUTWljcm9lbGVjdHJvbmljcyBPdmVyZHJpdmUgU3VwcG9ydC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaW5jbHVkZSA8YXNtL292ZXJkcml2ZS9vdmVyZHJpdmUuaD4KLSNpbmNsdWRlIDxhc20vb3ZlcmRyaXZlL2ZwZ2EuaD4KLQotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICJTSDc3NTAgT3ZlcmRyaXZlIjsKLX0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIGJvYXJkCi0gKi8KLWludCBfX2luaXQgcGxhdGZvcm1fc2V0dXAodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfUENJCi0JaW5pdF9vdmVyZHJpdmVfZnBnYSgpOwotCWdhbGlsZW9faW5pdCgpOwotI2VuZGlmCi0KLSAgICAgICAgLyogRW5hYmxlIFJTMjMyIHJlY2VpdmUgYnVmZmVycyAqLwotCXdyaXRlbCgweDFlLCBPVkVSRFJJVkVfQ1RSTCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2Vkb3NrNzcwNS9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvZWRvc2s3NzA1L01ha2VmaWxlCmluZGV4IDdmY2NiZjIuLjE0YmRkNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvZWRvc2s3NzA1L01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvZWRvc2s3NzA1L01ha2VmaWxlCkBAIC0xLDEwICsxLDYgQEAKICMKICMgTWFrZWZpbGUgZm9yIHRoZSBFRE9TSzc3MDUgc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbAogIwotIyBOb3RlISBEZXBlbmRlbmNpZXMgYXJlIGRvbmUgYXV0b21hZ2ljYWxseSBieSAnbWFrZSBkZXAnLCB3aGljaCBhbHNvCi0jIHJlbW92ZXMgYW55IG9sZCBkZXBlbmRlbmNpZXMuIERPTidUIHB1dCB5b3VyIG93biBkZXBlbmRlbmNpZXMgaGVyZQotIyB1bmxlc3MgaXQncyBzb21ldGhpbmcgc3BlY2lhbCAoaWUgbm90IGEgLmMgZmlsZSkuCi0jCiAKIG9iai15CSA6PSBzZXR1cC5vIGlvLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9lZG9zazc3MDUvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvZWRvc2s3NzA1L3NldHVwLmMKaW5kZXggYmExNDNmYS4uZWM1YmUwMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9lZG9zazc3MDUvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2Vkb3NrNzcwNS9zZXR1cC5jCkBAIC04LDE5ICs4LDIxIEBACiAgKiBNb2RpZmllZCBmb3IgZWRvc2s3NzA1IGRldmVsb3BtZW50CiAgKiBib2FyZCBieSBTLiBEdW5uLCAyMDAzLgogICovCi0KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlY19pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL2Vkb3NrNzcwNS9pby5oPgogCi1zdGF0aWMgdm9pZCBpbml0X2Vkb3NrNzcwNSh2b2lkKTsKK3N0YXRpYyB2b2lkIF9faW5pdCBzaF9lZG9zazc3MDVfaW5pdF9pcnEodm9pZCkKK3sKKwkvKiBUaGlzIGlzIHRoZSBFdGhlcm5ldCBpbnRlcnJ1cHQgKi8KKwltYWtlX2ltYXNrX2lycSgweDA5KTsKK30KIAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi0KIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9lZG9zazc3MDUgX19pbml0bXYgPSB7CisJLm12X25hbWUJCT0gIkVET1NLNzcwNSIsCiAJLm12X25yX2lycXMJCT0gODAsCiAKIAkubXZfaW5iCQkJPSBzaF9lZG9zazc3MDVfaW5iLApAQCAtMzcsMjMgKzM5LDYgQEAKIAkubXZfb3V0c2wJCT0gc2hfZWRvc2s3NzA1X291dHNsLAogCiAJLm12X2lzYV9wb3J0MmFkZHIJPSBzaF9lZG9zazc3MDVfaXNhX3BvcnQyYWRkciwKLQkubXZfaW5pdF9pcnEJCT0gaW5pdF9lZG9zazc3MDUsCisJLm12X2luaXRfaXJxCQk9IHNoX2Vkb3NrNzcwNV9pbml0X2lycSwKIH07CiBBTElBU19NVihlZG9zazc3MDUpCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2Vkb3NrNzcwNSh2b2lkKQotewotCS8qIFRoaXMgaXMgdGhlIEV0aGVybmV0IGludGVycnVwdCAqLwotCW1ha2VfaW1hc2tfaXJxKDB4MDkpOwotfQotCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKLXsKLQlyZXR1cm4gIkVET1NLNzcwNSI7Ci19Ci0KLXZvaWQgX19pbml0IHBsYXRmb3JtX3NldHVwKHZvaWQpCi17Ci0JLyogTm90aGluZyAuLiAqLwotfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL0tjb25maWcgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc0M2JlNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvS2NvbmZpZwpAQCAtMCwwICsxLDEyIEBACitpZiBTSF9IUzc3NTFSVk9JUAorCittZW51ICJIUzc3NTFSVm9JUCBvcHRpb25zIgorCitjb25maWcgSFM3NzUxUlZPSVBfQ09ERUMKKwlib29sICJTdXBwb3J0IFZvSVAgQ29kZWMgc2VjdGlvbiIKKwloZWxwCisJICBTZWxlY3RpbmcgdGhpcyBvcHRpb24gd2lsbCBzdXBwb3J0IENPREVDIHNlY3Rpb24uCisKK2VuZG1lbnUKKworZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL01ha2VmaWxlCmluZGV4IGU4YjQxMDkuLmU2MjYzNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9NYWtlZmlsZQpAQCAtMSwxMiArMSw4IEBACiAjCiAjIE1ha2VmaWxlIGZvciB0aGUgSFM3NzUxUlZvSVAgc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbAogIwotIyBOb3RlISBEZXBlbmRlbmNpZXMgYXJlIGRvbmUgYXV0b21hZ2ljYWxseSBieSAnbWFrZSBkZXAnLCB3aGljaCBhbHNvCi0jIHJlbW92ZXMgYW55IG9sZCBkZXBlbmRlbmNpZXMuIERPTidUIHB1dCB5b3VyIG93biBkZXBlbmRlbmNpZXMgaGVyZQotIyB1bmxlc3MgaXQncyBzb21ldGhpbmcgc3BlY2lhbCAoaWUgbm90IGEgLmMgZmlsZSkuCi0jCiAKLW9iai15CSA6PSBtYWNoLm8gc2V0dXAubyBpby5vIGlycS5vIGxlZC5vCitvYmoteQkgOj0gc2V0dXAubyBpby5vIGlycS5vCiAKIG9iai0kKENPTkZJR19QQ0kpICs9IHBjaS5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvaW8uYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvaW8uYwppbmRleCAzYTFhYmZhLi45ZWExMTM2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL2lvLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9pby5jCkBAIC0xMCwyMSArMTAsMTYgQEAKICAqIHBsYWNlaG9sZGVyIGNvZGUgZnJvbSBpb19oczc3NTFydm9pcC5jIGxlZnQgaW4gd2l0aCB0aGUKICAqIGV4cGVjdGF0aW9uIG9mIGxhdGVyIFN1cGVySU8gYW5kIFBDTUNJQSBhY2Nlc3MuCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2hzNzc1MXJ2b2lwL2hzNzc1MXJ2b2lwLmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSAiLi4vLi4vLi4vZHJpdmVycy9wY2kvcGNpLXNoNzc1MS5oIgotCi1leHRlcm4gdm9pZCAqYXJlYTVfaW84X2Jhc2U7CS8qIEFyZWEgNSA4Yml0IEkvTyBCYXNlIGFkZHJlc3MgKi8KIGV4dGVybiB2b2lkICphcmVhNl9pbzhfYmFzZTsJLyogQXJlYSA2IDhiaXQgSS9PIEJhc2UgYWRkcmVzcyAqLwogZXh0ZXJuIHZvaWQgKmFyZWE1X2lvMTZfYmFzZTsJLyogQXJlYSA1IDE2Yml0IEkvTyBCYXNlIGFkZHJlc3MgKi8KLWV4dGVybiB2b2lkICphcmVhNl9pbzE2X2Jhc2U7CS8qIEFyZWEgNiAxNmJpdCBJL08gQmFzZSBhZGRyZXNzICovCiAKIC8qCiAgKiBUaGUgNzc1MVIgSFM3NzUxUlZvSVAgdXNlcyB0aGUgYnVpbHQtaW4gUENJIGNvbnRyb2xsZXIgKFBDSUMpCkBAIC0zMywyNSArMjgsOCBAQAogICogbGlrZSB0aGUgb3RoZXIgU29sdXRpb24gRW5naW5lIGJvYXJkcy4KICAqLwogCi0jZGVmaW5lIFBDSUlPQlIJCSh2b2xhdGlsZSBsb25nICopUENJX1JFRyhTSDc3NTFfUENJSU9CUikKLSNkZWZpbmUgUENJTUJSICAgICAgICAgICh2b2xhdGlsZSBsb25nICopUENJX1JFRyhTSDc3NTFfUENJTUJSKQotI2RlZmluZSBQQ0lfSU9fQVJFQQlTSDc3NTFfUENJX0lPX0JBU0UKLSNkZWZpbmUgUENJX01FTV9BUkVBCVNINzc1MV9QQ0lfQ09ORklHX0JBU0UKLQotI2RlZmluZSBQQ0lfSU9NQVAoYWRyKQkoUENJX0lPX0FSRUEgKyAoYWRyICYgflNINzc1MV9QQ0lJT0JSX01BU0spKQotCi0jaWYgZGVmaW5lZChDT05GSUdfSFM3NzUxUlZPSVBfQ09ERUMpCiAjZGVmaW5lIENPREVDX0lPX0JBU0UJMHgxMDAwCi0jZW5kaWYKLQotI2RlZmluZSBtYXliZWJhZGlvKG5hbWUscG9ydCkgXAotICBwcmludGsoImJhZCBQQy1saWtlIGlvICVzIGZvciBwb3J0IDB4JWx4IGF0IDB4JTA4eFxuIiwgXAotCSAjbmFtZSwgKHBvcnQpLCAoX191MzIpIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSkKLQotc3RhdGljIGlubGluZSB2b2lkIGRlbGF5KHZvaWQpCi17Ci0JY3RybF9pbncoMHhhMDAwMDAwMCk7Ci19CisjZGVmaW5lIENPREVDX0lPTUFQKGEpCSgodW5zaWduZWQgbG9uZylhcmVhNl9pbzhfYmFzZSArICgoYSkgLSBDT0RFQ19JT19CQVNFKSkKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBvcnQyYWRyKHVuc2lnbmVkIGludCBwb3J0KQogewpAQCAtNTksOSArMzcsMTAgQEAKIAkJaWYgKHBvcnQgPT0gMHgzZjYpCiAJCQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKWFyZWE1X2lvMTZfYmFzZSArIDB4MGMpOwogCQllbHNlCi0JCQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKWFyZWE1X2lvMTZfYmFzZSArIDB4ODAwICsgKChwb3J0LTB4MWYwKSA8PCAxKSk7CisJCQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKWFyZWE1X2lvMTZfYmFzZSArIDB4ODAwICsKKwkJCQkoKHBvcnQtMHgxZjApIDw8IDEpKTsKIAllbHNlCi0JCW1heWJlYmFkaW8ocG9ydDJhZHIsICh1bnNpZ25lZCBsb25nKXBvcnQpOworCQltYXliZWJhZGlvKCh1bnNpZ25lZCBsb25nKXBvcnQpOwogCXJldHVybiBwb3J0OwogfQogCkBAIC03OCwyNSArNTcsMTAgQEAKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0hTNzc1MVJWT0lQX0NPREVDKQotc3RhdGljIGlubGluZSBpbnQKLWNvZGVjX3BvcnQodW5zaWduZWQgbG9uZyBwb3J0KQotewotCWlmIChDT0RFQ19JT19CQVNFIDw9IHBvcnQgJiYgcG9ydCA8IChDT0RFQ19JT19CQVNFKzB4MjApKQotCQlyZXR1cm4gMTsKLQllbHNlCi0JCXJldHVybiAwOwotfQotI2VuZGlmCi0KLS8qIEluIGNhc2Ugc29tZW9uZSBjb25maWd1cmVzIHRoZSBrZXJuZWwgdy9vIFBDSSBzdXBwb3J0OiBpbiB0aGF0ICovCi0vKiBzY2VuYXJpbywgZG9uJ3QgZXZlciBib3RoZXIgdG8gY2hlY2sgZm9yIFBDSS13aW5kb3cgYWRkcmVzc2VzICovCi0KLS8qIE5PVEU6IFdJTkRPVyBDSEVDSyBNQVkgQkUgQSBCSVQgT0ZGLCBISUdIIFBDSUJJT1NfTUlOX0lPIFdSQVBTPyAqLwotI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKLSNkZWZpbmUgQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpIFwKLSAgKChwb3J0ID49IFBDSUJJT1NfTUlOX0lPKSAmJiAocG9ydCA8IChQQ0lCSU9TX01JTl9JTyArIFNINzc1MV9QQ0lfSU9fU0laRSkpKQorI2RlZmluZSBjb2RlY19wb3J0KHBvcnQpCVwKKwkoKENPREVDX0lPX0JBU0UgPD0gKHBvcnQpKSAmJiAoKHBvcnQpIDwgKENPREVDX0lPX0JBU0UgKyAweDIwKSkpCiAjZWxzZQotI2RlZmluZSBDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgKDApCisjZGVmaW5lIGNvZGVjX3BvcnQocG9ydCkJKDApCiAjZW5kaWYKIAogLyoKQEAgLTEwOSwxNSArNzMsMTMgQEAKIHVuc2lnbmVkIGNoYXIgaHM3NzUxcnZvaXBfaW5iKHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAlpZiAoUFhTRUcocG9ydCkpCi0JCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0OwotI2lmIGRlZmluZWQoQ09ORklHX0hTNzc1MVJWT0lQX0NPREVDKQorCQlyZXR1cm4gY3RybF9pbmIocG9ydCk7CiAJZWxzZSBpZiAoY29kZWNfcG9ydChwb3J0KSkKLQkJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSgodW5zaWduZWQgbG9uZylhcmVhNl9pbzhfYmFzZSsocG9ydC1DT0RFQ19JT19CQVNFKSk7Ci0jZW5kaWYKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQotCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopUENJX0lPTUFQKHBvcnQpOworCQlyZXR1cm4gY3RybF9pbmIoQ09ERUNfSU9NQVAocG9ydCkpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCQlyZXR1cm4gY3RybF9pbmIocGNpX2lvYWRkcihwb3J0KSk7CiAJZWxzZQotCQlyZXR1cm4gKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0MmFkcihwb3J0KSAmIDB4ZmYpOworCQlyZXR1cm4gY3RybF9pbncocG9ydDJhZHIocG9ydCkpICYgMHhmZjsKIH0KIAogdW5zaWduZWQgY2hhciBoczc3NTFydm9pcF9pbmJfcCh1bnNpZ25lZCBsb25nIHBvcnQpCkBAIC0xMjUsMzggKzg3LDM2IEBACiAJdW5zaWduZWQgY2hhciB2OwogCiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKLSAgICAgICAgICAgICAgICB2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydDsKLSNpZiBkZWZpbmVkKENPTkZJR19IUzc3NTFSVk9JUF9DT0RFQykKKwkJdiA9IGN0cmxfaW5iKHBvcnQpOwogCWVsc2UgaWYgKGNvZGVjX3BvcnQocG9ydCkpCi0JCXYgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpYXJlYTZfaW84X2Jhc2UrKHBvcnQtQ09ERUNfSU9fQkFTRSkpOwotI2VuZGlmCi0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLSAgICAgICAgICAgICAgICB2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopUENJX0lPTUFQKHBvcnQpOworCQl2ID0gY3RybF9pbmIoQ09ERUNfSU9NQVAocG9ydCkpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCQl2ID0gY3RybF9pbmIocGNpX2lvYWRkcihwb3J0KSk7CiAJZWxzZQotCQl2ID0gKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0MmFkcihwb3J0KSAmIDB4ZmYpOwotCWRlbGF5KCk7CisJCXYgPSBjdHJsX2ludyhwb3J0MmFkcihwb3J0KSkgJiAweGZmOworCWN0cmxfZGVsYXkoKTsKIAlyZXR1cm4gdjsKIH0KIAogdW5zaWduZWQgc2hvcnQgaHM3NzUxcnZvaXBfaW53KHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQotICAgICAgICAgICAgICAgIHJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDsKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQotICAgICAgICAgICAgICAgIHJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopUENJX0lPTUFQKHBvcnQpOworCQlyZXR1cm4gY3RybF9pbncocG9ydCk7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCisJCXJldHVybiBjdHJsX2ludyhwY2lfaW9hZGRyKHBvcnQpKTsKIAllbHNlCi0JCW1heWJlYmFkaW8oaW53LCBwb3J0KTsKKwkJbWF5YmViYWRpbyhwb3J0KTsKIAlyZXR1cm4gMDsKIH0KIAogdW5zaWduZWQgaW50IGhzNzc1MXJ2b2lwX2lubCh1bnNpZ25lZCBsb25nIHBvcnQpCiB7CiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopcG9ydDsKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQotICAgICAgICAgICAgICAgIHJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilQQ0lfSU9NQVAocG9ydCk7CisJCXJldHVybiBjdHJsX2lubChwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKKwkJcmV0dXJuIGN0cmxfaW5sKHBjaV9pb2FkZHIocG9ydCkpOwogCWVsc2UKLQkJbWF5YmViYWRpbyhpbmwsIHBvcnQpOworCQltYXliZWJhZGlvKHBvcnQpOwogCXJldHVybiAwOwogfQogCkBAIC0xNjQsMTQ2ICsxMjQsMTYwIEBACiB7CiAKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQotICAgICAgICAgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBvcnQgPSB2YWx1ZTsKLSNpZiBkZWZpbmVkKENPTkZJR19IUzc3NTFSVk9JUF9DT0RFQykKKwkJY3RybF9vdXRiKHZhbHVlLCBwb3J0KTsKIAllbHNlIGlmIChjb2RlY19wb3J0KHBvcnQpKQotCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNqYXIgKikoKHVuc2lnbmVkIGxvbmcpYXJlYTZfaW84X2Jhc2UrKHBvcnQtQ09ERUNfSU9fQkFTRSkpID0gdmFsdWU7Ci0jZW5kaWYKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQotICAgICAgICAJKih1bnNpZ25lZCBjaGFyICopUENJX0lPTUFQKHBvcnQpID0gdmFsdWU7CisJCWN0cmxfb3V0Yih2YWx1ZSwgQ09ERUNfSU9NQVAocG9ydCkpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCQljdHJsX291dGIodmFsdWUsIHBjaV9pb2FkZHIocG9ydCkpOwogCWVsc2UKLQkJKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQyYWRyKHBvcnQpID0gdmFsdWU7CisJCWN0cmxfb3V0Yih2YWx1ZSwgcG9ydDJhZHIocG9ydCkpOwogfQogCiB2b2lkIGhzNzc1MXJ2b2lwX291dGJfcCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCiB7CiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKLSAgICAgICAgICAgICAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0ID0gdmFsdWU7Ci0jaWYgZGVmaW5lZChDT05GSUdfSFM3NzUxUlZPSVBfQ09ERUMpCisJCWN0cmxfb3V0Yih2YWx1ZSwgcG9ydCk7CiAJZWxzZSBpZiAoY29kZWNfcG9ydChwb3J0KSkKLQkJKih2b2xhdGlsZSB1bnNpZ25lZCBjamFyICopKCh1bnNpZ25lZCBsb25nKWFyZWE2X2lvOF9iYXNlKyhwb3J0LUNPREVDX0lPX0JBU0UpKSA9IHZhbHVlOwotI2VuZGlmCi0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLSAgICAgICAgCSoodW5zaWduZWQgY2hhciAqKVBDSV9JT01BUChwb3J0KSA9IHZhbHVlOworCQljdHJsX291dGIodmFsdWUsIENPREVDX0lPTUFQKHBvcnQpKTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKKwkJY3RybF9vdXRiKHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKIAllbHNlCi0JCSoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0MmFkcihwb3J0KSA9IHZhbHVlOwotCWRlbGF5KCk7CisJCWN0cmxfb3V0dyh2YWx1ZSwgcG9ydDJhZHIocG9ydCkpOworCisJY3RybF9kZWxheSgpOwogfQogCiB2b2lkIGhzNzc1MXJ2b2lwX291dHcodW5zaWduZWQgc2hvcnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQotICAgICAgICAgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ID0gdmFsdWU7Ci0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLSAgICAgICAgCSoodW5zaWduZWQgc2hvcnQgKilQQ0lfSU9NQVAocG9ydCkgPSB2YWx1ZTsKKwkJY3RybF9vdXR3KHZhbHVlLCBwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKKwkJY3RybF9vdXR3KHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKIAllbHNlCi0JCW1heWJlYmFkaW8ob3V0dywgcG9ydCk7CisJCW1heWJlYmFkaW8ocG9ydCk7CiB9CiAKIHZvaWQgaHM3NzUxcnZvaXBfb3V0bCh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQotICAgICAgICAgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKXBvcnQgPSB2YWx1ZTsKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQotICAgICAgICAJKigodW5zaWduZWQgbG9uZyAqKVBDSV9JT01BUChwb3J0KSkgPSB2YWx1ZTsKKwkJY3RybF9vdXRsKHZhbHVlLCBwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKKwkJY3RybF9vdXRsKHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKIAllbHNlCi0JCW1heWJlYmFkaW8ob3V0bCwgcG9ydCk7CisJCW1heWJlYmFkaW8ocG9ydCk7CiB9CiAKIHZvaWQgaHM3NzUxcnZvaXBfaW5zYih1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CisJdTggKmJ1ZiA9IGFkZHI7CisKIAlpZiAoUFhTRUcocG9ydCkpCi0JCXdoaWxlIChjb3VudC0tKSAqKCh1bnNpZ25lZCBjaGFyICopIGFkZHIpKysgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0OwotI2lmIGRlZmluZWQoQ09ORklHX0hTNzc1MVJWT0lQX0NPREVDKQorCQl3aGlsZSAoY291bnQtLSkKKwkJCSpidWYrKyA9IGN0cmxfaW5iKHBvcnQpOwogCWVsc2UgaWYgKGNvZGVjX3BvcnQocG9ydCkpCi0JCXdoaWxlIChjb3VudC0tKSAqKCh1bnNpZ25lZCBjaGFyICopIGFkZHIpKysgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpYXJlYTZfaW84X2Jhc2UrKHBvcnQtQ09ERUNfSU9fQkFTRSkpOwotI2VuZGlmCi0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkgewotCQl2b2xhdGlsZSBfX3U4ICpicCA9IChfX3U4ICopUENJX0lPTUFQKHBvcnQpOworCQl3aGlsZSAoY291bnQtLSkKKwkJCSpidWYrKyA9IGN0cmxfaW5iKENPREVDX0lPTUFQKHBvcnQpKTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkgeworCQl2b2xhdGlsZSB1OCAqYnAgPSAodm9sYXRpbGUgdTggKilwY2lfaW9hZGRyKHBvcnQpOwogCi0JCXdoaWxlIChjb3VudC0tKSAqKCh2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIGFkZHIpKysgPSAqYnA7CisJCXdoaWxlIChjb3VudC0tKQorCQkJKmJ1ZisrID0gKmJwOwogCX0gZWxzZSB7Ci0JCXZvbGF0aWxlIF9fdTE2ICpwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDJhZHIocG9ydCk7CisJCXZvbGF0aWxlIHUxNiAqcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0MmFkcihwb3J0KTsKIAotCQl3aGlsZSAoY291bnQtLSkgKigodW5zaWduZWQgY2hhciAqKSBhZGRyKSsrID0gKnAgJiAweGZmOworCQl3aGlsZSAoY291bnQtLSkKKwkJCSpidWYrKyA9ICpwICYgMHhmZjsKIAl9CiB9CiAKIHZvaWQgaHM3NzUxcnZvaXBfaW5zdyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0Jdm9sYXRpbGUgX191MTYgKnA7CisJdm9sYXRpbGUgdTE2ICpwOworCXUxNiAqYnVmID0gYWRkcjsKIAogCWlmIChQWFNFRyhwb3J0KSkKLQkJcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQ7Ci0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKVBDSV9JT01BUChwb3J0KTsKKwkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0OworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCQlwID0gKHZvbGF0aWxlIHUxNiAqKXBjaV9pb2FkZHIocG9ydCk7CiAJZWxzZQotCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDJhZHIocG9ydCk7Ci0Jd2hpbGUgKGNvdW50LS0pICooKF9fdTE2ICopIGFkZHIpKysgPSAqcDsKKwkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0MmFkcihwb3J0KTsKKwl3aGlsZSAoY291bnQtLSkKKwkJKmJ1ZisrID0gKnA7CiB9CiAKIHZvaWQgaHM3NzUxcnZvaXBfaW5zbCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JaWYgKENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpIHsKLQkJdm9sYXRpbGUgX191MzIgKnAgPSAoX191MzIgKilQQ0lfSU9NQVAocG9ydCk7CiAKLQkJd2hpbGUgKGNvdW50LS0pICooKF9fdTMyICopIGFkZHIpKysgPSAqcDsKKwlpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpIHsKKwkJdm9sYXRpbGUgdTMyICpwID0gKHZvbGF0aWxlIHUzMiAqKXBjaV9pb2FkZHIocG9ydCk7CisJCXUzMiAqYnVmID0gYWRkcjsKKworCQl3aGlsZSAoY291bnQtLSkKKwkJCSpidWYrKyA9ICpwOwogCX0gZWxzZQotCQltYXliZWJhZGlvKGluc2wsIHBvcnQpOworCQltYXliZWJhZGlvKHBvcnQpOwogfQogCiB2b2lkIGhzNzc1MXJ2b2lwX291dHNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKKwljb25zdCB1OCAqYnVmID0gYWRkcjsKKwogCWlmIChQWFNFRyhwb3J0KSkKLQkJd2hpbGUgKGNvdW50LS0pICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBvcnQgPSAqKCh1bnNpZ25lZCBjaGFyICopIGFkZHIpKys7Ci0jaWYgZGVmaW5lZChDT05GSUdfSFM3NzUxUlZPSVBfQ09ERUMpCisJCXdoaWxlIChjb3VudC0tKQorCQkJY3RybF9vdXRiKCpidWYrKywgcG9ydCk7CiAJZWxzZSBpZiAoY29kZWNfcG9ydChwb3J0KSkKLQkJd2hpbGUgKGNvdW50LS0pICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSgodW5zaWduZWQgbG9uZylhcmVhNl9pbzhfYmFzZSsocG9ydC1DT0RFQ19JT19CQVNFKSkgPSAqKCh1bnNpZ25lZCBjaGFyICopIGFkZHIpKys7Ci0jZW5kaWYKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKSB7Ci0JCXZvbGF0aWxlIF9fdTggKmJwID0gKF9fdTggKilQQ0lfSU9NQVAocG9ydCk7CisJCXdoaWxlIChjb3VudC0tKQorCQkJY3RybF9vdXRiKCpidWYrKywgQ09ERUNfSU9NQVAocG9ydCkpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKSB7CisJCXZvbGF0aWxlIHU4ICpicCA9ICh2b2xhdGlsZSB1OCAqKXBjaV9pb2FkZHIocG9ydCk7CiAKLQkJd2hpbGUgKGNvdW50LS0pICpicCA9ICooKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgYWRkcikrKzsKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkqYnAgPSAqYnVmKys7CiAJfSBlbHNlIHsKLQkJdm9sYXRpbGUgX191MTYgKnAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0MmFkcihwb3J0KTsKKwkJdm9sYXRpbGUgdTE2ICpwID0gKHZvbGF0aWxlIHUxNiAqKXBvcnQyYWRyKHBvcnQpOwogCi0JCXdoaWxlIChjb3VudC0tKSAqcCA9ICooKHVuc2lnbmVkIGNoYXIgKikgYWRkcikrKzsKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkqcCA9ICpidWYrKzsKIAl9CiB9CiAKIHZvaWQgaHM3NzUxcnZvaXBfb3V0c3codW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCXZvbGF0aWxlIF9fdTE2ICpwOworCXZvbGF0aWxlIHUxNiAqcDsKKwljb25zdCB1MTYgKmJ1ZiA9IGFkZHI7CiAKIAlpZiAoUFhTRUcocG9ydCkpCi0JCXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0OwotCWVsc2UgaWYgKENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCi0JCXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilQQ0lfSU9NQVAocG9ydCk7CisJCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKKwkJcCA9ICh2b2xhdGlsZSB1MTYgKilwY2lfaW9hZGRyKHBvcnQpOwogCWVsc2UKLQkJcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQyYWRyKHBvcnQpOwotCXdoaWxlIChjb3VudC0tKSAqcCA9ICooKF9fdTE2ICopIGFkZHIpKys7CisJCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDJhZHIocG9ydCk7CisKKwl3aGlsZSAoY291bnQtLSkKKwkJKnAgPSAqYnVmKys7CiB9CiAKIHZvaWQgaHM3NzUxcnZvaXBfb3V0c2wodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewotCWlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKSB7Ci0JCXZvbGF0aWxlIF9fdTMyICpwID0gKF9fdTMyICopUENJX0lPTUFQKHBvcnQpOworCWNvbnN0IHUzMiAqYnVmID0gYWRkcjsKIAotCQl3aGlsZSAoY291bnQtLSkgKnAgPSAqKChfX3UzMiAqKSBhZGRyKSsrOworCWlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkgeworCQl2b2xhdGlsZSB1MzIgKnAgPSAodm9sYXRpbGUgdTMyICopcGNpX2lvYWRkcihwb3J0KTsKKworCQl3aGlsZSAoY291bnQtLSkKKwkJCSpwID0gKmJ1ZisrOwogCX0gZWxzZQotCQltYXliZWJhZGlvKG91dHNsLCBwb3J0KTsKKwkJbWF5YmViYWRpbyhwb3J0KTsKIH0KIAotdm9pZCAqaHM3NzUxcnZvaXBfaW9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKQordm9pZCBfX2lvbWVtICpoczc3NTFydm9pcF9pb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IHNpemUpCiB7Ci0JaWYgKG9mZnNldCA+PSAweGZkMDAwMDAwKQotCQlyZXR1cm4gKHZvaWQgKilvZmZzZXQ7Ci0JZWxzZQotCQlyZXR1cm4gKHZvaWQgKilQMlNFR0FERFIob2Zmc2V0KTsKLX0KLUVYUE9SVF9TWU1CT0woaHM3NzUxcnZvaXBfaW9yZW1hcCk7CisgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgX19pb21lbSAqKXBvcnQ7CisJZWxzZSBpZiAodW5saWtlbHkoY29kZWNfcG9ydChwb3J0KSAmJiAoc2l6ZSA9PSAxKSkpCisJCXJldHVybiAodm9pZCBfX2lvbWVtICopQ09ERUNfSU9NQVAocG9ydCk7CisgICAgICAgIGVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICh2b2lkIF9faW9tZW0gKilwY2lfaW9hZGRyKHBvcnQpOwogCi11bnNpZ25lZCBsb25nIGhzNzc1MXJ2b2lwX2lzYV9wb3J0MmFkZHIodW5zaWduZWQgbG9uZyBvZmZzZXQpCi17Ci0JcmV0dXJuIHBvcnQyYWRyKG9mZnNldCk7CisgICAgICAgIHJldHVybiAodm9pZCBfX2lvbWVtICopcG9ydDJhZHIocG9ydCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9pcnEuYwppbmRleCA3MDViN2RkLi5jNjE3YjE4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvaXJxLmMKQEAgLTM1LDMwICszNSwyNCBAQAogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2hzNzc1MXJ2b2lwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgc2hvcnQgdmFsOwogCXVuc2lnbmVkIHNob3J0IG1hc2sgPSAweGZmZmYgXiAoMHgwMDAxIDw8IG1hc2tfcG9zW2lycV0pOwogCiAJLyogU2V0IHRoZSBwcmlvcml0eSBpbiBJUFIgdG8gMCAqLwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAl2YWwgPSBjdHJsX2ludyhJUkxDTlRSMyk7CiAJdmFsICY9IG1hc2s7CiAJY3RybF9vdXR3KHZhbCwgSVJMQ05UUjMpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgZW5hYmxlX2hzNzc1MXJ2b2lwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgc2hvcnQgdmFsOwogCXVuc2lnbmVkIHNob3J0IHZhbHVlID0gKDB4MDAwMSA8PCBtYXNrX3Bvc1tpcnFdKTsKIAogCS8qIFNldCBwcmlvcml0eSBpbiBJUFIgYmFjayB0byBvcmlnaW5hbCB2YWx1ZSAqLwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAl2YWwgPSBjdHJsX2ludyhJUkxDTlRSMyk7CiAJdmFsIHw9IHZhbHVlOwogCWN0cmxfb3V0dyh2YWwsIElSTENOVFIzKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGFja19oczc3NTFydm9pcF9pcnEodW5zaWduZWQgaW50IGlycSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvbGVkLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL2xlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjYwOGZmLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvbGVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9rZXJuZWwvc2V0dXBfaHM3NzUxcnZvaXAuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCAgS2F6dW1vdG8gS29qaW1hCi0gKgotICogUmVuZXNhcyBUZWNobm9sb2d5IFNhbGVzIEhTNzc1MVJWb0lQIFN1cHBvcnQuCi0gKgotICogTW9kaWZpZWQgZm9yIEhTNzc1MVJWb0lQIGJ5Ci0gKiBBdG9tIENyZWF0ZSBFbmdpbmVlcmluZyBDby4sIEx0ZC4gMjAwMi4KLSAqIExpbmVvIHVTb2x1dGlvbnMsIEluYy4gMjAwMy4KLSAqLwotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2hzNzc1MXJ2b2lwL2hzNzc1MXJ2b2lwLmg+Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgZGVidWdfY291bnRlcjsKLQotdm9pZCBkZWJ1Z19sZWRfZGlzcCh2b2lkKQotewotCXVuc2lnbmVkIHNob3J0IHZhbHVlOwotCi0JdmFsdWUgPSAodW5zaWduZWQgY2hhcilkZWJ1Z19jb3VudGVyKys7Ci0JY3RybF9vdXRiKCgweGYwfHZhbHVlKSwgUEFfT1VUUE9SVFIpOwotCWlmICh2YWx1ZSA9PSAweDBmKQotCQlkZWJ1Z19jb3VudGVyID0gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvbWFjaC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9tYWNoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZjk2N2YuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9tYWNoLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9rZXJuZWwvbWFjaF9oczc3NTFydm9pcC5jCi0gKgotICogTWlub3IgdHdlYWsgb2YgbWFjaF9zZS5jIGZpbGUgdG8gcmVmZXJlbmNlIGhzNzc1MXJ2b2lwLXNwZWNpZmljIGl0ZW1zLgotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBNYWNoaW5lIHZlY3RvciBmb3IgdGhlIFJlbmVzYXMgVGVjaG5vbG9neSBzYWxlcyBIUzc3NTFSVm9JUAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9ydGMuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2hzNzc1MXJ2b2lwL2lvLmg+Ci0KLWV4dGVybiB2b2lkIGluaXRfaHM3NzUxcnZvaXBfSVJRKHZvaWQpOwotZXh0ZXJuIHZvaWQgKmhzNzc1MXJ2b2lwX2lvcmVtYXAodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7Ci0KLS8qCi0gKiBUaGUgTWFjaGluZSBWZWN0b3IKLSAqLwotCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfaHM3NzUxcnZvaXAgX19pbml0bXYgPSB7Ci0JLm12X25yX2lycXMJCT0gNzIsCi0KLQkubXZfaW5iCQkJPSBoczc3NTFydm9pcF9pbmIsCi0JLm12X2ludwkJCT0gaHM3NzUxcnZvaXBfaW53LAotCS5tdl9pbmwJCQk9IGhzNzc1MXJ2b2lwX2lubCwKLQkubXZfb3V0YgkJPSBoczc3NTFydm9pcF9vdXRiLAotCS5tdl9vdXR3CQk9IGhzNzc1MXJ2b2lwX291dHcsCi0JLm12X291dGwJCT0gaHM3NzUxcnZvaXBfb3V0bCwKLQotCS5tdl9pbmJfcAkJPSBoczc3NTFydm9pcF9pbmJfcCwKLQkubXZfaW53X3AJCT0gaHM3NzUxcnZvaXBfaW53LAotCS5tdl9pbmxfcAkJPSBoczc3NTFydm9pcF9pbmwsCi0JLm12X291dGJfcAkJPSBoczc3NTFydm9pcF9vdXRiX3AsCi0JLm12X291dHdfcAkJPSBoczc3NTFydm9pcF9vdXR3LAotCS5tdl9vdXRsX3AJCT0gaHM3NzUxcnZvaXBfb3V0bCwKLQotCS5tdl9pbnNiCQk9IGhzNzc1MXJ2b2lwX2luc2IsCi0JLm12X2luc3cJCT0gaHM3NzUxcnZvaXBfaW5zdywKLQkubXZfaW5zbAkJPSBoczc3NTFydm9pcF9pbnNsLAotCS5tdl9vdXRzYgkJPSBoczc3NTFydm9pcF9vdXRzYiwKLQkubXZfb3V0c3cJCT0gaHM3NzUxcnZvaXBfb3V0c3csCi0JLm12X291dHNsCQk9IGhzNzc1MXJ2b2lwX291dHNsLAotCi0JLm12X2lvcmVtYXAJCT0gaHM3NzUxcnZvaXBfaW9yZW1hcCwKLQkubXZfaXNhX3BvcnQyYWRkcgk9IGhzNzc1MXJ2b2lwX2lzYV9wb3J0MmFkZHIsCi0JLm12X2luaXRfaXJxCQk9IGluaXRfaHM3NzUxcnZvaXBfSVJRLAotfTsKLUFMSUFTX01WKGhzNzc1MXJ2b2lwKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9oczc3NTFydm9pcC9zZXR1cC5jCmluZGV4IDI5ZmI1ZmYuLjA0MTRjMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL2hzNzc1MXJ2b2lwL3NldHVwLmMKQEAgLTEsNDQgKzEsMzggQEAKIC8qCi0gKiBsaW51eC9hcmNoL3NoL2tlcm5lbC9zZXR1cF9oczc3NTFydm9pcC5jCisgKiBSZW5lc2FzIFRlY2hub2xvZ3kgU2FsZXMgSFM3NzUxUlZvSVAgU3VwcG9ydC4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIEthenVtb3RvIEtvamltYQogICoKLSAqIFJlbmVzYXMgVGVjaG5vbG9neSBTYWxlcyBIUzc3NTFSVm9JUCBTdXBwb3J0LgotICoKICAqIE1vZGlmaWVkIGZvciBIUzc3NTFSVm9JUCBieQogICogQXRvbSBDcmVhdGUgRW5naW5lZXJpbmcgQ28uLCBMdGQuIDIwMDIuCiAgKiBMaW5lbyB1U29sdXRpb25zLCBJbmMuIDIwMDMuCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+Ci0jaW5jbHVkZSA8bGludXgvaWRlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2hzNzc1MXJ2b2lwL2hzNzc1MXJ2b2lwLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2hzNzc1MXJ2b2lwL2hzNzc1MXJ2b2lwLmg+CisjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KKyNpbmNsdWRlIDxhc20vcnRjLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgogCi0vKiBkZWZpbmVkIGluIG1tL2lvcmVtYXAuYyAqLwotZXh0ZXJuIHZvaWQgKiBwM19pb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotCi11bnNpZ25lZCBpbnQgZGVidWdfY291bnRlcjsKLQotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgaHM3NzUxcnZvaXBfaW5pdF9pcnEodm9pZCkKIHsKLQlyZXR1cm4gIkhTNzc1MVJWb0lQIjsKKyNpZiBkZWZpbmVkKENPTkZJR19IUzc3NTFSVk9JUF9DT0RFQykKKwltYWtlX2lwcl9pcnEoRE1URTBfSVJRLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShETVRFMV9JUlEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSk7CisjZW5kaWYKKworCWluaXRfaHM3NzUxcnZvaXBfSVJRKCk7CiB9CiAKLS8qCi0gKiBJbml0aWFsaXplIHRoZSBib2FyZAotICovCi12b2lkIF9faW5pdCBwbGF0Zm9ybV9zZXR1cCh2b2lkKQorc3RhdGljIHZvaWQgaHM3NzUxcnZvaXBfcG93ZXJfb2ZmKHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiUmVuZXNhcyBUZWNobm9sb2d5IFNhbGVzIEhTNzc1MVJWb0lQLTIgc3VwcG9ydC5cbiIpOwotCWN0cmxfb3V0YigweGYwLCBQQV9PVVRQT1JUUik7Ci0JZGVidWdfY291bnRlciA9IDA7CisJY3RybF9vdXR3KGN0cmxfaW53KFBBX09VVFBPUlRSKSAmIDB4ZmZkZiwgUEFfT1VUUE9SVFIpOwogfQogCiB2b2lkICphcmVhNV9pbzhfYmFzZTsKQEAgLTQ2LDE2ICs0MCwxNSBAQAogdm9pZCAqYXJlYTVfaW8xNl9iYXNlOwogdm9pZCAqYXJlYTZfaW8xNl9iYXNlOwogCi1pbnQgX19pbml0IGNmX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGhzNzc1MXJ2b2lwX2NmX2luaXQodm9pZCkKIHsKIAlwZ3Byb3RfdCBwcm90OwotCXVuc2lnbmVkIGxvbmcgcGFkZHJiYXNlLCBwc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHBhZGRyYmFzZTsKIAogCS8qIG9wZW4gSS9PIGFyZWEgd2luZG93ICovCiAJcGFkZHJiYXNlID0gdmlydF90b19waHlzKCh2b2lkICopKFBBX0FSRUE1X0lPKzB4MDAwMDA4MDApKTsKLQlwc2l6ZSA9IFBBR0VfU0laRTsKIAlwcm90ID0gUEFHRV9LRVJORUxfUENDKDEsIF9QQUdFX1BDQ19DT00xNik7Ci0JYXJlYTVfaW8xNl9iYXNlID0gcDNfaW9yZW1hcChwYWRkcmJhc2UsIHBzaXplLCBwcm90LnBncHJvdCk7CisJYXJlYTVfaW8xNl9iYXNlID0gcDNfaW9yZW1hcChwYWRkcmJhc2UsIFBBR0VfU0laRSwgcHJvdC5wZ3Byb3QpOwogCWlmICghYXJlYTVfaW8xNl9iYXNlKSB7CiAJCXByaW50aygiYWxsb2NhdGVfY2ZfYXJlYSA6IGNhbid0IG9wZW4gQ0YgSS9PIHdpbmRvdyFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTY0LDE5ICs1NywxOCBAQAogCS8qIFhYWCA6IGRvIHdlIG5lZWQgYXR0cmlidXRlIGFuZCBjb21tb24tbWVtb3J5IGFyZWEgYWxzbz8gKi8KIAogCXBhZGRyYmFzZSA9IHZpcnRfdG9fcGh5cygodm9pZCAqKVBBX0FSRUE2X0lPKTsKLQlwc2l6ZSA9IFBBR0VfU0laRTsKICNpZiBkZWZpbmVkKENPTkZJR19IUzc3NTFSVk9JUF9DT0RFQykKIAlwcm90ID0gUEFHRV9LRVJORUxfUENDKDAsIF9QQUdFX1BDQ19DT004KTsKICNlbHNlCiAJcHJvdCA9IFBBR0VfS0VSTkVMX1BDQygwLCBfUEFHRV9QQ0NfSU84KTsKICNlbmRpZgotCWFyZWE2X2lvOF9iYXNlID0gcDNfaW9yZW1hcChwYWRkcmJhc2UsIHBzaXplLCBwcm90LnBncHJvdCk7CisJYXJlYTZfaW84X2Jhc2UgPSBwM19pb3JlbWFwKHBhZGRyYmFzZSwgUEFHRV9TSVpFLCBwcm90LnBncHJvdCk7CiAJaWYgKCFhcmVhNl9pbzhfYmFzZSkgewogCQlwcmludGsoImFsbG9jYXRlX2NmX2FyZWEgOiBjYW4ndCBvcGVuIENPREVDIEkvTyA4Yml0IHdpbmRvdyFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJcHJvdCA9IFBBR0VfS0VSTkVMX1BDQygwLCBfUEFHRV9QQ0NfSU8xNik7Ci0JYXJlYTZfaW8xNl9iYXNlID0gcDNfaW9yZW1hcChwYWRkcmJhc2UsIHBzaXplLCBwcm90LnBncHJvdCk7CisJYXJlYTZfaW8xNl9iYXNlID0gcDNfaW9yZW1hcChwYWRkcmJhc2UsIFBBR0VfU0laRSwgcHJvdC5wZ3Byb3QpOwogCWlmICghYXJlYTZfaW8xNl9iYXNlKSB7CiAJCXByaW50aygiYWxsb2NhdGVfY2ZfYXJlYSA6IGNhbid0IG9wZW4gQ09ERUMgSS9PIDE2Yml0IHdpbmRvdyFcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTg1LDQgKzc3LDQ2IEBACiAJcmV0dXJuIDA7CiB9CiAKLV9faW5pdGNhbGwgKGNmX2luaXQpOworLyoKKyAqIEluaXRpYWxpemUgdGhlIGJvYXJkCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBoczc3NTFydm9pcF9zZXR1cChjaGFyICoqY21kbGluZV9wKQoreworCWRldmljZV9pbml0Y2FsbChoczc3NTFydm9pcF9jZl9pbml0KTsKKworCWN0cmxfb3V0YigweGYwLCBQQV9PVVRQT1JUUik7CisJcG1fcG93ZXJfb2ZmID0gaHM3NzUxcnZvaXBfcG93ZXJfb2ZmOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUmVuZXNhcyBUZWNobm9sb2d5IFNhbGVzIEhTNzc1MVJWb0lQLTIgc3VwcG9ydC5cbiIpOworfQorCitzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfaHM3NzUxcnZvaXAgX19pbml0bXYgPSB7CisJLm12X25hbWUJCT0gIkhTNzc1MVJWb0lQIiwKKwkubXZfc2V0dXAJCT0gaHM3NzUxcnZvaXBfc2V0dXAsCisJLm12X25yX2lycXMJCT0gNzIsCisKKwkubXZfaW5iCQkJPSBoczc3NTFydm9pcF9pbmIsCisJLm12X2ludwkJCT0gaHM3NzUxcnZvaXBfaW53LAorCS5tdl9pbmwJCQk9IGhzNzc1MXJ2b2lwX2lubCwKKwkubXZfb3V0YgkJPSBoczc3NTFydm9pcF9vdXRiLAorCS5tdl9vdXR3CQk9IGhzNzc1MXJ2b2lwX291dHcsCisJLm12X291dGwJCT0gaHM3NzUxcnZvaXBfb3V0bCwKKworCS5tdl9pbmJfcAkJPSBoczc3NTFydm9pcF9pbmJfcCwKKwkubXZfaW53X3AJCT0gaHM3NzUxcnZvaXBfaW53LAorCS5tdl9pbmxfcAkJPSBoczc3NTFydm9pcF9pbmwsCisJLm12X291dGJfcAkJPSBoczc3NTFydm9pcF9vdXRiX3AsCisJLm12X291dHdfcAkJPSBoczc3NTFydm9pcF9vdXR3LAorCS5tdl9vdXRsX3AJCT0gaHM3NzUxcnZvaXBfb3V0bCwKKworCS5tdl9pbnNiCQk9IGhzNzc1MXJ2b2lwX2luc2IsCisJLm12X2luc3cJCT0gaHM3NzUxcnZvaXBfaW5zdywKKwkubXZfaW5zbAkJPSBoczc3NTFydm9pcF9pbnNsLAorCS5tdl9vdXRzYgkJPSBoczc3NTFydm9pcF9vdXRzYiwKKwkubXZfb3V0c3cJCT0gaHM3NzUxcnZvaXBfb3V0c3csCisJLm12X291dHNsCQk9IGhzNzc1MXJ2b2lwX291dHNsLAorCisJLm12X2luaXRfaXJxCQk9IGhzNzc1MXJ2b2lwX2luaXRfaXJxLAorCS5tdl9pb3BvcnRfbWFwCQk9IGhzNzc1MXJ2b2lwX2lvcG9ydF9tYXAsCit9OworQUxJQVNfTVYoaHM3NzUxcnZvaXApCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvS2NvbmZpZyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNmQ5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvS2NvbmZpZwpAQCAtMCwwICsxLDE0IEBACitpZiBTSF9SNzc4MFJQCisKK21lbnUgIlI3NzgwUlAgb3B0aW9ucyIKKworY29uZmlnIFNIX1I3NzgwTVAKKwlib29sICJSNzc4ME1QIGJvYXJkIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2VsZWN0aW5nIHRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBtYXNzLXByb2R1Y3Rpb24KKwkgIHZlcnNpb24gb2YgdGhlIFI3NzgwUlAuIElmIGluIGRvdWJ0LCBzYXkgWS4KKworZW5kbWVudQorCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNzc2ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgUjc3ODBSUC0xIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwKKyMKKworb2JqLXkJIDo9IHNldHVwLm8gaW8ubyBpcnEubworb2JqLSQoQ09ORklHX0hFQVJUQkVBVCkJKz0gbGVkLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9pby5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5MmQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9pby5jCkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxICBJYW4gZGEgU2lsdmEsIEplcmVteSBTaWVnZWwKKyAqIEJhc2VkIGxhcmdlbHkgb24gaW9fc2UuYy4KKyAqCisgKiBJL08gcm91dGluZSBmb3IgUmVuZXNhcyBTb2x1dGlvbnMgSGlnaGxhbmRlciBSNzc4MFJQLTEKKyAqCisgKiBJbml0aWFsIHZlcnNpb24gb25seSB0byBzdXBwb3J0IExBTiBhY2Nlc3M7IHNvbWUKKyAqIHBsYWNlaG9sZGVyIGNvZGUgZnJvbSBpb19yNzc4MHJwLmMgbGVmdCBpbiB3aXRoIHRoZQorICogZXhwZWN0YXRpb24gb2YgbGF0ZXIgU3VwZXJJTyBhbmQgUENNQ0lBIGFjY2Vzcy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3I3NzgwcnAvcjc3ODBycC5oPgorI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBvcnQyYWRyKHVuc2lnbmVkIGludCBwb3J0KQoreworCWlmICgoMHgxZjAgPD0gcG9ydCAmJiBwb3J0IDwgMHgxZjgpIHx8IHBvcnQgPT0gMHgzZjYpCisJCWlmIChwb3J0ID09IDB4M2Y2KQorCQkJcmV0dXJuIChQQV9BUkVBNV9JTyArIDB4ODBjKTsKKwkJZWxzZQorCQkJcmV0dXJuIChQQV9BUkVBNV9JTyArIDB4MTAwMCArICgocG9ydC0weDFmMCkgPDwgMSkpOworCWVsc2UKKwkJbWF5YmViYWRpbygodW5zaWduZWQgbG9uZylwb3J0KTsKKworCXJldHVybiBwb3J0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcG9ydDg4Nzk2bCh1bnNpZ25lZCBpbnQgcG9ydCwgaW50IGZsYWcpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJaWYgKGZsYWcpCisJCWFkZHIgPSBQQV9BWDg4Nzk2TCArICgocG9ydCAtIEFYODg3OTZMX0lPX0JBU0UpIDw8IDEpOworCWVsc2UKKwkJYWRkciA9IFBBX0FYODg3OTZMICsgKChwb3J0IC0gQVg4ODc5NkxfSU9fQkFTRSkgPDwgMSkgKyAweDEwMDA7CisKKwlyZXR1cm4gYWRkcjsKK30KKworLyogVGhlIDc3ODAgUjc3ODBSUC0xIHNlZW1zIHRvIGhhdmUgZXZlcnl0aGluZyBob29rZWQgKi8KKy8qIHVwIHByZXR0eSBub3JtYWxseSAobm90aGluZyBvbiBoaWdoLWJ5dGVzIG9ubHkuLi4pIHNvIHRoaXMgKi8KKy8qIHNob3VsZG4ndCBiZSBuZWVkZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNoaWZ0ZWRfcG9ydCh1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJLyogRm9yIElERSByZWdpc3RlcnMsIHZhbHVlIGlzIG5vdCBzaGlmdGVkICovCisJaWYgKCgweDFmMCA8PSBwb3J0ICYmIHBvcnQgPCAweDFmOCkgfHwgcG9ydCA9PSAweDNmNikKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX05FMjAwMCkgfHwgZGVmaW5lZChDT05GSUdfTkUyMDAwX01PRFVMRSkKKyNkZWZpbmUgQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSBcCisgICgocG9ydCA+PSBBWDg4Nzk2TF9JT19CQVNFKSAmJiAocG9ydCA8IChBWDg4Nzk2TF9JT19CQVNFKzB4MjApKSkKKyNlbHNlCisjZGVmaW5lIENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkgKDApCisjZW5kaWYKKworLyoKKyAqIEdlbmVyYWwgb3V0bGluZTogcmVtYXAgcmVhbGx5IGxvdyBzdHVmZiBbZXZlbnR1YWxseV0gdG8gU3VwZXJJTywKKyAqIHN0dWZmIGluIFBDSSBJTyBzcGFjZSAoYXQgb3IgYWJvdmUgd2luZG93IGF0IHBjaS5oOlBDSUJJT1NfTUlOX0lPKQorICogaXMgbWFwcGVkIHRocm91Z2ggdGhlIFBDSSBJTyB3aW5kb3cuICBTdHVmZiB3aXRoIGhpZ2ggYml0cyAoUFhTRUcpCisgKiBzaG91bGQgYmUgd2F5IGJleW9uZCB0aGUgd2luZG93LCBhbmQgaXMgdXNlZCAgdy9vIHRyYW5zbGF0aW9uIGZvcgorICogY29tcGF0aWJpbGl0eS4KKyAqLwordTggcjc3ODBycF9pbmIodW5zaWduZWQgbG9uZyBwb3J0KQoreworCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQorCQlyZXR1cm4gY3RybF9pbncocG9ydDg4Nzk2bChwb3J0LCAwKSkgJiAweGZmOworCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQorCQlyZXR1cm4gY3RybF9pbmIocG9ydCk7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCisJCXJldHVybiBjdHJsX2luYihwY2lfaW9hZGRyKHBvcnQpKTsKKworCXJldHVybiBjdHJsX2ludyhwb3J0MmFkcihwb3J0KSkgJiAweGZmOworfQorCit1OCByNzc4MHJwX2luYl9wKHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwl1OCB2OworCisJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCisJCXYgPSBjdHJsX2ludyhwb3J0ODg3OTZsKHBvcnQsIDApKSAmIDB4ZmY7CisJZWxzZSBpZiAoUFhTRUcocG9ydCkpCisJCXYgPSBjdHJsX2luYihwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKKwkJdiA9IGN0cmxfaW5iKHBjaV9pb2FkZHIocG9ydCkpOworCWVsc2UKKwkJdiA9IGN0cmxfaW53KHBvcnQyYWRyKHBvcnQpKSAmIDB4ZmY7CisKKwljdHJsX2RlbGF5KCk7CisKKwlyZXR1cm4gdjsKK30KKwordTE2IHI3NzgwcnBfaW53KHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKKwkJbWF5YmViYWRpbyhwb3J0KTsKKwllbHNlIGlmIChQWFNFRyhwb3J0KSkKKwkJcmV0dXJuIGN0cmxfaW53KHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCQlyZXR1cm4gY3RybF9pbncocGNpX2lvYWRkcihwb3J0KSk7CisJZWxzZQorCQltYXliZWJhZGlvKHBvcnQpOworCisJcmV0dXJuIDA7Cit9CisKK3UzMiByNzc4MHJwX2lubCh1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCisJCW1heWJlYmFkaW8ocG9ydCk7CisJZWxzZSBpZiAoUFhTRUcocG9ydCkpCisJCXJldHVybiBjdHJsX2lubChwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKKwkJcmV0dXJuIGN0cmxfaW5sKHBjaV9pb2FkZHIocG9ydCkpOworCWVsc2UKKwkJbWF5YmViYWRpbyhwb3J0KTsKKworCXJldHVybiAwOworfQorCit2b2lkIHI3NzgwcnBfb3V0Yih1OCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQorCQljdHJsX291dHcodmFsdWUsIHBvcnQ4ODc5NmwocG9ydCwgMCkpOworCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQorCQljdHJsX291dGIodmFsdWUsIHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCQljdHJsX291dGIodmFsdWUsIHBjaV9pb2FkZHIocG9ydCkpOworCWVsc2UKKwkJY3RybF9vdXR3KHZhbHVlLCBwb3J0MmFkcihwb3J0KSk7Cit9CisKK3ZvaWQgcjc3ODBycF9vdXRiX3AodTggdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKKwkJY3RybF9vdXR3KHZhbHVlLCBwb3J0ODg3OTZsKHBvcnQsIDApKTsKKwllbHNlIGlmIChQWFNFRyhwb3J0KSkKKwkJY3RybF9vdXRiKHZhbHVlLCBwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKKwkJY3RybF9vdXRiKHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKKwllbHNlCisJCWN0cmxfb3V0dyh2YWx1ZSwgcG9ydDJhZHIocG9ydCkpOworCisJY3RybF9kZWxheSgpOworfQorCit2b2lkIHI3NzgwcnBfb3V0dyh1MTYgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKKwkJbWF5YmViYWRpbyhwb3J0KTsKKwllbHNlIGlmIChQWFNFRyhwb3J0KSkKKwkJY3RybF9vdXR3KHZhbHVlLCBwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKKwkJY3RybF9vdXR3KHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKKwllbHNlCisJCW1heWJlYmFkaW8ocG9ydCk7Cit9CisKK3ZvaWQgcjc3ODBycF9vdXRsKHUzMiB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQorCQltYXliZWJhZGlvKHBvcnQpOworCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQorCQljdHJsX291dGwodmFsdWUsIHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCQljdHJsX291dGwodmFsdWUsIHBjaV9pb2FkZHIocG9ydCkpOworCWVsc2UKKwkJbWF5YmViYWRpbyhwb3J0KTsKK30KKwordm9pZCByNzc4MHJwX2luc2IodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJdm9sYXRpbGUgdTE2ICpwOworCXU4ICpidWYgPSBkc3Q7CisKKwlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkgeworCQlwID0gKHZvbGF0aWxlIHUxNiAqKXBvcnQ4ODc5NmwocG9ydCwgMCk7CisJCXdoaWxlIChjb3VudC0tKQorCQkJKmJ1ZisrID0gKnAgJiAweGZmOworCX0gZWxzZSBpZiAoUFhTRUcocG9ydCkpIHsKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkqYnVmKysgPSAqKHZvbGF0aWxlIHU4ICopcG9ydDsKKwl9IGVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKSB7CisJCXZvbGF0aWxlIHU4ICpicCA9ICh2b2xhdGlsZSB1OCAqKXBjaV9pb2FkZHIocG9ydCk7CisKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkqYnVmKysgPSAqYnA7CisJfSBlbHNlIHsKKwkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0MmFkcihwb3J0KTsKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkqYnVmKysgPSAqcCAmIDB4ZmY7CisJfQorfQorCit2b2lkIHI3NzgwcnBfaW5zdyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwl2b2xhdGlsZSB1MTYgKnA7CisJdTE2ICpidWYgPSBkc3Q7CisKKwlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKKwkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0ODg3OTZsKHBvcnQsIDEpOworCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQorCQlwID0gKHZvbGF0aWxlIHUxNiAqKXBvcnQ7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCisJCXAgPSAodm9sYXRpbGUgdTE2ICopcGNpX2lvYWRkcihwb3J0KTsKKwllbHNlCisJCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDJhZHIocG9ydCk7CisKKwl3aGlsZSAoY291bnQtLSkKKwkJKmJ1ZisrID0gKnA7Cit9CisKK3ZvaWQgcjc3ODBycF9pbnNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCXUzMiAqYnVmID0gZHN0OworCisJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCisJCW1heWJlYmFkaW8ocG9ydCk7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpIHsKKwkJdm9sYXRpbGUgdTMyICpwID0gKHZvbGF0aWxlIHUzMiAqKXBjaV9pb2FkZHIocG9ydCk7CisKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkqYnVmKysgPSAqcDsKKwl9IGVsc2UKKwkJbWF5YmViYWRpbyhwb3J0KTsKK30KKwordm9pZCByNzc4MHJwX291dHNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCXZvbGF0aWxlIHUxNiAqcDsKKwljb25zdCB1OCAqYnVmID0gc3JjOworCisJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpIHsKKwkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0ODg3OTZsKHBvcnQsIDApOworCQl3aGlsZSAoY291bnQtLSkKKwkJCSpwID0gKmJ1ZisrOworCX0gZWxzZSBpZiAoUFhTRUcocG9ydCkpCisJCXdoaWxlIChjb3VudC0tKQorCQkJY3RybF9vdXRiKCpidWYrKywgcG9ydCk7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpIHsKKwkJdm9sYXRpbGUgdTggKmJwID0gKHZvbGF0aWxlIHU4ICopcGNpX2lvYWRkcihwb3J0KTsKKworCQl3aGlsZSAoY291bnQtLSkKKwkJCSpicCA9ICpidWYrKzsKKwl9IGVsc2UgeworCQlwID0gKHZvbGF0aWxlIHUxNiAqKXBvcnQyYWRyKHBvcnQpOworCQl3aGlsZSAoY291bnQtLSkKKwkJCSpwID0gKmJ1ZisrOworCX0KK30KKwordm9pZCByNzc4MHJwX291dHN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCXZvbGF0aWxlIHUxNiAqcDsKKwljb25zdCB1MTYgKmJ1ZiA9IHNyYzsKKworCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQorCQlwID0gKHZvbGF0aWxlIHUxNiAqKXBvcnQ4ODc5NmwocG9ydCwgMSk7CisJZWxzZSBpZiAoUFhTRUcocG9ydCkpCisJCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKKwkJcCA9ICh2b2xhdGlsZSB1MTYgKilwY2lfaW9hZGRyKHBvcnQpOworCWVsc2UKKwkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0MmFkcihwb3J0KTsKKworCXdoaWxlIChjb3VudC0tKQorCQkqcCA9ICpidWYrKzsKK30KKwordm9pZCByNzc4MHJwX291dHNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCWNvbnN0IHUzMiAqYnVmID0gc3JjOworCisJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCisJCW1heWJlYmFkaW8ocG9ydCk7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpIHsKKwkJdm9sYXRpbGUgdTMyICpwID0gKHZvbGF0aWxlIHUzMiAqKXBjaV9pb2FkZHIocG9ydCk7CisKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkqcCA9ICpidWYrKzsKKwl9IGVsc2UKKwkJbWF5YmViYWRpbyhwb3J0KTsKK30KKwordm9pZCBfX2lvbWVtICpyNzc4MHJwX2lvcG9ydF9tYXAodW5zaWduZWQgbG9uZyBwb3J0LCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKKwkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilwb3J0ODg3OTZsKHBvcnQsIHNpemUgPiAxKTsKKwllbHNlIGlmIChQWFNFRyhwb3J0KSkKKwkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilwb3J0OworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKXBjaV9pb2FkZHIocG9ydCk7CisKKwlyZXR1cm4gKHZvaWQgX19pb21lbSAqKXBvcnQyYWRyKHBvcnQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lycS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZDVlNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvaXJxLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBsaW51eC9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvaXJxLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIEthenVtb3RvIEtvamltYQorICoKKyAqIFJlbmVzYXMgU29sdXRpb25zIEhpZ2hsYW5kZXIgUjc3ODBSUC0xIFN1cHBvcnQuCisgKgorICogTW9kaWZpZWQgZm9yIFI3NzgwUlAtMSBieQorICogQXRvbSBDcmVhdGUgRW5naW5lZXJpbmcgQ28uLCBMdGQuIDIwMDIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3I3NzgwcnAvcjc3ODBycC5oPgorCisjaWZkZWYgQ09ORklHX1NIX1I3NzgwTVAKK3N0YXRpYyBpbnQgbWFza19wb3NbXSA9IHsxMiwgMTEsIDksIDE0LCAxNSwgOCwgMTMsIDYsIDUsIDQsIDMsIDIsIDAsIDAsIDEsIDB9OworI2Vsc2UKK3N0YXRpYyBpbnQgbWFza19wb3NbXSA9IHsxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA1LCA2LCA0LCAwLCAxLCAyLCAwfTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBlbmFibGVfcjc3ODBycF9pcnEodW5zaWduZWQgaW50IGlycSk7CitzdGF0aWMgdm9pZCBkaXNhYmxlX3I3NzgwcnBfaXJxKHVuc2lnbmVkIGludCBpcnEpOworCisvKiBzaHV0ZG93biBpcyBzYW1lIGFzICJkaXNhYmxlIiAqLworI2RlZmluZSBzaHV0ZG93bl9yNzc4MHJwX2lycSBkaXNhYmxlX3I3NzgwcnBfaXJxCisKK3N0YXRpYyB2b2lkIGFja19yNzc4MHJwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIGVuZF9yNzc4MHJwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3I3NzgwcnBfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJZW5hYmxlX3I3NzgwcnBfaXJxKGlycSk7CisJcmV0dXJuIDA7IC8qIG5ldmVyIGFueXRoaW5nIHBlbmRpbmcgKi8KK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9yNzc4MHJwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXVuc2lnbmVkIHNob3J0IHZhbDsKKwl1bnNpZ25lZCBzaG9ydCBtYXNrID0gMHhmZmZmIF4gKDB4MDAwMSA8PCBtYXNrX3Bvc1tpcnFdKTsKKworCS8qIFNldCB0aGUgcHJpb3JpdHkgaW4gSVBSIHRvIDAgKi8KKwl2YWwgPSBjdHJsX2ludyhJUkxDTlRSMSk7CisJdmFsICY9IG1hc2s7CisJY3RybF9vdXR3KHZhbCwgSVJMQ05UUjEpOworfQorCitzdGF0aWMgdm9pZCBlbmFibGVfcjc3ODBycF9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwl1bnNpZ25lZCBzaG9ydCB2YWw7CisJdW5zaWduZWQgc2hvcnQgdmFsdWUgPSAoMHgwMDAxIDw8IG1hc2tfcG9zW2lycV0pOworCisJLyogU2V0IHByaW9yaXR5IGluIElQUiBiYWNrIHRvIG9yaWdpbmFsIHZhbHVlICovCisJdmFsID0gY3RybF9pbncoSVJMQ05UUjEpOworCXZhbCB8PSB2YWx1ZTsKKwljdHJsX291dHcodmFsLCBJUkxDTlRSMSk7Cit9CisKK3N0YXRpYyB2b2lkIGFja19yNzc4MHJwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWRpc2FibGVfcjc3ODBycF9pcnEoaXJxKTsKK30KKworc3RhdGljIHZvaWQgZW5kX3I3NzgwcnBfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpCisJCWVuYWJsZV9yNzc4MHJwX2lycShpcnEpOworfQorCitzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHI3NzgwcnBfaXJxX3R5cGUgPSB7CisJLnR5cGVuYW1lID0gIlI3NzgwUlAtSVJRIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfcjc3ODBycF9pcnEsCisJLnNodXRkb3duID0gc2h1dGRvd25fcjc3ODBycF9pcnEsCisJLmVuYWJsZSA9IGVuYWJsZV9yNzc4MHJwX2lycSwKKwkuZGlzYWJsZSA9IGRpc2FibGVfcjc3ODBycF9pcnEsCisJLmFjayA9IGFja19yNzc4MHJwX2lycSwKKwkuZW5kID0gZW5kX3I3NzgwcnBfaXJxLAorfTsKKworc3RhdGljIHZvaWQgbWFrZV9yNzc4MHJwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOworCWlycV9kZXNjW2lycV0uaGFuZGxlciA9ICZyNzc4MHJwX2lycV90eXBlOworCWRpc2FibGVfcjc3ODBycF9pcnEoaXJxKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgSVJRIHNldHRpbmcKKyAqLwordm9pZCBfX2luaXQgaW5pdF9yNzc4MHJwX0lSUSh2b2lkKQoreworCWludCBpOworCisJLyogSVJMMD1QQ0kgU2xvdCAjQQorCSAqIElSTDE9UENJIFNsb3QgI0IKKwkgKiBJUkwyPVBDSSBTbG90ICNDCisJICogSVJMMz1QQ0kgU2xvdCAjRAorCSAqIElSTDQ9Q0YgQ2FyZAorCSAqIElSTDU9Q0YgQ2FyZCBJbnNlcnQKKwkgKiBJUkw2PU02NjU5NgorCSAqIElSTDc9U0QgQ2FyZAorCSAqIElSTDg9VG91Y2ggUGFuZWwKKwkgKiBJUkw5PVNDSQorCSAqIElSTDEwPVNlcmlhbAorCSAqIElSTDExPUV4dGVudGlvbiAjQQorCSAqIElSTDExPUV4dGVudGlvbiAjQgorCSAqIElSTDEyPURlYnVnIExBTgorCSAqIElSTDEzPVB1c2ggU3dpdGNoCisJICogSVJMMTQ9WmlnZ0JlZSBJTworCSAqLworCisJZm9yIChpPTA7IGk8MTU7IGkrKykKKwkJbWFrZV9yNzc4MHJwX2lycShpKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9sZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjAyNzY2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2xlZC5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIEF0b20gQ3JlYXRlIEVuZ2luZWVyaW5nIENvLiwgTHRkLgorICoKKyAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBSZW5lc2FzIFNvbHV0aW9ucyBISUdITEFOREVSIFI3NzgwUlAtMSBzcGVjaWZpYyBMRUQgY29kZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcjc3ODBycC9yNzc4MHJwLmg+CisKKy8qIEN5Y2xlIHRoZSBMRUQncyBpbiB0aGUgY2xhc2ljIEtuaWdodHJpZ2VyL1N1biBwYXR0ZXJuICovCit2b2lkIGhlYXJ0YmVhdF9yNzc4MHJwKHZvaWQpCit7CisJc3RhdGljIHVuc2lnbmVkIGludCBjbnQgPSAwLCBwZXJpb2QgPSAwOworCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICpwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopUEFfT0JMRUQ7CisJc3RhdGljIHVuc2lnbmVkIGJpdCA9IDAsIHVwID0gMTsKKwl1bnNpZ25lZCBiaXRfcG9zW10gPSB7MiwgMSwgMCwgMywgNiwgNSwgNCwgN307CisKKwljbnQgKz0gMTsKKwlpZiAoY250IDwgcGVyaW9kKQorCQlyZXR1cm47CisKKwljbnQgPSAwOworCisJLyogR28gdGhyb3VnaCB0aGUgcG9pbnRzIChyb3VnaGx5ISk6CisJICogZigwKT0xMCwgZigxKT0xNiwgZigyKT0yMCwgZig1KT0zNSwgZihpbnQpLT4xMTAKKwkgKi8KKwlwZXJpb2QgPSAxMTAgLSAoKDMwMCA8PCBGU0hJRlQpLygoYXZlbnJ1blswXS81KSArICgzPDxGU0hJRlQpKSk7CisKKwkqcCA9IDEgPDwgYml0X3Bvc1tiaXRdOworCWlmICh1cCkKKwkJaWYgKGJpdCA9PSA3KSB7CisJCQliaXQtLTsKKwkJCXVwID0gMDsKKwkJfSBlbHNlCisJCQliaXQrKzsKKwllbHNlIGlmIChiaXQgPT0gMCkKKwkJdXAgPSAxOworCWVsc2UKKwkJYml0LS07Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NDFhYTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvc2V0dXAuYwpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIGFyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9zZXR1cC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIEF0b20gQ3JlYXRlIEVuZ2luZWVyaW5nIENvLiwgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IFBhdWwgTXVuZHQKKyAqCisgKiBSZW5lc2FzIFNvbHV0aW9ucyBIaWdobGFuZGVyIFI3NzgwUlAtMSBTdXBwb3J0LgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CisjaW5jbHVkZSA8YXNtL3I3NzgwcnAvcjc3ODBycC5oPgorI2luY2x1ZGUgPGFzbS9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitleHRlcm4gdm9pZCBoZWFydGJlYXRfcjc3ODBycCh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRfcjc3ODBycF9JUlEodm9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbTY2NTk2X3VzYl9ob3N0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHhhNDgwMDAwMCwKKwkJLmVuZAk9IDB4YTRmZmZmZmYsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSA2LAkJLyogaXJxIG51bWJlciAqLworCQkuZW5kCT0gNiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG02NjU5Nl91c2JfaG9zdF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gIm02NjU5Ni1oY2QiLAorCS5pZAkJPSAwLAorCS5kZXYgPSB7CisJCS5kbWFfbWFzawkJPSBOVUxMLAkJLyogZG9uJ3QgdXNlIGRtYSAqLworCQkuY29oZXJlbnRfZG1hX21hc2sJPSAweGZmZmZmZmZmLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKG02NjU5Nl91c2JfaG9zdF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IG02NjU5Nl91c2JfaG9zdF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcjc3ODBycF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmbTY2NTk2X3VzYl9ob3N0X2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHI3NzgwcnBfZGV2aWNlc19zZXR1cCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhyNzc4MHJwX2RldmljZXMsCisJCQkJICAgIEFSUkFZX1NJWkUocjc3ODBycF9kZXZpY2VzKSk7Cit9CisKKy8qCisgKiBQbGF0Zm9ybSBzcGVjaWZpYyBjbG9ja3MKKyAqLworc3RhdGljIHZvaWQgaXZkcl9jbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwljdHJsX291dHcoY3RybF9pbncoUEFfSVZEUkNUTCkgfCAoMSA8PCA4KSwgUEFfSVZEUkNUTCk7Cit9CisKK3N0YXRpYyB2b2lkIGl2ZHJfY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQoreworCWN0cmxfb3V0dyhjdHJsX2ludyhQQV9JVkRSQ1RMKSAmIH4oMSA8PCA4KSwgUEFfSVZEUkNUTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBpdmRyX2Nsa19vcHMgPSB7CisJLmVuYWJsZQkJPSBpdmRyX2Nsa19lbmFibGUsCisJLmRpc2FibGUJPSBpdmRyX2Nsa19kaXNhYmxlLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaXZkcl9jbGsgPSB7CisJLm5hbWUJCT0gIml2ZHJfY2xrIiwKKwkub3BzCQk9ICZpdmRyX2Nsa19vcHMsCit9OworCitzdGF0aWMgc3RydWN0IGNsayAqcjc3ODBycF9jbG9ja3NbXSA9IHsKKwkmaXZkcl9jbGssCit9OworCitzdGF0aWMgdm9pZCByNzc4MHJwX3Bvd2VyX29mZih2b2lkKQoreworI2lmZGVmIENPTkZJR19TSF9SNzc4ME1QCisJY3RybF9vdXR3KDB4MDAwMSwgUEFfUE9GRik7CisjZW5kaWYKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGJvYXJkCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCByNzc4MHJwX3NldHVwKGNoYXIgKipjbWRsaW5lX3ApCit7CisJdTE2IHZlciA9IGN0cmxfaW53KFBBX1ZFUlJFRyk7CisJaW50IGk7CisKKwlkZXZpY2VfaW5pdGNhbGwocjc3ODBycF9kZXZpY2VzX3NldHVwKTsKKworCXByaW50ayhLRVJOX0lORk8gIlJlbmVzYXMgU29sdXRpb25zIEhpZ2hsYW5kZXIgUjc3ODBSUC0xIHN1cHBvcnQuXG4iKTsKKworCXByaW50ayhLRVJOX0lORk8gIkJvYXJkIHZlcnNpb246ICVkIChyZXZpc2lvbiAlZCksICIKKwkJCSAiRlBHQSB2ZXJzaW9uOiAlZCAocmV2aXNpb24gJWQpXG4iLAorCQkJICh2ZXIgPj4gMTIpICYgMHhmLCAodmVyID4+IDgpICYgMHhmLAorCQkJICh2ZXIgPj4gIDQpICYgMHhmLCB2ZXIgJiAweGYpOworCisJLyoKKwkgKiBFbmFibGUgdGhlIGltcG9ydGFudCBjbG9ja3MgcmlnaHQgYXdheS4uCisJICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocjc3ODBycF9jbG9ja3MpOyBpKyspIHsKKwkJc3RydWN0IGNsayAqY2xrID0gcjc3ODBycF9jbG9ja3NbaV07CisKKwkJY2xrX3JlZ2lzdGVyKGNsayk7CisJCWNsa19lbmFibGUoY2xrKTsKKwl9CisKKwljdHJsX291dHcoMHgwMDAwLCBQQV9PQkxFRCk7CS8qIENsZWFyIExFRC4gKi8KKyNpZm5kZWYgQ09ORklHX1NIX1I3NzgwTVAKKwljdHJsX291dHcoMHgwMDAxLCBQQV9TRFBPVyk7CS8qIFNEIFBvd2VyIE9OICovCisjZW5kaWYKKwljdHJsX291dHcoY3RybF9pbncoUEFfSVZEUkNUTCkgfCAweDAxMDAsIFBBX0lWRFJDVEwpOwkvKiBTaTEzMTEyICovCisKKwlwbV9wb3dlcl9vZmYgPSByNzc4MHJwX3Bvd2VyX29mZjsKK30KKworLyoKKyAqIFRoZSBNYWNoaW5lIFZlY3RvcgorICovCitzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfcjc3ODBycCBfX2luaXRtdiA9IHsKKwkubXZfbmFtZQkJPSAiSGlnaGxhbmRlciBSNzc4MFJQLTEiLAorCS5tdl9zZXR1cAkJPSByNzc4MHJwX3NldHVwLAorCisJLm12X25yX2lycXMJCT0gMTA5LAorCisJLm12X2luYgkJCT0gcjc3ODBycF9pbmIsCisJLm12X2ludwkJCT0gcjc3ODBycF9pbncsCisJLm12X2lubAkJCT0gcjc3ODBycF9pbmwsCisJLm12X291dGIJCT0gcjc3ODBycF9vdXRiLAorCS5tdl9vdXR3CQk9IHI3NzgwcnBfb3V0dywKKwkubXZfb3V0bAkJPSByNzc4MHJwX291dGwsCisKKwkubXZfaW5iX3AJCT0gcjc3ODBycF9pbmJfcCwKKwkubXZfaW53X3AJCT0gcjc3ODBycF9pbncsCisJLm12X2lubF9wCQk9IHI3NzgwcnBfaW5sLAorCS5tdl9vdXRiX3AJCT0gcjc3ODBycF9vdXRiX3AsCisJLm12X291dHdfcAkJPSByNzc4MHJwX291dHcsCisJLm12X291dGxfcAkJPSByNzc4MHJwX291dGwsCisKKwkubXZfaW5zYgkJPSByNzc4MHJwX2luc2IsCisJLm12X2luc3cJCT0gcjc3ODBycF9pbnN3LAorCS5tdl9pbnNsCQk9IHI3NzgwcnBfaW5zbCwKKwkubXZfb3V0c2IJCT0gcjc3ODBycF9vdXRzYiwKKwkubXZfb3V0c3cJCT0gcjc3ODBycF9vdXRzdywKKwkubXZfb3V0c2wJCT0gcjc3ODBycF9vdXRzbCwKKworCS5tdl9pb3BvcnRfbWFwCQk9IHI3NzgwcnBfaW9wb3J0X21hcCwKKwkubXZfaW5pdF9pcnEJCT0gaW5pdF9yNzc4MHJwX0lSUSwKKyNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCisJLm12X2hlYXJ0YmVhdAkJPSBoZWFydGJlYXRfcjc3ODBycCwKKyNlbmRpZgorfTsKK0FMSUFTX01WKHI3NzgwcnApCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvS2NvbmZpZyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ODBkMWZiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL0tjb25maWcKQEAgLTAsMCArMSwxMiBAQAoraWYgU0hfUlRTNzc1MVIyRAorCittZW51ICJSVFM3NzUxUjJEIG9wdGlvbnMiCisKK2NvbmZpZyBSVFM3NzUxUjJEX1JFVjExCisJYm9vbCAiUlRTNzc1MVIyRCBSZXYuIDEuMSBib2FyZCBzdXBwb3J0IgorCWhlbHAKKwkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIHN1cHBvcnQgdmVyc2lvbiByZXYuIDEuMS4KK2VuZG1lbnUKKworZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL01ha2VmaWxlCmluZGV4IGRhYTUzMzMuLjY4NmZjOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvTWFrZWZpbGUKQEAgLTEsMTAgKzEsNiBAQAogIwogIyBNYWtlZmlsZSBmb3IgdGhlIFJUUzc3NTFSMkQgc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbAogIwotIyBOb3RlISBEZXBlbmRlbmNpZXMgYXJlIGRvbmUgYXV0b21hZ2ljYWxseSBieSAnbWFrZSBkZXAnLCB3aGljaCBhbHNvCi0jIHJlbW92ZXMgYW55IG9sZCBkZXBlbmRlbmNpZXMuIERPTidUIHB1dCB5b3VyIG93biBkZXBlbmRlbmNpZXMgaGVyZQotIyB1bmxlc3MgaXQncyBzb21ldGhpbmcgc3BlY2lhbCAoaWUgbm90IGEgLmMgZmlsZSkuCi0jCiAKLW9iai15CSA6PSBtYWNoLm8gc2V0dXAubyBpby5vIGlycS5vIGxlZC5vCi0KK29iai15CSA6PSBzZXR1cC5vIGlvLm8gaXJxLm8KK29iai0kKENPTkZJR19IRUFSVEJFQVQpICs9IGxlZC5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvaW8uYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pby5jCmluZGV4IDEyM2FiYmIuLjEzNWFhMGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pby5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pby5jCkBAIC0xLDYgKzEsNCBAQAogLyoKLSAqIGxpbnV4L2FyY2gvc2gva2VybmVsL2lvX3J0czc3NTFyMmQuYwotICoKICAqIENvcHlyaWdodCAoQykgMjAwMSAgSWFuIGRhIFNpbHZhLCBKZXJlbXkgU2llZ2VsCiAgKiBCYXNlZCBsYXJnZWx5IG9uIGlvX3NlLmMuCiAgKgpAQCAtMTAsMTYgKzgsMTIgQEAKICAqIHBsYWNlaG9sZGVyIGNvZGUgZnJvbSBpb19ydHM3NzUxcjJkLmMgbGVmdCBpbiB3aXRoIHRoZQogICogZXhwZWN0YXRpb24gb2YgbGF0ZXIgU3VwZXJJTyBhbmQgUENNQ0lBIGFjY2Vzcy4KICAqLwotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcnRzNzc1MXIyZC9ydHM3NzUxcjJkLmg+Ci0jaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSAiLi4vLi4vLi4vZHJpdmVycy9wY2kvcGNpLXNoNzc1MS5oIgorI2luY2x1ZGUgPGFzbS9ydHM3NzUxcjJkL3J0czc3NTFyMmQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CiAKIC8qCiAgKiBUaGUgNzc1MVIgUlRTNzc1MVIyRCB1c2VzIHRoZSBidWlsdC1pbiBQQ0kgY29udHJvbGxlciAoUENJQykKQEAgLTI4LDIyICsyMiw2IEBACiAgKiBsaWtlIHRoZSBvdGhlciBTb2x1dGlvbiBFbmdpbmUgYm9hcmRzLgogICovCiAKLSNkZWZpbmUgUENJSU9CUgkJKHZvbGF0aWxlIGxvbmcgKilQQ0lfUkVHKFNINzc1MV9QQ0lJT0JSKQotI2RlZmluZSBQQ0lNQlIgICAgICAgICAgKHZvbGF0aWxlIGxvbmcgKilQQ0lfUkVHKFNINzc1MV9QQ0lNQlIpCi0jZGVmaW5lIFBDSV9JT19BUkVBCVNINzc1MV9QQ0lfSU9fQkFTRQotI2RlZmluZSBQQ0lfTUVNX0FSRUEJU0g3NzUxX1BDSV9DT05GSUdfQkFTRQotCi0jZGVmaW5lIFBDSV9JT01BUChhZHIpCShQQ0lfSU9fQVJFQSArIChhZHIgJiB+U0g3NzUxX1BDSUlPQlJfTUFTSykpCi0KLSNkZWZpbmUgbWF5YmViYWRpbyhuYW1lLHBvcnQpIFwKLSAgcHJpbnRrKCJiYWQgUEMtbGlrZSBpbyAlcyBmb3IgcG9ydCAweCVseCBhdCAweCUwOHhcbiIsIFwKLQkgI25hbWUsIChwb3J0KSwgKF9fdTMyKSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkZWxheSh2b2lkKQotewotCWN0cmxfaW53KDB4YTAwMDAwMDApOwotfQotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcG9ydDJhZHIodW5zaWduZWQgaW50IHBvcnQpCiB7CiAJaWYgKCgweDFmMCA8PSBwb3J0ICYmIHBvcnQgPCAweDFmOCkgfHwgcG9ydCA9PSAweDNmNikKQEAgLTUyLDcgKzMwLDcgQEAKIAkJZWxzZQogCQkJcmV0dXJuIChQQV9BUkVBNV9JTyArIDB4MTAwMCArICgocG9ydC0weDFmMCkgPDwgMSkpOwogCWVsc2UKLQkJbWF5YmViYWRpbyhwb3J0MmFkciwgKHVuc2lnbmVkIGxvbmcpcG9ydCk7CisJCW1heWJlYmFkaW8oKHVuc2lnbmVkIGxvbmcpcG9ydCk7CiAKIAlyZXR1cm4gcG9ydDsKIH0KQEAgLTgxLDE3ICs1OSw2IEBACiAJCXJldHVybiAxOwogfQogCi0vKiBJbiBjYXNlIHNvbWVvbmUgY29uZmlndXJlcyB0aGUga2VybmVsIHcvbyBQQ0kgc3VwcG9ydDogaW4gdGhhdCAqLwotLyogc2NlbmFyaW8sIGRvbid0IGV2ZXIgYm90aGVyIHRvIGNoZWNrIGZvciBQQ0ktd2luZG93IGFkZHJlc3NlcyAqLwotCi0vKiBOT1RFOiBXSU5ET1cgQ0hFQ0sgTUFZIEJFIEEgQklUIE9GRiwgSElHSCBQQ0lCSU9TX01JTl9JTyBXUkFQUz8gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lIENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSBcCi0gICgocG9ydCA+PSBQQ0lCSU9TX01JTl9JTykgJiYgKHBvcnQgPCAoUENJQklPU19NSU5fSU8gKyBTSDc3NTFfUENJX0lPX1NJWkUpKSkKLSNlbHNlCi0jZGVmaW5lIENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSAoMCkKLSNlbmRpZgotCiAjaWYgZGVmaW5lZChDT05GSUdfTkUyMDAwKSB8fCBkZWZpbmVkKENPTkZJR19ORTIwMDBfTU9EVUxFKQogI2RlZmluZSBDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpIFwKICAgKChwb3J0ID49IEFYODg3OTZMX0lPX0JBU0UpICYmIChwb3J0IDwgKEFYODg3OTZMX0lPX0JBU0UrMHgyMCkpKQpAQCAtMTEyLDggKzc5LDggQEAKIAkJcmV0dXJuICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDg4Nzk2bChwb3J0LCAwKSkgJiAweGZmOwogCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQogCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydDsKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQotCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopUENJX0lPTUFQKHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlCiAJCXJldHVybiAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQyYWRyKHBvcnQpICYgMHhmZik7CiB9CkBAIC0xMjYsMTEgKzkzLDEyIEBACiAJCXYgPSAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQ4ODc5NmwocG9ydCwgMCkpICYgMHhmZjsKICAgICAgICAgZWxzZSBpZiAoUFhTRUcocG9ydCkpCiAJCXYgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0OwotCWVsc2UgaWYgKENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCi0JCXYgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilQQ0lfSU9NQVAocG9ydCk7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCisJCXYgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwY2lfaW9hZGRyKHBvcnQpOwogCWVsc2UKIAkJdiA9ICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDJhZHIocG9ydCkgJiAweGZmKTsKLQlkZWxheSgpOworCisJY3RybF9kZWxheSgpOwogCiAJcmV0dXJuIHY7CiB9CkBAIC0xMzgsMTMgKzEwNiwxMyBAQAogdW5zaWduZWQgc2hvcnQgcnRzNzc1MXIyZF9pbncodW5zaWduZWQgbG9uZyBwb3J0KQogewogCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKGludywgcG9ydCk7CisJCW1heWJlYmFkaW8ocG9ydCk7CiAgICAgICAgIGVsc2UgaWYgKFBYU0VHKHBvcnQpKQogCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQ7Ci0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilQQ0lfSU9NQVAocG9ydCk7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCisJCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlCi0JCW1heWJlYmFkaW8oaW53LCBwb3J0KTsKKwkJbWF5YmViYWRpbyhwb3J0KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTUyLDEzICsxMjAsMTMgQEAKIHVuc2lnbmVkIGludCBydHM3NzUxcjJkX2lubCh1bnNpZ25lZCBsb25nIHBvcnQpCiB7CiAJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCi0JCW1heWJlYmFkaW8oaW5sLCBwb3J0KTsKKwkJbWF5YmViYWRpbyhwb3J0KTsKICAgICAgICAgZWxzZSBpZiAoUFhTRUcocG9ydCkpCiAJCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilwb3J0OwotCWVsc2UgaWYgKENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCi0JCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilQQ0lfSU9NQVAocG9ydCk7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCisJCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilwY2lfaW9hZGRyKHBvcnQpOwogCWVsc2UKLQkJbWF5YmViYWRpbyhpbmwsIHBvcnQpOworCQltYXliZWJhZGlvKHBvcnQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNjksOCArMTM3LDggQEAKIAkJKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ODg3OTZsKHBvcnQsIDApKSA9IHZhbHVlOwogICAgICAgICBlbHNlIGlmIChQWFNFRyhwb3J0KSkKIAkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydCA9IHZhbHVlOwotCWVsc2UgaWYgKENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCi0JCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKVBDSV9JT01BUChwb3J0KSA9IHZhbHVlOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwY2lfaW9hZGRyKHBvcnQpID0gdmFsdWU7CiAJZWxzZQogCQkqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDJhZHIocG9ydCkgPSB2YWx1ZTsKIH0KQEAgLTE4MSwxNDQgKzE0OSwxNTMgQEAKIAkJKigodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ODg3OTZsKHBvcnQsIDApKSA9IHZhbHVlOwogICAgICAgICBlbHNlIGlmIChQWFNFRyhwb3J0KSkKIAkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydCA9IHZhbHVlOwotCWVsc2UgaWYgKENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCi0JCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKVBDSV9JT01BUChwb3J0KSA9IHZhbHVlOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwY2lfaW9hZGRyKHBvcnQpID0gdmFsdWU7CiAJZWxzZQogCQkqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDJhZHIocG9ydCkgPSB2YWx1ZTsKLQlkZWxheSgpOworCisJY3RybF9kZWxheSgpOwogfQogCiB2b2lkIHJ0czc3NTFyMmRfb3V0dyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQogewogCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKG91dHcsIHBvcnQpOworCQltYXliZWJhZGlvKHBvcnQpOwogICAgICAgICBlbHNlIGlmIChQWFNFRyhwb3J0KSkKIAkJKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQgPSB2YWx1ZTsKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQotCQkqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopUENJX0lPTUFQKHBvcnQpID0gdmFsdWU7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCisJCSoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwY2lfaW9hZGRyKHBvcnQpID0gdmFsdWU7CiAJZWxzZQotCQltYXliZWJhZGlvKG91dHcsIHBvcnQpOworCQltYXliZWJhZGlvKHBvcnQpOwogfQogCiB2b2lkIHJ0czc3NTFyMmRfb3V0bCh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKLQkJbWF5YmViYWRpbyhvdXRsLCBwb3J0KTsKKwkJbWF5YmViYWRpbyhwb3J0KTsKICAgICAgICAgZWxzZSBpZiAoUFhTRUcocG9ydCkpCiAJCSoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKXBvcnQgPSB2YWx1ZTsKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQotCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilQQ0lfSU9NQVAocG9ydCkgPSB2YWx1ZTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKKwkJKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopcGNpX2lvYWRkcihwb3J0KSA9IHZhbHVlOwogCWVsc2UKLQkJbWF5YmViYWRpbyhvdXRsLCBwb3J0KTsKKwkJbWF5YmViYWRpbyhwb3J0KTsKIH0KIAogdm9pZCBydHM3NzUxcjJkX2luc2IodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQogeworCXVuc2lnbmVkIGxvbmcgYSA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CiAJdm9sYXRpbGUgX191OCAqYnA7CiAJdm9sYXRpbGUgX191MTYgKnA7Ci0JdW5zaWduZWQgY2hhciAqcyA9IGFkZHI7CiAKIAlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkgewogCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDg4Nzk2bChwb3J0LCAwKTsKLQkJd2hpbGUgKGNvdW50LS0pICpzKysgPSAqcCAmIDB4ZmY7CisJCXdoaWxlIChjb3VudC0tKQorCQkJY3RybF9vdXRiKCpwICYgMHhmZiwgYSsrKTsKIAl9IGVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQl3aGlsZSAoY291bnQtLSkgKnMrKyA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBvcnQ7Ci0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkgewotCQlicCA9IChfX3U4ICopUENJX0lPTUFQKHBvcnQpOwotCQl3aGlsZSAoY291bnQtLSkgKnMrKyA9ICpicDsKKwkJd2hpbGUgKGNvdW50LS0pCisJCQljdHJsX291dGIoY3RybF9pbmIocG9ydCksIGErKyk7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpIHsKKwkJYnAgPSAoX191OCAqKXBjaV9pb2FkZHIocG9ydCk7CisJCXdoaWxlIChjb3VudC0tKQorCQkJY3RybF9vdXRiKCpicCwgYSsrKTsKIAl9IGVsc2UgewogCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDJhZHIocG9ydCk7Ci0JCXdoaWxlIChjb3VudC0tKSAqcysrID0gKnAgJiAweGZmOworCQl3aGlsZSAoY291bnQtLSkKKwkJCWN0cmxfb3V0YigqcCAmIDB4ZmYsIGErKyk7CiAJfQogfQogCiB2b2lkIHJ0czc3NTFyMmRfaW5zdyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CisJdW5zaWduZWQgbG9uZyBhID0gKHVuc2lnbmVkIGxvbmcpYWRkcjsKIAl2b2xhdGlsZSBfX3UxNiAqcDsKLQlfX3UxNiAqcyA9IGFkZHI7CiAKIAlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKIAkJcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQ4ODc5NmwocG9ydCwgMSk7CiAJZWxzZSBpZiAoUFhTRUcocG9ydCkpCiAJCXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0OwotCWVsc2UgaWYgKENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCi0JCXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilQQ0lfSU9NQVAocG9ydCk7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCisJCXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwY2lfaW9hZGRyKHBvcnQpOwogCWVsc2UKIAkJcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQyYWRyKHBvcnQpOwotCXdoaWxlIChjb3VudC0tKSAqcysrID0gKnA7CisJd2hpbGUgKGNvdW50LS0pCisJCWN0cmxfb3V0dygqcCwgYSsrKTsKIH0KIAogdm9pZCBydHM3NzUxcjJkX2luc2wodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKGluc2wsIHBvcnQpOwotCWVsc2UgaWYgKENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpIHsKLQkJdm9sYXRpbGUgX191MzIgKnAgPSAoX191MzIgKilQQ0lfSU9NQVAocG9ydCk7Ci0JCV9fdTMyICpzID0gYWRkcjsKKwkJbWF5YmViYWRpbyhwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkgeworCQl1bnNpZ25lZCBsb25nIGEgPSAodW5zaWduZWQgbG9uZylhZGRyOwogCi0JCXdoaWxlIChjb3VudC0tKSAqcysrID0gKnA7CisJCXdoaWxlIChjb3VudC0tKSB7CisJCQljdHJsX291dGwoY3RybF9pbmwocGNpX2lvYWRkcihwb3J0KSksIGEpOworCQkJYSArPSA0OworCQl9CiAJfSBlbHNlCi0JCW1heWJlYmFkaW8oaW5zbCwgcG9ydCk7CisJCW1heWJlYmFkaW8ocG9ydCk7CiB9CiAKIHZvaWQgcnRzNzc1MXIyZF9vdXRzYih1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CisJdW5zaWduZWQgbG9uZyBhID0gKHVuc2lnbmVkIGxvbmcpYWRkcjsKIAl2b2xhdGlsZSBfX3U4ICpicDsKIAl2b2xhdGlsZSBfX3UxNiAqcDsKLQljb25zdCBfX3U4ICpzID0gYWRkcjsKIAogCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKSB7CiAJCXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ODg3OTZsKHBvcnQsIDApOwotCQl3aGlsZSAoY291bnQtLSkgKnAgPSAqcysrOworCQl3aGlsZSAoY291bnQtLSkKKwkJCSpwID0gY3RybF9pbmIoYSsrKTsKIAl9IGVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQl3aGlsZSAoY291bnQtLSkgKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydCA9ICpzKys7Ci0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkgewotCQlicCA9IChfX3U4ICopUENJX0lPTUFQKHBvcnQpOwotCQl3aGlsZSAoY291bnQtLSkgKmJwID0gKnMrKzsKKwkJd2hpbGUgKGNvdW50LS0pCisJCQljdHJsX291dGIoYSsrLCBwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkgeworCQlicCA9IChfX3U4ICopcGNpX2lvYWRkcihwb3J0KTsKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkqYnAgPSBjdHJsX2luYihhKyspOwogCX0gZWxzZSB7CiAJCXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0MmFkcihwb3J0KTsKLQkJd2hpbGUgKGNvdW50LS0pICpwID0gKnMrKzsKKwkJd2hpbGUgKGNvdW50LS0pCisJCQkqcCA9IGN0cmxfaW5iKGErKyk7CiAJfQogfQogCiB2b2lkIHJ0czc3NTFyMmRfb3V0c3codW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQogeworCXVuc2lnbmVkIGxvbmcgYSA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CiAJdm9sYXRpbGUgX191MTYgKnA7Ci0JY29uc3QgX191MTYgKnMgPSBhZGRyOwogCiAJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCiAJCXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ODg3OTZsKHBvcnQsIDEpOwogCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQogCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDsKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQotCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopUENJX0lPTUFQKHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlCiAJCXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0MmFkcihwb3J0KTsKLQl3aGlsZSAoY291bnQtLSkgKnAgPSAqcysrOworCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJY3RybF9vdXR3KCpwLCBhKTsKKwkJYSArPSAyOworCX0KIH0KIAogdm9pZCBydHM3NzUxcjJkX291dHNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKLQkJbWF5YmViYWRpbyhvdXRzbCwgcG9ydCk7Ci0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkgewotCQl2b2xhdGlsZSBfX3UzMiAqcCA9IChfX3UzMiAqKVBDSV9JT01BUChwb3J0KTsKLQkJY29uc3QgX191MzIgKnMgPSBhZGRyOworCQltYXliZWJhZGlvKHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKSB7CisJCXVuc2lnbmVkIGxvbmcgYSA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CiAKLQkJd2hpbGUgKGNvdW50LS0pICpwID0gKnMrKzsKKwkJd2hpbGUgKGNvdW50LS0pIHsKKwkJCWN0cmxfb3V0bChjdHJsX2lubChhKSwgcGNpX2lvYWRkcihwb3J0KSk7CisJCQlhICs9IDQ7CisJCX0KIAl9IGVsc2UKLQkJbWF5YmViYWRpbyhvdXRzbCwgcG9ydCk7CisJCW1heWJlYmFkaW8ocG9ydCk7CiB9CiAKLXZvaWQgKnJ0czc3NTFyMmRfaW9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCWlmIChvZmZzZXQgPj0gMHhmZDAwMDAwMCkKLQkJcmV0dXJuICh2b2lkICopb2Zmc2V0OwotCWVsc2UKLQkJcmV0dXJuICh2b2lkICopUDJTRUdBRERSKG9mZnNldCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHJ0czc3NTFyMmRfaW9yZW1hcCk7Ci0KIHVuc2lnbmVkIGxvbmcgcnRzNzc1MXIyZF9pc2FfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQogewogCXJldHVybiBwb3J0MmFkcihvZmZzZXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lycS5jCmluZGV4IDE1NDUzNTQ0Li5jOTE1ZTdhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lycS5jCkBAIC00MSwzMCArNDEsMjQgQEAKIAogc3RhdGljIHZvaWQgZGlzYWJsZV9ydHM3NzUxcjJkX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgc2hvcnQgdmFsOwogCXVuc2lnbmVkIHNob3J0IG1hc2sgPSAweGZmZmYgXiAoMHgwMDAxIDw8IG1hc2tfcG9zW2lycV0pOwogCiAJLyogU2V0IHRoZSBwcmlvcml0eSBpbiBJUFIgdG8gMCAqLwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAl2YWwgPSBjdHJsX2ludyhJUkxDTlRSMSk7CiAJdmFsICY9IG1hc2s7CiAJY3RybF9vdXR3KHZhbCwgSVJMQ05UUjEpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgZW5hYmxlX3J0czc3NTFyMmRfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBzaG9ydCB2YWw7CiAJdW5zaWduZWQgc2hvcnQgdmFsdWUgPSAoMHgwMDAxIDw8IG1hc2tfcG9zW2lycV0pOwogCiAJLyogU2V0IHByaW9yaXR5IGluIElQUiBiYWNrIHRvIG9yaWdpbmFsIHZhbHVlICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXZhbCA9IGN0cmxfaW53KElSTENOVFIxKTsKIAl2YWwgfD0gdmFsdWU7CiAJY3RybF9vdXR3KHZhbCwgSVJMQ05UUjEpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogaW50IHJ0czc3NTFyMmRfaXJxX2RlbXV4KGludCBpcnEpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvbGVkLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvbGVkLmMKaW5kZXggNGQxNmRlNy4uZTE0YTEzZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2xlZC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9sZWQuYwpAQCAtMTIsOCArMTIsNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9ydHM3NzUxcjJkL3J0czc3NTFyMmQuaD4KIAotZXh0ZXJuIHVuc2lnbmVkIGludCBkZWJ1Z19jb3VudGVyOwotCiAjaWZkZWYgQ09ORklHX0hFQVJUQkVBVAogCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTU1LDEyICs1MywzIEBACiAJY3RybF9vdXR3KHZhbHVlLCBQQV9PVVRQT1JUKTsKIH0KIAotdm9pZCBkZWJ1Z19sZWRfZGlzcCh2b2lkKQotewotCXVuc2lnbmVkIHNob3J0IHZhbHVlOwotCi0JdmFsdWUgPSAodW5zaWduZWQgc2hvcnQpZGVidWdfY291bnRlcisrOwotCXJ0czc3NTFyMmRfbGVkKHZhbHVlKTsKLQlpZiAodmFsdWUgPT0gMHhmZikKLQkJZGVidWdfY291bnRlciA9IDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvbWFjaC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL21hY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVkOWU5Ny4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvbWFjaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvc2gva2VybmVsL21hY2hfcnRzNzc1MXIyZC5jCi0gKgotICogTWlub3IgdHdlYWsgb2YgbWFjaF9zZS5jIGZpbGUgdG8gcmVmZXJlbmNlIHJ0czc3NTFyMmQtc3BlY2lmaWMgaXRlbXMuCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIE1hY2hpbmUgdmVjdG9yIGZvciB0aGUgUmVuZXNhcyBUZWNobm9sb2d5IHNhbGVzIFJUUzc3NTFSMkQKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9ydGMuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQvaW8uaD4KLQotZXh0ZXJuIHZvaWQgaGVhcnRiZWF0X3J0czc3NTFyMmQodm9pZCk7Ci1leHRlcm4gdm9pZCBpbml0X3J0czc3NTFyMmRfSVJRKHZvaWQpOwotZXh0ZXJuIHZvaWQgKnJ0czc3NTFyMmRfaW9yZW1hcCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKLWV4dGVybiBpbnQgcnRzNzc1MXIyZF9pcnFfZGVtdXgoaW50IGlycSk7Ci0KLWV4dGVybiB2b2lkICp2b3lhZ2VyZ3hfY29uc2lzdGVudF9hbGxvYyhzdHJ1Y3QgZGV2aWNlICosIHNpemVfdCwgZG1hX2FkZHJfdCAqLCBnZnBfdCk7Ci1leHRlcm4gaW50IHZveWFnZXJneF9jb25zaXN0ZW50X2ZyZWUoc3RydWN0IGRldmljZSAqLCBzaXplX3QsIHZvaWQgKiwgZG1hX2FkZHJfdCk7Ci0KLS8qCi0gKiBUaGUgTWFjaGluZSBWZWN0b3IKLSAqLwotCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfcnRzNzc1MXIyZCBfX2luaXRtdiA9IHsKLQkubXZfbnJfaXJxcwkJPSA3MiwKLQotCS5tdl9pbmIJCQk9IHJ0czc3NTFyMmRfaW5iLAotCS5tdl9pbncJCQk9IHJ0czc3NTFyMmRfaW53LAotCS5tdl9pbmwJCQk9IHJ0czc3NTFyMmRfaW5sLAotCS5tdl9vdXRiCQk9IHJ0czc3NTFyMmRfb3V0YiwKLQkubXZfb3V0dwkJPSBydHM3NzUxcjJkX291dHcsCi0JLm12X291dGwJCT0gcnRzNzc1MXIyZF9vdXRsLAotCi0JLm12X2luYl9wCQk9IHJ0czc3NTFyMmRfaW5iX3AsCi0JLm12X2lud19wCQk9IHJ0czc3NTFyMmRfaW53LAotCS5tdl9pbmxfcAkJPSBydHM3NzUxcjJkX2lubCwKLQkubXZfb3V0Yl9wCQk9IHJ0czc3NTFyMmRfb3V0Yl9wLAotCS5tdl9vdXR3X3AJCT0gcnRzNzc1MXIyZF9vdXR3LAotCS5tdl9vdXRsX3AJCT0gcnRzNzc1MXIyZF9vdXRsLAotCi0JLm12X2luc2IJCT0gcnRzNzc1MXIyZF9pbnNiLAotCS5tdl9pbnN3CQk9IHJ0czc3NTFyMmRfaW5zdywKLQkubXZfaW5zbAkJPSBydHM3NzUxcjJkX2luc2wsCi0JLm12X291dHNiCQk9IHJ0czc3NTFyMmRfb3V0c2IsCi0JLm12X291dHN3CQk9IHJ0czc3NTFyMmRfb3V0c3csCi0JLm12X291dHNsCQk9IHJ0czc3NTFyMmRfb3V0c2wsCi0KLQkubXZfaW9yZW1hcAkJPSBydHM3NzUxcjJkX2lvcmVtYXAsCi0JLm12X2lzYV9wb3J0MmFkZHIJPSBydHM3NzUxcjJkX2lzYV9wb3J0MmFkZHIsCi0JLm12X2luaXRfaXJxCQk9IGluaXRfcnRzNzc1MXIyZF9JUlEsCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCS5tdl9oZWFydGJlYXQJCT0gaGVhcnRiZWF0X3J0czc3NTFyMmQsCi0jZW5kaWYKLQkubXZfaXJxX2RlbXV4CQk9IHJ0czc3NTFyMmRfaXJxX2RlbXV4LAotCi0jaWZkZWYgQ09ORklHX1VTQl9PSENJX0hDRAotCS5tdl9jb25zaXN0ZW50X2FsbG9jCT0gdm95YWdlcmd4X2NvbnNpc3RlbnRfYWxsb2MsCi0JLm12X2NvbnNpc3RlbnRfZnJlZQk9IHZveWFnZXJneF9jb25zaXN0ZW50X2ZyZWUsCi0jZW5kaWYKLX07Ci1BTElBU19NVihydHM3NzUxcjJkKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvc2V0dXAuYwppbmRleCAyNTg3ZmQxLi4yMDU5N2E2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvc2V0dXAuYwpAQCAtMSwzMSArMSwxNDIgQEAKIC8qCi0gKiBsaW51eC9hcmNoL3NoL2tlcm5lbC9zZXR1cF9ydHM3NzUxcjJkLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgIEthenVtb3RvIEtvamltYQotICoKICAqIFJlbmVzYXMgVGVjaG5vbG9neSBTYWxlcyBSVFM3NzUxUjJEIFN1cHBvcnQuCiAgKgotICogTW9kaWZpZWQgZm9yIFJUUzc3NTFSMkQgYnkKLSAqIEF0b20gQ3JlYXRlIEVuZ2luZWVyaW5nIENvLiwgTHRkLiAyMDAyLgorICogQ29weXJpZ2h0IChDKSAyMDAyIEF0b20gQ3JlYXRlIEVuZ2luZWVyaW5nIENvLiwgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAwNiBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQvcnRzNzc1MXIyZC5oPgorI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvcnRzNzc1MXIyZC5oPgorI2luY2x1ZGUgPGFzbS92b3lhZ2VyZ3guaD4KIAotdW5zaWduZWQgaW50IGRlYnVnX2NvdW50ZXI7CitleHRlcm4gdm9pZCBoZWFydGJlYXRfcnRzNzc1MXIyZCh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRfcnRzNzc1MXIyZF9JUlEodm9pZCk7CitleHRlcm4gaW50IHJ0czc3NTFyMmRfaXJxX2RlbXV4KGludCBpcnEpOwogCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKK2V4dGVybiB2b2lkICp2b3lhZ2VyZ3hfY29uc2lzdGVudF9hbGxvYyhzdHJ1Y3QgZGV2aWNlICosIHNpemVfdCwgZG1hX2FkZHJfdCAqLCBnZnBfdCk7CitleHRlcm4gaW50IHZveWFnZXJneF9jb25zaXN0ZW50X2ZyZWUoc3RydWN0IGRldmljZSAqLCBzaXplX3QsIHZvaWQgKiwgZG1hX2FkZHJfdCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgdWFydF9wbGF0Zm9ybV9kYXRhW10gPSB7CisJeworCQkubWVtYmFzZQk9ICh2b2lkICopVk9ZQUdFUl9VQVJUX0JBU0UsCisJCS5tYXBiYXNlCT0gVk9ZQUdFUl9VQVJUX0JBU0UsCisJCS5pb3R5cGUJCT0gVVBJT19NRU0sCisJCS5pcnEJCT0gVk9ZQUdFUl9VQVJUMF9JUlEsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnJlZ3NoaWZ0CT0gMiwKKwkJLnVhcnRjbGsJPSAoOTYwMCAqIDE2KSwKKwl9LCB7CisJCS5mbGFncwkJPSAwLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgdm95YWdlcmd4X3NlcmlhbF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuICJSVFM3NzUxUjJEIjsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCS8qCisJICogR1BJTyBDb250cm9sCisJICovCisJdmFsID0gaW5sKEdQSU9fTVVYX0hJR0gpOworCXZhbCB8PSAweDAwMDAxZmUwOworCW91dGwodmFsLCBHUElPX01VWF9ISUdIKTsKKworCS8qCisJICogUG93ZXIgTW9kZSBHYXRlCisJICovCisJdmFsID0gaW5sKFBPV0VSX01PREUwX0dBVEUpOworCXZhbCB8PSAoUE9XRVJfTU9ERTBfR0FURV9VMCB8IFBPV0VSX01PREUwX0dBVEVfVTEpOworCW91dGwodmFsLCBQT1dFUl9NT0RFMF9HQVRFKTsKKworCXZhbCA9IGlubChQT1dFUl9NT0RFMV9HQVRFKTsKKwl2YWwgfD0gKFBPV0VSX01PREUxX0dBVEVfVTAgfCBQT1dFUl9NT0RFMV9HQVRFX1UxKTsKKwlvdXRsKHZhbCwgUE9XRVJfTU9ERTFfR0FURSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHVhcnRfZGV2aWNlID0geworCS5uYW1lCQk9ICJzZXJpYWw4MjUwIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gdWFydF9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcnRzNzc1MXIyZF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmdWFydF9kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBydHM3NzUxcjJkX2RldmljZXNfc2V0dXAodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMocnRzNzc1MXIyZF9kZXZpY2VzLAorCQkJCSAgICBBUlJBWV9TSVpFKHJ0czc3NTFyMmRfZGV2aWNlcykpOworfQorCitzdGF0aWMgdm9pZCBydHM3NzUxcjJkX3Bvd2VyX29mZih2b2lkKQoreworCWN0cmxfb3V0dygweDAwMDEsIFBBX1BPV09GRik7CiB9CiAKIC8qCiAgKiBJbml0aWFsaXplIHRoZSBib2FyZAogICovCi12b2lkIF9faW5pdCBwbGF0Zm9ybV9zZXR1cCh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IHJ0czc3NTFyMmRfc2V0dXAoY2hhciAqKmNtZGxpbmVfcCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJSZW5lc2FzIFRlY2hub2xvZ3kgU2FsZXMgUlRTNzc1MVIyRCBzdXBwb3J0LlxuIik7CisJZGV2aWNlX2luaXRjYWxsKHJ0czc3NTFyMmRfZGV2aWNlc19zZXR1cCk7CisKIAljdHJsX291dHcoMHgwMDAwLCBQQV9PVVRQT1JUKTsKLQlkZWJ1Z19jb3VudGVyID0gMDsKKwlwbV9wb3dlcl9vZmYgPSBydHM3NzUxcjJkX3Bvd2VyX29mZjsKKworCXZveWFnZXJneF9zZXJpYWxfaW5pdCgpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiUmVuZXNhcyBUZWNobm9sb2d5IFNhbGVzIFJUUzc3NTFSMkQgc3VwcG9ydC5cbiIpOwogfQorCisvKgorICogVGhlIE1hY2hpbmUgVmVjdG9yCisgKi8KK3N0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9ydHM3NzUxcjJkIF9faW5pdG12ID0geworCS5tdl9uYW1lCQk9ICJSVFM3NzUxUjJEIiwKKwkubXZfc2V0dXAJCT0gcnRzNzc1MXIyZF9zZXR1cCwKKwkubXZfbnJfaXJxcwkJPSA3MiwKKworCS5tdl9pbmIJCQk9IHJ0czc3NTFyMmRfaW5iLAorCS5tdl9pbncJCQk9IHJ0czc3NTFyMmRfaW53LAorCS5tdl9pbmwJCQk9IHJ0czc3NTFyMmRfaW5sLAorCS5tdl9vdXRiCQk9IHJ0czc3NTFyMmRfb3V0YiwKKwkubXZfb3V0dwkJPSBydHM3NzUxcjJkX291dHcsCisJLm12X291dGwJCT0gcnRzNzc1MXIyZF9vdXRsLAorCisJLm12X2luYl9wCQk9IHJ0czc3NTFyMmRfaW5iX3AsCisJLm12X2lud19wCQk9IHJ0czc3NTFyMmRfaW53LAorCS5tdl9pbmxfcAkJPSBydHM3NzUxcjJkX2lubCwKKwkubXZfb3V0Yl9wCQk9IHJ0czc3NTFyMmRfb3V0Yl9wLAorCS5tdl9vdXR3X3AJCT0gcnRzNzc1MXIyZF9vdXR3LAorCS5tdl9vdXRsX3AJCT0gcnRzNzc1MXIyZF9vdXRsLAorCisJLm12X2luc2IJCT0gcnRzNzc1MXIyZF9pbnNiLAorCS5tdl9pbnN3CQk9IHJ0czc3NTFyMmRfaW5zdywKKwkubXZfaW5zbAkJPSBydHM3NzUxcjJkX2luc2wsCisJLm12X291dHNiCQk9IHJ0czc3NTFyMmRfb3V0c2IsCisJLm12X291dHN3CQk9IHJ0czc3NTFyMmRfb3V0c3csCisJLm12X291dHNsCQk9IHJ0czc3NTFyMmRfb3V0c2wsCisKKwkubXZfaW5pdF9pcnEJCT0gaW5pdF9ydHM3NzUxcjJkX0lSUSwKKyNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCisJLm12X2hlYXJ0YmVhdAkJPSBoZWFydGJlYXRfcnRzNzc1MXIyZCwKKyNlbmRpZgorCS5tdl9pcnFfZGVtdXgJCT0gcnRzNzc1MXIyZF9pcnFfZGVtdXgsCisKKyNpZmRlZiBDT05GSUdfVVNCX1NNNTAxCisJLm12X2NvbnNpc3RlbnRfYWxsb2MJPSB2b3lhZ2VyZ3hfY29uc2lzdGVudF9hbGxvYywKKwkubXZfY29uc2lzdGVudF9mcmVlCT0gdm95YWdlcmd4X2NvbnNpc3RlbnRfZnJlZSwKKyNlbmRpZgorfTsKK0FMSUFTX01WKHJ0czc3NTFyMmQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3NoNzcxMHZvaXBndy9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc2g3NzEwdm9pcGd3L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MDM3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3NoNzcxMHZvaXBndy9NYWtlZmlsZQpAQCAtMCwwICsxIEBACitvYmoteQkgOj0gc2V0dXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zaDc3MTB2b2lwZ3cvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc2g3NzEwdm9pcGd3L3NldHVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3ZTdhZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc2g3NzEwdm9pcGd3L3NldHVwLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBSZW5lc2FzIFRlY2hub2xvZ3kgU0g3NzEwIFZvSVAgR2F0ZXdheQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgUmFuaml0IERlc2hwYW5kZQorICogS2VuYXRpIFRlY2hub2xvZ2llcyBJbmMuCisgKgorICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworLyoKKyAqIEluaXRpYWxpemUgSVJRIHNldHRpbmcKKyAqLworc3RhdGljIHZvaWQgX19pbml0IHNoNzcxMHZvaXBnd19pbml0X2lycSh2b2lkKQoreworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgaW4gSVBSIHJlZ2lzdGVycyAqLworCWN0cmxfb3V0dygweDAsIElOVENfSVBSQSk7CisJY3RybF9vdXR3KDB4MCwgSU5UQ19JUFJCKTsKKwljdHJsX291dHcoMHgwLCBJTlRDX0lQUkMpOworCWN0cmxfb3V0dygweDAsIElOVENfSVBSRCk7CisJY3RybF9vdXR3KDB4MCwgSU5UQ19JUFJFKTsKKwljdHJsX291dHcoMHgwLCBJTlRDX0lQUkYpOworCWN0cmxfb3V0dygweDAsIElOVENfSVBSRyk7CisJY3RybF9vdXR3KDB4MCwgSU5UQ19JUFJIKTsKKwljdHJsX291dHcoMHgwLCBJTlRDX0lQUkkpOworCisJLyogQWNrIGFsbCBpbnRlcnJ1cHQgc291cmNlcyBpbiB0aGUgSVJSMCByZWdpc3RlciAqLworCWN0cmxfb3V0YigweDNmLCBJTlRDX0lSUjApOworCisJLyogVXNlIElSUTAgLSBJUlEzIGFzIGFjdGl2ZSBsb3cgaW50ZXJydXB0IGxpbmVzIGkuZS4gZGlzYWJsZQorCSAqIElSTCBtb2RlLgorCSAqLworCWN0cmxfb3V0dygweDJhYSwgSU5UQ19JQ1IxKTsKKworCS8qIE5vdyBtYWtlIElQUiBpbnRlcnJ1cHRzICovCisJbWFrZV9pcHJfaXJxKFRJTUVSMl9JUlEsIFRJTUVSMl9JUFJfQUREUiwKKwkJCVRJTUVSMl9JUFJfUE9TLCBUSU1FUjJfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShXRFRfSVJRLCBXRFRfSVBSX0FERFIsIFdEVF9JUFJfUE9TLCBXRFRfUFJJT1JJVFkpOworCisJLyogU0NJRjAgKi8KKwltYWtlX2lwcl9pcnEoU0NJRjBfRVJJX0lSUSwgU0NJRjBfSVBSX0FERFIsIFNDSUYwX0lQUl9QT1MsCisJCQlTQ0lGMF9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKFNDSUYwX1JYSV9JUlEsIFNDSUYwX0lQUl9BRERSLCBTQ0lGMF9JUFJfUE9TLAorCQkJU0NJRjBfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShTQ0lGMF9CUklfSVJRLCBTQ0lGMF9JUFJfQUREUiwgU0NJRjBfSVBSX1BPUywKKwkJCVNDSUYwX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoU0NJRjBfVFhJX0lSUSwgU0NJRjBfSVBSX0FERFIsIFNDSUYwX0lQUl9QT1MsCisJCQlTQ0lGMF9QUklPUklUWSk7CisKKwkvKiBETUFDLTEgKi8KKwltYWtlX2lwcl9pcnEoRE1URTBfSVJRLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShETVRFMV9JUlEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKERNVEUyX0lSUSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoRE1URTNfSVJRLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkpOworCisJLyogRE1BQy0yICovCisJbWFrZV9pcHJfaXJxKERNVEU0X0lSUSwgRE1BMl9JUFJfQUREUiwgRE1BMl9JUFJfUE9TLCBETUEyX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoRE1URTRfSVJRLCBETUEyX0lQUl9BRERSLCBETUEyX0lQUl9QT1MsIERNQTJfUFJJT1JJVFkpOworCisJLyogSVBTRUMgKi8KKwltYWtlX2lwcl9pcnEoSVBTRUNfSVJRLCBJUFNFQ19JUFJfQUREUiwgSVBTRUNfSVBSX1BPUywgSVBTRUNfUFJJT1JJVFkpOworCisJLyogRURNQUMgKi8KKwltYWtlX2lwcl9pcnEoRURNQUMwX0lSUSwgRURNQUMwX0lQUl9BRERSLCBFRE1BQzBfSVBSX1BPUywKKwkJCUVETUFDMF9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKEVETUFDMV9JUlEsIEVETUFDMV9JUFJfQUREUiwgRURNQUMxX0lQUl9QT1MsCisJCQlFRE1BQzFfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShFRE1BQzJfSVJRLCBFRE1BQzJfSVBSX0FERFIsIEVETUFDMl9JUFJfUE9TLAorCQkJRURNQUMyX1BSSU9SSVRZKTsKKworCS8qIFNJT0YwICovCisJbWFrZV9pcHJfaXJxKFNJT0YwX0VSSV9JUlEsIFNJT0YwX0lQUl9BRERSLCBTSU9GMF9JUFJfUE9TLAorCQkJU0lPRjBfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShTSU9GMF9UWElfSVJRLCBTSU9GMF9JUFJfQUREUiwgU0lPRjBfSVBSX1BPUywKKwkJCVNJT0YwX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoU0lPRjBfUlhJX0lSUSwgU0lPRjBfSVBSX0FERFIsIFNJT0YwX0lQUl9QT1MsCisJCQlTSU9GMF9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKFNJT0YwX0NDSV9JUlEsIFNJT0YwX0lQUl9BRERSLCBTSU9GMF9JUFJfUE9TLAorCQkJU0lPRjBfUFJJT1JJVFkpOworCisJLyogU0lPRjEgKi8KKwltYWtlX2lwcl9pcnEoU0lPRjFfRVJJX0lSUSwgU0lPRjFfSVBSX0FERFIsIFNJT0YxX0lQUl9QT1MsCisJCQlTSU9GMV9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKFNJT0YxX1RYSV9JUlEsIFNJT0YxX0lQUl9BRERSLCBTSU9GMV9JUFJfUE9TLAorCQkJU0lPRjFfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShTSU9GMV9SWElfSVJRLCBTSU9GMV9JUFJfQUREUiwgU0lPRjFfSVBSX1BPUywKKwkJCVNJT0YxX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoU0lPRjFfQ0NJX0lSUSwgU0lPRjFfSVBSX0FERFIsIFNJT0YxX0lQUl9QT1MsCisJCQlTSU9GMV9QUklPUklUWSk7CisKKwkvKiBTTElDIElSUSdzICovCisJbWFrZV9pcHJfaXJxKElSUTFfSVJRLCBJUlExX0lQUl9BRERSLCBJUlExX0lQUl9QT1MsIElSUTFfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShJUlEyX0lSUSwgSVJRMl9JUFJfQUREUiwgSVJRMl9JUFJfUE9TLCBJUlEyX1BSSU9SSVRZKTsKK30KKworLyoKKyAqIFRoZSBNYWNoaW5lIFZlY3RvcgorICovCitzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2g3NzEwdm9pcGd3IF9faW5pdG12ID0geworCS5tdl9uYW1lCQk9ICJTSDc3MTAgVm9JUCBHYXRld2F5IiwKKwkubXZfbnJfaXJxcwkJPSAxMDQsCisJLm12X2luaXRfaXJxCQk9IHNoNzcxMHZvaXBnd19pbml0X2lycSwKK307CitBTElBU19NVihzaDc3MTB2b2lwZ3cpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3N5c3RlbWgvaW8uYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9pby5jCmluZGV4IGNmOTc5MDEuLmNkZTZlNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9pby5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9pby5jCkBAIC01LDY2ICs1LDI1IEBACiAgKiBCYXNlZCBsYXJnZWx5IG9uIGlvX3NlLmMuCiAgKgogICogSS9PIHJvdXRpbmUgZm9yIEhpdGFjaGkgNzc1MSBTeXN0ZW1oLgotICoKICAqLwotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtaC83NzUxc3lzdGVtaC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW1oNzc1MS5oPgogI2luY2x1ZGUgPGFzbS9hZGRyc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgIi4uLy4uL2RyaXZlcnMvcGNpL3BjaS1zaDc3NTEuaCIKLQotLyoKLSAqIFRoZSA3NzUxIFN5c3RlbUggRW5naW5lIHVzZXMgdGhlIGJ1aWx0LWluIFBDSSBjb250cm9sbGVyIChQQ0lDKQotICogb2YgdGhlIDc3NTEgcHJvY2Vzc29yLCBhbmQgaGFzIGEgU3VwZXJJTyBhY2Nlc3NpYmxlIG9uIGl0cyBtZW1vcnkKLSAqIGJ1cy4KLSAqLwotCi0jZGVmaW5lIFBDSUlPQlIJCSh2b2xhdGlsZSBsb25nICopUENJX1JFRyhTSDc3NTFfUENJSU9CUikKLSNkZWZpbmUgUENJTUJSICAgICAgICAgICh2b2xhdGlsZSBsb25nICopUENJX1JFRyhTSDc3NTFfUENJTUJSKQotI2RlZmluZSBQQ0lfSU9fQVJFQQlTSDc3NTFfUENJX0lPX0JBU0UKLSNkZWZpbmUgUENJX01FTV9BUkVBCVNINzc1MV9QQ0lfQ09ORklHX0JBU0UKLQotI2RlZmluZSBQQ0lfSU9NQVAoYWRyKQkoUENJX0lPX0FSRUEgKyAoYWRyICYgflNINzc1MV9QQ0lJT0JSX01BU0spKQogI2RlZmluZSBFVEhFUl9JT01BUChhZHIpICgweEIzMDAwMDAwICsgKGFkcikpIC8qbWFwIHRvIDE2Yml0cyBhY2Nlc3MgYXJlYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Ygc21jIGxhbiBjaGlwKi8KLQotI2RlZmluZSBtYXliZWJhZGlvKG5hbWUscG9ydCkgXAotICBwcmludGsoImJhZCBQQy1saWtlIGlvICVzIGZvciBwb3J0IDB4JWx4IGF0IDB4JTA4eFxuIiwgXAotCSAjbmFtZSwgKHBvcnQpLCAoX191MzIpIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSkKLQotc3RhdGljIGlubGluZSB2b2lkIGRlbGF5KHZvaWQpCi17Ci0JY3RybF9pbncoMHhhMDAwMDAwMCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9sYXRpbGUgX191MTYgKgogcG9ydDJhZHIodW5zaWduZWQgaW50IHBvcnQpCiB7CiAJaWYgKHBvcnQgPj0gMHgyMDAwKQogCQlyZXR1cm4gKHZvbGF0aWxlIF9fdTE2ICopIChQQV9NUlNIUEMgKyAocG9ydCAtIDB4MjAwMCkpOwotI2lmIDAKLQllbHNlCi0JCXJldHVybiAodm9sYXRpbGUgX191MTYgKikgKFBBX1NVUEVSSU8gKyAocG9ydCA8PCAxKSk7Ci0jZW5kaWYKLQltYXliZWJhZGlvKG5hbWUsKHVuc2lnbmVkIGxvbmcpcG9ydCk7CisJbWF5YmViYWRpbygodW5zaWduZWQgbG9uZylwb3J0KTsKIAlyZXR1cm4gKHZvbGF0aWxlIF9fdTE2Kilwb3J0OwogfQogCi0vKiBJbiBjYXNlIHNvbWVvbmUgY29uZmlndXJlcyB0aGUga2VybmVsIHcvbyBQQ0kgc3VwcG9ydDogaW4gdGhhdCAqLwotLyogc2NlbmFyaW8sIGRvbid0IGV2ZXIgYm90aGVyIHRvIGNoZWNrIGZvciBQQ0ktd2luZG93IGFkZHJlc3NlcyAqLwotCi0vKiBOT1RFOiBXSU5ET1cgQ0hFQ0sgTUFZIEJFIEEgQklUIE9GRiwgSElHSCBQQ0lCSU9TX01JTl9JTyBXUkFQUz8gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpCi0jZGVmaW5lIENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSBcCi0gICgocG9ydCA+PSBQQ0lCSU9TX01JTl9JTykgJiYgKHBvcnQgPCAoUENJQklPU19NSU5fSU8gKyBTSDc3NTFfUENJX0lPX1NJWkUpKSkKLSNlbHNlCi0jZGVmaW5lIENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSAoMCkKLSNlbmRpZgotCiAvKgogICogR2VuZXJhbCBvdXRsaW5lOiByZW1hcCByZWFsbHkgbG93IHN0dWZmIFtldmVudHVhbGx5XSB0byBTdXBlcklPLAogICogc3R1ZmYgaW4gUENJIElPIHNwYWNlIChhdCBvciBhYm92ZSB3aW5kb3cgYXQgcGNpLmg6UENJQklPU19NSU5fSU8pCkBAIC03Niw4ICszNSw4IEBACiB7CiAJaWYgKFBYU0VHKHBvcnQpKQogCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydDsKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkpCi0JCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilQQ0lfSU9NQVAocG9ydCk7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKwkJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBjaV9pb2FkZHIocG9ydCk7CiAJZWxzZSBpZiAocG9ydCA8PSAweDNGMSkKIAkJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKUVUSEVSX0lPTUFQKHBvcnQpOwogCWVsc2UKQEAgLTkwLDEzICs0OSwxMyBAQAogCiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKICAgICAgICAgICAgICAgICB2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydDsKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkpCi0gICAgICAgICAgICAgICAgdiA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKVBDSV9JT01BUChwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQorICAgICAgICAgICAgICAgIHYgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwY2lfaW9hZGRyKHBvcnQpOwogCWVsc2UgaWYgKHBvcnQgPD0gMHgzRjEpCiAJCXYgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilFVEhFUl9JT01BUChwb3J0KTsKIAllbHNlCiAJCXYgPSAoKnBvcnQyYWRyKHBvcnQpKSYweGZmOwotCWRlbGF5KCk7CisJY3RybF9kZWxheSgpOwogCXJldHVybiB2OwogfQogCkBAIC0xMDQsMTQgKzYzLDE0IEBACiB7CiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKICAgICAgICAgICAgICAgICByZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQ7Ci0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpKQotICAgICAgICAgICAgICAgIHJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopUENJX0lPTUFQKHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwY2lfaW9hZGRyKHBvcnQpOwogCWVsc2UgaWYgKHBvcnQgPj0gMHgyMDAwKQogCQlyZXR1cm4gKnBvcnQyYWRyKHBvcnQpOwogCWVsc2UgaWYgKHBvcnQgPD0gMHgzRjEpCiAJCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKUVUSEVSX0lPTUFQKHBvcnQpOwogCWVsc2UKLQkJbWF5YmViYWRpbyhpbncsIHBvcnQpOworCQltYXliZWJhZGlvKHBvcnQpOwogCXJldHVybiAwOwogfQogCkBAIC0xMTksMTQgKzc4LDE0IEBACiB7CiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKICAgICAgICAgICAgICAgICByZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopcG9ydDsKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopUENJX0lPTUFQKHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlIGlmIChwb3J0ID49IDB4MjAwMCkKIAkJcmV0dXJuICpwb3J0MmFkcihwb3J0KTsKIAllbHNlIGlmIChwb3J0IDw9IDB4M0YxKQogCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKilFVEhFUl9JT01BUChwb3J0KTsKIAllbHNlCi0JCW1heWJlYmFkaW8oaW5sLCBwb3J0KTsKKwkJbWF5YmViYWRpbyhwb3J0KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM1LDggKzk0LDggQEAKIAogICAgICAgICBpZiAoUFhTRUcocG9ydCkpCiAgICAgICAgICAgICAgICAgKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydCA9IHZhbHVlOwotCWVsc2UgaWYgKENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSkKLSAgICAgICAgCSooKHVuc2lnbmVkIGNoYXIqKVBDSV9JT01BUChwb3J0KSkgPSB2YWx1ZTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQorCQkqKCh1bnNpZ25lZCBjaGFyKilwY2lfaW9hZGRyKHBvcnQpKSA9IHZhbHVlOwogCWVsc2UgaWYgKHBvcnQgPD0gMHgzRjEpCiAJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKUVUSEVSX0lPTUFQKHBvcnQpID0gdmFsdWU7CiAJZWxzZQpAQCAtMTQ3LDM3ICsxMDYsMzcgQEAKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBvcnQgPSB2YWx1ZTsKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkpCi0gICAgICAgIAkqKCh1bnNpZ25lZCBjaGFyKilQQ0lfSU9NQVAocG9ydCkpID0gdmFsdWU7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKwkJKigodW5zaWduZWQgY2hhciopcGNpX2lvYWRkcihwb3J0KSkgPSB2YWx1ZTsKIAllbHNlIGlmIChwb3J0IDw9IDB4M0YxKQogCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilFVEhFUl9JT01BUChwb3J0KSA9IHZhbHVlOwogCWVsc2UKIAkJKihwb3J0MmFkcihwb3J0KSkgPSB2YWx1ZTsKLQlkZWxheSgpOworCWN0cmxfZGVsYXkoKTsKIH0KIAogdm9pZCBzaDc3NTFzeXN0ZW1oX291dHcodW5zaWduZWQgc2hvcnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ID0gdmFsdWU7Ci0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpKQotICAgICAgICAJKigodW5zaWduZWQgc2hvcnQgKilQQ0lfSU9NQVAocG9ydCkpID0gdmFsdWU7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKwkJKigodW5zaWduZWQgc2hvcnQgKilwY2lfaW9hZGRyKHBvcnQpKSA9IHZhbHVlOwogCWVsc2UgaWYgKHBvcnQgPj0gMHgyMDAwKQogCQkqcG9ydDJhZHIocG9ydCkgPSB2YWx1ZTsKIAllbHNlIGlmIChwb3J0IDw9IDB4M0YxKQogCQkqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopRVRIRVJfSU9NQVAocG9ydCkgPSB2YWx1ZTsKIAllbHNlCi0JCW1heWJlYmFkaW8ob3V0dywgcG9ydCk7CisJCW1heWJlYmFkaW8ocG9ydCk7CiB9CiAKIHZvaWQgc2g3NzUxc3lzdGVtaF9vdXRsKHVuc2lnbmVkIGludCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQogewogICAgICAgICBpZiAoUFhTRUcocG9ydCkpCiAgICAgICAgICAgICAgICAgKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopcG9ydCA9IHZhbHVlOwotCWVsc2UgaWYgKENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSkKLSAgICAgICAgCSooKHVuc2lnbmVkIGxvbmcqKVBDSV9JT01BUChwb3J0KSkgPSB2YWx1ZTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQorCQkqKCh1bnNpZ25lZCBsb25nKilwY2lfaW9hZGRyKHBvcnQpKSA9IHZhbHVlOwogCWVsc2UKLQkJbWF5YmViYWRpbyhvdXRsLCBwb3J0KTsKKwkJbWF5YmViYWRpbyhwb3J0KTsKIH0KIAogdm9pZCBzaDc3NTFzeXN0ZW1oX2luc2IodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQpAQCAtMTk0LDcgKzE1Myw3IEBACiAKIHZvaWQgc2g3NzUxc3lzdGVtaF9pbnNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQltYXliZWJhZGlvKGluc2wsIHBvcnQpOworCW1heWJlYmFkaW8ocG9ydCk7CiB9CiAKIHZvaWQgc2g3NzUxc3lzdGVtaF9vdXRzYih1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCkBAIC0yMTEsNzMgKzE3MCw1IEBACiAKIHZvaWQgc2g3NzUxc3lzdGVtaF9vdXRzbCh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JbWF5YmViYWRpbyhvdXRzdywgcG9ydCk7Ci19Ci0KLS8qIEZvciByZWFkL3dyaXRlIGNhbGxzLCBqdXN0IGNvcHkgZ2VuZXJpYyAocGFzcy10aHJ1KTsgUENJTUJSIGlzICAqLwotLyogYWxyZWFkeSBzZXQgdXAuICBGb3IgYSBsYXJnZXIgbWVtb3J5IHNwYWNlLCB0aGVzZSB3b3VsZCBuZWVkIHRvICovCi0vKiByZXNldCBQQ0lNQlIgYXMgbmVlZGVkIG9uIGEgcGVyLWNhbGwgYmFzaXMuLi4gICAgICAgICAgICAgICAgICAgKi8KLQotdW5zaWduZWQgY2hhciBzaDc3NTFzeXN0ZW1oX3JlYWRiKHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKilhZGRyOwotfQotCi11bnNpZ25lZCBzaG9ydCBzaDc3NTFzeXN0ZW1oX3JlYWR3KHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopYWRkcjsKLX0KLQotdW5zaWduZWQgaW50IHNoNzc1MXN5c3RlbWhfcmVhZGwodW5zaWduZWQgbG9uZyBhZGRyKQotewotCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcqKWFkZHI7Ci19Ci0KLXZvaWQgc2g3NzUxc3lzdGVtaF93cml0ZWIodW5zaWduZWQgY2hhciBiLCB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKilhZGRyID0gYjsKLX0KLQotdm9pZCBzaDc3NTFzeXN0ZW1oX3dyaXRldyh1bnNpZ25lZCBzaG9ydCBiLCB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopYWRkciA9IGI7Ci19Ci0KLXZvaWQgc2g3NzUxc3lzdGVtaF93cml0ZWwodW5zaWduZWQgaW50IGIsIHVuc2lnbmVkIGxvbmcgYWRkcikKLXsKLSAgICAgICAgKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nKilhZGRyID0gYjsKLX0KLQotDAotCi0vKiBNYXAgSVNBIGJ1cyBhZGRyZXNzIHRvIHRoZSByZWFsIGFkZHJlc3MuIE9ubHkgZm9yIFBDTUNJQS4gICovCi0KLS8qIElTQSBwYWdlIGRlc2NyaXB0b3IuICAqLwotc3RhdGljIF9fdTMyIHNoX2lzYV9tZW1tYXBbMjU2XTsKLQotI2lmIDAKLXN0YXRpYyBpbnQKLXNoX2lzYV9tbWFwKF9fdTMyIHN0YXJ0LCBfX3UzMiBsZW5ndGgsIF9fdTMyIG9mZnNldCkKLXsKLQlpbnQgaWR4OwotCi0JaWYgKHN0YXJ0ID49IDB4MTAwMDAwIHx8IChzdGFydCAmIDB4ZmZmKSB8fCAobGVuZ3RoICE9IDB4MTAwMCkpCi0JCXJldHVybiAtMTsKLQotCWlkeCA9IHN0YXJ0ID4+IDEyOwotCXNoX2lzYV9tZW1tYXBbaWR4XSA9IDB4YjgwMDAwMDAgKyAob2Zmc2V0ICZ+IDB4ZmZmKTsKLQlwcmludGsoInNoX2lzYV9tbWFwOiBzdGFydCAleCBsZW4gJXggb2Zmc2V0ICV4IChpZHggJXggcGFkZHIgJXgpXG4iLAotCSAgICAgICBzdGFydCwgbGVuZ3RoLCBvZmZzZXQsIGlkeCwgc2hfaXNhX21lbW1hcFtpZHhdKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCi11bnNpZ25lZCBsb25nCi1zaDc3NTFzeXN0ZW1oX2lzYV9wb3J0MmFkZHIodW5zaWduZWQgbG9uZyBvZmZzZXQpCi17Ci0JaW50IGlkeDsKLQotCWlkeCA9IChvZmZzZXQgPj4gMTIpICYgMHhmZjsKLQlvZmZzZXQgJj0gMHhmZmY7Ci0JcmV0dXJuIHNoX2lzYV9tZW1tYXBbaWR4XSArIG9mZnNldDsKKwltYXliZWJhZGlvKHBvcnQpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zeXN0ZW1oL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zeXN0ZW1oL2lycS5jCmluZGV4IDgzNzJkOTYuLjhkMDE2ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9pcnEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3N5c3RlbWgvaXJxLmMKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oZHJlZy5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9tYWNoLzc3NTFzeXN0ZW1oLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbWg3NzUxLmg+CiAjaW5jbHVkZSA8YXNtL3NtYzM3YzkzeC5oPgogCiAvKiBhZGRyZXNzIG9mIGV4dGVybmFsIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyCkBAIC01NywxMiArNTcsOSBAQAogc3RhdGljIHZvaWQgZGlzYWJsZV9zeXN0ZW1oX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmIChzeXN0ZW1oX2lycV9tYXNrX3JlZ2lzdGVyKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCXVuc2lnbmVkIGxvbmcgdmFsLCBtYXNrID0gMHgwMSA8PCAxOwogCiAJCS8qIENsZWFyIHRoZSAiaXJxInRoIGJpdCBpbiB0aGUgbWFzayBhbmQgc2V0IGl0IGluIHRoZSByZXF1ZXN0ICovCi0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQogCQl2YWwgPSBjdHJsX2lubCgodW5zaWduZWQgbG9uZylzeXN0ZW1oX2lycV9tYXNrX3JlZ2lzdGVyKTsKIAkJdmFsICY9IH5tYXNrOwogCQljdHJsX291dGwodmFsLCAodW5zaWduZWQgbG9uZylzeXN0ZW1oX2lycV9tYXNrX3JlZ2lzdGVyKTsKQEAgLTcwLDIzICs2NywxOCBAQAogCQl2YWwgPSBjdHJsX2lubCgodW5zaWduZWQgbG9uZylzeXN0ZW1oX2lycV9yZXF1ZXN0X3JlZ2lzdGVyKTsKIAkJdmFsIHw9IG1hc2s7CiAJCWN0cmxfb3V0bCh2YWwsICh1bnNpZ25lZCBsb25nKXN5c3RlbWhfaXJxX3JlcXVlc3RfcmVnaXN0ZXIpOwotCi0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9zeXN0ZW1oX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmIChzeXN0ZW1oX2lycV9tYXNrX3JlZ2lzdGVyKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCXVuc2lnbmVkIGxvbmcgdmFsLCBtYXNrID0gMHgwMSA8PCAxOwogCiAJCS8qIFNldCAiaXJxInRoIGJpdCBpbiB0aGUgbWFzayByZWdpc3RlciAqLwotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCXZhbCA9IGN0cmxfaW5sKCh1bnNpZ25lZCBsb25nKXN5c3RlbWhfaXJxX21hc2tfcmVnaXN0ZXIpOwogCQl2YWwgfD0gbWFzazsKIAkJY3RybF9vdXRsKHZhbCwgKHVuc2lnbmVkIGxvbmcpc3lzdGVtaF9pcnFfbWFza19yZWdpc3Rlcik7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvc3lzdGVtaC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zeXN0ZW1oL3NldHVwLmMKaW5kZXggODI2ZmEzZC4uYTg0NjdiZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zeXN0ZW1oL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9zeXN0ZW1oL3NldHVwLmMKQEAgLTE1LDI4ICsxNSwyMSBAQAogICogZm9yIG1vcmUgZGV0YWlscy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC83NzUxc3lzdGVtaC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtaDc3NTEuaD4KIAogZXh0ZXJuIHZvaWQgbWFrZV9zeXN0ZW1oX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIAotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICI3NzUxIFN5c3RlbUgiOwotfQotCiAvKgogICogSW5pdGlhbGl6ZSBJUlEgc2V0dGluZwogICovCi12b2lkIF9faW5pdCBpbml0Xzc3NTFzeXN0ZW1oX0lSUSh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IHNoNzc1MXN5c3RlbWhfaW5pdF9pcnEodm9pZCkKIHsKLS8qICAJbWFrZV9pcHJfaXJxKDEwLCBCQ1JfSUxDUkQsIDEsIDB4MGYtMTApOyBMQU4gKi8KLS8qICAJbWFrZV9pcHJfaXJxKDE0LCBCQ1JfSUxDUkEsIDIsIDB4MGYtNCk7ICovCiAJbWFrZV9zeXN0ZW1oX2lycSgweGIpOwkvKiBFdGhlcm5ldCBpbnRlcnJ1cHQgKi8KIH0KIAogc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12Xzc3NTFzeXN0ZW1oIF9faW5pdG12ID0geworCS5tdl9uYW1lCQk9ICI3NzUxIFN5c3RlbUgiLAogCS5tdl9ucl9pcnFzCQk9IDcyLAogCiAJLm12X2luYgkJCT0gc2g3NzUxc3lzdGVtaF9pbmIsCkBAIC02MCwyMSArNTMsNiBAQAogCS5tdl9vdXRzdwkJPSBzaDc3NTFzeXN0ZW1oX291dHN3LAogCS5tdl9vdXRzbAkJPSBzaDc3NTFzeXN0ZW1oX291dHNsLAogCi0JLm12X3JlYWRiCQk9IHNoNzc1MXN5c3RlbWhfcmVhZGIsCi0JLm12X3JlYWR3CQk9IHNoNzc1MXN5c3RlbWhfcmVhZHcsCi0JLm12X3JlYWRsCQk9IHNoNzc1MXN5c3RlbWhfcmVhZGwsCi0JLm12X3dyaXRlYgkJPSBzaDc3NTFzeXN0ZW1oX3dyaXRlYiwKLQkubXZfd3JpdGV3CQk9IHNoNzc1MXN5c3RlbWhfd3JpdGV3LAotCS5tdl93cml0ZWwJCT0gc2g3NzUxc3lzdGVtaF93cml0ZWwsCi0KLQkubXZfaXNhX3BvcnQyYWRkcgk9IHNoNzc1MXN5c3RlbWhfaXNhX3BvcnQyYWRkciwKLQotCS5tdl9pbml0X2lycQkJPSBpbml0Xzc3NTFzeXN0ZW1oX0lSUSwKKwkubXZfaW5pdF9pcnEJCT0gc2g3NzUxc3lzdGVtX2luaXRfaXJxLAogfTsKIEFMSUFTX01WKDc3NTFzeXN0ZW1oKQotCi1pbnQgX19pbml0IHBsYXRmb3JtX3NldHVwKHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2F0dXJuL3NldHVwLmMKaW5kZXggYmVhNmM1NzIuLmEzYTM3YzkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NhdHVybi9zZXR1cC5jCkBAIC05LDIyICs5LDE3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2lvLmg+CiAKIGV4dGVybiBpbnQgc2F0dXJuX2lycV9kZW11eChpbnQgaXJxX25yKTsKIAotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICJTZWdhIFNhdHVybiI7Ci19Ci0KIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwogc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NhdHVybiBfX2luaXRtdiA9IHsKKwkubXZfbmFtZQkJPSAiU2VnYSBTYXR1cm4iLAogCS5tdl9ucl9pcnFzCQk9IDgwLAkvKiBGaXggdGhpcyBsYXRlciAqLwogCiAJLm12X2lzYV9wb3J0MmFkZHIJPSBzYXR1cm5faXNhX3BvcnQyYWRkciwKQEAgLTMzLDExICsyOCw0IEBACiAJLm12X2lvcmVtYXAJCT0gc2F0dXJuX2lvcmVtYXAsCiAJLm12X2lvdW5tYXAJCT0gc2F0dXJuX2lvdW5tYXAsCiB9OwotCiBBTElBU19NVihzYXR1cm4pCi0KLWludCBfX2luaXQgcGxhdGZvcm1fc2V0dXAodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9pby5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9pby5jCmluZGV4IGY0NDlhOTQuLjhhMDNkN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvaW8uYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL2lvLmMKQEAgLTksOCArOSw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL3NlNzMwMC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9zZTczMDAuaD4KIAogI2RlZmluZSBiYWRpbyhmbiwgYSkgcGFuaWMoImJhZCBpL28gb3BlcmF0aW9uICVzIGZvciAlMDhseC4iLCAjZm4sIGEpCiAKQEAgLTk5LDYgKzk5LDcgQEAKIAliYWRpbyhpbncsIHBvcnQpOwogfQogCisjaWZkZWYgQ09ORklHX1NNQzkxWAogLyogTVNUTEFORVgwMSBMQU4gYXQgMHhiNDAwOjAwMDAgKi8KIHN0YXRpYyBzdHJ1Y3QgaW9wIGxhbmlvcCA9IHsKIAkuc3RhcnQgPSAweDMwMCwKQEAgLTExMCw2ICsxMTEsNyBAQAogCS5vdXRiID0gc2ltcGxlX291dGIsCiAJLm91dHcgPSBzaW1wbGVfb3V0dywKIH07CisjZW5kaWYKIAogLyogTkUyMDAwIHBjIGNhcmQgTklDICovCiBzdGF0aWMgc3RydWN0IGlvcCBuZWlvcCA9IHsKQEAgLTEyMyw2ICsxMjUsNyBAQAogCS5vdXR3ID0gc2ltcGxlX291dHcsCiB9OwogCisjaWZkZWYgQ09ORklHX0lERQogLyogQ0YgaW4gQ0Ygc2xvdCAqLwogc3RhdGljIHN0cnVjdCBpb3AgY2Zpb3AgPSB7CiAJLmJhc2UgPSAweGIwNjAwMDAwLApAQCAtMTMyLDEyICsxMzUsMTMgQEAKIAkub3V0YiA9IHBjY19vdXRiLAogCS5vdXR3ID0gc2ltcGxlX291dHcsCiB9OworI2VuZGlmCiAKIHN0YXRpYyBfX2lubGluZV9fIHN0cnVjdCBpb3AgKgogcG9ydDJpb3AodW5zaWduZWQgbG9uZyBwb3J0KQogewogCWlmICgwKSA7Ci0jaWYgZGVmaW5lZChDT05GSUdfU01DOTExMTEpCisjaWYgZGVmaW5lZChDT05GSUdfU01DOTFYKQogCWVsc2UgaWYgKGxhbmlvcC5jaGVjaygmbGFuaW9wLCBwb3J0KSkKIAkJcmV0dXJuICZsYW5pb3A7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL2lycS5jCmluZGV4IDIxNmE3OGQuLmFkMTAzNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9pcnEuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9zZTczMDAuaD4KKyNpbmNsdWRlIDxhc20vc2U3MzAwLmg+CiAKIC8qCiAgKiBJbml0aWFsaXplIElSUSBzZXR0aW5nCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL2xlZC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9sZWQuYwppbmRleCBhZDUxZjBhLi40ZDAzYmI3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL2xlZC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvbGVkLmMKQEAgLTEyLDI0ICsxMiwxMCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL3NlNzMwMC5oPgotCi1zdGF0aWMgdm9pZAotbWFjaF9sZWQoaW50IHBvc2l0aW9uLCBpbnQgdmFsdWUpCi17Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikgUEFfTEVEOwotCi0JaWYgKHZhbHVlKSB7Ci0JCSpwIHw9ICgxIDw8IDgpOwotCX0gZWxzZSB7Ci0JCSpwICY9IH4oMSA8PCA4KTsKLQl9Ci19Ci0KKyNpbmNsdWRlIDxhc20vc2U3MzAwLmg+CiAKIC8qIEN5Y2xlIHRoZSBMRUQncyBpbiB0aGUgY2xhc2ljIEtuaWdodHJpZGVyL1N1biBwYXR0ZXJuICovCi12b2lkCi1oZWFydGJlYXRfNzMwMHNlKHZvaWQpCit2b2lkIGhlYXJ0YmVhdF83MzAwc2Uodm9pZCkKIHsKIAlzdGF0aWMgdW5zaWduZWQgaW50IGNudCA9IDAsIHBlcmlvZCA9IDA7CiAJdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikgUEFfTEVEOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9zZXR1cC5jCmluZGV4IGViY2Q5OGQuLjZmMDgyYTcyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9zZXR1cC5jCkBAIC05LDIzICs5LDE2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlY19pbml0Lmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvaW8uaD4KKyNpbmNsdWRlIDxhc20vc2U3MzAwLmg+CiAKIHZvaWQgaGVhcnRiZWF0XzczMDBzZSh2b2lkKTsKIHZvaWQgaW5pdF83MzAwc2VfSVJRKHZvaWQpOwogCi1jb25zdCBjaGFyICoKLWdldF9zeXN0ZW1fdHlwZSh2b2lkKQotewotCXJldHVybiAiU29sdXRpb25FbmdpbmUgNzMwMCI7Ci19Ci0KIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotCiBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzMwMHNlIF9faW5pdG12ID0geworCS5tdl9uYW1lID0gIlNvbHV0aW9uRW5naW5lIDczMDAiLAogCS5tdl9ucl9pcnFzID0gMTA5LAogCS5tdl9pbmIgPSBzaDczMDBzZV9pbmIsCiAJLm12X2ludyA9IHNoNzMwMHNlX2ludywKQEAgLTUzLDEzICs0Niw0IEBACiAJLm12X2hlYXJ0YmVhdCA9IGhlYXJ0YmVhdF83MzAwc2UsCiAjZW5kaWYKIH07Ci0KIEFMSUFTX01WKDczMDBzZSkKLS8qCi0gKiBJbml0aWFsaXplIHRoZSBib2FyZAotICovCi12b2lkIF9faW5pdAotcGxhdGZvcm1fc2V0dXAodm9pZCkKLXsKLQotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvaW8uYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL2lvLmMKaW5kZXggNzU1ZGY1YS4uNzI3MTU1NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvaW8uYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9pby5jCkBAIC05OSw2ICs5OSw3IEBACiAJYmFkaW8oaW53LCBwb3J0KTsKIH0KIAorI2lmZGVmIENPTkZJR19TTUM5MVgKIC8qIE1TVExBTkVYMDEgTEFOIGF0IDB4YjQwMDowMDAwICovCiBzdGF0aWMgc3RydWN0IGlvcCBsYW5pb3AgPSB7CiAJLnN0YXJ0ID0gMHgzMDAsCkBAIC0xMTAsNiArMTExLDcgQEAKIAkub3V0YiA9IHNpbXBsZV9vdXRiLAogCS5vdXR3ID0gc2ltcGxlX291dHcsCiB9OworI2VuZGlmCiAKIC8qIE5FMjAwMCBwYyBjYXJkIE5JQyAqLwogc3RhdGljIHN0cnVjdCBpb3AgbmVpb3AgPSB7CkBAIC0xMjMsNiArMTI1LDcgQEAKIAkub3V0dyA9IHNpbXBsZV9vdXR3LAogfTsKIAorI2lmZGVmIENPTkZJR19JREUKIC8qIENGIGluIENGIHNsb3QgKi8KIHN0YXRpYyBzdHJ1Y3QgaW9wIGNmaW9wID0gewogCS5iYXNlID0gMHhiMDYwMDAwMCwKQEAgLTEzMiwxMiArMTM1LDEzIEBACiAJLm91dGIgPSBwY2Nfb3V0YiwKIAkub3V0dyA9IHNpbXBsZV9vdXR3LAogfTsKKyNlbmRpZgogCiBzdGF0aWMgX19pbmxpbmVfXyBzdHJ1Y3QgaW9wICoKIHBvcnQyaW9wKHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAlpZiAoMCkgOwotI2lmIGRlZmluZWQoQ09ORklHX1NNQzkxMTExKQorI2lmIGRlZmluZWQoQ09ORklHX1NNQzkxWCkKIAllbHNlIGlmIChsYW5pb3AuY2hlY2soJmxhbmlvcCwgcG9ydCkpCiAJCXJldHVybiAmbGFuaW9wOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL2lycS5jCmluZGV4IDQzNDRkMGUuLjJjNjJiOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL2lycS5jCkBAIC03LDcgKzcsNiBAQAogICogTW9kaWZpZWQgZm9yIFNILU1vYmlsZSBTb2x1dGlvbkVuZ2luZSA3MzE4MCBTdXBwb3J0CiAgKiAgICAgICAgICAgICAgYnkgWU9TSElJIFRha2FzaGkgPHlvc2hpaS10YWthc2hpQGhpdGFjaGktdWwuY28uanA+CiAgKgotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTcsMTQgKzE2LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9zZTczMTgwLmg+CiAKIHN0YXRpYyBpbnQKLWludHJlcTJpcnEoaW50IGkpCi17Ci0JaWYgKGkgPT0gNSkKLQkJcmV0dXJuIDEwOwotCXJldHVybiAzMiArIDcgLSBpOwotfQotCi1zdGF0aWMgaW50CiBpcnEyaW50cmVxKGludCBpcnEpCiB7CiAJaWYgKGlycSA9PSAxMCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL2xlZC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvbGVkLmMKaW5kZXggNjEwNDM5Zi4uNGI3MmU5YSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvbGVkLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvbGVkLmMKQEAgLTE0LDIxICsxNCw4IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9zZTczMTgwLmg+CiAKLXN0YXRpYyB2b2lkCi1tYWNoX2xlZChpbnQgcG9zaXRpb24sIGludCB2YWx1ZSkKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSBQQV9MRUQ7Ci0KLQlpZiAodmFsdWUpIHsKLQkJKnAgfD0gKDEgPDwgTEVEX1NISUZUKTsKLQl9IGVsc2UgewotCQkqcCAmPSB+KDEgPDwgTEVEX1NISUZUKTsKLQl9Ci19Ci0KIC8qIEN5Y2xlIHRoZSBMRUQncyBpbiB0aGUgY2xhc2ljIEtuaWdodHJpZGVyL1N1biBwYXR0ZXJuICovCi12b2lkCi1oZWFydGJlYXRfNzMxODBzZSh2b2lkKQordm9pZCBoZWFydGJlYXRfNzMxODBzZSh2b2lkKQogewogCXN0YXRpYyB1bnNpZ25lZCBpbnQgY250ID0gMCwgcGVyaW9kID0gMDsKIAl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSBQQV9MRUQ7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvc2V0dXAuYwppbmRleCBjZGI3YjVmLi5iMzhlZjUwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL3NldHVwLmMKQEAgLTExLDIzICsxMSwxNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWNfaW5pdC5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NlNzMxODAuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CiAKIHZvaWQgaGVhcnRiZWF0XzczMTgwc2Uodm9pZCk7CiB2b2lkIGluaXRfNzMxODBzZV9JUlEodm9pZCk7CiAKLWNvbnN0IGNoYXIgKgotZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICJTb2x1dGlvbkVuZ2luZSA3MzE4MCI7Ci19Ci0KIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotCiBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfNzMxODBzZSBfX2luaXRtdiA9IHsKKwkubXZfbmFtZSA9ICJTb2x1dGlvbkVuZ2luZSA3MzE4MCIsCiAJLm12X25yX2lycXMgPSAxMDgsCiAJLm12X2luYiA9IHNoNzMxODBzZV9pbmIsCiAJLm12X2ludyA9IHNoNzMxODBzZV9pbncsCkBAIC01MSwxNyArNDUsOSBAQAogCS5tdl9vdXRzbCA9IHNoNzMxODBzZV9vdXRzbCwKIAogCS5tdl9pbml0X2lycSA9IGluaXRfNzMxODBzZV9JUlEsCisJLm12X2lycV9kZW11eCA9IHNobXNlX2lycV9kZW11eCwKICNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCiAJLm12X2hlYXJ0YmVhdCA9IGhlYXJ0YmVhdF83MzE4MHNlLAogI2VuZGlmCiB9OwotCiBBTElBU19NVig3MzE4MHNlKQotLyoKLSAqIEluaXRpYWxpemUgdGhlIGJvYXJkCi0gKi8KLXZvaWQgX19pbml0Ci1wbGF0Zm9ybV9zZXR1cCh2b2lkKQotewotCi19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjkxMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSA3MzQzIFNvbHV0aW9uRW5naW5lIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwKKyMKKworb2JqLXkJIDo9IHNldHVwLm8gaW8ubyBpcnEubworCitvYmotJChDT05GSUdfSEVBUlRCRUFUKSArPSBsZWQubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9pby5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NjY2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL2lvLmMKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBhcmNoL3NoL2JvYXJkcy9zZS83MzQzL2lvLmMKKyAqCisgKiBJL08gcm91dGluZSBmb3IgU0gtTW9iaWxlM0FTIDczNDMgU29sdXRpb25FbmdpbmUuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9zZTczNDMuaD4KKworI2RlZmluZSBiYWRpbyhmbiwgYSkgcGFuaWMoImJhZCBpL28gb3BlcmF0aW9uICVzIGZvciAlMDhseC4iLCAjZm4sIGEpCisKK3N0cnVjdCBpb3AgeworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJc3RydWN0IGlvcCAqKCpjaGVjaykgKHN0cnVjdCBpb3AgKiBwLCB1bnNpZ25lZCBsb25nIHBvcnQpOworCXVuc2lnbmVkIGNoYXIgKCppbmIpIChzdHJ1Y3QgaW9wICogcCwgdW5zaWduZWQgbG9uZyBwb3J0KTsKKwl1bnNpZ25lZCBzaG9ydCAoKmludykgKHN0cnVjdCBpb3AgKiBwLCB1bnNpZ25lZCBsb25nIHBvcnQpOworCXZvaWQgKCpvdXRiKSAoc3RydWN0IGlvcCAqIHAsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7CisJdm9pZCAoKm91dHcpIChzdHJ1Y3QgaW9wICogcCwgdW5zaWduZWQgc2hvcnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Cit9OworCitzdHJ1Y3QgaW9wICoKK3NpbXBsZV9jaGVjayhzdHJ1Y3QgaW9wICpwLCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJc3RhdGljIGludCBjb3VudDsKKworCWlmIChjb3VudCA8IDEwMCkKKwkJY291bnQrKzsKKworCXBvcnQgJj0gMHhGRkZGOworCisJaWYgKChwLT5zdGFydCA8PSBwb3J0KSAmJiAocG9ydCA8PSBwLT5lbmQpKQorCQlyZXR1cm4gcDsKKwllbHNlCisJCWJhZGlvKGNoZWNrLCBwb3J0KTsKK30KKworc3RydWN0IGlvcCAqCitpZGVfY2hlY2soc3RydWN0IGlvcCAqcCwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCWlmICgoKDB4MWYwIDw9IHBvcnQpICYmIChwb3J0IDw9IDB4MWY3KSkgfHwgKHBvcnQgPT0gMHgzZjcpKQorCQlyZXR1cm4gcDsKKwlyZXR1cm4gTlVMTDsKK30KKwordW5zaWduZWQgY2hhcgorc2ltcGxlX2luYihzdHJ1Y3QgaW9wICpwLCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJcmV0dXJuICoodW5zaWduZWQgY2hhciAqKSAocC0+YmFzZSArIHBvcnQpOworfQorCit1bnNpZ25lZCBzaG9ydAorc2ltcGxlX2ludyhzdHJ1Y3QgaW9wICpwLCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJcmV0dXJuICoodW5zaWduZWQgc2hvcnQgKikgKHAtPmJhc2UgKyBwb3J0KTsKK30KKwordm9pZAorc2ltcGxlX291dGIoc3RydWN0IGlvcCAqcCwgdW5zaWduZWQgY2hhciB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCSoodW5zaWduZWQgY2hhciAqKSAocC0+YmFzZSArIHBvcnQpID0gdmFsdWU7Cit9CisKK3ZvaWQKK3NpbXBsZV9vdXR3KHN0cnVjdCBpb3AgKnAsIHVuc2lnbmVkIHNob3J0IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJKih1bnNpZ25lZCBzaG9ydCAqKSAocC0+YmFzZSArIHBvcnQpID0gdmFsdWU7Cit9CisKK3Vuc2lnbmVkIGNoYXIKK3BjY19pbmIoc3RydWN0IGlvcCAqcCwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCXVuc2lnbmVkIGxvbmcgYWRkciA9IHAtPmJhc2UgKyBwb3J0ICsgMHg0MDAwMDsKKwl1bnNpZ25lZCBsb25nIHY7CisKKwlpZiAocG9ydCAmIDEpCisJCWFkZHIgKz0gMHgwMDQwMDAwMDsKKwl2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopIGFkZHI7CisJcmV0dXJuIHY7Cit9CisKK3ZvaWQKK3BjY19vdXRiKHN0cnVjdCBpb3AgKnAsIHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSBwLT5iYXNlICsgcG9ydCArIDB4NDAwMDA7CisKKwlpZiAocG9ydCAmIDEpCisJCWFkZHIgKz0gMHgwMDQwMDAwMDsKKwkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgYWRkciA9IHZhbHVlOworfQorCit1bnNpZ25lZCBjaGFyCitiYWRfaW5iKHN0cnVjdCBpb3AgKnAsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwliYWRpbyhpbmIsIHBvcnQpOworfQorCit2b2lkCitiYWRfb3V0YihzdHJ1Y3QgaW9wICpwLCB1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJYmFkaW8oaW53LCBwb3J0KTsKK30KKworI2lmZGVmIENPTkZJR19TTUM5MVgKKy8qIE1TVExBTkVYMDEgTEFOIGF0IDB4YjQwMDowMDAwICovCitzdGF0aWMgc3RydWN0IGlvcCBsYW5pb3AgPSB7CisJLnN0YXJ0ID0gMHgwMCwKKwkuZW5kID0gMHgwRiwKKwkuYmFzZSA9IDB4MDQwMDAwMDAsCisJLmNoZWNrID0gc2ltcGxlX2NoZWNrLAorCS5pbmIgPSBzaW1wbGVfaW5iLAorCS5pbncgPSBzaW1wbGVfaW53LAorCS5vdXRiID0gc2ltcGxlX291dGIsCisJLm91dHcgPSBzaW1wbGVfb3V0dywKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ORTIwMDAKKy8qIE5FMjAwMCBwYyBjYXJkIE5JQyAqLworc3RhdGljIHN0cnVjdCBpb3AgbmVpb3AgPSB7CisJLnN0YXJ0ID0gMHgyODAsCisJLmVuZCA9IDB4MjlmLAorCS5iYXNlID0gMHhiMDYwMDAwMCArIDB4ODAsCS8qIHNvZnQgMHgyODAgLT4gaGFyZCAweDMwMCAqLworCS5jaGVjayA9IHNpbXBsZV9jaGVjaywKKwkuaW5iID0gcGNjX2luYiwKKwkuaW53ID0gc2ltcGxlX2ludywKKwkub3V0YiA9IHBjY19vdXRiLAorCS5vdXR3ID0gc2ltcGxlX291dHcsCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSURFCisvKiBDRiBpbiBDRiBzbG90ICovCitzdGF0aWMgc3RydWN0IGlvcCBjZmlvcCA9IHsKKwkuYmFzZSA9IDB4YjA2MDAwMDAsCisJLmNoZWNrID0gaWRlX2NoZWNrLAorCS5pbmIgPSBwY2NfaW5iLAorCS5pbncgPSBzaW1wbGVfaW53LAorCS5vdXRiID0gcGNjX291dGIsCisJLm91dHcgPSBzaW1wbGVfb3V0dywKK307CisjZW5kaWYKKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IGlvcCAqCitwb3J0MmlvcCh1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJaWYgKDApIDsKKyNpZiBkZWZpbmVkKENPTkZJR19TTUM5MVgpCisJZWxzZSBpZiAobGFuaW9wLmNoZWNrKCZsYW5pb3AsIHBvcnQpKQorCQlyZXR1cm4gJmxhbmlvcDsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX05FMjAwMCkKKwllbHNlIGlmIChuZWlvcC5jaGVjaygmbmVpb3AsIHBvcnQpKQorCQlyZXR1cm4gJm5laW9wOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfSURFKQorCWVsc2UgaWYgKGNmaW9wLmNoZWNrKCZjZmlvcCwgcG9ydCkpCisJCXJldHVybiAmY2Zpb3A7CisjZW5kaWYKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlbGF5KHZvaWQpCit7CisJY3RybF9pbncoMHhhYzAwMDAwMCk7CisJY3RybF9pbncoMHhhYzAwMDAwMCk7Cit9CisKK3Vuc2lnbmVkIGNoYXIKK3NoNzM0M3NlX2luYih1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJc3RydWN0IGlvcCAqcCA9IHBvcnQyaW9wKHBvcnQpOworCXJldHVybiAocC0+aW5iKSAocCwgcG9ydCk7Cit9CisKK3Vuc2lnbmVkIGNoYXIKK3NoNzM0M3NlX2luYl9wKHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwl1bnNpZ25lZCBjaGFyIHYgPSBzaDczNDNzZV9pbmIocG9ydCk7CisJZGVsYXkoKTsKKwlyZXR1cm4gdjsKK30KKwordW5zaWduZWQgc2hvcnQKK3NoNzM0M3NlX2ludyh1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJc3RydWN0IGlvcCAqcCA9IHBvcnQyaW9wKHBvcnQpOworCXJldHVybiAocC0+aW53KSAocCwgcG9ydCk7Cit9CisKK3Vuc2lnbmVkIGludAorc2g3MzQzc2VfaW5sKHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwliYWRpbyhpbmwsIHBvcnQpOworfQorCit2b2lkCitzaDczNDNzZV9vdXRiKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwlzdHJ1Y3QgaW9wICpwID0gcG9ydDJpb3AocG9ydCk7CisJKHAtPm91dGIpIChwLCB2YWx1ZSwgcG9ydCk7Cit9CisKK3ZvaWQKK3NoNzM0M3NlX291dGJfcCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCit7CisJc2g3MzQzc2Vfb3V0Yih2YWx1ZSwgcG9ydCk7CisJZGVsYXkoKTsKK30KKwordm9pZAorc2g3MzQzc2Vfb3V0dyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworCXN0cnVjdCBpb3AgKnAgPSBwb3J0MmlvcChwb3J0KTsKKwkocC0+b3V0dykgKHAsIHZhbHVlLCBwb3J0KTsKK30KKwordm9pZAorc2g3MzQzc2Vfb3V0bCh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKwliYWRpbyhvdXRsLCBwb3J0KTsKK30KKwordm9pZAorc2g3MzQzc2VfaW5zYih1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJdW5zaWduZWQgY2hhciAqYSA9IGFkZHI7CisJc3RydWN0IGlvcCAqcCA9IHBvcnQyaW9wKHBvcnQpOworCXdoaWxlIChjb3VudC0tKQorCQkqYSsrID0gKHAtPmluYikgKHAsIHBvcnQpOworfQorCit2b2lkCitzaDczNDNzZV9pbnN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwl1bnNpZ25lZCBzaG9ydCAqYSA9IGFkZHI7CisJc3RydWN0IGlvcCAqcCA9IHBvcnQyaW9wKHBvcnQpOworCXdoaWxlIChjb3VudC0tKQorCQkqYSsrID0gKHAtPmludykgKHAsIHBvcnQpOworfQorCit2b2lkCitzaDczNDNzZV9pbnNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwliYWRpbyhpbnNsLCBwb3J0KTsKK30KKwordm9pZAorc2g3MzQzc2Vfb3V0c2IodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCXVuc2lnbmVkIGNoYXIgKmEgPSAodW5zaWduZWQgY2hhciAqKSBhZGRyOworCXN0cnVjdCBpb3AgKnAgPSBwb3J0MmlvcChwb3J0KTsKKwl3aGlsZSAoY291bnQtLSkKKwkJKHAtPm91dGIpIChwLCAqYSsrLCBwb3J0KTsKK30KKwordm9pZAorc2g3MzQzc2Vfb3V0c3codW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCXVuc2lnbmVkIHNob3J0ICphID0gKHVuc2lnbmVkIHNob3J0ICopIGFkZHI7CisJc3RydWN0IGlvcCAqcCA9IHBvcnQyaW9wKHBvcnQpOworCXdoaWxlIChjb3VudC0tKQorCQkocC0+b3V0dykgKHAsICphKyssIHBvcnQpOworfQorCit2b2lkCitzaDczNDNzZV9vdXRzbCh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJYmFkaW8ob3V0c3csIHBvcnQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvaXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxZTNkNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvaXJxLmMKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBhcmNoL3NoL2JvYXJkcy9zZS83MzQzL2lycS5jCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL3NlNzM0My5oPgorCitzdGF0aWMgdm9pZAorZGlzYWJsZV9pbnRyZXFfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaW50IGJpdCA9IGlycSAtIE9GRkNISVBfSVJRX0JBU0U7CisJdTE2IHZhbDsKKworCXZhbCA9IGN0cmxfaW53KFBBX0NQTERfSU1TSyk7CisJdmFsIHw9IDEgPDwgYml0OworCWN0cmxfb3V0dyh2YWwsIFBBX0NQTERfSU1TSyk7Cit9CisKK3N0YXRpYyB2b2lkCitlbmFibGVfaW50cmVxX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBiaXQgPSBpcnEgLSBPRkZDSElQX0lSUV9CQVNFOworCXUxNiB2YWw7CisKKwl2YWwgPSBjdHJsX2ludyhQQV9DUExEX0lNU0spOworCXZhbCAmPSB+KDEgPDwgYml0KTsKKwljdHJsX291dHcodmFsLCBQQV9DUExEX0lNU0spOworfQorCitzdGF0aWMgdm9pZAorbWFza19hbmRfYWNrX2ludHJlcV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlkaXNhYmxlX2ludHJlcV9pcnEoaXJxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorc3RhcnR1cF9pbnRyZXFfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJZW5hYmxlX2ludHJlcV9pcnEoaXJxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3NodXRkb3duX2ludHJlcV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlkaXNhYmxlX2ludHJlcV9pcnEoaXJxKTsKK30KKworc3RhdGljIHZvaWQKK2VuZF9pbnRyZXFfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEIHwgSVJRX0lOUFJPR1JFU1MpKSkKKwkJZW5hYmxlX2ludHJlcV9pcnEoaXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpbnRyZXFfaXJxX3R5cGUgPSB7CisJLnR5cGVuYW1lID0gIkZQR0EtSVJRIiwKKwkuc3RhcnR1cCA9IHN0YXJ0dXBfaW50cmVxX2lycSwKKwkuc2h1dGRvd24gPSBzaHV0ZG93bl9pbnRyZXFfaXJxLAorCS5lbmFibGUgPSBlbmFibGVfaW50cmVxX2lycSwKKwkuZGlzYWJsZSA9IGRpc2FibGVfaW50cmVxX2lycSwKKwkuYWNrID0gbWFza19hbmRfYWNrX2ludHJlcV9pcnEsCisJLmVuZCA9IGVuZF9pbnRyZXFfaXJxCit9OworCitzdGF0aWMgdm9pZAorbWFrZV9pbnRyZXFfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CisJaXJxX2Rlc2NbaXJxXS5oYW5kbGVyID0gJmludHJlcV9pcnFfdHlwZTsKKwlkaXNhYmxlX2ludHJlcV9pcnEoaXJxKTsKK30KKworaW50CitzaG1zZV9pcnFfZGVtdXgoaW50IGlycSkKK3sKKwlpbnQgYml0OworCXZvbGF0aWxlIHUxNiB2YWw7CisKKwlpZiAoaXJxID09IElSUTVfSVJRKSB7CisJCS8qIFJlYWQgc3RhdHVzIFJlZ2lzdGVyICovCisJCXZhbCA9IGN0cmxfaW53KFBBX0NQTERfU1QpOworCQliaXQgPSBmZnModmFsKTsKKwkJaWYgKGJpdCAhPSAwKQorCQkJcmV0dXJuIE9GRkNISVBfSVJRX0JBU0UgKyBiaXQgLSAxOworCX0KKwlyZXR1cm4gaXJxOworfQorCisvKiBJUlE1IGlzIG11bHRpcGxleGVkIGJldHdlZW4gdGhlIGZvbGxvd2luZyBzb3VyY2VzOgorICogMS4gUEMgQ2FyZCBzb2NrZXQKKyAqIDIuIEV4dGVuc2lvbiBzbG90CisgKiAzLiBVU0IgQ29udHJvbGxlcgorICogNC4gU2VyaWFsIENvbnRyb2xsZXIKKyAqCisgKiBXZSBjb25maWd1cmUgSVJRNSBhcyBhIGNhc2NhZGUgSVJRLgorICovCitzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnE1ID0geyBub19hY3Rpb24sIDAsIENQVV9NQVNLX05PTkUsICJJUlE1LWNhc2NhZGUiLAorCQkJCU5VTEwsIE5VTEx9OworCisvKgorICogSW5pdGlhbGl6ZSBJUlEgc2V0dGluZworICovCit2b2lkIF9faW5pdAoraW5pdF83MzQzc2VfSVJRKHZvaWQpCit7CisJLyogU2V0dXAgTXVsdGlwbGV4ZWQgaW50ZXJydXB0cyAqLworCWN0cmxfb3V0dyg4LCBQQV9DUExEX01PREVTRVQpOwkvKiBTZXQgYWxsIENQTEQgaW50ZXJydXB0cyB0byBhY3RpdmUKKwkJCQkJICogbG93LgorCQkJCQkgKi8KKwkvKiBNYXNrIGFsbCBDUExEIGNvbnRyb2xsZXIgaW50ZXJydXB0cyAqLworCWN0cmxfb3V0dygweDBmZmYsIFBBX0NQTERfSU1TSyk7CisKKwkvKiBQQyBDYXJkIGludGVycnVwdHMgKi8KKwltYWtlX2ludHJlcV9pcnEoUENfSVJRMCk7CisJbWFrZV9pbnRyZXFfaXJxKFBDX0lSUTEpOworCW1ha2VfaW50cmVxX2lycShQQ19JUlEyKTsKKwltYWtlX2ludHJlcV9pcnEoUENfSVJRMyk7CisKKwkvKiBFeHRlbnNpb24gU2xvdCBJbnRlcnJ1cHRzICovCisJbWFrZV9pbnRyZXFfaXJxKEVYVF9JUlEwKTsKKwltYWtlX2ludHJlcV9pcnEoRVhUX0lSUTEpOworCW1ha2VfaW50cmVxX2lycShFWFRfSVJRMik7CisJbWFrZV9pbnRyZXFfaXJxKEVYVF9JUlEzKTsKKworCS8qIFVTQiBDb250cm9sbGVyIGludGVycnVwdHMgKi8KKwltYWtlX2ludHJlcV9pcnEoVVNCX0lSUTApOworCW1ha2VfaW50cmVxX2lycShVU0JfSVJRMSk7CisKKwkvKiBTZXJpYWwgQ29udHJvbGxlciBpbnRlcnJ1cHRzICovCisJbWFrZV9pbnRyZXFfaXJxKFVBUlRfSVJRMCk7CisJbWFrZV9pbnRyZXFfaXJxKFVBUlRfSVJRMSk7CisKKwkvKiBTZXR1cCBhbGwgZXh0ZXJuYWwgaW50ZXJydXB0cyB0byBiZSBhY3RpdmUgbG93ICovCisJY3RybF9vdXR3KDB4YWFhYSwgSU5UQ19JQ1IxKTsKKworCW1ha2VfaXByX2lycShJUlE1X0lSUSwgSVJRNV9JUFJfQUREUisyLCBJUlE1X0lQUl9QT1MsIElSUTVfUFJJT1JJVFkpOworCXNldHVwX2lycShJUlE1X0lSUSwgJmlycTUpOworCS8qIFNldCBwb3J0IGNvbnRyb2wgdG8gdXNlIElSUTUgKi8KKwkqKHUxNiAqKTB4QTQwNTAxMDggJj0gfjB4YzsKKworCW1ha2VfaXByX2lycShTSU9GMF9JUlEsIFNJT0YwX0lQUl9BRERSLCBTSU9GMF9JUFJfUE9TLCBTSU9GMF9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKFZQVV9JUlEsIFZQVV9JUFJfQUREUiwgVlBVX0lQUl9QT1MsIDgpOworCisJY3RybF9vdXRiKDB4MGYsIElOVENfSU1DUjUpOwkvKiBlbmFibGUgU0NJRiBJUlEgKi8KKworCW1ha2VfaXByX2lycShETVRFMF9JUlEsIERNQTFfSVBSX0FERFIsIERNQTFfSVBSX1BPUywgRE1BMV9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKERNVEUxX0lSUSwgRE1BMV9JUFJfQUREUiwgRE1BMV9JUFJfUE9TLCBETUExX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoRE1URTJfSVJRLCBETUExX0lQUl9BRERSLCBETUExX0lQUl9QT1MsIERNQTFfUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShETVRFM19JUlEsIERNQTFfSVBSX0FERFIsIERNQTFfSVBSX1BPUywgRE1BMV9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKERNVEU0X0lSUSwgRE1BMl9JUFJfQUREUiwgRE1BMl9JUFJfUE9TLCBETUEyX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoRE1URTVfSVJRLCBETUEyX0lQUl9BRERSLCBETUEyX0lQUl9QT1MsIERNQTJfUFJJT1JJVFkpOworCisJLyogSTJDIGJsb2NrICovCisJbWFrZV9pcHJfaXJxKElJQzBfQUxJX0lSUSwgSUlDMF9JUFJfQUREUiwgSUlDMF9JUFJfUE9TLCBJSUMwX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoSUlDMF9UQUNLSV9JUlEsIElJQzBfSVBSX0FERFIsIElJQzBfSVBSX1BPUywKKwkJICAgICBJSUMwX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoSUlDMF9XQUlUSV9JUlEsIElJQzBfSVBSX0FERFIsIElJQzBfSVBSX1BPUywKKwkJICAgICBJSUMwX1BSSU9SSVRZKTsKKwltYWtlX2lwcl9pcnEoSUlDMF9EVEVJX0lSUSwgSUlDMF9JUFJfQUREUiwgSUlDMF9JUFJfUE9TLCBJSUMwX1BSSU9SSVRZKTsKKworCW1ha2VfaXByX2lycShJSUMxX0FMSV9JUlEsIElJQzFfSVBSX0FERFIsIElJQzFfSVBSX1BPUywgSUlDMV9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKElJQzFfVEFDS0lfSVJRLCBJSUMxX0lQUl9BRERSLCBJSUMxX0lQUl9QT1MsCisJCSAgICAgSUlDMV9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKElJQzFfV0FJVElfSVJRLCBJSUMxX0lQUl9BRERSLCBJSUMxX0lQUl9QT1MsCisJCSAgICAgSUlDMV9QUklPUklUWSk7CisJbWFrZV9pcHJfaXJxKElJQzFfRFRFSV9JUlEsIElJQzFfSVBSX0FERFIsIElJQzFfSVBSX1BPUywgSUlDMV9QUklPUklUWSk7CisKKwkvKiBTSU9GICovCisJbWFrZV9pcHJfaXJxKFNJT0YwX0lSUSwgU0lPRjBfSVBSX0FERFIsIFNJT0YwX0lQUl9QT1MsIFNJT0YwX1BSSU9SSVRZKTsKKworCS8qIFNJVSAqLworCW1ha2VfaXByX2lycShTSVVfSVJRLCBTSVVfSVBSX0FERFIsIFNJVV9JUFJfUE9TLCBTSVVfUFJJT1JJVFkpOworCisJLyogVklPIGludGVycnVwdCAqLworCW1ha2VfaXByX2lycShDRVVfSVJRLCBWSU9fSVBSX0FERFIsIFZJT19JUFJfUE9TLCBWSU9fUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShCRVVfSVJRLCBWSU9fSVBSX0FERFIsIFZJT19JUFJfUE9TLCBWSU9fUFJJT1JJVFkpOworCW1ha2VfaXByX2lycShWRVVfSVJRLCBWSU9fSVBSX0FERFIsIFZJT19JUFJfUE9TLCBWSU9fUFJJT1JJVFkpOworCisJLypNRkkgaW50ZXJydXB0Ki8KKworCW1ha2VfaXByX2lycShNRklfSVJRLCBNRklfSVBSX0FERFIsIE1GSV9JUFJfUE9TLCBNRklfUFJJT1JJVFkpOworCisJLyogTENEIGNvbnRyb2xsZXIgKi8KKwltYWtlX2lwcl9pcnEoTENEQ19JUlEsIExDRENfSVBSX0FERFIsIExDRENfSVBSX1BPUywgTENEQ19QUklPUklUWSk7CisJY3RybF9vdXR3KDB4MjAwMCwgUEFfTVJTSFBDICsgMHgwYyk7CS8qIG1yc2hwYyBpcnEgZW5hYmxlICovCit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL2xlZC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9sZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTQzOWNmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9sZWQuYwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9sZWQuYworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9zZTczNDMuaD4KKworLyogQ3ljbGUgdGhlIExFRCdzIGluIHRoZSBjbGFzaWMgS25pZ2h0cmlkZXIvU3VuIHBhdHRlcm4gKi8KK3ZvaWQgaGVhcnRiZWF0XzczNDNzZSh2b2lkKQoreworCXN0YXRpYyB1bnNpZ25lZCBpbnQgY250ID0gMCwgcGVyaW9kID0gMDsKKwl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSBQQV9MRUQ7CisJc3RhdGljIHVuc2lnbmVkIGJpdCA9IDAsIHVwID0gMTsKKworCWNudCArPSAxOworCWlmIChjbnQgPCBwZXJpb2QpIHsKKwkJcmV0dXJuOworCX0KKworCWNudCA9IDA7CisKKwkvKiBHbyB0aHJvdWdoIHRoZSBwb2ludHMgKHJvdWdobHkhKToKKwkgKiBmKDApPTEwLCBmKDEpPTE2LCBmKDIpPTIwLCBmKDUpPTM1LGYoaW5mKS0+MTEwCisJICovCisJcGVyaW9kID0gMTEwIC0gKCgzMDAgPDwgRlNISUZUKSAvICgoYXZlbnJ1blswXSAvIDUpICsgKDMgPDwgRlNISUZUKSkpOworCisJaWYgKHVwKSB7CisJCWlmIChiaXQgPT0gNykgeworCQkJYml0LS07CisJCQl1cCA9IDA7CisJCX0gZWxzZSB7CisJCQliaXQrKzsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChiaXQgPT0gMCkgeworCQkJYml0Kys7CisJCQl1cCA9IDE7CisJCX0gZWxzZSB7CisJCQliaXQtLTsKKwkJfQorCX0KKwkqcCA9IDEgPDwgKGJpdCArIExFRF9TSElGVCk7CisKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODczMjIyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9zZXR1cC5jCkBAIC0wLDAgKzEsODQgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9zZTczNDMuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKK3ZvaWQgaGVhcnRiZWF0XzczNDNzZSh2b2lkKTsKK3ZvaWQgaW5pdF83MzQzc2VfSVJRKHZvaWQpOworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IDB4MTAwMDAwMDAsCisJCS5lbmQJPSAweDEwMDAwMDBGLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorCVsxXSA9IHsKKwkJLyoKKwkJICogc2hhcmVkIHdpdGggb3RoZXIgZGV2aWNlcyB2aWEgZXh0ZXJuZWwKKwkJICogaW50ZXJydXB0IGNvbnRyb2xsZXIgaW4gRlBHQS4uLgorCQkgKi8KKwkJLnN0YXJ0CT0gRVhUX0lSUTIsCisJCS5lbmQJPSBFWFRfSVJRMiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNtYzkxeF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNtYzkxeCIsCisJLmlkCQk9IDAsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHNtYzkxeF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHNtYzkxeF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21jOTF4X3BsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzbWM5MXhfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2g3MzQzc2VfZGV2aWNlc19zZXR1cCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzbWM5MXhfcGxhdGZvcm1fZGV2aWNlcywKKwkJCQkgICAgQVJSQVlfU0laRShzbWM5MXhfcGxhdGZvcm1fZGV2aWNlcykpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc2g3MzQzc2Vfc2V0dXAoY2hhciAqKmNtZGxpbmVfcCkKK3sKKwlkZXZpY2VfaW5pdGNhbGwoc2g3MzQzc2VfZGV2aWNlc19zZXR1cCk7Cit9CisKKy8qCisgKiBUaGUgTWFjaGluZSBWZWN0b3IKKyAqLworc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12XzczNDNzZSBfX2luaXRtdiA9IHsKKwkubXZfbmFtZSA9ICJTb2x1dGlvbkVuZ2luZSA3MzQzIiwKKwkubXZfc2V0dXAgPSBzaDczNDNzZV9zZXR1cCwKKwkubXZfbnJfaXJxcyA9IDEwOCwKKwkubXZfaW5iID0gc2g3MzQzc2VfaW5iLAorCS5tdl9pbncgPSBzaDczNDNzZV9pbncsCisJLm12X2lubCA9IHNoNzM0M3NlX2lubCwKKwkubXZfb3V0YiA9IHNoNzM0M3NlX291dGIsCisJLm12X291dHcgPSBzaDczNDNzZV9vdXR3LAorCS5tdl9vdXRsID0gc2g3MzQzc2Vfb3V0bCwKKworCS5tdl9pbmJfcCA9IHNoNzM0M3NlX2luYl9wLAorCS5tdl9pbndfcCA9IHNoNzM0M3NlX2ludywKKwkubXZfaW5sX3AgPSBzaDczNDNzZV9pbmwsCisJLm12X291dGJfcCA9IHNoNzM0M3NlX291dGJfcCwKKwkubXZfb3V0d19wID0gc2g3MzQzc2Vfb3V0dywKKwkubXZfb3V0bF9wID0gc2g3MzQzc2Vfb3V0bCwKKworCS5tdl9pbnNiID0gc2g3MzQzc2VfaW5zYiwKKwkubXZfaW5zdyA9IHNoNzM0M3NlX2luc3csCisJLm12X2luc2wgPSBzaDczNDNzZV9pbnNsLAorCS5tdl9vdXRzYiA9IHNoNzM0M3NlX291dHNiLAorCS5tdl9vdXRzdyA9IHNoNzM0M3NlX291dHN3LAorCS5tdl9vdXRzbCA9IHNoNzM0M3NlX291dHNsLAorCisJLm12X2luaXRfaXJxID0gaW5pdF83MzQzc2VfSVJRLAorCS5tdl9pcnFfZGVtdXggPSBzaG1zZV9pcnFfZGVtdXgsCisjaWZkZWYgQ09ORklHX0hFQVJUQkVBVAorCS5tdl9oZWFydGJlYXQgPSBoZWFydGJlYXRfNzM0M3NlLAorI2VuZGlmCit9OworQUxJQVNfTVYoNzM0M3NlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvTWFrZWZpbGUKaW5kZXggYmU4OWE3My4uOWE1MDM1ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L01ha2VmaWxlCkBAIC0yLDUgKzIsNSBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIDc3MHggU29sdXRpb25FbmdpbmUgc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbAogIwogCi1vYmoteQkgOj0gbWFjaC5vIHNldHVwLm8gaW8ubyBpcnEubyBsZWQubwotCitvYmoteQkgOj0gc2V0dXAubyBpby5vIGlycS5vCitvYmotJChDT05GSUdfSEVBUlRCRUFUKSArPSBsZWQubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pby5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pby5jCmluZGV4IDlhMzllZTkuLjk5NDE5NDkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvaW8uYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2lvLmMKQEAgLTEsNCArMSw0IEBACi0vKiAkSWQ6IGlvLmMsdiAxLjUgMjAwNC8wMi8yMiAyMzowODo0MyBra29qaW1hIEV4cCAkCisvKiAkSWQ6IGlvLmMsdiAxLjcgMjAwNi8wMi8wNSAyMTo1NToyOSBsZXRoYWwgRXhwICQKICAqCiAgKiBsaW51eC9hcmNoL3NoL2tlcm5lbC9pb19zZS5jCiAgKgpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3NlL3NlLmg+CisjaW5jbHVkZSA8YXNtL3NlLmg+CiAKIC8qIFNIIHBjbWNpYSBpbyB3aW5kb3cgYmFzZSwgc3RhcnQgYW5kIGVuZC4gICovCiBpbnQgc2hfcGNpY19pb193YmFzZSA9IDB4Yjg0MDAwMDA7CkBAIC0yMCwxMSArMjAsNiBAQAogaW50IHNoX3BjaWNfaW9fdHlwZTsKIGludCBzaF9wY2ljX2lvX2R1bW15OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkodm9pZCkKLXsKLQljdHJsX2ludygweGEwMDAwMDAwKTsKLX0KLQogLyogTVM3NzUwIHJlcXVpcmVzIHNwZWNpYWwgdmVyc2lvbnMgb2YgaW4qLCBvdXQqIHJvdXRpbmVzLCBzaW5jZQogICAgUEMtbGlrZSBpbyBwb3J0cyBhcmUgbG9jYXRlZCBhdCB1cHBlciBoYWxmIGJ5dGUgb2YgMTYtYml0IHdvcmQgd2hpY2gKICAgIGNhbiBiZSBhY2Nlc3NlZCBvbmx5IHdpdGggMTYtYml0IHdpZGUuICAqLwpAQCAtNTIsMTAgKzQ3LDYgQEAKIAkJcmV0dXJuIDE7CiB9CiAKLSNkZWZpbmUgbWF5YmViYWRpbyhuYW1lLHBvcnQpIFwKLSAgcHJpbnRrKCJiYWQgUEMtbGlrZSBpbyAlcyBmb3IgcG9ydCAweCVseCBhdCAweCUwOHhcbiIsIFwKLQkgI25hbWUsIChwb3J0KSwgKF9fdTMyKSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpCi0KIHVuc2lnbmVkIGNoYXIgc2VfaW5iKHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAlpZiAoc2hfcGNpY19pb19zdGFydCA8PSBwb3J0ICYmIHBvcnQgPD0gc2hfcGNpY19pb19zdG9wKQpAQCAtNzYsNyArNjcsNyBAQAogCQl2ID0gKCpwb3J0MmFkcihwb3J0KSA+PiA4KTsgCiAJZWxzZQogCQl2ID0gKCpwb3J0MmFkcihwb3J0KSkmMHhmZjsgCi0JZGVsYXkoKTsKKwljdHJsX2RlbGF5KCk7CiAJcmV0dXJuIHY7CiB9CiAKQEAgLTg2LDEzICs3NywxMyBAQAogCSAgICAoc2hfcGNpY19pb19zdGFydCA8PSBwb3J0ICYmIHBvcnQgPD0gc2hfcGNpY19pb19zdG9wKSkKIAkJcmV0dXJuICpwb3J0MmFkcihwb3J0KTsKIAllbHNlCi0JCW1heWJlYmFkaW8oaW53LCBwb3J0KTsKKwkJbWF5YmViYWRpbyhwb3J0KTsKIAlyZXR1cm4gMDsKIH0KIAogdW5zaWduZWQgaW50IHNlX2lubCh1bnNpZ25lZCBsb25nIHBvcnQpCiB7Ci0JbWF5YmViYWRpbyhpbmwsIHBvcnQpOworCW1heWJlYmFkaW8ocG9ydCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNCw3ICsxMDUsNyBAQAogCQkqKHBvcnQyYWRyKHBvcnQpKSA9IHZhbHVlIDw8IDg7CiAJZWxzZQogCQkqKHBvcnQyYWRyKHBvcnQpKSA9IHZhbHVlOwotCWRlbGF5KCk7CisJY3RybF9kZWxheSgpOwogfQogCiB2b2lkIHNlX291dHcodW5zaWduZWQgc2hvcnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKQEAgLTEyMywxMiArMTE0LDEyIEBACiAJICAgIChzaF9wY2ljX2lvX3N0YXJ0IDw9IHBvcnQgJiYgcG9ydCA8PSBzaF9wY2ljX2lvX3N0b3ApKQogCQkqcG9ydDJhZHIocG9ydCkgPSB2YWx1ZTsKIAllbHNlCi0JCW1heWJlYmFkaW8ob3V0dywgcG9ydCk7CisJCW1heWJlYmFkaW8ocG9ydCk7CiB9CiAKIHZvaWQgc2Vfb3V0bCh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKLQltYXliZWJhZGlvKG91dGwsIHBvcnQpOworCW1heWJlYmFkaW8ocG9ydCk7CiB9CiAKIHZvaWQgc2VfaW5zYih1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCkBAIC0xNTksNyArMTUwLDcgQEAKIAogdm9pZCBzZV9pbnNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQltYXliZWJhZGlvKGluc2wsIHBvcnQpOworCW1heWJlYmFkaW8ocG9ydCk7CiB9CiAKIHZvaWQgc2Vfb3V0c2IodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQpAQCAtMTkwLDM3ICsxODEsNSBAQAogCiB2b2lkIHNlX291dHNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQltYXliZWJhZGlvKG91dHN3LCBwb3J0KTsKLX0KLQotLyogTWFwIElTQSBidXMgYWRkcmVzcyB0byB0aGUgcmVhbCBhZGRyZXNzLiBPbmx5IGZvciBQQ01DSUEuICAqLwotCi0vKiBJU0EgcGFnZSBkZXNjcmlwdG9yLiAgKi8KLXN0YXRpYyBfX3UzMiBzaF9pc2FfbWVtbWFwWzI1Nl07Ci0KLXN0YXRpYyBpbnQKLXNoX2lzYV9tbWFwKF9fdTMyIHN0YXJ0LCBfX3UzMiBsZW5ndGgsIF9fdTMyIG9mZnNldCkKLXsKLQlpbnQgaWR4OwotCi0JaWYgKHN0YXJ0ID49IDB4MTAwMDAwIHx8IChzdGFydCAmIDB4ZmZmKSB8fCAobGVuZ3RoICE9IDB4MTAwMCkpCi0JCXJldHVybiAtMTsKLQotCWlkeCA9IHN0YXJ0ID4+IDEyOwotCXNoX2lzYV9tZW1tYXBbaWR4XSA9IDB4YjgwMDAwMDAgKyAob2Zmc2V0ICZ+IDB4ZmZmKTsKLSNpZiAwCi0JcHJpbnRrKCJzaF9pc2FfbW1hcDogc3RhcnQgJXggbGVuICV4IG9mZnNldCAleCAoaWR4ICV4IHBhZGRyICV4KVxuIiwKLQkgICAgICAgc3RhcnQsIGxlbmd0aCwgb2Zmc2V0LCBpZHgsIHNoX2lzYV9tZW1tYXBbaWR4XSk7Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotdW5zaWduZWQgbG9uZwotc2VfaXNhX3BvcnQyYWRkcih1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLQlpbnQgaWR4OwotCi0JaWR4ID0gKG9mZnNldCA+PiAxMikgJiAweGZmOwotCW9mZnNldCAmPSAweGZmZjsKLQlyZXR1cm4gc2hfaXNhX21lbW1hcFtpZHhdICsgb2Zmc2V0OworCW1heWJlYmFkaW8ocG9ydCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYwppbmRleCAzZTU1ODcxLi5jZmY2NzAwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvaXJxLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3NlL3NlLmg+CisjaW5jbHVkZSA8YXNtL3NlLmg+CiAKIC8qCiAgKiBJbml0aWFsaXplIElSUSBzZXR0aW5nCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2xlZC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9sZWQuYwppbmRleCAzY2RkYmRhLi5kYWY3YjFlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2xlZC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvbGVkLmMKQEAgLTksMjIgKzksOCBAQAogICogVGhpcyBmaWxlIGNvbnRhaW5zIFNvbHV0aW9uIEVuZ2luZSBzcGVjaWZpYyBMRUQgY29kZS4KICAqLwogCi0jaW5jbHVkZSA8YXNtL3NlL3NlLmg+Ci0KLXN0YXRpYyB2b2lkIG1hY2hfbGVkKGludCBwb3NpdGlvbiwgaW50IHZhbHVlKQotewotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0KiBwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0KilQQV9MRUQ7Ci0KLQlpZiAodmFsdWUpIHsKLQkJKnAgfD0gKDE8PDgpOwotCX0gZWxzZSB7Ci0JCSpwICY9IH4oMTw8OCk7Ci0JfQotfQotCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vc2UuaD4KIAogLyogQ3ljbGUgdGhlIExFRCdzIGluIHRoZSBjbGFzaWMgS25pZ2h0cmlkZXIvU3VuIHBhdHRlcm4gKi8KIHZvaWQgaGVhcnRiZWF0X3NlKHZvaWQpCkBAIC02NCw0ICs1MCwzIEBACiAJKnAgPSAxPDwoYml0KzgpOwogCiB9Ci0jZW5kaWYgLyogQ09ORklHX0hFQVJUQkVBVCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9tYWNoLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L21hY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjMDdiZC4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L21hY2guYworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3NoL2tlcm5lbC9tYWNoX3NlLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3R1YXJ0IE1lbmVmeSAoc3R1YXJ0Lm1lbmVmeUBzdC5jb20pCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIE1hY2hpbmUgdmVjdG9yIGZvciB0aGUgSGl0YWNoaSBTb2x1dGlvbkVuZ2luZQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9ydGMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaHZlY19pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vc2UvaW8uaD4KLQotdm9pZCBoZWFydGJlYXRfc2Uodm9pZCk7Ci12b2lkIHNldHVwX3NlKHZvaWQpOwotdm9pZCBpbml0X3NlX0lSUSh2b2lkKTsKLQotLyoKLSAqIFRoZSBNYWNoaW5lIFZlY3RvcgotICovCi0KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zZSBfX2luaXRtdiA9IHsKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQotCS5tdl9ucl9pcnFzCQk9IDQ4LAotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4KQotCS5tdl9ucl9pcnFzCQk9IDMyLAotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KQotCS5tdl9ucl9pcnFzCQk9IDYxLAotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQotCS5tdl9ucl9pcnFzCQk9IDg2LAotI2VuZGlmCi0KLQkubXZfaW5iCQkJPSBzZV9pbmIsCi0JLm12X2ludwkJCT0gc2VfaW53LAotCS5tdl9pbmwJCQk9IHNlX2lubCwKLQkubXZfb3V0YgkJPSBzZV9vdXRiLAotCS5tdl9vdXR3CQk9IHNlX291dHcsCi0JLm12X291dGwJCT0gc2Vfb3V0bCwKLQotCS5tdl9pbmJfcAkJPSBzZV9pbmJfcCwKLQkubXZfaW53X3AJCT0gc2VfaW53LAotCS5tdl9pbmxfcAkJPSBzZV9pbmwsCi0JLm12X291dGJfcAkJPSBzZV9vdXRiX3AsCi0JLm12X291dHdfcAkJPSBzZV9vdXR3LAotCS5tdl9vdXRsX3AJCT0gc2Vfb3V0bCwKLQotCS5tdl9pbnNiCQk9IHNlX2luc2IsCi0JLm12X2luc3cJCT0gc2VfaW5zdywKLQkubXZfaW5zbAkJPSBzZV9pbnNsLAotCS5tdl9vdXRzYgkJPSBzZV9vdXRzYiwKLQkubXZfb3V0c3cJCT0gc2Vfb3V0c3csCi0JLm12X291dHNsCQk9IHNlX291dHNsLAotCi0JLm12X2lzYV9wb3J0MmFkZHIJPSBzZV9pc2FfcG9ydDJhZGRyLAotCi0JLm12X2luaXRfaXJxCQk9IGluaXRfc2VfSVJRLAotI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKLQkubXZfaGVhcnRiZWF0CQk9IGhlYXJ0YmVhdF9zZSwKLSNlbmRpZgotfTsKLUFMSUFTX01WKHNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9zZXR1cC5jCmluZGV4IDdkMWEwNzEuLmYzZjgyYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L3NldHVwLmMKQEAgLTcsMTUgKzcsMTcgQEAKICAqIEhpdGFjaGkgU29sdXRpb25FbmdpbmUgU3VwcG9ydC4KICAqCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLQogI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3NlL3NlLmg+Ci0jaW5jbHVkZSA8YXNtL3NlL3NtYzM3YzkzeC5oPgorI2luY2x1ZGUgPGFzbS9zZS5oPgorI2luY2x1ZGUgPGFzbS9zbWMzN2M5M3guaD4KKyNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgorCit2b2lkIGhlYXJ0YmVhdF9zZSh2b2lkKTsKK3ZvaWQgaW5pdF9zZV9JUlEodm9pZCk7CiAKIC8qCiAgKiBDb25maWd1cmUgdGhlIFN1cGVyIEkvTyBjaGlwCkBAIC0yNiw3ICsyOCw4IEBACiAJb3V0Yl9wKGRhdGEsIERBVEFfUE9SVCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3Ntc2Modm9pZCkKKy8qIFhYWDogQW5vdGhlciBjYW5kaWRhdGUgZm9yIGEgbW9yZSBnZW5lcmljIGNjaGlwIG1hY2hpbmUgdmVjdG9yICovCitzdGF0aWMgdm9pZCBfX2luaXQgc21zY19zZXR1cChjaGFyICoqY21kbGluZV9wKQogewogCW91dGJfcChDT05GSUdfRU5URVIsIENPTkZJR19QT1JUKTsKIAlvdXRiX3AoQ09ORklHX0VOVEVSLCBDT05GSUdfUE9SVCk7CkBAIC02OSwxNiArNzIsNDYgQEAKIAlvdXRiX3AoQ09ORklHX0VYSVQsIENPTkZJR19QT1JUKTsKIH0KIAotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICJTb2x1dGlvbkVuZ2luZSI7Ci19Ci0KIC8qCi0gKiBJbml0aWFsaXplIHRoZSBib2FyZAorICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KLXZvaWQgX19pbml0IHBsYXRmb3JtX3NldHVwKHZvaWQpCi17Ci0JaW5pdF9zbXNjKCk7Ci0JLyogWFhYOiBSVEMgc2V0dGluZyBjb21lcyBoZXJlICovCi19CitzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2UgX19pbml0bXYgPSB7CisJLm12X25hbWUJCT0gIlNvbHV0aW9uRW5naW5lIiwKKwkubXZfc2V0dXAJCT0gc21zY19zZXR1cCwKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQorCS5tdl9ucl9pcnFzCQk9IDQ4LAorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4KQorCS5tdl9ucl9pcnFzCQk9IDMyLAorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KQorCS5tdl9ucl9pcnFzCQk9IDYxLAorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQorCS5tdl9ucl9pcnFzCQk9IDg2LAorI2VuZGlmCisKKwkubXZfaW5iCQkJPSBzZV9pbmIsCisJLm12X2ludwkJCT0gc2VfaW53LAorCS5tdl9pbmwJCQk9IHNlX2lubCwKKwkubXZfb3V0YgkJPSBzZV9vdXRiLAorCS5tdl9vdXR3CQk9IHNlX291dHcsCisJLm12X291dGwJCT0gc2Vfb3V0bCwKKworCS5tdl9pbmJfcAkJPSBzZV9pbmJfcCwKKwkubXZfaW53X3AJCT0gc2VfaW53LAorCS5tdl9pbmxfcAkJPSBzZV9pbmwsCisJLm12X291dGJfcAkJPSBzZV9vdXRiX3AsCisJLm12X291dHdfcAkJPSBzZV9vdXR3LAorCS5tdl9vdXRsX3AJCT0gc2Vfb3V0bCwKKworCS5tdl9pbnNiCQk9IHNlX2luc2IsCisJLm12X2luc3cJCT0gc2VfaW5zdywKKwkubXZfaW5zbAkJPSBzZV9pbnNsLAorCS5tdl9vdXRzYgkJPSBzZV9vdXRzYiwKKwkubXZfb3V0c3cJCT0gc2Vfb3V0c3csCisJLm12X291dHNsCQk9IHNlX291dHNsLAorCisJLm12X2luaXRfaXJxCQk9IGluaXRfc2VfSVJRLAorI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKKwkubXZfaGVhcnRiZWF0CQk9IGhlYXJ0YmVhdF9zZSwKKyNlbmRpZgorfTsKK0FMSUFTX01WKHNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvTWFrZWZpbGUKaW5kZXggY2U3Y2EyNC4uMTg4OTAwYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIDc3NTEgU29sdXRpb25FbmdpbmUgc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbAogIwogCi1vYmoteQkgOj0gbWFjaC5vIHNldHVwLm8gaW8ubyBpcnEubyBsZWQubworb2JqLXkJIDo9IHNldHVwLm8gaW8ubyBpcnEubwogCiBvYmotJChDT05GSUdfUENJKSArPSBwY2kubwotCitvYmotJChDT05GSUdfSEVBUlRCRUFUKSArPSBsZWQubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9pby5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9pby5jCmluZGV4IDk5MDQxYjIuLmU4ZDg0NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvaW8uYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2lvLmMKQEAgLTEsNiArMSw0IEBACi0vKiAKLSAqIGxpbnV4L2FyY2gvc2gva2VybmVsL2lvXzc3NTFzZS5jCi0gKgorLyoKICAqIENvcHlyaWdodCAoQykgMjAwMSAgSWFuIGRhIFNpbHZhLCBKZXJlbXkgU2llZ2VsCiAgKiBCYXNlZCBsYXJnZWx5IG9uIGlvX3NlLmMuCiAgKgpAQCAtMTAsOTYgKzgsMjEgQEAKICAqIHBsYWNlaG9sZGVyIGNvZGUgZnJvbSBpb19zZS5jIGxlZnQgaW4gd2l0aCB0aGUKICAqIGV4cGVjdGF0aW9uIG9mIGxhdGVyIFN1cGVySU8gYW5kIFBDTUNJQSBhY2Nlc3MuCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3NlNzc1MS9zZTc3NTEuaD4KKyNpbmNsdWRlIDxhc20vc2U3NzUxLmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSAiLi4vLi4vLi4vZHJpdmVycy9wY2kvcGNpLXNoNzc1MS5oIgotCi0jaWYgMAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmFyaWFibGVzIGZyb20gaW9fc2UuYywgcmVsYXRlZCB0byBQQ01DSUEgKG5vdCBQQ0kpOyB3ZSdyZSBub3QKLSAqIGNvbXBpbGluZyB0aGVtIGluLCBhbmQgaGF2ZSByZW1vdmVkIHJlZmVyZW5jZXMgZnJvbSBmdW5jdGlvbnMKLSAqIHdoaWNoIGZvbGxvdy4gIFtNYW55IGNoZWNrZWQgZm9yIElPIHBvcnRzIGluIHRoZSByYW5nZSBib3VuZGVkCi0gKiBieSBzaF9wY2ljX2lvX3N0YXJ0L3N0b3AsIGFuZCB1c2VkIHNoX3BjaWNfaW9fd2Jhc2UgYXMgb2Zmc2V0LgotICogQXMgc3RhcnQvc3RvcCBhcmUgdW5pbml0aWFsaXplZCwgb25seSBwb3J0IDB4MCB3b3VsZCBtYXRjaD9dCi0gKiBXaGVuIHVzZWQsIHJlbWVtYmVyIHRvIGFkanVzdCBuYW1lcyB0byBhdm9pZCBjbGFzaCB3aXRoIGlvX3NlPwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogU0ggcGNtY2lhIGlvIHdpbmRvdyBiYXNlLCBzdGFydCBhbmQgZW5kLiAgKi8KLWludCBzaF9wY2ljX2lvX3diYXNlID0gMHhiODQwMDAwMDsKLWludCBzaF9wY2ljX2lvX3N0YXJ0OwotaW50IHNoX3BjaWNfaW9fc3RvcDsKLWludCBzaF9wY2ljX2lvX3R5cGU7Ci1pbnQgc2hfcGNpY19pb19kdW1teTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2VuZGlmCi0KLS8qCi0gKiBUaGUgNzc1MSBTb2x1dGlvbiBFbmdpbmUgdXNlcyB0aGUgYnVpbHQtaW4gUENJIGNvbnRyb2xsZXIgKFBDSUMpCi0gKiBvZiB0aGUgNzc1MSBwcm9jZXNzb3IsIGFuZCBoYXMgYSBTdXBlcklPIGFjY2Vzc2libGUgdmlhIHRoZSBQQ0kuCi0gKiBUaGUgYm9hcmQgYWxzbyBpbmNsdWRlcyBhIFBDTUNJQSBjb250cm9sbGVyIG9uIGl0cyBtZW1vcnkgYnVzLAotICogbGlrZSB0aGUgb3RoZXIgU29sdXRpb24gRW5naW5lIGJvYXJkcy4KLSAqLyAKLQotI2RlZmluZSBQQ0lJT0JSCQkodm9sYXRpbGUgbG9uZyAqKVBDSV9SRUcoU0g3NzUxX1BDSUlPQlIpCi0jZGVmaW5lIFBDSU1CUiAgICAgICAgICAodm9sYXRpbGUgbG9uZyAqKVBDSV9SRUcoU0g3NzUxX1BDSU1CUikKLSNkZWZpbmUgUENJX0lPX0FSRUEJU0g3NzUxX1BDSV9JT19CQVNFCi0jZGVmaW5lIFBDSV9NRU1fQVJFQQlTSDc3NTFfUENJX0NPTkZJR19CQVNFCi0KLSNkZWZpbmUgUENJX0lPTUFQKGFkcikJKFBDSV9JT19BUkVBICsgKGFkciAmIH5TSDc3NTFfUENJSU9CUl9NQVNLKSkKLQotI2RlZmluZSBtYXliZWJhZGlvKG5hbWUscG9ydCkgXAotICBwcmludGsoImJhZCBQQy1saWtlIGlvICVzIGZvciBwb3J0IDB4JWx4IGF0IDB4JTA4eFxuIiwgXAotCSAjbmFtZSwgKHBvcnQpLCAoX191MzIpIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSkKLQotc3RhdGljIGlubGluZSB2b2lkIGRlbGF5KHZvaWQpCi17Ci0JY3RybF9pbncoMHhhMDAwMDAwMCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9sYXRpbGUgX191MTYgKgotcG9ydDJhZHIodW5zaWduZWQgaW50IHBvcnQpCitzdGF0aWMgaW5saW5lIHZvbGF0aWxlIHUxNiAqcG9ydDJhZHIodW5zaWduZWQgaW50IHBvcnQpCiB7CiAJaWYgKHBvcnQgPj0gMHgyMDAwKQogCQlyZXR1cm4gKHZvbGF0aWxlIF9fdTE2ICopIChQQV9NUlNIUEMgKyAocG9ydCAtIDB4MjAwMCkpOwotI2lmIDAKLQllbHNlCi0JCXJldHVybiAodm9sYXRpbGUgX191MTYgKikgKFBBX1NVUEVSSU8gKyAocG9ydCA8PCAxKSk7Ci0jZW5kaWYKLQltYXliZWJhZGlvKG5hbWUsKHVuc2lnbmVkIGxvbmcpcG9ydCk7CisJbWF5YmViYWRpbygodW5zaWduZWQgbG9uZylwb3J0KTsKIAlyZXR1cm4gKHZvbGF0aWxlIF9fdTE2Kilwb3J0OwogfQogCi0jaWYgMAotLyogVGhlIDc3NTEgU29sdXRpb24gRW5naW5lIHNlZW1zIHRvIGhhdmUgZXZlcnl0aGluZyBob29rZWQgKi8KLS8qIHVwIHByZXR0eSBub3JtYWxseSAobm90aGluZyBvbiBoaWdoLWJ5dGVzIG9ubHkuLi4pIHNvIHRoaXMgKi8KLS8qIHNob3VsZG4ndCBiZSBuZWVkZWQgKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1zaGlmdGVkX3BvcnQodW5zaWduZWQgbG9uZyBwb3J0KQotewotCS8qIEZvciBJREUgcmVnaXN0ZXJzLCB2YWx1ZSBpcyBub3Qgc2hpZnRlZCAqLwotCWlmICgoMHgxZjAgPD0gcG9ydCAmJiBwb3J0IDwgMHgxZjgpIHx8IHBvcnQgPT0gMHgzZjYpCi0JCXJldHVybiAwOwotCWVsc2UKLQkJcmV0dXJuIDE7Ci19Ci0jZW5kaWYKLQotLyogSW4gY2FzZSBzb21lb25lIGNvbmZpZ3VyZXMgdGhlIGtlcm5lbCB3L28gUENJIHN1cHBvcnQ6IGluIHRoYXQgKi8KLS8qIHNjZW5hcmlvLCBkb24ndCBldmVyIGJvdGhlciB0byBjaGVjayBmb3IgUENJLXdpbmRvdyBhZGRyZXNzZXMgKi8KLQotLyogTk9URTogV0lORE9XIENIRUNLIE1BWSBCRSBBIEJJVCBPRkYsIEhJR0ggUENJQklPU19NSU5fSU8gV1JBUFM/ICovCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSBDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgXAotICAoKHBvcnQgPj0gUENJQklPU19NSU5fSU8pICYmIChwb3J0IDwgKFBDSUJJT1NfTUlOX0lPICsgU0g3NzUxX1BDSV9JT19TSVpFKSkpCi0jZWxzZQotI2RlZmluZSBDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgKDApCi0jZW5kaWYKLQogLyoKICAqIEdlbmVyYWwgb3V0bGluZTogcmVtYXAgcmVhbGx5IGxvdyBzdHVmZiBbZXZlbnR1YWxseV0gdG8gU3VwZXJJTywKICAqIHN0dWZmIGluIFBDSSBJTyBzcGFjZSAoYXQgb3IgYWJvdmUgd2luZG93IGF0IHBjaS5oOlBDSUJJT1NfTUlOX0lPKQpAQCAtMTExLDEwICszNCwxMCBAQAogewogCWlmIChQWFNFRyhwb3J0KSkKIAkJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBvcnQ7Ci0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpKQotCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopUENJX0lPTUFQKHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisJCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwY2lfaW9hZGRyKHBvcnQpOwogCWVsc2UKLQkJcmV0dXJuICgqcG9ydDJhZHIocG9ydCkpJjB4ZmY7IAorCQlyZXR1cm4gKCpwb3J0MmFkcihwb3J0KSkgJiAweGZmOwogfQogCiB1bnNpZ25lZCBjaGFyIHNoNzc1MXNlX2luYl9wKHVuc2lnbmVkIGxvbmcgcG9ydCkKQEAgLTEyMywxMSArNDYsMTEgQEAKIAogICAgICAgICBpZiAoUFhTRUcocG9ydCkpCiAgICAgICAgICAgICAgICAgdiA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBvcnQ7Ci0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpKQotICAgICAgICAgICAgICAgIHYgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilQQ0lfSU9NQVAocG9ydCk7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKyAgICAgICAgICAgICAgICB2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlCi0JCXYgPSAoKnBvcnQyYWRyKHBvcnQpKSYweGZmOyAKLQlkZWxheSgpOworCQl2ID0gKCpwb3J0MmFkcihwb3J0KSkgJiAweGZmOworCWN0cmxfZGVsYXkoKTsKIAlyZXR1cm4gdjsKIH0KIApAQCAtMTM1LDEyICs1OCwxMiBAQAogewogICAgICAgICBpZiAoUFhTRUcocG9ydCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0OwotCWVsc2UgaWYgKENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKVBDSV9JT01BUChwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlIGlmIChwb3J0ID49IDB4MjAwMCkKIAkJcmV0dXJuICpwb3J0MmFkcihwb3J0KTsKIAllbHNlCi0JCW1heWJlYmFkaW8oaW53LCBwb3J0KTsKKwkJbWF5YmViYWRpbyhwb3J0KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ4LDEyICs3MSwxMiBAQAogewogICAgICAgICBpZiAoUFhTRUcocG9ydCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKXBvcnQ7Ci0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpKQotICAgICAgICAgICAgICAgIHJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKVBDSV9JT01BUChwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKXBjaV9pb2FkZHIocG9ydCk7CiAJZWxzZSBpZiAocG9ydCA+PSAweDIwMDApCiAJCXJldHVybiAqcG9ydDJhZHIocG9ydCk7CiAJZWxzZQotCQltYXliZWJhZGlvKGlubCwgcG9ydCk7CisJCW1heWJlYmFkaW8ocG9ydCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2Miw4ICs4NSw4IEBACiAKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBvcnQgPSB2YWx1ZTsKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkpCi0gICAgICAgIAkqKCh1bnNpZ25lZCBjaGFyKilQQ0lfSU9NQVAocG9ydCkpID0gdmFsdWU7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKwkJKigodW5zaWduZWQgY2hhciopcGNpX2lvYWRkcihwb3J0KSkgPSB2YWx1ZTsKIAllbHNlCiAJCSoocG9ydDJhZHIocG9ydCkpID0gdmFsdWU7CiB9CkBAIC0xNzIsNzMgKzk1LDQxIEBACiB7CiAgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKICAgICAgICAgICAgICAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0ID0gdmFsdWU7Ci0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpKQotICAgICAgICAJKigodW5zaWduZWQgY2hhciopUENJX0lPTUFQKHBvcnQpKSA9IHZhbHVlOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisJCSooKHVuc2lnbmVkIGNoYXIqKXBjaV9pb2FkZHIocG9ydCkpID0gdmFsdWU7CiAJZWxzZQogCQkqKHBvcnQyYWRyKHBvcnQpKSA9IHZhbHVlOwotCWRlbGF5KCk7CisJY3RybF9kZWxheSgpOwogfQogCiB2b2lkIHNoNzc1MXNlX291dHcodW5zaWduZWQgc2hvcnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ID0gdmFsdWU7Ci0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpKQotICAgICAgICAJKigodW5zaWduZWQgc2hvcnQgKilQQ0lfSU9NQVAocG9ydCkpID0gdmFsdWU7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKwkJKigodW5zaWduZWQgc2hvcnQgKilwY2lfaW9hZGRyKHBvcnQpKSA9IHZhbHVlOwogCWVsc2UgaWYgKHBvcnQgPj0gMHgyMDAwKQogCQkqcG9ydDJhZHIocG9ydCkgPSB2YWx1ZTsKIAllbHNlCi0JCW1heWJlYmFkaW8ob3V0dywgcG9ydCk7CisJCW1heWJlYmFkaW8ocG9ydCk7CiB9CiAKIHZvaWQgc2g3NzUxc2Vfb3V0bCh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKICAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQogICAgICAgICAgICAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKXBvcnQgPSB2YWx1ZTsKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkpCi0gICAgICAgIAkqKCh1bnNpZ25lZCBsb25nKilQQ0lfSU9NQVAocG9ydCkpID0gdmFsdWU7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKwkJKigodW5zaWduZWQgbG9uZyopcGNpX2lvYWRkcihwb3J0KSkgPSB2YWx1ZTsKIAllbHNlCi0JCW1heWJlYmFkaW8ob3V0bCwgcG9ydCk7CisJCW1heWJlYmFkaW8ocG9ydCk7CiB9CiAKIHZvaWQgc2g3NzUxc2VfaW5zbCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JbWF5YmViYWRpbyhpbnNsLCBwb3J0KTsKKwltYXliZWJhZGlvKHBvcnQpOwogfQogCiB2b2lkIHNoNzc1MXNlX291dHNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQltYXliZWJhZGlvKG91dHN3LCBwb3J0KTsKLX0KLQotLyogTWFwIElTQSBidXMgYWRkcmVzcyB0byB0aGUgcmVhbCBhZGRyZXNzLiBPbmx5IGZvciBQQ01DSUEuICAqLwotCi0vKiBJU0EgcGFnZSBkZXNjcmlwdG9yLiAgKi8KLXN0YXRpYyBfX3UzMiBzaF9pc2FfbWVtbWFwWzI1Nl07Ci0KLSNpZiAwCi1zdGF0aWMgaW50Ci1zaF9pc2FfbW1hcChfX3UzMiBzdGFydCwgX191MzIgbGVuZ3RoLCBfX3UzMiBvZmZzZXQpCi17Ci0JaW50IGlkeDsKLQotCWlmIChzdGFydCA+PSAweDEwMDAwMCB8fCAoc3RhcnQgJiAweGZmZikgfHwgKGxlbmd0aCAhPSAweDEwMDApKQotCQlyZXR1cm4gLTE7Ci0KLQlpZHggPSBzdGFydCA+PiAxMjsKLQlzaF9pc2FfbWVtbWFwW2lkeF0gPSAweGI4MDAwMDAwICsgKG9mZnNldCAmfiAweGZmZik7Ci0JcHJpbnRrKCJzaF9pc2FfbW1hcDogc3RhcnQgJXggbGVuICV4IG9mZnNldCAleCAoaWR4ICV4IHBhZGRyICV4KVxuIiwKLQkgICAgICAgc3RhcnQsIGxlbmd0aCwgb2Zmc2V0LCBpZHgsIHNoX2lzYV9tZW1tYXBbaWR4XSk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotdW5zaWduZWQgbG9uZwotc2g3NzUxc2VfaXNhX3BvcnQyYWRkcih1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLQlpbnQgaWR4OwotCi0JaWR4ID0gKG9mZnNldCA+PiAxMikgJiAweGZmOwotCW9mZnNldCAmPSAweGZmZjsKLQlyZXR1cm4gc2hfaXNhX21lbW1hcFtpZHhdICsgb2Zmc2V0OworCW1heWJlYmFkaW8ocG9ydCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9pcnEuYwppbmRleCBiZjZjMDIzLi5jNjA3YjBhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvaXJxLmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotI2luY2x1ZGUgPGFzbS9zZTc3NTEvc2U3NzUxLmg+CisjaW5jbHVkZSA8YXNtL3NlNzc1MS5oPgogCiAvKgogICogSW5pdGlhbGl6ZSBJUlEgc2V0dGluZwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvbGVkLmMKaW5kZXggYTg3ODcyNi4uZmYwMzU1ZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9sZWQuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2xlZC5jCkBAIC04LDIzICs4LDggQEAKICAqCiAgKiBUaGlzIGZpbGUgY29udGFpbnMgU29sdXRpb24gRW5naW5lIHNwZWNpZmljIExFRCBjb2RlLgogICovCi0KLSNpbmNsdWRlIDxhc20vc2U3NzUxL3NlNzc1MS5oPgotCi1zdGF0aWMgdm9pZCBtYWNoX2xlZChpbnQgcG9zaXRpb24sIGludCB2YWx1ZSkKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCogcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopUEFfTEVEOwotCi0JaWYgKHZhbHVlKSB7Ci0JCSpwIHw9ICgxPDw4KTsKLQl9IGVsc2UgewotCQkqcCAmPSB+KDE8PDgpOwotCX0KLX0KLQotI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKLQogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL3NlNzc1MS5oPgogCiAvKiBDeWNsZSB0aGUgTEVEJ3MgaW4gdGhlIGNsYXNpYyBLbmlnaHRyaWRlci9TdW4gcGF0dGVybiAqLwogdm9pZCBoZWFydGJlYXRfNzc1MXNlKHZvaWQpCkBAIC02NCw0ICs0OSwzIEBACiAJKnAgPSAxPDwoYml0KzgpOwogCiB9Ci0jZW5kaWYgLyogQ09ORklHX0hFQVJUQkVBVCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9tYWNoLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL21hY2guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkOGQzZS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL21hY2guYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3NoL2tlcm5lbC9tYWNoXzc3NTFzZS5jCi0gKgotICogTWlub3IgdHdlYWsgb2YgbWFjaF9zZS5jIGZpbGUgdG8gcmVmZXJlbmNlIDc3NTFzZS1zcGVjaWZpYyBpdGVtcy4KLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogTWFjaGluZSB2ZWN0b3IgZm9yIHRoZSBIaXRhY2hpIDc3NTEgU29sdXRpb25FbmdpbmUKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vcnRjLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWNfaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL3NlNzc1MS9pby5oPgotCi12b2lkIGhlYXJ0YmVhdF83NzUxc2Uodm9pZCk7Ci12b2lkIGluaXRfNzc1MXNlX0lSUSh2b2lkKTsKLQotLyoKLSAqIFRoZSBNYWNoaW5lIFZlY3RvcgotICovCi0KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83NzUxc2UgX19pbml0bXYgPSB7Ci0JLm12X25yX2lycXMJCT0gNzIsCi0KLQkubXZfaW5iCQkJPSBzaDc3NTFzZV9pbmIsCi0JLm12X2ludwkJCT0gc2g3NzUxc2VfaW53LAotCS5tdl9pbmwJCQk9IHNoNzc1MXNlX2lubCwKLQkubXZfb3V0YgkJPSBzaDc3NTFzZV9vdXRiLAotCS5tdl9vdXR3CQk9IHNoNzc1MXNlX291dHcsCi0JLm12X291dGwJCT0gc2g3NzUxc2Vfb3V0bCwKLQotCS5tdl9pbmJfcAkJPSBzaDc3NTFzZV9pbmJfcCwKLQkubXZfaW53X3AJCT0gc2g3NzUxc2VfaW53LAotCS5tdl9pbmxfcAkJPSBzaDc3NTFzZV9pbmwsCi0JLm12X291dGJfcAkJPSBzaDc3NTFzZV9vdXRiX3AsCi0JLm12X291dHdfcAkJPSBzaDc3NTFzZV9vdXR3LAotCS5tdl9vdXRsX3AJCT0gc2g3NzUxc2Vfb3V0bCwKLQotCS5tdl9pbnNsCQk9IHNoNzc1MXNlX2luc2wsCi0JLm12X291dHNsCQk9IHNoNzc1MXNlX291dHNsLAotCi0JLm12X2lzYV9wb3J0MmFkZHIJPSBzaDc3NTFzZV9pc2FfcG9ydDJhZGRyLAotCi0JLm12X2luaXRfaXJxCQk9IGluaXRfNzc1MXNlX0lSUSwKLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0JLm12X2hlYXJ0YmVhdAkJPSBoZWFydGJlYXRfNzc1MXNlLAotI2VuZGlmCi19OwotQUxJQVNfTVYoNzc1MXNlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9zZXR1cC5jCmluZGV4IDQ4ZGM1YWUuLjczZTgyNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL3NldHVwLmMKQEAgLTEsNCArMSw0IEBACi0vKiAKKy8qCiAgKiBsaW51eC9hcmNoL3NoL2tlcm5lbC9zZXR1cF83NzUxc2UuYwogICoKICAqIENvcHlyaWdodCAoQykgMjAwMCAgS2F6dW1vdG8gS29qaW1hCkBAIC0xMSw3OCArMTEsMTUgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvaWRlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3NlNzc1MS9zZTc3NTEuaD4KKyNpbmNsdWRlIDxhc20vc2U3NzUxLmg+CisKK3ZvaWQgaGVhcnRiZWF0Xzc3NTFzZSh2b2lkKTsKK3ZvaWQgaW5pdF83NzUxc2VfSVJRKHZvaWQpOwogCiAjaWZkZWYgQ09ORklHX1NIX0tHREIKICNpbmNsdWRlIDxhc20va2dkYi5oPgotI2VuZGlmCi0KLS8qCi0gKiBDb25maWd1cmUgdGhlIFN1cGVyIEkvTyBjaGlwCi0gKi8KLSNpZiAwCi0vKiBMZWZ0b3ZlciBjb2RlIGZyb20gcmVndWxhciBTb2x1dGlvbiBFbmdpbmUsIGZvciByZWZlcmVuY2UuICovCi0vKiBUaGUgU0g3NzUxIFNvbHV0aW9uIEVuZ2luZSBoYXMgYSBkaWZmZXJlbnQgU3VwZXJJTy4gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBzbXNjX2NvbmZpZyhpbnQgaW5kZXgsIGludCBkYXRhKQotewotCW91dGJfcChpbmRleCwgSU5ERVhfUE9SVCk7Ci0Jb3V0Yl9wKGRhdGEsIERBVEFfUE9SVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3Ntc2Modm9pZCkKLXsKLQlvdXRiX3AoQ09ORklHX0VOVEVSLCBDT05GSUdfUE9SVCk7Ci0Jb3V0Yl9wKENPTkZJR19FTlRFUiwgQ09ORklHX1BPUlQpOwotCi0JLyogRkRDICovCi0Jc21zY19jb25maWcoQ1VSUkVOVF9MRE5fSU5ERVgsIExETl9GREMpOwotCXNtc2NfY29uZmlnKEFDVElWQVRFX0lOREVYLCAweDAxKTsKLQlzbXNjX2NvbmZpZyhJUlFfU0VMRUNUX0lOREVYLCA2KTsgLyogSVJRNiAqLwotCi0JLyogSURFMSAqLwotCXNtc2NfY29uZmlnKENVUlJFTlRfTEROX0lOREVYLCBMRE5fSURFMSk7Ci0Jc21zY19jb25maWcoQUNUSVZBVEVfSU5ERVgsIDB4MDEpOwotCXNtc2NfY29uZmlnKElSUV9TRUxFQ1RfSU5ERVgsIDE0KTsgLyogSVJRMTQgKi8KLQotCS8qIEFVWElPIChHUElPKTogdG8gdXNlIElERTEgKi8KLQlzbXNjX2NvbmZpZyhDVVJSRU5UX0xETl9JTkRFWCwgTEROX0FVWElPKTsKLQlzbXNjX2NvbmZpZyhHUElPNDZfSU5ERVgsIDB4MDApOyAvKiBuSU9ST1AgKi8KLQlzbXNjX2NvbmZpZyhHUElPNDdfSU5ERVgsIDB4MDApOyAvKiBuSU9XT1AgKi8KLQotCS8qIENPTTEgKi8KLQlzbXNjX2NvbmZpZyhDVVJSRU5UX0xETl9JTkRFWCwgTEROX0NPTTEpOwotCXNtc2NfY29uZmlnKEFDVElWQVRFX0lOREVYLCAweDAxKTsKLQlzbXNjX2NvbmZpZyhJT19CQVNFX0hJX0lOREVYLCAweDAzKTsKLQlzbXNjX2NvbmZpZyhJT19CQVNFX0xPX0lOREVYLCAweGY4KTsKLQlzbXNjX2NvbmZpZyhJUlFfU0VMRUNUX0lOREVYLCA0KTsgLyogSVJRNCAqLwotCi0JLyogQ09NMiAqLwotCXNtc2NfY29uZmlnKENVUlJFTlRfTEROX0lOREVYLCBMRE5fQ09NMik7Ci0Jc21zY19jb25maWcoQUNUSVZBVEVfSU5ERVgsIDB4MDEpOwotCXNtc2NfY29uZmlnKElPX0JBU0VfSElfSU5ERVgsIDB4MDIpOwotCXNtc2NfY29uZmlnKElPX0JBU0VfTE9fSU5ERVgsIDB4ZjgpOwotCXNtc2NfY29uZmlnKElSUV9TRUxFQ1RfSU5ERVgsIDMpOyAvKiBJUlEzICovCi0KLQkvKiBSVEMgKi8KLQlzbXNjX2NvbmZpZyhDVVJSRU5UX0xETl9JTkRFWCwgTEROX1JUQyk7Ci0Jc21zY19jb25maWcoQUNUSVZBVEVfSU5ERVgsIDB4MDEpOwotCXNtc2NfY29uZmlnKElSUV9TRUxFQ1RfSU5ERVgsIDgpOyAvKiBJUlE4ICovCi0KLQkvKiBYWFg6IFBBUlBPUlQsIEtCRCwgYW5kIE1PVVNFIHdpbGwgY29tZSBoZXJlLi4uICovCi0Jb3V0Yl9wKENPTkZJR19FWElULCBDT05GSUdfUE9SVCk7Ci19Ci0jZW5kaWYKLQotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICI3NzUxIFNvbHV0aW9uRW5naW5lIjsKLX0KLQotI2lmZGVmIENPTkZJR19TSF9LR0RCCiBzdGF0aWMgaW50IGtnZGJfdWFydF9zZXR1cCh2b2lkKTsKIHN0YXRpYyBzdHJ1Y3Qga2dkYl9zZXJtYXAga2dkYl91YXJ0X3Nlcm1hcCA9IAogeyAidHR5UyIsIDAsIGtnZGJfdWFydF9zZXR1cCwgTlVMTCB9OwpAQCAtOTEsNyArMjgsNyBAQAogLyoKICAqIEluaXRpYWxpemUgdGhlIGJvYXJkCiAgKi8KLXZvaWQgX19pbml0IHBsYXRmb3JtX3NldHVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgc2g3NzUxc2Vfc2V0dXAoY2hhciAqKmNtZGxpbmVfcCkKIHsKIAkvKiBDYWxsIGluaXRfc21zYygpIHJlcGxhY2VtZW50IHRvIHNldCB1cCBTdXBlcklPLiAqLwogCS8qIFhYWDogUlRDIHNldHRpbmcgY29tZXMgaGVyZSAqLwpAQCAtMjI1LDMgKzE2MiwzNyBAQAogCXJldHVybiAwOwogfQogI2VuZGlmIC8qIENPTkZJR19TSF9LR0RCICovCisKKworLyoKKyAqIFRoZSBNYWNoaW5lIFZlY3RvcgorICovCisKK3N0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83NzUxc2UgX19pbml0bXYgPSB7CisJLm12X25hbWUJCT0gIjc3NTEgU29sdXRpb25FbmdpbmUiLAorCS5tdl9zZXR1cAkJPSBzaDc3NTFzZV9zZXR1cCwKKwkubXZfbnJfaXJxcwkJPSA3MiwKKworCS5tdl9pbmIJCQk9IHNoNzc1MXNlX2luYiwKKwkubXZfaW53CQkJPSBzaDc3NTFzZV9pbncsCisJLm12X2lubAkJCT0gc2g3NzUxc2VfaW5sLAorCS5tdl9vdXRiCQk9IHNoNzc1MXNlX291dGIsCisJLm12X291dHcJCT0gc2g3NzUxc2Vfb3V0dywKKwkubXZfb3V0bAkJPSBzaDc3NTFzZV9vdXRsLAorCisJLm12X2luYl9wCQk9IHNoNzc1MXNlX2luYl9wLAorCS5tdl9pbndfcAkJPSBzaDc3NTFzZV9pbncsCisJLm12X2lubF9wCQk9IHNoNzc1MXNlX2lubCwKKwkubXZfb3V0Yl9wCQk9IHNoNzc1MXNlX291dGJfcCwKKwkubXZfb3V0d19wCQk9IHNoNzc1MXNlX291dHcsCisJLm12X291dGxfcAkJPSBzaDc3NTFzZV9vdXRsLAorCisJLm12X2luc2wJCT0gc2g3NzUxc2VfaW5zbCwKKwkubXZfb3V0c2wJCT0gc2g3NzUxc2Vfb3V0c2wsCisKKwkubXZfaW5pdF9pcnEJCT0gaW5pdF83NzUxc2VfSVJRLAorI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKKwkubXZfaGVhcnRiZWF0CQk9IGhlYXJ0YmVhdF83NzUxc2UsCisjZW5kaWYKK307CitBTElBU19NVig3NzUxc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaDAzL3J0Yy5jIGIvYXJjaC9zaC9ib2FyZHMvc2gwMy9ydGMuYwppbmRleCBkNjA5ODYzLi4wYTkyNjZiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zaDAzL3J0Yy5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NoMDMvcnRjLmMKQEAgLTEwLDkgKzEwLDEwIEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvYmNkLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcnRjLmg+CiAKICNkZWZpbmUgUlRDX0JBU0UJMHhiMDAwMDAwMAogI2RlZmluZSBSVENfU0VDMQkoUlRDX0JBU0UgKyAwKQpAQCAtMzQsOCArMzUsNiBAQAogI2RlZmluZSBSVENfQlVTWQkxCiAjZGVmaW5lIFJUQ19TVE9QCTIKIAotZXh0ZXJuIHZvaWQgKCpydGNfZ2V0X3RpbWUpKHN0cnVjdCB0aW1lc3BlYyAqKTsKLWV4dGVybiBpbnQgKCpydGNfc2V0X3RpbWUpKGNvbnN0IHRpbWVfdCk7CiBleHRlcm4gc3BpbmxvY2tfdCBydGNfbG9jazsKIAogdW5zaWduZWQgbG9uZyBnZXRfY21vc190aW1lKHZvaWQpCkBAIC0xMjgsNiArMTI3LDYgQEAKIAogdm9pZCBzaDAzX3RpbWVfaW5pdCh2b2lkKQogewotCXJ0Y19nZXRfdGltZSA9IHNoMDNfcnRjX2dldHRpbWVvZmRheTsKLQlydGNfc2V0X3RpbWUgPSBzaDAzX3J0Y19zZXR0aW1lb2ZkYXk7CisJcnRjX3NoX2dldF90aW1lID0gc2gwM19ydGNfZ2V0dGltZW9mZGF5OworCXJ0Y19zaF9zZXRfdGltZSA9IHNoMDNfcnRjX3NldHRpbWVvZmRheTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NoMDMvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NoMDMvc2V0dXAuYwppbmRleCA2MDI5MGY4Li42YzMxMDU4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2gwMy9zZXR1cC5jCkBAIC03LDIyICs3LDEzIEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KLSNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcnRjLmg+CiAjaW5jbHVkZSA8YXNtL3NoMDMvaW8uaD4KICNpbmNsdWRlIDxhc20vc2gwMy9zaDAzLmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgotI2luY2x1ZGUgIi4uLy4uL2RyaXZlcnMvcGNpL3BjaS1zaDc3NTEuaCIKIAotZXh0ZXJuIHZvaWQgKCpib2FyZF90aW1lX2luaXQpKHZvaWQpOwotCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKLXsKLQlyZXR1cm4gIkludGVyZmFjZSBDVFAvUENJLVNIMDMpIjsKLX0KLQotdm9pZCBpbml0X3NoMDNfSVJRKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9zaDAzX0lSUSh2b2lkKQogewogCWN0cmxfb3V0dyhjdHJsX2ludyhJTlRDX0lDUikgfCBJTlRDX0lDUl9JUkxNLCBJTlRDX0lDUik7CiAKQEAgLTM0LDM4ICsyNSwzNCBAQAogCiBleHRlcm4gdm9pZCAqY2ZfaW9fYmFzZTsKIAotdW5zaWduZWQgbG9uZyBzaDAzX2lzYV9wb3J0MmFkZHIodW5zaWduZWQgbG9uZyBwb3J0KQorc3RhdGljIHZvaWQgX19pb21lbSAqc2gwM19pb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJaWYgKFBYU0VHKHBvcnQpKQotCQlyZXR1cm4gcG9ydDsKKwkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilwb3J0OwogCS8qIENvbXBhY3RGbGFzaCAoSURFKSAqLwotCWlmICgoKHBvcnQgPj0gMHgxZjApICYmIChwb3J0IDw9IDB4MWY3KSkgfHwgKHBvcnQgPT0gMHgzZjYpKSB7Ci0JCXJldHVybiAodW5zaWduZWQgbG9uZyljZl9pb19iYXNlICsgcG9ydDsKLQl9Ci0gICAgICAgIHJldHVybiBwb3J0ICsgU0g3NzUxX1BDSV9JT19CQVNFOworCWlmICgoKHBvcnQgPj0gMHgxZjApICYmIChwb3J0IDw9IDB4MWY3KSkgfHwgKHBvcnQgPT0gMHgzZjYpKQorCQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKSgodW5zaWduZWQgbG9uZyljZl9pb19iYXNlICsgcG9ydCk7CisKKyAgICAgICAgcmV0dXJuICh2b2lkIF9faW9tZW0gKikocG9ydCArIFBDSV9JT19CQVNFKTsKIH0KIAotLyoKLSAqIFRoZSBNYWNoaW5lIFZlY3RvcgotICovCisvKiBhcmNoL3NoL2JvYXJkcy9zaDAzL3J0Yy5jICovCit2b2lkIHNoMDNfdGltZV9pbml0KHZvaWQpOworCitzdGF0aWMgdm9pZCBfX2luaXQgc2gwM19zZXR1cChjaGFyICoqY21kbGluZV9wKQoreworCWJvYXJkX3RpbWVfaW5pdCA9IHNoMDNfdGltZV9pbml0OworfQogCiBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2gwMyBfX2luaXRtdiA9IHsKKwkubXZfbmFtZQkJPSAiSW50ZXJmYWNlIChDVFAvUENJLVNIMDMpIiwKKwkubXZfc2V0dXAJCT0gc2gwM19zZXR1cCwKIAkubXZfbnJfaXJxcwkJPSA0OCwKLQkubXZfaXNhX3BvcnQyYWRkcgk9IHNoMDNfaXNhX3BvcnQyYWRkciwKKwkubXZfaW9wb3J0X21hcAkJPSBzaDAzX2lvcG9ydF9tYXAsCiAJLm12X2luaXRfaXJxCQk9IGluaXRfc2gwM19JUlEsCiAKICNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCiAJLm12X2hlYXJ0YmVhdAkJPSBoZWFydGJlYXRfc2gwMywKICNlbmRpZgogfTsKLQogQUxJQVNfTVYoc2gwMykKLQotLyogYXJjaC9zaC9ib2FyZHMvc2gwMy9ydGMuYyAqLwotdm9pZCBzaDAzX3RpbWVfaW5pdCh2b2lkKTsKLQotaW50IF9faW5pdCBwbGF0Zm9ybV9zZXR1cCh2b2lkKQotewotCWJvYXJkX3RpbWVfaW5pdCA9IHNoMDNfdGltZV9pbml0OwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2gyMDAwL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvc2gyMDAwL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWQzOTBjLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3NoMjAwMC9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdGhlIFNIMjAwMCBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUga2VybmVsCi0jCi0KLW9iai15CSA6PSBzZXR1cC5vCi0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NoMjAwMC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2gyMDAwL3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZTZhMTEuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2gyMDAwL3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9rZXJuZWwvc2V0dXBfc2gyMDAwLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEgIFNVR0lPS0EgVG9jaGlub2J1Ci0gKgotICogU0gtMjAwMCBTdXBwb3J0LgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9zaDIwMDAuaD4KLQotI2RlZmluZSBDRl9DSVNfQkFTRQkweGI0MjAwMDAwCi0KLSNkZWZpbmUgUE9SVF9QRUNSCTB4YTQwMDAxMDgKLSNkZWZpbmUgUE9SVF9QSENSCTB4YTQwMDAxMEUKLSNkZWZpbmUJUE9SVF9JQ1IxCTB4YTQwMDAwMTAKLSNkZWZpbmUJUE9SVF9JUlIwCTB4YTQwMDAwMDQKLQotI2RlZmluZSBJREVfT0ZGU0VUCTB4YjYyMDAwMDAKLSNkZWZpbmUgTklDX09GRlNFVAkweGI2MDAwMDAwCi0jZGVmaW5lIEVYVEJVU19PRkZTRVQJMHhiYTAwMDAwMAotCi0KLWNvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQotewotCXJldHVybiAic2gyMDAwIjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgc2gyMDAwX2lzYV9wb3J0MmFkZHIodW5zaWduZWQgbG9uZyBvZmZzZXQpCi17Ci0JaWYoKG9mZnNldCAmIH43KSA9PSAweDFmMCB8fCBvZmZzZXQgPT0gMHgzZjYpCi0JCXJldHVybiBJREVfT0ZGU0VUICsgb2Zmc2V0OwotCWVsc2UgaWYoKG9mZnNldCAmIH4weDFmKSA9PSAweDMwMCkKLQkJcmV0dXJuIE5JQ19PRkZTRVQgKyBvZmZzZXQ7Ci0JcmV0dXJuIEVYVEJVU19PRkZTRVQgKyBvZmZzZXQ7Ci19Ci0KLS8qCi0gKiBUaGUgTWFjaGluZSBWZWN0b3IKLSAqLwotc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIG12X3NoMjAwMCBfX2luaXRtdiA9IHsKLSAgICAgICAgLm12X25yX2lycXMJCT0gODAsCi0gICAgICAgIC5tdl9pc2FfcG9ydDJhZGRyCT0gc2gyMDAwX2lzYV9wb3J0MmFkZHIsCi19OwotQUxJQVNfTVYoc2gyMDAwKQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgYm9hcmQKLSAqLwotaW50IF9faW5pdCBwbGF0Zm9ybV9zZXR1cCh2b2lkKQotewotCS8qIFhYWDogUlRDIHNldHRpbmcgY29tZXMgaGVyZSAqLwotCi0JLyogVGhlc2Ugc2hvdWxkIGJlIGRvbmUgYnkgQklPUy9JUEwgLi4uICovCi0JLyogRW5hYmxlIG5DRTJBLCBuQ0UyQiBvdXRwdXQgKi8KLQljdHJsX291dHcoY3RybF9pbncoUE9SVF9QRUNSKSAmIH4weGYwMCwgUE9SVF9QRUNSKTsKLQkvKiBFbmFibGUgdGhlIENvbXBhY3QgRmxhc2ggY2FyZCwgYW5kIHNldCB0aGUgbGV2ZWwgaW50ZXJydXB0ICovCi0JY3RybF9vdXR3KDB4MDA0MiwgQ0ZfQ0lTX0JBU0UrMHgwMjAwKTsKLQkvKiBFbmFibGUgaW50ZXJydXB0ICovCi0JY3RybF9vdXR3KGN0cmxfaW53KFBPUlRfUEhDUikgJiB+MHgwM2YzLCBQT1JUX1BIQ1IpOwotCWN0cmxfb3V0dygxLCBQT1JUX0lDUjEpOwotCWN0cmxfb3V0dyhjdHJsX2ludyhQT1JUX0lSUjApICYgfjB4ZmYzZiwgUE9SVF9JUlIwKTsKLQlwcmludGsoS0VSTl9JTkZPICJTSC0yMDAwIFNldHVwLi4uZG9uZVxuIik7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaG1pbi9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL3NobWluL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOTBjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9zaG1pbi9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBTSE1JTiBib2FyZC4KKyMKKworb2JqLXkJIDo9IHNldHVwLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NobWluL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMGMxOTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBhcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRha2FzaGkgWU9TSElJCisgKgorICogU0hNSU4gU3VwcG9ydC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgorI2luY2x1ZGUgPGFzbS9zaG1pbi9zaG1pbi5oPgorI2luY2x1ZGUgPGFzbS9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBQRkNfUEhDUgkweGE0MDAwMTBlCisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X3NobWluX2lycSh2b2lkKQoreworCWN0cmxfb3V0dygweDJhMDAsIFBGQ19QSENSKTsJLy8gSVJRMC0zPUlSUQorCWN0cmxfb3V0dygweDBhYWEsIElOVENfSUNSMSk7CS8vIElSUTAtMz1JUlEtbW9kZSxMb3ctYWN0aXZlLgorfQorCitzdGF0aWMgdm9pZCBfX2lvbWVtICpzaG1pbl9pb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IHNpemUpCit7CisJc3RhdGljIGludCBkdW1teTsKKworCWlmICgocG9ydCAmIH4weDFmKSA9PSBTSE1JTl9ORV9CQVNFKQorCQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKShTSE1JTl9JT19CQVNFICsgcG9ydCk7CisKKwlkdW1teSA9IDA7CisKKwlyZXR1cm4gJmR1bW15OworCit9CisKK3N0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zaG1pbiBfX2luaXRtdiA9IHsKKwkubXZfbmFtZQk9ICJTSE1JTiIsCisJLm12X2luaXRfaXJxCT0gaW5pdF9zaG1pbl9pcnEsCisJLm12X2lvcG9ydF9tYXAJPSBzaG1pbl9pb3BvcnRfbWFwLAorfTsKK0FMSUFTX01WKHNobWluKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc25hcGdlYXIvaW8uYyBiL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL2lvLmMKaW5kZXggZTJlYjc4Zi4uMGY0ODI0MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc25hcGdlYXIvaW8uYworKysgYi9hcmNoL3NoL2JvYXJkcy9zbmFwZ2Vhci9pby5jCkBAIC0xLDYgKzEsNCBAQAotLyogCi0gKiBsaW51eC9hcmNoL3NoL2tlcm5lbC9pb183NzUxc2UuYwotICoKKy8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkbUBzbmFwZ2Vhci5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIElhbiBkYSBTaWx2YSwgSmVyZW15IFNpZWdlbAogICogQmFzZWQgbGFyZ2VseSBvbiBpb19zZS5jLgpAQCAtMTEsNjcgKzksMjIgQEAKICAqIHBsYWNlaG9sZGVyIGNvZGUgZnJvbSBpb19zZS5jIGxlZnQgaW4gd2l0aCB0aGUKICAqIGV4cGVjdGF0aW9uIG9mIGxhdGVyIFN1cGVySU8gYW5kIFBDTUNJQSBhY2Nlc3MuCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogCi0jaW5jbHVkZSA8YXNtL3BjaS5oPgotI2luY2x1ZGUgIi4uLy4uL2RyaXZlcnMvcGNpL3BjaS1zaDc3NTEuaCIKLQogI2lmZGVmIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMAogdW5zaWduZWQgc2hvcnQgc2VjdXJlZWRnZTU0MTBfaW9wb3J0OwogI2VuZGlmCiAKLS8qCi0gKiBUaGUgU25hcEdlYXIgdXNlcyB0aGUgYnVpbHQtaW4gUENJIGNvbnRyb2xsZXIgKFBDSUMpCi0gKiBvZiB0aGUgNzc1MSBwcm9jZXNzb3IKLSAqLyAKLQotI2RlZmluZSBQQ0lJT0JSCQkodm9sYXRpbGUgbG9uZyAqKVBDSV9SRUcoU0g3NzUxX1BDSUlPQlIpCi0jZGVmaW5lIFBDSU1CUiAgICAgICAgICAodm9sYXRpbGUgbG9uZyAqKVBDSV9SRUcoU0g3NzUxX1BDSU1CUikKLSNkZWZpbmUgUENJX0lPX0FSRUEJU0g3NzUxX1BDSV9JT19CQVNFCi0jZGVmaW5lIFBDSV9NRU1fQVJFQQlTSDc3NTFfUENJX0NPTkZJR19CQVNFCi0KLQotI2RlZmluZSBQQ0lfSU9NQVAoYWRyKQkoUENJX0lPX0FSRUEgKyAoYWRyICYgflNINzc1MV9QQ0lJT0JSX01BU0spKQotCi0KLSNkZWZpbmUgbWF5YmViYWRpbyhuYW1lLHBvcnQpIFwKLSAgcHJpbnRrKCJiYWQgUEMtbGlrZSBpbyAlcyBmb3IgcG9ydCAweCVseCBhdCAweCUwOHhcbiIsIFwKLQkgI25hbWUsIChwb3J0KSwgKF9fdTMyKSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpCi0KLQotc3RhdGljIGlubGluZSB2b2lkIGRlbGF5KHZvaWQpCi17Ci0JY3RybF9pbncoMHhhMDAwMDAwMCk7Ci19Ci0KLQogc3RhdGljIGlubGluZSB2b2xhdGlsZSBfX3UxNiAqcG9ydDJhZHIodW5zaWduZWQgaW50IHBvcnQpCiB7Ci0jaWYgMAotCWlmIChwb3J0ID49IDB4MjAwMCkKLQkJcmV0dXJuICh2b2xhdGlsZSBfX3UxNiAqKSAoUEFfTVJTSFBDICsgKHBvcnQgLSAweDIwMDApKTsKLSNlbmRpZgotCW1heWJlYmFkaW8obmFtZSwodW5zaWduZWQgbG9uZylwb3J0KTsKKwltYXliZWJhZGlvKCh1bnNpZ25lZCBsb25nKXBvcnQpOwogCXJldHVybiAodm9sYXRpbGUgX191MTYqKXBvcnQ7CiB9CiAKLQotLyogSW4gY2FzZSBzb21lb25lIGNvbmZpZ3VyZXMgdGhlIGtlcm5lbCB3L28gUENJIHN1cHBvcnQ6IGluIHRoYXQgKi8KLS8qIHNjZW5hcmlvLCBkb24ndCBldmVyIGJvdGhlciB0byBjaGVjayBmb3IgUENJLXdpbmRvdyBhZGRyZXNzZXMgKi8KLQotLyogTk9URTogV0lORE9XIENIRUNLIE1BWSBCRSBBIEJJVCBPRkYsIEhJR0ggUENJQklPU19NSU5fSU8gV1JBUFM/ICovCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKQotI2RlZmluZSBDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgXAotICAoKHBvcnQgPj0gUENJQklPU19NSU5fSU8pICYmIChwb3J0IDwgKFBDSUJJT1NfTUlOX0lPICsgU0g3NzUxX1BDSV9JT19TSVpFKSkpCi0jZWxzZQotI2RlZmluZSBDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkgKDApCi0jZW5kaWYKLQogLyoKICAqIEdlbmVyYWwgb3V0bGluZTogcmVtYXAgcmVhbGx5IGxvdyBzdHVmZiBbZXZlbnR1YWxseV0gdG8gU3VwZXJJTywKICAqIHN0dWZmIGluIFBDSSBJTyBzcGFjZSAoYXQgb3IgYWJvdmUgd2luZG93IGF0IHBjaS5oOlBDSUJJT1NfTUlOX0lPKQpAQCAtNzksMTQ4ICszMiwxMDYgQEAKICAqIHNob3VsZCBiZSB3YXkgYmV5b25kIHRoZSB3aW5kb3csIGFuZCBpcyB1c2VkICB3L28gdHJhbnNsYXRpb24gZm9yCiAgKiBjb21wYXRpYmlsaXR5LgogICovCi0KIHVuc2lnbmVkIGNoYXIgc25hcGdlYXJfaW5iKHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAlpZiAoUFhTRUcocG9ydCkpCiAJCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0OwotCWVsc2UgaWYgKENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSkKLQkJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKVBDSV9JT01BUChwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQorCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlCi0JCXJldHVybiAoKnBvcnQyYWRyKHBvcnQpKSYweGZmOyAKKwkJcmV0dXJuICgqcG9ydDJhZHIocG9ydCkpICYgMHhmZjsKIH0KIAotCiB1bnNpZ25lZCBjaGFyIHNuYXBnZWFyX2luYl9wKHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAl1bnNpZ25lZCBjaGFyIHY7CiAKIAlpZiAoUFhTRUcocG9ydCkpCiAJCXYgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0OwotCWVsc2UgaWYgKENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSkKLQkJdiA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKVBDSV9JT01BUChwb3J0KTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQorCQl2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlCi0JCXYgPSAoKnBvcnQyYWRyKHBvcnQpKSYweGZmOyAKLQlkZWxheSgpOworCQl2ID0gKCpwb3J0MmFkcihwb3J0KSkmMHhmZjsKKwljdHJsX2RlbGF5KCk7CiAJcmV0dXJuIHY7CiB9CiAKLQogdW5zaWduZWQgc2hvcnQgc25hcGdlYXJfaW53KHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAlpZiAoUFhTRUcocG9ydCkpCiAJCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDsKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkpCi0JCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopUENJX0lPTUFQKHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisJCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlIGlmIChwb3J0ID49IDB4MjAwMCkKIAkJcmV0dXJuICpwb3J0MmFkcihwb3J0KTsKIAllbHNlCi0JCW1heWJlYmFkaW8oaW53LCBwb3J0KTsKKwkJbWF5YmViYWRpbyhwb3J0KTsKIAlyZXR1cm4gMDsKIH0KIAotCiB1bnNpZ25lZCBpbnQgc25hcGdlYXJfaW5sKHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAlpZiAoUFhTRUcocG9ydCkpCiAJCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilwb3J0OwotCWVsc2UgaWYgKENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSkKLQkJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgaW50ICopUENJX0lPTUFQKHBvcnQpOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisJCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKXBjaV9pb2FkZHIocG9ydCk7CiAJZWxzZSBpZiAocG9ydCA+PSAweDIwMDApCiAJCXJldHVybiAqcG9ydDJhZHIocG9ydCk7CiAJZWxzZQotCQltYXliZWJhZGlvKGlubCwgcG9ydCk7CisJCW1heWJlYmFkaW8ocG9ydCk7CiAJcmV0dXJuIDA7CiB9CiAKLQogdm9pZCBzbmFwZ2Vhcl9vdXRiKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAogCWlmIChQWFNFRyhwb3J0KSkKIAkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydCA9IHZhbHVlOwotCWVsc2UgaWYgKENIRUNLX1NINzc1MV9QQ0lJTyhwb3J0KSkKLQkJKigodW5zaWduZWQgY2hhciopUENJX0lPTUFQKHBvcnQpKSA9IHZhbHVlOworCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisJCSooKHVuc2lnbmVkIGNoYXIqKXBjaV9pb2FkZHIocG9ydCkpID0gdmFsdWU7CiAJZWxzZQogCQkqKHBvcnQyYWRyKHBvcnQpKSA9IHZhbHVlOwogfQogCi0KIHZvaWQgc25hcGdlYXJfb3V0Yl9wKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAlpZiAoUFhTRUcocG9ydCkpCiAJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBvcnQgPSB2YWx1ZTsKLQllbHNlIGlmIChDSEVDS19TSDc3NTFfUENJSU8ocG9ydCkpCi0JCSooKHVuc2lnbmVkIGNoYXIqKVBDSV9JT01BUChwb3J0KSkgPSB2YWx1ZTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQorCQkqKCh1bnNpZ25lZCBjaGFyKilwY2lfaW9hZGRyKHBvcnQpKSA9IHZhbHVlOwogCWVsc2UKIAkJKihwb3J0MmFkcihwb3J0KSkgPSB2YWx1ZTsKLQlkZWxheSgpOworCWN0cmxfZGVsYXkoKTsKIH0KIAotCiB2b2lkIHNuYXBnZWFyX291dHcodW5zaWduZWQgc2hvcnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAlpZiAoUFhTRUcocG9ydCkpCiAJCSoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ID0gdmFsdWU7Ci0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpKQotCQkqKCh1bnNpZ25lZCBzaG9ydCAqKVBDSV9JT01BUChwb3J0KSkgPSB2YWx1ZTsKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQorCQkqKCh1bnNpZ25lZCBzaG9ydCAqKXBjaV9pb2FkZHIocG9ydCkpID0gdmFsdWU7CiAJZWxzZSBpZiAocG9ydCA+PSAweDIwMDApCiAJCSpwb3J0MmFkcihwb3J0KSA9IHZhbHVlOwogCWVsc2UKLQkJbWF5YmViYWRpbyhvdXR3LCBwb3J0KTsKKwkJbWF5YmViYWRpbyhwb3J0KTsKIH0KIAotCiB2b2lkIHNuYXBnZWFyX291dGwodW5zaWduZWQgaW50IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCiB7CiAJaWYgKFBYU0VHKHBvcnQpKQogCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilwb3J0ID0gdmFsdWU7Ci0JZWxzZSBpZiAoQ0hFQ0tfU0g3NzUxX1BDSUlPKHBvcnQpKQotCQkqKCh1bnNpZ25lZCBsb25nKilQQ0lfSU9NQVAocG9ydCkpID0gdmFsdWU7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKwkJKigodW5zaWduZWQgbG9uZyopcGNpX2lvYWRkcihwb3J0KSkgPSB2YWx1ZTsKIAllbHNlCi0JCW1heWJlYmFkaW8ob3V0bCwgcG9ydCk7CisJCW1heWJlYmFkaW8ocG9ydCk7CiB9CiAKIHZvaWQgc25hcGdlYXJfaW5zbCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JbWF5YmViYWRpbyhpbnNsLCBwb3J0KTsKKwltYXliZWJhZGlvKHBvcnQpOwogfQogCiB2b2lkIHNuYXBnZWFyX291dHNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKLQltYXliZWJhZGlvKG91dHN3LCBwb3J0KTsKLX0KLQotLyogTWFwIElTQSBidXMgYWRkcmVzcyB0byB0aGUgcmVhbCBhZGRyZXNzLiBPbmx5IGZvciBQQ01DSUEuICAqLwotCi0KLS8qIElTQSBwYWdlIGRlc2NyaXB0b3IuICAqLwotc3RhdGljIF9fdTMyIHNoX2lzYV9tZW1tYXBbMjU2XTsKLQotCi0jaWYgMAotc3RhdGljIGludCBzaF9pc2FfbW1hcChfX3UzMiBzdGFydCwgX191MzIgbGVuZ3RoLCBfX3UzMiBvZmZzZXQpCi17Ci0JaW50IGlkeDsKLQotCWlmIChzdGFydCA+PSAweDEwMDAwMCB8fCAoc3RhcnQgJiAweGZmZikgfHwgKGxlbmd0aCAhPSAweDEwMDApKQotCQlyZXR1cm4gLTE7Ci0KLQlpZHggPSBzdGFydCA+PiAxMjsKLQlzaF9pc2FfbWVtbWFwW2lkeF0gPSAweGI4MDAwMDAwICsgKG9mZnNldCAmfiAweGZmZik7Ci0jaWYgMAotCXByaW50aygic2hfaXNhX21tYXA6IHN0YXJ0ICV4IGxlbiAleCBvZmZzZXQgJXggKGlkeCAleCBwYWRkciAleClcbiIsCi0JICAgICAgIHN0YXJ0LCBsZW5ndGgsIG9mZnNldCwgaWR4LCBzaF9pc2FfbWVtbWFwW2lkeF0pOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotdW5zaWduZWQgbG9uZyBzbmFwZ2Vhcl9pc2FfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQotewotCWludCBpZHg7Ci0KLQlpZHggPSAob2Zmc2V0ID4+IDEyKSAmIDB4ZmY7Ci0Jb2Zmc2V0ICY9IDB4ZmZmOwotCXJldHVybiBzaF9pc2FfbWVtbWFwW2lkeF0gKyBvZmZzZXQ7CisJbWF5YmViYWRpbyhwb3J0KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL3J0Yy5jIGIvYXJjaC9zaC9ib2FyZHMvc25hcGdlYXIvcnRjLmMKaW5kZXggYjcxZTAwOS4uMTY1OWZkZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc25hcGdlYXIvcnRjLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc25hcGdlYXIvcnRjLmMKQEAgLTE3LDE0ICsxNyw5IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+Ci0KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcnRjLmg+Ci0jaW5jbHVkZSA8YXNtL21jMTQ2ODE4cnRjLmg+CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgaW50IHVzZV9kczEzMDIgPSAwOworc3RhdGljIGludCB1c2VfZHMxMzAyOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCkBAIC04MiwxMCArNzcsNiBAQAogCXVuc2lnbmVkIGludAl2YWw7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAotI2lmIDAKLQlwcmludGsoIlNuYXBHZWFyIFJUQzogZHMxMzAyX3JlYWRieXRlKGFkZHI9JXgpXG4iLCBhZGRyKTsKLSNlbmRpZgotCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXNldF9kaXJwKGdldF9kaXJwKCkgfCBSVENfUkVTRVQgfCBSVENfSU9EQVRBIHwgUlRDX1NDTEspOwogCXNldF9kcChnZXRfZHAoKSAmIH4oUlRDX1JFU0VUIHwgUlRDX0lPREFUQSB8IFJUQ19TQ0xLKSk7CkBAIC0xMDQsMTAgKzk1LDYgQEAKIHsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCi0jaWYgMAotCXByaW50aygiU25hcEdlYXIgUlRDOiBkczEzMDJfd3JpdGVieXRlKGFkZHI9JXgpXG4iLCBhZGRyKTsKLSNlbmRpZgotCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXNldF9kaXJwKGdldF9kaXJwKCkgfCBSVENfUkVTRVQgfCBSVENfSU9EQVRBIHwgUlRDX1NDTEspOwogCXNldF9kcChnZXRfZHAoKSAmIH4oUlRDX1JFU0VUIHwgUlRDX0lPREFUQSB8IFJUQ19TQ0xLKSk7CkBAIC0xNjgsMTEgKzE1NSw4IEBACiAJCX0KIAogCWlmICh1c2VfZHMxMzAyKSB7Ci0JCXJ0Y19nZXRfdGltZSA9IHNuYXBnZWFyX3J0Y19nZXR0aW1lb2ZkYXk7Ci0JCXJ0Y19zZXRfdGltZSA9IHNuYXBnZWFyX3J0Y19zZXR0aW1lb2ZkYXk7Ci0JfSBlbHNlIHsKLQkJcnRjX2dldF90aW1lID0gc2hfcnRjX2dldHRpbWVvZmRheTsKLQkJcnRjX3NldF90aW1lID0gc2hfcnRjX3NldHRpbWVvZmRheTsKKwkJcnRjX3NoX2dldF90aW1lID0gc25hcGdlYXJfcnRjX2dldHRpbWVvZmRheTsKKwkJcnRjX3NoX3NldF90aW1lID0gc25hcGdlYXJfcnRjX3NldHRpbWVvZmRheTsKIAl9CiAJCQogCXByaW50aygiU25hcEdlYXIgUlRDOiB1c2luZyAlcyBydGMuXG4iLCB1c2VfZHMxMzAyID8gImRzMTMwMiIgOiAiaW50ZXJuYWwiKTsKQEAgLTE4NywxMCArMTcxLDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgc2VjLCBtaW4sIGhyLCBkYXksIG1vbiwgeXI7CiAKLQlpZiAoIXVzZV9kczEzMDIpIHsKLQkJc2hfcnRjX2dldHRpbWVvZmRheSh0cyk7CisJaWYgKCF1c2VfZHMxMzAyKQogCQlyZXR1cm47Ci0JfQogCiAgCXNlYyA9IGJjZDJpbnQoZHMxMzAyX3JlYWRieXRlKFJUQ19BRERSX1NFQykpOwogIAltaW4gPSBiY2QyaW50KGRzMTMwMl9yZWFkYnl0ZShSVENfQUREUl9NSU4pKTsKQEAgLTIzMSw3ICsyMTMsNyBAQAogCXVuc2lnbmVkIGxvbmcgbm93dGltZTsKIAogCWlmICghdXNlX2RzMTMwMikKLQkJcmV0dXJuIHNoX3J0Y19zZXR0aW1lb2ZkYXkoc2Vjcyk7CisJCXJldHVybiAwOwogCiAvKgogICoJVGhpcyBpcyBjYWxsZWQgZGlyZWN0IGZyb20gdGhlIGtlcm5lbCB0aW1lciBoYW5kbGluZyBjb2RlLgpAQCAtMjQwLDEwICsyMjIsNiBAQAogCiAJbm93dGltZSA9IHNlY3M7CiAKLSNpZiAxCi0JcHJpbnRrKCJTbmFwR2VhciBSVEM6IHNuYXBnZWFyX3J0Y19zZXR0aW1lb2ZkYXkobm93dGltZT0lbGQpXG4iLCBub3d0aW1lKTsKLSNlbmRpZgotCiAJLyogU1RPUCBSVEMgKi8KIAlkczEzMDJfd3JpdGVieXRlKFJUQ19BRERSX1NFQywgZHMxMzAyX3JlYWRieXRlKFJUQ19BRERSX1NFQykgfCAweDgwKTsKIApAQCAtMzI5LDUgKzMwNywzIEBACiAJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKIAl9CiB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc25hcGdlYXIvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NuYXBnZWFyL3NldHVwLmMKaW5kZXggZjFmN2M3MC4uZjVlOThjNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc25hcGdlYXIvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zbmFwZ2Vhci9zZXR1cC5jCkBAIC0xLDUgKzEsNCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAKKy8qCiAgKiBsaW51eC9hcmNoL3NoL2JvYXJkcy9zbmFwZ2Vhci9zZXR1cC5jCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAyICBEYXZpZCBNY0N1bGxvdWdoIDxkYXZpZG1Ac25hcGdlYXIuY29tPgpAQCAtMTIsOCArMTEsNiBAQAogICogICAgICAgICAgIE1vZGlmaWVkIGZvciA3NzUxIFNvbHV0aW9uIEVuZ2luZSBieQogICogICAgICAgICAgIElhbiBkYSBTaWx2YSBhbmQgSmVyZW15IFNpZWdlbCwgMjAwMS4KICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0yMSwxNCArMTgsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgotI2luY2x1ZGUgPGFzbS9tYWNoL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NuYXBnZWFyLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9ydGMuaD4KICNpbmNsdWRlIDxhc20vY3B1L3RpbWVyLmg+CiAKLWV4dGVybiB2b2lkICgqYm9hcmRfdGltZV9pbml0KSh2b2lkKTsKIGV4dGVybiB2b2lkIHNlY3VyZWVkZ2U1NDEwX3J0Y19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgcGNpYmlvc19pbml0KHZvaWQpOwogCkBAIC04NSwxMDEgKzgxLDIwIEBACiAJbWFrZV9pcHJfaXJxKElSTDNfSVJRLCBJUkwzX0lQUl9BRERSLCBJUkwzX0lQUl9QT1MsIElSTDNfUFJJT1JJVFkpOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCi0gKglGYXN0IHBvbGwgaW50ZXJydXB0IHNpbXVsYXRvci4KKyAqIEluaXRpYWxpemUgdGhlIGJvYXJkCiAgKi8KLQotLyoKLSAqIExlYXZlIGFsbCBvZiB0aGUgZmFzdCB0aW1lci9mYXN0IHBvbGwgc3R1ZmYgY29tbWVudGVkIG91dCBmb3Igbm93LCBzaW5jZQotICogaXQncyBub3QgY2xlYXIgd2hldGhlciBpdCBhY3R1YWxseSB3b3JrcyBvciBub3QuIFNpbmNlIGl0IHdhc24ndCBiZWluZyB1c2VkCi0gKiBhdCBhbGwgaW4gMi40LCB3ZSdsbCBhc3N1bWUgaXQncyBub3Qgc2FuZSBmb3IgMi42IGVpdGhlci4uIC0tIFBGTQotICovCi0jaWYgMAotI2RlZmluZSBGQVNUX1BPTEwJMTAwMAotLy8jZGVmaW5lIEZBU1RfUE9MTF9JTlRSCi0KLSNkZWZpbmUgRkFTVFRJTUVSX0lSUSAgIDE3Ci0jZGVmaW5lIEZBU1RUSU1FUl9JUFJfQUREUiAgSU5UQ19JUFJBCi0jZGVmaW5lIEZBU1RUSU1FUl9JUFJfUE9TICAgIDIKLSNkZWZpbmUgRkFTVFRJTUVSX1BSSU9SSVRZICAgMwotCi0jaWZkZWYgRkFTVF9QT0xMX0lOVFIKLSNkZWZpbmUgVE1VMV9UQ1JfSU5JVAkweDAwMjAKLSNlbHNlCi0jZGVmaW5lIFRNVTFfVENSX0lOSVQJMAotI2VuZGlmCi0jZGVmaW5lIFRNVV9UU1RSX0lOSVQJMQotI2RlZmluZSBUTVUxX1RDUl9DQUxJQgkweDAwMDAKLQotCi0jaWZkZWYgRkFTVF9QT0xMX0lOVFIKLXN0YXRpYyB2b2lkIGZhc3RfdGltZXJfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBfX2luaXQgc25hcGdlYXJfc2V0dXAoY2hhciAqKmNtZGxpbmVfcCkKIHsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX3N0YXR1czsKLSAgICB0aW1lcl9zdGF0dXMgPSBjdHJsX2ludyhUTVUxX1RDUik7Ci0JdGltZXJfc3RhdHVzICY9IH4weDEwMDsKLQljdHJsX291dHcodGltZXJfc3RhdHVzLCBUTVUxX1RDUik7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIHJldHVybiB0aGUgY3VycmVudCB0aWNrcyBvbiB0aGUgZmFzdCB0aW1lcgotICovCi0KLXVuc2lnbmVkIGxvbmcgZmFzdF90aW1lcl9jb3VudCh2b2lkKQotewotCXJldHVybihjdHJsX2lubChUTVUxX1RDTlQpKTsKLX0KLQotLyoKLSAqIHNldHVwIGEgZmFzdCB0aW1lciBmb3IgcHJvZmlsaW5nIGV0YyBldGMKLSAqLwotCi1zdGF0aWMgdm9pZCBzZXR1cF9mYXN0X3RpbWVyKCkKLXsKLQl1bnNpZ25lZCBsb25nIGludGVydmFsOwotCi0jaWZkZWYgRkFTVF9QT0xMX0lOVFIKLQlpbnRlcnZhbCA9IChjdXJyZW50X2NwdV9kYXRhLm1vZHVsZV9jbG9jay80ICsgRkFTVF9QT0xMLzIpIC8gRkFTVF9QT0xMOwotCi0JbWFrZV9pcHJfaXJxKEZBU1RUSU1FUl9JUlEsIEZBU1RUSU1FUl9JUFJfQUREUiwgRkFTVFRJTUVSX0lQUl9QT1MsCi0JCQlGQVNUVElNRVJfUFJJT1JJVFkpOwotCi0JcHJpbnRrKCJTbmFwR2VhcjogJWRIeiBmYXN0IHRpbWVyIG9uIElSUSAlZFxuIixGQVNUX1BPTEwsRkFTVFRJTUVSX0lSUSk7Ci0KLQlpZiAocmVxdWVzdF9pcnEoRkFTVFRJTUVSX0lSUSwgZmFzdF90aW1lcl9pcnEsIDAsICJTbmFwR2VhciBmYXN0IHRpbWVyIiwKLQkJCU5VTEwpICE9IDApCi0JCXByaW50aygiJXMoJWQpOiByZXF1ZXN0X2lycSgpIGZhaWxlZD9cbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7Ci0jZWxzZQotCXByaW50aygiU25hcEdlYXI6IGZhc3QgdGltZXIgcnVubmluZ1xuIixGQVNUX1BPTEwsRkFTVFRJTUVSX0lSUSk7Ci0JaW50ZXJ2YWwgPSAweGZmZmZmZmZmOwotI2VuZGlmCi0KLQljdHJsX291dGIoY3RybF9pbmIoVE1VX1RTVFIpICYgfjB4MiwgVE1VX1RTVFIpOyAvKiBkaXNhYmxlIHRpbWVyIDEgKi8KLQljdHJsX291dHcoVE1VMV9UQ1JfSU5JVCwgVE1VMV9UQ1IpOwotCWN0cmxfb3V0bChpbnRlcnZhbCwgVE1VMV9UQ09SKTsKLQljdHJsX291dGwoaW50ZXJ2YWwsIFRNVTFfVENOVCk7Ci0JY3RybF9vdXRiKGN0cmxfaW5iKFRNVV9UU1RSKSB8IDB4MiwgVE1VX1RTVFIpOyAvKiBlbmFibGUgdGltZXIgMSAqLwotCi0JcHJpbnRrKCJUaW1lciBjb3VudCAxID0gMHgleFxuIiwgZmFzdF90aW1lcl9jb3VudCgpKTsKLQl1ZGVsYXkoMTAwMCk7Ci0JcHJpbnRrKCJUaW1lciBjb3VudCAyID0gMHgleFxuIiwgZmFzdF90aW1lcl9jb3VudCgpKTsKLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY29uc3QgY2hhciAqZ2V0X3N5c3RlbV90eXBlKHZvaWQpCi17Ci0JcmV0dXJuICJTbmFwR2VhciBTZWN1cmVFZGdlNTQxMCI7CisJYm9hcmRfdGltZV9pbml0ID0gc2VjdXJlZWRnZTU0MTBfcnRjX2luaXQ7CiB9CiAKIC8qCiAgKiBUaGUgTWFjaGluZSBWZWN0b3IKICAqLwotCiBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc25hcGdlYXIgX19pbml0bXYgPSB7CisJLm12X25hbWUJCT0gIlNuYXBHZWFyIFNlY3VyZUVkZ2U1NDEwIiwKKwkubXZfc2V0dXAJCT0gc25hcGdlYXJfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNzIsCiAKIAkubXZfaW5iCQkJPSBzbmFwZ2Vhcl9pbmIsCkBAIC0xOTYsMjAgKzExMSw2IEBACiAJLm12X291dHdfcAkJPSBzbmFwZ2Vhcl9vdXR3LAogCS5tdl9vdXRsX3AJCT0gc25hcGdlYXJfb3V0bCwKIAotCS5tdl9pc2FfcG9ydDJhZGRyCT0gc25hcGdlYXJfaXNhX3BvcnQyYWRkciwKLQogCS5tdl9pbml0X2lycQkJPSBpbml0X3NuYXBnZWFyX0lSUSwKIH07CiBBTElBU19NVihzbmFwZ2VhcikKLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIGJvYXJkCi0gKi8KLQotaW50IF9faW5pdCBwbGF0Zm9ybV9zZXR1cCh2b2lkKQotewotCWJvYXJkX3RpbWVfaW5pdCA9IHNlY3VyZWVkZ2U1NDEwX3J0Y19pbml0OwotCi0JcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3N1cGVyaC9taWNyb2Rldi9pcnEuYyBiL2FyY2gvc2gvYm9hcmRzL3N1cGVyaC9taWNyb2Rldi9pcnEuYwppbmRleCAyMzYzOThmLi44YzY0YmFhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvaXJxLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc3VwZXJoL21pY3JvZGV2L2lycS5jCkBAIC0xMSwxNCArMTEsMTIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLQogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWljcm9kZXYuaD4KIAogI2RlZmluZSBOVU1fRVhURVJOQUxfSVJRUyAxNgkvKiBJUkwwIC4uIElSTDE1ICovCiAKLQogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJdW5zaWduZWQgY2hhciBmcGdhSXJxOwogCXVuc2lnbmVkIGNoYXIgbWFwcGVkOwpAQCAtOTMsNTMgKzkxLDQyIEBACiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfbWljcm9kZXZfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgaW50IGZsYWdzOwogCXVuc2lnbmVkIGludCBmcGdhSXJxOwogCi0JaWYgKGlycSA+PSBOVU1fRVhURVJOQUxfSVJRUykgcmV0dXJuOwotCWlmICghZnBnYUlycVRhYmxlW2lycV0ubWFwcGVkKSByZXR1cm47CisJaWYgKGlycSA+PSBOVU1fRVhURVJOQUxfSVJRUykKKwkJcmV0dXJuOworCWlmICghZnBnYUlycVRhYmxlW2lycV0ubWFwcGVkKQorCQlyZXR1cm47CiAKIAlmcGdhSXJxID0gZnBnYUlycVRhYmxlW2lycV0uZnBnYUlycTsKIAotCQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQkJLyogZGlzYWJsZSBpbnRlcnVwdHMgb24gdGhlIEZQR0EgSU5UQyByZWdpc3RlciAqLworCS8qIGRpc2FibGUgaW50ZXJ1cHRzIG9uIHRoZSBGUEdBIElOVEMgcmVnaXN0ZXIgKi8KIAljdHJsX291dGwoTUlDUk9ERVZfRlBHQV9JTlRDX01BU0soZnBnYUlycSksIE1JQ1JPREVWX0ZQR0FfSU5URFNCX1JFRyk7Ci0KLQkJLyogcmVzdG9yZSBpbnRlcnJ1cHRzICovCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBlbmFibGVfbWljcm9kZXZfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJdW5zaWduZWQgbG9uZyBwcmlvcml0eVJlZywgcHJpb3JpdGllcywgcHJpOwotCXVuc2lnbmVkIGludCBmbGFnczsKIAl1bnNpZ25lZCBpbnQgZnBnYUlycTsKIAotCi0JaWYgKGlycSA+PSBOVU1fRVhURVJOQUxfSVJRUykgcmV0dXJuOwotCWlmICghZnBnYUlycVRhYmxlW2lycV0ubWFwcGVkKSByZXR1cm47CisJaWYgKHVubGlrZWx5KGlycSA+PSBOVU1fRVhURVJOQUxfSVJRUykpCisJCXJldHVybjsKKwlpZiAodW5saWtlbHkoIWZwZ2FJcnFUYWJsZVtpcnFdLm1hcHBlZCkpCisJCXJldHVybjsKIAogCXByaSA9IDE1IC0gaXJxOwogCiAJZnBnYUlycSA9IGZwZ2FJcnFUYWJsZVtpcnFdLmZwZ2FJcnE7CiAJcHJpb3JpdHlSZWcgPSBNSUNST0RFVl9GUEdBX0lOVFBSSV9SRUcoZnBnYUlycSk7CiAKLQkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JCS8qIHNldCBwcmlvcml0eSBmb3IgdGhlIGludGVycnVwdCAqLworCS8qIHNldCBwcmlvcml0eSBmb3IgdGhlIGludGVycnVwdCAqLwogCXByaW9yaXRpZXMgPSBjdHJsX2lubChwcmlvcml0eVJlZyk7CiAJcHJpb3JpdGllcyAmPSB+TUlDUk9ERVZfRlBHQV9JTlRQUklfTUFTSyhmcGdhSXJxKTsKIAlwcmlvcml0aWVzIHw9IE1JQ1JPREVWX0ZQR0FfSU5UUFJJX0xFVkVMKGZwZ2FJcnEsIHByaSk7CiAJY3RybF9vdXRsKHByaW9yaXRpZXMsIHByaW9yaXR5UmVnKTsKIAotCQkvKiBlbmFibGUgaW50ZXJ1cHRzIG9uIHRoZSBGUEdBIElOVEMgcmVnaXN0ZXIgKi8KKwkvKiBlbmFibGUgaW50ZXJ1cHRzIG9uIHRoZSBGUEdBIElOVEMgcmVnaXN0ZXIgKi8KIAljdHJsX291dGwoTUlDUk9ERVZfRlBHQV9JTlRDX01BU0soZnBnYUlycSksIE1JQ1JPREVWX0ZQR0FfSU5URU5CX1JFRyk7Ci0KLQkJLyogcmVzdG9yZSBpbnRlcnJ1cHRzICovCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiAJLyogVGhpcyBmdW5jdGlvbnMgc2V0cyB0aGUgZGVzaXJlZCBpcnEgaGFuZGxlciB0byBiZSBhIE1pY3JvRGV2IHR5cGUgKi8KQEAgLTE1OCw5ICsxNDUsNyBAQAogc3RhdGljIHZvaWQgZW5kX21pY3JvZGV2X2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQotCXsKIAkJZW5hYmxlX21pY3JvZGV2X2lycShpcnEpOwotCX0KIH0KIAogZXh0ZXJuIHZvaWQgX19pbml0IGluaXRfbWljcm9kZXZfaXJxKHZvaWQpCkBAIC0xNzEsOSArMTU2LDcgQEAKIAljdHJsX291dGwofjB1bCwgTUlDUk9ERVZfRlBHQV9JTlREU0JfUkVHKTsKIAogCWZvciAoaSA9IDA7IGkgPCBOVU1fRVhURVJOQUxfSVJRUzsgaSsrKQotCXsKIAkJbWFrZV9taWNyb2Rldl9pcnEoaSk7Ci0JfQogfQogCiBleHRlcm4gdm9pZCBtaWNyb2Rldl9wcmludF9mcGdhX2ludGNfc3RhdHVzKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zdXBlcmgvbWljcm9kZXYvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3N1cGVyaC9taWNyb2Rldi9zZXR1cC5jCmluZGV4IDYxYjQwMmEuLjAzMWM4MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3N1cGVyaC9taWNyb2Rldi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3N1cGVyaC9taWNyb2Rldi9zZXR1cC5jCkBAIC0xMCw3ICsxMCw2IEBACiAgKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KQEAgLTIxLDQxICsyMCw2IEBACiAKIGV4dGVybiB2b2lkIG1pY3JvZGV2X2hlYXJ0YmVhdCh2b2lkKTsKIAotLyoKLSAqIFRoZSBNYWNoaW5lIFZlY3RvcgotICovCi0KLXN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl9zaDQyMDJfbWljcm9kZXYgX19pbml0bXYgPSB7Ci0JLm12X25yX2lycXMJCT0gNzIsCQkvKiBRUVEgbmVlZCB0byBjaGVjayB0aGlzIC0gdXNlIHRoZSBNQUNSTyAqLwotCi0JLm12X2luYgkJCT0gbWljcm9kZXZfaW5iLAotCS5tdl9pbncJCQk9IG1pY3JvZGV2X2ludywKLQkubXZfaW5sCQkJPSBtaWNyb2Rldl9pbmwsCi0JLm12X291dGIJCT0gbWljcm9kZXZfb3V0YiwKLQkubXZfb3V0dwkJPSBtaWNyb2Rldl9vdXR3LAotCS5tdl9vdXRsCQk9IG1pY3JvZGV2X291dGwsCi0KLQkubXZfaW5iX3AJCT0gbWljcm9kZXZfaW5iX3AsCi0JLm12X2lud19wCQk9IG1pY3JvZGV2X2lud19wLAotCS5tdl9pbmxfcAkJPSBtaWNyb2Rldl9pbmxfcCwKLQkubXZfb3V0Yl9wCQk9IG1pY3JvZGV2X291dGJfcCwKLQkubXZfb3V0d19wCQk9IG1pY3JvZGV2X291dHdfcCwKLQkubXZfb3V0bF9wCQk9IG1pY3JvZGV2X291dGxfcCwKLQotCS5tdl9pbnNiCQk9IG1pY3JvZGV2X2luc2IsCi0JLm12X2luc3cJCT0gbWljcm9kZXZfaW5zdywKLQkubXZfaW5zbAkJPSBtaWNyb2Rldl9pbnNsLAotCS5tdl9vdXRzYgkJPSBtaWNyb2Rldl9vdXRzYiwKLQkubXZfb3V0c3cJCT0gbWljcm9kZXZfb3V0c3csCi0JLm12X291dHNsCQk9IG1pY3JvZGV2X291dHNsLAotCi0JLm12X2luaXRfaXJxCQk9IGluaXRfbWljcm9kZXZfaXJxLAotCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCS5tdl9oZWFydGJlYXQJCT0gbWljcm9kZXZfaGVhcnRiZWF0LAotI2VuZGlmCi19OwotQUxJQVNfTVYoc2g0MjAyX21pY3JvZGV2KQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTEzLDExICs3Nyw2IEBACiAJLyogYXNzdW1lIGEgS2V5Ym9hcmQgQ29udHJvbGxlciBpcyBwcmVzZW50ICovCiBpbnQgbWljcm9kZXZfa2JkX2NvbnRyb2xsZXJfcHJlc2VudCA9IDE7CiAKLWNvbnN0IGNoYXIgKmdldF9zeXN0ZW1fdHlwZSh2b2lkKQotewotCXJldHVybiAiU0g0LTIwMiBNaWNyb0RldiI7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc21jOTF4X3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKIAkJLnN0YXJ0CQk9IDB4MzAwLApAQCAtMjkxLDI1ICsyNTAsOSBAQAogCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhtaWNyb2Rldl9kZXZpY2VzLCBBUlJBWV9TSVpFKG1pY3JvZGV2X2RldmljZXMpKTsKIH0KIAotX19pbml0Y2FsbChtaWNyb2Rldl9kZXZpY2VzX3NldHVwKTsKLQotdm9pZCBfX2luaXQgcGxhdGZvcm1fc2V0dXAodm9pZCkKLXsKLQlpbnQgKiBjb25zdCBmcGdhUmV2aXNpb25SZWdpc3RlciA9IChpbnQqKShNSUNST0RFVl9GUEdBX0dQX0JBU0UgKyAweDh1bCk7Ci0JY29uc3QgaW50IGZwZ2FSZXZpc2lvbiA9ICpmcGdhUmV2aXNpb25SZWdpc3RlcjsKLQlpbnQgKiBjb25zdCBDYWNoZUNvbnRyb2xSZWdpc3RlciA9IChpbnQqKUNDUjsKLQotCXByaW50aygiU3VwZXJIICVzIGJvYXJkIChGUEdBIHJldjogMHglMHgsIENDUjogMHglMHgpXG4iLAotCQlnZXRfc3lzdGVtX3R5cGUoKSwgZnBnYVJldmlzaW9uLCAqQ2FjaGVDb250cm9sUmVnaXN0ZXIpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLQkvKgotCSAqIFNldHVwIGZvciB0aGUgU01TQyBGREMzN0M5M3hBUE0KLQkgKi8KKy8qCisgKiBTZXR1cCBmb3IgdGhlIFNNU0MgRkRDMzdDOTN4QVBNCisgKi8KIHN0YXRpYyBpbnQgX19pbml0IHNtc2Nfc3VwZXJpb19zZXR1cCh2b2lkKQogewogCkBAIC00MTIsOCArMzU1LDUyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBtaWNyb2Rldl9zZXR1cChjaGFyICoqY21kbGluZV9wKQoreworCWludCAqIGNvbnN0IGZwZ2FSZXZpc2lvblJlZ2lzdGVyID0gKGludCopKE1JQ1JPREVWX0ZQR0FfR1BfQkFTRSArIDB4OHVsKTsKKwljb25zdCBpbnQgZnBnYVJldmlzaW9uID0gKmZwZ2FSZXZpc2lvblJlZ2lzdGVyOworCWludCAqIGNvbnN0IENhY2hlQ29udHJvbFJlZ2lzdGVyID0gKGludCopQ0NSOwogCi0vKiBUaGlzIGlzIGdyb3R0eSwgYnV0LCBiZWNhdXNlIGtlcm5lbCBpcyBhbHdheXMgcmVmZXJlbmNlZCBvbiB0aGUgbGluayBsaW5lCi0gKiBiZWZvcmUgYW55IGRldmljZXMsIHRoaXMgaXMgc2FmZS4KKwlkZXZpY2VfaW5pdGNhbGwobWljcm9kZXZfZGV2aWNlc19zZXR1cCk7CisJZGV2aWNlX2luaXRjYWxsKHNtc2Nfc3VwZXJpb19zZXR1cCk7CisKKwlwcmludGsoIlN1cGVySCAlcyBib2FyZCAoRlBHQSByZXY6IDB4JTB4LCBDQ1I6IDB4JTB4KVxuIiwKKwkJZ2V0X3N5c3RlbV90eXBlKCksIGZwZ2FSZXZpc2lvbiwgKkNhY2hlQ29udHJvbFJlZ2lzdGVyKTsKK30KKworLyoKKyAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi1fX2luaXRjYWxsKHNtc2Nfc3VwZXJpb19zZXR1cCk7CitzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2g0MjAyX21pY3JvZGV2IF9faW5pdG12ID0geworCS5tdl9uYW1lCQk9ICJTSDQtMjAyIE1pY3JvRGV2IiwKKwkubXZfc2V0dXAJCT0gbWljcm9kZXZfc2V0dXAsCisJLm12X25yX2lycXMJCT0gNzIsCQkvKiBRUVEgbmVlZCB0byBjaGVjayB0aGlzIC0gdXNlIHRoZSBNQUNSTyAqLworCisJLm12X2luYgkJCT0gbWljcm9kZXZfaW5iLAorCS5tdl9pbncJCQk9IG1pY3JvZGV2X2ludywKKwkubXZfaW5sCQkJPSBtaWNyb2Rldl9pbmwsCisJLm12X291dGIJCT0gbWljcm9kZXZfb3V0YiwKKwkubXZfb3V0dwkJPSBtaWNyb2Rldl9vdXR3LAorCS5tdl9vdXRsCQk9IG1pY3JvZGV2X291dGwsCisKKwkubXZfaW5iX3AJCT0gbWljcm9kZXZfaW5iX3AsCisJLm12X2lud19wCQk9IG1pY3JvZGV2X2lud19wLAorCS5tdl9pbmxfcAkJPSBtaWNyb2Rldl9pbmxfcCwKKwkubXZfb3V0Yl9wCQk9IG1pY3JvZGV2X291dGJfcCwKKwkubXZfb3V0d19wCQk9IG1pY3JvZGV2X291dHdfcCwKKwkubXZfb3V0bF9wCQk9IG1pY3JvZGV2X291dGxfcCwKKworCS5tdl9pbnNiCQk9IG1pY3JvZGV2X2luc2IsCisJLm12X2luc3cJCT0gbWljcm9kZXZfaW5zdywKKwkubXZfaW5zbAkJPSBtaWNyb2Rldl9pbnNsLAorCS5tdl9vdXRzYgkJPSBtaWNyb2Rldl9vdXRzYiwKKwkubXZfb3V0c3cJCT0gbWljcm9kZXZfb3V0c3csCisJLm12X291dHNsCQk9IG1pY3JvZGV2X291dHNsLAorCisJLm12X2luaXRfaXJxCQk9IGluaXRfbWljcm9kZXZfaXJxLAorCisjaWZkZWYgQ09ORklHX0hFQVJUQkVBVAorCS5tdl9oZWFydGJlYXQJCT0gbWljcm9kZXZfaGVhcnRiZWF0LAorI2VuZGlmCit9OworQUxJQVNfTVYoc2g0MjAyX21pY3JvZGV2KQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvdGl0YW4vTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy90aXRhbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGQ3NTM3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9ib2FyZHMvdGl0YW4vTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTmltYmxlIE1pY3Jvc3lzdGVtcyBUSVRBTiBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUga2VybmVsCisjCisKK29iai15CSA6PSBzZXR1cC5vIGlvLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3RpdGFuL2lvLmMgYi9hcmNoL3NoL2JvYXJkcy90aXRhbi9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MzBjMWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy90aXRhbi9pby5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICoJSS9PIHJvdXRpbmVzIGZvciBUaXRhbgorICovCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KKyNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CisjaW5jbHVkZSA8YXNtL3RpdGFuLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBvcnQyYWRyKHVuc2lnbmVkIGludCBwb3J0KQoreworICAgICAgICBtYXliZWJhZGlvKCh1bnNpZ25lZCBsb25nKXBvcnQpOworICAgICAgICByZXR1cm4gcG9ydDsKK30KKwordTggdGl0YW5faW5iKHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKyAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQorICAgICAgICAgICAgICAgIHJldHVybiBjdHJsX2luYihwb3J0KTsKKyAgICAgICAgZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY3RybF9pbmIocGNpX2lvYWRkcihwb3J0KSk7CisgICAgICAgIHJldHVybiBjdHJsX2ludyhwb3J0MmFkcihwb3J0KSkgJiAweGZmOworfQorCit1OCB0aXRhbl9pbmJfcCh1bnNpZ25lZCBsb25nIHBvcnQpCit7CisgICAgICAgIHU4IHY7CisKKyAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQorICAgICAgICAgICAgICAgIHYgPSBjdHJsX2luYihwb3J0KTsKKyAgICAgICAgZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKyAgICAgICAgICAgICAgICB2ID0gY3RybF9pbmIocGNpX2lvYWRkcihwb3J0KSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2ID0gY3RybF9pbncocG9ydDJhZHIocG9ydCkpICYgMHhmZjsKKyAgICAgICAgY3RybF9kZWxheSgpOworICAgICAgICByZXR1cm4gdjsKK30KKwordTE2IHRpdGFuX2ludyh1bnNpZ25lZCBsb25nIHBvcnQpCit7CisgICAgICAgIGlmIChQWFNFRyhwb3J0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY3RybF9pbncocG9ydCk7CisgICAgICAgIGVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGN0cmxfaW53KHBjaV9pb2FkZHIocG9ydCkpOworICAgICAgICBlbHNlIGlmIChwb3J0ID49IDB4MjAwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY3RybF9pbncocG9ydDJhZHIocG9ydCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWF5YmViYWRpbyhwb3J0KTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3UzMiB0aXRhbl9pbmwodW5zaWduZWQgbG9uZyBwb3J0KQoreworICAgICAgICBpZiAoUFhTRUcocG9ydCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGN0cmxfaW5sKHBvcnQpOworICAgICAgICBlbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQorICAgICAgICAgICAgICAgIHJldHVybiBjdHJsX2lubChwY2lfaW9hZGRyKHBvcnQpKTsKKyAgICAgICAgZWxzZSBpZiAocG9ydCA+PSAweDIwMDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGN0cmxfaW53KHBvcnQyYWRyKHBvcnQpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1heWJlYmFkaW8ocG9ydCk7CisgICAgICAgIHJldHVybiAwOworfQorCit2b2lkIHRpdGFuX291dGIodTggdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKyAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQorICAgICAgICAgICAgICAgIGN0cmxfb3V0Yih2YWx1ZSwgcG9ydCk7CisgICAgICAgIGVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisgICAgICAgICAgICAgICAgY3RybF9vdXRiKHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGN0cmxfb3V0dyh2YWx1ZSwgcG9ydDJhZHIocG9ydCkpOworfQorCit2b2lkIHRpdGFuX291dGJfcCh1OCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworICAgICAgICBpZiAoUFhTRUcocG9ydCkpCisgICAgICAgICAgICAgICAgY3RybF9vdXRiKHZhbHVlLCBwb3J0KTsKKyAgICAgICAgZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKyAgICAgICAgICAgICAgICBjdHJsX291dGIodmFsdWUsIHBjaV9pb2FkZHIocG9ydCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3RybF9vdXR3KHZhbHVlLCBwb3J0MmFkcihwb3J0KSk7CisgICAgICAgIGN0cmxfZGVsYXkoKTsKK30KKwordm9pZCB0aXRhbl9vdXR3KHUxNiB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQoreworICAgICAgICBpZiAoUFhTRUcocG9ydCkpCisgICAgICAgICAgICAgICAgY3RybF9vdXR3KHZhbHVlLCBwb3J0KTsKKyAgICAgICAgZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKyAgICAgICAgICAgICAgICBjdHJsX291dHcodmFsdWUsIHBjaV9pb2FkZHIocG9ydCkpOworICAgICAgICBlbHNlIGlmIChwb3J0ID49IDB4MjAwMCkKKyAgICAgICAgICAgICAgICBjdHJsX291dHcodmFsdWUsIHBvcnQyYWRyKHBvcnQpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1heWJlYmFkaW8ocG9ydCk7Cit9CisKK3ZvaWQgdGl0YW5fb3V0bCh1MzIgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKK3sKKyAgICAgICAgaWYgKFBYU0VHKHBvcnQpKQorICAgICAgICAgICAgICAgIGN0cmxfb3V0bCh2YWx1ZSwgcG9ydCk7CisgICAgICAgIGVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCisgICAgICAgICAgICAgICAgY3RybF9vdXRsKHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1heWJlYmFkaW8ocG9ydCk7Cit9CisKK3ZvaWQgdGl0YW5faW5zbCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKyAgICAgICAgbWF5YmViYWRpbyhwb3J0KTsKK30KKwordm9pZCB0aXRhbl9vdXRzbCh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKyAgICAgICAgbWF5YmViYWRpbyhwb3J0KTsKK30KKwordm9pZCBfX2lvbWVtICp0aXRhbl9pb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IHNpemUpCit7CisJaWYgKFBYU0VHKHBvcnQpIHx8IGlzX3BjaV9tZW1hZGRyKHBvcnQpKQorCQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKXBvcnQ7CisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKKwkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilwY2lfaW9hZGRyKHBvcnQpOworCisJcmV0dXJuICh2b2lkIF9faW9tZW0gKilwb3J0MmFkcihwb3J0KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3RpdGFuL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy90aXRhbi9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYjY2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2JvYXJkcy90aXRhbi9zZXR1cC5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKglTZXR1cCBmb3IgVGl0YW4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vdGl0YW4uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworZXh0ZXJuIHZvaWQgX19pbml0IHBjaWJpb3NfaW5pdF9wbGF0Zm9ybSh2b2lkKTsKKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfdGl0YW5faXJxKHZvaWQpCit7CisJLyogZW5hYmxlIGluZGl2aWR1YWwgaW50ZXJydXB0IG1vZGUgZm9yIGV4dGVybmFscyAqLworCWN0cmxfb3V0dyhjdHJsX2ludyhJTlRDX0lDUikgfCBJTlRDX0lDUl9JUkxNLCBJTlRDX0lDUik7CisKKwltYWtlX2lwcl9pcnEoIFRJVEFOX0lSUV9XQU4sICAgSVJMMF9JUFJfQUREUiwgSVJMMF9JUFJfUE9TLCBJUkwwX1BSSU9SSVRZKTsgLyogUENJUlEwICovCisJbWFrZV9pcHJfaXJxKCBUSVRBTl9JUlFfTEFOLCAgIElSTDFfSVBSX0FERFIsIElSTDFfSVBSX1BPUywgSVJMMV9QUklPUklUWSk7IC8qIFBDSVJRMSAqLworCW1ha2VfaXByX2lycSggVElUQU5fSVJRX01QQ0lBLCBJUkwyX0lQUl9BRERSLCBJUkwyX0lQUl9QT1MsIElSTDJfUFJJT1JJVFkpOyAvKiBQQ0lSUTIgKi8KKwltYWtlX2lwcl9pcnEoIFRJVEFOX0lSUV9VU0IsICAgSVJMM19JUFJfQUREUiwgSVJMM19JUFJfUE9TLCBJUkwzX1BSSU9SSVRZKTsgLyogUENJUlEzICovCit9CisKK3N0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl90aXRhbiBfX2luaXRtdiA9IHsKKwkubXZfbmFtZSA9CSJUaXRhbiIsCisKKwkubXZfaW5iID0JdGl0YW5faW5iLAorCS5tdl9pbncgPQl0aXRhbl9pbncsCisJLm12X2lubCA9CXRpdGFuX2lubCwKKwkubXZfb3V0YiA9CXRpdGFuX291dGIsCisJLm12X291dHcgPQl0aXRhbl9vdXR3LAorCS5tdl9vdXRsID0JdGl0YW5fb3V0bCwKKworCS5tdl9pbmJfcCA9CXRpdGFuX2luYl9wLAorCS5tdl9pbndfcCA9CXRpdGFuX2ludywKKwkubXZfaW5sX3AgPQl0aXRhbl9pbmwsCisJLm12X291dGJfcCA9CXRpdGFuX291dGJfcCwKKwkubXZfb3V0d19wID0JdGl0YW5fb3V0dywKKwkubXZfb3V0bF9wID0JdGl0YW5fb3V0bCwKKworCS5tdl9pbnNsID0JdGl0YW5faW5zbCwKKwkubXZfb3V0c2wgPQl0aXRhbl9vdXRzbCwKKworCS5tdl9pb3BvcnRfbWFwID0gdGl0YW5faW9wb3J0X21hcCwKKworCS5tdl9pbml0X2lycSA9CWluaXRfdGl0YW5faXJxLAorCS5tdl9pbml0X3BjaSA9CXBjaWJpb3NfaW5pdF9wbGF0Zm9ybSwKK307CitBTElBU19NVih0aXRhbikKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3Vua25vd24vc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3Vua25vd24vc2V0dXAuYwppbmRleCBjNWU0ZWQxLi4xYzk0MTM3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy91bmtub3duL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvdW5rbm93bi9zZXR1cC5jCkBAIC0xNCwxOSArMTQsOCBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgogCiBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfdW5rbm93biBfX2luaXRtdiA9IHsKLQkubXZfbnJfaXJxcwkJPSBOUl9JUlFTLAorCS5tdl9uYW1lCQk9ICJVbmtub3duIiwKIH07CiBBTElBU19NVih1bmtub3duKQotCi1jb25zdCBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCkKLXsKLQlyZXR1cm4gIlVua25vd24iOwotfQotCi12b2lkIF9faW5pdCBwbGF0Zm9ybV9zZXR1cCh2b2lkKQotewotfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZSBiL2FyY2gvc2gvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCmluZGV4IDc1YTY4NzYuLmU1ZjQ0MzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCkBAIC0xOCwxMyArMTgsMjAgQEAKICMgQXNzaWduIGR1bW15IHZhbHVlcyBpZiB0aGVzZSAyIHZhcmlhYmxlcyBhcmUgbm90IGRlZmluZWQsCiAjIGluIG9yZGVyIHRvIHN1cHByZXNzIGVycm9yIG1lc3NhZ2UuCiAjCitDT05GSUdfUEFHRV9PRkZTRVQJPz0gMHg4MDAwMDAwMAogQ09ORklHX01FTU9SWV9TVEFSVCAgICAgPz0gMHgwYzAwMDAwMAogQ09ORklHX0JPT1RfTElOS19PRkZTRVQgPz0gMHgwMDgwMDAwMAotSU1BR0VfT0ZGU0VUIDo9ICQoc2hlbGwgcHJpbnRmICIweCU4eCIgJCRbMHg4MDAwMDAwMCskKENPTkZJR19NRU1PUllfU1RBUlQpKyQoQ09ORklHX0JPT1RfTElOS19PRkZTRVQpXSkKKworSU1BR0VfT0ZGU0VUCTo9ICQoc2hlbGwgcHJpbnRmICIweCUwOHgiICQkWyQoQ09ORklHX1BBR0VfT0ZGU0VUKSAgKyBcCisJCQkJCSAgICAgICQoQ09ORklHX01FTU9SWV9TVEFSVCkgKyBcCisJCQkJCSAgICAgICQoQ09ORklHX0JPT1RfTElOS19PRkZTRVQpXSkKKworTElCR0NDCTo9ICQoc2hlbGwgJChDQykgJChDRkxBR1MpIC1wcmludC1saWJnY2MtZmlsZS1uYW1lKQogCiBMREZMQUdTX3ZtbGludXggOj0gLVR0ZXh0ICQoSU1BR0VfT0ZGU0VUKSAtZSBzdGFydHVwIC1UICQob2JqKS8uLi8uLi9rZXJuZWwvdm1saW51eC5sZHMKIAotJChvYmopL3ZtbGludXg6ICQoT0JKRUNUUykgJChvYmopL3BpZ2d5Lm8gRk9SQ0UKKworJChvYmopL3ZtbGludXg6ICQoT0JKRUNUUykgJChvYmopL3BpZ2d5Lm8gJChMSUJHQ0MpIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsbGQpCiAJQDoKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jY2hpcHMvS2NvbmZpZyBiL2FyY2gvc2gvY2NoaXBzL0tjb25maWcKaW5kZXggMTU1ZDEzOS4uMDU4MmNhOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jY2hpcHMvS2NvbmZpZworKysgYi9hcmNoL3NoL2NjaGlwcy9LY29uZmlnCkBAIC02NSw2ICs2NSwxMSBAQAogCiAJICBEbyBub3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KIAorY29uZmlnIEhENjQ0NjFfSU9CQVNFCisJaGV4ICJIRDY0NDYxIHN0YXJ0IGFkZHJlc3MiCisJZGVwZW5kcyBvbiBIRDY0NDYxCisJZGVmYXVsdCAiMHhiMDAwMDAwMCIKKwogY29uZmlnIEhENjQ0NjFfRU5BQkxFUgogCWJvb2wgIkhENjQ0NjEgUENNQ0lBIGVuYWJsZXIiCiAJZGVwZW5kcyBvbiBIRDY0NDYxCkBAIC03Myw3ICs3OCw2IEBACiAJICB2aWEgdGhlIEhENjQ0NjEgY29tcGFuaW9uIGNoaXAuCiAJICBPdGhlcndpc2UsIHNheSBOLgogCi0KIGNvbmZpZyBIRDY0NDY1X0lPQkFTRQogCWhleCAiSEQ2NDQ2NSBzdGFydCBhZGRyZXNzIgogCWRlcGVuZHMgb24gSEQ2NDQ2NQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jY2hpcHMvaGQ2NDQ2eC9oZDY0NDYxL2lvLmMgYi9hcmNoL3NoL2NjaGlwcy9oZDY0NDZ4L2hkNjQ0NjEvaW8uYwppbmRleCBhYzMwNjI2Li43OTA5YTFiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NjaGlwcy9oZDY0NDZ4L2hkNjQ0NjEvaW8uYworKysgYi9hcmNoL3NoL2NjaGlwcy9oZDY0NDZ4L2hkNjQ0NjEvaW8uYwpAQCAtMSwxMSArMSwxMCBAQAogLyoKLSAqCSRJZDogaW8uYyx2IDEuNiAyMDA0LzAzLzE2IDAwOjA3OjUwIGxldGhhbCBFeHAgJAogICoJQ29weXJpZ2h0IChDKSAyMDAwIFlBRUdBU0hJIFRha2VzaGkKICAqCVR5cGljYWwgSS9PIHJvdXRpbmVzIGZvciBIRDY0NDYxIHN5c3RlbS4KICAqLwogCiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2hkNjQ0NjEvaGQ2NDQ2MS5oPgorI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+CiAKICNkZWZpbmUgTUVNX0JBU0UgKENPTkZJR19IRDY0NDYxX0lPQkFTRSAtIEhENjQ0NjFfU1RCQ1IpCiAKQEAgLTU0LDExICs1Myw2IEBACiAJcmV0dXJuIDB4YTAwMDAwMDAgKyAocG9ydCAmIDB4MWZmZmZmZmYpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGVsYXkodm9pZCkKLXsKLQljdHJsX2ludygweGEwMDAwMDAwKTsKLX0KLQogdW5zaWduZWQgY2hhciBoZDY0NDYxX2luYih1bnNpZ25lZCBsb25nIHBvcnQpCiB7CiAJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciopUE9SVDJBRERSKHBvcnQpOwpAQCAtNjcsNyArNjEsNyBAQAogdW5zaWduZWQgY2hhciBoZDY0NDYxX2luYl9wKHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAl1bnNpZ25lZCBsb25nIHYgPSAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKVBPUlQyQUREUihwb3J0KTsKLQlkZWxheSgpOworCWN0cmxfZGVsYXkoKTsKIAlyZXR1cm4gdjsKIH0KIApAQCAtODksNyArODMsNyBAQAogdm9pZCBoZDY0NDYxX291dGJfcCh1bnNpZ25lZCBjaGFyIGIsIHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKVBPUlQyQUREUihwb3J0KSA9IGI7Ci0JZGVsYXkoKTsKKwljdHJsX2RlbGF5KCk7CiB9CiAKIHZvaWQgaGQ2NDQ2MV9vdXR3KHVuc2lnbmVkIHNob3J0IGIsIHVuc2lnbmVkIGxvbmcgcG9ydCkKQEAgLTE0NCwxMyArMTM4LDEzIEBACiAJd2hpbGUoY291bnQtLSkgKmFkZHI9KmJ1ZisrOwogfQogCi11bnNpZ25lZCBzaG9ydCBoZDY0NDYxX3JlYWR3KHVuc2lnbmVkIGxvbmcgYWRkcikKK3Vuc2lnbmVkIHNob3J0IGhkNjQ0NjFfcmVhZHcodm9pZCBfX2lvbWVtICphZGRyKQogewotCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0KikoTUVNX0JBU0UrYWRkcik7CisJcmV0dXJuIGN0cmxfaW53KE1FTV9CQVNFKyh1bnNpZ25lZCBsb25nIF9fZm9yY2UpYWRkcik7CiB9CiAKLXZvaWQgaGQ2NDQ2MV93cml0ZXcodW5zaWduZWQgc2hvcnQgYiwgdW5zaWduZWQgbG9uZyBhZGRyKQordm9pZCBoZDY0NDYxX3dyaXRldyh1bnNpZ25lZCBzaG9ydCBiLCB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCopKE1FTV9CQVNFK2FkZHIpID0gYjsKKwljdHJsX291dHcoYiwgTUVNX0JBU0UrKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jY2hpcHMvaGQ2NDQ2eC9oZDY0NDYxL3NldHVwLmMgYi9hcmNoL3NoL2NjaGlwcy9oZDY0NDZ4L2hkNjQ0NjEvc2V0dXAuYwppbmRleCBhZDEyNjAxLi4zOGYxZTgxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NjaGlwcy9oZDY0NDZ4L2hkNjQ0NjEvc2V0dXAuYworKysgYi9hcmNoL3NoL2NjaGlwcy9oZDY0NDZ4L2hkNjQ0NjEvc2V0dXAuYwpAQCAtMTEsMzYgKzExLDI4IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgotCi0jaW5jbHVkZSA8YXNtL2hkNjQ0NjEvaGQ2NDQ2MS5oPgorI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfaGQ2NDQ2MV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIHNob3J0IG5pbXI7CiAJdW5zaWduZWQgc2hvcnQgbWFzayA9IDEgPDwgKGlycSAtIEhENjQ0NjFfSVJRQkFTRSk7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJbmltciA9IGludyhIRDY0NDYxX05JTVIpOwogCW5pbXIgfD0gbWFzazsKIAlvdXR3KG5pbXIsIEhENjQ0NjFfTklNUik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBlbmFibGVfaGQ2NDQ2MV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIHNob3J0IG5pbXI7CiAJdW5zaWduZWQgc2hvcnQgbWFzayA9IDEgPDwgKGlycSAtIEhENjQ0NjFfSVJRQkFTRSk7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJbmltciA9IGludyhIRDY0NDYxX05JTVIpOwogCW5pbXIgJj0gfm1hc2s7CiAJb3V0dyhuaW1yLCBIRDY0NDYxX05JTVIpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX2hkNjQ0NjEodW5zaWduZWQgaW50IGlycSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY2NoaXBzL2hkNjQ0NngvaGQ2NDQ2NS9zZXR1cC5jIGIvYXJjaC9zaC9jY2hpcHMvaGQ2NDQ2eC9oZDY0NDY1L3NldHVwLmMKaW5kZXggZDJiMjg1MS4uMzA1NzNkMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jY2hpcHMvaGQ2NDQ2eC9oZDY0NDY1L3NldHVwLmMKKysrIGIvYXJjaC9zaC9jY2hpcHMvaGQ2NDQ2eC9oZDY0NDY1L3NldHVwLmMKQEAgLTI1LDMxICsyNSwyNSBAQAogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2hkNjQ0NjVfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBzaG9ydCBuaW1yOwogCXVuc2lnbmVkIHNob3J0IG1hc2sgPSAxIDw8IChpcnEgLSBIRDY0NDY1X0lSUV9CQVNFKTsKIAogICAgIAlwcl9kZWJ1ZygiZGlzYWJsZV9oZDY0NDY1X2lycSglZCk6IG1hc2s9JXhcbiIsIGlycSwgbWFzayk7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCW5pbXIgPSBpbncoSEQ2NDQ2NV9SRUdfTklNUik7CiAJbmltciB8PSBtYXNrOwogCW91dHcobmltciwgSEQ2NDQ2NV9SRUdfTklNUik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9oZDY0NDY1X2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgc2hvcnQgbmltcjsKIAl1bnNpZ25lZCBzaG9ydCBtYXNrID0gMSA8PCAoaXJxIC0gSEQ2NDQ2NV9JUlFfQkFTRSk7CiAKICAgICAJcHJfZGVidWcoImVuYWJsZV9oZDY0NDY1X2lycSglZCk6IG1hc2s9JXhcbiIsIGlycSwgbWFzayk7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCW5pbXIgPSBpbncoSEQ2NDQ2NV9SRUdfTklNUik7CiAJbmltciAmPSB+bWFzazsKIAlvdXR3KG5pbXIsIEhENjQ0NjVfUkVHX05JTVIpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NjaGlwcy92b3lhZ2VyZ3gvaXJxLmMgYi9hcmNoL3NoL2NjaGlwcy92b3lhZ2VyZ3gvaXJxLmMKaW5kZXggMGRjMWZiOC4uMzkyYzhiMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jY2hpcHMvdm95YWdlcmd4L2lycS5jCisrKyBiL2FyY2gvc2gvY2NoaXBzL3ZveWFnZXJneC9pcnEuYwpAQCAtMzIsMzcgKzMyLDMwIEBACiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQvcnRzNzc1MXIyZC5oPgotI2luY2x1ZGUgPGFzbS9ydHM3NzUxcjJkL3ZveWFnZXJneF9yZWcuaD4KKyNpbmNsdWRlIDxhc20vdm95YWdlcmd4Lmg+CiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfdm95YWdlcmd4X2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZhbDsKLQl1bnNpZ25lZCBsb25nICBtYXNrID0gMSA8PCAoaXJxIC0gVk9ZQUdFUl9JUlFfQkFTRSk7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gMSA8PCAoaXJxIC0gVk9ZQUdFUl9JUlFfQkFTRSk7CiAKICAgICAJcHJfZGVidWcoImRpc2FibGVfdm95YWdlcmd4X2lycSglZCk6IG1hc2s9JXhcbiIsIGlycSwgbWFzayk7Ci0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogICAgICAgICB2YWwgPSBpbmwoVk9ZQUdFUl9JTlRfTUFTSyk7CiAgICAgICAgIHZhbCAmPSB+bWFzazsKICAgICAgICAgb3V0bCh2YWwsIFZPWUFHRVJfSU5UX01BU0spOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAotCiBzdGF0aWMgdm9pZCBlbmFibGVfdm95YWdlcmd4X2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCB2YWw7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgIG1hc2sgPSAxIDw8IChpcnEgLSBWT1lBR0VSX0lSUV9CQVNFKTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyB2YWw7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgbWFzayA9IDEgPDwgKGlycSAtIFZPWUFHRVJfSVJRX0JBU0UpOwogCiAgICAgICAgIHByX2RlYnVnKCJkaXNhYmxlX3ZveWFnZXJneF9pcnEoJWQpOiBtYXNrPSV4XG4iLCBpcnEsIG1hc2spOwotICAgICAgICBsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAgICAgICAgIHZhbCA9IGlubChWT1lBR0VSX0lOVF9NQVNLKTsKICAgICAgICAgdmFsIHw9IG1hc2s7CiAgICAgICAgIG91dGwodmFsLCBWT1lBR0VSX0lOVF9NQVNLKTsKLSAgICAgICAgbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCi0KIHN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja192b3lhZ2VyZ3godW5zaWduZWQgaW50IGlycSkKIHsKIAlkaXNhYmxlX3ZveWFnZXJneF9pcnEoaXJxKTsKQEAgLTk1LDcgKzg4LDggQEAKIAkuZW5kID0gZW5kX3ZveWFnZXJneF9pcnEsCiB9OwogCi1zdGF0aWMgaXJxcmV0dXJuX3Qgdm95YWdlcmd4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlycXJldHVybl90IHZveWFnZXJneF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXByaW50ayhLRVJOX0lORk8KIAkgICAgICAgIlZveWFnZXJHWDogc3B1cmlvdXMgaW50ZXJydXB0LCBzdGF0dXM6IDB4JXhcbiIsCkBAIC0xMDMsOSArOTcsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCiBzdGF0aWMgc3RydWN0IHsKIAlpbnQgKCpmdW5jKShpbnQsIHZvaWQgKik7CiAJdm9pZCAqZGV2OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jY2hpcHMvdm95YWdlcmd4L3NldHVwLmMgYi9hcmNoL3NoL2NjaGlwcy92b3lhZ2VyZ3gvc2V0dXAuYwppbmRleCAxMzljYTg4Li42NmIyZmVkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NjaGlwcy92b3lhZ2VyZ3gvc2V0dXAuYworKysgYi9hcmNoL3NoL2NjaGlwcy92b3lhZ2VyZ3gvc2V0dXAuYwpAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcnRzNzc1MXIyZC92b3lhZ2VyZ3hfcmVnLmg+CisjaW5jbHVkZSA8YXNtL3ZveWFnZXJneC5oPgogCiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF92b3lhZ2VyZ3godm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9sYW5kaXNrX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9sYW5kaXNrX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjQzMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9jb25maWdzL2xhbmRpc2tfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTM3MyBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjEzLXNoCisjIFN1biBTZXAgMTEgMTM6MDA6NDYgMjAwNQorIworQ09ORklHX1NVUEVSSD15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfR0VORVJJQ19JT01BUD15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorQ09ORklHX1NXQVA9eQorQ09ORklHX1NZU1ZJUEM9eQorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfS09CSkVDVF9VRVZFTlQ9eQorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CitDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQorQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKKworIworIyBTeXN0ZW0gdHlwZQorIworIyBDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83NzUxX1NZU1RFTUggaXMgbm90IHNldAorIyBDT05GSUdfU0hfU1RCMV9IQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NUQjFfT1ZFUkRSSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0hQNlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0NRUkVFSyBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9ETUlEQSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9FQzMxMDQgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0FUVVJOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0RSRUFNQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9DQVQ2ODcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9CSUdTVVIgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0gyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0FEWCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfUlRTNzc1MVIyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9FRE9TSzc3MDUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9MQU5ESVNLPXkKKyMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBzZWxlY3Rpb24KKyMKK0NPTkZJR19DUFVfU0g0PXkKKworIworIyBTSC0yIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQgaXMgbm90IHNldAorCisjCisjIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAorCisjCisjIFNILTQgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBTIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTE9eQorQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVI9eQorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAorCisjCisjIFNUNDAgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBHWDEgaXMgbm90IHNldAorCisjCisjIFNILTRBIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKK0NPTkZJR19NTVU9eQorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CisKKyMKKyMgQ2FjaGUgY29uZmlndXJhdGlvbgorIworIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9XUklURVRIUk9VR0ggaXMgbm90IHNldAorIyBDT05GSUdfU0hfT0NSQU0gaXMgbm90IHNldAorQ09ORklHX01FTU9SWV9TVEFSVD0weDBjMDAwMDAwCitDT05GSUdfTUVNT1JZX1NJWkU9MHgwNDAwMDAwMAorCisjCisjIFByb2Nlc3NvciBmZWF0dXJlcworIworQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKK0NPTkZJR19TSF9GUFU9eQorIyBDT05GSUdfU0hfU1RPUkVfUVVFVUVTIGlzIG5vdCBzZXQKKworIworIyBUaW1lciBzdXBwb3J0CisjCitDT05GSUdfU0hfVE1VPXkKK0NPTkZJR19TSF9QQ0xLX0ZSRVFfQk9PTD15CitDT05GSUdfU0hfUENMS19GUkVRPTMzMzMzMzMzCisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIHN1cHBvcnQKKyMKK0NPTkZJR19TSF9ETUE9eQorQ09ORklHX05SX09OQ0hJUF9ETUFfQ0hBTk5FTFM9NAorIyBDT05GSUdfTlJfRE1BX0NIQU5ORUxTX0JPT0wgaXMgbm90IHNldAorCisjCisjIENvbXBhbmlvbiBDaGlwcworIworIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAorQ09ORklHX0hFQVJUQkVBVD15CisKKyMKKyMgS2VybmVsIGZlYXR1cmVzCisjCitDT05GSUdfS0VYRUM9eQorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTVAgaXMgbm90IHNldAorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAorQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAorIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorCisjCisjIEJ1cyBvcHRpb25zCisjCitDT05GSUdfSVNBPXkKK0NPTkZJR19QQ0k9eQorQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15CitDT05GSUdfUENJX0FVVE89eQorQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQorQ09ORklHX1BDSV9MRUdBQ1lfUFJPQz15CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworQ09ORklHX1BDQ0FSRD15CisjIENPTkZJR19QQ01DSUFfREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BDTUNJQT15CitDT05GSUdfUENNQ0lBX0xPQURfQ0lTPXkKK0NPTkZJR19QQ01DSUFfSU9DVEw9eQorQ09ORklHX0NBUkRCVVM9eQorCisjCisjIFBDLWNhcmQgYnJpZGdlcworIworQ09ORklHX1lFTlRBPXkKKyMgQ09ORklHX1BENjcyOSBpcyBub3Qgc2V0CisjIENPTkZJR19JODIwOTIgaXMgbm90IHNldAorIyBDT05GSUdfSTgyMzY1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDSUMgaXMgbm90IHNldAorQ09ORklHX1BDTUNJQV9QUk9CRT15CitDT05GSUdfUENDQVJEX05PTlNUQVRJQz15CisKKyMKKyMgUENJIEhvdHBsdWcgU3VwcG9ydAorIworIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAorCisjCisjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9BRFZBTkNFRF9ST1VURVI9eQorQ09ORklHX0FTS19JUF9GSUJfSEFTSD15CisjIENPTkZJR19JUF9GSUJfVFJJRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ST1VURV9WRVJCT1NFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9QTlA9eQorIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX0JPT1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfRElBRz15CitDT05GSUdfSU5FVF9UQ1BfRElBRz15CisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKworIworIyBJUDogVmlydHVhbCBTZXJ2ZXIgQ29uZmlndXJhdGlvbgorIworIyBDT05GSUdfSVBfVlMgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSPXkKKyMgQ09ORklHX05FVEZJTFRFUl9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVJfTkVUTElOSyBpcyBub3Qgc2V0CisKKyMKKyMgSVA6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uCisjCitDT05GSUdfSVBfTkZfQ09OTlRSQUNLPW0KK0NPTkZJR19JUF9ORl9DVF9BQ0NUPXkKK0NPTkZJR19JUF9ORl9DT05OVFJBQ0tfTUFSSz15CisjIENPTkZJR19JUF9ORl9DT05OVFJBQ0tfRVZFTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0NUX1BST1RPX1NDVFAgaXMgbm90IHNldAorQ09ORklHX0lQX05GX0ZUUD1tCitDT05GSUdfSVBfTkZfSVJDPW0KKyMgQ09ORklHX0lQX05GX05FVEJJT1NfTlMgaXMgbm90IHNldAorQ09ORklHX0lQX05GX1RGVFA9bQorQ09ORklHX0lQX05GX0FNQU5EQT1tCisjIENPTkZJR19JUF9ORl9QUFRQIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9RVUVVRT1tCitDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQorQ09ORklHX0lQX05GX01BVENIX0xJTUlUPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9JUFJBTkdFPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9NQUM9bQorQ09ORklHX0lQX05GX01BVENIX1BLVFRZUEU9bQorQ09ORklHX0lQX05GX01BVENIX01BUks9bQorQ09ORklHX0lQX05GX01BVENIX01VTFRJUE9SVD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfVE9TPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9SRUNFTlQ9bQorQ09ORklHX0lQX05GX01BVENIX0VDTj1tCitDT05GSUdfSVBfTkZfTUFUQ0hfRFNDUD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfQUhfRVNQPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9MRU5HVEg9bQorQ09ORklHX0lQX05GX01BVENIX1RUTD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfVENQTVNTPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9IRUxQRVI9bQorQ09ORklHX0lQX05GX01BVENIX1NUQVRFPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9DT05OVFJBQ0s9bQorQ09ORklHX0lQX05GX01BVENIX09XTkVSPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9BRERSVFlQRT1tCitDT05GSUdfSVBfTkZfTUFUQ0hfUkVBTE09bQorQ09ORklHX0lQX05GX01BVENIX1NDVFA9bQorIyBDT05GSUdfSVBfTkZfTUFUQ0hfRENDUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfTUFUQ0hfQ09NTUVOVD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfQ09OTk1BUks9bQorIyBDT05GSUdfSVBfTkZfTUFUQ0hfQ09OTkJZVEVTIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9NQVRDSF9IQVNITElNSVQ9bQorIyBDT05GSUdfSVBfTkZfTUFUQ0hfU1RSSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9GSUxURVI9bQorQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9bQorQ09ORklHX0lQX05GX1RBUkdFVF9MT0c9bQorQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfVENQTVNTPW0KKyMgQ09ORklHX0lQX05GX1RBUkdFVF9ORlFVRVVFIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9OQVQ9bQorQ09ORklHX0lQX05GX05BVF9ORUVERUQ9eQorQ09ORklHX0lQX05GX1RBUkdFVF9NQVNRVUVSQURFPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfUkVESVJFQ1Q9bQorQ09ORklHX0lQX05GX1RBUkdFVF9ORVRNQVA9bQorQ09ORklHX0lQX05GX1RBUkdFVF9TQU1FPW0KKyMgQ09ORklHX0lQX05GX05BVF9TTk1QX0JBU0lDIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9OQVRfSVJDPW0KK0NPTkZJR19JUF9ORl9OQVRfRlRQPW0KK0NPTkZJR19JUF9ORl9OQVRfVEZUUD1tCitDT05GSUdfSVBfTkZfTkFUX0FNQU5EQT1tCitDT05GSUdfSVBfTkZfTUFOR0xFPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfVE9TPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfRUNOPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfRFNDUD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX01BUks9bQorQ09ORklHX0lQX05GX1RBUkdFVF9DTEFTU0lGWT1tCisjIENPTkZJR19JUF9ORl9UQVJHRVRfVFRMIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9UQVJHRVRfQ09OTk1BUks9bQorIyBDT05GSUdfSVBfTkZfVEFSR0VUX0NMVVNURVJJUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfUkFXPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTk9UUkFDSz1tCitDT05GSUdfSVBfTkZfQVJQVEFCTEVTPW0KK0NPTkZJR19JUF9ORl9BUlBGSUxURVI9bQorQ09ORklHX0lQX05GX0FSUF9NQU5HTEU9bQorCisjCisjIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorQ09ORklHX0xMQz1tCisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CitDT05GSUdfQVRBTEs9bQorIyBDT05GSUdfREVWX0FQUExFVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX0NMU19ST1VURT15CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9eQorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworIyBDT05GSUdfUE5QIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfQ1BRX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfQ0lTU19EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0RBQzk2MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9eQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorIyBDT05GSUdfQkxLX0RFVl9JTklUUkQgaXMgbm90IHNldAorIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworQ09ORklHX0lERT15CitDT05GSUdfSURFX01BWF9IV0lGUz00CitDT05GSUdfQkxLX0RFVl9JREU9eQorCisjCisjIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcworIworIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVESVNLPXkKKyMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUNTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERUNEPXkKKyMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVTQ1NJPXkKKyMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCitDT05GSUdfSURFX0dFTkVSSUM9eQorQ09ORklHX0JMS19ERVZfSURFUENJPXkKK0NPTkZJR19JREVQQ0lfU0hBUkVfSVJRPXkKK0NPTkZJR19CTEtfREVWX09GRkJPQVJEPXkKK0NPTkZJR19CTEtfREVWX0dFTkVSSUM9eQorIyBDT05GSUdfQkxLX0RFVl9PUFRJNjIxIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQV9QQ0k9eQorIyBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19JREVETUFfUENJX0FVVE89eQorQ09ORklHX0lERURNQV9PTkxZRElTSz15CitDT05GSUdfQkxLX0RFVl9BRUM2MlhYPXkKKyMgQ09ORklHX0JMS19ERVZfQUxJMTVYMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FNRDc0WFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DTUQ2NFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9UUklGTEVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ1k4MkM2OTMgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DUzU1MjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IUFQzNFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TQzEyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTlM4NzQxNSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NWV0tTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0lJTUFHRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NMQzkwRTY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVFJNMjkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVklBODJDWFhYIGlzIG5vdCBzZXQKK0NPTkZJR19JREVfU0g9eQorIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfQ0hJUFNFVFMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BPXkKKyMgQ09ORklHX0lERURNQV9JVkIgaXMgbm90IHNldAorQ09ORklHX0lERURNQV9BVVRPPXkKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPXkKKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TRyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NDSCBpcyBub3Qgc2V0CisKKyMKKyMgU29tZSBTQ1NJIGRldmljZXMgKGUuZy4gQ0QganVrZWJveCkgc3VwcG9ydCBtdWx0aXBsZSBMVU5zCisjCitDT05GSUdfU0NTSV9NVUxUSV9MVU49eQorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfM1dfOVhYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUhBMTUyWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBVEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RUQzMyODAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0VORVJJQ19OQ1I1MzgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfR0VORVJJQ19OQ1I1MzgwX01NSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTkNSNTNDNDA2QSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUEFTMTYgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9QU0kyNDBJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxPR0lDX0ZBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ19GQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1FMQTJYWFg9eQorIyBDT05GSUdfU0NTSV9RTEEyMVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBMjJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTIzMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyMzIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBNjMxMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTI0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1lNNTNDNDE2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfVDEyOCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBTQ1NJIGFkYXB0ZXIgc3VwcG9ydAorIworIyBDT05GSUdfUENNQ0lBX0FIQTE1MlggaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX0ZET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX05JTkpBX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfUENNQ0lBX1FMT0dJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQ01DSUFfU1lNNTNDNTAwIGlzIG5vdCBzZXQKKworIworIyBPbGQgQ0QtUk9NIGRyaXZlcnMgKG5vdCBTQ1NJLCBub3QgSURFKQorIworIyBDT05GSUdfQ0RfTk9fSURFU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKK0NPTkZJR19NRD15CitDT05GSUdfQkxLX0RFVl9NRD1tCitDT05GSUdfTURfTElORUFSPW0KK0NPTkZJR19NRF9SQUlEMD1tCitDT05GSUdfTURfUkFJRDE9bQorIyBDT05GSUdfTURfUkFJRDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01EX1JBSUQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX01EX1JBSUQ2IGlzIG5vdCBzZXQKKyMgQ09ORklHX01EX01VTFRJUEFUSCBpcyBub3Qgc2V0CisjIENPTkZJR19NRF9GQVVMVFkgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9ETSBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorQ09ORklHX1RVTj1tCisKKyMKKyMgQVJDbmV0IGRldmljZXMKKyMKKyMgQ09ORklHX0FSQ05FVCBpcyBub3Qgc2V0CisKKyMKKyMgUEhZIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19QSFlMSUIgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMCBvciAxMDBNYml0KQorIworQ09ORklHX05FVF9FVEhFUk5FVD15CitDT05GSUdfTUlJPXkKKyMgQ09ORklHX1NUTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBUFBZTUVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5HRU0gaXMgbm90IHNldAorIyBDT05GSUdfQ0FTU0lOSSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9TTUMgaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfUkFDQUwgaXMgbm90IHNldAorCisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfQVQxNzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUENBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JU0EgaXMgbm90IHNldAorIyBDT05GSUdfTkUyMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfUENJPXkKKyMgQ09ORklHX1BDTkVUMzIgaXMgbm90IHNldAorIyBDT05GSUdfQU1EODExMV9FVEggaXMgbm90IHNldAorIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BQzMyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVBSSUNPVCBpcyBub3Qgc2V0CisjIENPTkZJR19CNDQgaXMgbm90IHNldAorIyBDT05GSUdfRk9SQ0VERVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NTODl4MCBpcyBub3Qgc2V0CisjIENPTkZJR19ER1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAorIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAorQ09ORklHXzgxMzlDUD15CisjIENPTkZJR184MTM5VE9PIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFBDTUNJQSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfUENNQ0lBIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1NIX1NDST15CitDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CisjIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfUlRDIGlzIG5vdCBzZXQKK0NPTkZJR19SUzVDMzEzX1JUQz15CisjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKworIworIyBQQ01DSUEgY2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1NZTkNMSU5LX0NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgQ2FwYWJpbGl0aWVzIFBvcnQgZHJpdmVycworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworQ09ORklHX1ZJREVPX0RFVj1tCisKKyMKKyMgVmlkZW8gRm9yIExpbnV4CisjCisKKyMKKyMgVmlkZW8gQWRhcHRlcnMKKyMKKyMgQ09ORklHX1ZJREVPX1BNUyBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19DUElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX1NUUkFESVMgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fTVhCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0RQQyBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19IRVhJVU1fT1JJT04gaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fSEVYSVVNX0dFTUlOSSBpcyBub3Qgc2V0CisKKyMKKyMgUmFkaW8gQWRhcHRlcnMKKyMKKyMgQ09ORklHX1JBRElPX0NBREVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRElPX1JUUkFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19SQURJT19SVFJBQ0syIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRElPX0FaVEVDSCBpcyBub3Qgc2V0CisjIENPTkZJR19SQURJT19HRU1URUsgaXMgbm90IHNldAorIyBDT05GSUdfUkFESU9fR0VNVEVLX1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19SQURJT19NQVhJUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfUkFESU9fTUFFU1RSTyBpcyBub3Qgc2V0CisjIENPTkZJR19SQURJT19TRjE2Rk1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRElPX1NGMTZGTVIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRElPX1RFUlJBVEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRElPX1RSVVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBRElPX1RZUEhPT04gaXMgbm90IHNldAorIyBDT05GSUdfUkFESU9fWk9MVFJJWCBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19NREFfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CitDT05GSUdfRk9OVF84eDE2PXkKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPW0KKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKKyMgQ09ORklHX1NORCBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKK0NPTkZJR19TT1VORF9QUklNRT1tCisjIENPTkZJR19TT1VORF9CVDg3OCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9DTVBDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9FTVUxMEsxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0ZVU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9DUzQyODEgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfRVMxMzcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0VTMTM3MSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9FU1NTT0xPMSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NQUVTVFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX01BRVNUUk8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0lDSCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9TT05JQ1ZJQkVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX1RSSURFTlQgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTVNORENMQVMgaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfTVNORFBJTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9WSUE4MkNYWFggaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfQUxJNTQ1NSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9GT1JURSBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9STUU5NlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0FEMTk4MCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CitDT05GSUdfVVNCPXkKKyMgQ09ORklHX1VTQl9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVU0Igb3B0aW9ucworIworQ09ORklHX1VTQl9ERVZJQ0VGUz15CisjIENPTkZJR19VU0JfQkFORFdJRFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfT1RHIGlzIG5vdCBzZXQKKworIworIyBVU0IgSG9zdCBDb250cm9sbGVyIERyaXZlcnMKKyMKK0NPTkZJR19VU0JfRUhDSV9IQ0Q9eQorIyBDT05GSUdfVVNCX0VIQ0lfU1BMSVRfSVNPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FSENJX1JPT1RfSFVCX1RUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JU1AxMTZYX0hDRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfSENEPXkKKyMgQ09ORklHX1VTQl9PSENJX0JJR19FTkRJQU4gaXMgbm90IHNldAorQ09ORklHX1VTQl9PSENJX0xJVFRMRV9FTkRJQU49eQorIyBDT05GSUdfVVNCX1VIQ0lfSENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TTDgxMV9IQ0QgaXMgbm90IHNldAorCisjCisjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycworIworQ09ORklHX09CU09MRVRFX09TU19VU0JfRFJJVkVSPXkKK0NPTkZJR19VU0JfQVVESU89bQorIyBDT05GSUdfVVNCX0JMVUVUT09USF9UVFkgaXMgbm90IHNldAorQ09ORklHX1VTQl9NSURJPW0KKyMgQ09ORklHX1VTQl9BQ00gaXMgbm90IHNldAorQ09ORklHX1VTQl9QUklOVEVSPW0KKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT1tCisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NUT1JBR0VfREFUQUZBQj15CitDT05GSUdfVVNCX1NUT1JBR0VfRlJFRUNPTT15CitDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwPXkKK0NPTkZJR19VU0JfU1RPUkFHRV9EUENNPXkKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1VTQkFUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU1RPUkFHRV9TRERSMDk9eQorQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NT15CitDT05GSUdfVVNCX1NUT1JBR0VfSlVNUFNIT1Q9eQorCisjCisjIFVTQiBJbnB1dCBEZXZpY2VzCisjCitDT05GSUdfVVNCX0hJRD1tCitDT05GSUdfVVNCX0hJRElOUFVUPXkKKyMgQ09ORklHX0hJRF9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSElEREVWIGlzIG5vdCBzZXQKKworIworIyBVU0IgSElEIEJvb3QgUHJvdG9jb2wgZHJpdmVycworIworIyBDT05GSUdfVVNCX0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FJUFRFSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfV0FDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9JVE1UT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfRUdBTEFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9ZRUFMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9YUEFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BVElfUkVNT1RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LRVlTUEFOX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVBQTEVUT1VDSCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEltYWdpbmcgZGV2aWNlcworIworIyBDT05GSUdfVVNCX01EQzgwMCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAorCisjCisjIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKKyMKK0NPTkZJR19VU0JfREFCVVNCPW0KK0NPTkZJR19VU0JfVklDQU09bQorQ09ORklHX1VTQl9EU0JSPW0KK0NPTkZJR19VU0JfSUJNQ0FNPW0KK0NPTkZJR19VU0JfS09OSUNBV0M9bQorQ09ORklHX1VTQl9PVjUxMT1tCitDT05GSUdfVVNCX1NFNDAxPW0KK0NPTkZJR19VU0JfU045QzEwMj1tCitDT05GSUdfVVNCX1NUVjY4MD1tCitDT05GSUdfVVNCX1BXQz1tCisKKyMKKyMgVVNCIE5ldHdvcmsgQWRhcHRlcnMKKyMKKyMgQ09ORklHX1VTQl9DQVRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9LQVdFVEggaXMgbm90IHNldAorQ09ORklHX1VTQl9QRUdBU1VTPW0KK0NPTkZJR19VU0JfUlRMODE1MD1tCisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfTU9OPXkKKworIworIyBVU0IgcG9ydCBkcml2ZXJzCisjCisKKyMKKyMgVVNCIFNlcmlhbCBDb252ZXJ0ZXIgc3VwcG9ydAorIworQ09ORklHX1VTQl9TRVJJQUw9bQorIyBDT05GSUdfVVNCX1NFUklBTF9HRU5FUklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQUlSUFJJTUUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9CRUxLSU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9XSElURUhFQVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9ESUdJX0FDQ0VMRVBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9DUDIxMDEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9DWVBSRVNTX004IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRU1QRUcgaXMgbm90IHNldAorQ09ORklHX1VTQl9TRVJJQUxfRlRESV9TSU89bQorIyBDT05GSUdfVVNCX1NFUklBTF9WSVNPUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0lQQVEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9JUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0VER0VQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRURHRVBPUlRfVEkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9HQVJNSU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9JUFcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LRVlTUEFOX1BEQSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LTFNJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS09CSUxfU0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfTUNUX1UyMzIgaXMgbm90IHNldAorQ09ORklHX1VTQl9TRVJJQUxfUEwyMzAzPW0KKyMgQ09ORklHX1VTQl9TRVJJQUxfSFA0WCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1NBRkUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9USSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0NZQkVSSkFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1hJUkNPTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX09QVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX09NTklORVQgaXMgbm90IHNldAorCisjCisjIFVTQiBNaXNjZWxsYW5lb3VzIGRyaXZlcnMKKyMKK0NPTkZJR19VU0JfRU1JNjI9bQorQ09ORklHX1VTQl9FTUkyNj1tCisjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVRLSVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVRTRVJWTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NJU1VTQlZHQT1tCitDT05GSUdfVVNCX1NJU1VTQlZHQV9DT049eQorIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKKworIworIyBVU0IgRFNMIG1vZGVtIHN1cHBvcnQKKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBTTiBEZXZpY2VzCisjCisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorQ09ORklHX1JFSVNFUkZTX0ZTPXkKKyMgQ09ORklHX1JFSVNFUkZTX0NIRUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX1BST0NfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUlTRVJGU19GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CitDT05GSUdfUk9NRlNfRlM9eQorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworQ09ORklHX0lTTzk2NjBfRlM9bQorIyBDT05GSUdfSk9MSUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1pJU09GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKK0NPTkZJR19GQVRfRlM9eQorQ09ORklHX01TRE9TX0ZTPXkKK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRT00MzcKK0NPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQ9Imlzbzg4NTktMSIKK0NPTkZJR19OVEZTX0ZTPW0KKyMgQ09ORklHX05URlNfREVCVUcgaXMgbm90IHNldAorQ09ORklHX05URlNfUlc9eQorCisjCisjIFBzZXVkbyBmaWxlc3lzdGVtcworIworQ09ORklHX1BST0NfRlM9eQorIyBDT05GSUdfUFJPQ19LQ09SRSBpcyBub3Qgc2V0CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX1JFTEFZRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CitDT05GSUdfVUZTX0ZTPW0KK0NPTkZJR19VRlNfRlNfV1JJVEU9eQorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPW0KK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEPW0KK0NPTkZJR19ORlNEX1YzPXkKKyMgQ09ORklHX05GU0RfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0RfVjQgaXMgbm90IHNldAorQ09ORklHX05GU0RfVENQPXkKK0NPTkZJR19MT0NLRD1tCitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX0VYUE9SVEZTPW0KK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9bQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorQ09ORklHX1NNQl9GUz1tCisjIENPTkZJR19TTUJfTkxTX0RFRkFVTFQgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0NPREVQQUdFXzkzMj15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTQ5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQVNDSUkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CitDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CisjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfRUFSTFlfUFJJTlRLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvc2gvY29uZmlncy9yNzc4MHJwX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9yNzc4MHJwX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTk3ZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9jb25maWdzL3I3NzgwcnBfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTA5OSBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE1LXNoCisjIFNhdCBKYW4gIDcgMTk6NDc6NTMgMjAwNgorIworQ09ORklHX1NVUEVSSD15CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19DTEVBTl9DT01QSUxFPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19MT0NLX0tFUk5FTD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CitDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX0tPQkpFQ1RfVUVWRU5UPXkKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorIyBDT05GSUdfRlVURVggaXMgbm90IHNldAorIyBDT05GSUdfRVBPTEwgaXMgbm90IHNldAorQ09ORklHX1NITUVNPXkKK0NPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAorQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCitDT05GSUdfQ0NfQUxJR05fTE9PUFM9MAorQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorCisjCisjIExvYWRhYmxlIG1vZHVsZSBzdXBwb3J0CisjCitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9NT0RQQVJNPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CitDT05GSUdfS01PRD15CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPU0NIRURfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0RFQURMSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQ0ZRIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX05PT1A9eQorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0ibm9vcCIKKworIworIyBTeXN0ZW0gdHlwZQorIworIyBDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83NzUxX1NZU1RFTUggaXMgbm90IHNldAorIyBDT05GSUdfU0hfU1RCMV9IQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NUQjFfT1ZFUkRSSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0hQNlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0NRUkVFSyBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9ETUlEQSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9FQzMxMDQgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0FUVVJOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0RSRUFNQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9DQVQ2ODcwMSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9CSUdTVVIgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0gyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0FEWCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfUlRTNzc1MVIyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9SNzc3MDNEUlAgaXMgbm90IHNldAorQ09ORklHX1NIX1I3NzgwUlA9eQorIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBzZWxlY3Rpb24KKyMKK0NPTkZJR19DUFVfU0g0PXkKK0NPTkZJR19DUFVfU0g0QT15CisKKyMKKyMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKKworIworIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDggaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5IGlzIG5vdCBzZXQKKworIworIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CisKKyMKKyMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0CisKKyMKKyMgU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODA9eQorCisjCisjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKK0NPTkZJR19NTVU9eQorQ09ORklHXzMyQklUPXkKK0NPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NEs9eQorIyBDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMU1CIGlzIG5vdCBzZXQKK0NPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKK0NPTkZJR19GTEFUTUVNX01BTlVBTD15CisjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQQVJTRU1FTV9NQU5VQUwgaXMgbm90IHNldAorQ09ORklHX0ZMQVRNRU09eQorQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQPXkKKyMgQ09ORklHX1NQQVJTRU1FTV9TVEFUSUMgaXMgbm90IHNldAorQ09ORklHX1NQTElUX1BUTE9DS19DUFVTPTQKKworIworIyBDYWNoZSBjb25maWd1cmF0aW9uCisjCisjIENPTkZJR19TSF9ESVJFQ1RfTUFQUEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1dSSVRFVEhST1VHSCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9PQ1JBTSBpcyBub3Qgc2V0CitDT05GSUdfTUVNT1JZX1NUQVJUPTB4MDgwMDAwMDAKK0NPTkZJR19NRU1PUllfU0laRT0weDA4MDAwMDAwCisKKyMKKyMgUHJvY2Vzc29yIGZlYXR1cmVzCisjCitDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQorQ09ORklHX1NIX0ZQVT15CitDT05GSUdfU0hfU1RPUkVfUVVFVUVTPXkKKworIworIyBUaW1lciBzdXBwb3J0CisjCitDT05GSUdfU0hfVE1VPXkKK0NPTkZJR19TSF9QQ0xLX0ZSRVFfQk9PTD15CitDT05GSUdfU0hfUENMS19GUkVRPTMyMDAwMDAwCisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIHN1cHBvcnQKKyMKK0NPTkZJR19TSF9ETUE9eQorQ09ORklHX05SX09OQ0hJUF9ETUFfQ0hBTk5FTFM9NgorIyBDT05GSUdfTlJfRE1BX0NIQU5ORUxTX0JPT0wgaXMgbm90IHNldAorCisjCisjIENvbXBhbmlvbiBDaGlwcworIworIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBmZWF0dXJlcworIworIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFQ9eQorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfSEFTX0lOVEVWVD15CitDT05GSUdfQ1BVX0hBU19JTlRDMl9JUlE9eQorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAorQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAorIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CitDT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FPSJtZW09MTI4TSBjb25zb2xlPXR0eVNDMCwxMTUyMDAgcm9vdD0vZGV2L2hkYTEiCisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19QQ0k9eQorQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15CitDT05GSUdfUENJX0FVVE89eQorQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQorQ09ORklHX1BDSV9MRUdBQ1lfUFJPQz15CisjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgUENJIEhvdHBsdWcgU3VwcG9ydAorIworQ09ORklHX0hPVFBMVUdfUENJPXkKKyMgQ09ORklHX0hPVFBMVUdfUENJX0ZBS0UgaXMgbm90IHNldAorIyBDT05GSUdfSE9UUExVR19QQ0lfQ1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHX1BDSV9TSFBDIGlzIG5vdCBzZXQKKworIworIyBFeGVjdXRhYmxlIGZpbGUgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX0ZMQVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19BU0tfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfRklCX1RSSUUgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKKyMgQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEggaXMgbm90IHNldAorIyBDT05GSUdfSVBfUk9VVEVfVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CisjIENPTkZJR19JUF9QTlBfQk9PVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX1JBUlAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CitDT05GSUdfQlJJREdFPW0KKyMgQ09ORklHX1ZMQU5fODAyMVEgaXMgbm90IHNldAorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorCisjCisjIFFvUyBhbmQvb3IgZmFpciBxdWV1ZWluZworIworIyBDT05GSUdfTkVUX1NDSEVEIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj1tCisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1JBTT15CitDT05GSUdfQkxLX0RFVl9SQU1fQ09VTlQ9MTYKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTQwOTYKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCitDT05GSUdfSURFPW0KK0NPTkZJR19JREVfTUFYX0hXSUZTPTQKK0NPTkZJR19CTEtfREVWX0lERT1tCisKKyMKKyMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCisjCitDT05GSUdfQkxLX0RFVl9JREVfU0FUQT15CitDT05GSUdfQkxLX0RFVl9JREVESVNLPW0KK0NPTkZJR19JREVESVNLX01VTFRJX01PREU9eQorIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFU0NTST1tCisjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CisKKyMKKyMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcworIworQ09ORklHX0lERV9HRU5FUklDPW0KK0NPTkZJR19CTEtfREVWX0lERVBDST15CitDT05GSUdfSURFUENJX1NIQVJFX0lSUT15CisjIENPTkZJR19CTEtfREVWX09GRkJPQVJEIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0dFTkVSSUM9bQorIyBDT05GSUdfQkxLX0RFVl9PUFRJNjIxIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQV9QQ0k9eQorIyBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19JREVETUFfUENJX0FVVE89eQorIyBDT05GSUdfSURFRE1BX09OTFlESVNLIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0FFQzYyWFg9bQorIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DWTgyQzY5MyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JVDgyMVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1BEQzIwMlhYX05FVz1tCisjIENPTkZJR19QREMyMDJYWF9GT1JDRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NWV0tTIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX1NJSU1BR0U9bQorIyBDT05GSUdfQkxLX0RFVl9TTEM5MEU2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSTTI5MCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CitDT05GSUdfSURFX1NIPXkKKyMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BPXkKKyMgQ09ORklHX0lERURNQV9JVkIgaXMgbm90IHNldAorQ09ORklHX0lERURNQV9BVVRPPXkKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0k9bQorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKK0NPTkZJR19CTEtfREVWX1NEPW0KKyMgQ09ORklHX0NIUl9ERVZfU1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9PU1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1IgaXMgbm90IHNldAorQ09ORklHX0NIUl9ERVZfU0c9bQorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0lTQ1NJX1RDUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWXzNXX1hYWFhfUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJXzNXXzlYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FBQ1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRFBUX0kyTyBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NBVEEgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1lNNTNDOFhYXzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9JUFIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTE9HSUNfMTI4MCBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9RTEEyWFhYPW0KKyMgQ09ORklHX1NDU0lfUUxBMjFYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTIyWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyMzAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBMjMyMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTYzMTIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyNFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lFRUUxMzk0IGlzIG5vdCBzZXQKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyTyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfU1ROSUMgaXMgbm90IHNldAorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorCisjCisjIFR1bGlwIGZhbWlseSBuZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19ORVRfVFVMSVAgaXMgbm90IHNldAorIyBDT05GSUdfSFAxMDAgaXMgbm90IHNldAorQ09ORklHX05FMjAwMD15CitDT05GSUdfTkVUX1BDST15CitDT05GSUdfUENORVQzMj1tCisjIENPTkZJR19BTUQ4MTExX0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19BREFQVEVDX1NUQVJGSVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0I0NCBpcyBub3Qgc2V0CisjIENPTkZJR19GT1JDRURFVEggaXMgbm90IHNldAorIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQUxOWCBpcyBub3Qgc2V0CisjIENPTkZJR19OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMktfUENJIGlzIG5vdCBzZXQKK0NPTkZJR184MTM5Q1A9bQorQ09ORklHXzgxMzlUT089bQorIyBDT05GSUdfODEzOVRPT19QSU8gaXMgbm90IHNldAorIyBDT05GSUdfODEzOVRPT19UVU5FX1RXSVNURVIgaXMgbm90IHNldAorQ09ORklHXzgxMzlUT09fODEyOT15CisjIENPTkZJR184MTM5X09MRF9SWF9SRVNFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSVM5MDAgaXMgbm90IHNldAorIyBDT05GSUdfRVBJQzEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TVU5EQU5DRSBpcyBub3Qgc2V0CisjIENPTkZJR19UTEFOIGlzIG5vdCBzZXQKK0NPTkZJR19WSUFfUkhJTkU9bQorQ09ORklHX1ZJQV9SSElORV9NTUlPPXkKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorQ09ORklHX0UxMDAwPW0KKyMgQ09ORklHX0UxMDAwX05BUEkgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CitDT05GSUdfUjgxNjk9eQorIyBDT05GSUdfUjgxNjlfTkFQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCitDT05GSUdfTkVUX1JBRElPPXkKKworIworIyBPYnNvbGV0ZSBXaXJlbGVzcyBjYXJkcyBzdXBwb3J0IChwcmUtODAyLjExKQorIworIyBDT05GSUdfU1RSSVAgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIDgwMi4xMWIgSVNBL1BDSSBjYXJkcyBzdXBwb3J0CisjCitDT05GSUdfSEVSTUVTPW0KKyMgQ09ORklHX1BMWF9IRVJNRVMgaXMgbm90IHNldAorIyBDT05GSUdfVE1EX0hFUk1FUyBpcyBub3Qgc2V0CisjIENPTkZJR19OT1JURUxfSEVSTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BDSV9IRVJNRVMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNRUwgaXMgbm90IHNldAorCisjCisjIFByaXNtIEdUL0R1ZXR0ZSA4MDIuMTEoYS9iL2cpIFBDSS9DYXJkYnVzIHN1cHBvcnQKKyMKK0NPTkZJR19QUklTTTU0PW0KKyMgQ09ORklHX0hPU1RBUCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1dJUkVMRVNTPXkKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiBpcyBub3Qgc2V0CisKKyMKKyMgSVNETiBzdWJzeXN0ZW0KKyMKKyMgQ09ORklHX0lTRE4gaXMgbm90IHNldAorCisjCisjIFRlbGVwaG9ueSBTdXBwb3J0CisjCisjIENPTkZJR19QSE9ORSBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19JTlBVVD15CisKKyMKKyMgVXNlcmxhbmQgaW50ZXJmYWNlcworIworQ09ORklHX0lOUFVUX01PVVNFREVWPXkKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYIGlzIG5vdCBzZXQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCitDT05GSUdfSU5QVVRfS0VZQk9BUkQ9eQorQ09ORklHX0tFWUJPQVJEX0FUS0JEPXkKKyMgQ09ORklHX0tFWUJPQVJEX1NVTktCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9MS0tCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9YVEtCRCBpcyBub3Qgc2V0CisjIENPTkZJR19LRVlCT0FSRF9ORVdUT04gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfSk9ZU1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCitDT05GSUdfU0VSSU89eQorIyBDT05GSUdfU0VSSU9fSTgwNDIgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU9fU0VSUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJT19QQ0lQUzIgaXMgbm90IHNldAorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9TSF9TQ0k9eQorQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorIyBDT05GSUdfQVBQTElDT00gaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworIyBDT05GSUdfSTJDIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXTU9OX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgQ2FwYWJpbGl0aWVzIFBvcnQgZHJpdmVycworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworIyBDT05GSUdfVklERU9fREVWIGlzIG5vdCBzZXQKKworIworIyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyBEZXZpY2VzCisjCisjIENPTkZJR19EVkIgaXMgbm90IHNldAorCisjCisjIEdyYXBoaWNzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZCIGlzIG5vdCBzZXQKKworIworIyBTb3VuZAorIworQ09ORklHX1NPVU5EPW0KKworIworIyBBZHZhbmNlZCBMaW51eCBTb3VuZCBBcmNoaXRlY3R1cmUKKyMKKyMgQ09ORklHX1NORCBpcyBub3Qgc2V0CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKK0NPTkZJR19TT1VORF9QUklNRT1tCisjIENPTkZJR19PQlNPTEVURV9PU1NfRFJJVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPVU5EX0ZVU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9JQ0ggaXMgbm90IHNldAorIyBDT05GSUdfU09VTkRfVFJJREVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0CisjIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBJbmZpbmlCYW5kIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAorCisjCisjIFNOIERldmljZXMKKyMKKworIworIyBGaWxlIHN5c3RlbXMKKyMKK0NPTkZJR19FWFQyX0ZTPXkKKyMgQ09ORklHX0VYVDJfRlNfWEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlM9eQorQ09ORklHX0VYVDNfRlNfWEFUVFI9eQorIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfRVhUM19GU19TRUNVUklUWSBpcyBub3Qgc2V0CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT15CisjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0ZTX1BPU0lYX0FDTD15CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorQ09ORklHX01JTklYX0ZTPXkKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZPXkKKyMgQ09ORklHX1FVT1RBIGlzIG5vdCBzZXQKK0NPTkZJR19ETk9USUZZPXkKKyMgQ09ORklHX0FVVE9GU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorCisjCisjIENELVJPTS9EVkQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0lTTzk2NjBfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVURGX0ZTIGlzIG5vdCBzZXQKKworIworIyBET1MvRkFUL05UIEZpbGVzeXN0ZW1zCisjCitDT05GSUdfRkFUX0ZTPXkKK0NPTkZJR19NU0RPU19GUz15CitDT05GSUdfVkZBVF9GUz15CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CitDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUPSJpc284ODU5LTEiCitDT05GSUdfTlRGU19GUz15CisjIENPTkZJR19OVEZTX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19OVEZTX1JXPXkKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CitDT05GSUdfSFVHRVRMQkZTPXkKK0NPTkZJR19IVUdFVExCX1BBR0U9eQorQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX1JFTEFZRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfTkZTX1Y0PXkKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD15CitDT05GSUdfTkZTRF9WMz15CisjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfTkZTRF9WND15CitDT05GSUdfTkZTRF9UQ1A9eQorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorQ09ORklHX1NVTlJQQ19HU1M9eQorQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR185UF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCisjIENPTkZJR19QQVJUSVRJT05fQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9eQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz15CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKK0NPTkZJR19OTFNfQ09ERVBBR0VfOTMyPXkKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19LRVJORUw9eQorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKK0NPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CisjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1BSRUVNUFQ9eQorQ09ORklHX0RFQlVHX1NQSU5MT0NLPXkKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfRlM9eQorIyBDT05GSUdfREVCVUdfVk0gaXMgbm90IHNldAorQ09ORklHX0ZSQU1FX1BPSU5URVI9eQorIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKK0NPTkZJR19DUllQVE89eQorQ09ORklHX0NSWVBUT19ITUFDPXkKKyMgQ09ORklHX0NSWVBUT19OVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19NRDQgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19NRDU9eQorIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVTPXkKKyMgQ09ORklHX0NSWVBUT19CTE9XRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fVFdPRklTSCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fU0VSUEVOVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fQVJDNCBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fS0hBWkFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19BTlVCSVMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0RFRkxBVEUgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX01JQ0hBRUxfTUlDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19DUkMzMkMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzMxODBfZGVmY29uZmlnIGIvYXJjaC9zaC9jb25maWdzL3NlNzMxODBfZGVmY29uZmlnCmluZGV4IGQyMTdlNDQuLmZlMTlmZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY29uZmlncy9zZTczMTgwX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3MzE4MF9kZWZjb25maWcKQEAgLTc4LDYgKzc4LDcgQEAKICMgQ09ORklHX1NIX1NFQ1VSRUVER0U1NDEwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX0hTNzc1MVJWT0lQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1JUUzc3NTFSMkQgaXMgbm90IHNldAorIyBDT05GSUdfU0hfUjc3ODBSUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9FRE9TSzc3MDUgaXMgbm90IHNldAogIyBDT05GSUdfU0hfU0g0MjAyX01JQ1JPREVWIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzM0M19kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3MzQzX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDhlNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9jb25maWdzL3NlNzM0M19kZWZjb25maWcKQEAgLTAsMCArMSw5OTcgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNworIyBNb24gQXVnICA3IDIwOjE0OjQ0IDIwMDYKKyMKK0NPTkZJR19TVVBFUkg9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19VSUQxNj15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CisjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CisjIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CitDT05GSUdfVElOWV9TSE1FTT15CitDT05GSUdfQkFTRV9TTUFMTD0wCisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9JTlRFUk1PRFVMRT15CisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBsYXllcgorIworIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9ERUFETElORT15CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iZGVhZGxpbmUiCisKKyMKKyMgU3lzdGVtIHR5cGUKKyMKK0NPTkZJR19TT0xVVElPTl9FTkdJTkU9eQorIyBDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKK0NPTkZJR19TSF83MzQzX1NPTFVUSU9OX0VOR0lORT15CisjIENPTkZJR19TSF83MzE4MF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfNzc1MV9TWVNURU1IIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0hQNlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0VDMzEwNCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TQVRVUk4gaXMgbm90IHNldAorIyBDT05GSUdfU0hfRFJFQU1DQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0JJR1NVUiBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfNzcxMFZPSVBHVyBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9SVFM3NzUxUjJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1I3NzgwUlAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NITUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBzZWxlY3Rpb24KKyMKK0NPTkZJR19DUFVfU0g0PXkKK0NPTkZJR19DUFVfU0g0QT15CisKKyMKKyMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKKworIworIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTAgaXMgbm90IHNldAorCisjCisjIFNILTQgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKKworIworIyBTVDQwIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKKworIworIyBTSC00QSBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzPXkKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKK0NPTkZJR19NTVU9eQorQ09ORklHX1BBR0VfT0ZGU0VUPTB4ODAwMDAwMDAKK0NPTkZJR19NRU1PUllfU1RBUlQ9MHgwYzAwMDAwMAorQ09ORklHX01FTU9SWV9TSVpFPTB4MDEwMDAwMDAKK0NPTkZJR18zMkJJVD15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisKKyMKKyMgQ2FjaGUgY29uZmlndXJhdGlvbgorIworIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9XUklURVRIUk9VR0ggaXMgbm90IHNldAorIyBDT05GSUdfU0hfT0NSQU0gaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBmZWF0dXJlcworIworQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX1NIX0ZQVSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9GUFVfRU1VIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9EU1A9eQorIyBDT05GSUdfU0hfU1RPUkVfUVVFVUVTIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfSEFTX0lOVEVWVD15CitDT05GSUdfQ1BVX0hBU19TUl9SQj15CisKKyMKKyMgVGltZXIgc3VwcG9ydAorIworQ09ORklHX1NIX1RNVT15CitDT05GSUdfU0hfUENMS19GUkVRPTI3MDAwMDAwCisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIX0RNQSBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcGFuaW9uIENoaXBzCisjCisjIENPTkZJR19IRDY0NDZYX1NFUklFUyBpcyBub3Qgc2V0CitDT05GSUdfSEVBUlRCRUFUPXkKKworIworIyBLZXJuZWwgZmVhdHVyZXMKKyMKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisKKyMKKyMgQm9vdCBvcHRpb25zCisjCitDT05GSUdfWkVST19QQUdFX09GRlNFVD0weDAwMDAxMDAwCitDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCisjIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKyMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CisjCisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9GTEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nCisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKKyMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19QQUNLRVQ9eQorQ09ORklHX1BBQ0tFVF9NTUFQPXkKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorIyBDT05GSUdfSVBfUE5QX0JPT1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisKKyMKKyMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CitDT05GSUdfRldfTE9BREVSPXkKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ09OQ0FUPXkKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfQU1EU1REPXkKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKK0NPTkZJR19NVERfUkFNPXkKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TT0xVVElPTkVOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19TVE5JQyBpcyBub3Qgc2V0CitDT05GSUdfU01DOTFYPXkKKyMgQ09ORklHX05FMjAwMCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfU0hfU0NJPXkKK0NPTkZJR19TRVJJQUxfU0hfU0NJX05SX1VBUlRTPTIKK0NPTkZJR19TRVJJQUxfU0hfU0NJX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1VOSVg5OF9QVFlTIGlzIG5vdCBzZXQKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CitDT05GSUdfSTJDX0NIQVJERVY9eQorCisjCisjIEkyQyBBbGdvcml0aG1zCisjCisjIENPTkZJR19JMkNfQUxHT0JJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDRiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfQUxHT1BDQSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEhhcmR3YXJlIEJ1cyBzdXBwb3J0CisjCisjIENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU1RVQiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CitDT05GSUdfSTJDX1NINzM0Mz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0VFUFJPTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1NzQgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0FMR08gaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0JVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9WSUQgaXMgbm90IHNldAorCisjCisjIE1pc2MgZGV2aWNlcworIworCisjCisjIE11bHRpbWVkaWEgZGV2aWNlcworIworQ09ORklHX1ZJREVPX0RFVj15CitDT05GSUdfVklERU9fVjRMMT15CitDT05GSUdfVklERU9fVjRMMV9DT01QQVQ9eQorQ09ORklHX1ZJREVPX1Y0TDI9eQorCisjCisjIFZpZGVvIENhcHR1cmUgQWRhcHRlcnMKKyMKKworIworIyBWaWRlbyBDYXB0dXJlIEFkYXB0ZXJzCisjCisjIENPTkZJR19WSURFT19BRFZfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fVklWSSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19DUElBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX1NBQTUyNDZBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX1NBQTUyNDkgaXMgbm90IHNldAorIyBDT05GSUdfVFVORVJfMzAzNiBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19PVkNBTUNISVAgaXMgbm90IHNldAorCisjCisjIEVuY29kZXJzIGFuZCBEZWNvZGVycworIworIyBDT05GSUdfVklERU9fTVNQMzQwMCBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19DUzUzTDMyQSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19XTTg3NzUgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fV004NzM5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX0NYMjU4NDAgaXMgbm90IHNldAorIyBDT05GSUdfVklERU9fU0FBNzExWCBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19TQUE3MTI3IGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJREVPX1VQRDY0MDMxQSBpcyBub3Qgc2V0CisjIENPTkZJR19WSURFT19VUEQ2NDA4MyBpcyBub3Qgc2V0CisKKyMKKyMgUmFkaW8gQWRhcHRlcnMKKyMKKyMgQ09ORklHX1JBRElPX01BRVNUUk8gaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworQ09ORklHX0ZCPXkKKyMgQ09ORklHX0ZCX0NGQl9GSUxMUkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9DRkJfQ09QWUFSRUEgaXMgbm90IHNldAorIyBDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9NQUNNT0RFUyBpcyBub3Qgc2V0CitDT05GSUdfRkJfRklSTVdBUkVfRURJRD15CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX0VQU09OMTM1NSBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9TMUQxM1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9WSVJUVUFMIGlzIG5vdCBzZXQKKworIworIyBDb25zb2xlIGRpc3BsYXkgZHJpdmVyIHN1cHBvcnQKKyMKK0NPTkZJR19EVU1NWV9DT05TT0xFPXkKKyMgQ09ORklHX0ZSQU1FQlVGRkVSX0NPTlNPTEUgaXMgbm90IHNldAorCisjCisjIExvZ28gY29uZmlndXJhdGlvbgorIworIyBDT05GSUdfTE9HTyBpcyBub3Qgc2V0CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCitDT05GSUdfU09VTkQ9eQorCisjCisjIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQorIworQ09ORklHX1NORD15CitDT05GSUdfU05EX1RJTUVSPXkKK0NPTkZJR19TTkRfUENNPXkKK0NPTkZJR19TTkRfU0VRVUVOQ0VSPXkKKyMgQ09ORklHX1NORF9TRVFfRFVNTVkgaXMgbm90IHNldAorQ09ORklHX1NORF9PU1NFTVVMPXkKKyMgQ09ORklHX1NORF9NSVhFUl9PU1MgaXMgbm90IHNldAorQ09ORklHX1NORF9QQ01fT1NTPXkKK0NPTkZJR19TTkRfUENNX09TU19QTFVHSU5TPXkKKyMgQ09ORklHX1NORF9TRVFVRU5DRVJfT1NTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CitDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQST15CitDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKKyMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAorCisjCisjIEdlbmVyaWMgZGV2aWNlcworIworIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9WSVJNSURJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKKworIworIyBTdXBlckggZGV2aWNlcworIworQ09ORklHX1NINzM0M19TSVU9bQorQ09ORklHX0FLNDUzN19DT0RFQz15CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBMRUQgZGV2aWNlcworIworIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorCisjCisjIExFRCBkcml2ZXJzCisjCisKKyMKKyMgTEVEIFRyaWdnZXJzCisjCisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisKKyMKKyMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCisjCisKKyMKKyMgUmVhbCBUaW1lIENsb2NrCisjCisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKKyMgQ09ORklHX1BST0NfS0NPUkUgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorIyBDT05GSUdfTkZTX1YzX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEPXkKKyMgQ09ORklHX05GU0RfVjMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTRF9UQ1AgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19ERUJVR19CVUdWRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MgaXMgbm90IHNldAorIyBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQorQ09ORklHX1pMSUJfREVGTEFURT15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3Mvc2g3NzEwdm9pcGd3X2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zaDc3MTB2b2lwZ3dfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOWEzMDM0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9jb25maWdzL3NoNzcxMHZvaXBnd19kZWZjb25maWcKQEAgLTAsMCArMSw5MTMgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNworIyBNb24gQXVnICA3IDE3OjA3OjA2IDIwMDYKKyMKK0NPTkZJR19TVVBFUkg9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKKyMgQ09ORklHX1NXQVAgaXMgbm90IHNldAorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19VSUQxNj15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19QUklOVEs9eQorQ09ORklHX0JVRz15CitDT05GSUdfRUxGX0NPUkU9eQorQ09ORklHX0JBU0VfRlVMTD15CisjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CisjIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfU0xBQj15CitDT05GSUdfVElOWV9TSE1FTT15CitDT05GSUdfQkFTRV9TTUFMTD0wCisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKK0NPTkZJR19PQlNPTEVURV9JTlRFUk1PRFVMRT15CisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKK0NPTkZJR19NT0RVTEVTPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKKyMgQ09ORklHX01PRFZFUlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LTU9EIGlzIG5vdCBzZXQKKworIworIyBCbG9jayBsYXllcgorIworIyBDT05GSUdfTEJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorIyBDT05GSUdfSU9TQ0hFRF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9BUyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9ERUFETElORT15CisjIENPTkZJR19ERUZBVUxUX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX05PT1AgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfSU9TQ0hFRD0iZGVhZGxpbmUiCisKKyMKKyMgU3lzdGVtIHR5cGUKKyMKKyMgQ09ORklHX1NIX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83NzUxX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83MzAwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83MzE4MF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfNzc1MV9TWVNURU1IIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0hQNlhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0VDMzEwNCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TQVRVUk4gaXMgbm90IHNldAorIyBDT05GSUdfU0hfRFJFQU1DQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0JJR1NVUiBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9NUEMxMjExIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NIMDMgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0VDVVJFRURHRTU0MTAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfSFM3NzUxUlZPSVAgaXMgbm90IHNldAorQ09ORklHX1NIXzc3MTBWT0lQR1c9eQorIyBDT05GSUdfU0hfUlRTNzc1MVIyRCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9SNzc4MFJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0VET1NLNzcwNSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TSDQyMDJfTUlDUk9ERVYgaXMgbm90IHNldAorIyBDT05GSUdfU0hfTEFORElTSyBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9USVRBTiBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TSE1JTiBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9VTktOT1dOIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3Igc2VsZWN0aW9uCisjCitDT05GSUdfQ1BVX1NIMz15CisKKyMKKyMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKKworIworIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwPXkKKworIworIyBTSC00IFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MDkxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUxUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMiBpcyBub3Qgc2V0CisKKyMKKyMgU1Q0MCBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MEdYMSBpcyBub3Qgc2V0CisKKyMKKyMgU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucworIworQ09ORklHX01NVT15CitDT05GSUdfUEFHRV9PRkZTRVQ9MHg4MDAwMDAwMAorQ09ORklHX01FTU9SWV9TVEFSVD0weDBjMDAwMDAwCitDT05GSUdfTUVNT1JZX1NJWkU9MHgwMDgwMDAwMAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorCisjCisjIENhY2hlIGNvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX1NIX0RJUkVDVF9NQVBQRUQgaXMgbm90IHNldAorIyBDT05GSUdfU0hfV1JJVEVUSFJPVUdIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX09DUkFNIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3IgZmVhdHVyZXMKKyMKK0NPTkZJR19DUFVfTElUVExFX0VORElBTj15CisjIENPTkZJR19TSF9GUFVfRU1VIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9EU1A9eQorIyBDT05GSUdfU0hfQURDIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfSEFTX0lOVEVWVD15CitDT05GSUdfQ1BVX0hBU19TUl9SQj15CisKKyMKKyMgVGltZXIgc3VwcG9ydAorIworQ09ORklHX1NIX1RNVT15CitDT05GSUdfU0hfUENMS19GUkVRPTMyNzY4MDAwCisKKyMKKyMgQ1BVIEZyZXF1ZW5jeSBzY2FsaW5nCisjCisjIENPTkZJR19DUFVfRlJFUSBpcyBub3Qgc2V0CisKKyMKKyMgRE1BIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NIX0RNQSBpcyBub3Qgc2V0CisKKyMKKyMgQ29tcGFuaW9uIENoaXBzCisjCisjIENPTkZJR19IRDY0NDZYX1NFUklFUyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGZlYXR1cmVzCisjCisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8xMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19IWj0yNTAKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVFTVBUX05PTkU9eQorIyBDT05GSUdfUFJFRU1QVF9WT0xVTlRBUlkgaXMgbm90IHNldAorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAorQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDgwMDAwMAorIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorCisjCisjIEJ1cyBvcHRpb25zCisjCisjIENPTkZJR19QQ0kgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgUENJIEhvdHBsdWcgU3VwcG9ydAorIworCisjCisjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCisjIENPTkZJR19ORVRERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfUE5QIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKK0NPTkZJR19TWU5fQ09PS0lFUz15CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9ESUFHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQorCisjCisjIElQOiBWaXJ0dWFsIFNlcnZlciBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19JUF9WUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfTkVURklMVEVSPXkKKyMgQ09ORklHX05FVEZJTFRFUl9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgQ29yZSBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworIyBDT05GSUdfTkVURklMVEVSX05FVExJTksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSX1hUQUJMRVMgaXMgbm90IHNldAorCisjCisjIElQOiBOZXRmaWx0ZXIgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0lQX05GX0NPTk5UUkFDSz15CisjIENPTkZJR19JUF9ORl9DVF9BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0NPTk5UUkFDS19NQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX0NPTk5UUkFDS19FVkVOVFMgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfQ1RfUFJPVE9fU0NUUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfRlRQPW0KKyMgQ09ORklHX0lQX05GX0lSQyBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9ORl9ORVRCSU9TX05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX1RGVFAgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfQU1BTkRBIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9QUFRQPW0KKyMgQ09ORklHX0lQX05GX0gzMjMgaXMgbm90IHNldAorIyBDT05GSUdfSVBfTkZfUVVFVUUgaXMgbm90IHNldAorCisjCisjIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKworIworIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKK0NPTkZJR19ORVRfU0NIRUQ9eQorQ09ORklHX05FVF9TQ0hfQ0xLX0pJRkZJRVM9eQorIyBDT05GSUdfTkVUX1NDSF9DTEtfR0VUVElNRU9GREFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hfQ0xLX0NQVSBpcyBub3Qgc2V0CisKKyMKKyMgUXVldWVpbmcvU2NoZWR1bGluZworIworQ09ORklHX05FVF9TQ0hfQ0JRPXkKKyMgQ09ORklHX05FVF9TQ0hfSFRCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hfSEZTQyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIX1BSSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSF9SRUQgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSF9TRlEgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSF9URVFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hfVEJGIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9TQ0hfR1JFRCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIX0RTTUFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfU0NIX05FVEVNIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfU0NIX0lOR1JFU1M9eQorCisjCisjIENsYXNzaWZpY2F0aW9uCisjCitDT05GSUdfTkVUX0NMUz15CitDT05GSUdfTkVUX0NMU19CQVNJQz15CitDT05GSUdfTkVUX0NMU19UQ0lOREVYPXkKK0NPTkZJR19ORVRfQ0xTX1JPVVRFND15CitDT05GSUdfTkVUX0NMU19ST1VURT15CisjIENPTkZJR19ORVRfQ0xTX0ZXIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfQ0xTX1UzMj15CisjIENPTkZJR19DTFNfVTMyX1BFUkYgaXMgbm90IHNldAorIyBDT05GSUdfQ0xTX1UzMl9NQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9DTFNfUlNWUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfQ0xTX1JTVlA2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9FTUFUQ0ggaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0NMU19BQ1QgaXMgbm90IHNldAorQ09ORklHX05FVF9DTFNfUE9MSUNFPXkKKyMgQ09ORklHX05FVF9DTFNfSU5EIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfRVNUSU1BVE9SPXkKKworIworIyBOZXR3b3JrIHRlc3RpbmcKKyMKKyMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAorIyBDT05GSUdfSEFNUkFESU8gaXMgbm90IHNldAorIyBDT05GSUdfSVJEQSBpcyBub3Qgc2V0CisjIENPTkZJR19CVCBpcyBub3Qgc2V0CisjIENPTkZJR19JRUVFODAyMTEgaXMgbm90IHNldAorCisjCisjIERldmljZSBEcml2ZXJzCisjCisKKyMKKyMgR2VuZXJpYyBEcml2ZXIgT3B0aW9ucworIworQ09ORklHX1NUQU5EQUxPTkU9eQorQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQorQ09ORklHX0ZXX0xPQURFUj15CisKKyMKKyMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgorIworIyBDT05GSUdfQ09OTkVDVE9SIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCitDT05GSUdfTVREPXkKKyMgQ09ORklHX01URF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ09OQ0FUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEFSVElUSU9OUz15CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisKKyMKKyMgVXNlciBNb2R1bGVzIEFuZCBUcmFuc2xhdGlvbiBMYXllcnMKKyMKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKKyMgQ09ORklHX0ZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGRF9GVEwgaXMgbm90IHNldAorCisjCisjIFJBTS9ST00vRmxhc2ggY2hpcCBkcml2ZXJzCisjCitDT05GSUdfTVREX0NGST15CisjIENPTkZJR19NVERfSkVERUNQUk9CRSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0dFTl9QUk9CRT15CisjIENPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzI9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF80PXkKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF84IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8xNiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMzIgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTE9eQorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSU5URUxFWFQgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfQU1EU1REPXkKKyMgQ09ORklHX01URF9DRklfU1RBQSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9VVElMPXkKK0NPTkZJR19NVERfUkFNPXkKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9TT0xVVElPTkVOR0lORSBpcyBub3Qgc2V0CitDT05GSUdfTVREX1NINzcxMFZPSVBHVz15CisjIENPTkZJR19NVERfUExBVFJBTSBpcyBub3Qgc2V0CisKKyMKKyMgU2VsZi1jb250YWluZWQgTVREIGRldmljZSBkcml2ZXJzCisjCisjIENPTkZJR19NVERfU0xSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BIUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9NVERSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0JMT0NLMk1URCBpcyBub3Qgc2V0CisKKyMKKyMgRGlzay1Pbi1DaGlwIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfRE9DMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfRE9DMjAwMVBMVVMgaXMgbm90IHNldAorCisjCisjIE5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9OQU5EIGlzIG5vdCBzZXQKKworIworIyBPbmVOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfT05FTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSU5JVFJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCisjIENPTkZJR19JREUgaXMgbm90IHNldAorCisjCisjIFNDU0kgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorCisjCisjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKKyMKKworIworIyBJMk8gZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUEhZTElCIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorIyBDT05GSUdfTUlJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQzkxWCBpcyBub3Qgc2V0CisjIENPTkZJR19ORTIwMDAgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCisjIENPTkZJR19ORVRfUkFESU8gaXMgbm90IHNldAorCisjCisjIFdhbiBpbnRlcmZhY2VzCisjCisjIENPTkZJR19XQU4gaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKK0NPTkZJR19QSE9ORT15CisjIENPTkZJR19QSE9ORV9JWEogaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfSU5QVVQ9eQorCisjCisjIFVzZXJsYW5kIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX0lOUFVUX01PVVNFREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJQUxfTk9OU1RBTkRBUkQgaXMgbm90IHNldAorCisjCisjIFNlcmlhbCBkcml2ZXJzCisjCisjIENPTkZJR19TRVJJQUxfODI1MCBpcyBub3Qgc2V0CisKKyMKKyMgTm9uLTgyNTAgc2VyaWFsIHBvcnQgc3VwcG9ydAorIworQ09ORklHX1NFUklBTF9TSF9TQ0k9eQorQ09ORklHX1NFUklBTF9TSF9TQ0lfTlJfVUFSVFM9MgorQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRT15CitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfVU5JWDk4X1BUWVMgaXMgbm90IHNldAorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIFNQSSBzdXBwb3J0CisjCisjIENPTkZJR19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVklERU9fVjRMMj15CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBMRUQgZGV2aWNlcworIworIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorCisjCisjIExFRCBkcml2ZXJzCisjCisKKyMKKyMgTEVEIFRyaWdnZXJzCisjCisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisKKyMKKyMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCisjCisKKyMKKyMgUmVhbCBUaW1lIENsb2NrCisjCisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKKyMgQ09ORklHX1BST0NfS0NPUkUgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTPXkKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19IVUdFVExCRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9GUz15CitDT05GSUdfSkZGUzJfRlNfREVCVUc9MAorQ09ORklHX0pGRlMyX0ZTX1dSSVRFQlVGRkVSPXkKKyMgQ09ORklHX0pGRlMyX1NVTU1BUlkgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfSkZGUzJfWkxJQj15CitDT05GSUdfSkZGUzJfUlRJTUU9eQorIyBDT05GSUdfSkZGUzJfUlVCSU4gaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCisjIENPTkZJR19ORlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ1BfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ09EQV9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfOVBfRlMgaXMgbm90IHNldAorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworIyBDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCisjIENPTkZJR19OTFMgaXMgbm90IHNldAorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAorQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CisjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NobWluX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy9zaG1pbl9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyYjNiZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvY29uZmlncy9zaG1pbl9kZWZjb25maWcKQEAgLTAsMCArMSw4MjcgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNworIyBXZWQgQXVnICAyIDAxOjQ1OjAzIDIwMDYKKyMKK0NPTkZJR19TVVBFUkg9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX1BUUkFDRT15CisKKyMKKyMgQ29kZSBtYXR1cml0eSBsZXZlbCBvcHRpb25zCisjCitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19CUk9LRU5fT05fU01QPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCitDT05GSUdfTE9DQUxWRVJTSU9OX0FVVE89eQorIyBDT05GSUdfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWSVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU0NUTCBpcyBub3Qgc2V0CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CisjIENPTkZJR19JS0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfVUlEMTYgaXMgbm90IHNldAorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19FTUJFRERFRD15CisjIENPTkZJR19LQUxMU1lNUyBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHIGlzIG5vdCBzZXQKK0NPTkZJR19QUklOVEs9eQorIyBDT05GSUdfQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JBU0VfRlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GVVRFWCBpcyBub3Qgc2V0CisjIENPTkZJR19FUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19TSE1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19USU5ZX1NITUVNPXkKK0NPTkZJR19CQVNFX1NNQUxMPTEKK0NPTkZJR19TTE9CPXkKK0NPTkZJR19PQlNPTEVURV9JTlRFUk1PRFVMRT15CisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKKyMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGxheWVyCisjCisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfTFNGIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKKyMgQ09ORklHX0lPU0NIRURfQVMgaXMgbm90IHNldAorIyBDT05GSUdfSU9TQ0hFRF9ERUFETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19JT1NDSEVEX0NGUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTk9PUD15CitDT05GSUdfREVGQVVMVF9JT1NDSEVEPSJub29wIgorCisjCisjIFN5c3RlbSB0eXBlCisjCisjIENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfNzcwOV9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzc3NTFfU1lTVEVNSCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TVEIxX0hBUlAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU1RCMV9PVkVSRFJJVkUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfSFA2WFggaXMgbm90IHNldAorIyBDT05GSUdfU0hfQ1FSRUVLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0RNSURBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0VDMzEwNCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TQVRVUk4gaXMgbm90IHNldAorIyBDT05GSUdfU0hfRFJFQU1DQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0NBVDY4NzAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0JJR1NVUiBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TSDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfQURYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX01QQzEyMTEgaXMgbm90IHNldAorIyBDT05GSUdfU0hfU0gwMyBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9IUzc3NTFSVk9JUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9SVFM3NzUxUjJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1I3NzgwUlAgaXMgbm90IHNldAorIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1RJVEFOIGlzIG5vdCBzZXQKK0NPTkZJR19TSF9TSE1JTj15CisjIENPTkZJR19TSF9VTktOT1dOIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3Igc2VsZWN0aW9uCisjCitDT05GSUdfQ1BVX1NIMz15CisKKyMKKyMgU0gtMiBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjA0IGlzIG5vdCBzZXQKKworIworIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1IGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDY9eQorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAorCisjCisjIFNILTQgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyIGlzIG5vdCBzZXQKKworIworIyBTVDQwIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TVDQwR1gxIGlzIG5vdCBzZXQKKworIworIyBTSC00QSBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzAgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwIGlzIG5vdCBzZXQKKworIworIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCisjCitDT05GSUdfTU1VPXkKK0NPTkZJR19QQUdFX09GRlNFVD0weDgwMDAwMDAwCitDT05GSUdfTUVNT1JZX1NUQVJUPTB4MGMwMDAwMDAKK0NPTkZJR19NRU1PUllfU0laRT0weDAwODAwMDAwCitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CisKKyMKKyMgQ2FjaGUgY29uZmlndXJhdGlvbgorIworIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9XUklURVRIUk9VR0ggaXMgbm90IHNldAorIyBDT05GSUdfU0hfT0NSQU0gaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBmZWF0dXJlcworIworQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX1NIX0ZQVV9FTVUgaXMgbm90IHNldAorIyBDT05GSUdfU0hfRFNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0FEQyBpcyBub3Qgc2V0CitDT05GSUdfQ1BVX0hBU19JTlRFVlQ9eQorQ09ORklHX0NQVV9IQVNfU1JfUkI9eQorCisjCisjIFRpbWVyIHN1cHBvcnQKKyMKK0NPTkZJR19TSF9UTVU9eQorQ09ORklHX1NIX1BDTEtfRlJFUT0zMjAwMDAwMAorCisjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorCisjCisjIERNQSBzdXBwb3J0CisjCisjIENPTkZJR19TSF9ETUEgaXMgbm90IHNldAorCisjCisjIENvbXBhbmlvbiBDaGlwcworIworIyBDT05GSUdfSEQ2NDQ2WF9TRVJJRVMgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBmZWF0dXJlcworIworIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfUFJFRU1QVCBpcyBub3Qgc2V0CisjIENPTkZJR19TTVAgaXMgbm90IHNldAorCisjCisjIEJvb3Qgb3B0aW9ucworIworQ09ORklHX1pFUk9fUEFHRV9PRkZTRVQ9MHgwMDAwMTAwMAorQ09ORklHX0JPT1RfTElOS19PRkZTRVQ9MHgwMDIxMDAwMAorIyBDT05GSUdfVUJDX1dBS0VVUCBpcyBub3Qgc2V0CitDT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FPSJjb25zb2xlPXR0eVNDMSwxMTUyMDAgcm9vdD0xZjAxIG10ZHBhcnRzPXBoeXNfbWFwcGVkX2ZsYXNoOjY0ayhmaXJtKXJvLC0oc3lzKSBuZXRkZXY9MzQsMHgzMDAsZXRoMCAiCisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKKyMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CisjCisKKyMKKyMgRXhlY3V0YWJsZSBmaWxlIGZvcm1hdHMKKyMKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9GTEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMgKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nCisjCitDT05GSUdfTkVUPXkKKworIworIyBOZXR3b3JraW5nIG9wdGlvbnMKKyMKKyMgQ09ORklHX05FVERFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBQ0tFVCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSVBfUE5QX0JPT1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTl9DT09LSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfQUggaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9ESUFHPXkKK0NPTkZJR19JTkVUX1RDUF9ESUFHPXkKKyMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKK0NPTkZJR19UQ1BfQ09OR19CSUM9eQorIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisKKyMKKyMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworQ09ORklHX01URD15CisjIENPTkZJR19NVERfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NPTkNBVCBpcyBub3Qgc2V0CitDT05GSUdfTVREX1BBUlRJVElPTlM9eQorIyBDT05GSUdfTVREX1JFREJPT1RfUEFSVFMgaXMgbm90IHNldAorQ09ORklHX01URF9DTURMSU5FX1BBUlRTPXkKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworIyBDT05GSUdfTVREX0NIQVIgaXMgbm90IHNldAorQ09ORklHX01URF9CTE9DSz15CisjIENPTkZJR19GVEwgaXMgbm90IHNldAorIyBDT05GSUdfTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkZUTCBpcyBub3Qgc2V0CisjIENPTkZJR19SRkRfRlRMIGlzIG5vdCBzZXQKKworIworIyBSQU0vUk9NL0ZsYXNoIGNoaXAgZHJpdmVycworIworIyBDT05GSUdfTVREX0NGSSBpcyBub3Qgc2V0CitDT05GSUdfTVREX0pFREVDUFJPQkU9eQorQ09ORklHX01URF9HRU5fUFJPQkU9eQorIyBDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0kxPXkKK0NPTkZJR19NVERfQ0ZJX0kyPXkKKyMgQ09ORklHX01URF9DRklfSTQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9JOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0lOVEVMRVhUIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX0FNRFNURD15CisjIENPTkZJR19NVERfQ0ZJX1NUQUEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfVVRJTD15CisjIENPTkZJR19NVERfUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ST00gaXMgbm90IHNldAorIyBDT05GSUdfTVREX0FCU0VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfT0JTT0xFVEVfQ0hJUFMgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfUEhZU01BUD15CitDT05GSUdfTVREX1BIWVNNQVBfU1RBUlQ9MHhhMDAwMDAwMAorQ09ORklHX01URF9QSFlTTUFQX0xFTj0weDgwMDAwCitDT05GSUdfTVREX1BIWVNNQVBfQkFOS1dJRFRIPTEKKyMgQ09ORklHX01URF9QTEFUUkFNIGlzIG5vdCBzZXQKKworIworIyBTZWxmLWNvbnRhaW5lZCBNVEQgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01URF9TTFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUEhSQU0gaXMgbm90IHNldAorIyBDT05GSUdfTVREX01URFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQkxPQ0syTVREIGlzIG5vdCBzZXQKKworIworIyBEaXNrLU9uLUNoaXAgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9ET0MyMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9ET0MyMDAxUExVUyBpcyBub3Qgc2V0CisKKyMKKyMgTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX05BTkQgaXMgbm90IHNldAorCisjCisjIE9uZU5BTkQgRmxhc2ggRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX01URF9PTkVOQU5EIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKKyMgQ09ORklHX01JSSBpcyBub3Qgc2V0CisjIENPTkZJR19TVE5JQyBpcyBub3Qgc2V0CisjIENPTkZJR19TTUM5MVggaXMgbm90IHNldAorQ09ORklHX05FMjAwMD15CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBUZWxlcGhvbnkgU3VwcG9ydAorIworIyBDT05GSUdfUEhPTkUgaXMgbm90IHNldAorCisjCisjIElucHV0IGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgSS9PIHBvcnRzCisjCisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19HQU1FUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgQ2hhcmFjdGVyIGRldmljZXMKKyMKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKKyMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX1NIX1NDST15CitDT05GSUdfU0VSSUFMX1NIX1NDSV9OUl9VQVJUUz0yCitDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfQ09SRT15CitDT05GSUdfU0VSSUFMX0NPUkVfQ09OU09MRT15CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19HRU5fUlRDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RUTEsgaXMgbm90IHNldAorIyBDT05GSUdfUjM5NjQgaXMgbm90IHNldAorCisjCisjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgorIworIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIFNQSSBzdXBwb3J0CisjCisjIENPTkZJR19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVklERU9fVjRMMj15CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworIyBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfT0hDSSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVJDSF9IQVNfRUhDSSBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBMRUQgZGV2aWNlcworIworIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorCisjCisjIExFRCBkcml2ZXJzCisjCisKKyMKKyMgTEVEIFRyaWdnZXJzCisjCisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisKKyMKKyMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCisjCisKKyMKKyMgUmVhbCBUaW1lIENsb2NrCisjCisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworIyBDT05GSUdfRVhUMl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKKyMgQ09ORklHX1BST0NfS0NPUkUgaXMgbm90IHNldAorIyBDT05GSUdfU1lTRlMgaXMgbm90IHNldAorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZGUzJfRlMgaXMgbm90IHNldAorQ09ORklHX0NSQU1GUz15CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEIGlzIG5vdCBzZXQKK0NPTkZJR19ST09UX05GUz15CitDT05GSUdfTE9DS0Q9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworIyBDT05GSUdfTkxTIGlzIG5vdCBzZXQKKworIworIyBQcm9maWxpbmcgc3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS0VSTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CisjIENPTkZJR19VTldJTkRfSU5GTyBpcyBub3Qgc2V0CitDT05GSUdfU0hfU1RBTkRBUkRfQklPUz15CitDT05GSUdfRUFSTFlfUFJJTlRLPXkKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIworCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19aTElCX0lORkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3RpdGFuX2RlZmNvbmZpZyBiL2FyY2gvc2gvY29uZmlncy90aXRhbl9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiMjkwNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvY29uZmlncy90aXRhbl9kZWZjb25maWcKQEAgLTAsMCArMSwxMzY3IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTQtc2gKKyMgV2VkIE5vdiAgOSAwMDozNTo1NiAyMDA1CisjCitDT05GSUdfU1VQRVJIPXkKK0NPTkZJR19VSUQxNj15CitDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CitDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0lPTUFQPXkKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0NMRUFOX0NPTVBJTEU9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKK0NPTkZJR19IT1RQTFVHPXkKK0NPTkZJR19LT0JKRUNUX1VFVkVOVD15CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0JBU0VfRlVMTD15CitDT05GSUdfRlVURVg9eQorQ09ORklHX0VQT0xMPXkKK0NPTkZJR19TSE1FTT15CitDT05GSUdfQ0NfQUxJR05fRlVOQ1RJT05TPTAKK0NPTkZJR19DQ19BTElHTl9MQUJFTFM9MAorQ09ORklHX0NDX0FMSUdOX0xPT1BTPTAKK0NPTkZJR19DQ19BTElHTl9KVU1QUz0wCisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQorQ09ORklHX09CU09MRVRFX01PRFBBUk09eQorIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19LTU9EPXkKKworIworIyBTeXN0ZW0gdHlwZQorIworIyBDT05GSUdfU0hfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzc3NTFfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzczMDBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIXzczMTgwX1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83NzUxX1NZU1RFTUggaXMgbm90IHNldAorQ09ORklHX1NIX1RJVEFOPXkKKyMgQ09ORklHX1NIX1NUQjFfSEFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TVEIxX09WRVJEUklWRSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9IUDZYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9DUVJFRUsgaXMgbm90IHNldAorIyBDT05GSUdfU0hfRE1JREEgaXMgbm90IHNldAorIyBDT05GSUdfU0hfRUMzMTA0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NBVFVSTiBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9EUkVBTUNBU1QgaXMgbm90IHNldAorIyBDT05GSUdfU0hfQ0FUNjg3MDEgaXMgbm90IHNldAorIyBDT05GSUdfU0hfQklHU1VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NIMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9BRFggaXMgbm90IHNldAorIyBDT05GSUdfU0hfTVBDMTIxMSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TSDAzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NFQ1VSRUVER0U1NDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX0hTNzc1MVJWT0lQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1JUUzc3NTFSMkQgaXMgbm90IHNldAorIyBDT05GSUdfU0hfRURPU0s3NzA1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1NINDIwMl9NSUNST0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9MQU5ESVNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX1VOS05PV04gaXMgbm90IHNldAorCisjCisjIFByb2Nlc3NvciBzZWxlY3Rpb24KKyMKK0NPTkZJR19DUFVfU0g0PXkKKworIworIyBTSC0yIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQgaXMgbm90IHNldAorCisjCisjIFNILTMgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3IGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkgaXMgbm90IHNldAorCisjCisjIFNILTQgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUiBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBTIGlzIG5vdCBzZXQKK0NPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTE9eQorQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVI9eQorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIgaXMgbm90IHNldAorCisjCisjIFNUNDAgUHJvY2Vzc29yIFN1cHBvcnQKKyMKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBHWDEgaXMgbm90IHNldAorCisjCisjIFNILTRBIFByb2Nlc3NvciBTdXBwb3J0CisjCisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKK0NPTkZJR19NTVU9eQorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CisKKyMKKyMgQ2FjaGUgY29uZmlndXJhdGlvbgorIworIyBDT05GSUdfU0hfRElSRUNUX01BUFBFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9XUklURVRIUk9VR0ggaXMgbm90IHNldAorIyBDT05GSUdfU0hfT0NSQU0gaXMgbm90IHNldAorQ09ORklHX01FTU9SWV9TVEFSVD0weDA4MDMwMDAwCitDT05GSUdfTUVNT1JZX1NJWkU9MHg3ZmQwMDAwCisKKyMKKyMgUHJvY2Vzc29yIGZlYXR1cmVzCisjCitDT05GSUdfQ1BVX0xJVFRMRV9FTkRJQU49eQorQ09ORklHX1NIX1JUQz15CitDT05GSUdfU0hfRlBVPXkKKyMgQ09ORklHX1NIX1NUT1JFX1FVRVVFUyBpcyBub3Qgc2V0CisKKyMKKyMgVGltZXIgc3VwcG9ydAorIworQ09ORklHX1NIX1RNVT15CitDT05GSUdfU0hfUENMS19GUkVRX0JPT0w9eQorQ09ORklHX1NIX1BDTEtfRlJFUT0zMDAwMDAwMAorCisjCisjIENQVSBGcmVxdWVuY3kgc2NhbGluZworIworIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAorCisjCisjIERNQSBzdXBwb3J0CisjCitDT05GSUdfU0hfRE1BPXkKK0NPTkZJR19OUl9PTkNISVBfRE1BX0NIQU5ORUxTPTgKKyMgQ09ORklHX05SX0RNQV9DSEFOTkVMU19CT09MIGlzIG5vdCBzZXQKKworIworIyBDb21wYW5pb24gQ2hpcHMKKyMKKyMgQ09ORklHX0hENjQ0NlhfU0VSSUVTIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgZmVhdHVyZXMKKyMKKyMgQ09ORklHX0tFWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfU01QIGlzIG5vdCBzZXQKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKK0NPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA5ZTAwMDAKKyMgQ09ORklHX1VCQ19XQUtFVVAgaXMgbm90IHNldAorQ09ORklHX0NNRExJTkVfQk9PTD15CitDT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQzEsMzg0MDBOODEgcm9vdD0vZGV2L25mcyBpcD06Ojo6OmV0aDE6YXV0b2NvbmYiCisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19QQ0k9eQorQ09ORklHX1NIX1BDSURNQV9OT05DT0hFUkVOVD15CitDT05GSUdfUENJX0FVVE89eQorQ09ORklHX1BDSV9BVVRPX1VQREFURV9SRVNPVVJDRVM9eQorQ09ORklHX1BDSV9MRUdBQ1lfUFJPQz15CisjQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBQQ0kgSG90cGx1ZyBTdXBwb3J0CisjCitDT05GSUdfSE9UUExVR19QQ0k9eQorIyBDT05GSUdfSE9UUExVR19QQ0lfRkFLRSBpcyBub3Qgc2V0CisjIENPTkZJR19IT1RQTFVHX1BDSV9DUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPVFBMVUdfUENJX1NIUEMgaXMgbm90IHNldAorCisjCisjIEV4ZWN1dGFibGUgZmlsZSBmb3JtYXRzCisjCitDT05GSUdfQklORk1UX0VMRj15CisjIENPTkZJR19CSU5GTVRfRkxBVCBpcyBub3Qgc2V0CisjIENPTkZJR19CSU5GTVRfTUlTQyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19QQUNLRVRfTU1BUD15CitDT05GSUdfVU5JWD15CitDT05GSUdfWEZSTT15CisjIENPTkZJR19YRlJNX1VTRVIgaXMgbm90IHNldAorQ09ORklHX05FVF9LRVk9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19BU0tfSVBfRklCX0hBU0g9eQorIyBDT05GSUdfSVBfRklCX1RSSUUgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVM9eQorIyBDT05GSUdfSVBfUk9VVEVfRldNQVJLIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ST1VURV9NVUxUSVBBVEg9eQorQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9DQUNIRUQ9eQorQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9SUj1tCitDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX1JBTkRPTT1tCitDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRIX1dSQU5ET009bQorQ09ORklHX0lQX1JPVVRFX01VTFRJUEFUSF9EUlI9bQorIyBDT05GSUdfSVBfUk9VVEVfVkVSQk9TRSBpcyBub3Qgc2V0CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKK0NPTkZJR19JUF9QTlBfUkFSUD15CitDT05GSUdfTkVUX0lQSVA9bQorQ09ORklHX05FVF9JUEdSRT1tCitDT05GSUdfTkVUX0lQR1JFX0JST0FEQ0FTVD15CitDT05GSUdfSVBfTVJPVVRFPXkKK0NPTkZJR19JUF9QSU1TTV9WMT15CitDT05GSUdfSVBfUElNU01fVjI9eQorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorQ09ORklHX0lORVRfQUg9bQorQ09ORklHX0lORVRfRVNQPW0KK0NPTkZJR19JTkVUX0lQQ09NUD1tCitDT05GSUdfSU5FVF9UVU5ORUw9bQorQ09ORklHX0lORVRfRElBRz1tCitDT05GSUdfSU5FVF9UQ1BfRElBRz1tCisjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfVENQX0NPTkdfQklDPXkKKworIworIyBJUDogVmlydHVhbCBTZXJ2ZXIgQ29uZmlndXJhdGlvbgorIworIyBDT05GSUdfSVBfVlMgaXMgbm90IHNldAorQ09ORklHX0lQVjY9bQorQ09ORklHX0lQVjZfUFJJVkFDWT15CitDT05GSUdfSU5FVDZfQUg9bQorQ09ORklHX0lORVQ2X0VTUD1tCitDT05GSUdfSU5FVDZfSVBDT01QPW0KK0NPTkZJR19JTkVUNl9UVU5ORUw9bQorQ09ORklHX0lQVjZfVFVOTkVMPW0KK0NPTkZJR19ORVRGSUxURVI9eQorIyBDT05GSUdfTkVURklMVEVSX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19CUklER0VfTkVURklMVEVSPXkKK0NPTkZJR19ORVRGSUxURVJfTkVUTElOSz1tCitDT05GSUdfTkVURklMVEVSX05FVExJTktfUVVFVUU9bQorQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX0xPRz1tCisKKyMKKyMgSVA6IE5ldGZpbHRlciBDb25maWd1cmF0aW9uCisjCitDT05GSUdfSVBfTkZfQ09OTlRSQUNLPW0KK0NPTkZJR19JUF9ORl9DVF9BQ0NUPXkKK0NPTkZJR19JUF9ORl9DT05OVFJBQ0tfTUFSSz15CitDT05GSUdfSVBfTkZfQ09OTlRSQUNLX0VWRU5UUz15CitDT05GSUdfSVBfTkZfQ09OTlRSQUNLX05FVExJTks9bQorIyBDT05GSUdfSVBfTkZfQ1RfUFJPVE9fU0NUUCBpcyBub3Qgc2V0CitDT05GSUdfSVBfTkZfRlRQPW0KK0NPTkZJR19JUF9ORl9JUkM9bQorQ09ORklHX0lQX05GX05FVEJJT1NfTlM9bQorQ09ORklHX0lQX05GX1RGVFA9bQorIyBDT05GSUdfSVBfTkZfQU1BTkRBIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9ORl9QUFRQPW0KK0NPTkZJR19JUF9ORl9RVUVVRT1tCitDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQorQ09ORklHX0lQX05GX01BVENIX0xJTUlUPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9JUFJBTkdFPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9NQUM9bQorQ09ORklHX0lQX05GX01BVENIX1BLVFRZUEU9bQorQ09ORklHX0lQX05GX01BVENIX01BUks9bQorQ09ORklHX0lQX05GX01BVENIX01VTFRJUE9SVD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfVE9TPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9SRUNFTlQ9bQorQ09ORklHX0lQX05GX01BVENIX0VDTj1tCitDT05GSUdfSVBfTkZfTUFUQ0hfRFNDUD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfQUhfRVNQPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9MRU5HVEg9bQorQ09ORklHX0lQX05GX01BVENIX1RUTD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfVENQTVNTPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9IRUxQRVI9bQorQ09ORklHX0lQX05GX01BVENIX1NUQVRFPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9DT05OVFJBQ0s9bQorQ09ORklHX0lQX05GX01BVENIX09XTkVSPW0KKyMgQ09ORklHX0lQX05GX01BVENIX1BIWVNERVYgaXMgbm90IHNldAorQ09ORklHX0lQX05GX01BVENIX0FERFJUWVBFPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9SRUFMTT1tCisjIENPTkZJR19JUF9ORl9NQVRDSF9TQ1RQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX05GX01BVENIX0RDQ1AgaXMgbm90IHNldAorQ09ORklHX0lQX05GX01BVENIX0NPTU1FTlQ9bQorQ09ORklHX0lQX05GX01BVENIX0NPTk5NQVJLPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9DT05OQllURVM9bQorQ09ORklHX0lQX05GX01BVENIX0hBU0hMSU1JVD1tCitDT05GSUdfSVBfTkZfTUFUQ0hfU1RSSU5HPW0KK0NPTkZJR19JUF9ORl9GSUxURVI9bQorQ09ORklHX0lQX05GX1RBUkdFVF9SRUpFQ1Q9bQorQ09ORklHX0lQX05GX1RBUkdFVF9MT0c9bQorQ09ORklHX0lQX05GX1RBUkdFVF9VTE9HPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfVENQTVNTPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTkZRVUVVRT1tCitDT05GSUdfSVBfTkZfTkFUPW0KK0NPTkZJR19JUF9ORl9OQVRfTkVFREVEPXkKK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1JFRElSRUNUPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTkVUTUFQPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfU0FNRT1tCitDT05GSUdfSVBfTkZfTkFUX1NOTVBfQkFTSUM9bQorQ09ORklHX0lQX05GX05BVF9JUkM9bQorQ09ORklHX0lQX05GX05BVF9GVFA9bQorQ09ORklHX0lQX05GX05BVF9URlRQPW0KK0NPTkZJR19JUF9ORl9OQVRfUFBUUD1tCitDT05GSUdfSVBfTkZfTUFOR0xFPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfVE9TPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfRUNOPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfRFNDUD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX01BUks9bQorQ09ORklHX0lQX05GX1RBUkdFVF9DTEFTU0lGWT1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1RUTD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX0NPTk5NQVJLPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfQ0xVU1RFUklQPW0KK0NPTkZJR19JUF9ORl9SQVc9bQorQ09ORklHX0lQX05GX1RBUkdFVF9OT1RSQUNLPW0KK0NPTkZJR19JUF9ORl9BUlBUQUJMRVM9bQorQ09ORklHX0lQX05GX0FSUEZJTFRFUj1tCitDT05GSUdfSVBfTkZfQVJQX01BTkdMRT1tCisKKyMKKyMgSVB2NjogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKK0NPTkZJR19JUDZfTkZfUVVFVUU9bQorQ09ORklHX0lQNl9ORl9JUFRBQkxFUz1tCitDT05GSUdfSVA2X05GX01BVENIX0xJTUlUPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfTUFDPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfUlQ9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9PUFRTPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfRlJBRz1tCitDT05GSUdfSVA2X05GX01BVENIX0hMPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfTVVMVElQT1JUPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfT1dORVI9bQorQ09ORklHX0lQNl9ORl9NQVRDSF9NQVJLPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfSVBWNkhFQURFUj1tCitDT05GSUdfSVA2X05GX01BVENIX0FIRVNQPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfTEVOR1RIPW0KK0NPTkZJR19JUDZfTkZfTUFUQ0hfRVVJNjQ9bQorIyBDT05GSUdfSVA2X05GX01BVENIX1BIWVNERVYgaXMgbm90IHNldAorQ09ORklHX0lQNl9ORl9GSUxURVI9bQorQ09ORklHX0lQNl9ORl9UQVJHRVRfTE9HPW0KK0NPTkZJR19JUDZfTkZfVEFSR0VUX1JFSkVDVD1tCitDT05GSUdfSVA2X05GX1RBUkdFVF9ORlFVRVVFPW0KK0NPTkZJR19JUDZfTkZfTUFOR0xFPW0KK0NPTkZJR19JUDZfTkZfVEFSR0VUX01BUks9bQorQ09ORklHX0lQNl9ORl9UQVJHRVRfSEw9bQorQ09ORklHX0lQNl9ORl9SQVc9bQorCisjCisjIEJyaWRnZTogTmV0ZmlsdGVyIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0JSSURHRV9ORl9FQlRBQkxFUyBpcyBub3Qgc2V0CisKKyMKKyMgRENDUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9EQ0NQIGlzIG5vdCBzZXQKKworIworIyBTQ1RQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX1NDVFAgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKK0NPTkZJR19CUklER0U9bQorQ09ORklHX1ZMQU5fODAyMVE9bQorIyBDT05GSUdfREVDTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xMQzIgaXMgbm90IHNldAorIyBDT05GSUdfSVBYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQUxLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1gyNSBpcyBub3Qgc2V0CisjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9ESVZFUlQgaXMgbm90IHNldAorIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX05FVF9TQ0hFRD15CitDT05GSUdfTkVUX1NDSF9DTEtfSklGRklFUz15CisjIENPTkZJR19ORVRfU0NIX0NMS19HRVRUSU1FT0ZEQVkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1NDSF9DTEtfQ1BVIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRfU0NIX0NCUT1tCitDT05GSUdfTkVUX1NDSF9IVEI9bQorQ09ORklHX05FVF9TQ0hfSEZTQz1tCitDT05GSUdfTkVUX1NDSF9QUklPPW0KK0NPTkZJR19ORVRfU0NIX1JFRD1tCitDT05GSUdfTkVUX1NDSF9TRlE9bQorQ09ORklHX05FVF9TQ0hfVEVRTD1tCitDT05GSUdfTkVUX1NDSF9UQkY9bQorQ09ORklHX05FVF9TQ0hfR1JFRD1tCitDT05GSUdfTkVUX1NDSF9EU01BUks9bQorQ09ORklHX05FVF9TQ0hfTkVURU09bQorQ09ORklHX05FVF9TQ0hfSU5HUkVTUz1tCitDT05GSUdfTkVUX1FPUz15CitDT05GSUdfTkVUX0VTVElNQVRPUj15CitDT05GSUdfTkVUX0NMUz15CitDT05GSUdfTkVUX0NMU19CQVNJQz1tCitDT05GSUdfTkVUX0NMU19UQ0lOREVYPW0KK0NPTkZJR19ORVRfQ0xTX1JPVVRFND1tCitDT05GSUdfTkVUX0NMU19ST1VURT15CitDT05GSUdfTkVUX0NMU19GVz1tCitDT05GSUdfTkVUX0NMU19VMzI9bQorQ09ORklHX0NMU19VMzJfUEVSRj15CitDT05GSUdfTkVUX0NMU19JTkQ9eQorQ09ORklHX0NMU19VMzJfTUFSSz15CitDT05GSUdfTkVUX0NMU19SU1ZQPW0KK0NPTkZJR19ORVRfQ0xTX1JTVlA2PW0KK0NPTkZJR19ORVRfRU1BVENIPXkKK0NPTkZJR19ORVRfRU1BVENIX1NUQUNLPTMyCitDT05GSUdfTkVUX0VNQVRDSF9DTVA9bQorQ09ORklHX05FVF9FTUFUQ0hfTkJZVEU9bQorQ09ORklHX05FVF9FTUFUQ0hfVTMyPW0KK0NPTkZJR19ORVRfRU1BVENIX01FVEE9bQorQ09ORklHX05FVF9FTUFUQ0hfVEVYVD1tCitDT05GSUdfTkVUX0NMU19BQ1Q9eQorQ09ORklHX05FVF9BQ1RfUE9MSUNFPW0KK0NPTkZJR19ORVRfQUNUX0dBQ1Q9bQorQ09ORklHX0dBQ1RfUFJPQj15CitDT05GSUdfTkVUX0FDVF9NSVJSRUQ9bQorQ09ORklHX05FVF9BQ1RfSVBUPW0KK0NPTkZJR19ORVRfQUNUX1BFRElUPW0KKyMgQ09ORklHX05FVF9BQ1RfU0lNUCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9bQorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCitDT05GSUdfQ09OTkVDVE9SPW0KKworIworIyBNZW1vcnkgVGVjaG5vbG9neSBEZXZpY2VzIChNVEQpCisjCisjIENPTkZJR19NVEQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorQ09ORklHX0JMS19TU0ZEQz15CisjIENPTkZJR19CTEtfREVWX1VNRU0gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0xPT1A9bQorIyBDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTkJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1g4IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVUIgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NDA5NgorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKworIworIyBJTyBTY2hlZHVsZXJzCisjCitDT05GSUdfSU9TQ0hFRF9OT09QPXkKK0NPTkZJR19JT1NDSEVEX0FTPXkKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKK0NPTkZJR19JT1NDSEVEX0NGUT15CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CitDT05GSUdfU0NTST1tCitDT05GSUdfU0NTSV9QUk9DX0ZTPXkKKworIworIyBTQ1NJIHN1cHBvcnQgdHlwZSAoZGlzaywgdGFwZSwgQ0QtUk9NKQorIworQ09ORklHX0JMS19ERVZfU0Q9bQorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfU1I9bQorIyBDT05GSUdfQkxLX0RFVl9TUl9WRU5ET1IgaXMgbm90IHNldAorQ09ORklHX0NIUl9ERVZfU0c9bQorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIFRyYW5zcG9ydCBBdHRyaWJ1dGVzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorCisjCisjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKKyMKKyMgQ09ORklHX0JMS19ERVZfM1dfWFhYWF9SQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfM1dfOVhYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUFDUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BSUM3WFhYX09MRCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzc5WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOSVRJTyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lOSUExMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ19GQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1FMQTJYWFg9bQorIyBDT05GSUdfU0NTSV9RTEEyMVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBMjJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTIzMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9RTEEyMzIyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBNjMxMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMQTI0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MUEZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTV4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREMzOTBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTlNQMzIgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9ERUJVRyBpcyBub3Qgc2V0CisKKyMKKyMgTXVsdGktZGV2aWNlIHN1cHBvcnQgKFJBSUQgYW5kIExWTSkKKyMKKyMgQ09ORklHX01EIGlzIG5vdCBzZXQKKworIworIyBGdXNpb24gTVBUIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19GVVNJT04gaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNJT05fRkMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX1NBUyBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CitDT05GSUdfVFVOPW0KKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19QSFlMSUI9bQorQ09ORklHX1BIWUNPTlRST0w9eQorCisjCisjIE1JSSBQSFkgZGV2aWNlIGRyaXZlcnMKKyMKK0NPTkZJR19NQVJWRUxMX1BIWT1tCitDT05GSUdfREFWSUNPTV9QSFk9bQorQ09ORklHX1FTRU1JX1BIWT1tCitDT05GSUdfTFhUX1BIWT1tCitDT05GSUdfQ0lDQURBX1BIWT1tCisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfU1ROSUMgaXMgbm90IHNldAorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CitDT05GSUdfQ0FTU0lOST1tCisjIENPTkZJR19ORVRfVkVORE9SXzNDT00gaXMgbm90IHNldAorIyBDT05GSUdfU01DOTFYIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FMjAwMCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1BDST15CisjIENPTkZJR19QQ05FVDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNRDgxMTFfRVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FEQVBURUNfU1RBUkZJUkUgaXMgbm90IHNldAorIyBDT05GSUdfQjQ0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPUkNFREVUSCBpcyBub3Qgc2V0CisjIENPTkZJR19ER1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VFUFJPMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0UxMDAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBTE5YIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BVFNFTUkgaXMgbm90IHNldAorIyBDT05GSUdfTkUyS19QQ0kgaXMgbm90IHNldAorIyBDT05GSUdfODEzOUNQIGlzIG5vdCBzZXQKK0NPTkZJR184MTM5VE9PPXkKKyMgQ09ORklHXzgxMzlUT09fUElPIGlzIG5vdCBzZXQKK0NPTkZJR184MTM5VE9PX1RVTkVfVFdJU1RFUj15CisjIENPTkZJR184MTM5VE9PXzgxMjkgaXMgbm90IHNldAorQ09ORklHXzgxMzlfT0xEX1JYX1JFU0VUPXkKKyMgQ09ORklHX1NJUzkwMCBpcyBub3Qgc2V0CisjIENPTkZJR19FUElDMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkRBTkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RMQU4gaXMgbm90IHNldAorIyBDT05GSUdfVklBX1JISU5FIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorIyBDT05GSUdfRTEwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CisjIENPTkZJR19SODE2OSBpcyBub3Qgc2V0CisjIENPTkZJR19TSVMxOTAgaXMgbm90IHNldAorIyBDT05GSUdfU0tHRSBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCisjCisjIENPTkZJR19DSEVMU0lPX1QxIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lYR0IgaXMgbm90IHNldAorIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisKKyMKKyMgVG9rZW4gUmluZyBkZXZpY2VzCisjCisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisKKyMKKyMgV2lyZWxlc3MgTEFOIChub24taGFtcmFkaW8pCisjCitDT05GSUdfTkVUX1JBRElPPXkKKworIworIyBPYnNvbGV0ZSBXaXJlbGVzcyBjYXJkcyBzdXBwb3J0IChwcmUtODAyLjExKQorIworIyBDT05GSUdfU1RSSVAgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIDgwMi4xMWIgSVNBL1BDSSBjYXJkcyBzdXBwb3J0CisjCisjIENPTkZJR19IRVJNRVMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNRUwgaXMgbm90IHNldAorCisjCisjIFByaXNtIEdUL0R1ZXR0ZSA4MDIuMTEoYS9iL2cpIFBDSS9DYXJkYnVzIHN1cHBvcnQKKyMKK0NPTkZJR19QUklTTTU0PW0KKyMgQ09ORklHX0hPU1RBUCBpcyBub3Qgc2V0CitDT05GSUdfTkVUX1dJUkVMRVNTPXkKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorQ09ORklHX1BQUD1tCitDT05GSUdfUFBQX01VTFRJTElOSz15CitDT05GSUdfUFBQX0ZJTFRFUj15CitDT05GSUdfUFBQX0FTWU5DPW0KK0NPTkZJR19QUFBfU1lOQ19UVFk9bQorQ09ORklHX1BQUF9ERUZMQVRFPW0KK0NPTkZJR19QUFBfQlNEQ09NUD1tCitDT05GSUdfUFBQT0U9bQorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRkMgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAorQ09ORklHX0lOUFVUX01PVVNFREVWX1NDUkVFTl9YPTEwMjQKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWT03NjgKKyMgQ09ORklHX0lOUFVUX0pPWURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UU0RFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkRFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9FVkJVRyBpcyBub3Qgc2V0CisKKyMKKyMgSW5wdXQgRGV2aWNlIERyaXZlcnMKKyMKKyMgQ09ORklHX0lOUFVUX0tFWUJPQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfU0hfU0NJPXkKK0NPTkZJR19TRVJJQUxfU0hfU0NJX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKKworIworIyBJUE1JCisjCisjIENPTkZJR19JUE1JX0hBTkRMRVIgaXMgbm90IHNldAorCisjCisjIFdhdGNoZG9nIENhcmRzCisjCisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisjIENPTkZJR19SVEMgaXMgbm90IHNldAorIyBDT05GSUdfR0VOX1JUQyBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0RSTSBpcyBub3Qgc2V0CisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworQ09ORklHX0hXTU9OPXkKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIENhcGFiaWxpdGllcyBQb3J0IGRyaXZlcnMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCitDT05GSUdfRFVNTVlfQ09OU09MRT15CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0I9bQorIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIFVTQiBvcHRpb25zCisjCitDT05GSUdfVVNCX0RFVklDRUZTPXkKKyMgQ09ORklHX1VTQl9CQU5EV0lEVEggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0RZTkFNSUNfTUlOT1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9PVEcgaXMgbm90IHNldAorCisjCisjIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVycworIworQ09ORklHX1VTQl9FSENJX0hDRD1tCisjIENPTkZJR19VU0JfRUhDSV9TUExJVF9JU08gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VIQ0lfUk9PVF9IVUJfVFQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfT0hDSV9IQ0Q9bQorIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX09IQ0lfTElUVExFX0VORElBTj15CisjIENPTkZJR19VU0JfVUhDSV9IQ0QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NMODExX0hDRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERldmljZSBDbGFzcyBkcml2ZXJzCisjCisjIENPTkZJR19VU0JfQkxVRVRPT1RIX1RUWSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQUNNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QUklOVEVSIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMKK0NPTkZJR19VU0JfU1RPUkFHRT1tCisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfRFBDTSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9VU0JBVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9TRERSMDkgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0pVTVBTSE9UIGlzIG5vdCBzZXQKKworIworIyBVU0IgSW5wdXQgRGV2aWNlcworIworIyBDT05GSUdfVVNCX0hJRCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIEhJRCBCb290IFByb3RvY29sIGRyaXZlcnMKKyMKKyMgQ09ORklHX1VTQl9LQkQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BSVBURUsgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1dBQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9BQ0VDQUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01UT1VDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSVRNVE9VQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VHQUxBWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWUVBTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfWFBBRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVRJX1JFTU9URSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfS0VZU1BBTl9SRU1PVEUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFVE9VQ0ggaXMgbm90IHNldAorCisjCisjIFVTQiBJbWFnaW5nIGRldmljZXMKKyMKKyMgQ09ORklHX1VTQl9NREM4MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX01JQ1JPVEVLIGlzIG5vdCBzZXQKKworIworIyBVU0IgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19VU0JfREFCVVNCIGlzIG5vdCBzZXQKKworIworIyBWaWRlbzRMaW51eCBzdXBwb3J0IGlzIG5lZWRlZCBmb3IgVVNCIE11bHRpbWVkaWEgZGV2aWNlIHN1cHBvcnQKKyMKKworIworIyBVU0IgTmV0d29yayBBZGFwdGVycworIworIyBDT05GSUdfVVNCX0NBVEMgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0tBV0VUSCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUEVHQVNVUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfUlRMODE1MCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVVNCTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9aRDEyMDEgaXMgbm90IHNldAorQ09ORklHX1VTQl9NT049eQorCisjCisjIFVTQiBwb3J0IGRyaXZlcnMKKyMKKworIworIyBVU0IgU2VyaWFsIENvbnZlcnRlciBzdXBwb3J0CisjCitDT05GSUdfVVNCX1NFUklBTD1tCitDT05GSUdfVVNCX1NFUklBTF9HRU5FUklDPXkKKyMgQ09ORklHX1VTQl9TRVJJQUxfQUlSUFJJTUUgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9CRUxLSU4gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9XSElURUhFQVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9ESUdJX0FDQ0VMRVBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9DUDIxMDEgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9DWVBSRVNTX004IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRU1QRUcgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9GVERJX1NJTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1ZJU09SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfSVBBUSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0lSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfRURHRVBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9FREdFUE9SVF9USSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0dBUk1JTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0lQVyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tFWVNQQU5fUERBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfS0VZU1BBTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0tMU0kgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9LT0JJTF9TQ1QgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NFUklBTF9NQ1RfVTIzMiBpcyBub3Qgc2V0CitDT05GSUdfVVNCX1NFUklBTF9QTDIzMDM9bQorIyBDT05GSUdfVVNCX1NFUklBTF9IUDRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfU0FGRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX1RJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQ1lCRVJKQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfWElSQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfT01OSU5FVCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIE1pc2NlbGxhbmVvdXMgZHJpdmVycworIworIyBDT05GSUdfVVNCX0VNSTYyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9FTUkyNiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQVVFUlNXQUxEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9SSU81MDAgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0xFR09UT1dFUiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfTENEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRUQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVRLSVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1BISURHRVRTRVJWTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIERTTCBtb2RlbSBzdXBwb3J0CisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIEluZmluaUJhbmQgc3VwcG9ydAorIworIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0CisKKyMKKyMgU04gRGV2aWNlcworIworCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDJfRlNfWEFUVFI9eQorQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZPXkKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKK0NPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUM19GU19TRUNVUklUWT15CitDT05GSUdfSkJEPXkKKyMgQ09ORklHX0pCRF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfRlNfTUJDQUNIRT15CitDT05GSUdfUkVJU0VSRlNfRlM9bQorIyBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfUFJPQ19JTkZPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFSVNFUkZTX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfRlNfUE9TSVhfQUNMPXkKKyMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWT15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CitDT05GSUdfRlVTRV9GUz1tCisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworQ09ORklHX0lTTzk2NjBfRlM9bQorQ09ORklHX0pPTElFVD15CitDT05GSUdfWklTT0ZTPXkKK0NPTkZJR19aSVNPRlNfRlM9bQorQ09ORklHX1VERl9GUz1tCitDT05GSUdfVURGX05MUz15CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz1tCitDT05GSUdfTVNET1NfRlM9bQorQ09ORklHX1ZGQVRfRlM9bQorQ09ORklHX0ZBVF9ERUZBVUxUX0NPREVQQUdFPTQzNworQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX0hVR0VUTEJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKK0NPTkZJR19SRUxBWUZTX0ZTPW0KKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQU1GUyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUU5YNEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIEZpbGUgU3lzdGVtcworIworQ09ORklHX05GU19GUz15CitDT05GSUdfTkZTX1YzPXkKKyMgQ09ORklHX05GU19WM19BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX1Y0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRD15CitDT05GSUdfTkZTRF9WMz15CisjIENPTkZJR19ORlNEX1YzX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNEX1Y0IGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEX1RDUD15CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19MT0NLRF9WND15CitDT05GSUdfRVhQT1JURlM9eQorQ09ORklHX05GU19DT01NT049eQorQ09ORklHX1NVTlJQQz15CisjIENPTkZJR19SUENTRUNfR1NTX0tSQjUgaXMgbm90IHNldAorIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CitDT05GSUdfU01CX0ZTPW0KKyMgQ09ORklHX1NNQl9OTFNfREVGQVVMVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfOVBfRlM9bQorCisjCisjIFBhcnRpdGlvbiBUeXBlcworIworQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CisjIENPTkZJR19BQ09STl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfT1NGX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BTUlHQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQVRBUklfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BQ19QQVJUSVRJT04gaXMgbm90IHNldAorQ09ORklHX01TRE9TX1BBUlRJVElPTj15CisjIENPTkZJR19CU0RfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfVU5JWFdBUkVfRElTS0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xETV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKK0NPTkZJR19OTFM9bQorQ09ORklHX05MU19ERUZBVUxUPSJpc284ODU5LTEiCitDT05GSUdfTkxTX0NPREVQQUdFXzQzNz1tCisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorQ09ORklHX05MU19BU0NJST1tCitDT05GSUdfTkxTX0lTTzg4NTlfMT1tCisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX1VURjg9bQorCisjCisjIFByb2ZpbGluZyBzdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNgorIyBDT05GSUdfREVURUNUX1NPRlRMT0NLVVAgaXMgbm90IHNldAorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfU0xBQj15CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKK0NPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEU9eQorIyBDT05GSUdfRUFSTFlfUFJJTlRLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tHREIgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworQ09ORklHX0NSWVBUTz15CitDT05GSUdfQ1JZUFRPX0hNQUM9eQorIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19NRDQ9bQorQ09ORklHX0NSWVBUT19NRDU9bQorQ09ORklHX0NSWVBUT19TSEExPW0KK0NPTkZJR19DUllQVE9fU0hBMjU2PW0KK0NPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fV1A1MTI9bQorQ09ORklHX0NSWVBUT19UR1IxOTI9bQorQ09ORklHX0NSWVBUT19ERVM9bQorQ09ORklHX0NSWVBUT19CTE9XRklTSD1tCitDT05GSUdfQ1JZUFRPX1RXT0ZJU0g9bQorQ09ORklHX0NSWVBUT19TRVJQRU5UPW0KK0NPTkZJR19DUllQVE9fQUVTPW0KK0NPTkZJR19DUllQVE9fQ0FTVDU9bQorQ09ORklHX0NSWVBUT19DQVNUNj1tCitDT05GSUdfQ1JZUFRPX1RFQT1tCitDT05GSUdfQ1JZUFRPX0FSQzQ9bQorQ09ORklHX0NSWVBUT19LSEFaQUQ9bQorQ09ORklHX0NSWVBUT19BTlVCSVM9bQorQ09ORklHX0NSWVBUT19ERUZMQVRFPW0KK0NPTkZJR19DUllQVE9fTUlDSEFFTF9NSUM9bQorQ09ORklHX0NSWVBUT19DUkMzMkM9bQorIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIGNyeXB0byBkZXZpY2VzCisjCisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworQ09ORklHX0NSQ19DQ0lUVD1tCitDT05GSUdfQ1JDMTY9bQorQ09ORklHX0NSQzMyPXkKK0NPTkZJR19MSUJDUkMzMkM9bQorQ09ORklHX1pMSUJfSU5GTEFURT1tCitDT05GSUdfWkxJQl9ERUZMQVRFPW0KK0NPTkZJR19URVhUU0VBUkNIPXkKK0NPTkZJR19URVhUU0VBUkNIX0tNUD1tCitDT05GSUdfVEVYVFNFQVJDSF9CTT1tCitDT05GSUdfVEVYVFNFQVJDSF9GU009bQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9LY29uZmlnIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9LY29uZmlnCmluZGV4IDBmMTUyMTYuLmRlZmMxM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9kbWEvS2NvbmZpZworKysgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL0tjb25maWcKQEAgLTExLDYgKzExLDggQEAKIGNvbmZpZyBOUl9PTkNISVBfRE1BX0NIQU5ORUxTCiAJZGVwZW5kcyBvbiBTSF9ETUEKIAlpbnQgIk51bWJlciBvZiBvbi1jaGlwIERNQUMgY2hhbm5lbHMiCisJZGVmYXVsdCAiOCIgaWYgQ1BVX1NVQlRZUEVfU0g3NzUwUiB8fCBDUFVfU1VCVFlQRV9TSDc3NTFSCisJZGVmYXVsdCAiMTIiIGlmIENQVV9TVUJUWVBFX1NINzc4MAogCWRlZmF1bHQgIjQiCiAJaGVscAogCSAgVGhpcyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBjaGFubmVscyB0aGF0IHRoZSBvbi1jaGlwCkBAIC01Miw0ICs1NCwzIEBACiAJICBhcmUgZHVhbC1hZGRyZXNzIGNhcGFibGUuCiAKIGVuZG1lbnUKLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtZzIuYyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLWcyLmMKaW5kZXggMGY4NjZmOC4uOWNiMDcwOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtZzIuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1nMi5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqIEcyIGJ1cyBETUEgc3VwcG9ydAogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCAgUGF1bCBNdW5kdAorICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNiAgUGF1bCBNdW5kdAogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3N5c2FzaWMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9kbWEuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CkBAIC00NywxNyArNDcsMzEgQEAKIAogc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBnMl9kbWFfaW5mbyAqZzJfZG1hID0gKHZvbGF0aWxlIHN0cnVjdCBnMl9kbWFfaW5mbyAqKTB4YTA1Zjc4MDA7CiAKKyNkZWZpbmUgZzJfYnl0ZXNfcmVtYWluaW5nKGkpIFwKKwkoKGcyX2RtYS0+Y2hhbm5lbFtpXS5zaXplIC0gXAorCSAgZzJfZG1hLT5zdGF0dXNbaV0uc2l6ZSkgJiAweDBmZmZmZmZmKQorCiBzdGF0aWMgaXJxcmV0dXJuX3QgZzJfZG1hX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCS8qIEZJWE1FOiBEbyBzb21lIG1lYW5pbmdmdWwgY29tcGxldGlvbiB3b3JrIGhlcmUuLiAqLwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KKwlpbnQgaTsKIAotc3RhdGljIHN0cnVjdCBpcnFhY3Rpb24gZzJfZG1hX2lycSA9IHsKLQkubmFtZQkJPSAiZzIgRE1BIGhhbmRsZXIiLAotCS5oYW5kbGVyCT0gZzJfZG1hX2ludGVycnVwdCwKLQkuZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRCwKLX07CisJZm9yIChpID0gMDsgaSA8IEcyX05SX0RNQV9DSEFOTkVMUzsgaSsrKSB7CisJCWlmIChnMl9kbWEtPnN0YXR1c1tpXS5zdGF0dXMgJiAweDIwMDAwMDAwKSB7CisJCQl1bnNpZ25lZCBpbnQgYnl0ZXMgPSBnMl9ieXRlc19yZW1haW5pbmcoaSk7CisKKwkJCWlmIChsaWtlbHkoYnl0ZXMgPT0gMCkpIHsKKwkJCQlzdHJ1Y3QgZG1hX2luZm8gKmluZm8gPSBkZXZfaWQ7CisJCQkJc3RydWN0IGRtYV9jaGFubmVsICpjaGFuID0gaW5mby0+Y2hhbm5lbHMgKyBpOworCisJCQkJd2FrZV91cCgmY2hhbi0+d2FpdF9xdWV1ZSk7CisKKwkJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gSVJRX05PTkU7Cit9CiAKIHN0YXRpYyBpbnQgZzJfZW5hYmxlX2RtYShzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW4pCiB7CkBAIC0xMzUsOCArMTQ5LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZzJfZ2V0X3Jlc2lkdWUoc3RydWN0IGRtYV9jaGFubmVsICpjaGFuKQoreworCXJldHVybiBnMl9ieXRlc19yZW1haW5pbmcoY2hhbi0+Y2hhbik7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZG1hX29wcyBnMl9kbWFfb3BzID0gewogCS54ZmVyCQk9IGcyX3hmZXJfZG1hLAorCS5nZXRfcmVzaWR1ZQk9IGcyX2dldF9yZXNpZHVlLAogfTsKIAogc3RhdGljIHN0cnVjdCBkbWFfaW5mbyBnMl9kbWFfaW5mbyA9IHsKQEAgLTE0OCwxMyArMTY4LDIyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGcyX2RtYV9pbml0KHZvaWQpCiB7Ci0Jc2V0dXBfaXJxKEhXX0VWRU5UX0cyX0RNQSwgJmcyX2RtYV9pcnEpOworCWludCByZXQ7CisKKwlyZXQgPSByZXF1ZXN0X2lycShIV19FVkVOVF9HMl9ETUEsIGcyX2RtYV9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsCisJCQkgICJnMiBETUEgaGFuZGxlciIsICZnMl9kbWFfaW5mbyk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJLyogTWFnaWMgKi8KIAlnMl9kbWEtPndhaXRfc3RhdGUJPSAyNzsKIAlnMl9kbWEtPm1hZ2ljCQk9IDB4NDY1OTQwNGY7CiAKLQlyZXR1cm4gcmVnaXN0ZXJfZG1hYygmZzJfZG1hX2luZm8pOworCXJldCA9IHJlZ2lzdGVyX2RtYWMoJmcyX2RtYV9pbmZvKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlmcmVlX2lycShIV19FVkVOVF9HMl9ETUEsIDApOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGcyX2RtYV9leGl0KHZvaWQpCkBAIC0xNjksNCArMTk4LDMgQEAKIE1PRFVMRV9BVVRIT1IoIlBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkcyIGJ1cyBETUEgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXB2cjIuYyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXB2cjIuYwppbmRleCAzMGE1ODBhLi4zYjBiMGY2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1wdnIyLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtcHZyMi5jCkBAIC0xOCw4ICsxOCw4IEBACiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCi1zdGF0aWMgdW5zaWduZWQgaW50IHhmZXJfY29tcGxldGUgPSAwOwotc3RhdGljIGludCBjb3VudCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IHhmZXJfY29tcGxldGU7CitzdGF0aWMgaW50IGNvdW50OwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgcHZyMl9kbWFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC0xMDcsNCArMTA3LDMgQEAKIE1PRFVMRV9BVVRIT1IoIlBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk5FQyBQb3dlclZSIDIgRE1BIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zaC5jIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc2guYwppbmRleCBlMDI4YTJkLi5jYmJlOGJjIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zaC5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXNoLmMKQEAgLTExLDE0ICsxMSwxMCBAQAogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqLwotCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9kcmVhbWNhc3QvZG1hLmg+Ci0jaW5jbHVkZSA8YXNtL3NpZ25hbC5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSAiZG1hLXNoLmgiCkBAIC04NCwxOCArODAsMjMgQEAKIAogc3RhdGljIGludCBzaF9kbWFjX3JlcXVlc3RfZG1hKHN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbikKIHsKLQljaGFyIG5hbWVbMzJdOworCWlmICh1bmxpa2VseSghY2hhbi0+ZmxhZ3MgJiBETUFfVEVJX0NBUEFCTEUpKQorCQlyZXR1cm4gMDsKIAotCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIkRNQUMgVHJhbnNmZXIgRW5kIChDaGFubmVsICVkKSIsCisJY2hhbi0+bmFtZSA9IGt6YWxsb2MoMzIsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseShjaGFuLT5uYW1lID09IE5VTEwpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzbnByaW50ZihjaGFuLT5uYW1lLCAzMiwgIkRNQUMgVHJhbnNmZXIgRW5kIChDaGFubmVsICVkKSIsCiAJCSBjaGFuLT5jaGFuKTsKIAogCXJldHVybiByZXF1ZXN0X2lycShnZXRfZG10ZV9pcnEoY2hhbi0+Y2hhbiksIGRtYV90ZWksCi0JCQkgICBJUlFGX0RJU0FCTEVELCBuYW1lLCBjaGFuKTsKKwkJCSAgIElSUUZfRElTQUJMRUQsIGNoYW4tPm5hbWUsIGNoYW4pOwogfQogCiBzdGF0aWMgdm9pZCBzaF9kbWFjX2ZyZWVfZG1hKHN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbikKIHsKIAlmcmVlX2lycShnZXRfZG10ZV9pcnEoY2hhbi0+Y2hhbiksIGNoYW4pOworCWtmcmVlKGNoYW4tPm5hbWUpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMjU5LDcgKzI2MCw3IEBACiAjaWZkZWYgQ09ORklHX0NQVV9TSDQKIAltYWtlX2lwcl9pcnEoRE1BRV9JUlEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSk7CiAJaSA9IHJlcXVlc3RfaXJxKERNQUVfSVJRLCBkbWFfZXJyLCBJUlFGX0RJU0FCTEVELCAiRE1BQyBBZGRyZXNzIEVycm9yIiwgMCk7Ci0JaWYgKGkgPCAwKQorCWlmICh1bmxpa2VseShpIDwgMCkpCiAJCXJldHVybiBpOwogI2VuZGlmCiAKQEAgLTI3NCw3ICsyNzUsNyBAQAogCSAqIGJlZW4gc2V0LgogCSAqLwogCWkgPSBkbWFvcl9yZXNldCgpOwotCWlmIChpIDwgMCkKKwlpZiAodW5saWtlbHkoaSAhPSAwKSkKIAkJcmV0dXJuIGk7CiAKIAlyZXR1cm4gcmVnaXN0ZXJfZG1hYyhpbmZvKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvTWFrZWZpbGUgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL01ha2VmaWxlCmluZGV4IDM2NWJjMTYuLjllMDBjYjggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9NYWtlZmlsZQpAQCAtNiw3ICs2LDggQEAKIG9iai0kKENPTkZJR19QQ0lfQVVUTykJCQkrPSBwY2ktYXV0by5vCiAKIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSkJKz0gcGNpLXN0NDAubwotb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkJKz0gcGNpLXNoNzc1MS5vIAorb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkJKz0gcGNpLXNoNzc1MS5vIG9wcy1zaDQubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkJKz0gcGNpLXNoNzc4MC5vIG9wcy1zaDQubwogCiBvYmotJChDT05GSUdfU0hfRFJFQU1DQVNUKQkJKz0gb3BzLWRyZWFtY2FzdC5vIGZpeHVwcy1kcmVhbWNhc3QubyBcCiAJCQkJCSAgIGRtYS1kcmVhbWNhc3QubwpAQCAtMTQsMyArMTUsNiBAQAogb2JqLSQoQ09ORklHX1NIX0JJR1NVUikJCQkrPSBvcHMtYmlnc3VyLm8KIG9iai0kKENPTkZJR19TSF9SVFM3NzUxUjJEKQkJKz0gb3BzLXJ0czc3NTFyMmQubyBmaXh1cHMtcnRzNzc1MXIyZC5vCiBvYmotJChDT05GSUdfU0hfU0gwMykJCQkrPSBvcHMtc2gwMy5vIGZpeHVwcy1zaDAzLm8KK29iai0kKENPTkZJR19TSF9SNzc4MFJQKQkJKz0gb3BzLXI3NzgwcnAubyBmaXh1cHMtcjc3ODBycC5vCitvYmotJChDT05GSUdfU0hfVElUQU4pCQkJKz0gb3BzLXRpdGFuLm8KK29iai0kKENPTkZJR19TSF9MQU5ESVNLKQkJKz0gb3BzLWxhbmRpc2subwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtZHJlYW1jYXN0LmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1kcmVhbWNhc3QuYwppbmRleCA2M2IxYzZmLi5jMGFmNWY3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1kcmVhbWNhc3QuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1kcmVhbWNhc3QuYwpAQCAtNCw3ICs0LDcgQEAKICAqIFBDSSBmaXh1cHMgZm9yIHRoZSBTZWdhIERyZWFtY2FzdAogICoKICAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiAgTS4gUi4gQnJvd24KLSAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUGF1bCBNdW5kdAorICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA2ICBQYXVsIE11bmR0CiAgKgogICogVGhpcyBmaWxlIG9yaWdpbmFsbHkgYm9yZSB0aGUgbWVzc2FnZSAod2l0aCBlbmNsb3NlZC0kKToKICAqCUlkOiBwY2kuYyx2IDEuMyAyMDAzLzA1LzA0IDE5OjI5OjQ2IGxldGhhbCBFeHAKQEAgLTQ1LDM2ICs0NSwxNiBAQAogCQlwcmludGsoIlBDSTogRmFpbGVkIHJlc291cmNlIGZpeHVwXG4iKTsKIAl9CiB9Ci0KIERFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBnYXBzcGNpX2ZpeHVwX3Jlc291cmNlcyk7CiAKLXZvaWQgX19pbml0IHBjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7Ci0JLyogCi0JICogV2UgZG9uJ3QgaGF2ZSBhbnkgc3ViIGJ1cyB0byBmaXggdXAsIGFuZCB0aGlzIGlzIGEgcmF0aGVyCi0JICogc3R1cGlkIHBsYWNlIHRvIHB1dCBnZW5lcmFsIGRldmljZSBmaXh1cHMuIERvbid0IGRvIGl0LgotCSAqIFVzZSB0aGUgcGNpYmlvc19maXh1cHMgdGFibGUgb3Igc3VmZmVyIHRoZSBjb25zZXF1ZW5jZXMuCisJLyoKKwkgKiBUaGUgaW50ZXJydXB0IHJvdXRpbmcgc2VtYW50aWNzIGhlcmUgYXJlIHF1aXRlIHRyaXZpYWwuCisJICoKKwkgKiBXZSBiYXNpY2FsbHkgb25seSBzdXBwb3J0IG9uZSBpbnRlcnJ1cHQsIHNvIHdlIG9ubHkgYm90aGVyCisJICogdXBkYXRpbmcgYSBkZXZpY2UncyBpbnRlcnJ1cHQgbGluZSB3aXRoIHRoaXMgc2luZ2xlIHNoYXJlZAorCSAqIGludGVycnVwdC4gS2VlcHMgcm91dGluZyBxdWl0ZSBzaW1wbGUsIGRvZXNuJ3QgaXQ/CiAJICovCisJcmV0dXJuIEdBUFNQQ0lfSVJROwogfQotCi12b2lkIF9faW5pdCBwY2liaW9zX2ZpeHVwX2lycXModm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gMDsKLQotCWZvcl9lYWNoX3BjaV9kZXYoZGV2KSB7Ci0JCS8qCi0JCSAqIFRoZSBpbnRlcnJ1cHQgcm91dGluZyBzZW1hbnRpY3MgaGVyZSBhcmUgcXVpdGUgdHJpdmlhbC4KLQkJICoKLQkJICogV2UgYmFzaWNhbGx5IG9ubHkgc3VwcG9ydCBvbmUgaW50ZXJydXB0LCBzbyB3ZSBvbmx5IGJvdGhlcgotCQkgKiB1cGRhdGluZyBhIGRldmljZSdzIGludGVycnVwdCBsaW5lIHdpdGggdGhpcyBzaW5nbGUgc2hhcmVkCi0JCSAqIGludGVycnVwdC4gS2VlcHMgcm91dGluZyBxdWl0ZSBzaW1wbGUsIGRvZXNuJ3QgaXQ/Ci0JCSAqLwotCQlwcmludGsoS0VSTl9OT1RJQ0UgIlBDSTogRml4aW5nIHVwIElSUSByb3V0aW5nIGZvciBkZXZpY2UgJXNcbiIsCi0JCSAgICAgICBwY2lfbmFtZShkZXYpKTsKLQotCQlkZXYtPmlycSA9IEdBUFNQQ0lfSVJROwotCi0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgZGV2LT5pcnEpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtcjc3ODBycC5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtcjc3ODBycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMzIxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1yNzc4MHJwLmMKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIGFyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXI3NzgwcnAuYworICoKKyAqIEhpZ2hsYW5kZXIgUjc3ODBSUC0xIFBDSSBmaXh1cHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIExpbmVvIHVTb2x1dGlvbnMsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCAtIDIwMDYgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgInBjaS1zaDQuaCIKKyNpbmNsdWRlIDxhc20vaW8uaD4KKworaW50IHBjaV9maXh1cF9wY2ljKHZvaWQpCit7CisJcGNpX3dyaXRlX3JlZygweDAwMDA0M2ZmLCBTSDRfUENJSU5UTSk7CisJcGNpX3dyaXRlX3JlZygweDAwMDAzODBmLCBTSDRfUENJQUlOVE0pOworCisJcGNpX3dyaXRlX3JlZygweGZiYjAwMDQ3LCBTSDc3ODBfUENJQ01EKTsKKwlwY2lfd3JpdGVfcmVnKDB4MDAwMDAwMDAsIFNINzc4MF9QQ0lJQkFSKTsKKworCXBjaV93cml0ZV9yZWcoMHgwMDAxMTkxMiwgU0g3NzgwX1BDSVNWSUQpOworCXBjaV93cml0ZV9yZWcoMHgwODAwMDAwMCwgU0g3NzgwX1BDSUNTQ1IwKTsKKwlwY2lfd3JpdGVfcmVnKDB4MDAwMDAwMWIsIFNINzc4MF9QQ0lDU0FSMCk7CisJcGNpX3dyaXRlX3JlZygweGZkMDAwMDAwLCBTSDc3ODBfUENJQ1NDUjEpOworCXBjaV93cml0ZV9yZWcoMHgwMDAwMDAwZiwgU0g3NzgwX1BDSUNTQVIxKTsKKworCXBjaV93cml0ZV9yZWcoMHhmZDAwMDAwMCwgU0g3NzgwX1BDSU1CUjApOworCXBjaV93cml0ZV9yZWcoMHgwMGZjMDAwMCwgU0g3NzgwX1BDSU1CTVIwKTsKKworI2lmZGVmIENPTkZJR18zMkJJVAorCXBjaV93cml0ZV9yZWcoMHhjMDAwMDAwMCwgU0g3NzgwX1BDSU1CUjIpOworCXBjaV93cml0ZV9yZWcoMHgyMDAwMDAwMCAtIFNINzc4MF9QQ0lfSU9fU0laRSwgU0g3NzgwX1BDSU1CTVIyKTsKKyNlbmRpZgorCisJLyogU2V0IElPQlIgZm9yIHdpbmRvd3MgY29udGFpbmluZyBhcmVhIHNwZWNpZmllZCBpbiBwY2kuaCAqLworCXBjaV93cml0ZV9yZWcoKFBDSUJJT1NfTUlOX0lPICYgfihTSDc3ODBfUENJX0lPX1NJWkUgLSAxKSksCisJCSAgICAgIFNINzc4MF9QQ0lJT0JSKTsKKwlwY2lfd3JpdGVfcmVnKCgoU0g3NzgwX1BDSV9JT19TSVpFLTEpICYgKDc8PDE4KSksIFNINzc4MF9QQ0lJT0JNUik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXJ0czc3NTFyMmQuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXJ0czc3NTFyMmQuYwppbmRleCAwYzU5MGZjLi5lNzJjZWI1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1ydHM3NzUxcjJkLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtcnRzNzc1MXIyZC5jCkBAIC0xMCw4ICsxMCw3IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCi0jaW5jbHVkZSAicGNpLXNoNzc1MS5oIgotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgInBjaS1zaDQuaCIKIAogI2RlZmluZSBQQ0lNQ1JfTVJTRVRfT0ZGCTB4QkZGRkZGRkYKICNkZWZpbmUgUENJTUNSX1JGU0hfT0ZGCQkweEZGRkZGRkZCCkBAIC0yMiwyMiArMjEsMjMgQEAKIAogCWJjcjEgPSBpbmwoU0g3NzUxX0JDUjEpOwogCWJjcjEgfD0gMHg0MDA4MDAwMDsJLyogRW5hYmxlIEJpdCAxOSBCUkVRRU4sIHNldCBQQ0lDIHRvIHNsYXZlICovCi0Jb3V0bChiY3IxLCBQQ0lfUkVHKFNINzc1MV9QQ0lCQ1IxKSk7CisJcGNpX3dyaXRlX3JlZyhiY3IxLCBTSDRfUENJQkNSMSk7CiAKIAkvKiBFbmFibGUgYWxsIGludGVycnVwdHMsIHNvIHdlIGtub3duIHdoYXQgdG8gZml4ICovCi0Jb3V0bCgweDAwMDBjM2ZmLCBQQ0lfUkVHKFNINzc1MV9QQ0lJTlRNKSk7Ci0Jb3V0bCgweDAwMDAzODBmLCBQQ0lfUkVHKFNINzc1MV9QQ0lBSU5UTSkpOworCXBjaV93cml0ZV9yZWcoMHgwMDAwYzNmZiwgU0g0X1BDSUlOVE0pOworCXBjaV93cml0ZV9yZWcoMHgwMDAwMzgwZiwgU0g0X1BDSUFJTlRNKTsKIAotCW91dGwoMHhmYjkwMDA0NywgUENJX1JFRyhTSDc3NTFfUENJQ09ORjEpKTsKLQlvdXRsKDB4YWIwMDAwMDEsIFBDSV9SRUcoU0g3NzUxX1BDSUNPTkY0KSk7CisJcGNpX3dyaXRlX3JlZygweGZiOTAwMDQ3LCBTSDc3NTFfUENJQ09ORjEpOworCXBjaV93cml0ZV9yZWcoMHhhYjAwMDAwMSwgU0g3NzUxX1BDSUNPTkY0KTsKIAogCW1jciA9IGlubChTSDc3NTFfTUNSKTsKIAltY3IgPSAobWNyICYgUENJTUNSX01SU0VUX09GRikgJiBQQ0lNQ1JfUkZTSF9PRkY7Ci0Jb3V0bChtY3IsIFBDSV9SRUcoU0g3NzUxX1BDSU1DUikpOworCXBjaV93cml0ZV9yZWcobWNyLCBTSDRfUENJTUNSKTsKIAotCW91dGwoMHgwYzAwMDAwMCwgUENJX1JFRyhTSDc3NTFfUENJQ09ORjUpKTsKLQlvdXRsKDB4ZDAwMDAwMDAsIFBDSV9SRUcoU0g3NzUxX1BDSUNPTkY2KSk7Ci0Jb3V0bCgweDBjMDAwMDAwLCBQQ0lfUkVHKFNINzc1MV9QQ0lMQVIwKSk7Ci0Jb3V0bCgweDAwMDAwMDAwLCBQQ0lfUkVHKFNINzc1MV9QQ0lMQVIxKSk7CisJcGNpX3dyaXRlX3JlZygweDBjMDAwMDAwLCBTSDc3NTFfUENJQ09ORjUpOworCXBjaV93cml0ZV9yZWcoMHhkMDAwMDAwMCwgU0g3NzUxX1BDSUNPTkY2KTsKKwlwY2lfd3JpdGVfcmVnKDB4MGMwMDAwMDAsIFNINF9QQ0lMQVIwKTsKKwlwY2lfd3JpdGVfcmVnKDB4MDAwMDAwMDAsIFNINF9QQ0lMQVIxKTsKKwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2gwMy5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2gwMy5jCmluZGV4IDU3YWMyNmMuLjJlOGExOGIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNoMDMuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zaDAzLmMKQEAgLTMsMTEgKzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLS8qCi0gKiAJSVJRIGZ1bmN0aW9ucwotICovCi0KLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHU4IHNsb3QsIHU4IHBpbiwgc3RydWN0IHBjaV9kZXYgKmRldikKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCkBAIC0xNyw4ICsxMyw5IEBACiAJCWNhc2UgODogcmV0dXJuIDU7CS8qIGV0aDEgICAgICAgKi8KIAkJY2FzZSA2OiByZXR1cm4gMjsJLyogUENJIGJyaWRnZSAqLwogCQlkZWZhdWx0OgotICAgICAgICAgICAgICAgIAlwcmludGsoIlBDSTogQmFkIElSUSBtYXBwaW5nIHJlcXVlc3QgZm9yIHNsb3QgJWRcbiIsIHNsb3QpOwotICAgICAgICAgICAgICAgIAlyZXR1cm4gMjsKKwkJCXByaW50ayhLRVJOX0VSUiAiUENJOiBCYWQgSVJRIG1hcHBpbmcgcmVxdWVzdCAiCisJCQkJCSJmb3Igc2xvdCAlZFxuIiwgc2xvdCk7CisJCQlyZXR1cm4gMjsKIAkJfQogCX0gZWxzZSB7CiAJCXN3aXRjaCAocGluKSB7CkBAIC0zMiwzMCArMjksMyBAQAogCX0KIAlyZXR1cm4gaXJxOwogfQotCi1zdGF0aWMgdTggX19pbml0IHNoMDNfbm9fc3dpenpsZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCAqcGluKQotewotCS8qIG5vIHN3aXp6bGluZyAqLwotCXJldHVybiBQQ0lfU0xPVChkZXYtPmRldmZuKTsKLX0KLQotc3RhdGljIGludCBzaDAzX3BjaV9sb29rdXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKLXsKLQlpbnQgaXJxID0gLTE7Ci0KLQkvKiBub3cgbG9va3VwIHRoZSBhY3R1YWwgSVJRIG9uIGEgcGxhdGZvcm0gc3BlY2lmaWMgYmFzaXMgKHBjaS0ncGxhdGZvcm0nLmMpICovCi0JaXJxID0gcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHNsb3QsIHBpbiwgZGV2KTsKLQlpZiggaXJxIDwgMCApIHsKLQkJcHJfZGVidWcoIlBDSTogRXJyb3IgbWFwcGluZyBJUlEgb24gZGV2aWNlICVzXG4iLCBwY2lfbmFtZShkZXYpKTsKLQkJcmV0dXJuIGlycTsKLQl9Ci0KLQlwcl9kZWJ1ZygiU2V0dGluZyBJUlEgZm9yIHNsb3QgJXMgdG8gJWRcbiIsIHBjaV9uYW1lKGRldiksIGlycSk7Ci0KLQlyZXR1cm4gaXJxOwotfQotCi12b2lkIF9faW5pdCBwY2liaW9zX2ZpeHVwX2lycXModm9pZCkKLXsKLQlwY2lfZml4dXBfaXJxcyhzaDAzX25vX3N3aXp6bGUsIHNoMDNfcGNpX2xvb2t1cF9pcnEpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtYmlnc3VyLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1iaWdzdXIuYwppbmRleCBhZTgyYzZjLi41ZGE1MDFiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1iaWdzdXIuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1iaWdzdXIuYwpAQCAtMTAsMTUgKzEwLDEyIEBACiAgKgogICogUENJIGluaXRpYWxpemF0aW9uIGZvciB0aGUgSGl0YWNoaSBCaWcgU3VyIEV2YWx1YXRpb24gQm9hcmQKICAqLwotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgInBjaS1zaDc3NTEuaCIKKyNpbmNsdWRlICJwY2ktc2g0LmgiCiAjaW5jbHVkZSA8YXNtL2JpZ3N1ci9iaWdzdXIuaD4KIAogI2RlZmluZSBCSUdTVVJfUENJX0lPCTB4NDAwMApAQCAtNDEsMTEgKzM4LDExIEBACiBleHRlcm4gc3RydWN0IHBjaV9vcHMgc2g3NzUxX3BjaV9vcHM7CiAKIHN0cnVjdCBwY2lfY2hhbm5lbCBib2FyZF9wY2lfY2hhbm5lbHNbXSA9IHsKLQl7ICZzaDc3NTFfcGNpX29wcywgJnNoNzc1MV9pb19yZXNvdXJjZSwgJnNoNzc1MV9tZW1fcmVzb3VyY2UsIDAsIDB4ZmYgfSwKKwl7ICZzaDRfcGNpX29wcywgJnNoNzc1MV9pb19yZXNvdXJjZSwgJnNoNzc1MV9tZW1fcmVzb3VyY2UsIDAsIDB4ZmYgfSwKIAl7IDAsIH0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc2g3NzUxX3BjaV9hZGRyZXNzX21hcCBzaDc3NTFfcGNpX21hcCA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc2g0X3BjaV9hZGRyZXNzX21hcCBzaDc3NTFfcGNpX21hcCA9IHsKIAkud2luZG93MAk9IHsKIAkJLmJhc2UJPSBTSDc3NTFfQ1MzX0JBU0VfQUREUiwKIAkJLnNpemUJPSBCSUdTVVJfTFNSMF9TSVpFLApAQCAtNTgsNyArNTUsNyBAQAogfTsKIAogLyoKLSAqIEluaXRpYWxpemUgdGhlIEJpZyBTdXIgUENJIGludGVyZmFjZSAKKyAqIEluaXRpYWxpemUgdGhlIEJpZyBTdXIgUENJIGludGVyZmFjZQogICogU2V0dXAgaGFyZHdhcmUgdG8gYmUgQ2VudHJhbCBGdW50aW9uCiAgKiBDb3B5IHRoZSBCU1IgcmVncyB0byB0aGUgUENJIGludGVyZmFjZQogICogU2V0dXAgUENJIHdpbmRvd3MgaW50byBsb2NhbCBSQU0KQEAgLTY4LDE1ICs2NSwxNSBAQAogCXJldHVybiBzaDc3NTFfcGNpY19pbml0KCZzaDc3NTFfcGNpX21hcCk7CiB9CiAKLWludCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEodTggc2xvdCwgdTggcGluKQoraW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKLQkvKiAKKwkvKgogCSAqIFRoZSBCaWcgU3VyIGNhbiBiZSB1c2VkIGluIGEgQ1BDSSBjaGFzc2lzLCBidXQgdGhlIFNINzc1MSBQQ0kKIAkgKiBpbnRlcmZhY2UgaXMgb24gdGhlIHdyb25nIGVuZCBvZiB0aGUgYm9hcmQgc28gdGhhdCBpdCBjYW4gYWxzbwogCSAqIHN1cHBvcnQgYSBWMzIwIENQSSBpbnRlcmZhY2UgY2hpcC4uLiAgVGhlcmVmb3IgdGhlIElSUSBtYXBwaW5nIGlzCiAJICogc29tZXdoYXQgdXNlIGRlcGVuZGVudC4uLiBJJ2wgYXNzdW1lIGEgbGluZWFyIG1hcCBmb3Igbm93LCBpLmUuCiAJICogSU5UQT1zbG90MCxwaW4wLi4uIElOVEQ9c2xvdDMscGluMC4uLgotCSAqLyAKKwkgKi8KIAlpbnQgaXJxID0gKHNsb3QgKyBwaW4tMSkgJSA0ICsgQklHU1VSX1NINzc1MV9QQ0lfSVJRX0JBU0U7CiAKIAlQQ0lEQkcoMiwgIlBDSTogTWFwcGluZyBCaWcgU3VyIElSUSBmb3Igc2xvdCAlZCwgcGluICVjIHRvIGlycSAlZFxuIiwKQEAgLTg0LDQgKzgxLDMgQEAKIAogCXJldHVybiBpcnE7CiB9Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWxhbmRpc2suYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWxhbmRpc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGEzMDFjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtbGFuZGlzay5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBhcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1sYW5kaXNrLmMKKyAqCisgKiBQQ0kgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSBJLU8gREFUQSBEZXZpY2UsIEluYy4gTEFORElTSyBib2FyZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBrb2dpaWRlbmEKKyAqCisgKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgInBjaS1zaDQuaCIKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaDc3NTFfaW9fcmVzb3VyY2UgPSB7CisJLm5hbWUgPSAiU0g3NzUxIElPIiwKKwkuc3RhcnQgPSAweDQwMDAsCisJLmVuZCA9IDB4NDAwMCArIFNINzc1MV9QQ0lfSU9fU0laRSAtIDEsCisJLmZsYWdzID0gSU9SRVNPVVJDRV9JTworfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaDc3NTFfbWVtX3Jlc291cmNlID0geworCS5uYW1lID0gIlNINzc1MSBtZW0iLAorCS5zdGFydCA9IFNINzc1MV9QQ0lfTUVNT1JZX0JBU0UsCisJLmVuZCA9IFNINzc1MV9QQ0lfTUVNT1JZX0JBU0UgKyBTSDc3NTFfUENJX01FTV9TSVpFIC0gMSwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTQorfTsKKworc3RydWN0IHBjaV9jaGFubmVsIGJvYXJkX3BjaV9jaGFubmVsc1tdID0geworCXsmc2g0X3BjaV9vcHMsICZzaDc3NTFfaW9fcmVzb3VyY2UsICZzaDc3NTFfbWVtX3Jlc291cmNlLCAwLCAweDNmZn0sCisJe05VTEwsIE5VTEwsIE5VTEwsIDAsIDB9LAorfTsKKworc3RhdGljIHN0cnVjdCBzaDRfcGNpX2FkZHJlc3NfbWFwIHNoNzc1MV9wY2lfbWFwID0geworCS53aW5kb3cwID0geworCQkuYmFzZQk9IFNINzc1MV9DUzNfQkFTRV9BRERSLAorCQkuc2l6ZQk9ICg2NCA8PCAyMCksCS8qIDY0TUIgKi8KKwl9LAorCisJLmZsYWdzID0gU0g0X1BDSUNfTk9fUkVTRVQsCit9OworCitpbnQgX19pbml0IHBjaWJpb3NfaW5pdF9wbGF0Zm9ybSh2b2lkKQoreworCXJldHVybiBzaDc3NTFfcGNpY19pbml0KCZzaDc3NTFfcGNpX21hcCk7Cit9CisKK2ludCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3sKKwkvKgorCSAqIHNsb3QwOiBwaW4xLTQgPSBpcnE1LDYsNyw4CisJICogc2xvdDE6IHBpbjEtNCA9IGlycTYsNyw4LDUKKwkgKiBzbG90MjogcGluMS00ID0gaXJxNyw4LDUsNgorCSAqIHNsb3QzOiBwaW4xLTQgPSBpcnE4LDUsNiw3CisJICovCisJaW50IGlycSA9ICgoc2xvdCArIHBpbiAtIDEpICYgMHgzKSArIDU7CisKKwlpZiAoKHNsb3QgfCAocGluIC0gMSkpID4gMHgzKSB7CisJCXByaW50aygiUENJOiBCYWQgSVJRIG1hcHBpbmcgcmVxdWVzdCBmb3Igc2xvdCAlZCBwaW4gJWNcbiIsCisJCSAgICAgICBzbG90LCBwaW4gLSAxICsgJ0EnKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gaXJxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtcjc3ODBycC5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtcjc3ODBycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NGQ1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1yNzc4MHJwLmMKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIEF1dGhvcjogIElhbiBEYVNpbHZhIChpZGFzaWx2YUBtdmlzdGEuY29tKQorICoKKyAqIEhpZ2hseSBsZXZlcmFnZWQgZnJvbSBwY2ktYmlnc3VyLmMsIHdyaXR0ZW4gYnkgRHVzdGluIE1jSW50aXJlLgorICoKKyAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBQQ0kgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSBSZW5lc2FzIFNINzc4MCBIaWdobGFuZGVyIFI3NzgwUlAtMSBib2FyZAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9yNzc4MHJwL3I3NzgwcnAuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJwY2ktc2g0LmgiCisKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisgICAgICAgIHN3aXRjaCAoc2xvdCkgeworCWNhc2UgMDogcmV0dXJuIElSUV9QQ0lTTE9UMTsJCS8qIFBDSSBJbnRlcnJ1cHQgIzEgKi8KKwljYXNlIDE6IHJldHVybiBJUlFfUENJU0xPVDI7CQkvKiBQQ0kgSW50ZXJydXB0ICMyICovCisJY2FzZSAyOiByZXR1cm4gSVJRX1BDSVNMT1QzOwkJLyogUENJIEludGVycnVwdCAjMyAqLworCWNhc2UgMzogcmV0dXJuIElSUV9QQ0lTTE9UNDsJCS8qIFBDSSBJbnRlcnJ1cHQgRTQgKi8KKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIlBDSTogQmFkIElSUSBtYXBwaW5nICIKKwkJICAgICAgICJyZXF1ZXN0IGZvciBzbG90ICVkLCBmdW5jICVkXG4iLCBzbG90LCBwaW4tMSk7CisJCXJldHVybiAtMTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2g3NzgwX2lvX3Jlc291cmNlID0geworCS5uYW1lCT0gIlNINzc4MF9JTyIsCisJLnN0YXJ0CT0gMHgyMDAwLAorCS5lbmQJPSAweDIwMDAgKyBTSDc3ODBfUENJX0lPX1NJWkUgLSAxLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2g3NzgwX21lbV9yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJTSDc3ODBfbWVtIiwKKwkuc3RhcnQJPSBTSDc3ODBfUENJX01FTU9SWV9CQVNFLAorCS5lbmQJPSBTSDc3ODBfUENJX01FTU9SWV9CQVNFICsgU0g3NzgwX1BDSV9NRU1fU0laRSAtIDEsCisJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0KK307CisKK2V4dGVybiBzdHJ1Y3QgcGNpX29wcyBzaDc3ODBfcGNpX29wczsKKworc3RydWN0IHBjaV9jaGFubmVsIGJvYXJkX3BjaV9jaGFubmVsc1tdID0geworCXsgJnNoNF9wY2lfb3BzLCAmc2g3NzgwX2lvX3Jlc291cmNlLCAmc2g3NzgwX21lbV9yZXNvdXJjZSwgMCwgMHhmZiB9LAorCXsgTlVMTCwgTlVMTCwgTlVMTCwgMCwgMCB9LAorfTsKK0VYUE9SVF9TWU1CT0woYm9hcmRfcGNpX2NoYW5uZWxzKTsKKworc3RhdGljIHN0cnVjdCBzaDRfcGNpX2FkZHJlc3NfbWFwIHNoNzc4MF9wY2lfbWFwID0geworCS53aW5kb3cwCT0geworCQkuYmFzZQk9IFNINzc4MF9DUzJfQkFTRV9BRERSLAorCQkuc2l6ZQk9IDB4MDQwMDAwMDAsCisJfSwKKworCS53aW5kb3cxCT0geworCQkuYmFzZQk9IFNINzc4MF9DUzNfQkFTRV9BRERSLAorCQkuc2l6ZQk9IDB4MDQwMDAwMDAsCisJfSwKKworCS5mbGFncwk9IFNINF9QQ0lDX05PX1JFU0VULAorfTsKKworaW50IF9faW5pdCBwY2liaW9zX2luaXRfcGxhdGZvcm0odm9pZCkKK3sKKwlyZXR1cm4gc2g3NzgwX3BjaWNfaW5pdCgmc2g3NzgwX3BjaV9tYXApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtcnRzNzc1MXIyZC5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtcnRzNzc1MXIyZC5jCmluZGV4IDgzMTcxZDEuLjg4ZjQ0ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXJ0czc3NTFyMmQuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1ydHM3NzUxcjJkLmMKQEAgLTE3LDEyICsxNywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlICJwY2ktc2g3NzUxLmgiCiAjaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQvcnRzNzc1MXIyZC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgInBjaS1zaDQuaCIKIAotaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEodTggc2xvdCwgdTggcGluKQoraW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKICAgICAgICAgc3dpdGNoIChzbG90KSB7CiAJY2FzZSAwOiByZXR1cm4gSVJRX1BDSVNMT1QxOwkvKiBQQ0kgRXh0ZW5kIHNsb3QgIzEgKi8KQEAgLTUyLDEyICs1MSwxMiBAQAogZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIHNoNzc1MV9wY2lfb3BzOwogCiBzdHJ1Y3QgcGNpX2NoYW5uZWwgYm9hcmRfcGNpX2NoYW5uZWxzW10gPSB7Ci0JeyAmc2g3NzUxX3BjaV9vcHMsICZzaDc3NTFfaW9fcmVzb3VyY2UsICZzaDc3NTFfbWVtX3Jlc291cmNlLCAwLCAweGZmIH0sCisJeyAmc2g0X3BjaV9vcHMsICZzaDc3NTFfaW9fcmVzb3VyY2UsICZzaDc3NTFfbWVtX3Jlc291cmNlLCAwLCAweGZmIH0sCiAJeyBOVUxMLCBOVUxMLCBOVUxMLCAwLCAwIH0sCiB9OwogRVhQT1JUX1NZTUJPTChib2FyZF9wY2lfY2hhbm5lbHMpOwogCi1zdGF0aWMgc3RydWN0IHNoNzc1MV9wY2lfYWRkcmVzc19tYXAgc2g3NzUxX3BjaV9tYXAgPSB7CitzdGF0aWMgc3RydWN0IHNoNF9wY2lfYWRkcmVzc19tYXAgc2g3NzUxX3BjaV9tYXAgPSB7CiAJLndpbmRvdzAJPSB7CiAJCS5iYXNlCT0gU0g3NzUxX0NTM19CQVNFX0FERFIsCiAJCS5zaXplCT0gMHgwNDAwMDAwMCwKQEAgLTY4LDcgKzY3LDcgQEAKIAkJLnNpemUJPSAweDAwMDAwMDAwLAkvKiBVbnVzZWQgKi8KIAl9LAogCi0JLmZsYWdzCT0gU0g3NzUxX1BDSUNfTk9fUkVTRVQsCisJLmZsYWdzCT0gU0g0X1BDSUNfTk9fUkVTRVQsCiB9OwogCiBpbnQgX19pbml0IHBjaWJpb3NfaW5pdF9wbGF0Zm9ybSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtc2g0LmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1zaDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDQzNzEwMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXNoNC5jCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogR2VuZXJpYyBTSC00IC8gU0gtNEEgUENJQyBvcGVyYXRpb25zIChTSDc3NTEsIFNINzc4MCkuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNiAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHYyLiBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSAicGNpLXNoNC5oIgorCisvKgorICogRGlyZWN0IGFjY2VzcyB0byBQQ0kgaGFyZHdhcmUuLi4KKyAqLworI2RlZmluZSBDT05GSUdfQ01EKGJ1cywgZGV2Zm4sIHdoZXJlKSBcCisJUDFTRUdBRERSKChidXMtPm51bWJlciA8PCAxNikgfCAoZGV2Zm4gPDwgOCkgfCAod2hlcmUgJiB+MykpCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2g0X3BjaV9sb2NrKTsKKworLyoKKyAqIEZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHdpdGggdHlwZSAxIGFjY2Vzc2VzCisgKi8KK3N0YXRpYyBpbnQgc2g0X3BjaV9yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCSAgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGRhdGE7CisKKwkvKgorCSAqIFBDSVBEUiBtYXkgb25seSBiZSBhY2Nlc3NlZCBhcyAzMiBiaXQgd29yZHMsCisJICogc28gd2UgbXVzdCBkbyBieXRlIGFsaWdubWVudCBieSBoYW5kCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNoNF9wY2lfbG9jaywgZmxhZ3MpOworCXBjaV93cml0ZV9yZWcoQ09ORklHX0NNRChidXMsIGRldmZuLCB3aGVyZSksIFNINF9QQ0lQQVIpOworCWRhdGEgPSBwY2lfcmVhZF9yZWcoU0g0X1BDSVBEUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2g0X3BjaV9sb2NrLCBmbGFncyk7CisKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDE6CisJCSp2YWwgPSAoZGF0YSA+PiAoKHdoZXJlICYgMykgPDwgMykpICYgMHhmZjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqdmFsID0gKGRhdGEgPj4gKCh3aGVyZSAmIDIpIDw8IDMpKSAmIDB4ZmZmZjsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQkqdmFsID0gZGF0YTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIFBDSUJJT1NfRlVOQ19OT1RfU1VQUE9SVEVEOworCX0KKworCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7Cit9CisKKy8qCisgKiBTaW5jZSBTSDQgb25seSBkb2VzIDMyYml0IGFjY2VzcyB3ZSdsbCBoYXZlIHRvIGRvIGEgcmVhZCwKKyAqIG1hc2ssd3JpdGUgb3BlcmF0aW9uLgorICogV2UnbGwgYWxsb3cgYW4gb2RkIGJ5dGUgb2Zmc2V0LCB0aG91Z2ggaXQgc2hvdWxkIGJlIGlsbGVnYWwuCisgKi8KK3N0YXRpYyBpbnQgc2g0X3BjaV93cml0ZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCQkgaW50IHdoZXJlLCBpbnQgc2l6ZSwgdTMyIHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzaGlmdDsKKwl1MzIgZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzaDRfcGNpX2xvY2ssIGZsYWdzKTsKKwlwY2lfd3JpdGVfcmVnKENPTkZJR19DTUQoYnVzLCBkZXZmbiwgd2hlcmUpLCBTSDRfUENJUEFSKTsKKwlkYXRhID0gcGNpX3JlYWRfcmVnKFNINF9QQ0lQRFIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNoNF9wY2lfbG9jaywgZmxhZ3MpOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSAxOgorCQlzaGlmdCA9ICh3aGVyZSAmIDMpIDw8IDM7CisJCWRhdGEgJj0gfigweGZmIDw8IHNoaWZ0KTsKKwkJZGF0YSB8PSAoKHZhbCAmIDB4ZmYpIDw8IHNoaWZ0KTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzaGlmdCA9ICh3aGVyZSAmIDIpIDw8IDM7CisJCWRhdGEgJj0gfigweGZmZmYgPDwgc2hpZnQpOworCQlkYXRhIHw9ICgodmFsICYgMHhmZmZmKSA8PCBzaGlmdCk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJZGF0YSA9IHZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIFBDSUJJT1NfRlVOQ19OT1RfU1VQUE9SVEVEOworCX0KKworCXBjaV93cml0ZV9yZWcoZGF0YSwgU0g0X1BDSVBEUik7CisKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdHJ1Y3QgcGNpX29wcyBzaDRfcGNpX29wcyA9IHsKKwkucmVhZAkJPSBzaDRfcGNpX3JlYWQsCisJLndyaXRlCQk9IHNoNF9wY2lfd3JpdGUsCit9OworCisvKgorICogTm90IHJlYWxseSByZWxhdGVkIHRvIHBjaV9vcHMsIGJ1dCBpdCdzIGNvbW1vbiBhbmQgbm90IHdvcnRoIHNob3ZpbmcKKyAqIHNvbWV3aGVyZSBlbHNlIGZvciBub3cuLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBjaV9wcm9iZSA9IFBDSV9QUk9CRV9DT05GMTsKKworaW50IF9faW5pdCBzaDRfcGNpX2NoZWNrX2RpcmVjdCh2b2lkKQoreworCS8qCisJICogQ2hlY2sgaWYgY29uZmlndXJhdGlvbiB3b3Jrcy4KKwkgKi8KKwlpZiAocGNpX3Byb2JlICYgUENJX1BST0JFX0NPTkYxKSB7CisJCXVuc2lnbmVkIGludCB0bXAgPSBwY2lfcmVhZF9yZWcoU0g0X1BDSVBBUik7CisKKwkJcGNpX3dyaXRlX3JlZyhQMVNFRywgU0g0X1BDSVBBUik7CisKKwkJaWYgKHBjaV9yZWFkX3JlZyhTSDRfUENJUEFSKSA9PSBQMVNFRykgeworCQkJcGNpX3dyaXRlX3JlZyh0bXAsIFNINF9QQ0lQQVIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBVc2luZyBjb25maWd1cmF0aW9uIHR5cGUgMVxuIik7CisJCQlyZXF1ZXN0X3JlZ2lvbihQQ0lfUkVHKFNINF9QQ0lQQVIpLCA4LCAiUENJIGNvbmYxIik7CisKKwkJCXJldHVybiAwOworCQl9CisKKwkJcGNpX3dyaXRlX3JlZyh0bXAsIFNINF9QQ0lQQVIpOworCX0KKworCXByX2RlYnVnKCJQQ0k6IHBjaV9jaGVja19kaXJlY3QgZmFpbGVkXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogSGFuZGxlIGdlbmVyaWMgZml4dXBzICovCitzdGF0aWMgdm9pZCBfX2luaXQgcGNpX2ZpeHVwX2lkZV9iYXNlcyhzdHJ1Y3QgcGNpX2RldiAqZCkKK3sKKwlpbnQgaTsKKworCS8qCisJICogUENJIElERSBjb250cm9sbGVycyB1c2Ugbm9uLXN0YW5kYXJkIEkvTyBwb3J0IGRlY29kaW5nLCByZXNwZWN0IGl0LgorCSAqLworCWlmICgoZC0+Y2xhc3MgPj4gOCkgIT0gUENJX0NMQVNTX1NUT1JBR0VfSURFKQorCQlyZXR1cm47CisJcHJfZGVidWcoIlBDSTogSURFIGJhc2UgYWRkcmVzcyBmaXh1cCBmb3IgJXNcbiIsIHBjaV9uYW1lKGQpKTsKKwlmb3IoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJc3RydWN0IHJlc291cmNlICpyID0gJmQtPnJlc291cmNlW2ldOworCisJCWlmICgoci0+c3RhcnQgJiB+MHg4MCkgPT0gMHgzNzQpIHsKKwkJCXItPnN0YXJ0IHw9IDI7CisJCQlyLT5lbmQgPSByLT5zdGFydDsKKwkJfQorCX0KK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZml4dXBfaWRlX2Jhc2VzKTsKKworY2hhciAqIF9faW5pdCBwY2liaW9zX3NldHVwKGNoYXIgKnN0cikKK3sKKwlpZiAoIXN0cmNtcChzdHIsICJvZmYiKSkgeworCQlwY2lfcHJvYmUgPSAwOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gc3RyOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtc25hcGdlYXIuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXNuYXBnZWFyLmMKaW5kZXggM2NiZDE0ZC4uNTNkZDg5MyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtc25hcGdlYXIuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL29wcy1zbmFwZ2Vhci5jCkBAIC0yLDcgKzIsNyBAQAogICogYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtc25hcGdlYXIuYwogICoKICAqIEF1dGhvcjogIERhdmlkIE1jQ3VsbG91Z2ggPGRhdmlkbUBzbmFwZ2Vhci5jb20+Ci0gKiAKKyAqCiAgKiBQb3J0ZWQgdG8gbmV3IEFQSSBieSBQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPgogICoKICAqIEhpZ2hseSBsZXZlcmFnZWQgZnJvbSBwY2ktYmlnc3VyLmMsIHdyaXR0ZW4gYnkgRHVzdGluIE1jSW50aXJlLgpAQCAtMTIsMTUgKzEyLDExIEBACiAgKgogICogUENJIGluaXRpYWxpemF0aW9uIGZvciB0aGUgU25hcEdlYXIgYm9hcmRzCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlICJwY2ktc2g3NzUxLmgiCisjaW5jbHVkZSAicGNpLXNoNC5oIgogCiAjZGVmaW5lIFNOQVBHRUFSX1BDSV9JTwkJMHg0MDAwCiAjZGVmaW5lIFNOQVBHRUFSX1BDSV9NRU0JMHhmZDAwMDAwMApAQCAtNDMsMTQgKzM5LDEyIEBACiAJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAogfTsKIAotZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIHNoNzc1MV9wY2lfb3BzOwotCiBzdHJ1Y3QgcGNpX2NoYW5uZWwgYm9hcmRfcGNpX2NoYW5uZWxzW10gPSB7Ci0JeyAmc2g3NzUxX3BjaV9vcHMsICZzaDc3NTFfaW9fcmVzb3VyY2UsICZzaDc3NTFfbWVtX3Jlc291cmNlLCAwLCAweGZmIH0sCisJeyAmc2g0X3BjaV9vcHMsICZzaDc3NTFfaW9fcmVzb3VyY2UsICZzaDc3NTFfbWVtX3Jlc291cmNlLCAwLCAweGZmIH0sCiAJeyAwLCB9CiB9OwogCi1zdGF0aWMgc3RydWN0IHNoNzc1MV9wY2lfYWRkcmVzc19tYXAgc2g3NzUxX3BjaV9tYXAgPSB7CitzdGF0aWMgc3RydWN0IHNoNF9wY2lfYWRkcmVzc19tYXAgc2g3NzUxX3BjaV9tYXAgPSB7CiAJLndpbmRvdzAJPSB7CiAJCS5iYXNlCT0gU0g3NzUxX0NTMl9CQVNFX0FERFIsCiAJCS5zaXplCT0gU05BUEdFQVJfTFNSMF9TSVpFLApAQCAtNjEsMTEgKzU1LDExIEBACiAJCS5zaXplCT0gU05BUEdFQVJfTFNSMV9TSVpFLAogCX0sCiAKLQkuZmxhZ3MJPSBTSDc3NTFfUENJQ19OT19SRVNFVCwKKwkuZmxhZ3MJPSBTSDRfUENJQ19OT19SRVNFVCwKIH07CiAKIC8qCi0gKiBJbml0aWFsaXplIHRoZSBTbmFwR2VhciBQQ0kgaW50ZXJmYWNlIAorICogSW5pdGlhbGl6ZSB0aGUgU25hcEdlYXIgUENJIGludGVyZmFjZQogICogU2V0dXAgaGFyZHdhcmUgdG8gYmUgQ2VudHJhbCBGdW50aW9uCiAgKiBDb3B5IHRoZSBCU1IgcmVncyB0byB0aGUgUENJIGludGVyZmFjZQogICogU2V0dXAgUENJIHdpbmRvd3MgaW50byBsb2NhbCBSQU0KQEAgLTc1LDcgKzY5LDcgQEAKIAlyZXR1cm4gc2g3NzUxX3BjaWNfaW5pdCgmc2g3NzUxX3BjaV9tYXApOwogfQogCi1pbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycSh1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnEgPSAtMTsKIApAQCAtOTgsNCArOTIsMyBAQAogewogCS8qIE5vdGhpbmcgdG8gZml4dXAgLi4gKi8KIH0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtdGl0YW4uYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXRpdGFuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwOTdiYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXRpdGFuLmMKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIGFyY2gvc2gvZHJpdmVycy9wY2kvb3BzLXRpdGFuLmMKKyAqCisgKiBQb3J0ZWQgdG8gbmV3IEFQSSBieSBQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPgorICoKKyAqIE1vZGlmaWVkIGZyb20gb3BzLXNuYXBnZWFyLmMgd3JpdHRlbiBieSAgRGF2aWQgTWNDdWxsb3VnaAorICogSGlnaGx5IGxldmVyYWdlZCBmcm9tIHBjaS1iaWdzdXIuYywgd3JpdHRlbiBieSBEdXN0aW4gTWNJbnRpcmUuCisgKgorICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIFBDSSBpbml0aWFsaXphdGlvbiBmb3IgdGhlIFRpdGFuIGJvYXJkcworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdGl0YW4uaD4KKyNpbmNsdWRlICJwY2ktc2g0LmgiCisKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCit7CisJaW50IGlycSA9IC0xOworCisJc3dpdGNoIChzbG90KSB7CisJY2FzZSAwOiBpcnEgPSBUSVRBTl9JUlFfV0FOOyAgIGJyZWFrOwkvKiBldGgwIChXQU4pICovCisJY2FzZSAxOiBpcnEgPSBUSVRBTl9JUlFfTEFOOyAgIGJyZWFrOwkvKiBldGgxIChMQU4pICovCisJY2FzZSAyOiBpcnEgPSBUSVRBTl9JUlFfTVBDSUE7IGJyZWFrOwkvKiBtUENJIEEgKi8KKwljYXNlIDM6IGlycSA9IFRJVEFOX0lSUV9NUENJQjsgYnJlYWs7CS8qIG1QQ0kgQiAqLworCWNhc2UgNDogaXJxID0gVElUQU5fSVJRX1VTQjsgICBicmVhazsJLyogVVNCICovCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBCYWQgSVJRIG1hcHBpbmcgIgorCQkJCSAicmVxdWVzdCBmb3Igc2xvdCAlZFxuIiwgc2xvdCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcmludGsoIlBDSTogTWFwcGluZyBUSVRBTiBJUlEgZm9yIHNsb3QgJWQsIHBpbiAlYyB0byBpcnEgJWRcbiIsCisJCXNsb3QsIHBpbiAtIDEgKyAnQScsIGlycSk7CisKKwlyZXR1cm4gaXJxOworfQorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNoNzc1MV9pb19yZXNvdXJjZSA9IHsKKwkubmFtZQk9ICJTSDc3NTFfSU8iLAorCS5zdGFydAk9IFNINzc1MV9QQ0lfSU9fQkFTRSwKKwkuZW5kCT0gU0g3NzUxX1BDSV9JT19CQVNFICsgU0g3NzUxX1BDSV9JT19TSVpFIC0gMSwKKwkuZmxhZ3MJPSBJT1JFU09VUkNFX0lPCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHNoNzc1MV9tZW1fcmVzb3VyY2UgPSB7CisJLm5hbWUJPSAiU0g3NzUxX21lbSIsCisJLnN0YXJ0CT0gU0g3NzUxX1BDSV9NRU1PUllfQkFTRSwKKwkuZW5kCT0gU0g3NzUxX1BDSV9NRU1PUllfQkFTRSArIFNINzc1MV9QQ0lfTUVNX1NJWkUgLSAxLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNCit9OworCitzdHJ1Y3QgcGNpX2NoYW5uZWwgYm9hcmRfcGNpX2NoYW5uZWxzW10gPSB7CisJeyAmc2g0X3BjaV9vcHMsICZzaDc3NTFfaW9fcmVzb3VyY2UsICZzaDc3NTFfbWVtX3Jlc291cmNlLCAwLCAweGZmIH0sCisJeyBOVUxMLCBOVUxMLCBOVUxMLCAwLCAwIH0sCit9OworRVhQT1JUX1NZTUJPTChib2FyZF9wY2lfY2hhbm5lbHMpOworCitzdGF0aWMgc3RydWN0IHNoNF9wY2lfYWRkcmVzc19tYXAgc2g3NzUxX3BjaV9tYXAgPSB7CisJLndpbmRvdzAJPSB7CisJCS5iYXNlCT0gU0g3NzUxX0NTMl9CQVNFX0FERFIsCisJCS5zaXplCT0gU0g3NzUxX01FTV9SRUdJT05fU0laRSoyLAkvKiBjczIgYW5kIGNzMyAqLworCX0sCisKKwkud2luZG93MQk9IHsKKwkJLmJhc2UJPSBTSDc3NTFfQ1MyX0JBU0VfQUREUiwKKwkJLnNpemUJPSBTSDc3NTFfTUVNX1JFR0lPTl9TSVpFKjIsCisJfSwKKworCS5mbGFncwk9IFNINF9QQ0lDX05PX1JFU0VULAorfTsKKworaW50IF9faW5pdCBwY2liaW9zX2luaXRfcGxhdGZvcm0odm9pZCkKK3sKKwlyZXR1cm4gc2g3NzUxX3BjaWNfaW5pdCgmc2g3NzUxX3BjaV9tYXApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktYXV0by5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktYXV0by5jCmluZGV4IDRjZWY0ZDEuLmVjZjE2MzQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLWF1dG8uYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1hdXRvLmMKQEAgLTQ1LDExICs0NSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLSN1bmRlZglERUJVRwotI2lmZGVmIAlERUJVRworI2RlZmluZQlERUJVRworI2lmZGVmCURFQlVHCiAjZGVmaW5lCURCRyh4Li4uKQlwcmludGsoeCkKICNlbHNlCi0jZGVmaW5lCURCRyh4Li4uKQkKKyNkZWZpbmUJREJHKHguLi4pCiAjZW5kaWYKIAogLyoKQEAgLTEwMiw3ICsxMDIsNyBAQAogc3RhdGljIHUzMiBwY2lhdXRvX2xvd2VyX21lbXNwYzsKIHN0YXRpYyB1MzIgcGNpYXV0b191cHBlcl9tZW1zcGM7CiAKLXN0YXRpYyB2b2lkIF9faW5pdCAKK3N0YXRpYyB2b2lkIF9faW5pdAogcGNpYXV0b19zZXR1cF9iYXJzKHN0cnVjdCBwY2lfY2hhbm5lbCAqaG9zZSwKIAkJICAgaW50IHRvcF9idXMsCiAJCSAgIGludCBjdXJyZW50X2J1cywKQEAgLTExNiw3ICsxMTYsNiBAQAogCWludCBmb3VuZF9tZW02NCA9IDA7CiAKIAlmb3IgKGJhciA9IFBDSV9CQVNFX0FERFJFU1NfMDsgYmFyIDw9IGJhcl9saW1pdDsgYmFyKz00KSB7Ci0jaWYgIWRlZmluZWQoQ09ORklHX1NIX0hTNzc1MVJWT0lQKSAmJiAhZGVmaW5lZChDT05GSUdfU0hfUlRTNzc1MVIyRCkKIAkJdTMyIGJhcl9hZGRyOwogCiAJCS8qIFJlYWQgdGhlIG9sZCBCQVIgdmFsdWUgKi8KQEAgLTEyNSw3ICsxMjQsNiBAQAogCQkJCQlwY2lfZGV2Zm4sCiAJCQkJCWJhciwKIAkJCQkJJmJhcl9hZGRyKTsKLSNlbmRpZgogCiAJCS8qIFRpY2tsZSB0aGUgQkFSIGFuZCBnZXQgdGhlIHJlc3BvbnNlICovCiAJCWVhcmx5X3dyaXRlX2NvbmZpZ19kd29yZChob3NlLCB0b3BfYnVzLApAQCAtMTQwLDggKzEzOCw3IEBACiAJCQkJCWJhciwKIAkJCQkJJmJhcl9yZXNwb25zZSk7CiAKLSNpZiAhZGVmaW5lZChDT05GSUdfU0hfSFM3NzUxUlZPSVApICYmICFkZWZpbmVkKENPTkZJR19TSF9SVFM3NzUxUjJEKQotCQkvKiAKKwkJLyoKIAkJICogV3JpdGUgdGhlIG9sZCBCQVIgdmFsdWUgYmFjayBvdXQsIG9ubHkgdXBkYXRlIHRoZSBCQVIKIAkJICogaWYgd2UgaW1wbGljaXRseSB3YW50IHJlc291cmNlcyB0byBiZSB1cGRhdGVkLCB3aGljaAogCQkgKiBpcyBkb25lIGJ5IHRoZSBnZW5lcmljIGNvZGUgZnVydGhlciBkb3duLiAtLSBQRk0uCkBAIC0xNTEsNyArMTQ4LDYgQEAKIAkJCQkJIHBjaV9kZXZmbiwKIAkJCQkJIGJhciwKIAkJCQkJIGJhcl9hZGRyKTsKLSNlbmRpZgogCiAJCS8qIElmIEJBUiBpcyBub3QgaW1wbGVtZW50ZWQgZ28gdG8gdGhlIG5leHQgQkFSICovCiAJCWlmICghYmFyX3Jlc3BvbnNlKQpAQCAtMTc3LDcgKzE3Myw3IEBACiAJCQkgICAgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NCkKIAkJCQlmb3VuZF9tZW02NCA9IDE7CiAKLQkJCWFkZHJfbWFzayA9IFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CQkKKwkJCWFkZHJfbWFzayA9IFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CiAJCQl1cHBlcl9saW1pdCA9ICZwY2lhdXRvX3VwcGVyX21lbXNwYzsKIAkJCWxvd2VyX2xpbWl0ID0gJnBjaWF1dG9fbG93ZXJfbWVtc3BjOwogCQkJREJHKCIgICAgICAgIE1lbSIpOwpAQCAtMTkzLDIyICsxODksMjIgQEAKIAkJaWYgKChiYXJfdmFsdWUgKyBiYXJfc2l6ZSkgPiAqdXBwZXJfbGltaXQpIHsKIAkJCWlmIChiYXJfcmVzcG9uc2UgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSB7CiAJCQkJaWYgKGlvX3Jlc291cmNlX2ludXNlLT5jaGlsZCkgewotCQkJCQlpb19yZXNvdXJjZV9pbnVzZSA9IAorCQkJCQlpb19yZXNvdXJjZV9pbnVzZSA9CiAJCQkJCQlpb19yZXNvdXJjZV9pbnVzZS0+Y2hpbGQ7Ci0JCQkJCXBjaWF1dG9fbG93ZXJfaW9zcGMgPSAKKwkJCQkJcGNpYXV0b19sb3dlcl9pb3NwYyA9CiAJCQkJCQlpb19yZXNvdXJjZV9pbnVzZS0+c3RhcnQ7Ci0JCQkJCXBjaWF1dG9fdXBwZXJfaW9zcGMgPSAKKwkJCQkJcGNpYXV0b191cHBlcl9pb3NwYyA9CiAJCQkJCQlpb19yZXNvdXJjZV9pbnVzZS0+ZW5kICsgMTsKIAkJCQkJZ290byByZXRyeTsKIAkJCQl9CiAKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKG1lbV9yZXNvdXJjZV9pbnVzZS0+Y2hpbGQpIHsKLQkJCQkJbWVtX3Jlc291cmNlX2ludXNlID0gCisJCQkJCW1lbV9yZXNvdXJjZV9pbnVzZSA9CiAJCQkJCQltZW1fcmVzb3VyY2VfaW51c2UtPmNoaWxkOwotCQkJCQlwY2lhdXRvX2xvd2VyX21lbXNwYyA9IAorCQkJCQlwY2lhdXRvX2xvd2VyX21lbXNwYyA9CiAJCQkJCQltZW1fcmVzb3VyY2VfaW51c2UtPnN0YXJ0OwotCQkJCQlwY2lhdXRvX3VwcGVyX21lbXNwYyA9IAorCQkJCQlwY2lhdXRvX3VwcGVyX21lbXNwYyA9CiAJCQkJCQltZW1fcmVzb3VyY2VfaW51c2UtPmVuZCArIDE7CiAJCQkJCWdvdG8gcmV0cnk7CiAJCQkJfQpAQCAtMjMwLDcgKzIyNiw3IEBACiAJCSAqIElmIHdlIGFyZSBhIDY0LWJpdCBkZWNvZGVyIHRoZW4gaW5jcmVtZW50IHRvIHRoZQogCQkgKiB1cHBlciAzMiBiaXRzIG9mIHRoZSBiYXIgYW5kIGZvcmNlIGl0IHRvIGxvY2F0ZQogCQkgKiBpbiB0aGUgbG93ZXIgNEdCIG9mIG1lbW9yeS4KLQkJICovIAorCQkgKi8KIAkJaWYgKGZvdW5kX21lbTY0KSB7CiAJCQliYXIgKz0gNDsKIAkJCWVhcmx5X3dyaXRlX2NvbmZpZ19kd29yZChob3NlLCB0b3BfYnVzLApAQCAtMzYyLDcgKzM1OCw2IEBACiB7CiAJdTMyIHRlbXA7CiAKLSNpZiAhZGVmaW5lZChDT05GSUdfU0hfSFM3NzUxUlZPSVApICYmICFkZWZpbmVkKENPTkZJR19TSF9SVFM3NzUxUjJEKQogCS8qCiAJICogW2pzdW5dIHdlIGFsd2F5cyBidW1wIHVwIGJhc2VsaW5lcyBhIGxpdHRsZSwgc28gdGhhdCBpZiB0aGVyZQogCSAqIG5vdGhpbmcgYmVoaW5kIFAyUCBicmlkZ2UsIHdlIGRvbid0IHdpbmQgdXAgb3ZlcmxhcHBpbmcgSU8vTUVNCkBAIC0zNzAsNyArMzY1LDYgQEAKIAkgKi8KIAlwY2lhdXRvX2xvd2VyX21lbXNwYyArPSAxOwogCXBjaWF1dG9fbG93ZXJfaW9zcGMgKz0gMTsKLSNlbmRpZgogCiAJLyoKIAkgKiBDb25maWd1cmUgc3Vib3JkaW5hdGUgYnVzIG51bWJlci4gIFRoZSBQQ0kgc3Vic3lzdGVtCkBAIC0zOTYsMTEgKzM5MCw2IEBACiAJICogY29uZmlndXJlZCBieSB0aGlzIHJvdXRpbmUgdG8gaGFwcGlseSBsaXZlIGJlaGluZCBhCiAJICogUDJQIGJyaWRnZSBpbiBhIHN5c3RlbS4KIAkgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19TSF9IUzc3NTFSVk9JUCkgfHwgZGVmaW5lZChDT05GSUdfU0hfUlRTNzc1MVIyRCkKLQlwY2lhdXRvX2xvd2VyX21lbXNwYyArPSAweDAwNDAwMDAwOwotCXBjaWF1dG9fbG93ZXJfaW9zcGMgKz0gMHgwMDAwNDAwMDsKLSNlbmRpZgotCiAJLyogQWxpZ24gbWVtb3J5IGFuZCBJL08gdG8gNEtCIGFuZCA0IGJ5dGUgYm91bmRhcmllcy4gKi8KIAlwY2lhdXRvX2xvd2VyX21lbXNwYyA9IChwY2lhdXRvX2xvd2VyX21lbXNwYyArICgweDEwMDAgLSAxKSkKIAkJJiB+KDB4MTAwMCAtIDEpOwpAQCAtNDMzLDEyICs0MjIsMTIgQEAKIAlpbnQgZGV2Zm5fc3RvcCA9IDB4ZmY7CiAKIAlzdWJfYnVzID0gY3VycmVudF9idXM7Ci0JCisKIAlpZiAoaG9zZS0+Zmlyc3RfZGV2Zm4pCiAJCWRldmZuX3N0YXJ0ID0gaG9zZS0+Zmlyc3RfZGV2Zm47CiAJaWYgKGhvc2UtPmxhc3RfZGV2Zm4pCiAJCWRldmZuX3N0b3AgPSBob3NlLT5sYXN0X2RldmZuOwotCQorCiAJZm9yIChwY2lfZGV2Zm49ZGV2Zm5fc3RhcnQ7IHBjaV9kZXZmbjxkZXZmbl9zdG9wOyBwY2lfZGV2Zm4rKykgewogCiAJCWlmIChQQ0lfRlVOQyhwY2lfZGV2Zm4pICYmICFmb3VuZF9tdWx0aSkKQEAgLTQ3MSw5ICs0NjAsNiBAQAogCQlpZiAoKHBjaV9jbGFzcyA+PiAxNikgPT0gUENJX0NMQVNTX0JSSURHRV9QQ0kpIHsKIAkJCURCRygiICAgICAgICBCcmlkZ2U6IHByaW1hcnk9JS4yeCwgc2Vjb25kYXJ5PSUuMnhcbiIsCiAJCQkJY3VycmVudF9idXMsIHN1Yl9idXMgKyAxKTsKLSNpZiBkZWZpbmVkKENPTkZJR19TSF9IUzc3NTFSVk9JUCkgfHwgZGVmaW5lZChDT05GSUdfU0hfUlRTNzc1MVIyRCkKLQkJCXBjaWF1dG9fc2V0dXBfYmFycyhob3NlLCB0b3BfYnVzLCBjdXJyZW50X2J1cywgcGNpX2RldmZuLCBQQ0lfQkFTRV9BRERSRVNTXzEpOwotI2VuZGlmCiAJCQlwY2lhdXRvX3ByZXNjYW5fc2V0dXBfYnJpZGdlKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLAogCQkJCQkJICAgICBwY2lfZGV2Zm4sIHN1Yl9idXMpOwogCQkJREJHKCJTY2FubmluZyBzdWIgYnVzICUuMngsIEkvTyAweCUuOHgsIE1lbSAweCUuOHhcbiIsCkBAIC00OTAsMTAgKzQ3NiwxMCBAQAogCQkJREJHKCJQQ0kgQXV0b2NvbmZpZzogRm91bmQgQ2FyZEJ1cyBicmlkZ2UsIGRldmljZSAlZCBmdW5jdGlvbiAlZFxuIiwgUENJX1NMT1QocGNpX2RldmZuKSwgUENJX0ZVTkMocGNpX2RldmZuKSk7CiAJCQkvKiBQbGFjZSBDYXJkQnVzIFNvY2tldC9FeENBIHJlZ2lzdGVycyAqLwogCQkJcGNpYXV0b19zZXR1cF9iYXJzKGhvc2UsIHRvcF9idXMsIGN1cnJlbnRfYnVzLCBwY2lfZGV2Zm4sIFBDSV9CQVNFX0FERFJFU1NfMCk7Ci0gCisKIAkJCXBjaWF1dG9fcHJlc2Nhbl9zZXR1cF9jYXJkYnVzX2JyaWRnZShob3NlLCB0b3BfYnVzLAogCQkJCQljdXJyZW50X2J1cywgcGNpX2RldmZuLCBzdWJfYnVzKTsKLSAKKwogCQkJREJHKCJTY2FubmluZyBzdWIgYnVzICUuMngsIEkvTyAweCUuOHgsIE1lbSAweCUuOHhcbiIsCiAJCQkJc3ViX2J1cyArIDEsCiAJCQkJcGNpYXV0b19sb3dlcl9pb3NwYywgcGNpYXV0b19sb3dlcl9tZW1zcGMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g0LmggYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTYxZDYwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g0LmgKQEAgLTAsMCArMSwxODAgQEAKKyNpZm5kZWYgX19QQ0lfU0g0X0gKKyNkZWZpbmUgX19QQ0lfU0g0X0gKKworI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAKKyNpbmNsdWRlICJwY2ktc2g3NzgwLmgiCisjZWxzZQorI2luY2x1ZGUgInBjaS1zaDc3NTEuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIHN0YXJ0dXAgdmFsdWVzICovCisjZGVmaW5lIFBDSV9QUk9CRV9CSU9TCQkxCisjZGVmaW5lIFBDSV9QUk9CRV9DT05GMQkJMgorI2RlZmluZSBQQ0lfUFJPQkVfQ09ORjIJCTQKKyNkZWZpbmUgUENJX05PX1NPUlQJCTB4MTAwCisjZGVmaW5lIFBDSV9CSU9TX1NPUlQJCTB4MjAwCisjZGVmaW5lIFBDSV9OT19DSEVDS1MJCTB4NDAwCisjZGVmaW5lIFBDSV9BU1NJR05fUk9NUwkJMHgxMDAwCisjZGVmaW5lIFBDSV9CSU9TX0lSUV9TQ0FOCTB4MjAwMAorCisjZGVmaW5lIFNINF9QQ0lDUgkJMHgxMDAJCS8qIFBDSSBDb250cm9sIFJlZ2lzdGVyICovCisgICNkZWZpbmUgU0g0X1BDSUNSX1BSRUZJWAkgIDB4QTUwMDAwMDAJLyogQ1IgcHJlZml4IGZvciB3cml0ZSAqLworICAjZGVmaW5lIFNINF9QQ0lDUl9GVE8JCSAgMHgwMDAwMDQwMAkvKiBUUkRZL0lSRFkgRW5hYmxlICovCisgICNkZWZpbmUgU0g0X1BDSUNSX1RSU0IJICAweDAwMDAwMjAwCS8qIFRhcmdldCBSZWFkIFNpbmdsZSAqLworICAjZGVmaW5lIFNINF9QQ0lDUl9CU1dQCSAgMHgwMDAwMDEwMAkvKiBUYXJnZXQgQnl0ZSBTd2FwICovCisgICNkZWZpbmUgU0g0X1BDSUNSX1BMVVAJICAweDAwMDAwMDgwCS8qIEVuYWJsZSBQQ0kgUHVsbHVwICovCisgICNkZWZpbmUgU0g0X1BDSUNSX0FSQk0JICAweDAwMDAwMDQwCS8qIFBDSSBBcmJpdHJhdGlvbiBNb2RlICovCisgICNkZWZpbmUgU0g0X1BDSUNSX01ECQkgIDB4MDAwMDAwMzAJLyogTUQ5IGFuZCBNRDEwIHN0YXR1cyAqLworICAjZGVmaW5lIFNINF9QQ0lDUl9TRVJSCSAgMHgwMDAwMDAwOAkvKiBTRVJSIG91dHB1dCBhc3NlcnQgKi8KKyAgI2RlZmluZSBTSDRfUENJQ1JfSU5UQQkgIDB4MDAwMDAwMDQJLyogSU5UQSBvdXRwdXQgYXNzZXJ0ICovCisgICNkZWZpbmUgU0g0X1BDSUNSX1BSU1QJICAweDAwMDAwMDAyCS8qIFBDSSBSZXNldCBBc3NlcnQgKi8KKyAgI2RlZmluZSBTSDRfUENJQ1JfQ0ZJTgkgIDB4MDAwMDAwMDEJLyogQ2VudHJhbCBGdW4uIEluaXQgRG9uZSAqLworI2RlZmluZSBTSDRfUENJTFNSMAkJMHgxMDQJCS8qIFBDSSBMb2NhbCBTcGFjZSBSZWdpc3RlcjAgKi8KKyNkZWZpbmUgU0g0X1BDSUxTUjEJCTB4MTA4CQkvKiBQQ0kgTG9jYWwgU3BhY2UgUmVnaXN0ZXIxICovCisjZGVmaW5lIFNINF9QQ0lMQVIwCQkweDEwQwkJLyogUENJIExvY2FsIEFkZHIgUmVnaXN0ZXIxICovCisjZGVmaW5lIFNINF9QQ0lMQVIxCQkweDExMAkJLyogUENJIExvY2FsIEFkZHIgUmVnaXN0ZXIxICovCisjZGVmaW5lIFNINF9QQ0lJTlQJCTB4MTE0CQkvKiBQQ0kgSW50ZXJydXB0IFJlZ2lzdGVyICovCisgICNkZWZpbmUgU0g0X1BDSUlOVF9NTENLCSAgMHgwMDAwODAwMAkvKiBNYXN0ZXIgTG9jayBFcnJvciAqLworICAjZGVmaW5lIFNINF9QQ0lJTlRfVEFCVAkgIDB4MDAwMDQwMDAJLyogVGFyZ2V0IEFib3J0IEVycm9yICovCisgICNkZWZpbmUgU0g0X1BDSUlOVF9UUkVUCSAgMHgwMDAwMDIwMAkvKiBUYXJnZXQgUmV0cnkgRXJyb3IgKi8KKyAgI2RlZmluZSBTSDRfUENJSU5UX01GREUJICAweDAwMDAwMTAwCS8qIE1hc3RlciBGdW5jLiBEaXNhYmxlIEVycm9yICovCisgICNkZWZpbmUgU0g0X1BDSUlOVF9QUlRZCSAgMHgwMDAwMDA4MAkvKiBBZGRyZXNzIFBhcml0eSBFcnJvciAqLworICAjZGVmaW5lIFNINF9QQ0lJTlRfU0VSUgkgIDB4MDAwMDAwNDAJLyogU0VSUiBEZXRlY3Rpb24gRXJyb3IgKi8KKyAgI2RlZmluZSBTSDRfUENJSU5UX1RXRFAJICAweDAwMDAwMDIwCS8qIFRndC4gV3JpdGUgUGFyaXR5IEVycm9yICovCisgICNkZWZpbmUgU0g0X1BDSUlOVF9UUkRQCSAgMHgwMDAwMDAxMAkvKiBUZ3QuIFJlYWQgUGFyaXR5IEVyciBEZXQuICovCisgICNkZWZpbmUgU0g0X1BDSUlOVF9NVEFCVAkgIDB4MDAwMDAwMDgJLyogTWFzdGVyLVRndC4gQWJvcnQgRXJyb3IgKi8KKyAgI2RlZmluZSBTSDRfUENJSU5UX01NQUJUCSAgMHgwMDAwMDAwNAkvKiBNYXN0ZXItTWFzdGVyIEFib3J0IEVycm9yICovCisgICNkZWZpbmUgU0g0X1BDSUlOVF9NV1BECSAgMHgwMDAwMDAwMgkvKiBNYXN0ZXIgV3JpdGUgUEVSUiBEZXRlY3QgKi8KKyAgI2RlZmluZSBTSDRfUENJSU5UX01SUEQJICAweDAwMDAwMDAxCS8qIE1hc3RlciBSZWFkIFBFUlIgRGV0ZWN0ICovCisjZGVmaW5lIFNINF9QQ0lJTlRNCQkweDExOAkJLyogUENJIEludGVycnVwdCBNYXNrICovCisjZGVmaW5lIFNINF9QQ0lBTFIJCTB4MTFDCQkvKiBFcnJvciBBZGRyZXNzIFJlZ2lzdGVyICovCisjZGVmaW5lIFNINF9QQ0lDTFIJCTB4MTIwCQkvKiBFcnJvciBDb21tYW5kL0RhdGEgKi8KKyAgI2RlZmluZSBTSDRfUENJQ0xSX01QSU8JICAweDgwMDAwMDAwCisgICNkZWZpbmUgU0g0X1BDSUNMUl9NRE1BMAkgIDB4NDAwMDAwMDAJLyogRE1BMCBUcmFuc2ZlciBFcnJvciAqLworICAjZGVmaW5lIFNINF9QQ0lDTFJfTURNQTEJICAweDIwMDAwMDAwCS8qIERNQTEgVHJhbnNmZXIgRXJyb3IgKi8KKyAgI2RlZmluZSBTSDRfUENJQ0xSX01ETUEyCSAgMHgxMDAwMDAwMAkvKiBETUEyIFRyYW5zZmVyIEVycm9yICovCisgICNkZWZpbmUgU0g0X1BDSUNMUl9NRE1BMwkgIDB4MDgwMDAwMDAJLyogRE1BMyBUcmFuc2ZlciBFcnJvciAqLworICAjZGVmaW5lIFNINF9QQ0lDTFJfVEdUCSAgMHgwNDAwMDAwMAkvKiBUYXJnZXQgVHJhbnNmZXIgRXJyb3IgKi8KKyAgI2RlZmluZSBTSDRfUENJQ0xSX0NNREwJICAweDAwMDAwMDBGCS8qIFBDSSBDb21tYW5kIGF0IEVycm9yICovCisjZGVmaW5lIFNINF9QQ0lBSU5UCQkweDEzMAkJLyogQXJiaXRlciBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KKyAgI2RlZmluZSBTSDRfUENJQUlOVF9NQktOCSAgMHgwMDAwMjAwMAkvKiBNYXN0ZXIgQnJva2VuIEludGVycnVwdCAqLworICAjZGVmaW5lIFNINF9QQ0lBSU5UX1RCVE8JICAweDAwMDAxMDAwCS8qIFRhcmdldCBCdXMgVGltZSBPdXQgKi8KKyAgI2RlZmluZSBTSDRfUENJQUlOVF9NQlRPCSAgMHgwMDAwMTAwMAkvKiBNYXN0ZXIgQnVzIFRpbWUgT3V0ICovCisgICNkZWZpbmUgU0g0X1BDSUFJTlRfVEFCVAkgIDB4MDAwMDAwMDgJLyogVGFyZ2V0IEFib3J0ICovCisgICNkZWZpbmUgU0g0X1BDSUFJTlRfTUFCVAkgIDB4MDAwMDAwMDQJLyogTWFzdGVyIEFib3J0ICovCisgICNkZWZpbmUgU0g0X1BDSUFJTlRfUkRQRQkgIDB4MDAwMDAwMDIJLyogUmVhZCBEYXRhIFBhcml0eSBFcnJvciAqLworICAjZGVmaW5lIFNINF9QQ0lBSU5UX1dEUEUJICAweDAwMDAwMDAxCS8qIFdyaXRlIERhdGEgUGFyaXR5IEVycm9yICovCisjZGVmaW5lIFNINF9QQ0lBSU5UTSAgICAgICAgICAgIDB4MTM0CQkvKiBBcmJpdGVyIEludC4gTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBTSDRfUENJQk1MUgkJMHgxMzgJCS8qIEVycm9yIEJ1cyBNYXN0ZXIgUmVnaXN0ZXIgKi8KKyAgI2RlZmluZSBTSDRfUENJQk1MUl9SRVE0CSAgMHgwMDAwMDAxMAkvKiBSRVE0IGJ1cyBtYXN0ZXIgYXQgZXJyb3IgKi8KKyAgI2RlZmluZSBTSDRfUENJQk1MUl9SRVEzCSAgMHgwMDAwMDAwOAkvKiBSRVEzIGJ1cyBtYXN0ZXIgYXQgZXJyb3IgKi8KKyAgI2RlZmluZSBTSDRfUENJQk1MUl9SRVEyCSAgMHgwMDAwMDAwNAkvKiBSRVEyIGJ1cyBtYXN0ZXIgYXQgZXJyb3IgKi8KKyAgI2RlZmluZSBTSDRfUENJQk1MUl9SRVExCSAgMHgwMDAwMDAwMgkvKiBSRVExIGJ1cyBtYXN0ZXIgYXQgZXJyb3IgKi8KKyAgI2RlZmluZSBTSDRfUENJQk1MUl9SRVEwCSAgMHgwMDAwMDAwMQkvKiBSRVEwIGJ1cyBtYXN0ZXIgYXQgZXJyb3IgKi8KKyNkZWZpbmUgU0g0X1BDSURNQUJUCQkweDE0MAkJLyogRE1BIFRyYW5zZmVyIEFyYi4gUmVnaXN0ZXIgKi8KKyAgI2RlZmluZSBTSDRfUENJRE1BQlRfUlJCTgkgIDB4MDAwMDAwMDEJLyogRE1BIEFyYml0b3IgUm91bmQtUm9iaW4gKi8KKyNkZWZpbmUgU0g0X1BDSURQQTAJCTB4MTgwCQkvKiBETUEwIFRyYW5zZmVyIEFkZHIuICovCisjZGVmaW5lIFNINF9QQ0lETEEwCQkweDE4NAkJLyogRE1BMCBMb2NhbCBBZGRyLiAqLworI2RlZmluZSBTSDRfUENJRFRDMAkJMHgxODgJCS8qIERNQTAgVHJhbnNmZXIgQ250LiAqLworI2RlZmluZSBTSDRfUENJRENSMAkJMHgxOEMJCS8qIERNQTAgQ29udHJvbCBSZWdpc3RlciAqLworICAjZGVmaW5lIFNINF9QQ0lEQ1JfQUxHTgkgIDB4MDAwMDA2MDAJLyogRE1BIEFsaWdubWVudCBNb2RlICovCisgICNkZWZpbmUgU0g0X1BDSURDUl9NQVNUCSAgMHgwMDAwMDEwMAkvKiBETUEgVGVybWluYXRpb24gVHlwZSAqLworICAjZGVmaW5lIFNINF9QQ0lEQ1JfSU5UTQkgIDB4MDAwMDAwODAJLyogRE1BIEludGVycnVwdCBEb25lIE1hc2sqLworICAjZGVmaW5lIFNINF9QQ0lEQ1JfSU5UUwkgIDB4MDAwMDAwNDAJLyogRE1BIEludGVycnVwdCBEb25lIFN0YXR1cyAqLworICAjZGVmaW5lIFNINF9QQ0lEQ1JfTEhMRAkgIDB4MDAwMDAwMjAJLyogTG9jYWwgQWRkcmVzcyBDb250cm9sICovCisgICNkZWZpbmUgU0g0X1BDSURDUl9QSExECSAgMHgwMDAwMDAxMAkvKiBQQ0kgQWRkcmVzcyBDb250cm9sKi8KKyAgI2RlZmluZSBTSDRfUENJRENSX0lPU0VMCSAgMHgwMDAwMDAwOAkvKiBQQ0kgQWRkcmVzcyBTcGFjZSBUeXBlICovCisgICNkZWZpbmUgU0g0X1BDSURDUl9ESVIJICAweDAwMDAwMDA0CS8qIERNQSBUcmFuc2ZlciBEaXJlY3Rpb24gKi8KKyAgI2RlZmluZSBTSDRfUENJRENSX1NUT1AJICAweDAwMDAwMDAyCS8qIEZvcmNlIERNQSBTdG9wICovCisgICNkZWZpbmUgU0g0X1BDSURDUl9TVFJUCSAgMHgwMDAwMDAwMQkvKiBETUEgU3RhcnQgKi8KKyNkZWZpbmUgU0g0X1BDSURQQTEJCTB4MTkwCQkvKiBETUExIFRyYW5zZmVyIEFkZHIuICovCisjZGVmaW5lIFNINF9QQ0lETEExCQkweDE5NAkJLyogRE1BMSBMb2NhbCBBZGRyLiAqLworI2RlZmluZSBTSDRfUENJRFRDMQkJMHgxOTgJCS8qIERNQTEgVHJhbnNmZXIgQ250LiAqLworI2RlZmluZSBTSDRfUENJRENSMQkJMHgxOUMJCS8qIERNQTEgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBTSDRfUENJRFBBMgkJMHgxQTAJCS8qIERNQTIgVHJhbnNmZXIgQWRkci4gKi8KKyNkZWZpbmUgU0g0X1BDSURMQTIJCTB4MUE0CQkvKiBETUEyIExvY2FsIEFkZHIuICovCisjZGVmaW5lIFNINF9QQ0lEVEMyCQkweDFBOAkJLyogRE1BMiBUcmFuc2ZlciBDbnQuICovCisjZGVmaW5lIFNINF9QQ0lEQ1IyCQkweDFBQwkJLyogRE1BMiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFNINF9QQ0lEUEEzCQkweDFCMAkJLyogRE1BMyBUcmFuc2ZlciBBZGRyLiAqLworI2RlZmluZSBTSDRfUENJRExBMwkJMHgxQjQJCS8qIERNQTMgTG9jYWwgQWRkci4gKi8KKyNkZWZpbmUgU0g0X1BDSURUQzMJCTB4MUI4CQkvKiBETUEzIFRyYW5zZmVyIENudC4gKi8KKyNkZWZpbmUgU0g0X1BDSURDUjMJCTB4MUJDCQkvKiBETUEzIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0g0X1BDSVBBUgkJMHgxQzAJCS8qIFBJTyBBZGRyZXNzIFJlZ2lzdGVyICovCisgICNkZWZpbmUgU0g0X1BDSVBBUl9DRkdFTgkgIDB4ODAwMDAwMDAJLyogQ29uZmlndXJhdGlvbiBFbmFibGUgKi8KKyAgI2RlZmluZSBTSDRfUENJUEFSX0JVU05PCSAgMHgwMEZGMDAwMAkvKiBDb25maWcuIEJ1cyBOdW1iZXIgKi8KKyAgI2RlZmluZSBTSDRfUENJUEFSX0RFVk5PCSAgMHgwMDAwRkYwMAkvKiBDb25maWcuIERldmljZSBOdW1iZXIgKi8KKyAgI2RlZmluZSBTSDRfUENJUEFSX1JFR0FECSAgMHgwMDAwMDBGQwkvKiBSZWdpc3RlciBBZGRyZXNzIE51bWJlciAqLworI2RlZmluZSBTSDRfUENJTUJSCQkweDFDNAkJLyogTWVtb3J5IEJhc2UgQWRkcmVzcyAqLworICAjZGVmaW5lIFNINF9QQ0lNQlJfTUFTSwkgIDB4RkYwMDAwMDAJLyogTWVtb3J5IFNwYWNlIE1hc2sgKi8KKyAgI2RlZmluZSBTSDRfUENJTUJSX0xPQ0sJICAweDAwMDAwMDAxCS8qIExvY2sgTWVtb3J5IFNwYWNlICovCisjZGVmaW5lIFNINF9QQ0lJT0JSCQkweDFDOAkJLyogSS9PIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAqLworICAjZGVmaW5lIFNINF9QQ0lJT0JSX01BU0sJICAweEZGRkMwMDAwCS8qIElPIFNwYWNlIE1hc2sgKi8KKyAgI2RlZmluZSBTSDRfUENJSU9CUl9MT0NLCSAgMHgwMDAwMDAwMQkvKiBMb2NrIElPIFNwYWNlICovCisjZGVmaW5lIFNINF9QQ0lQSU5UCQkweDFDQwkJLyogUG93ZXIgTWdtbnQgSW50LiBSZWdpc3RlciAqLworICAjZGVmaW5lIFNINF9QQ0lQSU5UX0QzCSAgMHgwMDAwMDAwMgkvKiBEMyBQd3IgTWdtdC4gSW50ZXJydXB0ICovCisgICNkZWZpbmUgU0g0X1BDSVBJTlRfRDAJICAweDAwMDAwMDAxCS8qIEQwIFB3ciBNZ210LiBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0g0X1BDSVBJTlRNCQkweDFEMAkJLyogUG93ZXIgTWdtbnQgTWFzayBSZWdpc3RlciAqLworI2RlZmluZSBTSDRfUENJQ0xLUgkJMHgxRDQJCS8qIENsb2NrIEN0cmwuIFJlZ2lzdGVyICovCisgICNkZWZpbmUgU0g0X1BDSUNMS1JfUENTVFAJICAweDAwMDAwMDAyCS8qIFBDSSBDbG9jayBTdG9wICovCisgICNkZWZpbmUgU0g0X1BDSUNMS1JfQkNTVFAJICAweDAwMDAwMDAxCS8qIEJDTEsgQ2xvY2sgU3RvcCAqLworLyogRm9yIGRlZmluaXRpb25zIG9mIEJDUiwgTUNSIHNlZSAuLi4gKi8KKyNkZWZpbmUgU0g0X1BDSUJDUjEJCTB4MUUwCQkvKiBNZW1vcnkgQkNSMSBSZWdpc3RlciAqLworICAjZGVmaW5lIFNINF9QQ0lNQlIwCQlTSDRfUENJQkNSMQorI2RlZmluZSBTSDRfUENJQkNSMgkJMHgxRTQJCS8qIE1lbW9yeSBCQ1IyIFJlZ2lzdGVyICovCisgICNkZWZpbmUgU0g0X1BDSU1CTVIwCQlTSDRfUENJQkNSMgorI2RlZmluZSBTSDRfUENJV0NSMQkJMHgxRTgJCS8qIFdhaXQgQ29udHJvbCAxIFJlZ2lzdGVyICovCisjZGVmaW5lIFNINF9QQ0lXQ1IyCQkweDFFQwkJLyogV2FpdCBDb250cm9sIDIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0g0X1BDSVdDUjMJCTB4MUYwCQkvKiBXYWl0IENvbnRyb2wgMyBSZWdpc3RlciAqLworICAjZGVmaW5lIFNINF9QQ0lNQlIyCQlTSDRfUENJV0NSMworI2RlZmluZSBTSDRfUENJTUNSCQkweDFGNAkJLyogTWVtb3J5IENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU0g0X1BDSUJDUjMJCTB4MWY4CQkvKiBNZW1vcnkgQkNSMyBSZWdpc3RlciAqLworI2RlZmluZSBTSDRfUENJUENUUiAgICAgICAgICAgICAweDIwMAkJLyogUG9ydCBDb250cm9sIFJlZ2lzdGVyICovCisgICNkZWZpbmUgU0g0X1BDSVBDVFJfUDJFTgkgIDB4MDAwNDAwMDAwCS8qIFBvcnQgMiBFbmFibGUgKi8KKyAgI2RlZmluZSBTSDRfUENJUENUUl9QMUVOCSAgMHgwMDAyMDAwMDAJLyogUG9ydCAxIEVuYWJsZSAqLworICAjZGVmaW5lIFNINF9QQ0lQQ1RSX1AwRU4JICAweDAwMDEwMDAwMAkvKiBQb3J0IDAgRW5hYmxlICovCisgICNkZWZpbmUgU0g0X1BDSVBDVFJfUDJVUAkgIDB4MDAwMDAwMDIwCS8qIFBvcnQyIFB1bGwgVXAgRW5hYmxlICovCisgICNkZWZpbmUgU0g0X1BDSVBDVFJfUDJJTwkgIDB4MDAwMDAwMDEwCS8qIFBvcnQyIE91dHB1dCBFbmFibGUgKi8KKyAgI2RlZmluZSBTSDRfUENJUENUUl9QMVVQCSAgMHgwMDAwMDAwMDgJLyogUG9ydDEgUHVsbCBVcCBFbmFibGUgKi8KKyAgI2RlZmluZSBTSDRfUENJUENUUl9QMUlPCSAgMHgwMDAwMDAwMDQJLyogUG9ydDEgT3V0cHV0IEVuYWJsZSAqLworICAjZGVmaW5lIFNINF9QQ0lQQ1RSX1AwVVAJICAweDAwMDAwMDAwMgkvKiBQb3J0MCBQdWxsIFVwIEVuYWJsZSAqLworICAjZGVmaW5lIFNINF9QQ0lQQ1RSX1AwSU8JICAweDAwMDAwMDAwMQkvKiBQb3J0MCBPdXRwdXQgRW5hYmxlICovCisjZGVmaW5lIFNINF9QQ0lQRFRSCQkweDIwNAkJLyogUG9ydCBEYXRhIFJlZ2lzdGVyICovCisgICNkZWZpbmUgU0g0X1BDSVBEVFJfUEI1CSAgMHgwMDAwMDAwMjAJLyogUG9ydCA1IEVuYWJsZSAqLworICAjZGVmaW5lIFNINF9QQ0lQRFRSX1BCNAkgIDB4MDAwMDAwMDEwCS8qIFBvcnQgNCBFbmFibGUgKi8KKyAgI2RlZmluZSBTSDRfUENJUERUUl9QQjMJICAweDAwMDAwMDAwOAkvKiBQb3J0IDMgRW5hYmxlICovCisgICNkZWZpbmUgU0g0X1BDSVBEVFJfUEIyCSAgMHgwMDAwMDAwMDQJLyogUG9ydCAyIEVuYWJsZSAqLworICAjZGVmaW5lIFNINF9QQ0lQRFRSX1BCMQkgIDB4MDAwMDAwMDAyCS8qIFBvcnQgMSBFbmFibGUgKi8KKyAgI2RlZmluZSBTSDRfUENJUERUUl9QQjAJICAweDAwMDAwMDAwMQkvKiBQb3J0IDAgRW5hYmxlICovCisjZGVmaW5lIFNINF9QQ0lQRFIJCTB4MjIwCQkvKiBQb3J0IElPIERhdGEgUmVnaXN0ZXIgKi8KKworLyogRmxhZ3MgKi8KKyNkZWZpbmUgU0g0X1BDSUNfTk9fUkVTRVQJMHgwMDAxCisKKy8qIGFyY2gvc2gva2VybmVsL2RyaXZlcnMvcGNpL29wcy1zaDQuYyAqLworZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIHNoNF9wY2lfb3BzOworaW50IHNoNF9wY2lfY2hlY2tfZGlyZWN0KHZvaWQpOworaW50IHBjaV9maXh1cF9wY2ljKHZvaWQpOworCitzdHJ1Y3Qgc2g0X3BjaV9hZGRyZXNzX3NwYWNlIHsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJdW5zaWduZWQgbG9uZyBzaXplOworfTsKKworc3RydWN0IHNoNF9wY2lfYWRkcmVzc19tYXAgeworCXN0cnVjdCBzaDRfcGNpX2FkZHJlc3Nfc3BhY2Ugd2luZG93MDsKKwlzdHJ1Y3Qgc2g0X3BjaV9hZGRyZXNzX3NwYWNlIHdpbmRvdzE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwY2lfd3JpdGVfcmVnKHVuc2lnbmVkIGxvbmcgdmFsLCB1bnNpZ25lZCBsb25nIHJlZykKK3sKKwlvdXRsKHZhbCwgUENJX1JFRyhyZWcpKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBjaV9yZWFkX3JlZyh1bnNpZ25lZCBsb25nIHJlZykKK3sKKwlyZXR1cm4gaW5sKFBDSV9SRUcocmVnKSk7Cit9CisjZW5kaWYgLyogX19QQ0lfU0g0X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNzc1MS5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzUxLmMKaW5kZXggNjgyZjNkYS4uZGJlODM3OCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzUxLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzUxLmMKQEAgLTE1LDE4MCArMTUsMTQgQEAKIAogI3VuZGVmIERFQlVHCiAKLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KKyNpbmNsdWRlICJwY2ktc2g0LmgiCisjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgInBjaS1zaDc3NTEuaCIKLQotc3RhdGljIHVuc2lnbmVkIGludCBwY2lfcHJvYmUgPSBQQ0lfUFJPQkVfQ09ORjE7Ci1leHRlcm4gaW50IHBjaV9maXh1cF9wY2ljKHZvaWQpOwotCi12b2lkIHBjaWJpb3NfZml4dXBfaXJxcyh2b2lkKSBfX2F0dHJpYnV0ZV9fICgod2VhaykpOwotCi0vKgotICogRGlyZWN0IGFjY2VzcyB0byBQQ0kgaGFyZHdhcmUuLi4KLSAqLwotCi0jZGVmaW5lIENPTkZJR19DTUQoYnVzLCBkZXZmbiwgd2hlcmUpICgweDgwMDAwMDAwIHwgKGJ1cy0+bnVtYmVyIDw8IDE2KSB8IChkZXZmbiA8PCA4KSB8ICh3aGVyZSAmIH4zKSkKLQotLyoKLSAqIEZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIHdpdGggdHlwZSAxIGFjY2Vzc2VzCi0gKi8KLXN0YXRpYyBpbnQgc2g3NzUxX3BjaV9yZWFkKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKLQkJCSAgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiAqdmFsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGRhdGE7Ci0KLQkvKiAKLQkgKiBQQ0lQRFIgbWF5IG9ubHkgYmUgYWNjZXNzZWQgYXMgMzIgYml0IHdvcmRzLCAKLQkgKiBzbyB3ZSBtdXN0IGRvIGJ5dGUgYWxpZ25tZW50IGJ5IGhhbmQgCi0JICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCW91dGwoQ09ORklHX0NNRChidXMsZGV2Zm4sd2hlcmUpLCBQQ0lfUkVHKFNINzc1MV9QQ0lQQVIpKTsKLQlkYXRhID0gaW5sKFBDSV9SRUcoU0g3NzUxX1BDSVBEUikpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCXN3aXRjaCAoc2l6ZSkgewotCWNhc2UgMToKLQkJKnZhbCA9IChkYXRhID4+ICgod2hlcmUgJiAzKSA8PCAzKSkgJiAweGZmOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCSp2YWwgPSAoZGF0YSA+PiAoKHdoZXJlICYgMikgPDwgMykpICYgMHhmZmZmOwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCSp2YWwgPSBkYXRhOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gUENJQklPU19GVU5DX05PVF9TVVBQT1JURUQ7Ci0JfQotCi0JcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKLX0KLQotLyogCi0gKiBTaW5jZSBTSDc3NTEgb25seSBkb2VzIDMyYml0IGFjY2VzcyB3ZSdsbCBoYXZlIHRvIGRvIGEgcmVhZCwKLSAqIG1hc2ssd3JpdGUgb3BlcmF0aW9uLgotICogV2UnbGwgYWxsb3cgYW4gb2RkIGJ5dGUgb2Zmc2V0LCB0aG91Z2ggaXQgc2hvdWxkIGJlIGlsbGVnYWwuCi0gKi8gCi1zdGF0aWMgaW50IHNoNzc1MV9wY2lfd3JpdGUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLAotCQkJICAgIGludCB3aGVyZSwgaW50IHNpemUsIHUzMiB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgc2hpZnQ7Ci0JdTMyIGRhdGE7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Jb3V0bChDT05GSUdfQ01EKGJ1cyxkZXZmbix3aGVyZSksIFBDSV9SRUcoU0g3NzUxX1BDSVBBUikpOwotCWRhdGEgPSBpbmwoUENJX1JFRyhTSDc3NTFfUENJUERSKSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0Jc3dpdGNoIChzaXplKSB7Ci0JY2FzZSAxOgotCQlzaGlmdCA9ICh3aGVyZSAmIDMpIDw8IDM7Ci0JCWRhdGEgJj0gfigweGZmIDw8IHNoaWZ0KTsKLQkJZGF0YSB8PSAoKHZhbCAmIDB4ZmYpIDw8IHNoaWZ0KTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlzaGlmdCA9ICh3aGVyZSAmIDIpIDw8IDM7Ci0JCWRhdGEgJj0gfigweGZmZmYgPDwgc2hpZnQpOwotCQlkYXRhIHw9ICgodmFsICYgMHhmZmZmKSA8PCBzaGlmdCk7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJZGF0YSA9IHZhbDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIFBDSUJJT1NfRlVOQ19OT1RfU1VQUE9SVEVEOwotCX0KLQotCW91dGwoZGF0YSwgUENJX1JFRyhTSDc3NTFfUENJUERSKSk7Ci0KLQlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOwotfQotCi0jdW5kZWYgQ09ORklHX0NNRAotCi1zdHJ1Y3QgcGNpX29wcyBzaDc3NTFfcGNpX29wcyA9IHsKLQkucmVhZCAJCT0gc2g3NzUxX3BjaV9yZWFkLAotCS53cml0ZQkJPSBzaDc3NTFfcGNpX3dyaXRlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgcGNpX2NoZWNrX2RpcmVjdCh2b2lkKQotewotCXVuc2lnbmVkIGludCB0bXAsIGlkOwotCi0JLyogY2hlY2sgZm9yIFNINzc1MS9TSDc3NTFSIGhhcmR3YXJlICovCi0JaWQgPSBpbmwoU0g3NzUxX1BDSVJFR19CQVNFK1NINzc1MV9QQ0lDT05GMCk7Ci0JaWYgKGlkICE9ICgoU0g3NzUxX0RFVklDRV9JRCA8PCAxNikgfCBTSDc3NTFfVkVORE9SX0lEKSAmJgotCSAgICBpZCAhPSAoKFNINzc1MVJfREVWSUNFX0lEIDw8IDE2KSB8IFNINzc1MV9WRU5ET1JfSUQpKSB7Ci0JCXByX2RlYnVnKCJQQ0k6IFRoaXMgaXMgbm90IGFuIFNINzc1MShSKSAoJXgpXG4iLCBpZCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qCi0JICogQ2hlY2sgaWYgY29uZmlndXJhdGlvbiB3b3Jrcy4KLQkgKi8KLQlpZiAocGNpX3Byb2JlICYgUENJX1BST0JFX0NPTkYxKSB7Ci0JCXRtcCA9IGlubCAoUENJX1JFRyhTSDc3NTFfUENJUEFSKSk7Ci0JCW91dGwgKDB4ODAwMDAwMDAsIFBDSV9SRUcoU0g3NzUxX1BDSVBBUikpOwotCQlpZiAoaW5sIChQQ0lfUkVHKFNINzc1MV9QQ0lQQVIpKSA9PSAweDgwMDAwMDAwKSB7Ci0JCQlvdXRsICh0bXAsIFBDSV9SRUcoU0g3NzUxX1BDSVBBUikpOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBVc2luZyBjb25maWd1cmF0aW9uIHR5cGUgMVxuIik7Ci0JCQlyZXF1ZXN0X3JlZ2lvbihQQ0lfUkVHKFNINzc1MV9QQ0lQQVIpLCA4LCAiUENJIGNvbmYxIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlvdXRsICh0bXAsIFBDSV9SRUcoU0g3NzUxX1BDSVBBUikpOwotCX0KLQotCXByX2RlYnVnKCJQQ0k6IHBjaV9jaGVja19kaXJlY3QgZmFpbGVkXG4iKTsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqICBIYW5kbGUgYnVzIHNjYW5uaW5nIGFuZCBmaXh1cHMgLi4uLgotICovCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBwY2lfZml4dXBfaWRlX2Jhc2VzKHN0cnVjdCBwY2lfZGV2ICpkKQotewotCWludCBpOwotCi0JLyoKLQkgKiBQQ0kgSURFIGNvbnRyb2xsZXJzIHVzZSBub24tc3RhbmRhcmQgSS9PIHBvcnQgZGVjb2RpbmcsIHJlc3BlY3QgaXQuCi0JICovCi0JaWYgKChkLT5jbGFzcyA+PiA4KSAhPSBQQ0lfQ0xBU1NfU1RPUkFHRV9JREUpCi0JCXJldHVybjsKLQlwcl9kZWJ1ZygiUENJOiBJREUgYmFzZSBhZGRyZXNzIGZpeHVwIGZvciAlc1xuIiwgcGNpX25hbWUoZCkpOwotCWZvcihpPTA7IGk8NDsgaSsrKSB7Ci0JCXN0cnVjdCByZXNvdXJjZSAqciA9ICZkLT5yZXNvdXJjZVtpXTsKLQkJaWYgKChyLT5zdGFydCAmIH4weDgwKSA9PSAweDM3NCkgewotCQkJci0+c3RhcnQgfD0gMjsKLQkJCXItPmVuZCA9IHItPnN0YXJ0OwotCQl9Ci0JfQotfQotCi1ERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2ZpeHVwX2lkZV9iYXNlcyk7Ci0KLS8qCi0gKiAgQ2FsbGVkIGFmdGVyIGVhY2ggYnVzIGlzIHByb2JlZCwgYnV0IGJlZm9yZSBpdHMgY2hpbGRyZW4KLSAqICBhcmUgZXhhbWluZWQuCi0gKi8KLQotdm9pZCBfX2luaXQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmIpCi17Ci0JcGNpX3JlYWRfYnJpZGdlX2Jhc2VzKGIpOwotfQogCiAvKgogICogSW5pdGlhbGl6YXRpb24uIFRyeSBhbGwga25vd24gUENJIGFjY2VzcyBtZXRob2RzLiBOb3RlIHRoYXQgd2Ugc3VwcG9ydApAQCAtMTk2LDI1ICszMCwyOSBAQAogICogdG8gYWNjZXNzIGNvbmZpZyBzcGFjZS4KICAqIAogICogTm90ZSB0aGF0IHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiAoQlNDIHJlZ2lzdGVycywgYW5kIG1lbW9yeQotICogc3BhY2UgbWFwcGluZykgd2lsbCBiZSBjYWxsZWQgdmlhIHRoZSBtYWNoaW5lIHZlY3RvcnMgKHNoX212Lm12X3BjaV9pbml0KCkpIGlmIGl0Ci0gKiBleGl0c3QgYW5kIHZpYSB0aGUgcGxhdGZvcm0gZGVmaW5lZCBmdW5jdGlvbiBwY2liaW9zX2luaXRfcGxhdGZvcm0oKS4gIAotICogU2VlIHBjaV9iaWdzdXIuYyBmb3IgaW1wbGVtZW50YXRpb247Ci0gKiAKLSAqIFRoZSBCSU9TIHZlcnNpb24gb2YgdGhlIHBjaSBmdW5jdGlvbnMgaXMgbm90IHlldCBpbXBsZW1lbnRlZCBidXQgaXQgaXMgbGVmdAotICogaW4gZm9yIGNvbXBsZXRlbmVzcy4gIEN1cnJlbnRseSBhbiBlcnJvciB3aWxsIGJlIGdlbmVyZWF0ZWQgYXQgY29tcGlsZSB0aW1lLiAKKyAqIHNwYWNlIG1hcHBpbmcpIHdpbGwgYmUgY2FsbGVkIHZpYSB0aGUgcGxhdGZvcm0gZGVmaW5lZCBmdW5jdGlvbgorICogcGNpYmlvc19pbml0X3BsYXRmb3JtKCkuCiAgKi8KLQogc3RhdGljIGludCBfX2luaXQgc2g3NzUxX3BjaV9pbml0KHZvaWQpCiB7CisJdW5zaWduZWQgaW50IGlkOwogCWludCByZXQ7CiAKIAlwcl9kZWJ1ZygiUENJOiBTdGFydGluZyBpbnRpYWxpemF0aW9uLlxuIik7Ci0JaWYgKChyZXQgPSBwY2lfY2hlY2tfZGlyZWN0KCkpICE9IDApCisKKwkvKiBjaGVjayBmb3IgU0g3NzUxL1NINzc1MVIgaGFyZHdhcmUgKi8KKwlpZCA9IHBjaV9yZWFkX3JlZyhTSDc3NTFfUENJQ09ORjApOworCWlmIChpZCAhPSAoKFNINzc1MV9ERVZJQ0VfSUQgPDwgMTYpIHwgU0g3NzUxX1ZFTkRPUl9JRCkgJiYKKwkgICAgaWQgIT0gKChTSDc3NTFSX0RFVklDRV9JRCA8PCAxNikgfCBTSDc3NTFfVkVORE9SX0lEKSkgeworCQlwcl9kZWJ1ZygiUENJOiBUaGlzIGlzIG5vdCBhbiBTSDc3NTEoUikgKCV4KVxuIiwgaWQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoKHJldCA9IHNoNF9wY2lfY2hlY2tfZGlyZWN0KCkpICE9IDApCiAJCXJldHVybiByZXQ7CiAKIAlyZXR1cm4gcGNpYmlvc19pbml0X3BsYXRmb3JtKCk7CiB9Ci0KIHN1YnN5c19pbml0Y2FsbChzaDc3NTFfcGNpX2luaXQpOwogCiBzdGF0aWMgaW50IF9faW5pdCBfX2FyZWFfc2RyYW1fY2hlY2sodW5zaWduZWQgaW50IGFyZWEpCkBAIC0yMjMsMjYgKzYxLDI2IEBACiAKIAl3b3JkID0gaW5sKFNINzc1MV9CQ1IxKTsKIAkvKiBjaGVjayBCQ1IgZm9yIFNEUkFNIGluIGFyZWEgKi8KLQlpZigoKHdvcmQgPj4gYXJlYSkgJiAxKSA9PSAwKSB7CisJaWYgKCgod29yZCA+PiBhcmVhKSAmIDEpID09IDApIHsKIAkJcHJpbnRrKCJQQ0k6IEFyZWEgJWQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIFNEUkFNLiBCQ1IxPTB4JXhcbiIsCiAJCSAgICAgICBhcmVhLCB3b3JkKTsKIAkJcmV0dXJuIDA7CiAJfQotCW91dGwod29yZCwgUENJX1JFRyhTSDc3NTFfUENJQkNSMSkpOworCXBjaV93cml0ZV9yZWcod29yZCwgU0g0X1BDSUJDUjEpOwogCiAJd29yZCA9ICh1MTYpaW53KFNINzc1MV9CQ1IyKTsKIAkvKiBjaGVjayBCQ1IyIGZvciAzMmJpdCBTRFJBTSBpbnRlcmZhY2UqLwotCWlmKCgod29yZCA+PiAoYXJlYSA8PCAxKSkgJiAweDMpICE9IDB4MykgeworCWlmICgoKHdvcmQgPj4gKGFyZWEgPDwgMSkpICYgMHgzKSAhPSAweDMpIHsKIAkJcHJpbnRrKCJQQ0k6IEFyZWEgJWQgaXMgbm90IDMyIGJpdCBTRFJBTS4gQkNSMj0weCV4XG4iLAogCQkgICAgICAgYXJlYSwgd29yZCk7CiAJCXJldHVybiAwOwogCX0KLQlvdXRsKHdvcmQsIFBDSV9SRUcoU0g3NzUxX1BDSUJDUjIpKTsKKwlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINF9QQ0lCQ1IyKTsKIAogCXJldHVybiAxOwogfQogCi1pbnQgX19pbml0IHNoNzc1MV9wY2ljX2luaXQoc3RydWN0IHNoNzc1MV9wY2lfYWRkcmVzc19tYXAgKm1hcCkKK2ludCBfX2luaXQgc2g3NzUxX3BjaWNfaW5pdChzdHJ1Y3Qgc2g0X3BjaV9hZGRyZXNzX21hcCAqbWFwKQogewogCXUzMiByZWc7CiAJdTMyIHdvcmQ7CkBAIC0yNTEsMzkgKzg5LDM5IEBACiAJcmVnID0gaW5sKFNINzc1MV9CQ1IxKTsKIAlyZWcgfD0gMHg4MDAwMDsKIAlvdXRsKHJlZywgU0g3NzUxX0JDUjEpOwotCQorCiAJLyogVHVybiB0aGUgY2xvY2tzIGJhY2sgb24gKG5vdCBkb25lIGluIHJlc2V0KSovCi0Jb3V0bCgwLCBQQ0lfUkVHKFNINzc1MV9QQ0lDTEtSKSk7CisJcGNpX3dyaXRlX3JlZygwLCBTSDRfUENJQ0xLUik7CiAJLyogQ2xlYXIgUG93ZXJkb3duIElSUSdzIChub3QgZG9uZSBpbiByZXNldCkgKi8KLQl3b3JkID0gU0g3NzUxX1BDSVBJTlRfRDMgfCBTSDc3NTFfUENJUElOVF9EMDsKLQlvdXRsKHdvcmQsIFBDSV9SRUcoU0g3NzUxX1BDSVBJTlQpKTsKKwl3b3JkID0gU0g0X1BDSVBJTlRfRDMgfCBTSDRfUENJUElOVF9EMDsKKwlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINF9QQ0lQSU5UKTsKIAogCS8qCiAJICogVGhpcyBjb2RlIGlzIHVudXNlZCBmb3Igc29tZSBib2FyZHMgYXMgaXQgaXMgZG9uZSBpbiB0aGUKIAkgKiBib290bG9hZGVyIGFuZCBkb2luZyBpdCBoZXJlIG1lYW5zIHRoZSBNQUMgYWRkcmVzc2VzIGxvYWRlZAogCSAqIGJ5IHRoZSBib290bG9hZGVyIGdldCBsb3N0LgogCSAqLwotCWlmICghKG1hcC0+ZmxhZ3MgJiBTSDc3NTFfUENJQ19OT19SRVNFVCkpIHsKKwlpZiAoIShtYXAtPmZsYWdzICYgU0g0X1BDSUNfTk9fUkVTRVQpKSB7CiAJCS8qIHRvZ2dsZSBQQ0kgcmVzZXQgcGluICovCi0JCXdvcmQgPSBTSDc3NTFfUENJQ1JfUFJFRklYIHwgU0g3NzUxX1BDSUNSX1BSU1Q7Ci0JCW91dGwod29yZCxQQ0lfUkVHKFNINzc1MV9QQ0lDUikpOworCQl3b3JkID0gU0g0X1BDSUNSX1BSRUZJWCB8IFNINF9QQ0lDUl9QUlNUOworCQlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINF9QQ0lDUik7CiAJCS8qIFdhaXQgZm9yIGEgbG9uZyB0aW1lLi4uIG5vdCAxIHNlYy4gYnV0IGxvbmcgZW5vdWdoICovCiAJCW1kZWxheSgxMDApOwotCQl3b3JkID0gU0g3NzUxX1BDSUNSX1BSRUZJWDsKLQkJb3V0bCh3b3JkLFBDSV9SRUcoU0g3NzUxX1BDSUNSKSk7CisJCXdvcmQgPSBTSDRfUENJQ1JfUFJFRklYOworCQlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINF9QQ0lDUik7CiAJfQotCQorCiAJLyogc2V0IHRoZSBjb21tYW5kL3N0YXR1cyBiaXRzIHRvOgogCSAqIFdhaXQgQ3ljbGUgQ29udHJvbCArIFBhcml0eSBFbmFibGUgKyBCdXMgTWFzdGVyICsKIAkgKiBNZW0gc3BhY2UgZW5hYmxlCiAJICovCiAJd29yZCA9IFNINzc1MV9QQ0lDT05GMV9XQ0MgfCBTSDc3NTFfUENJQ09ORjFfUEVSIHwgCiAJICAgICAgIFNINzc1MV9QQ0lDT05GMV9CVU0gfCBTSDc3NTFfUENJQ09ORjFfTUVTOwotCW91dGwod29yZCwgUENJX1JFRyhTSDc3NTFfUENJQ09ORjEpKTsKKwlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINzc1MV9QQ0lDT05GMSk7CiAKIAkvKiBkZWZpbmUgdGhpcyBob3N0IGFzIHRoZSBob3N0IGJyaWRnZSAqLwotCXdvcmQgPSBTSDc3NTFfUENJX0hPU1RfQlJJREdFIDw8IDI0OwotCW91dGwod29yZCwgUENJX1JFRyhTSDc3NTFfUENJQ09ORjIpKTsKKwl3b3JkID0gUENJX0JBU0VfQ0xBU1NfQlJJREdFIDw8IDI0OworCXBjaV93cml0ZV9yZWcod29yZCwgU0g3NzUxX1BDSUNPTkYyKTsKIAogCS8qIFNldCBJTyBhbmQgTWVtIHdpbmRvd3MgdG8gbG9jYWwgYWRkcmVzcyAKIAkgKiBNYWtlIFBDSSBhbmQgbG9jYWwgYWRkcmVzcyB0aGUgc2FtZSBmb3IgZWFzeSAxIHRvIDEgbWFwcGluZyAKQEAgLTI5MSw0NiArMTI5LDQ5IEBACiAJICogV2luZG93MSA9IG1hcC0+d2luZG93MS5zaXplIEAgY2FjaGVkIGFyZWEgYmFzZSA9IFNEUkFNIAogCSAqLwogCXdvcmQgPSBtYXAtPndpbmRvdzAuc2l6ZSAtIDE7Ci0Jb3V0bCh3b3JkLCBQQ0lfUkVHKFNINzc1MV9QQ0lMU1IwKSk7CisJcGNpX3dyaXRlX3JlZyh3b3JkLCBTSDRfUENJTFNSMCk7CiAJd29yZCA9IG1hcC0+d2luZG93MS5zaXplIC0gMTsKLQlvdXRsKHdvcmQsIFBDSV9SRUcoU0g3NzUxX1BDSUxTUjEpKTsKKwlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINF9QQ0lMU1IxKTsKIAkvKiBTZXQgdGhlIHZhbHVlcyBvbiB3aW5kb3cgMCBQQ0kgY29uZmlnIHJlZ2lzdGVycyAqLwogCXdvcmQgPSBQMlNFR0FERFIobWFwLT53aW5kb3cwLmJhc2UpOwotCW91dGwod29yZCwgUENJX1JFRyhTSDc3NTFfUENJTEFSMCkpOwotCW91dGwod29yZCwgUENJX1JFRyhTSDc3NTFfUENJQ09ORjUpKTsKKwlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINF9QQ0lMQVIwKTsKKwlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINzc1MV9QQ0lDT05GNSk7CiAJLyogU2V0IHRoZSB2YWx1ZXMgb24gd2luZG93IDEgUENJIGNvbmZpZyByZWdpc3RlcnMgKi8KIAl3b3JkID0gIFBIWVNBRERSKG1hcC0+d2luZG93MS5iYXNlKTsKLQlvdXRsKHdvcmQsIFBDSV9SRUcoU0g3NzUxX1BDSUxBUjEpKTsKLQlvdXRsKHdvcmQsIFBDSV9SRUcoU0g3NzUxX1BDSUNPTkY2KSk7CisJcGNpX3dyaXRlX3JlZyh3b3JkLCBTSDRfUENJTEFSMSk7CisJcGNpX3dyaXRlX3JlZyh3b3JkLCBTSDc3NTFfUENJQ09ORjYpOwogCi0JLyogU2V0IHRoZSBsb2NhbCAxNk1CIFBDSSBtZW1vcnkgc3BhY2Ugd2luZG93IHRvIAorCS8qIFNldCB0aGUgbG9jYWwgMTZNQiBQQ0kgbWVtb3J5IHNwYWNlIHdpbmRvdyB0bwogCSAqIHRoZSBsb3dlc3QgUENJIG1hcHBlZCBhZGRyZXNzCiAJICovCi0Jd29yZCA9IFBDSUJJT1NfTUlOX01FTSAmIFNINzc1MV9QQ0lNQlJfTUFTSzsKLQlQQ0lEQkcoMiwiUENJOiBTZXR0aW5nIHVwcGVyIGJpdHMgb2YgTWVtb3J5IHdpbmRvdyB0byAweCV4XG4iLCB3b3JkKTsKLQlvdXRsKHdvcmQgLCBQQ0lfUkVHKFNINzc1MV9QQ0lNQlIpKTsKKwl3b3JkID0gUENJQklPU19NSU5fTUVNICYgU0g0X1BDSU1CUl9NQVNLOworCXByX2RlYnVnKCJQQ0k6IFNldHRpbmcgdXBwZXIgYml0cyBvZiBNZW1vcnkgd2luZG93IHRvIDB4JXhcbiIsIHdvcmQpOworCXBjaV93cml0ZV9yZWcod29yZCAsIFNINF9QQ0lNQlIpOwogCiAJLyogTWFwIElPIHNwYWNlIGludG8gUENJIElPIHdpbmRvdwogCSAqIFRoZSBJTyB3aW5kb3cgaXMgNjRLLVBDSUJJT1NfTUlOX0lPIGluIHNpemUKLQkgKiBJTyBhZGRyZXNzZXMgd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRoZSAKKwkgKiBJTyBhZGRyZXNzZXMgd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRoZQogCSAqIFBDSSBJTyB3aW5kb3cgYmFzZSBhZGRyZXNzCiAJICovCi0JUENJREJHKDMsIlBDSTogTWFwcGluZyBJTyBhZGRyZXNzIDB4JXggLSAweCV4IHRvIGJhc2UgMHgleFxuIiwgUENJQklPU19NSU5fSU8sCi0JICAgICg2NCoxMDI0KSwgU0g3NzUxX1BDSV9JT19CQVNFK1BDSUJJT1NfTUlOX0lPKTsKKwlwcl9kZWJ1ZygiUENJOiBNYXBwaW5nIElPIGFkZHJlc3MgMHgleCAtIDB4JXggdG8gYmFzZSAweCV4XG4iLAorCQkgUENJQklPU19NSU5fSU8sICg2NCA8PCAxMCksCisJCSBTSDRfUENJX0lPX0JBU0UgKyBQQ0lCSU9TX01JTl9JTyk7CiAKLQkvKiAKKwkvKgogCSAqIFhYWDogRm9yIG5vdywgbGVhdmUgdGhpcyBib2FyZC1zcGVjaWZpYy4gSW4gdGhlIGV2ZW50IHdlIGhhdmUgb3RoZXIKIAkgKiBib2FyZHMgdGhhdCBuZWVkIHRvIGRvIHNpbWlsYXIgd29yaywgdGhpcyBjYW4gYmUgd3JhcHBlZC4KIAkgKi8KICNpZmRlZiBDT05GSUdfU0hfQklHU1VSCi0JYmlnc3VyX3BvcnRfbWFwKFBDSUJJT1NfTUlOX0lPLCAoNjQqMTAyNCksIFNINzc1MV9QQ0lfSU9fQkFTRStQQ0lCSU9TX01JTl9JTywwKTsKKwliaWdzdXJfcG9ydF9tYXAoUENJQklPU19NSU5fSU8sICg2NCA8PCAxMCksCisJCQlTSDRfUENJX0lPX0JBU0UgKyBQQ0lCSU9TX01JTl9JTywgMCk7CiAjZW5kaWYKIAotCS8qIE1ha2Ugc3VyZSB0aGUgTVNCJ3Mgb2YgSU8gd2luZG93IGFyZSBzZXQgdG8gYWNjZXNzIFBDSSBzcGFjZSBjb3JyZWN0bHkgKi8KLQl3b3JkID0gUENJQklPU19NSU5fSU8gJiBTSDc3NTFfUENJSU9CUl9NQVNLOwotCVBDSURCRygyLCJQQ0k6IFNldHRpbmcgdXBwZXIgYml0cyBvZiBJTyB3aW5kb3cgdG8gMHgleFxuIiwgd29yZCk7Ci0Jb3V0bCh3b3JkLCBQQ0lfUkVHKFNINzc1MV9QQ0lJT0JSKSk7Ci0JCisJLyogTWFrZSBzdXJlIHRoZSBNU0IncyBvZiBJTyB3aW5kb3cgYXJlIHNldCB0byBhY2Nlc3MgUENJIHNwYWNlCisJICogY29ycmVjdGx5ICovCisJd29yZCA9IFBDSUJJT1NfTUlOX0lPICYgU0g0X1BDSUlPQlJfTUFTSzsKKwlwcl9kZWJ1ZygiUENJOiBTZXR0aW5nIHVwcGVyIGJpdHMgb2YgSU8gd2luZG93IHRvIDB4JXhcbiIsIHdvcmQpOworCXBjaV93cml0ZV9yZWcod29yZCwgU0g0X1BDSUlPQlIpOworCiAJLyogU2V0IFBDSSBXQ1J4LCBCQ1J4J3MsIGNvcHkgZnJvbSBCU0MgbG9jYXRpb25zICovCiAKIAkvKiBjaGVjayBCQ1IgZm9yIFNEUkFNIGluIHNwZWNpZmllZCBhcmVhICovCkBAIC0zNDksMTMgKzE5MCwxMyBAQAogCiAJLyogY29uZmlndXJlIHRoZSB3YWl0IGNvbnRyb2wgcmVnaXN0ZXJzICovCiAJd29yZCA9IGlubChTSDc3NTFfV0NSMSk7Ci0Jb3V0bCh3b3JkLCBQQ0lfUkVHKFNINzc1MV9QQ0lXQ1IxKSk7CisJcGNpX3dyaXRlX3JlZyh3b3JkLCBTSDRfUENJV0NSMSk7CiAJd29yZCA9IGlubChTSDc3NTFfV0NSMik7Ci0Jb3V0bCh3b3JkLCBQQ0lfUkVHKFNINzc1MV9QQ0lXQ1IyKSk7CisJcGNpX3dyaXRlX3JlZyh3b3JkLCBTSDRfUENJV0NSMik7CiAJd29yZCA9IGlubChTSDc3NTFfV0NSMyk7Ci0Jb3V0bCh3b3JkLCBQQ0lfUkVHKFNINzc1MV9QQ0lXQ1IzKSk7CisJcGNpX3dyaXRlX3JlZyh3b3JkLCBTSDRfUENJV0NSMyk7CiAJd29yZCA9IGlubChTSDc3NTFfTUNSKTsKLQlvdXRsKHdvcmQsIFBDSV9SRUcoU0g3NzUxX1BDSU1DUikpOworCXBjaV93cml0ZV9yZWcod29yZCwgU0g0X1BDSU1DUik7CiAKIAkvKiBOT1RFOiBJJ20gaWdub3JpbmcgdGhlIFBDSSBlcnJvciBJUlFzIGZvciBub3cuLgogCSAqIFRPRE86IGFkZCBzdXBwb3J0IGZvciB0aGUgaW50ZXJuYWwgZXJyb3IgaW50ZXJydXB0cyBhbmQKQEAgLTM2OCw0OSArMjA5LDggQEAKIAogCS8qIFNINzc1MSBpbml0IGRvbmUsIHNldCBjZW50cmFsIGZ1bmN0aW9uIGluaXQgY29tcGxldGUgKi8KIAkvKiB1c2Ugcm91bmQgcm9iaW4gbW9kZSB0byBzdG9wIGEgZGV2aWNlIHN0YXJ2aW5nL292ZXJydW5pbmcgKi8KLQl3b3JkID0gU0g3NzUxX1BDSUNSX1BSRUZJWCB8IFNINzc1MV9QQ0lDUl9DRklOIHwgU0g3NzUxX1BDSUNSX0FSQk07Ci0Jb3V0bCh3b3JkLFBDSV9SRUcoU0g3NzUxX1BDSUNSKSk7IAorCXdvcmQgPSBTSDRfUENJQ1JfUFJFRklYIHwgU0g0X1BDSUNSX0NGSU4gfCBTSDRfUENJQ1JfQVJCTTsKKwlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINF9QQ0lDUik7CiAKIAlyZXR1cm4gMTsKIH0KLQotY2hhciAqIF9faW5pdCBwY2liaW9zX3NldHVwKGNoYXIgKnN0cikKLXsKLQlpZiAoIXN0cmNtcChzdHIsICJvZmYiKSkgewotCQlwY2lfcHJvYmUgPSAwOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gc3RyOwotfQotCi0vKiAKLSAqIAlJUlEgZnVuY3Rpb25zIAotICovCi1zdGF0aWMgdTggX19pbml0IHNoNzc1MV9ub19zd2l6emxlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4ICpwaW4pCi17Ci0JLyogbm8gc3dpenpsaW5nICovCi0JcmV0dXJuIFBDSV9TTE9UKGRldi0+ZGV2Zm4pOwotfQotCi1zdGF0aWMgaW50IHNoNzc1MV9wY2lfbG9va3VwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCi17Ci0JaW50IGlycSA9IC0xOwotCi0JLyogbm93IGxvb2t1cCB0aGUgYWN0dWFsIElSUSBvbiBhIHBsYXRmb3JtIHNwZWNpZmljIGJhc2lzIChwY2ktJ3BsYXRmb3JtJy5jKSAqLwotCWlycSA9IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzbG90LHBpbik7Ci0JaWYoIGlycSA8IDAgKSB7Ci0JCXByX2RlYnVnKCJQQ0k6IEVycm9yIG1hcHBpbmcgSVJRIG9uIGRldmljZSAlc1xuIiwgcGNpX25hbWUoZGV2KSk7Ci0JCXJldHVybiBpcnE7Ci0JfQotCi0JcHJfZGVidWcoIlNldHRpbmcgSVJRIGZvciBzbG90ICVzIHRvICVkXG4iLCBwY2lfbmFtZShkZXYpLCBpcnEpOwotCi0JcmV0dXJuIGlycTsKLX0KLQotdm9pZCBfX2luaXQgcGNpYmlvc19maXh1cF9pcnFzKHZvaWQpCi17Ci0JcGNpX2ZpeHVwX2lycXMoc2g3NzUxX25vX3N3aXp6bGUsIHNoNzc1MV9wY2lfbG9va3VwX2lycSk7Ci19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNzc1MS5oIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzUxLmgKaW5kZXggMWZlZTVjYS4uNjhlM2NiNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzUxLmgKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzUxLmgKQEAgLTMsNyArMyw3IEBACiAgKgogICogIER1c3RpbiBNY0ludGlyZSAoZHVzdGluQHNlbnNvcmlhLmNvbSkgKGMpIDIwMDEKICAqICBQYXVsIE11bmR0IChsZXRoYWxAbGludXgtc2gub3JnKSAoYykgMjAwMwotICoJCisgKgogICogIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqICBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgKgpAQCAtMTIsMjggKzEyLDYgQEAKICNpZm5kZWYgX1BDSV9TSDc3NTFfSF8KICNkZWZpbmUgX1BDSV9TSDc3NTFfSF8KIAotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotCi0vKiBzZXQgZGVidWcgbGV2ZWwgND12ZXJib3NlLi4uMT10ZXJzZSAqLwotLy8jZGVmaW5lIERFQlVHX1BDSSAzCi0jdW5kZWYgREVCVUdfUENJCi0KLSNpZmRlZiBERUJVR19QQ0kKLSNkZWZpbmUgUENJREJHKG4sIHguLi4pIHsgaWYoREVCVUdfUENJPj1uKSBwcmludGsoeCk7IH0KLSNlbHNlCi0jZGVmaW5lIFBDSURCRyhuLCB4Li4uKQotI2VuZGlmCi0KLS8qIHN0YXJ0dXAgdmFsdWVzICovCi0jZGVmaW5lIFBDSV9QUk9CRV9CSU9TIDEKLSNkZWZpbmUgUENJX1BST0JFX0NPTkYxIDIKLSNkZWZpbmUgUENJX1BST0JFX0NPTkYyIDQKLSNkZWZpbmUgUENJX05PX1NPUlQgMHgxMDAKLSNkZWZpbmUgUENJX0JJT1NfU09SVCAweDIwMAotI2RlZmluZSBQQ0lfTk9fQ0hFQ0tTIDB4NDAwCi0jZGVmaW5lIFBDSV9BU1NJR05fUk9NUyAweDEwMDAKLSNkZWZpbmUgUENJX0JJT1NfSVJRX1NDQU4gMHgyMDAwCi0KIC8qIFBsYXRmb3JtIFNwZWNpZmljIFZhbHVlcyAqLwogI2RlZmluZSBTSDc3NTFfVkVORE9SX0lEICAgICAgICAgICAgIDB4MTA1NAogI2RlZmluZSBTSDc3NTFfREVWSUNFX0lEICAgICAgICAgICAgIDB4MzUwNQpAQCAtMTI4LDEzMSArMTA2LDYgQEAKICAgI2RlZmluZSBTSDc3NTFfUENJQ09ORjE3X1BNRU4gICAgICAweDAwMDEwMDAwICAvKiBQTUUgRW5hYmxlICovCiAgICNkZWZpbmUgU0g3NzUxX1BDSUNPTkYxN19QV1NUICAgICAgMHgwMDAwMDAwMyAgLyogUG93ZXIgU3RhdGUgKi8KIC8qIFNINzcxNSBJbnRlcm5hbCBQQ0kgUmVnaXN0ZXJzICovCi0jZGVmaW5lIFNINzc1MV9QQ0lDUiAgICAgICAgICAgICAgIDB4MTAwICAgICAgICAgLyogUENJIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJQ1JfUFJFRklYICAgICAgICAweEE1MDAwMDAwICAvKiBDUiBwcmVmaXggZm9yIHdyaXRlICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUNSX1RSU0IgICAgICAgICAgMHgwMDAwMDIwMCAgLyogVGFyZ2V0IFJlYWQgU2luZ2xlICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUNSX0JTV1AgICAgICAgICAgMHgwMDAwMDEwMCAgLyogVGFyZ2V0IEJ5dGUgU3dhcCAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lDUl9QTFVQICAgICAgICAgIDB4MDAwMDAwODAgIC8qIEVuYWJsZSBQQ0kgUHVsbHVwICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUNSX0FSQk0gICAgICAgICAgMHgwMDAwMDA0MCAgLyogUENJIEFyYml0cmF0aW9uIE1vZGUgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJQ1JfTUQgICAgICAgICAgICAweDAwMDAwMDMwICAvKiBNRDkgYW5kIE1EMTAgc3RhdHVzICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUNSX1NFUlIgICAgICAgICAgMHgwMDAwMDAwOCAgLyogU0VSUiBvdXRwdXQgYXNzZXJ0ICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUNSX0lOVEEgICAgICAgICAgMHgwMDAwMDAwNCAgLyogSU5UQSBvdXRwdXQgYXNzZXJ0ICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUNSX1BSU1QgICAgICAgICAgMHgwMDAwMDAwMiAgLyogUENJIFJlc2V0IEFzc2VydCAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lDUl9DRklOICAgICAgICAgIDB4MDAwMDAwMDEgIC8qIENlbnRyYWwgRnVuLiBJbml0IERvbmUgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSUxTUjAgICAgICAgICAgICAgMHgxMDQgICAgICAgICAvKiBQQ0kgTG9jYWwgU3BhY2UgUmVnaXN0ZXIwICovCi0jZGVmaW5lIFNINzc1MV9QQ0lMU1IxICAgICAgICAgICAgIDB4MTA4ICAgICAgICAgLyogUENJIExvY2FsIFNwYWNlIFJlZ2lzdGVyMSAqLwotI2RlZmluZSBTSDc3NTFfUENJTEFSMCAgICAgICAgICAgICAweDEwQyAgICAgICAgIC8qIFBDSSBMb2NhbCBBZGRyZXNzIFJlZ2lzdGVyMSAqLwotI2RlZmluZSBTSDc3NTFfUENJTEFSMSAgICAgICAgICAgICAweDExMCAgICAgICAgIC8qIFBDSSBMb2NhbCBBZGRyZXNzIFJlZ2lzdGVyMSAqLwotI2RlZmluZSBTSDc3NTFfUENJSU5UICAgICAgICAgICAgICAweDExNCAgICAgICAgIC8qIFBDSSBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJSU5UX01MQ0sgICAgICAgICAweDAwMDA4MDAwICAvKiBNYXN0ZXIgTG9jayBFcnJvciAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lJTlRfVEFCVCAgICAgICAgIDB4MDAwMDQwMDAgIC8qIFRhcmdldCBBYm9ydCBFcnJvciAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lJTlRfVFJFVCAgICAgICAgIDB4MDAwMDAyMDAgIC8qIFRhcmdldCBSZXRyeSBFcnJvciAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lJTlRfTUZERSAgICAgICAgIDB4MDAwMDAxMDAgIC8qIE1hc3RlciBGdW5jLiBEaXNhYmxlIEVycm9yICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUlOVF9QUlRZICAgICAgICAgMHgwMDAwMDA4MCAgLyogQWRkcmVzcyBQYXJpdHkgRXJyb3IgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJSU5UX1NFUlIgICAgICAgICAweDAwMDAwMDQwICAvKiBTRVJSIERldGVjdGlvbiBFcnJvciAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lJTlRfVFdEUCAgICAgICAgIDB4MDAwMDAwMjAgIC8qIFRndC4gV3JpdGUgUGFyaXR5IEVycm9yICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUlOVF9UUkRQICAgICAgICAgMHgwMDAwMDAxMCAgLyogVGd0LiBSZWFkIFBhcml0eSBFcnJvciBEZXQuICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUlOVF9NVEFCVCAgICAgICAgMHgwMDAwMDAwOCAgLyogTWFzdGVyLVRndC4gQWJvcnQgRXJyb3IgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJSU5UX01NQUJUICAgICAgICAweDAwMDAwMDA0ICAvKiBNYXN0ZXItTWFzdGVyIEFib3J0IEVycm9yICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUlOVF9NV1BEICAgICAgICAgMHgwMDAwMDAwMiAgLyogTWFzdGVyIFdyaXRlIFBFUlIgRGV0ZWN0ICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUlOVF9NUlBEICAgICAgICAgMHgwMDAwMDAwMiAgLyogTWFzdGVyIFJlYWQgUEVSUiBEZXRlY3QgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSUlOVE0gICAgICAgICAgICAgMHgxMTggICAgICAgICAvKiBQQ0kgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSUFMUiAgICAgICAgICAgICAgMHgxMUMgICAgICAgICAvKiBFcnJvciBBZGRyZXNzIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNINzc1MV9QQ0lDTFIgICAgICAgICAgICAgIDB4MTIwICAgICAgICAgLyogRXJyb3IgQ29tbWFuZC9EYXRhIFJlZ2lzdGVyICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUNMUl9NUElPICAgICAgICAgMHg4MDAwMDAwMCAgLyogRXJyb3IgQ29tbWFuZC9EYXRhIFJlZ2lzdGVyICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUNMUl9NRE1BMCAgICAgICAgMHg0MDAwMDAwMCAgLyogRE1BMCBUcmFuc2ZlciBFcnJvciAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lDTFJfTURNQTEgICAgICAgIDB4MjAwMDAwMDAgIC8qIERNQTEgVHJhbnNmZXIgRXJyb3IgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJQ0xSX01ETUEyICAgICAgICAweDEwMDAwMDAwICAvKiBETUEyIFRyYW5zZmVyIEVycm9yICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUNMUl9NRE1BMyAgICAgICAgMHgwODAwMDAwMCAgLyogRE1BMyBUcmFuc2ZlciBFcnJvciAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lDTFJfVEdUICAgICAgICAgIDB4MDQwMDAwMDAgIC8qIFRhcmdldCBUcmFuc2ZlciBFcnJvciAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lDTFJfQ01ETCAgICAgICAgIDB4MDAwMDAwMEYgIC8qIFBDSSBDb21tYW5kIGF0IEVycm9yICovCi0jZGVmaW5lIFNINzc1MV9QQ0lBSU5UICAgICAgICAgICAgIDB4MTMwICAgICAgICAgLyogQXJiaXRlciBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJQUlOVF9NQktOICAgICAgICAweDAwMDAyMDAwICAvKiBNYXN0ZXIgQnJva2VuIEludGVycnVwdCAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lBSU5UX1RCVE8gICAgICAgIDB4MDAwMDEwMDAgIC8qIFRhcmdldCBCdXMgVGltZSBPdXQgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJQUlOVF9NQlRPICAgICAgICAweDAwMDAxMDAwICAvKiBNYXN0ZXIgQnVzIFRpbWUgT3V0ICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUFJTlRfVEFCVCAgICAgICAgMHgwMDAwMDAwOCAgLyogVGFyZ2V0IEFib3J0ICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUFJTlRfTUFCVCAgICAgICAgMHgwMDAwMDAwNCAgLyogTWFzdGVyIEFib3J0ICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUFJTlRfUkRQRSAgICAgICAgMHgwMDAwMDAwMiAgLyogUmVhZCBEYXRhIFBhcml0eSBFcnJvciAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lBSU5UX1dEUEUgICAgICAgIDB4MDAwMDAwMDIgIC8qIFdyaXRlIERhdGEgUGFyaXR5IEVycm9yICovCi0jZGVmaW5lIFNINzc1MV9QQ0lBSU5UTSAgICAgICAgICAgIDB4MTM0ICAgICAgICAgLyogQXJiaXRlciBJbnQuIE1hc2sgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSUJNTFIgICAgICAgICAgICAgMHgxMzggICAgICAgICAvKiBFcnJvciBCdXMgTWFzdGVyIFJlZ2lzdGVyICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUJNTFJfUkVRNCAgICAgICAgMHgwMDAwMDAxMCAgLyogUkVRNCBidXMgbWFzdGVyIGF0IGVycm9yICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUJNTFJfUkVRMyAgICAgICAgMHgwMDAwMDAwOCAgLyogUkVRMyBidXMgbWFzdGVyIGF0IGVycm9yICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUJNTFJfUkVRMiAgICAgICAgMHgwMDAwMDAwNCAgLyogUkVRMiBidXMgbWFzdGVyIGF0IGVycm9yICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUJNTFJfUkVRMSAgICAgICAgMHgwMDAwMDAwMiAgLyogUkVRMSBidXMgbWFzdGVyIGF0IGVycm9yICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUJNTFJfUkVRMCAgICAgICAgMHgwMDAwMDAwMSAgLyogUkVRMCBidXMgbWFzdGVyIGF0IGVycm9yICovCi0jZGVmaW5lIFNINzc1MV9QQ0lETUFCVCAgICAgICAgICAgIDB4MTQwICAgICAgICAgLyogRE1BIFRyYW5zZmVyIEFyYi4gUmVnaXN0ZXIgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJRE1BQlRfUlJCTiAgICAgICAweDAwMDAwMDAxICAvKiBETUEgQXJiaXRvciBSb3VuZC1Sb2JpbiAqLwotI2RlZmluZSBTSDc3NTFfUENJRFBBMCAgICAgICAgICAgICAweDE4MCAgICAgICAgIC8qIERNQTAgVHJhbnNmZXIgQWRkci4gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSURMQTAgICAgICAgICAgICAgMHgxODQgICAgICAgICAvKiBETUEwIExvY2FsIEFkZHIuIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNINzc1MV9QQ0lEVEMwICAgICAgICAgICAgIDB4MTg4ICAgICAgICAgLyogRE1BMCBUcmFuc2ZlciBDbnQuIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNINzc1MV9QQ0lEQ1IwICAgICAgICAgICAgIDB4MThDICAgICAgICAgLyogRE1BMCBDb250cm9sIFJlZ2lzdGVyICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSURDUl9BTEdOICAgICAgICAgMHgwMDAwMDYwMCAgLyogRE1BIEFsaWdubWVudCBNb2RlICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSURDUl9NQVNUICAgICAgICAgMHgwMDAwMDEwMCAgLyogRE1BIFRlcm1pbmF0aW9uIFR5cGUgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJRENSX0lOVE0gICAgICAgICAweDAwMDAwMDgwICAvKiBETUEgSW50ZXJydXB0IERvbmUgTWFzayovCi0gICNkZWZpbmUgU0g3NzUxX1BDSURDUl9JTlRTICAgICAgICAgMHgwMDAwMDA0MCAgLyogRE1BIEludGVycnVwdCBEb25lIFN0YXR1cyAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lEQ1JfTEhMRCAgICAgICAgIDB4MDAwMDAwMjAgIC8qIExvY2FsIEFkZHJlc3MgQ29udHJvbCAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lEQ1JfUEhMRCAgICAgICAgIDB4MDAwMDAwMTAgIC8qIFBDSSBBZGRyZXNzIENvbnRyb2wqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lEQ1JfSU9TRUwgICAgICAgIDB4MDAwMDAwMDggIC8qIFBDSSBBZGRyZXNzIFNwYWNlIFR5cGUgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJRENSX0RJUiAgICAgICAgICAweDAwMDAwMDA0ICAvKiBETUEgVHJhbnNmZXIgRGlyZWN0aW9uICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSURDUl9TVE9QICAgICAgICAgMHgwMDAwMDAwMiAgLyogRm9yY2UgRE1BIFN0b3AgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJRENSX1NUUlQgICAgICAgICAweDAwMDAwMDAxICAvKiBETUEgU3RhcnQgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSURQQTEgICAgICAgICAgICAgMHgxOTAgICAgICAgICAvKiBETUExIFRyYW5zZmVyIEFkZHIuIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNINzc1MV9QQ0lETEExICAgICAgICAgICAgIDB4MTk0ICAgICAgICAgLyogRE1BMSBMb2NhbCBBZGRyLiBSZWdpc3RlciAqLwotI2RlZmluZSBTSDc3NTFfUENJRFRDMSAgICAgICAgICAgICAweDE5OCAgICAgICAgIC8qIERNQTEgVHJhbnNmZXIgQ250LiBSZWdpc3RlciAqLwotI2RlZmluZSBTSDc3NTFfUENJRENSMSAgICAgICAgICAgICAweDE5QyAgICAgICAgIC8qIERNQTEgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBTSDc3NTFfUENJRFBBMiAgICAgICAgICAgICAweDFBMCAgICAgICAgIC8qIERNQTIgVHJhbnNmZXIgQWRkci4gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSURMQTIgICAgICAgICAgICAgMHgxQTQgICAgICAgICAvKiBETUEyIExvY2FsIEFkZHIuIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNINzc1MV9QQ0lEVEMyICAgICAgICAgICAgIDB4MUE4ICAgICAgICAgLyogRE1BMiBUcmFuc2ZlciBDbnQuIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNINzc1MV9QQ0lEQ1IyICAgICAgICAgICAgIDB4MUFDICAgICAgICAgLyogRE1BMiBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNINzc1MV9QQ0lEUEEzICAgICAgICAgICAgIDB4MUIwICAgICAgICAgLyogRE1BMyBUcmFuc2ZlciBBZGRyLiBSZWdpc3RlciAqLwotI2RlZmluZSBTSDc3NTFfUENJRExBMyAgICAgICAgICAgICAweDFCNCAgICAgICAgIC8qIERNQTMgTG9jYWwgQWRkci4gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSURUQzMgICAgICAgICAgICAgMHgxQjggICAgICAgICAvKiBETUEzIFRyYW5zZmVyIENudC4gUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSURDUjMgICAgICAgICAgICAgMHgxQkMgICAgICAgICAvKiBETUEzIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSVBBUiAgICAgICAgICAgICAgMHgxQzAgICAgICAgICAvKiBQSU8gQWRkcmVzcyBSZWdpc3RlciAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lQQVJfQ0ZHRU4gICAgICAgIDB4ODAwMDAwMDAgIC8qIENvbmZpZ3VyYXRpb24gRW5hYmxlICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSVBBUl9CVVNOTyAgICAgICAgMHgwMEZGMDAwMCAgLyogQ29uZmlnLiBCdXMgTnVtYmVyICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSVBBUl9ERVZOTyAgICAgICAgMHgwMDAwRkYwMCAgLyogQ29uZmlnLiBEZXZpY2UgTnVtYmVyICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSVBBUl9SRUdBRCAgICAgICAgMHgwMDAwMDBGQyAgLyogUmVnaXN0ZXIgQWRkcmVzcyBOdW1iZXIgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSU1CUiAgICAgICAgICAgICAgMHgxQzQgICAgICAgICAvKiBNZW1vcnkgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSU1CUl9NQVNLICAgICAgICAgMHhGRjAwMDAwMCAgLyogTWVtb3J5IFNwYWNlIE1hc2sgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJTUJSX0xPQ0sgICAgICAgICAweDAwMDAwMDAxICAvKiBMb2NrIE1lbW9yeSBTcGFjZSAqLwotI2RlZmluZSBTSDc3NTFfUENJSU9CUiAgICAgICAgICAgICAweDFDOCAgICAgICAgIC8qIEkvTyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJSU9CUl9NQVNLICAgICAgICAgMHhGRkZDMDAwMCAvKiBJTyBTcGFjZSBNYXNrICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUlPQlJfTE9DSyAgICAgICAgIDB4MDAwMDAwMDEgLyogTG9jayBJTyBTcGFjZSAqLwotI2RlZmluZSBTSDc3NTFfUENJUElOVCAgICAgICAgICAgICAweDFDQyAgICAgICAgIC8qIFBvd2VyIE1nbW50IEludC4gUmVnaXN0ZXIgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJUElOVF9EMyAgICAgICAgICAgMHgwMDAwMDAwMiAvKiBEMyBQd3IgTWdtdC4gSW50ZXJydXB0ICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSVBJTlRfRDAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogRDAgUHdyIE1nbXQuIEludGVycnVwdCAqLyAgCi0jZGVmaW5lIFNINzc1MV9QQ0lQSU5UTSAgICAgICAgICAgIDB4MUQwICAgICAgICAgLyogUG93ZXIgTWdtbnQgTWFzayBSZWdpc3RlciAqLwotI2RlZmluZSBTSDc3NTFfUENJQ0xLUiAgICAgICAgICAgICAweDFENCAgICAgICAgIC8qIENsb2NrIEN0cmwuIFJlZ2lzdGVyICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSUNMS1JfUENTVFAgICAgICAgIDB4MDAwMDAwMDIgLyogUENJIENsb2NrIFN0b3AgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJQ0xLUl9CQ1NUUCAgICAgICAgMHgwMDAwMDAwMiAvKiBCQ0xLIENsb2NrIFN0b3AgKi8KLS8qIEZvciBkZWZpbml0aW9ucyBvZiBCQ1IsIE1DUiBzZWUgLi4uICovCi0jZGVmaW5lIFNINzc1MV9QQ0lCQ1IxICAgICAgICAgICAgIDB4MUUwICAgICAgICAgLyogTWVtb3J5IEJDUjEgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSUJDUjIgICAgICAgICAgICAgMHgxRTQgICAgICAgICAvKiBNZW1vcnkgQkNSMiBSZWdpc3RlciAqLwotI2RlZmluZSBTSDc3NTFfUENJV0NSMSAgICAgICAgICAgICAweDFFOCAgICAgICAgIC8qIFdhaXQgQ29udHJvbCAxIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNINzc1MV9QQ0lXQ1IyICAgICAgICAgICAgIDB4MUVDICAgICAgICAgLyogV2FpdCBDb250cm9sIDIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSVdDUjMgICAgICAgICAgICAgMHgxRjAgICAgICAgICAvKiBXYWl0IENvbnRyb2wgMyBSZWdpc3RlciAqLwotI2RlZmluZSBTSDc3NTFfUENJTUNSICAgICAgICAgICAgICAweDFGNCAgICAgICAgIC8qIE1lbW9yeSBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNINzc1MV9QQ0lCQ1IzCQkgICAweDFmOAkgLyogTWVtb3J5IEJDUjMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSVBDVFIgICAgICAgICAgICAgMHgyMDAgICAgICAgICAvKiBQb3J0IENvbnRyb2wgUmVnaXN0ZXIgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJUENUUl9QMkVOICAgICAgICAweDAwMDQwMDAwMCAvKiBQb3J0IDIgRW5hYmxlICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSVBDVFJfUDFFTiAgICAgICAgMHgwMDAyMDAwMDAgLyogUG9ydCAxIEVuYWJsZSAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lQQ1RSX1AwRU4gICAgICAgIDB4MDAwMTAwMDAwIC8qIFBvcnQgMCBFbmFibGUgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJUENUUl9QMlVQICAgICAgICAweDAwMDAwMDAyMCAvKiBQb3J0MiBQdWxsIFVwIEVuYWJsZSAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lQQ1RSX1AySU8gICAgICAgIDB4MDAwMDAwMDEwIC8qIFBvcnQyIE91dHB1dCBFbmFibGUgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJUENUUl9QMVVQICAgICAgICAweDAwMDAwMDAwOCAvKiBQb3J0MSBQdWxsIFVwIEVuYWJsZSAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lQQ1RSX1AxSU8gICAgICAgIDB4MDAwMDAwMDA0IC8qIFBvcnQxIE91dHB1dCBFbmFibGUgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJUENUUl9QMFVQICAgICAgICAweDAwMDAwMDAwMiAvKiBQb3J0MCBQdWxsIFVwIEVuYWJsZSAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lQQ1RSX1AwSU8gICAgICAgIDB4MDAwMDAwMDAxIC8qIFBvcnQwIE91dHB1dCBFbmFibGUgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSVBEVFIgICAgICAgICAgICAgMHgyMDQgICAgICAgICAvKiBQb3J0IERhdGEgUmVnaXN0ZXIgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJUERUUl9QQjUgICAgICAgICAweDAwMDAwMDAyMCAvKiBQb3J0IDUgRW5hYmxlICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSVBEVFJfUEI0ICAgICAgICAgMHgwMDAwMDAwMTAgLyogUG9ydCA0IEVuYWJsZSAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lQRFRSX1BCMyAgICAgICAgIDB4MDAwMDAwMDA4IC8qIFBvcnQgMyBFbmFibGUgKi8KLSAgI2RlZmluZSBTSDc3NTFfUENJUERUUl9QQjIgICAgICAgICAweDAwMDAwMDAwNCAvKiBQb3J0IDIgRW5hYmxlICovCi0gICNkZWZpbmUgU0g3NzUxX1BDSVBEVFJfUEIxICAgICAgICAgMHgwMDAwMDAwMDIgLyogUG9ydCAxIEVuYWJsZSAqLwotICAjZGVmaW5lIFNINzc1MV9QQ0lQRFRSX1BCMCAgICAgICAgIDB4MDAwMDAwMDAxIC8qIFBvcnQgMCBFbmFibGUgKi8KLSNkZWZpbmUgU0g3NzUxX1BDSVBEUiAgICAgICAgICAgICAgMHgyMjAgICAgICAgICAvKiBQb3J0IElPIERhdGEgUmVnaXN0ZXIgKi8KIAogLyogTWVtb3J5IENvbnRyb2wgUmVnaXN0ZXJzICovCiAjZGVmaW5lIFNINzc1MV9CQ1IxICAgICAgICAgICAgICAgIDB4RkY4MDAwMDAgICAgLyogTWVtb3J5IEJDUjEgUmVnaXN0ZXIgKi8KQEAgLTI3NCwzMCArMTI3LDkgQEAKICNkZWZpbmUgU0g3NzUxX0NTNV9CQVNFX0FERFIgICAgICAgKFNINzc1MV9DUzRfQkFTRV9BRERSICsgU0g3NzUxX01FTV9SRUdJT05fU0laRSkKICNkZWZpbmUgU0g3NzUxX0NTNl9CQVNFX0FERFIgICAgICAgKFNINzc1MV9DUzVfQkFTRV9BRERSICsgU0g3NzUxX01FTV9SRUdJT05fU0laRSkKIAotLyogR2VuZXJhbCBQQ0kgdmFsdWVzICovCi0jZGVmaW5lIFNINzc1MV9QQ0lfSE9TVF9CUklER0UJCTB4NgotCi0vKiBGbGFncyAqLwotI2RlZmluZSBTSDc3NTFfUENJQ19OT19SRVNFVAkweDAwMDEKLQotLyogRXh0ZXJuYWwgZnVuY3Rpb25zIGRlZmluZWQgcGVyIHBsYXRmb3JtIGkuZS4gQmlnIFN1ciwgU0UuLi4gKHRoZXNlIGNvdWxkIGJlIHJvdXRlZCAKLSAqIHRocm91Z2ggdGhlIG1hY2hpbmUgdmVjdG9ycy4uLiAqLwotZXh0ZXJuIGludCBwY2liaW9zX2luaXRfcGxhdGZvcm0odm9pZCk7Ci1leHRlcm4gaW50IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycSh1OCBzbG90LCB1OCBwaW4pOwotCi1zdHJ1Y3Qgc2g3NzUxX3BjaV9hZGRyZXNzX3NwYWNlIHsKLQl1bnNpZ25lZCBsb25nIGJhc2U7Ci0JdW5zaWduZWQgbG9uZyBzaXplOwotfTsKLQotc3RydWN0IHNoNzc1MV9wY2lfYWRkcmVzc19tYXAgewotCXN0cnVjdCBzaDc3NTFfcGNpX2FkZHJlc3Nfc3BhY2Ugd2luZG93MDsKLQlzdHJ1Y3Qgc2g3NzUxX3BjaV9hZGRyZXNzX3NwYWNlIHdpbmRvdzE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLX07CitzdHJ1Y3Qgc2g0X3BjaV9hZGRyZXNzX21hcDsKIAogLyogYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzUxLmMgKi8KLWV4dGVybiBpbnQgc2g3NzUxX3BjaWNfaW5pdChzdHJ1Y3Qgc2g3NzUxX3BjaV9hZGRyZXNzX21hcCAqbWFwKTsKK2ludCBzaDc3NTFfcGNpY19pbml0KHN0cnVjdCBzaDRfcGNpX2FkZHJlc3NfbWFwICptYXApOwogCiAjZW5kaWYgLyogX1BDSV9TSDc3NTFfSF8gKi8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzgwLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3ODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDMwNjRhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzgwLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKglMb3ctTGV2ZWwgUENJIFN1cHBvcnQgZm9yIHRoZSBTSDc3ODAKKyAqCisgKiAgRHVzdGluIE1jSW50aXJlIChkdXN0aW5Ac2Vuc29yaWEuY29tKQorICoJRGVyaXZlZCBmcm9tIGFyY2gvaTM4Ni9rZXJuZWwvcGNpLSouYyB3aGljaCBib3JlIHRoZSBtZXNzYWdlOgorICoJKGMpIDE5OTktLTIwMDAgTWFydGluIE1hcmVzIDxtakB1Y3cuY3o+CisgKgorICogIFBvcnRlZCB0byB0aGUgbmV3IEFQSSBieSBQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPgorICogIFdpdGggY2xlYW51cCBieSBQYXVsIHZhbiBHb29sIDxwdmFuZ29vbEBtaW1vdGVjaC5jb20+CisgKgorICogIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgInBjaS1zaDQuaCIKKworLyoKKyAqIEluaXRpYWxpemF0aW9uLiBUcnkgYWxsIGtub3duIFBDSSBhY2Nlc3MgbWV0aG9kcy4gTm90ZSB0aGF0IHdlIHN1cHBvcnQKKyAqIHVzaW5nIGJvdGggUENJIEJJT1MgYW5kIGRpcmVjdCBhY2Nlc3M6IGluIHN1Y2ggY2FzZXMsIHdlIHVzZSBJL08gcG9ydHMKKyAqIHRvIGFjY2VzcyBjb25maWcgc3BhY2UuCisgKgorICogTm90ZSB0aGF0IHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiAoQlNDIHJlZ2lzdGVycywgYW5kIG1lbW9yeQorICogc3BhY2UgbWFwcGluZykgd2lsbCBiZSBjYWxsZWQgdmlhIHRoZSBwbGF0Zm9ybSBkZWZpbmVkIGZ1bmN0aW9uCisgKiBwY2liaW9zX2luaXRfcGxhdGZvcm0oKS4KKyAqLworc3RhdGljIGludCBfX2luaXQgc2g3NzgwX3BjaV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGlkOworCWludCByZXQ7CisKKwlwcl9kZWJ1ZygiUENJOiBTdGFydGluZyBpbnRpYWxpemF0aW9uLlxuIik7CisKKwlvdXRsKDB4MDAwMDAwMDEsIFNINzc4MF9QQ0lfVkNSMik7IC8qIEVuYWJsZSBQQ0lDICovCisKKwkvKiBjaGVjayBmb3IgU0g3NzgwL1NINzc4MFIgaGFyZHdhcmUgKi8KKwlpZCA9IHBjaV9yZWFkX3JlZyhTSDc3ODBfUENJVklEKTsKKwlpZiAoKGlkICE9ICgoU0g3NzgwX0RFVklDRV9JRCA8PCAxNikgfCBTSDc3ODBfVkVORE9SX0lEKSkgJiYKKwkgICAgKGlkICE9ICgoU0g3NzgxX0RFVklDRV9JRCA8PCAxNikgfCBTSDc3ODBfVkVORE9SX0lEKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IFRoaXMgaXMgbm90IGFuIFNINzc4MCAoJXgpXG4iLCBpZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFNldHVwIHRoZSBJTlRDICovCisJY3RybF9vdXRsKDB4MDAyMDAwMDAsIElOVENfSUNSMCk7CS8qIElOVEMgU0gtNCBNb2RlICovCisJY3RybF9vdXRsKDB4MDAwNzgwMDAsIElOVENfSU5UMk1TS0NSKTsJLyogZW5hYmxlIFBDSUlOVEEgLSBQQ0lJTlREICovCisJY3RybF9vdXRsKDB4NDAwMDAwMDAsIElOVENfSU5UTVNLMSk7CS8qIGRpc2FibGUgSVJMNC03IEludGVycnVwdCAqLworCWN0cmxfb3V0bCgweDAwMDBmZmZlLCBJTlRDX0lOVE1TSzIpOwkvKiBkaXNhYmxlIElSTDQtNyBJbnRlcnJ1cHQgKi8KKwljdHJsX291dGwoMHg4MDAwMDAwMCwgSU5UQ19JTlRNU0tDTFIxKTsJLyogZW5hYmxlIElSTDAtMyBJbnRlcnJ1cHQgKi8KKwljdHJsX291dGwoMHhmZmZlMDAwMCwgSU5UQ19JTlRNU0tDTFIyKTsJLyogZW5hYmxlIElSTDAtMyBJbnRlcnJ1cHQgKi8KKworCWlmICgocmV0ID0gc2g0X3BjaV9jaGVja19kaXJlY3QoKSkgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBwY2liaW9zX2luaXRfcGxhdGZvcm0oKTsKK30KK2NvcmVfaW5pdGNhbGwoc2g3NzgwX3BjaV9pbml0KTsKKworaW50IF9faW5pdCBzaDc3ODBfcGNpY19pbml0KHN0cnVjdCBzaDRfcGNpX2FkZHJlc3NfbWFwICptYXApCit7CisJdTMyIHdvcmQ7CisKKwkvKgorCSAqIFRoaXMgY29kZSBpcyB1bnVzZWQgZm9yIHNvbWUgYm9hcmRzIGFzIGl0IGlzIGRvbmUgaW4gdGhlCisJICogYm9vdGxvYWRlciBhbmQgZG9pbmcgaXQgaGVyZSBtZWFucyB0aGUgTUFDIGFkZHJlc3NlcyBsb2FkZWQKKwkgKiBieSB0aGUgYm9vdGxvYWRlciBnZXQgbG9zdC4KKwkgKi8KKwlpZiAoIShtYXAtPmZsYWdzICYgU0g0X1BDSUNfTk9fUkVTRVQpKSB7CisJCS8qIHRvZ2dsZSBQQ0kgcmVzZXQgcGluICovCisJCXdvcmQgPSBTSDRfUENJQ1JfUFJFRklYIHwgU0g0X1BDSUNSX1BSU1Q7CisJCXBjaV93cml0ZV9yZWcod29yZCwgU0g0X1BDSUNSKTsKKwkJLyogV2FpdCBmb3IgYSBsb25nIHRpbWUuLi4gbm90IDEgc2VjLiBidXQgbG9uZyBlbm91Z2ggKi8KKwkJbWRlbGF5KDEwMCk7CisJCXdvcmQgPSBTSDRfUENJQ1JfUFJFRklYOworCQlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINF9QQ0lDUik7CisJfQorCisJLyogc2V0IHRoZSBjb21tYW5kL3N0YXR1cyBiaXRzIHRvOgorCSAqIFdhaXQgQ3ljbGUgQ29udHJvbCArIFBhcml0eSBFbmFibGUgKyBCdXMgTWFzdGVyICsKKwkgKiBNZW0gc3BhY2UgZW5hYmxlCisJICovCisJcGNpX3dyaXRlX3JlZygweDAwMDAwMDQ2LCBTSDc3ODBfUENJQ01EKTsKKworCS8qIGRlZmluZSB0aGlzIGhvc3QgYXMgdGhlIGhvc3QgYnJpZGdlICovCisJd29yZCA9IFBDSV9CQVNFX0NMQVNTX0JSSURHRSA8PCAyNDsKKwlwY2lfd3JpdGVfcmVnKHdvcmQsIFNINzc4MF9QQ0lSSUQpOworCisJLyogU2V0IElPIGFuZCBNZW0gd2luZG93cyB0byBsb2NhbCBhZGRyZXNzCisJICogTWFrZSBQQ0kgYW5kIGxvY2FsIGFkZHJlc3MgdGhlIHNhbWUgZm9yIGVhc3kgMSB0byAxIG1hcHBpbmcKKwkgKiBXaW5kb3cwID0gbWFwLT53aW5kb3cwLnNpemUgQCBub24tY2FjaGVkIGFyZWEgYmFzZSA9IFNEUkFNCisJICogV2luZG93MSA9IG1hcC0+d2luZG93MS5zaXplIEAgY2FjaGVkIGFyZWEgYmFzZSA9IFNEUkFNCisJICovCisJd29yZCA9ICgobWFwLT53aW5kb3cwLnNpemUgLSAxKSAmIDB4MWZmMDAwMDEpIHwgMHgwMTsKKwlwY2lfd3JpdGVfcmVnKDB4MDdmMDAwMDEsIFNINF9QQ0lMU1IwKTsKKwl3b3JkID0gKChtYXAtPndpbmRvdzEuc2l6ZSAtIDEpICYgMHgxZmYwMDAwMSkgfCAweDAxOworCXBjaV93cml0ZV9yZWcoMHgwMDAwMDAwMSwgU0g0X1BDSUxTUjEpOworCS8qIFNldCB0aGUgdmFsdWVzIG9uIHdpbmRvdyAwIFBDSSBjb25maWcgcmVnaXN0ZXJzICovCisJd29yZCA9IFAyU0VHQUREUihtYXAtPndpbmRvdzAuYmFzZSk7CisJcGNpX3dyaXRlX3JlZygweGE4MDAwMDAwLCBTSDRfUENJTEFSMCk7CisJcGNpX3dyaXRlX3JlZygweDA4MDAwMDAwLCBTSDc3ODBfUENJTUJBUjApOworCS8qIFNldCB0aGUgdmFsdWVzIG9uIHdpbmRvdyAxIFBDSSBjb25maWcgcmVnaXN0ZXJzICovCisJd29yZCA9IFAyU0VHQUREUihtYXAtPndpbmRvdzEuYmFzZSk7CisJcGNpX3dyaXRlX3JlZygweDAwMDAwMDAwLCBTSDRfUENJTEFSMSk7CisJcGNpX3dyaXRlX3JlZygweDAwMDAwMDAwLCBTSDc3ODBfUENJTUJBUjEpOworCisJLyogTWFwIElPIHNwYWNlIGludG8gUENJIElPIHdpbmRvdworCSAqIFRoZSBJTyB3aW5kb3cgaXMgNjRLLVBDSUJJT1NfTUlOX0lPIGluIHNpemUKKwkgKiBJTyBhZGRyZXNzZXMgd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRoZQorCSAqIFBDSSBJTyB3aW5kb3cgYmFzZSBhZGRyZXNzCisJICovCisJcHJfZGVidWcoIlBDSTogTWFwcGluZyBJTyBhZGRyZXNzIDB4JXggLSAweCV4IHRvIGJhc2UgMHgleFxuIiwKKwkJIFBDSUJJT1NfTUlOX0lPLCAoNjQgPDwgMTApLAorCQkgU0g3NzgwX1BDSV9JT19CQVNFICsgUENJQklPU19NSU5fSU8pOworCisJLyogTk9URTogSSdtIGlnbm9yaW5nIHRoZSBQQ0kgZXJyb3IgSVJRcyBmb3Igbm93Li4KKwkgKiBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgdGhlIGludGVybmFsIGVycm9yIGludGVycnVwdHMgYW5kCisJICogRE1BIGludGVycnVwdHMuLi4KKwkgKi8KKworI2lmZGVmIENPTkZJR19TSF9SNzc4MFJQCisJcGNpX2ZpeHVwX3BjaWMoKTsKKyNlbmRpZgorCisJLyogU0g3NzgwIGluaXQgZG9uZSwgc2V0IGNlbnRyYWwgZnVuY3Rpb24gaW5pdCBjb21wbGV0ZSAqLworCS8qIHVzZSByb3VuZCByb2JpbiBtb2RlIHRvIHN0b3AgYSBkZXZpY2Ugc3RhcnZpbmcvb3ZlcnJ1bmluZyAqLworCXdvcmQgPSBTSDRfUENJQ1JfUFJFRklYIHwgU0g0X1BDSUNSX0NGSU4gfCBTSDRfUENJQ1JfRlRPOworCXBjaV93cml0ZV9yZWcod29yZCwgU0g0X1BDSUNSKTsKKworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzgwLmggYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3ODAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDJkMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc2g3NzgwLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqCUxvdy1MZXZlbCBQQ0kgU3VwcG9ydCBmb3IgU0g3NzgwIHRhcmdldHMKKyAqCisgKiAgRHVzdGluIE1jSW50aXJlIChkdXN0aW5Ac2Vuc29yaWEuY29tKSAoYykgMjAwMQorICogIFBhdWwgTXVuZHQgKGxldGhhbEBsaW51eC1zaC5vcmcpIChjKSAyMDAzCisgKgorICogIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICovCisKKyNpZm5kZWYgX1BDSV9TSDc3ODBfSF8KKyNkZWZpbmUgX1BDSV9TSDc3ODBfSF8KKworLyogUGxhdGZvcm0gU3BlY2lmaWMgVmFsdWVzICovCisjZGVmaW5lIFNINzc4MF9WRU5ET1JfSUQJMHgxOTEyCisjZGVmaW5lIFNINzc4MF9ERVZJQ0VfSUQJMHgwMDAyCisjZGVmaW5lIFNINzc4MV9ERVZJQ0VfSUQJMHgwMDAxCisKKy8qIFNINzc4MCBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZQlTSDc3ODBfUENJX1ZDUjAJCTB4RkUwMDAwMDAKKyNkZWZpbmUJU0g3NzgwX1BDSV9WQ1IxCQkweEZFMDAwMDA0CisjZGVmaW5lCVNINzc4MF9QQ0lfVkNSMgkJMHhGRTAwMDAwOAorCisvKiBTSDc3ODAgU3BlY2lmaWMgVmFsdWVzICovCisjZGVmaW5lIFNINzc4MF9QQ0lfQ09ORklHX0JBU0UJMHhGRDAwMDAwMAkvKiBDb25maWcgc3BhY2UgYmFzZSBhZGRyICovCisjZGVmaW5lIFNINzc4MF9QQ0lfQ09ORklHX1NJWkUJMHgwMTAwMDAwMAkvKiBDb25maWcgc3BhY2Ugc2l6ZSAqLworCisjZGVmaW5lIFNINzc4MF9QQ0lfTUVNT1JZX0JBU0UJMHhGRDAwMDAwMAkvKiBNZW1vcnkgc3BhY2UgYmFzZSBhZGRyICovCisjZGVmaW5lIFNINzc4MF9QQ0lfTUVNX1NJWkUJMHgwMTAwMDAwMAkvKiBTaXplIG9mIE1lbW9yeSB3aW5kb3cgKi8KKworI2RlZmluZSBTSDc3ODBfUENJX0lPX0JBU0UJMHhGRTQwMDAwMAkvKiBJTyBzcGFjZSBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgU0g3NzgwX1BDSV9JT19TSVpFCTB4MDA0MDAwMDAJLyogU2l6ZSBvZiBJTyB3aW5kb3cgKi8KKworI2RlZmluZSBTSDc3ODBfUENJUkVHX0JBU0UJMHhGRTA0MDAwMAkvKiBQQ0kgcmVncyBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgUENJX1JFRyhuKQkJKFNINzc4MF9QQ0lSRUdfQkFTRStuKQorCisvKiBTSDc3ODAgUENJIENvbmZpZyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0g3NzgwX1BDSVZJRAkJMHgwMDAJCS8qIFZlbmRvciBJRCAqLworI2RlZmluZSBTSDc3ODBfUENJRElECQkweDAwMgkJLyogRGV2aWNlIElEICovCisjZGVmaW5lIFNINzc4MF9QQ0lDTUQJCTB4MDA0CQkvKiBDb21tYW5kICovCisjZGVmaW5lIFNINzc4MF9QQ0lTVEFUVVMJMHgwMDYJCS8qIFN0YXR1cyAqLworI2RlZmluZSBTSDc3ODBfUENJUklECQkweDAwOAkJLyogUmV2aXNpb24gSUQgKi8KKyNkZWZpbmUgU0g3NzgwX1BDSVBJRgkJMHgwMDkJCS8qIFByb2dyYW0gSW50ZXJmYWNlICovCisjZGVmaW5lIFNINzc4MF9QQ0lTVUIJCTB4MDBhCQkvKiBTdWIgY2xhc3MgY29kZSAqLworI2RlZmluZSBTSDc3ODBfUENJQkNDCQkweDAwYgkJLyogQmFzZSBjbGFzcyBjb2RlICovCisjZGVmaW5lIFNINzc4MF9QQ0lDTFMJCTB4MDBjCQkvKiBDYWNoZSBsaW5lIHNpemUgKi8KKyNkZWZpbmUgU0g3NzgwX1BDSUxUTQkJMHgwMGQJCS8qIGxhdGVuY3kgdGltZXIgKi8KKyNkZWZpbmUgU0g3NzgwX1BDSUhEUgkJMHgwMGUJCS8qIEhlYWRlciB0eXBlICovCisjZGVmaW5lIFNINzc4MF9QQ0lCSVNUCQkweDAwZgkJLyogQklTVCAqLworI2RlZmluZSBTSDc3ODBfUENJSUJBUgkJMHgwMTAJCS8qIElPIEJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBTSDc3ODBfUENJTUJBUjAJCTB4MDE0CQkvKiBNZW1vcnkgYmFzZSBhZGRyZXNzMCAqLworI2RlZmluZSBTSDc3ODBfUENJTUJBUjEJCTB4MDE4CQkvKiBNZW1vcnkgYmFzZSBhZGRyZXNzMSAqLworI2RlZmluZSBTSDc3ODBfUENJU1ZJRAkJMHgwMmMJCS8qIFN1YiBzeXN0ZW0gdmVuZG9yIElEICovCisjZGVmaW5lIFNINzc4MF9QQ0lTSUQJCTB4MDJlCQkvKiBTdWIgc3lzdGVtIElEICovCisjZGVmaW5lIFNINzc4MF9QQ0lDUAkJMHgwMzQKKyNkZWZpbmUgU0g3NzgwX1BDSUlOVExJTkUJMHgwM2MJCS8qIEludGVycnVwdCBsaW5lICovCisjZGVmaW5lIFNINzc4MF9QQ0lJTlRQSU4JMHgwM2QJCS8qIEludGVycnVwdCBwaW4gKi8KKyNkZWZpbmUgU0g3NzgwX1BDSU1JTkdOVAkweDAzZQkJLyogTWludW11bSBncmFuZCAqLworI2RlZmluZSBTSDc3ODBfUENJTUFYTEFUCTB4MDNmCQkvKiBNYXhtdW0gbGF0ZW5jeSAqLworI2RlZmluZSBTSDc3ODBfUENJQ0lECQkweDA0MAorI2RlZmluZSBTSDc3ODBfUENJTklQCQkweDA0MQorI2RlZmluZSBTSDc3ODBfUENJUE1DCQkweDA0MgorI2RlZmluZSBTSDc3ODBfUENJUE1DU1IJCTB4MDQ0CisjZGVmaW5lIFNINzc4MF9QQ0lQTUNTUl9CU0UJMHgwNDYKKyNkZWZpbmUgU0g3NzgwX1BDSUNERAkJMHgwNDcKKworI2RlZmluZSBTSDc3ODBfUENJTUJSMAkJMHgxRTAKKyNkZWZpbmUgU0g3NzgwX1BDSU1CTVIwCQkweDFFNAorI2RlZmluZSBTSDc3ODBfUENJTUJSMgkJMHgxRjAKKyNkZWZpbmUgU0g3NzgwX1BDSU1CTVIyCQkweDFGNAorI2RlZmluZSBTSDc3ODBfUENJSU9CUgkJMHgxRjgKKyNkZWZpbmUgU0g3NzgwX1BDSUlPQk1SCQkweDFGQworI2RlZmluZSBTSDc3ODBfUENJQ1NDUjAJCTB4MjEwCQkvKiBDYWNoZSBTbm9vcDEgQ250LiBSZWdpc3RlciAqLworI2RlZmluZSBTSDc3ODBfUENJQ1NDUjEJCTB4MjE0CQkvKiBDYWNoZSBTbm9vcDIgQ250LiBSZWdpc3RlciAqLworI2RlZmluZSBTSDc3ODBfUENJQ1NBUjAJCTB4MjE4CS8qIENhY2hlIFNub29wMSBBZGRyLiBSZWdpc3RlciAqLworI2RlZmluZSBTSDc3ODBfUENJQ1NBUjEJCTB4MjFDCS8qIENhY2hlIFNub29wMiBBZGRyLiBSZWdpc3RlciAqLworCisvKiBHZW5lcmFsIE1lbW9yeSBDb25maWcgQWRkcmVzc2VzICovCisjZGVmaW5lIFNINzc4MF9DUzBfQkFTRV9BRERSCTB4MAorI2RlZmluZSBTSDc3ODBfTUVNX1JFR0lPTl9TSVpFCTB4MDQwMDAwMDAKKyNkZWZpbmUgU0g3NzgwX0NTMV9CQVNFX0FERFIJKFNINzc4MF9DUzBfQkFTRV9BRERSICsgU0g3NzgwX01FTV9SRUdJT05fU0laRSkKKyNkZWZpbmUgU0g3NzgwX0NTMl9CQVNFX0FERFIJKFNINzc4MF9DUzFfQkFTRV9BRERSICsgU0g3NzgwX01FTV9SRUdJT05fU0laRSkKKyNkZWZpbmUgU0g3NzgwX0NTM19CQVNFX0FERFIJKFNINzc4MF9DUzJfQkFTRV9BRERSICsgU0g3NzgwX01FTV9SRUdJT05fU0laRSkKKyNkZWZpbmUgU0g3NzgwX0NTNF9CQVNFX0FERFIJKFNINzc4MF9DUzNfQkFTRV9BRERSICsgU0g3NzgwX01FTV9SRUdJT05fU0laRSkKKyNkZWZpbmUgU0g3NzgwX0NTNV9CQVNFX0FERFIJKFNINzc4MF9DUzRfQkFTRV9BRERSICsgU0g3NzgwX01FTV9SRUdJT05fU0laRSkKKyNkZWZpbmUgU0g3NzgwX0NTNl9CQVNFX0FERFIJKFNINzc4MF9DUzVfQkFTRV9BRERSICsgU0g3NzgwX01FTV9SRUdJT05fU0laRSkKKworc3RydWN0IHNoNF9wY2lfYWRkcmVzc19tYXA7CisKKy8qIGFyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNzc4MC5jICovCitpbnQgc2g3NzgwX3BjaWNfaW5pdChzdHJ1Y3Qgc2g0X3BjaV9hZGRyZXNzX21hcCAqbWFwKTsKKworI2VuZGlmIC8qIF9QQ0lfU0g3NzgwX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zdDQwLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zdDQwLmMKaW5kZXggN2M4MWI4Yi4uNGFiNWVhNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2ktc3Q0MC5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXN0NDAuYwpAQCAtNzAsMTIgKzcwLDYgQEAKIHN0YXRpYyB2b2lkIHBjaV9zZXRfcmJhcl9yZWdpb24odW5zaWduZWQgaW50IHJlZ2lvbiwgICAgIHVuc2lnbmVkIGxvbmcgbG9jYWxBZGRyLAogCQkJIHVuc2lnbmVkIGxvbmcgcGNpT2Zmc2V0LCB1bnNpZ25lZCBsb25nIHJlZ2lvblNpemUpOwogCi0vKgotICogVGhlIHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycSBmdW5jdGlvbiBpcyBkZWZpbmVkIGluIHRoZSBhcHByb3ByaWF0ZQotICogYm9hcmQgc3BlY2lmaWMgY29kZSBhbmQgcmVmZXJlbmNlZCBoZXJlCi0gKi8KLWV4dGVybiBpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pOwotCiBzdGF0aWMgX19pbml0IHZvaWQgU2V0UENJUExMKHZvaWQpCiB7CiAJewpAQCAtNDIyLDEzICs0MTYsNiBAQAogLyogRXZlcnl0aGluZyBoYW5ncyBvZmYgdGhpcyAqLwogc3RhdGljIHN0cnVjdCBwY2lfYnVzICpwY2lfcm9vdF9idXM7CiAKLQotc3RhdGljIHU4IF9faW5pdCBub19zd2l6emxlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4ICogcGluKQotewotCXJldHVybiBQQ0lfU0xPVChkZXYtPmRldmZuKTsKLX0KLQotCiBzdGF0aWMgaW50IF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKIHsKIAlleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1vcnlfc3RhcnQsIG1lbW9yeV9lbmQ7CkBAIC00NjUsMTcgKzQ1MiwxMSBAQAogCS8qIG9rLCBkbyB0aGUgc2NhbiBtYW4gKi8KIAlwY2lfcm9vdF9idXMgPSBwY2lfc2Nhbl9idXMoMCwgJnN0NDBwY2lfY29uZmlnX29wcywgTlVMTCk7CiAJcGNpX2Fzc2lnbl91bmFzc2lnbmVkX3Jlc291cmNlcygpOwotCXBjaV9maXh1cF9pcnFzKG5vX3N3aXp6bGUsIHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycSk7CiAKIAlyZXR1cm4gMDsKIH0KLQogc3Vic3lzX2luaXRjYWxsKHBjaWJpb3NfaW5pdCk7CiAKLXZvaWQgX19pbml0IHBjaWJpb3NfZml4dXBfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpCi17Ci19Ci0KIC8qCiAgKiBQdWJsaXNoIGEgcmVnaW9uIG9mIGxvY2FsIGFkZHJlc3Mgc3BhY2Ugb3ZlciB0aGUgUENJIGJ1cwogICogdG8gb3RoZXIgZGV2aWNlcy4KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IDNkNTQ2YmEuLmQ0MzkzMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2kuYwpAQCAtMSwyMSArMSw0NSBAQAotLyogYXJjaC9zaC9rZXJuZWwvcGNpLmMKLSAqICRJZDogcGNpLmMsdiAxLjEgMjAwMy8wOC8yNCAxOToxNTo0NSBsZXRoYWwgRXhwICQKKy8qCisgKiBhcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDAyIE0uIFIuIEJyb3duICA8bXJicm93bkBsaW51eC1zaC5vcmc+Ci0gKiAKLSAqIAorICogQ29weXJpZ2h0IChjKSAyMDA0IC0gMjAwNiBQYXVsIE11bmR0ICA8bGV0aGFsQGxpbnV4LXNoLm9yZz4KKyAqCiAgKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGNvbGxlY3RlZCBoZXJlIHRvIHJlZHVjZSBkdXBsaWNhdGlvbiBvZiBjb21tb24KICAqIGNvZGUgYW1vbmdzdCB0aGUgbWFueSBwbGF0Zm9ybS1zcGVjaWZpYyBQQ0kgc3VwcG9ydCBjb2RlIGZpbGVzLgotICogCisgKgogICogVGhlc2Ugcm91dGluZXMgcmVxdWlyZSB0aGUgZm9sbG93aW5nIGJvYXJkLXNwZWNpZmljIHJvdXRpbmVzOgogICogdm9pZCBwY2liaW9zX2ZpeHVwX2lycXMoKTsKICAqCiAgKiBTZWUgaW5jbHVkZS9hc20tc2gvcGNpLmggZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RhdGljIGlubGluZSB1OCBicmlkZ2Vfc3dpenpsZSh1OCBwaW4sIHU4IHNsb3QpCit7CisJcmV0dXJuICgoKHBpbiAtIDEpICsgc2xvdCkgJSA0KSArIDE7Cit9CisKK3N0YXRpYyB1OCBfX2luaXQgc2ltcGxlX3N3aXp6bGUoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggKnBpbnApCit7CisJdTggcGluID0gKnBpbnA7CisKKwl3aGlsZSAoZGV2LT5idXMtPnBhcmVudCkgeworCQlwaW4gPSBicmlkZ2Vfc3dpenpsZShwaW4sIFBDSV9TTE9UKGRldi0+ZGV2Zm4pKTsKKwkJLyogTW92ZSB1cCB0aGUgY2hhaW4gb2YgYnJpZGdlcy4gKi8KKwkJZGV2ID0gZGV2LT5idXMtPnNlbGY7CisJfQorCSpwaW5wID0gcGluOworCisJLyogVGhlIHNsb3QgaXMgdGhlIHNsb3Qgb2YgdGhlIGxhc3QgYnJpZGdlLiAqLworCXJldHVybiBQQ0lfU0xPVChkZXYtPmRldmZuKTsKK30KIAogc3RhdGljIGludCBfX2luaXQgcGNpYmlvc19pbml0KHZvaWQpCiB7CkBAIC0yNiwyNiArNTAsMzIgQEAKICNpZmRlZiBDT05GSUdfUENJX0FVVE8KIAkvKiBhc3NpZ24gcmVzb3VyY2VzICovCiAJYnVzbm8gPSAwOwotCWZvciAocCA9IGJvYXJkX3BjaV9jaGFubmVsczsgcC0+cGNpX29wcyAhPSBOVUxMOyBwKyspIHsKKwlmb3IgKHAgPSBib2FyZF9wY2lfY2hhbm5lbHM7IHAtPnBjaV9vcHMgIT0gTlVMTDsgcCsrKQogCQlidXNubyA9IHBjaWF1dG9fYXNzaWduX3Jlc291cmNlcyhidXNubywgcCkgKyAxOwotCX0KICNlbmRpZgogCiAJLyogc2NhbiB0aGUgYnVzZXMgKi8KIAlidXNubyA9IDA7Ci0JZm9yIChwPSBib2FyZF9wY2lfY2hhbm5lbHM7IHAtPnBjaV9vcHMgIT0gTlVMTDsgcCsrKSB7CisJZm9yIChwID0gYm9hcmRfcGNpX2NoYW5uZWxzOyBwLT5wY2lfb3BzICE9IE5VTEw7IHArKykgewogCQlidXMgPSBwY2lfc2Nhbl9idXMoYnVzbm8sIHAtPnBjaV9vcHMsIHApOwotCQlidXNubyA9IGJ1cy0+c3Vib3JkaW5hdGUrMTsKKwkJYnVzbm8gPSBidXMtPnN1Ym9yZGluYXRlICsgMTsKIAl9CiAKLQkvKiBib2FyZC1zcGVjaWZpYyBmaXh1cHMgKi8KLQlwY2liaW9zX2ZpeHVwX2lycXMoKTsKKwlwY2lfZml4dXBfaXJxcyhzaW1wbGVfc3dpenpsZSwgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKTsKIAogCXJldHVybiAwOwogfQotCiBzdWJzeXNfaW5pdGNhbGwocGNpYmlvc19pbml0KTsKIAorLyoKKyAqICBDYWxsZWQgYWZ0ZXIgZWFjaCBidXMgaXMgcHJvYmVkLCBidXQgYmVmb3JlIGl0cyBjaGlsZHJlbgorICogIGFyZSBleGFtaW5lZC4KKyAqLwordm9pZCBfX2luaXQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlwY2lfcmVhZF9icmlkZ2VfYmFzZXMoYnVzKTsKK30KKwogdm9pZAogcGNpYmlvc191cGRhdGVfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHJlc291cmNlICpyb290LAogCQkJc3RydWN0IHJlc291cmNlICpyZXMsIGludCByZXNvdXJjZSkKQEAgLTYxLDEzICs5MSwxNyBAQAogCQluZXcgfD0gUENJX1JPTV9BRERSRVNTX0VOQUJMRTsKIAkJcmVnID0gZGV2LT5yb21fYmFzZV9yZWc7CiAJfSBlbHNlIHsKLQkJLyogU29tZWJvZHkgbWlnaHQgaGF2ZSBhc2tlZCBhbGxvY2F0aW9uIG9mIGEgbm9uLXN0YW5kYXJkIHJlc291cmNlICovCisJCS8qCisJCSAqIFNvbWVib2R5IG1pZ2h0IGhhdmUgYXNrZWQgYWxsb2NhdGlvbiBvZiBhIG5vbi1zdGFuZGFyZAorCQkgKiByZXNvdXJjZQorCQkgKi8KIAkJcmV0dXJuOwogCX0KLQkKKwogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCByZWcsIG5ldyk7CiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcmVnLCAmY2hlY2spOwotCWlmICgobmV3IF4gY2hlY2spICYgKChuZXcgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX0lPKSA/IFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSyA6IFBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spKSB7CisJaWYgKChuZXcgXiBjaGVjaykgJiAoKG5ldyAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pID8KKwkJUENJX0JBU0VfQUREUkVTU19JT19NQVNLIDogUENJX0JBU0VfQUREUkVTU19NRU1fTUFTSykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IEVycm9yIHdoaWxlIHVwZGF0aW5nIHJlZ2lvbiAiCiAJCSAgICAgICAiJXMvJWQgKCUwOHggIT0gJTA4eClcbiIsIHBjaV9uYW1lKGRldiksIHJlc291cmNlLAogCQkgICAgICAgbmV3LCBjaGVjayk7CkBAIC0xNDUsNyArMTc5LDggQEAKIAkJbGF0ID0gcGNpYmlvc19tYXhfbGF0ZW5jeTsKIAllbHNlCiAJCXJldHVybjsKLQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFNldHRpbmcgbGF0ZW5jeSB0aW1lciBvZiBkZXZpY2UgJXMgdG8gJWRcbiIsIHBjaV9uYW1lKGRldiksIGxhdCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBTZXR0aW5nIGxhdGVuY3kgdGltZXIgb2YgZGV2aWNlICVzIHRvICVkXG4iLAorCSAgICAgICBwY2lfbmFtZShkZXYpLCBsYXQpOwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCBsYXQpOwogfQogCkBAIC0xNTMsMyArMTg4LDM5IEBACiB7CiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBpcnEpOwogfQorCit2b2lkIF9faW9tZW0gKnBjaV9pb21hcChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFyLCB1bnNpZ25lZCBsb25nIG1heGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgYmFyKTsKKwl1bnNpZ25lZCBsb25nIGxlbiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LCBiYXIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MoZGV2LCBiYXIpOworCisJaWYgKHVubGlrZWx5KCFsZW4gfHwgIXN0YXJ0KSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKG1heGxlbiAmJiBsZW4gPiBtYXhsZW4pCisJCWxlbiA9IG1heGxlbjsKKworCS8qCisJICogUHJlc2VudGx5IHRoZSBJT1JFU09VUkNFX01FTSBjYXNlIGlzIGEgYml0IHNwZWNpYWwsIG1vc3QKKwkgKiBTSDc3NTEgc3R5bGUgUENJIGNvbnRyb2xsZXJzIGhhdmUgUENJIG1lbW9yeSBhdCBhIGZpeGVkCisJICogbG9jYXRpb24gaW4gdGhlIGFkZHJlc3Mgc3BhY2Ugd2hlcmUgbm8gcmVtYXBwaW5nIGlzIGRlc2lyZWQKKwkgKiAodHlwaWNhbGx5IGF0IDB4ZmQwMDAwMDAsIGJ1dCBpc19wY2lfbWVtYWRkcigpIHdpbGwga25vdworCSAqIGJlc3QpLiBXaXRoIHRoZSBJT1JFU09VUkNFX01FTSBjYXNlIG1vcmUgY2FyZSBoYXMgdG8gYmUgdGFrZW4KKwkgKiB0byBpbmhpYml0IHBhZ2UgdGFibGUgbWFwcGluZyBmb3IgbGVnYWN5IGNvcmVzLCBidXQgdGhpcyBpcworCSAqIHB1bnRlZCBvZmYgdG8gX19pb3JlbWFwKCkuCisJICoJCQkJCS0tIFBGTS4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCQlyZXR1cm4gaW9wb3J0X21hcChzdGFydCwgbGVuKTsKKwlpZiAoZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJcmV0dXJuIGlvcmVtYXAoc3RhcnQsIGxlbik7CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wocGNpX2lvbWFwKTsKKwordm9pZCBwY2lfaW91bm1hcChzdHJ1Y3QgcGNpX2RldiAqZGV2LCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJaW91bm1hcChhZGRyKTsKK30KK0VYUE9SVF9TWU1CT0wocGNpX2lvdW5tYXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZQppbmRleCBmMDVjZDk2Li41ZGE4OGE0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZQpAQCAtNiw5ICs2LDEwIEBACiAKIG9iai15CTo9IHByb2Nlc3MubyBzaWduYWwubyBlbnRyeS5vIHRyYXBzLm8gaXJxLm8gXAogCXB0cmFjZS5vIHNldHVwLm8gdGltZS5vIHN5c19zaC5vIHNlbWFwaG9yZS5vIFwKLQlpby5vIGlvX2dlbmVyaWMubyBzaF9rc3ltcy5vCisJaW8ubyBpb19nZW5lcmljLm8gc2hfa3N5bXMubyBzeXNjYWxscy5vCiAKIG9iai15CQkJCSs9IGNwdS8gdGltZXJzLworb2JqLSQoQ09ORklHX1ZTWVNDQUxMKQkJKz0gdnN5c2NhbGwvCiAKIG9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubwogb2JqLSQoQ09ORklHX0NGX0VOQUJMRVIpCSs9IGNmLWVuYWJsZXIubwpAQCAtMTgsMyArMTksNSBAQAogb2JqLSQoQ09ORklHX01PRFVMRVMpCQkrPSBtb2R1bGUubwogb2JqLSQoQ09ORklHX0VBUkxZX1BSSU5USykJKz0gZWFybHlfcHJpbnRrLm8KIG9iai0kKENPTkZJR19LRVhFQykJCSs9IG1hY2hpbmVfa2V4ZWMubyByZWxvY2F0ZV9rZXJuZWwubworb2JqLSQoQ09ORklHX0FQTSkJCSs9IGFwbS5vCitvYmotJChDT05GSUdfUE0pCQkrPSBwbS5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9hcG0uYyBiL2FyY2gvc2gva2VybmVsL2FwbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MWU3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9hcG0uYwpAQCAtMCwwICsxLDUzOSBAQAorLyoKKyAqIGJpb3MtbGVzcyBBUE0gZHJpdmVyIGZvciBocDY4MAorICoKKyAqIENvcHlyaWdodCAyMDA1IChjKSBBbmRyaXkgU2t1bHlzaCA8YXNrdWx5c2hAZ21haWwuY29tPgorICoKKyAqIGJhc2VkIG9uIEFSTSBBUE0gZHJpdmVyIGJ5CisgKiAgSmFtZXkgSGlja3MgPGphbWV5QGNybC5kZWMuY29tPgorICoKKyAqIGFkYXB0ZWQgZnJvbSB0aGUgQVBNIEJJT1MgZHJpdmVyIGZvciBMaW51eCBieQorICogIFN0ZXBoZW4gUm90aHdlbGwgKHNmckBsaW51eGNhcmUuY29tKQorICoKKyAqIEFQTSAxLjIgUmVmZXJlbmNlOgorICogICBJbnRlbCBDb3Jwb3JhdGlvbiwgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBZHZhbmNlZCBQb3dlciBNYW5hZ2VtZW50CisgKiAgIChBUE0pIEJJT1MgSW50ZXJmYWNlIFNwZWNpZmljYXRpb24sIFJldmlzaW9uIDEuMiwgRmVicnVhcnkgMTk5Ni4KKyAqCisgKiBbVGhpcyBkb2N1bWVudCBpcyBhdmFpbGFibGUgZnJvbSBNaWNyb3NvZnQgYXQ6CisgKiAgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vaHdkZXYvYnVzYmlvcy9hbXBfMTIuaHRtXQorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvYXBtX2Jpb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX2xlZ2FjeS5oPgorI2luY2x1ZGUgPGFzbS9hcG0uaD4KKworI2RlZmluZSBNT0ROQU1FICJhcG0iCisKKy8qCisgKiBUaGUgYXBtX2Jpb3MgZGV2aWNlIGlzIG9uZSBvZiB0aGUgbWlzYyBjaGFyIGRldmljZXMuCisgKiBUaGlzIGlzIGl0cyBtaW5vciBudW1iZXIuCisgKi8KKyNkZWZpbmUgQVBNX01JTk9SX0RFVgkJCTEzNAorCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgZXZlbnRzIHN0b3JlZAorICovCisjZGVmaW5lIEFQTV9NQVhfRVZFTlRTCQkJMTYKKworc3RydWN0IGFwbV9xdWV1ZSB7CisJdW5zaWduZWQgaW50CQlldmVudF9oZWFkOworCXVuc2lnbmVkIGludAkJZXZlbnRfdGFpbDsKKwlhcG1fZXZlbnRfdAkJZXZlbnRzW0FQTV9NQVhfRVZFTlRTXTsKK307CisKKy8qCisgKiBUaGUgcGVyLWZpbGUgQVBNIGRhdGEKKyAqLworc3RydWN0IGFwbV91c2VyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisKKwl1bnNpZ25lZCBpbnQJCXN1c2VyOiAxOworCXVuc2lnbmVkIGludAkJd3JpdGVyOiAxOworCXVuc2lnbmVkIGludAkJcmVhZGVyOiAxOworCisJaW50CQkJc3VzcGVuZF9yZXN1bHQ7CisJdW5zaWduZWQgaW50CQlzdXNwZW5kX3N0YXRlOworI2RlZmluZSBTVVNQRU5EX05PTkUJMAkJLyogbm8gc3VzcGVuZCBwZW5kaW5nICovCisjZGVmaW5lIFNVU1BFTkRfUEVORElORwkxCQkvKiBzdXNwZW5kIHBlbmRpbmcgcmVhZCAqLworI2RlZmluZSBTVVNQRU5EX1JFQUQJMgkJLyogc3VzcGVuZCByZWFkLCBwZW5kaW5nIGFjayAqLworI2RlZmluZSBTVVNQRU5EX0FDS0VECTMJCS8qIHN1c3BlbmQgYWNrZWQgKi8KKyNkZWZpbmUgU1VTUEVORF9ET05FCTQJCS8qIHN1c3BlbmQgY29tcGxldGVkICovCisKKwlzdHJ1Y3QgYXBtX3F1ZXVlCXF1ZXVlOworfTsKKworLyoKKyAqIExvY2FsIHZhcmlhYmxlcworICovCitzdGF0aWMgaW50IHN1c3BlbmRzX3BlbmRpbmc7CisKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChhcG1fd2FpdHF1ZXVlKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChhcG1fc3VzcGVuZF93YWl0cXVldWUpOworCisvKgorICogVGhpcyBpcyBhIGxpc3Qgb2YgZXZlcnlvbmUgd2hvIGhhcyBvcGVuZWQgL2Rldi9hcG1fYmlvcworICovCitzdGF0aWMgREVDTEFSRV9SV1NFTSh1c2VyX2xpc3RfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGFwbV91c2VyX2xpc3QpOworCisvKgorICoga2FwbWQgaW5mby4gIGthcG1kIHByb3ZpZGVzIHVzIGEgcHJvY2VzcyBjb250ZXh0IHRvIGhhbmRsZQorICogIkFQTSIgZXZlbnRzIHdpdGhpbiAtIHNwZWNpZmljYWxseSBuZWNlc3NhcnkgaWYgd2UncmUgZ29pbmcKKyAqIHRvIGJlIHN1c3BlbmRpbmcgdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGthcG1kX3dhaXQpOworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihrYXBtZF9leGl0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soa2FwbWRfcXVldWVfbG9jayk7CitzdGF0aWMgc3RydWN0IGFwbV9xdWV1ZSBrYXBtZF9xdWV1ZTsKKworaW50IGFwbV9zdXNwZW5kZWQ7CitFWFBPUlRfU1lNQk9MKGFwbV9zdXNwZW5kZWQpOworCisvKiBQbGF0Zm9ybS1zcGVjaWZpYyBhcG1fcmVhZF9wcm9jKCkuICovCitpbnQgKCphcG1fZ2V0X2luZm8pKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBmcG9zLCBpbnQgbGVuZ3RoKTsKK0VYUE9SVF9TWU1CT0woYXBtX2dldF9pbmZvKTsKKworLyoKKyAqIEFQTSBldmVudCBxdWV1ZSBtYW5hZ2VtZW50LgorICovCitzdGF0aWMgaW5saW5lIGludCBxdWV1ZV9lbXB0eShzdHJ1Y3QgYXBtX3F1ZXVlICpxKQoreworCXJldHVybiBxLT5ldmVudF9oZWFkID09IHEtPmV2ZW50X3RhaWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgYXBtX2V2ZW50X3QgcXVldWVfZ2V0X2V2ZW50KHN0cnVjdCBhcG1fcXVldWUgKnEpCit7CisJcS0+ZXZlbnRfdGFpbCA9IChxLT5ldmVudF90YWlsICsgMSkgJSBBUE1fTUFYX0VWRU5UUzsKKwlyZXR1cm4gcS0+ZXZlbnRzW3EtPmV2ZW50X3RhaWxdOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9hZGRfZXZlbnQoc3RydWN0IGFwbV9xdWV1ZSAqcSwgYXBtX2V2ZW50X3QgZXZlbnQpCit7CisJcS0+ZXZlbnRfaGVhZCA9IChxLT5ldmVudF9oZWFkICsgMSkgJSBBUE1fTUFYX0VWRU5UUzsKKwlpZiAocS0+ZXZlbnRfaGVhZCA9PSBxLT5ldmVudF90YWlsKSB7CisJCXN0YXRpYyBpbnQgbm90aWZpZWQ7CisKKwkJaWYgKG5vdGlmaWVkKysgPT0gMCkKKwkJCXByaW50ayhLRVJOX0VSUiAiYXBtOiBhbiBldmVudCBxdWV1ZSBvdmVyZmxvd2VkXG4iKTsKKworCQlxLT5ldmVudF90YWlsID0gKHEtPmV2ZW50X3RhaWwgKyAxKSAlIEFQTV9NQVhfRVZFTlRTOworCX0KKwlxLT5ldmVudHNbcS0+ZXZlbnRfaGVhZF0gPSBldmVudDsKK30KKworc3RhdGljIHZvaWQgcXVldWVfZXZlbnRfb25lX3VzZXIoc3RydWN0IGFwbV91c2VyICphcywgYXBtX2V2ZW50X3QgZXZlbnQpCit7CisJaWYgKGFzLT5zdXNlciAmJiBhcy0+d3JpdGVyKSB7CisJCXN3aXRjaCAoZXZlbnQpIHsKKwkJY2FzZSBBUE1fU1lTX1NVU1BFTkQ6CisJCWNhc2UgQVBNX1VTRVJfU1VTUEVORDoKKwkJCS8qCisJCQkgKiBJZiB0aGlzIHVzZXIgYWxyZWFkeSBoYXMgYSBzdXNwZW5kIHBlbmRpbmcsCisJCQkgKiBkb24ndCBxdWV1ZSBhbm90aGVyIG9uZS4KKwkJCSAqLworCQkJaWYgKGFzLT5zdXNwZW5kX3N0YXRlICE9IFNVU1BFTkRfTk9ORSkKKwkJCQlyZXR1cm47CisKKwkJCWFzLT5zdXNwZW5kX3N0YXRlID0gU1VTUEVORF9QRU5ESU5HOworCQkJc3VzcGVuZHNfcGVuZGluZysrOworCQkJYnJlYWs7CisJCX0KKwl9CisJcXVldWVfYWRkX2V2ZW50KCZhcy0+cXVldWUsIGV2ZW50KTsKK30KKworc3RhdGljIHZvaWQgcXVldWVfZXZlbnQoYXBtX2V2ZW50X3QgZXZlbnQsIHN0cnVjdCBhcG1fdXNlciAqc2VuZGVyKQoreworCXN0cnVjdCBhcG1fdXNlciAqYXM7CisKKwlkb3duX3JlYWQoJnVzZXJfbGlzdF9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYXMsICZhcG1fdXNlcl9saXN0LCBsaXN0KQorCQlpZiAoYXMgIT0gc2VuZGVyICYmIGFzLT5yZWFkZXIpCisJCQlxdWV1ZV9ldmVudF9vbmVfdXNlcihhcywgZXZlbnQpOworCisJdXBfcmVhZCgmdXNlcl9saXN0X2xvY2spOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmYXBtX3dhaXRxdWV1ZSk7Cit9CisKKy8qKgorICogYXBtX3F1ZXVlX2V2ZW50IC0gcXVldWUgYW4gQVBNIGV2ZW50IGZvciBrYXBtZAorICogQGV2ZW50OiBBUE0gZXZlbnQKKyAqCisgKiBRdWV1ZSBhbiBBUE0gZXZlbnQgZm9yIGthcG1kIHRvIHByb2Nlc3MgYW5kIHVsdGltYXRlbHkgdGFrZSB0aGUKKyAqIGFwcHJvcHJpYXRlIGFjdGlvbi4gIE9ubHkgYSBzdWJzZXQgb2YgZXZlbnRzIGFyZSBoYW5kbGVkOgorICogICAlQVBNX0xPV19CQVRURVJZCisgKiAgICVBUE1fUE9XRVJfU1RBVFVTX0NIQU5HRQorICogICAlQVBNX1VTRVJfU1VTUEVORAorICogICAlQVBNX1NZU19TVVNQRU5ECisgKiAgICVBUE1fQ1JJVElDQUxfU1VTUEVORAorICovCit2b2lkIGFwbV9xdWV1ZV9ldmVudChhcG1fZXZlbnRfdCBldmVudCkKK3sKKwlzcGluX2xvY2tfaXJxKCZrYXBtZF9xdWV1ZV9sb2NrKTsKKwlxdWV1ZV9hZGRfZXZlbnQoJmthcG1kX3F1ZXVlLCBldmVudCk7CisJc3Bpbl91bmxvY2tfaXJxKCZrYXBtZF9xdWV1ZV9sb2NrKTsKKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgma2FwbWRfd2FpdCk7Cit9CitFWFBPUlRfU1lNQk9MKGFwbV9xdWV1ZV9ldmVudCk7CisKK3N0YXRpYyB2b2lkIGFwbV9zdXNwZW5kKHZvaWQpCit7CisJc3RydWN0IGFwbV91c2VyICphczsKKwlpbnQgZXJyOworCisJYXBtX3N1c3BlbmRlZCA9IDE7CisJZXJyID0gcG1fc3VzcGVuZChQTV9TVVNQRU5EX01FTSk7CisKKwkvKgorCSAqIEFueW9uZSBvbiB0aGUgQVBNIHF1ZXVlcyB3aWxsIHRoaW5rIHdlJ3JlIHN0aWxsIHN1c3BlbmRlZC4KKwkgKiBTZW5kIGEgbWVzc2FnZSBzbyBldmVyeW9uZSBrbm93cyB3ZSdyZSBub3cgYXdha2UgYWdhaW4uCisJICovCisJcXVldWVfZXZlbnQoQVBNX05PUk1BTF9SRVNVTUUsIE5VTEwpOworCisJLyoKKwkgKiBGaW5hbGx5LCB3YWtlIHVwIGFueW9uZSB3aG8gaXMgc2xlZXBpbmcgb24gdGhlIHN1c3BlbmQuCisJICovCisJZG93bl9yZWFkKCZ1c2VyX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShhcywgJmFwbV91c2VyX2xpc3QsIGxpc3QpIHsKKwkJYXMtPnN1c3BlbmRfcmVzdWx0ID0gZXJyOworCQlhcy0+c3VzcGVuZF9zdGF0ZSA9IFNVU1BFTkRfRE9ORTsKKwl9CisJdXBfcmVhZCgmdXNlcl9saXN0X2xvY2spOworCisJd2FrZV91cCgmYXBtX3N1c3BlbmRfd2FpdHF1ZXVlKTsKKwlhcG1fc3VzcGVuZGVkID0gMDsKK30KKworc3RhdGljIHNzaXplX3QgYXBtX3JlYWQoc3RydWN0IGZpbGUgKmZwLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGFwbV91c2VyICphcyA9IGZwLT5wcml2YXRlX2RhdGE7CisJYXBtX2V2ZW50X3QgZXZlbnQ7CisJaW50IGkgPSBjb3VudCwgcmV0ID0gMDsKKworCWlmIChjb3VudCA8IHNpemVvZihhcG1fZXZlbnRfdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHF1ZXVlX2VtcHR5KCZhcy0+cXVldWUpICYmIGZwLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJcmV0dXJuIC1FQUdBSU47CisKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXBtX3dhaXRxdWV1ZSwgIXF1ZXVlX2VtcHR5KCZhcy0+cXVldWUpKTsKKworCXdoaWxlICgoaSA+PSBzaXplb2YoZXZlbnQpKSAmJiAhcXVldWVfZW1wdHkoJmFzLT5xdWV1ZSkpIHsKKwkJZXZlbnQgPSBxdWV1ZV9nZXRfZXZlbnQoJmFzLT5xdWV1ZSk7CisKKwkJcmV0ID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWYsICZldmVudCwgc2l6ZW9mKGV2ZW50KSkpCisJCQlicmVhazsKKworCQlpZiAoZXZlbnQgPT0gQVBNX1NZU19TVVNQRU5EIHx8IGV2ZW50ID09IEFQTV9VU0VSX1NVU1BFTkQpCisJCQlhcy0+c3VzcGVuZF9zdGF0ZSA9IFNVU1BFTkRfUkVBRDsKKworCQlidWYgKz0gc2l6ZW9mKGV2ZW50KTsKKwkJaSAtPSBzaXplb2YoZXZlbnQpOworCX0KKworCWlmIChpIDwgY291bnQpCisJCXJldCA9IGNvdW50IC0gaTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXBtX3BvbGwoc3RydWN0IGZpbGUgKmZwLCBwb2xsX3RhYmxlICogd2FpdCkKK3sKKwlzdHJ1Y3QgYXBtX3VzZXIgKmFzID0gZnAtPnByaXZhdGVfZGF0YTsKKworCXBvbGxfd2FpdChmcCwgJmFwbV93YWl0cXVldWUsIHdhaXQpOworCXJldHVybiBxdWV1ZV9lbXB0eSgmYXMtPnF1ZXVlKSA/IDAgOiBQT0xMSU4gfCBQT0xMUkROT1JNOworfQorCisvKgorICogYXBtX2lvY3RsIC0gaGFuZGxlIEFQTSBpb2N0bAorICoKKyAqIEFQTV9JT0NfU1VTUEVORAorICogICBUaGlzIElPQ1RMIGlzIG92ZXJsb2FkZWQsIGFuZCBwZXJmb3JtcyB0d28gZnVuY3Rpb25zLiAgSXQgaXMgdXNlZCB0bzoKKyAqICAgICAtIGluaXRpYXRlIGEgc3VzcGVuZAorICogICAgIC0gYWNrbm93bGVkZ2UgYSBzdXNwZW5kIHJlYWQgZnJvbSAvZGV2L2FwbV9iaW9zLgorICogICBPbmx5IHdoZW4gZXZlcnlvbmUgd2hvIGhhcyBvcGVuZWQgL2Rldi9hcG1fYmlvcyB3aXRoIHdyaXRlIHBlcm1pc3Npb24KKyAqICAgaGFzIGFja25vd2xlZGdlIGRvZXMgdGhlIGFjdHVhbCBzdXNwZW5kIGhhcHBlbi4KKyAqLworc3RhdGljIGludAorYXBtX2lvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQoreworCXN0cnVjdCBhcG1fdXNlciAqYXMgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCWlmICghYXMtPnN1c2VyIHx8ICFhcy0+d3JpdGVyKQorCQlyZXR1cm4gLUVQRVJNOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFQTV9JT0NfU1VTUEVORDoKKwkJYXMtPnN1c3BlbmRfcmVzdWx0ID0gLUVJTlRSOworCisJCWlmIChhcy0+c3VzcGVuZF9zdGF0ZSA9PSBTVVNQRU5EX1JFQUQpIHsKKwkJCS8qCisJCQkgKiBJZiB3ZSByZWFkIGEgc3VzcGVuZCBjb21tYW5kIGZyb20gL2Rldi9hcG1fYmlvcywKKwkJCSAqIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgQVBNX0lPQ19TVVNQRU5EIGlvY3RsIGlzCisJCQkgKiBpbnRlcnByZXRlZCBhcyBhbiBhY2tub3dsZWRnZS4KKwkJCSAqLworCQkJYXMtPnN1c3BlbmRfc3RhdGUgPSBTVVNQRU5EX0FDS0VEOworCQkJc3VzcGVuZHNfcGVuZGluZy0tOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIE90aGVyd2lzZSBpdCBpcyBhIHJlcXVlc3QgdG8gc3VzcGVuZCB0aGUgc3lzdGVtLgorCQkJICogUXVldWUgYW4gZXZlbnQgZm9yIGFsbCByZWFkZXJzLCBhbmQgZXhwZWN0IGFuCisJCQkgKiBhY2tub3dsZWRnZSBmcm9tIGFsbCB3cml0ZXJzIHdobyBoYXZlbid0IGFscmVhZHkKKwkJCSAqIGFja25vd2xlZGdlZC4KKwkJCSAqLworCQkJcXVldWVfZXZlbnQoQVBNX1VTRVJfU1VTUEVORCwgYXMpOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhlcmUgYXJlIG5vIGZ1cnRoZXIgYWNrbm93bGVkZ2VzIHJlcXVpcmVkLCBzdXNwZW5kCisJCSAqIHRoZSBzeXN0ZW0uCisJCSAqLworCQlpZiAoc3VzcGVuZHNfcGVuZGluZyA9PSAwKQorCQkJYXBtX3N1c3BlbmQoKTsKKworCQkvKgorCQkgKiBXYWl0IGZvciB0aGUgc3VzcGVuZC9yZXN1bWUgdG8gY29tcGxldGUuICBJZiB0aGVyZSBhcmUKKwkJICogcGVuZGluZyBhY2tub3dsZWRnZXMsIHdlIHdhaXQgaGVyZSBmb3IgdGhlbS4KKwkJICoKKwkJICogTm90ZSB0aGF0IHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIFBNIHN1YnN5c3RlbSBkb2VzCisJCSAqIG5vdCBraWNrIHVzIG91dCBvZiB0aGUgd2FpdCB3aGVuIGl0IHN1c3BlbmRzIHRoZSB0aHJlYWRzLgorCQkgKi8KKwkJZmxhZ3MgPSBjdXJyZW50LT5mbGFnczsKKwkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTk9GUkVFWkU7CisKKwkJLyoKKwkJICogTm90ZTogZG8gbm90IGFsbG93IGEgdGhyZWFkIHdoaWNoIGlzIGFja2luZyB0aGUgc3VzcGVuZAorCQkgKiB0byBlc2NhcGUgdW50aWwgdGhlIHJlc3VtZSBpcyBjb21wbGV0ZS4KKwkJICovCisJCWlmIChhcy0+c3VzcGVuZF9zdGF0ZSA9PSBTVVNQRU5EX0FDS0VEKQorCQkJd2FpdF9ldmVudChhcG1fc3VzcGVuZF93YWl0cXVldWUsCisJCQkJCSBhcy0+c3VzcGVuZF9zdGF0ZSA9PSBTVVNQRU5EX0RPTkUpOworCQllbHNlCisJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoYXBtX3N1c3BlbmRfd2FpdHF1ZXVlLAorCQkJCQkgYXMtPnN1c3BlbmRfc3RhdGUgPT0gU1VTUEVORF9ET05FKTsKKworCQljdXJyZW50LT5mbGFncyA9IGZsYWdzOworCQllcnIgPSBhcy0+c3VzcGVuZF9yZXN1bHQ7CisJCWFzLT5zdXNwZW5kX3N0YXRlID0gU1VTUEVORF9OT05FOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGFwbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IGFwbV91c2VyICphcyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJZG93bl93cml0ZSgmdXNlcl9saXN0X2xvY2spOworCWxpc3RfZGVsKCZhcy0+bGlzdCk7CisJdXBfd3JpdGUoJnVzZXJfbGlzdF9sb2NrKTsKKworCS8qCisJICogV2UgYXJlIG5vdyB1bmhvb2tlZCBmcm9tIHRoZSBjaGFpbi4gIEFzIGZhciBhcyBuZXcKKwkgKiBldmVudHMgYXJlIGNvbmNlcm5lZCwgd2Ugbm8gbG9uZ2VyIGV4aXN0LiAgSG93ZXZlciwgd2UKKwkgKiBuZWVkIHRvIGJhbGFuY2Ugc3VzcGVuZHNfcGVuZGluZywgd2hpY2ggbWVhbnMgdGhlCisJICogcG9zc2liaWxpdHkgb2Ygc2xlZXBpbmcuCisJICovCisJaWYgKGFzLT5zdXNwZW5kX3N0YXRlICE9IFNVU1BFTkRfTk9ORSkgeworCQlzdXNwZW5kc19wZW5kaW5nIC09IDE7CisJCWlmIChzdXNwZW5kc19wZW5kaW5nID09IDApCisJCQlhcG1fc3VzcGVuZCgpOworCX0KKworCWtmcmVlKGFzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcG1fb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXN0cnVjdCBhcG1fdXNlciAqYXM7CisKKwlhcyA9IGt6YWxsb2Moc2l6ZW9mKCphcyksIEdGUF9LRVJORUwpOworCWlmIChhcykgeworCQkvKgorCQkgKiBYWFggLSB0aGlzIGlzIGEgdGlueSBiaXQgYnJva2VuLCB3aGVuIHdlIGNvbnNpZGVyIEJTRAorCQkgKiBwcm9jZXNzIGFjY291bnRpbmcuIElmIHRoZSBkZXZpY2UgaXMgb3BlbmVkIGJ5IHJvb3QsIHdlCisJCSAqIGluc3RhbnRseSBmbGFnIHRoYXQgd2UgdXNlZCBzdXBlcnVzZXIgcHJpdnMuIFdobyBrbm93cywKKwkJICogd2UgbWlnaHQgY2xvc2UgdGhlIGRldmljZSBpbW1lZGlhdGVseSB3aXRob3V0IGRvaW5nIGEKKwkJICogcHJpdmlsZWdlZCBvcGVyYXRpb24gLS0gY2V2YW5zCisJCSAqLworCQlhcy0+c3VzZXIgPSBjYXBhYmxlKENBUF9TWVNfQURNSU4pOworCQlhcy0+d3JpdGVyID0gKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSA9PSBGTU9ERV9XUklURTsKKwkJYXMtPnJlYWRlciA9IChmaWxwLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA9PSBGTU9ERV9SRUFEOworCisJCWRvd25fd3JpdGUoJnVzZXJfbGlzdF9sb2NrKTsKKwkJbGlzdF9hZGQoJmFzLT5saXN0LCAmYXBtX3VzZXJfbGlzdCk7CisJCXVwX3dyaXRlKCZ1c2VyX2xpc3RfbG9jayk7CisKKwkJZmlscC0+cHJpdmF0ZV9kYXRhID0gYXM7CisJfQorCisJcmV0dXJuIGFzID8gMCA6IC1FTk9NRU07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFwbV9iaW9zX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IGFwbV9yZWFkLAorCS5wb2xsCQk9IGFwbV9wb2xsLAorCS5pb2N0bAkJPSBhcG1faW9jdGwsCisJLm9wZW4JCT0gYXBtX29wZW4sCisJLnJlbGVhc2UJPSBhcG1fcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBhcG1fZGV2aWNlID0geworCS5taW5vcgkJPSBBUE1fTUlOT1JfREVWLAorCS5uYW1lCQk9ICJhcG1fYmlvcyIsCisJLmZvcHMJCT0gJmFwbV9iaW9zX2ZvcHMKK307CisKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCisvKgorICogQXJndW1lbnRzLCB3aXRoIHN5bWJvbHMgZnJvbSBsaW51eC9hcG1fYmlvcy5oLgorICoKKyAqICAgMCkgTGludXggZHJpdmVyIHZlcnNpb24gKHRoaXMgd2lsbCBjaGFuZ2UgaWYgZm9ybWF0IGNoYW5nZXMpCisgKiAgIDEpIEFQTSBCSU9TIFZlcnNpb24uICBVc3VhbGx5IDEuMCwgMS4xIG9yIDEuMi4KKyAqICAgMikgQVBNIGZsYWdzIGZyb20gQVBNIEluc3RhbGxhdGlvbiBDaGVjayAoMHgwMCk6CisgKgliaXQgMDogQVBNXzE2X0JJVF9TVVBQT1JUCisgKgliaXQgMTogQVBNXzMyX0JJVF9TVVBQT1JUCisgKgliaXQgMjogQVBNX0lETEVfU0xPV1NfQ0xPQ0sKKyAqCWJpdCAzOiBBUE1fQklPU19ESVNBQkxFRAorICoJYml0IDQ6IEFQTV9CSU9TX0RJU0VOR0FHRUQKKyAqICAgMykgQUMgbGluZSBzdGF0dXMKKyAqCTB4MDA6IE9mZi1saW5lCisgKgkweDAxOiBPbi1saW5lCisgKgkweDAyOiBPbiBiYWNrdXAgcG93ZXIgKEJJT1MgPj0gMS4xIG9ubHkpCisgKgkweGZmOiBVbmtub3duCisgKiAgIDQpIEJhdHRlcnkgc3RhdHVzCisgKgkweDAwOiBIaWdoCisgKgkweDAxOiBMb3cKKyAqCTB4MDI6IENyaXRpY2FsCisgKgkweDAzOiBDaGFyZ2luZworICoJMHgwNDogU2VsZWN0ZWQgYmF0dGVyeSBub3QgcHJlc2VudCAoQklPUyA+PSAxLjIgb25seSkKKyAqCTB4ZmY6IFVua25vd24KKyAqICAgNSkgQmF0dGVyeSBmbGFnCisgKgliaXQgMDogSGlnaAorICoJYml0IDE6IExvdworICoJYml0IDI6IENyaXRpY2FsCisgKgliaXQgMzogQ2hhcmdpbmcKKyAqCWJpdCA3OiBObyBzeXN0ZW0gYmF0dGVyeQorICoJMHhmZjogVW5rbm93bgorICogICA2KSBSZW1haW5pbmcgYmF0dGVyeSBsaWZlIChwZXJjZW50YWdlIG9mIGNoYXJnZSk6CisgKgkwLTEwMDogdmFsaWQKKyAqCS0xOiBVbmtub3duCisgKiAgIDcpIFJlbWFpbmluZyBiYXR0ZXJ5IGxpZmUgKHRpbWUgdW5pdHMpOgorICoJTnVtYmVyIG9mIHJlbWFpbmluZyBtaW51dGVzIG9yIHNlY29uZHMKKyAqCS0xOiBVbmtub3duCisgKiAgIDgpIG1pbiA9IG1pbnV0ZXM7IHNlYyA9IHNlY29uZHMKKyAqLworc3RhdGljIGludCBhcG1fcmVhZF9wcm9jKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBmcG9zLCBpbnQgbGVuZ3RoKQoreworCWlmIChsaWtlbHkoYXBtX2dldF9pbmZvKSkKKwkJcmV0dXJuIGFwbV9nZXRfaW5mbyhidWYsIHN0YXJ0LCBmcG9zLCBsZW5ndGgpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBrYXBtZCh2b2lkICphcmcpCit7CisJZGFlbW9uaXplKCJrYXBtZCIpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PRlJFRVpFOworCisJZG8geworCQlhcG1fZXZlbnRfdCBldmVudDsKKworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoa2FwbWRfd2FpdCwKKwkJCQkhcXVldWVfZW1wdHkoJmthcG1kX3F1ZXVlKSB8fCAhcG1fYWN0aXZlKTsKKworCQlpZiAoIXBtX2FjdGl2ZSkKKwkJCWJyZWFrOworCisJCXNwaW5fbG9ja19pcnEoJmthcG1kX3F1ZXVlX2xvY2spOworCQlldmVudCA9IDA7CisJCWlmICghcXVldWVfZW1wdHkoJmthcG1kX3F1ZXVlKSkKKwkJCWV2ZW50ID0gcXVldWVfZ2V0X2V2ZW50KCZrYXBtZF9xdWV1ZSk7CisJCXNwaW5fdW5sb2NrX2lycSgma2FwbWRfcXVldWVfbG9jayk7CisKKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIDA6CisJCQlicmVhazsKKworCQljYXNlIEFQTV9MT1dfQkFUVEVSWToKKwkJY2FzZSBBUE1fUE9XRVJfU1RBVFVTX0NIQU5HRToKKwkJCXF1ZXVlX2V2ZW50KGV2ZW50LCBOVUxMKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQVBNX1VTRVJfU1VTUEVORDoKKwkJY2FzZSBBUE1fU1lTX1NVU1BFTkQ6CisJCQlxdWV1ZV9ldmVudChldmVudCwgTlVMTCk7CisJCQlpZiAoc3VzcGVuZHNfcGVuZGluZyA9PSAwKQorCQkJCWFwbV9zdXNwZW5kKCk7CisJCQlicmVhazsKKworCQljYXNlIEFQTV9DUklUSUNBTF9TVVNQRU5EOgorCQkJYXBtX3N1c3BlbmQoKTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoMSk7CisKKwljb21wbGV0ZV9hbmRfZXhpdCgma2FwbWRfZXhpdCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFwbV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXBtX2FjdGl2ZSA9IDE7CisKKwlyZXQgPSBrZXJuZWxfdGhyZWFkKGthcG1kLCBOVUxMLCBDTE9ORV9LRVJORUwpOworCWlmICh1bmxpa2VseShyZXQgPCAwKSkgeworCQlwbV9hY3RpdmUgPSAwOworCQlyZXR1cm4gcmV0OworCX0KKworCWNyZWF0ZV9wcm9jX2luZm9fZW50cnkoImFwbSIsIDAsIE5VTEwsIGFwbV9yZWFkX3Byb2MpOworCisJcmV0ID0gbWlzY19yZWdpc3RlcigmYXBtX2RldmljZSk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgeworCQlyZW1vdmVfcHJvY19lbnRyeSgiYXBtIiwgTlVMTCk7CisKKwkJcG1fYWN0aXZlID0gMDsKKwkJd2FrZV91cCgma2FwbWRfd2FpdCk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmthcG1kX2V4aXQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhcG1fZXhpdCh2b2lkKQoreworCW1pc2NfZGVyZWdpc3RlcigmYXBtX2RldmljZSk7CisJcmVtb3ZlX3Byb2NfZW50cnkoImFwbSIsIE5VTEwpOworCisJcG1fYWN0aXZlID0gMDsKKwl3YWtlX3VwKCZrYXBtZF93YWl0KTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrYXBtZF9leGl0KTsKK30KKworbW9kdWxlX2luaXQoYXBtX2luaXQpOworbW9kdWxlX2V4aXQoYXBtX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTdGVwaGVuIFJvdGh3ZWxsLCBBbmRyaXkgU2t1bHlzaCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBZHZhbmNlZCBQb3dlciBNYW5hZ2VtZW50Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jZi1lbmFibGVyLmMgYi9hcmNoL3NoL2tlcm5lbC9jZi1lbmFibGVyLmMKaW5kZXggZjFmOWFiOC4uM2U1ZmExZSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY2YtZW5hYmxlci5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NmLWVuYWJsZXIuYwpAQCAtMTAsNyArMTAsOCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKQEAgLTMyLDggKzMzLDYgQEAKIC8qIFNINCBjYW4ndCBhY2Nlc3MgUENNQ0lBIGludGVyZmFjZSB0aHJvdWdoIFAyIGFyZWEuCiAgKiB3ZSBtdXN0IHJlbWFwIGl0IHdpdGggYXBwcm9wcmVhdGUgYXR0cmlidXRlIGJpdCBvZiB0aGUgcGFnZSBzZXQuCiAgKiB0aGlzIHBhcnQgaXMgYmFzZWQgb24gR3JlZyBCYW5rcycgaGQ2NDQ2NV9zcy5jIGltcGxlbWVudGF0aW9uIC0gTWFzYWhpcm8gQWJlICovCi0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19DRl9BUkVBNikKICNkZWZpbmUgc2xvdF9ubyAwCkBAIC00MSw5ICs0MCw2IEBACiAjZGVmaW5lIHNsb3Rfbm8gMQogI2VuZGlmCiAKLS8qIGRlZmluZWQgaW4gbW0vaW9yZW1hcC5jICovCi1leHRlcm4gdm9pZCAqIHAzX2lvcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7Ci0KIC8qIHVzZSB0aGlzIHBvaW50ZXIgdG8gYWNjZXNzIHRvIGRpcmVjdGx5IGNvbm5lY3RlZCBjb21wYWN0IGZsYXNoIGlvIGFyZWEqLwogdm9pZCAqY2ZfaW9fYmFzZTsKIApAQCAtNjIsNyArNTgsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAvKglwcmludGsoInAzX2lvcmVtYXAocGFkZHI9MHglMDhseCwgcHNpemU9MHglMDhseCwgcHJvdD0weCUwOGx4KT0weCUwOGx4XG4iLAotCSAgICAJcGFkZHJiYXNlLCBwc2l6ZSwgcHJvdC5wZ3Byb3QsIGNmX2lvX2Jhc2UpOyovCisJCXBhZGRyYmFzZSwgcHNpemUsIHByb3QucGdwcm90LCBjZl9pb19iYXNlKTsqLwogCiAJLyogWFhYIDogZG8gd2UgbmVlZCBhdHRyaWJ1dGUgYW5kIGNvbW1vbi1tZW1vcnkgYXJlYSBhbHNvPyAqLwogCkBAIC04Nyw3ICs4Myw3IEBACiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19TSF9TT0xVVElPTl9FTkdJTkUpCi0jaW5jbHVkZSA8YXNtL3NlL3NlLmg+CisjaW5jbHVkZSA8YXNtL3NlLmg+CiAKIC8qCiAgKiBTb2x1dGlvbkVuZ2luZQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L01ha2VmaWxlIGIvYXJjaC9zaC9rZXJuZWwvY3B1L01ha2VmaWxlCmluZGV4IDU5ZDViNzQuLmZiNWRhYzAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvTWFrZWZpbGUKQEAgLTgsNiArOCw1IEBACiBvYmotJChDT05GSUdfQ1BVX1NIMykJCSs9IHNoMy8KIG9iai0kKENPTkZJR19DUFVfU0g0KQkJKz0gc2g0LwogCi1vYmotJChDT05GSUdfU0hfUlRDKQkJKz0gcnRjLm8KIG9iai0kKENPTkZJR19VQkNfV0FLRVVQKQkrPSB1YmMubwogb2JqLSQoQ09ORklHX1NIX0FEQykJCSs9IGFkYy5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvY2xvY2suYyBiL2FyY2gvc2gva2VybmVsL2NwdS9jbG9jay5jCmluZGV4IDk3ZmEzN2YuLjUxZWM2NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9jbG9jay5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9jbG9jay5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIGFyY2gvc2gva2VybmVsL2NwdS9jbG9jay5jIC0gU3VwZXJIIGNsb2NrIGZyYW1ld29yawogICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDUgIFBhdWwgTXVuZHQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgIFBhdWwgTXVuZHQKICAqCiAgKiBUaGlzIGNsb2NrIGZyYW1ld29yayBpcyBkZXJpdmVkIGZyb20gdGhlIE9NQVAgdmVyc2lvbiBieToKICAqCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtMjQsNyArMjUsNyBAQAogCiBzdGF0aWMgTElTVF9IRUFEKGNsb2NrX2xpc3QpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhjbG9ja19sb2NrKTsKLXN0YXRpYyBERUNMQVJFX01VVEVYKGNsb2NrX2xpc3Rfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgoY2xvY2tfbGlzdF9zZW0pOwogCiAvKgogICogRWFjaCBzdWJ0eXBlIGlzIGV4cGVjdGVkIHRvIGRlZmluZSB0aGUgaW5pdCByb3V0aW5lcyBmb3IgdGhlc2UgY2xvY2tzLApAQCAtMTQwLDIxICsxNDEsMjEgQEAKIAogaW50IGNsa19yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGspCiB7Ci0JZG93bigmY2xvY2tfbGlzdF9zZW0pOworCW11dGV4X2xvY2soJmNsb2NrX2xpc3Rfc2VtKTsKIAogCWxpc3RfYWRkKCZjbGstPm5vZGUsICZjbG9ja19saXN0KTsKIAlrcmVmX2luaXQoJmNsay0+a3JlZik7CiAKLQl1cCgmY2xvY2tfbGlzdF9zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tfbGlzdF9zZW0pOwogCiAJcmV0dXJuIDA7CiB9CiAKIHZvaWQgY2xrX3VucmVnaXN0ZXIoc3RydWN0IGNsayAqY2xrKQogewotCWRvd24oJmNsb2NrX2xpc3Rfc2VtKTsKKwltdXRleF9sb2NrKCZjbG9ja19saXN0X3NlbSk7CiAJbGlzdF9kZWwoJmNsay0+bm9kZSk7Ci0JdXAoJmNsb2NrX2xpc3Rfc2VtKTsKKwltdXRleF91bmxvY2soJmNsb2NrX2xpc3Rfc2VtKTsKIH0KIAogaW5saW5lIHVuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKQEAgLTE5OCwxNCArMTk5LDE0IEBACiB7CiAJc3RydWN0IGNsayAqcCwgKmNsayA9IEVSUl9QVFIoLUVOT0VOVCk7CiAKLQlkb3duKCZjbG9ja19saXN0X3NlbSk7CisJbXV0ZXhfbG9jaygmY2xvY2tfbGlzdF9zZW0pOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJmNsb2NrX2xpc3QsIG5vZGUpIHsKIAkJaWYgKHN0cmNtcChpZCwgcC0+bmFtZSkgPT0gMCAmJiB0cnlfbW9kdWxlX2dldChwLT5vd25lcikpIHsKIAkJCWNsayA9IHA7CiAJCQlicmVhazsKIAkJfQogCX0KLQl1cCgmY2xvY2tfbGlzdF9zZW0pOworCW11dGV4X3VubG9jaygmY2xvY2tfbGlzdF9zZW0pOwogCiAJcmV0dXJuIGNsazsKIH0KQEAgLTIyNSw3ICsyMjYsNyBAQAogewogCWludCBpLCByZXQgPSAwOwogCi0JQlVHX09OKHVubGlrZWx5KCFtYXN0ZXJfY2xrLnJhdGUpKTsKKwlCVUdfT04oIW1hc3Rlcl9jbGsucmF0ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvbmNoaXBfY2xvY2tzKTsgaSsrKSB7CiAJCXN0cnVjdCBjbGsgKmNsayA9IG9uY2hpcF9jbG9ja3NbaV07CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2luaXQuYwppbmRleCA4NjhlNjhiLi5iZmI5MGViIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pbml0LmMKQEAgLTQsNiArNCw3IEBACiAgKiBDUFUgaW5pdCBjb2RlCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFJpY2hhcmQgQ3Vybm93CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTEzLDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgpAQCAtNTEsNyArNTMsMTUgQEAKIAljY3IgPSBjdHJsX2lubChDQ1IpOwogCiAJLyoKLQkgKiBJZiB0aGUgY2FjaGUgaXMgYWxyZWFkeSBlbmFibGVkIC4uIGZsdXNoIGl0LgorCSAqIEF0IHRoaXMgcG9pbnQgd2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZSBjYWNoZSBpcyBlbmFibGVkIG9yIG5vdCAtIGEKKwkgKiBib290bG9hZGVyIG1heSBoYXZlIGVuYWJsZWQgaXQuICBUaGVyZSBhcmUgYXQgbGVhc3QgMiB0aGluZ3MgdGhhdAorCSAqIGNvdWxkIGJlIGRpcnR5IGluIHRoZSBjYWNoZSBhdCB0aGlzIHBvaW50OgorCSAqIDEuIGtlcm5lbCBjb21tYW5kIGxpbmUgc2V0IHVwIGJ5IGJvb3QgbG9hZGVyCisJICogMi4gc3BpbGxlZCByZWdpc3RlcnMgZnJvbSB0aGUgcHJvbG9nIG9mIHRoaXMgZnVuY3Rpb24KKwkgKiA9PiBiZWZvcmUgcmUtaW5pdGlhbGlzaW5nIHRoZSBjYWNoZSwgd2UgbXVzdCBkbyBhIHB1cmdlIG9mIHRoZSB3aG9sZQorCSAqIGNhY2hlIG91dCB0byBtZW1vcnkgZm9yIHNhZmV0eS4gIEFzIGxvbmcgYXMgbm90aGluZyBpcyBzcGlsbGVkCisJICogZHVyaW5nIHRoZSBsb29wIHRvIGxpbmVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZG9uZSwgdGhpcyBpcyBzYWZlLgorCSAqIC0gUlBDCiAJICovCiAJaWYgKGNjciAmIENDUl9DQUNIRV9FTkFCTEUpIHsKIAkJdW5zaWduZWQgbG9uZyB3YXlzLCB3YXlzaXplLCBhZGRyc3RhcnQ7CkBAIC05OCw2ICsxMDgsOCBAQAogCS8qIEZvcmNlIEVNT0RFIGlmIHBvc3NpYmxlICovCiAJaWYgKGNwdV9kYXRhLT5kY2FjaGUud2F5cyA+IDEpCiAJCWZsYWdzIHw9IENDUl9DQUNIRV9FTU9ERTsKKwllbHNlCisJCWZsYWdzICY9IH5DQ1JfQ0FDSEVfRU1PREU7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TSF9XUklURVRIUk9VR0gKQEAgLTExMiw2ICsxMjQsOSBAQAogCS8qIFR1cm4gb24gT0NSQU0gLS0gaGFsdmUgdGhlIE9DICovCiAJZmxhZ3MgfD0gQ0NSX0NBQ0hFX09SQTsKIAljcHVfZGF0YS0+ZGNhY2hlLnNldHMgPj49IDE7CisKKwljcHVfZGF0YS0+ZGNhY2hlLndheV9zaXplID0gY3B1X2RhdGEtPmRjYWNoZS5zZXRzICoKKwkJCQkgICAgY3B1X2RhdGEtPmRjYWNoZS5saW5lc3o7CiAjZW5kaWYKIAogCWN0cmxfb3V0bChmbGFncywgQ0NSKTsKQEAgLTE4NCw2ICsxOTksMTAgQEAKIAkvKiBJbml0IHRoZSBjYWNoZSAqLwogCWNhY2hlX2luaXQoKTsKIAorCXNobV9hbGlnbl9tYXNrID0gbWF4X3QodW5zaWduZWQgbG9uZywKKwkJCSAgICAgICBjcHVfZGF0YS0+ZGNhY2hlLndheV9zaXplIC0gMSwKKwkJCSAgICAgICBQQUdFX1NJWkUgLSAxKTsKKwogCS8qIERpc2FibGUgdGhlIEZQVSAqLwogCWlmIChmcHVfZGlzYWJsZWQpIHsKIAkJcHJpbnRrKCJGUFUgRGlzYWJsZWRcbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvTWFrZWZpbGUKaW5kZXggZTNjY2NlYS4uMWMwMzRjMiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL01ha2VmaWxlCkBAIC0zLDUgKzMsNiBAQAogIwogb2JqLXkJKz0gaXByLm8gaW1hc2subwogCi1vYmotJChDT05GSUdfQ1BVX0hBU19QSU5UX0lSUSkJKz0gcGludC5vCi1vYmotJChDT05GSUdfQ1BVX0hBU19JTlRDMl9JUlEpCSs9IGludGMyLm8KK29iai0kKENPTkZJR19DUFVfSEFTX1BJTlRfSVJRKQkJKz0gcGludC5vCitvYmotJChDT05GSUdfQ1BVX0hBU19NQVNLUkVHX0lSUSkJKz0gbWFza3JlZy5vCitvYmotJChDT05GSUdfQ1BVX0hBU19JTlRDMl9JUlEpCQkrPSBpbnRjMi5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2ludGMyLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2ludGMyLmMKaW5kZXggMzAwNjRiZi4uZTMwZTRiNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pbnRjMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaW50YzIuYwpAQCAtMjQxLDkgKzI0MSw5IEBACiAJLyogMTEwLTExMSByZXNlcnZlZC91bnVzZWQgKi8KICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkKIAl7IFRJTUVSX0lSUSwgMCwgMjQsIDAsIElOVENfVE1VMF9NU0ssIDJ9LAotI2lmZGVmIENPTkZJR19TSF9SVEMKLQl7IFJUQ19JUlEsIDQsIDAsIDAsIElOVENfUlRDX01TSywgVElNRVJfUFJJT1JJVFkgfSwKLSNlbmRpZgorCXsgMjEsIDEsIDAsIDAsIElOVENfUlRDX01TSywgVElNRVJfUFJJT1JJVFkgfSwKKwl7IDIyLCAxLCAxLCAwLCBJTlRDX1JUQ19NU0ssIFRJTUVSX1BSSU9SSVRZIH0sCisJeyAyMywgMSwgMiwgMCwgSU5UQ19SVENfTVNLLCBUSU1FUl9QUklPUklUWSB9LAogCXsgU0NJRjBfRVJJX0lSUSwgOCwgMjQsIDAsIElOVENfU0NJRjBfTVNLLCBTQ0lGMF9QUklPUklUWSB9LAogCXsgU0NJRjBfUlhJX0lSUSwgOCwgMjQsIDAsIElOVENfU0NJRjBfTVNLLCBTQ0lGMF9QUklPUklUWSB9LAogCXsgU0NJRjBfQlJJX0lSUSwgOCwgMjQsIDAsIElOVENfU0NJRjBfTVNLLCBTQ0lGMF9QUklPUklUWSB9LApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaXByLmMKaW5kZXggMGY1NDU5NC4uZjc4NTgyMiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jCkBAIC01NywzMSArNTcsMjcgQEAKIAogc3RhdGljIHZvaWQgZGlzYWJsZV9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWwsIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdmFsOwogCXVuc2lnbmVkIGludCBhZGRyID0gaXByX2RhdGFbaXJxXS5hZGRyOwogCXVuc2lnbmVkIHNob3J0IG1hc2sgPSAweGZmZmYgXiAoMHgwZiA8PCBpcHJfZGF0YVtpcnFdLnNoaWZ0KTsKIAogCS8qIFNldCB0aGUgcHJpb3JpdHkgaW4gSVBSIHRvIDAgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJdmFsID0gY3RybF9pbncoYWRkcik7CiAJdmFsICY9IG1hc2s7CiAJY3RybF9vdXR3KHZhbCwgYWRkcik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBlbmFibGVfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXVuc2lnbmVkIGxvbmcgdmFsLCBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHZhbDsKIAl1bnNpZ25lZCBpbnQgYWRkciA9IGlwcl9kYXRhW2lycV0uYWRkcjsKIAlpbnQgcHJpb3JpdHkgPSBpcHJfZGF0YVtpcnFdLnByaW9yaXR5OwogCXVuc2lnbmVkIHNob3J0IHZhbHVlID0gKHByaW9yaXR5IDw8IGlwcl9kYXRhW2lycV0uc2hpZnQpOwogCiAJLyogU2V0IHByaW9yaXR5IGluIElQUiBiYWNrIHRvIG9yaWdpbmFsIHZhbHVlICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXZhbCA9IGN0cmxfaW53KGFkZHIpOwogCXZhbCB8PSB2YWx1ZTsKIAljdHJsX291dHcodmFsLCBhZGRyKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19pcHIodW5zaWduZWQgaW50IGlycSkKQEAgLTg5LDYgKzg1LDcgQEAKIAlkaXNhYmxlX2lwcl9pcnEoaXJxKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2KSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpCiAJLyogVGhpcyBpcyBuZWVkZWQgd2hlbiB3ZSB1c2UgZWRnZSB0cmlnZ2VyZWQgc2V0dGluZyAqLwogCS8qIFhYWDogSXMgaXQgcmVhbGx5IG5lZWRlZD8gKi8KQEAgLTEyMyw3ICsxMjAsNyBAQAogI2lmbmRlZiBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwCiAJbWFrZV9pcHJfaXJxKFRJTUVSX0lSUSwgVElNRVJfSVBSX0FERFIsIFRJTUVSX0lQUl9QT1MsIFRJTUVSX1BSSU9SSVRZKTsKIAltYWtlX2lwcl9pcnEoVElNRVIxX0lSUSwgVElNRVIxX0lQUl9BRERSLCBUSU1FUjFfSVBSX1BPUywgVElNRVIxX1BSSU9SSVRZKTsKLSNpZiBkZWZpbmVkKENPTkZJR19TSF9SVEMpCisjaWZkZWYgUlRDX0lSUQogCW1ha2VfaXByX2lycShSVENfSVJRLCBSVENfSVBSX0FERFIsIFJUQ19JUFJfUE9TLCBSVENfUFJJT1JJVFkpOwogI2VuZGlmCiAKQEAgLTE2Miw2ICsxNTksNyBAQAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNikgfHwgXAogICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKElOVEMpCkBAIC0xOTIsNiArMTkwLDggQEAKIAkvKiBQZXJmb3JtIHRoZSBtYWNoaW5lIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uICovCiAJaWYgKHNoX212Lm12X2luaXRfaXJxICE9IE5VTEwpCiAJCXNoX212Lm12X2luaXRfaXJxKCk7CisKKwlpcnFfY3R4X2luaXQoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIH0KIAogI2lmICFkZWZpbmVkKENPTkZJR19DUFVfSEFTX1BJTlRfSVJRKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYWR4L2lycV9tYXNrcmVnLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL21hc2tyZWcuYwpzaW1pbGFyaXR5IGluZGV4IDYzJQpyZW5hbWUgZnJvbSBhcmNoL3NoL2JvYXJkcy9hZHgvaXJxX21hc2tyZWcuYwpyZW5hbWUgdG8gYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9tYXNrcmVnLmMKaW5kZXggNGIyYWJlNS4uNDkyZGIzMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYWR4L2lycV9tYXNrcmVnLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9tYXNrcmVnLmMKQEAgLTEsMzAgKzEsMjMgQEAKIC8qCi0gKiBsaW51eC9hcmNoL3NoL2tlcm5lbC9pcnFfbWFza3JlZy5jCisgKiBJbnRlcnJ1cHQgaGFuZGxpbmcgZm9yIFNpbXBsZSBleHRlcm5hbCBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcgogICoKICAqIENvcHlyaWdodCAoQykgMjAwMSBBJkQgQ28uLCBMdGQuIDxodHRwOi8vd3d3LmFhbmRkLmNvLmpwPgogICoKLSAqIFRoaXMgZmlsZSBtYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogSW50ZXJydXB0IGhhbmRsaW5nIGZvciBTaW1wbGUgZXh0ZXJuYWwgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKLSAqCiAgKiBUaGlzIGlzIGZvciB0aGUgbWFjaGluZSB3aGljaCBoYXZlIHNpbmdsZSAxNiBiaXQgcmVnaXN0ZXIKICAqIGZvciBtYXNraW5nIGV4dGVybmFsIElSUSBpbmRpdmlkdWFsbHkuCi0gKiBFYWNoIGJpdCBvZiB0aGUgcmVnaXN0ZXIgaXMgZm9yIG1hc2tpbmcgZWFjaCBpbnRlcnJ1cHQuICAKKyAqIEVhY2ggYml0IG9mIHRoZSByZWdpc3RlciBpcyBmb3IgbWFza2luZyBlYWNoIGludGVycnVwdC4KKyAqCisgKiBUaGlzIGZpbGUgbWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICovCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KIAotLyogYWRkcmVzcyBvZiBleHRlcm5hbCBpbnRlcnJ1cHQgbWFzayByZWdpc3RlcgotICogYWRkcmVzcyBtdXN0IGJlIHNldCBwcmlvciB0byB1c2UgdGhlc2UgKG1heWJlIGluIGluaXRfWFhYX2lycSgpKQotICogWFhYIDogaXMgaXQgYmV0dGVyIHRvIHVzZSAuY29uZmlnIHRoYW4gc3BlY2lmeWluZyBpdCBpbiBjb2RlPyAqLwotdW5zaWduZWQgc2hvcnQgKmlycV9tYXNrX3JlZ2lzdGVyID0gMDsKKy8qIGFkZHJlc3Mgb2YgZXh0ZXJuYWwgaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KK3Vuc2lnbmVkIGxvbmcgaXJxX21hc2tfcmVnaXN0ZXI7CiAKIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9tYXNrcmVnX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKQEAgLTM2LDcgKzI5LDcgQEAKIAogLyogaHdfaW50ZXJydXB0X3R5cGUgKi8KIHN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgbWFza3JlZ19pcnFfdHlwZSA9IHsKLQkudHlwZW5hbWUgPSAiIE1hc2sgUmVnaXN0ZXIiLAorCS50eXBlbmFtZSA9ICJNYXNrIFJlZ2lzdGVyIiwKIAkuc3RhcnR1cCA9IHN0YXJ0dXBfbWFza3JlZ19pcnEsCiAJLnNodXRkb3duID0gc2h1dGRvd25fbWFza3JlZ19pcnEsCiAJLmVuYWJsZSA9IGVuYWJsZV9tYXNrcmVnX2lycSwKQEAgLTQ3LDcgKzQwLDcgQEAKIAogLyogYWN0dWFsIGltcGxlbWVudGF0aW4gKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgc3RhcnR1cF9tYXNrcmVnX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoteyAKK3sKIAllbmFibGVfbWFza3JlZ19pcnEoaXJxKTsKIAlyZXR1cm4gMDsgLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLwogfQpAQCAtNTksMzIgKzUyLDI2IEBACiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfbWFza3JlZ19pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlpZiAoaXJxX21hc2tfcmVnaXN0ZXIpIHsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJdW5zaWduZWQgc2hvcnQgdmFsLCBtYXNrID0gMHgwMSA8PCBpcnE7CisJdW5zaWduZWQgc2hvcnQgdmFsLCBtYXNrID0gMHgwMSA8PCBpcnE7CiAKLQkJLyogU2V0ICJpcnEidGggYml0ICovCi0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJdmFsID0gY3RybF9pbncoKHVuc2lnbmVkIGxvbmcpaXJxX21hc2tfcmVnaXN0ZXIpOwotCQl2YWwgfD0gbWFzazsKLQkJY3RybF9vdXR3KHZhbCwgKHVuc2lnbmVkIGxvbmcpaXJxX21hc2tfcmVnaXN0ZXIpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfQorCUJVR19PTighaXJxX21hc2tfcmVnaXN0ZXIpOworCisJLyogU2V0ICJpcnEidGggYml0ICovCisJdmFsID0gY3RybF9pbncoaXJxX21hc2tfcmVnaXN0ZXIpOworCXZhbCB8PSBtYXNrOworCWN0cmxfb3V0dyh2YWwsIGlycV9tYXNrX3JlZ2lzdGVyKTsKIH0KIAogc3RhdGljIHZvaWQgZW5hYmxlX21hc2tyZWdfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JaWYgKGlycV9tYXNrX3JlZ2lzdGVyKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCXVuc2lnbmVkIHNob3J0IHZhbCwgbWFzayA9IH4oMHgwMSA8PCBpcnEpOworCXVuc2lnbmVkIHNob3J0IHZhbCwgbWFzayA9IH4oMHgwMSA8PCBpcnEpOwogCi0JCS8qIENsZWFyICJpcnEidGggYml0ICovCi0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJdmFsID0gY3RybF9pbncoKHVuc2lnbmVkIGxvbmcpaXJxX21hc2tfcmVnaXN0ZXIpOwotCQl2YWwgJj0gbWFzazsKLQkJY3RybF9vdXR3KHZhbCwgKHVuc2lnbmVkIGxvbmcpaXJxX21hc2tfcmVnaXN0ZXIpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfQorCUJVR19PTighaXJxX21hc2tfcmVnaXN0ZXIpOworCisJLyogQ2xlYXIgImlycSJ0aCBiaXQgKi8KKwl2YWwgPSBjdHJsX2ludyhpcnFfbWFza19yZWdpc3Rlcik7CisJdmFsICY9IG1hc2s7CisJY3RybF9vdXR3KHZhbCwgaXJxX21hc2tfcmVnaXN0ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfbWFza3JlZyh1bnNpZ25lZCBpbnQgaXJxKQpAQCAtMTAxLDYgKzg4LDYgQEAKIHZvaWQgbWFrZV9tYXNrcmVnX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewogCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOwotCWlycV9kZXNjW2lycV0uY2hpcCA9ICZtYXNrcmVnX2lycV90eXBlOworCWlycV9kZXNjW2lycV0uaGFuZGxlciA9ICZtYXNrcmVnX2lycV90eXBlOwogCWRpc2FibGVfbWFza3JlZ19pcnEoaXJxKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvcGludC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9waW50LmMKaW5kZXggODBjZDgxMC4uMTdmNDdiMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9waW50LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9waW50LmMKQEAgLTQ4LDI2ICs0OCwyMiBAQAogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3BpbnRfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgbG9uZyB2YWwsIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdmFsOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXZhbCA9IGN0cmxfaW53KElOVENfSU5URVIpOwogCXZhbCAmPSB+KDEgPDwgKGlycSAtIFBJTlRfSVJRX0JBU0UpKTsKIAljdHJsX291dHcodmFsLCBJTlRDX0lOVEVSKTsJLyogZGlzYWJsZSBQSU5UbiAqLwogCXBvcnRjcl9tYXNrICY9IH4oMyA8PCAoaXJxIC0gUElOVF9JUlFfQkFTRSkqMik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBlbmFibGVfcGludF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQl1bnNpZ25lZCBsb25nIHZhbCwgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB2YWw7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJdmFsID0gY3RybF9pbncoSU5UQ19JTlRFUik7CiAJdmFsIHw9IDEgPDwgKGlycSAtIFBJTlRfSVJRX0JBU0UpOwogCWN0cmxfb3V0dyh2YWwsIElOVENfSU5URVIpOwkvKiBlbmFibGUgUElOVG4gKi8KIAlwb3J0Y3JfbWFzayB8PSAzIDw8IChpcnEgLSBQSU5UX0lSUV9CQVNFKSoyOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgbWFza19hbmRfYWNrX3BpbnQodW5zaWduZWQgaW50IGlycSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9ydGMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9ydGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwNGNmNy4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvcnRjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvc2gva2VybmVsL3J0Yy5jIC0tIFNIMyAvIFNINCBvbi1jaGlwIFJUQyBzdXBwb3J0Ci0gKgotICogIENvcHlyaWdodCAoQykgMjAwMCAgUGhpbGlwcCBSdW1wZiA8cHJ1bXBmQHR1eC5vcmc+Ci0gKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBUZXRzdXlhIE9rYWRhICYgTmlpYmUgWXV0YWthCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9iY2QuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vcnRjLmg+Ci0KLXZvaWQgc2hfcnRjX2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXNwZWMgKnRzKQotewotCXVuc2lnbmVkIGludCBzZWMxMjgsIHNlYywgc2VjMiwgbWluLCBociwgd2ssIGRheSwgbW9uLCB5ciwgeXIxMDAsIGNmX2JpdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0gYWdhaW46Ci0JZG8gewotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCWN0cmxfb3V0YigwLCBSQ1IxKTsgIC8qIENsZWFyIENGLWJpdCAqLwotCQlzZWMxMjggPSBjdHJsX2luYihSNjRDTlQpOwotCQlzZWMgPSBjdHJsX2luYihSU0VDQ05UKTsKLQkJbWluID0gY3RybF9pbmIoUk1JTkNOVCk7Ci0JCWhyICA9IGN0cmxfaW5iKFJIUkNOVCk7Ci0JCXdrICA9IGN0cmxfaW5iKFJXS0NOVCk7Ci0JCWRheSA9IGN0cmxfaW5iKFJEQVlDTlQpOwotCQltb24gPSBjdHJsX2luYihSTU9OQ05UKTsKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQotCQl5ciAgPSBjdHJsX2ludyhSWVJDTlQpOwotCQl5cjEwMCA9ICh5ciA+PiA4KTsKLQkJeXIgJj0gMHhmZjsKLSNlbHNlCi0JCXlyICA9IGN0cmxfaW5iKFJZUkNOVCk7Ci0JCXlyMTAwID0gKHlyID09IDB4OTkpID8gMHgxOSA6IDB4MjA7Ci0jZW5kaWYKLQkJc2VjMiA9IGN0cmxfaW5iKFI2NENOVCk7Ci0JCWNmX2JpdCA9IGN0cmxfaW5iKFJDUjEpICYgUkNSMV9DRjsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCX0gd2hpbGUgKGNmX2JpdCAhPSAwIHx8ICgoc2VjMTI4IF4gc2VjMikgJiBSVENfQklUX0lOVkVSVEVEKSAhPSAwKTsKLQotCUJDRF9UT19CSU4oeXIxMDApOwotCUJDRF9UT19CSU4oeXIpOwotCUJDRF9UT19CSU4obW9uKTsKLQlCQ0RfVE9fQklOKGRheSk7Ci0JQkNEX1RPX0JJTihocik7Ci0JQkNEX1RPX0JJTihtaW4pOwotCUJDRF9UT19CSU4oc2VjKTsKLQotCWlmICh5ciA+IDk5IHx8IG1vbiA8IDEgfHwgbW9uID4gMTIgfHwgZGF5ID4gMzEgfHwgZGF5IDwgMSB8fAotCSAgICBociA+IDIzIHx8IG1pbiA+IDU5IHx8IHNlYyA+IDU5KSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIlNIIFJUQzogaW52YWxpZCB2YWx1ZSwgcmVzZXR0aW5nIHRvIDEgSmFuIDIwMDBcbiIpOwotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCWN0cmxfb3V0YihSQ1IyX1JFU0VULCBSQ1IyKTsgIC8qIFJlc2V0ICYgU3RvcCAqLwotCQljdHJsX291dGIoMCwgUlNFQ0NOVCk7Ci0JCWN0cmxfb3V0YigwLCBSTUlOQ05UKTsKLQkJY3RybF9vdXRiKDAsIFJIUkNOVCk7Ci0JCWN0cmxfb3V0Yig2LCBSV0tDTlQpOwotCQljdHJsX291dGIoMSwgUkRBWUNOVCk7Ci0JCWN0cmxfb3V0YigxLCBSTU9OQ05UKTsKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQotCQljdHJsX291dHcoMHgyMDAwLCBSWVJDTlQpOwotI2Vsc2UKLQkJY3RybF9vdXRiKDAsIFJZUkNOVCk7Ci0jZW5kaWYKLQkJY3RybF9vdXRiKFJDUjJfUlRDRU58UkNSMl9TVEFSVCwgUkNSMik7ICAvKiBTdGFydCAqLwotCQlnb3RvIGFnYWluOwotCX0KLQotI2lmIFJUQ19CSVRfSU5WRVJURUQgIT0gMAotCWlmICgoc2VjMTI4ICYgUlRDX0JJVF9JTlZFUlRFRCkpCi0JCXNlYy0tOwotI2VuZGlmCi0KLQl0cy0+dHZfc2VjID0gbWt0aW1lKHlyMTAwICogMTAwICsgeXIsIG1vbiwgZGF5LCBociwgbWluLCBzZWMpOwotCXRzLT50dl9uc2VjID0gKChzZWMxMjggKiAxMDAwMDAwKSAvIDEyOCkgKiAxMDAwOwotfQotCi0vKgotICogQ2hhbmdlZCB0byBvbmx5IGNhcmUgYWJvdXQgdHZfc2VjLCBhbmQgbm90IHRoZSBmdWxsIHRpbWVzcGVjIHN0cnVjdAotICogKGkuZS4gdHZfbnNlYykuICBJdCBjYW4gZWFzaWx5IGJlIHN3aXRjaGVkIHRvIHRpbWVzcGVjIGZvciBmdXR1cmUgY3B1cwotICogdGhhdCBzdXBwb3J0IHNldHRpbmcgdXNlYyBvciBuc2VjIFJUQyB2YWx1ZXMuCi0gKi8KLWludCBzaF9ydGNfc2V0dGltZW9mZGF5KGNvbnN0IHRpbWVfdCBzZWNzKQotewotCWludCByZXR2YWwgPSAwOwotCWludCByZWFsX3NlY29uZHMsIHJlYWxfbWludXRlcywgY21vc19taW51dGVzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JY3RybF9vdXRiKFJDUjJfUkVTRVQsIFJDUjIpOyAgLyogUmVzZXQgcHJlLXNjYWxlciAmIHN0b3AgUlRDICovCi0KLQljbW9zX21pbnV0ZXMgPSBjdHJsX2luYihSTUlOQ05UKTsKLQlCQ0RfVE9fQklOKGNtb3NfbWludXRlcyk7Ci0KLQkvKgotCSAqIHNpbmNlIHdlJ3JlIG9ubHkgYWRqdXN0aW5nIG1pbnV0ZXMgYW5kIHNlY29uZHMsCi0JICogZG9uJ3QgaW50ZXJmZXJlIHdpdGggaG91ciBvdmVyZmxvdy4gVGhpcyBhdm9pZHMKLQkgKiBtZXNzaW5nIHdpdGggdW5rbm93biB0aW1lIHpvbmVzIGJ1dCByZXF1aXJlcyB5b3VyCi0JICogUlRDIG5vdCB0byBiZSBvZmYgYnkgbW9yZSB0aGFuIDE1IG1pbnV0ZXMKLQkgKi8KLQlyZWFsX3NlY29uZHMgPSBzZWNzICUgNjA7Ci0JcmVhbF9taW51dGVzID0gc2VjcyAvIDYwOwotCWlmICgoKGFicyhyZWFsX21pbnV0ZXMgLSBjbW9zX21pbnV0ZXMpICsgMTUpLzMwKSAmIDEpCi0JCXJlYWxfbWludXRlcyArPSAzMDsJLyogY29ycmVjdCBmb3IgaGFsZiBob3VyIHRpbWUgem9uZSAqLwotCXJlYWxfbWludXRlcyAlPSA2MDsKLQotCWlmIChhYnMocmVhbF9taW51dGVzIC0gY21vc19taW51dGVzKSA8IDMwKSB7Ci0JCUJJTl9UT19CQ0QocmVhbF9zZWNvbmRzKTsKLQkJQklOX1RPX0JDRChyZWFsX21pbnV0ZXMpOwotCQljdHJsX291dGIocmVhbF9zZWNvbmRzLCBSU0VDQ05UKTsKLQkJY3RybF9vdXRiKHJlYWxfbWludXRlcywgUk1JTkNOVCk7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgInNldF9ydGNfdGltZTogY2FuJ3QgdXBkYXRlIGZyb20gJWQgdG8gJWRcbiIsCi0JCSAgICAgICBjbW9zX21pbnV0ZXMsIHJlYWxfbWludXRlcyk7Ci0JCXJldHZhbCA9IC0xOwotCX0KLQotCWN0cmxfb3V0YihSQ1IyX1JUQ0VOfFJDUjJfU1RBUlQsIFJDUjIpOyAgLyogU3RhcnQgUlRDICovCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvTWFrZWZpbGUgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL01ha2VmaWxlCmluZGV4IGI1NGRiYjkuLjU4ZDM4MTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9NYWtlZmlsZQpAQCAtNCwxMCArNCwyMSBAQAogCiBvYmoteQk6PSBleC5vIHByb2JlLm8KIAorIyBDUFUgc3VidHlwZSBzZXR1cAorb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkJKz0gc2V0dXAtc2g3NzA1Lm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYpCSs9IHNldHVwLXNoNzcwOS5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KQkrPSBzZXR1cC1zaDc3MDkubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCkJKz0gc2V0dXAtc2g3NzA4Lm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpCSs9IHNldHVwLXNoNzcwOS5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKQkrPSBzZXR1cC1zaDczMDAubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCkJKz0gc2V0dXAtc2g3NzEwLm8KKworIyBQcmltYXJ5IG9uLWNoaXAgY2xvY2tzIChjb21tb24pCiBjbG9jay0kKENPTkZJR19DUFVfU0gzKQkJCTo9IGNsb2NrLXNoMy5vCiBjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApCTo9IGNsb2NrLXNoNzMwMC5vCiBjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpCTo9IGNsb2NrLXNoNzcwNS5vCitjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYpCTo9IGNsb2NrLXNoNzcwNi5vCiBjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpCTo9IGNsb2NrLXNoNzcwOS5vCitjbG9jay0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApCTo9IGNsb2NrLXNoNzMwMC5vCiAKIG9iai15CSs9ICQoY2xvY2steSkKLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDc3MDYuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvY2xvY2stc2g3NzA2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmOTZmOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvY2xvY2stc2g3NzA2LmMKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL2NwdS9zaDMvY2xvY2stc2g3NzA2LmMKKyAqCisgKiBTSDc3MDYgc3VwcG9ydCBmb3IgdGhlIGNsb2NrIGZyYW1ld29yaworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgIFRha2FzaGkgWU9TSElJCisgKgorICogQmFzZWQgb24gYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9jbG9jay1zaDc3MDkuYworICogIENvcHlyaWdodCAoQykgMjAwNSAgQW5kcml5IFNrdWx5c2gKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vZnJlcS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdGF0aWMgaW50IHN0Y19tdWx0aXBsaWVyc1tdID0geyAxLCAyLCA0LCAxLCAzLCA2LCAxLCAxIH07CitzdGF0aWMgaW50IGlmY19kaXZpc29yc1tdICAgID0geyAxLCAyLCA0LCAxLCAzLCAxLCAxLCAxIH07CitzdGF0aWMgaW50IHBmY19kaXZpc29yc1tdICAgID0geyAxLCAyLCA0LCAxLCAzLCA2LCAxLCAxIH07CisKK3N0YXRpYyB2b2lkIG1hc3Rlcl9jbGtfaW5pdChzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGZycWNyID0gY3RybF9pbncoRlJRQ1IpOworCWludCBpZHggPSAoKGZycWNyICYgMHgyMDAwKSA+PiAxMSkgfCAoZnJxY3IgJiAweDAwMDMpOworCisJY2xrLT5yYXRlICo9IHBmY19kaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzA2X21hc3Rlcl9jbGtfb3BzID0geworCS5pbml0CQk9IG1hc3Rlcl9jbGtfaW5pdCwKK307CisKK3N0YXRpYyB2b2lkIG1vZHVsZV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgZnJxY3IgPSBjdHJsX2ludyhGUlFDUik7CisJaW50IGlkeCA9ICgoZnJxY3IgJiAweDIwMDApID4+IDExKSB8IChmcnFjciAmIDB4MDAwMyk7CisKKwljbGstPnJhdGUgPSBjbGstPnBhcmVudC0+cmF0ZSAvIHBmY19kaXZpc29yc1tpZHhdOworfQorCitzdGF0aWMgc3RydWN0IGNsa19vcHMgc2g3NzA2X21vZHVsZV9jbGtfb3BzID0geworCS5yZWNhbGMJCT0gbW9kdWxlX2Nsa19yZWNhbGMsCit9OworCitzdGF0aWMgdm9pZCBidXNfY2xrX3JlY2FsYyhzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IGZycWNyID0gY3RybF9pbncoRlJRQ1IpOworCWludCBpZHggPSAoKGZycWNyICYgMHg4MDAwKSA+PiAxMykgfCAoKGZycWNyICYgMHgwMDMwKSA+PiA0KTsKKworCWNsay0+cmF0ZSA9IGNsay0+cGFyZW50LT5yYXRlIC8gc3RjX211bHRpcGxpZXJzW2lkeF07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrX29wcyBzaDc3MDZfYnVzX2Nsa19vcHMgPSB7CisJLnJlY2FsYwkJPSBidXNfY2xrX3JlY2FsYywKK307CisKK3N0YXRpYyB2b2lkIGNwdV9jbGtfcmVjYWxjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpbnQgZnJxY3IgPSBjdHJsX2ludyhGUlFDUik7CisJaW50IGlkeCA9ICgoZnJxY3IgJiAweDQwMDApID4+IDEyKSB8ICgoZnJxY3IgJiAweDAwMGMpID4+IDIpOworCisJY2xrLT5yYXRlID0gY2xrLT5wYXJlbnQtPnJhdGUgLyBpZmNfZGl2aXNvcnNbaWR4XTsKK30KKworc3RhdGljIHN0cnVjdCBjbGtfb3BzIHNoNzcwNl9jcHVfY2xrX29wcyA9IHsKKwkucmVjYWxjCQk9IGNwdV9jbGtfcmVjYWxjLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGtfb3BzICpzaDc3MDZfY2xrX29wc1tdID0geworCSZzaDc3MDZfbWFzdGVyX2Nsa19vcHMsCisJJnNoNzcwNl9tb2R1bGVfY2xrX29wcywKKwkmc2g3NzA2X2J1c19jbGtfb3BzLAorCSZzaDc3MDZfY3B1X2Nsa19vcHMsCit9OworCit2b2lkIF9faW5pdCBhcmNoX2luaXRfY2xrX29wcyhzdHJ1Y3QgY2xrX29wcyAqKm9wcywgaW50IGlkeCkKK3sKKwlpZiAoaWR4IDwgQVJSQVlfU0laRShzaDc3MDZfY2xrX29wcykpCisJCSpvcHMgPSBzaDc3MDZfY2xrX29wc1tpZHhdOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9leC5TIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9leC5TCmluZGV4IGNjMDRlOWUuLjQ0ZGFmNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZXguUworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2V4LlMKQEAgLTg0LDggKzg0LDEyIEBACiAJLmxvbmcJZG9fSVJRCSEgICAgICByb3ZpCiAJLmxvbmcJZG9fSVJRCQkJCiAJLmxvbmcJZG9fSVJRCQkJLyogNUUwICovCi0jaWYgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KSB8fCBcCi0gICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQorI2lmICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcpIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNikgfHwgXAorICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApIHx8IFwKKyAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KSB8fCBcCisgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCkKIAkubG9uZwlkb19JUlEJISAzMiBJUlEgIGlycTAJLyogNjAwICovCiAJLmxvbmcJZG9fSVJRCSEgMzMgICAgICBpcnExCiAJLmxvbmcJZG9fSVJRCSEgMzQgICAgICBpcnEyCkBAIC0xNDcsNiArMTUxLDUxIEBACiAJLmxvbmcgICBkb19JUlEJISA2MiBQQ0MgIHBjYzBpCiAJLmxvbmcgICBkb19JUlEJISA2MyAgICAgIHBjYzFpCS8qIDlFMCAqLwogI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKQorCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA2MSAJLyogOUEwICovCisJLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDYyCisJLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDYzCisJLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDY0CS8qIEEwMCAqLworCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA2NQorCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA2NgorCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA2NworCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA2OAorCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA2OQorCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA3MAorCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA3MQorCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA3MgkvKiBCMDAgKi8KKwkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgNzMKKwkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgNzQKKwkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgNzUKKwkubG9uZyAgIGRvX0lSUQkhIDc2IERNQUMyIGRlaTQJLyogQjgwICovCisJLmxvbmcgICBkb19JUlEJISA3NyBETUFDMiBkZWk1CisJLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDc4CisJLmxvbmcgICBkb19JUlEJISA3OSBJUFNFQyBpcHNlY2kgLyogQkUwICovCisJLmxvbmcgICBkb19JUlEJISA4MCBFRE1BQyBlaW50MCAvKiBDMDAgKi8KKwkubG9uZyAgIGRvX0lSUQkhIDgxIEVETUFDIGVpbnQxCisJLmxvbmcgICBkb19JUlEJISA4MiBFRE1BQyBlaW50MgorCS5sb25nICAgZXhjZXB0aW9uX25vbmUJISA4MwkvKiBDNjAgKi8KKwkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgODQKKwkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgODUKKwkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgODYKKwkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgODcKKwkubG9uZyAgIGV4Y2VwdGlvbl9ub25lCSEgODgJLyogRDAwICovCisJLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDg5CisJLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDkwCisJLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDkxCisJLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDkyCisJLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDkzCisJLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDk0CisJLmxvbmcgICBleGNlcHRpb25fbm9uZQkhIDk1CisJLmxvbmcgICBkb19JUlEJISA5NiBTSU9GIGVyaTAJLyogRTAwICovCisJLmxvbmcgICBkb19JUlEJISA5NyAgICAgIHR4aTAKKwkubG9uZyAgIGRvX0lSUQkhIDk4ICAgICAgcnhpMAorCS5sb25nICAgZG9fSVJRCSEgOTkgICAgICBjY2kwCisJLmxvbmcgICBkb19JUlEJISAxMDAgICAgIGVyaTEJLyogRTgwICovCisJLmxvbmcgICBkb19JUlEJISAxMDEgICAgIHR4aTEKKwkubG9uZyAgIGRvX0lSUQkhIDEwMiAgICAgcnhpMgorCS5sb25nICAgZG9fSVJRCSEgMTAzICAgICBjY2kzCisjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApCiAJLmxvbmcgICBkb19JUlEJISA2NAogCS5sb25nICAgZG9fSVJRCSEgNjUKQEAgLTE5NSw0ICsyNDQsMyBAQAogCS5sb25nICAgZG9fSVJRCSEgMTA4CiAjZW5kaWYKICNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3Byb2JlLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3Byb2JlLmMKaW5kZXggNWNkYzg4Ni4uZTY3MDk4OCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9wcm9iZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvcHJvYmUuYwpAQCAtNzIsNiArNzIsMTIgQEAKIAkJY3B1X2RhdGEtPmRjYWNoZS5zZXRzCQk9IDI1NjsKIAkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3NzI5OwogCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2KQorCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3MDY7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApCisJCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzcxMDsKKyNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkKIAkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3NzA1OwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzMwMC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDczMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjRkMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDczMDAuYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogU0g3MzAwIFNldHVwCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS9zY2kuaD4KKworc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CisJeworCQkubWFwYmFzZQk9IDB4YTQ0MzAwMDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUJCT0gUE9SVF9TQ0ksCisJCS5pcnFzCQk9IHsgODAsIDgwLCA4MCwgODAgfSwKKwl9LCB7CisJCS5mbGFncyA9IDAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2gtc2NpIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2NpX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDczMDBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnNjaV9kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaDczMDBfZGV2aWNlc19zZXR1cCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDczMDBfZGV2aWNlcywKKwkJCQkgICAgQVJSQVlfU0laRShzaDczMDBfZGV2aWNlcykpOworfQorX19pbml0Y2FsbChzaDczMDBfZGV2aWNlc19zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwNS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGU0MWM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogU0g3NzA1IFNldHVwCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS9zY2kuaD4KKworc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CisJeworCQkubWFwYmFzZQk9IDB4YTQ0MDAwMDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUJCT0gUE9SVF9TQ0lGLAorCQkuaXJxcwkJPSB7IDUyLCA1MywgNTUsIDU0IH0sCisJfSwgeworCQkubWFwYmFzZQk9IDB4YTQ0MTAwMDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUJCT0gUE9SVF9TQ0lGLAorCQkuaXJxcwkJPSB7IDU2LCA1NywgNTksIDU4IH0sCisJfSwgeworCQkuZmxhZ3MgPSAwLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoLXNjaSIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IHNjaV9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzA1X2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzY2lfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2g3NzA1X2RldmljZXNfc2V0dXAodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoc2g3NzA1X2RldmljZXMsCisJCQkJICAgIEFSUkFZX1NJWkUoc2g3NzA1X2RldmljZXMpKTsKK30KK19faW5pdGNhbGwoc2g3NzA1X2RldmljZXNfc2V0dXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDguYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzMzcyMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA4LmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIFNINzcwOCBTZXR1cAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vc2NpLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0geworCXsKKwkJLm1hcGJhc2UJPSAweGZmZmZmZTgwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJLAorCQkuaXJxcwkJPSB7IDIzLCAyNCwgMjUsIDAgfSwKKwl9LCB7CisJCS5mbGFncyA9IDAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2gtc2NpIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2NpX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3MDhfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnNjaV9kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaDc3MDhfZGV2aWNlc19zZXR1cCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDc3MDhfZGV2aWNlcywKKwkJCQkgICAgQVJSQVlfU0laRShzaDc3MDhfZGV2aWNlcykpOworfQorX19pbml0Y2FsbChzaDc3MDhfZGV2aWNlc19zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwOS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjQzZWYyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDkuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogU0g3NzA3L1NINzcwOSBTZXR1cAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vc2NpLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0geworCXsKKwkJLm1hcGJhc2UJPSAweGZmZmZmZTgwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJLAorCQkuaXJxcwkJPSB7IDIzLCAyNCwgMjUsIDAgfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhhNDAwMDE1MCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNTYsIDU3LCA1OSwgNTggfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhhNDAwMDE0MCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX0lSREEsCisJCS5pcnFzCQk9IHsgNTIsIDUzLCA1NSwgNTQgfSwKKwl9LCB7CisJCS5mbGFncyA9IDAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2gtc2NpIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2NpX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3MDlfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnNjaV9kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaDc3MDlfZGV2aWNlc19zZXR1cCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDc3MDlfZGV2aWNlcywKKwkJCQkgICAgQVJSQVlfU0laRShzaDc3MDlfZGV2aWNlcykpOworfQorX19pbml0Y2FsbChzaDc3MDlfZGV2aWNlc19zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcxMC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTVmOTllCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MTAuYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogU0g3NzEwIFNldHVwCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS9zY2kuaD4KKworc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CisJeworCQkubWFwYmFzZQk9IDB4YTQ0MDAwMDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUJCT0gUE9SVF9TQ0lGLAorCQkuaXJxcwkJPSB7IDUyLCA1MywgNTUsIDU0IH0sCisJfSwgeworCQkuZmxhZ3MgPSAwLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoLXNjaSIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IHNjaV9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzEwX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzY2lfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2g3NzEwX2RldmljZXNfc2V0dXAodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoc2g3NzEwX2RldmljZXMsCisJCQkJICAgIEFSUkFZX1NJWkUoc2g3NzEwX2RldmljZXMpKTsKK30KK19faW5pdGNhbGwoc2g3NzEwX2RldmljZXNfc2V0dXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvTWFrZWZpbGUKaW5kZXggM2Q1Y2FmYy4uOGRiZjM4OSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L01ha2VmaWxlCkBAIC03LDYgKzcsMTYgQEAKIG9iai0kKENPTkZJR19TSF9GUFUpICAgICAgICAgICAgICAgICAgICArPSBmcHUubwogb2JqLSQoQ09ORklHX1NIX1NUT1JFX1FVRVVFUykJCSs9IHNxLm8KIAorIyBDUFUgc3VidHlwZSBzZXR1cAorb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkJKz0gc2V0dXAtc2g3NzUwLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpCSs9IHNldHVwLXNoNzc1MC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQkrPSBzZXR1cC1zaDc3NjAubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCkJKz0gc2V0dXAtc2g3NzcwLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCSs9IHNldHVwLXNoNzc4MC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCkJKz0gc2V0dXAtc2g3MzE4MC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzKQkrPSBzZXR1cC1zaDczNDMubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIpCSs9IHNldHVwLXNoNC0yMDIubworCiAjIFByaW1hcnkgb24tY2hpcCBjbG9ja3MgKGNvbW1vbikKIGNsb2NrLSQoQ09ORklHX0NQVV9TSDQpCQkJOj0gY2xvY2stc2g0Lm8KIGNsb2NrLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCTo9IGNsb2NrLXNoNzMxODAubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9leC5TIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9leC5TCmluZGV4IDI2YTI3ZGYuLjcxNDY4OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvZXguUworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2V4LlMKQEAgLTcyLDYgKzcyLDcgQEAKIAkubG9uZwlkb19JUlEJISAxMTEwCiAJLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkKIAkhIEludGVybmFsIGhhcmR3YXJlCisjaWZuZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAKIAkubG9uZwlkb19JUlEJISBUTVUwIHR1bmkwCS8qIDQwMCAqLwogCS5sb25nCWRvX0lSUQkhIFRNVTEgdHVuaTEKIAkubG9uZwlkb19JUlEJISBUTVUyIHR1bmkyCkBAIC0xMjIsNiArMTIzLDEzIEBACiAJLmxvbmcJZG9fSVJRCSEgNDUgICAgICBkbXRlNQogCS5sb25nCWRvX0lSUQkhIDQ2ICAgICAgZG10ZTYKIAkubG9uZwlkb19JUlEJISA0NyAgICAgIGRtdGU3CQkvKiA3RTAgKi8KKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MykKKwkubG9uZwlkb19JUlEJISA0NCBJSUMxIGFsaQkJLyogNzgwICovCisJLmxvbmcJZG9fSVJRCSEgNDUgICAgICB0YWNraQorCS5sb25nCWRvX0lSUQkhIDQ2ICAgICAgd2FpdGkKKwkubG9uZwlkb19JUlEJISA0NyAgICAgIGR0ZWkJCS8qIDdFMCAqLworCS5sb25nCWRvX0lSUQkhIDQ4IERNQUMgZGVpMAkJLyogODAwICovCisJLmxvbmcJZG9fSVJRCSEgNDkgICAgICBkZWkxCQkvKiA4MjAgKi8KICNlbHNlCiAJLmxvbmcJZXhjZXB0aW9uX2Vycm9yCQkJISA0NAkvKiA3ODAgKi8KIAkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhIDQ1CkBAIC0xMzEsNyArMTM5LDggQEAKICNpZiBkZWZpbmVkKENPTkZJR19TSF9GUFUpCiAJLmxvbmcJZG9fZnB1X3N0YXRlX3Jlc3RvcmUJISA0OAkvKiA4MDAgKi8KIAkubG9uZwlkb19mcHVfc3RhdGVfcmVzdG9yZQkhIDQ5CS8qIDgyMCAqLwotI2Vsc2UKKyNlbGlmICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMpICYmIFwKKyAgICAgICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwKQogCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgogCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgogI2VuZGlmCkBAIC0yMjQsNyArMjMzLDcgQEAKIAkubG9uZwlleGNlcHRpb25fZXJyb3IKIAkubG9uZwlkb19JUlEJISBBREMJYWRpCiAJLmxvbmcJZG9fSVJRCSEgQ01UCWNtdGkJLyogRkEwICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzQzKQogCS5sb25nCWRvX0lSUQkhICA1MCAweDg0MAogCS5sb25nCWRvX0lSUQkhICA1MSAweDg2MAogCS5sb25nCWRvX0lSUQkhICA1MiAweDg4MApAQCAtMzc5LDUgKzM4OCwxNjggQEAKIAkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhIDE0MSAweDEzYTAKIAkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhIDE0MiAweDEzYzAKIAkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhIDE0MyAweDEzZTAKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCkKKwkubG9uZwlkb19JUlEJISAgNTAgMHg4NDAKKwkubG9uZwlkb19JUlEJISAgNTEgMHg4NjAKKwkubG9uZwlkb19JUlEJISAgNTIgMHg4ODAKKwkubG9uZwlkb19JUlEJISAgNTMgMHg4YTAKKwkubG9uZwlkb19JUlEJISAgNTQgMHg4YzAKKwkubG9uZwlkb19JUlEJISAgNTUgMHg4ZTAKKwkubG9uZwlkb19JUlEJISAgNTYgMHg5MDAKKwkubG9uZwlkb19JUlEJISAgNTcgMHg5MjAKKwkubG9uZwlkb19JUlEJISAgNTggMHg5NDAKKwkubG9uZwlkb19JUlEJISAgNTkgMHg5NjAKKwkubG9uZwlkb19JUlEJISAgNjAgMHg5ODAKKwkubG9uZwlkb19JUlEJISAgNjEgMHg5YTAKKwkubG9uZwlkb19JUlEJISAgNjIgMHg5YzAKKwkubG9uZwlkb19JUlEJISAgNjMgMHg5ZTAKKwkubG9uZwlkb19JUlEJISAgNjQgMHhhMDAKKwkubG9uZwlkb19JUlEJISAgNjUgMHhhMjAKKwkubG9uZwlkb19JUlEJISAgNjYgMHhhNGQKKwkubG9uZwlkb19JUlEJISAgNjcgMHhhNjAKKwkubG9uZwlkb19JUlEJISAgNjggMHhhODAKKwkubG9uZwlkb19JUlEJISAgNjkgMHhhYTAKKwkubG9uZwlkb19JUlEJISAgNzAgMHhhYzAKKwkubG9uZwlkb19JUlEJISAgNzEgMHhhZTAKKwkubG9uZwlkb19JUlEJISAgNzIgMHhiMDAKKwkubG9uZwlkb19JUlEJISAgNzMgMHhiMjAKKwkubG9uZwlkb19JUlEJISAgNzQgMHhiNDAKKwkubG9uZwlkb19JUlEJISAgNzUgMHhiNjAKKwkubG9uZwlkb19JUlEJISAgNzYgMHhiODAKKwkubG9uZwlkb19JUlEJISAgNzcgMHhiYTAKKwkubG9uZwlkb19JUlEJISAgNzggMHhiYzAKKwkubG9uZwlkb19JUlEJISAgNzkgMHhiZTAKKwkubG9uZwlkb19JUlEJISAgODAgMHhjMDAKKwkubG9uZwlkb19JUlEJISAgODEgMHhjMjAKKwkubG9uZwlkb19JUlEJISAgODIgMHhjNDAKKwkubG9uZwlkb19JUlEJISAgODMgMHhjNjAKKwkubG9uZwlkb19JUlEJISAgODQgMHhjODAKKwkubG9uZwlkb19JUlEJISAgODUgMHhjYTAKKwkubG9uZwlkb19JUlEJISAgODYgMHhjYzAKKwkubG9uZwlkb19JUlEJISAgODcgMHhjZTAKKwkubG9uZwlkb19JUlEJISAgODggMHhkMDAKKwkubG9uZwlkb19JUlEJISAgODkgMHhkMjAKKwkubG9uZwlkb19JUlEJISAgOTAgMHhkNDAKKwkubG9uZwlkb19JUlEJISAgOTEgMHhkNjAKKwkubG9uZwlkb19JUlEJISAgOTIgMHhkODAKKwkubG9uZwlkb19JUlEJISAgOTMgMHhkYTAKKwkubG9uZwlkb19JUlEJISAgOTQgMHhkYzAKKwkubG9uZwlkb19JUlEJISAgOTUgMHhkZTAKKwkubG9uZwlkb19JUlEJISAgOTYgMHhlMDAKKwkubG9uZwlkb19JUlEJISAgOTcgMHhlMjAKKwkubG9uZwlkb19JUlEJISAgOTggMHhlNDAKKwkubG9uZwlkb19JUlEJISAgOTkgMHhlNjAKKwkubG9uZwlkb19JUlEJISAxMDAgMHhlODAKKwkubG9uZwlkb19JUlEJISAxMDEgMHhlYTAKKwkubG9uZwlkb19JUlEJISAxMDIgMHhlYzAKKwkubG9uZwlkb19JUlEJISAxMDMgMHhlZTAKKwkubG9uZwlkb19JUlEJISAxMDQgMHhmMDAKKwkubG9uZwlkb19JUlEJISAxMDUgMHhmMjAKKwkubG9uZwlkb19JUlEJISAxMDYgMHhmNDAKKwkubG9uZwlkb19JUlEJISAxMDcgMHhmNjAKKwkubG9uZwlkb19JUlEJISAxMDggMHhmODAKKyNlbmRpZgorI2Vsc2UKKwkubG9uZwlleGNlcHRpb25fZXJyb3IJCS8qIDQwMCAqLworCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgorCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgorCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgorCS5sb25nCWRvX0lSUQkhIFJUQwlhdGkKKwkubG9uZwlkb19JUlEJIQlwcmkKKwkubG9uZwlkb19JUlEJIQljdWkKKwkubG9uZwlleGNlcHRpb25fZXJyb3IKKwkubG9uZwlleGNlcHRpb25fZXJyb3IJCS8qIDUwMCAqLworCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgorCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgorCS5sb25nCWRvX0lSUQkhIFdEVAlpdGkJLyogNTYwICovCisJLmxvbmcJZG9fSVJRCSEgVE1VLWNoMAorCS5sb25nCWRvX0lSUQkhIFRNVS1jaDEKKwkubG9uZwlkb19JUlEJISBUTVUtY2gyCisJLmxvbmcJZG9fSVJRCSEgdGljcGkyCS8qIDVFMCAqLworCS5sb25nCWRvX0lSUQkhIDMyIEhpdGFjaGkgVURJCS8qIDYwMCAqLworCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgorCS5sb25nCWRvX0lSUQkhIDM0IERNQUMgZG10ZTAKKwkubG9uZwlkb19JUlEJISAzNQkgIGRtdGUxCisJLmxvbmcJZG9fSVJRCSEgMzYJICBkbXRlMgorCS5sb25nCWRvX0lSUQkhIDM3CSAgZG10ZTMKKwkubG9uZwlkb19JUlEJISAzOAkgIGRtYWUKKwkubG9uZwlleGNlcHRpb25fZXJyb3IJCQkhIDM5CS8qIDZFMCAqLworCS5sb25nCWRvX0lSUQkhIDQwIFNDSUYtY2gwIGVyaQkJLyogNzAwICovCisJLmxvbmcJZG9fSVJRCSEgNDEJICAgICAgcnhpCisJLmxvbmcJZG9fSVJRCSEgNDIJICAgICAgYnJpCisJLmxvbmcJZG9fSVJRCSEgNDMJICAgICAgdHhpCisJLmxvbmcJZG9fSVJRCSEgNDQgRE1BQyBkbXRlNAkJLyogNzgwICovCisJLmxvbmcJZG9fSVJRCSEgNDUJICBkbXRlNQorCS5sb25nCWRvX0lSUQkhIDQ2CSAgZG10ZTYKKwkubG9uZwlkb19JUlEJISA0NwkgIGRtdGU3CQkvKiA3RTAgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19TSF9GUFUpCisJLmxvbmcJZG9fZnB1X3N0YXRlX3Jlc3RvcmUJISA0OAkvKiA4MDAgKi8KKwkubG9uZwlkb19mcHVfc3RhdGVfcmVzdG9yZQkhIDQ5CS8qIDgyMCAqLworI2Vsc2UKKwkubG9uZwlleGNlcHRpb25fZXJyb3IKKwkubG9uZwlleGNlcHRpb25fZXJyb3IKKyNlbmRpZgorCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgkJCS8qIDg0MCAqLworCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgorCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgorCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgorCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgorCS5sb25nCWV4Y2VwdGlvbl9lcnJvcgorCS5sb25nCWRvX0lSUQkhIDU2IENNVAkvKiA5MDAgKi8KKwkubG9uZwlleGNlcHRpb25fZXJyb3IKKwkubG9uZwlleGNlcHRpb25fZXJyb3IKKwkubG9uZwlleGNlcHRpb25fZXJyb3IKKwkubG9uZwlkb19JUlEJISA2MCBIQUMKKwkubG9uZwlleGNlcHRpb25fZXJyb3IKKwkubG9uZwlleGNlcHRpb25fZXJyb3IKKwkubG9uZwlleGNlcHRpb25fZXJyb3IKKwkubG9uZwlkb19JUlEJISBQQ0kgc2VycgkvKiBBMDAgKi8KKwkubG9uZwlkb19JUlEJISAgICAgSU5UQQorCS5sb25nCWRvX0lSUQkhICAgICBJTlRCCisJLmxvbmcJZG9fSVJRCSEgICAgIElOVEMKKwkubG9uZwlkb19JUlEJISAgICAgSU5URAorCS5sb25nCWRvX0lSUQkhICAgICBlcnIKKwkubG9uZwlkb19JUlEJISAgICAgcHdkMworCS5sb25nCWRvX0lSUQkhICAgICBwd2QyCisJLmxvbmcJZG9fSVJRCSEgICAgIHB3ZDEJLyogQjAwICovCisJLmxvbmcJZG9fSVJRCSEgICAgIHB3ZDAKKwkubG9uZwlleGNlcHRpb25fZXJyb3IKKwkubG9uZwlleGNlcHRpb25fZXJyb3IKKwkubG9uZwlkb19JUlEJISBTQ0lGLWNoMSBlcmkJLyogQjgwICovCisJLmxvbmcJZG9fSVJRCSEJICAgcnhpCisJLmxvbmcJZG9fSVJRCSEJICAgYnJpCisJLmxvbmcJZG9fSVJRCSEJICAgdHhpCisJLmxvbmcJZG9fSVJRCSEgU0lPRgkJLyogQzAwICovCisJLmxvbmcJZXhjZXB0aW9uX2Vycm9yCisJLmxvbmcJZXhjZXB0aW9uX2Vycm9yCisJLmxvbmcJZXhjZXB0aW9uX2Vycm9yCisJLmxvbmcJZG9fSVJRCSEgSFNQSQkJLyogQzgwICovCisJLmxvbmcJZXhjZXB0aW9uX2Vycm9yCisJLmxvbmcJZXhjZXB0aW9uX2Vycm9yCisJLmxvbmcJZXhjZXB0aW9uX2Vycm9yCisJLmxvbmcJZG9fSVJRCSEgTU1DSUYJZmF0YXQJLyogRDAwICovCisJLmxvbmcJZG9fSVJRCSEJdHJhbgorCS5sb25nCWRvX0lSUQkhCWVycgorCS5sb25nCWRvX0lSUQkhCWZyZHkKKwkubG9uZwlkb19JUlEJISBETUFDIGRtaW50OAkvKiBEODAgKi8KKwkubG9uZwlkb19JUlEJISAgICAgIGRtaW50OQorCS5sb25nCWRvX0lSUQkhICAgICAgZG1pbnQxMAorCS5sb25nCWRvX0lSUQkhICAgICAgZG1pbnQxMQorCS5sb25nCWRvX0lSUQkhIFRNVS1jaDMJLyogRTAwICovCisJLmxvbmcJZG9fSVJRCSEgVE1VLWNoNAorCS5sb25nCWRvX0lSUQkhIFRNVS1jaDUKKwkubG9uZwlleGNlcHRpb25fZXJyb3IKKwkubG9uZwlkb19JUlEJISBTU0kKKwkubG9uZwlleGNlcHRpb25fZXJyb3IKKwkubG9uZwlleGNlcHRpb25fZXJyb3IKKwkubG9uZwlleGNlcHRpb25fZXJyb3IKKwkubG9uZwlkb19JUlEJISBGTENUTAlmbHN0ZQkvKiBGMDAgKi8KKwkubG9uZwlkb19JUlEJIQlmbHRlbmQKKwkubG9uZwlkb19JUlEJIQlmbHRycTAKKwkubG9uZwlkb19JUlEJIQlmbHRycTEKKwkubG9uZwlkb19JUlEJISBHUElPIGdwaW9pMAkvKiBGODAgKi8KKwkubG9uZwlkb19JUlEJISAgICAgIGdwaW9pMQorCS5sb25nCWRvX0lSUQkhICAgICAgZ3Bpb2kyCisJLmxvbmcJZG9fSVJRCSEgICAgICBncGlvaTMKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3Byb2JlLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3Byb2JlLmMKaW5kZXggNDI0MjdiNy4uYzI5NGRlMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcHJvYmUuYwpAQCAtMyw3ICszLDcgQEAKICAqCiAgKiBDUFUgU3VidHlwZSBQcm9iaW5nIGZvciBTSC00LgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCAgUGF1bCBNdW5kdAorICogQ29weXJpZ2h0IChDKSAyMDAxIC0gMjAwNiAgUGF1bCBNdW5kdAogICogQ29weXJpZ2h0IChDKSAyMDAzICBSaWNoYXJkIEN1cm5vdwogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCkBAIC0yOSw3ICsyOSw3IEBACiAJCVs5XSA9ICgxIDw8IDE2KQogCX07CiAKLQlwdnIgPSAoY3RybF9pbmwoQ0NOX1BWUikgPj4gOCkgJiAweGZmZmY7CisJcHZyID0gKGN0cmxfaW5sKENDTl9QVlIpID4+IDgpICYgMHhmZmZmZmY7CiAJcHJyID0gKGN0cmxfaW5sKENDTl9QUlIpID4+IDQpICYgMHhmZjsKIAljdnIgPSAoY3RybF9pbmwoQ0NOX0NWUikpOwogCkBAIC0zOCw3ICszOCw2IEBACiAJICovCiAJY3B1X2RhdGEtPmljYWNoZS53YXlfaW5jcgk9ICgxIDw8IDEzKTsKIAljcHVfZGF0YS0+aWNhY2hlLmVudHJ5X3NoaWZ0CT0gNTsKLQljcHVfZGF0YS0+aWNhY2hlLmVudHJ5X21hc2sJPSAweDFmZTA7CiAJY3B1X2RhdGEtPmljYWNoZS5zZXRzCQk9IDI1NjsKIAljcHVfZGF0YS0+aWNhY2hlLndheXMJCT0gMTsKIAljcHVfZGF0YS0+aWNhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKQEAgLTQ4LDEzICs0NywyOSBAQAogCSAqLwogCWNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3IJPSAoMSA8PCAxNCk7CiAJY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9zaGlmdAk9IDU7Ci0JY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9tYXNrCT0gMHgzZmUwOwogCWNwdV9kYXRhLT5kY2FjaGUuc2V0cwkJPSA1MTI7CiAJY3B1X2RhdGEtPmRjYWNoZS53YXlzCQk9IDE7CiAJY3B1X2RhdGEtPmRjYWNoZS5saW5lc3oJCT0gTDFfQ0FDSEVfQllURVM7CiAKLQkvKiBTZXQgdGhlIEZQVSBmbGFnLCB2aXJ0dWFsbHkgYWxsIFNILTQncyBoYXZlIG9uZSAqLwotCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0ZQVTsKKwkvKgorCSAqIFNldHVwIHNvbWUgZ2VuZXJpYyBmbGFncyB3ZSBjYW4gcHJvYmUKKwkgKiAoTDIgYW5kIERTUCBkZXRlY3Rpb24gb25seSB3b3JrIG9uIFNILTRBKQorCSAqLworCWlmICgoKHB2ciA+PiAxNikgJiAweGZmKSA9PSAweDEwKSB7CisJCWlmICgoY3ZyICYgMHgwMjAwMDAwMCkgPT0gMCkKKwkJCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0wyX0NBQ0hFOworCQlpZiAoKGN2ciAmIDB4MTAwMDAwMDApID09IDApCisJCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19EU1A7CisKKwkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfTExTQzsKKwl9CisKKwkvKiBGUFUgZGV0ZWN0aW9uIHdvcmtzIGZvciBldmVyeW9uZSAqLworCWlmICgoY3ZyICYgMHgyMDAwMDAwMCkgPT0gMSkKKwkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfRlBVOworCisJLyogTWFzayBvZmYgdGhlIHVwcGVyIGNoaXAgSUQgKi8KKwlwdnIgJj0gMHhmZmZmOwogCiAJLyoKIAkgKiBQcm9iZSB0aGUgdW5kZXJseWluZyBwcm9jZXNzb3IgdmVyc2lvbi9yZXZpc2lvbiBhbmQKQEAgLTYzLDU2ICs3OCwxMDEgQEAKIAlzd2l0Y2ggKHB2cikgewogCWNhc2UgMHgyMDU6CiAJCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzc1MDsKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfUDJfRkxVU0hfQlVHIHwgQ1BVX0hBU19QRVJGX0NPVU5URVI7CisJCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX1AyX0ZMVVNIX0JVRyB8IENQVV9IQVNfRlBVIHwKKwkJCQkgICBDUFVfSEFTX1BFUkZfQ09VTlRFUiB8IENQVV9IQVNfUFRFQTsKIAkJYnJlYWs7CiAJY2FzZSAweDIwNjoKIAkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3NzUwUzsKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfUDJfRkxVU0hfQlVHIHwgQ1BVX0hBU19QRVJGX0NPVU5URVI7CisJCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX1AyX0ZMVVNIX0JVRyB8IENQVV9IQVNfRlBVIHwKKwkJCQkgICBDUFVfSEFTX1BFUkZfQ09VTlRFUiB8IENQVV9IQVNfUFRFQTsKIAkJYnJlYWs7CiAJY2FzZSAweDExMDA6CiAJCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzc1MTsKKwkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfRlBVIHwgQ1BVX0hBU19QVEVBOwogCQlicmVhazsKIAljYXNlIDB4MjAwMDoKIAkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3MzE4MDsKIAkJY3B1X2RhdGEtPmljYWNoZS53YXlzID0gNDsKIAkJY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gNDsKLQkJY3B1X2RhdGEtPmZsYWdzICY9IH5DUFVfSEFTX0ZQVTsKKwkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfTExTQzsKKwkJYnJlYWs7CisJY2FzZSAweDIwMDE6CisJY2FzZSAweDIwMDQ6CisJCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzc3MDsKKwkJY3B1X2RhdGEtPmljYWNoZS53YXlzID0gNDsKKwkJY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gNDsKKworCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19GUFUgfCBDUFVfSEFTX0xMU0M7CisJCWJyZWFrOworCWNhc2UgMHgyMDA2OgorCWNhc2UgMHgyMDBBOgorCQlpZiAocHJyID09IDB4NjEpCisJCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3ODE7CisJCWVsc2UKKwkJCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzc4MDsKKworCQljcHVfZGF0YS0+aWNhY2hlLndheXMgPSA0OworCQljcHVfZGF0YS0+ZGNhY2hlLndheXMgPSA0OworCisJCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0ZQVSB8IENQVV9IQVNfUEVSRl9DT1VOVEVSIHwKKwkJCQkgICBDUFVfSEFTX0xMU0M7CisJCWJyZWFrOworCWNhc2UgMHgzMDAwOgorCWNhc2UgMHgzMDAzOgorCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDczNDM7CisJCWNwdV9kYXRhLT5pY2FjaGUud2F5cyA9IDQ7CisJCWNwdV9kYXRhLT5kY2FjaGUud2F5cyA9IDQ7CisJCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0xMU0M7CiAJCWJyZWFrOwogCWNhc2UgMHg4MDAwOgogCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TVDQwUkE7CisJCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0ZQVSB8IENQVV9IQVNfUFRFQTsKIAkJYnJlYWs7CiAJY2FzZSAweDgxMDA6CiAJCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NUNDBHWDE7CisJCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0ZQVSB8IENQVV9IQVNfUFRFQTsKIAkJYnJlYWs7CiAJY2FzZSAweDcwMDoKIAkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g0XzUwMTsKIAkJY3B1X2RhdGEtPmljYWNoZS53YXlzID0gMjsKIAkJY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gMjsKLQotCQkvKiBObyBGUFUgb24gdGhlIFNINC01MDAgc2VyaWVzLi4gKi8KLQkJY3B1X2RhdGEtPmZsYWdzICY9IH5DUFVfSEFTX0ZQVTsKKwkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfUFRFQTsKIAkJYnJlYWs7CiAJY2FzZSAweDYwMDoKIAkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g0XzIwMjsKIAkJY3B1X2RhdGEtPmljYWNoZS53YXlzID0gMjsKIAkJY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gMjsKKwkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfRlBVIHwgQ1BVX0hBU19QVEVBOwogCQlicmVhazsKIAljYXNlIDB4NTAwIC4uLiAweDUwMToKIAkJc3dpdGNoIChwcnIpIHsKLQkJICAgIGNhc2UgMHgxMDogY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3NzUwUjsgYnJlYWs7Ci0JCSAgICBjYXNlIDB4MTE6IGNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzc1MVI7IGJyZWFrOwotCQkgICAgY2FzZSAweDUwOiBjcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3NjA7ICBicmVhazsKKwkJY2FzZSAweDEwOgorCQkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3NzUwUjsKKwkJCWJyZWFrOworCQljYXNlIDB4MTE6CisJCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3NTFSOworCQkJYnJlYWs7CisJCWNhc2UgMHg1MCAuLi4gMHg1ZjoKKwkJCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzc2MDsKKwkJCWJyZWFrOwogCQl9CiAKIAkJY3B1X2RhdGEtPmljYWNoZS53YXlzID0gMjsKIAkJY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gMjsKIAorCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19GUFUgfCBDUFVfSEFTX1BURUE7CisKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0hfTk9ORTsKIAkJYnJlYWs7CiAJfQogCisjaWZkZWYgQ09ORklHX1NIX0RJUkVDVF9NQVBQRUQKKwljcHVfZGF0YS0+aWNhY2hlLndheXMgPSAxOworCWNwdV9kYXRhLT5kY2FjaGUud2F5cyA9IDE7CisjZW5kaWYKKwogCS8qCiAJICogT24gYW55dGhpbmcgdGhhdCdzIG5vdCBhIGRpcmVjdC1tYXBwZWQgY2FjaGUsIGxvb2sgdG8gdGhlIENWUgogCSAqIGZvciBJL0QtY2FjaGUgc3BlY2lmaWNzLgpAQCAtMTIxLDE4ICsxODEsNTYgQEAKIAkJc2l6ZSA9IHNpemVzWyhjdnIgPj4gMjApICYgMHhmXTsKIAkJY3B1X2RhdGEtPmljYWNoZS53YXlfaW5jcgk9IChzaXplID4+IDEpOwogCQljcHVfZGF0YS0+aWNhY2hlLnNldHMJCT0gKHNpemUgPj4gNik7Ci0JCWNwdV9kYXRhLT5pY2FjaGUuZW50cnlfbWFzawk9Ci0JCQkoY3B1X2RhdGEtPmljYWNoZS53YXlfaW5jciAtICgxIDw8IDUpKTsKKwogCX0KIAorCS8qIFNldHVwIHRoZSByZXN0IG9mIHRoZSBJLWNhY2hlIGluZm8gKi8KKwljcHVfZGF0YS0+aWNhY2hlLmVudHJ5X21hc2sgPSBjcHVfZGF0YS0+aWNhY2hlLndheV9pbmNyIC0KKwkJCQkgICAgICBjcHVfZGF0YS0+aWNhY2hlLmxpbmVzejsKKworCWNwdV9kYXRhLT5pY2FjaGUud2F5X3NpemUgPSBjcHVfZGF0YS0+aWNhY2hlLnNldHMgKgorCQkJCSAgICBjcHVfZGF0YS0+aWNhY2hlLmxpbmVzejsKKworCS8qIEFuZCB0aGUgcmVzdCBvZiB0aGUgRC1jYWNoZSAqLwogCWlmIChjcHVfZGF0YS0+ZGNhY2hlLndheXMgPiAxKSB7CiAJCXNpemUgPSBzaXplc1soY3ZyID4+IDE2KSAmIDB4Zl07CiAJCWNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3IJPSAoc2l6ZSA+PiAxKTsKIAkJY3B1X2RhdGEtPmRjYWNoZS5zZXRzCQk9IChzaXplID4+IDYpOwotCQljcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X21hc2sJPQotCQkJKGNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3IgLSAoMSA8PCA1KSk7CisJfQorCisJY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9tYXNrID0gY3B1X2RhdGEtPmRjYWNoZS53YXlfaW5jciAtCisJCQkJICAgICAgY3B1X2RhdGEtPmRjYWNoZS5saW5lc3o7CisKKwljcHVfZGF0YS0+ZGNhY2hlLndheV9zaXplID0gY3B1X2RhdGEtPmRjYWNoZS5zZXRzICoKKwkJCQkgICAgY3B1X2RhdGEtPmRjYWNoZS5saW5lc3o7CisKKwkvKgorCSAqIFNldHVwIHRoZSBMMiBjYWNoZSBkZXNjCisJICoKKwkgKiBTSC00QSdzIGhhdmUgYW4gb3B0aW9uYWwgUElQVCBMMi4KKwkgKi8KKwlpZiAoY3B1X2RhdGEtPmZsYWdzICYgQ1BVX0hBU19MMl9DQUNIRSkgeworCQkvKgorCQkgKiBTaXplIGNhbGN1bGF0aW9uIGlzIG11Y2ggbW9yZSBzZW5zaWJsZQorCQkgKiB0aGFuIGl0IGlzIGZvciB0aGUgTDEuCisJCSAqCisJCSAqIFNpemVzIGFyZSAxMjhLQiwgMjU4S0IsIDUxMktCLCBhbmQgMU1CLgorCQkgKi8KKwkJc2l6ZSA9IChjdnIgJiAweGYpIDw8IDE3OworCisJCUJVR19PTighc2l6ZSk7CisKKwkJY3B1X2RhdGEtPnNjYWNoZS53YXlfaW5jcgk9ICgxIDw8IDE2KTsKKwkJY3B1X2RhdGEtPnNjYWNoZS5lbnRyeV9zaGlmdAk9IDU7CisJCWNwdV9kYXRhLT5zY2FjaGUud2F5cwkJPSA0OworCQljcHVfZGF0YS0+c2NhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKKwkJY3B1X2RhdGEtPnNjYWNoZS5lbnRyeV9tYXNrCT0KKwkJCShjcHVfZGF0YS0+c2NhY2hlLndheV9pbmNyIC0gY3B1X2RhdGEtPnNjYWNoZS5saW5lc3opOworCQljcHVfZGF0YS0+c2NhY2hlLnNldHMJCT0gc2l6ZSAvCisJCQkoY3B1X2RhdGEtPnNjYWNoZS5saW5lc3ogKiBjcHVfZGF0YS0+c2NhY2hlLndheXMpOworCQljcHVfZGF0YS0+c2NhY2hlLndheV9zaXplCT0KKwkJCShjcHVfZGF0YS0+c2NhY2hlLnNldHMgKiBjcHVfZGF0YS0+c2NhY2hlLmxpbmVzeik7CiAJfQogCiAJcmV0dXJuIDA7CiB9Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g0LTIwMi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDQtMjAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU0ZTk2NQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g0LTIwMi5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBTSDQtMjAyIFNldHVwCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS9zY2kuaD4KKworc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CisJeworCQkubWFwYmFzZQk9IDB4ZmZlODAwMDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUJCT0gUE9SVF9TQ0lGLAorCQkuaXJxcwkJPSB7IDQwLCA0MSwgNDMsIDQyIH0sCisJfSwgeworCQkuZmxhZ3MgPSAwLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoLXNjaSIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IHNjaV9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g0MjAyX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzY2lfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2g0MjAyX2RldmljZXNfc2V0dXAodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoc2g0MjAyX2RldmljZXMsCisJCQkJICAgIEFSUkFZX1NJWkUoc2g0MjAyX2RldmljZXMpKTsKK30KK19faW5pdGNhbGwoc2g0MjAyX2RldmljZXNfc2V0dXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDczMTgwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzMxODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzllYTFlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDczMTgwLmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIFNINzMxODAgU2V0dXAKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8YXNtL3NjaS5oPgorCitzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpX3BsYXRmb3JtX2RhdGFbXSA9IHsKKwl7CisJCS5tYXBiYXNlCT0gMHhmZmU4MDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgODAsIDgxLCA4MywgODIgfSwKKwl9LCB7CisJCS5mbGFncyA9IDAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2gtc2NpIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2NpX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDczMTgwX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzY2lfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2g3MzE4MF9kZXZpY2VzX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNzMxODBfZGV2aWNlcywKKwkJCQkgICAgQVJSQVlfU0laRShzaDczMTgwX2RldmljZXMpKTsKK30KK19faW5pdGNhbGwoc2g3MzE4MF9kZXZpY2VzX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3MzQzLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzM0My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZDYxY2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzM0My5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBTSDczNDMgU2V0dXAKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8YXNtL3NjaS5oPgorCitzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpX3BsYXRmb3JtX2RhdGFbXSA9IHsKKwl7CisJCS5tYXBiYXNlCT0gMHhmZmUwMDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgODAsIDgxLCA4MywgODIgfSwKKwl9LCB7CisJCS5mbGFncyA9IDAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2gtc2NpIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2NpX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDczNDNfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnNjaV9kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaDczNDNfZGV2aWNlc19zZXR1cCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDczNDNfZGV2aWNlcywKKwkJCQkgICAgQVJSQVlfU0laRShzaDczNDNfZGV2aWNlcykpOworfQorX19pbml0Y2FsbChzaDczNDNfZGV2aWNlc19zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDgxMmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogU0g3NzUwL1NINzc1MSBTZXR1cAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vc2NpLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0geworCXsKKwkJLm1hcGJhc2UJPSAweGZmZTAwMDAwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJLAorCQkuaXJxcwkJPSB7IDIzLCAyNCwgMjUsIDAgfSwKKwl9LCB7CisJCS5tYXBiYXNlCT0gMHhmZmU4MDAwMCwKKwkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAorCQkudHlwZQkJPSBQT1JUX1NDSUYsCisJCS5pcnFzCQk9IHsgNDAsIDQxLCA0MywgNDIgfSwKKwl9LCB7CisJCS5mbGFncyA9IDAsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpX2RldmljZSA9IHsKKwkubmFtZQkJPSAic2gtc2NpIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gc2NpX3BsYXRmb3JtX2RhdGEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzaDc3NTBfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJnNjaV9kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaDc3NTBfZGV2aWNlc19zZXR1cCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDc3NTBfZGV2aWNlcywKKwkJCQkgICAgQVJSQVlfU0laRShzaDc3NTBfZGV2aWNlcykpOworfQorX19pbml0Y2FsbChzaDc3NTBfZGV2aWNlc19zZXR1cCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2YxYzlhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogU0g3NzYwIFNldHVwCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNiAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS9zY2kuaD4KKworc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhW10gPSB7CisJeworCQkubWFwYmFzZQk9IDB4ZmU2MDAwMDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUJCT0gUE9SVF9TQ0lGLAorCQkuaXJxcwkJPSB7IDUyLCA1MywgNTUsIDU0IH0sCisJfSwgeworCQkubWFwYmFzZQk9IDB4ZmU2MTAwMDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUJCT0gUE9SVF9TQ0lGLAorCQkuaXJxcwkJPSB7IDcyLCA3MywgNzUsIDc0IH0sCisJfSwgeworCQkubWFwYmFzZQk9IDB4ZmU2MjAwMDAsCisJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLnR5cGUJCT0gUE9SVF9TQ0lGLAorCQkuaXJxcwkJPSB7IDc2LCA3NywgNzksIDc4IH0sCisJfSwgeworCQkuZmxhZ3MgPSAwLAorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gInNoLXNjaSIsCisJLmlkCQk9IC0xLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9IHNjaV9wbGF0Zm9ybV9kYXRhLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2g3NzYwX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzY2lfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2g3NzYwX2RldmljZXNfc2V0dXAodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoc2g3NzYwX2RldmljZXMsCisJCQkJICAgIEFSUkFZX1NJWkUoc2g3NzYwX2RldmljZXMpKTsKK30KK19faW5pdGNhbGwoc2g3NzYwX2RldmljZXNfc2V0dXApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NzAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzcwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwNGNjNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzcwLmMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIFNINzc3MCBTZXR1cAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vc2NpLmg+CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0geworCXsKKwkJLm1hcGJhc2UJPSAweGZmOTIzMDAwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkJLmlycXMJCT0geyA2MSwgNjEsIDYxLCA2MSB9LAorCX0sIHsKKwkJLm1hcGJhc2UJPSAweGZmOTI0MDAwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkJLmlycXMJCT0geyA2MiwgNjIsIDYyLCA2MiB9LAorCX0sIHsKKwkJLm1hcGJhc2UJPSAweGZmOTI1MDAwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkJLmlycXMJCT0geyA2MywgNjMsIDYzLCA2MyB9LAorCX0sIHsKKwkJLmZsYWdzID0gMCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaC1zY2kiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSBzY2lfcGxhdGZvcm1fZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzc3MF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmc2NpX2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoNzc3MF9kZXZpY2VzX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNzc3MF9kZXZpY2VzLAorCQkJCSAgICBBUlJBWV9TSVpFKHNoNzc3MF9kZXZpY2VzKSk7Cit9CitfX2luaXRjYWxsKHNoNzc3MF9kZXZpY2VzX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzgwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNDkzZjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc4MC5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBTSDc3ODAgU2V0dXAKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8YXNtL3NjaS5oPgorCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHJ0Y19yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IDB4ZmZlODAwMDAsCisJCS5lbmQJPSAweGZmZTgwMDAwICsgMHg1OCAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCisJfSwKKwlbMV0gPSB7CisJCS8qIFBlcmlvZCBJUlEgKi8KKwkJLnN0YXJ0CT0gMjEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzJdID0geworCQkvKiBDYXJyeSBJUlEgKi8KKwkJLnN0YXJ0CT0gMjIsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJWzNdID0geworCQkvKiBBbGFybSBJUlEgKi8KKwkJLnN0YXJ0CT0gMjMsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBydGNfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaC1ydGMiLAorCS5pZAkJPSAtMSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUocnRjX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gcnRjX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0geworCXsKKwkJLm1hcGJhc2UJPSAweGZmZTAwMDAwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkJLmlycXMJCT0geyA0MCwgNDEsIDQzLCA0MiB9LAorCX0sIHsKKwkJLm1hcGJhc2UJPSAweGZmZTEwMDAwLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCisJCS50eXBlCQk9IFBPUlRfU0NJRiwKKwkJLmlycXMJCT0geyA3NiwgNzcsIDc5LCA3OCB9LAorCX0sIHsKKwkJLmZsYWdzID0gMCwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lfZGV2aWNlID0geworCS5uYW1lCQk9ICJzaC1zY2kiLAorCS5pZAkJPSAtMSwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSBzY2lfcGxhdGZvcm1fZGF0YSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzc4MF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmcnRjX2RldmljZSwKKwkmc2NpX2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoNzc4MF9kZXZpY2VzX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNoNzc4MF9kZXZpY2VzLAorCQkJCSAgICBBUlJBWV9TSVpFKHNoNzc4MF9kZXZpY2VzKSk7Cit9CitfX2luaXRjYWxsKHNoNzc4MF9kZXZpY2VzX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc3EuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc3EuYwppbmRleCBiMDk4MDVmLi43YmNjNzNmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NxLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zcS5jCkBAIC0xLDQ5ICsxLDUyIEBACiAvKgotICogYXJjaC9zaC9rZXJuZWwvY3B1L3NxLmMKKyAqIGFyY2gvc2gva2VybmVsL2NwdS9zaDQvc3EuYwogICoKICAqIEdlbmVyYWwgbWFuYWdlbWVudCBBUEkgZm9yIFNILTQgaW50ZWdyYXRlZCBTdG9yZSBRdWV1ZXMKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQgIFBhdWwgTXVuZHQKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDYgIFBhdWwgTXVuZHQKICAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiAgTS4gUi4gQnJvd24KICAqCi0gKiBTb21lIG9mIHRoaXMgY29kZSBoYXMgYmVlbiBhZG9wdGVkIGRpcmVjdGx5IGZyb20gdGhlIG9sZCBhcmNoL3NoL21tL3NxLmMKLSAqIGhhY2sgdGhhdCB3YXMgcGFydCBvZiB0aGUgTGludXhEQyBwcm9qZWN0LiBGb3IgYWxsIGludGVudHMgYW5kIHB1cnBvc2VzLAotICogdGhpcyBpcyBhIGNvbXBsZXRlbHkgbmV3IGludGVyZmFjZSB0aGF0IHJlYWxseSBkb2Vzbid0IGhhdmUgbXVjaCBpbiBjb21tb24KLSAqIHdpdGggdGhlIG9sZCB6b25lLWJhc2VkIGFwcHJvYWNoIGF0IGFsbC4gSW4gZmFjdCwgaXQncyBvbmx5IGxpc3RlZCBoZXJlIGZvcgotICogZ2VuZXJhbCBjb21wbGV0ZW5lc3MuCi0gKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLQorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9jcHUvc3EuaD4KIAotc3RhdGljIExJU1RfSEVBRChzcV9tYXBwaW5nX2xpc3QpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhzcV9tYXBwaW5nX2xvY2spOworc3RydWN0IHNxX21hcHBpbmc7CiAKLS8qKgotICogc3FfZmx1c2ggLSBGbHVzaCAocHJlZmV0Y2gpIHRoZSBzdG9yZSBxdWV1ZSBjYWNoZQotICogQGFkZHI6IHRoZSBzdG9yZSBxdWV1ZSBhZGRyZXNzIHRvIGZsdXNoCi0gKgotICogRXhlY3V0ZXMgYSBwcmVmZXRjaCBpbnN0cnVjdGlvbiBvbiB0aGUgc3BlY2lmaWVkIHN0b3JlIHF1ZXVlIGNhY2hlLAotICogc28gdGhhdCB0aGUgY2FjaGVkIGRhdGEgaXMgd3JpdHRlbiB0byBwaHlzaWNhbCBtZW1vcnkuCi0gKi8KLWlubGluZSB2b2lkIHNxX2ZsdXNoKHZvaWQgKmFkZHIpCi17Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJwcmVmIEAlMCIgOiA6ICJyIiAoYWRkcikgOiAibWVtb3J5Iik7Ci19CitzdHJ1Y3Qgc3FfbWFwcGluZyB7CisJY29uc3QgY2hhciAqbmFtZTsKKworCXVuc2lnbmVkIGxvbmcgc3FfYWRkcjsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlzdHJ1Y3Qgc3FfbWFwcGluZyAqbmV4dDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3FfbWFwcGluZyAqc3FfbWFwcGluZ19saXN0Oworc3RhdGljIERFRklORV9TUElOTE9DSyhzcV9tYXBwaW5nX2xvY2spOworc3RhdGljIGttZW1fY2FjaGVfdCAqc3FfY2FjaGU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyAqc3FfYml0bWFwOworCisjZGVmaW5lIHN0b3JlX3F1ZXVlX2JhcnJpZXIoKQkJCVwKK2RvIHsJCQkJCQlcCisJKHZvaWQpY3RybF9pbmwoUDRTRUdfU1RPUkVfUVVFKTsJXAorCWN0cmxfb3V0bCgwLCBQNFNFR19TVE9SRV9RVUUgKyAwKTsJXAorCWN0cmxfb3V0bCgwLCBQNFNFR19TVE9SRV9RVUUgKyA4KTsJXAorfSB3aGlsZSAoMCk7CiAKIC8qKgogICogc3FfZmx1c2hfcmFuZ2UgLSBGbHVzaCAocHJlZmV0Y2gpIGEgc3BlY2lmaWMgU1EgcmFuZ2UKQEAgLTU2LDE1MiArNTksNzMgQEAKIHZvaWQgc3FfZmx1c2hfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgaW50IGxlbikKIHsKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nICpzcSA9ICh1bnNpZ25lZCBsb25nICopc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBkdW1teTsKIAogCS8qIEZsdXNoIHRoZSBxdWV1ZXMgKi8KIAlmb3IgKGxlbiA+Pj0gNTsgbGVuLS07IHNxICs9IDgpCi0JCXNxX2ZsdXNoKCh2b2lkICopc3EpOworCQlwcmVmZXRjaHcoKHZvaWQgKilzcSk7CiAKIAkvKiBXYWl0IGZvciBjb21wbGV0aW9uICovCi0JZHVtbXkgPSBjdHJsX2lubChQNFNFR19TVE9SRV9RVUUpOwotCi0JY3RybF9vdXRsKDAsIFA0U0VHX1NUT1JFX1FVRSArIDApOwotCWN0cmxfb3V0bCgwLCBQNFNFR19TVE9SRV9RVUUgKyA4KTsKKwlzdG9yZV9xdWV1ZV9iYXJyaWVyKCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3FfbWFwcGluZyAqX19zcV9hbGxvY19tYXBwaW5nKHVuc2lnbmVkIGxvbmcgdmlydCwgdW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgaW5saW5lIHZvaWQgc3FfbWFwcGluZ19saXN0X2FkZChzdHJ1Y3Qgc3FfbWFwcGluZyAqbWFwKQogewotCXN0cnVjdCBzcV9tYXBwaW5nICptYXA7CisJc3RydWN0IHNxX21hcHBpbmcgKipwLCAqdG1wOwogCi0JaWYgKHZpcnQgKyBzaXplID4gU1FfQUREUk1BWCkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CisJc3Bpbl9sb2NrX2lycSgmc3FfbWFwcGluZ19sb2NrKTsKIAotCW1hcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzcV9tYXBwaW5nKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFtYXApCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXAgPSAmc3FfbWFwcGluZ19saXN0OworCXdoaWxlICgodG1wID0gKnApICE9IE5VTEwpCisJCXAgPSAmdG1wLT5uZXh0OwogCi0JSU5JVF9MSVNUX0hFQUQoJm1hcC0+bGlzdCk7CisJbWFwLT5uZXh0ID0gdG1wOworCSpwID0gbWFwOwogCi0JbWFwLT5zcV9hZGRyCT0gdmlydDsKLQltYXAtPmFkZHIJPSBwaHlzOwotCW1hcC0+c2l6ZQk9IHNpemUgKyAxOwotCW1hcC0+bmFtZQk9IG5hbWU7Ci0KLQlsaXN0X2FkZCgmbWFwLT5saXN0LCAmc3FfbWFwcGluZ19saXN0KTsKLQotCXJldHVybiBtYXA7CisJc3Bpbl91bmxvY2tfaXJxKCZzcV9tYXBwaW5nX2xvY2spOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX3NxX2dldF9uZXh0X2FkZHIodm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcV9tYXBwaW5nX2xpc3RfZGVsKHN0cnVjdCBzcV9tYXBwaW5nICptYXApCiB7Ci0JaWYgKCFsaXN0X2VtcHR5KCZzcV9tYXBwaW5nX2xpc3QpKSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRtcDsKKwlzdHJ1Y3Qgc3FfbWFwcGluZyAqKnAsICp0bXA7CiAKLQkJLyoKLQkJICogUmVhZCBvbmUgb2ZmIHRoZSBsaXN0IGhlYWQsIGFzIGl0IHdpbGwgaGF2ZSB0aGUgaGlnaGVzdAotCQkgKiBtYXBwZWQgYWxsb2NhdGlvbi4gU2V0IHRoZSBuZXh0IG9uZSB1cCByaWdodCBhYm92ZSBpdC4KLQkJICoKLQkJICogVGhpcyBpcyBzb21ld2hhdCBzdWItb3B0aW1hbCwgYXMgd2UgZG9uJ3QgbG9vayBhdAotCQkgKiBnYXBzIGJldHdlZW4gYWxsb2NhdGlvbnMgb3IgYW55dGhpbmcgbG93ZXIgdGhlbiB0aGUKLQkJICogaGlnaGVzdC1sZXZlbCBhbGxvY2F0aW9uLgotCQkgKgotCQkgKiBIb3dldmVyLCBpbiB0aGUgaW50ZXJlc3Qgb2YgcGVyZm9ybWFuY2UgYW5kIHRoZSBnZW5lcmFsCi0JCSAqIGxhY2sgb2YgZGVzaXJlIHRvIGRvIGNvbnN0YW50IGxpc3QgcmViYWxhbmNpbmcsIHdlIGRvbid0Ci0JCSAqIHdvcnJ5IGFib3V0IGl0LgotCQkgKi8KLQkJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmc3FfbWFwcGluZ19saXN0KSB7Ci0JCQlzdHJ1Y3Qgc3FfbWFwcGluZyAqZW50cnk7CisJc3Bpbl9sb2NrX2lycSgmc3FfbWFwcGluZ19sb2NrKTsKIAotCQkJZW50cnkgPSBsaXN0X2VudHJ5KHBvcywgdHlwZW9mKCplbnRyeSksIGxpc3QpOwotCi0JCQlyZXR1cm4gZW50cnktPnNxX2FkZHIgKyBlbnRyeS0+c2l6ZTsKKwlmb3IgKHAgPSAmc3FfbWFwcGluZ19saXN0OyAodG1wID0gKnApOyBwID0gJnRtcC0+bmV4dCkKKwkJaWYgKHRtcCA9PSBtYXApIHsKKwkJCSpwID0gdG1wLT5uZXh0OworCQkJYnJlYWs7CiAJCX0KLQl9CiAKLQlyZXR1cm4gUDRTRUdfU1RPUkVfUVVFOworCXNwaW5fdW5sb2NrX2lycSgmc3FfbWFwcGluZ19sb2NrKTsKIH0KIAotLyoqCi0gKiBfX3NxX3JlbWFwIC0gUGVyZm9ybSBhIHRyYW5zbGF0aW9uIGZyb20gdGhlIFNRIHRvIGEgcGh5cyBhZGRyCi0gKiBAbWFwOiBzcSBtYXBwaW5nIGNvbnRhaW5pbmcgcGh5cyBhbmQgc3RvcmUgcXVldWUgYWRkcmVzc2VzLgotICoKLSAqIE1hcHMgdGhlIHN0b3JlIHF1ZXVlIGFkZHJlc3Mgc3BlY2lmaWVkIGluIHRoZSBtYXBwaW5nIHRvIHRoZSBwaHlzaWNhbAotICogYWRkcmVzcyBzcGVjaWZpZWQgaW4gdGhlIG1hcHBpbmcuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc3FfbWFwcGluZyAqX19zcV9yZW1hcChzdHJ1Y3Qgc3FfbWFwcGluZyAqbWFwKQorc3RhdGljIGludCBfX3NxX3JlbWFwKHN0cnVjdCBzcV9tYXBwaW5nICptYXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgcHRlaCwgcHRlbDsKKyNpZiBkZWZpbmVkKENPTkZJR19NTVUpCiAJc3RydWN0IHZtX3N0cnVjdCAqdm1hOwotCXBncHJvdF90IHBncHJvdDsKIAorCXZtYSA9IF9fZ2V0X3ZtX2FyZWEobWFwLT5zaXplLCBWTV9BTExPQywgbWFwLT5zcV9hZGRyLCBTUV9BRERSTUFYKTsKKwlpZiAoIXZtYSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2bWEtPnBoeXNfYWRkciA9IG1hcC0+YWRkcjsKKworCWlmIChyZW1hcF9hcmVhX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZtYS0+YWRkciwgdm1hLT5waHlzX2FkZHIsCisJCQkgICAgIG1hcC0+c2l6ZSwgZmxhZ3MpKSB7CisJCXZ1bm1hcCh2bWEtPmFkZHIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisjZWxzZQogCS8qCiAJICogV2l0aG91dCBhbiBNTVUgKG9yIHdpdGggaXQgdHVybmVkIG9mZiksIHRoaXMgaXMgbXVjaCBtb3JlCiAJICogc3RyYWlnaHRmb3J3YXJkLCBhcyB3ZSBjYW4ganVzdCBsb2FkIHVwIGVhY2ggcXVldWUncyBRQUNSIHdpdGgKIAkgKiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBhcHByb3ByaWF0ZWx5IG1hc2tlZC4KIAkgKi8KLQogCWN0cmxfb3V0bCgoKG1hcC0+YWRkciA+PiAyNikgPDwgMikgJiAweDFjLCBTUV9RQUNSMCk7CiAJY3RybF9vdXRsKCgobWFwLT5hZGRyID4+IDI2KSA8PCAyKSAmIDB4MWMsIFNRX1FBQ1IxKTsKKyNlbmRpZgogCi0jaWZkZWYgQ09ORklHX01NVQotCS8qCi0JICogV2l0aCBhbiBNTVUgb24gdGhlIG90aGVyIGhhbmQsIHRoaW5ncyBhcmUgc2xpZ2h0bHkgbW9yZSBpbnZvbHZlZC4KLQkgKiBOYW1lbHksIHdlIGhhdmUgdG8gaGF2ZSBhIGRpcmVjdCBtYXBwaW5nIGJldHdlZW4gdGhlIFNRIGFkZHIgYW5kCi0JICogdGhlIGFzc29jaWF0ZWQgcGh5c2ljYWwgYWRkcmVzcyBpbiB0aGUgVVRMQiBieSB3YXkgb2Ygc2V0dGluZyB1cAotCSAqIGEgdmlydDwtPnBoeXMgdHJhbnNsYXRpb24gYnkgaGFuZC4gV2UgZG8gdGhpcyBieSBzaW1wbHkgc3BlY2lmeWluZwotCSAqIHRoZSBTUSBhZGRyIGluIFVUTEIuVlBOIGFuZCB0aGUgYXNzb2NpYXRlZCBwaHlzaWNhbCBhZGRyZXNzIGluCi0JICogVVRMQi5QUE4uCi0JICoKLQkgKiBOb3RhYmx5LCBldmVuIHRob3VnaCB0aGlzIGlzIGEgc3BlY2lhbCBjYXNlIHRyYW5zbGF0aW9uLCBhbmQgc29tZQotCSAqIG9mIHRoZSBjb25maWd1cmF0aW9uIGJpdHMgYXJlIG1lYW5pbmdsZXNzLCB3ZSdyZSBzdGlsbCByZXF1aXJlZAotCSAqIHRvIGhhdmUgYSB2YWxpZCBBU0lEIGNvbnRleHQgaW4gUFRFSC4KLQkgKgotCSAqIFdlIGNvdWxkIGFsc28gcHJvYmFibHkgZ2V0IGJ5IHdpdGhvdXQgZXhwbGljaXRseSBzZXR0aW5nIFBURUEsIGJ1dAotCSAqIHdlIGRvIGl0IGhlcmUganVzdCBmb3IgZ29vZCBtZWFzdXJlLgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZzcV9tYXBwaW5nX2xvY2ssIGZsYWdzKTsKLQotCXB0ZWggPSBtYXAtPnNxX2FkZHI7Ci0JY3RybF9vdXRsKChwdGVoICYgTU1VX1ZQTl9NQVNLKSB8IGdldF9hc2lkKCksIE1NVV9QVEVIKTsKLQotCXB0ZWwgPSBtYXAtPmFkZHIgJiBQQUdFX01BU0s7Ci0JY3RybF9vdXRsKCgocHRlbCA+PiAyOCkgJiAweGUpIHwgKHB0ZWwgJiAweDEpLCBNTVVfUFRFQSk7Ci0KLQlwZ3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKFBBR0VfS0VSTkVMKTsKLQotCXB0ZWwgJj0gX1BBR0VfRkxBR1NfSEFSRFdBUkVfTUFTSzsKLQlwdGVsIHw9IHBncHJvdF92YWwocGdwcm90KTsKLQljdHJsX291dGwocHRlbCwgTU1VX1BURUwpOwotCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJsZHRsYiIgOiA6IDogIm1lbW9yeSIpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3FfbWFwcGluZ19sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIE5leHQsIHdlIG5lZWQgdG8gbWFwIG91cnNlbHZlcyBpbiB0aGUga2VybmVsIHBhZ2UgdGFibGUsIHNvIHRoYXQKLQkgKiBmdXR1cmUgYWNjZXNzZXMgYWZ0ZXIgYSBUTEIgZmx1c2ggd2lsbCBiZSBoYW5kbGVkIHdoZW4gd2UgdGFrZSBhCi0JICogcGFnZSBmYXVsdC4KLQkgKgotCSAqIFRoZW9yZXRpY2FsbHkgd2UgY291bGQganVzdCBkbyB0aGlzIGRpcmVjdGx5IGFuZCBub3Qgd29ycnkgYWJvdXQKLQkgKiBzZXR0aW5nIHVwIHRoZSB0cmFuc2xhdGlvbiBieSBoYW5kIGFoZWFkIG9mIHRpbWUsIGJ1dCBmb3IgdGhlCi0JICogY2FzZXMgd2hlcmUgd2Ugd2FudCBhIG9uZS1zaG90IFNRIG1hcHBpbmcgZm9sbG93ZWQgYnkgYSBxdWljawotCSAqIHdyaXRlb3V0IGJlZm9yZSB3ZSBoaXQgdGhlIFRMQiBmbHVzaCwgd2UgZG8gaXQgYW55d2F5cy4gVGhpcyB3YXkKLQkgKiB3ZSBhdCBsZWFzdCBzYXZlIG91cnNlbHZlcyB0aGUgaW5pdGlhbCBwYWdlIGZhdWx0IG92ZXJoZWFkLgotCSAqLwotCXZtYSA9IF9fZ2V0X3ZtX2FyZWEobWFwLT5zaXplLCBWTV9BTExPQywgbWFwLT5zcV9hZGRyLCBTUV9BRERSTUFYKTsKLQlpZiAoIXZtYSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQl2bWEtPnBoeXNfYWRkciA9IG1hcC0+YWRkcjsKLQotCWlmIChyZW1hcF9hcmVhX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZtYS0+YWRkciwgdm1hLT5waHlzX2FkZHIsCi0JCQkgICAgIG1hcC0+c2l6ZSwgcGdwcm90X3ZhbChwZ3Byb3QpKSkgewotCQl2dW5tYXAodm1hLT5hZGRyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KLQotCXJldHVybiBtYXA7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMjA5LDQyICsxMzMsNjUgQEAKICAqIEBwaHlzOiBQaHlzaWNhbCBhZGRyZXNzIG9mIG1hcHBpbmcuCiAgKiBAc2l6ZTogTGVuZ3RoIG9mIG1hcHBpbmcuCiAgKiBAbmFtZTogVXNlciBpbnZva2luZyBtYXBwaW5nLgorICogQGZsYWdzOiBQcm90ZWN0aW9uIGZsYWdzLgogICoKICAqIFJlbWFwcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBAcGh5cyB0aHJvdWdoIHRoZSBuZXh0IGF2YWlsYWJsZSBzdG9yZSBxdWV1ZQogICogYWRkcmVzcyBvZiBAc2l6ZSBsZW5ndGguIEBuYW1lIGlzIGxvZ2dlZCBhdCBib290IHRpbWUgYXMgd2VsbCBhcyB0aHJvdWdoCi0gKiB0aGUgcHJvY2ZzIGludGVyZmFjZS4KLSAqCi0gKiBBIHByZS1hbGxvY2F0ZWQgYW5kIGZpbGxlZCBzcV9tYXBwaW5nIHBvaW50ZXIgaXMgcmV0dXJuZWQsIGFuZCBtdXN0IGJlCi0gKiBjbGVhbmVkIHVwIHdpdGggYSBjYWxsIHRvIHNxX3VubWFwKCkgd2hlbiB0aGUgdXNlciBpcyBkb25lIHdpdGggdGhlCi0gKiBtYXBwaW5nLgorICogdGhlIHN5c2ZzIGludGVyZmFjZS4KICAqLwotc3RydWN0IHNxX21hcHBpbmcgKnNxX3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgaW50IHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCit1bnNpZ25lZCBsb25nIHNxX3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgaW50IHNpemUsCisJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBzcV9tYXBwaW5nICptYXA7Ci0JdW5zaWduZWQgbG9uZyB2aXJ0LCBlbmQ7CisJdW5zaWduZWQgbG9uZyBlbmQ7CiAJdW5zaWduZWQgaW50IHBzejsKKwlpbnQgcmV0LCBwYWdlOwogCiAJLyogRG9uJ3QgYWxsb3cgd3JhcGFyb3VuZCBvciB6ZXJvIHNpemUgKi8KIAllbmQgPSBwaHlzICsgc2l6ZSAtIDE7Ci0JaWYgKCFzaXplIHx8IGVuZCA8IHBoeXMpCi0JCXJldHVybiBOVUxMOworCWlmICh1bmxpa2VseSghc2l6ZSB8fCBlbmQgPCBwaHlzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJLyogRG9uJ3QgYWxsb3cgYW55b25lIHRvIHJlbWFwIG5vcm1hbCBtZW1vcnkuLiAqLwotCWlmIChwaHlzIDwgdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSkKLQkJcmV0dXJuIE5VTEw7CisJaWYgKHVubGlrZWx5KHBoeXMgPCB2aXJ0X3RvX3BoeXMoaGlnaF9tZW1vcnkpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwaHlzICY9IFBBR0VfTUFTSzsKKwlzaXplID0gUEFHRV9BTElHTihlbmQgKyAxKSAtIHBoeXM7CiAKLQlzaXplICA9IFBBR0VfQUxJR04oZW5kICsgMSkgLSBwaHlzOwotCXZpcnQgID0gX19zcV9nZXRfbmV4dF9hZGRyKCk7Ci0JcHN6ICAgPSAoc2l6ZSArIChQQUdFX1NJWkUgLSAxKSkgLyBQQUdFX1NJWkU7Ci0JbWFwICAgPSBfX3NxX2FsbG9jX21hcHBpbmcodmlydCwgcGh5cywgc2l6ZSwgbmFtZSk7CisJbWFwID0ga21lbV9jYWNoZV9hbGxvYyhzcV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFtYXApKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCXByaW50aygic3FyZW1hcDogJTE1cyAgWyU0ZCBwYWdlJXNdICB2YSAweCUwOGx4ICAgcGEgMHglMDhseFxuIiwKLQkgICAgICAgbWFwLT5uYW1lID8gbWFwLT5uYW1lIDogIj8/PyIsCi0JICAgICAgIHBzeiwgcHN6ID09IDEgPyAiICIgOiAicyIsCi0JICAgICAgIG1hcC0+c3FfYWRkciwgbWFwLT5hZGRyKTsKKwltYXAtPmFkZHIgPSBwaHlzOworCW1hcC0+c2l6ZSA9IHNpemU7CisJbWFwLT5uYW1lID0gbmFtZTsKIAotCXJldHVybiBfX3NxX3JlbWFwKG1hcCk7CisJcGFnZSA9IGJpdG1hcF9maW5kX2ZyZWVfcmVnaW9uKHNxX2JpdG1hcCwgMHgwNDAwMDAwMCwKKwkJCQkgICAgICAgZ2V0X29yZGVyKG1hcC0+c2l6ZSkpOworCWlmICh1bmxpa2VseShwYWdlIDwgMCkpIHsKKwkJcmV0ID0gLUVOT1NQQzsKKwkJZ290byBvdXQ7CisJfQorCisJbWFwLT5zcV9hZGRyID0gUDRTRUdfU1RPUkVfUVVFICsgKHBhZ2UgPDwgUEFHRV9TSElGVCk7CisKKwlyZXQgPSBfX3NxX3JlbWFwKG1hcCwgZmxhZ3MpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0OworCisJcHN6ID0gKHNpemUgKyAoUEFHRV9TSVpFIC0gMSkpID4+IFBBR0VfU0hJRlQ7CisJcHJfaW5mbygic3FyZW1hcDogJTE1cyAgWyU0ZCBwYWdlJXNdICB2YSAweCUwOGx4ICAgcGEgMHglMDhseFxuIiwKKwkJbGlrZWx5KG1hcC0+bmFtZSkgPyBtYXAtPm5hbWUgOiAiPz8/IiwKKwkJcHN6LCBwc3ogPT0gMSA/ICIgIiA6ICJzIiwKKwkJbWFwLT5zcV9hZGRyLCBtYXAtPmFkZHIpOworCisJc3FfbWFwcGluZ19saXN0X2FkZChtYXApOworCisJcmV0dXJuIG1hcC0+c3FfYWRkcjsKKworb3V0OgorCWttZW1fY2FjaGVfZnJlZShzcV9jYWNoZSwgbWFwKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTI1NSwxODggKzIwMiwxOTggQEAKICAqIHNxX3JlbWFwKCkuIEFsc28gZnJlZXMgdXAgdGhlIHB0ZSB0aGF0IHdhcyBwcmV2aW91c2x5IGluc2VydGVkIGludG8KICAqIHRoZSBrZXJuZWwgcGFnZSB0YWJsZSBhbmQgZGlzY2FyZHMgdGhlIFVUTEIgdHJhbnNsYXRpb24uCiAgKi8KLXZvaWQgc3FfdW5tYXAoc3RydWN0IHNxX21hcHBpbmcgKm1hcCkKK3ZvaWQgc3FfdW5tYXAodW5zaWduZWQgbG9uZyB2YWRkcikKIHsKLQlpZiAobWFwLT5zcV9hZGRyID4gKHVuc2lnbmVkIGxvbmcpaGlnaF9tZW1vcnkpCi0JCXZmcmVlKCh2b2lkICopKG1hcC0+c3FfYWRkciAmIFBBR0VfTUFTSykpOworCXN0cnVjdCBzcV9tYXBwaW5nICoqcCwgKm1hcDsKKwlzdHJ1Y3Qgdm1fc3RydWN0ICp2bWE7CisJaW50IHBhZ2U7CiAKLQlsaXN0X2RlbCgmbWFwLT5saXN0KTsKLQlrZnJlZShtYXApOwotfQorCWZvciAocCA9ICZzcV9tYXBwaW5nX2xpc3Q7IChtYXAgPSAqcCk7IHAgPSAmbWFwLT5uZXh0KQorCQlpZiAobWFwLT5zcV9hZGRyID09IHZhZGRyKQorCQkJYnJlYWs7CiAKLS8qKgotICogc3FfY2xlYXIgLSBDbGVhciBhIHN0b3JlIHF1ZXVlIHJhbmdlCi0gKiBAYWRkcjogQWRkcmVzcyB0byBzdGFydCBjbGVhcmluZyBmcm9tLgotICogQGxlbjogTGVuZ3RoIHRvIGNsZWFyLgotICoKLSAqIEEgcXVpY2sgemVyby1maWxsIGltcGxlbWVudGF0aW9uIGZvciBjbGVhcmluZyBvdXQgbWVtb3J5IHRoYXQgaGFzIGJlZW4KLSAqIHJlbWFwcGVkIHRocm91Z2ggdGhlIHN0b3JlIHF1ZXVlcy4KLSAqLwotdm9pZCBzcV9jbGVhcih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBsZW4pCi17Ci0JaW50IGk7Ci0KLQkvKiBDbGVhciBvdXQgYm90aCBxdWV1ZXMgbGluZWFybHkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWN0cmxfb3V0bCgwLCBhZGRyICsgaSArIDApOwotCQljdHJsX291dGwoMCwgYWRkciArIGkgKyA4KTsKKwlpZiAodW5saWtlbHkoIW1hcCkpIHsKKwkJcHJpbnRrKCIlczogYmFkIHN0b3JlIHF1ZXVlIGFkZHJlc3MgMHglMDhseFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgdmFkZHIpOworCQlyZXR1cm47CiAJfQogCi0Jc3FfZmx1c2hfcmFuZ2UoYWRkciwgbGVuKTsKLX0KKwlwYWdlID0gKG1hcC0+c3FfYWRkciAtIFA0U0VHX1NUT1JFX1FVRSkgPj4gUEFHRV9TSElGVDsKKwliaXRtYXBfcmVsZWFzZV9yZWdpb24oc3FfYml0bWFwLCBwYWdlLCBnZXRfb3JkZXIobWFwLT5zaXplKSk7CiAKLS8qKgotICogc3Ffdm1hX3VubWFwIC0gVW5tYXAgYSBWTUEgcmFuZ2UKLSAqIEBhcmVhOiBWTUEgY29udGFpbmluZyByYW5nZS4KLSAqIEBhZGRyOiBTdGFydCBvZiByYW5nZS4KLSAqIEBsZW46IExlbmd0aCBvZiByYW5nZS4KLSAqCi0gKiBTZWFyY2hlcyB0aGUgc3FfbWFwcGluZ19saXN0IGZvciBhIG1hcHBpbmcgbWF0Y2hpbmcgdGhlIHNxIGFkZHIgQGFkZHIsCi0gKiBhbmQgc3Vic2VxdWVudGx5IGZyZWVzIHVwIHRoZSBlbnRyeS4gRnVydGhlciBjbGVhbnVwIGlzIGRvbmUgYnkgZ2VuZXJpYwotICogY29kZS4KLSAqLwotc3RhdGljIHZvaWQgc3Ffdm1hX3VubWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSwKLQkJCSB1bnNpZ25lZCBsb25nIGFkZHIsIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqdG1wOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmc3FfbWFwcGluZ19saXN0KSB7Ci0JCXN0cnVjdCBzcV9tYXBwaW5nICplbnRyeTsKLQotCQllbnRyeSA9IGxpc3RfZW50cnkocG9zLCB0eXBlb2YoKmVudHJ5KSwgbGlzdCk7Ci0KLQkJaWYgKGVudHJ5LT5zcV9hZGRyID09IGFkZHIpIHsKLQkJCS8qCi0JCQkgKiBXZSBjb3VsZCBwcm9iYWJseSBnZXQgYXdheSB3aXRob3V0IGRvaW5nIHRoZSB0bGIgZmx1c2gKLQkJCSAqIGhlcmUsIGFzIGdlbmVyaWMgY29kZSBzaG91bGQgdGFrZSBjYXJlIG9mIG1vc3Qgb2YgdGhpcwotCQkJICogd2hlbiB1bm1hcHBpbmcgdGhlIHJlc3Qgb2YgdGhlIFZNQSByYW5nZSBmb3IgdXMuIExlYXZlCi0JCQkgKiBpdCBpbiBmb3IgYWRkZWQgc2FuaXR5IGZvciB0aGUgdGltZSBiZWluZy4uCi0JCQkgKi8KLQkJCV9fZmx1c2hfdGxiX3BhZ2UoZ2V0X2FzaWQoKSwgZW50cnktPnNxX2FkZHIgJiBQQUdFX01BU0spOwotCi0JCQlsaXN0X2RlbCgmZW50cnktPmxpc3QpOwotCQkJa2ZyZWUoZW50cnkpOwotCi0JCQlyZXR1cm47Ci0JCX0KKyNpZmRlZiBDT05GSUdfTU1VCisJdm1hID0gcmVtb3ZlX3ZtX2FyZWEoKHZvaWQgKikobWFwLT5zcV9hZGRyICYgUEFHRV9NQVNLKSk7CisJaWYgKCF2bWEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogYmFkIGFkZHJlc3MgMHglMDhseFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgbWFwLT5zcV9hZGRyKTsKKwkJcmV0dXJuOwogCX0KKyNlbmRpZgorCisJc3FfbWFwcGluZ19saXN0X2RlbChtYXApOworCisJa21lbV9jYWNoZV9mcmVlKHNxX2NhY2hlLCBtYXApOwogfQogCi0vKioKLSAqIHNxX3ZtYV9zeW5jIC0gU3luYyBhIFZNQSByYW5nZQotICogQGFyZWE6IFZNQSBjb250YWluaW5nIHJhbmdlLgotICogQHN0YXJ0OiBTdGFydCBvZiByYW5nZS4KLSAqIEBsZW46IExlbmd0aCBvZiByYW5nZS4KLSAqIEBmbGFnczogQWRkaXRpb25hbCBmbGFncy4KKy8qCisgKiBOZWVkbGVzc2x5IGNvbXBsZXggc3lzZnMgaW50ZXJmYWNlLiBVbmZvcnR1bmF0ZWx5IGl0IGRvZXNuJ3Qgc2VlbSBsaWtlCisgKiB0aGVyZSBpcyBhbnkgb3RoZXIgZWFzeSB3YXkgdG8gYWRkIHRoaW5ncyBvbiBhIHBlci1jcHUgYmFzaXMgd2l0aG91dAorICogcHV0dGluZyB0aGUgZGlyZWN0b3J5IGVudHJpZXMgc29tZXdoZXJlIHN0dXBpZCBhbmQgaGF2aW5nIHRvIGNyZWF0ZQorICogbGlua3MgaW4gc3lzZnMgYnkgaGFuZCBiYWNrIGluIHRvIHRoZSBwZXItY3B1IGRpcmVjdG9yaWVzLgogICoKLSAqIFN5bmNocm9uaXplcyBhbiBzcSBtYXBwZWQgcmFuZ2UgYnkgZmx1c2hpbmcgdGhlIHN0b3JlIHF1ZXVlIGNhY2hlIGZvcgotICogdGhlIGR1cmF0aW9uIG9mIHRoZSBtYXBwaW5nLgotICoKLSAqIFVzZWQgaW50ZXJuYWxseSBmb3IgdXNlciBtYXBwaW5ncywgd2hpY2ggbXVzdCB1c2UgbXN5bmMoKSB0byBwcmVmZXRjaAotICogdGhlIHN0b3JlIHF1ZXVlIGNhY2hlLgorICogU29tZSBkYXkgd2UgbWF5IHdhbnQgdG8gaGF2ZSBhbiBhZGRpdGlvbmFsIGFic3RyYWN0aW9uIHBlciBzdG9yZQorICogcXVldWUsIGJ1dCBjb25zaWRlcmluZyB0aGUga29iamVjdCBoZWxsIHdlIGFscmVhZHkgaGF2ZSB0byBkZWFsIHdpdGgsCisgKiBpdCdzIHNpbXBseSBub3Qgd29ydGggdGhlIHRyb3VibGUuCiAgKi8KLXN0YXRpYyBpbnQgc3Ffdm1hX3N5bmMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICphcmVhLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKQotewotCXNxX2ZsdXNoX3JhbmdlKHN0YXJ0LCBsZW4pOworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpzcV9rb2JqZWN0W05SX0NQVVNdOwogCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc3Ffdm1hX29wcyA9IHsKLQkudW5tYXAJPSBzcV92bWFfdW5tYXAsCi0JLnN5bmMJPSBzcV92bWFfc3luYywKK3N0cnVjdCBzcV9zeXNmc19hdHRyIHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKGNoYXIgKmJ1Zik7CisJc3NpemVfdCAoKnN0b3JlKShjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CiB9OwogCi0vKioKLSAqIHNxX21tYXAgLSBtbWFwKCkgZm9yIC9kZXYvY3B1L3NxCi0gKiBAZmlsZTogdW51c2VkLgotICogQHZtYTogVk1BIHRvIHJlbWFwLgotICoKLSAqIFJlbWFwIHRoZSBzcGVjaWZpZWQgdm1hIEB2bWEgdGhyb3VnaCB0aGUgc3RvcmUgcXVldWVzLCBhbmQgc2V0dXAgYXNzb2NpYXRlZAotICogaW5mb3JtYXRpb24gZm9yIHRoZSBuZXcgbWFwcGluZy4gQWxzbyBidWlsZCB1cCB0aGUgcGFnZSB0YWJsZXMgZm9yIHRoZSBuZXcKLSAqIGFyZWEuCi0gKi8KLXN0YXRpYyBpbnQgc3FfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCisjZGVmaW5lIHRvX3NxX3N5c2ZzX2F0dHIoYXR0cikJY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBzcV9zeXNmc19hdHRyLCBhdHRyKQorCitzdGF0aWMgc3NpemVfdCBzcV9zeXNmc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjaGFyICpidWYpCiB7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwotCXN0cnVjdCBzcV9tYXBwaW5nICptYXA7CisJc3RydWN0IHNxX3N5c2ZzX2F0dHIgKnNhdHRyID0gdG9fc3Ffc3lzZnNfYXR0cihhdHRyKTsKIAotCS8qCi0JICogV2UncmUgbm90IGludGVyZXN0ZWQgaW4gYW55IGFyYml0cmFyeSB2aXJ0dWFsIGFkZHJlc3MgdGhhdCBoYXMKLQkgKiBiZWVuIHN0dWNrIGluIHRoZSBWTUEsIGFzIHdlIGFscmVhZHkga25vdyB3aGF0IGFkZHJlc3NlcyB3ZQotCSAqIHdhbnQuIFNhdmUgb2ZmIHRoZSBzaXplLCBhbmQgcmVwb3NpdGlvbiB0aGUgVk1BIHRvIGJlZ2luIGF0Ci0JICogdGhlIG5leHQgYXZhaWxhYmxlIHNxIGFkZHJlc3MuCi0JICovCi0Jdm1hLT52bV9zdGFydCA9IF9fc3FfZ2V0X25leHRfYWRkcigpOwotCXZtYS0+dm1fZW5kICAgPSB2bWEtPnZtX3N0YXJ0ICsgc2l6ZTsKKwlpZiAobGlrZWx5KHNhdHRyLT5zaG93KSkKKwkJcmV0dXJuIHNhdHRyLT5zaG93KGJ1Zik7CiAKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOwotCi0Jdm1hLT52bV9mbGFncyB8PSBWTV9JTyB8IFZNX1JFU0VSVkVEOwotCi0JbWFwID0gX19zcV9hbGxvY19tYXBwaW5nKHZtYS0+dm1fc3RhcnQsIG9mZnNldCwgc2l6ZSwgIlVzZXJzcGFjZSIpOwotCi0JaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIG1hcC0+c3FfYWRkciwgbWFwLT5hZGRyID4+IFBBR0VfU0hJRlQsCi0JCQkJc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCXZtYS0+dm1fb3BzID0gJnNxX3ZtYV9vcHM7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTzsKIH0KIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgaW50IHNxX21hcHBpbmdfcmVhZF9wcm9jKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCQkJaW50IGxlbiwgaW50ICplb2YsIHZvaWQgKmRhdGEpCitzdGF0aWMgc3NpemVfdCBzcV9zeXNmc19zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlzdHJ1Y3Qgc3Ffc3lzZnNfYXR0ciAqc2F0dHIgPSB0b19zcV9zeXNmc19hdHRyKGF0dHIpOworCisJaWYgKGxpa2VseShzYXR0ci0+c3RvcmUpKQorCQlyZXR1cm4gc2F0dHItPnN0b3JlKGJ1ZiwgY291bnQpOworCisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1hcHBpbmdfc2hvdyhjaGFyICpidWYpCit7CisJc3RydWN0IHNxX21hcHBpbmcgKipsaXN0LCAqZW50cnk7CiAJY2hhciAqcCA9IGJ1ZjsKIAotCWxpc3RfZm9yX2VhY2hfcHJldihwb3MsICZzcV9tYXBwaW5nX2xpc3QpIHsKLQkJc3RydWN0IHNxX21hcHBpbmcgKmVudHJ5OwotCi0JCWVudHJ5ID0gbGlzdF9lbnRyeShwb3MsIHR5cGVvZigqZW50cnkpLCBsaXN0KTsKLQotCQlwICs9IHNwcmludGYocCwgIiUwOGx4LSUwOGx4IFslMDhseF06ICVzXG4iLCBlbnRyeS0+c3FfYWRkciwKLQkJCSAgICAgZW50cnktPnNxX2FkZHIgKyBlbnRyeS0+c2l6ZSAtIDEsIGVudHJ5LT5hZGRyLAotCQkJICAgICBlbnRyeS0+bmFtZSk7Ci0JfQorCWZvciAobGlzdCA9ICZzcV9tYXBwaW5nX2xpc3Q7IChlbnRyeSA9ICpsaXN0KTsgbGlzdCA9ICZlbnRyeS0+bmV4dCkKKwkJcCArPSBzcHJpbnRmKHAsICIlMDhseC0lMDhseCBbJTA4bHhdOiAlc1xuIiwKKwkJCSAgICAgZW50cnktPnNxX2FkZHIsIGVudHJ5LT5zcV9hZGRyICsgZW50cnktPnNpemUsCisJCQkgICAgIGVudHJ5LT5hZGRyLCBlbnRyeS0+bmFtZSk7CiAKIAlyZXR1cm4gcCAtIGJ1ZjsKIH0KLSNlbmRpZgogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcV9mb3BzID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubW1hcAkJPSBzcV9tbWFwLAorc3RhdGljIHNzaXplX3QgbWFwcGluZ19zdG9yZShjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2UgPSAwLCBsZW4gPSAwOworCisJc3NjYW5mKGJ1ZiwgIiVseCAlbHgiLCAmYmFzZSwgJmxlbik7CisJaWYgKCFiYXNlKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChsaWtlbHkobGVuKSkgeworCQlpbnQgcmV0ID0gc3FfcmVtYXAoYmFzZSwgbGVuLCAiVXNlcnNwYWNlIiwKKwkJCQkgICBwZ3Byb3RfdmFsKFBBR0VfU0hBUkVEKSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UKKwkJc3FfdW5tYXAoYmFzZSk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3Ffc3lzZnNfYXR0ciBtYXBwaW5nX2F0dHIgPQorCV9fQVRUUihtYXBwaW5nLCAwNjQ0LCBtYXBwaW5nX3Nob3csIG1hcHBpbmdfc3RvcmUpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc3Ffc3lzZnNfYXR0cnNbXSA9IHsKKwkmbWFwcGluZ19hdHRyLmF0dHIsCisJTlVMTCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBzcV9kZXYgPSB7Ci0JLm1pbm9yCQk9IFNUT1JFX1FVRVVFX01JTk9SLAotCS5uYW1lCQk9ICJzcSIsCi0JLmZvcHMJCT0gJnNxX2ZvcHMsCitzdGF0aWMgc3RydWN0IHN5c2ZzX29wcyBzcV9zeXNmc19vcHMgPSB7CisJLnNob3cJPSBzcV9zeXNmc19zaG93LAorCS5zdG9yZQk9IHNxX3N5c2ZzX3N0b3JlLAorfTsKKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUga3R5cGVfcGVyY3B1X2VudHJ5ID0geworCS5zeXNmc19vcHMJPSAmc3Ffc3lzZnNfb3BzLAorCS5kZWZhdWx0X2F0dHJzCT0gc3Ffc3lzZnNfYXR0cnMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzcV9zeXNkZXZfYWRkKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IHN5c2Rldi0+aWQ7CisJc3RydWN0IGtvYmplY3QgKmtvYmo7CisKKwlzcV9rb2JqZWN0W2NwdV0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga29iamVjdCksIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSghc3Ffa29iamVjdFtjcHVdKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlrb2JqID0gc3Ffa29iamVjdFtjcHVdOworCWtvYmotPnBhcmVudCA9ICZzeXNkZXYtPmtvYmo7CisJa29iamVjdF9zZXRfbmFtZShrb2JqLCAiJXMiLCAic3EiKTsKKwlrb2JqLT5rdHlwZSA9ICZrdHlwZV9wZXJjcHVfZW50cnk7CisKKwlyZXR1cm4ga29iamVjdF9yZWdpc3Rlcihrb2JqKTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgc3Ffc3lzZGV2X3JlbW92ZShzdHJ1Y3Qgc3lzX2RldmljZSAqc3lzZGV2KQoreworCXVuc2lnbmVkIGludCBjcHUgPSBzeXNkZXYtPmlkOworCXN0cnVjdCBrb2JqZWN0ICprb2JqID0gc3Ffa29iamVjdFtjcHVdOworCisJa29iamVjdF91bnJlZ2lzdGVyKGtvYmopOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN5c2Rldl9kcml2ZXIgc3Ffc3lzZGV2X2RyaXZlciA9IHsKKwkuYWRkCQk9IHNxX3N5c2Rldl9hZGQsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzcV9zeXNkZXZfcmVtb3ZlKSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNxX2FwaV9pbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgbnJfcGFnZXMgPSAweDA0MDAwMDAwID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgaW50IHNpemUgPSAobnJfcGFnZXMgKyAoQklUU19QRVJfTE9ORyAtIDEpKSAvIEJJVFNfUEVSX0xPTkc7CisJaW50IHJldCA9IC1FTk9NRU07CisKIAlwcmludGsoS0VSTl9OT1RJQ0UgInNxOiBSZWdpc3RlcmluZyBzdG9yZSBxdWV1ZSBBUEkuXG4iKTsKIAotCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInNxX21hcHBpbmciLCAwLCAwLCBzcV9tYXBwaW5nX3JlYWRfcHJvYywgMCk7CisJc3FfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgic3RvcmVfcXVldWVfY2FjaGUiLAorCQkJCXNpemVvZihzdHJ1Y3Qgc3FfbWFwcGluZyksIDAsIDAsCisJCQkJTlVMTCwgTlVMTCk7CisJaWYgKHVubGlrZWx5KCFzcV9jYWNoZSkpCisJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZzcV9kZXYpOwotCWlmIChyZXQpCi0JCXJlbW92ZV9wcm9jX2VudHJ5KCJzcV9tYXBwaW5nIiwgTlVMTCk7CisJc3FfYml0bWFwID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIXNxX2JpdG1hcCkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gc3lzZGV2X2RyaXZlcl9yZWdpc3RlcigmY3B1X3N5c2Rldl9jbGFzcywgJnNxX3N5c2Rldl9kcml2ZXIpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0OworCisJcmV0dXJuIDA7CisKK291dDoKKwlrZnJlZShzcV9iaXRtYXApOworCWttZW1fY2FjaGVfZGVzdHJveShzcV9jYWNoZSk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc3FfYXBpX2V4aXQodm9pZCkKIHsKLQltaXNjX2RlcmVnaXN0ZXIoJnNxX2Rldik7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoInNxX21hcHBpbmciLCBOVUxMKTsKKwlzeXNkZXZfZHJpdmVyX3VucmVnaXN0ZXIoJmNwdV9zeXNkZXZfY2xhc3MsICZzcV9zeXNkZXZfZHJpdmVyKTsKKwlrZnJlZShzcV9iaXRtYXApOworCWttZW1fY2FjaGVfZGVzdHJveShzcV9jYWNoZSk7CiB9CiAKIG1vZHVsZV9pbml0KHNxX2FwaV9pbml0KTsKQEAgLTQ0NSwxMSArNDAyLDcgQEAKIE1PRFVMRV9BVVRIT1IoIlBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+LCBNLiBSLiBCcm93biA8bXJicm93bkAweGQ2Lm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU2ltcGxlIEFQSSBmb3IgU0gtNCBpbnRlZ3JhdGVkIFN0b3JlIFF1ZXVlcyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0FMSUFTX01JU0NERVYoU1RPUkVfUVVFVUVfTUlOT1IpOwogCiBFWFBPUlRfU1lNQk9MKHNxX3JlbWFwKTsKIEVYUE9SVF9TWU1CT0woc3FfdW5tYXApOwotRVhQT1JUX1NZTUJPTChzcV9jbGVhcik7Ci1FWFBPUlRfU1lNQk9MKHNxX2ZsdXNoKTsKIEVYUE9SVF9TWU1CT0woc3FfZmx1c2hfcmFuZ2UpOwotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9lYXJseV9wcmludGsuYyBiL2FyY2gvc2gva2VybmVsL2Vhcmx5X3ByaW50ay5jCmluZGV4IDEzNzhkYjMuLmEwMDAyMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2Vhcmx5X3ByaW50ay5jCisrKyBiL2FyY2gvc2gva2VybmVsL2Vhcmx5X3ByaW50ay5jCkBAIC0zLDcgKzMsNyBAQAogICoKICAqICBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgIE5paWJlIFl1dGFrYQogICogIENvcHlyaWdodCAoQykgMjAwMiAgTS4gUi4gQnJvd24KLSAqICBDb3B5cmlnaHQgKEMpIDIwMDQgIFBhdWwgTXVuZHQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgLSAyMDA2ICBQYXVsIE11bmR0CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTQ5LDcgKzQ5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBjb25zb2xlIGVhcmx5X2NvbnNvbGUgPSB7CitzdGF0aWMgc3RydWN0IGNvbnNvbGUgYmlvc19jb25zb2xlID0gewogCS5uYW1lCQk9ICJiaW9zIiwKIAkud3JpdGUJCT0gc2hfY29uc29sZV93cml0ZSwKIAkuc2V0dXAJCT0gc2hfY29uc29sZV9zZXR1cCwKQEAgLTU5LDM0ICs1OSw0MyBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFCisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlICIuLi8uLi8uLi9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuaCIKKworI2lmZGVmIENPTkZJR19DUFVfU0g0CiAjZGVmaW5lIFNDSUZfUkVHCTB4ZmZlODAwMDAKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwNjApCisjZGVmaW5lIFNDSUZfUkVHCTB4ZmZmZTk4MDAKKyNlbHNlCisjZXJyb3IgIlVuZGVmaW5lZCBTQ0lGIGZvciB0aGlzIHN1YnR5cGUiCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCB1YXJ0X3BvcnQgc2NpZl9wb3J0ID0geworCS5tYXBiYXNlCT0gU0NJRl9SRUcsCisJLm1lbWJhc2UJPSAoY2hhciBfX2lvbWVtICopU0NJRl9SRUcsCit9OwogCiBzdGF0aWMgdm9pZCBzY2lmX3NlcmNvbl9wdXRjKGludCBjKQogewotCXdoaWxlICghKGN0cmxfaW53KFNDSUZfUkVHICsgMHgxMCkgJiAweDIwKSkgOworCXdoaWxlICgoKHNjaV9pbigmc2NpZl9wb3J0LCBTQ0ZEUikgJiAweDFmMDAgPj4gOCkgPT0gMTYpKQorCQk7CiAKLQljdHJsX291dGIoYywgU0NJRl9SRUcgKyAxMik7Ci0JY3RybF9vdXR3KChjdHJsX2ludyhTQ0lGX1JFRyArIDB4MTApICYgMHg5ZiksIFNDSUZfUkVHICsgMHgxMCk7CisJc2NpX291dCgmc2NpZl9wb3J0LCBTQ3hURFIsIGMpOworCXNjaV9pbigmc2NpZl9wb3J0LCBTQ3hTUik7CisJc2NpX291dCgmc2NpZl9wb3J0LCBTQ3hTUiwgMHhmMyAmIH4oMHgyMCB8IDB4NDApKTsKKworCXdoaWxlICgoc2NpX2luKCZzY2lmX3BvcnQsIFNDeFNSKSAmIDB4NDApID09IDApOworCQk7CiAKIAlpZiAoYyA9PSAnXG4nKQogCQlzY2lmX3NlcmNvbl9wdXRjKCdccicpOwogfQogCi1zdGF0aWMgdm9pZCBzY2lmX3NlcmNvbl9mbHVzaCh2b2lkKQotewotCWN0cmxfb3V0dygoY3RybF9pbncoU0NJRl9SRUcgKyAweDEwKSAmIDB4YmYpLCBTQ0lGX1JFRyArIDB4MTApOwotCi0Jd2hpbGUgKCEoY3RybF9pbncoU0NJRl9SRUcgKyAweDEwKSAmIDB4NDApKSA7Ci0KLQljdHJsX291dHcoKGN0cmxfaW53KFNDSUZfUkVHICsgMHgxMCkgJiAweGJmKSwgU0NJRl9SRUcgKyAweDEwKTsKLX0KLQotc3RhdGljIHZvaWQgc2NpZl9zZXJjb25fd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvbiwgY29uc3QgY2hhciAqcywgdW5zaWduZWQgY291bnQpCitzdGF0aWMgdm9pZCBzY2lmX3NlcmNvbl93cml0ZShzdHJ1Y3QgY29uc29sZSAqY29uLCBjb25zdCBjaGFyICpzLAorCQkJICAgICAgdW5zaWduZWQgY291bnQpCiB7CiAJd2hpbGUgKGNvdW50LS0gPiAwKQogCQlzY2lmX3NlcmNvbl9wdXRjKCpzKyspOwotCi0Jc2NpZl9zZXJjb25fZmx1c2goKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgc2NpZl9zZXJjb25fc2V0dXAoc3RydWN0IGNvbnNvbGUgKmNvbiwgY2hhciAqb3B0aW9ucykKQEAgLTk2LDcgKzEwNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgY29uc29sZSBlYXJseV9jb25zb2xlID0geworc3RhdGljIHN0cnVjdCBjb25zb2xlIHNjaWZfY29uc29sZSA9IHsKIAkubmFtZQkJPSAic2VyY29uIiwKIAkud3JpdGUJCT0gc2NpZl9zZXJjb25fd3JpdGUsCiAJLnNldHVwCQk9IHNjaWZfc2VyY29uX3NldHVwLApAQCAtMTA0LDcgKzExMyw3IEBACiAJLmluZGV4CQk9IC0xLAogfTsKIAotdm9pZCBzY2lmX3NlcmNvbl9pbml0KGludCBiYXVkKQorc3RhdGljIHZvaWQgc2NpZl9zZXJjb25faW5pdChpbnQgYmF1ZCkKIHsKIAljdHJsX291dHcoMCwgU0NJRl9SRUcgKyA4KTsKIAljdHJsX291dHcoMCwgU0NJRl9SRUcpOwpAQCAtMTIyLDE2ICsxMzEsNjEgQEAKIH0KICNlbmRpZgogCi12b2lkIF9faW5pdCBlbmFibGVfZWFybHlfcHJpbnRrKHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRQotCXNjaWZfc2VyY29uX2luaXQoMTE1MjAwKTsKKy8qCisgKiBTZXR1cCBhIGRlZmF1bHQgY29uc29sZSwgaWYgbW9yZSB0aGFuIG9uZSBpcyBjb21waWxlZCBpbiwgcmVseSBvbiB0aGUKKyAqIGVhcmx5cHJpbnRrPSBwYXJzaW5nIHRvIGdpdmUgcHJpb3JpdHkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY29uc29sZSAqZWFybHlfY29uc29sZSA9CisjaWZkZWYgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MKKwkmYmlvc19jb25zb2xlCisjZWxpZiBkZWZpbmVkKENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUpCisJJnNjaWZfY29uc29sZQorI2Vsc2UKKwlOVUxMCiAjZW5kaWYKLQlyZWdpc3Rlcl9jb25zb2xlKCZlYXJseV9jb25zb2xlKTsKLX0KKwk7CiAKLXZvaWQgZGlzYWJsZV9lYXJseV9wcmludGsodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBrZWVwX2Vhcmx5OworCitpbnQgX19pbml0IHNldHVwX2Vhcmx5X3ByaW50ayhjaGFyICpvcHQpCiB7Ci0JdW5yZWdpc3Rlcl9jb25zb2xlKCZlYXJseV9jb25zb2xlKTsKLX0KKwljaGFyICpzcGFjZTsKKwljaGFyIGJ1ZlsyNTZdOwogCisJc3RybGNweShidWYsIG9wdCwgc2l6ZW9mKGJ1ZikpOworCXNwYWNlID0gc3RyY2hyKGJ1ZiwgJyAnKTsKKwlpZiAoc3BhY2UpCisJCSpzcGFjZSA9IDA7CisKKwlpZiAoc3Ryc3RyKGJ1ZiwgImtlZXAiKSkKKwkJa2VlcF9lYXJseSA9IDE7CisKKyNpZmRlZiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUworCWlmICghc3RybmNtcChidWYsICJiaW9zIiwgNCkpCisJCWVhcmx5X2NvbnNvbGUgPSAmYmlvc19jb25zb2xlOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFKQorCWlmICghc3RybmNtcChidWYsICJzZXJpYWwiLCA2KSkgeworCQllYXJseV9jb25zb2xlID0gJnNjaWZfY29uc29sZTsKKworI2lmZGVmIENPTkZJR19DUFVfU0g0CisJCXNjaWZfc2VyY29uX2luaXQoMTE1MjAwKTsKKyNlbmRpZgorCX0KKyNlbmRpZgorCisJaWYgKGxpa2VseShlYXJseV9jb25zb2xlKSkKKwkJcmVnaXN0ZXJfY29uc29sZShlYXJseV9jb25zb2xlKTsKKworCXJldHVybiAxOworfQorX19zZXR1cCgiZWFybHlwcmludGs9Iiwgc2V0dXBfZWFybHlfcHJpbnRrKTsKKwordm9pZCBfX2luaXQgZGlzYWJsZV9lYXJseV9wcmludGsodm9pZCkKK3sKKwlpZiAoIWtlZXBfZWFybHkpIHsKKwkJcHJpbnRrKCJkaXNhYmxpbmcgZWFybHkgY29uc29sZVxuIik7CisJCXVucmVnaXN0ZXJfY29uc29sZShlYXJseV9jb25zb2xlKTsKKwl9IGVsc2UKKwkJcHJpbnRrKCJrZWVwaW5nIGVhcmx5IGNvbnNvbGVcbiIpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvc2gva2VybmVsL2VudHJ5LlMKaW5kZXggN2RmZDJiYS4uZmU4MjIxOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3NoL2tlcm5lbC9lbnRyeS5TCkBAIC0xOCwyNCArMTgsNiBAQAogI2luY2x1ZGUgPGFzbS9jcHUvbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKLSNpZiAhZGVmaW5lZChDT05GSUdfTkZTRCkgJiYgIWRlZmluZWQoQ09ORklHX05GU0RfTU9EVUxFKQotI2RlZmluZSBzeXNfbmZzc2VydmN0bAkJc3lzX25pX3N5c2NhbGwKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoQ09ORklHX01NVSkKLSNkZWZpbmUgc3lzX21hZHZpc2UJCXN5c19uaV9zeXNjYWxsCi0jZGVmaW5lIHN5c19yZWFkYWhlYWQJCXN5c19uaV9zeXNjYWxsCi0jZGVmaW5lIHN5c19tcHJvdGVjdAkJc3lzX25pX3N5c2NhbGwKLSNkZWZpbmUgc3lzX21zeW5jCQlzeXNfbmlfc3lzY2FsbAotI2RlZmluZSBzeXNfbWxvY2sJCXN5c19uaV9zeXNjYWxsCi0jZGVmaW5lIHN5c19tdW5sb2NrCQlzeXNfbmlfc3lzY2FsbAotI2RlZmluZSBzeXNfbWxvY2thbGwJCXN5c19uaV9zeXNjYWxsCi0jZGVmaW5lIHN5c19tdW5sb2NrYWxsCQlzeXNfbmlfc3lzY2FsbAotI2RlZmluZSBzeXNfbXJlbWFwCQlzeXNfbmlfc3lzY2FsbAotI2RlZmluZSBzeXNfbWluY29yZQkJc3lzX25pX3N5c2NhbGwKLSNkZWZpbmUgc3lzX3JlbWFwX2ZpbGVfcGFnZXMJc3lzX25pX3N5c2NhbGwKLSNlbmRpZgotCiAhIE5PVEU6CiAhIEdOVSBhcyAoYXMgb2YgMi45LjEpIGNoYW5nZXMgYmYvcyBpbnRvIGJ0L3MgYW5kIGJyYSwgd2hlbiB0aGUgYWRkcmVzcwogISB0byBiZSBqdW1wZWQgaXMgdG9vIGZhciwgYnV0IGl0IGNhdXNlcyBpbGxlZ2FsIHNsb3QgZXhjZXB0aW9uLgpAQCAtMzI2LDcgKzMwOCw3IEBACiAJLmFsaWduCTIKIHJldF9mcm9tX2V4Y2VwdGlvbjoKIAlwcmVlbXB0X3N0b3AoKQotcmV0X2Zyb21faXJxOgorRU5UUlkocmV0X2Zyb21faXJxKQogCSEKIAltb3YJI09GRl9TUiwgcjAKIAltb3YubAlAKHIwLHIxNSksIHIwCSEgZ2V0IHN0YXR1cyByZWdpc3RlcgpAQCAtMzg5LDExICszNzEsMTIgQEAKIAkhIHI4OiBjdXJyZW50X3RocmVhZF9pbmZvCiAJISB0OiAgcmVzdWx0IG9mICJ0c3QJI19USUZfTkVFRF9SRVNDSEVELCByMCIKIAliZi9zCXdvcmtfcmVzY2hlZAotCSB0c3QJI19USUZfU0lHUEVORElORywgcjAKKwkgdHN0CSMoX1RJRl9TSUdQRU5ESU5HIHwgX1RJRl9SRVNUT1JFX1NJR01BU0spLCByMAogd29ya19ub3RpZnlzaWc6CiAJYnQvcwlyZXN0b3JlX2FsbAogCSBtb3YJcjE1LCByNAotCW1vdgkjMCwgcjUKKwltb3YJcjEyLCByNQkJISBzZXQgYXJnMShzYXZlX3IwKQorCW1vdglyMCwgcjYKIAltb3YubAkyZiwgcjEKIAltb3ZhCXJlc3RvcmVfYWxsLCByMAogCWptcAlAcjEKQEAgLTQzMSw3ICs0MTQsNyBAQAogCiAJLmFsaWduCTIKIDE6CS5sb25nCXNjaGVkdWxlCi0yOgkubG9uZwlkb19zaWduYWwKKzI6CS5sb25nCWRvX25vdGlmeV9yZXN1bWUKIAogCS5hbGlnbgkyCiBzeXNjYWxsX2V4aXRfd29yazoKQEAgLTU1Miw2ICs1MzUsNyBAQAogCW1vdi5sCUByOSwgcjgKIAlqc3IJQHI4CSAgICAJISBqdW1wIHRvIHNwZWNpZmljIHN5c2NhbGwgaGFuZGxlcgogCSBub3AKKwltb3YubAlAKE9GRl9SMCxyMTUpLCByMTIJCSEgc2F2ZSByMAogCW1vdi5sCXIwLCBAKE9GRl9SMCxyMTUpCQkhIHNhdmUgdGhlIHJldHVybiB2YWx1ZQogCSEKIHN5c2NhbGxfZXhpdDoKQEAgLTY0NCw3ICs2MjgsNyBAQAogCSEKICNpZiBkZWZpbmVkKENPTkZJR19LR0RCX05NSSkKIAkhIENsZWFyIGluX25taQotCW1vdi5sCTRmLCBrMAorCW1vdi5sCTZmLCBrMAogCW1vdgkjMCwgazEKIAltb3YuYglrMSwgQGswCiAjZW5kaWYKQEAgLTcyMiw3ICs3MDYsNyBAQAogIQogIQogCS5hbGlnbgkyCi1oYW5kbGVfZXhjZXB0aW9uOgorRU5UUlkoaGFuZGxlX2V4Y2VwdGlvbikKIAkhIFVzaW5nIGswLCBrMSBmb3Igc2NyYXRjaCByZWdpc3RlcnMgKHIwX2JhbmsxLCByMV9iYW5rKSwKIAkhIHNhdmUgYWxsIHJlZ2lzdGVycyBvbnRvIHN0YWNrLgogCSEKQEAgLTczMiw4ICs3MTYsOCBAQAogCWJ0L3MJMWYJCSEgSXQncyBhIGtlcm5lbCB0byBrZXJuZWwgdHJhbnNpdGlvbi4KIAkgbW92CXIxNSwgazAJCSEgc2F2ZSBvcmlnaW5hbCBzdGFjayB0byBrMAogCS8qIFVzZXIgc3BhY2UgdG8ga2VybmVsICovCi0JbW92CSMweDIwLCBrMQotCXNobGw4CWsxCQkhIGsxIDo9IDgxOTIgKD09IFRIUkVBRF9TSVpFKQorCW1vdgkjKFRIUkVBRF9TSVpFID4+IDgpLCBrMQorCXNobGw4CWsxCQkhIGsxIDo9IFRIUkVBRF9TSVpFCiAJYWRkCWN1cnJlbnQsIGsxCiAJbW92CWsxLCByMTUJCSEgY2hhbmdlIHRvIGtlcm5lbCBzdGFjawogCSEKQEAgLTgzOCwzMDAgKzgyMiwzIEBACiAJcnRzCiAJIG5vcAogCi0JLmRhdGEKLUVOVFJZKHN5c19jYWxsX3RhYmxlKQotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIDAgIC0gIG9sZCAic2V0dXAoKSIgc3lzdGVtIGNhbGwqLwotCS5sb25nIHN5c19leGl0Ci0JLmxvbmcgc3lzX2ZvcmsKLQkubG9uZyBzeXNfcmVhZAotCS5sb25nIHN5c193cml0ZQotCS5sb25nIHN5c19vcGVuCQkvKiA1ICovCi0JLmxvbmcgc3lzX2Nsb3NlCi0JLmxvbmcgc3lzX3dhaXRwaWQKLQkubG9uZyBzeXNfY3JlYXQKLQkubG9uZyBzeXNfbGluawotCS5sb25nIHN5c191bmxpbmsJCS8qIDEwICovCi0JLmxvbmcgc3lzX2V4ZWN2ZQotCS5sb25nIHN5c19jaGRpcgotCS5sb25nIHN5c190aW1lCi0JLmxvbmcgc3lzX21rbm9kCi0JLmxvbmcgc3lzX2NobW9kCQkvKiAxNSAqLwotCS5sb25nIHN5c19sY2hvd24xNgotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBicmVhayBzeXNjYWxsIGhvbGRlciAqLwotCS5sb25nIHN5c19zdGF0Ci0JLmxvbmcgc3lzX2xzZWVrCi0JLmxvbmcgc3lzX2dldHBpZAkJLyogMjAgKi8KLQkubG9uZyBzeXNfbW91bnQKLQkubG9uZyBzeXNfb2xkdW1vdW50Ci0JLmxvbmcgc3lzX3NldHVpZDE2Ci0JLmxvbmcgc3lzX2dldHVpZDE2Ci0JLmxvbmcgc3lzX3N0aW1lCQkvKiAyNSAqLwotCS5sb25nIHN5c19wdHJhY2UKLQkubG9uZyBzeXNfYWxhcm0KLQkubG9uZyBzeXNfZnN0YXQKLQkubG9uZyBzeXNfcGF1c2UKLQkubG9uZyBzeXNfdXRpbWUJCS8qIDMwICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIHN0dHkgc3lzY2FsbCBob2xkZXIgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgZ3R0eSBzeXNjYWxsIGhvbGRlciAqLwotCS5sb25nIHN5c19hY2Nlc3MKLQkubG9uZyBzeXNfbmljZQotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIDM1ICovCQkvKiBvbGQgZnRpbWUgc3lzY2FsbCBob2xkZXIgKi8KLQkubG9uZyBzeXNfc3luYwotCS5sb25nIHN5c19raWxsCi0JLmxvbmcgc3lzX3JlbmFtZQotCS5sb25nIHN5c19ta2RpcgotCS5sb25nIHN5c19ybWRpcgkJLyogNDAgKi8KLQkubG9uZyBzeXNfZHVwCi0JLmxvbmcgc3lzX3BpcGUKLQkubG9uZyBzeXNfdGltZXMKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgcHJvZiBzeXNjYWxsIGhvbGRlciAqLwotCS5sb25nIHN5c19icmsJCS8qIDQ1ICovCi0JLmxvbmcgc3lzX3NldGdpZDE2Ci0JLmxvbmcgc3lzX2dldGdpZDE2Ci0JLmxvbmcgc3lzX3NpZ25hbAotCS5sb25nIHN5c19nZXRldWlkMTYKLQkubG9uZyBzeXNfZ2V0ZWdpZDE2CS8qIDUwICovCi0JLmxvbmcgc3lzX2FjY3QKLQkubG9uZyBzeXNfdW1vdW50CQkvKiByZWN5Y2xlZCBuZXZlciB1c2VkIHBoeXMoKSAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBsb2NrIHN5c2NhbGwgaG9sZGVyICovCi0JLmxvbmcgc3lzX2lvY3RsCi0JLmxvbmcgc3lzX2ZjbnRsCQkvKiA1NSAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBtcHggc3lzY2FsbCBob2xkZXIgKi8KLQkubG9uZyBzeXNfc2V0cGdpZAotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCB1bGltaXQgc3lzY2FsbCBob2xkZXIgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBzeXNfb2xkdW5hbWUgKi8KLQkubG9uZyBzeXNfdW1hc2sJCS8qIDYwICovCi0JLmxvbmcgc3lzX2Nocm9vdAotCS5sb25nIHN5c191c3RhdAotCS5sb25nIHN5c19kdXAyCi0JLmxvbmcgc3lzX2dldHBwaWQKLQkubG9uZyBzeXNfZ2V0cGdycAkJLyogNjUgKi8KLQkubG9uZyBzeXNfc2V0c2lkCi0JLmxvbmcgc3lzX3NpZ2FjdGlvbgotCS5sb25nIHN5c19zZ2V0bWFzawotCS5sb25nIHN5c19zc2V0bWFzawotCS5sb25nIHN5c19zZXRyZXVpZDE2CS8qIDcwICovCi0JLmxvbmcgc3lzX3NldHJlZ2lkMTYKLQkubG9uZyBzeXNfc2lnc3VzcGVuZAotCS5sb25nIHN5c19zaWdwZW5kaW5nCi0JLmxvbmcgc3lzX3NldGhvc3RuYW1lCi0JLmxvbmcgc3lzX3NldHJsaW1pdAkvKiA3NSAqLwotCS5sb25nIHN5c19vbGRfZ2V0cmxpbWl0Ci0JLmxvbmcgc3lzX2dldHJ1c2FnZQotCS5sb25nIHN5c19nZXR0aW1lb2ZkYXkKLQkubG9uZyBzeXNfc2V0dGltZW9mZGF5Ci0JLmxvbmcgc3lzX2dldGdyb3VwczE2CS8qIDgwICovCi0JLmxvbmcgc3lzX3NldGdyb3VwczE2Ci0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc3lzX29sZHNlbGVjdCAqLwotCS5sb25nIHN5c19zeW1saW5rCi0JLmxvbmcgc3lzX2xzdGF0Ci0JLmxvbmcgc3lzX3JlYWRsaW5rCQkvKiA4NSAqLwotCS5sb25nIHN5c191c2VsaWIKLQkubG9uZyBzeXNfc3dhcG9uCi0JLmxvbmcgc3lzX3JlYm9vdAotCS5sb25nIG9sZF9yZWFkZGlyCi0JLmxvbmcgb2xkX21tYXAJCS8qIDkwICovCi0JLmxvbmcgc3lzX211bm1hcAotCS5sb25nIHN5c190cnVuY2F0ZQotCS5sb25nIHN5c19mdHJ1bmNhdGUKLQkubG9uZyBzeXNfZmNobW9kCi0JLmxvbmcgc3lzX2ZjaG93bjE2CQkvKiA5NSAqLwotCS5sb25nIHN5c19nZXRwcmlvcml0eQotCS5sb25nIHN5c19zZXRwcmlvcml0eQotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBwcm9maWwgc3lzY2FsbCBob2xkZXIgKi8KLQkubG9uZyBzeXNfc3RhdGZzCi0JLmxvbmcgc3lzX2ZzdGF0ZnMJCS8qIDEwMCAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIGlvcGVybSAqLwotCS5sb25nIHN5c19zb2NrZXRjYWxsCi0JLmxvbmcgc3lzX3N5c2xvZwotCS5sb25nIHN5c19zZXRpdGltZXIKLQkubG9uZyBzeXNfZ2V0aXRpbWVyCS8qIDEwNSAqLwotCS5sb25nIHN5c19uZXdzdGF0Ci0JLmxvbmcgc3lzX25ld2xzdGF0Ci0JLmxvbmcgc3lzX25ld2ZzdGF0Ci0JLmxvbmcgc3lzX3VuYW1lCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogMTEwICovIC8qIGlvcGwgKi8KLQkubG9uZyBzeXNfdmhhbmd1cAotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIGlkbGUgKi8KLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiB2bTg2b2xkICovCi0JLmxvbmcgc3lzX3dhaXQ0Ci0JLmxvbmcgc3lzX3N3YXBvZmYJCS8qIDExNSAqLwotCS5sb25nIHN5c19zeXNpbmZvCi0JLmxvbmcgc3lzX2lwYwotCS5sb25nIHN5c19mc3luYwotCS5sb25nIHN5c19zaWdyZXR1cm4KLQkubG9uZyBzeXNfY2xvbmUJCS8qIDEyMCAqLwotCS5sb25nIHN5c19zZXRkb21haW5uYW1lCi0JLmxvbmcgc3lzX25ld3VuYW1lCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc3lzX21vZGlmeV9sZHQgKi8KLQkubG9uZyBzeXNfYWRqdGltZXgKLQkubG9uZyBzeXNfbXByb3RlY3QJCS8qIDEyNSAqLwotCS5sb25nIHN5c19zaWdwcm9jbWFzawotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCAiY3JlYXRlX21vZHVsZSIgKi8KLQkubG9uZyBzeXNfaW5pdF9tb2R1bGUKLQkubG9uZyBzeXNfZGVsZXRlX21vZHVsZQotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIDEzMDogb2xkICJnZXRfa2VybmVsX3N5bXMiICovCi0JLmxvbmcgc3lzX3F1b3RhY3RsCi0JLmxvbmcgc3lzX2dldHBnaWQKLQkubG9uZyBzeXNfZmNoZGlyCi0JLmxvbmcgc3lzX2JkZmx1c2gKLQkubG9uZyBzeXNfc3lzZnMJCS8qIDEzNSAqLwotCS5sb25nIHN5c19wZXJzb25hbGl0eQotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIGZvciBhZnNfc3lzY2FsbCAqLwotCS5sb25nIHN5c19zZXRmc3VpZDE2Ci0JLmxvbmcgc3lzX3NldGZzZ2lkMTYKLQkubG9uZyBzeXNfbGxzZWVrCQkvKiAxNDAgKi8KLQkubG9uZyBzeXNfZ2V0ZGVudHMKLQkubG9uZyBzeXNfc2VsZWN0Ci0JLmxvbmcgc3lzX2Zsb2NrCi0JLmxvbmcgc3lzX21zeW5jCi0JLmxvbmcgc3lzX3JlYWR2CQkvKiAxNDUgKi8KLQkubG9uZyBzeXNfd3JpdGV2Ci0JLmxvbmcgc3lzX2dldHNpZAotCS5sb25nIHN5c19mZGF0YXN5bmMKLQkubG9uZyBzeXNfc3lzY3RsCi0JLmxvbmcgc3lzX21sb2NrCQkvKiAxNTAgKi8KLQkubG9uZyBzeXNfbXVubG9jawotCS5sb25nIHN5c19tbG9ja2FsbAotCS5sb25nIHN5c19tdW5sb2NrYWxsCi0JLmxvbmcgc3lzX3NjaGVkX3NldHBhcmFtCi0JLmxvbmcgc3lzX3NjaGVkX2dldHBhcmFtICAgLyogMTU1ICovCi0JLmxvbmcgc3lzX3NjaGVkX3NldHNjaGVkdWxlcgotCS5sb25nIHN5c19zY2hlZF9nZXRzY2hlZHVsZXIKLQkubG9uZyBzeXNfc2NoZWRfeWllbGQKLQkubG9uZyBzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21heAotCS5sb25nIHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluICAvKiAxNjAgKi8KLQkubG9uZyBzeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsCi0JLmxvbmcgc3lzX25hbm9zbGVlcAotCS5sb25nIHN5c19tcmVtYXAKLQkubG9uZyBzeXNfc2V0cmVzdWlkMTYKLQkubG9uZyBzeXNfZ2V0cmVzdWlkMTYJLyogMTY1ICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogdm04NiAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCAicXVlcnlfbW9kdWxlIiAqLwotCS5sb25nIHN5c19wb2xsCi0JLmxvbmcgc3lzX25mc3NlcnZjdGwKLQkubG9uZyBzeXNfc2V0cmVzZ2lkMTYJLyogMTcwICovCi0JLmxvbmcgc3lzX2dldHJlc2dpZDE2Ci0JLmxvbmcgc3lzX3ByY3RsCi0JLmxvbmcgc3lzX3J0X3NpZ3JldHVybgotCS5sb25nIHN5c19ydF9zaWdhY3Rpb24KLQkubG9uZyBzeXNfcnRfc2lncHJvY21hc2sJLyogMTc1ICovCi0JLmxvbmcgc3lzX3J0X3NpZ3BlbmRpbmcKLQkubG9uZyBzeXNfcnRfc2lndGltZWR3YWl0Ci0JLmxvbmcgc3lzX3J0X3NpZ3F1ZXVlaW5mbwotCS5sb25nIHN5c19ydF9zaWdzdXNwZW5kCi0JLmxvbmcgc3lzX3ByZWFkX3dyYXBwZXIJICAgLyogMTgwICovCi0JLmxvbmcgc3lzX3B3cml0ZV93cmFwcGVyCi0JLmxvbmcgc3lzX2Nob3duMTYKLQkubG9uZyBzeXNfZ2V0Y3dkCi0JLmxvbmcgc3lzX2NhcGdldAotCS5sb25nIHN5c19jYXBzZXQgICAgICAgICAgIC8qIDE4NSAqLwotCS5sb25nIHN5c19zaWdhbHRzdGFjawotCS5sb25nIHN5c19zZW5kZmlsZQotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHN0cmVhbXMxICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc3RyZWFtczIgKi8KLQkubG9uZyBzeXNfdmZvcmsgICAgICAgICAgICAvKiAxOTAgKi8KLQkubG9uZyBzeXNfZ2V0cmxpbWl0Ci0JLmxvbmcgc3lzX21tYXAyCi0JLmxvbmcgc3lzX3RydW5jYXRlNjQKLQkubG9uZyBzeXNfZnRydW5jYXRlNjQKLQkubG9uZyBzeXNfc3RhdDY0CQkvKiAxOTUgKi8KLQkubG9uZyBzeXNfbHN0YXQ2NAotCS5sb25nIHN5c19mc3RhdDY0Ci0JLmxvbmcgc3lzX2xjaG93bgotCS5sb25nIHN5c19nZXR1aWQKLQkubG9uZyBzeXNfZ2V0Z2lkCQkvKiAyMDAgKi8KLQkubG9uZyBzeXNfZ2V0ZXVpZAotCS5sb25nIHN5c19nZXRlZ2lkCi0JLmxvbmcgc3lzX3NldHJldWlkCi0JLmxvbmcgc3lzX3NldHJlZ2lkCi0JLmxvbmcgc3lzX2dldGdyb3VwcwkvKiAyMDUgKi8KLQkubG9uZyBzeXNfc2V0Z3JvdXBzCi0JLmxvbmcgc3lzX2ZjaG93bgotCS5sb25nIHN5c19zZXRyZXN1aWQKLQkubG9uZyBzeXNfZ2V0cmVzdWlkCi0JLmxvbmcgc3lzX3NldHJlc2dpZAkvKiAyMTAgKi8KLQkubG9uZyBzeXNfZ2V0cmVzZ2lkCi0JLmxvbmcgc3lzX2Nob3duCi0JLmxvbmcgc3lzX3NldHVpZAotCS5sb25nIHN5c19zZXRnaWQKLQkubG9uZyBzeXNfc2V0ZnN1aWQJCS8qIDIxNSAqLwotCS5sb25nIHN5c19zZXRmc2dpZAotCS5sb25nIHN5c19waXZvdF9yb290Ci0JLmxvbmcgc3lzX21pbmNvcmUKLQkubG9uZyBzeXNfbWFkdmlzZQotCS5sb25nIHN5c19nZXRkZW50czY0CS8qIDIyMCAqLwotCS5sb25nIHN5c19mY250bDY0Ci0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogcmVzZXJ2ZWQgZm9yIFRVWCAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIFJlc2VydmVkIGZvciBTZWN1cml0eSAqLwotCS5sb25nIHN5c19nZXR0aWQKLQkubG9uZyBzeXNfcmVhZGFoZWFkCS8qIDIyNSAqLwotCS5sb25nIHN5c19zZXR4YXR0cgotCS5sb25nIHN5c19sc2V0eGF0dHIKLQkubG9uZyBzeXNfZnNldHhhdHRyCi0JLmxvbmcgc3lzX2dldHhhdHRyCi0JLmxvbmcgc3lzX2xnZXR4YXR0cgkvKiAyMzAgKi8KLQkubG9uZyBzeXNfZmdldHhhdHRyCi0JLmxvbmcgc3lzX2xpc3R4YXR0cgotCS5sb25nIHN5c19sbGlzdHhhdHRyCi0JLmxvbmcgc3lzX2ZsaXN0eGF0dHIKLQkubG9uZyBzeXNfcmVtb3ZleGF0dHIJLyogMjM1ICovCi0JLmxvbmcgc3lzX2xyZW1vdmV4YXR0cgotCS5sb25nIHN5c19mcmVtb3ZleGF0dHIKLQkubG9uZyBzeXNfdGtpbGwKLQkubG9uZyBzeXNfc2VuZGZpbGU2NAotCS5sb25nIHN5c19mdXRleAkJLyogMjQwICovCi0JLmxvbmcgc3lzX3NjaGVkX3NldGFmZmluaXR5Ci0JLmxvbmcgc3lzX3NjaGVkX2dldGFmZmluaXR5Ci0JLmxvbmcgc3lzX25pX3N5c2NhbGwKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAotCS5sb25nIHN5c19pb19zZXR1cAkvKiAyNDUgKi8KLQkubG9uZyBzeXNfaW9fZGVzdHJveQotCS5sb25nIHN5c19pb19nZXRldmVudHMKLQkubG9uZyBzeXNfaW9fc3VibWl0Ci0JLmxvbmcgc3lzX2lvX2NhbmNlbAotCS5sb25nIHN5c19mYWR2aXNlNjQJLyogMjUwICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwKLQkubG9uZyBzeXNfZXhpdF9ncm91cAotCS5sb25nIHN5c19sb29rdXBfZGNvb2tpZQotCS5sb25nIHN5c19lcG9sbF9jcmVhdGUKLQkubG9uZyBzeXNfZXBvbGxfY3RsCS8qIDI1NSAqLwotCS5sb25nIHN5c19lcG9sbF93YWl0Ci0gCS5sb25nIHN5c19yZW1hcF9maWxlX3BhZ2VzCi0gCS5sb25nIHN5c19zZXRfdGlkX2FkZHJlc3MKLSAJLmxvbmcgc3lzX3RpbWVyX2NyZWF0ZQotIAkubG9uZyBzeXNfdGltZXJfc2V0dGltZQkJLyogMjYwICovCi0gCS5sb25nIHN5c190aW1lcl9nZXR0aW1lCi0gCS5sb25nIHN5c190aW1lcl9nZXRvdmVycnVuCi0gCS5sb25nIHN5c190aW1lcl9kZWxldGUKLSAJLmxvbmcgc3lzX2Nsb2NrX3NldHRpbWUKLSAJLmxvbmcgc3lzX2Nsb2NrX2dldHRpbWUJCS8qIDI2NSAqLwotIAkubG9uZyBzeXNfY2xvY2tfZ2V0cmVzCi0gCS5sb25nIHN5c19jbG9ja19uYW5vc2xlZXAKLQkubG9uZyBzeXNfc3RhdGZzNjQKLQkubG9uZyBzeXNfZnN0YXRmczY0ICAgICAKLQkubG9uZyBzeXNfdGdraWxsCQkvKiAyNzAgKi8KLQkubG9uZyBzeXNfdXRpbWVzCi0gCS5sb25nIHN5c19mYWR2aXNlNjRfNjRfd3JhcHBlcgotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIFJlc2VydmVkIGZvciB2c2VydmVyICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogUmVzZXJ2ZWQgZm9yIG1iaW5kICovCi0JLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogMjc1IC0gZ2V0X21lbXBvbGljeSAqLwotCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHNldF9tZW1wb2xpY3kgKi8KLQkubG9uZyBzeXNfbXFfb3BlbgotCS5sb25nIHN5c19tcV91bmxpbmsKLQkubG9uZyBzeXNfbXFfdGltZWRzZW5kCi0JLmxvbmcgc3lzX21xX3RpbWVkcmVjZWl2ZSAgICAgICAvKiAyODAgKi8KLQkubG9uZyBzeXNfbXFfbm90aWZ5Ci0JLmxvbmcgc3lzX21xX2dldHNldGF0dHIKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBSZXNlcnZlZCBmb3Iga2V4ZWMgKi8KLQkubG9uZyBzeXNfd2FpdGlkCi0JLmxvbmcgc3lzX2FkZF9rZXkJCS8qIDI4NSAqLwotCS5sb25nIHN5c19yZXF1ZXN0X2tleQotCS5sb25nIHN5c19rZXljdGwKLQkubG9uZyBzeXNfaW9wcmlvX3NldAotCS5sb25nIHN5c19pb3ByaW9fZ2V0Ci0JLmxvbmcgc3lzX2lub3RpZnlfaW5pdAkJLyogMjkwICovCi0JLmxvbmcgc3lzX2lub3RpZnlfYWRkX3dhdGNoCi0JLmxvbmcgc3lzX2lub3RpZnlfcm1fd2F0Y2gKLQotLyogRW5kIG9mIGVudHJ5LlMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2hlYWQuUyBiL2FyY2gvc2gva2VybmVsL2hlYWQuUwppbmRleCA5YjllNmVmLi5mNWY1M2QxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9oZWFkLlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvaGVhZC5TCkBAIC0xMSw2ICsxMSwxOCBAQAogICogSGVhZC5TIGNvbnRhaW5zIHRoZSBTSCBleGNlcHRpb24gaGFuZGxlcnMgYW5kIHN0YXJ0dXAgY29kZS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KKworI2lmZGVmIENPTkZJR19DUFVfU0g0QQorI2RlZmluZSBTWU5DTygpCQlzeW5jbworCisjZGVmaW5lIFBSRUZJKGxhYmVsLCByZWcpCVwKKwltb3YubAlsYWJlbCwgcmVnOwlcCisJcHJlZmkJQHJlZworI2Vsc2UKKyNkZWZpbmUgU1lOQ08oKQorI2RlZmluZSBQUkVGSShsYWJlbCwgcmVnKQorI2VuZGlmCiAKIAkuc2VjdGlvbgkuZW1wdHlfemVyb19wYWdlLCAiYXciCiBFTlRSWShlbXB0eV96ZXJvX3BhZ2UpCkBAIC00MiwxOCArNTQsMjUgQEAKIAkhCQkJSW5pdGlhbGl6ZSBnbG9iYWwgaW50ZXJydXB0IG1hc2sKIAltb3YJIzAsIHIwCiAJbGRjCXIwLCByNl9iYW5rCisKKwkvKgorCSAqIFByZWZldGNoIGlmIHBvc3NpYmxlIHRvIHJlZHVjZSBjYWNoZSBtaXNzIHBlbmFsdHkuCisJICoKKwkgKiBXZSBkbyB0aGlzIGVhcmx5IG9uIGZvciBTSC00QSBhcyBhIG1pY3JvLW9wdGltaXphdGlvbiwKKwkgKiBhcyBsYXRlciBvbiB3ZSB3aWxsIGhhdmUgc3BlY3VsYXRpdmUgZXhlY3V0aW9uIGVuYWJsZWQKKwkgKiBhbmQgdGhpcyB3aWxsIGJlY29tZSBsZXNzIG9mIGFuIGlzc3VlLgorCSAqLworCVBSRUZJKDVmLCByMCkKKwlQUkVGSSg2ZiwgcjApCisKIAkhCiAJbW92LmwJMmYsIHIwCiAJbW92CXIwLCByMTUJCSEgU2V0IGluaXRpYWwgcjE1IChzdGFjayBwb2ludGVyKQotCW1vdgkjMHgyMCwgcjEJIQotCXNobGw4CXIxCQkhIHIxID0gODE5MgorCW1vdgkjKFRIUkVBRF9TSVpFID4+IDgpLCByMQorCXNobGw4CXIxCQkhIHIxID0gVEhSRUFEX1NJWkUKIAlzdWIJcjEsIHIwCQkhCiAJbGRjCXIwLCByN19iYW5rCSEgLi4uIGFuZCBpbml0aWFsIHRocmVhZF9pbmZvCi0JIQotCSEJCQlBZGRpdGlvbmFsIENQVSBpbml0aWFsaXphdGlvbgotCW1vdi5sCTZmLCByMAotCWpzcglAcjAKLQkgbm9wCisKIAkhCQkJQ2xlYXIgQlNTIGFyZWEKIAltb3YubAkzZiwgcjEKIAlhZGQJIzQsIHIxCkBAIC02Miw2ICs4MSwxNCBAQAogOToJY21wL2hzCXIyLCByMQogCWJmL3MJOWIJCSEgd2hpbGUgKHIxIDwgcjIpCiAJIG1vdi5sCXIwLEAtcjIKKworCSEJCQlBZGRpdGlvbmFsIENQVSBpbml0aWFsaXphdGlvbgorCW1vdi5sCTZmLCByMAorCWpzcglAcjAKKwkgbm9wCisKKwlTWU5DTygpCQkJISBXYWl0IGZvciBwZW5kaW5nIGluc3RydWN0aW9ucy4uCisKIAkhCQkJU3RhcnQga2VybmVsCiAJbW92LmwJNWYsIHIwCiAJam1wCUByMApAQCAtNjksNyArOTYsNyBAQAogCiAJLmJhbGlnbiA0CiAxOgkubG9uZwkweDQwMDA4MEYwCQkhIE1EPTEsIFJCPTAsIEJMPTAsIEZEPTEsIElNQVNLPTB4RgotMjoJLmxvbmcJc3RhY2sKKzI6CS5sb25nCWluaXRfdGhyZWFkX3VuaW9uK1RIUkVBRF9TSVpFCiAzOgkubG9uZwlfX2Jzc19zdGFydAogNDoJLmxvbmcJX2VuZAogNToJLmxvbmcJc3RhcnRfa2VybmVsCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9pby5jIGIvYXJjaC9zaC9rZXJuZWwvaW8uYwppbmRleCA3MWM5ZmRlLi41MDFmZTAzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9pby5jCisrKyBiL2FyY2gvc2gva2VybmVsL2lvLmMKQEAgLTYxLDYgKzYxLDczIEBACiB9CiBFWFBPUlRfU1lNQk9MKG1lbXNldF9pbyk7CiAKK3ZvaWQgX19yYXdfcmVhZHNsKHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YXAsIGludCBsZW4pCit7CisJdTMyICpkYXRhOworCisJZm9yIChkYXRhID0gZGF0YXA7IChsZW4gIT0gMCkgJiYgKCgodTMyKWRhdGEgJiAweDFmKSAhPSAwKTsgbGVuLS0pCisJCSpkYXRhKysgPSBjdHJsX2lubChhZGRyKTsKKworCWlmIChsaWtlbHkobGVuID49ICgweDIwID4+IDIpKSkgeworCQlpbnQgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNjsKKworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJCSIxOgkJCVxuXHQiCisJCQkibW92LmwJQCU3LCByMAkJXG5cdCIKKwkJCSJtb3YubAlAJTcsICUyCQlcblx0IgorI2lmZGVmIENPTkZJR19DUFVfU0g0CisJCQkibW92Y2EubCByMCwgQCUwCVxuXHQiCisjZWxzZQorCQkJIm1vdi5sCXIwLCBAJTAJCVxuXHQiCisjZW5kaWYKKwkJCSJtb3YubAlAJTcsICUzCQlcblx0IgorCQkJIm1vdi5sCUAlNywgJTQJCVxuXHQiCisJCQkibW92LmwJQCU3LCAlNQkJXG5cdCIKKwkJCSJtb3YubAlAJTcsICU2CQlcblx0IgorCQkJIm1vdi5sCUAlNywgcjcJCVxuXHQiCisJCQkibW92LmwJQCU3LCByMAkJXG5cdCIKKwkJCSJtb3YubAklMiwgQCgweDA0LCUwKQlcblx0IgorCQkJIm1vdgkjMHgyMD4+MiwgJTIJXG5cdCIKKwkJCSJtb3YubAklMywgQCgweDA4LCUwKQlcblx0IgorCQkJInN1YgklMiwgJTEJCVxuXHQiCisJCQkibW92LmwJJTQsIEAoMHgwYywlMCkJXG5cdCIKKwkJCSJjbXAvaGkJJTEsICUyCQkhIFQgaWYgMzIgPiBsZW4JXG5cdCIKKwkJCSJtb3YubAklNSwgQCgweDEwLCUwKQlcblx0IgorCQkJIm1vdi5sCSU2LCBAKDB4MTQsJTApCVxuXHQiCisJCQkibW92LmwJcjcsIEAoMHgxOCwlMCkJXG5cdCIKKwkJCSJtb3YubAlyMCwgQCgweDFjLCUwKQlcblx0IgorCQkJImJmLnMJMWIJCVxuXHQiCisJCQkiIGFkZAkjMHgyMCwgJTAJXG5cdCIKKwkJCTogIj0mciIgKGRhdGEpLCAiPSZyIiAobGVuKSwKKwkJCSAgIj0mciIgKHRtcDIpLCAiPSZyIiAodG1wMyksICI9JnIiICh0bXA0KSwKKwkJCSAgIj0mciIgKHRtcDUpLCAiPSZyIiAodG1wNikKKwkJCTogInIiKGFkZHIpLCAiMCIgKGRhdGEpLCAiMSIgKGxlbikKKwkJCTogInIwIiwgInI3IiwgInQiLCAibWVtb3J5Iik7CisJfQorCisJZm9yICg7IGxlbiAhPSAwOyBsZW4tLSkKKwkJKmRhdGErKyA9IGN0cmxfaW5sKGFkZHIpOworfQorRVhQT1JUX1NZTUJPTChfX3Jhd19yZWFkc2wpOworCit2b2lkIF9fcmF3X3dyaXRlc2wodW5zaWduZWQgbG9uZyBhZGRyLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKQoreworCWlmIChsaWtlbHkobGVuICE9IDApKSB7CisJCWludCB0bXAxOworCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJCSIxOgkJCQlcblx0IgorCQkJIm1vdi5sCUAlMCssICUxCVxuXHQiCisJCQkiZHQJCSUzCQlcblx0IgorCQkJImJmLnMJCTFiCQlcblx0IgorCQkJIiBtb3YubAklMSwgQCU0CQlcblx0IgorCQkJOiAiPSZyIiAoZGF0YSksICI9JnIiICh0bXAxKQorCQkJOiAiMCIgKGRhdGEpLCAiciIgKGxlbiksICJyIihhZGRyKQorCQkJOiAidCIsICJtZW1vcnkiKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKF9fcmF3X3dyaXRlc2wpOworCiB2b2lkIF9faW9tZW0gKmlvcG9ydF9tYXAodW5zaWduZWQgbG9uZyBwb3J0LCB1bnNpZ25lZCBpbnQgbnIpCiB7CiAJcmV0dXJuIHNoX212Lm12X2lvcG9ydF9tYXAocG9ydCwgbnIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaXJxLmMgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwppbmRleCBjMmUwN2Y3Li5jN2ViZDZhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pcnEuYwpAQCAtMSw1ICsxLDQgQEAKLS8qICRJZDogaXJxLmMsdiAxLjIwIDIwMDQvMDEvMTMgMDU6NTI6MTEga2tvamltYSBFeHAgJAotICoKKy8qCiAgKiBsaW51eC9hcmNoL3NoL2tlcm5lbC9pcnEuYwogICoKICAqCUNvcHlyaWdodCAoQykgMTk5MiwgMTk5OCBMaW51cyBUb3J2YWxkcywgSW5nbyBNb2xuYXIKQEAgLTcsMTMgKzYsMTUgQEAKICAqCiAgKiBTdXBlckggdmVyc2lvbjogIENvcHlyaWdodCAoQykgMTk5OSAgTmlpYmUgWXV0YWthCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8YXNtL2NwdS9tbXVfY29udGV4dC5oPgogCiAvKgpAQCAtNjAsMTUgKzYxLDQ2IEBACiB9CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR180S1NUQUNLUworLyoKKyAqIHBlci1DUFUgSVJRIGhhbmRsaW5nIGNvbnRleHRzICh0aHJlYWQgaW5mb3JtYXRpb24gYW5kIHN0YWNrKQorICovCit1bmlvbiBpcnFfY3R4IHsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8JdGluZm87CisJdTMyCQkJc3RhY2tbVEhSRUFEX1NJWkUvc2l6ZW9mKHUzMildOworfTsKKworc3RhdGljIHVuaW9uIGlycV9jdHggKmhhcmRpcnFfY3R4W05SX0NQVVNdOworc3RhdGljIHVuaW9uIGlycV9jdHggKnNvZnRpcnFfY3R4W05SX0NQVVNdOworI2VuZGlmCiAKIGFzbWxpbmthZ2UgaW50IGRvX0lSUSh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAogCQkgICAgICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAogCQkgICAgICBzdHJ1Y3QgcHRfcmVncyByZWdzKQogewogCWludCBpcnEgPSByNDsKKyNpZmRlZiBDT05GSUdfNEtTVEFDS1MKKwl1bmlvbiBpcnFfY3R4ICpjdXJjdHgsICppcnFjdHg7CisjZW5kaWYKIAogCWlycV9lbnRlcigpOwogCisjaWZkZWYgQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1cKKwkvKiBEZWJ1Z2dpbmcgY2hlY2sgZm9yIHN0YWNrIG92ZXJmbG93OiBpcyB0aGVyZSBsZXNzIHRoYW4gMUtCIGZyZWU/ICovCisJeworCQlsb25nIHNwOworCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgiYW5kIHIxNSwgJTAiIDoKKwkJCQkJIj1yIiAoc3ApIDogIjAiIChUSFJFQURfU0laRSAtIDEpKTsKKworCQlpZiAodW5saWtlbHkoc3AgPCAoc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbykgKyBTVEFDS19XQVJOKSkpIHsKKwkJCXByaW50aygiZG9fSVJROiBzdGFjayBvdmVyZmxvdzogJWxkXG4iLAorCQkJICAgICAgIHNwIC0gc2l6ZW9mKHN0cnVjdCB0aHJlYWRfaW5mbykpOworCQkJZHVtcF9zdGFjaygpOworCQl9CisJfQorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfQ1BVX0hBU19JTlRFVlQKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCiAjaWZkZWYgQ09ORklHX0NQVV9IQVNfU1JfUkIKQEAgLTg3LDcgKzExOSwxMzUgQEAKICNlbmRpZgogCiAJaXJxID0gaXJxX2RlbXV4KGlycSk7Ci0JX19kb19JUlEoaXJxLCAmcmVncyk7CisKKyNpZmRlZiBDT05GSUdfNEtTVEFDS1MKKwljdXJjdHggPSAodW5pb24gaXJxX2N0eCAqKWN1cnJlbnRfdGhyZWFkX2luZm8oKTsKKwlpcnFjdHggPSBoYXJkaXJxX2N0eFtzbXBfcHJvY2Vzc29yX2lkKCldOworCisJLyoKKwkgKiB0aGlzIGlzIHdoZXJlIHdlIHN3aXRjaCB0byB0aGUgSVJRIHN0YWNrLiBIb3dldmVyLCBpZiB3ZSBhcmUKKwkgKiBhbHJlYWR5IHVzaW5nIHRoZSBJUlEgc3RhY2sgKGJlY2F1c2Ugd2UgaW50ZXJydXB0ZWQgYSBoYXJkaXJxCisJICogaGFuZGxlcikgd2UgY2FuJ3QgZG8gdGhhdCBhbmQganVzdCBoYXZlIHRvIGtlZXAgdXNpbmcgdGhlCisJICogY3VycmVudCBzdGFjayAod2hpY2ggaXMgdGhlIGlycSBzdGFjayBhbHJlYWR5IGFmdGVyIGFsbCkKKwkgKi8KKwlpZiAoY3VyY3R4ICE9IGlycWN0eCkgeworCQl1MzIgKmlzcDsKKworCQlpc3AgPSAodTMyICopKChjaGFyICopaXJxY3R4ICsgc2l6ZW9mKCppcnFjdHgpKTsKKwkJaXJxY3R4LT50aW5mby50YXNrID0gY3VyY3R4LT50aW5mby50YXNrOworCQlpcnFjdHgtPnRpbmZvLnByZXZpb3VzX3NwID0gY3VycmVudF9zdGFja19wb2ludGVyOworCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJCSJtb3YJJTAsIHI0CQlcbiIKKwkJCSJtb3YJJTEsIHI1CQlcbiIKKwkJCSJtb3YJcjE1LCByOQkJXG4iCisJCQkianNyCUAlMgkJXG4iCisJCQkvKiBzd2l0aCB0byB0aGUgaXJxIHN0YWNrICovCisJCQkiIG1vdgklMywgcjE1CQlcbiIKKwkJCS8qIHJlc3RvcmUgdGhlIHN0YWNrIChyaW5nIHplcm8pICovCisJCQkibW92CXI5LCByMTUJCVxuIgorCQkJOiAvKiBubyBvdXRwdXRzICovCisJCQk6ICJyIiAoaXJxKSwgInIiICgmcmVncyksICJyIiAoX19kb19JUlEpLCAiciIgKGlzcCkKKwkJCS8qIFhYWDogQSBzb21ld2hhdCBleGNlc3NpdmUgY2xvYmJlciBsaXN0PyAtUEZNICovCisJCQk6ICJtZW1vcnkiLCAicjAiLCAicjEiLCAicjIiLCAicjMiLCAicjQiLAorCQkJICAicjUiLCAicjYiLCAicjciLCAicjgiLCAidCIsICJwciIKKwkJKTsKKwl9IGVsc2UKKyNlbmRpZgorCQlfX2RvX0lSUShpcnEsICZyZWdzKTsKKwogCWlycV9leGl0KCk7CisKIAlyZXR1cm4gMTsKIH0KKworI2lmZGVmIENPTkZJR180S1NUQUNLUworLyoKKyAqIFRoZXNlIHNob3VsZCByZWFsbHkgYmUgX19zZWN0aW9uX18oIi5ic3MucGFnZV9hbGlnbmVkIikgYXMgd2VsbCwgYnV0CisgKiBnY2MncyAzLjAgYW5kIGVhcmxpZXIgZG9uJ3QgaGFuZGxlIHRoYXQgY29ycmVjdGx5LgorICovCitzdGF0aWMgY2hhciBzb2Z0aXJxX3N0YWNrW05SX0NQVVMgKiBUSFJFQURfU0laRV0KKwkJX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oVEhSRUFEX1NJWkUpKSk7CisKK3N0YXRpYyBjaGFyIGhhcmRpcnFfc3RhY2tbTlJfQ1BVUyAqIFRIUkVBRF9TSVpFXQorCQlfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhUSFJFQURfU0laRSkpKTsKKworLyoKKyAqIGFsbG9jYXRlIHBlci1jcHUgc3RhY2tzIGZvciBoYXJkaXJxIGFuZCBmb3Igc29mdGlycSBwcm9jZXNzaW5nCisgKi8KK3ZvaWQgaXJxX2N0eF9pbml0KGludCBjcHUpCit7CisJdW5pb24gaXJxX2N0eCAqaXJxY3R4OworCisJaWYgKGhhcmRpcnFfY3R4W2NwdV0pCisJCXJldHVybjsKKworCWlycWN0eCA9ICh1bmlvbiBpcnFfY3R4ICopJmhhcmRpcnFfc3RhY2tbY3B1ICogVEhSRUFEX1NJWkVdOworCWlycWN0eC0+dGluZm8udGFzawkJPSBOVUxMOworCWlycWN0eC0+dGluZm8uZXhlY19kb21haW4JPSBOVUxMOworCWlycWN0eC0+dGluZm8uY3B1CQk9IGNwdTsKKwlpcnFjdHgtPnRpbmZvLnByZWVtcHRfY291bnQJPSBIQVJESVJRX09GRlNFVDsKKwlpcnFjdHgtPnRpbmZvLmFkZHJfbGltaXQJPSBNQUtFX01NX1NFRygwKTsKKworCWhhcmRpcnFfY3R4W2NwdV0gPSBpcnFjdHg7CisKKwlpcnFjdHggPSAodW5pb24gaXJxX2N0eCAqKSZzb2Z0aXJxX3N0YWNrW2NwdSAqIFRIUkVBRF9TSVpFXTsKKwlpcnFjdHgtPnRpbmZvLnRhc2sJCT0gTlVMTDsKKwlpcnFjdHgtPnRpbmZvLmV4ZWNfZG9tYWluCT0gTlVMTDsKKwlpcnFjdHgtPnRpbmZvLmNwdQkJPSBjcHU7CisJaXJxY3R4LT50aW5mby5wcmVlbXB0X2NvdW50CT0gU09GVElSUV9PRkZTRVQ7CisJaXJxY3R4LT50aW5mby5hZGRyX2xpbWl0CT0gTUFLRV9NTV9TRUcoMCk7CisKKwlzb2Z0aXJxX2N0eFtjcHVdID0gaXJxY3R4OworCisJcHJpbnRrKCJDUFUgJXUgaXJxc3RhY2tzLCBoYXJkPSVwIHNvZnQ9JXBcbiIsCisJCWNwdSwgaGFyZGlycV9jdHhbY3B1XSwgc29mdGlycV9jdHhbY3B1XSk7Cit9CisKK3ZvaWQgaXJxX2N0eF9leGl0KGludCBjcHUpCit7CisJaGFyZGlycV9jdHhbY3B1XSA9IE5VTEw7Cit9CisKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgX19kb19zb2Z0aXJxKHZvaWQpOworCithc21saW5rYWdlIHZvaWQgZG9fc29mdGlycSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHRocmVhZF9pbmZvICpjdXJjdHg7CisJdW5pb24gaXJxX2N0eCAqaXJxY3R4OworCXUzMiAqaXNwOworCisJaWYgKGluX2ludGVycnVwdCgpKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAobG9jYWxfc29mdGlycV9wZW5kaW5nKCkpIHsKKwkJY3VyY3R4ID0gY3VycmVudF90aHJlYWRfaW5mbygpOworCQlpcnFjdHggPSBzb2Z0aXJxX2N0eFtzbXBfcHJvY2Vzc29yX2lkKCldOworCQlpcnFjdHgtPnRpbmZvLnRhc2sgPSBjdXJjdHgtPnRhc2s7CisJCWlycWN0eC0+dGluZm8ucHJldmlvdXNfc3AgPSBjdXJyZW50X3N0YWNrX3BvaW50ZXI7CisKKwkJLyogYnVpbGQgdGhlIHN0YWNrIGZyYW1lIG9uIHRoZSBzb2Z0aXJxIHN0YWNrICovCisJCWlzcCA9ICh1MzIgKikoKGNoYXIgKilpcnFjdHggKyBzaXplb2YoKmlycWN0eCkpOworCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJCSJtb3YJcjE1LCByOQkJXG4iCisJCQkianNyCUAlMAkJXG4iCisJCQkvKiBzd2l0Y2ggdG8gdGhlIHNvZnRpcnEgc3RhY2sgKi8KKwkJCSIgbW92CSUxLCByMTUJCVxuIgorCQkJLyogcmVzdG9yZSB0aGUgdGhyZWFkIHN0YWNrICovCisJCQkibW92CXI5LCByMTUJCVxuIgorCQkJOiAvKiBubyBvdXRwdXRzICovCisJCQk6ICJyIiAoX19kb19zb2Z0aXJxKSwgInIiIChpc3ApCisJCQkvKiBYWFg6IEEgc29tZXdoYXQgZXhjZXNzaXZlIGNsb2JiZXIgbGlzdD8gLVBGTSAqLworCQkJOiAibWVtb3J5IiwgInIwIiwgInIxIiwgInIyIiwgInIzIiwgInI0IiwKKwkJCSAgInI1IiwgInI2IiwgInI3IiwgInI4IiwgInI5IiwgInIxNSIsICJ0IiwgInByIgorCQkpOworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woZG9fc29mdGlycSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2tnZGJfc3R1Yi5jIGIvYXJjaC9zaC9rZXJuZWwva2dkYl9zdHViLmMKaW5kZXggNDI2MzhiOS4uOWM2MzE1ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwva2dkYl9zdHViLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwva2dkYl9zdHViLmMKQEAgLTEwMSwxNiArMTAxLDE3IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAorI2lmZGVmIENPTkZJR19TSF9LR0RCX0NPTlNPTEUKKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogI2luY2x1ZGUgPGFzbS9zaWduYWwuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20va2dkYi5oPgotCi0jaWZkZWYgQ09ORklHX1NIX0tHREJfQ09OU09MRQotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNlbmRpZgorI2luY2x1ZGUgPGFzbS9pby5oPgogCiAvKiBGdW5jdGlvbiBwb2ludGVycyBmb3IgbGlua2FnZSAqLwoga2dkYl9kZWJ1Z19ob29rX3QgKmtnZGJfZGVidWdfaG9vazsKQEAgLTI0MCw3ICsyNDEsNiBAQAogLyogTWlzYyBzdGF0aWMgKi8KIHN0YXRpYyBpbnQgc3RlcHBlZF9hZGRyZXNzOwogc3RhdGljIHNob3J0IHN0ZXBwZWRfb3Bjb2RlOwotc3RhdGljIGNvbnN0IGNoYXIgaGV4Y2hhcnNbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKIHN0YXRpYyBjaGFyIGluX2J1ZmZlcltCVUZNQVhdOwogc3RhdGljIGNoYXIgb3V0X2J1ZmZlcltPVVRCVUZNQVhdOwogCkBAIC0yNTMsMjkgKzI1Myw2IEBACiAjZGVmaW5lIEJVRl9USFJFQURfSURfU0laRSAxNgogI2VuZGlmCiAKLS8qIFJldHVybiBhZGRyIGFzIGEgcmVhbCB2b2xhdGlsZSBhZGRyZXNzICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjdHJsX2lubChjb25zdCB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKSBhZGRyOwotfQotCi0vKiBDb3JyZWN0bHkgc2V0ICphZGRyIHVzaW5nIHZvbGF0aWxlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY3RybF9vdXRsKGNvbnN0IHVuc2lnbmVkIGludCBiLCB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIGFkZHIgPSBiOwotfQotCi0vKiBHZXQgaGlnaCBoZXggYml0cyAqLwotc3RhdGljIGNoYXIgaGlnaGhleChjb25zdCBpbnQgeCkKLXsKLQlyZXR1cm4gaGV4Y2hhcnNbKHggPj4gNCkgJiAweGZdOwotfQotCi0vKiBHZXQgbG93IGhleCBiaXRzICovCi1zdGF0aWMgY2hhciBsb3doZXgoY29uc3QgaW50IHgpCi17Ci0JcmV0dXJuIGhleGNoYXJzW3ggJiAweGZdOwotfQogCiAvKiBDb252ZXJ0IGNoIHRvIGhleCAqLwogc3RhdGljIGludCBoZXgoY29uc3QgY2hhciBjaCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL21hY2hpbmVfa2V4ZWMuYyBiL2FyY2gvc2gva2VybmVsL21hY2hpbmVfa2V4ZWMuYwppbmRleCA2YmNkOGQ5Li4wODU4N2NkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCkBAIC0yOSwxMiArMjksNiBAQAogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCByZWxvY2F0ZV9uZXdfa2VybmVsX3NpemU7CiBleHRlcm4gdm9pZCAqZ2RiX3Zicl92ZWN0b3I7CiAKLS8qCi0gKiBQcm92aWRlIGEgZHVtbXkgY3Jhc2hfbm90ZXMgZGVmaW5pdGlvbiB3aGlsZSBjcmFzaCBkdW1wIGFycml2ZXMgdG8gcHBjLgotICogVGhpcyBwcmV2ZW50cyBicmVha2FnZSBvZiBjcmFzaF9ub3RlcyBhdHRyaWJ1dGUgaW4ga2VybmVsL2tzeXNmcy5jLgotICovCi12b2lkICpjcmFzaF9ub3RlcyA9IE5VTEw7Ci0KIHZvaWQgbWFjaGluZV9zaHV0ZG93bih2b2lkKQogewogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvcG0uYyBiL2FyY2gvc2gva2VybmVsL3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBhYjYyYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL3BtLmMKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIEdlbmVyaWMgUG93ZXIgTWFuYWdlbWVudCBSb3V0aW5lCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEFuZHJpeSBTa3VseXNoIDxhc2t1bHN5aEBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxhc20vZnJlcS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS93YXRjaGRvZy5oPgorI2luY2x1ZGUgPGFzbS9wbS5oPgorCisjZGVmaW5lIElOVFJfT0ZGU0VUCTB4NjAwCisKKyNkZWZpbmUgU1RCQ1IJCTB4ZmZmZmZmODIKKyNkZWZpbmUgU1RCQ1IyCQkweGZmZmZmZjg4CisKKyNkZWZpbmUgU1RCQ1JfU1RCWQkweDgwCisjZGVmaW5lIFNUQkNSX01TVFAyCTB4MDQKKworI2RlZmluZSBNQ1IJCTB4ZmZmZmZmNjgKKyNkZWZpbmUgUlRDTlQJCTB4ZmZmZmZmNzAKKworI2RlZmluZSBNQ1JfUk1PREUJMgorI2RlZmluZSBNQ1JfUkZTSAk0CisKK3ZvaWQgcG1fZW50ZXIodm9pZCkKK3sKKwl1OCBzdGJjciwgY3NyOworCXUxNiBmcnFjciwgbWNyOworCXUzMiB2YnJfbmV3LCB2YnJfb2xkOworCisJc2V0X2JsX2JpdCgpOworCisJLyogc2V0IHdkdCAqLworCWNzciA9IHNoX3dkdF9yZWFkX2NzcigpOworCWNzciAmPSB+V1RDU1JfVE1FOworCWNzciB8PSBXVENTUl9DS1NfNDA5NjsKKwlzaF93ZHRfd3JpdGVfY3NyKGNzcik7CisJY3NyID0gc2hfd2R0X3JlYWRfY3NyKCk7CisJc2hfd2R0X3dyaXRlX2NudCgwKTsKKworCS8qIGRpc2FibGUgUExMMSAqLworCWZycWNyID0gY3RybF9pbncoRlJRQ1IpOworCWZycWNyICY9IH4oRlJRQ1JfUExMRU4gfCBGUlFDUl9QU1RCWSk7CisJY3RybF9vdXR3KGZycWNyLCBGUlFDUik7CisKKwkvKiBlbmFibGUgc3RhbmRieSAqLworCXN0YmNyID0gY3RybF9pbmIoU1RCQ1IpOworCWN0cmxfb3V0YihzdGJjciB8IFNUQkNSX1NUQlkgfCBTVEJDUl9NU1RQMiwgU1RCQ1IpOworCisJLyogc2V0IHNlbGYtcmVmcmVzaCAqLworCW1jciA9IGN0cmxfaW53KE1DUik7CisJY3RybF9vdXR3KG1jciAmIH5NQ1JfUkZTSCwgTUNSKTsKKworCS8qIHNldCBpbnRlcnJ1cHQgaGFuZGxlciAqLworCWFzbSB2b2xhdGlsZSgic3RjIHZiciwgJTAiIDogIj1yIiAodmJyX29sZCkpOworCXZicl9uZXcgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0FUT01JQyk7CisJdWRlbGF5KDUwKTsKKwltZW1jcHkoKHZvaWQqKSh2YnJfbmV3ICsgSU5UUl9PRkZTRVQpLAorCSAgICAgICAmd2FrZXVwX3N0YXJ0LCAmd2FrZXVwX2VuZCAtICZ3YWtldXBfc3RhcnQpOworCWFzbSB2b2xhdGlsZSgibGRjICUwLCB2YnIiIDogOiAiciIgKHZicl9uZXcpKTsKKworCWN0cmxfb3V0dygwLCBSVENOVCk7CisJY3RybF9vdXR3KG1jciB8IE1DUl9SRlNIIHwgTUNSX1JNT0RFLCBNQ1IpOworCisJY3B1X3NsZWVwKCk7CisKKwlhc20gdm9sYXRpbGUoImxkYyAlMCwgdmJyIiA6IDogInIiICh2YnJfb2xkKSk7CisKKwlmcmVlX3BhZ2UodmJyX25ldyk7CisKKwkvKiBlbmFibGUgUExMMSAqLworCWZycWNyID0gY3RybF9pbncoRlJRQ1IpOworCWZycWNyIHw9IEZSUUNSX1BTVEJZOworCWN0cmxfb3V0dyhmcnFjciwgRlJRQ1IpOworCXVkZWxheSg1MCk7CisJZnJxY3IgfD0gRlJRQ1JfUExMRU47CisJY3RybF9vdXR3KGZycWNyLCBGUlFDUik7CisKKwljdHJsX291dGIoc3RiY3IsIFNUQkNSKTsKKworCWNsZWFyX2JsX2JpdCgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGYyMDMxMzEuLjBiMWQ1ZGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTgxLDE2ICs4MSw2IEBACiAKIHZvaWQgbWFjaGluZV9yZXN0YXJ0KGNoYXIgKiBfX3VudXNlZCkKIHsKLQotI2lmZGVmIENPTkZJR19LRVhFQwotCXN0cnVjdCBraW1hZ2UgKmltYWdlOwotCWltYWdlID0geGNoZygma2V4ZWNfaW1hZ2UsIDApOwotCWlmIChpbWFnZSkgewotCQltYWNoaW5lX3NodXRkb3duKCk7Ci0JCW1hY2hpbmVfa2V4ZWMoaW1hZ2UpOwotCX0KLSNlbmRpZgotCiAJLyogU1IuQkw9MSBhbmQgaW52b2tlIGFkZHJlc3MgZXJyb3IgdG8gbGV0IENQVSByZXNldCAobWFudWFsIHJlc2V0KSAqLwogCWFzbSB2b2xhdGlsZSgibGRjICUwLCBzclxuXHQiCiAJCSAgICAgIm1vdi5sIEAlMSwgJTAiIDogOiAiciIgKDB4MTAwMDAwMDApLCAiciIgKDB4ODAwMDAwMDEpKTsKQEAgLTI2Myw2ICsyNTMsNyBAQAogCQl1bnNpZ25lZCBsb25nIHVudXNlZCwKIAkJc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpID0gdGFza190aHJlYWRfaW5mbyhwKTsKIAlzdHJ1Y3QgcHRfcmVncyAqY2hpbGRyZWdzOwogI2lmIGRlZmluZWQoQ09ORklHX1NIX0ZQVSkKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CkBAIC0yNzcsOCArMjY4LDEwIEBACiAKIAlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CiAJCWNoaWxkcmVncy0+cmVnc1sxNV0gPSB1c3A7CisJCXRpLT5hZGRyX2xpbWl0ID0gVVNFUl9EUzsKIAl9IGVsc2UgewogCQljaGlsZHJlZ3MtPnJlZ3NbMTVdID0gKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHApICsgVEhSRUFEX1NJWkU7CisJCXRpLT5hZGRyX2xpbWl0ID0gS0VSTkVMX0RTOwogCX0KICAgICAgICAgaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfU0VUVExTKSB7CiAJCWNoaWxkcmVncy0+Z2JyID0gY2hpbGRyZWdzLT5yZWdzWzBdOwpAQCAtMjk5LDEzICsyOTIsMTUgQEAKIHsKIAljdHJsX291dGwocGMsIFVCQ19CQVJBKTsKIAorI2lmZGVmIENPTkZJR19NTVUKIAkvKiBXZSBkb24ndCBoYXZlIGFueSBBU0lEIHNldHRpbmdzIGZvciB0aGUgU0gtMiEgKi8KIAlpZiAoY3B1X2RhdGEtPnR5cGUgIT0gQ1BVX1NINzYwNCkKIAkJY3RybF9vdXRiKGFzaWQsIFVCQ19CQVNSQSk7CisjZW5kaWYKIAogCWN0cmxfb3V0bCgwLCBVQkNfQkFNUkEpOwogCi0JaWYgKGNwdV9kYXRhLT50eXBlID09IENQVV9TSDc3MjkpIHsKKwlpZiAoY3B1X2RhdGEtPnR5cGUgPT0gQ1BVX1NINzcyOSB8fCBjcHVfZGF0YS0+dHlwZSA9PSBDUFVfU0g3NzEwKSB7CiAJCWN0cmxfb3V0dyhCQlJfSU5TVCB8IEJCUl9SRUFEIHwgQkJSX0NQVSwgVUJDX0JCUkEpOwogCQljdHJsX291dGwoQlJDUl9QQ0JBIHwgQlJDUl9QQ1RFLCBVQkNfQlJDUik7CiAJfSBlbHNlIHsKQEAgLTM0NCw2ICszMzksNyBAQAogCX0KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX01NVQogCS8qCiAJICogUmVzdG9yZSB0aGUga2VybmVsIG1vZGUgcmVnaXN0ZXIKIAkgKiAgIAlrNyAocjdfYmFuazEpCkBAIC0zNTEsMTkgKzM0NywyMSBAQAogCWFzbSB2b2xhdGlsZSgibGRjCSUwLCByN19iYW5rIgogCQkgICAgIDogLyogbm8gb3V0cHV0ICovCiAJCSAgICAgOiAiciIgKHRhc2tfdGhyZWFkX2luZm8obmV4dCkpKTsKKyNlbmRpZgogCi0jaWZkZWYgQ09ORklHX01NVQogCS8qIElmIG5vIHRhc2tzIGFyZSB1c2luZyB0aGUgVUJDLCB3ZSdyZSBkb25lICovCiAJaWYgKHViY191c2VyY250ID09IDApCiAJCS8qIElmIG5vIHRhc2tzIGFyZSB1c2luZyB0aGUgVUJDLCB3ZSdyZSBkb25lICovOwogCWVsc2UgaWYgKG5leHQtPnRocmVhZC51YmNfcGMgJiYgbmV4dC0+bW0pIHsKLQkJdWJjX3NldF90cmFjaW5nKG5leHQtPm1tLT5jb250ZXh0ICYgTU1VX0NPTlRFWFRfQVNJRF9NQVNLLAotCQkJCW5leHQtPnRocmVhZC51YmNfcGMpOworCQlpbnQgYXNpZCA9IDA7CisjaWZkZWYgQ09ORklHX01NVQorCQlhc2lkIHw9IG5leHQtPm1tLT5jb250ZXh0LmlkICYgTU1VX0NPTlRFWFRfQVNJRF9NQVNLOworI2VuZGlmCisJCXViY19zZXRfdHJhY2luZyhhc2lkLCBuZXh0LT50aHJlYWQudWJjX3BjKTsKIAl9IGVsc2UgewogCQljdHJsX291dHcoMCwgVUJDX0JCUkEpOwogCQljdHJsX291dHcoMCwgVUJDX0JCUkIpOwogCX0KLSNlbmRpZgogCiAJcmV0dXJuIHByZXY7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvc2gva2VybmVsL3B0cmFjZS5jCmluZGV4IGY3ZWViYmQuLjA0Y2ExM2EwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3NoL2tlcm5lbC9wdHJhY2UuYwpAQCAtMjI0LDcgKzIyNCw2IEBACiAKIAljYXNlIFBUUkFDRV9TRVREU1BSRUdTOiB7CiAJCXVuc2lnbmVkIGxvbmcgZHA7Ci0JCWludCBpOwogCiAJCXJldCA9IC1FSU87CiAJCWRwID0gKCh1bnNpZ25lZCBsb25nKSBjaGlsZCkgKyBUSFJFQURfU0laRSAtCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zZW1hcGhvcmUuYyBiL2FyY2gvc2gva2VybmVsL3NlbWFwaG9yZS5jCmluZGV4IGEzYzI0ZGMuLjE4NDExOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NlbWFwaG9yZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NlbWFwaG9yZS5jCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUtaGVscGVyLmg+CiAKLXNwaW5sb2NrX3Qgc2VtYXBob3JlX3dha2VfbG9jazsKK0RFRklORV9TUElOTE9DSyhzZW1hcGhvcmVfd2FrZV9sb2NrKTsKIAogLyoKICAqIFNlbWFwaG9yZXMgYXJlIGltcGxlbWVudGVkIHVzaW5nIGEgdHdvLXdheSBjb3VudGVyOgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvc2gva2VybmVsL3NldHVwLmMKaW5kZXggZTc1MTg5Yy4uNWY1ODczMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCkBAIC00MywyNyArNDMsMTQgQEAKICAqIFRoZSBiaWdnZXIgdmFsdWUgbWVhbnMgbm8gcHJvYmxlbS4KICAqLwogc3RydWN0IHNoX2NwdWluZm8gYm9vdF9jcHVfZGF0YSA9IHsgQ1BVX1NIX05PTkUsIDEwMDAwMDAwLCB9OworI2lmZGVmIENPTkZJR19WVAogc3RydWN0IHNjcmVlbl9pbmZvIHNjcmVlbl9pbmZvOworI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TSF9VTktOT1dOKQogc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIHNoX212OwogI2VuZGlmCiAKLS8qIFdlIG5lZWQgdGhpcyB0byBzYXRpc2Z5IHNvbWUgZXh0ZXJuYWwgcmVmZXJlbmNlcy4gKi8KLXN0cnVjdCBzY3JlZW5faW5mbyBzY3JlZW5faW5mbyA9IHsKLSAgICAgICAgMCwgMjUsICAgICAgICAgICAgICAgICAgLyogb3JpZy14LCBvcmlnLXkgKi8KLSAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyogdW51c2VkICovCi0gICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIG9yaWctdmlkZW8tcGFnZSAqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBvcmlnLXZpZGVvLW1vZGUgKi8KLSAgICAgICAgODAsICAgICAgICAgICAgICAgICAgICAgLyogb3JpZy12aWRlby1jb2xzICovCi0gICAgICAgIDAsMCwwLCAgICAgICAgICAgICAgICAgIC8qIGVnYV9heCwgZWdhX2J4LCBlZ2FfY3ggKi8KLSAgICAgICAgMjUsICAgICAgICAgICAgICAgICAgICAgLyogb3JpZy12aWRlby1saW5lcyAqLwotICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBvcmlnLXZpZGVvLWlzVkdBICovCi0gICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgIC8qIG9yaWctdmlkZW8tcG9pbnRzICovCi19OwotCi1leHRlcm4gdm9pZCBwbGF0Zm9ybV9zZXR1cCh2b2lkKTsKLWV4dGVybiBjaGFyICpnZXRfc3lzdGVtX3R5cGUodm9pZCk7CiBleHRlcm4gaW50IHJvb3RfbW91bnRmbGFnczsKIAogI2RlZmluZSBNVl9OQU1FX1NJWkUgMzIKQEAgLTkwLDI5ICs3Nyw4IEBACiAKIHN0YXRpYyBjaGFyIGNvbW1hbmRfbGluZVtDT01NQU5EX0xJTkVfU0laRV0gPSB7IDAsIH07CiAKLXN0cnVjdCByZXNvdXJjZSBzdGFuZGFyZF9pb19yZXNvdXJjZXNbXSA9IHsKLQl7ICJkbWExIiwgMHgwMCwgMHgxZiB9LAotCXsgInBpYzEiLCAweDIwLCAweDNmIH0sCi0JeyAidGltZXIiLCAweDQwLCAweDVmIH0sCi0JeyAia2V5Ym9hcmQiLCAweDYwLCAweDZmIH0sCi0JeyAiZG1hIHBhZ2UgcmVnIiwgMHg4MCwgMHg4ZiB9LAotCXsgInBpYzIiLCAweGEwLCAweGJmIH0sCi0JeyAiZG1hMiIsIDB4YzAsIDB4ZGYgfSwKLQl7ICJmcHUiLCAweGYwLCAweGZmIH0KLX07Ci0KLSNkZWZpbmUgU1RBTkRBUkRfSU9fUkVTT1VSQ0VTIChzaXplb2Yoc3RhbmRhcmRfaW9fcmVzb3VyY2VzKS9zaXplb2Yoc3RydWN0IHJlc291cmNlKSkKLQotLyogU3lzdGVtIFJBTSAtIGludGVycnVwdGVkIGJ5IHRoZSA2NDBrQi0xTSBob2xlICovCi0jZGVmaW5lIGNvZGVfcmVzb3VyY2UgKHJhbV9yZXNvdXJjZXNbM10pCi0jZGVmaW5lIGRhdGFfcmVzb3VyY2UgKHJhbV9yZXNvdXJjZXNbNF0pCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIHJhbV9yZXNvdXJjZXNbXSA9IHsKLQl7ICJTeXN0ZW0gUkFNIiwgMHgwMDAwMDAsIDB4MDlmZmZmLCBJT1JFU09VUkNFX0JVU1kgfSwKLQl7ICJTeXN0ZW0gUkFNIiwgMHgxMDAwMDAsIDB4MTAwMDAwLCBJT1JFU09VUkNFX0JVU1kgfSwKLQl7ICJWaWRlbyBSQU0gYXJlYSIsIDB4MGEwMDAwLCAweDBiZmZmZiB9LAotCXsgIktlcm5lbCBjb2RlIiwgMHgxMDAwMDAsIDAgfSwKLQl7ICJLZXJuZWwgZGF0YSIsIDAsIDAgfQotfTsKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY29kZV9yZXNvdXJjZSA9IHsgLm5hbWUgPSAiS2VybmVsIGNvZGUiLCB9Oworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBkYXRhX3Jlc291cmNlID0geyAubmFtZSA9ICJLZXJuZWwgZGF0YSIsIH07CiAKIHVuc2lnbmVkIGxvbmcgbWVtb3J5X3N0YXJ0LCBtZW1vcnlfZW5kOwogCkBAIC0xNDUsNiArMTExLDI0IEBACiAJCQkJbWVtb3J5X2VuZCA9IG1lbW9yeV9zdGFydCArIG1lbV9zaXplOwogCQkJfQogCQl9CisKKyNpZmRlZiBDT05GSUdfRUFSTFlfUFJJTlRLCisJCWlmIChjID09ICcgJyAmJiAhbWVtY21wKGZyb20sICJlYXJseXByaW50az0iLCAxMikpIHsKKwkJCWNoYXIgKmVwX2VuZDsKKworCQkJaWYgKHRvICE9IGNvbW1hbmRfbGluZSkKKwkJCQl0by0tOworCisJCQlmcm9tICs9IDEyOworCQkJZXBfZW5kID0gc3RyY2hyKGZyb20sICcgJyk7CisKKwkJCXNldHVwX2Vhcmx5X3ByaW50ayhmcm9tKTsKKwkJCXByaW50aygiZWFybHkgY29uc29sZSBlbmFibGVkXG4iKTsKKworCQkJZnJvbSA9IGVwX2VuZDsKKwkJfQorI2VuZGlmCisKIAkJaWYgKGMgPT0gJyAnICYmICFtZW1jbXAoZnJvbSwgInNoX212PSIsIDYpKSB7CiAJCQljaGFyKiBtdl9lbmQ7CiAJCQljaGFyKiBtdl9jb21tYTsKQEAgLTIzNyw2ICsyMjEsOSBAQAogCV9fc2V0X2lvX3BvcnRfYmFzZShtdl9pb19iYXNlKTsKICNlbmRpZgogCisJaWYgKCFzaF9tdi5tdl9ucl9pcnFzKQorCQlzaF9tdi5tdl9ucl9pcnFzID0gTlJfSVJRUzsKKwogCXJldHVybiAwOwogfQogCkBAIC0yNDUsMTEgKzIzMiw2IEBACiAJdW5zaWduZWQgbG9uZyBib290bWFwX3NpemU7CiAJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIG1heF9wZm4sIG1heF9sb3dfcGZuOwogCi0jaWZkZWYgQ09ORklHX0VBUkxZX1BSSU5USwotCWV4dGVybiB2b2lkIGVuYWJsZV9lYXJseV9wcmludGsodm9pZCk7Ci0KLQllbmFibGVfZWFybHlfcHJpbnRrKCk7Ci0jZW5kaWYKICNpZmRlZiBDT05GSUdfQ01ETElORV9CT09MCiAgICAgICAgIHN0cmNweShDT01NQU5EX0xJTkUsIENPTkZJR19DTURMSU5FKTsKICNlbmRpZgpAQCAtMzY4LDE0ICszNTAsMTQgQEAKICNlbmRpZgogCiAJLyogUGVyZm9ybSB0aGUgbWFjaGluZSBzcGVjaWZpYyBpbml0aWFsaXNhdGlvbiAqLwotCXBsYXRmb3JtX3NldHVwKCk7CisJaWYgKGxpa2VseShzaF9tdi5tdl9zZXR1cCkpCisJCXNoX212Lm12X3NldHVwKGNtZGxpbmVfcCk7CiAKIAlwYWdpbmdfaW5pdCgpOwogfQogCiBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IqIF9faW5pdCBnZXRfbXZfYnluYW1lKGNvbnN0IGNoYXIqIG5hbWUpCiB7Ci0JZXh0ZXJuIGludCBzdHJjYXNlY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKIAlleHRlcm4gbG9uZyBfX21hY2h2ZWNfc3RhcnQsIF9fbWFjaHZlY19lbmQ7CiAJc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yICphbGxfdmVjcyA9CiAJCShzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgKikmX19tYWNodmVjX3N0YXJ0OwpAQCAtNDEwLDI1ICszOTIsMTggQEAKIHN1YnN5c19pbml0Y2FsbCh0b3BvbG9neV9pbml0KTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmNwdV9uYW1lW10gPSB7Ci0JW0NQVV9TSDc2MDRdCT0gIlNINzYwNCIsCi0JW0NQVV9TSDc3MDVdCT0gIlNINzcwNSIsCi0JW0NQVV9TSDc3MDhdCT0gIlNINzcwOCIsCi0JW0NQVV9TSDc3MjldCT0gIlNINzcyOSIsCi0JW0NQVV9TSDczMDBdCT0gIlNINzMwMCIsCi0JW0NQVV9TSDc3NTBdCT0gIlNINzc1MCIsCi0JW0NQVV9TSDc3NTBTXQk9ICJTSDc3NTBTIiwKLQlbQ1BVX1NINzc1MFJdCT0gIlNINzc1MFIiLAotCVtDUFVfU0g3NzUxXQk9ICJTSDc3NTEiLAotCVtDUFVfU0g3NzUxUl0JPSAiU0g3NzUxUiIsCi0JW0NQVV9TSDc3NjBdCT0gIlNINzc2MCIsCi0JW0NQVV9TSDczMTgwXQk9ICJTSDczMTgwIiwKLQlbQ1BVX1NUNDBSQV0JPSAiU1Q0MFJBIiwKLQlbQ1BVX1NUNDBHWDFdCT0gIlNUNDBHWDEiLAotCVtDUFVfU0g0XzIwMl0JPSAiU0g0LTIwMiIsCi0JW0NQVV9TSDRfNTAxXQk9ICJTSDQtNTAxIiwKLQlbQ1BVX1NINzc3MF0JPSAiU0g3NzcwIiwKLQlbQ1BVX1NINzc4MF0JPSAiU0g3NzgwIiwKLQlbQ1BVX1NINzc4MV0JPSAiU0g3NzgxIiwKKwlbQ1BVX1NINzYwNF0JPSAiU0g3NjA0IiwJW0NQVV9TSDczMDBdCT0gIlNINzMwMCIsCisJW0NQVV9TSDc3MDVdCT0gIlNINzcwNSIsCVtDUFVfU0g3NzA2XQk9ICJTSDc3MDYiLAorCVtDUFVfU0g3NzA3XQk9ICJTSDc3MDciLAlbQ1BVX1NINzcwOF0JPSAiU0g3NzA4IiwKKwlbQ1BVX1NINzcwOV0JPSAiU0g3NzA5IiwJW0NQVV9TSDc3MTBdCT0gIlNINzcxMCIsCisJW0NQVV9TSDc3MjldCT0gIlNINzcyOSIsCVtDUFVfU0g3NzUwXQk9ICJTSDc3NTAiLAorCVtDUFVfU0g3NzUwU10JPSAiU0g3NzUwUyIsCVtDUFVfU0g3NzUwUl0JPSAiU0g3NzUwUiIsCisJW0NQVV9TSDc3NTFdCT0gIlNINzc1MSIsCVtDUFVfU0g3NzUxUl0JPSAiU0g3NzUxUiIsCisJW0NQVV9TSDc3NjBdCT0gIlNINzc2MCIsCVtDUFVfU0g3MzE4MF0JPSAiU0g3MzE4MCIsCisJW0NQVV9TVDQwUkFdCT0gIlNUNDBSQSIsCVtDUFVfU1Q0MEdYMV0JPSAiU1Q0MEdYMSIsCisJW0NQVV9TSDRfMjAyXQk9ICJTSDQtMjAyIiwJW0NQVV9TSDRfNTAxXQk9ICJTSDQtNTAxIiwKKwlbQ1BVX1NINzc3MF0JPSAiU0g3NzcwIiwJW0NQVV9TSDc3ODBdCT0gIlNINzc4MCIsCisJW0NQVV9TSDc3ODFdCT0gIlNINzc4MSIsCVtDUFVfU0g3MzQzXQk9ICJTSDczNDMiLAogCVtDUFVfU0hfTk9ORV0JPSAiVW5rbm93biIKIH07CiAKQEAgLTQzOCw4ICs0MTMsMTAgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCisvKiBTeW1ib2xpYyBDUFUgZmxhZ3MsIGtlZXAgaW4gc3luYyB3aXRoIGFzbS9jcHUtZmVhdHVyZXMuaCAqLwogc3RhdGljIGNvbnN0IGNoYXIgKmNwdV9mbGFnc1tdID0gewotCSJub25lIiwgImZwdSIsICJwMmZsdXNoIiwgIm1tdWFzc29jIiwgImRzcCIsICJwZXJmY3RyIiwgInB0ZWEiLCBOVUxMCisJIm5vbmUiLCAiZnB1IiwgInAyZmx1c2giLCAibW11YXNzb2MiLCAiZHNwIiwgInBlcmZjdHIiLAorCSJwdGVhIiwgImxsc2MiLCAibDIiLCBOVUxMCiB9OwogCiBzdGF0aWMgdm9pZCBzaG93X2NwdWZsYWdzKHN0cnVjdCBzZXFfZmlsZSAqbSkKQEAgLTQ2MCw3ICs0MzcsOCBAQAogCXNlcV9wcmludGYobSwgIlxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIHNob3dfY2FjaGVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgY29uc3QgY2hhciAqdHlwZSwgc3RydWN0IGNhY2hlX2luZm8gaW5mbykKK3N0YXRpYyB2b2lkIHNob3dfY2FjaGVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgY29uc3QgY2hhciAqdHlwZSwKKwkJCSAgIHN0cnVjdCBjYWNoZV9pbmZvIGluZm8pCiB7CiAJdW5zaWduZWQgaW50IGNhY2hlX3NpemU7CiAKQEAgLTQ5Myw3ICs0NzEsNyBAQAogCSAqIHVuaWZpZWQgY2FjaGUgb24gdGhlIFNILTIgYW5kIFNILTMsIGFzIHdlbGwgYXMgdGhlIGhhcnZhcmQKIAkgKiBzdHlsZSBjYWNoZSBvbiB0aGUgU0gtNC4KIAkgKi8KLQlpZiAodGVzdF9iaXQoU0hfQ0FDSEVfQ09NQklORUQsICYoYm9vdF9jcHVfZGF0YS5pY2FjaGUuZmxhZ3MpKSkgeworCWlmIChib290X2NwdV9kYXRhLmljYWNoZS5mbGFncyAmIFNIX0NBQ0hFX0NPTUJJTkVEKSB7CiAJCXNlcV9wcmludGYobSwgInVuaWZpZWRcbiIpOwogCQlzaG93X2NhY2hlaW5mbyhtLCAiY2FjaGUiLCBib290X2NwdV9kYXRhLmljYWNoZSk7CiAJfSBlbHNlIHsKQEAgLTUwMiw2ICs0ODAsMTAgQEAKIAkJc2hvd19jYWNoZWluZm8obSwgImRjYWNoZSIsIGJvb3RfY3B1X2RhdGEuZGNhY2hlKTsKIAl9CiAKKwkvKiBPcHRpb25hbCBzZWNvbmRhcnkgY2FjaGUgKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS5mbGFncyAmIENQVV9IQVNfTDJfQ0FDSEUpCisJCXNob3dfY2FjaGVpbmZvKG0sICJzY2FjaGUiLCBib290X2NwdV9kYXRhLnNjYWNoZSk7CisKIAlzZXFfcHJpbnRmKG0sICJib2dvbWlwc1x0OiAlbHUuJTAybHVcbiIsCiAJCSAgICAgYm9vdF9jcHVfZGF0YS5sb29wc19wZXJfamlmZnkvKDUwMDAwMC9IWiksCiAJCSAgICAgKGJvb3RfY3B1X2RhdGEubG9vcHNfcGVyX2ppZmZ5Lyg1MDAwL0haKSkgJSAxMDApOwpAQCAtNjE3LDQgKzU5OSwzIEBACiB9CiBfX3NldHVwKCJrZ2RiPSIsIGtnZGJfcGFyc2Vfb3B0aW9ucyk7CiAjZW5kaWYgLyogQ09ORklHX1NIX0tHREIgKi8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXMuYyBiL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMKaW5kZXggMjQ1ZWQ4Zi4uZDNjYmZhMiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXMuYworKysgYi9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltcy5jCkBAIC0yNywyMSArMjcsMTEgQEAKIAogLyogcGxhdGZvcm0gZGVwZW5kZW50IHN1cHBvcnQgKi8KIEVYUE9SVF9TWU1CT0woZHVtcF9mcHUpOwotRVhQT1JUX1NZTUJPTChpb3VubWFwKTsKLUVYUE9SVF9TWU1CT0woZW5hYmxlX2lycSk7Ci1FWFBPUlRfU1lNQk9MKGRpc2FibGVfaXJxKTsKLUVYUE9SVF9TWU1CT0wocHJvYmVfaXJxX21hc2spOwogRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKLUVYUE9SVF9TWU1CT0woZGlzYWJsZV9pcnFfbm9zeW5jKTsKIEVYUE9SVF9TWU1CT0woaXJxX2Rlc2MpOwogRVhQT1JUX1NZTUJPTChub19pcnFfdHlwZSk7CiAKLUVYUE9SVF9TWU1CT0woc3Ryc3RyKTsKIEVYUE9SVF9TWU1CT0woc3RybGVuKTsKLUVYUE9SVF9TWU1CT0woc3Rybmxlbik7Ci1FWFBPUlRfU1lNQk9MKHN0cmNocik7Ci1FWFBPUlRfU1lNQk9MKHN0cmNhdCk7Ci1FWFBPUlRfU1lNQk9MKHN0cm5jYXQpOwogCiAvKiBQQ0kgZXhwb3J0cyAqLwogI2lmZGVmIENPTkZJR19QQ0kKQEAgLTUyLDEzICs0Miw4IEBACiAvKiBtZW0gZXhwb3J0cyAqLwogRVhQT1JUX1NZTUJPTChtZW1jaHIpOwogRVhQT1JUX1NZTUJPTChtZW1jcHkpOwotRVhQT1JUX1NZTUJPTChtZW1jcHlfZnJvbWlvKTsKLUVYUE9SVF9TWU1CT0wobWVtY3B5X3RvaW8pOwogRVhQT1JUX1NZTUJPTChtZW1zZXQpOwotRVhQT1JUX1NZTUJPTChtZW1zZXRfaW8pOwogRVhQT1JUX1NZTUJPTChtZW1tb3ZlKTsKLUVYUE9SVF9TWU1CT0wobWVtY21wKTsKLUVYUE9SVF9TWU1CT0wobWVtc2Nhbik7CiBFWFBPUlRfU1lNQk9MKF9fY29weV91c2VyKTsKIEVYUE9SVF9TWU1CT0woYm9vdF9jcHVfZGF0YSk7CiAKQEAgLTk0LDcgKzc5LDkgQEAKIERFQ0xBUkVfRVhQT1JUKF9fbW92c3RyX2k0X2V2ZW4pOwogREVDTEFSRV9FWFBPUlQoX19tb3ZzdHJfaTRfb2RkKTsKIERFQ0xBUkVfRVhQT1JUKF9fbW92c3RyU0kxMl9pNCk7CisjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpIHx8IGRlZmluZWQoQ09ORklHX1NINzcwNV9DQUNIRV8zMktCKQogLyogbmVlZGVkIGJ5IHNvbWUgbW9kdWxlcyAqLwogRVhQT1JUX1NZTUJPTChmbHVzaF9jYWNoZV9hbGwpOwogRVhQT1JUX1NZTUJPTChmbHVzaF9jYWNoZV9yYW5nZSk7CkBAIC0xMDIsMTEgKzg5LDkgQEAKIEVYUE9SVF9TWU1CT0woX19mbHVzaF9wdXJnZV9yZWdpb24pOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19TSDc3MDVfQ0FDSEVfMzJLQikKLUVYUE9SVF9TWU1CT0woZmx1c2hfY2FjaGVfYWxsKTsKLUVYUE9SVF9TWU1CT0woZmx1c2hfY2FjaGVfcmFuZ2UpOwotRVhQT1JUX1NZTUJPTChmbHVzaF9kY2FjaGVfcGFnZSk7Ci1FWFBPUlRfU1lNQk9MKF9fZmx1c2hfcHVyZ2VfcmVnaW9uKTsKKyNpZiBkZWZpbmVkKENPTkZJR19NTVUpICYmIChkZWZpbmVkKENPTkZJR19DUFVfU0g0KSB8fCBcCisJZGVmaW5lZChDT05GSUdfU0g3NzA1X0NBQ0hFXzMyS0IpKQorRVhQT1JUX1NZTUJPTChjbGVhcl91c2VyX3BhZ2UpOwogI2VuZGlmCiAKIEVYUE9SVF9TWU1CT0woZmx1c2hfdGxiX3BhZ2UpOwpAQCAtMTE2LDcgKzEwMSwxMiBAQAogRVhQT1JUX1NZTUJPTChzeW5jaHJvbml6ZV9pcnEpOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfUE0KK0VYUE9SVF9TWU1CT0wocG1fc3VzcGVuZCk7CisjZW5kaWYKKwogRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWwpOworI2lmZGVmIENPTkZJR19JUFY2CiBFWFBPUlRfU1lNQk9MKGNzdW1faXB2Nl9tYWdpYyk7Ci1FWFBPUlRfU1lNQk9MKGNvbnNpc3RlbnRfc3luYyk7CisjZW5kaWYKIEVYUE9SVF9TWU1CT0woY2xlYXJfcGFnZSk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCmluZGV4IGI0NzVjNGQuLjUyMTNmNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jCkBAIC04LDcgKzgsNiBAQAogICogIFN1cGVySCB2ZXJzaW9uOiAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwICBOaWliZSBZdXRha2EgJiBLYXogS29qaW1hCiAgKgogICovCi0KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CkBAIC0yMSw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CiAKQEAgLTI5LDEyICsyOSw4IEBACiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogCi0jZGVmaW5lIERFQlVHX1NJRyAwCi0KICNkZWZpbmUgX0JMT0NLQUJMRSAofihzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdTVE9QKSkpCiAKLWFzbWxpbmthZ2UgaW50IGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2lnc2V0X3QgKm9sZHNldCk7Ci0KIC8qCiAgKiBBdG9taWNhbGx5IHN3YXAgaW4gdGhlIG5ldyBzaWduYWwgbWFzaywgYW5kIHdhaXQgZm9yIGEgc2lnbmFsLgogICovCkBAIC00Myw1MSArMzksMTcgQEAKIAkgICAgICAgdW5zaWduZWQgbG9uZyByNSwgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKIAkgICAgICAgc3RydWN0IHB0X3JlZ3MgcmVncykKIHsKLQlzaWdzZXRfdCBzYXZlc2V0OwotCiAJbWFzayAmPSBfQkxPQ0tBQkxFOwogCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCXNhdmVzZXQgPSBjdXJyZW50LT5ibG9ja2VkOworCWN1cnJlbnQtPnNhdmVkX3NpZ21hc2sgPSBjdXJyZW50LT5ibG9ja2VkOwogCXNpZ2luaXRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsIG1hc2spOwogCXJlY2FsY19zaWdwZW5kaW5nKCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAotCXJlZ3MucmVnc1swXSA9IC1FSU5UUjsKLQl3aGlsZSAoMSkgewotCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKLQkJc2NoZWR1bGUoKTsKLQkJaWYgKGRvX3NpZ25hbCgmcmVncywgJnNhdmVzZXQpKQotCQkJcmV0dXJuIC1FSU5UUjsKLQl9Ci19Ci0KLWFzbWxpbmthZ2UgaW50Ci1zeXNfcnRfc2lnc3VzcGVuZChzaWdzZXRfdCAqdW5ld3NldCwgc2l6ZV90IHNpZ3NldHNpemUsCi0JCSAgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKLQkJICBzdHJ1Y3QgcHRfcmVncyByZWdzKQotewotCXNpZ3NldF90IHNhdmVzZXQsIG5ld3NldDsKLQotCS8qIFhYWDogRG9uJ3QgcHJlY2x1ZGUgaGFuZGxpbmcgZGlmZmVyZW50IHNpemVkIHNpZ3NldF90J3MuICAqLwotCWlmIChzaWdzZXRzaXplICE9IHNpemVvZihzaWdzZXRfdCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdzZXQsIHVuZXdzZXQsIHNpemVvZihuZXdzZXQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0Jc2lnZGVsc2V0bWFzaygmbmV3c2V0LCB+X0JMT0NLQUJMRSk7Ci0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0Jc2F2ZXNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7Ci0JY3VycmVudC0+YmxvY2tlZCA9IG5ld3NldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KLQlyZWdzLnJlZ3NbMF0gPSAtRUlOVFI7Ci0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0JCWlmIChkb19zaWduYWwoJnJlZ3MsICZzYXZlc2V0KSkKLQkJCXJldHVybiAtRUlOVFI7Ci0JfQorCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlKCk7CisJc2V0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spOworCXJldHVybiAtRVJFU1RBUlROT0hBTkQ7CiB9CiAKIGFzbWxpbmthZ2UgaW50IApAQCAtMzQ4LDcgKzMxMCwxMiBAQAogCXJldHVybiAodm9pZCBfX3VzZXIgKikoKHNwIC0gZnJhbWVfc2l6ZSkgJiAtOHVsKTsKIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKy8qIFRoZXNlIHN5bWJvbHMgYXJlIGRlZmluZWQgd2l0aCB0aGUgYWRkcmVzc2VzIGluIHRoZSB2c3lzY2FsbCBwYWdlLgorICAgU2VlIHZzeXNjYWxsLXRyYXBhLlMuICAqLworZXh0ZXJuIHZvaWQgX191c2VyIF9fa2VybmVsX3NpZ3JldHVybjsKK2V4dGVybiB2b2lkIF9fdXNlciBfX2tlcm5lbF9ydF9zaWdyZXR1cm47CisKK3N0YXRpYyBpbnQgc2V0dXBfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKIAkJCXNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwpAQCAtMzY4LDE1ICszMzUsMTggQEAKIAogCWVyciB8PSBzZXR1cF9zaWdjb250ZXh0KCZmcmFtZS0+c2MsIHJlZ3MsIHNldC0+c2lnWzBdKTsKIAotCWlmIChfTlNJR19XT1JEUyA+IDEpIHsKKwlpZiAoX05TSUdfV09SRFMgPiAxKQogCQllcnIgfD0gX19jb3B5X3RvX3VzZXIoZnJhbWUtPmV4dHJhbWFzaywgJnNldC0+c2lnWzFdLAogCQkJCSAgICAgIHNpemVvZihmcmFtZS0+ZXh0cmFtYXNrKSk7Ci0JfQogCiAJLyogU2V0IHVwIHRvIHJldHVybiBmcm9tIHVzZXJzcGFjZS4gIElmIHByb3ZpZGVkLCB1c2UgYSBzdHViCiAJICAgYWxyZWFkeSBpbiB1c2Vyc3BhY2UuICAqLwogCWlmIChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9SRVNUT1JFUikgewogCQlyZWdzLT5wciA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfcmVzdG9yZXI7CisjaWZkZWYgQ09ORklHX1ZTWVNDQUxMCisJfSBlbHNlIGlmIChsaWtlbHkoY3VycmVudC0+bW0tPmNvbnRleHQudmRzbykpIHsKKwkJcmVncy0+cHIgPSBWRFNPX1NZTSgmX19rZXJuZWxfc2lncmV0dXJuKTsKKyNlbmRpZgogCX0gZWxzZSB7CiAJCS8qIEdlbmVyYXRlIHJldHVybiBjb2RlIChzeXN0ZW0gY2FsbCB0byBzaWdyZXR1cm4pICovCiAJCWVyciB8PSBfX3B1dF91c2VyKE1PVlcoNyksICZmcmFtZS0+cmV0Y29kZVswXSk7CkBAIC00MDIsMjEgKzM3MiwyMiBAQAogCiAJc2V0X2ZzKFVTRVJfRFMpOwogCi0jaWYgREVCVUdfU0lHCi0JcHJpbnRrKCJTSUcgZGVsaXZlciAoJXM6JWQpOiBzcD0lcCBwYz0lMDhseCBwcj0lMDhseFxuIiwKLQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBmcmFtZSwgcmVncy0+cGMsIHJlZ3MtPnByKTsKLSNlbmRpZgorCXByX2RlYnVnKCJTSUcgZGVsaXZlciAoJXM6JWQpOiBzcD0lcCBwYz0lMDhseCBwcj0lMDhseFxuIiwKKwkJIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgZnJhbWUsIHJlZ3MtPnBjLCByZWdzLT5wcik7CiAKIAlmbHVzaF9jYWNoZV9zaWd0cmFtcChyZWdzLT5wcik7CisKIAlpZiAoKC1yZWdzLT5wciAmIChMMV9DQUNIRV9CWVRFUy0xKSkgPCBzaXplb2YoZnJhbWUtPnJldGNvZGUpKQogCQlmbHVzaF9jYWNoZV9zaWd0cmFtcChyZWdzLT5wciArIEwxX0NBQ0hFX0JZVEVTKTsKLQlyZXR1cm47CisKKwlyZXR1cm4gMDsKIAogZ2l2ZV9zaWdzZWd2OgogCWZvcmNlX3NpZ3NlZ3Yoc2lnLCBjdXJyZW50KTsKKwlyZXR1cm4gLUVGQVVMVDsKIH0KIAotc3RhdGljIHZvaWQgc2V0dXBfcnRfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwgc2lnaW5mb190ICppbmZvLAorc3RhdGljIGludCBzZXR1cF9ydF9mcmFtZShpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCiAJCQkgICBzaWdzZXRfdCAqc2V0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKQEAgLTQ1Miw2ICs0MjMsMTAgQEAKIAkgICBhbHJlYWR5IGluIHVzZXJzcGFjZS4gICovCiAJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1JFU1RPUkVSKSB7CiAJCXJlZ3MtPnByID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9yZXN0b3JlcjsKKyNpZmRlZiBDT05GSUdfVlNZU0NBTEwKKwl9IGVsc2UgaWYgKGxpa2VseShjdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvKSkgeworCQlyZWdzLT5wciA9IFZEU09fU1lNKCZfX2tlcm5lbF9ydF9zaWdyZXR1cm4pOworI2VuZGlmCiAJfSBlbHNlIHsKIAkJLyogR2VuZXJhdGUgcmV0dXJuIGNvZGUgKHN5c3RlbSBjYWxsIHRvIHJ0X3NpZ3JldHVybikgKi8KIAkJZXJyIHw9IF9fcHV0X3VzZXIoTU9WVyg3KSwgJmZyYW1lLT5yZXRjb2RlWzBdKTsKQEAgLTQ3NywyOCArNDUyLDMxIEBACiAKIAlzZXRfZnMoVVNFUl9EUyk7CiAKLSNpZiBERUJVR19TSUcKLQlwcmludGsoIlNJRyBkZWxpdmVyICglczolZCk6IHNwPSVwIHBjPSUwOGx4IHByPSUwOGx4XG4iLAotCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGZyYW1lLCByZWdzLT5wYywgcmVncy0+cHIpOwotI2VuZGlmCisJcHJfZGVidWcoIlNJRyBkZWxpdmVyICglczolZCk6IHNwPSVwIHBjPSUwOGx4IHByPSUwOGx4XG4iLAorCQkgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBmcmFtZSwgcmVncy0+cGMsIHJlZ3MtPnByKTsKIAogCWZsdXNoX2NhY2hlX3NpZ3RyYW1wKHJlZ3MtPnByKTsKKwogCWlmICgoLXJlZ3MtPnByICYgKEwxX0NBQ0hFX0JZVEVTLTEpKSA8IHNpemVvZihmcmFtZS0+cmV0Y29kZSkpCiAJCWZsdXNoX2NhY2hlX3NpZ3RyYW1wKHJlZ3MtPnByICsgTDFfQ0FDSEVfQllURVMpOwotCXJldHVybjsKKworCXJldHVybiAwOwogCiBnaXZlX3NpZ3NlZ3Y6CiAJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOworCXJldHVybiAtRUZBVUxUOwogfQogCiAvKgogICogT0ssIHdlJ3JlIGludm9raW5nIGEgaGFuZGxlcgogICovCiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBoYW5kbGVfc2lnbmFsKHVuc2lnbmVkIGxvbmcgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCiAJICAgICAgc2lnc2V0X3QgKm9sZHNldCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisJaW50IHJldDsKKwogCS8qIEFyZSB3ZSBmcm9tIGEgc3lzdGVtIGNhbGw/ICovCiAJaWYgKHJlZ3MtPnRyYSA+PSAwKSB7CiAJCS8qIElmIHNvLCBjaGVjayBzeXN0ZW0gY2FsbCByZXN0YXJ0aW5nLi4gKi8KQEAgLTUzOSwxOSArNTE3LDIzIEBACiAKIAkvKiBTZXQgdXAgdGhlIHN0YWNrIGZyYW1lICovCiAJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX1NJR0lORk8pCi0JCXNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncyk7CisJCXJldCA9IHNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncyk7CiAJZWxzZQotCQlzZXR1cF9mcmFtZShzaWcsIGthLCBvbGRzZXQsIHJlZ3MpOworCQlyZXQgPSBzZXR1cF9mcmFtZShzaWcsIGthLCBvbGRzZXQsIHJlZ3MpOwogCiAJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX09ORVNIT1QpCiAJCWthLT5zYS5zYV9oYW5kbGVyID0gU0lHX0RGTDsKIAotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCXNpZ29yc2V0cygmY3VycmVudC0+YmxvY2tlZCwmY3VycmVudC0+YmxvY2tlZCwma2EtPnNhLnNhX21hc2spOwotCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKQotCQlzaWdhZGRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsc2lnKTsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJaWYgKHJldCA9PSAwKSB7CisJCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsJmN1cnJlbnQtPmJsb2NrZWQsJmthLT5zYS5zYV9tYXNrKTsKKwkJaWYgKCEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfTk9ERUZFUikpCisJCQlzaWdhZGRzZXQoJmN1cnJlbnQtPmJsb2NrZWQsc2lnKTsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtNTYzLDExICs1NDUsMTIgQEAKICAqIHRoZSBrZXJuZWwgY2FuIGhhbmRsZSwgYW5kIHRoZW4gd2UgYnVpbGQgYWxsIHRoZSB1c2VyLWxldmVsIHNpZ25hbCBoYW5kbGluZwogICogc3RhY2stZnJhbWVzIGluIG9uZSBnbyBhZnRlciB0aGF0LgogICovCi1pbnQgZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzaWdzZXRfdCAqb2xkc2V0KQorc3RhdGljIHZvaWQgZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBpbnQgc2F2ZV9yMCkKIHsKIAlzaWdpbmZvX3QgaW5mbzsKIAlpbnQgc2lnbnI7CiAJc3RydWN0IGtfc2lnYWN0aW9uIGthOworCXNpZ3NldF90ICpvbGRzZXQ7CiAKIAkvKgogCSAqIFdlIHdhbnQgdGhlIGNvbW1vbiBjYXNlIHRvIGdvIGZhc3QsIHdoaWNoCkBAIC01NzYsMTkgKzU1OSwyNyBAQAogCSAqIGlmIHNvLgogCSAqLwogCWlmICghdXNlcl9tb2RlKHJlZ3MpKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuOwogCiAJaWYgKHRyeV90b19mcmVlemUoKSkKIAkJZ290byBub19zaWduYWw7CiAKLQlpZiAoIW9sZHNldCkKKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJb2xkc2V0ID0gJmN1cnJlbnQtPnNhdmVkX3NpZ21hc2s7CisJZWxzZQogCQlvbGRzZXQgPSAmY3VycmVudC0+YmxvY2tlZDsKIAogCXNpZ25yID0gZ2V0X3NpZ25hbF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOwogCWlmIChzaWduciA+IDApIHsKIAkJLyogV2hlZSEgIEFjdHVhbGx5IGRlbGl2ZXIgdGhlIHNpZ25hbC4gICovCi0JCWhhbmRsZV9zaWduYWwoc2lnbnIsICZrYSwgJmluZm8sIG9sZHNldCwgcmVncyk7Ci0JCXJldHVybiAxOworCQlpZiAoaGFuZGxlX3NpZ25hbChzaWduciwgJmthLCAmaW5mbywgb2xkc2V0LCByZWdzKSA9PSAwKSB7CisJCQkvKiBhIHNpZ25hbCB3YXMgc3VjY2Vzc2Z1bGx5IGRlbGl2ZXJlZDsgdGhlIHNhdmVkCisJCQkgKiBzaWdtYXNrIHdpbGwgaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgc2lnbmFsIGZyYW1lLAorCQkJICogYW5kIHdpbGwgYmUgcmVzdG9yZWQgYnkgc2lncmV0dXJuLCBzbyB3ZSBjYW4gc2ltcGx5CisJCQkgKiBjbGVhciB0aGUgVElGX1JFU1RPUkVfU0lHTUFTSyBmbGFnICovCisJCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJfQogCX0KIAogIG5vX3NpZ25hbDoKQEAgLTU5NywxMCArNTg4LDI3IEBACiAJCS8qIFJlc3RhcnQgdGhlIHN5c3RlbSBjYWxsIC0gbm8gaGFuZGxlcnMgcHJlc2VudCAqLwogCQlpZiAocmVncy0+cmVnc1swXSA9PSAtRVJFU1RBUlROT0hBTkQgfHwKIAkJICAgIHJlZ3MtPnJlZ3NbMF0gPT0gLUVSRVNUQVJUU1lTIHx8Ci0JCSAgICByZWdzLT5yZWdzWzBdID09IC1FUkVTVEFSVE5PSU5UUiB8fAotCQkgICAgcmVncy0+cmVnc1swXSA9PSAtRVJFU1RBUlRfUkVTVEFSVEJMT0NLKSB7CisJCSAgICByZWdzLT5yZWdzWzBdID09IC1FUkVTVEFSVE5PSU5UUikgeworCQkgICAgCXJlZ3MtPnJlZ3NbMF0gPSBzYXZlX3IwOwogCQkJcmVncy0+cGMgLT0gMjsKKwkJfSBlbHNlIGlmIChyZWdzLT5yZWdzWzBdID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spIHsKKwkJCXJlZ3MtPnBjIC09IDI7CisJCQlyZWdzLT5yZWdzWzNdID0gX19OUl9yZXN0YXJ0X3N5c2NhbGw7CiAJCX0KIAl9Ci0JcmV0dXJuIDA7CisKKwkvKiBpZiB0aGVyZSdzIG5vIHNpZ25hbCB0byBkZWxpdmVyLCB3ZSBqdXN0IHB1dCB0aGUgc2F2ZWQgc2lnbWFzaworCSAqIGJhY2sgKi8KKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrLCBOVUxMKTsKKwl9Cit9CisKK2FzbWxpbmthZ2Ugdm9pZCBkb19ub3RpZnlfcmVzdW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBpbnQgc2F2ZV9yMCwKKwkJCQkgX191MzIgdGhyZWFkX2luZm9fZmxhZ3MpCit7CisJLyogZGVhbCB3aXRoIHBlbmRpbmcgc2lnbmFsIGRlbGl2ZXJ5ICovCisJaWYgKHRocmVhZF9pbmZvX2ZsYWdzICYgKF9USUZfU0lHUEVORElORyB8IF9USUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJZG9fc2lnbmFsKHJlZ3MsIHNhdmVfcjApOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc3lzX3NoLmMgYi9hcmNoL3NoL2tlcm5lbC9zeXNfc2guYwppbmRleCA5MTdiMmYzLi5iNjhmZjcwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zeXNfc2guYworKysgYi9hcmNoL3NoL2tlcm5lbC9zeXNfc2guYwpAQCAtMjEsNyArMjEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgotCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pcGMuaD4KIApAQCAtNDQsMTEgKzQ1LDE2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0jaWYgZGVmaW5lZChIQVZFX0FSQ0hfVU5NQVBQRURfQVJFQSkKK3Vuc2lnbmVkIGxvbmcgc2htX2FsaWduX21hc2sgPSBQQUdFX1NJWkUgLSAxOwkvKiBTYW5lIGNhY2hlcyAqLworCitFWFBPUlRfU1lNQk9MKHNobV9hbGlnbl9tYXNrKTsKKwogLyoKLSAqIFRvIGF2b2lkIGNhY2hlIGFsaWFzLCB3ZSBtYXAgdGhlIHNoYXJkIHBhZ2Ugd2l0aCBzYW1lIGNvbG9yLgorICogVG8gYXZvaWQgY2FjaGUgYWxpYXNlcywgd2UgbWFwIHRoZSBzaGFyZWQgcGFnZSB3aXRoIHNhbWUgY29sb3IuCiAgKi8KLSNkZWZpbmUgQ09MT1VSX0FMSUdOKGFkZHIpCSgoKGFkZHIpK1NITUxCQS0xKSZ+KFNITUxCQS0xKSkKKyNkZWZpbmUgQ09MT1VSX0FMSUdOKGFkZHIsIHBnb2ZmKQkJCQlcCisJKCgoKGFkZHIpICsgc2htX2FsaWduX21hc2spICYgfnNobV9hbGlnbl9tYXNrKSArCVwKKwkgKCgocGdvZmYpIDw8IFBBR0VfU0hJRlQpICYgc2htX2FsaWduX21hc2spKQogCiB1bnNpZ25lZCBsb25nIGFyY2hfZ2V0X3VubWFwcGVkX2FyZWEoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwZ29mZiwgdW5zaWduZWQgbG9uZyBmbGFncykKQEAgLTU2LDQzICs2Miw1MiBAQAogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyOworCWludCBkb19jb2xvdXJfYWxpZ247CiAKIAlpZiAoZmxhZ3MgJiBNQVBfRklYRUQpIHsKIAkJLyogV2UgZG8gbm90IGFjY2VwdCBhIHNoYXJlZCBtYXBwaW5nIGlmIGl0IHdvdWxkIHZpb2xhdGUKIAkJICogY2FjaGUgYWxpYXNpbmcgY29uc3RyYWludHMuCiAJCSAqLwotCQlpZiAoKGZsYWdzICYgTUFQX1NIQVJFRCkgJiYgKGFkZHIgJiAoU0hNTEJBIC0gMSkpKQorCQlpZiAoKGZsYWdzICYgTUFQX1NIQVJFRCkgJiYgKGFkZHIgJiBzaG1fYWxpZ25fbWFzaykpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0dXJuIGFkZHI7CiAJfQogCi0JaWYgKGxlbiA+IFRBU0tfU0laRSkKKwlpZiAodW5saWtlbHkobGVuID4gVEFTS19TSVpFKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlkb19jb2xvdXJfYWxpZ24gPSAwOworCWlmIChmaWxwIHx8IChmbGFncyAmIE1BUF9TSEFSRUQpKQorCQlkb19jb2xvdXJfYWxpZ24gPSAxOworCiAJaWYgKGFkZHIpIHsKLQkJaWYgKGZsYWdzICYgTUFQX1BSSVZBVEUpCi0JCQlhZGRyID0gUEFHRV9BTElHTihhZGRyKTsKKwkJaWYgKGRvX2NvbG91cl9hbGlnbikKKwkJCWFkZHIgPSBDT0xPVVJfQUxJR04oYWRkciwgcGdvZmYpOwogCQllbHNlCi0JCQlhZGRyID0gQ09MT1VSX0FMSUdOKGFkZHIpOworCQkJYWRkciA9IFBBR0VfQUxJR04oYWRkcik7CisKIAkJdm1hID0gZmluZF92bWEobW0sIGFkZHIpOwogCQlpZiAoVEFTS19TSVpFIC0gbGVuID49IGFkZHIgJiYKIAkJICAgICghdm1hIHx8IGFkZHIgKyBsZW4gPD0gdm1hLT52bV9zdGFydCkpCiAJCQlyZXR1cm4gYWRkcjsKIAl9Ci0JaWYgKGxlbiA8PSBtbS0+Y2FjaGVkX2hvbGVfc2l6ZSkgeworCisJaWYgKGxlbiA+IG1tLT5jYWNoZWRfaG9sZV9zaXplKSB7CisJCXN0YXJ0X2FkZHIgPSBhZGRyID0gbW0tPmZyZWVfYXJlYV9jYWNoZTsKKwl9IGVsc2UgewogCSAgICAgICAgbW0tPmNhY2hlZF9ob2xlX3NpemUgPSAwOwotCQltbS0+ZnJlZV9hcmVhX2NhY2hlID0gVEFTS19VTk1BUFBFRF9CQVNFOworCQlzdGFydF9hZGRyID0gYWRkciA9IFRBU0tfVU5NQVBQRURfQkFTRTsKIAl9Ci0JaWYgKGZsYWdzICYgTUFQX1BSSVZBVEUpCi0JCWFkZHIgPSBQQUdFX0FMSUdOKG1tLT5mcmVlX2FyZWFfY2FjaGUpOwotCWVsc2UKLQkJYWRkciA9IENPTE9VUl9BTElHTihtbS0+ZnJlZV9hcmVhX2NhY2hlKTsKLQlzdGFydF9hZGRyID0gYWRkcjsKIAogZnVsbF9zZWFyY2g6CisJaWYgKGRvX2NvbG91cl9hbGlnbikKKwkJYWRkciA9IENPTE9VUl9BTElHTihhZGRyLCBwZ29mZik7CisJZWxzZQorCQlhZGRyID0gUEFHRV9BTElHTihtbS0+ZnJlZV9hcmVhX2NhY2hlKTsKKwogCWZvciAodm1hID0gZmluZF92bWEobW0sIGFkZHIpOyA7IHZtYSA9IHZtYS0+dm1fbmV4dCkgewogCQkvKiBBdCB0aGlzIHBvaW50OiAgKCF2bWEgfHwgYWRkciA8IHZtYS0+dm1fZW5kKS4gKi8KLQkJaWYgKFRBU0tfU0laRSAtIGxlbiA8IGFkZHIpIHsKKwkJaWYgKHVubGlrZWx5KFRBU0tfU0laRSAtIGxlbiA8IGFkZHIpKSB7CiAJCQkvKgogCQkJICogU3RhcnQgYSBuZXcgc2VhcmNoIC0ganVzdCBpbiBjYXNlIHdlIG1pc3NlZAogCQkJICogc29tZSBob2xlcy4KQEAgLTEwNCw3ICsxMTksNyBAQAogCQkJfQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KLQkJaWYgKCF2bWEgfHwgYWRkciArIGxlbiA8PSB2bWEtPnZtX3N0YXJ0KSB7CisJCWlmIChsaWtlbHkoIXZtYSB8fCBhZGRyICsgbGVuIDw9IHZtYS0+dm1fc3RhcnQpKSB7CiAJCQkvKgogCQkJICogUmVtZW1iZXIgdGhlIHBsYWNlIHdoZXJlIHdlIHN0b3BwZWQgdGhlIHNlYXJjaDoKIAkJCSAqLwpAQCAtMTE1LDExICsxMzAsMTAgQEAKIAkJICAgICAgICBtbS0+Y2FjaGVkX2hvbGVfc2l6ZSA9IHZtYS0+dm1fc3RhcnQgLSBhZGRyOwogCiAJCWFkZHIgPSB2bWEtPnZtX2VuZDsKLQkJaWYgKCEoZmxhZ3MgJiBNQVBfUFJJVkFURSkpCi0JCQlhZGRyID0gQ09MT1VSX0FMSUdOKGFkZHIpOworCQlpZiAoZG9fY29sb3VyX2FsaWduKQorCQkJYWRkciA9IENPTE9VUl9BTElHTihhZGRyLCBwZ29mZik7CiAJfQogfQotI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgbG9uZwogZG9fbW1hcDIodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBwcm90LCAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzLlMgYi9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ODMzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TCkBAIC0wLDAgKzEsMzUzIEBACisvKgorICogYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHMuUworICoKKyAqIFN5c3RlbSBjYWxsIHRhYmxlIGZvciBTdXBlckgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwLCAyMDAyICBOaWliZSBZdXRha2EKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zeXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKyNpZiAhZGVmaW5lZChDT05GSUdfTkZTRCkgJiYgIWRlZmluZWQoQ09ORklHX05GU0RfTU9EVUxFKQorI2RlZmluZSBzeXNfbmZzc2VydmN0bAkJc3lzX25pX3N5c2NhbGwKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ09ORklHX01NVSkKKyNkZWZpbmUgc3lzX21hZHZpc2UJCXN5c19uaV9zeXNjYWxsCisjZGVmaW5lIHN5c19yZWFkYWhlYWQJCXN5c19uaV9zeXNjYWxsCisjZGVmaW5lIHN5c19tcHJvdGVjdAkJc3lzX25pX3N5c2NhbGwKKyNkZWZpbmUgc3lzX21zeW5jCQlzeXNfbmlfc3lzY2FsbAorI2RlZmluZSBzeXNfbWxvY2sJCXN5c19uaV9zeXNjYWxsCisjZGVmaW5lIHN5c19tdW5sb2NrCQlzeXNfbmlfc3lzY2FsbAorI2RlZmluZSBzeXNfbWxvY2thbGwJCXN5c19uaV9zeXNjYWxsCisjZGVmaW5lIHN5c19tdW5sb2NrYWxsCQlzeXNfbmlfc3lzY2FsbAorI2RlZmluZSBzeXNfbXJlbWFwCQlzeXNfbmlfc3lzY2FsbAorI2RlZmluZSBzeXNfbWluY29yZQkJc3lzX25pX3N5c2NhbGwKKyNkZWZpbmUgc3lzX3JlbWFwX2ZpbGVfcGFnZXMJc3lzX25pX3N5c2NhbGwKKyNlbmRpZgorCisJLmRhdGEKK0VOVFJZKHN5c19jYWxsX3RhYmxlKQorCS5sb25nIHN5c19yZXN0YXJ0X3N5c2NhbGwJLyogMCAgLSAgb2xkICJzZXR1cCgpIiBzeXN0ZW0gY2FsbCovCisJLmxvbmcgc3lzX2V4aXQKKwkubG9uZyBzeXNfZm9yaworCS5sb25nIHN5c19yZWFkCisJLmxvbmcgc3lzX3dyaXRlCisJLmxvbmcgc3lzX29wZW4JCS8qIDUgKi8KKwkubG9uZyBzeXNfY2xvc2UKKwkubG9uZyBzeXNfd2FpdHBpZAorCS5sb25nIHN5c19jcmVhdAorCS5sb25nIHN5c19saW5rCisJLmxvbmcgc3lzX3VubGluawkJLyogMTAgKi8KKwkubG9uZyBzeXNfZXhlY3ZlCisJLmxvbmcgc3lzX2NoZGlyCisJLmxvbmcgc3lzX3RpbWUKKwkubG9uZyBzeXNfbWtub2QKKwkubG9uZyBzeXNfY2htb2QJCS8qIDE1ICovCisJLmxvbmcgc3lzX2xjaG93bjE2CisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIGJyZWFrIHN5c2NhbGwgaG9sZGVyICovCisJLmxvbmcgc3lzX3N0YXQKKwkubG9uZyBzeXNfbHNlZWsKKwkubG9uZyBzeXNfZ2V0cGlkCQkvKiAyMCAqLworCS5sb25nIHN5c19tb3VudAorCS5sb25nIHN5c19vbGR1bW91bnQKKwkubG9uZyBzeXNfc2V0dWlkMTYKKwkubG9uZyBzeXNfZ2V0dWlkMTYKKwkubG9uZyBzeXNfc3RpbWUJCS8qIDI1ICovCisJLmxvbmcgc3lzX3B0cmFjZQorCS5sb25nIHN5c19hbGFybQorCS5sb25nIHN5c19mc3RhdAorCS5sb25nIHN5c19wYXVzZQorCS5sb25nIHN5c191dGltZQkJLyogMzAgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBvbGQgc3R0eSBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBndHR5IHN5c2NhbGwgaG9sZGVyICovCisJLmxvbmcgc3lzX2FjY2VzcworCS5sb25nIHN5c19uaWNlCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogMzUgKi8JCS8qIG9sZCBmdGltZSBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19zeW5jCisJLmxvbmcgc3lzX2tpbGwKKwkubG9uZyBzeXNfcmVuYW1lCisJLmxvbmcgc3lzX21rZGlyCisJLmxvbmcgc3lzX3JtZGlyCQkvKiA0MCAqLworCS5sb25nIHN5c19kdXAKKwkubG9uZyBzeXNfcGlwZQorCS5sb25nIHN5c190aW1lcworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIG9sZCBwcm9mIHN5c2NhbGwgaG9sZGVyICovCisJLmxvbmcgc3lzX2JyawkJLyogNDUgKi8KKwkubG9uZyBzeXNfc2V0Z2lkMTYKKwkubG9uZyBzeXNfZ2V0Z2lkMTYKKwkubG9uZyBzeXNfc2lnbmFsCisJLmxvbmcgc3lzX2dldGV1aWQxNgorCS5sb25nIHN5c19nZXRlZ2lkMTYJLyogNTAgKi8KKwkubG9uZyBzeXNfYWNjdAorCS5sb25nIHN5c191bW91bnQJCS8qIHJlY3ljbGVkIG5ldmVyIHVzZWQgcGh5cygpICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIGxvY2sgc3lzY2FsbCBob2xkZXIgKi8KKwkubG9uZyBzeXNfaW9jdGwKKwkubG9uZyBzeXNfZmNudGwJCS8qIDU1ICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIG1weCBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19zZXRwZ2lkCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIHVsaW1pdCBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHN5c19vbGR1bmFtZSAqLworCS5sb25nIHN5c191bWFzawkJLyogNjAgKi8KKwkubG9uZyBzeXNfY2hyb290CisJLmxvbmcgc3lzX3VzdGF0CisJLmxvbmcgc3lzX2R1cDIKKwkubG9uZyBzeXNfZ2V0cHBpZAorCS5sb25nIHN5c19nZXRwZ3JwCQkvKiA2NSAqLworCS5sb25nIHN5c19zZXRzaWQKKwkubG9uZyBzeXNfc2lnYWN0aW9uCisJLmxvbmcgc3lzX3NnZXRtYXNrCisJLmxvbmcgc3lzX3NzZXRtYXNrCisJLmxvbmcgc3lzX3NldHJldWlkMTYJLyogNzAgKi8KKwkubG9uZyBzeXNfc2V0cmVnaWQxNgorCS5sb25nIHN5c19zaWdzdXNwZW5kCisJLmxvbmcgc3lzX3NpZ3BlbmRpbmcKKwkubG9uZyBzeXNfc2V0aG9zdG5hbWUKKwkubG9uZyBzeXNfc2V0cmxpbWl0CS8qIDc1ICovCisJLmxvbmcgc3lzX29sZF9nZXRybGltaXQKKwkubG9uZyBzeXNfZ2V0cnVzYWdlCisJLmxvbmcgc3lzX2dldHRpbWVvZmRheQorCS5sb25nIHN5c19zZXR0aW1lb2ZkYXkKKwkubG9uZyBzeXNfZ2V0Z3JvdXBzMTYJLyogODAgKi8KKwkubG9uZyBzeXNfc2V0Z3JvdXBzMTYKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBzeXNfb2xkc2VsZWN0ICovCisJLmxvbmcgc3lzX3N5bWxpbmsKKwkubG9uZyBzeXNfbHN0YXQKKwkubG9uZyBzeXNfcmVhZGxpbmsJCS8qIDg1ICovCisJLmxvbmcgc3lzX3VzZWxpYgorCS5sb25nIHN5c19zd2Fwb24KKwkubG9uZyBzeXNfcmVib290CisJLmxvbmcgb2xkX3JlYWRkaXIKKwkubG9uZyBvbGRfbW1hcAkJLyogOTAgKi8KKwkubG9uZyBzeXNfbXVubWFwCisJLmxvbmcgc3lzX3RydW5jYXRlCisJLmxvbmcgc3lzX2Z0cnVuY2F0ZQorCS5sb25nIHN5c19mY2htb2QKKwkubG9uZyBzeXNfZmNob3duMTYJCS8qIDk1ICovCisJLmxvbmcgc3lzX2dldHByaW9yaXR5CisJLmxvbmcgc3lzX3NldHByaW9yaXR5CisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkIHByb2ZpbCBzeXNjYWxsIGhvbGRlciAqLworCS5sb25nIHN5c19zdGF0ZnMKKwkubG9uZyBzeXNfZnN0YXRmcwkJLyogMTAwICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogaW9wZXJtICovCisJLmxvbmcgc3lzX3NvY2tldGNhbGwKKwkubG9uZyBzeXNfc3lzbG9nCisJLmxvbmcgc3lzX3NldGl0aW1lcgorCS5sb25nIHN5c19nZXRpdGltZXIJLyogMTA1ICovCisJLmxvbmcgc3lzX25ld3N0YXQKKwkubG9uZyBzeXNfbmV3bHN0YXQKKwkubG9uZyBzeXNfbmV3ZnN0YXQKKwkubG9uZyBzeXNfdW5hbWUKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiAxMTAgKi8gLyogaW9wbCAqLworCS5sb25nIHN5c192aGFuZ3VwCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogaWRsZSAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHZtODZvbGQgKi8KKwkubG9uZyBzeXNfd2FpdDQKKwkubG9uZyBzeXNfc3dhcG9mZgkJLyogMTE1ICovCisJLmxvbmcgc3lzX3N5c2luZm8KKwkubG9uZyBzeXNfaXBjCisJLmxvbmcgc3lzX2ZzeW5jCisJLmxvbmcgc3lzX3NpZ3JldHVybgorCS5sb25nIHN5c19jbG9uZQkJLyogMTIwICovCisJLmxvbmcgc3lzX3NldGRvbWFpbm5hbWUKKwkubG9uZyBzeXNfbmV3dW5hbWUKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBzeXNfbW9kaWZ5X2xkdCAqLworCS5sb25nIHN5c19hZGp0aW1leAorCS5sb25nIHN5c19tcHJvdGVjdAkJLyogMTI1ICovCisJLmxvbmcgc3lzX3NpZ3Byb2NtYXNrCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkICJjcmVhdGVfbW9kdWxlIiAqLworCS5sb25nIHN5c19pbml0X21vZHVsZQorCS5sb25nIHN5c19kZWxldGVfbW9kdWxlCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogMTMwOiBvbGQgImdldF9rZXJuZWxfc3ltcyIgKi8KKwkubG9uZyBzeXNfcXVvdGFjdGwKKwkubG9uZyBzeXNfZ2V0cGdpZAorCS5sb25nIHN5c19mY2hkaXIKKwkubG9uZyBzeXNfYmRmbHVzaAorCS5sb25nIHN5c19zeXNmcwkJLyogMTM1ICovCisJLmxvbmcgc3lzX3BlcnNvbmFsaXR5CisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogZm9yIGFmc19zeXNjYWxsICovCisJLmxvbmcgc3lzX3NldGZzdWlkMTYKKwkubG9uZyBzeXNfc2V0ZnNnaWQxNgorCS5sb25nIHN5c19sbHNlZWsJCS8qIDE0MCAqLworCS5sb25nIHN5c19nZXRkZW50cworCS5sb25nIHN5c19zZWxlY3QKKwkubG9uZyBzeXNfZmxvY2sKKwkubG9uZyBzeXNfbXN5bmMKKwkubG9uZyBzeXNfcmVhZHYJCS8qIDE0NSAqLworCS5sb25nIHN5c193cml0ZXYKKwkubG9uZyBzeXNfZ2V0c2lkCisJLmxvbmcgc3lzX2ZkYXRhc3luYworCS5sb25nIHN5c19zeXNjdGwKKwkubG9uZyBzeXNfbWxvY2sJCS8qIDE1MCAqLworCS5sb25nIHN5c19tdW5sb2NrCisJLmxvbmcgc3lzX21sb2NrYWxsCisJLmxvbmcgc3lzX211bmxvY2thbGwKKwkubG9uZyBzeXNfc2NoZWRfc2V0cGFyYW0KKwkubG9uZyBzeXNfc2NoZWRfZ2V0cGFyYW0gICAvKiAxNTUgKi8KKwkubG9uZyBzeXNfc2NoZWRfc2V0c2NoZWR1bGVyCisJLmxvbmcgc3lzX3NjaGVkX2dldHNjaGVkdWxlcgorCS5sb25nIHN5c19zY2hlZF95aWVsZAorCS5sb25nIHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4CisJLmxvbmcgc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4gIC8qIDE2MCAqLworCS5sb25nIHN5c19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwKKwkubG9uZyBzeXNfbmFub3NsZWVwCisJLmxvbmcgc3lzX21yZW1hcAorCS5sb25nIHN5c19zZXRyZXN1aWQxNgorCS5sb25nIHN5c19nZXRyZXN1aWQxNgkvKiAxNjUgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiB2bTg2ICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogb2xkICJxdWVyeV9tb2R1bGUiICovCisJLmxvbmcgc3lzX3BvbGwKKwkubG9uZyBzeXNfbmZzc2VydmN0bAorCS5sb25nIHN5c19zZXRyZXNnaWQxNgkvKiAxNzAgKi8KKwkubG9uZyBzeXNfZ2V0cmVzZ2lkMTYKKwkubG9uZyBzeXNfcHJjdGwKKwkubG9uZyBzeXNfcnRfc2lncmV0dXJuCisJLmxvbmcgc3lzX3J0X3NpZ2FjdGlvbgorCS5sb25nIHN5c19ydF9zaWdwcm9jbWFzawkvKiAxNzUgKi8KKwkubG9uZyBzeXNfcnRfc2lncGVuZGluZworCS5sb25nIHN5c19ydF9zaWd0aW1lZHdhaXQKKwkubG9uZyBzeXNfcnRfc2lncXVldWVpbmZvCisJLmxvbmcgc3lzX3J0X3NpZ3N1c3BlbmQKKwkubG9uZyBzeXNfcHJlYWRfd3JhcHBlcgkgICAvKiAxODAgKi8KKwkubG9uZyBzeXNfcHdyaXRlX3dyYXBwZXIKKwkubG9uZyBzeXNfY2hvd24xNgorCS5sb25nIHN5c19nZXRjd2QKKwkubG9uZyBzeXNfY2FwZ2V0CisJLmxvbmcgc3lzX2NhcHNldCAgICAgICAgICAgLyogMTg1ICovCisJLmxvbmcgc3lzX3NpZ2FsdHN0YWNrCisJLmxvbmcgc3lzX3NlbmRmaWxlCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogc3RyZWFtczEgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiBzdHJlYW1zMiAqLworCS5sb25nIHN5c192Zm9yayAgICAgICAgICAgIC8qIDE5MCAqLworCS5sb25nIHN5c19nZXRybGltaXQKKwkubG9uZyBzeXNfbW1hcDIKKwkubG9uZyBzeXNfdHJ1bmNhdGU2NAorCS5sb25nIHN5c19mdHJ1bmNhdGU2NAorCS5sb25nIHN5c19zdGF0NjQJCS8qIDE5NSAqLworCS5sb25nIHN5c19sc3RhdDY0CisJLmxvbmcgc3lzX2ZzdGF0NjQKKwkubG9uZyBzeXNfbGNob3duCisJLmxvbmcgc3lzX2dldHVpZAorCS5sb25nIHN5c19nZXRnaWQJCS8qIDIwMCAqLworCS5sb25nIHN5c19nZXRldWlkCisJLmxvbmcgc3lzX2dldGVnaWQKKwkubG9uZyBzeXNfc2V0cmV1aWQKKwkubG9uZyBzeXNfc2V0cmVnaWQKKwkubG9uZyBzeXNfZ2V0Z3JvdXBzCS8qIDIwNSAqLworCS5sb25nIHN5c19zZXRncm91cHMKKwkubG9uZyBzeXNfZmNob3duCisJLmxvbmcgc3lzX3NldHJlc3VpZAorCS5sb25nIHN5c19nZXRyZXN1aWQKKwkubG9uZyBzeXNfc2V0cmVzZ2lkCS8qIDIxMCAqLworCS5sb25nIHN5c19nZXRyZXNnaWQKKwkubG9uZyBzeXNfY2hvd24KKwkubG9uZyBzeXNfc2V0dWlkCisJLmxvbmcgc3lzX3NldGdpZAorCS5sb25nIHN5c19zZXRmc3VpZAkJLyogMjE1ICovCisJLmxvbmcgc3lzX3NldGZzZ2lkCisJLmxvbmcgc3lzX3Bpdm90X3Jvb3QKKwkubG9uZyBzeXNfbWluY29yZQorCS5sb25nIHN5c19tYWR2aXNlCisJLmxvbmcgc3lzX2dldGRlbnRzNjQJLyogMjIwICovCisJLmxvbmcgc3lzX2ZjbnRsNjQKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkvKiByZXNlcnZlZCBmb3IgVFVYICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogUmVzZXJ2ZWQgZm9yIFNlY3VyaXR5ICovCisJLmxvbmcgc3lzX2dldHRpZAorCS5sb25nIHN5c19yZWFkYWhlYWQJLyogMjI1ICovCisJLmxvbmcgc3lzX3NldHhhdHRyCisJLmxvbmcgc3lzX2xzZXR4YXR0cgorCS5sb25nIHN5c19mc2V0eGF0dHIKKwkubG9uZyBzeXNfZ2V0eGF0dHIKKwkubG9uZyBzeXNfbGdldHhhdHRyCS8qIDIzMCAqLworCS5sb25nIHN5c19mZ2V0eGF0dHIKKwkubG9uZyBzeXNfbGlzdHhhdHRyCisJLmxvbmcgc3lzX2xsaXN0eGF0dHIKKwkubG9uZyBzeXNfZmxpc3R4YXR0cgorCS5sb25nIHN5c19yZW1vdmV4YXR0cgkvKiAyMzUgKi8KKwkubG9uZyBzeXNfbHJlbW92ZXhhdHRyCisJLmxvbmcgc3lzX2ZyZW1vdmV4YXR0cgorCS5sb25nIHN5c190a2lsbAorCS5sb25nIHN5c19zZW5kZmlsZTY0CisJLmxvbmcgc3lzX2Z1dGV4CQkvKiAyNDAgKi8KKwkubG9uZyBzeXNfc2NoZWRfc2V0YWZmaW5pdHkKKwkubG9uZyBzeXNfc2NoZWRfZ2V0YWZmaW5pdHkKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAorCS5sb25nIHN5c19uaV9zeXNjYWxsCisJLmxvbmcgc3lzX2lvX3NldHVwCS8qIDI0NSAqLworCS5sb25nIHN5c19pb19kZXN0cm95CisJLmxvbmcgc3lzX2lvX2dldGV2ZW50cworCS5sb25nIHN5c19pb19zdWJtaXQKKwkubG9uZyBzeXNfaW9fY2FuY2VsCisJLmxvbmcgc3lzX2ZhZHZpc2U2NAkvKiAyNTAgKi8KKwkubG9uZyBzeXNfbmlfc3lzY2FsbAorCS5sb25nIHN5c19leGl0X2dyb3VwCisJLmxvbmcgc3lzX2xvb2t1cF9kY29va2llCisJLmxvbmcgc3lzX2Vwb2xsX2NyZWF0ZQorCS5sb25nIHN5c19lcG9sbF9jdGwJLyogMjU1ICovCisJLmxvbmcgc3lzX2Vwb2xsX3dhaXQKKyAJLmxvbmcgc3lzX3JlbWFwX2ZpbGVfcGFnZXMKKyAJLmxvbmcgc3lzX3NldF90aWRfYWRkcmVzcworIAkubG9uZyBzeXNfdGltZXJfY3JlYXRlCisgCS5sb25nIHN5c190aW1lcl9zZXR0aW1lCQkvKiAyNjAgKi8KKyAJLmxvbmcgc3lzX3RpbWVyX2dldHRpbWUKKyAJLmxvbmcgc3lzX3RpbWVyX2dldG92ZXJydW4KKyAJLmxvbmcgc3lzX3RpbWVyX2RlbGV0ZQorIAkubG9uZyBzeXNfY2xvY2tfc2V0dGltZQorIAkubG9uZyBzeXNfY2xvY2tfZ2V0dGltZQkJLyogMjY1ICovCisgCS5sb25nIHN5c19jbG9ja19nZXRyZXMKKyAJLmxvbmcgc3lzX2Nsb2NrX25hbm9zbGVlcAorCS5sb25nIHN5c19zdGF0ZnM2NAorCS5sb25nIHN5c19mc3RhdGZzNjQKKwkubG9uZyBzeXNfdGdraWxsCQkvKiAyNzAgKi8KKwkubG9uZyBzeXNfdXRpbWVzCisgCS5sb25nIHN5c19mYWR2aXNlNjRfNjRfd3JhcHBlcgorCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIFJlc2VydmVkIGZvciB2c2VydmVyICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogUmVzZXJ2ZWQgZm9yIG1iaW5kICovCisJLmxvbmcgc3lzX25pX3N5c2NhbGwJLyogMjc1IC0gZ2V0X21lbXBvbGljeSAqLworCS5sb25nIHN5c19uaV9zeXNjYWxsCS8qIHNldF9tZW1wb2xpY3kgKi8KKwkubG9uZyBzeXNfbXFfb3BlbgorCS5sb25nIHN5c19tcV91bmxpbmsKKwkubG9uZyBzeXNfbXFfdGltZWRzZW5kCisJLmxvbmcgc3lzX21xX3RpbWVkcmVjZWl2ZSAgICAgICAvKiAyODAgKi8KKwkubG9uZyBzeXNfbXFfbm90aWZ5CisJLmxvbmcgc3lzX21xX2dldHNldGF0dHIKKwkubG9uZyBzeXNfa2V4ZWNfbG9hZAorCS5sb25nIHN5c193YWl0aWQKKwkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogMjg1ICovCisJLmxvbmcgc3lzX2FkZF9rZXkKKwkubG9uZyBzeXNfcmVxdWVzdF9rZXkKKwkubG9uZyBzeXNfa2V5Y3RsCisJLmxvbmcgc3lzX2lvcHJpb19zZXQKKwkubG9uZyBzeXNfaW9wcmlvX2dldAkJLyogMjkwICovCisJLmxvbmcgc3lzX2lub3RpZnlfaW5pdAorCS5sb25nIHN5c19pbm90aWZ5X2FkZF93YXRjaAorCS5sb25nIHN5c19pbm90aWZ5X3JtX3dhdGNoCisJLmxvbmcgc3lzX21pZ3JhdGVfcGFnZXMKKwkubG9uZyBzeXNfb3BlbmF0CQkvKiAyOTUgKi8KKwkubG9uZyBzeXNfbWtkaXJhdAorCS5sb25nIHN5c19ta25vZGF0CisJLmxvbmcgc3lzX2ZjaG93bmF0CisJLmxvbmcgc3lzX2Z1dGltZXNhdAorCS5sb25nIHN5c19mc3RhdGF0NjQJCS8qIDMwMCAqLworCS5sb25nIHN5c191bmxpbmthdAorCS5sb25nIHN5c19yZW5hbWVhdAorCS5sb25nIHN5c19saW5rYXQKKwkubG9uZyBzeXNfc3ltbGlua2F0CisJLmxvbmcgc3lzX3JlYWRsaW5rYXQJCS8qIDMwNSAqLworCS5sb25nIHN5c19mY2htb2RhdAorCS5sb25nIHN5c19mYWNjZXNzYXQKKwkubG9uZyBzeXNfcHNlbGVjdDYKKwkubG9uZyBzeXNfcHBvbGwKKwkubG9uZyBzeXNfdW5zaGFyZQkJLyogMzEwICovCisJLmxvbmcgc3lzX3NldF9yb2J1c3RfbGlzdAorCS5sb25nIHN5c19nZXRfcm9idXN0X2xpc3QKKwkubG9uZyBzeXNfc3BsaWNlCisJLmxvbmcgc3lzX3N5bmNfZmlsZV9yYW5nZQorCS5sb25nIHN5c190ZWUJCQkvKiAzMTUgKi8KKwkubG9uZyBzeXNfdm1zcGxpY2UKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3RpbWUuYyBiL2FyY2gvc2gva2VybmVsL3RpbWUuYwppbmRleCBhMTU4OWY4Li4xNDlkOTcxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdGltZS5jCkBAIC0zLDEzICszLDEyIEBACiAgKgogICogIENvcHlyaWdodCAoQykgMTk5OSAgVGV0c3V5YSBPa2FkYSAmIE5paWJlIFl1dGFrYQogICogIENvcHlyaWdodCAoQykgMjAwMCAgUGhpbGlwcCBSdW1wZiA8cHJ1bXBmQHR1eC5vcmc+Ci0gKiAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1ICBQYXVsIE11bmR0CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNiAgUGF1bCBNdW5kdAogICogIENvcHlyaWdodCAoQykgMjAwMiAgTS4gUi4gQnJvd24gIDxtcmJyb3duQGxpbnV4LXNoLm9yZz4KICAqCiAgKiAgU29tZSBjb2RlIHRha2VuIGZyb20gaTM4NiB2ZXJzaW9uLgogICogICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAxOTk1ICBMaW51cyBUb3J2YWxkcwogICovCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CkBAIC0yNiwxNSArMjUsMjAgQEAKIERFRklORV9TUElOTE9DSyhydGNfbG9jayk7CiBFWFBPUlRfU1lNQk9MKHJ0Y19sb2NrKTsKIAotLyogWFhYOiBDYW4gd2UgaW5pdGlhbGl6ZSB0aGlzIGluIGEgcm91dGluZSBzb21ld2hlcmU/ICBEcmVhbWNhc3QgZG9lc24ndCB3YW50Ci0gKiB0aGVzZSByb3V0aW5lcyBhbnl3aGVyZS4uLiAqLwotI2lmZGVmIENPTkZJR19TSF9SVEMKLXZvaWQgKCpydGNfZ2V0X3RpbWUpKHN0cnVjdCB0aW1lc3BlYyAqKSA9IHNoX3J0Y19nZXR0aW1lb2ZkYXk7Ci1pbnQgKCpydGNfc2V0X3RpbWUpKGNvbnN0IHRpbWVfdCkgPSBzaF9ydGNfc2V0dGltZW9mZGF5OwotI2Vsc2UKLXZvaWQgKCpydGNfZ2V0X3RpbWUpKHN0cnVjdCB0aW1lc3BlYyAqKTsKLWludCAoKnJ0Y19zZXRfdGltZSkoY29uc3QgdGltZV90KTsKLSNlbmRpZgorLyogRHVtbXkgUlRDIG9wcyAqLworc3RhdGljIHZvaWQgbnVsbF9ydGNfZ2V0X3RpbWUoc3RydWN0IHRpbWVzcGVjICp0dikKK3sKKwl0di0+dHZfc2VjID0gbWt0aW1lKDIwMDAsIDEsIDEsIDAsIDAsIDApOworCXR2LT50dl9uc2VjID0gMDsKK30KKworc3RhdGljIGludCBudWxsX3J0Y19zZXRfdGltZShjb25zdCB0aW1lX3Qgc2VjcykKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCAoKnJ0Y19zaF9nZXRfdGltZSkoc3RydWN0IHRpbWVzcGVjICopID0gbnVsbF9ydGNfZ2V0X3RpbWU7CitpbnQgKCpydGNfc2hfc2V0X3RpbWUpKGNvbnN0IHRpbWVfdCkgPSBudWxsX3J0Y19zZXRfdGltZTsKIAogLyoKICAqIFNjaGVkdWxlciBjbG9jayAtIHJldHVybnMgY3VycmVudCB0aW1lIGluIG5hbm9zZWMgdW5pdHMuCkBAIC03MCw3ICs3NCw2IEBACiAJdHYtPnR2X3NlYyA9IHNlYzsKIAl0di0+dHZfdXNlYyA9IHVzZWM7CiB9Ci0KIEVYUE9SVF9TWU1CT0woZG9fZ2V0dGltZW9mZGF5KTsKIAogaW50IGRvX3NldHRpbWVvZmRheShzdHJ1Y3QgdGltZXNwZWMgKnR2KQpAQCAtMTAzLDcgKzEwNiw2IEBACiAKIAlyZXR1cm4gMDsKIH0KLQogRVhQT1JUX1NZTUJPTChkb19zZXR0aW1lb2ZkYXkpOwogCiAvKiBsYXN0IHRpbWUgdGhlIFJUQyBjbG9jayBnb3QgdXBkYXRlZCAqLwpAQCAtMTM1LDcgKzEzNyw3IEBACiAJICAgIHh0aW1lLnR2X3NlYyA+IGxhc3RfcnRjX3VwZGF0ZSArIDY2MCAmJgogCSAgICAoeHRpbWUudHZfbnNlYyAvIDEwMDApID49IDUwMDAwMCAtICgodW5zaWduZWQpIFRJQ0tfU0laRSkgLyAyICYmCiAJICAgICh4dGltZS50dl9uc2VjIC8gMTAwMCkgPD0gNTAwMDAwICsgKCh1bnNpZ25lZCkgVElDS19TSVpFKSAvIDIpIHsKLQkJaWYgKHJ0Y19zZXRfdGltZSh4dGltZS50dl9zZWMpID09IDApCisJCWlmIChydGNfc2hfc2V0X3RpbWUoeHRpbWUudHZfc2VjKSA9PSAwKQogCQkJbGFzdF9ydGNfdXBkYXRlID0geHRpbWUudHZfc2VjOwogCQllbHNlCiAJCQkvKiBkbyBpdCBhZ2FpbiBpbiA2MHMgKi8KQEAgLTE0Myw4ICsxNDUsMzMgQEAKIAl9CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK2ludCB0aW1lcl9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc3lzX3RpbWVyICpzeXNfdGltZXIgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgc3lzX3RpbWVyLCBkZXYpOworCisJc3lzX3RpbWVyLT5vcHMtPnN0b3AoKTsKKworCXJldHVybiAwOworfQorCitpbnQgdGltZXJfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHN5c190aW1lciAqc3lzX3RpbWVyID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHN5c190aW1lciwgZGV2KTsKKworCXN5c190aW1lci0+b3BzLT5zdGFydCgpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorI2RlZmluZSB0aW1lcl9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgdGltZXJfcmVzdW1lIE5VTEwKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IHN5c2Rldl9jbGFzcyB0aW1lcl9zeXNjbGFzcyA9IHsKIAlzZXRfa3NldF9uYW1lKCJ0aW1lciIpLAorCS5zdXNwZW5kID0gdGltZXJfc3VzcGVuZCwKKwkucmVzdW1lCSA9IHRpbWVyX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHRpbWVyX2luaXRfc3lzZnModm9pZCkKQEAgLTE1Niw3ICsxODMsNiBAQAogCXN5c190aW1lci0+ZGV2LmNscyA9ICZ0aW1lcl9zeXNjbGFzczsKIAlyZXR1cm4gc3lzZGV2X3JlZ2lzdGVyKCZzeXNfdGltZXItPmRldik7CiB9Ci0KIGRldmljZV9pbml0Y2FsbCh0aW1lcl9pbml0X3N5c2ZzKTsKIAogdm9pZCAoKmJvYXJkX3RpbWVfaW5pdCkodm9pZCk7CkBAIC0xNjgsMTUgKzE5NCw5IEBACiAKIAljbGtfaW5pdCgpOwogCi0JaWYgKHJ0Y19nZXRfdGltZSkgewotCQlydGNfZ2V0X3RpbWUoJnh0aW1lKTsKLQl9IGVsc2UgewotCQl4dGltZS50dl9zZWMgPSBta3RpbWUoMjAwMCwgMSwgMSwgMCwgMCwgMCk7Ci0JCXh0aW1lLnR2X25zZWMgPSAwOwotCX0KLQotICAgICAgICBzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC14dGltZS50dl9zZWMsIC14dGltZS50dl9uc2VjKTsKKwlydGNfc2hfZ2V0X3RpbWUoJnh0aW1lKTsKKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsCisJCQkJLXh0aW1lLnR2X3NlYywgLXh0aW1lLnR2X25zZWMpOwogCiAJLyoKIAkgKiBGaW5kIHRoZSB0aW1lciB0byB1c2UgYXMgdGhlIHN5c3RlbSB0aW1lciwgaXQgd2lsbCBiZQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLXRtdS5jIGIvYXJjaC9zaC9rZXJuZWwvdGltZXJzL3RpbWVyLXRtdS5jCmluZGV4IGQ0MjEyYWQuLjIwNTgxNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3RpbWVycy90aW1lci10bXUuYworKysgYi9hcmNoL3NoL2tlcm5lbC90aW1lcnMvdGltZXItdG11LmMKQEAgLTEzMiwxNyArMTMyLDE3IEBACiAJY3RybF9vdXRsKDB4ZmZmZmZmZmYsIFRNVTBfVENPUik7CiAJY3RybF9vdXRsKDB4ZmZmZmZmZmYsIFRNVTBfVENOVCk7CiAKLQlydGNfZ2V0X3RpbWUoJnRzMik7CisJcnRjX3NoX2dldF90aW1lKCZ0czIpOwogCiAJZG8gewotCQlydGNfZ2V0X3RpbWUoJnRzMSk7CisJCXJ0Y19zaF9nZXRfdGltZSgmdHMxKTsKIAl9IHdoaWxlICh0czEudHZfbnNlYyA9PSB0czIudHZfbnNlYyAmJiB0czEudHZfc2VjID09IHRzMi50dl9zZWMpOwogCiAJLyogYWN0dWFsbHkgc3RhcnQgdGhlIHRpbWVyICovCiAJY3RybF9vdXRiKFRNVV9UU1RSX0lOSVQsIFRNVV9UU1RSKTsKIAogCWRvIHsKLQkJcnRjX2dldF90aW1lKCZ0czIpOworCQlydGNfc2hfZ2V0X3RpbWUoJnRzMik7CiAJfSB3aGlsZSAodHMxLnR2X25zZWMgPT0gdHMyLnR2X25zZWMgJiYgdHMxLnR2X3NlYyA9PSB0czIudHZfc2VjKTsKIAogCWZyZXEgPSAweGZmZmZmZmZmIC0gY3RybF9pbmwoVE1VMF9UQ05UKTsKQEAgLTE4OCw2ICsxODgsMTggQEAKIAkub3BzCQk9ICZ0bXVfY2xrX29wcywKIH07CiAKK3N0YXRpYyBpbnQgdG11X3RpbWVyX3N0YXJ0KHZvaWQpCit7CisJY3RybF9vdXRiKFRNVV9UU1RSX0lOSVQsIFRNVV9UU1RSKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0bXVfdGltZXJfc3RvcCh2b2lkKQoreworCWN0cmxfb3V0YigwLCBUTVVfVFNUUik7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdG11X3RpbWVyX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGludGVydmFsOwpAQCAtMTk3LDcgKzIwOSw3IEBACiAJdG11MF9jbGsucGFyZW50ID0gY2xrX2dldCgibW9kdWxlX2NsayIpOwogCiAJLyogU3RhcnQgVE1VMCAqLwotCWN0cmxfb3V0YigwLCBUTVVfVFNUUik7CisJdG11X3RpbWVyX3N0b3AoKTsKICNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSAmJiAhZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKQogCWN0cmxfb3V0YihUTVVfVE9DUl9JTklULCBUTVVfVE9DUik7CiAjZW5kaWYKQEAgLTIxMSwxMyArMjIzLDE1IEBACiAJY3RybF9vdXRsKGludGVydmFsLCBUTVUwX1RDT1IpOwogCWN0cmxfb3V0bChpbnRlcnZhbCwgVE1VMF9UQ05UKTsKIAotCWN0cmxfb3V0YihUTVVfVFNUUl9JTklULCBUTVVfVFNUUik7CisJdG11X3RpbWVyX3N0YXJ0KCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RydWN0IHN5c190aW1lcl9vcHMgdG11X3RpbWVyX29wcyA9IHsKIAkuaW5pdAkJPSB0bXVfdGltZXJfaW5pdCwKKwkuc3RhcnQJCT0gdG11X3RpbWVyX3N0YXJ0LAorCS5zdG9wCQk9IHRtdV90aW1lcl9zdG9wLAogCS5nZXRfZnJlcXVlbmN5CT0gdG11X3RpbWVyX2dldF9mcmVxdWVuY3ksCiAJLmdldF9vZmZzZXQJPSB0bXVfdGltZXJfZ2V0X29mZnNldCwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHMuYwppbmRleCBkOWRiMTE4Li5jMmM1OTdlIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc2gva2VybmVsL3RyYXBzLmMKQEAgLTM2LDQwICszNiwxNSBAQAogCiAjaWZkZWYgQ09ORklHX1NIX0tHREIKICNpbmNsdWRlIDxhc20va2dkYi5oPgotI2RlZmluZSBDSEtfUkVNT1RFX0RFQlVHKHJlZ3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKChrZ2RiX2RlYnVnX2hvb2sgIT0gKGtnZGJfZGVidWdfaG9va190ICopIE5VTEwpICYmICghdXNlcl9tb2RlKHJlZ3MpKSkgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKCprZ2RiX2RlYnVnX2hvb2spKHJlZ3MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBDSEtfUkVNT1RFX0RFQlVHKHJlZ3MpICAgICAgICAgICAgICAgICAJXAoreyAgICAgICAJCQkJCVwKKwlpZiAoa2dkYl9kZWJ1Z19ob29rICYmICF1c2VyX21vZGUocmVncykpXAorCQkoKmtnZGJfZGVidWdfaG9vaykocmVncyk7ICAgICAgIFwKIH0KICNlbHNlCiAjZGVmaW5lIENIS19SRU1PVEVfREVCVUcocmVncykKICNlbmRpZgogCi0jZGVmaW5lIERPX0VSUk9SKHRyYXBuciwgc2lnbnIsIHN0ciwgbmFtZSwgdHNrKQkJCQlcCi1hc21saW5rYWdlIHZvaWQgZG9fIyNuYW1lKHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCQlcCi0JCQkgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCQlcCi0JCQkgIHN0cnVjdCBwdF9yZWdzIHJlZ3MpCQkJCVwKLXsJCQkJCQkJCQlcCi0JdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlOwkJCQkJXAotIAkJCQkJCQkJCVwKLQkvKiBDaGVjayBpZiBpdCdzIGEgRFNQIGluc3RydWN0aW9uICovCQkJCVwKLSAJaWYgKGlzX2RzcF9pbnN0KCZyZWdzKSkgewkJCQkJXAotCQkvKiBFbmFibGUgRFNQIG1vZGUsIGFuZCByZXN0YXJ0IGluc3RydWN0aW9uLiAqLwkJXAotCQlyZWdzLnNyIHw9IFNSX0RTUDsJCQkJCVwKLQkJcmV0dXJuOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCQkJCQkJCQkJXAotCWFzbSB2b2xhdGlsZSgic3RjCXIyX2JhbmssICUwIjogIj1yIiAoZXJyb3JfY29kZSkpOwlcCi0JbG9jYWxfaXJxX2VuYWJsZSgpOwkJCQkJCVwKLQl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsJCQkJXAotCXRzay0+dGhyZWFkLnRyYXBfbm8gPSB0cmFwbnI7CQkJCQlcCi0gICAgICAgIENIS19SRU1PVEVfREVCVUcoJnJlZ3MpOwkJCQkJXAotCWZvcmNlX3NpZyhzaWduciwgdHNrKTsJCQkJCQlcCi0JZGllX2lmX25vX2ZpeHVwKHN0ciwmcmVncyxlcnJvcl9jb2RlKTsJCQkJXAotfQotCiAjaWZkZWYgQ09ORklHX0NQVV9TSDIKICNkZWZpbmUgVFJBUF9SRVNFUlZFRF9JTlNUCTQKICNkZWZpbmUgVFJBUF9JTExFR0FMX1NMT1RfSU5TVAk2CkBAIC04Niw3ICs2MSw3IEBACiAjZGVmaW5lIFZNQUxMT0NfT0ZGU0VUICg4KjEwMjQqMTAyNCkKICNkZWZpbmUgTU9EVUxFX1JBTkdFICg4KjEwMjQqMTAyNCkKIAotc3BpbmxvY2tfdCBkaWVfbG9jazsKK0RFRklORV9TUElOTE9DSyhkaWVfbG9jayk7CiAKIHZvaWQgZGllKGNvbnN0IGNoYXIgKiBzdHIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnIpCiB7CkBAIC01NzUsOCArNTUwLDExNyBAQAogI2RlZmluZSBpc19kc3BfaW5zdChyZWdzKQkoMCkKICNlbmRpZiAvKiBDT05GSUdfU0hfRFNQICovCiAKLURPX0VSUk9SKFRSQVBfUkVTRVJWRURfSU5TVCwgU0lHSUxMLCAicmVzZXJ2ZWQgaW5zdHJ1Y3Rpb24iLCByZXNlcnZlZF9pbnN0LCBjdXJyZW50KQotRE9fRVJST1IoVFJBUF9JTExFR0FMX1NMT1RfSU5TVCwgU0lHSUxMLCAiaWxsZWdhbCBzbG90IGluc3RydWN0aW9uIiwgaWxsZWdhbF9zbG90X2luc3QsIGN1cnJlbnQpCitleHRlcm4gaW50IGRvX2ZwdV9pbnN0KHVuc2lnbmVkIHNob3J0LCBzdHJ1Y3QgcHRfcmVncyopOworCithc21saW5rYWdlIHZvaWQgZG9fcmVzZXJ2ZWRfaW5zdCh1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkJCXVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCisJCQkJc3RydWN0IHB0X3JlZ3MgcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGVycm9yX2NvZGU7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCisjaWZkZWYgQ09ORklHX1NIX0ZQVV9FTVUKKwl1bnNpZ25lZCBzaG9ydCBpbnN0OworCWludCBlcnI7CisKKwlnZXRfdXNlcihpbnN0LCAodW5zaWduZWQgc2hvcnQqKXJlZ3MucGMpOworCisJZXJyID0gZG9fZnB1X2luc3QoaW5zdCwgJnJlZ3MpOworCWlmICghZXJyKSB7CisJCXJlZ3MucGMgKz0gMjsKKwkJcmV0dXJuOworCX0KKwkvKiBub3QgYSBGUFUgaW5zdC4gKi8KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NIX0RTUAorCS8qIENoZWNrIGlmIGl0J3MgYSBEU1AgaW5zdHJ1Y3Rpb24gKi8KKyAJaWYgKGlzX2RzcF9pbnN0KCZyZWdzKSkgeworCQkvKiBFbmFibGUgRFNQIG1vZGUsIGFuZCByZXN0YXJ0IGluc3RydWN0aW9uLiAqLworCQlyZWdzLnNyIHw9IFNSX0RTUDsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJYXNtIHZvbGF0aWxlKCJzdGMJcjJfYmFuaywgJTAiOiAiPXIiIChlcnJvcl9jb2RlKSk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOworCXRzay0+dGhyZWFkLnRyYXBfbm8gPSBUUkFQX1JFU0VSVkVEX0lOU1Q7CisJQ0hLX1JFTU9URV9ERUJVRygmcmVncyk7CisJZm9yY2Vfc2lnKFNJR0lMTCwgdHNrKTsKKwlkaWVfaWZfbm9fZml4dXAoInJlc2VydmVkIGluc3RydWN0aW9uIiwgJnJlZ3MsIGVycm9yX2NvZGUpOworfQorCisjaWZkZWYgQ09ORklHX1NIX0ZQVV9FTVUKK3N0YXRpYyBpbnQgZW11bGF0ZV9icmFuY2godW5zaWduZWQgc2hvcnQgaW5zdCwgc3RydWN0IHB0X3JlZ3MqIHJlZ3MpCit7CisJLyoKKwkgKiBiZnM6IDhmeHg6IFBDKz1kKjIrNDsKKwkgKiBidHM6IDhkeHg6IFBDKz1kKjIrNDsKKwkgKiBicmE6IGF4eHg6IFBDKz1EKjIrNDsKKwkgKiBic3I6IGJ4eHg6IFBDKz1EKjIrNCAgYWZ0ZXIgUFI9UEMrNDsKKwkgKiBicmFmOjB4MjM6IFBDKz1SbioyKzQ7CisJICogYnNyZjoweDAzOiBQQys9Um4qMis0IGFmdGVyIFBSPVBDKzQ7CisJICogam1wOiA0eDJiOiBQQz1SbjsKKwkgKiBqc3I6IDR4MGI6IFBDPVJuICAgICAgYWZ0ZXIgUFI9UEMrNDsKKwkgKiBydHM6IDAwMGI6IFBDPVBSOworCSAqLworCWlmICgoaW5zdCAmIDB4ZmQwMCkgPT0gMHg4ZDAwKSB7CisJCXJlZ3MtPnBjICs9IFNIX1BDXzhCSVRfT0ZGU0VUKGluc3QpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKGluc3QgJiAweGUwMDApID09IDB4YTAwMCkgeworCQlyZWdzLT5wYyArPSBTSF9QQ18xMkJJVF9PRkZTRVQoaW5zdCk7CisJCXJldHVybiAwOworCX0KKworCWlmICgoaW5zdCAmIDB4ZjBkZikgPT0gMHgwMDAzKSB7CisJCXJlZ3MtPnBjICs9IHJlZ3MtPnJlZ3NbKGluc3QgJiAweDBmMDApID4+IDhdICsgNDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChpbnN0ICYgMHhmMGRmKSA9PSAweDQwMGIpIHsKKwkJcmVncy0+cGMgPSByZWdzLT5yZWdzWyhpbnN0ICYgMHgwZjAwKSA+PiA4XTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChpbnN0ICYgMHhmZmZmKSA9PSAweDAwMGIpIHsKKwkJcmVncy0+cGMgPSByZWdzLT5wcjsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworYXNtbGlua2FnZSB2b2lkIGRvX2lsbGVnYWxfc2xvdF9pbnN0KHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCisJCQkJdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKKwkJCQlzdHJ1Y3QgcHRfcmVncyByZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisjaWZkZWYgQ09ORklHX1NIX0ZQVV9FTVUKKwl1bnNpZ25lZCBzaG9ydCBpbnN0OworCisJZ2V0X3VzZXIoaW5zdCwgKHVuc2lnbmVkIHNob3J0ICopcmVncy5wYyArIDEpOworCWlmICghZG9fZnB1X2luc3QoaW5zdCwgJnJlZ3MpKSB7CisJCWdldF91c2VyKGluc3QsICh1bnNpZ25lZCBzaG9ydCAqKXJlZ3MucGMpOworCQlpZiAoIWVtdWxhdGVfYnJhbmNoKGluc3QsICZyZWdzKSkKKwkJCXJldHVybjsKKwkJLyogZmF1bHQgaW4gYnJhbmNoLiovCisJfQorCS8qIG5vdCBhIEZQVSBpbnN0LiAqLworI2VuZGlmCisKKwlhc20gdm9sYXRpbGUoInN0YwlyMl9iYW5rLCAlMCI6ICI9ciIgKGVycm9yX2NvZGUpKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisJdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IGVycm9yX2NvZGU7CisJdHNrLT50aHJlYWQudHJhcF9ubyA9IFRSQVBfUkVTRVJWRURfSU5TVDsKKwlDSEtfUkVNT1RFX0RFQlVHKCZyZWdzKTsKKwlmb3JjZV9zaWcoU0lHSUxMLCB0c2spOworCWRpZV9pZl9ub19maXh1cCgiaWxsZWdhbCBzbG90IGluc3RydWN0aW9uIiwgJnJlZ3MsIGVycm9yX2NvZGUpOworfQogCiBhc21saW5rYWdlIHZvaWQgZG9fZXhjZXB0aW9uX2Vycm9yKHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCiAJCQkJICAgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKQEAgLTYzNCwxNCArNzE4LDE2IEBACiAJZXhjZXB0aW9uX2hhbmRsaW5nX3RhYmxlW1RSQVBfSUxMRUdBTF9TTE9UX0lOU1RdCiAJCT0gKHZvaWQgKilkb19pbGxlZ2FsX3Nsb3RfaW5zdDsKIAotI2lmZGVmIENPTkZJR19DUFVfU0g0Ci0JaWYgKCEoY3B1X2RhdGEtPmZsYWdzICYgQ1BVX0hBU19GUFUpKSB7Ci0JCS8qIEZvciBTSC00IGxhY2tpbmcgYW4gRlBVLCB0cmVhdCBmbG9hdGluZyBwb2ludCBpbnN0cnVjdGlvbnMKLQkJICAgYXMgcmVzZXJ2ZWQuICovCi0JCS8qIGVudHJ5IDY0IGNvcnJlc3BvbmRzIHRvIEVYUEVWVD0weDgwMCAqLwotCQlleGNlcHRpb25faGFuZGxpbmdfdGFibGVbNjRdID0gKHZvaWQgKilkb19yZXNlcnZlZF9pbnN0OwotCQlleGNlcHRpb25faGFuZGxpbmdfdGFibGVbNjVdID0gKHZvaWQgKilkb19pbGxlZ2FsX3Nsb3RfaW5zdDsKLQl9CisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NINCkgJiYgIWRlZmluZWQoQ09ORklHX1NIX0ZQVSkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX1NIX0ZQVV9FTVUpCisJLyoKKwkgKiBGb3IgU0gtNCBsYWNraW5nIGFuIEZQVSwgdHJlYXQgZmxvYXRpbmcgcG9pbnQgaW5zdHJ1Y3Rpb25zIGFzCisJICogcmVzZXJ2ZWQuIFRoZXknbGwgYmUgaGFuZGxlZCBpbiB0aGUgbWF0aC1lbXUgY2FzZSwgb3IgZmF1bHRlZCBvbgorCSAqIG90aGVyd2lzZS4KKwkgKi8KKwkvKiBlbnRyeSA2NCBjb3JyZXNwb25kcyB0byBFWFBFVlQ9MHg4MDAgKi8KKwlleGNlcHRpb25faGFuZGxpbmdfdGFibGVbNjRdID0gKHZvaWQgKilkb19yZXNlcnZlZF9pbnN0OworCWV4Y2VwdGlvbl9oYW5kbGluZ190YWJsZVs2NV0gPSAodm9pZCAqKWRvX2lsbGVnYWxfc2xvdF9pbnN0OwogI2VuZGlmCiAJCQogCS8qIFNldHVwIFZCUiBmb3IgYm9vdCBjcHUgKi8KQEAgLTY1NSwyMCArNzQxLDEyIEBACiAJdW5zaWduZWQgbG9uZyBtb2R1bGVfZW5kID0gVk1BTExPQ19FTkQ7CiAJaW50IGkgPSAxOwogCi0JaWYgKHRzayAmJiAhc3ApIHsKKwlpZiAoIXRzaykKKwkJdHNrID0gY3VycmVudDsKKwlpZiAodHNrID09IGN1cnJlbnQpCisJCXNwID0gKHVuc2lnbmVkIGxvbmcgKiljdXJyZW50X3N0YWNrX3BvaW50ZXI7CisJZWxzZQogCQlzcCA9ICh1bnNpZ25lZCBsb25nICopdHNrLT50aHJlYWQuc3A7Ci0JfQotCi0JaWYgKCFzcCkgewotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCi0JCQkibW92IHIxNSwgJTBcblx0IgotCQkJInN0YyByN19iYW5rLCAlMVxuXHQiCi0JCQk6ICI9ciIgKG1vZHVsZV9zdGFydCksCi0JCQkgICI9ciIgKG1vZHVsZV9lbmQpCi0JCSk7Ci0JCQotCQlzcCA9ICh1bnNpZ25lZCBsb25nICopbW9kdWxlX3N0YXJ0OwotCX0KIAogCXN0YWNrID0gc3A7CiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3NoL2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IDk1ZmRkOTEuLjVlYjkzMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMiw2ICsyLDcgQEAKICAqIGxkIHNjcmlwdCB0byBtYWtlIFN1cGVySCBMaW51eCBrZXJuZWwKICAqIFdyaXR0ZW4gYnkgTmlpYmUgWXV0YWthCiAgKi8KKyNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oPgogCiAjaWZkZWYgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOCkBAIC0xMyw3ICsxNCw3IEBACiBFTlRSWShfc3RhcnQpCiBTRUNUSU9OUwogewotICAuID0gMHg4MDAwMDAwMCArIENPTkZJR19NRU1PUllfU1RBUlQgKyBDT05GSUdfWkVST19QQUdFX09GRlNFVDsKKyAgLiA9IENPTkZJR19QQUdFX09GRlNFVCArIENPTkZJR19NRU1PUllfU1RBUlQgKyBDT05GSUdfWkVST19QQUdFX09GRlNFVDsKICAgX3RleHQgPSAuOwkJCS8qIFRleHQgYW5kIHJlYWQtb25seSBkYXRhICovCiAgIHRleHQgPSAuOwkJCS8qIFRleHQgYW5kIHJlYWQtb25seSBkYXRhICovCiAgIC5lbXB0eV96ZXJvX3BhZ2UgOiB7CkBAIC00MCwxNiArNDEsMTYgQEAKIAkqKC5kYXRhKQogCiAgCSAvKiBBbGlnbiB0aGUgaW5pdGlhbCByYW1kaXNrIGltYWdlIChJTklUUkQpIG9uIHBhZ2UgYm91bmRhcmllcy4gKi8KLSAJIC4gPSBBTElHTig0MDk2KTsKKyAJIC4gPSBBTElHTihQQUdFX1NJWkUpOwogIAkgX19yZF9zdGFydCA9IC47CiAgCSAqKC5pbml0cmQpCi0gCSAuID0gQUxJR04oNDA5Nik7CisgCSAuID0gQUxJR04oUEFHRV9TSVpFKTsKICAJIF9fcmRfZW5kID0gLjsKIAogCUNPTlNUUlVDVE9SUwogCX0KIAotICAuID0gQUxJR04oNDA5Nik7CisgIC4gPSBBTElHTihQQUdFX1NJWkUpOwogICAuZGF0YS5wYWdlX2FsaWduZWQgOiB7ICooLmRhdGEuaWR0KSB9CiAKICAgLiA9IEFMSUdOKDMyKTsKQEAgLTYwLDEyICs2MSwxMCBAQAogCiAgIF9lZGF0YSA9IC47CQkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLwogCi0gIC4gPSBBTElHTig4MTkyKTsJCS8qIGluaXRfdGFzayAqLworICAuID0gQUxJR04oVEhSRUFEX1NJWkUpOwkJLyogaW5pdF90YXNrICovCiAgIC5kYXRhLmluaXRfdGFzayA6IHsgKiguZGF0YS5pbml0X3Rhc2spIH0KLSAgLyogc3RhY2sgKi8KLSAgLnN0YWNrIDogeyBzdGFjayA9IC47ICBfc3RhY2sgPSAuOyB9CiAKLSAgLiA9IEFMSUdOKDQwOTYpOwkJLyogSW5pdCBjb2RlIGFuZCBkYXRhICovCisgIC4gPSBBTElHTihQQUdFX1NJWkUpOwkJLyogSW5pdCBjb2RlIGFuZCBkYXRhICovCiAgIF9faW5pdF9iZWdpbiA9IC47CiAgIF9zaW5pdHRleHQgPSAuOwogICAuaW5pdC50ZXh0IDogeyAqKC5pbml0LnRleHQpIH0KQEAgLTk2LDcgKzk1LDcgQEAKICAgX19tYWNodmVjX3N0YXJ0ID0gLjsKICAgLmluaXQubWFjaHZlYyA6IHsgKiguaW5pdC5tYWNodmVjKSB9CiAgIF9fbWFjaHZlY19lbmQgPSAuOwotICAuID0gQUxJR04oNDA5Nik7CisgIC4gPSBBTElHTihQQUdFX1NJWkUpOwogICBfX2luaXRfZW5kID0gLjsKIAogICAuID0gQUxJR04oNCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC92c3lzY2FsbC9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL3ZzeXNjYWxsL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYmNlMWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC92c3lzY2FsbC9NYWtlZmlsZQpAQCAtMCwwICsxLDM2IEBACitvYmoteSArPSB2c3lzY2FsbC5vIHZzeXNjYWxsLXN5c2NhbGwubworCiskKG9iaikvdnN5c2NhbGwtc3lzY2FsbC5vOiBcCisJJChmb3JlYWNoIEYsdHJhcGEsJChvYmopL3ZzeXNjYWxsLSRGLnNvKQorCisjIFRlYWNoIGtidWlsZCBhYm91dCB0YXJnZXRzCit0YXJnZXRzICs9ICQoZm9yZWFjaCBGLHRyYXBhLHZzeXNjYWxsLSRGLm8gdnN5c2NhbGwtJEYuc28pCit0YXJnZXRzICs9IHZzeXNjYWxsLW5vdGUubyB2c3lzY2FsbC5sZHMKKworIyBUaGUgRFNPIGltYWdlcyBhcmUgYnVpbHQgdXNpbmcgYSBzcGVjaWFsIGxpbmtlciBzY3JpcHQKK3F1aWV0X2NtZF9zeXNjYWxsID0gU1lTQ0FMTCAkQAorICAgICAgY21kX3N5c2NhbGwgPSAkKENDKSAtbm9zdGRsaWIgJChTWVNDRkxBR1NfJChARikpIFwKKwkJCSAgIC1XbCwtVCwkKGZpbHRlci1vdXQgRk9SQ0UsJF4pIC1vICRACisKK2V4cG9ydCBDUFBGTEFHU192c3lzY2FsbC5sZHMgKz0gLVAgLUMgLVVzaAorCit2c3lzY2FsbC1mbGFncyA9IC1zaGFyZWQgLXMgLVdsLC1zb25hbWU9bGludXgtZ2F0ZS5zby4xIFwKKwkJJChjYWxsIGxkLW9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKKworU1lTQ0ZMQUdTX3ZzeXNjYWxsLXRyYXBhLnNvCT0gJCh2c3lzY2FsbC1mbGFncykKKworJChvYmopL3ZzeXNjYWxsLXRyYXBhLnNvOiBcCiskKG9iaikvdnN5c2NhbGwtJS5zbzogJChzcmMpL3ZzeXNjYWxsLmxkcyAkKG9iaikvdnN5c2NhbGwtJS5vIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsc3lzY2FsbCkKKworIyBXZSBhbHNvIGNyZWF0ZSBhIHNwZWNpYWwgcmVsb2NhdGFibGUgb2JqZWN0IHRoYXQgc2hvdWxkIG1pcnJvciB0aGUgc3ltYm9sCisjIHRhYmxlIGFuZCBsYXlvdXQgb2YgdGhlIGxpbmtlZCBEU08uICBXaXRoIGxkIC1SIHdlIGNhbiB0aGVuIHJlZmVyIHRvCisjIHRoZXNlIHN5bWJvbHMgaW4gdGhlIGtlcm5lbCBjb2RlIHJhdGhlciB0aGFuIGhhbmQtY29kZWQgYWRkcmVzc2VzLgorZXh0cmEteSArPSB2c3lzY2FsbC1zeW1zLm8KKyQob2JqKS9idWlsdC1pbi5vOiAkKG9iaikvdnN5c2NhbGwtc3ltcy5vCiskKG9iaikvYnVpbHQtaW4ubzogbGRfZmxhZ3MgKz0gLVIgJChvYmopL3ZzeXNjYWxsLXN5bXMubworCitTWVNDRkxBR1NfdnN5c2NhbGwtc3ltcy5vID0gLXIKKyQob2JqKS92c3lzY2FsbC1zeW1zLm86ICQoc3JjKS92c3lzY2FsbC5sZHMgXAorCQkJJChvYmopL3ZzeXNjYWxsLXRyYXBhLm8gJChvYmopL3ZzeXNjYWxsLW5vdGUubyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHN5c2NhbGwpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC92c3lzY2FsbC92c3lzY2FsbC1ub3RlLlMgYi9hcmNoL3NoL2tlcm5lbC92c3lzY2FsbC92c3lzY2FsbC1ub3RlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiNWJlNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL3ZzeXNjYWxsL3ZzeXNjYWxsLW5vdGUuUwpAQCAtMCwwICsxLDI1IEBACisvKgorICogVGhpcyBzdXBwbGllcyAubm90ZS4qIHNlY3Rpb25zIHRvIGdvIGludG8gdGhlIFBUX05PVEUgaW5zaWRlIHRoZSB2RFNPIHRleHQuCisgKiBIZXJlIHdlIGNhbiBzdXBwbHkgc29tZSBpbmZvcm1hdGlvbiB1c2VmdWwgdG8gdXNlcmxhbmQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3V0cy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2RlZmluZSBBU01fRUxGX05PVEVfQkVHSU4obmFtZSwgZmxhZ3MsIHZlbmRvciwgdHlwZSkJCQkgICAgICBcCisJLnNlY3Rpb24gbmFtZSwgZmxhZ3M7CQkJCQkJICAgICAgXAorCS5iYWxpZ24gNDsJCQkJCQkJICAgICAgXAorCS5sb25nIDFmIC0gMGY7CQkvKiBuYW1lIGxlbmd0aCAqLwkJCSAgICAgIFwKKwkubG9uZyAzZiAtIDJmOwkJLyogZGF0YSBsZW5ndGggKi8JCQkgICAgICBcCisJLmxvbmcgdHlwZTsJCS8qIG5vdGUgdHlwZSAqLwkJCQkgICAgICBcCiswOgkuYXNjaXogdmVuZG9yOwkJLyogdmVuZG9yIG5hbWUgKi8JCQkgICAgICBcCisxOgkuYmFsaWduIDQ7CQkJCQkJCSAgICAgIFwKKzI6CisKKyNkZWZpbmUgQVNNX0VMRl9OT1RFX0VORAkJCQkJCSAgICAgIFwKKzM6CS5iYWxpZ24gNDsJCS8qIHBhZCBvdXQgc2VjdGlvbiAqLwkJCSAgICAgIFwKKwkucHJldmlvdXMKKworCUFTTV9FTEZfTk9URV9CRUdJTigiLm5vdGUua2VybmVsLXZlcnNpb24iLCAiYSIsIFVUU19TWVNOQU1FLCAwKQorCS5sb25nIExJTlVYX1ZFUlNJT05fQ09ERQorCUFTTV9FTEZfTk9URV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3ZzeXNjYWxsL3ZzeXNjYWxsLXNpZ3JldHVybi5TIGIvYXJjaC9zaC9rZXJuZWwvdnN5c2NhbGwvdnN5c2NhbGwtc2lncmV0dXJuLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1YTY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL3ZzeXNjYWxsL3ZzeXNjYWxsLXNpZ3JldHVybi5TCkBAIC0wLDAgKzEsMzkgQEAKKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKKwkudGV4dAorCS5iYWxpZ24gMzIKKwkuZ2xvYmwgX19rZXJuZWxfc2lncmV0dXJuCisJLnR5cGUgX19rZXJuZWxfc2lncmV0dXJuLEBmdW5jdGlvbgorX19rZXJuZWxfc2lncmV0dXJuOgorLkxTVEFSVF9zaWdyZXR1cm46CisJbW92LncJMWYsIHIzCisJdHJhcGEJIzB4MTAKKwlvcglyMCwgcjAKKwlvcglyMCwgcjAKKwlvcglyMCwgcjAKKwlvcglyMCwgcjAKKwlvcglyMCwgcjAKKworMToJLnNob3J0CV9fTlJfc2lncmV0dXJuCisuTEVORF9zaWdyZXR1cm46CisJLnNpemUgX19rZXJuZWxfc2lncmV0dXJuLC4tLkxTVEFSVF9zaWdyZXR1cm4KKworCS5iYWxpZ24gMzIKKwkuZ2xvYmwgX19rZXJuZWxfcnRfc2lncmV0dXJuCisJLnR5cGUgX19rZXJuZWxfcnRfc2lncmV0dXJuLEBmdW5jdGlvbgorX19rZXJuZWxfcnRfc2lncmV0dXJuOgorLkxTVEFSVF9ydF9zaWdyZXR1cm46CisJbW92LncJMWYsIHIzCisJdHJhcGEJIzB4MTAKKwlvcglyMCwgcjAKKwlvcglyMCwgcjAKKwlvcglyMCwgcjAKKwlvcglyMCwgcjAKKwlvcglyMCwgcjAKKworMToJLnNob3J0CV9fTlJfcnRfc2lncmV0dXJuCisuTEVORF9ydF9zaWdyZXR1cm46CisJLnNpemUgX19rZXJuZWxfcnRfc2lncmV0dXJuLC4tLkxTVEFSVF9ydF9zaWdyZXR1cm4KKworCS5zZWN0aW9uIC5laF9mcmFtZSwiYSIsQHByb2diaXRzCisJLnByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC92c3lzY2FsbC92c3lzY2FsbC1zeXNjYWxsLlMgYi9hcmNoL3NoL2tlcm5lbC92c3lzY2FsbC92c3lzY2FsbC1zeXNjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhYzdmMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL3ZzeXNjYWxsL3ZzeXNjYWxsLXN5c2NhbGwuUwpAQCAtMCwwICsxLDEwIEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCitfX0lOSVREQVRBCisKKwkuZ2xvYmwgdnN5c2NhbGxfdHJhcGFfc3RhcnQsIHZzeXNjYWxsX3RyYXBhX2VuZAordnN5c2NhbGxfdHJhcGFfc3RhcnQ6CisJLmluY2JpbiAiYXJjaC9zaC9rZXJuZWwvdnN5c2NhbGwvdnN5c2NhbGwtdHJhcGEuc28iCit2c3lzY2FsbF90cmFwYV9lbmQ6CisKK19fRklOSVQKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3ZzeXNjYWxsL3ZzeXNjYWxsLXRyYXBhLlMgYi9hcmNoL3NoL2tlcm5lbC92c3lzY2FsbC92c3lzY2FsbC10cmFwYS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNmViMzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC92c3lzY2FsbC92c3lzY2FsbC10cmFwYS5TCkBAIC0wLDAgKzEsNDIgQEAKKwkudGV4dAorCS5nbG9ibCBfX2tlcm5lbF92c3lzY2FsbAorCS50eXBlIF9fa2VybmVsX3ZzeXNjYWxsLEBmdW5jdGlvbgorX19rZXJuZWxfdnN5c2NhbGw6CisuTFNUQVJUX3ZzeXNjYWxsOgorCS8qIFhYWDogV2UnbGwgaGF2ZSB0byBkbyBzb21ldGhpbmcgaGVyZSBvbmNlIHdlIG9wdCB0byB1c2UgdGhlIHZEU08KKwkgKiBwYWdlIGZvciBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc2lnbmFsIHRyYW1wb2xpbmUuLiBhcyB3ZWxsIGFzCisJICogZmlsbCBvdXQgLmVoX2ZyYW1lIC0tIFBGTS4gKi8KKy5MRU5EX3ZzeXNjYWxsOgorCS5zaXplIF9fa2VybmVsX3ZzeXNjYWxsLC4tLkxTVEFSVF92c3lzY2FsbAorCS5wcmV2aW91cworCisJLnNlY3Rpb24gLmVoX2ZyYW1lLCJhIixAcHJvZ2JpdHMKKy5MQ0lFOgorCS51YWxvbmcJLkxDSUVfZW5kIC0gLkxDSUVfc3RhcnQKKy5MQ0lFX3N0YXJ0OgorCS51YWxvbmcJMAkJLyogQ0lFIElEICovCisJLmJ5dGUJMHgxCQkvKiBWZXJzaW9uIG51bWJlciAqLworCS5zdHJpbmcJInpSUyIJCS8qIE5VTC10ZXJtaW5hdGVkIGF1Z21lbnRhdGlvbiBzdHJpbmcgKi8KKwkudWxlYjEyOCAweDEJCS8qIENvZGUgYWxpZ25tZW50IGZhY3RvciAqLworCS5zbGViMTI4IC00CQkvKiBEYXRhIGFsaWdubWVudCBmYWN0b3IgKi8KKwkuYnl0ZQkweDExCQkvKiBSZXR1cm4gYWRkcmVzcyByZWdpc3RlciBjb2x1bW4gKi8KKwkJCQkvKiBBdWdtZW50YXRpb24gbGVuZ3RoIGFuZCBkYXRhIChub25lKSAqLworCS5ieXRlCTB4YwkJLyogRFdfQ0ZBX2RlZl9jZmEgKi8KKwkudWxlYjEyOCAweGYJCS8qIHIxNSAqLworCS51bGViMTI4IDB4MAkJLyogb2Zmc2V0IDAgKi8KKworCS5hbGlnbiAyCisuTENJRV9lbmQ6CisKKwkudWFsb25nCS5MRkRFX2VuZC0uTEZERV9zdGFydAkvKiBMZW5ndGggRkRFICovCisuTEZERV9zdGFydDoKKwkudWFsb25nCS5MQ0lFCQkJLyogQ0lFIHBvaW50ZXIgKi8KKwkudWFsb25nCS5MU1RBUlRfdnN5c2NhbGwtLgkvKiBzdGFydCBhZGRyZXNzICovCisJLnVhbG9uZwkuTEVORF92c3lzY2FsbC0uTFNUQVJUX3ZzeXNjYWxsCisJLnVsZWIxMjggMAorCS5hbGlnbiAyCisuTEZERV9lbmQ6CisJLnByZXZpb3VzCisKKy8qIEdldCB0aGUgY29tbW9uIGNvZGUgZm9yIHRoZSBzaWdyZXR1cm4gZW50cnkgcG9pbnRzICovCisjaW5jbHVkZSAidnN5c2NhbGwtc2lncmV0dXJuLlMiCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC92c3lzY2FsbC92c3lzY2FsbC5jIGIvYXJjaC9zaC9rZXJuZWwvdnN5c2NhbGwvdnN5c2NhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzVkNmNjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvdnN5c2NhbGwvdnN5c2NhbGwuYwpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIGFyY2gvc2gva2VybmVsL3ZzeXNjYWxsLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFBhdWwgTXVuZHQKKyAqCisgKiB2RFNPIHJhbmRvbWl6YXRpb24KKyAqIENvcHlyaWdodChDKSAyMDA1LTIwMDYsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisKKy8qCisgKiBTaG91bGQgdGhlIGtlcm5lbCBtYXAgYSBWRFNPIHBhZ2UgaW50byBwcm9jZXNzZXMgYW5kIHBhc3MgaXRzCisgKiBhZGRyZXNzIGRvd24gdG8gZ2xpYmMgdXBvbiBleGVjKCk/CisgKi8KK3Vuc2lnbmVkIGludCBfX3JlYWRfbW9zdGx5IHZkc29fZW5hYmxlZCA9IDE7CitFWFBPUlRfU1lNQk9MX0dQTCh2ZHNvX2VuYWJsZWQpOworCitzdGF0aWMgaW50IF9faW5pdCB2ZHNvX3NldHVwKGNoYXIgKnMpCit7CisJdmRzb19lbmFibGVkID0gc2ltcGxlX3N0cnRvdWwocywgTlVMTCwgMCk7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJ2ZHNvPSIsIHZkc29fc2V0dXApOworCisvKgorICogVGhlc2Ugc3ltYm9scyBhcmUgZGVmaW5lZCBieSB2c3lzY2FsbC5vIHRvIG1hcmsgdGhlIGJvdW5kcworICogb2YgdGhlIEVMRiBEU08gaW1hZ2VzIGluY2x1ZGVkIHRoZXJlaW4uCisgKi8KK2V4dGVybiBjb25zdCBjaGFyIHZzeXNjYWxsX3RyYXBhX3N0YXJ0LCB2c3lzY2FsbF90cmFwYV9lbmQ7CitzdGF0aWMgdm9pZCAqc3lzY2FsbF9wYWdlOworCitpbnQgX19pbml0IHZzeXNjYWxsX2luaXQodm9pZCkKK3sKKwlzeXNjYWxsX3BhZ2UgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKKworCS8qCisJICogWFhYOiBNYXAgdGhpcyBwYWdlIHRvIGEgZml4bWFwIGVudHJ5IGlmIHdlIGdldCBhcm91bmQKKwkgKiB0byBhZGRpbmcgdGhlIHBhZ2UgdG8gRUxGIGNvcmUgZHVtcHMKKwkgKi8KKworCW1lbWNweShzeXNjYWxsX3BhZ2UsCisJICAgICAgICZ2c3lzY2FsbF90cmFwYV9zdGFydCwKKwkgICAgICAgJnZzeXNjYWxsX3RyYXBhX2VuZCAtICZ2c3lzY2FsbF90cmFwYV9zdGFydCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwYWdlICpzeXNjYWxsX3ZtYV9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50ICp0eXBlKQoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gYWRkcmVzcyAtIHZtYS0+dm1fc3RhcnQ7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAoYWRkcmVzcyA8IHZtYS0+dm1fc3RhcnQgfHwgYWRkcmVzcyA+IHZtYS0+dm1fZW5kKQorCQlyZXR1cm4gTk9QQUdFX1NJR0JVUzsKKworCXBhZ2UgPSB2aXJ0X3RvX3BhZ2Uoc3lzY2FsbF9wYWdlICsgb2Zmc2V0KTsKKworCWdldF9wYWdlKHBhZ2UpOworCisJcmV0dXJuIHBhZ2U7Cit9CisKKy8qIFByZXZlbnQgVk1BIG1lcmdpbmcgKi8KK3N0YXRpYyB2b2lkIHN5c2NhbGxfdm1hX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHN5c2NhbGxfdm1fb3BzID0geworCS5ub3BhZ2UJPSBzeXNjYWxsX3ZtYV9ub3BhZ2UsCisJLmNsb3NlCT0gc3lzY2FsbF92bWFfY2xvc2UsCit9OworCisvKiBTZXR1cCBhIFZNQSBhdCBwcm9ncmFtIHN0YXJ0dXAgZm9yIHRoZSB2c3lzY2FsbCBwYWdlICovCitpbnQgYXJjaF9zZXR1cF9hZGRpdGlvbmFsX3BhZ2VzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0sCisJCQkJaW50IGV4ZWN1dGFibGVfc3RhY2spCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJaW50IHJldDsKKworCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJYWRkciA9IGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIDAsIFBBR0VfU0laRSwgMCwgMCk7CisJaWYgKElTX0VSUl9WQUxVRShhZGRyKSkgeworCQlyZXQgPSBhZGRyOworCQlnb3RvIHVwX2ZhaWw7CisJfQorCisJdm1hID0ga21lbV9jYWNoZV96YWxsb2Modm1fYXJlYV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIXZtYSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHVwX2ZhaWw7CisJfQorCisJdm1hLT52bV9zdGFydCA9IGFkZHI7CisJdm1hLT52bV9lbmQgPSBhZGRyICsgUEFHRV9TSVpFOworCS8qIE1BWVdSSVRFIHRvIGFsbG93IGdkYiB0byBDT1cgYW5kIHNldCBicmVha3BvaW50cyAqLworCXZtYS0+dm1fZmxhZ3MgPSBWTV9SRUFEfFZNX0VYRUN8Vk1fTUFZUkVBRHxWTV9NQVlFWEVDfFZNX01BWVdSSVRFOworCXZtYS0+dm1fZmxhZ3MgfD0gbW0tPmRlZl9mbGFnczsKKwl2bWEtPnZtX3BhZ2VfcHJvdCA9IHByb3RlY3Rpb25fbWFwW3ZtYS0+dm1fZmxhZ3MgJiA3XTsKKwl2bWEtPnZtX29wcyA9ICZzeXNjYWxsX3ZtX29wczsKKwl2bWEtPnZtX21tID0gbW07CisKKwlyZXQgPSBpbnNlcnRfdm1fc3RydWN0KG1tLCB2bWEpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCWttZW1fY2FjaGVfZnJlZSh2bV9hcmVhX2NhY2hlcCwgdm1hKTsKKwkJZ290byB1cF9mYWlsOworCX0KKworCWN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc28gPSAodm9pZCAqKWFkZHI7CisKKwltbS0+dG90YWxfdm0rKzsKK3VwX2ZhaWw6CisJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworY29uc3QgY2hhciAqYXJjaF92bWFfbmFtZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpZiAodm1hLT52bV9tbSAmJiB2bWEtPnZtX3N0YXJ0ID09IChsb25nKXZtYS0+dm1fbW0tPmNvbnRleHQudmRzbykKKwkJcmV0dXJuICJbdmRzb10iOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZ2V0X2dhdGVfdm1hKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGluX2dhdGVfYXJlYShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IGluX2dhdGVfYXJlYV9ub190YXNrKHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3ZzeXNjYWxsL3ZzeXNjYWxsLmxkcy5TIGIvYXJjaC9zaC9rZXJuZWwvdnN5c2NhbGwvdnN5c2NhbGwubGRzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzYzNkNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL3ZzeXNjYWxsL3ZzeXNjYWxsLmxkcy5TCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBMaW5rZXIgc2NyaXB0IGZvciB2c3lzY2FsbCBEU08uICBUaGUgdnN5c2NhbGwgcGFnZSBpcyBhbiBFTEYgc2hhcmVkCisgKiBvYmplY3QgcHJlbGlua2VkIHRvIGl0cyB2aXJ0dWFsIGFkZHJlc3MsIGFuZCB3aXRoIG9ubHkgb25lIHJlYWQtb25seQorICogc2VnbWVudCAodGhhdCBmaXRzIGluIG9uZSBwYWdlKS4gIFRoaXMgc2NyaXB0IGNvbnRyb2xzIGl0cyBsYXlvdXQuCisgKi8KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKworI2lmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgorT1VUUFVUX0ZPUk1BVCgiZWxmMzItc2gtbGludXgiLCAiZWxmMzItc2gtbGludXgiLCAiZWxmMzItc2gtbGludXgiKQorI2Vsc2UKK09VVFBVVF9GT1JNQVQoImVsZjMyLXNoYmlnLWxpbnV4IiwgImVsZjMyLXNoYmlnLWxpbnV4IiwgImVsZjMyLXNoYmlnLWxpbnV4IikKKyNlbmRpZgorT1VUUFVUX0FSQ0goc2gpCisKKy8qIFRoZSBFTEYgZW50cnkgcG9pbnQgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBBVF9TWVNJTkZPIHZhbHVlLiAgKi8KK0VOVFJZKF9fa2VybmVsX3ZzeXNjYWxsKTsKKworU0VDVElPTlMKK3sKKyAgLiA9IFNJWkVPRl9IRUFERVJTOworCisgIC5oYXNoICAgICAgICAgICA6IHsgKiguaGFzaCkgfQkJOnRleHQKKyAgLmdudS5oYXNoICAgICAgIDogeyAqKC5nbnUuaGFzaCkgfQorICAuZHluc3ltICAgICAgICAgOiB7ICooLmR5bnN5bSkgfQorICAuZHluc3RyICAgICAgICAgOiB7ICooLmR5bnN0cikgfQorICAuZ251LnZlcnNpb24gICAgOiB7ICooLmdudS52ZXJzaW9uKSB9CisgIC5nbnUudmVyc2lvbl9kICA6IHsgKiguZ251LnZlcnNpb25fZCkgfQorICAuZ251LnZlcnNpb25fciAgOiB7ICooLmdudS52ZXJzaW9uX3IpIH0KKworICAvKiBUaGlzIGxpbmtlciBzY3JpcHQgaXMgdXNlZCBib3RoIHdpdGggLXIgYW5kIHdpdGggLXNoYXJlZC4KKyAgICAgRm9yIHRoZSBsYXlvdXRzIHRvIG1hdGNoLCB3ZSBuZWVkIHRvIHNraXAgbW9yZSB0aGFuIGVub3VnaAorICAgICBzcGFjZSBmb3IgdGhlIGR5bmFtaWMgc3ltYm9sIHRhYmxlIGV0IGFsLiAgSWYgdGhpcyBhbW91bnQKKyAgICAgaXMgaW5zdWZmaWNpZW50LCBsZCAtc2hhcmVkIHdpbGwgYmFyZi4gIEp1c3QgaW5jcmVhc2UgaXQgaGVyZS4gICovCisgIC4gPSAweDQwMDsKKworICAudGV4dCAgICAgICAgICAgOiB7ICooLnRleHQpIH0JCTp0ZXh0ID0weDkwOTA5MDkwCisgIC5ub3RlCQkgIDogeyAqKC5ub3RlLiopIH0JCTp0ZXh0IDpub3RlCisgIC5laF9mcmFtZV9oZHIgICA6IHsgKiguZWhfZnJhbWVfaGRyKSB9CTp0ZXh0IDplaF9mcmFtZV9oZHIKKyAgLmVoX2ZyYW1lICAgICAgIDogeyBLRUVQICgqKC5laF9mcmFtZSkpIH0JOnRleHQKKyAgLmR5bmFtaWMgICAgICAgIDogeyAqKC5keW5hbWljKSB9CQk6dGV4dCA6ZHluYW1pYworICAudXNlbGVzcyAgICAgICAgOiB7CisgIAkqKC5nb3QucGx0KSAqKC5nb3QpCisJKiguZGF0YSAuZGF0YS4qIC5nbnUubGlua29uY2UuZC4qKQorCSooLmR5bmJzcykKKwkqKC5ic3MgLmJzcy4qIC5nbnUubGlua29uY2UuYi4qKQorICB9CQkJCQkJOnRleHQKK30KKworLyoKKyAqIFdlIG11c3Qgc3VwcGx5IHRoZSBFTEYgcHJvZ3JhbSBoZWFkZXJzIGV4cGxpY2l0bHkgdG8gZ2V0IGp1c3Qgb25lCisgKiBQVF9MT0FEIHNlZ21lbnQsIGFuZCBzZXQgdGhlIGZsYWdzIGV4cGxpY2l0bHkgdG8gbWFrZSBzZWdtZW50cyByZWFkLW9ubHkuCisgKi8KK1BIRFJTCit7CisgIHRleHQgUFRfTE9BRCBGSUxFSERSIFBIRFJTIEZMQUdTKDUpOyAvKiBQRl9SfFBGX1ggKi8KKyAgZHluYW1pYyBQVF9EWU5BTUlDIEZMQUdTKDQpOyAvKiBQRl9SICovCisgIG5vdGUgUFRfTk9URSBGTEFHUyg0KTsgLyogUEZfUiAqLworICBlaF9mcmFtZV9oZHIgMHg2NDc0ZTU1MDsgLyogUFRfR05VX0VIX0ZSQU1FLCBidXQgbGQgZG9lc24ndCBtYXRjaCB0aGUgbmFtZSAqLworfQorCisvKgorICogVGhpcyBjb250cm9scyB3aGF0IHN5bWJvbHMgd2UgZXhwb3J0IGZyb20gdGhlIERTTy4KKyAqLworVkVSU0lPTgoreworICBMSU5VWF8yLjYgeworICAgIGdsb2JhbDoKKyAgICAJX19rZXJuZWxfdnN5c2NhbGw7CisgICAgCV9fa2VybmVsX3NpZ3JldHVybjsKKyAgICAJX19rZXJuZWxfcnRfc2lncmV0dXJuOworCisgICAgbG9jYWw6ICo7CisgIH07Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2xpYi9jaGVja3N1bS5TIGIvYXJjaC9zaC9saWIvY2hlY2tzdW0uUwppbmRleCA3YzUwZGZlLi5jYmRkMGQ0IDEwMDY0NAotLS0gYS9hcmNoL3NoL2xpYi9jaGVja3N1bS5TCisrKyBiL2FyY2gvc2gvbGliL2NoZWNrc3VtLlMKQEAgLTIwMiw4ICsyMDIsOSBAQAogCWNtcC9weglyNgkJISBKdW1wIGlmIHdlIGhhZCBhdCBsZWFzdCB0d28gYnl0ZXMuCiAJYnQvcwkxZgogCSBjbHJ0CisJYWRkCSMyLHI2CQkhIHI2IHdhcyA8IDIuCURlYWwgd2l0aCBpdC4KIAlicmEJNGYKLQkgYWRkCSMyLHI2CQkhIHI2IHdhcyA8IDIuCURlYWwgd2l0aCBpdC4KKwkgbW92CXI2LHIyCiAKIDM6CSEgSGFuZGxlIGRpZmZlcmVudCBzcmMgYW5kIGRlc3QgYWxpZ25tZW50cy4KIAkhIFRoaXMgaXMgbm90IGNvbW1vbiwgc28gc2ltcGxlIGJ5dGUgYnkgYnl0ZSBjb3B5IHdpbGwgZG8uCmRpZmYgLS1naXQgYS9hcmNoL3NoL2xpYi9tZW1jcHktc2g0LlMgYi9hcmNoL3NoL2xpYi9tZW1jcHktc2g0LlMKaW5kZXggZGI2YjczNi4uNTYwYmMxNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9saWIvbWVtY3B5LXNoNC5TCisrKyBiL2FyY2gvc2gvbGliL21lbWNweS1zaDQuUwpAQCAtNzI3LDggKzcyNyw4IEBACiAJbW92LmwJQCgweDA0LHI1KSwgcjExCSEgIDE4IExTIChsYXRlbmN5PTIpCiAJeHRyY3QJcjksIHI4CQkhICA0OCBFWAogCi0JbW92LncJQCgweDAyLHI1KSwgcjEyCSEgIDE4IExTIChsYXRlbmN5PTIpCi0JeHRyY3QJcjEwLCByOQkJISAgNDggRVgKKwltb3YubCAgIEAoMHgwMCxyNSksIHIxMiAhICAxOCBMUyAobGF0ZW5jeT0yKQorICAgIAl4dHJjdAlyMTAsIHI5CQkhICA0OCBFWAogCiAJbW92Y2EubAlyMCxAcjEJCSEgIDQwIExTIChsYXRlbmN5PTMtNykKIAlhZGQJIy0weDFjLCByMQkhICA1MCBFWApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9saWIvbWVtc2V0LlMgYi9hcmNoL3NoL2xpYi9tZW1zZXQuUwppbmRleCA5NTY3MDA5Li5hZjkxZmUyIDEwMDY0NAotLS0gYS9hcmNoL3NoL2xpYi9tZW1zZXQuUworKysgYi9hcmNoL3NoL2xpYi9tZW1zZXQuUwpAQCAtMjksNiArMjksNyBAQAogCWJmL3MJMWIKIAkgbW92LmIJcjUsQC1yNAogMjoJCQkJISBtYWtlIFZWVlYKKwlleHR1LmIJcjUscjUKIAlzd2FwLmIJcjUscjAJCSEgICBWMAogCW9yCXIwLHI1CQkhICAgVlYKIAlzd2FwLncJcjUscjAJCSEgVlYwMApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tYXRoLWVtdS9NYWtlZmlsZSBiL2FyY2gvc2gvbWF0aC1lbXUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4YjM0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL21hdGgtZW11L01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai15CTo9IG1hdGgubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMgYi9hcmNoL3NoL21hdGgtZW11L21hdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmI2MDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9tYXRoLWVtdS9tYXRoLmMKQEAgLTAsMCArMSw2MjQgQEAKKy8qCisgKiBhcmNoL3NoL21hdGgtZW11L21hdGguYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUYWthc2hpIFlPU0hJSSA8dGFrYXNpLXlAb3BzLmR0aS5uZS5qcD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAic2ZwLXV0aWwuaCIKKyNpbmNsdWRlIDxtYXRoLWVtdS9zb2Z0LWZwLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvc2luZ2xlLmg+CisjaW5jbHVkZSA8bWF0aC1lbXUvZG91YmxlLmg+CisKKyNkZWZpbmUJRlBVTAkJKGZyZWdzLT5mcHVsKQorI2RlZmluZSBGUFNDUgkJKGZyZWdzLT5mcHNjcikKKyNkZWZpbmUgRlBTQ1JfUk0JKEZQU0NSJjMpCisjZGVmaW5lIEZQU0NSX0ROCSgoRlBTQ1I+PjE4KSYxKQorI2RlZmluZSBGUFNDUl9QUgkoKEZQU0NSPj4xOSkmMSkKKyNkZWZpbmUgRlBTQ1JfU1oJKChGUFNDUj4+MjApJjEpCisjZGVmaW5lIEZQU0NSX0ZSCSgoRlBTQ1I+PjIxKSYxKQorI2RlZmluZSBGUFNDUl9NQVNLCTB4MDAzZmZmZmZVTAorCisjZGVmaW5lIEJBTksobikJKG5eKEZQU0NSX0ZSPzE2OjApKQorI2RlZmluZSBGUgkoKHVuc2lnbmVkIGxvbmcqKShmcmVncy0+ZnBfcmVncykpCisjZGVmaW5lIEZSMAkoRlJbQkFOSygwKV0pCisjZGVmaW5lIEZSbgkoRlJbQkFOSyhuKV0pCisjZGVmaW5lIEZSbQkoRlJbQkFOSyhtKV0pCisjZGVmaW5lIERSCSgodW5zaWduZWQgbG9uZyBsb25nKikoZnJlZ3MtPmZwX3JlZ3MpKQorI2RlZmluZSBEUm4JKERSW0JBTksobikvMl0pCisjZGVmaW5lIERSbQkoRFJbQkFOSyhtKS8yXSkKKworI2RlZmluZSBYUkVHKG4pCShuXjE2KQorI2RlZmluZSBYRm4JKEZSW0JBTksoWFJFRyhuKSldKQorI2RlZmluZSBYRm0JKEZSW0JBTksoWFJFRyhtKSldKQorI2RlZmluZSBYRG4JKERSW0JBTksoWFJFRyhuKSkvMl0pCisjZGVmaW5lIFhEbQkoRFJbQkFOSyhYUkVHKG0pKS8yXSkKKworI2RlZmluZSBSMAkocmVncy0+cmVnc1swXSkKKyNkZWZpbmUgUm4JKHJlZ3MtPnJlZ3Nbbl0pCisjZGVmaW5lIFJtCShyZWdzLT5yZWdzW21dKQorCisjZGVmaW5lIFdSSVRFKGQsYSkJKHtpZihwdXRfdXNlcihkLCAodHlwZW9mIChkKSopYSkpIHJldHVybiAtRUZBVUxUO30pCisjZGVmaW5lIFJFQUQoZCxhKQkoe2lmKGdldF91c2VyKGQsICh0eXBlb2YgKGQpKilhKSkgcmV0dXJuIC1FRkFVTFQ7fSkKKworI2RlZmluZSBQQUNLX1MocixmKQlGUF9QQUNLX1NQKCZyLGYpCisjZGVmaW5lIFVOUEFDS19TKGYscikJRlBfVU5QQUNLX1NQKGYsJnIpCisjZGVmaW5lIFBBQ0tfRChyLGYpIFwKKwl7dTMyIHRbMl07IEZQX1BBQ0tfRFAodCxmKTsgKCh1MzIqKSZyKVswXT10WzFdOyAoKHUzMiopJnIpWzFdPXRbMF07fQorI2RlZmluZSBVTlBBQ0tfRChmLHIpIFwKKwl7dTMyIHRbMl07IHRbMF09KCh1MzIqKSZyKVsxXTsgdFsxXT0oKHUzMiopJnIpWzBdOyBGUF9VTlBBQ0tfRFAoZix0KTt9CisKKy8vIDIgYXJncyBpbnN0cnVjdGlvbnMuCisjZGVmaW5lIEJPVEhfUFJtbihvcCx4KSBcCisJRlBfREVDTF9FWDsgaWYoRlBTQ1JfUFIpIG9wKEQseCxEUm0sRFJuKTsgZWxzZSBvcChTLHgsRlJtLEZSbik7CisKKyNkZWZpbmUgQ01QX1goU1osUixNLE4pIGRveyBcCisJRlBfREVDTF8jI1NaKEZtKTsgRlBfREVDTF8jI1NaKEZuKTsgXAorCVVOUEFDS18jI1NaKEZtLCBNKTsgVU5QQUNLXyMjU1ooRm4sIE4pOyBcCisJRlBfQ01QXyMjU1ooUiwgRm4sIEZtLCAyKTsgfXdoaWxlKDApCisjZGVmaW5lIEVRX1goU1osUixNLE4pIGRveyBcCisJRlBfREVDTF8jI1NaKEZtKTsgRlBfREVDTF8jI1NaKEZuKTsgXAorCVVOUEFDS18jI1NaKEZtLCBNKTsgVU5QQUNLXyMjU1ooRm4sIE4pOyBcCisJRlBfQ01QX0VRXyMjU1ooUiwgRm4sIEZtKTsgfXdoaWxlKDApCisjZGVmaW5lIENNUChPUCkgKHsgaW50IHI7IEJPVEhfUFJtbihPUCMjX1gscik7IHI7IH0pCisKK3N0YXRpYyBpbnQKK2ZjbXBfZ3Qoc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgbSwgaW50IG4pCit7CisJaWYgKENNUChDTVApID4gMCkKKwkJcmVncy0+c3IgfD0gMTsKKwllbHNlCisJCXJlZ3MtPnNyICY9IH4xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ZjbXBfZXEoc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgbSwgaW50IG4pCit7CisJaWYgKENNUChDTVAgLypFUSovKSA9PSAwKQorCQlyZWdzLT5zciB8PSAxOworCWVsc2UKKwkJcmVncy0+c3IgJj0gfjE7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQVJJVEhfWChTWixPUCxNLE4pIGRveyBcCisJRlBfREVDTF8jI1NaKEZtKTsgRlBfREVDTF8jI1NaKEZuKTsgRlBfREVDTF8jI1NaKEZyKTsgXAorCVVOUEFDS18jI1NaKEZtLCBNKTsgVU5QQUNLXyMjU1ooRm4sIE4pOyBcCisJRlBfIyNPUCMjXyMjU1ooRnIsIEZuLCBGbSk7IFwKKwlQQUNLXyMjU1ooTiwgRnIpOyB9d2hpbGUoMCkKKworc3RhdGljIGludAorZmFkZChzdHJ1Y3Qgc2hfZnB1X3NvZnRfc3RydWN0ICpmcmVncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBtLCBpbnQgbikKK3sKKwlCT1RIX1BSbW4oQVJJVEhfWCwgQUREKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZnN1YihzdHJ1Y3Qgc2hfZnB1X3NvZnRfc3RydWN0ICpmcmVncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBtLCBpbnQgbikKK3sKKwlCT1RIX1BSbW4oQVJJVEhfWCwgU1VCKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZm11bChzdHJ1Y3Qgc2hfZnB1X3NvZnRfc3RydWN0ICpmcmVncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBtLCBpbnQgbikKK3sKKwlCT1RIX1BSbW4oQVJJVEhfWCwgTVVMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZmRpdihzdHJ1Y3Qgc2hfZnB1X3NvZnRfc3RydWN0ICpmcmVncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBtLCBpbnQgbikKK3sKKwlCT1RIX1BSbW4oQVJJVEhfWCwgRElWKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZm1hYyhzdHJ1Y3Qgc2hfZnB1X3NvZnRfc3RydWN0ICpmcmVncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBtLCBpbnQgbikKK3sKKwlGUF9ERUNMX0VYOworCUZQX0RFQ0xfUyhGcik7CisJRlBfREVDTF9TKEZ0KTsKKwlGUF9ERUNMX1MoRjApOworCUZQX0RFQ0xfUyhGbSk7CisJRlBfREVDTF9TKEZuKTsKKwlVTlBBQ0tfUyhGMCwgRlIwKTsKKwlVTlBBQ0tfUyhGbSwgRlJtKTsKKwlVTlBBQ0tfUyhGbiwgRlJuKTsKKwlGUF9NVUxfUyhGdCwgRm0sIEYwKTsKKwlGUF9BRERfUyhGciwgRm4sIEZ0KTsKKwlQQUNLX1MoRlJuLCBGcik7CisJcmV0dXJuIDA7Cit9CisKKy8vIHRvIHByb2Nlc3MgZm1vdidzIGV4dGVudGlvbiAob2RkIG4gZm9yIERSIGFjY2VzcyBYRCkuCisjZGVmaW5lIEZNT1ZfRVhUKHgpIGlmKHgmMSkgeCs9MTYtMQorCitzdGF0aWMgaW50CitmbW92X2lkeF9yZWcoc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgbSwKKwkgICAgIGludCBuKQoreworCWlmIChGUFNDUl9TWikgeworCQlGTU9WX0VYVChuKTsKKwkJUkVBRChGUm4sIFJtICsgUjAgKyA0KTsKKwkJbisrOworCQlSRUFEKEZSbiwgUm0gKyBSMCk7CisJfSBlbHNlIHsKKwkJUkVBRChGUm4sIFJtICsgUjApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitmbW92X21lbV9yZWcoc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgbSwKKwkgICAgIGludCBuKQoreworCWlmIChGUFNDUl9TWikgeworCQlGTU9WX0VYVChuKTsKKwkJUkVBRChGUm4sIFJtICsgNCk7CisJCW4rKzsKKwkJUkVBRChGUm4sIFJtKTsKKwl9IGVsc2UgeworCQlSRUFEKEZSbiwgUm0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitmbW92X2luY19yZWcoc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgbSwKKwkgICAgIGludCBuKQoreworCWlmIChGUFNDUl9TWikgeworCQlGTU9WX0VYVChuKTsKKwkJUkVBRChGUm4sIFJtICsgNCk7CisJCW4rKzsKKwkJUkVBRChGUm4sIFJtKTsKKwkJUm0gKz0gODsKKwl9IGVsc2UgeworCQlSRUFEKEZSbiwgUm0pOworCQlSbSArPSA0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitmbW92X3JlZ19pZHgoc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgbSwKKwkgICAgIGludCBuKQoreworCWlmIChGUFNDUl9TWikgeworCQlGTU9WX0VYVChtKTsKKwkJV1JJVEUoRlJtLCBSbiArIFIwICsgNCk7CisJCW0rKzsKKwkJV1JJVEUoRlJtLCBSbiArIFIwKTsKKwl9IGVsc2UgeworCQlXUklURShGUm0sIFJuICsgUjApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitmbW92X3JlZ19tZW0oc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgbSwKKwkgICAgIGludCBuKQoreworCWlmIChGUFNDUl9TWikgeworCQlGTU9WX0VYVChtKTsKKwkJV1JJVEUoRlJtLCBSbiArIDQpOworCQltKys7CisJCVdSSVRFKEZSbSwgUm4pOworCX0gZWxzZSB7CisJCVdSSVRFKEZSbSwgUm4pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitmbW92X3JlZ19kZWMoc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgbSwKKwkgICAgIGludCBuKQoreworCWlmIChGUFNDUl9TWikgeworCQlGTU9WX0VYVChtKTsKKwkJUm4gLT0gODsKKwkJV1JJVEUoRlJtLCBSbiArIDQpOworCQltKys7CisJCVdSSVRFKEZSbSwgUm4pOworCX0gZWxzZSB7CisJCVJuIC09IDQ7CisJCVdSSVRFKEZSbSwgUm4pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitmbW92X3JlZ19yZWcoc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgbSwKKwkgICAgIGludCBuKQoreworCWlmIChGUFNDUl9TWikgeworCQlGTU9WX0VYVChtKTsKKwkJRk1PVl9FWFQobik7CisJCURSbiA9IERSbTsKKwl9IGVsc2UgeworCQlGUm4gPSBGUm07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2Zub3BfbW4oc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgbSwgaW50IG4pCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8vIDEgYXJnIGluc3RydWN0aW9ucy4KKyNkZWZpbmUgTk9UWUVUbihpKSBzdGF0aWMgaW50IGkoc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIGludCBuKSBcCisJeyBwcmludGsoICNpICIgbm90IHlldCBkb25lLlxuIik7IHJldHVybiAwOyB9CisKK05PVFlFVG4oZnRydikKK05PVFlFVG4oZnNxcnQpCitOT1RZRVRuKGZpcHIpCitOT1RZRVRuKGZzY2EpCitOT1RZRVRuKGZzcnJhKQorCisjZGVmaW5lIEVNVV9GTE9BVF9YKFNaLE4pIGRvIHsgXAorCUZQX0RFQ0xfIyNTWihGbik7IFwKKwlGUF9GUk9NX0lOVF8jI1NaKEZuLCBGUFVMLCAzMiwgaW50KTsgXAorCVBBQ0tfIyNTWihOLCBGbik7IH13aGlsZSgwKQorc3RhdGljIGludCBmZmxvYXQoc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIGludCBuKQoreworCUZQX0RFQ0xfRVg7CisKKwlpZiAoRlBTQ1JfUFIpCisJCUVNVV9GTE9BVF9YKEQsIERSbik7CisJZWxzZQorCQlFTVVfRkxPQVRfWChTLCBGUm4pOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRU1VX0ZUUkNfWChTWixOKSBkbyB7IFwKKwlGUF9ERUNMXyMjU1ooRm4pOyBcCisJVU5QQUNLXyMjU1ooRm4sIE4pOyBcCisJRlBfVE9fSU5UXyMjU1ooRlBVTCwgRm4sIDMyLCAxKTsgfXdoaWxlKDApCitzdGF0aWMgaW50IGZ0cmMoc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIGludCBuKQoreworCUZQX0RFQ0xfRVg7CisKKwlpZiAoRlBTQ1JfUFIpCisJCUVNVV9GVFJDX1goRCwgRFJuKTsKKwllbHNlCisJCUVNVV9GVFJDX1goUywgRlJuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZjbnZzZChzdHJ1Y3Qgc2hfZnB1X3NvZnRfc3RydWN0ICpmcmVncywgaW50IG4pCit7CisJRlBfREVDTF9FWDsKKwlGUF9ERUNMX1MoRm4pOworCUZQX0RFQ0xfRChGcik7CisJVU5QQUNLX1MoRm4sIEZQVUwpOworCUZQX0NPTlYoRCwgUywgMiwgMSwgRnIsIEZuKTsKKwlQQUNLX0QoRFJuLCBGcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmNudmRzKHN0cnVjdCBzaF9mcHVfc29mdF9zdHJ1Y3QgKmZyZWdzLCBpbnQgbikKK3sKKwlGUF9ERUNMX0VYOworCUZQX0RFQ0xfRChGbik7CisJRlBfREVDTF9TKEZyKTsKKwlVTlBBQ0tfRChGbiwgRFJuKTsKKwlGUF9DT05WKFMsIEQsIDEsIDIsIEZyLCBGbik7CisJUEFDS19TKEZQVUwsIEZyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmeGNoZyhzdHJ1Y3Qgc2hfZnB1X3NvZnRfc3RydWN0ICpmcmVncywgaW50IGZsYWcpCit7CisJRlBTQ1IgXj0gZmxhZzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmc3RzKHN0cnVjdCBzaF9mcHVfc29mdF9zdHJ1Y3QgKmZyZWdzLCBpbnQgbikKK3sKKwlGUm4gPSBGUFVMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsZHMoc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIGludCBuKQoreworCUZQVUwgPSBGUm47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZm5lZyhzdHJ1Y3Qgc2hfZnB1X3NvZnRfc3RydWN0ICpmcmVncywgaW50IG4pCit7CisJRlJuIF49ICgxIDw8IChfRlBfV19UWVBFX1NJWkUgLSAxKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmFicyhzdHJ1Y3Qgc2hfZnB1X3NvZnRfc3RydWN0ICpmcmVncywgaW50IG4pCit7CisJRlJuICY9IH4oMSA8PCAoX0ZQX1dfVFlQRV9TSVpFIC0gMSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsZDAoc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIGludCBuKQoreworCUZSbiA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmxkMShzdHJ1Y3Qgc2hfZnB1X3NvZnRfc3RydWN0ICpmcmVncywgaW50IG4pCit7CisJRlJuID0gKF9GUF9FWFBCSUFTX1MgPDwgKF9GUF9GUkFDQklUU19TIC0gMSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZub3BfbihzdHJ1Y3Qgc2hfZnB1X3NvZnRfc3RydWN0ICpmcmVncywgaW50IG4pCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8vLyBJbnN0cnVjdGlvbiBkZWNvZGVycy4KKworc3RhdGljIGludCBpZF9meGZkKHN0cnVjdCBzaF9mcHVfc29mdF9zdHJ1Y3QgKiwgaW50KTsKK3N0YXRpYyBpbnQgaWRfZm54ZChzdHJ1Y3Qgc2hfZnB1X3NvZnRfc3RydWN0ICosIHN0cnVjdCBwdF9yZWdzICosIGludCwgaW50KTsKKworc3RhdGljIGludCAoKmZueGRbXSkoc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqLCBpbnQpID0geworCWZzdHMsIGZsZHMsIGZmbG9hdCwgZnRyYywgZm5lZywgZmFicywgZnNxcnQsIGZzcnJhLAorCWZsZDAsIGZsZDEsIGZjbnZzZCwgZmNudmRzLCBmbm9wX24sIGZub3BfbiwgZmlwciwgaWRfZnhmZAorfTsKKworc3RhdGljIGludCAoKmZubXhbXSkoc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqLCBzdHJ1Y3QgcHRfcmVncyAqLCBpbnQsIGludCkgPSB7CisJZmFkZCwgZnN1YiwgZm11bCwgZmRpdiwgZmNtcF9lcSwgZmNtcF9ndCwgZm1vdl9pZHhfcmVnLCBmbW92X3JlZ19pZHgsCisJZm1vdl9tZW1fcmVnLCBmbW92X2luY19yZWcsIGZtb3ZfcmVnX21lbSwgZm1vdl9yZWdfZGVjLAorCWZtb3ZfcmVnX3JlZywgaWRfZm54ZCwgZm1hYywgZm5vcF9tbn07CisKK3N0YXRpYyBpbnQgaWRfZnhmZChzdHJ1Y3Qgc2hfZnB1X3NvZnRfc3RydWN0ICpmcmVncywgaW50IHgpCit7CisJY29uc3QgaW50IGZsYWdbXSA9IHsgRlBTQ1JfU1osIEZQU0NSX1BSLCBGUFNDUl9GUiwgMCB9OworCXN3aXRjaCAoeCAmIDMpIHsKKwljYXNlIDM6CisJCWZ4Y2hnKGZyZWdzLCBmbGFnW3ggPj4gMl0pOworCQlicmVhazsKKwljYXNlIDE6CisJCWZ0cnYoZnJlZ3MsIHggLSAxKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnNjYShmcmVncywgeCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpZF9mbnhkKHN0cnVjdCBzaF9mcHVfc29mdF9zdHJ1Y3QgKmZyZWdzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHgsIGludCBuKQoreworCXJldHVybiAoZm54ZFt4XSkoZnJlZ3MsIG4pOworfQorCitzdGF0aWMgaW50CitpZF9mbm14KHN0cnVjdCBzaF9mcHVfc29mdF9zdHJ1Y3QgKmZyZWdzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdTE2IGNvZGUpCit7CisJaW50IG4gPSAoY29kZSA+PiA4KSAmIDB4ZiwgbSA9IChjb2RlID4+IDQpICYgMHhmLCB4ID0gY29kZSAmIDB4ZjsKKwlyZXR1cm4gKGZubXhbeF0pKGZyZWdzLCByZWdzLCBtLCBuKTsKK30KKworc3RhdGljIGludAoraWRfc3lzKHN0cnVjdCBzaF9mcHVfc29mdF9zdHJ1Y3QgKmZyZWdzLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdTE2IGNvZGUpCit7CisJaW50IG4gPSAoKGNvZGUgPj4gOCkgJiAweGYpOworCXVuc2lnbmVkIGxvbmcgKnJlZyA9IChjb2RlICYgMHgwMDEwKSA/ICZGUFVMIDogJkZQU0NSOworCisJc3dpdGNoIChjb2RlICYgMHhmMGZmKSB7CisJY2FzZSAweDAwNWE6CisJY2FzZSAweDAwNmE6CisJCVJuID0gKnJlZzsKKwkJYnJlYWs7CisJY2FzZSAweDQwNWE6CisJY2FzZSAweDQwNmE6CisJCSpyZWcgPSBSbjsKKwkJYnJlYWs7CisJY2FzZSAweDQwNTI6CisJY2FzZSAweDQwNjI6CisJCVJuIC09IDQ7CisJCVdSSVRFKCpyZWcsIFJuKTsKKwkJYnJlYWs7CisJY2FzZSAweDQwNTY6CisJY2FzZSAweDQwNjY6CisJCVJFQUQoKnJlZywgUm4pOworCQlSbiArPSA0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmcHVfZW11bGF0ZSh1MTYgY29kZSwgc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCAqZnJlZ3MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmICgoY29kZSAmIDB4ZjAwMCkgPT0gMHhmMDAwKQorCQlyZXR1cm4gaWRfZm5teChmcmVncywgcmVncywgY29kZSk7CisJZWxzZQorCQlyZXR1cm4gaWRfc3lzKGZyZWdzLCByZWdzLCBjb2RlKTsKK30KKworLyoqCisgKglkZW5vcm1hbF90b19kb3VibGUgLSBHaXZlbiBkZW5vcm1hbGl6ZWQgZmxvYXQgbnVtYmVyLAorICoJICAgICAgICAgICAgICAgICAgICAgc3RvcmUgZG91YmxlIGZsb2F0CisgKgorICoJQGZwdTogUG9pbnRlciB0byBzaF9mcHVfaGFyZCBzdHJ1Y3R1cmUKKyAqCUBuOiBJbmRleCB0byBGUCByZWdpc3RlcgorICovCitzdGF0aWMgdm9pZCBkZW5vcm1hbF90b19kb3VibGUoc3RydWN0IHNoX2ZwdV9oYXJkX3N0cnVjdCAqZnB1LCBpbnQgbikKK3sKKwl1bnNpZ25lZCBsb25nIGR1LCBkbDsKKwl1bnNpZ25lZCBsb25nIHggPSBmcHUtPmZwdWw7CisJaW50IGV4cCA9IDEwMjMgLSAxMjY7CisKKwlpZiAoeCAhPSAwICYmICh4ICYgMHg3ZjgwMDAwMCkgPT0gMCkgeworCQlkdSA9ICh4ICYgMHg4MDAwMDAwMCk7CisJCXdoaWxlICgoeCAmIDB4MDA4MDAwMDApID09IDApIHsKKwkJCXggPDw9IDE7CisJCQlleHAtLTsKKwkJfQorCQl4ICY9IDB4MDA3ZmZmZmY7CisJCWR1IHw9IChleHAgPDwgMjApIHwgKHggPj4gMyk7CisJCWRsID0geCA8PCAyOTsKKworCQlmcHUtPmZwX3JlZ3Nbbl0gPSBkdTsKKwkJZnB1LT5mcF9yZWdzW24rMV0gPSBkbDsKKwl9Cit9CisKKy8qKgorICoJaWVlZV9mcGVfaGFuZGxlciAtIEhhbmRsZSBkZW5vcm1hbGl6ZWQgbnVtYmVyIGV4Y2VwdGlvbgorICoKKyAqCUByZWdzOiBQb2ludGVyIHRvIHJlZ2lzdGVyIHN0cnVjdHVyZQorICoKKyAqCVJldHVybnMgMSB3aGVuIGl0J3MgaGFuZGxlZCAoc2hvdWxkIG5vdCBjYXVzZSBleGNlcHRpb24pLgorICovCitzdGF0aWMgaW50IGllZWVfZnBlX2hhbmRsZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgc2hvcnQgaW5zbiA9ICoodW5zaWduZWQgc2hvcnQgKilyZWdzLT5wYzsKKwl1bnNpZ25lZCBzaG9ydCBmaW5zbjsKKwl1bnNpZ25lZCBsb25nIG5leHRwYzsKKwlpbnQgbmliWzRdID0geworCQkoaW5zbiA+PiAxMikgJiAweGYsCisJCShpbnNuID4+IDgpICYgMHhmLAorCQkoaW5zbiA+PiA0KSAmIDB4ZiwKKwkJaW5zbiAmIDB4Zn07CisKKwlpZiAobmliWzBdID09IDB4YiB8fAorCSAgICAobmliWzBdID09IDB4NCAmJiBuaWJbMl0gPT0gMHgwICYmIG5pYlszXSA9PSAweGIpKSAvKiBic3IgJiBqc3IgKi8KKwkJcmVncy0+cHIgPSByZWdzLT5wYyArIDQ7CisKKwlpZiAobmliWzBdID09IDB4YSB8fCBuaWJbMF0gPT0gMHhiKSB7IC8qIGJyYSAmIGJzciAqLworCQluZXh0cGMgPSByZWdzLT5wYyArIDQgKyAoKHNob3J0KSAoKGluc24gJiAweGZmZikgPDwgNCkgPj4gMyk7CisJCWZpbnNuID0gKih1bnNpZ25lZCBzaG9ydCAqKSAocmVncy0+cGMgKyAyKTsKKwl9IGVsc2UgaWYgKG5pYlswXSA9PSAweDggJiYgbmliWzFdID09IDB4ZCkgeyAvKiBidC9zICovCisJCWlmIChyZWdzLT5zciAmIDEpCisJCQluZXh0cGMgPSByZWdzLT5wYyArIDQgKyAoKGNoYXIpIChpbnNuICYgMHhmZikgPDwgMSk7CisJCWVsc2UKKwkJCW5leHRwYyA9IHJlZ3MtPnBjICsgNDsKKwkJZmluc24gPSAqKHVuc2lnbmVkIHNob3J0ICopIChyZWdzLT5wYyArIDIpOworCX0gZWxzZSBpZiAobmliWzBdID09IDB4OCAmJiBuaWJbMV0gPT0gMHhmKSB7IC8qIGJmL3MgKi8KKwkJaWYgKHJlZ3MtPnNyICYgMSkKKwkJCW5leHRwYyA9IHJlZ3MtPnBjICsgNDsKKwkJZWxzZQorCQkJbmV4dHBjID0gcmVncy0+cGMgKyA0ICsgKChjaGFyKSAoaW5zbiAmIDB4ZmYpIDw8IDEpOworCQlmaW5zbiA9ICoodW5zaWduZWQgc2hvcnQgKikgKHJlZ3MtPnBjICsgMik7CisJfSBlbHNlIGlmIChuaWJbMF0gPT0gMHg0ICYmIG5pYlszXSA9PSAweGIgJiYKKwkJIChuaWJbMl0gPT0gMHgwIHx8IG5pYlsyXSA9PSAweDIpKSB7IC8qIGptcCAmIGpzciAqLworCQluZXh0cGMgPSByZWdzLT5yZWdzW25pYlsxXV07CisJCWZpbnNuID0gKih1bnNpZ25lZCBzaG9ydCAqKSAocmVncy0+cGMgKyAyKTsKKwl9IGVsc2UgaWYgKG5pYlswXSA9PSAweDAgJiYgbmliWzNdID09IDB4MyAmJgorCQkgKG5pYlsyXSA9PSAweDAgfHwgbmliWzJdID09IDB4MikpIHsgLyogYnJhZiAmIGJzcmYgKi8KKwkJbmV4dHBjID0gcmVncy0+cGMgKyA0ICsgcmVncy0+cmVnc1tuaWJbMV1dOworCQlmaW5zbiA9ICoodW5zaWduZWQgc2hvcnQgKikgKHJlZ3MtPnBjICsgMik7CisJfSBlbHNlIGlmIChpbnNuID09IDB4MDAwYikgeyAvKiBydHMgKi8KKwkJbmV4dHBjID0gcmVncy0+cHI7CisJCWZpbnNuID0gKih1bnNpZ25lZCBzaG9ydCAqKSAocmVncy0+cGMgKyAyKTsKKwl9IGVsc2UgeworCQluZXh0cGMgPSByZWdzLT5wYyArIDI7CisJCWZpbnNuID0gaW5zbjsKKwl9CisKKwlpZiAoKGZpbnNuICYgMHhmMWZmKSA9PSAweGYwYWQpIHsgLyogZmNudnNkICovCisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKworCQlpZiAoKHRzay0+dGhyZWFkLmZwdS5oYXJkLmZwc2NyICYgKDEgPDwgMTcpKSkgeworCQkJLyogRlBVIGVycm9yICovCisJCQlkZW5vcm1hbF90b19kb3VibGUgKCZ0c2stPnRocmVhZC5mcHUuaGFyZCwKKwkJCQkJICAgIChmaW5zbiA+PiA4KSAmIDB4Zik7CisJCQl0c2stPnRocmVhZC5mcHUuaGFyZC5mcHNjciAmPQorCQkJCX4oRlBTQ1JfQ0FVU0VfTUFTSyB8IEZQU0NSX0ZMQUdfTUFTSyk7CisJCQlzZXRfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX1VTRURGUFUpOworCQl9IGVsc2UgeworCQkJdHNrLT50aHJlYWQudHJhcF9ubyA9IDExOworCQkJdHNrLT50aHJlYWQuZXJyb3JfY29kZSA9IDA7CisJCQlmb3JjZV9zaWcoU0lHRlBFLCB0c2spOworCQl9CisKKwkJcmVncy0+cGMgPSBuZXh0cGM7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCithc21saW5rYWdlIHZvaWQgZG9fZnB1X2Vycm9yKHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCisJCQkgICAgIHN0cnVjdCBwdF9yZWdzIHJlZ3MpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCisJaWYgKGllZWVfZnBlX2hhbmRsZXIgKCZyZWdzKSkKKwkJcmV0dXJuOworCisJcmVncy5wYyArPSAyOworCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxMTsKKwl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gMDsKKwlmb3JjZV9zaWcoU0lHRlBFLCB0c2spOworfQorCisvKioKKyAqIGZwdV9pbml0IC0gSW5pdGlhbGl6ZSBGUFUgcmVnaXN0ZXJzCisgKiBAZnB1OiBQb2ludGVyIHRvIHNvZnR3YXJlIGVtdWxhdGVkIEZQVSByZWdpc3RlcnMuCisgKi8KK3N0YXRpYyB2b2lkIGZwdV9pbml0KHN0cnVjdCBzaF9mcHVfc29mdF9zdHJ1Y3QgKmZwdSkKK3sKKwlpbnQgaTsKKworCWZwdS0+ZnBzY3IgPSBGUFNDUl9JTklUOworCWZwdS0+ZnB1bCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlmcHUtPmZwX3JlZ3NbaV0gPSAwOworCQlmcHUtPnhmcF9yZWdzW2ldPSAwOworCX0KK30KKworLyoqCisgKiBkb19mcHVfaW5zdCAtIEhhbmRsZSByZXNlcnZlZCBpbnN0cnVjdGlvbnMgZm9yIEZQVSBlbXVsYXRpb24KKyAqIEBpbnN0OiBpbnN0cnVjdGlvbiBjb2RlLgorICogQHJlZ3M6IHJlZ2lzdGVycyBvbiBzdGFjay4KKyAqLworaW50IGRvX2ZwdV9pbnN0KHVuc2lnbmVkIHNob3J0IGluc3QsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwlzdHJ1Y3Qgc2hfZnB1X3NvZnRfc3RydWN0ICpmcHUgPSAmKHRzay0+dGhyZWFkLmZwdS5zb2Z0KTsKKworCWlmICghdGVzdF90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfVVNFREZQVSkpIHsKKwkJLyogaW5pdGlhbGl6ZSBvbmNlLiAqLworCQlmcHVfaW5pdChmcHUpOworCQlzZXRfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX1VTRURGUFUpOworCX0KKworCXJldHVybiBmcHVfZW11bGF0ZShpbnN0LCBmcHUsIHJlZ3MpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tYXRoLWVtdS9zZnAtdXRpbC5oIGIvYXJjaC9zaC9tYXRoLWVtdS9zZnAtdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZTFiZDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL21hdGgtZW11L3NmcC11dGlsLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIFRoZXNlIGFyZSBjb3BpZWQgZnJvbSBnbGliYy9zdGRsaWIvbG9uZ2xvbmcuaAorICovCisKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVVd0eXBlIF9feDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX194ID0gKGFsKSArIChibCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHNoKSA9IChhaCkgKyAoYmgpICsgKF9feCA8IChhbCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHNsKSA9IF9feDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVVd0eXBlIF9feDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX194ID0gKGFsKSAtIChibCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHNoKSA9IChhaCkgLSAoYmgpIC0gKF9feCA+IChhbCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHNsKSA9IF9feDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorICBfX2FzbV9fICgiZG11bHUubCAlMiwlM1xuXHRzdHMgICAgbWFjbCwlMVxuXHRzdHMgIG1hY2gsJTAiCVwKKwk6ICI9ciIgKCh1MzIpKHcxKSksICI9ciIgKCh1MzIpKHcwKSkJXAorCTogICJyIiAoKHUzMikodSkpLCAgICJyIiAoKHUzMikodikpCVwKKwk6ICJtYWNsIiwgIm1hY2giKQorCisjZGVmaW5lIF9fbGxfQiAoKFVXdHlwZSkgMSA8PCAoV19UWVBFX1NJWkUgLyAyKSkKKyNkZWZpbmUgX19sbF9sb3dwYXJ0KHQpICgoVVd0eXBlKSAodCkgJiAoX19sbF9CIC0gMSkpCisjZGVmaW5lIF9fbGxfaGlnaHBhcnQodCkgKChVV3R5cGUpICh0KSA+PiAoV19UWVBFX1NJWkUgLyAyKSkKKworI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorICBkbyB7CQkJCQkJCQkJXAorICAgIFVXdHlwZSBfX2QxLCBfX2QwLCBfX3ExLCBfX3EwOwkJCQkJXAorICAgIFVXdHlwZSBfX3IxLCBfX3IwLCBfX207CQkJCQkJXAorICAgIF9fZDEgPSBfX2xsX2hpZ2hwYXJ0IChkKTsJCQkJCQlcCisgICAgX19kMCA9IF9fbGxfbG93cGFydCAoZCk7CQkJCQkJXAorCQkJCQkJCQkJXAorICAgIF9fcjEgPSAobjEpICUgX19kMTsJCQkJCQkJXAorICAgIF9fcTEgPSAobjEpIC8gX19kMTsJCQkJCQkJXAorICAgIF9fbSA9IChVV3R5cGUpIF9fcTEgKiBfX2QwOwkJCQkJCVwKKyAgICBfX3IxID0gX19yMSAqIF9fbGxfQiB8IF9fbGxfaGlnaHBhcnQgKG4wKTsJCQkJXAorICAgIGlmIChfX3IxIDwgX19tKQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCV9fcTEtLSwgX19yMSArPSAoZCk7CQkJCQkJXAorCWlmIChfX3IxID49IChkKSkgLyogaS5lLiB3ZSBkaWRuJ3QgZ2V0IGNhcnJ5IHdoZW4gYWRkaW5nIHRvIF9fcjEgKi9cCisJICBpZiAoX19yMSA8IF9fbSkJCQkJCQlcCisJICAgIF9fcTEtLSwgX19yMSArPSAoZCk7CQkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIF9fcjEgLT0gX19tOwkJCQkJCQlcCisJCQkJCQkJCQlcCisgICAgX19yMCA9IF9fcjEgJSBfX2QxOwkJCQkJCQlcCisgICAgX19xMCA9IF9fcjEgLyBfX2QxOwkJCQkJCQlcCisgICAgX19tID0gKFVXdHlwZSkgX19xMCAqIF9fZDA7CQkJCQkJXAorICAgIF9fcjAgPSBfX3IwICogX19sbF9CIHwgX19sbF9sb3dwYXJ0IChuMCk7CQkJCVwKKyAgICBpZiAoX19yMCA8IF9fbSkJCQkJCQkJXAorICAgICAgewkJCQkJCQkJCVwKKwlfX3EwLS0sIF9fcjAgKz0gKGQpOwkJCQkJCVwKKwlpZiAoX19yMCA+PSAoZCkpCQkJCQkJXAorCSAgaWYgKF9fcjAgPCBfX20pCQkJCQkJXAorCSAgICBfX3EwLS0sIF9fcjAgKz0gKGQpOwkJCQkJXAorICAgICAgfQkJCQkJCQkJCVwKKyAgICBfX3IwIC09IF9fbTsJCQkJCQkJXAorCQkJCQkJCQkJXAorICAgIChxKSA9IChVV3R5cGUpIF9fcTEgKiBfX2xsX0IgfCBfX3EwOwkJCQlcCisgICAgKHIpID0gX19yMDsJCQkJCQkJCVwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBhYm9ydCgpCXJldHVybiAwCisKKyNkZWZpbmUgX19CWVRFX09SREVSIF9fTElUVExFX0VORElBTgorCisKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vS2NvbmZpZyBiL2FyY2gvc2gvbW0vS2NvbmZpZwppbmRleCBmYjU4NmIxLi45ZGQ2MDY0IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL0tjb25maWcKKysrIGIvYXJjaC9zaC9tbS9LY29uZmlnCkBAIC0yMCw3ICsyMCwxMCBAQAogY29uZmlnIENQVV9TSDRBCiAJYm9vbAogCXNlbGVjdCBDUFVfU0g0Ci0Jc2VsZWN0IENQVV9IQVNfSU5UQzJfSVJRCisKK2NvbmZpZyBDUFVfU0g0QUxfRFNQCisJYm9vbAorCXNlbGVjdCBDUFVfU0g0QQogCiBjb25maWcgQ1BVX1NVQlRZUEVfU1Q0MAogCWJvb2wKQEAgLTQ4LDYgKzUxLDEyIEBACiAJc2VsZWN0IENQVV9TSDMKIAlzZWxlY3QgQ1BVX0hBU19QSU5UX0lSUQogCitjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzA2CisJYm9vbCAiU3VwcG9ydCBTSDc3MDYgcHJvY2Vzc29yIgorCXNlbGVjdCBDUFVfU0gzCisJaGVscAorCSAgU2VsZWN0IFNINzcwNiBpZiB5b3UgaGF2ZSBhIDEzMyBNaHogU0gtMyBIRDY0MTc3MDYgQ1BVLgorCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzA3CiAJYm9vbCAiU3VwcG9ydCBTSDc3MDcgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gzCkBAIC02OSw2ICs3OCwxMiBAQAogCWhlbHAKIAkgIFNlbGVjdCBTSDc3MDkgaWYgeW91IGhhdmUgYSAgODAgTWh6IFNILTMgSEQ2NDE3NzA5IENQVS4KIAorY29uZmlnIENQVV9TVUJUWVBFX1NINzcxMAorCWJvb2wgIlN1cHBvcnQgU0g3NzEwIHByb2Nlc3NvciIKKwlzZWxlY3QgQ1BVX1NIMworCWhlbHAKKwkgIFNlbGVjdCBTSDc3MTAgaWYgeW91IGhhdmUgYSBTSDMtRFNQIFNINzcxMCBDUFUuCisKIGNvbW1lbnQgIlNILTQgUHJvY2Vzc29yIFN1cHBvcnQiCiAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3NTAKQEAgLTEzMywxMCArMTQ4LDYgQEAKIAogY29tbWVudCAiU0gtNEEgUHJvY2Vzc29yIFN1cHBvcnQiCiAKLWNvbmZpZyBDUFVfU1VCVFlQRV9TSDczMTgwCi0JYm9vbCAiU3VwcG9ydCBTSDczMTgwIHByb2Nlc3NvciIKLQlzZWxlY3QgQ1BVX1NINEEKLQogY29uZmlnIENQVV9TVUJUWVBFX1NINzc3MAogCWJvb2wgIlN1cHBvcnQgU0g3NzcwIHByb2Nlc3NvciIKIAlzZWxlY3QgQ1BVX1NINEEKQEAgLTE0NCw2ICsxNTUsMTcgQEAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3ODAKIAlib29sICJTdXBwb3J0IFNINzc4MCBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDRBCisJc2VsZWN0IENQVV9IQVNfSU5UQzJfSVJRCisKK2NvbW1lbnQgIlNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydCIKKworY29uZmlnIENQVV9TVUJUWVBFX1NINzMxODAKKwlib29sICJTdXBwb3J0IFNINzMxODAgcHJvY2Vzc29yIgorCXNlbGVjdCBDUFVfU0g0QUxfRFNQCisKK2NvbmZpZyBDUFVfU1VCVFlQRV9TSDczNDMKKwlib29sICJTdXBwb3J0IFNINzM0MyBwcm9jZXNzb3IiCisJc2VsZWN0IENQVV9TSDRBTF9EU1AKIAogZW5kbWVudQogCkBAIC0xNjEsMTUgKzE4Myw1OSBAQAogCSAgdHVybmluZyB0aGlzIG9mZiB3aWxsIGJvb3QgdGhlIGtlcm5lbCBvbiB0aGVzZSBtYWNoaW5lcyB3aXRoIHRoZQogCSAgTU1VIGltcGxpY2l0bHkgc3dpdGNoZWQgb2ZmLgogCitjb25maWcgUEFHRV9PRkZTRVQKKwloZXgKKwlkZWZhdWx0ICIweDgwMDAwMDAwIiBpZiBNTVUKKwlkZWZhdWx0ICIweDAwMDAwMDAwIgorCitjb25maWcgTUVNT1JZX1NUQVJUCisJaGV4ICJQaHlzaWNhbCBtZW1vcnkgc3RhcnQgYWRkcmVzcyIKKwlkZWZhdWx0ICIweDA4MDAwMDAwIgorCS0tLWhlbHAtLS0KKwkgIENvbXB1dGVycyBidWlsdCB3aXRoIEhpdGFjaGkgU3VwZXJIIHByb2Nlc3NvcnMgYWx3YXlzCisJICBtYXAgdGhlIFJPTSBzdGFydGluZyBhdCBhZGRyZXNzIHplcm8uICBCdXQgdGhlIHByb2Nlc3NvcgorCSAgZG9lcyBub3Qgc3BlY2lmeSB0aGUgcmFuZ2UgdGhhdCBSQU0gdGFrZXMuCisKKwkgIFRoZSBwaHlzaWNhbCBtZW1vcnkgKFJBTSkgc3RhcnQgYWRkcmVzcyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKKwkgIHNldCB0byAwODAwMDAwMC4gT3RoZXIgcGxhdGZvcm1zLCBzdWNoIGFzIHRoZSBTb2x1dGlvbiBFbmdpbmUKKwkgIGJvYXJkcyB0eXBpY2FsbHkgbWFwIFJBTSBhdCAwQzAwMDAwMC4KKworCSAgVHdlYWsgdGhpcyBvbmx5IHdoZW4gcG9ydGluZyB0byBhIG5ldyBtYWNoaW5lIHdoaWNoIGRvZXMgbm90CisJICBhbHJlYWR5IGhhdmUgYSBkZWZjb25maWcuIENoYW5naW5nIGl0IGZyb20gdGhlIGtub3duIGNvcnJlY3QKKwkgIHZhbHVlIG9uIGFueSBvZiB0aGUga25vd24gc3lzdGVtcyB3aWxsIG9ubHkgbGVhZCB0byBkaXNhc3Rlci4KKworY29uZmlnIE1FTU9SWV9TSVpFCisJaGV4ICJQaHlzaWNhbCBtZW1vcnkgc2l6ZSIKKwlkZWZhdWx0ICIweDAwNDAwMDAwIgorCWhlbHAKKwkgIFRoaXMgc2V0cyB0aGUgZGVmYXVsdCBtZW1vcnkgc2l6ZSBhc3N1bWVkIGJ5IHlvdXIgU0gga2VybmVsLiBJdCBjYW4KKwkgIGJlIG92ZXJyaWRkZW4gYXMgbm9ybWFsIGJ5IHRoZSAnbWVtPScgYXJndW1lbnQgb24gdGhlIGtlcm5lbCBjb21tYW5kCisJICBsaW5lLiBJZiB1bnN1cmUsIGNvbnN1bHQgeW91ciBib2FyZCBzcGVjaWZpY2F0aW9ucyBvciBqdXN0IGxlYXZlIGl0CisJICBhcyAweDAwNDAwMDAwIHdoaWNoIHdhcyB0aGUgZGVmYXVsdCB2YWx1ZSBiZWZvcmUgdGhpcyBiZWNhbWUKKwkgIGNvbmZpZ3VyYWJsZS4KKwogY29uZmlnIDMyQklUCiAJYm9vbCAiU3VwcG9ydCAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzc2luZyB0aHJvdWdoIFBNQiIKLQlkZXBlbmRzIG9uIENQVV9TSDRBCisJZGVwZW5kcyBvbiBDUFVfU0g0QSAmJiBNTVUKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgcGh5c2ljYWwgYWRkcmVzc2luZyB3aWxsIGJlIGV4dGVuZGVkIHRvCiAJICAzMi1iaXRzIHRocm91Z2ggdGhlIFNILTRBIFBNQi4gSWYgdGhpcyBpcyBub3Qgc2V0LCBsZWdhY3kKIAkgIDI5LWJpdCBwaHlzaWNhbCBhZGRyZXNzaW5nIHdpbGwgYmUgdXNlZC4KIAorY29uZmlnIFZTWVNDQUxMCisJYm9vbCAiU3VwcG9ydCB2c3lzY2FsbCBwYWdlIgorCWRlcGVuZHMgb24gTU1VCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyB3aWxsIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUga2VybmVsIG1hcHBpbmcgYSB2RFNPIHBhZ2UKKwkgIGluIHByb2Nlc3Mgc3BhY2UsIGFuZCBzdWJzZXF1ZW50bHkgaGFuZGluZyBkb3duIHRoZSBlbnRyeSBwb2ludAorCSAgdG8gdGhlIGxpYmMgdGhyb3VnaCB0aGUgRUxGIGF1eGlsaWFyeSB2ZWN0b3IuCisKKwkgIEZyb20gdGhlIGtlcm5lbCBzaWRlIHRoaXMgaXMgdXNlZCBmb3IgdGhlIHNpZ25hbCB0cmFtcG9saW5lLgorCSAgRm9yIHN5c3RlbXMgd2l0aCBhbiBNTVUgdGhhdCBjYW4gYWZmb3JkIHRvIGdpdmUgdXAgYSBwYWdlLAorCSAgKHRoZSBkZWZhdWx0IHZhbHVlKSBzYXkgWS4KKwogY2hvaWNlCiAJcHJvbXB0ICJIdWdlVExCIHBhZ2Ugc2l6ZSIKIAlkZXBlbmRzIG9uIEhVR0VUTEJfUEFHRSAmJiBDUFVfU0g0ICYmIE1NVQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9NYWtlZmlsZSBiL2FyY2gvc2gvbW0vTWFrZWZpbGUKaW5kZXggOTQ4OWExNC4uM2ZmZDdmNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9NYWtlZmlsZQorKysgYi9hcmNoL3NoL21tL01ha2VmaWxlCkBAIC02LDIwICs2LDI2IEBACiAKIG9iai0kKENPTkZJR19DUFVfU0gyKQkrPSBjYWNoZS1zaDIubwogb2JqLSQoQ09ORklHX0NQVV9TSDMpCSs9IGNhY2hlLXNoMy5vCi1vYmotJChDT05GSUdfQ1BVX1NINCkJKz0gY2FjaGUtc2g0Lm8gcGctc2g0Lm8KK29iai0kKENPTkZJR19DUFVfU0g0KQkrPSBjYWNoZS1zaDQubwogCiBvYmotJChDT05GSUdfRE1BX1BBR0VfT1BTKQkrPSBwZy1kbWEubwogb2JqLSQoQ09ORklHX0hVR0VUTEJfUEFHRSkJKz0gaHVnZXRsYnBhZ2UubwogCiBtbXUteQkJCTo9IGZhdWx0LW5vbW11Lm8gdGxiLW5vbW11Lm8gcGctbm9tbXUubwotbW11LSQoQ09ORklHX01NVSkJOj0gZmF1bHQubyBjbGVhcl9wYWdlLm8gY29weV9wYWdlLm8KK21tdS0kKENPTkZJR19NTVUpCTo9IGZhdWx0Lm8gY2xlYXJfcGFnZS5vIGNvcHlfcGFnZS5vIHRsYi1mbHVzaC5vCVwKKwkJCSAgIGlvcmVtYXAubwogCiBvYmoteQkJCSs9ICQobW11LXkpCiAKK2lmZGVmIENPTkZJR19ERUJVR19GUworb2JqLSQoQ09ORklHX0NQVV9TSDQpCQkrPSBjYWNoZS1kZWJ1Z2ZzLm8KK2VuZGlmCisKIGlmZGVmIENPTkZJR19NTVUKLW9iai0kKENPTkZJR19DUFVfU0gzKQkrPSB0bGItc2gzLm8KLW9iai0kKENPTkZJR19DUFVfU0g0KQkrPSB0bGItc2g0Lm8gaW9yZW1hcC5vCitvYmotJChDT05GSUdfQ1BVX1NIMykJCSs9IHRsYi1zaDMubworb2JqLSQoQ09ORklHX0NQVV9TSDQpCQkrPSB0bGItc2g0Lm8gcGctc2g0Lm8KIG9iai0kKENPTkZJR19TSDc3MDVfQ0FDSEVfMzJLQikgKz0gcGctc2g3NzA1Lm8KIGVuZGlmCiAKLW9iai0kKENPTkZJR19TSDc3MDVfQ0FDSEVfMzJLQikgKz0gY2FjaGUtc2g3NzA1Lm8KK29iai0kKENPTkZJR19TSDc3MDVfQ0FDSEVfMzJLQikJKz0gY2FjaGUtc2g3NzA1Lm8KK29iai0kKENPTkZJR18zMkJJVCkJCSs9IHBtYi5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2NhY2hlLWRlYnVnZnMuYyBiL2FyY2gvc2gvbW0vY2FjaGUtZGVidWdmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMmQ5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL21tL2NhY2hlLWRlYnVnZnMuYwpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIGRlYnVnZnMgb3BzIGZvciB0aGUgTDEgY2FjaGUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKK2VudW0gY2FjaGVfdHlwZSB7CisJQ0FDSEVfVFlQRV9JQ0FDSEUsCisJQ0FDSEVfVFlQRV9EQ0FDSEUsCisJQ0FDSEVfVFlQRV9VTklGSUVELAorfTsKKworc3RhdGljIGludCBjYWNoZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmZpbGUsIHZvaWQgKml0ZXIpCit7CisJdW5zaWduZWQgaW50IGNhY2hlX3R5cGUgPSAodW5zaWduZWQgaW50KWZpbGUtPnByaXZhdGU7CisJc3RydWN0IGNhY2hlX2luZm8gKmNhY2hlOworCXVuc2lnbmVkIGludCB3YXlzaXplLCB3YXksIGNhY2hlX3NpemU7CisJdW5zaWduZWQgbG9uZyBjY3IsIGJhc2U7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgYWRkcnN0YXJ0ID0gMDsKKworCS8qCisJICogR28gdW5jYWNoZWQgaW1tZWRpYXRlbHkgc28gd2UgZG9uJ3Qgc2tldyB0aGUgcmVzdWx0cyBhbnkKKwkgKiBtb3JlIHRoYW4gd2UgYWxyZWFkeSBhcmUuLgorCSAqLworCWp1bXBfdG9fUDIoKTsKKworCWNjciA9IGN0cmxfaW5sKENDUik7CisJaWYgKChjY3IgJiBDQ1JfQ0FDSEVfRU5BQkxFKSA9PSAwKSB7CisJCWJhY2tfdG9fUDEoKTsKKworCQlzZXFfcHJpbnRmKGZpbGUsICJkaXNhYmxlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChjYWNoZV90eXBlID09IENBQ0hFX1RZUEVfRENBQ0hFKSB7CisJCWJhc2UgPSBDQUNIRV9PQ19BRERSRVNTX0FSUkFZOworCQljYWNoZSA9ICZjcHVfZGF0YS0+ZGNhY2hlOworCX0gZWxzZSB7CisJCWJhc2UgPSBDQUNIRV9JQ19BRERSRVNTX0FSUkFZOworCQljYWNoZSA9ICZjcHVfZGF0YS0+aWNhY2hlOworCX0KKworCS8qCisJICogRHVlIHRvIHRoZSBhbW91bnQgb2YgZGF0YSB3cml0dGVuIG91dCAoZGVwZW5kaW5nIG9uIHRoZSBjYWNoZSBzaXplKSwKKwkgKiB3ZSBtYXkgYmUgaXRlcmF0ZWQgb3ZlciBtdWx0aXBsZSB0aW1lcy4gSW4gdGhpcyBjYXNlLCBrZWVwIHRyYWNrIG9mCisJICogdGhlIGVudHJ5IHBvc2l0aW9uIGluIGFkZHJzdGFydCwgYW5kIHJld2luZCBpdCB3aGVuIHdlJ3ZlIGhpdCB0aGUKKwkgKiBlbmQgb2YgdGhlIGNhY2hlLgorCSAqCisJICogTGlrZXdpc2UsIHRoZSBzYW1lIGNvZGUgaXMgdXNlZCBmb3IgbXVsdGlwbGUgY2FjaGVzLCBzbyBjYXJlIG11c3QKKwkgKiBiZSB0YWtlbiBmb3IgYm91bmNpbmcgYWRkcnN0YXJ0IGJhY2sgYW5kIGZvcnRoIHNvIHRoZSBhcHByb3ByaWF0ZQorCSAqIGNhY2hlIGlzIGhpdC4KKwkgKi8KKwljYWNoZV9zaXplID0gY2FjaGUtPndheXMgKiBjYWNoZS0+c2V0cyAqIGNhY2hlLT5saW5lc3o7CisJaWYgKCgoYWRkcnN0YXJ0ICYgMHhmZjAwMDAwMCkgIT0gYmFzZSkgfHwKKwkgICAgIChhZGRyc3RhcnQgJiAweDAwZmZmZmZmKSA+IGNhY2hlX3NpemUpCisJCWFkZHJzdGFydCA9IGJhc2U7CisKKwl3YXlzaXplID0gY2FjaGUtPnNldHM7CisKKwkvKgorCSAqIElmIHRoZSBPQyBpcyBhbHJlYWR5IGluIFJBTSBtb2RlLCB3ZSBvbmx5IGhhdmUKKwkgKiBoYWxmIG9mIHRoZSBlbnRyaWVzIHRvIGNvbnNpZGVyLi4KKwkgKi8KKwlpZiAoKGNjciAmIENDUl9DQUNIRV9PUkEpICYmIGNhY2hlX3R5cGUgPT0gQ0FDSEVfVFlQRV9EQ0FDSEUpCisJCXdheXNpemUgPj49IDE7CisKKwl3YXlzaXplIDw8PSBjYWNoZS0+ZW50cnlfc2hpZnQ7CisKKwlmb3IgKHdheSA9IDA7IHdheSA8IGNhY2hlLT53YXlzOyB3YXkrKykgeworCQl1bnNpZ25lZCBsb25nIGFkZHI7CisJCXVuc2lnbmVkIGludCBsaW5lOworCisJCXNlcV9wcmludGYoZmlsZSwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJc2VxX3ByaW50ZihmaWxlLCAiV2F5ICVkXG4iLCB3YXkpOworCQlzZXFfcHJpbnRmKGZpbGUsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisKKwkJZm9yIChhZGRyID0gYWRkcnN0YXJ0LCBsaW5lID0gMDsKKwkJICAgICBhZGRyIDwgYWRkcnN0YXJ0ICsgd2F5c2l6ZTsKKwkJICAgICBhZGRyICs9IGNhY2hlLT5saW5lc3osIGxpbmUrKykgeworCQkJdW5zaWduZWQgbG9uZyBkYXRhID0gY3RybF9pbmwoYWRkcik7CisKKwkJCS8qIENoZWNrIHRoZSBWIGJpdCwgaWdub3JlIGludmFsaWQgY2FjaGVsaW5lcyAqLworCQkJaWYgKChkYXRhICYgMSkgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJLyogVTogRGlydHksIGNhY2hlIHRhZyBpcyAxMCBiaXRzIHVwICovCisJCQlzZXFfcHJpbnRmKGZpbGUsICIlM2Q6ICVjIDB4JWx4XG4iLAorCQkJCSAgIGxpbmUsIGRhdGEgJiAyID8gJ1UnIDogJyAnLAorCQkJCSAgIGRhdGEgJiAweDFmZmZmYzAwKTsKKwkJfQorCisJCWFkZHJzdGFydCArPSBjYWNoZS0+d2F5X2luY3I7CisJfQorCisJYmFja190b19QMSgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FjaGVfZGVidWdmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBjYWNoZV9zZXFfc2hvdywgaW5vZGUtPnUuZ2VuZXJpY19pcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNhY2hlX2RlYnVnZnNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCT0gY2FjaGVfZGVidWdmc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjYWNoZV9kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkY2FjaGVfZGVudHJ5LCAqaWNhY2hlX2RlbnRyeTsKKworCWRjYWNoZV9kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJkY2FjaGUiLCBTX0lSVVNSLCBOVUxMLAorCQkJCQkgICAgKHVuc2lnbmVkIGludCAqKUNBQ0hFX1RZUEVfRENBQ0hFLAorCQkJCQkgICAgJmNhY2hlX2RlYnVnZnNfZm9wcyk7CisJaWYgKElTX0VSUihkY2FjaGVfZGVudHJ5KSkKKwkJcmV0dXJuIFBUUl9FUlIoZGNhY2hlX2RlbnRyeSk7CisKKwlpY2FjaGVfZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiaWNhY2hlIiwgU19JUlVTUiwgTlVMTCwKKwkJCQkJICAgICh1bnNpZ25lZCBpbnQgKilDQUNIRV9UWVBFX0lDQUNIRSwKKwkJCQkJICAgICZjYWNoZV9kZWJ1Z2ZzX2ZvcHMpOworCWlmIChJU19FUlIoaWNhY2hlX2RlbnRyeSkpIHsKKwkJZGVidWdmc19yZW1vdmUoZGNhY2hlX2RlbnRyeSk7CisJCXJldHVybiBQVFJfRVJSKGljYWNoZV9kZW50cnkpOworCX0KKworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoY2FjaGVfZGVidWdmc19pbml0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9jYWNoZS1zaDQuYyBiL2FyY2gvc2gvbW0vY2FjaGUtc2g0LmMKaW5kZXggNTI0Y2VhNS4uZTQ4Y2MyMiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9jYWNoZS1zaDQuYworKysgYi9hcmNoL3NoL21tL2NhY2hlLXNoNC5jCkBAIC0yLDQ5ICsyLDEyMCBAQAogICogYXJjaC9zaC9tbS9jYWNoZS1zaDQuYwogICoKICAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCwgMjAwMiAgTmlpYmUgWXV0YWthCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQgIFBhdWwgTXVuZHQKKyAqIENvcHlyaWdodCAoQykgMjAwMSAtIDIwMDYgIFBhdWwgTXVuZHQKICAqIENvcHlyaWdodCAoQykgMjAwMyAgUmljaGFyZCBDdXJub3cKICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqLwotCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KICNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAotZXh0ZXJuIHZvaWQgX19mbHVzaF9jYWNoZV80MDk2X2FsbCh1bnNpZ25lZCBsb25nIHN0YXJ0KTsKLXN0YXRpYyB2b2lkIF9fZmx1c2hfY2FjaGVfNDA5Nl9hbGxfZXgodW5zaWduZWQgbG9uZyBzdGFydCk7Ci1leHRlcm4gdm9pZCBfX2ZsdXNoX2RjYWNoZV9hbGwodm9pZCk7Ci1zdGF0aWMgdm9pZCBfX2ZsdXNoX2RjYWNoZV9hbGxfZXgodm9pZCk7CisvKgorICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhZ2VzIHdlIHN1cHBvcnQgdXAgdG8gd2hlbiBkb2luZyByYW5nZWQgZGNhY2hlCisgKiBmbHVzaGluZy4gQW55dGhpbmcgZXhjZWVkaW5nIHRoaXMgd2lsbCBzaW1wbHkgZmx1c2ggdGhlIGRjYWNoZSBpbiBpdHMKKyAqIGVudGlyZXR5LgorICovCisjZGVmaW5lIE1BWF9EQ0FDSEVfUEFHRVMJNjQJLyogWFhYOiBUdW5lIGZvciB3YXlzICovCisKK3N0YXRpYyB2b2lkIF9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfMXdheSh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQl1bnNpZ25lZCBsb25nIGV4dGVudCk7CitzdGF0aWMgdm9pZCBfX2ZsdXNoX2RjYWNoZV9zZWdtZW50XzJ3YXkodW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkJdW5zaWduZWQgbG9uZyBleHRlbnQpOworc3RhdGljIHZvaWQgX19mbHVzaF9kY2FjaGVfc2VnbWVudF80d2F5KHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJCXVuc2lnbmVkIGxvbmcgZXh0ZW50KTsKKworc3RhdGljIHZvaWQgX19mbHVzaF9jYWNoZV80MDk2KHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBwaHlzLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZXhlY19vZmZzZXQpOworCisvKgorICogVGhpcyBpcyBpbml0aWFsaXNlZCBoZXJlIHRvIGVuc3VyZSB0aGF0IGl0IGlzIG5vdCBwbGFjZWQgaW4gdGhlIEJTUy4gIElmCisgKiB0aGF0IHdlcmUgdG8gaGFwcGVuLCBub3RlIHRoYXQgY2FjaGVfaW5pdCBnZXRzIGNhbGxlZCBiZWZvcmUgdGhlIEJTUyBpcworICogY2xlYXJlZCwgc28gdGhpcyB3b3VsZCBnZXQgbnVsbGVkIG91dCB3aGljaCB3b3VsZCBiZSBob3BlbGVzcy4KKyAqLworc3RhdGljIHZvaWQgKCpfX2ZsdXNoX2RjYWNoZV9zZWdtZW50X2ZuKSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKSA9CisJKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpKTB4ZGVhZGJlZWY7CisKK3N0YXRpYyB2b2lkIGNvbXB1dGVfYWxpYXMoc3RydWN0IGNhY2hlX2luZm8gKmMpCit7CisJYy0+YWxpYXNfbWFzayA9ICgoYy0+c2V0cyAtIDEpIDw8IGMtPmVudHJ5X3NoaWZ0KSAmIH4oUEFHRV9TSVpFIC0gMSk7CisJYy0+bl9hbGlhc2VzID0gKGMtPmFsaWFzX21hc2sgPj4gUEFHRV9TSElGVCkgKyAxOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZW1pdF9jYWNoZV9wYXJhbXModm9pZCkKK3sKKwlwcmludGsoIlBWUj0lMDh4IENWUj0lMDh4IFBSUj0lMDh4XG4iLAorCQljdHJsX2lubChDQ05fUFZSKSwKKwkJY3RybF9pbmwoQ0NOX0NWUiksCisJCWN0cmxfaW5sKENDTl9QUlIpKTsKKwlwcmludGsoIkktY2FjaGUgOiBuX3dheXM9JWQgbl9zZXRzPSVkIHdheV9pbmNyPSVkXG4iLAorCQljcHVfZGF0YS0+aWNhY2hlLndheXMsCisJCWNwdV9kYXRhLT5pY2FjaGUuc2V0cywKKwkJY3B1X2RhdGEtPmljYWNoZS53YXlfaW5jcik7CisJcHJpbnRrKCJJLWNhY2hlIDogZW50cnlfbWFzaz0weCUwOHggYWxpYXNfbWFzaz0weCUwOHggbl9hbGlhc2VzPSVkXG4iLAorCQljcHVfZGF0YS0+aWNhY2hlLmVudHJ5X21hc2ssCisJCWNwdV9kYXRhLT5pY2FjaGUuYWxpYXNfbWFzaywKKwkJY3B1X2RhdGEtPmljYWNoZS5uX2FsaWFzZXMpOworCXByaW50aygiRC1jYWNoZSA6IG5fd2F5cz0lZCBuX3NldHM9JWQgd2F5X2luY3I9JWRcbiIsCisJCWNwdV9kYXRhLT5kY2FjaGUud2F5cywKKwkJY3B1X2RhdGEtPmRjYWNoZS5zZXRzLAorCQljcHVfZGF0YS0+ZGNhY2hlLndheV9pbmNyKTsKKwlwcmludGsoIkQtY2FjaGUgOiBlbnRyeV9tYXNrPTB4JTA4eCBhbGlhc19tYXNrPTB4JTA4eCBuX2FsaWFzZXM9JWRcbiIsCisJCWNwdV9kYXRhLT5kY2FjaGUuZW50cnlfbWFzaywKKwkJY3B1X2RhdGEtPmRjYWNoZS5hbGlhc19tYXNrLAorCQljcHVfZGF0YS0+ZGNhY2hlLm5fYWxpYXNlcyk7CisKKwlpZiAoIV9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfZm4pCisJCXBhbmljKCJ1bmtub3duIG51bWJlciBvZiBjYWNoZSB3YXlzXG4iKTsKK30KIAogLyoKICAqIFNILTQgaGFzIHZpcnR1YWxseSBpbmRleGVkIGFuZCBwaHlzaWNhbGx5IHRhZ2dlZCBjYWNoZS4KICAqLwogCi1zdHJ1Y3Qgc2VtYXBob3JlIHAzbWFwX3NlbVs0XTsKKy8qIFdvcnN0IGNhc2UgYXNzdW1lZCB0byBiZSA2NGsgY2FjaGUsIGRpcmVjdC1tYXBwZWQgaS5lLiA0IHN5bm9ueW0gYml0cy4gKi8KKyNkZWZpbmUgTUFYX1AzX1NFTUFQSE9SRVMgMTYKKworc3RydWN0IHNlbWFwaG9yZSBwM21hcF9zZW1bTUFYX1AzX1NFTUFQSE9SRVNdOwogCiB2b2lkIF9faW5pdCBwM19jYWNoZV9pbml0KHZvaWQpCiB7Ci0JaWYgKHJlbWFwX2FyZWFfcGFnZXMoUDNTRUcsIDAsIFBBR0VfU0laRSo0LCBfUEFHRV9DQUNIQUJMRSkpCisJaW50IGk7CisKKwljb21wdXRlX2FsaWFzKCZjcHVfZGF0YS0+aWNhY2hlKTsKKwljb21wdXRlX2FsaWFzKCZjcHVfZGF0YS0+ZGNhY2hlKTsKKworCXN3aXRjaCAoY3B1X2RhdGEtPmRjYWNoZS53YXlzKSB7CisJY2FzZSAxOgorCQlfX2ZsdXNoX2RjYWNoZV9zZWdtZW50X2ZuID0gX19mbHVzaF9kY2FjaGVfc2VnbWVudF8xd2F5OworCQlicmVhazsKKwljYXNlIDI6CisJCV9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfZm4gPSBfX2ZsdXNoX2RjYWNoZV9zZWdtZW50XzJ3YXk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJX19mbHVzaF9kY2FjaGVfc2VnbWVudF9mbiA9IF9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfNHdheTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJX19mbHVzaF9kY2FjaGVfc2VnbWVudF9mbiA9IE5VTEw7CisJCWJyZWFrOworCX0KKworCWVtaXRfY2FjaGVfcGFyYW1zKCk7CisKKwlpZiAocmVtYXBfYXJlYV9wYWdlcyhQM1NFRywgMCwgUEFHRV9TSVpFICogNCwgX1BBR0VfQ0FDSEFCTEUpKQogCQlwYW5pYygiJXMgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlzZW1hX2luaXQgKCZwM21hcF9zZW1bMF0sIDEpOwotCXNlbWFfaW5pdCAoJnAzbWFwX3NlbVsxXSwgMSk7Ci0Jc2VtYV9pbml0ICgmcDNtYXBfc2VtWzJdLCAxKTsKLQlzZW1hX2luaXQgKCZwM21hcF9zZW1bM10sIDEpOworCWZvciAoaSA9IDA7IGkgPCBjcHVfZGF0YS0+ZGNhY2hlLm5fYWxpYXNlczsgaSsrKQorCQlzZW1hX2luaXQoJnAzbWFwX3NlbVtpXSwgMSk7CiB9CiAKIC8qCkBAIC04OSw3ICsxNjAsNiBAQAogCX0KIH0KIAotCiAvKgogICogTm8gd3JpdGUgYmFjayBwbGVhc2UKICAqLwpAQCAtMTA4LDQwICsxNzgsNiBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX19mbHVzaF9kY2FjaGVfYWxsX2V4KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBhZGRyLCBlbmRfYWRkciwgZW50cnlfb2Zmc2V0OwotCi0JZW5kX2FkZHIgPSBDQUNIRV9PQ19BRERSRVNTX0FSUkFZICsgKGNwdV9kYXRhLT5kY2FjaGUuc2V0cyA8PCBjcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X3NoaWZ0KSAqIGNwdV9kYXRhLT5kY2FjaGUud2F5czsKLQllbnRyeV9vZmZzZXQgPSAxIDw8IGNwdV9kYXRhLT5kY2FjaGUuZW50cnlfc2hpZnQ7Ci0JZm9yIChhZGRyID0gQ0FDSEVfT0NfQUREUkVTU19BUlJBWTsgYWRkciA8IGVuZF9hZGRyOyBhZGRyICs9IGVudHJ5X29mZnNldCkgewotCQljdHJsX291dGwoMCwgYWRkcik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2ZsdXNoX2NhY2hlXzQwOTZfYWxsX2V4KHVuc2lnbmVkIGxvbmcgc3RhcnQpCi17Ci0JdW5zaWduZWQgbG9uZyBhZGRyLCBlbnRyeV9vZmZzZXQ7Ci0JaW50IGk7Ci0KLQllbnRyeV9vZmZzZXQgPSAxIDw8IGNwdV9kYXRhLT5kY2FjaGUuZW50cnlfc2hpZnQ7Ci0JZm9yIChpID0gMDsgaSA8IGNwdV9kYXRhLT5kY2FjaGUud2F5czsgaSsrLCBzdGFydCArPSBjcHVfZGF0YS0+ZGNhY2hlLndheV9pbmNyKSB7Ci0JCWZvciAoYWRkciA9IENBQ0hFX09DX0FERFJFU1NfQVJSQVkgKyBzdGFydDsKLQkJICAgICBhZGRyIDwgQ0FDSEVfT0NfQUREUkVTU19BUlJBWSArIDQwOTYgKyBzdGFydDsKLQkJICAgICBhZGRyICs9IGVudHJ5X29mZnNldCkgewotCQkJY3RybF9vdXRsKDAsIGFkZHIpOwotCQl9Ci0JfQotfQotCi12b2lkIGZsdXNoX2NhY2hlXzQwOTZfYWxsKHVuc2lnbmVkIGxvbmcgc3RhcnQpCi17Ci0JaWYgKGNwdV9kYXRhLT5kY2FjaGUud2F5cyA9PSAxKQotCQlfX2ZsdXNoX2NhY2hlXzQwOTZfYWxsKHN0YXJ0KTsKLQllbHNlCi0JCV9fZmx1c2hfY2FjaGVfNDA5Nl9hbGxfZXgoc3RhcnQpOwotfQotCiAvKgogICogV3JpdGUgYmFjayB0aGUgcmFuZ2Ugb2YgRC1jYWNoZSwgYW5kIHB1cmdlIHRoZSBJLWNhY2hlLgogICoKQEAgLTE1MywxNCArMTg5LDE0IEBACiB9CiAKIC8qCi0gKiBXcml0ZSBiYWNrIHRoZSBELWNhY2hlIGFuZCBwdXJnZSB0aGUgSS1jYWNoZSBmb3Igc2lnbmFsIHRyYW1wb2xpbmUuIAorICogV3JpdGUgYmFjayB0aGUgRC1jYWNoZSBhbmQgcHVyZ2UgdGhlIEktY2FjaGUgZm9yIHNpZ25hbCB0cmFtcG9saW5lLgogICogLi4gd2hpY2ggaGFwcGVucyB0byBiZSB0aGUgc2FtZSBiZWhhdmlvciBhcyBmbHVzaF9pY2FjaGVfcmFuZ2UoKS4KICAqIFNvLCB3ZSBzaW1wbHkgZmx1c2ggb3V0IGEgbGluZS4KICAqLwogdm9pZCBmbHVzaF9jYWNoZV9zaWd0cmFtcCh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyB2LCBpbmRleDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOyAKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCiAJdiA9IGFkZHIgJiB+KEwxX0NBQ0hFX0JZVEVTLTEpOwpAQCAtMTcyLDMwICsyMDgsMzMgQEAKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlqdW1wX3RvX1AyKCk7Ci0JZm9yKGkgPSAwOyBpIDwgY3B1X2RhdGEtPmljYWNoZS53YXlzOyBpKyssIGluZGV4ICs9IGNwdV9kYXRhLT5pY2FjaGUud2F5X2luY3IpCisKKwlmb3IgKGkgPSAwOyBpIDwgY3B1X2RhdGEtPmljYWNoZS53YXlzOworCSAgICAgaSsrLCBpbmRleCArPSBjcHVfZGF0YS0+aWNhY2hlLndheV9pbmNyKQogCQljdHJsX291dGwoMCwgaW5kZXgpOwkvKiBDbGVhciBvdXQgVmFsaWQtYml0ICovCisKIAliYWNrX3RvX1AxKCk7CisJd21iKCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfY2FjaGVfNDA5Nih1bnNpZ25lZCBsb25nIHN0YXJ0LAogCQkJCSAgICB1bnNpZ25lZCBsb25nIHBoeXMpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsgCi0JZXh0ZXJuIHZvaWQgX19mbHVzaF9jYWNoZV80MDk2KHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIGV4ZWNfb2Zmc2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBleGVjX29mZnNldCA9IDA7CiAKIAkvKgotCSAqIFNINzc1MSwgU0g3NzUxUiwgYW5kIFNUNDAgaGF2ZSBubyByZXN0cmljdGlvbiB0byBoYW5kbGUgY2FjaGUuCi0JICogKFdoaWxlIFNINzc1MCBtdXN0IGRvIHRoYXQgYXQgUDIgYXJlYS4pCisJICogQWxsIHR5cGVzIG9mIFNILTQgcmVxdWlyZSBQQyB0byBiZSBpbiBQMiB0byBvcGVyYXRlIG9uIHRoZSBJLWNhY2hlLgorCSAqIFNvbWUgdHlwZXMgb2YgU0gtNCByZXF1aXJlIFBDIHRvIGJlIGluIFAyIHRvIG9wZXJhdGUgb24gdGhlIEQtY2FjaGUuCiAJICovCi0JaWYgKChjcHVfZGF0YS0+ZmxhZ3MgJiBDUFVfSEFTX1AyX0ZMVVNIX0JVRykKLQkgICB8fCBzdGFydCA8IENBQ0hFX09DX0FERFJFU1NfQVJSQVkpIHsKLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlfX2ZsdXNoX2NhY2hlXzQwOTYoc3RhcnQgfCBTSF9DQUNIRV9BU1NPQywgUDFTRUdBRERSKHBoeXMpLCAweDIwMDAwMDAwKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCV9fZmx1c2hfY2FjaGVfNDA5NihzdGFydCB8IFNIX0NBQ0hFX0FTU09DLCBQMVNFR0FERFIocGh5cyksIDApOwotCX0KKwlpZiAoKGNwdV9kYXRhLT5mbGFncyAmIENQVV9IQVNfUDJfRkxVU0hfQlVHKSB8fAorCSAgICAoc3RhcnQgPCBDQUNIRV9PQ19BRERSRVNTX0FSUkFZKSkKKwkgICAgCWV4ZWNfb2Zmc2V0ID0gMHgyMDAwMDAwMDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlfX2ZsdXNoX2NhY2hlXzQwOTYoc3RhcnQgfCBTSF9DQUNIRV9BU1NPQywKKwkJCSAgIFAxU0VHQUREUihwaHlzKSwgZXhlY19vZmZzZXQpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogLyoKQEAgLTIwNiwxNSArMjQ1LDE5IEBACiB7CiAJaWYgKHRlc3RfYml0KFBHX21hcHBlZCwgJnBhZ2UtPmZsYWdzKSkgewogCQl1bnNpZ25lZCBsb25nIHBoeXMgPSBQSFlTQUREUihwYWdlX2FkZHJlc3MocGFnZSkpOworCQl1bnNpZ25lZCBsb25nIGFkZHIgPSBDQUNIRV9PQ19BRERSRVNTX0FSUkFZOworCQlpbnQgaSwgbjsKIAogCQkvKiBMb29wIGFsbCB0aGUgRC1jYWNoZSAqLwotCQlmbHVzaF9jYWNoZV80MDk2KENBQ0hFX09DX0FERFJFU1NfQVJSQVksICAgICAgICAgIHBoeXMpOwotCQlmbHVzaF9jYWNoZV80MDk2KENBQ0hFX09DX0FERFJFU1NfQVJSQVkgfCAweDEwMDAsIHBoeXMpOwotCQlmbHVzaF9jYWNoZV80MDk2KENBQ0hFX09DX0FERFJFU1NfQVJSQVkgfCAweDIwMDAsIHBoeXMpOwotCQlmbHVzaF9jYWNoZV80MDk2KENBQ0hFX09DX0FERFJFU1NfQVJSQVkgfCAweDMwMDAsIHBoeXMpOworCQluID0gY3B1X2RhdGEtPmRjYWNoZS5uX2FsaWFzZXM7CisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyssIGFkZHIgKz0gUEFHRV9TSVpFKQorCQkJZmx1c2hfY2FjaGVfNDA5NihhZGRyLCBwaHlzKTsKIAl9CisKKwl3bWIoKTsKIH0KIAorLyogVE9ETzogU2VsZWN0aXZlIGljYWNoZSBpbnZhbGlkYXRpb24gdGhyb3VnaCBJQyBhZGRyZXNzIGFycmF5Li4gKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9pY2FjaGVfYWxsKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgY2NyOwpAQCAtMjI3LDM0ICsyNzAsMTQyIEBACiAJY2NyIHw9IENDUl9DQUNIRV9JQ0k7CiAJY3RybF9vdXRsKGNjciwgQ0NSKTsKIAorCS8qCisJICogYmFja190b19QMSgpIHdpbGwgdGFrZSBjYXJlIG9mIHRoZSBiYXJyaWVyIGZvciB1cywgZG9uJ3QgYWRkCisJICogYW5vdGhlciBvbmUhCisJICovCisKIAliYWNrX3RvX1AxKCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCit2b2lkIGZsdXNoX2RjYWNoZV9hbGwodm9pZCkKK3sKKwkoKl9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfZm4pKDBVTCwgY3B1X2RhdGEtPmRjYWNoZS53YXlfc2l6ZSk7CisJd21iKCk7Cit9CisKIHZvaWQgZmx1c2hfY2FjaGVfYWxsKHZvaWQpCiB7Ci0JaWYgKGNwdV9kYXRhLT5kY2FjaGUud2F5cyA9PSAxKQotCQlfX2ZsdXNoX2RjYWNoZV9hbGwoKTsKLQllbHNlCi0JCV9fZmx1c2hfZGNhY2hlX2FsbF9leCgpOworCWZsdXNoX2RjYWNoZV9hbGwoKTsKIAlmbHVzaF9pY2FjaGVfYWxsKCk7CiB9CiAKK3N0YXRpYyB2b2lkIF9fZmx1c2hfY2FjaGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgZCA9IDAsIHAgPSBzdGFydCAmIFBBR0VfTUFTSzsKKwl1bnNpZ25lZCBsb25nIGFsaWFzX21hc2sgPSBjcHVfZGF0YS0+ZGNhY2hlLmFsaWFzX21hc2s7CisJdW5zaWduZWQgbG9uZyBuX2FsaWFzZXMgPSBjcHVfZGF0YS0+ZGNhY2hlLm5fYWxpYXNlczsKKwl1bnNpZ25lZCBsb25nIHNlbGVjdF9iaXQ7CisJdW5zaWduZWQgbG9uZyBhbGxfYWxpYXNlc19tYXNrOworCXVuc2lnbmVkIGxvbmcgYWRkcl9vZmZzZXQ7CisJcGdkX3QgKmRpcjsKKwlwbWRfdCAqcG1kOworCXB1ZF90ICpwdWQ7CisJcHRlX3QgKnB0ZTsKKwlpbnQgaTsKKworCWRpciA9IHBnZF9vZmZzZXQobW0sIHApOworCXB1ZCA9IHB1ZF9vZmZzZXQoZGlyLCBwKTsKKwlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgcCk7CisJZW5kID0gUEFHRV9BTElHTihlbmQpOworCisJYWxsX2FsaWFzZXNfbWFzayA9ICgxIDw8IG5fYWxpYXNlcykgLSAxOworCisJZG8geworCQlpZiAocG1kX25vbmUoKnBtZCkgfHwgdW5saWtlbHkocG1kX2JhZCgqcG1kKSkpIHsKKwkJCXAgJj0gUE1EX01BU0s7CisJCQlwICs9IFBNRF9TSVpFOworCQkJcG1kKys7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCBwKTsKKworCQlkbyB7CisJCQl1bnNpZ25lZCBsb25nIHBoeXM7CisJCQlwdGVfdCBlbnRyeSA9ICpwdGU7CisKKwkJCWlmICghKHB0ZV92YWwoZW50cnkpICYgX1BBR0VfUFJFU0VOVCkpIHsKKwkJCQlwdGUrKzsKKwkJCQlwICs9IFBBR0VfU0laRTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJcGh5cyA9IHB0ZV92YWwoZW50cnkpICYgUFRFX1BIWVNfTUFTSzsKKworCQkJaWYgKChwIF4gcGh5cykgJiBhbGlhc19tYXNrKSB7CisJCQkJZCB8PSAxIDw8ICgocCAmIGFsaWFzX21hc2spID4+IFBBR0VfU0hJRlQpOworCQkJCWQgfD0gMSA8PCAoKHBoeXMgJiBhbGlhc19tYXNrKSA+PiBQQUdFX1NISUZUKTsKKworCQkJCWlmIChkID09IGFsbF9hbGlhc2VzX21hc2spCisJCQkJCWdvdG8gbG9vcF9leGl0OworCQkJfQorCisJCQlwdGUrKzsKKwkJCXAgKz0gUEFHRV9TSVpFOworCQl9IHdoaWxlIChwIDwgZW5kICYmICgodW5zaWduZWQgbG9uZylwdGUgJiB+UEFHRV9NQVNLKSk7CisJCXBtZCsrOworCX0gd2hpbGUgKHAgPCBlbmQpOworCitsb29wX2V4aXQ6CisJYWRkcl9vZmZzZXQgPSAwOworCXNlbGVjdF9iaXQgPSAxOworCisJZm9yIChpID0gMDsgaSA8IG5fYWxpYXNlczsgaSsrKSB7CisJCWlmIChkICYgc2VsZWN0X2JpdCkgeworCQkJKCpfX2ZsdXNoX2RjYWNoZV9zZWdtZW50X2ZuKShhZGRyX29mZnNldCwgUEFHRV9TSVpFKTsKKwkJCXdtYigpOworCQl9CisKKwkJc2VsZWN0X2JpdCA8PD0gMTsKKwkJYWRkcl9vZmZzZXQgKz0gUEFHRV9TSVpFOworCX0KK30KKworLyoKKyAqIE5vdGUgOiAoUlBDKSBzaW5jZSB0aGUgY2FjaGVzIGFyZSBwaHlzaWNhbGx5IHRhZ2dlZCwgdGhlIG9ubHkgcG9pbnQKKyAqIG9mIGZsdXNoX2NhY2hlX21tIGZvciBTSC00IGlzIHRvIGdldCByaWQgb2YgYWxpYXNlcyBmcm9tIHRoZQorICogRC1jYWNoZS4gIFRoZSBhc3N1bXB0aW9uIGVsc2V3aGVyZSwgZS5nLiBmbHVzaF9jYWNoZV9yYW5nZSwgaXMgdGhhdAorICogbGluZXMgY2FuIHN0YXkgcmVzaWRlbnQgc28gbG9uZyBhcyB0aGUgdmlydHVhbCBhZGRyZXNzIHRoZXkgd2VyZQorICogYWNjZXNzZWQgd2l0aCAoaGVuY2UgY2FjaGUgc2V0KSBpcyBpbiBhY2NvcmQgd2l0aCB0aGUgcGh5c2ljYWwKKyAqIGFkZHJlc3MgKGkuZS4gdGFnKS4gIEl0J3Mgbm8gZGlmZmVyZW50IGhlcmUuICBTbyBJIHJlY2tvbiB3ZSBkb24ndAorICogbmVlZCB0byBmbHVzaCB0aGUgSS1jYWNoZSwgc2luY2UgYWxpYXNlcyBkb24ndCBtYXR0ZXIgZm9yIHRoYXQuICBXZQorICogc2hvdWxkIHRyeSB0aGF0LgorICoKKyAqIENhbGxlciB0YWtlcyBtbS0+bW1hcF9zZW0uCisgKi8KIHZvaWQgZmx1c2hfY2FjaGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JLyogSXMgdGhlcmUgYW55IGdvb2Qgd2F5PyAqLwotCS8qIFhYWDogcG9zc2libHkgY2FsbCBmbHVzaF9jYWNoZV9yYW5nZSBmb3IgZWFjaCB2bSBhcmVhICovCi0JLyogCi0JICogRklYTUU6IFJlYWxseSwgdGhlIG9wdGltYWwgc29sdXRpb24gaGVyZSB3b3VsZCBiZSBhYmxlIHRvIGZsdXNoIG91dAotCSAqIGluZGl2aWR1YWwgbGluZXMgY3JlYXRlZCBieSB0aGUgc3BlY2lmaWVkIGNvbnRleHQsIGJ1dCB0aGlzIGlzbid0Ci0JICogZmVhc2libGUgZm9yIGEgbnVtYmVyIG9mIGFyY2hpdGVjdHVyZXMgKHN1Y2ggYXMgTUlQUywgYW5kIHNvbWUKLQkgKiBTUEFSQykgLi4gaXMgdGhpcyBwb3NzaWJsZSBmb3IgU3VwZXJIPwotCSAqCi0JICogSW4gdGhlIG1lYW50aW1lLCB3ZSdsbCBqdXN0IGZsdXNoIGFsbCBvZiB0aGUgY2FjaGVzLi4gdGhpcwotCSAqIHNlZW1zIHRvIGJlIHRoZSBzaW1wbGVzdCB3YXkgdG8gYXZvaWQgYXQgbGVhc3QgYSBmZXcgd2FzdGVkCi0JICogY2FjaGUgZmx1c2hlcy4gLUxldGhhbAorCS8qCisJICogSWYgY2FjaGUgaXMgb25seSA0ay1wZXItd2F5LCB0aGVyZSBhcmUgbmV2ZXIgYW55ICdhbGlhc2VzJy4gIFNpbmNlCisJICogdGhlIGNhY2hlIGlzIHBoeXNpY2FsbHkgdGFnZ2VkLCB0aGUgZGF0YSBjYW4ganVzdCBiZSBsZWZ0IGluIHRoZXJlLgogCSAqLwotCWZsdXNoX2NhY2hlX2FsbCgpOworCWlmIChjcHVfZGF0YS0+ZGNhY2hlLm5fYWxpYXNlcyA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIERvbid0IGJvdGhlciBncm92ZWxpbmcgYXJvdW5kIHRoZSBkY2FjaGUgZm9yIHRoZSBWTUEgcmFuZ2VzCisJICogaWYgdGhlcmUgYXJlIHRvbyBtYW55IFBURXMgdG8gbWFrZSBpdCB3b3J0aHdoaWxlLgorCSAqLworCWlmIChtbS0+bnJfcHRlcyA+PSBNQVhfRENBQ0hFX1BBR0VTKQorCQlmbHVzaF9kY2FjaGVfYWxsKCk7CisJZWxzZSB7CisJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCisJCS8qCisJCSAqIEluIHRoaXMgY2FzZSB0aGVyZSBhcmUgcmVhc29uYWJseSBzaXplZCByYW5nZXMgdG8gZmx1c2gsCisJCSAqIGl0ZXJhdGUgdGhyb3VnaCB0aGUgVk1BIGxpc3QgYW5kIHRha2UgY2FyZSBvZiBhbnkgYWxpYXNlcy4KKwkJICovCisJCWZvciAodm1hID0gbW0tPm1tYXA7IHZtYTsgdm1hID0gdm1hLT52bV9uZXh0KQorCQkJX19mbHVzaF9jYWNoZV9tbShtbSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQpOworCX0KKworCS8qIE9ubHkgdG91Y2ggdGhlIGljYWNoZSBpZiBvbmUgb2YgdGhlIFZNQXMgaGFzIFZNX0VYRUMgc2V0LiAqLworCWlmIChtbS0+ZXhlY192bSkKKwkJZmx1c2hfaWNhY2hlX2FsbCgpOwogfQogCiAvKgpAQCAtMjYzLDI3ICs0MTQsNDAgQEAKICAqIEFERFI6IFZpcnR1YWwgQWRkcmVzcyAoVTAgYWRkcmVzcykKICAqIFBGTjogUGh5c2ljYWwgcGFnZSBudW1iZXIKICAqLwotdm9pZCBmbHVzaF9jYWNoZV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgcGZuKQordm9pZCBmbHVzaF9jYWNoZV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgcGZuKQogewogCXVuc2lnbmVkIGxvbmcgcGh5cyA9IHBmbiA8PCBQQUdFX1NISUZUOworCXVuc2lnbmVkIGludCBhbGlhc19tYXNrOworCisJYWxpYXNfbWFzayA9IGNwdV9kYXRhLT5kY2FjaGUuYWxpYXNfbWFzazsKIAogCS8qIFdlIG9ubHkgbmVlZCB0byBmbHVzaCBELWNhY2hlIHdoZW4gd2UgaGF2ZSBhbGlhcyAqLwotCWlmICgoYWRkcmVzc15waHlzKSAmIENBQ0hFX0FMSUFTKSB7CisJaWYgKChhZGRyZXNzXnBoeXMpICYgYWxpYXNfbWFzaykgewogCQkvKiBMb29wIDRLIG9mIHRoZSBELWNhY2hlICovCiAJCWZsdXNoX2NhY2hlXzQwOTYoCi0JCQlDQUNIRV9PQ19BRERSRVNTX0FSUkFZIHwgKGFkZHJlc3MgJiBDQUNIRV9BTElBUyksCisJCQlDQUNIRV9PQ19BRERSRVNTX0FSUkFZIHwgKGFkZHJlc3MgJiBhbGlhc19tYXNrKSwKIAkJCXBoeXMpOwogCQkvKiBMb29wIGFub3RoZXIgNEsgb2YgdGhlIEQtY2FjaGUgKi8KIAkJZmx1c2hfY2FjaGVfNDA5NigKLQkJCUNBQ0hFX09DX0FERFJFU1NfQVJSQVkgfCAocGh5cyAmIENBQ0hFX0FMSUFTKSwKKwkJCUNBQ0hFX09DX0FERFJFU1NfQVJSQVkgfCAocGh5cyAmIGFsaWFzX21hc2spLAogCQkJcGh5cyk7CiAJfQogCi0JaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKQotCQkvKiBMb29wIDRLIChoYWxmKSBvZiB0aGUgSS1jYWNoZSAqLworCWFsaWFzX21hc2sgPSBjcHVfZGF0YS0+aWNhY2hlLmFsaWFzX21hc2s7CisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKSB7CisJCS8qCisJCSAqIEV2aWN0IGVudHJpZXMgZnJvbSB0aGUgcG9ydGlvbiBvZiB0aGUgY2FjaGUgZnJvbSB3aGljaCBjb2RlCisJCSAqIG1heSBoYXZlIGJlZW4gZXhlY3V0ZWQgYXQgdGhpcyBhZGRyZXNzICh2aXJ0dWFsKS4gIFRoZXJlJ3MKKwkJICogbm8gbmVlZCB0byBldmljdCBmcm9tIHRoZSBwb3J0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisJCSAqIHBoeXNpY2FsIGFkZHJlc3MgYXMgZm9yIHRoZSBELWNhY2hlLCBiZWNhdXNlIHdlIGtub3cgdGhlCisJCSAqIGtlcm5lbCBoYXMgbmV2ZXIgZXhlY3V0ZWQgdGhlIGNvZGUgdGhyb3VnaCBpdHMgaWRlbnRpdHkKKwkJICogdHJhbnNsYXRpb24uCisJCSAqLwogCQlmbHVzaF9jYWNoZV80MDk2KAotCQkJQ0FDSEVfSUNfQUREUkVTU19BUlJBWSB8IChhZGRyZXNzICYgMHgxMDAwKSwKKwkJCUNBQ0hFX0lDX0FERFJFU1NfQVJSQVkgfCAoYWRkcmVzcyAmIGFsaWFzX21hc2spLAogCQkJcGh5cyk7CisJfQogfQogCiAvKgpAQCAtMjk4LDUyICs0NjIsMzEgQEAKIHZvaWQgZmx1c2hfY2FjaGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQl1bnNpZ25lZCBsb25nIHAgPSBzdGFydCAmIFBBR0VfTUFTSzsKLQlwZ2RfdCAqZGlyOwotCXBtZF90ICpwbWQ7Ci0JcHRlX3QgKnB0ZTsKLQlwdGVfdCBlbnRyeTsKLQl1bnNpZ25lZCBsb25nIHBoeXM7Ci0JdW5zaWduZWQgbG9uZyBkID0gMDsKKwkvKgorCSAqIElmIGNhY2hlIGlzIG9ubHkgNGstcGVyLXdheSwgdGhlcmUgYXJlIG5ldmVyIGFueSAnYWxpYXNlcycuICBTaW5jZQorCSAqIHRoZSBjYWNoZSBpcyBwaHlzaWNhbGx5IHRhZ2dlZCwgdGhlIGRhdGEgY2FuIGp1c3QgYmUgbGVmdCBpbiB0aGVyZS4KKwkgKi8KKwlpZiAoY3B1X2RhdGEtPmRjYWNoZS5uX2FsaWFzZXMgPT0gMCkKKwkJcmV0dXJuOwogCi0JZGlyID0gcGdkX29mZnNldCh2bWEtPnZtX21tLCBwKTsKLQlwbWQgPSBwbWRfb2Zmc2V0KGRpciwgcCk7CisJLyoKKwkgKiBEb24ndCBib3RoZXIgd2l0aCB0aGUgbG9va3VwIGFuZCBhbGlhcyBjaGVjayBpZiB3ZSBoYXZlIGEKKwkgKiB3aWRlIHJhbmdlIHRvIGNvdmVyLCBqdXN0IGJsb3cgYXdheSB0aGUgZGNhY2hlIGluIGl0cworCSAqIGVudGlyZXR5IGluc3RlYWQuIC0tIFBGTS4KKwkgKi8KKwlpZiAoKChlbmQgLSBzdGFydCkgPj4gUEFHRV9TSElGVCkgPj0gTUFYX0RDQUNIRV9QQUdFUykKKwkJZmx1c2hfZGNhY2hlX2FsbCgpOworCWVsc2UKKwkJX19mbHVzaF9jYWNoZV9tbSh2bWEtPnZtX21tLCBzdGFydCwgZW5kKTsKIAotCWRvIHsKLQkJaWYgKHBtZF9ub25lKCpwbWQpIHx8IHBtZF9iYWQoKnBtZCkpIHsKLQkJCXAgJj0gfigoMSA8PCBQTURfU0hJRlQpIC0xKTsKLQkJCXAgKz0gKDEgPDwgUE1EX1NISUZUKTsKLQkJCXBtZCsrOwotCQkJY29udGludWU7Ci0JCX0KLQkJcHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCBwKTsKLQkJZG8gewotCQkJZW50cnkgPSAqcHRlOwotCQkJaWYgKChwdGVfdmFsKGVudHJ5KSAmIF9QQUdFX1BSRVNFTlQpKSB7Ci0JCQkJcGh5cyA9IHB0ZV92YWwoZW50cnkpJlBURV9QSFlTX01BU0s7Ci0JCQkJaWYgKChwXnBoeXMpICYgQ0FDSEVfQUxJQVMpIHsKLQkJCQkJZCB8PSAxIDw8ICgocCAmIENBQ0hFX0FMSUFTKT4+MTIpOyAKLQkJCQkJZCB8PSAxIDw8ICgocGh5cyAmIENBQ0hFX0FMSUFTKT4+MTIpOwotCQkJCQlpZiAoZCA9PSAweDBmKQotCQkJCQkJZ290byBsb29wX2V4aXQ7Ci0JCQkJfQotCQkJfQotCQkJcHRlKys7Ci0JCQlwICs9IFBBR0VfU0laRTsKLQkJfSB3aGlsZSAocCA8IGVuZCAmJiAoKHVuc2lnbmVkIGxvbmcpcHRlICYgflBBR0VfTUFTSykpOwotCQlwbWQrKzsKLQl9IHdoaWxlIChwIDwgZW5kKTsKLSBsb29wX2V4aXQ6Ci0JaWYgKGQgJiAxKQotCQlmbHVzaF9jYWNoZV80MDk2X2FsbCgwKTsKLQlpZiAoZCAmIDIpCi0JCWZsdXNoX2NhY2hlXzQwOTZfYWxsKDB4MTAwMCk7Ci0JaWYgKGQgJiA0KQotCQlmbHVzaF9jYWNoZV80MDk2X2FsbCgweDIwMDApOwotCWlmIChkICYgOCkKLQkJZmx1c2hfY2FjaGVfNDA5Nl9hbGwoMHgzMDAwKTsKLQlpZiAodm1hLT52bV9mbGFncyAmIFZNX0VYRUMpCisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKSB7CisJCS8qCisJCSAqIFRPRE86IElzIHRoaXMgcmVxdWlyZWQ/Pz8gIE5lZWQgdG8gbG9vayBhdCBob3cgSS1jYWNoZQorCQkgKiBjb2hlcmVuY3kgaXMgYXNzdXJlZCB3aGVuIG5ldyBwcm9ncmFtcyBhcmUgbG9hZGVkIHRvIHNlZSBpZgorCQkgKiB0aGlzIG1hdHRlcnMuCisJCSAqLwogCQlmbHVzaF9pY2FjaGVfYWxsKCk7CisJfQogfQogCiAvKgpAQCAtMzU3LDUgKzUwMCwyNzMgQEAKIAkJCSAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGxlbikKIHsKIAlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkciwgcGFnZV90b19wZm4ocGFnZSkpOworCW1iKCk7CiB9CiAKKy8qKgorICogX19mbHVzaF9jYWNoZV80MDk2CisgKgorICogQGFkZHI6ICBhZGRyZXNzIGluIG1lbW9yeSBtYXBwZWQgY2FjaGUgYXJyYXkKKyAqIEBwaHlzOiAgUDEgYWRkcmVzcyB0byBmbHVzaCAoaGFzIHRvIG1hdGNoIHRhZ3MgaWYgYWRkciBoYXMgJ0EnIGJpdAorICogICAgICAgICBzZXQgaS5lLiBhc3NvY2lhdGl2ZSB3cml0ZSkKKyAqIEBleGVjX29mZnNldDogc2V0IHRvIDB4MjAwMDAwMDAgaWYgZmx1c2ggaGFzIHRvIGJlIGV4ZWN1dGVkIGZyb20gUDIKKyAqICAgICAgICAgICAgICAgcmVnaW9uIGVsc2UgMHgwCisgKgorICogVGhlIG9mZnNldCBpbnRvIHRoZSBjYWNoZSBhcnJheSBpbXBsaWVkIGJ5ICdhZGRyJyBzZWxlY3RzIHRoZQorICogJ2NvbG91cicgb2YgdGhlIHZpcnR1YWwgYWRkcmVzcyByYW5nZSB0aGF0IHdpbGwgYmUgZmx1c2hlZC4gIFRoZQorICogb3BlcmF0aW9uIChwdXJnZS93cml0ZS1iYWNrKSBpcyBzZWxlY3RlZCBieSB0aGUgbG93ZXIgMiBiaXRzIG9mCisgKiAncGh5cycuCisgKi8KK3N0YXRpYyB2b2lkIF9fZmx1c2hfY2FjaGVfNDA5Nih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgcGh5cywKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGV4ZWNfb2Zmc2V0KQoreworCWludCB3YXlfY291bnQ7CisJdW5zaWduZWQgbG9uZyBiYXNlX2FkZHIgPSBhZGRyOworCXN0cnVjdCBjYWNoZV9pbmZvICpkY2FjaGU7CisJdW5zaWduZWQgbG9uZyB3YXlfaW5jcjsKKwl1bnNpZ25lZCBsb25nIGEsIGVhLCBwOworCXVuc2lnbmVkIGxvbmcgdGVtcF9wYzsKKworCWRjYWNoZSA9ICZjcHVfZGF0YS0+ZGNhY2hlOworCS8qIFdyaXRlIHRoaXMgd2F5IGZvciBiZXR0ZXIgYXNzZW1ibHkuICovCisJd2F5X2NvdW50ID0gZGNhY2hlLT53YXlzOworCXdheV9pbmNyID0gZGNhY2hlLT53YXlfaW5jcjsKKworCS8qCisJICogQXBwbHkgZXhlY19vZmZzZXQgKGkuZS4gYnJhbmNoIHRvIFAyIGlmIHJlcXVpcmVkLikuCisJICoKKwkgKiBGSVhNRToKKwkgKgorCSAqCUlmIEkgd3JpdGUgIj1yIiBmb3IgdGhlICh0ZW1wX3BjKSwgaXQgcHV0cyB0aGlzIGluIHI2IGhlbmNlCisJICoJdHJhc2hpbmcgZXhlY19vZmZzZXQgYmVmb3JlIGl0J3MgYmVlbiBhZGRlZCBvbiAtIHdoeT8gIEhlbmNlCisJICoJIj0mciIgYXMgYSAnd29ya2Fyb3VuZCcKKwkgKi8KKwlhc20gdm9sYXRpbGUoIm1vdi5sIDFmLCAlMFxuXHQiCisJCSAgICAgImFkZCAgICUxLCAlMFxuXHQiCisJCSAgICAgImptcCAgIEAlMFxuXHQiCisJCSAgICAgIm5vcFxuXHQiCisJCSAgICAgIi5iYWxpZ24gNFxuXHQiCisJCSAgICAgIjE6ICAubG9uZyAyZlxuXHQiCisJCSAgICAgIjI6XG4iIDogIj0mciIgKHRlbXBfcGMpIDogInIiIChleGVjX29mZnNldCkpOworCisJLyoKKwkgKiBXZSBrbm93IHRoZXJlIHdpbGwgYmUgPj0xIGl0ZXJhdGlvbiwgc28gd3JpdGUgYXMgZG8td2hpbGUgdG8gYXZvaWQKKwkgKiBwb2ludGxlc3MgbmVhZC1vZi1sb29wIGNoZWNrIGZvciAwIGl0ZXJhdGlvbnMuCisJICovCisJZG8geworCQllYSA9IGJhc2VfYWRkciArIFBBR0VfU0laRTsKKwkJYSA9IGJhc2VfYWRkcjsKKwkJcCA9IHBoeXM7CisKKwkJZG8geworCQkJKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopYSA9IHA7CisJCQkvKgorCQkJICogTmV4dCBsaW5lOiBpbnRlbnRpb25hbGx5IG5vdCBwKzMyLCBzYXZlcyBhbiBhZGQsIHAKKwkJCSAqIHdpbGwgZG8gc2luY2Ugb25seSB0aGUgY2FjaGUgdGFnIGJpdHMgbmVlZCB0bworCQkJICogbWF0Y2guCisJCQkgKi8KKwkJCSoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKShhKzMyKSA9IHA7CisJCQlhICs9IDY0OworCQkJcCArPSA2NDsKKwkJfSB3aGlsZSAoYSA8IGVhKTsKKworCQliYXNlX2FkZHIgKz0gd2F5X2luY3I7CisJfSB3aGlsZSAoLS13YXlfY291bnQgIT0gMCk7Cit9CisKKy8qCisgKiBCcmVhayB0aGUgMSwgMiBhbmQgNCB3YXkgdmFyaWFudHMgb2YgdGhpcyBvdXQgaW50byBzZXBhcmF0ZSBmdW5jdGlvbnMgdG8KKyAqIGF2b2lkIG5lYXJseSBhbGwgdGhlIG92ZXJoZWFkIG9mIGhhdmluZyB0aGUgY29uZGl0aW9uYWwgc3R1ZmYgaW4gdGhlIGZ1bmN0aW9uCisgKiBib2RpZXMgKCsgdGhlIDEgYW5kIDIgd2F5IGNhc2VzIGF2b2lkIHNhdmluZyBhbnkgcmVnaXN0ZXJzIHRvbykuCisgKi8KK3N0YXRpYyB2b2lkIF9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfMXdheSh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQl1bnNpZ25lZCBsb25nIGV4dGVudF9wZXJfd2F5KQoreworCXVuc2lnbmVkIGxvbmcgb3JpZ19zciwgc3Jfd2l0aF9ibDsKKwl1bnNpZ25lZCBsb25nIGJhc2VfYWRkcjsKKwl1bnNpZ25lZCBsb25nIHdheV9pbmNyLCBsaW5lc3osIHdheV9zaXplOworCXN0cnVjdCBjYWNoZV9pbmZvICpkY2FjaGU7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBhMCwgYTBlOworCisJYXNtIHZvbGF0aWxlKCJzdGMgc3IsICUwIiA6ICI9ciIgKG9yaWdfc3IpKTsKKwlzcl93aXRoX2JsID0gb3JpZ19zciB8ICgxPDwyOCk7CisJYmFzZV9hZGRyID0gKCh1bnNpZ25lZCBsb25nKSZlbXB0eV96ZXJvX3BhZ2VbMF0pOworCisJLyoKKwkgKiBUaGUgcHJldmlvdXMgY29kZSBhbGlnbmVkIGJhc2VfYWRkciB0byAxNmssIGkuZS4gdGhlIHdheV9zaXplIG9mIGFsbAorCSAqIGV4aXN0aW5nIFNILTQgRC1jYWNoZXMuICBXaGlsc3QgSSBkb24ndCBzZWUgYSBuZWVkIHRvIGhhdmUgdGhpcworCSAqIGFsaWduZWQgdG8gYW55IGJldHRlciB0aGFuIHRoZSBjYWNoZSBsaW5lIHNpemUgKHdoaWNoIGl0IHdpbGwgYmUKKwkgKiBhbnl3YXkgYnkgY29uc3RydWN0aW9uKSwgbGV0J3MgYWxpZ24gaXQgdG8gYXQgbGVhc3QgdGhlIHdheV9zaXplIG9mCisJICogYW55IGV4aXN0aW5nIG9yIGNvbmNlaXZhYmxlIFNILTQgRC1jYWNoZS4gIC0tIFJQQworCSAqLworCWJhc2VfYWRkciA9ICgoYmFzZV9hZGRyID4+IDE2KSA8PCAxNik7CisJYmFzZV9hZGRyIHw9IHN0YXJ0OworCisJZGNhY2hlID0gJmNwdV9kYXRhLT5kY2FjaGU7CisJbGluZXN6ID0gZGNhY2hlLT5saW5lc3o7CisJd2F5X2luY3IgPSBkY2FjaGUtPndheV9pbmNyOworCXdheV9zaXplID0gZGNhY2hlLT53YXlfc2l6ZTsKKworCWEwID0gYmFzZV9hZGRyOworCWEwZSA9IGJhc2VfYWRkciArIGV4dGVudF9wZXJfd2F5OworCWRvIHsKKwkJYXNtIHZvbGF0aWxlKCJsZGMgJTAsIHNyIiA6IDogInIiIChzcl93aXRoX2JsKSk7CisJCWFzbSB2b2xhdGlsZSgibW92Y2EubCByMCwgQCUwXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUwIiA6IDogInIiIChhMCkpOworCQlhMCArPSBsaW5lc3o7CisJCWFzbSB2b2xhdGlsZSgibW92Y2EubCByMCwgQCUwXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUwIiA6IDogInIiIChhMCkpOworCQlhMCArPSBsaW5lc3o7CisJCWFzbSB2b2xhdGlsZSgibW92Y2EubCByMCwgQCUwXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUwIiA6IDogInIiIChhMCkpOworCQlhMCArPSBsaW5lc3o7CisJCWFzbSB2b2xhdGlsZSgibW92Y2EubCByMCwgQCUwXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUwIiA6IDogInIiIChhMCkpOworCQlhc20gdm9sYXRpbGUoImxkYyAlMCwgc3IiIDogOiAiciIgKG9yaWdfc3IpKTsKKwkJYTAgKz0gbGluZXN6OworCX0gd2hpbGUgKGEwIDwgYTBlKTsKK30KKworc3RhdGljIHZvaWQgX19mbHVzaF9kY2FjaGVfc2VnbWVudF8yd2F5KHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJCXVuc2lnbmVkIGxvbmcgZXh0ZW50X3Blcl93YXkpCit7CisJdW5zaWduZWQgbG9uZyBvcmlnX3NyLCBzcl93aXRoX2JsOworCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgd2F5X2luY3IsIGxpbmVzeiwgd2F5X3NpemU7CisJc3RydWN0IGNhY2hlX2luZm8gKmRjYWNoZTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGEwLCBhMSwgYTBlOworCisJYXNtIHZvbGF0aWxlKCJzdGMgc3IsICUwIiA6ICI9ciIgKG9yaWdfc3IpKTsKKwlzcl93aXRoX2JsID0gb3JpZ19zciB8ICgxPDwyOCk7CisJYmFzZV9hZGRyID0gKCh1bnNpZ25lZCBsb25nKSZlbXB0eV96ZXJvX3BhZ2VbMF0pOworCisJLyogU2VlIGNvbW1lbnQgdW5kZXIgMS13YXkgYWJvdmUgKi8KKwliYXNlX2FkZHIgPSAoKGJhc2VfYWRkciA+PiAxNikgPDwgMTYpOworCWJhc2VfYWRkciB8PSBzdGFydDsKKworCWRjYWNoZSA9ICZjcHVfZGF0YS0+ZGNhY2hlOworCWxpbmVzeiA9IGRjYWNoZS0+bGluZXN6OworCXdheV9pbmNyID0gZGNhY2hlLT53YXlfaW5jcjsKKwl3YXlfc2l6ZSA9IGRjYWNoZS0+d2F5X3NpemU7CisKKwlhMCA9IGJhc2VfYWRkcjsKKwlhMSA9IGEwICsgd2F5X2luY3I7CisJYTBlID0gYmFzZV9hZGRyICsgZXh0ZW50X3Blcl93YXk7CisJZG8geworCQlhc20gdm9sYXRpbGUoImxkYyAlMCwgc3IiIDogOiAiciIgKHNyX3dpdGhfYmwpKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZjYS5sIHIwLCBAJTBcblx0IgorCQkJICAgICAibW92Y2EubCByMCwgQCUxXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUwXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUxIiA6IDoKKwkJCSAgICAgInIiIChhMCksICJyIiAoYTEpKTsKKwkJYTAgKz0gbGluZXN6OworCQlhMSArPSBsaW5lc3o7CisJCWFzbSB2b2xhdGlsZSgibW92Y2EubCByMCwgQCUwXG5cdCIKKwkJCSAgICAgIm1vdmNhLmwgcjAsIEAlMVxuXHQiCisJCQkgICAgICJvY2JpIEAlMFxuXHQiCisJCQkgICAgICJvY2JpIEAlMSIgOiA6CisJCQkgICAgICJyIiAoYTApLCAiciIgKGExKSk7CisJCWEwICs9IGxpbmVzejsKKwkJYTEgKz0gbGluZXN6OworCQlhc20gdm9sYXRpbGUoIm1vdmNhLmwgcjAsIEAlMFxuXHQiCisJCQkgICAgICJtb3ZjYS5sIHIwLCBAJTFcblx0IgorCQkJICAgICAib2NiaSBAJTBcblx0IgorCQkJICAgICAib2NiaSBAJTEiIDogOgorCQkJICAgICAiciIgKGEwKSwgInIiIChhMSkpOworCQlhMCArPSBsaW5lc3o7CisJCWExICs9IGxpbmVzejsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZjYS5sIHIwLCBAJTBcblx0IgorCQkJICAgICAibW92Y2EubCByMCwgQCUxXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUwXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUxIiA6IDoKKwkJCSAgICAgInIiIChhMCksICJyIiAoYTEpKTsKKwkJYXNtIHZvbGF0aWxlKCJsZGMgJTAsIHNyIiA6IDogInIiIChvcmlnX3NyKSk7CisJCWEwICs9IGxpbmVzejsKKwkJYTEgKz0gbGluZXN6OworCX0gd2hpbGUgKGEwIDwgYTBlKTsKK30KKworc3RhdGljIHZvaWQgX19mbHVzaF9kY2FjaGVfc2VnbWVudF80d2F5KHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJCXVuc2lnbmVkIGxvbmcgZXh0ZW50X3Blcl93YXkpCit7CisJdW5zaWduZWQgbG9uZyBvcmlnX3NyLCBzcl93aXRoX2JsOworCXVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyOworCXVuc2lnbmVkIGxvbmcgd2F5X2luY3IsIGxpbmVzeiwgd2F5X3NpemU7CisJc3RydWN0IGNhY2hlX2luZm8gKmRjYWNoZTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIGEwLCBhMSwgYTIsIGEzLCBhMGU7CisKKwlhc20gdm9sYXRpbGUoInN0YyBzciwgJTAiIDogIj1yIiAob3JpZ19zcikpOworCXNyX3dpdGhfYmwgPSBvcmlnX3NyIHwgKDE8PDI4KTsKKwliYXNlX2FkZHIgPSAoKHVuc2lnbmVkIGxvbmcpJmVtcHR5X3plcm9fcGFnZVswXSk7CisKKwkvKiBTZWUgY29tbWVudCB1bmRlciAxLXdheSBhYm92ZSAqLworCWJhc2VfYWRkciA9ICgoYmFzZV9hZGRyID4+IDE2KSA8PCAxNik7CisJYmFzZV9hZGRyIHw9IHN0YXJ0OworCisJZGNhY2hlID0gJmNwdV9kYXRhLT5kY2FjaGU7CisJbGluZXN6ID0gZGNhY2hlLT5saW5lc3o7CisJd2F5X2luY3IgPSBkY2FjaGUtPndheV9pbmNyOworCXdheV9zaXplID0gZGNhY2hlLT53YXlfc2l6ZTsKKworCWEwID0gYmFzZV9hZGRyOworCWExID0gYTAgKyB3YXlfaW5jcjsKKwlhMiA9IGExICsgd2F5X2luY3I7CisJYTMgPSBhMiArIHdheV9pbmNyOworCWEwZSA9IGJhc2VfYWRkciArIGV4dGVudF9wZXJfd2F5OworCWRvIHsKKwkJYXNtIHZvbGF0aWxlKCJsZGMgJTAsIHNyIiA6IDogInIiIChzcl93aXRoX2JsKSk7CisJCWFzbSB2b2xhdGlsZSgibW92Y2EubCByMCwgQCUwXG5cdCIKKwkJCSAgICAgIm1vdmNhLmwgcjAsIEAlMVxuXHQiCisJCQkgICAgICJtb3ZjYS5sIHIwLCBAJTJcblx0IgorCQkJICAgICAibW92Y2EubCByMCwgQCUzXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUwXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUxXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUyXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUzXG5cdCIgOiA6CisJCQkgICAgICJyIiAoYTApLCAiciIgKGExKSwgInIiIChhMiksICJyIiAoYTMpKTsKKwkJYTAgKz0gbGluZXN6OworCQlhMSArPSBsaW5lc3o7CisJCWEyICs9IGxpbmVzejsKKwkJYTMgKz0gbGluZXN6OworCQlhc20gdm9sYXRpbGUoIm1vdmNhLmwgcjAsIEAlMFxuXHQiCisJCQkgICAgICJtb3ZjYS5sIHIwLCBAJTFcblx0IgorCQkJICAgICAibW92Y2EubCByMCwgQCUyXG5cdCIKKwkJCSAgICAgIm1vdmNhLmwgcjAsIEAlM1xuXHQiCisJCQkgICAgICJvY2JpIEAlMFxuXHQiCisJCQkgICAgICJvY2JpIEAlMVxuXHQiCisJCQkgICAgICJvY2JpIEAlMlxuXHQiCisJCQkgICAgICJvY2JpIEAlM1xuXHQiIDogOgorCQkJICAgICAiciIgKGEwKSwgInIiIChhMSksICJyIiAoYTIpLCAiciIgKGEzKSk7CisJCWEwICs9IGxpbmVzejsKKwkJYTEgKz0gbGluZXN6OworCQlhMiArPSBsaW5lc3o7CisJCWEzICs9IGxpbmVzejsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZjYS5sIHIwLCBAJTBcblx0IgorCQkJICAgICAibW92Y2EubCByMCwgQCUxXG5cdCIKKwkJCSAgICAgIm1vdmNhLmwgcjAsIEAlMlxuXHQiCisJCQkgICAgICJtb3ZjYS5sIHIwLCBAJTNcblx0IgorCQkJICAgICAib2NiaSBAJTBcblx0IgorCQkJICAgICAib2NiaSBAJTFcblx0IgorCQkJICAgICAib2NiaSBAJTJcblx0IgorCQkJICAgICAib2NiaSBAJTNcblx0IiA6IDoKKwkJCSAgICAgInIiIChhMCksICJyIiAoYTEpLCAiciIgKGEyKSwgInIiIChhMykpOworCQlhMCArPSBsaW5lc3o7CisJCWExICs9IGxpbmVzejsKKwkJYTIgKz0gbGluZXN6OworCQlhMyArPSBsaW5lc3o7CisJCWFzbSB2b2xhdGlsZSgibW92Y2EubCByMCwgQCUwXG5cdCIKKwkJCSAgICAgIm1vdmNhLmwgcjAsIEAlMVxuXHQiCisJCQkgICAgICJtb3ZjYS5sIHIwLCBAJTJcblx0IgorCQkJICAgICAibW92Y2EubCByMCwgQCUzXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUwXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUxXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUyXG5cdCIKKwkJCSAgICAgIm9jYmkgQCUzXG5cdCIgOiA6CisJCQkgICAgICJyIiAoYTApLCAiciIgKGExKSwgInIiIChhMiksICJyIiAoYTMpKTsKKwkJYXNtIHZvbGF0aWxlKCJsZGMgJTAsIHNyIiA6IDogInIiIChvcmlnX3NyKSk7CisJCWEwICs9IGxpbmVzejsKKwkJYTEgKz0gbGluZXN6OworCQlhMiArPSBsaW5lc3o7CisJCWEzICs9IGxpbmVzejsKKwl9IHdoaWxlIChhMCA8IGEwZSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2NhY2hlLXNoNzcwNS5jIGIvYXJjaC9zaC9tbS9jYWNoZS1zaDc3MDUuYwppbmRleCBiZjk0ZWVkLi4wNDVhYmRmIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2NhY2hlLXNoNzcwNS5jCisrKyBiL2FyY2gvc2gvbW0vY2FjaGUtc2g3NzA1LmMKQEAgLTksNyArOSw2IEBACiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqLwotCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpAQCAtMjUsMTQgKzI0LDEwIEBACiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAotLyogVGhlIDMyS0IgY2FjaGUgb24gdGhlIFNINzcwNSBzdWZmZXJzIGZyb20gdGhlIHNhbWUgc3lub255bSBwcm9ibGVtCi0gKiBhcyBTSDQgQ1BVcyAqLwotCi0jZGVmaW5lIF9fcHRlX29mZnNldChhZGRyZXNzKSBcCi0JCSgoYWRkcmVzcyA+PiBQQUdFX1NISUZUKSAmIChQVFJTX1BFUl9QVEUgLSAxKSkKLSNkZWZpbmUgcHRlX29mZnNldChkaXIsIGFkZHJlc3MpICgocHRlX3QgKikgcG1kX3BhZ2VfdmFkZHIoKihkaXIpKSArIFwKLQkJX19wdGVfb2Zmc2V0KGFkZHJlc3MpKQotCisvKgorICogVGhlIDMyS0IgY2FjaGUgb24gdGhlIFNINzcwNSBzdWZmZXJzIGZyb20gdGhlIHNhbWUgc3lub255bSBwcm9ibGVtCisgKiBhcyBTSDQgQ1BVcworICovCiBzdGF0aWMgaW5saW5lIHZvaWQgY2FjaGVfd2JhY2tfYWxsKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB3YXlzLCB3YXlzaXplLCBhZGRyc3RhcnQ7CkBAIC03Myw3ICs2OCw2IEBACiAJX19mbHVzaF93YmFja19yZWdpb24oKHZvaWQgKilzdGFydCwgZW5kIC0gc3RhcnQpOwogfQogCi0KIC8qCiAgKiBXcml0ZWJhY2smSW52YWxpZGF0ZSB0aGUgRC1jYWNoZSBvZiB0aGUgcGFnZQogICovCkBAIC0xMjgsNyArMTIyLDYgQEAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLQogLyoKICAqIFdyaXRlIGJhY2sgJiBpbnZhbGlkYXRlIHRoZSBELWNhY2hlIG9mIHRoZSBwYWdlLgogICogKFRvIGF2b2lkICJhbGlhcyIgaXNzdWVzKQpAQCAtMTg2LDcgKzE3OSw4IEBACiAgKgogICogQUREUkVTUzogVmlydHVhbCBBZGRyZXNzIChVMCBhZGRyZXNzKQogICovCi12b2lkIGZsdXNoX2NhY2hlX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBwZm4pCit2b2lkIGZsdXNoX2NhY2hlX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJICAgICAgdW5zaWduZWQgbG9uZyBwZm4pCiB7CiAJX19mbHVzaF9kY2FjaGVfcGFnZShwZm4gPDwgUEFHRV9TSElGVCk7CiB9CkBAIC0yMDMsNCArMTk3LDMgQEAKIHsKIAlfX2ZsdXNoX3B1cmdlX3JlZ2lvbihwYWdlX2FkZHJlc3MocGFnZSksIFBBR0VfU0laRSk7CiB9Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vY2xlYXJfcGFnZS5TIGIvYXJjaC9zaC9tbS9jbGVhcl9wYWdlLlMKaW5kZXggMDhhY2VhZC4uN2I5NjQyNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9jbGVhcl9wYWdlLlMKKysrIGIvYXJjaC9zaC9tbS9jbGVhcl9wYWdlLlMKQEAgLTE5MywxMDIgKzE5Myw1IEBACiAJIG5vcAogLkw0MDk2Ogkud29yZAk0MDk2CiAKLUVOVFJZKF9fZmx1c2hfY2FjaGVfNDA5NikKLQltb3YubAkxZixyMwotCWFkZAlyNixyMwotCW1vdglyNCxyMAotCW1vdgkjNjQscjIKLQlzaGxsCXIyCi0JbW92CSM2NCxyNgotCWptcAlAcjMKLQkgbW92CSM5NixyNwotCS5hbGlnbgkyCi0xOgkubG9uZwkyZgotMjoKLQkucmVwdAkzMgotCW1vdi5sCXI1LEByMAotCW1vdi5sCXI1LEAoMzIscjApCi0JbW92LmwJcjUsQChyMCxyNikKLQltb3YubAlyNSxAKHIwLHI3KQotCWFkZAlyMixyNQotCWFkZAlyMixyMAotCS5lbmRyCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0Jbm9wCi0JcnRzCi0JIG5vcAotCi1FTlRSWShfX2ZsdXNoX2RjYWNoZV9hbGwpCi0JbW92LmwJMmYscjAKLQltb3YubAkzZixyNAotCWFuZAlyMCxyNAkJISByNCA9ICh1bnNpZ25lZCBsb25nKSZlbXB0eV96ZXJvX3BhZ2VbMF0gJiB+MHhmZmZmYzAwMAotCXN0YwlzcixyMQkJISBzYXZlIFNSCi0JbW92LmwJNGYscjIKLQlvcglyMSxyMgotCW1vdgkjMzIscjMKLQlzaGxsMglyMwotMToKLQlsZGMJcjIsc3IJCSEgc2V0IEJMIGJpdAotCW1vdmNhLmwJcjAsQHI0Ci0Jb2NiaQlAcjQKLQlhZGQJIzMyLHI0Ci0JbW92Y2EubAlyMCxAcjQKLQlvY2JpCUByNAotCWFkZAkjMzIscjQKLQltb3ZjYS5sCXIwLEByNAotCW9jYmkJQHI0Ci0JYWRkCSMzMixyNAotCW1vdmNhLmwJcjAsQHI0Ci0Jb2NiaQlAcjQKLQlsZGMJcjEsc3IJCSEgcmVzdG9yZSBTUgotCWR0CXIzCi0JYmYvcwkxYgotCSBhZGQJIzMyLHI0Ci0KLQlydHMKLQkgbm9wCi0JLmFsaWduCTIKLTI6CS5sb25nCTB4ZmZmZmMwMDAKLTM6CS5sb25nCWVtcHR5X3plcm9fcGFnZQotNDoJLmxvbmcJMHgxMDAwMDAwMAkhIEJMIGJpdAotCi0vKiBfX2ZsdXNoX2NhY2hlXzQwOTZfYWxsKHVuc2lnbmVkIGxvbmcgYWRkcikgKi8KLUVOVFJZKF9fZmx1c2hfY2FjaGVfNDA5Nl9hbGwpCi0JbW92LmwJMmYscjAKLQltb3YubAkzZixyMgotCWFuZAlyMCxyMgotCW9yCXIyLHI0CQkhIHI0ID0gYWRkciB8ICh1bnNpZ25lZCBsb25nKSZlbXB0eV96ZXJvX3BhZ2VbMF0gJiB+MHgzZmZmCi0Jc3RjCXNyLHIxCQkhIHNhdmUgU1IKLQltb3YubAk0ZixyMgotCW9yCXIxLHIyCi0JbW92CSMzMixyMwotMToKLQlsZGMJcjIsc3IJCSEgc2V0IEJMIGJpdAotCW1vdmNhLmwJcjAsQHI0Ci0Jb2NiaQlAcjQKLQlhZGQJIzMyLHI0Ci0JbW92Y2EubAlyMCxAcjQKLQlvY2JpCUByNAotCWFkZAkjMzIscjQKLQltb3ZjYS5sCXIwLEByNAotCW9jYmkJQHI0Ci0JYWRkCSMzMixyNAotCW1vdmNhLmwJcjAsQHI0Ci0Jb2NiaQlAcjQKLQlsZGMJcjEsc3IJCSEgcmVzdG9yZSBTUgotCWR0CXIzCi0JYmYvcwkxYgotCSBhZGQJIzMyLHI0Ci0KLQlydHMKLQkgbm9wCi0JLmFsaWduCTIKLTI6CS5sb25nCTB4ZmZmZmMwMDAKLTM6CS5sb25nCWVtcHR5X3plcm9fcGFnZQotNDoJLmxvbmcJMHgxMDAwMDAwMAkhIEJMIGJpdAogI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vY29uc2lzdGVudC5jIGIvYXJjaC9zaC9tbS9jb25zaXN0ZW50LmMKaW5kZXggZWU3M2UzMC4uYzgxZTZiNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9jb25zaXN0ZW50LmMKKysrIGIvYXJjaC9zaC9tbS9jb25zaXN0ZW50LmMKQEAgLTksNiArOSw4IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKIHZvaWQgKmNvbnNpc3RlbnRfYWxsb2MoZ2ZwX3QgZ2ZwLCBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCAqaGFuZGxlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9mYXVsdC5jIGIvYXJjaC9zaC9tbS9mYXVsdC5jCmluZGV4IDc3NWY4NmMuLmM2OWZkNjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vZmF1bHQuYworKysgYi9hcmNoL3NoL21tL2ZhdWx0LmMKQEAgLTEsMzMgKzEsMjIgQEAKLS8qICRJZDogZmF1bHQuYyx2IDEuMTQgMjAwNC8wMS8xMyAwNTo1MjoxMSBra29qaW1hIEV4cCAkCisvKgorICogUGFnZSBmYXVsdCBoYW5kbGVyIGZvciBTSCB3aXRoIGFuIE1NVS4KICAqCi0gKiAgbGludXgvYXJjaC9zaC9tbS9mYXVsdC5jCiAgKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBOaWliZSBZdXRha2EKICAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIFBhdWwgTXVuZHQKICAqCiAgKiAgQmFzZWQgb24gbGludXgvYXJjaC9pMzg2L21tL2ZhdWx0LmM6CiAgKiAgIENvcHlyaWdodCAoQykgMTk5NSAgTGludXMgVG9ydmFsZHMKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KICAqLwotCi0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9rZ2RiLmg+CiAKIGV4dGVybiB2b2lkIGRpZShjb25zdCBjaGFyICosc3RydWN0IHB0X3JlZ3MgKixsb25nKTsKQEAgLTE4NywxOCArMTc2LDMwIEBACiAJCWdvdG8gbm9fY29udGV4dDsKIH0KIAorI2lmZGVmIENPTkZJR19TSF9TVE9SRV9RVUVVRVMKIC8qCi0gKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHQgZGlzYWJsZWQuCisgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIGZvciB0aGUgU0gtNCBzdG9yZSBxdWV1ZXMsIGFzIHBhZ2VzIGZvciB0aGlzCisgKiBzcGFjZSBzdGlsbCBuZWVkIHRvIGJlIGZhdWx0ZWQgaW4gYmVmb3JlIGl0J3MgcG9zc2libGUgdG8gZmx1c2ggdGhlCisgKiBzdG9yZSBxdWV1ZSBjYWNoZSBmb3Igd3JpdGVvdXQgdG8gdGhlIHJlbWFwcGVkIHJlZ2lvbi4KICAqLwotYXNtbGlua2FnZSBpbnQgX19kb19wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIHdyaXRlYWNjZXNzLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKKyNkZWZpbmUgUDNfQUREUl9NQVgJCShQNFNFR19TVE9SRV9RVUUgKyAweDA0MDAwMDAwKQorI2Vsc2UKKyNkZWZpbmUgUDNfQUREUl9NQVgJCVA0U0VHCisjZW5kaWYKKworLyoKKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KK2FzbWxpbmthZ2UgaW50IF9fa3Byb2JlcyBfX2RvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJCSB1bnNpZ25lZCBsb25nIHdyaXRlYWNjZXNzLAorCQkJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCXVuc2lnbmVkIGxvbmcgYWRkcm1heCA9IFA0U0VHOwogCXBnZF90ICpwZ2Q7CisJcHVkX3QgKnB1ZDsKIAlwbWRfdCAqcG1kOwogCXB0ZV90ICpwdGU7CiAJcHRlX3QgZW50cnk7Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW07CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKIAlzcGlubG9ja190ICpwdGw7CiAJaW50IHJldCA9IDE7CiAKQEAgLTIwNywzMSArMjA4LDM3IEBACiAJCWtnZGJfYnVzX2Vycl9ob29rKCk7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TSF9TVE9SRV9RVUVVRVMKLQlhZGRybWF4ID0gUDRTRUdfU1RPUkVfUVVFICsgMHgwNDAwMDAwMDsKLSNlbmRpZgotCi0JaWYgKGFkZHJlc3MgPj0gUDNTRUcgJiYgYWRkcmVzcyA8IGFkZHJtYXgpIHsKKwkvKgorCSAqIFdlIGRvbid0IHRha2UgcGFnZSBmYXVsdHMgZm9yIFAxLCBQMiwgYW5kIHBhcnRzIG9mIFA0LCB0aGVzZQorCSAqIGFyZSBhbHdheXMgbWFwcGVkLCB3aGV0aGVyIGl0IGJlIGR1ZSB0byBsZWdhY3kgYmVoYXZpb3VyIGluCisJICogMjktYml0IG1vZGUsIG9yIGR1ZSB0byBQTUIgY29uZmlndXJhdGlvbiBpbiAzMi1iaXQgbW9kZS4KKwkgKi8KKwlpZiAoYWRkcmVzcyA+PSBQM1NFRyAmJiBhZGRyZXNzIDwgUDNfQUREUl9NQVgpIHsKIAkJcGdkID0gcGdkX29mZnNldF9rKGFkZHJlc3MpOwogCQltbSA9IE5VTEw7Ci0JfSBlbHNlIGlmIChhZGRyZXNzID49IFRBU0tfU0laRSkKLQkJcmV0dXJuIDE7Ci0JZWxzZSBpZiAoIShtbSA9IGN1cnJlbnQtPm1tKSkKLQkJcmV0dXJuIDE7Ci0JZWxzZQotCQlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyZXNzKTsKKwl9IGVsc2UgeworCQlpZiAodW5saWtlbHkoYWRkcmVzcyA+PSBUQVNLX1NJWkUgfHwgIW1tKSkKKwkJCXJldHVybiAxOwogCi0JcG1kID0gcG1kX29mZnNldChwZ2QsIGFkZHJlc3MpOworCQlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyZXNzKTsKKwl9CisKKwlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcmVzcyk7CisJaWYgKHB1ZF9ub25lX29yX2NsZWFyX2JhZChwdWQpKQorCQlyZXR1cm4gMTsKKwlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcmVzcyk7CiAJaWYgKHBtZF9ub25lX29yX2NsZWFyX2JhZChwbWQpKQogCQlyZXR1cm4gMTsKKwogCWlmIChtbSkKIAkJcHRlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLCAmcHRsKTsKIAllbHNlCiAJCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgYWRkcmVzcyk7CiAKIAllbnRyeSA9ICpwdGU7Ci0JaWYgKHB0ZV9ub25lKGVudHJ5KSB8fCBwdGVfbm90X3ByZXNlbnQoZW50cnkpCi0JICAgIHx8ICh3cml0ZWFjY2VzcyAmJiAhcHRlX3dyaXRlKGVudHJ5KSkpCisJaWYgKHVubGlrZWx5KHB0ZV9ub25lKGVudHJ5KSB8fCBwdGVfbm90X3ByZXNlbnQoZW50cnkpKSkKKwkJZ290byB1bmxvY2s7CisJaWYgKHVubGlrZWx5KHdyaXRlYWNjZXNzICYmICFwdGVfd3JpdGUoZW50cnkpKSkKIAkJZ290byB1bmxvY2s7CiAKIAlpZiAod3JpdGVhY2Nlc3MpCkBAIC0yNDMsMTMgKzI1MCw3IEBACiAJICogSVRMQiBpcyBub3QgYWZmZWN0ZWQgYnkgImxkdGxiIiBpbnN0cnVjdGlvbi4KIAkgKiBTbywgd2UgbmVlZCB0byBmbHVzaCB0aGUgZW50cnkgYnkgb3Vyc2VsdmVzLgogCSAqLwotCi0JewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCV9fZmx1c2hfdGxiX3BhZ2UoZ2V0X2FzaWQoKSwgYWRkcmVzcyZQQUdFX01BU0spOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfQorCV9fZmx1c2hfdGxiX3BhZ2UoZ2V0X2FzaWQoKSwgYWRkcmVzcyAmIFBBR0VfTUFTSyk7CiAjZW5kaWYKIAogCXNldF9wdGUocHRlLCBlbnRyeSk7CkBAIC0yNjAsMTIxICsyNjEsMyBAQAogCQlwdGVfdW5tYXBfdW5sb2NrKHB0ZSwgcHRsKTsKIAlyZXR1cm4gcmV0OwogfQotCi12b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHBhZ2UpCi17Ci0JaWYgKHZtYS0+dm1fbW0gJiYgdm1hLT52bV9tbS0+Y29udGV4dCAhPSBOT19DT05URVhUKSB7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JCXVuc2lnbmVkIGxvbmcgYXNpZDsKLQkJdW5zaWduZWQgbG9uZyBzYXZlZF9hc2lkID0gTU1VX05PX0FTSUQ7Ci0KLQkJYXNpZCA9IHZtYS0+dm1fbW0tPmNvbnRleHQgJiBNTVVfQ09OVEVYVF9BU0lEX01BU0s7Ci0JCXBhZ2UgJj0gUEFHRV9NQVNLOwotCi0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJaWYgKHZtYS0+dm1fbW0gIT0gY3VycmVudC0+bW0pIHsKLQkJCXNhdmVkX2FzaWQgPSBnZXRfYXNpZCgpOwotCQkJc2V0X2FzaWQoYXNpZCk7Ci0JCX0KLQkJX19mbHVzaF90bGJfcGFnZShhc2lkLCBwYWdlKTsKLQkJaWYgKHNhdmVkX2FzaWQgIT0gTU1VX05PX0FTSUQpCi0JCQlzZXRfYXNpZChzYXZlZF9hc2lkKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCX0KLX0KLQotdm9pZCBmbHVzaF90bGJfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0Jc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOwotCi0JaWYgKG1tLT5jb250ZXh0ICE9IE5PX0NPTlRFWFQpIHsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJaW50IHNpemU7Ci0KLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCQlzaXplID0gKGVuZCAtIHN0YXJ0ICsgKFBBR0VfU0laRSAtIDEpKSA+PiBQQUdFX1NISUZUOwotCQlpZiAoc2l6ZSA+IChNTVVfTlRMQl9FTlRSSUVTLzQpKSB7IC8qIFRvbyBtYW55IFRMQiB0byBmbHVzaCAqLwotCQkJbW0tPmNvbnRleHQgPSBOT19DT05URVhUOwotCQkJaWYgKG1tID09IGN1cnJlbnQtPm1tKQotCQkJCWFjdGl2YXRlX2NvbnRleHQobW0pOwotCQl9IGVsc2UgewotCQkJdW5zaWduZWQgbG9uZyBhc2lkID0gbW0tPmNvbnRleHQmTU1VX0NPTlRFWFRfQVNJRF9NQVNLOwotCQkJdW5zaWduZWQgbG9uZyBzYXZlZF9hc2lkID0gTU1VX05PX0FTSUQ7Ci0KLQkJCXN0YXJ0ICY9IFBBR0VfTUFTSzsKLQkJCWVuZCArPSAoUEFHRV9TSVpFIC0gMSk7Ci0JCQllbmQgJj0gUEFHRV9NQVNLOwotCQkJaWYgKG1tICE9IGN1cnJlbnQtPm1tKSB7Ci0JCQkJc2F2ZWRfYXNpZCA9IGdldF9hc2lkKCk7Ci0JCQkJc2V0X2FzaWQoYXNpZCk7Ci0JCQl9Ci0JCQl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKLQkJCQlfX2ZsdXNoX3RsYl9wYWdlKGFzaWQsIHN0YXJ0KTsKLQkJCQlzdGFydCArPSBQQUdFX1NJWkU7Ci0JCQl9Ci0JCQlpZiAoc2F2ZWRfYXNpZCAhPSBNTVVfTk9fQVNJRCkKLQkJCQlzZXRfYXNpZChzYXZlZF9hc2lkKTsKLQkJfQotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfQotfQotCi12b2lkIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgc2l6ZTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlzaXplID0gKGVuZCAtIHN0YXJ0ICsgKFBBR0VfU0laRSAtIDEpKSA+PiBQQUdFX1NISUZUOwotCWlmIChzaXplID4gKE1NVV9OVExCX0VOVFJJRVMvNCkpIHsgLyogVG9vIG1hbnkgVExCIHRvIGZsdXNoICovCi0JCWZsdXNoX3RsYl9hbGwoKTsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBsb25nIGFzaWQgPSBpbml0X21tLmNvbnRleHQmTU1VX0NPTlRFWFRfQVNJRF9NQVNLOwotCQl1bnNpZ25lZCBsb25nIHNhdmVkX2FzaWQgPSBnZXRfYXNpZCgpOwotCi0JCXN0YXJ0ICY9IFBBR0VfTUFTSzsKLQkJZW5kICs9IChQQUdFX1NJWkUgLSAxKTsKLQkJZW5kICY9IFBBR0VfTUFTSzsKLQkJc2V0X2FzaWQoYXNpZCk7Ci0JCXdoaWxlIChzdGFydCA8IGVuZCkgewotCQkJX19mbHVzaF90bGJfcGFnZShhc2lkLCBzdGFydCk7Ci0JCQlzdGFydCArPSBQQUdFX1NJWkU7Ci0JCX0KLQkJc2V0X2FzaWQoc2F2ZWRfYXNpZCk7Ci0JfQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotdm9pZCBmbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JLyogSW52YWxpZGF0ZSBhbGwgVExCIG9mIHRoaXMgcHJvY2Vzcy4gKi8KLQkvKiBJbnN0ZWFkIG9mIGludmFsaWRhdGluZyBlYWNoIFRMQiwgd2UgZ2V0IG5ldyBNTVUgY29udGV4dC4gKi8KLQlpZiAobW0tPmNvbnRleHQgIT0gTk9fQ09OVEVYVCkgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJbW0tPmNvbnRleHQgPSBOT19DT05URVhUOwotCQlpZiAobW0gPT0gY3VycmVudC0+bW0pCi0JCQlhY3RpdmF0ZV9jb250ZXh0KG1tKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCX0KLX0KLQotdm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgc3RhdHVzOwotCi0JLyoKLQkgKiBGbHVzaCBhbGwgdGhlIFRMQi4KLQkgKgotCSAqIFdyaXRlIHRvIHRoZSBNTVUgY29udHJvbCByZWdpc3RlcidzIGJpdDoKLQkgKiAJVEYtYml0IGZvciBTSC0zLCBUSS1iaXQgZm9yIFNILTQuCi0JICogICAgICBJdCdzIHNhbWUgcG9zaXRpb24sIGJpdCAjMi4KLQkgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0Jc3RhdHVzID0gY3RybF9pbmwoTU1VQ1IpOwotCXN0YXR1cyB8PSAweDA0OwkJCi0JY3RybF9vdXRsKHN0YXR1cywgTU1VQ1IpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vaHVnZXRsYnBhZ2UuYyBiL2FyY2gvc2gvbW0vaHVnZXRsYnBhZ2UuYwppbmRleCAyYTg1YmMxLi4zMjkwNTlkIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2h1Z2V0bGJwYWdlLmMKKysrIGIvYXJjaC9zaC9tbS9odWdldGxicGFnZS5jCkBAIC0yNiw2MyArMjYsNDMgQEAKIHB0ZV90ICpodWdlX3B0ZV9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCXBnZF90ICpwZ2Q7CisJcHVkX3QgKnB1ZDsKIAlwbWRfdCAqcG1kOwogCXB0ZV90ICpwdGUgPSBOVUxMOwogCiAJcGdkID0gcGdkX29mZnNldChtbSwgYWRkcik7CiAJaWYgKHBnZCkgewotCQlwbWQgPSBwbWRfYWxsb2MobW0sIHBnZCwgYWRkcik7Ci0JCWlmIChwbWQpCi0JCQlwdGUgPSBwdGVfYWxsb2NfbWFwKG1tLCBwbWQsIGFkZHIpOworCQlwdWQgPSBwdWRfYWxsb2MobW0sIHBnZCwgYWRkcik7CisJCWlmIChwdWQpIHsKKwkJCXBtZCA9IHBtZF9hbGxvYyhtbSwgcHVkLCBhZGRyKTsKKwkJCWlmIChwbWQpCisJCQkJcHRlID0gcHRlX2FsbG9jX21hcChtbSwgcG1kLCBhZGRyKTsKKwkJfQogCX0KKwogCXJldHVybiBwdGU7CiB9CiAKIHB0ZV90ICpodWdlX3B0ZV9vZmZzZXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlwZ2RfdCAqcGdkOworCXB1ZF90ICpwdWQ7CiAJcG1kX3QgKnBtZDsKIAlwdGVfdCAqcHRlID0gTlVMTDsKIAogCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHIpOwogCWlmIChwZ2QpIHsKLQkJcG1kID0gcG1kX29mZnNldChwZ2QsIGFkZHIpOwotCQlpZiAocG1kKQotCQkJcHRlID0gcHRlX29mZnNldF9tYXAocG1kLCBhZGRyKTsKKwkJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHIpOworCQlpZiAocHVkKSB7CisJCQlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7CisJCQlpZiAocG1kKQorCQkJCXB0ZSA9IHB0ZV9vZmZzZXRfbWFwKHBtZCwgYWRkcik7CisJCX0KIAl9CisKIAlyZXR1cm4gcHRlOwogfQogCi12b2lkIHNldF9odWdlX3B0ZV9hdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkgICAgIHB0ZV90ICpwdGVwLCBwdGVfdCBlbnRyeSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAoMSA8PCBIVUdFVExCX1BBR0VfT1JERVIpOyBpKyspIHsKLQkJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlcCwgZW50cnkpOwotCQlwdGVwKys7Ci0JCWFkZHIgKz0gUEFHRV9TSVpFOwotCQlwdGVfdmFsKGVudHJ5KSArPSBQQUdFX1NJWkU7Ci0JfQotfQotCi1wdGVfdCBodWdlX3B0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJICAgICAgcHRlX3QgKnB0ZXApCi17Ci0JcHRlX3QgZW50cnk7Ci0JaW50IGk7Ci0KLQllbnRyeSA9ICpwdGVwOwotCi0JZm9yIChpID0gMDsgaSA8ICgxIDw8IEhVR0VUTEJfUEFHRV9PUkRFUik7IGkrKykgewotCQlwdGVfY2xlYXIobW0sIGFkZHIsIHB0ZXApOwotCQlhZGRyICs9IFBBR0VfU0laRTsKLQkJcHRlcCsrOwotCX0KLQotCXJldHVybiBlbnRyeTsKLX0KLQogc3RydWN0IHBhZ2UgKmZvbGxvd19odWdlX2FkZHIoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCB3cml0ZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vaW5pdC5jIGIvYXJjaC9zaC9tbS9pbml0LmMKaW5kZXggOGVhMjdjYS4uNzE1NGQxYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9pbml0LmMKKysrIGIvYXJjaC9zaC9tbS9pbml0LmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KLQorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC04MCw2ICs4MCw3IEBACiBzdGF0aWMgdm9pZCBzZXRfcHRlX3BoeXModW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHBoeXMsIHBncHJvdF90IHByb3QpCiB7CiAJcGdkX3QgKnBnZDsKKwlwdWRfdCAqcHVkOwogCXBtZF90ICpwbWQ7CiAJcHRlX3QgKnB0ZTsKIApAQCAtODksNyArOTAsMTcgQEAKIAkJcmV0dXJuOwogCX0KIAotCXBtZCA9IHBtZF9vZmZzZXQocGdkLCBhZGRyKTsKKwlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcik7CisJaWYgKHB1ZF9ub25lKCpwdWQpKSB7CisJCXBtZCA9IChwbWRfdCAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKKwkJc2V0X3B1ZChwdWQsIF9fcHVkKF9fcGEocG1kKSB8IF9LRVJOUEdfVEFCTEUgfCBfUEFHRV9VU0VSKSk7CisJCWlmIChwbWQgIT0gcG1kX29mZnNldChwdWQsIDApKSB7CisJCQlwdWRfRVJST1IoKnB1ZCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7CiAJaWYgKHBtZF9ub25lKCpwbWQpKSB7CiAJCXB0ZSA9IChwdGVfdCAqKWdldF96ZXJvZWRfcGFnZShHRlBfQVRPTUlDKTsKIAkJc2V0X3BtZChwbWQsIF9fcG1kKF9fcGEocHRlKSB8IF9LRVJOUEdfVEFCTEUgfCBfUEFHRV9VU0VSKSk7CkBAIC0yMTIsNiArMjIzLDggQEAKIAlmcmVlX2FyZWFfaW5pdF9ub2RlKDAsIE5PREVfREFUQSgwKSwgem9uZXNfc2l6ZSwgX19NRU1PUllfU1RBUlQgPj4gUEFHRV9TSElGVCwgMCk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qga2NvcmVfbGlzdCBrY29yZV9tZW0sIGtjb3JlX3ZtYWxsb2M7CisKIHZvaWQgX19pbml0IG1lbV9pbml0KHZvaWQpCiB7CiAJZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZW1wdHlfemVyb19wYWdlWzEwMjRdOwpAQCAtMjM3LDggKzI1MCwxMyBAQAogCSAqIFNldHVwIHdyYXBwZXJzIGZvciBjb3B5L2NsZWFyX3BhZ2UoKSwgdGhlc2Ugd2lsbCBnZXQgb3ZlcnJpZGRlbgogCSAqIGxhdGVyIGluIHRoZSBib290IHByb2Nlc3MgaWYgYSBiZXR0ZXIgbWV0aG9kIGlzIGF2YWlsYWJsZS4KIAkgKi8KKyNpZmRlZiBDT05GSUdfTU1VCiAJY29weV9wYWdlID0gY29weV9wYWdlX3Nsb3c7CiAJY2xlYXJfcGFnZSA9IGNsZWFyX3BhZ2Vfc2xvdzsKKyNlbHNlCisJY29weV9wYWdlID0gY29weV9wYWdlX25vbW11OworCWNsZWFyX3BhZ2UgPSBjbGVhcl9wYWdlX25vbW11OworI2VuZGlmCiAKIAkvKiB0aGlzIHdpbGwgcHV0IGFsbCBsb3cgbWVtb3J5IG9udG8gdGhlIGZyZWVsaXN0cyAqLwogCXRvdGFscmFtX3BhZ2VzICs9IGZyZWVfYWxsX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCkpOwpAQCAtMjU0LDcgKzI3MiwxMiBAQAogCWRhdGFzaXplID0gICh1bnNpZ25lZCBsb25nKSAmX2VkYXRhIC0gKHVuc2lnbmVkIGxvbmcpICZfZXRleHQ7CiAJaW5pdHNpemUgPSAgKHVuc2lnbmVkIGxvbmcpICZfX2luaXRfZW5kIC0gKHVuc2lnbmVkIGxvbmcpICZfX2luaXRfYmVnaW47CiAKLQlwcmludGsoIk1lbW9yeTogJWx1ay8lbHVrIGF2YWlsYWJsZSAoJWRrIGtlcm5lbCBjb2RlLCAlZGsgcmVzZXJ2ZWQsICVkayBkYXRhLCAlZGsgaW5pdClcbiIsCisJa2NsaXN0X2FkZCgma2NvcmVfbWVtLCBfX3ZhKDApLCBtYXhfbG93X3BmbiA8PCBQQUdFX1NISUZUKTsKKwlrY2xpc3RfYWRkKCZrY29yZV92bWFsbG9jLCAodm9pZCAqKVZNQUxMT0NfU1RBUlQsCisJCSAgIFZNQUxMT0NfRU5EIC0gVk1BTExPQ19TVEFSVCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJNZW1vcnk6ICVsdWsvJWx1ayBhdmFpbGFibGUgKCVkayBrZXJuZWwgY29kZSwgIgorCSAgICAgICAiJWRrIHJlc2VydmVkLCAlZGsgZGF0YSwgJWRrIGluaXQpXG4iLAogCQkodW5zaWduZWQgbG9uZykgbnJfZnJlZV9wYWdlcygpIDw8IChQQUdFX1NISUZULTEwKSwKIAkJbWF4X21hcG5yIDw8IChQQUdFX1NISUZULTEwKSwKIAkJY29kZXNpemUgPj4gMTAsCkBAIC0yNjMsNiArMjg2LDkgQEAKIAkJaW5pdHNpemUgPj4gMTApOwogCiAJcDNfY2FjaGVfaW5pdCgpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgdkRTTyAqLworCXZzeXNjYWxsX2luaXQoKTsKIH0KIAogdm9pZCBmcmVlX2luaXRtZW0odm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vaW9yZW1hcC5jIGIvYXJjaC9zaC9tbS9pb3JlbWFwLmMKaW5kZXggOTZmYTRhOS4uYTlmZTgwYyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9pb3JlbWFwLmMKKysrIGIvYXJjaC9zaC9tbS9pb3JlbWFwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CkBAIC0xMzUsNiArMTM2LDIwIEBACiAJCXJldHVybiAodm9pZCBfX2lvbWVtICopcGh5c190b192aXJ0KHBoeXNfYWRkcik7CiAKIAkvKgorCSAqIElmIHdlJ3JlIG9uIGFuIFNINzc1MSBvciBTSDc3ODAgUENJIGNvbnRyb2xsZXIsIFBDSSBtZW1vcnkgaXMKKwkgKiBtYXBwZWQgYXQgdGhlIGVuZCBvZiB0aGUgYWRkcmVzcyBzcGFjZSAodHlwaWNhbGx5IDB4ZmQwMDAwMDApCisJICogaW4gYSBub24tdHJhbnNsYXRhYmxlIGFyZWEsIHNvIG1hcHBpbmcgdGhyb3VnaCBwYWdlIHRhYmxlcyBmb3IKKwkgKiB0aGlzIGFyZWEgaXMgbm90IG9ubHkgcG9pbnRsZXNzLCBidXQgYWxzbyBmdW5kYW1lbnRhbGx5CisJICogYnJva2VuLiBKdXN0IHJldHVybiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBpbnN0ZWFkLgorCSAqCisJICogRm9yIGJvYXJkcyB0aGF0IG1hcCBhIHNtYWxsIFBDSSBtZW1vcnkgYXBlcnR1cmUgc29tZXdoZXJlIGluCisJICogUDEvUDIgc3BhY2UsIGlvcmVtYXAoKSB3aWxsIGFscmVhZHkgZG8gdGhlIHJpZ2h0IHRoaW5nLAorCSAqIGFuZCB3ZSdsbCBuZXZlciBnZXQgdGhpcyBmYXIuCisJICovCisJaWYgKGlzX3BjaV9tZW1hZGRyKHBoeXNfYWRkcikgJiYgaXNfcGNpX21lbWFkZHIobGFzdF9hZGRyKSkKKwkJcmV0dXJuICh2b2lkIF9faW9tZW0gKilwaHlzX2FkZHI7CisKKwkvKgogCSAqIERvbid0IGFsbG93IGFueWJvZHkgdG8gcmVtYXAgbm9ybWFsIFJBTSB0aGF0IHdlJ3JlIHVzaW5nLi4KIAkgKi8KIAlpZiAocGh5c19hZGRyIDwgdmlydF90b19waHlzKGhpZ2hfbWVtb3J5KSkKQEAgLTE5Miw3ICsyMDcsNyBAQAogCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSAodW5zaWduZWQgbG9uZyBfX2ZvcmNlKWFkZHI7CiAJc3RydWN0IHZtX3N0cnVjdCAqcDsKIAotCWlmIChQWFNFRyh2YWRkcikgPCBQM1NFRykKKwlpZiAoUFhTRUcodmFkZHIpIDwgUDNTRUcgfHwgaXNfcGNpX21lbWFkZHIodmFkZHIpKQogCQlyZXR1cm47CiAKICNpZmRlZiBDT05GSUdfMzJCSVQKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vcGctbm9tbXUuYyBiL2FyY2gvc2gvbW0vcGctbm9tbXUuYwppbmRleCA4ZjkxNjVhLi5kMTUyMjFiIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL3BnLW5vbW11LmMKKysrIGIvYXJjaC9zaC9tbS9wZy1ub21tdS5jCkBAIC0xNCwyMyArMTQsMjQgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCi1zdGF0aWMgdm9pZCBjb3B5X3BhZ2Vfbm9tbXUodm9pZCAqdG8sIHZvaWQgKmZyb20pCit2b2lkIGNvcHlfcGFnZV9ub21tdSh2b2lkICp0bywgdm9pZCAqZnJvbSkKIHsKIAltZW1jcHkodG8sIGZyb20sIFBBR0VfU0laRSk7CiB9CiAKLXN0YXRpYyB2b2lkIGNsZWFyX3BhZ2Vfbm9tbXUodm9pZCAqdG8pCit2b2lkIGNsZWFyX3BhZ2Vfbm9tbXUodm9pZCAqdG8pCiB7CiAJbWVtc2V0KHRvLCAwLCBQQUdFX1NJWkUpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBwZ19ub21tdV9pbml0KHZvaWQpCitfX2tlcm5lbF9zaXplX3QgX19jb3B5X3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIF9fa2VybmVsX3NpemVfdCBuKQogewotCWNvcHlfcGFnZSA9IGNvcHlfcGFnZV9ub21tdTsKLQljbGVhcl9wYWdlID0gY2xlYXJfcGFnZV9ub21tdTsKLQorCW1lbWNweSh0bywgZnJvbSwgbik7CiAJcmV0dXJuIDA7CiB9CiAKLXN1YnN5c19pbml0Y2FsbChwZ19ub21tdV9pbml0KTsKLQorX19rZXJuZWxfc2l6ZV90IF9fY2xlYXJfdXNlcih2b2lkICp0bywgX19rZXJuZWxfc2l6ZV90IG4pCit7CisJbWVtc2V0KHRvLCAwLCBuKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vcGctc2g0LmMgYi9hcmNoL3NoL21tL3BnLXNoNC5jCmluZGV4IGM3NzZiNjAuLjA3MzcxZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vcGctc2g0LmMKKysrIGIvYXJjaC9zaC9tbS9wZy1zaDQuYwpAQCAtMiw3ICsyLDcgQEAKICAqIGFyY2gvc2gvbW0vcGctc2g0LmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAsIDIwMDIgIE5paWJlIFl1dGFrYQotICogQ29weXJpZ2h0IChDKSAyMDAyICBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA1ICBQYXVsIE11bmR0CiAgKgogICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCiAgKi8KQEAgLTIzLDYgKzIzLDggQEAKIAogZXh0ZXJuIHN0cnVjdCBzZW1hcGhvcmUgcDNtYXBfc2VtW107CiAKKyNkZWZpbmUgQ0FDSEVfQUxJQVMgKGNwdV9kYXRhLT5kY2FjaGUuYWxpYXNfbWFzaykKKwogLyoKICAqIGNsZWFyX3VzZXJfcGFnZQogICogQHRvOiBQMSBhZGRyZXNzCkBAIC0zNSwxNCArMzcsMTUgQEAKIAlpZiAoKChhZGRyZXNzIF4gKHVuc2lnbmVkIGxvbmcpdG8pICYgQ0FDSEVfQUxJQVMpID09IDApCiAJCWNsZWFyX3BhZ2UodG8pOwogCWVsc2UgewotCQlwZ3Byb3RfdCBwZ3Byb3QgPSBfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgCisJCXBncHJvdF90IHBncHJvdCA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfAogCQkJCQkgICBfUEFHRV9SVyB8IF9QQUdFX0NBQ0hBQkxFIHwKLQkJCQkJICAgX1BBR0VfRElSVFkgfCBfUEFHRV9BQ0NFU1NFRCB8IAorCQkJCQkgICBfUEFHRV9ESVJUWSB8IF9QQUdFX0FDQ0VTU0VEIHwKIAkJCQkJICAgX1BBR0VfSFdfU0hBUkVEIHwgX1BBR0VfRkxBR1NfSEFSRCk7CiAJCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyID0gUEhZU0FERFIodG8pOwogCQl1bnNpZ25lZCBsb25nIHAzX2FkZHIgPSBQM1NFRyArIChhZGRyZXNzICYgQ0FDSEVfQUxJQVMpOwotCQlwZ2RfdCAqZGlyID0gcGdkX29mZnNldF9rKHAzX2FkZHIpOwotCQlwbWRfdCAqcG1kID0gcG1kX29mZnNldChkaXIsIHAzX2FkZHIpOworCQlwZ2RfdCAqcGdkID0gcGdkX29mZnNldF9rKHAzX2FkZHIpOworCQlwdWRfdCAqcHVkID0gcHVkX29mZnNldChwZ2QsIHAzX2FkZHIpOworCQlwbWRfdCAqcG1kID0gcG1kX29mZnNldChwdWQsIHAzX2FkZHIpOwogCQlwdGVfdCAqcHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCBwM19hZGRyKTsKIAkJcHRlX3QgZW50cnk7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC02NywyMSArNzAsMjIgQEAKICAqIEBhZGRyZXNzOiBVMCBhZGRyZXNzIHRvIGJlIG1hcHBlZAogICogQHBhZ2U6IHBhZ2UgKHZpcnRfdG9fcGFnZSh0bykpCiAgKi8KLXZvaWQgY29weV91c2VyX3BhZ2Uodm9pZCAqdG8sIHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgCit2b2lkIGNvcHlfdXNlcl9wYWdlKHZvaWQgKnRvLCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlfX3NldF9iaXQoUEdfbWFwcGVkLCAmcGFnZS0+ZmxhZ3MpOwogCWlmICgoKGFkZHJlc3MgXiAodW5zaWduZWQgbG9uZyl0bykgJiBDQUNIRV9BTElBUykgPT0gMCkKIAkJY29weV9wYWdlKHRvLCBmcm9tKTsKIAllbHNlIHsKLQkJcGdwcm90X3QgcGdwcm90ID0gX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IAorCQlwZ3Byb3RfdCBwZ3Byb3QgPSBfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwKIAkJCQkJICAgX1BBR0VfUlcgfCBfUEFHRV9DQUNIQUJMRSB8Ci0JCQkJCSAgIF9QQUdFX0RJUlRZIHwgX1BBR0VfQUNDRVNTRUQgfCAKKwkJCQkJICAgX1BBR0VfRElSVFkgfCBfUEFHRV9BQ0NFU1NFRCB8CiAJCQkJCSAgIF9QQUdFX0hXX1NIQVJFRCB8IF9QQUdFX0ZMQUdTX0hBUkQpOwogCQl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciA9IFBIWVNBRERSKHRvKTsKIAkJdW5zaWduZWQgbG9uZyBwM19hZGRyID0gUDNTRUcgKyAoYWRkcmVzcyAmIENBQ0hFX0FMSUFTKTsKLQkJcGdkX3QgKmRpciA9IHBnZF9vZmZzZXRfayhwM19hZGRyKTsKLQkJcG1kX3QgKnBtZCA9IHBtZF9vZmZzZXQoZGlyLCBwM19hZGRyKTsKKwkJcGdkX3QgKnBnZCA9IHBnZF9vZmZzZXRfayhwM19hZGRyKTsKKwkJcHVkX3QgKnB1ZCA9IHB1ZF9vZmZzZXQocGdkLCBwM19hZGRyKTsKKwkJcG1kX3QgKnBtZCA9IHBtZF9vZmZzZXQocHVkLCBwM19hZGRyKTsKIAkJcHRlX3QgKnB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgcDNfYWRkcik7CiAJCXB0ZV90IGVudHJ5OwogCQl1bnNpZ25lZCBsb25nIGZsYWdzOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9wbWIuYyBiL2FyY2gvc2gvbW0vcG1iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlNzQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gvbW0vcG1iLmMKQEAgLTAsMCArMSw0MDAgQEAKKy8qCisgKiBhcmNoL3NoL21tL3BtYi5jCisgKgorICogUHJpdmlsZWdlZCBTcGFjZSBNYXBwaW5nIEJ1ZmZlciAoUE1CKSBTdXBwb3J0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBQYXVsIE11bmR0CisgKgorICogUDEvUDIgU2VjdGlvbiBtYXBwaW5nIGRlZmluaXRpb25zIGZyb20gbWFwMzIuaCwgd2hpY2ggd2FzOgorICoKKyAqCUNvcHlyaWdodCAyMDAzIChjKSBMaW5lbyBTb2x1dGlvbnMsSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjZGVmaW5lIE5SX1BNQl9FTlRSSUVTCTE2CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKnBtYl9jYWNoZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBtYl9tYXA7CisKK3N0YXRpYyBzdHJ1Y3QgcG1iX2VudHJ5IHBtYl9pbml0X21hcFtdID0geworCS8qIHZwbiAgICAgICAgIHBwbiAgICAgICAgIGZsYWdzICh1Yi9zei9jL3d0KSAqLworCisJLyogUDEgU2VjdGlvbiBNYXBwaW5ncyAqLworCXsgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCwgUE1CX1NaXzY0TSAgfCBQTUJfQywgfSwKKwl7IDB4ODQwMDAwMDAsIDB4MDQwMDAwMDAsIFBNQl9TWl82NE0gIHwgUE1CX0MsIH0sCisJeyAweDg4MDAwMDAwLCAweDA4MDAwMDAwLCBQTUJfU1pfMTI4TSB8IFBNQl9DLCB9LAorCXsgMHg5MDAwMDAwMCwgMHgxMDAwMDAwMCwgUE1CX1NaXzY0TSAgfCBQTUJfQywgfSwKKwl7IDB4OTQwMDAwMDAsIDB4MTQwMDAwMDAsIFBNQl9TWl82NE0gIHwgUE1CX0MsIH0sCisJeyAweDk4MDAwMDAwLCAweDE4MDAwMDAwLCBQTUJfU1pfNjRNICB8IFBNQl9DLCB9LAorCisJLyogUDIgU2VjdGlvbiBNYXBwaW5ncyAqLworCXsgMHhhMDAwMDAwMCwgMHgwMDAwMDAwMCwgUE1CX1VCIHwgUE1CX1NaXzY0TSAgfCBQTUJfV1QsIH0sCisJeyAweGE0MDAwMDAwLCAweDA0MDAwMDAwLCBQTUJfVUIgfCBQTUJfU1pfNjRNICB8IFBNQl9XVCwgfSwKKwl7IDB4YTgwMDAwMDAsIDB4MDgwMDAwMDAsIFBNQl9VQiB8IFBNQl9TWl8xMjhNIHwgUE1CX1dULCB9LAorCXsgMHhiMDAwMDAwMCwgMHgxMDAwMDAwMCwgUE1CX1VCIHwgUE1CX1NaXzY0TSAgfCBQTUJfV1QsIH0sCisJeyAweGI0MDAwMDAwLCAweDE0MDAwMDAwLCBQTUJfVUIgfCBQTUJfU1pfNjRNICB8IFBNQl9XVCwgfSwKKwl7IDB4YjgwMDAwMDAsIDB4MTgwMDAwMDAsIFBNQl9VQiB8IFBNQl9TWl82NE0gIHwgUE1CX1dULCB9LAorfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG1rX3BtYl9lbnRyeSh1bnNpZ25lZCBpbnQgZW50cnkpCit7CisJcmV0dXJuIChlbnRyeSAmIFBNQl9FX01BU0spIDw8IFBNQl9FX1NISUZUOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbWtfcG1iX2FkZHIodW5zaWduZWQgaW50IGVudHJ5KQoreworCXJldHVybiBta19wbWJfZW50cnkoZW50cnkpIHwgUE1CX0FERFI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBta19wbWJfZGF0YSh1bnNpZ25lZCBpbnQgZW50cnkpCit7CisJcmV0dXJuIG1rX3BtYl9lbnRyeShlbnRyeSkgfCBQTUJfREFUQTsKK30KKworc3RydWN0IHBtYl9lbnRyeSAqcG1iX2FsbG9jKHVuc2lnbmVkIGxvbmcgdnBuLCB1bnNpZ25lZCBsb25nIHBwbiwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBwbWJfZW50cnkgKnBtYmU7CisKKwlwbWJlID0ga21lbV9jYWNoZV9hbGxvYyhwbWJfY2FjaGUsIEdGUF9LRVJORUwpOworCWlmICghcG1iZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlwbWJlLT52cG4JPSB2cG47CisJcG1iZS0+cHBuCT0gcHBuOworCXBtYmUtPmZsYWdzCT0gZmxhZ3M7CisKKwlyZXR1cm4gcG1iZTsKK30KKwordm9pZCBwbWJfZnJlZShzdHJ1Y3QgcG1iX2VudHJ5ICpwbWJlKQoreworCWttZW1fY2FjaGVfZnJlZShwbWJfY2FjaGUsIHBtYmUpOworfQorCisvKgorICogTXVzdCBiZSBpbiBQMiBmb3IgX19zZXRfcG1iX2VudHJ5KCkKKyAqLworaW50IF9fc2V0X3BtYl9lbnRyeSh1bnNpZ25lZCBsb25nIHZwbiwgdW5zaWduZWQgbG9uZyBwcG4sCisJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgKmVudHJ5KQoreworCXVuc2lnbmVkIGludCBwb3MgPSAqZW50cnk7CisKKwlpZiAodW5saWtlbHkocG9zID09IFBNQl9OT19FTlRSWSkpCisJCXBvcyA9IGZpbmRfZmlyc3RfemVyb19iaXQoJnBtYl9tYXAsIE5SX1BNQl9FTlRSSUVTKTsKKworcmVwZWF0OgorCWlmICh1bmxpa2VseShwb3MgPiBOUl9QTUJfRU5UUklFUykpCisJCXJldHVybiAtRU5PU1BDOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQocG9zLCAmcG1iX21hcCkpIHsKKwkJcG9zID0gZmluZF9maXJzdF96ZXJvX2JpdCgmcG1iX21hcCwgTlJfUE1CX0VOVFJJRVMpOworCQlnb3RvIHJlcGVhdDsKKwl9CisKKwljdHJsX291dGwodnBuIHwgUE1CX1YsIG1rX3BtYl9hZGRyKHBvcykpOworCisjaWZkZWYgQ09ORklHX1NIX1dSSVRFVEhST1VHSAorCS8qCisJICogV2hlbiB3ZSBhcmUgaW4gMzItYml0IGFkZHJlc3MgZXh0ZW5kZWQgbW9kZSwgQ0NSLkNCIGJlY29tZXMKKwkgKiBpbnZhbGlkLCBzbyBjYXJlIG11c3QgYmUgdGFrZW4gdG8gbWFudWFsbHkgYWRqdXN0IGNhY2hlYWJsZQorCSAqIHRyYW5zbGF0aW9ucy4KKwkgKi8KKwlpZiAobGlrZWx5KGZsYWdzICYgUE1CX0MpKQorCQlmbGFncyB8PSBQTUJfV1Q7CisjZW5kaWYKKworCWN0cmxfb3V0bChwcG4gfCBmbGFncyB8IFBNQl9WLCBta19wbWJfZGF0YShwb3MpKTsKKworCSplbnRyeSA9IHBvczsKKworCXJldHVybiAwOworfQorCitpbnQgc2V0X3BtYl9lbnRyeShzdHJ1Y3QgcG1iX2VudHJ5ICpwbWJlKQoreworCWludCByZXQ7CisKKwlqdW1wX3RvX1AyKCk7CisJcmV0ID0gX19zZXRfcG1iX2VudHJ5KHBtYmUtPnZwbiwgcG1iZS0+cHBuLCBwbWJlLT5mbGFncywgJnBtYmUtPmVudHJ5KTsKKwliYWNrX3RvX1AxKCk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGNsZWFyX3BtYl9lbnRyeShzdHJ1Y3QgcG1iX2VudHJ5ICpwbWJlKQoreworCXVuc2lnbmVkIGludCBlbnRyeSA9IHBtYmUtPmVudHJ5OworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCS8qCisJICogRG9uJ3QgYWxsb3cgY2xlYXJpbmcgb2Ygd2lyZWQgaW5pdCBlbnRyaWVzLCBQMSBvciBQMiBhY2Nlc3MKKwkgKiB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBtYXBwaW5nIGluIHRoZSBQTUIgd2lsbCBsZWFkIHRvIHJlc2V0CisJICogYnkgdGhlIFRMQi4KKwkgKi8KKwlpZiAodW5saWtlbHkoZW50cnkgPCBBUlJBWV9TSVpFKHBtYl9pbml0X21hcCkgfHwKKwkJICAgICBlbnRyeSA+PSBOUl9QTUJfRU5UUklFUykpCisJCXJldHVybjsKKworCWp1bXBfdG9fUDIoKTsKKworCS8qIENsZWFyIFYtYml0ICovCisJYWRkciA9IG1rX3BtYl9hZGRyKGVudHJ5KTsKKwljdHJsX291dGwoY3RybF9pbmwoYWRkcikgJiB+UE1CX1YsIGFkZHIpOworCisJYWRkciA9IG1rX3BtYl9kYXRhKGVudHJ5KTsKKwljdHJsX291dGwoY3RybF9pbmwoYWRkcikgJiB+UE1CX1YsIGFkZHIpOworCisJYmFja190b19QMSgpOworCisJY2xlYXJfYml0KGVudHJ5LCAmcG1iX21hcCk7Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socG1iX2xpc3RfbG9jayk7CitzdGF0aWMgc3RydWN0IHBtYl9lbnRyeSAqcG1iX2xpc3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbWJfbGlzdF9hZGQoc3RydWN0IHBtYl9lbnRyeSAqcG1iZSkKK3sKKwlzdHJ1Y3QgcG1iX2VudHJ5ICoqcCwgKnRtcDsKKworCXAgPSAmcG1iX2xpc3Q7CisJd2hpbGUgKCh0bXAgPSAqcCkgIT0gTlVMTCkKKwkJcCA9ICZ0bXAtPm5leHQ7CisKKwlwbWJlLT5uZXh0ID0gdG1wOworCSpwID0gcG1iZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBtYl9saXN0X2RlbChzdHJ1Y3QgcG1iX2VudHJ5ICpwbWJlKQoreworCXN0cnVjdCBwbWJfZW50cnkgKipwLCAqdG1wOworCisJZm9yIChwID0gJnBtYl9saXN0OyAodG1wID0gKnApOyBwID0gJnRtcC0+bmV4dCkKKwkJaWYgKHRtcCA9PSBwbWJlKSB7CisJCQkqcCA9IHRtcC0+bmV4dDsKKwkJCXJldHVybjsKKwkJfQorfQorCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IGZsYWc7Cit9IHBtYl9zaXplc1tdID0geworCXsgLnNpemUJPSAweDIwMDAwMDAwLCAuZmxhZyA9IFBNQl9TWl81MTJNLCB9LAorCXsgLnNpemUgPSAweDA4MDAwMDAwLCAuZmxhZyA9IFBNQl9TWl8xMjhNLCB9LAorCXsgLnNpemUgPSAweDA0MDAwMDAwLCAuZmxhZyA9IFBNQl9TWl82NE0sICB9LAorCXsgLnNpemUgPSAweDAxMDAwMDAwLCAuZmxhZyA9IFBNQl9TWl8xNk0sICB9LAorfTsKKworbG9uZyBwbWJfcmVtYXAodW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQgbG9uZyBwaHlzLAorCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHBtYl9lbnRyeSAqcG1icDsKKwl1bnNpZ25lZCBsb25nIHdhbnRlZDsKKwlpbnQgcG1iX2ZsYWdzLCBpOworCisJLyogQ29udmVydCB0eXBpY2FsIHBncHJvdCB2YWx1ZSB0byB0aGUgUE1CIGVxdWl2YWxlbnQgKi8KKwlpZiAoZmxhZ3MgJiBfUEFHRV9DQUNIQUJMRSkgeworCQlpZiAoZmxhZ3MgJiBfUEFHRV9XVCkKKwkJCXBtYl9mbGFncyA9IFBNQl9XVDsKKwkJZWxzZQorCQkJcG1iX2ZsYWdzID0gUE1CX0M7CisJfSBlbHNlCisJCXBtYl9mbGFncyA9IFBNQl9XVCB8IFBNQl9VQjsKKworCXBtYnAgPSBOVUxMOworCXdhbnRlZCA9IHNpemU7CisKK2FnYWluOgorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBtYl9zaXplcyk7IGkrKykgeworCQlzdHJ1Y3QgcG1iX2VudHJ5ICpwbWJlOworCQlpbnQgcmV0OworCisJCWlmIChzaXplIDwgcG1iX3NpemVzW2ldLnNpemUpCisJCQljb250aW51ZTsKKworCQlwbWJlID0gcG1iX2FsbG9jKHZhZGRyLCBwaHlzLCBwbWJfZmxhZ3MgfCBwbWJfc2l6ZXNbaV0uZmxhZyk7CisJCWlmIChJU19FUlIocG1iZSkpCisJCQlyZXR1cm4gUFRSX0VSUihwbWJlKTsKKworCQlyZXQgPSBzZXRfcG1iX2VudHJ5KHBtYmUpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXBtYl9mcmVlKHBtYmUpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCisJCXBoeXMJKz0gcG1iX3NpemVzW2ldLnNpemU7CisJCXZhZGRyCSs9IHBtYl9zaXplc1tpXS5zaXplOworCQlzaXplCS09IHBtYl9zaXplc1tpXS5zaXplOworCisJCS8qCisJCSAqIExpbmsgYWRqYWNlbnQgZW50cmllcyB0aGF0IHNwYW4gbXVsdGlwbGUgUE1CIGVudHJpZXMKKwkJICogZm9yIGVhc2llciB0ZWFyLWRvd24uCisJCSAqLworCQlpZiAobGlrZWx5KHBtYnApKQorCQkJcG1icC0+bGluayA9IHBtYmU7CisKKwkJcG1icCA9IHBtYmU7CisJfQorCisJaWYgKHNpemUgPj0gMHgxMDAwMDAwKQorCQlnb3RvIGFnYWluOworCisJcmV0dXJuIHdhbnRlZCAtIHNpemU7Cit9CisKK3ZvaWQgcG1iX3VubWFwKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlzdHJ1Y3QgcG1iX2VudHJ5ICoqcCwgKnBtYmU7CisKKwlmb3IgKHAgPSAmcG1iX2xpc3Q7IChwbWJlID0gKnApOyBwID0gJnBtYmUtPm5leHQpCisJCWlmIChwbWJlLT52cG4gPT0gYWRkcikKKwkJCWJyZWFrOworCisJaWYgKHVubGlrZWx5KCFwbWJlKSkKKwkJcmV0dXJuOworCisJV0FSTl9PTighdGVzdF9iaXQocG1iZS0+ZW50cnksICZwbWJfbWFwKSk7CisKKwlkbyB7CisJCXN0cnVjdCBwbWJfZW50cnkgKnBtYmxpbmsgPSBwbWJlOworCisJCWNsZWFyX3BtYl9lbnRyeShwbWJlKTsKKwkJcG1iZSA9IHBtYmxpbmstPmxpbms7CisKKwkJcG1iX2ZyZWUocG1ibGluayk7CisJfSB3aGlsZSAocG1iZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBtYl9jYWNoZV9jdG9yKHZvaWQgKnBtYiwga21lbV9jYWNoZV90ICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHBtYl9lbnRyeSAqcG1iZSA9IHBtYjsKKworCW1lbXNldChwbWIsIDAsIHNpemVvZihzdHJ1Y3QgcG1iX2VudHJ5KSk7CisKKwlzcGluX2xvY2tfaXJxKCZwbWJfbGlzdF9sb2NrKTsKKworCXBtYmUtPmVudHJ5ID0gUE1CX05PX0VOVFJZOworCXBtYl9saXN0X2FkZChwbWJlKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcG1iX2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHBtYl9jYWNoZV9kdG9yKHZvaWQgKnBtYiwga21lbV9jYWNoZV90ICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3Bpbl9sb2NrX2lycSgmcG1iX2xpc3RfbG9jayk7CisJcG1iX2xpc3RfZGVsKHBtYik7CisJc3Bpbl91bmxvY2tfaXJxKCZwbWJfbGlzdF9sb2NrKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcG1iX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgbnJfZW50cmllcyA9IEFSUkFZX1NJWkUocG1iX2luaXRfbWFwKTsKKwl1bnNpZ25lZCBpbnQgZW50cnk7CisKKwlCVUdfT04odW5saWtlbHkobnJfZW50cmllcyA+PSBOUl9QTUJfRU5UUklFUykpOworCisJcG1iX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInBtYiIsIHNpemVvZihzdHJ1Y3QgcG1iX2VudHJ5KSwKKwkJCQkgICAgICAwLCAwLCBwbWJfY2FjaGVfY3RvciwgcG1iX2NhY2hlX2R0b3IpOworCUJVR19PTighcG1iX2NhY2hlKTsKKworCWp1bXBfdG9fUDIoKTsKKworCS8qCisJICogT3JkZXJpbmcgaXMgaW1wb3J0YW50LCBQMiBtdXN0IGJlIG1hcHBlZCBpbiB0aGUgUE1CIGJlZm9yZSB3ZQorCSAqIGNhbiBzZXQgUE1CLlNFLCBhbmQgUDEgbXVzdCBiZSBtYXBwZWQgYmVmb3JlIHdlIGp1bXAgYmFjayB0bworCSAqIFAxIHNwYWNlLgorCSAqLworCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IG5yX2VudHJpZXM7IGVudHJ5KyspIHsKKwkJc3RydWN0IHBtYl9lbnRyeSAqcG1iZSA9IHBtYl9pbml0X21hcCArIGVudHJ5OworCisJCV9fc2V0X3BtYl9lbnRyeShwbWJlLT52cG4sIHBtYmUtPnBwbiwgcG1iZS0+ZmxhZ3MsICZlbnRyeSk7CisJfQorCisJY3RybF9vdXRsKDAsIFBNQl9JUk1DUik7CisKKwkvKiBQTUIuU0UgYW5kIFVCWzddICovCisJY3RybF9vdXRsKCgxIDw8IDMxKSB8ICgxIDw8IDcpLCBQTUJfUEFTQ1IpOworCisJYmFja190b19QMSgpOworCisJcmV0dXJuIDA7Cit9CithcmNoX2luaXRjYWxsKHBtYl9pbml0KTsKKworc3RhdGljIGludCBwbWJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpmaWxlLCB2b2lkICppdGVyKQoreworCWludCBpOworCisJc2VxX3ByaW50ZihmaWxlLCAiVjogVmFsaWQsIEM6IENhY2hlYWJsZSwgV1Q6IFdyaXRlLVRocm91Z2hcbiIKKwkJCSAiQ0I6IENvcHktQmFjaywgQjogQnVmZmVyZWQsIFVCOiBVbmJ1ZmZlcmVkXG4iKTsKKwlzZXFfcHJpbnRmKGZpbGUsICJldHkgICB2cG4gIHBwbiAgc2l6ZSAgIGZsYWdzXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9QTUJfRU5UUklFUzsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgYWRkciwgZGF0YTsKKwkJdW5zaWduZWQgaW50IHNpemU7CisJCWNoYXIgKnN6X3N0ciA9IE5VTEw7CisKKwkJYWRkciA9IGN0cmxfaW5sKG1rX3BtYl9hZGRyKGkpKTsKKwkJZGF0YSA9IGN0cmxfaW5sKG1rX3BtYl9kYXRhKGkpKTsKKworCQlzaXplID0gZGF0YSAmIFBNQl9TWl9NQVNLOworCQlzel9zdHIgPSAoc2l6ZSA9PSBQTUJfU1pfMTZNKSAgPyAiIDE2TUIiOgorCQkJIChzaXplID09IFBNQl9TWl82NE0pICA/ICIgNjRNQiI6CisJCQkgKHNpemUgPT0gUE1CX1NaXzEyOE0pID8gIjEyOE1CIjoKKwkJCQkJICAgICAgICAgIjUxMk1CIjsKKworCQkvKiAwMjogViAweDg4IDB4MDggMTI4TUIgQyBDQiAgQiAqLworCQlzZXFfcHJpbnRmKGZpbGUsICIlMDJkOiAlYyAweCUwMmx4IDB4JTAybHggJXMgJWMgJXMgJXNcbiIsCisJCQkgICBpLCAoKGFkZHIgJiBQTUJfVikgJiYgKGRhdGEgJiBQTUJfVikpID8gJ1YnIDogJyAnLAorCQkJICAgKGFkZHIgPj4gMjQpICYgMHhmZiwgKGRhdGEgPj4gMjQpICYgMHhmZiwKKwkJCSAgIHN6X3N0ciwgKGRhdGEgJiBQTUJfQykgPyAnQycgOiAnICcsCisJCQkgICAoZGF0YSAmIFBNQl9XVCkgPyAiV1QiIDogIkNCIiwKKwkJCSAgIChkYXRhICYgUE1CX1VCKSA/ICJVQiIgOiAiIEIiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbWJfZGVidWdmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBwbWJfc2VxX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwbWJfZGVidWdmc19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSBwbWJfZGVidWdmc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwbWJfZGVidWdmc19pbml0KHZvaWQpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCisJZGVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgicG1iIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgICBOVUxMLCBOVUxMLCAmcG1iX2RlYnVnZnNfZm9wcyk7CisJaWYgKElTX0VSUihkZW50cnkpKQorCQlyZXR1cm4gUFRSX0VSUihkZW50cnkpOworCisJcmV0dXJuIDA7Cit9Citwb3N0Y29yZV9pbml0Y2FsbChwbWJfZGVidWdmc19pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vdGxiLWZsdXNoLmMgYi9hcmNoL3NoL21tL3RsYi1mbHVzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZWM3ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL21tL3RsYi1mbHVzaC5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogVExCIGZsdXNoaW5nIG9wZXJhdGlvbnMgZm9yIFNIIHdpdGggYW4gTU1VLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgIE5paWJlIFl1dGFrYQorICogIENvcHlyaWdodCAoQykgMjAwMyAgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KKwordm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBwYWdlKQoreworCWlmICh2bWEtPnZtX21tICYmIHZtYS0+dm1fbW0tPmNvbnRleHQuaWQgIT0gTk9fQ09OVEVYVCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQl1bnNpZ25lZCBsb25nIGFzaWQ7CisJCXVuc2lnbmVkIGxvbmcgc2F2ZWRfYXNpZCA9IE1NVV9OT19BU0lEOworCisJCWFzaWQgPSB2bWEtPnZtX21tLT5jb250ZXh0LmlkICYgTU1VX0NPTlRFWFRfQVNJRF9NQVNLOworCQlwYWdlICY9IFBBR0VfTUFTSzsKKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWlmICh2bWEtPnZtX21tICE9IGN1cnJlbnQtPm1tKSB7CisJCQlzYXZlZF9hc2lkID0gZ2V0X2FzaWQoKTsKKwkJCXNldF9hc2lkKGFzaWQpOworCQl9CisJCV9fZmx1c2hfdGxiX3BhZ2UoYXNpZCwgcGFnZSk7CisJCWlmIChzYXZlZF9hc2lkICE9IE1NVV9OT19BU0lEKQorCQkJc2V0X2FzaWQoc2F2ZWRfYXNpZCk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwl9Cit9CisKK3ZvaWQgZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkgICAgIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKKworCWlmIChtbS0+Y29udGV4dC5pZCAhPSBOT19DT05URVhUKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCWludCBzaXplOworCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJc2l6ZSA9IChlbmQgLSBzdGFydCArIChQQUdFX1NJWkUgLSAxKSkgPj4gUEFHRV9TSElGVDsKKwkJaWYgKHNpemUgPiAoTU1VX05UTEJfRU5UUklFUy80KSkgeyAvKiBUb28gbWFueSBUTEIgdG8gZmx1c2ggKi8KKwkJCW1tLT5jb250ZXh0LmlkID0gTk9fQ09OVEVYVDsKKwkJCWlmIChtbSA9PSBjdXJyZW50LT5tbSkKKwkJCQlhY3RpdmF0ZV9jb250ZXh0KG1tKTsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGxvbmcgYXNpZDsKKwkJCXVuc2lnbmVkIGxvbmcgc2F2ZWRfYXNpZCA9IE1NVV9OT19BU0lEOworCisJCQlhc2lkID0gbW0tPmNvbnRleHQuaWQgJiBNTVVfQ09OVEVYVF9BU0lEX01BU0s7CisJCQlzdGFydCAmPSBQQUdFX01BU0s7CisJCQllbmQgKz0gKFBBR0VfU0laRSAtIDEpOworCQkJZW5kICY9IFBBR0VfTUFTSzsKKwkJCWlmIChtbSAhPSBjdXJyZW50LT5tbSkgeworCQkJCXNhdmVkX2FzaWQgPSBnZXRfYXNpZCgpOworCQkJCXNldF9hc2lkKGFzaWQpOworCQkJfQorCQkJd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CisJCQkJX19mbHVzaF90bGJfcGFnZShhc2lkLCBzdGFydCk7CisJCQkJc3RhcnQgKz0gUEFHRV9TSVpFOworCQkJfQorCQkJaWYgKHNhdmVkX2FzaWQgIT0gTU1VX05PX0FTSUQpCisJCQkJc2V0X2FzaWQoc2F2ZWRfYXNpZCk7CisJCX0KKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KK30KKwordm9pZCBmbHVzaF90bGJfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHNpemU7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc2l6ZSA9IChlbmQgLSBzdGFydCArIChQQUdFX1NJWkUgLSAxKSkgPj4gUEFHRV9TSElGVDsKKwlpZiAoc2l6ZSA+IChNTVVfTlRMQl9FTlRSSUVTLzQpKSB7IC8qIFRvbyBtYW55IFRMQiB0byBmbHVzaCAqLworCQlmbHVzaF90bGJfYWxsKCk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBhc2lkOworCQl1bnNpZ25lZCBsb25nIHNhdmVkX2FzaWQgPSBnZXRfYXNpZCgpOworCisJCWFzaWQgPSBpbml0X21tLmNvbnRleHQuaWQgJiBNTVVfQ09OVEVYVF9BU0lEX01BU0s7CisJCXN0YXJ0ICY9IFBBR0VfTUFTSzsKKwkJZW5kICs9IChQQUdFX1NJWkUgLSAxKTsKKwkJZW5kICY9IFBBR0VfTUFTSzsKKwkJc2V0X2FzaWQoYXNpZCk7CisJCXdoaWxlIChzdGFydCA8IGVuZCkgeworCQkJX19mbHVzaF90bGJfcGFnZShhc2lkLCBzdGFydCk7CisJCQlzdGFydCArPSBQQUdFX1NJWkU7CisJCX0KKwkJc2V0X2FzaWQoc2F2ZWRfYXNpZCk7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKwordm9pZCBmbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJLyogSW52YWxpZGF0ZSBhbGwgVExCIG9mIHRoaXMgcHJvY2Vzcy4gKi8KKwkvKiBJbnN0ZWFkIG9mIGludmFsaWRhdGluZyBlYWNoIFRMQiwgd2UgZ2V0IG5ldyBNTVUgY29udGV4dC4gKi8KKwlpZiAobW0tPmNvbnRleHQuaWQgIT0gTk9fQ09OVEVYVCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJbW0tPmNvbnRleHQuaWQgPSBOT19DT05URVhUOworCQlpZiAobW0gPT0gY3VycmVudC0+bW0pCisJCQlhY3RpdmF0ZV9jb250ZXh0KG1tKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KK30KKwordm9pZCBmbHVzaF90bGJfYWxsKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgc3RhdHVzOworCisJLyoKKwkgKiBGbHVzaCBhbGwgdGhlIFRMQi4KKwkgKgorCSAqIFdyaXRlIHRvIHRoZSBNTVUgY29udHJvbCByZWdpc3RlcidzIGJpdDoKKwkgKglURi1iaXQgZm9yIFNILTMsIFRJLWJpdCBmb3IgU0gtNC4KKwkgKiAgICAgIEl0J3Mgc2FtZSBwb3NpdGlvbiwgYml0ICMyLgorCSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlzdGF0dXMgPSBjdHJsX2lubChNTVVDUik7CisJc3RhdHVzIHw9IDB4MDQ7CisJY3RybF9vdXRsKHN0YXR1cywgTU1VQ1IpOworCWN0cmxfYmFycmllcigpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vdGxiLXNoNC5jIGIvYXJjaC9zaC9tbS90bGItc2g0LmMKaW5kZXggMTE1YjFiNi4uODEyYjJkNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS90bGItc2g0LmMKKysrIGIvYXJjaC9zaC9tbS90bGItc2g0LmMKQEAgLTM2LDcgKzM2LDYgQEAKIAl1bnNpZ25lZCBsb25nIHZwbjsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAl1bnNpZ25lZCBsb25nIHBmbjsKLQl1bnNpZ25lZCBsb25nIHB0ZWE7CiAKIAkvKiBQdHJhY2UgbWF5IGNhbGwgdGhpcyByb3V0aW5lLiAqLwogCWlmICh2bWEgJiYgY3VycmVudC0+YWN0aXZlX21tICE9IHZtYS0+dm1fbW0pCkBAIC01OSwxMCArNTgsMTEgQEAKIAljdHJsX291dGwodnBuLCBNTVVfUFRFSCk7CiAKIAlwdGV2YWwgPSBwdGVfdmFsKHB0ZSk7CisKIAkvKiBTZXQgUFRFQSByZWdpc3RlciAqLwotCS8qIFRPRE86IG1ha2UgdGhpcyBsb29rIGxlc3MgaGFja3kgKi8KLQlwdGVhID0gKChwdGV2YWwgPj4gMjgpICYgMHhlKSB8IChwdGV2YWwgJiAweDEpOwotCWN0cmxfb3V0bChwdGVhLCBNTVVfUFRFQSk7CisJaWYgKGNwdV9kYXRhLT5mbGFncyAmIENQVV9IQVNfUFRFQSkKKwkJLyogVE9ETzogbWFrZSB0aGlzIGxvb2sgbGVzcyBoYWNreSAqLworCQljdHJsX291dGwoKChwdGV2YWwgPj4gMjgpICYgMHhlKSB8IChwdGV2YWwgJiAweDEpLCBNTVVfUFRFQSk7CiAKIAkvKiBTZXQgUFRFTCByZWdpc3RlciAqLwogCXB0ZXZhbCAmPSBfUEFHRV9GTEFHU19IQVJEV0FSRV9NQVNLOyAvKiBkcm9wIHNvZnR3YXJlIGZsYWdzICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL29wcm9maWxlL01ha2VmaWxlIGIvYXJjaC9zaC9vcHJvZmlsZS9NYWtlZmlsZQppbmRleCA2ODY3MzhkLi4xZjI1ZDliIDEwMDY0NAotLS0gYS9hcmNoL3NoL29wcm9maWxlL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvb3Byb2ZpbGUvTWFrZWZpbGUKQEAgLTcsNyArNywxMSBAQAogCQl0aW1lcl9pbnQubyApCiAKIHByb2ZkcnZyLXkJCQkJOj0gb3BfbW9kZWxfbnVsbC5vCisKKyMgU0g3NzUwLXN0eWxlIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGV4aXN0IGFjcm9zcyA3NzUwLzc3NTBTIGFuZCA3MDkxLgorcHJvZmRydnItJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzUwUykJOj0gb3BfbW9kZWxfc2g3NzUwLm8KIHByb2ZkcnZyLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkJOj0gb3BfbW9kZWxfc2g3NzUwLm8KK3Byb2ZkcnZyLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSkJOj0gb3BfbW9kZWxfc2g3NzUwLm8KIAogb3Byb2ZpbGUteQkJCQk6PSAkKERSSVZFUl9PQkpTKSAkKHByb2ZkcnZyLXkpCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcyBiL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcwppbmRleCAxODJmZTkwLi5hYzU3NjM4IDEwMDY0NAotLS0gYS9hcmNoL3NoL3Rvb2xzL21hY2gtdHlwZXMKKysrIGIvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzCkBAIC04LDE2ICs4LDE1IEBACiBTRQkJCVNIX1NPTFVUSU9OX0VOR0lORQogNzc1MVNFCQkJU0hfNzc1MV9TT0xVVElPTl9FTkdJTkUJCQogNzMwMFNFCQkJU0hfNzMwMF9TT0xVVElPTl9FTkdJTkUKKzczNDNTRQkJCVNIXzczNDNfU09MVVRJT05fRU5HSU5FCiA3MzE4MFNFCQkJU0hfNzMxODBfU09MVVRJT05fRU5HSU5FCiA3NzUxU1lTVEVNSAkJU0hfNzc1MV9TWVNURU1ICiBIUDZYWAkJCVNIX0hQNlhYCiBIRDY0NDYxCQkJSEQ2NDQ2MQogSEQ2NDQ2NQkJCUhENjQ0NjUKLVNIMjAwMAkJCVNIX1NIMjAwMAogU0FUVVJOCQkJU0hfU0FUVVJOCiBEUkVBTUNBU1QJCVNIX0RSRUFNQ0FTVAogQklHU1VSCQkJU0hfQklHU1VSCi1BRFgJCQlTSF9BRFgKIE1QQzEyMTEJCQlTSF9NUEMxMjExCiBTTkFQR0VBUgkJU0hfU0VDVVJFRURHRTU0MTAKIEhTNzc1MVJWT0lQCQlTSF9IUzc3NTFSVk9JUApAQCAtMjUsNCArMjQsOSBAQAogRURPU0s3NzA1CQlTSF9FRE9TSzc3MDUKIFNINDIwMl9NSUNST0RFVgkJU0hfU0g0MjAyX01JQ1JPREVWCiBTSDAzCQkJU0hfU0gwMwotCitMQU5ESVNLCQkJU0hfTEFORElTSworUjc3ODBSUAkJCVNIX1I3NzgwUlAKK1I3NzgwTVAJCQlTSF9SNzc4ME1QCitUSVRBTgkJCVNIX1RJVEFOCitTSE1JTgkJCVNIX1NITUlOCis3NzEwVk9JUEdXCQlTSF83NzEwVk9JUEdXCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvZGVmY29uZmlnIGIvYXJjaC9zcGFyYzY0L2RlZmNvbmZpZwppbmRleCA1MWNmNjAyLi4wZmJkYWE1IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvZGVmY29uZmlnCisrKyBiL2FyY2gvc3BhcmM2NC9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CiAjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTgKLSMgU2F0IFNlcCAyMyAxODozMjoxOSAyMDA2CisjIFR1ZSBTZXAgMjYgMjM6MDk6MzUgMjAwNgogIwogQ09ORklHX1NQQVJDPXkKIENPTkZJR19TUEFSQzY0PXkKQEAgLTE0MSw2ICsxNDEsNyBAQAogQ09ORklHX1NVTl9JTz15CiBDT05GSUdfUENJPXkKIENPTkZJR19QQ0lfRE9NQUlOUz15CisjIENPTkZJR19QQ0lfTVVMVElUSFJFQURfUFJPQkUgaXMgbm90IHNldAogIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19TVU5fT1BFTlBST01GUz1tCiBDT05GSUdfU1BBUkMzMl9DT01QQVQ9eQpAQCAtMTk0LDIxICsxOTUsOSBAQAogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKLUNPTkZJR19UQ1BfQ09OR19BRFZBTkNFRD15Ci0KLSMKLSMgVENQIGNvbmdlc3Rpb24gY29udHJvbAotIwotQ09ORklHX1RDUF9DT05HX0JJQz15Ci1DT05GSUdfVENQX0NPTkdfQ1VCSUM9bQotQ09ORklHX1RDUF9DT05HX1dFU1RXT09EPW0KLUNPTkZJR19UQ1BfQ09OR19IVENQPW0KLUNPTkZJR19UQ1BfQ09OR19IU1RDUD1tCi1DT05GSUdfVENQX0NPTkdfSFlCTEE9bQotQ09ORklHX1RDUF9DT05HX1ZFR0FTPW0KLUNPTkZJR19UQ1BfQ09OR19TQ0FMQUJMRT1tCi1DT05GSUdfVENQX0NPTkdfTFA9bQotQ09ORklHX1RDUF9DT05HX1ZFTk89bQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0NVQklDPXkKK0NPTkZJR19ERUZBVUxUX1RDUF9DT05HPSJjdWJpYyIKIENPTkZJR19JUFY2PW0KIENPTkZJR19JUFY2X1BSSVZBQ1k9eQogQ09ORklHX0lQVjZfUk9VVEVSX1BSRUY9eQpAQCAtMjQ3LDYgKzIzNiw3IEBACiAjIERDQ1AgS2VybmVsIEhhY2tpbmcKICMKICMgQ09ORklHX0lQX0RDQ1BfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RDQ1BQUk9CRSBpcyBub3Qgc2V0CiAKICMKICMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCkBAIC00MDEsNiArMzkxLDcgQEAKICMKIENPTkZJR19SQUlEX0FUVFJTPW0KIENPTkZJR19TQ1NJPXkKK0NPTkZJR19TQ1NJX05FVExJTks9eQogQ09ORklHX1NDU0lfUFJPQ19GUz15CiAKICMKQEAgLTQyMiwxMiArNDEzLDEzIEBACiAjIENPTkZJR19TQ1NJX0xPR0dJTkcgaXMgbm90IHNldAogCiAjCi0jIFNDU0kgVHJhbnNwb3J0IEF0dHJpYnV0ZXMKKyMgU0NTSSBUcmFuc3BvcnRzCiAjCiBDT05GSUdfU0NTSV9TUElfQVRUUlM9eQogQ09ORklHX1NDU0lfRkNfQVRUUlM9eQogQ09ORklHX1NDU0lfSVNDU0lfQVRUUlM9bQogIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKIAogIwogIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCkBAIC00NDAsMTYgKzQzMiwxOCBAQAogIyBDT05GSUdfU0NTSV9BSUM3WFhYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfQUlDN1hYWF9PTEQgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9BSUM3OVhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDOTRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FSQ01TUiBpcyBub3Qgc2V0CiAjIENPTkZJR19NRUdBUkFJRF9ORVdHRU4gaXMgbm90IHNldAogIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX01FR0FSQUlEX1NBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEEgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9IUFRJT1AgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ETVgzMTkxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0ZVVFVSRV9ET01BSU4gaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JUFMgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JTklUSU8gaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9JTklBMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU1RFWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1NZTTUzQzhYWF8yIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSVBSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldApAQCAtNDYyLDYgKzQ1NiwxMSBAQAogIyBDT05GSUdfU0NTSV9TVU5FU1AgaXMgbm90IHNldAogCiAjCisjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycworIworIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKKworIwogIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQogIwogQ09ORklHX01EPXkKQEAgLTU3NSw2ICs1NzQsNyBAQAogIyBDT05GSUdfVklBX1ZFTE9DSVRZIGlzIG5vdCBzZXQKIENPTkZJR19USUdPTjM9bQogQ09ORklHX0JOWDI9bQorIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAwIE1iaXQpCkBAIC0xMDA2LDYgKzEwMDYsNyBAQAogIyBDT05GSUdfU05EX1ZJQTgyWFhfTU9ERU0gaXMgbm90IHNldAogIyBDT05GSUdfU05EX1ZYMjIyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9ZTUZQQ0kgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0FDOTdfUE9XRVJfU0FWRSBpcyBub3Qgc2V0CiAKICMKICMgVVNCIGRldmljZXMKQEAgLTEzNTMsNiArMTM1NCw3IEBACiAjIEtlcm5lbCBoYWNraW5nCiAjCiBDT05GSUdfUFJJTlRLX1RJTUU9eQorQ09ORklHX0VOQUJMRV9NVVNUX0NIRUNLPXkKIENPTkZJR19NQUdJQ19TWVNSUT15CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfS0VSTkVMPXkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3NwYXJjMzIuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc3lzX3NwYXJjMzIuYwppbmRleCBjODhhZTIzLi42OTQ0NGYyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3N5c19zcGFyYzMyLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zeXNfc3BhcmMzMi5jCkBAIC0xMDE2LDcgKzEwMTYsNyBAQAogCiBhc21saW5rYWdlIGxvbmcgc3lzMzJfc3lzY3RsKHN0cnVjdCBfX3N5c2N0bF9hcmdzMzIgX191c2VyICphcmdzKQogewotI2lmbmRlZiBDT05GSUdfU1lTQ1RMCisjaWZuZGVmIENPTkZJR19TWVNDVExfU1lTQ0FMTAogCXJldHVybiAtRU5PU1lTOwogI2Vsc2UKIAlzdHJ1Y3QgX19zeXNjdGxfYXJnczMyIHRtcDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMgYi9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jCmluZGV4IGRjYmE0ZTYuLjA5Y2I3ZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMKKysrIGIvYXJjaC9zcGFyYzY0L21tL2luaXQuYwpAQCAtOTIwLDggKzkyMCw3IEBACiAJaWYgKHNwYXJjX3JhbWRpc2tfaW1hZ2UgfHwgc3BhcmNfcmFtZGlza19pbWFnZTY0KSB7CiAJCXVuc2lnbmVkIGxvbmcgcmFtZGlza19pbWFnZSA9IHNwYXJjX3JhbWRpc2tfaW1hZ2UgPwogCQkJc3BhcmNfcmFtZGlza19pbWFnZSA6IHNwYXJjX3JhbWRpc2tfaW1hZ2U2NDsKLQkJaWYgKHJhbWRpc2tfaW1hZ2UgPj0gKHVuc2lnbmVkIGxvbmcpX2VuZCAtIDIgKiBQQUdFX1NJWkUpCi0JCQlyYW1kaXNrX2ltYWdlIC09IEtFUk5CQVNFOworCQlyYW1kaXNrX2ltYWdlIC09IEtFUk5CQVNFOwogCQlpbml0cmRfc3RhcnQgPSByYW1kaXNrX2ltYWdlICsgcGh5c19iYXNlOwogCQlpbml0cmRfZW5kID0gaW5pdHJkX3N0YXJ0ICsgc3BhcmNfcmFtZGlza19zaXplOwogCQlpZiAoaW5pdHJkX2VuZCA+IGVuZF9vZl9waHlzX21lbW9yeSkgewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZS14ODZfNjQgYi9hcmNoL3VtL01ha2VmaWxlLXg4Nl82NAppbmRleCA5NTU4YTdjLi4xMTE1NGI2IDEwMDY0NAotLS0gYS9hcmNoL3VtL01ha2VmaWxlLXg4Nl82NAorKysgYi9hcmNoL3VtL01ha2VmaWxlLXg4Nl82NApAQCAtNCwxMCArNCwxMyBAQAogY29yZS15ICs9IGFyY2gvdW0vc3lzLXg4Nl82NC8KIFNUQVJUIDo9IDB4NjAwMDAwMDAKIAorX2V4dHJhX2ZsYWdzXyA9IC1mbm8tYnVpbHRpbiAtbTY0IC1tY21vZGVsPWtlcm5lbAorCiAjV2UgI3VuZGVmIF9feDg2XzY0X18gZm9yIGtlcm5lbHNwYWNlLCBub3QgZm9yIHVzZXJzcGFjZSB3aGVyZQogI2l0J3MgbmVlZGVkIGZvciBoZWFkZXJzIHRvIHdvcmshCi1DRkxBR1MgKz0gLVVfXyQoU1VCQVJDSClfXyAtZm5vLWJ1aWx0aW4gLW02NAotVVNFUl9DRkxBR1MgKz0gLWZuby1idWlsdGluIC1tNjQKK0NGTEFHUyArPSAtVV9fJChTVUJBUkNIKV9fICQoX2V4dHJhX2ZsYWdzXykKK1VTRVJfQ0ZMQUdTICs9ICQoX2V4dHJhX2ZsYWdzXykKKwogQ0hFQ0tGTEFHUyAgKz0gLW02NAogQUZMQUdTICs9IC1tNjQKIExERkxBR1MgKz0gLW0gZWxmX3g4Nl82NApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL2NoYW5fa2Vybi5jCmluZGV4IGU4Mjc2NGYuLjM1NzZiM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9jaGFuX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvY2hhbl9rZXJuLmMKQEAgLTExMCw3ICsxMTAsNyBAQAogCSAgICAgICAiVU1MXG4iKTsKIH0KIAotc3RhdGljIHN0cnVjdCBjaGFuX29wcyBub3RfY29uZmlnZ2VkX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2hhbl9vcHMgbm90X2NvbmZpZ2dlZF9vcHMgPSB7CiAJLmluaXQJCT0gbm90X2NvbmZpZ2dlZF9pbml0LAogCS5vcGVuCQk9IG5vdF9jb25maWdnZWRfb3BlbiwKIAkuY2xvc2UJCT0gbm90X2NvbmZpZ2dlZF9jbG9zZSwKQEAgLTM3Myw3ICszNzMsNyBAQAogfQogCiBpbnQgY29uc29sZV9vcGVuX2NoYW4oc3RydWN0IGxpbmUgKmxpbmUsIHN0cnVjdCBjb25zb2xlICpjbywKLQkJICAgICAgc3RydWN0IGNoYW5fb3B0cyAqb3B0cykKKwkJICAgICAgY29uc3Qgc3RydWN0IGNoYW5fb3B0cyAqb3B0cykKIHsKIAlpbnQgZXJyOwogCkBAIC00OTQsMTAgKzQ5NCwxMCBAQAogCiBzdHJ1Y3QgY2hhbl90eXBlIHsKIAljaGFyICprZXk7Ci0Jc3RydWN0IGNoYW5fb3BzICpvcHM7CisJY29uc3Qgc3RydWN0IGNoYW5fb3BzICpvcHM7CiB9OwogCi1zdGF0aWMgc3RydWN0IGNoYW5fdHlwZSBjaGFuX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGNoYW5fdHlwZSBjaGFuX3RhYmxlW10gPSB7CiAJeyAiZmQiLCAmZmRfb3BzIH0sCiAKICNpZmRlZiBDT05GSUdfTlVMTF9DSEFOCkBAIC01MzQsMTAgKzUzNCwxMCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBjaGFuICpwYXJzZV9jaGFuKHN0cnVjdCBsaW5lICpsaW5lLCBjaGFyICpzdHIsIGludCBkZXZpY2UsCi0JCQkgICAgICAgc3RydWN0IGNoYW5fb3B0cyAqb3B0cykKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY2hhbl9vcHRzICpvcHRzKQogewotCXN0cnVjdCBjaGFuX3R5cGUgKmVudHJ5OwotCXN0cnVjdCBjaGFuX29wcyAqb3BzOworCWNvbnN0IHN0cnVjdCBjaGFuX3R5cGUgKmVudHJ5OworCWNvbnN0IHN0cnVjdCBjaGFuX29wcyAqb3BzOwogCXN0cnVjdCBjaGFuICpjaGFuOwogCXZvaWQgKmRhdGE7CiAJaW50IGk7CkBAIC01ODIsNyArNTgyLDcgQEAKIH0KIAogaW50IHBhcnNlX2NoYW5fcGFpcihjaGFyICpzdHIsIHN0cnVjdCBsaW5lICpsaW5lLCBpbnQgZGV2aWNlLAotCQkgICAgc3RydWN0IGNoYW5fb3B0cyAqb3B0cykKKwkJICAgIGNvbnN0IHN0cnVjdCBjaGFuX29wdHMgKm9wdHMpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMgPSAmbGluZS0+Y2hhbl9saXN0OwogCXN0cnVjdCBjaGFuICpuZXcsICpjaGFuOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2RhZW1vbi5oIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbi5oCmluZGV4IDczMjZjNDIuLjNiYzNjZjYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9kYWVtb24uaAorKysgYi9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uLmgKQEAgLTE4LDcgKzE4LDcgQEAKIAl2b2lkICpkZXY7CiB9OwogCi1leHRlcm4gc3RydWN0IG5ldF91c2VyX2luZm8gZGFlbW9uX3VzZXJfaW5mbzsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbmV0X3VzZXJfaW5mbyBkYWVtb25fdXNlcl9pbmZvOwogCiBleHRlcm4gaW50IGRhZW1vbl91c2VyX3dyaXRlKGludCBmZCwgdm9pZCAqYnVmLCBpbnQgbGVuLCAKIAkJCSAgICAgc3RydWN0IGRhZW1vbl9kYXRhICpwcmkpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX2tlcm4uYwppbmRleCA1M2QwOWVkLi44MjQzODY5IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvZGFlbW9uX2tlcm4uYwpAQCAtNTcsNyArNTcsNyBAQAogCQkJCSAoc3RydWN0IGRhZW1vbl9kYXRhICopICZscC0+dXNlcikpOwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9rZXJuX2luZm8gZGFlbW9uX2tlcm5faW5mbyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2tlcm5faW5mbyBkYWVtb25fa2Vybl9pbmZvID0gewogCS5pbml0CQkJPSBkYWVtb25faW5pdCwKIAkucHJvdG9jb2wJCT0gZXRoX3Byb3RvY29sLAogCS5yZWFkCQkJPSBkYWVtb25fcmVhZCwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9kYWVtb25fdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKaW5kZXggYzk0NDI2NS4uNzc5NTRlYSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2RhZW1vbl91c2VyLmMKQEAgLTE4Miw3ICsxODIsNyBAQAogCXJldHVybihtdHUpOwogfQogCi1zdHJ1Y3QgbmV0X3VzZXJfaW5mbyBkYWVtb25fdXNlcl9pbmZvID0geworY29uc3Qgc3RydWN0IG5ldF91c2VyX2luZm8gZGFlbW9uX3VzZXJfaW5mbyA9IHsKIAkuaW5pdAkJPSBkYWVtb25fdXNlcl9pbml0LAogCS5vcGVuCQk9IGRhZW1vbl9vcGVuLAogCS5jbG9zZQkgCT0gTlVMTCwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9mZC5jIGIvYXJjaC91bS9kcml2ZXJzL2ZkLmMKaW5kZXggYzQxZjc1ZS4uMTA4YjdkYSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2ZkLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2ZkLmMKQEAgLTIwLDcgKzIwLDcgQEAKIAljaGFyIHN0cltzaXplb2YoIjEyMzQ1Njc4OTBcMCIpXTsKIH07CiAKLXN0YXRpYyB2b2lkICpmZF9pbml0KGNoYXIgKnN0ciwgaW50IGRldmljZSwgc3RydWN0IGNoYW5fb3B0cyAqb3B0cykKK3N0YXRpYyB2b2lkICpmZF9pbml0KGNoYXIgKnN0ciwgaW50IGRldmljZSwgY29uc3Qgc3RydWN0IGNoYW5fb3B0cyAqb3B0cykKIHsKIAlzdHJ1Y3QgZmRfY2hhbiAqZGF0YTsKIAljaGFyICplbmQ7CkBAIC03Nyw3ICs3Nyw3IEBACiAJfQogfQogCi1zdHJ1Y3QgY2hhbl9vcHMgZmRfb3BzID0geworY29uc3Qgc3RydWN0IGNoYW5fb3BzIGZkX29wcyA9IHsKIAkudHlwZQkJPSAiZmQiLAogCS5pbml0CQk9IGZkX2luaXQsCiAJLm9wZW4JCT0gZmRfb3BlbiwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9ob3N0YXVkaW9fa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL2hvc3RhdWRpb19rZXJuLmMKaW5kZXggMzcyMzJmOS4uZDI0N2VmNCAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2hvc3RhdWRpb19rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL2hvc3RhdWRpb19rZXJuLmMKQEAgLTI4MCw3ICsyODAsNyBAQAogCiAvKiBrZXJuZWwgbW9kdWxlIG9wZXJhdGlvbnMgKi8KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaG9zdGF1ZGlvX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBob3N0YXVkaW9fZm9wcyA9IHsKICAgICAgICAgLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCiAgICAgICAgIC5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKICAgICAgICAgLnJlYWQgICAgICAgICAgID0gaG9zdGF1ZGlvX3JlYWQsCkBAIC0yOTIsNyArMjkyLDcgQEAKICAgICAgICAgLnJlbGVhc2UgICAgICAgID0gaG9zdGF1ZGlvX3JlbGVhc2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBob3N0bWl4ZXJfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhvc3RtaXhlcl9mb3BzID0gewogICAgICAgICAub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKICAgICAgICAgLmxsc2VlayAgICAgICAgID0gbm9fbGxzZWVrLAogICAgICAgICAuaW9jdGwgICAgICAgICAgPSBob3N0bWl4ZXJfaW9jdGxfbWl4ZGV2LApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL2xpbmUuYyBiL2FyY2gvdW0vZHJpdmVycy9saW5lLmMKaW5kZXggZWJlYmFhYi4uNTYzY2U3NiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL2xpbmUuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbGluZS5jCkBAIC0yNTEsNyArMjUxLDcgQEAKIAkvKiBub3RoaW5nICovCiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgeworc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJaW50ICBjbWQ7CiAJY2hhciAqbGV2ZWw7CiAJY2hhciAqbmFtZTsKQEAgLTQwNSw3ICs0MDUsNyBAQAogCiBpbnQgbGluZV9zZXR1cF9pcnEoaW50IGZkLCBpbnQgaW5wdXQsIGludCBvdXRwdXQsIHN0cnVjdCBsaW5lICpsaW5lLCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBsaW5lX2RyaXZlciAqZHJpdmVyID0gbGluZS0+ZHJpdmVyOworCWNvbnN0IHN0cnVjdCBsaW5lX2RyaXZlciAqZHJpdmVyID0gbGluZS0+ZHJpdmVyOwogCWludCBlcnIgPSAwLCBmbGFncyA9IElSUUZfRElTQUJMRUQgfCBJUlFGX1NIQVJFRCB8IElSUUZfU0FNUExFX1JBTkRPTTsKIAogCWlmIChpbnB1dCkKQEAgLTU1OCw3ICs1NTgsNyBAQAogfQogCiBpbnQgbGluZV9jb25maWcoc3RydWN0IGxpbmUgKmxpbmVzLCB1bnNpZ25lZCBpbnQgbnVtLCBjaGFyICpzdHIsCi0JCXN0cnVjdCBjaGFuX29wdHMgKm9wdHMpCisJCWNvbnN0IHN0cnVjdCBjaGFuX29wdHMgKm9wdHMpCiB7CiAJc3RydWN0IGxpbmUgKmxpbmU7CiAJY2hhciAqbmV3OwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL21jYXN0LmggYi9hcmNoL3VtL2RyaXZlcnMvbWNhc3QuaAppbmRleCBhMmM2ZGIyLi5iYzU2YWY5IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbWNhc3QuaAorKysgYi9hcmNoL3VtL2RyaXZlcnMvbWNhc3QuaApAQCAtMTMsNyArMTMsNyBAQAogCXZvaWQgKmRldjsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgbmV0X3VzZXJfaW5mbyBtY2FzdF91c2VyX2luZm87CitleHRlcm4gY29uc3Qgc3RydWN0IG5ldF91c2VyX2luZm8gbWNhc3RfdXNlcl9pbmZvOwogCiBleHRlcm4gaW50IG1jYXN0X3VzZXJfd3JpdGUoaW50IGZkLCB2b2lkICpidWYsIGludCBsZW4sIAogCQkJICAgIHN0cnVjdCBtY2FzdF9kYXRhICpwcmkpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL21jYXN0X2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9tY2FzdF9rZXJuLmMKaW5kZXggM2E3YWYxOC4uYzA5MGZiZCAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL21jYXN0X2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbWNhc3Rfa2Vybi5jCkBAIC02MSw3ICs2MSw3IEBACiAJCQkJIChzdHJ1Y3QgbWNhc3RfZGF0YSAqKSAmbHAtPnVzZXIpOwogfQogCi1zdGF0aWMgc3RydWN0IG5ldF9rZXJuX2luZm8gbWNhc3Rfa2Vybl9pbmZvID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfa2Vybl9pbmZvIG1jYXN0X2tlcm5faW5mbyA9IHsKIAkuaW5pdAkJCT0gbWNhc3RfaW5pdCwKIAkucHJvdG9jb2wJCT0gZXRoX3Byb3RvY29sLAogCS5yZWFkCQkJPSBtY2FzdF9yZWFkLApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL21jYXN0X3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9tY2FzdF91c2VyLmMKaW5kZXggYWZlODViZi4uNGQyYmQzOSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL21jYXN0X3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvbWNhc3RfdXNlci5jCkBAIC0xNTIsNyArMTUyLDcgQEAKIAlyZXR1cm4obXR1KTsKIH0KIAotc3RydWN0IG5ldF91c2VyX2luZm8gbWNhc3RfdXNlcl9pbmZvID0geworY29uc3Qgc3RydWN0IG5ldF91c2VyX2luZm8gbWNhc3RfdXNlcl9pbmZvID0gewogCS5pbml0CQk9IG1jYXN0X3VzZXJfaW5pdCwKIAkub3BlbgkJPSBtY2FzdF9vcGVuLAogCS5jbG9zZQkgCT0gbWNhc3RfY2xvc2UsCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbW1hcHBlcl9rZXJuLmMgYi9hcmNoL3VtL2RyaXZlcnMvbW1hcHBlcl9rZXJuLmMKaW5kZXggMDIyZjY3Yi4uOWEzYjVkYSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL21tYXBwZXJfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tbWFwcGVyX2tlcm4uYwpAQCAtODUsNyArODUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtbWFwcGVyX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtbWFwcGVyX2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5yZWFkCQk9IG1tYXBwZXJfcmVhZCwKIAkud3JpdGUJCT0gbW1hcHBlcl93cml0ZSwKQEAgLTk1LDcgKzk1LDcgQEAKIAkucmVsZWFzZQk9IG1tYXBwZXJfcmVsZWFzZSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBtbWFwcGVyX2RldiA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWlzY2RldmljZSBtbWFwcGVyX2RldiA9IHsKIAkubWlub3IJCT0gTUlTQ19EWU5BTUlDX01JTk9SLAogCS5uYW1lCQk9ICJtbWFwcGVyIiwKIAkuZm9wcwkJPSAmbW1hcHBlcl9mb3BzCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbmV0X2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9uZXRfa2Vybi5jCmluZGV4IDRhNzk2NmIuLjY2NGMyZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9uZXRfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9uZXRfa2Vybi5jCkBAIC0xMTQsOCArMTE0LDYgQEAKIAlzdHJ1Y3QgdW1sX25ldF9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKIAlpbnQgZXJyOwogCi0Jc3Bpbl9sb2NrKCZscC0+bG9jayk7Ci0KIAlpZihscC0+ZmQgPj0gMCl7CiAJCWVyciA9IC1FTlhJTzsKIAkJZ290byBvdXQ7CkBAIC0xNDksOCArMTQ3LDYgQEAKIAkgKi8KIAl3aGlsZSgoZXJyID0gdW1sX25ldF9yeChkZXYpKSA+IDApIDsKIAotCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7Ci0KIAlzcGluX2xvY2soJm9wZW5lZF9sb2NrKTsKIAlsaXN0X2FkZCgmbHAtPmxpc3QsICZvcGVuZWQpOwogCXNwaW5fdW5sb2NrKCZvcGVuZWRfbG9jayk7CkBAIC0xNjAsNyArMTU2LDYgQEAKIAlpZihscC0+Y2xvc2UgIT0gTlVMTCkgKCpscC0+Y2xvc2UpKGxwLT5mZCwgJmxwLT51c2VyKTsKIAlscC0+ZmQgPSAtMTsKIG91dDoKLQlzcGluX3VubG9jaygmbHAtPmxvY2spOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE2OSwxNSArMTY0LDEyIEBACiAJc3RydWN0IHVtbF9uZXRfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CiAJCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCXNwaW5fbG9jaygmbHAtPmxvY2spOwogCiAJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiAJaWYobHAtPmNsb3NlICE9IE5VTEwpCiAJCSgqbHAtPmNsb3NlKShscC0+ZmQsICZscC0+dXNlcik7CiAJbHAtPmZkID0gLTE7CiAKLQlzcGluX3VubG9jaygmbHAtPmxvY2spOwotCiAJc3Bpbl9sb2NrKCZvcGVuZWRfbG9jayk7CiAJbGlzdF9kZWwoJmxwLT5saXN0KTsKIAlzcGluX3VubG9jaygmb3BlbmVkX2xvY2spOwpAQCAtMjQ2LDkgKzIzOCw5IEBACiAJc3RydWN0IHVtbF9uZXRfcHJpdmF0ZSAqbHAgPSBkZXYtPnByaXY7CiAJc3RydWN0IHNvY2thZGRyICpod2FkZHIgPSBhZGRyOwogCi0Jc3Bpbl9sb2NrKCZscC0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOwogCXNldF9ldGhlcl9tYWMoZGV2LCBod2FkZHItPnNhX2RhdGEpOwotCXNwaW5fdW5sb2NrKCZscC0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CiAKIAlyZXR1cm4oMCk7CiB9CkBAIC0yNTgsNyArMjUwLDcgQEAKIAlzdHJ1Y3QgdW1sX25ldF9wcml2YXRlICpscCA9IGRldi0+cHJpdjsKIAlpbnQgZXJyID0gMDsKIAotCXNwaW5fbG9jaygmbHAtPmxvY2spOworCXNwaW5fbG9ja19pcnEoJmxwLT5sb2NrKTsKIAogCW5ld19tdHUgPSAoKmxwLT5zZXRfbXR1KShuZXdfbXR1LCAmbHAtPnVzZXIpOwogCWlmKG5ld19tdHUgPCAwKXsKQEAgLTI2OSw3ICsyNjEsNyBAQAogCWRldi0+bXR1ID0gbmV3X210dTsKIAogIG91dDoKLQlzcGluX3VubG9jaygmbHAtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTU2OSwxMiArNTYxLDEzIEBACiAJaW50IG4sIGVycjsKIAogCWVyciA9IGV0aF9wYXJzZShzdHIsICZuLCAmc3RyKTsKLQlpZihlcnIpIHJldHVybigxKTsKKwlpZihlcnIpCisJCXJldHVybiAxOwogCi0JbmV3ID0gYWxsb2NfYm9vdG1lbShzaXplb2YobmV3KSk7CisJbmV3ID0gYWxsb2NfYm9vdG1lbShzaXplb2YoKm5ldykpOwogCWlmIChuZXcgPT0gTlVMTCl7CiAJCXByaW50aygiZXRoX2luaXQgOiBhbGxvY19ib290bWVtIGZhaWxlZFxuIik7Ci0JCXJldHVybigxKTsKKwkJcmV0dXJuIDE7CiAJfQogCiAJSU5JVF9MSVNUX0hFQUQoJm5ldy0+bGlzdCk7CkBAIC01ODIsNyArNTc1LDcgQEAKIAluZXctPmluaXQgPSBzdHI7CiAKIAlsaXN0X2FkZF90YWlsKCZuZXctPmxpc3QsICZldGhfY21kX2xpbmUpOwotCXJldHVybigxKTsKKwlyZXR1cm4gMTsKIH0KIAogX19zZXR1cCgiZXRoIiwgZXRoX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9udWxsLmMgYi9hcmNoL3VtL2RyaXZlcnMvbnVsbC5jCmluZGV4IDE0Y2M1ZjcuLjM2ODNlZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9udWxsLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL251bGwuYwpAQCAtMTAsNyArMTAsNyBAQAogCiBzdGF0aWMgaW50IG51bGxfY2hhbjsKIAotc3RhdGljIHZvaWQgKm51bGxfaW5pdChjaGFyICpzdHIsIGludCBkZXZpY2UsIHN0cnVjdCBjaGFuX29wdHMgKm9wdHMpCitzdGF0aWMgdm9pZCAqbnVsbF9pbml0KGNoYXIgKnN0ciwgaW50IGRldmljZSwgY29uc3Qgc3RydWN0IGNoYW5fb3B0cyAqb3B0cykKIHsKIAlyZXR1cm4oJm51bGxfY2hhbik7CiB9CkBAIC0zMSw3ICszMSw3IEBACiB7CiB9CiAKLXN0cnVjdCBjaGFuX29wcyBudWxsX29wcyA9IHsKK2NvbnN0IHN0cnVjdCBjaGFuX29wcyBudWxsX29wcyA9IHsKIAkudHlwZQkJPSAibnVsbCIsCiAJLmluaXQJCT0gbnVsbF9pbml0LAogCS5vcGVuCQk9IG51bGxfb3BlbiwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9wY2FwX2tlcm4uYyBiL2FyY2gvdW0vZHJpdmVycy9wY2FwX2tlcm4uYwppbmRleCA0Yzc2N2M3Li42ZTFlZjg1IDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvcGNhcF9rZXJuLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3BjYXBfa2Vybi5jCkBAIC00Niw3ICs0Niw3IEBACiAJcmV0dXJuKC1FUEVSTSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2tlcm5faW5mbyBwY2FwX2tlcm5faW5mbyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2tlcm5faW5mbyBwY2FwX2tlcm5faW5mbyA9IHsKIAkuaW5pdAkJCT0gcGNhcF9pbml0LAogCS5wcm90b2NvbAkJPSBldGhfcHJvdG9jb2wsCiAJLnJlYWQJCQk9IHBjYXBfcmVhZCwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIuYyBiL2FyY2gvdW0vZHJpdmVycy9wY2FwX3VzZXIuYwppbmRleCBlZGZjYjI5Li4yZWY2NDFkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvcGNhcF91c2VyLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3BjYXBfdXNlci5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAlyZXR1cm4oaGRhdGEubGVuKTsKIH0KIAotc3RydWN0IG5ldF91c2VyX2luZm8gcGNhcF91c2VyX2luZm8gPSB7Citjb25zdCBzdHJ1Y3QgbmV0X3VzZXJfaW5mbyBwY2FwX3VzZXJfaW5mbyA9IHsKIAkuaW5pdAkJPSBwY2FwX3VzZXJfaW5pdCwKIAkub3BlbgkJPSBwY2FwX29wZW4sCiAJLmNsb3NlCSAJPSBOVUxMLApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3BvcnRfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3BvcnRfdXNlci5jCmluZGV4IGM0M2U4YmIuLmYyZThmYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9wb3J0X3VzZXIuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcG9ydF91c2VyLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAljaGFyIGRldltzaXplb2YoIjMyNzY4XDAiKV07CiB9OwogCi1zdGF0aWMgdm9pZCAqcG9ydF9pbml0KGNoYXIgKnN0ciwgaW50IGRldmljZSwgc3RydWN0IGNoYW5fb3B0cyAqb3B0cykKK3N0YXRpYyB2b2lkICpwb3J0X2luaXQoY2hhciAqc3RyLCBpbnQgZGV2aWNlLCBjb25zdCBzdHJ1Y3QgY2hhbl9vcHRzICpvcHRzKQogewogCXN0cnVjdCBwb3J0X2NoYW4gKmRhdGE7CiAJdm9pZCAqa2Vybl9kYXRhOwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJb3NfY2xvc2VfZmlsZShmZCk7CiB9CiAKLXN0cnVjdCBjaGFuX29wcyBwb3J0X29wcyA9IHsKK2NvbnN0IHN0cnVjdCBjaGFuX29wcyBwb3J0X29wcyA9IHsKIAkudHlwZQkJPSAicG9ydCIsCiAJLmluaXQJCT0gcG9ydF9pbml0LAogCS5vcGVuCQk9IHBvcnRfb3BlbiwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9wdHkuYyBiL2FyY2gvdW0vZHJpdmVycy9wdHkuYwppbmRleCAxYzU1NWMzLi5hYmVjNjIwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvcHR5LmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3B0eS5jCkBAIC0yMiw3ICsyMiw3IEBACiAJY2hhciBkZXZfbmFtZVtzaXplb2YoIi9kZXYvcHRzLzAxMjM0NTZcMCIpXTsKIH07CiAKLXN0YXRpYyB2b2lkICpwdHlfY2hhbl9pbml0KGNoYXIgKnN0ciwgaW50IGRldmljZSwgc3RydWN0IGNoYW5fb3B0cyAqb3B0cykKK3N0YXRpYyB2b2lkICpwdHlfY2hhbl9pbml0KGNoYXIgKnN0ciwgaW50IGRldmljZSwgY29uc3Qgc3RydWN0IGNoYW5fb3B0cyAqb3B0cykKIHsKIAlzdHJ1Y3QgcHR5X2NoYW4gKmRhdGE7CiAKQEAgLTExOCw3ICsxMTgsNyBAQAogCXJldHVybihmZCk7CiB9CiAKLXN0cnVjdCBjaGFuX29wcyBwdHlfb3BzID0geworY29uc3Qgc3RydWN0IGNoYW5fb3BzIHB0eV9vcHMgPSB7CiAJLnR5cGUJCT0gInB0eSIsCiAJLmluaXQJCT0gcHR5X2NoYW5faW5pdCwKIAkub3BlbgkJPSBwdHlfb3BlbiwKQEAgLTEzMSw3ICsxMzEsNyBAQAogCS53aW5jaAkJPSAwLAogfTsKIAotc3RydWN0IGNoYW5fb3BzIHB0c19vcHMgPSB7Citjb25zdCBzdHJ1Y3QgY2hhbl9vcHMgcHRzX29wcyA9IHsKIAkudHlwZQkJPSAicHRzIiwKIAkuaW5pdAkJPSBwdHlfY2hhbl9pbml0LAogCS5vcGVuCQk9IHB0c19vcGVuLApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3JhbmRvbS5jIGIvYXJjaC91bS9kcml2ZXJzL3JhbmRvbS5jCmluZGV4IGJhNDcxZjUuLmFlOTkwOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9yYW5kb20uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvcmFuZG9tLmMKQEAgLTY4LDcgKzY4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBybmdfY2hyZGV2X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJuZ19jaHJkZXZfb3BzID0gewogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSBybmdfZGV2X29wZW4sCiAJLnJlYWQJCT0gcm5nX2Rldl9yZWFkLApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3NsaXAuaCBiL2FyY2gvdW0vZHJpdmVycy9zbGlwLmgKaW5kZXggYmIwZGFiNC4uYzY0ZjhjNiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3NsaXAuaAorKysgYi9hcmNoL3VtL2RyaXZlcnMvc2xpcC5oCkBAIC0xMiw3ICsxMiw3IEBACiAJc3RydWN0IHNsaXBfcHJvdG8gc2xpcDsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgbmV0X3VzZXJfaW5mbyBzbGlwX3VzZXJfaW5mbzsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbmV0X3VzZXJfaW5mbyBzbGlwX3VzZXJfaW5mbzsKIAogZXh0ZXJuIGludCBzbGlwX3VzZXJfcmVhZChpbnQgZmQsIHZvaWQgKmJ1ZiwgaW50IGxlbiwgc3RydWN0IHNsaXBfZGF0YSAqcHJpKTsKIGV4dGVybiBpbnQgc2xpcF91c2VyX3dyaXRlKGludCBmZCwgdm9pZCAqYnVmLCBpbnQgbGVuLCBzdHJ1Y3Qgc2xpcF9kYXRhICpwcmkpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3NsaXBfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL3NsaXBfa2Vybi5jCmluZGV4IDE2M2VlMGQuLmNjZWEyZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9zbGlwX2tlcm4uYworKysgYi9hcmNoL3VtL2RyaXZlcnMvc2xpcF9rZXJuLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAkJCSAgICAgICAoc3RydWN0IHNsaXBfZGF0YSAqKSAmbHAtPnVzZXIpKTsKIH0KIAotc3RydWN0IG5ldF9rZXJuX2luZm8gc2xpcF9rZXJuX2luZm8gPSB7Citjb25zdCBzdHJ1Y3QgbmV0X2tlcm5faW5mbyBzbGlwX2tlcm5faW5mbyA9IHsKIAkuaW5pdAkJCT0gc2xpcF9pbml0LAogCS5wcm90b2NvbAkJPSBzbGlwX3Byb3RvY29sLAogCS5yZWFkCQkJPSBzbGlwX3JlYWQsCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMgYi9hcmNoL3VtL2RyaXZlcnMvc2xpcF91c2VyLmMKaW5kZXggODlmYmVjMS4uODQ2MDI4NSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3NsaXBfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlwX3VzZXIuYwpAQCAtMjQxLDcgKzI0MSw3IEBACiAJY2xvc2VfYWRkcihhZGRyLCBuZXRtYXNrLCBwcmktPm5hbWUpOwogfQogCi1zdHJ1Y3QgbmV0X3VzZXJfaW5mbyBzbGlwX3VzZXJfaW5mbyA9IHsKK2NvbnN0IHN0cnVjdCBuZXRfdXNlcl9pbmZvIHNsaXBfdXNlcl9pbmZvID0gewogCS5pbml0CQk9IHNsaXBfdXNlcl9pbml0LAogCS5vcGVuCQk9IHNsaXBfb3BlbiwKIAkuY2xvc2UJIAk9IHNsaXBfY2xvc2UsCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnAuaCBiL2FyY2gvdW0vZHJpdmVycy9zbGlycC5oCmluZGV4IDZjZjg4YWIuLjg5Y2NmODMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vZHJpdmVycy9zbGlycC5oCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlycC5oCkBAIC0yNCw3ICsyNCw3IEBACiAJc3RydWN0IHNsaXBfcHJvdG8gc2xpcDsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgbmV0X3VzZXJfaW5mbyBzbGlycF91c2VyX2luZm87CitleHRlcm4gY29uc3Qgc3RydWN0IG5ldF91c2VyX2luZm8gc2xpcnBfdXNlcl9pbmZvOwogCiBleHRlcm4gaW50IHNsaXJwX3VzZXJfcmVhZChpbnQgZmQsIHZvaWQgKmJ1ZiwgaW50IGxlbiwgc3RydWN0IHNsaXJwX2RhdGEgKnByaSk7CiBleHRlcm4gaW50IHNsaXJwX3VzZXJfd3JpdGUoaW50IGZkLCB2b2lkICpidWYsIGludCBsZW4sCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL3NsaXJwX2tlcm4uYwppbmRleCA5NWU1MGM5Li5hZTMyMmUxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlycF9rZXJuLmMKQEAgLTY0LDcgKzY0LDcgQEAKIAkJCSAgICAgICAoc3RydWN0IHNsaXJwX2RhdGEgKikgJmxwLT51c2VyKSk7CiB9CiAKLXN0cnVjdCBuZXRfa2Vybl9pbmZvIHNsaXJwX2tlcm5faW5mbyA9IHsKK2NvbnN0IHN0cnVjdCBuZXRfa2Vybl9pbmZvIHNsaXJwX2tlcm5faW5mbyA9IHsKIAkuaW5pdAkJCT0gc2xpcnBfaW5pdCwKIAkucHJvdG9jb2wJCT0gc2xpcnBfcHJvdG9jb2wsCiAJLnJlYWQJCQk9IHNsaXJwX3JlYWQsCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfdXNlci5jIGIvYXJjaC91bS9kcml2ZXJzL3NsaXJwX3VzZXIuYwppbmRleCAzM2M1ZjZlLi5jZTVlODVkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc2xpcnBfdXNlci5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9zbGlycF91c2VyLmMKQEAgLTEyNiw3ICsxMjYsNyBAQAogCXJldHVybihtdHUpOwogfQogCi1zdHJ1Y3QgbmV0X3VzZXJfaW5mbyBzbGlycF91c2VyX2luZm8gPSB7Citjb25zdCBzdHJ1Y3QgbmV0X3VzZXJfaW5mbyBzbGlycF91c2VyX2luZm8gPSB7CiAJLmluaXQJCT0gc2xpcnBfdXNlcl9pbml0LAogCS5vcGVuCQk9IHNsaXJwX29wZW4sCiAJLmNsb3NlCSAJPSBzbGlycF9jbG9zZSwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vZHJpdmVycy9zc2wuYyBiL2FyY2gvdW0vZHJpdmVycy9zc2wuYwppbmRleCA2ZGFmZDZmLi42ZjEzZTdjIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvc3NsLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3NzbC5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAiaXJxX3VzZXIuaCIKICNpbmNsdWRlICJtY29uc29sZV9rZXJuLmgiCiAKLXN0YXRpYyBpbnQgc3NsX3ZlcnNpb24gPSAxOworc3RhdGljIGNvbnN0IGludCBzc2xfdmVyc2lvbiA9IDE7CiAKIC8qIFJlZmVyZW5jZWQgb25seSBieSB0dHlfZHJpdmVyIGJlbG93IC0gcHJlc3VtYWJseSBpdCdzIGxvY2tlZCBjb3JyZWN0bHkKICAqIGJ5IHRoZSB0dHkgZHJpdmVyLgpAQCAtMTIzLDcgKzEyMyw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBzc2xfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBzc2xfb3BzID0gewogCS5vcGVuIAkgCQk9IHNzbF9vcGVuLAogCS5jbG9zZSAJIAkJPSBsaW5lX2Nsb3NlLAogCS53cml0ZSAJIAkJPSBsaW5lX3dyaXRlLApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3N0ZGlvX2NvbnNvbGUuYyBiL2FyY2gvdW0vZHJpdmVycy9zdGRpb19jb25zb2xlLmMKaW5kZXggODU2ZjU2OC4uNWU0NGFkYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3N0ZGlvX2NvbnNvbGUuYworKysgYi9hcmNoL3VtL2RyaXZlcnMvc3RkaW9fY29uc29sZS5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAogc3RhdGljIGludCBjb25faW5pdF9kb25lID0gMDsKIAotc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBjb25zb2xlX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHR5X29wZXJhdGlvbnMgY29uc29sZV9vcHMgPSB7CiAJLm9wZW4gCSAJCT0gY29uX29wZW4sCiAJLmNsb3NlIAkgCQk9IGxpbmVfY2xvc2UsCiAJLndyaXRlIAkgCQk9IGxpbmVfd3JpdGUsCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvdHR5LmMgYi9hcmNoL3VtL2RyaXZlcnMvdHR5LmMKaW5kZXggOWY3MGVkZi4uMTFkZTNhYyAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3R0eS5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy90dHkuYwpAQCAtMTgsNyArMTgsNyBAQAogCXN0cnVjdCB0ZXJtaW9zIHR0OwogfTsKIAotc3RhdGljIHZvaWQgKnR0eV9jaGFuX2luaXQoY2hhciAqc3RyLCBpbnQgZGV2aWNlLCBzdHJ1Y3QgY2hhbl9vcHRzICpvcHRzKQorc3RhdGljIHZvaWQgKnR0eV9jaGFuX2luaXQoY2hhciAqc3RyLCBpbnQgZGV2aWNlLCBjb25zdCBzdHJ1Y3QgY2hhbl9vcHRzICpvcHRzKQogewogCXN0cnVjdCB0dHlfY2hhbiAqZGF0YTsKIApAQCAtNjIsNyArNjIsNyBAQAogCXJldHVybiBmZDsKIH0KIAotc3RydWN0IGNoYW5fb3BzIHR0eV9vcHMgPSB7Citjb25zdCBzdHJ1Y3QgY2hhbl9vcHMgdHR5X29wcyA9IHsKIAkudHlwZQkJPSAidHR5IiwKIAkuaW5pdAkJPSB0dHlfY2hhbl9pbml0LAogCS5vcGVuCQk9IHR0eV9vcGVuLApkaWZmIC0tZ2l0IGEvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMgYi9hcmNoL3VtL2RyaXZlcnMveHRlcm0uYwppbmRleCBhYWE2MzY2Ni4uMzg2ZjhiOSAxMDA2NDQKLS0tIGEvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKKysrIGIvYXJjaC91bS9kcml2ZXJzL3h0ZXJtLmMKQEAgLTMxLDcgKzMxLDcgQEAKIH07CiAKIC8qIE5vdCBzdGF0aWMgYmVjYXVzZSBpdCdzIGNhbGxlZCBkaXJlY3RseSBieSB0aGUgdHQgbW9kZSBnZGIgY29kZSAqLwotdm9pZCAqeHRlcm1faW5pdChjaGFyICpzdHIsIGludCBkZXZpY2UsIHN0cnVjdCBjaGFuX29wdHMgKm9wdHMpCit2b2lkICp4dGVybV9pbml0KGNoYXIgKnN0ciwgaW50IGRldmljZSwgY29uc3Qgc3RydWN0IGNoYW5fb3B0cyAqb3B0cykKIHsKIAlzdHJ1Y3QgeHRlcm1fY2hhbiAqZGF0YTsKIApAQCAtMTk0LDcgKzE5NCw3IEBACiAJZnJlZShkKTsKIH0KIAotc3RydWN0IGNoYW5fb3BzIHh0ZXJtX29wcyA9IHsKK2NvbnN0IHN0cnVjdCBjaGFuX29wcyB4dGVybV9vcHMgPSB7CiAJLnR5cGUJCT0gInh0ZXJtIiwKIAkuaW5pdAkJPSB4dGVybV9pbml0LAogCS5vcGVuCQk9IHh0ZXJtX29wZW4sCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvY2hhbl9rZXJuLmggYi9hcmNoL3VtL2luY2x1ZGUvY2hhbl9rZXJuLmgKaW5kZXggMWJiNWU5ZC4uNTcyZDI4NiAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2NoYW5fa2Vybi5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9jaGFuX2tlcm4uaApAQCAtMjMsMjEgKzIzLDIxIEBACiAJdW5zaWduZWQgaW50IG9wZW5lZDoxOwogCXVuc2lnbmVkIGludCBlbmFibGVkOjE7CiAJaW50IGZkOwotCXN0cnVjdCBjaGFuX29wcyAqb3BzOworCWNvbnN0IHN0cnVjdCBjaGFuX29wcyAqb3BzOwogCXZvaWQgKmRhdGE7CiB9OwogCiBleHRlcm4gdm9pZCBjaGFuX2ludGVycnVwdChzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgc3RydWN0IHdvcmtfc3RydWN0ICp0YXNrLAogCQkJICAgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IGlycSk7CiBleHRlcm4gaW50IHBhcnNlX2NoYW5fcGFpcihjaGFyICpzdHIsIHN0cnVjdCBsaW5lICpsaW5lLCBpbnQgZGV2aWNlLAotCQkJICAgc3RydWN0IGNoYW5fb3B0cyAqb3B0cyk7CisJCQkgICBjb25zdCBzdHJ1Y3QgY2hhbl9vcHRzICpvcHRzKTsKIGV4dGVybiBpbnQgb3Blbl9jaGFuKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zKTsKIGV4dGVybiBpbnQgd3JpdGVfY2hhbihzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuLAogCQkJICAgICBpbnQgd3JpdGVfaXJxKTsKIGV4dGVybiBpbnQgY29uc29sZV93cml0ZV9jaGFuKHN0cnVjdCBsaXN0X2hlYWQgKmNoYW5zLCBjb25zdCBjaGFyICpidWYsIAogCQkJICAgICAgaW50IGxlbik7CiBleHRlcm4gaW50IGNvbnNvbGVfb3Blbl9jaGFuKHN0cnVjdCBsaW5lICpsaW5lLCBzdHJ1Y3QgY29uc29sZSAqY28sCi0JCQkgICAgIHN0cnVjdCBjaGFuX29wdHMgKm9wdHMpOworCQkJICAgICBjb25zdCBzdHJ1Y3QgY2hhbl9vcHRzICpvcHRzKTsKIGV4dGVybiB2b2lkIGRlYWN0aXZhdGVfY2hhbihzdHJ1Y3QgbGlzdF9oZWFkICpjaGFucywgaW50IGlycSk7CiBleHRlcm4gdm9pZCByZWFjdGl2YXRlX2NoYW4oc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIGludCBpcnEpOwogZXh0ZXJuIHZvaWQgY2hhbl9lbmFibGVfd2luY2goc3RydWN0IGxpc3RfaGVhZCAqY2hhbnMsIHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2NoYW5fdXNlci5oIGIvYXJjaC91bS9pbmNsdWRlL2NoYW5fdXNlci5oCmluZGV4IDY1OWJiM2MuLmE3OTU1NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9jaGFuX3VzZXIuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvY2hhbl91c2VyLmgKQEAgLTIwLDcgKzIwLDcgQEAKIAogc3RydWN0IGNoYW5fb3BzIHsKIAljaGFyICp0eXBlOwotCXZvaWQgKigqaW5pdCkoY2hhciAqLCBpbnQsIHN0cnVjdCBjaGFuX29wdHMgKik7CisJdm9pZCAqKCppbml0KShjaGFyICosIGludCwgY29uc3Qgc3RydWN0IGNoYW5fb3B0cyAqKTsKIAlpbnQgKCpvcGVuKShpbnQsIGludCwgaW50LCB2b2lkICosIGNoYXIgKiopOwogCXZvaWQgKCpjbG9zZSkoaW50LCB2b2lkICopOwogCWludCAoKnJlYWQpKGludCwgY2hhciAqLCB2b2lkICopOwpAQCAtMzEsOCArMzEsOCBAQAogCWludCB3aW5jaDsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgY2hhbl9vcHMgZmRfb3BzLCBudWxsX29wcywgcG9ydF9vcHMsIHB0c19vcHMsIHB0eV9vcHMsIHR0eV9vcHMsCi0JeHRlcm1fb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBjaGFuX29wcyBmZF9vcHMsIG51bGxfb3BzLCBwb3J0X29wcywgcHRzX29wcywgcHR5X29wcywKKwl0dHlfb3BzLCB4dGVybV9vcHM7CiAKIGV4dGVybiB2b2lkIGdlbmVyaWNfY2xvc2UoaW50IGZkLCB2b2lkICp1bnVzZWQpOwogZXh0ZXJuIGludCBnZW5lcmljX3JlYWQoaW50IGZkLCBjaGFyICpjX291dCwgdm9pZCAqdW51c2VkKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9rZXJuX3V0aWwuaCBiL2FyY2gvdW0vaW5jbHVkZS9rZXJuX3V0aWwuaAppbmRleCA4OWUxZGM4Li41OWNmYTllIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUva2Vybl91dGlsLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL2tlcm5fdXRpbC5oCkBAIC0yMSw3ICsyMSw3IEBACiAJa2Vybl9obmRsIHRpbWVyX2hhbmRsZXI7CiB9OwogCi1leHRlcm4gc3RydWN0IGtlcm5faGFuZGxlcnMgaGFuZGxpbmZvX2tlcm47CitleHRlcm4gY29uc3Qgc3RydWN0IGtlcm5faGFuZGxlcnMgaGFuZGxpbmZvX2tlcm47CiAKIGV4dGVybiBpbnQgbmNwdXM7CiBleHRlcm4gY2hhciAqbGludXhfcHJvZzsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9saW5lLmggYi9hcmNoL3VtL2luY2x1ZGUvbGluZS5oCmluZGV4IDI3YmYyZjYuLjY0MmM5YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9saW5lLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL2xpbmUuaApAQCAtNTIsNyArNTIsNyBAQAogCiAJaW50IHNpZ2lvOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB0YXNrOwotCXN0cnVjdCBsaW5lX2RyaXZlciAqZHJpdmVyOworCWNvbnN0IHN0cnVjdCBsaW5lX2RyaXZlciAqZHJpdmVyOwogCWludCBoYXZlX2lycTsKIH07CiAKQEAgLTk5LDcgKzk5LDcgQEAKIGV4dGVybiB2b2lkIGNsb3NlX2xpbmVzKHN0cnVjdCBsaW5lICpsaW5lcywgaW50IG5saW5lcyk7CiAKIGV4dGVybiBpbnQgbGluZV9jb25maWcoc3RydWN0IGxpbmUgKmxpbmVzLCB1bnNpZ25lZCBpbnQgc2l6ZW9mX2xpbmVzLAotCQkgICAgICAgY2hhciAqc3RyLCBzdHJ1Y3QgY2hhbl9vcHRzICpvcHRzKTsKKwkJICAgICAgIGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IGNoYW5fb3B0cyAqb3B0cyk7CiBleHRlcm4gaW50IGxpbmVfaWQoY2hhciAqKnN0ciwgaW50ICpzdGFydF9vdXQsIGludCAqZW5kX291dCk7CiBleHRlcm4gaW50IGxpbmVfcmVtb3ZlKHN0cnVjdCBsaW5lICpsaW5lcywgdW5zaWduZWQgaW50IHNpemVvZl9saW5lcywgaW50IG4pOwogZXh0ZXJuIGludCBsaW5lX2dldF9jb25maWcoY2hhciAqZGV2LCBzdHJ1Y3QgbGluZSAqbGluZXMsCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvbmV0X2tlcm4uaCBiL2FyY2gvdW0vaW5jbHVkZS9uZXRfa2Vybi5oCmluZGV4IGY3ZGU2ZGYuLjc2OWZiYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9uZXRfa2Vybi5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9uZXRfa2Vybi5oCkBAIC01NCw4ICs1NCw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCWNoYXIgKm5hbWU7CiAJaW50ICgqc2V0dXApKGNoYXIgKiwgY2hhciAqKiwgdm9pZCAqKTsKLQlzdHJ1Y3QgbmV0X3VzZXJfaW5mbyAqdXNlcjsKLQlzdHJ1Y3QgbmV0X2tlcm5faW5mbyAqa2VybjsKKwljb25zdCBzdHJ1Y3QgbmV0X3VzZXJfaW5mbyAqdXNlcjsKKwljb25zdCBzdHJ1Y3QgbmV0X2tlcm5faW5mbyAqa2VybjsKIAlpbnQgcHJpdmF0ZV9zaXplOwogCWludCBzZXR1cF9zaXplOwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9vcy5oIGIvYXJjaC91bS9pbmNsdWRlL29zLmgKaW5kZXggMjRmYjZkOC4uMTIwY2EyMSAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL29zLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL29zLmgKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlICJza2FzL21tX2lkLmgiCiAjaW5jbHVkZSAiaXJxX3VzZXIuaCIKICNpbmNsdWRlICJzeXNkZXAvdGxzLmgiCisjaW5jbHVkZSAic3lzZGVwL2FyY2hzZXRqbXAuaCIKIAogI2RlZmluZSBPU19UWVBFX0ZJTEUgMQogI2RlZmluZSBPU19UWVBFX0RJUiAyCkBAIC0xOTgsNyArMTk5LDkgQEAKIGV4dGVybiBpbnQgb3NfZ2V0cGlkKHZvaWQpOwogZXh0ZXJuIGludCBvc19nZXRwZ3JwKHZvaWQpOwogCisjaWZkZWYgVU1MX0NPTkZJR19NT0RFX1RUCiBleHRlcm4gdm9pZCBpbml0X25ld190aHJlYWRfc3RhY2sodm9pZCAqc2lnX3N0YWNrLCB2b2lkICgqdXNyMV9oYW5kbGVyKShpbnQpKTsKKyNlbmRpZgogZXh0ZXJuIHZvaWQgaW5pdF9uZXdfdGhyZWFkX3NpZ25hbHModm9pZCk7CiBleHRlcm4gaW50IHJ1bl9rZXJuZWxfdGhyZWFkKGludCAoKmZuKSh2b2lkICopLCB2b2lkICphcmcsIHZvaWQgKipqbXBfcHRyKTsKIApAQCAtMjE2LDcgKzIxOSw2IEBACiAgKi8KIGV4dGVybiB2b2lkIGZvcndhcmRfaXBpKGludCBmZCwgaW50IHBpZCk7CiBleHRlcm4gdm9pZCBraWxsX2NoaWxkX2RlYWQoaW50IHBpZCk7Ci1leHRlcm4gdm9pZCBzdG9wKHZvaWQpOwogZXh0ZXJuIGludCB3YWl0X2Zvcl9zdG9wKGludCBwaWQsIGludCBzaWcsIGludCBjb250X3R5cGUsIHZvaWQgKnJlbGF5KTsKIGV4dGVybiBpbnQgcHJvdGVjdF9tZW1vcnkodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKIAkJCSAgaW50IHIsIGludCB3LCBpbnQgeCwgaW50IG11c3Rfc3VjY2VlZCk7CkBAIC0zMDcsMTIgKzMwOSw5IEBACiBleHRlcm4gdm9pZCB1c2Vyc3BhY2UodW5pb24gdW1sX3B0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIHZvaWQgbWFwX3N0dWJfcGFnZXMoaW50IGZkLCB1bnNpZ25lZCBsb25nIGNvZGUsCiAJCQkgICB1bnNpZ25lZCBsb25nIGRhdGEsIHVuc2lnbmVkIGxvbmcgc3RhY2spOwotZXh0ZXJuIHZvaWQgbmV3X3RocmVhZCh2b2lkICpzdGFjaywgdm9pZCAqKnN3aXRjaF9idWZfcHRyLAotCQkJIHZvaWQgKipmb3JrX2J1Zl9wdHIsIHZvaWQgKCpoYW5kbGVyKShpbnQpKTsKLWV4dGVybiB2b2lkIHRocmVhZF93YWl0KHZvaWQgKnN3LCB2b2lkICpmYik7Ci1leHRlcm4gdm9pZCBzd2l0Y2hfdGhyZWFkcyh2b2lkICptZSwgdm9pZCAqbmV4dCk7Ci1leHRlcm4gaW50IHN0YXJ0X2lkbGVfdGhyZWFkKHZvaWQgKnN0YWNrLCB2b2lkICpzd2l0Y2hfYnVmX3B0ciwKLQkJCSAgICAgdm9pZCAqKmZvcmtfYnVmX3B0cik7CitleHRlcm4gdm9pZCBuZXdfdGhyZWFkKHZvaWQgKnN0YWNrLCBqbXBfYnVmICpidWYsIHZvaWQgKCpoYW5kbGVyKSh2b2lkKSk7CitleHRlcm4gdm9pZCBzd2l0Y2hfdGhyZWFkcyhqbXBfYnVmICptZSwgam1wX2J1ZiAqeW91KTsKK2V4dGVybiBpbnQgc3RhcnRfaWRsZV90aHJlYWQodm9pZCAqc3RhY2ssIGptcF9idWYgKnN3aXRjaF9idWYpOwogZXh0ZXJuIHZvaWQgaW5pdGlhbF90aHJlYWRfY2Jfc2thcyh2b2lkICgqcHJvYykodm9pZCAqKSwKIAkJCQkgdm9pZCAqYXJnKTsKIGV4dGVybiB2b2lkIGhhbHRfc2thcyh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9za2FzL3NrYXMuaCBiL2FyY2gvdW0vaW5jbHVkZS9za2FzL3NrYXMuaAppbmRleCA4NTNiMjZmLi5lODg5MjZiIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2thcy9za2FzLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL3NrYXMvc2thcy5oCkBAIC0xNCw4ICsxNCw3IEBACiBleHRlcm4gaW50IHNrYXNfbmVlZHNfc3R1YjsKIAogZXh0ZXJuIGludCB1c2VyX3RocmVhZCh1bnNpZ25lZCBsb25nIHN0YWNrLCBpbnQgZmxhZ3MpOwotZXh0ZXJuIHZvaWQgbmV3X3RocmVhZF9wcm9jKHZvaWQgKnN0YWNrLCB2b2lkICgqaGFuZGxlcikoaW50IHNpZykpOwotZXh0ZXJuIHZvaWQgbmV3X3RocmVhZF9oYW5kbGVyKGludCBzaWcpOworZXh0ZXJuIHZvaWQgbmV3X3RocmVhZF9oYW5kbGVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgaGFuZGxlX3N5c2NhbGwodW5pb24gdW1sX3B0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIGludCBuZXdfbW0odW5zaWduZWQgbG9uZyBzdGFjayk7CiBleHRlcm4gdm9pZCBnZXRfc2thc19mYXVsdGluZm8oaW50IHBpZCwgc3RydWN0IGZhdWx0aW5mbyAqIGZpKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9hcmNoc2V0am1wLmggYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLWkzODYvYXJjaHNldGptcC5oCmluZGV4IGVhMWJhM2QuLjExYmFmYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAtaTM4Ni9hcmNoc2V0am1wLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC1pMzg2L2FyY2hzZXRqbXAuaApAQCAtMTYsNCArMTYsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKIAorI2RlZmluZSBKQl9JUCBfX2VpcAorI2RlZmluZSBKQl9TUCBfX2VzcAorCiAjZW5kaWYJCQkJLyogX1NFVEpNUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9hcmNoc2V0am1wLmggYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9hcmNoc2V0am1wLmgKaW5kZXggNDU0ZmM2MC4uOWE1ZTFhNiAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvYXJjaHNldGptcC5oCisrKyBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L2FyY2hzZXRqbXAuaApAQCAtMTgsNCArMTgsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBfX2ptcF9idWYgam1wX2J1ZlsxXTsKIAorI2RlZmluZSBKQl9JUCBfX3JpcAorI2RlZmluZSBKQl9TUCBfX3JzcAorCiAjZW5kaWYJCQkJLyogX1NFVEpNUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9wdHJhY2UuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3B0cmFjZS5oCmluZGV4IDhkMzUzZjAuLjYxN2JiOWVmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9wdHJhY2UuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9wdHJhY2UuaApAQCAtNTAsNiArNTAsMjEgQEAKICNkZWZpbmUgSE9TVF9GUyAyNQogI2RlZmluZSBIT1NUX0dTIDI2CiAKKy8qIEFsc28gZGVmaW5lZCBpbiBhc20vcHRyYWNlLXg4Nl82NC5oLCBidXQgbm90IGluIGxpYmMgaGVhZGVycy4gIFNvLCB0aGVzZQorICogYXJlIGFscmVhZHkgZGVmaW5lZCBmb3Iga2VybmVsIGNvZGUsIGJ1dCBub3QgZm9yIHVzZXJzcGFjZSBjb2RlLgorICovCisjaWZuZGVmIEZTX0JBU0UKKy8qIFRoZXNlIGFyZW4ndCBkZWZpbmVkIGluIHB0cmFjZS5oLCBidXQgZXhpc3QgaW4gc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QsCisgKiB3aGljaCBpcyB3aGF0IHg4Nl82NCBwdHJhY2UgYWN0dWFsbHkgdXNlcy4KKyAqLworI2RlZmluZSBGU19CQVNFIChIT1NUX0ZTX0JBU0UgKiBzaXplb2YobG9uZykpCisjZGVmaW5lIEdTX0JBU0UgKEhPU1RfR1NfQkFTRSAqIHNpemVvZihsb25nKSkKKyNkZWZpbmUgRFMgKEhPU1RfRFMgKiBzaXplb2YobG9uZykpCisjZGVmaW5lIEVTIChIT1NUX0VTICogc2l6ZW9mKGxvbmcpKQorI2RlZmluZSBGUyAoSE9TVF9GUyAqIHNpemVvZihsb25nKSkKKyNkZWZpbmUgR1MgKEhPU1RfR1MgKiBzaXplb2YobG9uZykpCisjZW5kaWYKKwogI2RlZmluZSBSRUdTX0ZTX0JBU0UocikgKChyKVtIT1NUX0ZTX0JBU0VdKQogI2RlZmluZSBSRUdTX0dTX0JBU0UocikgKChyKVtIT1NUX0dTX0JBU0VdKQogI2RlZmluZSBSRUdTX0RTKHIpICgocilbSE9TVF9EU10pCkBAIC04OSw5ICsxMDQsMTIgQEAKICNlbmRpZgogI2lmZGVmIFVNTF9DT05GSUdfTU9ERV9TS0FTCiAJc3RydWN0IHNrYXNfcmVncyB7Ci0JCS8qIFhYWCAqLwotCQl1bnNpZ25lZCBsb25nIHJlZ3NbMjddOwotCQl1bnNpZ25lZCBsb25nIGZwWzY1XTsKKwkJLyogeDg2XzY0IHB0cmFjZSB1c2VzIHNpemVvZih1c2VyX3JlZ3Nfc3RydWN0KSBhcyBpdHMgcmVnaXN0ZXIKKwkJICogZmlsZSBzaXplLCB3aGlsZSBpMzg2IHVzZXMgRlJBTUVfU0laRS4gIFRoZXJlZm9yZSwgd2UgbmVlZAorCQkgKiB0byB1c2UgVU1fRlJBTUVfU0laRSBoZXJlIGluc3RlYWQgb2YgSE9TVF9GUkFNRV9TSVpFLgorCQkgKi8KKwkJdW5zaWduZWQgbG9uZyByZWdzW1VNX0ZSQU1FX1NJWkVdOworCQl1bnNpZ25lZCBsb25nIGZwW0hPU1RfRlBfU0laRV07CiAgICAgICAgICAgICAgICAgc3RydWN0IGZhdWx0aW5mbyBmYXVsdGluZm87CiAJCWxvbmcgc3lzY2FsbDsKIAkJaW50IGlzX3VzZXI7CkBAIC0xMjAsMTEgKzEzOCwxNiBAQAogI2RlZmluZSBVUFRfUjE0KHIpIF9fQ0hPT1NFX01PREUoU0NfUjE0KFVQVF9TQyhyKSksIFJFR1NfUjE0KChyKS0+c2thcy5yZWdzKSkKICNkZWZpbmUgVVBUX1IxNShyKSBfX0NIT09TRV9NT0RFKFNDX1IxNShVUFRfU0MocikpLCBSRUdTX1IxNSgociktPnNrYXMucmVncykpCiAjZGVmaW5lIFVQVF9DUyhyKSBfX0NIT09TRV9NT0RFKFNDX0NTKFVQVF9TQyhyKSksIFJFR1NfQ1MoKHIpLT5za2FzLnJlZ3MpKQorI2RlZmluZSBVUFRfRlNfQkFTRShyKSBcCisJX19DSE9PU0VfTU9ERShTQ19GU19CQVNFKFVQVF9TQyhyKSksIFJFR1NfRlNfQkFTRSgociktPnNrYXMucmVncykpCiAjZGVmaW5lIFVQVF9GUyhyKSBfX0NIT09TRV9NT0RFKFNDX0ZTKFVQVF9TQyhyKSksIFJFR1NfRlMoKHIpLT5za2FzLnJlZ3MpKQorI2RlZmluZSBVUFRfR1NfQkFTRShyKSBcCisJX19DSE9PU0VfTU9ERShTQ19HU19CQVNFKFVQVF9TQyhyKSksIFJFR1NfR1NfQkFTRSgociktPnNrYXMucmVncykpCiAjZGVmaW5lIFVQVF9HUyhyKSBfX0NIT09TRV9NT0RFKFNDX0dTKFVQVF9TQyhyKSksIFJFR1NfR1MoKHIpLT5za2FzLnJlZ3MpKQogI2RlZmluZSBVUFRfRFMocikgX19DSE9PU0VfTU9ERShTQ19EUyhVUFRfU0MocikpLCBSRUdTX0RTKChyKS0+c2thcy5yZWdzKSkKICNkZWZpbmUgVVBUX0VTKHIpIF9fQ0hPT1NFX01PREUoU0NfRVMoVVBUX1NDKHIpKSwgUkVHU19FUygociktPnNrYXMucmVncykpCiAjZGVmaW5lIFVQVF9DUyhyKSBfX0NIT09TRV9NT0RFKFNDX0NTKFVQVF9TQyhyKSksIFJFR1NfQ1MoKHIpLT5za2FzLnJlZ3MpKQorI2RlZmluZSBVUFRfU1MocikgX19DSE9PU0VfTU9ERShTQ19TUyhVUFRfU0MocikpLCBSRUdTX1NTKChyKS0+c2thcy5yZWdzKSkKICNkZWZpbmUgVVBUX09SSUdfUkFYKHIpIFwKIAlfX0NIT09TRV9NT0RFKChyKS0+dHQub3JpZ19yYXgsIFJFR1NfT1JJR19SQVgoKHIpLT5za2FzLnJlZ3MpKQogCkBAIC0xODMsNiArMjA2LDEzIEBACiAgICAgICAgICAgICAgICAgY2FzZSBSQlA6IHZhbCA9IFVQVF9SQlAocmVncyk7IGJyZWFrOyBcCiAgICAgICAgICAgICAgICAgY2FzZSBPUklHX1JBWDogdmFsID0gVVBUX09SSUdfUkFYKHJlZ3MpOyBicmVhazsgXAogICAgICAgICAgICAgICAgIGNhc2UgQ1M6IHZhbCA9IFVQVF9DUyhyZWdzKTsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIFNTOiB2YWwgPSBVUFRfU1MocmVncyk7IGJyZWFrOyBcCisJCWNhc2UgRlNfQkFTRTogdmFsID0gVVBUX0ZTX0JBU0UocmVncyk7IGJyZWFrOyBcCisgICAgICAgICAgICAgICAgY2FzZSBHU19CQVNFOiB2YWwgPSBVUFRfR1NfQkFTRShyZWdzKTsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIERTOiB2YWwgPSBVUFRfRFMocmVncyk7IGJyZWFrOyBcCisgICAgICAgICAgICAgICAgY2FzZSBFUzogdmFsID0gVVBUX0VTKHJlZ3MpOyBicmVhazsgXAorICAgICAgICAgICAgICAgIGNhc2UgRlMgOiB2YWwgPSBVUFRfRlMgKHJlZ3MpOyBicmVhazsgXAorCQljYXNlIEdTOiB2YWwgPSBVUFRfR1MocmVncyk7IGJyZWFrOwkgICAgXAogICAgICAgICAgICAgICAgIGNhc2UgRUZMQUdTOiB2YWwgPSBVUFRfRUZMQUdTKHJlZ3MpOyBicmVhazsgXAogICAgICAgICAgICAgICAgIGRlZmF1bHQgOiAgXAogICAgICAgICAgICAgICAgICAgICAgICAgcGFuaWMoIkJhZCByZWdpc3RlciBpbiBVUFRfUkVHIDogJWRcbiIsIHJlZyk7ICBcCkBAIC0yMTQsNiArMjQ0LDEzIEBACiAgICAgICAgICAgICAgICAgY2FzZSBSQlA6IFVQVF9SQlAocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOyBcCiAgICAgICAgICAgICAgICAgY2FzZSBPUklHX1JBWDogVVBUX09SSUdfUkFYKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsgXAogICAgICAgICAgICAgICAgIGNhc2UgQ1M6IFVQVF9DUyhyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIFNTOiBVUFRfU1MocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOyBcCisgICAgICAgICAgICAgICAgY2FzZSBGU19CQVNFOiBVUFRfRlNfQkFTRShyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIEdTX0JBU0U6IFVQVF9HU19CQVNFKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsgXAorICAgICAgICAgICAgICAgIGNhc2UgRFM6IFVQVF9EUyhyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKKyAgICAgICAgICAgICAgICBjYXNlIEVTOiBVUFRfRVMocmVncykgPSBfX3VwdF92YWw7IGJyZWFrOyBcCisgICAgICAgICAgICAgICAgY2FzZSBGUzogVVBUX0ZTKHJlZ3MpID0gX191cHRfdmFsOyBicmVhazsgXAorICAgICAgICAgICAgICAgIGNhc2UgR1M6IFVQVF9HUyhyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKICAgICAgICAgICAgICAgICBjYXNlIEVGTEFHUzogVVBUX0VGTEFHUyhyZWdzKSA9IF9fdXB0X3ZhbDsgYnJlYWs7IFwKICAgICAgICAgICAgICAgICBkZWZhdWx0IDogIFwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmljKCJCYWQgcmVnaXN0ZXIgaW4gVVBUX1NFVCA6ICVkXG4iLCByZWcpOyAgXApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvc2MuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3NjLmgKaW5kZXggYTE2MGQ5Zi4uOGFlZTQ1YiAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvc2MuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9zYy5oCkBAIC0zNSwxMSArMzUsMTEgQEAKICNkZWZpbmUgU0NfR1Moc2MpIFNDX09GRlNFVChzYywgU0NfR1MpCiAjZGVmaW5lIFNDX0VGTEFHUyhzYykgU0NfT0ZGU0VUKHNjLCBTQ19FRkxBR1MpCiAjZGVmaW5lIFNDX1NJR01BU0soc2MpIFNDX09GRlNFVChzYywgU0NfU0lHTUFTSykKKyNkZWZpbmUgU0NfU1Moc2MpIFNDX09GRlNFVChzYywgU0NfU1MpCiAjaWYgMAogI2RlZmluZSBTQ19PUklHX1JBWChzYykgU0NfT0ZGU0VUKHNjLCBTQ19PUklHX1JBWCkKICNkZWZpbmUgU0NfRFMoc2MpIFNDX09GRlNFVChzYywgU0NfRFMpCiAjZGVmaW5lIFNDX0VTKHNjKSBTQ19PRkZTRVQoc2MsIFNDX0VTKQotI2RlZmluZSBTQ19TUyhzYykgU0NfT0ZGU0VUKHNjLCBTQ19TUykKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL01ha2VmaWxlIGIvYXJjaC91bS9rZXJuZWwvTWFrZWZpbGUKaW5kZXggYTJkOTMwNi4uNmZhNjNhMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9rZXJuZWwvTWFrZWZpbGUKQEAgLTcsNyArNyw3IEBACiBjbGVhbi1maWxlcyA6PQogCiBvYmoteSA9IGNvbmZpZy5vIGV4ZWMubyBleGl0Y29kZS5vIGluaXRfdGFzay5vIGlycS5vIGtzeW1zLm8gbWVtLm8gXAotCXBoeXNtZW0ubyBwcm9jZXNzX2tlcm4ubyBwdHJhY2UubyByZWJvb3QubyByZXNvdXJjZS5vIHNpZ2lvLm8gXAorCXBoeXNtZW0ubyBwcm9jZXNzLm8gcHRyYWNlLm8gcmVib290Lm8gcmVzb3VyY2UubyBzaWdpby5vIFwKIAlzaWduYWwubyBzbXAubyBzeXNjYWxsLm8gc3lzcnEubyB0aW1lLm8gdGxiLm8gdHJhcC5vIHVhY2Nlc3MubyBcCiAJdW1fYXJjaC5vIHVtaWQubwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9nbW9uX3N5bXMuYyBiL2FyY2gvdW0va2VybmVsL2dtb25fc3ltcy5jCmluZGV4IDJjODZlN2YuLjEzYWExMTUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL2dtb25fc3ltcy5jCisrKyBiL2FyY2gvdW0va2VybmVsL2dtb25fc3ltcy5jCkBAIC01LDcgKzUsNyBAQAogCiAjaW5jbHVkZSAibGludXgvbW9kdWxlLmgiCiAKLWV4dGVybiB2b2lkIF9fYmJfaW5pdF9mdW5jKHZvaWQgKik7CitleHRlcm4gdm9pZCBfX2JiX2luaXRfZnVuYyh2b2lkICopICBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CiBFWFBPUlRfU1lNQk9MKF9fYmJfaW5pdF9mdW5jKTsKIAogLyogVGhpcyBpcyBkZWZpbmVkIChhbmQgcmVmZXJyZWQgdG8gaW4gcHJvZmlsaW5nIHN0dWIgY29kZSkgb25seSBieSBzb21lIEdDQwpAQCAtMjEsMTQgKzIxLDMgQEAKIAogZXh0ZXJuIHZvaWQgX19nY292X21lcmdlX2FkZCh2b2lkICopIF9fYXR0cmlidXRlX18oKHdlYWspKTsKIEVYUE9SVF9TWU1CT0woX19nY292X21lcmdlX2FkZCk7Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9rc3ltcy5jIGIvYXJjaC91bS9rZXJuZWwva3N5bXMuYwppbmRleCBjOTcwNDVkLi5mMDMwZTQ0IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9rc3ltcy5jCisrKyBiL2FyY2gvdW0va2VybmVsL2tzeW1zLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJtZW1fdXNlci5oIgogI2luY2x1ZGUgIm9zLmgiCiAKLUVYUE9SVF9TWU1CT0woc3RvcCk7CiBFWFBPUlRfU1lNQk9MKHVtbF9waHlzbWVtKTsKIEVYUE9SVF9TWU1CT0woc2V0X3NpZ25hbHMpOwogRVhQT1JUX1NZTUJPTChnZXRfc2lnbmFscyk7CkBAIC00MSwxMiArNDAsMTQgQEAKIEVYUE9SVF9TWU1CT0woZmluZF9pb21lbSk7CiAKICNpZmRlZiBDT05GSUdfTU9ERV9UVAorRVhQT1JUX1NZTUJPTChzdG9wKTsKIEVYUE9SVF9TWU1CT0woc3RybmNweV9mcm9tX3VzZXJfdHQpOwogRVhQT1JUX1NZTUJPTChjb3B5X2Zyb21fdXNlcl90dCk7CiBFWFBPUlRfU1lNQk9MKGNvcHlfdG9fdXNlcl90dCk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19NT0RFX1NLQVMKK0VYUE9SVF9TWU1CT0woc3Rybmxlbl91c2VyX3NrYXMpOwogRVhQT1JUX1NZTUJPTChzdHJuY3B5X2Zyb21fdXNlcl9za2FzKTsKIEVYUE9SVF9TWU1CT0woY29weV90b191c2VyX3NrYXMpOwogRVhQT1JUX1NZTUJPTChjb3B5X2Zyb21fdXNlcl9za2FzKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL21lbS5jIGIvYXJjaC91bS9rZXJuZWwvbWVtLmMKaW5kZXggOTMxMjFjNi4uYzk1ODU1YiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvbWVtLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvbWVtLmMKQEAgLTIyNiw3ICsyMjYsOCBAQAogCWZvcihpID0gMDsgaSA8IEFSUkFZX1NJWkUoem9uZXNfc2l6ZSk7IGkrKykKIAkJem9uZXNfc2l6ZVtpXSA9IDA7CiAKLQl6b25lc19zaXplW1pPTkVfRE1BXSA9IChlbmRfaW9tZW0gPj4gUEFHRV9TSElGVCkgLSAodW1sX3BoeXNtZW0gPj4gUEFHRV9TSElGVCk7CisJem9uZXNfc2l6ZVtaT05FX05PUk1BTF0gPSAoZW5kX2lvbWVtID4+IFBBR0VfU0hJRlQpIC0KKwkJKHVtbF9waHlzbWVtID4+IFBBR0VfU0hJRlQpOwogI2lmZGVmIENPTkZJR19ISUdITUVNCiAJem9uZXNfc2l6ZVtaT05FX0hJR0hNRU1dID0gaGlnaG1lbSA+PiBQQUdFX1NISUZUOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzX2tlcm4uYyBiL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYwpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBhcmNoL3VtL2tlcm5lbC9wcm9jZXNzX2tlcm4uYwpyZW5hbWUgdG8gYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDUzNzg5NWQuLmZlNmM2NGEgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3Nfa2Vybi5jCisrKyBiL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYwpAQCAtMSwxMCArMSw5IEBACi0vKiAKKy8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQogICogQ29weXJpZ2h0IDIwMDMgUGF0aFNjYWxlLCBJbmMuCiAgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAgKi8KIAotI2luY2x1ZGUgImxpbnV4L2NvbmZpZy5oIgogI2luY2x1ZGUgImxpbnV4L2tlcm5lbC5oIgogI2luY2x1ZGUgImxpbnV4L3NjaGVkLmgiCiAjaW5jbHVkZSAibGludXgvaW50ZXJydXB0LmgiCkBAIC0xMTMsMTEgKzExMiwxMSBAQAogCiB2b2lkICpfc3dpdGNoX3RvKHZvaWQgKnByZXYsIHZvaWQgKm5leHQsIHZvaWQgKmxhc3QpCiB7Ci0gICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqZnJvbSA9IHByZXY7Ci0gICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdG89IG5leHQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICpmcm9tID0gcHJldjsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRvPSBuZXh0OwogCi0gICAgICAgIHRvLT50aHJlYWQucHJldl9zY2hlZCA9IGZyb207Ci0gICAgICAgIHNldF9jdXJyZW50KHRvKTsKKwl0by0+dGhyZWFkLnByZXZfc2NoZWQgPSBmcm9tOworCXNldF9jdXJyZW50KHRvKTsKIAogCWRvIHsKIAkJY3VycmVudC0+dGhyZWFkLnNhdmVkX3Rhc2sgPSBOVUxMIDsKQEAgLTEyOCw3ICsxMjcsNyBAQAogCQlwcmV2PSBjdXJyZW50OwogCX0gd2hpbGUoY3VycmVudC0+dGhyZWFkLnNhdmVkX3Rhc2spOwogCi0gICAgICAgIHJldHVybihjdXJyZW50LT50aHJlYWQucHJldl9zY2hlZCk7CisJcmV0dXJuKGN1cnJlbnQtPnRocmVhZC5wcmV2X3NjaGVkKTsKIAogfQogCkBAIC0xNDIsMTkgKzE0MSwxOSBAQAogewogCUNIT09TRV9NT0RFKHJlbGVhc2VfdGhyZWFkX3R0KHRhc2spLCByZWxlYXNlX3RocmVhZF9za2FzKHRhc2spKTsKIH0KLSAKKwogdm9pZCBleGl0X3RocmVhZCh2b2lkKQogewogCXVucHJvdGVjdF9zdGFjaygodW5zaWduZWQgbG9uZykgY3VycmVudF90aHJlYWQpOwogfQotIAorCiB2b2lkICpnZXRfY3VycmVudCh2b2lkKQogewogCXJldHVybihjdXJyZW50KTsKIH0KIAogaW50IGNvcHlfdGhyZWFkKGludCBuciwgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywgdW5zaWduZWQgbG9uZyBzcCwKLQkJdW5zaWduZWQgbG9uZyBzdGFja190b3AsIHN0cnVjdCB0YXNrX3N0cnVjdCAqIHAsIAorCQl1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwgc3RydWN0IHRhc2tfc3RydWN0ICogcCwKIAkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJaW50IHJldDsKQEAgLTE4MywxMSArMTgyLDExIEBACiAJaW50IHNhdmVfa21hbGxvY19vayA9IGttYWxsb2Nfb2s7CiAKIAlrbWFsbG9jX29rID0gMDsKLQlDSE9PU0VfTU9ERV9QUk9DKGluaXRpYWxfdGhyZWFkX2NiX3R0LCBpbml0aWFsX3RocmVhZF9jYl9za2FzLCBwcm9jLCAKKwlDSE9PU0VfTU9ERV9QUk9DKGluaXRpYWxfdGhyZWFkX2NiX3R0LCBpbml0aWFsX3RocmVhZF9jYl9za2FzLCBwcm9jLAogCQkJIGFyZyk7CiAJa21hbGxvY19vayA9IHNhdmVfa21hbGxvY19vazsKIH0KLSAKKwogdW5zaWduZWQgbG9uZyBzdGFja19zcCh1bnNpZ25lZCBsb25nIHBhZ2UpCiB7CiAJcmV0dXJuKHBhZ2UgKyBQQUdFX1NJWkUgLSBzaXplb2Yodm9pZCAqKSk7CkBAIC0yMTEsNyArMjEwLDcgQEAKIAkJICovCiAJCWlmKG5lZWRfcmVzY2hlZCgpKQogCQkJc2NoZWR1bGUoKTsKLQkJCisKIAkJaWRsZV9zbGVlcCgxMCk7CiAJfQogfQpAQCAtMjI2LDcgKzIyNSw3IEBACiAJcmV0dXJuKFBBR0VfU0laRSk7CiB9CiAKLXZvaWQgKnVtX3ZpcnRfdG9fcGh5cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgYWRkciwgCit2b2lkICp1bV92aXJ0X3RvX3BoeXMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCSAgICAgIHB0ZV90ICpwdGVfb3V0KQogewogCXBnZF90ICpwZ2Q7CkBAIC0yMzUsNyArMjM0LDcgQEAKIAlwdGVfdCAqcHRlOwogCXB0ZV90IHB0ZW50OwogCi0JaWYodGFzay0+bW0gPT0gTlVMTCkgCisJaWYodGFzay0+bW0gPT0gTlVMTCkKIAkJcmV0dXJuKEVSUl9QVFIoLUVJTlZBTCkpOwogCXBnZCA9IHBnZF9vZmZzZXQodGFzay0+bW0sIGFkZHIpOwogCWlmKCFwZ2RfcHJlc2VudCgqcGdkKSkKQEAgLTI0Niw3ICsyNDUsNyBAQAogCQlyZXR1cm4oRVJSX1BUUigtRUlOVkFMKSk7CiAKIAlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcik7Ci0JaWYoIXBtZF9wcmVzZW50KCpwbWQpKSAKKwlpZighcG1kX3ByZXNlbnQoKnBtZCkpCiAJCXJldHVybihFUlJfUFRSKC1FSU5WQUwpKTsKIAogCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgYWRkcik7CkBAIC0yNzEsNyArMjcwLDcgQEAKIAogdm9pZCBmb3JjZV9zaWdidXModm9pZCkKIHsKLQlwcmludGsoS0VSTl9FUlIgIktpbGxpbmcgcGlkICVkIGJlY2F1c2Ugb2YgYSBsYWNrIG9mIG1lbW9yeVxuIiwgCisJcHJpbnRrKEtFUk5fRVJSICJLaWxsaW5nIHBpZCAlZCBiZWNhdXNlIG9mIGEgbGFjayBvZiBtZW1vcnlcbiIsCiAJICAgICAgIGN1cnJlbnQtPnBpZCk7CiAJbG9ja19rZXJuZWwoKTsKIAlzaWdhZGRzZXQoJmN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsLCBTSUdCVVMpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9NYWtlZmlsZSBiL2FyY2gvdW0va2VybmVsL3NrYXMvTWFrZWZpbGUKaW5kZXggZWEzYThlNC4uM2UzZmE3ZSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9NYWtlZmlsZQorKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL01ha2VmaWxlCkBAIC0zLDggKzMsNyBAQAogIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCiAjCiAKLW9iai15IDo9IGNsb25lLm8gZXhlY19rZXJuLm8gbWVtLm8gbW11Lm8gcHJvY2Vzc19rZXJuLm8gXAotCXN5c2NhbGwubyB0bGIubyB1YWNjZXNzLm8KK29iai15IDo9IGNsb25lLm8gZXhlYy5vIG1lbS5vIG1tdS5vIHByb2Nlc3MubyBzeXNjYWxsLm8gdGxiLm8gdWFjY2Vzcy5vCiAKICMgY2xvbmUubyBpcyBpbiB0aGUgc3R1Yiwgc28gaXQgY2FuJ3QgYmUgYnVpbHQgd2l0aCBwcm9maWxpbmcKICMgR0NDIGhhcmRlbmVkIGFsc28gYXV0by1lbmFibGVzIC1mcGljLCBidXQgd2UgbmVlZCAlZWJ4IHNvIGl0IGNhbid0IHdvcmsgLT4KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3NrYXMvZXhlYy5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9leGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRiNzk1OQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvZXhlYy5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICovCisKKyNpbmNsdWRlICJsaW51eC9rZXJuZWwuaCIKKyNpbmNsdWRlICJhc20vY3VycmVudC5oIgorI2luY2x1ZGUgImFzbS9wYWdlLmgiCisjaW5jbHVkZSAiYXNtL3NpZ25hbC5oIgorI2luY2x1ZGUgImFzbS9wdHJhY2UuaCIKKyNpbmNsdWRlICJhc20vdWFjY2Vzcy5oIgorI2luY2x1ZGUgImFzbS9tbXVfY29udGV4dC5oIgorI2luY2x1ZGUgInRsYi5oIgorI2luY2x1ZGUgInNrYXMuaCIKKyNpbmNsdWRlICJ1bV9tbXUuaCIKKyNpbmNsdWRlICJvcy5oIgorCit2b2lkIGZsdXNoX3RocmVhZF9za2FzKHZvaWQpCit7CisJZm9yY2VfZmx1c2hfYWxsKCk7CisJc3dpdGNoX21tX3NrYXMoJmN1cnJlbnQtPm1tLT5jb250ZXh0LnNrYXMuaWQpOworfQorCit2b2lkIHN0YXJ0X3RocmVhZF9za2FzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGVpcCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgZXNwKQoreworCXNldF9mcyhVU0VSX0RTKTsKKwlQVF9SRUdTX0lQKHJlZ3MpID0gZWlwOworCVBUX1JFR1NfU1AocmVncykgPSBlc3A7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL2V4ZWNfa2Vybi5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9leGVjX2tlcm4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlZDdiYi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL2V4ZWNfa2Vybi5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpbmNsdWRlICJsaW51eC9rZXJuZWwuaCIKLSNpbmNsdWRlICJhc20vY3VycmVudC5oIgotI2luY2x1ZGUgImFzbS9wYWdlLmgiCi0jaW5jbHVkZSAiYXNtL3NpZ25hbC5oIgotI2luY2x1ZGUgImFzbS9wdHJhY2UuaCIKLSNpbmNsdWRlICJhc20vdWFjY2Vzcy5oIgotI2luY2x1ZGUgImFzbS9tbXVfY29udGV4dC5oIgotI2luY2x1ZGUgInRsYi5oIgotI2luY2x1ZGUgInNrYXMuaCIKLSNpbmNsdWRlICJ1bV9tbXUuaCIKLSNpbmNsdWRlICJvcy5oIgotCi12b2lkIGZsdXNoX3RocmVhZF9za2FzKHZvaWQpCi17Ci0JZm9yY2VfZmx1c2hfYWxsKCk7Ci0gICAgICAgIHN3aXRjaF9tbV9za2FzKCZjdXJyZW50LT5tbS0+Y29udGV4dC5za2FzLmlkKTsKLX0KLQotdm9pZCBzdGFydF90aHJlYWRfc2thcyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBlaXAsIAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBlc3ApCi17Ci0Jc2V0X2ZzKFVTRVJfRFMpOwotICAgICAgICBQVF9SRUdTX0lQKHJlZ3MpID0gZWlwOwotCVBUX1JFR1NfU1AocmVncykgPSBlc3A7Ci19Ci0KLS8qCi0gKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KLSAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQotICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAotICogb2YgdGhlIGZpbGUuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3MuYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNGZhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3MuYwpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgImxpbnV4L3NjaGVkLmgiCisjaW5jbHVkZSAibGludXgvc2xhYi5oIgorI2luY2x1ZGUgImxpbnV4L3B0cmFjZS5oIgorI2luY2x1ZGUgImxpbnV4L3Byb2NfZnMuaCIKKyNpbmNsdWRlICJsaW51eC9maWxlLmgiCisjaW5jbHVkZSAibGludXgvZXJybm8uaCIKKyNpbmNsdWRlICJsaW51eC9pbml0LmgiCisjaW5jbHVkZSAiYXNtL3VhY2Nlc3MuaCIKKyNpbmNsdWRlICJhc20vYXRvbWljLmgiCisjaW5jbHVkZSAia2Vybl91dGlsLmgiCisjaW5jbHVkZSAic2thcy5oIgorI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAidXNlcl91dGlsLmgiCisjaW5jbHVkZSAidGxiLmgiCisjaW5jbHVkZSAia2Vybi5oIgorI2luY2x1ZGUgIm1vZGUuaCIKKyNpbmNsdWRlICJyZWdpc3RlcnMuaCIKKwordm9pZCBzd2l0Y2hfdG9fc2thcyh2b2lkICpwcmV2LCB2b2lkICpuZXh0KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqZnJvbSwgKnRvOworCisJZnJvbSA9IHByZXY7CisJdG8gPSBuZXh0OworCisJLyogWFhYIG5lZWQgdG8gY2hlY2sgcnVucXVldWVzW2NwdV0uaWRsZSAqLworCWlmKGN1cnJlbnQtPnBpZCA9PSAwKQorCQlzd2l0Y2hfdGltZXJzKDApOworCisJc3dpdGNoX3RocmVhZHMoJmZyb20tPnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZiwKKwkJICAgICAgICZ0by0+dGhyZWFkLm1vZGUuc2thcy5zd2l0Y2hfYnVmKTsKKworCWFyY2hfc3dpdGNoX3RvX3NrYXMoY3VycmVudC0+dGhyZWFkLnByZXZfc2NoZWQsIGN1cnJlbnQpOworCisJaWYoY3VycmVudC0+cGlkID09IDApCisJCXN3aXRjaF90aW1lcnMoMSk7Cit9CisKK2V4dGVybiB2b2lkIHNjaGVkdWxlX3RhaWwoc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KTsKKworLyogVGhpcyBpcyBjYWxsZWQgbWFnaWNhbGx5LCBieSBpdHMgYWRkcmVzcyBiZWluZyBzdHVmZmVkIGluIGEgam1wX2J1ZgorICogYW5kIGJlaW5nIGxvbmdqbXAtZCB0by4KKyAqLwordm9pZCBuZXdfdGhyZWFkX2hhbmRsZXIodm9pZCkKK3sKKwlpbnQgKCpmbikodm9pZCAqKSwgbjsKKwl2b2lkICphcmc7CisKKwlpZihjdXJyZW50LT50aHJlYWQucHJldl9zY2hlZCAhPSBOVUxMKQorCQlzY2hlZHVsZV90YWlsKGN1cnJlbnQtPnRocmVhZC5wcmV2X3NjaGVkKTsKKwljdXJyZW50LT50aHJlYWQucHJldl9zY2hlZCA9IE5VTEw7CisKKwlmbiA9IGN1cnJlbnQtPnRocmVhZC5yZXF1ZXN0LnUudGhyZWFkLnByb2M7CisJYXJnID0gY3VycmVudC0+dGhyZWFkLnJlcXVlc3QudS50aHJlYWQuYXJnOworCisJLyogVGhlIHJldHVybiB2YWx1ZSBpcyAxIGlmIHRoZSBrZXJuZWwgdGhyZWFkIGV4ZWNzIGEgcHJvY2VzcywKKwkgKiAwIGlmIGl0IGp1c3QgZXhpdHMKKwkgKi8KKwluID0gcnVuX2tlcm5lbF90aHJlYWQoZm4sIGFyZywgJmN1cnJlbnQtPnRocmVhZC5leGVjX2J1Zik7CisJaWYobiA9PSAxKXsKKwkJLyogSGFuZGxlIGFueSBpbW1lZGlhdGUgcmVzY2hlZHVsZXMgb3Igc2lnbmFscyAqLworCQlpbnRlcnJ1cHRfZW5kKCk7CisJCXVzZXJzcGFjZSgmY3VycmVudC0+dGhyZWFkLnJlZ3MucmVncyk7CisJfQorCWVsc2UgZG9fZXhpdCgwKTsKK30KKwordm9pZCByZWxlYXNlX3RocmVhZF9za2FzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKK30KKworLyogQ2FsbGVkIG1hZ2ljYWxseSwgc2VlIG5ld190aHJlYWRfaGFuZGxlciBhYm92ZSAqLwordm9pZCBmb3JrX2hhbmRsZXIodm9pZCkKK3sKKwlmb3JjZV9mbHVzaF9hbGwoKTsKKwlpZihjdXJyZW50LT50aHJlYWQucHJldl9zY2hlZCA9PSBOVUxMKQorCQlwYW5pYygiYmxlY2giKTsKKworCXNjaGVkdWxlX3RhaWwoY3VycmVudC0+dGhyZWFkLnByZXZfc2NoZWQpOworCisJLyogWFhYOiBpZiBpbnRlcnJ1cHRfZW5kKCkgY2FsbHMgc2NoZWR1bGUsIHRoaXMgY2FsbCB0bworCSAqIGFyY2hfc3dpdGNoX3RvX3NrYXMgaXNuJ3QgbmVlZGVkLiBXZSBjb3VsZCB3YW50IHRvIGFwcGx5IHRoaXMgdG8KKwkgKiBpbXByb3ZlIHBlcmZvcm1hbmNlLiAtYmIgKi8KKwlhcmNoX3N3aXRjaF90b19za2FzKGN1cnJlbnQtPnRocmVhZC5wcmV2X3NjaGVkLCBjdXJyZW50KTsKKworCWN1cnJlbnQtPnRocmVhZC5wcmV2X3NjaGVkID0gTlVMTDsKKworLyogSGFuZGxlIGFueSBpbW1lZGlhdGUgcmVzY2hlZHVsZXMgb3Igc2lnbmFscyAqLworCWludGVycnVwdF9lbmQoKTsKKworCXVzZXJzcGFjZSgmY3VycmVudC0+dGhyZWFkLnJlZ3MucmVncyk7Cit9CisKK2ludCBjb3B5X3RocmVhZF9za2FzKGludCBuciwgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywgdW5zaWduZWQgbG9uZyBzcCwKKwkJICAgICB1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwgc3RydWN0IHRhc2tfc3RydWN0ICogcCwKKwkJICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl2b2lkICgqaGFuZGxlcikodm9pZCk7CisKKwlpZihjdXJyZW50LT50aHJlYWQuZm9ya2luZyl7CisJICAJbWVtY3B5KCZwLT50aHJlYWQucmVncy5yZWdzLnNrYXMsICZyZWdzLT5yZWdzLnNrYXMsCisJCSAgICAgICBzaXplb2YocC0+dGhyZWFkLnJlZ3MucmVncy5za2FzKSk7CisJCVJFR1NfU0VUX1NZU0NBTExfUkVUVVJOKHAtPnRocmVhZC5yZWdzLnJlZ3Muc2thcy5yZWdzLCAwKTsKKwkJaWYoc3AgIT0gMCkgUkVHU19TUChwLT50aHJlYWQucmVncy5yZWdzLnNrYXMucmVncykgPSBzcDsKKworCQloYW5kbGVyID0gZm9ya19oYW5kbGVyOworCisJCWFyY2hfY29weV90aHJlYWQoJmN1cnJlbnQtPnRocmVhZC5hcmNoLCAmcC0+dGhyZWFkLmFyY2gpOworCX0KKwllbHNlIHsKKwkJaW5pdF90aHJlYWRfcmVnaXN0ZXJzKCZwLT50aHJlYWQucmVncy5yZWdzKTsKKwkJcC0+dGhyZWFkLnJlcXVlc3QudS50aHJlYWQgPSBjdXJyZW50LT50aHJlYWQucmVxdWVzdC51LnRocmVhZDsKKwkJaGFuZGxlciA9IG5ld190aHJlYWRfaGFuZGxlcjsKKwl9CisKKwluZXdfdGhyZWFkKHRhc2tfc3RhY2tfcGFnZShwKSwgJnAtPnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZiwKKwkJICAgaGFuZGxlcik7CisJcmV0dXJuKDApOworfQorCitpbnQgbmV3X21tKHVuc2lnbmVkIGxvbmcgc3RhY2spCit7CisJaW50IGZkOworCisJZmQgPSBvc19vcGVuX2ZpbGUoIi9wcm9jL21tIiwgb2ZfY2xvZXhlYyhvZl93cml0ZShPUEVORkxBR1MoKSkpLCAwKTsKKwlpZihmZCA8IDApCisJCXJldHVybihmZCk7CisKKwlpZihza2FzX25lZWRzX3N0dWIpCisJCW1hcF9zdHViX3BhZ2VzKGZkLCBDT05GSUdfU1RVQl9DT0RFLCBDT05GSUdfU1RVQl9EQVRBLCBzdGFjayk7CisKKwlyZXR1cm4oZmQpOworfQorCit2b2lkIGluaXRfaWRsZV9za2FzKHZvaWQpCit7CisJY3B1X3Rhc2tzW2N1cnJlbnRfdGhyZWFkLT5jcHVdLnBpZCA9IG9zX2dldHBpZCgpOworCWRlZmF1bHRfaWRsZSgpOworfQorCitleHRlcm4gdm9pZCBzdGFydF9rZXJuZWwodm9pZCk7CisKK3N0YXRpYyBpbnQgc3RhcnRfa2VybmVsX3Byb2Modm9pZCAqdW51c2VkKQoreworCWludCBwaWQ7CisKKwlibG9ja19zaWduYWxzKCk7CisJcGlkID0gb3NfZ2V0cGlkKCk7CisKKwljcHVfdGFza3NbMF0ucGlkID0gcGlkOworCWNwdV90YXNrc1swXS50YXNrID0gY3VycmVudDsKKyNpZmRlZiBDT05GSUdfU01QCisJY3B1X29ubGluZV9tYXAgPSBjcHVtYXNrX29mX2NwdSgwKTsKKyNlbmRpZgorCXN0YXJ0X2tlcm5lbCgpOworCXJldHVybigwKTsKK30KKworZXh0ZXJuIGludCB1c2Vyc3BhY2VfcGlkW107CisKK2ludCBzdGFydF91bWxfc2thcyh2b2lkKQoreworCWlmKHByb2NfbW0pCisJCXVzZXJzcGFjZV9waWRbMF0gPSBzdGFydF91c2Vyc3BhY2UoMCk7CisKKwlpbml0X25ld190aHJlYWRfc2lnbmFscygpOworCisJaW5pdF90YXNrLnRocmVhZC5yZXF1ZXN0LnUudGhyZWFkLnByb2MgPSBzdGFydF9rZXJuZWxfcHJvYzsKKwlpbml0X3Rhc2sudGhyZWFkLnJlcXVlc3QudS50aHJlYWQuYXJnID0gTlVMTDsKKwlyZXR1cm4oc3RhcnRfaWRsZV90aHJlYWQodGFza19zdGFja19wYWdlKCZpbml0X3Rhc2spLAorCQkJCSAmaW5pdF90YXNrLnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZikpOworfQorCitpbnQgZXh0ZXJuYWxfcGlkX3NrYXMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworI3dhcm5pbmcgTmVlZCB0byBsb29rIHVwIHVzZXJzcGFjZV9waWQgYnkgY3B1CisJcmV0dXJuKHVzZXJzcGFjZV9waWRbMF0pOworfQorCitpbnQgdGhyZWFkX3BpZF9za2FzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKyN3YXJuaW5nIE5lZWQgdG8gbG9vayB1cCB1c2Vyc3BhY2VfcGlkIGJ5IGNwdQorCXJldHVybih1c2Vyc3BhY2VfcGlkWzBdKTsKK30KKwordm9pZCBraWxsX29mZl9wcm9jZXNzZXNfc2thcyh2b2lkKQoreworCWlmKHByb2NfbW0pCisjd2FybmluZyBuZWVkIHRvIGxvb3Agb3ZlciB1c2Vyc3BhY2VfcGlkcyBpbiBraWxsX29mZl9wcm9jZXNzZXNfc2thcworCQlvc19raWxsX3B0cmFjZWRfcHJvY2Vzcyh1c2Vyc3BhY2VfcGlkWzBdLCAxKTsKKwllbHNlIHsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCQlpbnQgcGlkLCBtZTsKKworCQltZSA9IG9zX2dldHBpZCgpOworCQlmb3JfZWFjaF9wcm9jZXNzKHApeworCQkJaWYocC0+bW0gPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJcGlkID0gcC0+bW0tPmNvbnRleHQuc2thcy5pZC51LnBpZDsKKwkJCW9zX2tpbGxfcHRyYWNlZF9wcm9jZXNzKHBpZCwgMSk7CisJCX0KKwl9Cit9CisKK3Vuc2lnbmVkIGxvbmcgY3VycmVudF9zdHViX3N0YWNrKHZvaWQpCit7CisJaWYoY3VycmVudC0+bW0gPT0gTlVMTCkKKwkJcmV0dXJuKDApOworCisJcmV0dXJuKGN1cnJlbnQtPm1tLT5jb250ZXh0LnNrYXMuaWQuc3RhY2spOworfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzX2tlcm4uYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzc19rZXJuLmMKaW5kZXggNTVjYWVlYy4uMGYzZDVkMCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc2thcy9wcm9jZXNzX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3Nfa2Vybi5jCkBAIC0xLDIyNyArMSw0ODQgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxLCAyMDAyIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKKyAqIENvcHlyaWdodCAyMDAzIFBhdGhTY2FsZSwgSW5jLgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAogICovCiAKKyNpbmNsdWRlICJsaW51eC9jb25maWcuaCIKKyNpbmNsdWRlICJsaW51eC9rZXJuZWwuaCIKICNpbmNsdWRlICJsaW51eC9zY2hlZC5oIgorI2luY2x1ZGUgImxpbnV4L2ludGVycnVwdC5oIgorI2luY2x1ZGUgImxpbnV4L3N0cmluZy5oIgorI2luY2x1ZGUgImxpbnV4L21tLmgiCiAjaW5jbHVkZSAibGludXgvc2xhYi5oIgotI2luY2x1ZGUgImxpbnV4L3B0cmFjZS5oIgotI2luY2x1ZGUgImxpbnV4L3Byb2NfZnMuaCIKLSNpbmNsdWRlICJsaW51eC9maWxlLmgiCi0jaW5jbHVkZSAibGludXgvZXJybm8uaCIKKyNpbmNsdWRlICJsaW51eC91dHNuYW1lLmgiCisjaW5jbHVkZSAibGludXgvZnMuaCIKKyNpbmNsdWRlICJsaW51eC91dGltZS5oIgorI2luY2x1ZGUgImxpbnV4L3NtcF9sb2NrLmgiCisjaW5jbHVkZSAibGludXgvbW9kdWxlLmgiCiAjaW5jbHVkZSAibGludXgvaW5pdC5oIgorI2luY2x1ZGUgImxpbnV4L2NhcGFiaWxpdHkuaCIKKyNpbmNsdWRlICJsaW51eC92bWFsbG9jLmgiCisjaW5jbHVkZSAibGludXgvc3BpbmxvY2suaCIKKyNpbmNsdWRlICJsaW51eC9wcm9jX2ZzLmgiCisjaW5jbHVkZSAibGludXgvcHRyYWNlLmgiCisjaW5jbHVkZSAibGludXgvcmFuZG9tLmgiCisjaW5jbHVkZSAibGludXgvcGVyc29uYWxpdHkuaCIKKyNpbmNsdWRlICJhc20vdW5pc3RkLmgiCisjaW5jbHVkZSAiYXNtL21tYW4uaCIKKyNpbmNsdWRlICJhc20vc2VnbWVudC5oIgorI2luY2x1ZGUgImFzbS9zdGF0LmgiCisjaW5jbHVkZSAiYXNtL3BndGFibGUuaCIKKyNpbmNsdWRlICJhc20vcHJvY2Vzc29yLmgiCisjaW5jbHVkZSAiYXNtL3RsYmZsdXNoLmgiCiAjaW5jbHVkZSAiYXNtL3VhY2Nlc3MuaCIKLSNpbmNsdWRlICJhc20vYXRvbWljLmgiCi0jaW5jbHVkZSAia2Vybl91dGlsLmgiCi0jaW5jbHVkZSAic2thcy5oIgotI2luY2x1ZGUgIm9zLmgiCisjaW5jbHVkZSAiYXNtL3VzZXIuaCIKICNpbmNsdWRlICJ1c2VyX3V0aWwuaCIKLSNpbmNsdWRlICJ0bGIuaCIKKyNpbmNsdWRlICJrZXJuX3V0aWwuaCIKICNpbmNsdWRlICJrZXJuLmgiCisjaW5jbHVkZSAic2lnbmFsX2tlcm4uaCIKKyNpbmNsdWRlICJpbml0LmgiCisjaW5jbHVkZSAiaXJxX3VzZXIuaCIKKyNpbmNsdWRlICJtZW1fdXNlci5oIgorI2luY2x1ZGUgInRsYi5oIgorI2luY2x1ZGUgImZyYW1lX2tlcm4uaCIKKyNpbmNsdWRlICJzaWdjb250ZXh0LmgiCisjaW5jbHVkZSAib3MuaCIKICNpbmNsdWRlICJtb2RlLmgiCi0jaW5jbHVkZSAicmVnaXN0ZXJzLmgiCisjaW5jbHVkZSAibW9kZV9rZXJuLmgiCisjaW5jbHVkZSAiY2hvb3NlLW1vZGUuaCIKIAotdm9pZCBzd2l0Y2hfdG9fc2thcyh2b2lkICpwcmV2LCB2b2lkICpuZXh0KQorLyogVGhpcyBpcyBhIHBlci1jcHUgYXJyYXkuICBBIHByb2Nlc3NvciBvbmx5IG1vZGlmaWVzIGl0cyBlbnRyeSBhbmQgaXQgb25seQorICogY2FyZXMgYWJvdXQgaXRzIGVudHJ5LCBzbyBpdCdzIE9LIGlmIGFub3RoZXIgcHJvY2Vzc29yIGlzIG1vZGlmeWluZyBpdHMKKyAqIGVudHJ5LgorICovCitzdHJ1Y3QgY3B1X3Rhc2sgY3B1X3Rhc2tzW05SX0NQVVNdID0geyBbMCAuLi4gTlJfQ1BVUyAtIDFdID0geyAtMSwgTlVMTCB9IH07CisKK2ludCBleHRlcm5hbF9waWQodm9pZCAqdCkKIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmZyb20sICp0bzsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSB0ID8gdCA6IGN1cnJlbnQ7CiAKLQlmcm9tID0gcHJldjsKLQl0byA9IG5leHQ7Ci0KLQkvKiBYWFggbmVlZCB0byBjaGVjayBydW5xdWV1ZXNbY3B1XS5pZGxlICovCi0JaWYoY3VycmVudC0+cGlkID09IDApCi0JCXN3aXRjaF90aW1lcnMoMCk7Ci0KLQlzd2l0Y2hfdGhyZWFkcygmZnJvbS0+dGhyZWFkLm1vZGUuc2thcy5zd2l0Y2hfYnVmLAotCQkgICAgICAgdG8tPnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1Zik7Ci0KLQlhcmNoX3N3aXRjaF90b19za2FzKGN1cnJlbnQtPnRocmVhZC5wcmV2X3NjaGVkLCBjdXJyZW50KTsKLQotCWlmKGN1cnJlbnQtPnBpZCA9PSAwKQotCQlzd2l0Y2hfdGltZXJzKDEpOworCXJldHVybihDSE9PU0VfTU9ERV9QUk9DKGV4dGVybmFsX3BpZF90dCwgZXh0ZXJuYWxfcGlkX3NrYXMsIHRhc2spKTsKIH0KIAotZXh0ZXJuIHZvaWQgc2NoZWR1bGVfdGFpbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpOwotCi12b2lkIG5ld190aHJlYWRfaGFuZGxlcihpbnQgc2lnKQoraW50IHBpZF90b19wcm9jZXNzb3JfaWQoaW50IHBpZCkKIHsKLQlpbnQgKCpmbikodm9pZCAqKSwgbjsKLQl2b2lkICphcmc7CisJaW50IGk7CiAKLQlmbiA9IGN1cnJlbnQtPnRocmVhZC5yZXF1ZXN0LnUudGhyZWFkLnByb2M7Ci0JYXJnID0gY3VycmVudC0+dGhyZWFkLnJlcXVlc3QudS50aHJlYWQuYXJnOwotCW9zX3VzcjFfc2lnbmFsKDEpOwotCXRocmVhZF93YWl0KCZjdXJyZW50LT50aHJlYWQubW9kZS5za2FzLnN3aXRjaF9idWYsCi0JCSAgICBjdXJyZW50LT50aHJlYWQubW9kZS5za2FzLmZvcmtfYnVmKTsKLQotCWlmKGN1cnJlbnQtPnRocmVhZC5wcmV2X3NjaGVkICE9IE5VTEwpCi0JCXNjaGVkdWxlX3RhaWwoY3VycmVudC0+dGhyZWFkLnByZXZfc2NoZWQpOwotCWN1cnJlbnQtPnRocmVhZC5wcmV2X3NjaGVkID0gTlVMTDsKLQotCS8qIFRoZSByZXR1cm4gdmFsdWUgaXMgMSBpZiB0aGUga2VybmVsIHRocmVhZCBleGVjcyBhIHByb2Nlc3MsCi0JICogMCBpZiBpdCBqdXN0IGV4aXRzCi0JICovCi0JbiA9IHJ1bl9rZXJuZWxfdGhyZWFkKGZuLCBhcmcsICZjdXJyZW50LT50aHJlYWQuZXhlY19idWYpOwotCWlmKG4gPT0gMSl7Ci0JCS8qIEhhbmRsZSBhbnkgaW1tZWRpYXRlIHJlc2NoZWR1bGVzIG9yIHNpZ25hbHMgKi8KLQkJaW50ZXJydXB0X2VuZCgpOwotCQl1c2Vyc3BhY2UoJmN1cnJlbnQtPnRocmVhZC5yZWdzLnJlZ3MpOworCWZvcihpID0gMDsgaSA8IG5jcHVzOyBpKyspeworCQlpZihjcHVfdGFza3NbaV0ucGlkID09IHBpZCkgcmV0dXJuKGkpOwogCX0KLQllbHNlIGRvX2V4aXQoMCk7CisJcmV0dXJuKC0xKTsKIH0KIAotdm9pZCBuZXdfdGhyZWFkX3Byb2Modm9pZCAqc3RhY2ssIHZvaWQgKCpoYW5kbGVyKShpbnQgc2lnKSkKK3ZvaWQgZnJlZV9zdGFjayh1bnNpZ25lZCBsb25nIHN0YWNrLCBpbnQgb3JkZXIpCiB7Ci0JaW5pdF9uZXdfdGhyZWFkX3N0YWNrKHN0YWNrLCBoYW5kbGVyKTsKLQlvc191c3IxX3Byb2Nlc3Mob3NfZ2V0cGlkKCkpOworCWZyZWVfcGFnZXMoc3RhY2ssIG9yZGVyKTsKIH0KIAotdm9pZCByZWxlYXNlX3RocmVhZF9za2FzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3Vuc2lnbmVkIGxvbmcgYWxsb2Nfc3RhY2soaW50IG9yZGVyLCBpbnQgYXRvbWljKQogeworCXVuc2lnbmVkIGxvbmcgcGFnZTsKKwlnZnBfdCBmbGFncyA9IEdGUF9LRVJORUw7CisKKwlpZiAoYXRvbWljKQorCQlmbGFncyA9IEdGUF9BVE9NSUM7CisJcGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZXMoZmxhZ3MsIG9yZGVyKTsKKwlpZihwYWdlID09IDApCisJCXJldHVybigwKTsKKwlzdGFja19wcm90ZWN0aW9ucyhwYWdlKTsKKwlyZXR1cm4ocGFnZSk7CiB9CiAKLXZvaWQgZm9ya19oYW5kbGVyKGludCBzaWcpCi17Ci0Jb3NfdXNyMV9zaWduYWwoMSk7Ci0JdGhyZWFkX3dhaXQoJmN1cnJlbnQtPnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZiwKLQkJICAgIGN1cnJlbnQtPnRocmVhZC5tb2RlLnNrYXMuZm9ya19idWYpOwotICAJCi0JZm9yY2VfZmx1c2hfYWxsKCk7Ci0JaWYoY3VycmVudC0+dGhyZWFkLnByZXZfc2NoZWQgPT0gTlVMTCkKLQkJcGFuaWMoImJsZWNoIik7Ci0KLQlzY2hlZHVsZV90YWlsKGN1cnJlbnQtPnRocmVhZC5wcmV2X3NjaGVkKTsKLQotCS8qIFhYWDogaWYgaW50ZXJydXB0X2VuZCgpIGNhbGxzIHNjaGVkdWxlLCB0aGlzIGNhbGwgdG8KLQkgKiBhcmNoX3N3aXRjaF90b19za2FzIGlzbid0IG5lZWRlZC4gV2UgY291bGQgd2FudCB0byBhcHBseSB0aGlzIHRvCi0JICogaW1wcm92ZSBwZXJmb3JtYW5jZS4gLWJiICovCi0JYXJjaF9zd2l0Y2hfdG9fc2thcyhjdXJyZW50LT50aHJlYWQucHJldl9zY2hlZCwgY3VycmVudCk7Ci0KLQljdXJyZW50LT50aHJlYWQucHJldl9zY2hlZCA9IE5VTEw7Ci0KLS8qIEhhbmRsZSBhbnkgaW1tZWRpYXRlIHJlc2NoZWR1bGVzIG9yIHNpZ25hbHMgKi8KLQlpbnRlcnJ1cHRfZW5kKCk7Ci0KLQl1c2Vyc3BhY2UoJmN1cnJlbnQtPnRocmVhZC5yZWdzLnJlZ3MpOwotfQotCi1pbnQgY29weV90aHJlYWRfc2thcyhpbnQgbnIsIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgc3AsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBzdGFja190b3AsIHN0cnVjdCB0YXNrX3N0cnVjdCAqIHAsCi0JCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0gIAl2b2lkICgqaGFuZGxlcikoaW50KTsKLQotCWlmKGN1cnJlbnQtPnRocmVhZC5mb3JraW5nKXsKLQkgIAltZW1jcHkoJnAtPnRocmVhZC5yZWdzLnJlZ3Muc2thcywgJnJlZ3MtPnJlZ3Muc2thcywKLQkJICAgICAgIHNpemVvZihwLT50aHJlYWQucmVncy5yZWdzLnNrYXMpKTsKLQkJUkVHU19TRVRfU1lTQ0FMTF9SRVRVUk4ocC0+dGhyZWFkLnJlZ3MucmVncy5za2FzLnJlZ3MsIDApOwotCQlpZihzcCAhPSAwKSBSRUdTX1NQKHAtPnRocmVhZC5yZWdzLnJlZ3Muc2thcy5yZWdzKSA9IHNwOwotCi0JCWhhbmRsZXIgPSBmb3JrX2hhbmRsZXI7Ci0KLQkJYXJjaF9jb3B5X3RocmVhZCgmY3VycmVudC0+dGhyZWFkLmFyY2gsICZwLT50aHJlYWQuYXJjaCk7Ci0JfQotCWVsc2UgewotCQlpbml0X3RocmVhZF9yZWdpc3RlcnMoJnAtPnRocmVhZC5yZWdzLnJlZ3MpOwotICAgICAgICAgICAgICAgIHAtPnRocmVhZC5yZXF1ZXN0LnUudGhyZWFkID0gY3VycmVudC0+dGhyZWFkLnJlcXVlc3QudS50aHJlYWQ7Ci0JCWhhbmRsZXIgPSBuZXdfdGhyZWFkX2hhbmRsZXI7Ci0JfQotCi0JbmV3X3RocmVhZCh0YXNrX3N0YWNrX3BhZ2UocCksICZwLT50aHJlYWQubW9kZS5za2FzLnN3aXRjaF9idWYsCi0JCSAgICZwLT50aHJlYWQubW9kZS5za2FzLmZvcmtfYnVmLCBoYW5kbGVyKTsKLQlyZXR1cm4oMCk7Ci19Ci0KLWludCBuZXdfbW0odW5zaWduZWQgbG9uZyBzdGFjaykKLXsKLQlpbnQgZmQ7Ci0KLQlmZCA9IG9zX29wZW5fZmlsZSgiL3Byb2MvbW0iLCBvZl9jbG9leGVjKG9mX3dyaXRlKE9QRU5GTEFHUygpKSksIDApOwotCWlmKGZkIDwgMCkKLQkJcmV0dXJuKGZkKTsKLQotCWlmKHNrYXNfbmVlZHNfc3R1YikKLQkJbWFwX3N0dWJfcGFnZXMoZmQsIENPTkZJR19TVFVCX0NPREUsIENPTkZJR19TVFVCX0RBVEEsIHN0YWNrKTsKLQotCXJldHVybihmZCk7Ci19Ci0KLXZvaWQgaW5pdF9pZGxlX3NrYXModm9pZCkKLXsKLQljcHVfdGFza3NbY3VycmVudF90aHJlYWQtPmNwdV0ucGlkID0gb3NfZ2V0cGlkKCk7Ci0JZGVmYXVsdF9pZGxlKCk7Ci19Ci0KLWV4dGVybiB2b2lkIHN0YXJ0X2tlcm5lbCh2b2lkKTsKLQotc3RhdGljIGludCBzdGFydF9rZXJuZWxfcHJvYyh2b2lkICp1bnVzZWQpCitpbnQga2VybmVsX3RocmVhZChpbnQgKCpmbikodm9pZCAqKSwgdm9pZCAqIGFyZywgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAlpbnQgcGlkOwogCi0JYmxvY2tfc2lnbmFscygpOwotCXBpZCA9IG9zX2dldHBpZCgpOwotCi0JY3B1X3Rhc2tzWzBdLnBpZCA9IHBpZDsKLQljcHVfdGFza3NbMF0udGFzayA9IGN1cnJlbnQ7Ci0jaWZkZWYgQ09ORklHX1NNUAotIAljcHVfb25saW5lX21hcCA9IGNwdW1hc2tfb2ZfY3B1KDApOwotI2VuZGlmCi0Jc3RhcnRfa2VybmVsKCk7Ci0JcmV0dXJuKDApOworCWN1cnJlbnQtPnRocmVhZC5yZXF1ZXN0LnUudGhyZWFkLnByb2MgPSBmbjsKKwljdXJyZW50LT50aHJlYWQucmVxdWVzdC51LnRocmVhZC5hcmcgPSBhcmc7CisJcGlkID0gZG9fZm9yayhDTE9ORV9WTSB8IENMT05FX1VOVFJBQ0VEIHwgZmxhZ3MsIDAsCisJCSAgICAgICZjdXJyZW50LT50aHJlYWQucmVncywgMCwgTlVMTCwgTlVMTCk7CisJaWYocGlkIDwgMCkKKwkJcGFuaWMoImRvX2ZvcmsgZmFpbGVkIGluIGtlcm5lbF90aHJlYWQsIGVycm5vID0gJWQiLCBwaWQpOworCXJldHVybihwaWQpOwogfQogCi1leHRlcm4gaW50IHVzZXJzcGFjZV9waWRbXTsKLQotaW50IHN0YXJ0X3VtbF9za2FzKHZvaWQpCit2b2lkIHNldF9jdXJyZW50KHZvaWQgKnQpCiB7Ci0JaWYocHJvY19tbSkKLQkJdXNlcnNwYWNlX3BpZFswXSA9IHN0YXJ0X3VzZXJzcGFjZSgwKTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSB0OwogCi0JaW5pdF9uZXdfdGhyZWFkX3NpZ25hbHMoKTsKLQotCWluaXRfdGFzay50aHJlYWQucmVxdWVzdC51LnRocmVhZC5wcm9jID0gc3RhcnRfa2VybmVsX3Byb2M7Ci0JaW5pdF90YXNrLnRocmVhZC5yZXF1ZXN0LnUudGhyZWFkLmFyZyA9IE5VTEw7Ci0JcmV0dXJuKHN0YXJ0X2lkbGVfdGhyZWFkKHRhc2tfc3RhY2tfcGFnZSgmaW5pdF90YXNrKSwKLQkJCQkgJmluaXRfdGFzay50aHJlYWQubW9kZS5za2FzLnN3aXRjaF9idWYsCi0JCQkJICZpbml0X3Rhc2sudGhyZWFkLm1vZGUuc2thcy5mb3JrX2J1ZikpOworCWNwdV90YXNrc1t0YXNrX3RocmVhZF9pbmZvKHRhc2spLT5jcHVdID0gKChzdHJ1Y3QgY3B1X3Rhc2spCisJCXsgZXh0ZXJuYWxfcGlkKHRhc2spLCB0YXNrIH0pOwogfQogCi1pbnQgZXh0ZXJuYWxfcGlkX3NrYXMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQordm9pZCAqX3N3aXRjaF90byh2b2lkICpwcmV2LCB2b2lkICpuZXh0LCB2b2lkICpsYXN0KQogewotI3dhcm5pbmcgTmVlZCB0byBsb29rIHVwIHVzZXJzcGFjZV9waWQgYnkgY3B1Ci0JcmV0dXJuKHVzZXJzcGFjZV9waWRbMF0pOworICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmZyb20gPSBwcmV2OworICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRvPSBuZXh0OworCisgICAgICAgIHRvLT50aHJlYWQucHJldl9zY2hlZCA9IGZyb207CisgICAgICAgIHNldF9jdXJyZW50KHRvKTsKKworCWRvIHsKKwkJY3VycmVudC0+dGhyZWFkLnNhdmVkX3Rhc2sgPSBOVUxMIDsKKwkJQ0hPT1NFX01PREVfUFJPQyhzd2l0Y2hfdG9fdHQsIHN3aXRjaF90b19za2FzLCBwcmV2LCBuZXh0KTsKKwkJaWYoY3VycmVudC0+dGhyZWFkLnNhdmVkX3Rhc2spCisJCQlzaG93X3JlZ3MoJihjdXJyZW50LT50aHJlYWQucmVncykpOworCQluZXh0PSBjdXJyZW50LT50aHJlYWQuc2F2ZWRfdGFzazsKKwkJcHJldj0gY3VycmVudDsKKwl9IHdoaWxlKGN1cnJlbnQtPnRocmVhZC5zYXZlZF90YXNrKTsKKworICAgICAgICByZXR1cm4oY3VycmVudC0+dGhyZWFkLnByZXZfc2NoZWQpOworCiB9CiAKLWludCB0aHJlYWRfcGlkX3NrYXMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQordm9pZCBpbnRlcnJ1cHRfZW5kKHZvaWQpCiB7Ci0jd2FybmluZyBOZWVkIHRvIGxvb2sgdXAgdXNlcnNwYWNlX3BpZCBieSBjcHUKLQlyZXR1cm4odXNlcnNwYWNlX3BpZFswXSk7CisJaWYobmVlZF9yZXNjaGVkKCkpIHNjaGVkdWxlKCk7CisJaWYodGVzdF90c2tfdGhyZWFkX2ZsYWcoY3VycmVudCwgVElGX1NJR1BFTkRJTkcpKSBkb19zaWduYWwoKTsKIH0KIAotdm9pZCBraWxsX29mZl9wcm9jZXNzZXNfc2thcyh2b2lkKQordm9pZCByZWxlYXNlX3RocmVhZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0JaWYocHJvY19tbSkKLSN3YXJuaW5nIG5lZWQgdG8gbG9vcCBvdmVyIHVzZXJzcGFjZV9waWRzIGluIGtpbGxfb2ZmX3Byb2Nlc3Nlc19za2FzCi0JCW9zX2tpbGxfcHRyYWNlZF9wcm9jZXNzKHVzZXJzcGFjZV9waWRbMF0sIDEpOwotCWVsc2UgewotCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7Ci0JCWludCBwaWQsIG1lOworCUNIT09TRV9NT0RFKHJlbGVhc2VfdGhyZWFkX3R0KHRhc2spLCByZWxlYXNlX3RocmVhZF9za2FzKHRhc2spKTsKK30KIAotCQltZSA9IG9zX2dldHBpZCgpOwotCQlmb3JfZWFjaF9wcm9jZXNzKHApewotCQkJaWYocC0+bW0gPT0gTlVMTCkKLQkJCQljb250aW51ZTsKK3ZvaWQgZXhpdF90aHJlYWQodm9pZCkKK3sKKwl1bnByb3RlY3Rfc3RhY2soKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnRfdGhyZWFkKTsKK30KIAotCQkJcGlkID0gcC0+bW0tPmNvbnRleHQuc2thcy5pZC51LnBpZDsKLQkJCW9zX2tpbGxfcHRyYWNlZF9wcm9jZXNzKHBpZCwgMSk7Ci0JCX0KK3ZvaWQgKmdldF9jdXJyZW50KHZvaWQpCit7CisJcmV0dXJuKGN1cnJlbnQpOworfQorCitpbnQgY29weV90aHJlYWQoaW50IG5yLCB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzLCB1bnNpZ25lZCBsb25nIHNwLAorCQl1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCwgc3RydWN0IHRhc2tfc3RydWN0ICogcCwKKwkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IHJldDsKKworCXAtPnRocmVhZCA9IChzdHJ1Y3QgdGhyZWFkX3N0cnVjdCkgSU5JVF9USFJFQUQ7CisJcmV0ID0gQ0hPT1NFX01PREVfUFJPQyhjb3B5X3RocmVhZF90dCwgY29weV90aHJlYWRfc2thcywgbnIsCisJCQkJY2xvbmVfZmxhZ3MsIHNwLCBzdGFja190b3AsIHAsIHJlZ3MpOworCisJaWYgKHJldCB8fCAhY3VycmVudC0+dGhyZWFkLmZvcmtpbmcpCisJCWdvdG8gb3V0OworCisJY2xlYXJfZmx1c2hlZF90bHMocCk7CisKKwkvKgorCSAqIFNldCBhIG5ldyBUTFMgZm9yIHRoZSBjaGlsZCB0aHJlYWQ/CisJICovCisJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfU0VUVExTKQorCQlyZXQgPSBhcmNoX2NvcHlfdGxzKHApOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBpbml0aWFsX3RocmVhZF9jYih2b2lkICgqcHJvYykodm9pZCAqKSwgdm9pZCAqYXJnKQoreworCWludCBzYXZlX2ttYWxsb2Nfb2sgPSBrbWFsbG9jX29rOworCisJa21hbGxvY19vayA9IDA7CisJQ0hPT1NFX01PREVfUFJPQyhpbml0aWFsX3RocmVhZF9jYl90dCwgaW5pdGlhbF90aHJlYWRfY2Jfc2thcywgcHJvYywKKwkJCSBhcmcpOworCWttYWxsb2Nfb2sgPSBzYXZlX2ttYWxsb2Nfb2s7Cit9CisKK3Vuc2lnbmVkIGxvbmcgc3RhY2tfc3AodW5zaWduZWQgbG9uZyBwYWdlKQoreworCXJldHVybihwYWdlICsgUEFHRV9TSVpFIC0gc2l6ZW9mKHZvaWQgKikpOworfQorCitpbnQgY3VycmVudF9waWQodm9pZCkKK3sKKwlyZXR1cm4oY3VycmVudC0+cGlkKTsKK30KKwordm9pZCBkZWZhdWx0X2lkbGUodm9pZCkKK3sKKwlDSE9PU0VfTU9ERSh1bWxfaWRsZV90aW1lcigpLCAodm9pZCkgMCk7CisKKwl3aGlsZSgxKXsKKwkJLyogZW5kbGVzcyBpZGxlIGxvb3Agd2l0aCBubyBwcmlvcml0eSBhdCBhbGwgKi8KKworCQkvKgorCQkgKiBhbHRob3VnaCB3ZSBhcmUgYW4gaWRsZSBDUFUsIHdlIGRvIG5vdCB3YW50IHRvCisJCSAqIGdldCBpbnRvIHRoZSBzY2hlZHVsZXIgdW5uZWNlc3NhcmlseS4KKwkJICovCisJCWlmKG5lZWRfcmVzY2hlZCgpKQorCQkJc2NoZWR1bGUoKTsKKworCQlpZGxlX3NsZWVwKDEwKTsKIAl9CiB9CiAKLXVuc2lnbmVkIGxvbmcgY3VycmVudF9zdHViX3N0YWNrKHZvaWQpCit2b2lkIGNwdV9pZGxlKHZvaWQpCiB7Ci0JaWYoY3VycmVudC0+bW0gPT0gTlVMTCkKKwlDSE9PU0VfTU9ERShpbml0X2lkbGVfdHQoKSwgaW5pdF9pZGxlX3NrYXMoKSk7Cit9CisKK2ludCBwYWdlX3NpemUodm9pZCkKK3sKKwlyZXR1cm4oUEFHRV9TSVpFKTsKK30KKwordm9pZCAqdW1fdmlydF90b19waHlzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkgICAgICBwdGVfdCAqcHRlX291dCkKK3sKKwlwZ2RfdCAqcGdkOworCXB1ZF90ICpwdWQ7CisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlOworCXB0ZV90IHB0ZW50OworCisJaWYodGFzay0+bW0gPT0gTlVMTCkKKwkJcmV0dXJuKEVSUl9QVFIoLUVJTlZBTCkpOworCXBnZCA9IHBnZF9vZmZzZXQodGFzay0+bW0sIGFkZHIpOworCWlmKCFwZ2RfcHJlc2VudCgqcGdkKSkKKwkJcmV0dXJuKEVSUl9QVFIoLUVJTlZBTCkpOworCisJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHIpOworCWlmKCFwdWRfcHJlc2VudCgqcHVkKSkKKwkJcmV0dXJuKEVSUl9QVFIoLUVJTlZBTCkpOworCisJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpOworCWlmKCFwbWRfcHJlc2VudCgqcG1kKSkKKwkJcmV0dXJuKEVSUl9QVFIoLUVJTlZBTCkpOworCisJcHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCBhZGRyKTsKKwlwdGVudCA9ICpwdGU7CisJaWYoIXB0ZV9wcmVzZW50KHB0ZW50KSkKKwkJcmV0dXJuKEVSUl9QVFIoLUVJTlZBTCkpOworCisJaWYocHRlX291dCAhPSBOVUxMKQorCQkqcHRlX291dCA9IHB0ZW50OworCXJldHVybigodm9pZCAqKSAocHRlX3ZhbChwdGVudCkgJiBQQUdFX01BU0spICsgKGFkZHIgJiB+UEFHRV9NQVNLKSk7Cit9CisKK2NoYXIgKmN1cnJlbnRfY21kKHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfU01QKSB8fCBkZWZpbmVkKENPTkZJR19ISUdITUVNKQorCXJldHVybigiKFVua25vd24pIik7CisjZWxzZQorCXZvaWQgKmFkZHIgPSB1bV92aXJ0X3RvX3BoeXMoY3VycmVudCwgY3VycmVudC0+bW0tPmFyZ19zdGFydCwgTlVMTCk7CisJcmV0dXJuIElTX0VSUihhZGRyKSA/ICIoVW5rbm93bikiOiBfX3ZhKCh1bnNpZ25lZCBsb25nKSBhZGRyKTsKKyNlbmRpZgorfQorCit2b2lkIGZvcmNlX3NpZ2J1cyh2b2lkKQoreworCXByaW50ayhLRVJOX0VSUiAiS2lsbGluZyBwaWQgJWQgYmVjYXVzZSBvZiBhIGxhY2sgb2YgbWVtb3J5XG4iLAorCSAgICAgICBjdXJyZW50LT5waWQpOworCWxvY2tfa2VybmVsKCk7CisJc2lnYWRkc2V0KCZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbCwgU0lHQlVTKTsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX1NJR05BTEVEOworCWRvX2V4aXQoU0lHQlVTIHwgMHg4MCk7Cit9CisKK3ZvaWQgZHVtcF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCB1c2VyICp1KQoreworfQorCit2b2lkIGVuYWJsZV9obHQodm9pZCkKK3sKKwlwYW5pYygiZW5hYmxlX2hsdCIpOworfQorCitFWFBPUlRfU1lNQk9MKGVuYWJsZV9obHQpOworCit2b2lkIGRpc2FibGVfaGx0KHZvaWQpCit7CisJcGFuaWMoImRpc2FibGVfaGx0Iik7Cit9CisKK0VYUE9SVF9TWU1CT0woZGlzYWJsZV9obHQpOworCit2b2lkICp1bV9rbWFsbG9jKGludCBzaXplKQoreworCXJldHVybiBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworfQorCit2b2lkICp1bV9rbWFsbG9jX2F0b21pYyhpbnQgc2l6ZSkKK3sKKwlyZXR1cm4ga21hbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKK30KKwordm9pZCAqdW1fdm1hbGxvYyhpbnQgc2l6ZSkKK3sKKwlyZXR1cm4gdm1hbGxvYyhzaXplKTsKK30KKwordm9pZCAqdW1fdm1hbGxvY19hdG9taWMoaW50IHNpemUpCit7CisJcmV0dXJuIF9fdm1hbGxvYyhzaXplLCBHRlBfQVRPTUlDIHwgX19HRlBfSElHSE1FTSwgUEFHRV9LRVJORUwpOworfQorCitpbnQgX19jYW50X3NsZWVwKHZvaWQpIHsKKwlyZXR1cm4gaW5fYXRvbWljKCkgfHwgaXJxc19kaXNhYmxlZCgpIHx8IGluX2ludGVycnVwdCgpOworCS8qIElzIGluX2ludGVycnVwdCgpIHJlYWxseSBuZWVkZWQ/ICovCit9CisKK3Vuc2lnbmVkIGxvbmcgZ2V0X2ZhdWx0X2FkZHIodm9pZCkKK3sKKwlyZXR1cm4oKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnQtPnRocmVhZC5mYXVsdF9hZGRyKTsKK30KKworRVhQT1JUX1NZTUJPTChnZXRfZmF1bHRfYWRkcik7CisKK3ZvaWQgbm90X2ltcGxlbWVudGVkKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIlNvbWV0aGluZyBpc24ndCBpbXBsZW1lbnRlZCBpbiBoZXJlXG4iKTsKK30KKworRVhQT1JUX1NZTUJPTChub3RfaW1wbGVtZW50ZWQpOworCitpbnQgdXNlcl9jb250ZXh0KHVuc2lnbmVkIGxvbmcgc3ApCit7CisJdW5zaWduZWQgbG9uZyBzdGFjazsKKworCXN0YWNrID0gc3AgJiAoUEFHRV9NQVNLIDw8IENPTkZJR19LRVJORUxfU1RBQ0tfT1JERVIpOworCXJldHVybihzdGFjayAhPSAodW5zaWduZWQgbG9uZykgY3VycmVudF90aHJlYWQpOworfQorCitleHRlcm4gZXhpdGNhbGxfdCBfX3VtbF9leGl0Y2FsbF9iZWdpbiwgX191bWxfZXhpdGNhbGxfZW5kOworCit2b2lkIGRvX3VtbF9leGl0Y2FsbHModm9pZCkKK3sKKwlleGl0Y2FsbF90ICpjYWxsOworCisJY2FsbCA9ICZfX3VtbF9leGl0Y2FsbF9lbmQ7CisJd2hpbGUgKC0tY2FsbCA+PSAmX191bWxfZXhpdGNhbGxfYmVnaW4pCisJCSgqY2FsbCkoKTsKK30KKworY2hhciAqdW1sX3N0cmR1cChjaGFyICpzdHJpbmcpCit7CisJcmV0dXJuIGtzdHJkdXAoc3RyaW5nLCBHRlBfS0VSTkVMKTsKK30KKworaW50IGNvcHlfdG9fdXNlcl9wcm9jKHZvaWQgX191c2VyICp0bywgdm9pZCAqZnJvbSwgaW50IHNpemUpCit7CisJcmV0dXJuKGNvcHlfdG9fdXNlcih0bywgZnJvbSwgc2l6ZSkpOworfQorCitpbnQgY29weV9mcm9tX3VzZXJfcHJvYyh2b2lkICp0bywgdm9pZCBfX3VzZXIgKmZyb20sIGludCBzaXplKQoreworCXJldHVybihjb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgc2l6ZSkpOworfQorCitpbnQgY2xlYXJfdXNlcl9wcm9jKHZvaWQgX191c2VyICpidWYsIGludCBzaXplKQoreworCXJldHVybihjbGVhcl91c2VyKGJ1Ziwgc2l6ZSkpOworfQorCitpbnQgc3RybGVuX3VzZXJfcHJvYyhjaGFyIF9fdXNlciAqc3RyKQoreworCXJldHVybihzdHJsZW5fdXNlcihzdHIpKTsKK30KKworaW50IHNtcF9zaWdpb19oYW5kbGVyKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCWludCBjcHUgPSBjdXJyZW50X3RocmVhZC0+Y3B1OworCUlQSV9oYW5kbGVyKGNwdSk7CisJaWYoY3B1ICE9IDApCisJCXJldHVybigxKTsKKyNlbmRpZgorCXJldHVybigwKTsKK30KKworaW50IGNwdSh2b2lkKQoreworCXJldHVybihjdXJyZW50X3RocmVhZC0+Y3B1KTsKK30KKworc3RhdGljIGF0b21pY190IHVzaW5nX3N5c2VtdSA9IEFUT01JQ19JTklUKDApOworaW50IHN5c2VtdV9zdXBwb3J0ZWQ7CisKK3ZvaWQgc2V0X3VzaW5nX3N5c2VtdShpbnQgdmFsdWUpCit7CisJaWYgKHZhbHVlID4gc3lzZW11X3N1cHBvcnRlZCkKKwkJcmV0dXJuOworCWF0b21pY19zZXQoJnVzaW5nX3N5c2VtdSwgdmFsdWUpOworfQorCitpbnQgZ2V0X3VzaW5nX3N5c2VtdSh2b2lkKQoreworCXJldHVybiBhdG9taWNfcmVhZCgmdXNpbmdfc3lzZW11KTsKK30KKworc3RhdGljIGludCBwcm9jX3JlYWRfc3lzZW11KGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBzaXplLGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWlmIChzbnByaW50ZihidWYsIHNpemUsICIlZFxuIiwgZ2V0X3VzaW5nX3N5c2VtdSgpKSA8IHNpemUpIC8qTm8gb3ZlcmZsb3cqLworCQkqZW9mID0gMTsKKworCXJldHVybiBzdHJsZW4oYnVmKTsKK30KKworc3RhdGljIGludCBwcm9jX3dyaXRlX3N5c2VtdShzdHJ1Y3QgZmlsZSAqZmlsZSxjb25zdCBjaGFyIF9fdXNlciAqYnVmLCB1bnNpZ25lZCBsb25nIGNvdW50LHZvaWQgKmRhdGEpCit7CisJY2hhciB0bXBbMl07CisKKwlpZiAoY29weV9mcm9tX3VzZXIodG1wLCBidWYsIDEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICh0bXBbMF0gPj0gJzAnICYmIHRtcFswXSA8PSAnMicpCisJCXNldF91c2luZ19zeXNlbXUodG1wWzBdIC0gJzAnKTsKKwlyZXR1cm4gY291bnQ7IC8qV2UgdXNlIHRoZSBmaXJzdCBjaGFyLCBidXQgcHJldGVuZCB0byB3cml0ZSBldmVyeXRoaW5nKi8KK30KKworaW50IF9faW5pdCBtYWtlX3Byb2Nfc3lzZW11KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisJaWYgKCFzeXNlbXVfc3VwcG9ydGVkKQorCQlyZXR1cm4gMDsKKworCWVudCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJzeXNlbXUiLCAwNjAwLCAmcHJvY19yb290KTsKKworCWlmIChlbnQgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byByZWdpc3RlciAvcHJvYy9zeXNlbXVcbiIpOworCQlyZXR1cm4oMCk7CisJfQorCisJZW50LT5yZWFkX3Byb2MgID0gcHJvY19yZWFkX3N5c2VtdTsKKwllbnQtPndyaXRlX3Byb2MgPSBwcm9jX3dyaXRlX3N5c2VtdTsKKworCXJldHVybiAwOworfQorCitsYXRlX2luaXRjYWxsKG1ha2VfcHJvY19zeXNlbXUpOworCitpbnQgc2luZ2xlc3RlcHBpbmcodm9pZCAqIHQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gdCA/IHQgOiBjdXJyZW50OworCisJaWYgKCAhICh0YXNrLT5wdHJhY2UgJiBQVF9EVFJBQ0UpICkKIAkJcmV0dXJuKDApOwogCi0JcmV0dXJuKGN1cnJlbnQtPm1tLT5jb250ZXh0LnNrYXMuaWQuc3RhY2spOworCWlmICh0YXNrLT50aHJlYWQuc2luZ2xlc3RlcF9zeXNjYWxsKQorCQlyZXR1cm4oMSk7CisKKwlyZXR1cm4gMjsKIH0KKworLyoKKyAqIE9ubHkgeDg2IGFuZCB4ODZfNjQgaGF2ZSBhbiBhcmNoX2FsaWduX3N0YWNrKCkuCisgKiBBbGwgb3RoZXIgYXJjaGVzIGhhdmUgIiNkZWZpbmUgYXJjaF9hbGlnbl9zdGFjayh4KSAoeCkiCisgKiBpbiB0aGVpciBhc20vc3lzdGVtLmgKKyAqIEFzIHRoaXMgaXMgaW5jbHVkZWQgaW4gVU1MIGZyb20gYXNtLXVtL3N5c3RlbS1nZW5lcmljLmgsCisgKiB3ZSBjYW4gdXNlIGl0IHRvIGJlaGF2ZSBhcyB0aGUgc3ViYXJjaCBkb2VzLgorICovCisjaWZuZGVmIGFyY2hfYWxpZ25fc3RhY2sKK3Vuc2lnbmVkIGxvbmcgYXJjaF9hbGlnbl9zdGFjayh1bnNpZ25lZCBsb25nIHNwKQoreworCWlmICghKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgQUREUl9OT19SQU5ET01JWkUpICYmIHJhbmRvbWl6ZV92YV9zcGFjZSkKKwkJc3AgLT0gZ2V0X3JhbmRvbV9pbnQoKSAlIDgxOTI7CisJcmV0dXJuIHNwICYgfjB4ZjsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdGltZS5jIGIvYXJjaC91bS9rZXJuZWwvdGltZS5jCmluZGV4IDI0NTRiYmQuLjgyMGFmZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3RpbWUuYworKysgYi9hcmNoL3VtL2tlcm5lbC90aW1lLmMKQEAgLTk1LDcgKzk1LDcgQEAKIAogCWRvX3RpbWVyKHJlZ3MpOwogCi0JbnNlY3MgPSBnZXRfdGltZSgpICsgbG9jYWxfb2Zmc2V0OworCW5zZWNzID0gZ2V0X3RpbWUoKTsKIAl4dGltZS50dl9zZWMgPSBuc2VjcyAvIE5TRUNfUEVSX1NFQzsKIAl4dGltZS50dl9uc2VjID0gbnNlY3MgLSB4dGltZS50dl9zZWMgKiBOU0VDX1BFUl9TRUM7CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3RyYXAuYyBiL2FyY2gvdW0va2VybmVsL3RyYXAuYwppbmRleCBlNWVlYWYyLi42MWEyM2ZmIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90cmFwLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdHJhcC5jCkBAIC0xNDAsMTQgKzE0MCw2IEBACiAJc2VndigqZmksIFVQVF9JUChyZWdzKSwgVVBUX0lTX1VTRVIocmVncyksIHJlZ3MpOwogfQogCi1zdHJ1Y3Qga2Vybl9oYW5kbGVycyBoYW5kbGluZm9fa2VybiA9IHsKLQkucmVsYXlfc2lnbmFsID0gcmVsYXlfc2lnbmFsLAotCS53aW5jaCA9IHdpbmNoLAotCS5idXNfaGFuZGxlciA9IHJlbGF5X3NpZ25hbCwKLQkucGFnZV9mYXVsdCA9IHNlZ3ZfaGFuZGxlciwKLQkuc2lnaW9faGFuZGxlciA9IHNpZ2lvX2hhbmRsZXIsCi0JLnRpbWVyX2hhbmRsZXIgPSB0aW1lcl9oYW5kbGVyCi19OwogLyoKICAqIFdlIGdpdmUgYSAqY29weSogb2YgdGhlIGZhdWx0aW5mbyBpbiB0aGUgcmVncyB0byBzZWd2LgogICogVGhpcyBtdXN0IGJlIGRvbmUsIHNpbmNlIG5lc3RpbmcgU0VHVnMgY291bGQgb3ZlcndyaXRlCkBAIC0yNTMsNiArMjQ1LDE1IEBACiAJZG9fSVJRKFdJTkNIX0lSUSwgcmVncyk7CiB9CiAKK2NvbnN0IHN0cnVjdCBrZXJuX2hhbmRsZXJzIGhhbmRsaW5mb19rZXJuID0geworCS5yZWxheV9zaWduYWwgPSByZWxheV9zaWduYWwsCisJLndpbmNoID0gd2luY2gsCisJLmJ1c19oYW5kbGVyID0gYnVzX2hhbmRsZXIsCisJLnBhZ2VfZmF1bHQgPSBzZWd2X2hhbmRsZXIsCisJLnNpZ2lvX2hhbmRsZXIgPSBzaWdpb19oYW5kbGVyLAorCS50aW1lcl9oYW5kbGVyID0gdGltZXJfaGFuZGxlcgorfTsKKwogdm9pZCB0cmFwX2luaXQodm9pZCkKIHsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3VtX2FyY2guYyBiL2FyY2gvdW0va2VybmVsL3VtX2FyY2guYwppbmRleCA3ODk2Y2Y5Li41NTAwNTcxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC91bV9hcmNoLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdW1fYXJjaC5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIHsKIH0KIAotc3RydWN0IHNlcV9vcGVyYXRpb25zIGNwdWluZm9fb3AgPSB7Citjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY3B1aW5mb19vcCA9IHsKIAkuc3RhcnQJPSBjX3N0YXJ0LAogCS5uZXh0CT0gY19uZXh0LAogCS5zdG9wCT0gY19zdG9wLApkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9NYWtlZmlsZSBiL2FyY2gvdW0vb3MtTGludXgvTWFrZWZpbGUKaW5kZXggZjRiZmM0Yy4uYjQxODM5MiAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9NYWtlZmlsZQorKysgYi9hcmNoL3VtL29zLUxpbnV4L01ha2VmaWxlCkBAIC00LDE1ICs0LDE5IEBACiAjCiAKIG9iai15ID0gYWlvLm8gZWxmX2F1eC5vIGZpbGUubyBoZWxwZXIubyBpcnEubyBtYWluLm8gbWVtLm8gcHJvY2Vzcy5vIHNpZ2lvLm8gXAotCXNpZ25hbC5vIHN0YXJ0X3VwLm8gdGltZS5vIHRyYXAubyB0dC5vIHR0eS5vIHVhY2Nlc3MubyB1bWlkLm8gdGxzLm8gXAorCXNpZ25hbC5vIHN0YXJ0X3VwLm8gdGltZS5vIHRyYXAubyB0dHkubyB1YWNjZXNzLm8gdW1pZC5vIHRscy5vIFwKIAl1c2VyX3N5bXMubyB1dGlsLm8gZHJpdmVycy8gc3lzLSQoU1VCQVJDSCkvCiAKIG9iai0kKENPTkZJR19NT0RFX1NLQVMpICs9IHNrYXMvCisKK29iai0kKENPTkZJR19NT0RFX1RUKSArPSB0dC5vCit1c2VyLW9ianMtJChDT05GSUdfTU9ERV9UVCkgKz0gdHQubworCiBvYmotJChDT05GSUdfVFRZX0xPRykgKz0gdHR5X2xvZy5vCiB1c2VyLW9ianMtJChDT05GSUdfVFRZX0xPRykgKz0gdHR5X2xvZy5vCiAKIFVTRVJfT0JKUyA6PSAkKHVzZXItb2Jqcy15KSBhaW8ubyBlbGZfYXV4Lm8gZmlsZS5vIGhlbHBlci5vIGlycS5vIG1haW4ubyBtZW0ubyBcCi0JcHJvY2Vzcy5vIHNpZ2lvLm8gc2lnbmFsLm8gc3RhcnRfdXAubyB0aW1lLm8gdHJhcC5vIHR0Lm8gdHR5Lm8gdGxzLm8gXAorCXByb2Nlc3MubyBzaWdpby5vIHNpZ25hbC5vIHN0YXJ0X3VwLm8gdGltZS5vIHRyYXAubyB0dHkubyB0bHMubyBcCiAJdWFjY2Vzcy5vIHVtaWQubyB1dGlsLm8KIAogQ0ZMQUdTX3VzZXJfc3ltcy5vICs9IC1EU1VCQVJDSF8kKFNVQkFSQ0gpCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRhcC5oIGIvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0YXAuaAppbmRleCBiODRmNmM0Li41N2VjZGFmIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRhcC5oCisrKyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGFwLmgKQEAgLTEzLDcgKzEzLDcgQEAKIAl2b2lkICpkZXY7CiB9OwogCi1leHRlcm4gc3RydWN0IG5ldF91c2VyX2luZm8gZXRoZXJ0YXBfdXNlcl9pbmZvOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBuZXRfdXNlcl9pbmZvIGV0aGVydGFwX3VzZXJfaW5mbzsKIAogLyoKICAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX2tlcm4uYyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF9rZXJuLmMKaW5kZXggNzY4NjA2Yi4uMTYzODVlMiAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL2V0aGVydGFwX2tlcm4uYworKysgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfa2Vybi5jCkBAIC02NSw3ICs2NSw3IEBACiAJcmV0dXJuKG5ldF9zZW5kKGZkLCAoKnNrYiktPmRhdGEsICgqc2tiKS0+bGVuKSk7CiB9CiAKLXN0cnVjdCBuZXRfa2Vybl9pbmZvIGV0aGVydGFwX2tlcm5faW5mbyA9IHsKK2NvbnN0IHN0cnVjdCBuZXRfa2Vybl9pbmZvIGV0aGVydGFwX2tlcm5faW5mbyA9IHsKIAkuaW5pdAkJCT0gZXRhcF9pbml0LAogCS5wcm90b2NvbAkJPSBldGhfcHJvdG9jb2wsCiAJLnJlYWQJCQk9IGV0YXBfcmVhZCwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF91c2VyLmMgYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfdXNlci5jCmluZGV4IDhmNDk1MDcuLmY1NTliZGY3IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvZXRoZXJ0YXBfdXNlci5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy9ldGhlcnRhcF91c2VyLmMKQEAgLTIxNiw3ICsyMTYsNyBAQAogCWV0YXBfY2xvc2VfYWRkcihhZGRyLCBuZXRtYXNrLCAmcHJpLT5jb250cm9sX2ZkKTsKIH0KIAotc3RydWN0IG5ldF91c2VyX2luZm8gZXRoZXJ0YXBfdXNlcl9pbmZvID0geworY29uc3Qgc3RydWN0IG5ldF91c2VyX2luZm8gZXRoZXJ0YXBfdXNlcl9pbmZvID0gewogCS5pbml0CQk9IGV0YXBfdXNlcl9pbml0LAogCS5vcGVuCQk9IGV0YXBfb3BlbiwKIAkuY2xvc2UJIAk9IGV0YXBfY2xvc2UsCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvdHVudGFwLmggYi9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvdHVudGFwLmgKaW5kZXggMjVkNGEyOC4uZDNlOGQzYSAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9kcml2ZXJzL3R1bnRhcC5oCisrKyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXAuaApAQCAtMTYsNyArMTYsNyBAQAogCXZvaWQgKmRldjsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgbmV0X3VzZXJfaW5mbyB0dW50YXBfdXNlcl9pbmZvOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBuZXRfdXNlcl9pbmZvIHR1bnRhcF91c2VyX2luZm87CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvdHVudGFwX2tlcm4uYyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfa2Vybi5jCmluZGV4IDE5MDAwOWEuLjBlZGJhYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfa2Vybi5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfa2Vybi5jCkBAIC01Myw3ICs1Myw3IEBACiAJcmV0dXJuKG5ldF93cml0ZShmZCwgKCpza2IpLT5kYXRhLCAoKnNrYiktPmxlbikpOwogfQogCi1zdHJ1Y3QgbmV0X2tlcm5faW5mbyB0dW50YXBfa2Vybl9pbmZvID0geworY29uc3Qgc3RydWN0IG5ldF9rZXJuX2luZm8gdHVudGFwX2tlcm5faW5mbyA9IHsKIAkuaW5pdAkJCT0gdHVudGFwX2luaXQsCiAJLnByb3RvY29sCQk9IGV0aF9wcm90b2NvbCwKIAkucmVhZAkJCT0gdHVudGFwX3JlYWQsCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L2RyaXZlcnMvdHVudGFwX3VzZXIuYyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfdXNlci5jCmluZGV4IDg3YzNhYTAuLmU4NDZiMjMgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfdXNlci5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvZHJpdmVycy90dW50YXBfdXNlci5jCkBAIC0yMDUsNyArMjA1LDcgQEAKIAlyZXR1cm4obXR1KTsKIH0KIAotc3RydWN0IG5ldF91c2VyX2luZm8gdHVudGFwX3VzZXJfaW5mbyA9IHsKK2NvbnN0IHN0cnVjdCBuZXRfdXNlcl9pbmZvIHR1bnRhcF91c2VyX2luZm8gPSB7CiAJLmluaXQJCT0gdHVudGFwX3VzZXJfaW5pdCwKIAkub3BlbgkJPSB0dW50YXBfb3BlbiwKIAkuY2xvc2UJIAk9IHR1bnRhcF9jbG9zZSwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCmluZGV4IDQyZTNkMWVkLi5jYjlhYjU0IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMKQEAgLTQ0NCw1NiArNDQ0LDIyIEBACiAJfQogfQogCi12b2lkIG5ld190aHJlYWQodm9pZCAqc3RhY2ssIHZvaWQgKipzd2l0Y2hfYnVmX3B0ciwgdm9pZCAqKmZvcmtfYnVmX3B0ciwKLQkJdm9pZCAoKmhhbmRsZXIpKGludCkpCit2b2lkIG5ld190aHJlYWQodm9pZCAqc3RhY2ssIGptcF9idWYgKmJ1Ziwgdm9pZCAoKmhhbmRsZXIpKHZvaWQpKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jam1wX2J1ZiBzd2l0Y2hfYnVmLCBmb3JrX2J1ZjsKLQotCSpzd2l0Y2hfYnVmX3B0ciA9ICZzd2l0Y2hfYnVmOwotCSpmb3JrX2J1Zl9wdHIgPSAmZm9ya19idWY7Ci0KLQkvKiBTb21ld2hhdCBzdWJ0bGUgLSBzaWdsb25nam1wIHJlc3RvcmVzIHRoZSBzaWduYWwgbWFzayBiZWZvcmUgZG9pbmcKLQkgKiB0aGUgbG9uZ2ptcC4gIFRoaXMgbWVhbnMgdGhhdCB3aGVuIGp1bXBpbmcgZnJvbSBvbmUgc3RhY2sgdG8gYW5vdGhlcgotCSAqIHdoZW4gdGhlIHRhcmdldCBzdGFjayBoYXMgaW50ZXJydXB0cyBlbmFibGVkLCBhbiBpbnRlcnJ1cHQgbWF5IG9jY3VyCi0JICogb24gdGhlIHNvdXJjZSBzdGFjay4gIFRoaXMgaXMgYmFkIHdoZW4gc3RhcnRpbmcgdXAgYSBwcm9jZXNzIGJlY2F1c2UKLQkgKiBpdCdzIG5vdCBzdXBwb3NlZCB0byBnZXQgdGltZXIgdGlja3MgdW50aWwgaXQgaGFzIGJlZW4gc2NoZWR1bGVkLgotCSAqIFNvLCB3ZSBkaXNhYmxlIGludGVycnVwdHMgYXJvdW5kIHRoZSBzaWdzZXRqbXAgdG8gZW5zdXJlIHRoYXQKLQkgKiB0aGV5IGNhbid0IGhhcHBlbiB1bnRpbCB3ZSBnZXQgYmFjayBoZXJlIHdoZXJlIHRoZXkgYXJlIHNhZmUuCi0JICovCi0JZmxhZ3MgPSBnZXRfc2lnbmFscygpOwotCWJsb2NrX3NpZ25hbHMoKTsKLQlpZihVTUxfU0VUSk1QKCZmb3JrX2J1ZikgPT0gMCkKLQkJbmV3X3RocmVhZF9wcm9jKHN0YWNrLCBoYW5kbGVyKTsKLQotCXJlbW92ZV9zaWdzdGFjaygpOwotCi0Jc2V0X3NpZ25hbHMoZmxhZ3MpOworCSgqYnVmKVswXS5KQl9JUCA9ICh1bnNpZ25lZCBsb25nKSBoYW5kbGVyOworCSgqYnVmKVswXS5KQl9TUCA9ICh1bnNpZ25lZCBsb25nKSBzdGFjayArCisJCShQQUdFX1NJWkUgPDwgVU1MX0NPTkZJR19LRVJORUxfU1RBQ0tfT1JERVIpIC0gc2l6ZW9mKHZvaWQgKik7CiB9CiAKICNkZWZpbmUgSU5JVF9KTVBfTkVXX1RIUkVBRCAwCi0jZGVmaW5lIElOSVRfSk1QX1JFTU9WRV9TSUdTVEFDSyAxCi0jZGVmaW5lIElOSVRfSk1QX0NBTExCQUNLIDIKLSNkZWZpbmUgSU5JVF9KTVBfSEFMVCAzCi0jZGVmaW5lIElOSVRfSk1QX1JFQk9PVCA0CisjZGVmaW5lIElOSVRfSk1QX0NBTExCQUNLIDEKKyNkZWZpbmUgSU5JVF9KTVBfSEFMVCAyCisjZGVmaW5lIElOSVRfSk1QX1JFQk9PVCAzCiAKLXZvaWQgdGhyZWFkX3dhaXQodm9pZCAqc3csIHZvaWQgKmZiKQordm9pZCBzd2l0Y2hfdGhyZWFkcyhqbXBfYnVmICptZSwgam1wX2J1ZiAqeW91KQogewotCWptcF9idWYgYnVmLCAqKnN3aXRjaF9idWYgPSBzdywgKmZvcmtfYnVmOwotCi0JKnN3aXRjaF9idWYgPSAmYnVmOwotCWZvcmtfYnVmID0gZmI7Ci0JaWYoVU1MX1NFVEpNUCgmYnVmKSA9PSAwKQotCQlVTUxfTE9OR0pNUChmb3JrX2J1ZiwgSU5JVF9KTVBfUkVNT1ZFX1NJR1NUQUNLKTsKLX0KLQotdm9pZCBzd2l0Y2hfdGhyZWFkcyh2b2lkICptZSwgdm9pZCAqbmV4dCkKLXsKLQlqbXBfYnVmIG15X2J1ZiwgKiptZV9wdHIgPSBtZSwgKm5leHRfYnVmID0gbmV4dDsKLQotCSptZV9wdHIgPSAmbXlfYnVmOwotCWlmKFVNTF9TRVRKTVAoJm15X2J1ZikgPT0gMCkKLQkJVU1MX0xPTkdKTVAobmV4dF9idWYsIDEpOworCWlmKFVNTF9TRVRKTVAobWUpID09IDApCisJCVVNTF9MT05HSk1QKHlvdSwgMSk7CiB9CiAKIHN0YXRpYyBqbXBfYnVmIGluaXRpYWxfam1wYnVmOwpAQCAtNTAzLDIzICs0NjksMjEgQEAKIHN0YXRpYyB2b2lkICpjYl9hcmc7CiBzdGF0aWMgam1wX2J1ZiAqY2JfYmFjazsKIAotaW50IHN0YXJ0X2lkbGVfdGhyZWFkKHZvaWQgKnN0YWNrLCB2b2lkICpzd2l0Y2hfYnVmX3B0ciwgdm9pZCAqKmZvcmtfYnVmX3B0cikKK2ludCBzdGFydF9pZGxlX3RocmVhZCh2b2lkICpzdGFjaywgam1wX2J1ZiAqc3dpdGNoX2J1ZikKIHsKLQlqbXBfYnVmICoqc3dpdGNoX2J1ZiA9IHN3aXRjaF9idWZfcHRyOwogCWludCBuOwogCiAJc2V0X2hhbmRsZXIoU0lHV0lOQ0gsIChfX3NpZ2hhbmRsZXJfdCkgc2lnX2hhbmRsZXIsCiAJCSAgICBTQV9PTlNUQUNLIHwgU0FfUkVTVEFSVCwgU0lHVVNSMSwgU0lHSU8sIFNJR0FMUk0sCiAJCSAgICBTSUdWVEFMUk0sIC0xKTsKIAotCSpmb3JrX2J1Zl9wdHIgPSAmaW5pdGlhbF9qbXBidWY7CiAJbiA9IFVNTF9TRVRKTVAoJmluaXRpYWxfam1wYnVmKTsKIAlzd2l0Y2gobil7CiAJY2FzZSBJTklUX0pNUF9ORVdfVEhSRUFEOgotCQluZXdfdGhyZWFkX3Byb2MoKHZvaWQgKikgc3RhY2ssIG5ld190aHJlYWRfaGFuZGxlcik7Ci0JCWJyZWFrOwotCWNhc2UgSU5JVF9KTVBfUkVNT1ZFX1NJR1NUQUNLOgotCQlyZW1vdmVfc2lnc3RhY2soKTsKKwkJKCpzd2l0Y2hfYnVmKVswXS5KQl9JUCA9ICh1bnNpZ25lZCBsb25nKSBuZXdfdGhyZWFkX2hhbmRsZXI7CisJCSgqc3dpdGNoX2J1ZilbMF0uSkJfU1AgPSAodW5zaWduZWQgbG9uZykgc3RhY2sgKworCQkJKFBBR0VfU0laRSA8PCBVTUxfQ09ORklHX0tFUk5FTF9TVEFDS19PUkRFUikgLQorCQkJc2l6ZW9mKHZvaWQgKik7CiAJCWJyZWFrOwogCWNhc2UgSU5JVF9KTVBfQ0FMTEJBQ0s6CiAJCSgqY2JfcHJvYykoY2JfYXJnKTsKQEAgLTUzNCw3ICs0OTgsNyBAQAogCWRlZmF1bHQ6CiAJCXBhbmljKCJCYWQgc2lnc2V0am1wIHJldHVybiBpbiBzdGFydF9pZGxlX3RocmVhZCAtICVkXG4iLCBuKTsKIAl9Ci0JVU1MX0xPTkdKTVAoKnN3aXRjaF9idWYsIDEpOworCVVNTF9MT05HSk1QKHN3aXRjaF9idWYsIDEpOwogfQogCiB2b2lkIGluaXRpYWxfdGhyZWFkX2NiX3NrYXModm9pZCAoKnByb2MpKHZvaWQgKiksIHZvaWQgKmFyZykKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUgYi9hcmNoL3VtL3N5cy1pMzg2L01ha2VmaWxlCmluZGV4IDU5Y2M3MDIuLjBlMzJhZGYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vc3lzLWkzODYvTWFrZWZpbGUKKysrIGIvYXJjaC91bS9zeXMtaTM4Ni9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKIAogb2JqLSQoQ09ORklHX01PREVfU0tBUykgKz0gc3R1Yi5vIHN0dWJfc2Vndi5vCiAKLXN1YmFyY2gtb2JqLXkgPSBsaWIvYml0b3BzLm8ga2VybmVsL3NlbWFwaG9yZS5vCitzdWJhcmNoLW9iai15ID0gbGliL2JpdG9wcy5vIGxpYi9zZW1hcGhvcmUubwogc3ViYXJjaC1vYmotJChDT05GSUdfSElHSE1FTSkgKz0gbW0vaGlnaG1lbS5vCiBzdWJhcmNoLW9iai0kKENPTkZJR19NT0RVTEVTKSArPSBrZXJuZWwvbW9kdWxlLm8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvS2NvbmZpZyBiL2FyY2gveDg2XzY0L0tjb25maWcKaW5kZXggNTgxY2U5YS4uMzJhZTEzNyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvS2NvbmZpZworKysgYi9hcmNoL3g4Nl82NC9LY29uZmlnCkBAIC04NSw2ICs4NSw5IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAKKwlkZWZfYm9vbCB5CisKIGNvbmZpZyBETUkKIAlib29sCiAJZGVmYXVsdCB5CkBAIC0xMDksNiArMTEyLDcgQEAKIAogY29uZmlnIFg4Nl9WU01QCiAJYm9vbCAiU3VwcG9ydCBmb3IgU2NhbGVNUCB2U01QIgorCWRlcGVuZHMgb24gUENJCiAJIGhlbHAKIAkgIFN1cHBvcnQgZm9yIFNjYWxlTVAgdlNNUCBzeXN0ZW1zLiAgU2F5ICdZJyBoZXJlIGlmIHRoaXMga2VybmVsIGlzCiAJICBzdXBwb3NlZCB0byBydW4gb24gdGhlc2UgRU02NFQtYmFzZWQgbWFjaGluZXMuICBPbmx5IGNob29zZSB0aGlzIG9wdGlvbgpAQCAtMTY3LDYgKzE3MSw3IEBACiAKIGNvbmZpZyBNSUNST0NPREUKIAl0cmlzdGF0ZSAiL2Rldi9jcHUvbWljcm9jb2RlIC0gSW50ZWwgQ1BVIG1pY3JvY29kZSBzdXBwb3J0IgorCXNlbGVjdCBGV19MT0FERVIKIAktLS1oZWxwLS0tCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSB0aGUgJ0ZpbGUgc3lzdGVtcycgc2VjdGlvbiwgeW91IHdpbGwgYmUKIAkgIGFibGUgdG8gdXBkYXRlIHRoZSBtaWNyb2NvZGUgb24gSW50ZWwgcHJvY2Vzc29ycy4gWW91IHdpbGwKQEAgLTE4Miw2ICsxODcsMTEgQEAKIAkgIElmIHlvdSB1c2UgbW9kcHJvYmUgb3Iga21vZCB5b3UgbWF5IGFsc28gd2FudCB0byBhZGQgdGhlIGxpbmUKIAkgICdhbGlhcyBjaGFyLW1ham9yLTEwLTE4NCBtaWNyb2NvZGUnIHRvIHlvdXIgL2V0Yy9tb2R1bGVzLmNvbmYgZmlsZS4KIAorY29uZmlnIE1JQ1JPQ09ERV9PTERfSU5URVJGQUNFCisJYm9vbAorCWRlcGVuZHMgb24gTUlDUk9DT0RFCisJZGVmYXVsdCB5CisKIGNvbmZpZyBYODZfTVNSCiAJdHJpc3RhdGUgIi9kZXYvY3B1LyovbXNyIC0gTW9kZWwtc3BlY2lmaWMgcmVnaXN0ZXIgc3VwcG9ydCIKIAloZWxwCkBAIC0yOTUsNyArMzA1LDcgQEAKIAogY29uZmlnIEs4X05VTUEKICAgICAgICBib29sICJPbGQgc3R5bGUgQU1EIE9wdGVyb24gTlVNQSBkZXRlY3Rpb24iCi0gICAgICAgZGVwZW5kcyBvbiBOVU1BCisgICAgICAgZGVwZW5kcyBvbiBOVU1BICYmIFBDSQogICAgICAgIGRlZmF1bHQgeQogICAgICAgIGhlbHAKIAkgRW5hYmxlIEs4IE5VTUEgbm9kZSB0b3BvbG9neSBkZXRlY3Rpb24uICBZb3Ugc2hvdWxkIHNheSBZIGhlcmUgaWYKQEAgLTQyNSw3ICs0MzUsNiBAQAogCiBjb25maWcgQ0FMR0FSWV9JT01NVQogCWJvb2wgIklCTSBDYWxnYXJ5IElPTU1VIHN1cHBvcnQiCi0JZGVmYXVsdCB5CiAJc2VsZWN0IFNXSU9UTEIKIAlkZXBlbmRzIG9uIFBDSSAmJiBFWFBFUklNRU5UQUwKIAloZWxwCkBAIC00NzIsOCArNDgxLDcgQEAKIAkgICB0aGUgRFJBTSBFcnJvciBUaHJlc2hvbGQuCiAKIGNvbmZpZyBLRVhFQwotCWJvb2wgImtleGVjIHN5c3RlbSBjYWxsIChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJYm9vbCAia2V4ZWMgc3lzdGVtIGNhbGwiCiAJaGVscAogCSAga2V4ZWMgaXMgYSBzeXN0ZW0gY2FsbCB0aGF0IGltcGxlbWVudHMgdGhlIGFiaWxpdHkgdG8gc2h1dGRvd24geW91cgogCSAgY3VycmVudCBrZXJuZWwsIGFuZCB0byBzdGFydCBhbm90aGVyIGtlcm5lbC4gIEl0IGlzIGxpa2UgYSByZWJvb3QKQEAgLTQ5Miw3ICs1MDAsMTQgQEAKIAlib29sICJrZXJuZWwgY3Jhc2ggZHVtcHMgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKIAloZWxwCi0JCUdlbmVyYXRlIGNyYXNoIGR1bXAgYWZ0ZXIgYmVpbmcgc3RhcnRlZCBieSBrZXhlYy4KKyAgICAgICAgICBHZW5lcmF0ZSBjcmFzaCBkdW1wIGFmdGVyIGJlaW5nIHN0YXJ0ZWQgYnkga2V4ZWMuCisgICAgICAgICAgVGhpcyBzaG91bGQgYmUgbm9ybWFsbHkgb25seSBzZXQgaW4gc3BlY2lhbCBjcmFzaCBkdW1wIGtlcm5lbHMKKyAgICAgICAgICB3aGljaCBhcmUgbG9hZGVkIGluIHRoZSBtYWluIGtlcm5lbCB3aXRoIGtleGVjLXRvb2xzIGludG8KKyAgICAgICAgICBhIHNwZWNpYWxseSByZXNlcnZlZCByZWdpb24gYW5kIHRoZW4gbGF0ZXIgZXhlY3V0ZWQgYWZ0ZXIKKyAgICAgICAgICBhIGNyYXNoIGJ5IGtkdW1wL2tleGVjLiBUaGUgY3Jhc2ggZHVtcCBrZXJuZWwgbXVzdCBiZSBjb21waWxlZAorCSAgdG8gYSBtZW1vcnkgYWRkcmVzcyBub3QgdXNlZCBieSB0aGUgbWFpbiBrZXJuZWwgb3IgQklPUyB1c2luZworCSAgUEhZU0lDQUxfU1RBUlQuCisgICAgICAgICAgRm9yIG1vcmUgZGV0YWlscyBzZWUgRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQKIAogY29uZmlnIFBIWVNJQ0FMX1NUQVJUCiAJaGV4ICJQaHlzaWNhbCBhZGRyZXNzIHdoZXJlIHRoZSBrZXJuZWwgaXMgbG9hZGVkIiBpZiAoRU1CRURERUQgfHwgQ1JBU0hfRFVNUCkKQEAgLTUzMCw2ICs1NDUsMzAgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4gT25seSBlbWJlZGRlZCBzaG91bGQgc2F5IE4gaGVyZS4KIAorY29uZmlnIENDX1NUQUNLUFJPVEVDVE9SCisJYm9vbCAiRW5hYmxlIC1mc3RhY2stcHJvdGVjdG9yIGJ1ZmZlciBvdmVyZmxvdyBkZXRlY3Rpb24gKEVYUFJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWhlbHAKKyAgICAgICAgIFRoaXMgb3B0aW9uIHR1cm5zIG9uIHRoZSAtZnN0YWNrLXByb3RlY3RvciBHQ0MgZmVhdHVyZS4gVGhpcworCSAgZmVhdHVyZSBwdXRzLCBhdCB0aGUgYmVnaW5uaW5nIG9mIGNyaXRpY2FsIGZ1bmN0aW9ucywgYSBjYW5hcnkKKwkgIHZhbHVlIG9uIHRoZSBzdGFjayBqdXN0IGJlZm9yZSB0aGUgcmV0dXJuIGFkZHJlc3MsIGFuZCB2YWxpZGF0ZXMKKwkgIHRoZSB2YWx1ZSBqdXN0IGJlZm9yZSBhY3R1YWxseSByZXR1cm5pbmcuICBTdGFjayBiYXNlZCBidWZmZXIKKwkgIG92ZXJmbG93cyAodGhhdCBuZWVkIHRvIG92ZXJ3cml0ZSB0aGlzIHJldHVybiBhZGRyZXNzKSBub3cgYWxzbworCSAgb3ZlcndyaXRlIHRoZSBjYW5hcnksIHdoaWNoIGdldHMgZGV0ZWN0ZWQgYW5kIHRoZSBhdHRhY2sgaXMgdGhlbgorCSAgbmV1dHJhbGl6ZWQgdmlhIGEga2VybmVsIHBhbmljLgorCisJICBUaGlzIGZlYXR1cmUgcmVxdWlyZXMgZ2NjIHZlcnNpb24gNC4yIG9yIGFib3ZlLCBvciBhIGRpc3RyaWJ1dGlvbgorCSAgZ2NjIHdpdGggdGhlIGZlYXR1cmUgYmFja3BvcnRlZC4gT2xkZXIgdmVyc2lvbnMgYXJlIGF1dG9tYXRpY2FsbHkKKwkgIGRldGVjdGVkIGFuZCBmb3IgdGhvc2UgdmVyc2lvbnMsIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgaWdub3JlZC4KKworY29uZmlnIENDX1NUQUNLUFJPVEVDVE9SX0FMTAorCWJvb2wgIlVzZSBzdGFjay1wcm90ZWN0b3IgZm9yIGFsbCBmdW5jdGlvbnMiCisJZGVwZW5kcyBvbiBDQ19TVEFDS1BST1RFQ1RPUgorCWhlbHAKKwkgIE5vcm1hbGx5LCBHQ0Mgb25seSBpbnNlcnRzIHRoZSBjYW5hcnkgdmFsdWUgcHJvdGVjdGlvbiBmb3IKKwkgIGZ1bmN0aW9ucyB0aGF0IHVzZSBsYXJnZS1pc2ggb24tc3RhY2sgYnVmZmVycy4gQnkgZW5hYmxpbmcKKwkgIHRoaXMgb3B0aW9uLCBHQ0Mgd2lsbCBiZSBhc2tlZCB0byBkbyB0aGlzIGZvciBBTEwgZnVuY3Rpb25zLgorCiBzb3VyY2Uga2VybmVsL0tjb25maWcuaHoKIAogY29uZmlnIFJFT1JERVIKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L01ha2VmaWxlIGIvYXJjaC94ODZfNjQvTWFrZWZpbGUKaW5kZXggNDMxYmI0Yi4uMWMwZjE4ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvTWFrZWZpbGUKKysrIGIvYXJjaC94ODZfNjQvTWFrZWZpbGUKQEAgLTU0LDYgKzU0LDE2IEBACiBjZmxhZ3MteSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1mdW5pdC1hdC1hLXRpbWUpCiAjIHByZXZlbnQgZ2NjIGZyb20gZ2VuZXJhdGluZyBhbnkgRlAgY29kZSBieSBtaXN0YWtlCiBjZmxhZ3MteSArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tbm8tc3NlIC1tbm8tbW14IC1tbm8tc3NlMiAtbW5vLTNkbm93LCkKKyMgZG8gYmludXRpbHMgc3VwcG9ydCBDRkk/CitjZmxhZ3MteSArPSAkKGNhbGwgYXMtaW5zdHIsLmNmaV9zdGFydHByb2Ncbi5jZmlfZW5kcHJvYywtRENPTkZJR19BU19DRkk9MSwpCitBRkxBR1MgKz0gJChjYWxsIGFzLWluc3RyLC5jZmlfc3RhcnRwcm9jXG4uY2ZpX2VuZHByb2MsLURDT05GSUdfQVNfQ0ZJPTEsKQorCisjIGlzIC5jZmlfc2lnbmFsX2ZyYW1lIHN1cHBvcnRlZCB0b28/CitjZmxhZ3MteSArPSAkKGNhbGwgYXMtaW5zdHIsLmNmaV9zdGFydHByb2Ncbi5jZmlfc2lnbmFsX2ZyYW1lXG4uY2ZpX2VuZHByb2MsLURDT05GSUdfQVNfQ0ZJX1NJR05BTF9GUkFNRT0xLCkKK0FGTEFHUyArPSAkKGNhbGwgYXMtaW5zdHIsLmNmaV9zdGFydHByb2Ncbi5jZmlfc2lnbmFsX2ZyYW1lXG4uY2ZpX2VuZHByb2MsLURDT05GSUdfQVNfQ0ZJX1NJR05BTF9GUkFNRT0xLCkKKworY2ZsYWdzLSQoQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SKSArPSAkKHNoZWxsICQoQ09ORklHX1NIRUxMKSAkKHNyY3RyZWUpL3NjcmlwdHMvZ2NjLXg4Nl82NC1oYXMtc3RhY2stcHJvdGVjdG9yLnNoICQoQ0MpIC1mc3RhY2stcHJvdGVjdG9yICkKK2NmbGFncy0kKENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUl9BTEwpICs9ICQoc2hlbGwgJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9nY2MteDg2XzY0LWhhcy1zdGFjay1wcm90ZWN0b3Iuc2ggJChDQykgLWZzdGFjay1wcm90ZWN0b3ItYWxsICkKIAogQ0ZMQUdTICs9ICQoY2ZsYWdzLXkpCiBDRkxBR1NfS0VSTkVMICs9ICQoY2ZsYWdzLWtlcm5lbC15KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlIGIvYXJjaC94ODZfNjQvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCmluZGV4IGY4OWQ5NmYuLmU3MGZhNmUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTcsNyArNyw4IEBACiAjCiAKIHRhcmdldHMJCTo9IHZtbGludXggdm1saW51eC5iaW4gdm1saW51eC5iaW4uZ3ogaGVhZC5vIG1pc2MubyBwaWdneS5vCi1FWFRSQV9BRkxBR1MJOj0gLXRyYWRpdGlvbmFsIC1tMzIKK0VYVFJBX0FGTEFHUwk6PSAtdHJhZGl0aW9uYWwKK0FGTEFHUwkJOj0gJChzdWJzdCAtbTY0LC1tMzIsJChBRkxBR1MpKQogCiAjIGNhbm5vdCB1c2UgRVhUUkFfQ0ZMQUdTIGJlY2F1c2UgYmFzZSBDRkxBR1MgY29udGFpbnMgLW1rZXJuZWwgd2hpY2ggY29uZmxpY3RzIHdpdGgKICMgLW0zMgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvYm9vdC9zZXR1cC5TIGIvYXJjaC94ODZfNjQvYm9vdC9zZXR1cC5TCmluZGV4IGE1MGI2MzEuLmMzYmZkMjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2Jvb3Qvc2V0dXAuUworKysgYi9hcmNoL3g4Nl82NC9ib290L3NldHVwLlMKQEAgLTUyNiwxMiArNTI2LDEyIEBACiAJbW92dwklY3MsICVheAkJCSMgYWthIFNFVFVQU0VHCiAJc3VidwkkREVMVEFfSU5JVFNFRywgJWF4CQkjIGFrYSBJTklUU0VHCiAJbW92dwklYXgsICVkcwotCW1vdncJJDAsICgweDFmZikJCQkjIGRlZmF1bHQgaXMgbm8gcG9pbnRpbmcgZGV2aWNlCisJbW92YgkkMCwgKDB4MWZmKQkJCSMgZGVmYXVsdCBpcyBubyBwb2ludGluZyBkZXZpY2UKIAlpbnQJJDB4MTEJCQkJIyBpbnQgMHgxMTogZXF1aXBtZW50IGxpc3QKIAl0ZXN0YgkkMHgwNCwgJWFsCQkJIyBjaGVjayBpZiBtb3VzZSBpbnN0YWxsZWQKIAlqeglub19wc21vdXNlCiAKLQltb3Z3CSQweEFBLCAoMHgxZmYpCQkJIyBkZXZpY2UgcHJlc2VudAorCW1vdmIJJDB4QUEsICgweDFmZikJCQkjIGRldmljZSBwcmVzZW50CiBub19wc21vdXNlOgogCiAjaW5jbHVkZSAiLi4vLi4vaTM4Ni9ib290L2VkZC5TIgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvZGVmY29uZmlnIGIvYXJjaC94ODZfNjQvZGVmY29uZmlnCmluZGV4IDVmYjk3MDcuLjY0NzYxMGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2RlZmNvbmZpZworKysgYi9hcmNoL3g4Nl82NC9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTgtcmM0Ci0jIFRodSBBdWcgMjQgMjE6MDU6NTUgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE4LWdpdDUKKyMgVHVlIFNlcCAyNiAwOTozMDo0NyAyMDA2CiAjCiBDT05GSUdfWDg2XzY0PXkKIENPTkZJR182NEJJVD15CkBAIC0xOSw2ICsxOSw3IEBACiBDT05GSUdfR0VORVJJQ19JT01BUD15CiBDT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQogQ09ORklHX0RNST15CitDT05GSUdfQVVESVRfQVJDSD15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC0zOCwxNiArMzksMTYgQEAKIENPTkZJR19QT1NJWF9NUVVFVUU9eQogIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19UQVNLU1RBVFMgaXMgbm90IHNldAotQ09ORklHX1NZU0NUTD15CiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQogIyBDT05GSUdfQ1BVU0VUUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgotQ09ORklHX1VJRDE2PXkKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CiAjIENPTkZJR19FTUJFRERFRCBpcyBub3Qgc2V0CitDT05GSUdfVUlEMTY9eQorQ09ORklHX1NZU0NUTD15CiBDT05GSUdfS0FMTFNZTVM9eQogQ09ORklHX0tBTExTWU1TX0FMTD15CiAjIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTIGlzIG5vdCBzZXQKQEAgLTU2LDEyICs1NywxMiBAQAogQ09ORklHX0JVRz15CiBDT05GSUdfRUxGX0NPUkU9eQogQ09ORklHX0JBU0VfRlVMTD15Ci1DT05GSUdfUlRfTVVURVhFUz15CiBDT05GSUdfRlVURVg9eQogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSE1FTT15CiBDT05GSUdfU0xBQj15CiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQorQ09ORklHX1JUX01VVEVYRVM9eQogIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9TTUFMTD0wCiAjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKQEAgLTE2MCw2ICsxNjEsNyBAQAogIyBDT05GSUdfQ1JBU0hfRFVNUCBpcyBub3Qgc2V0CiBDT05GSUdfUEhZU0lDQUxfU1RBUlQ9MHgyMDAwMDAKIENPTkZJR19TRUNDT01QPXkKKyMgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFpfMjUwPXkKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldApAQCAtMzA3LDE4ICszMDksMjMgQEAKIENPTkZJR19JTkVUX0RJQUc9eQogQ09ORklHX0lORVRfVENQX0RJQUc9eQogIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAotQ09ORklHX1RDUF9DT05HX0JJQz15CitDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQorQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgogQ09ORklHX0lQVjY9eQogIyBDT05GSUdfSVBWNl9QUklWQUNZIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjZfUk9VVEVSX1BSRUYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfQUggaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfRVNQIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X01JUDYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9UUkFOU1BPUlQgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX01PREVfUk9VVEVPUFRJTUlaQVRJT04gaXMgbm90IHNldAogIyBDT05GSUdfSVBWNl9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9TVUJUUkVFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X01VTFRJUExFX1RBQkxFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAogIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKIApAQCAtMzQ1LDcgKzM1Miw2IEBACiAjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19YMjUgaXMgbm90IHNldAogIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKICMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKIApAQCAtNDg3LDYgKzQ5Myw3IEBACiAjCiAjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJPXkKK0NPTkZJR19TQ1NJX05FVExJTks9eQogIyBDT05GSUdfU0NTSV9QUk9DX0ZTIGlzIG5vdCBzZXQKIAogIwpAQCAtNTA4LDEyICs1MTUsMTMgQEAKICMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CiAKICMKLSMgU0NTSSBUcmFuc3BvcnQgQXR0cmlidXRlcworIyBTQ1NJIFRyYW5zcG9ydHMKICMKIENPTkZJR19TQ1NJX1NQSV9BVFRSUz15CiBDT05GSUdfU0NTSV9GQ19BVFRSUz15CiAjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKIENPTkZJR19TQ1NJX1NBU19BVFRSUz15CisjIENPTkZJR19TQ1NJX1NBU19MSUJTQVMgaXMgbm90IHNldAogCiAjCiAjIFNDU0kgbG93LWxldmVsIGRyaXZlcnMKQEAgLTUzMiwyOSArNTQwLDE0IEBACiAjIENPTkZJR19BSUM3OVhYX0RFQlVHX0VOQUJMRSBpcyBub3Qgc2V0CiBDT05GSUdfQUlDNzlYWF9ERUJVR19NQVNLPTAKICMgQ09ORklHX0FJQzc5WFhfUkVHX1BSRVRUWV9QUklOVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BUkNNU1IgaXMgbm90IHNldAogQ09ORklHX01FR0FSQUlEX05FV0dFTj15CiBDT05GSUdfTUVHQVJBSURfTU09eQogQ09ORklHX01FR0FSQUlEX01BSUxCT1g9eQogIyBDT05GSUdfTUVHQVJBSURfTEVHQUNZIGlzIG5vdCBzZXQKIENPTkZJR19NRUdBUkFJRF9TQVM9eQotQ09ORklHX1NDU0lfU0FUQT15Ci1DT05GSUdfU0NTSV9TQVRBX0FIQ0k9eQotQ09ORklHX1NDU0lfU0FUQV9TVlc9eQotQ09ORklHX1NDU0lfQVRBX1BJSVg9eQotIyBDT05GSUdfU0NTSV9TQVRBX01WIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1NBVEFfTlY9eQotIyBDT05GSUdfU0NTSV9QRENfQURNQSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEFfUVNUT1IgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBX1BST01JU0UgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBX1NYNCBpcyBub3Qgc2V0Ci1DT05GSUdfU0NTSV9TQVRBX1NJTD15Ci0jIENPTkZJR19TQ1NJX1NBVEFfU0lMMjQgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9TQVRBX1NJUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1NBVEFfVUxJIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1NBVEFfVklBPXkKLSMgQ09ORklHX1NDU0lfU0FUQV9WSVRFU1NFIGlzIG5vdCBzZXQKLUNPTkZJR19TQ1NJX1NBVEFfSU5URUxfQ09NQklORUQ9eQogIyBDT05GSUdfU0NTSV9CVVNMT0dJQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRUFUQSBpcyBub3Qgc2V0CkBAIC01NjMsNiArNTU2LDcgQEAKICMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKQEAgLTU3Myw2ICs1NjcsNjIgQEAKICMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogCiAjCisjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycworIworQ09ORklHX0FUQT15CitDT05GSUdfU0FUQV9BSENJPXkKK0NPTkZJR19TQVRBX1NWVz15CitDT05GSUdfQVRBX1BJSVg9eQorIyBDT05GSUdfU0FUQV9NViBpcyBub3Qgc2V0CitDT05GSUdfU0FUQV9OVj15CisjIENPTkZJR19QRENfQURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1FTVE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfUFJPTUlTRSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NYNCBpcyBub3Qgc2V0CitDT05GSUdfU0FUQV9TSUw9eQorIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1VMSSBpcyBub3Qgc2V0CitDT05GSUdfU0FUQV9WSUE9eQorIyBDT05GSUdfU0FUQV9WSVRFU1NFIGlzIG5vdCBzZXQKK0NPTkZJR19TQVRBX0lOVEVMX0NPTUJJTkVEPXkKKyMgQ09ORklHX1BBVEFfQUxJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVJUT1AgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9BVElJWFAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DTUQ2NFggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MjAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DUzU1MzAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9DWVBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfRUZBUiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDM3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0hQVDNYMk4gaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9JVDgyMVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9KTUlDUk9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTEVHQUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfVFJJRkxFWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX01QSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT0xEUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05FVENFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9OUzg3NDEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX09QVElETUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QRENfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUURJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUkFESVNZUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1JaMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NFUlZFUldPUktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUERDMjAyN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TSUw2ODAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9TSVMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9WSUEgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9XSU5CT05EIGlzIG5vdCBzZXQKKworIwogIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQogIwogQ09ORklHX01EPXkKQEAgLTY3OCw2ICs3MjgsNyBAQAogIyBDT05GSUdfQURBUFRFQ19TVEFSRklSRSBpcyBub3Qgc2V0CiBDT05GSUdfQjQ0PXkKIENPTkZJR19GT1JDRURFVEg9eQorIyBDT05GSUdfRk9SQ0VERVRIX05BUEkgaXMgbm90IHNldAogIyBDT05GSUdfREdSUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRVBSTzEwMCBpcyBub3Qgc2V0CiBDT05GSUdfRTEwMD15CkBAIC03MTQsNiArNzY1LDcgQEAKICMgQ09ORklHX1ZJQV9WRUxPQ0lUWSBpcyBub3Qgc2V0CiBDT05GSUdfVElHT04zPXkKIENPTkZJR19CTlgyPXkKKyMgQ09ORklHX1FMQTNYWFggaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMDAwMCBNYml0KQpAQCAtMTAzNiw2ICsxMDg4LDcgQEAKICMgT3BlbiBTb3VuZCBTeXN0ZW0KICMKIENPTkZJR19TT1VORF9QUklNRT15CitDT05GSUdfT1NTX09CU09MRVRFX0RSSVZFUj15CiAjIENPTkZJR19TT1VORF9CVDg3OCBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9FTVUxMEsxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX0ZVU0lPTiBpcyBub3Qgc2V0CkBAIC0xMDQ2LDcgKzEwOTksNiBAQAogIyBDT05GSUdfU09VTkRfTVNORFBJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9WSUE4MkNYWFggaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfT1NTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX1RWTUlYRVIgaXMgbm90IHNldAogCiAjCiAjIFVTQiBzdXBwb3J0CkBAIC0xMjAzLDcgKzEyNTUsNiBAQAogIyBJbmZpbmlCYW5kIHN1cHBvcnQKICMKICMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAotIyBDT05GSUdfSVBBVEhfQ09SRSBpcyBub3Qgc2V0CiAKICMKICMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCkBAIC0xNDQ5LDEwICsxNTAwLDYgQEAKICMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CiAKICMKLSMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKLSMKLQotIwogIyBMaWJyYXJ5IHJvdXRpbmVzCiAjCiAjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyX2FvdXQuYyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9hb3V0LmMKaW5kZXggM2JmNThhZi4uMzk2ZDNjMSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyX2FvdXQuYworKysgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfYW91dC5jCkBAIC0zMzMsNyArMzMzLDggQEAKIAkJCXJldHVybiBlcnJvcjsKIAkJfQogCi0JCWVycm9yID0gYnBybS0+ZmlsZS0+Zl9vcC0+cmVhZChicHJtLT5maWxlLCAoY2hhciAqKXRleHRfYWRkciwKKwkJZXJyb3IgPSBicHJtLT5maWxlLT5mX29wLT5yZWFkKGJwcm0tPmZpbGUsCisJCQkgKGNoYXIgX191c2VyICopdGV4dF9hZGRyLAogCQkJICBleC5hX3RleHQrZXguYV9kYXRhLCAmcG9zKTsKIAkJaWYgKChzaWduZWQgbG9uZyllcnJvciA8IDApIHsKIAkJCXNlbmRfc2lnKFNJR0tJTEwsIGN1cnJlbnQsIDApOwpAQCAtMzY2LDcgKzM2Nyw4IEBACiAJCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCQkJZG9fYnJrKE5fVFhUQUREUihleCksIGV4LmFfdGV4dCtleC5hX2RhdGEpOwogCQkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JCQlicHJtLT5maWxlLT5mX29wLT5yZWFkKGJwcm0tPmZpbGUsKGNoYXIgKilOX1RYVEFERFIoZXgpLAorCQkJYnBybS0+ZmlsZS0+Zl9vcC0+cmVhZChicHJtLT5maWxlLAorCQkJCQkoY2hhciBfX3VzZXIgKilOX1RYVEFERFIoZXgpLAogCQkJCQlleC5hX3RleHQrZXguYV9kYXRhLCAmcG9zKTsKIAkJCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZykgTl9UWFRBRERSKGV4KSwKIAkJCQkJICAgKHVuc2lnbmVkIGxvbmcpIE5fVFhUQUREUihleCkgKwpAQCAtNDc3LDcgKzQ3OSw3IEBACiAJCWRvX2JyayhzdGFydF9hZGRyLCBleC5hX3RleHQgKyBleC5hX2RhdGEgKyBleC5hX2Jzcyk7CiAJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCQkKLQkJZmlsZS0+Zl9vcC0+cmVhZChmaWxlLCAoY2hhciAqKXN0YXJ0X2FkZHIsCisJCWZpbGUtPmZfb3AtPnJlYWQoZmlsZSwgKGNoYXIgX191c2VyICopc3RhcnRfYWRkciwKIAkJCWV4LmFfdGV4dCArIGV4LmFfZGF0YSwgJnBvcyk7CiAJCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZykgc3RhcnRfYWRkciwKIAkJCQkgICAodW5zaWduZWQgbG9uZykgc3RhcnRfYWRkciArIGV4LmFfdGV4dCArIGV4LmFfZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfc2lnbmFsLmMgYi9hcmNoL3g4Nl82NC9pYTMyL2lhMzJfc2lnbmFsLmMKaW5kZXggMjVlNWNhMi4uYTZiYTk5NSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvaWEzMi9pYTMyX3NpZ25hbC5jCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMl9zaWduYWwuYwpAQCAtMTEzLDI1ICsxMTMsMTkgQEAKIH0KIAogYXNtbGlua2FnZSBsb25nCi1zeXMzMl9zaWdzdXNwZW5kKGludCBoaXN0b3J5MCwgaW50IGhpc3RvcnkxLCBvbGRfc2lnc2V0X3QgbWFzaywKLQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3lzMzJfc2lnc3VzcGVuZChpbnQgaGlzdG9yeTAsIGludCBoaXN0b3J5MSwgb2xkX3NpZ3NldF90IG1hc2spCiB7Ci0Jc2lnc2V0X3Qgc2F2ZXNldDsKLQogCW1hc2sgJj0gX0JMT0NLQUJMRTsKIAlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQlzYXZlc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKKwljdXJyZW50LT5zYXZlZF9zaWdtYXNrID0gY3VycmVudC0+YmxvY2tlZDsKIAlzaWdpbml0c2V0KCZjdXJyZW50LT5ibG9ja2VkLCBtYXNrKTsKIAlyZWNhbGNfc2lncGVuZGluZygpOwogCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAKLQlyZWdzLT5yYXggPSAtRUlOVFI7Ci0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0JCWlmIChkb19zaWduYWwocmVncywgJnNhdmVzZXQpKQotCQkJcmV0dXJuIC1FSU5UUjsKLQl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJc2NoZWR1bGUoKTsKKwlzZXRfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJcmV0dXJuIC1FUkVTVEFSVE5PSEFORDsKIH0KIAogYXNtbGlua2FnZSBsb25nCkBAIC00MzcsMTUgKzQzMSw3IEBACiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQogCQlnb3RvIGdpdmVfc2lnc2VndjsKIAotCXsKLQkJc3RydWN0IGV4ZWNfZG9tYWluICplZCA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW47Ci0JCWVyciB8PSBfX3B1dF91c2VyKChlZAotCQkgICAgICAgICAgICYmIGVkLT5zaWduYWxfaW52bWFwCi0JCSAgICAgICAgICAgJiYgc2lnIDwgMzIKLQkJICAgICAgICAgICA/IGVkLT5zaWduYWxfaW52bWFwW3NpZ10KLQkJICAgICAgICAgICA6IHNpZyksCi0JCSAgICAgICAgICAmZnJhbWUtPnNpZyk7Ci0JfQorCWVyciB8PSBfX3B1dF91c2VyKHNpZywgJmZyYW1lLT5zaWcpOwogCWlmIChlcnIpCiAJCWdvdG8gZ2l2ZV9zaWdzZWd2OwogCkBAIC00OTIsNiArNDc4LDExIEBACiAJcmVncy0+cnNwID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOwogCXJlZ3MtPnJpcCA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfaGFuZGxlcjsKIAorCS8qIE1ha2UgLW1yZWdwYXJtPTMgd29yayAqLworCXJlZ3MtPnJheCA9IHNpZzsKKwlyZWdzLT5yZHggPSAwOworCXJlZ3MtPnJjeCA9IDA7CisKIAlhc20gdm9sYXRpbGUoIm1vdmwgJTAsJSVkcyIgOjogInIiIChfX1VTRVIzMl9EUykpOyAKIAlhc20gdm9sYXRpbGUoIm1vdmwgJTAsJSVlcyIgOjogInIiIChfX1VTRVIzMl9EUykpOyAKIApAQCAtNDk5LDIwICs0OTAsMjAgQEAKIAlyZWdzLT5zcyA9IF9fVVNFUjMyX0RTOyAKIAogCXNldF9mcyhVU0VSX0RTKTsKLSAgICByZWdzLT5lZmxhZ3MgJj0gflRGX01BU0s7Ci0gICAgaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1NJTkdMRVNURVApKQotICAgICAgICBwdHJhY2Vfbm90aWZ5KFNJR1RSQVApOworCXJlZ3MtPmVmbGFncyAmPSB+VEZfTUFTSzsKKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFU1RFUCkpCisJCXB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7CiAKICNpZiBERUJVR19TSUcKIAlwcmludGsoIlNJRyBkZWxpdmVyICglczolZCk6IHNwPSVwIHBjPSVwIHJhPSVwXG4iLAogCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGZyYW1lLCByZWdzLT5yaXAsIGZyYW1lLT5wcmV0Y29kZSk7CiAjZW5kaWYKIAotCXJldHVybiAxOworCXJldHVybiAwOwogCiBnaXZlX3NpZ3NlZ3Y6CiAJZm9yY2Vfc2lnc2VndihzaWcsIGN1cnJlbnQpOwotCXJldHVybiAwOworCXJldHVybiAtRUZBVUxUOwogfQogCiBpbnQgaWEzMl9zZXR1cF9ydF9mcmFtZShpbnQgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLCBzaWdpbmZvX3QgKmluZm8sCkBAIC01OTUsMTggKzU4NiwxOCBAQAogCXJlZ3MtPnNzID0gX19VU0VSMzJfRFM7IAogCiAJc2V0X2ZzKFVTRVJfRFMpOwotICAgIHJlZ3MtPmVmbGFncyAmPSB+VEZfTUFTSzsKLSAgICBpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfU0lOR0xFU1RFUCkpCi0gICAgICAgIHB0cmFjZV9ub3RpZnkoU0lHVFJBUCk7CisJcmVncy0+ZWZsYWdzICY9IH5URl9NQVNLOworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSkKKwkJcHRyYWNlX25vdGlmeShTSUdUUkFQKTsKIAogI2lmIERFQlVHX1NJRwogCXByaW50aygiU0lHIGRlbGl2ZXIgKCVzOiVkKTogc3A9JXAgcGM9JXAgcmE9JXBcbiIsCiAJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgZnJhbWUsIHJlZ3MtPnJpcCwgZnJhbWUtPnByZXRjb2RlKTsKICNlbmRpZgogCi0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiAKIGdpdmVfc2lnc2VndjoKIAlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIC1FRkFVTFQ7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TIGIvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUwppbmRleCA1ZDRhN2QxLi5iNGFhODc1IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMmVudHJ5LlMKQEAgLTcxLDYgKzcxLDcgQEAKICAqLyAJCiBFTlRSWShpYTMyX3N5c2VudGVyX3RhcmdldCkKIAlDRklfU1RBUlRQUk9DMzIJc2ltcGxlCisJQ0ZJX1NJR05BTF9GUkFNRQogCUNGSV9ERUZfQ0ZBCXJzcCwwCiAJQ0ZJX1JFR0lTVEVSCXJzcCxyYnAKIAlzd2FwZ3MKQEAgLTE4Niw2ICsxODcsNyBAQAogICovIAkKIEVOVFJZKGlhMzJfY3N0YXJfdGFyZ2V0KQogCUNGSV9TVEFSVFBST0MzMglzaW1wbGUKKwlDRklfU0lHTkFMX0ZSQU1FCiAJQ0ZJX0RFRl9DRkEJcnNwLFBEQV9TVEFDS09GRlNFVAogCUNGSV9SRUdJU1RFUglyaXAscmN4CiAJLypDRklfUkVHSVNURVIJcmZsYWdzLHIxMSovCkBAIC0yOTMsNiArMjk1LDcgQEAKIAogRU5UUlkoaWEzMl9zeXNjYWxsKQogCUNGSV9TVEFSVFBST0MJc2ltcGxlCisJQ0ZJX1NJR05BTF9GUkFNRQogCUNGSV9ERUZfQ0ZBCXJzcCxTUys4LVJJUAogCS8qQ0ZJX1JFTF9PRkZTRVQJc3MsU1MtUklQKi8KIAlDRklfUkVMX09GRlNFVAlyc3AsUlNQLVJJUApAQCAtMzcwLDYgKzM3Myw3IEBACiAJcG9wcSAlcjExCiAJQ0ZJX0VORFBST0MKIAlDRklfU1RBUlRQUk9DMzIJc2ltcGxlCisJQ0ZJX1NJR05BTF9GUkFNRQogCUNGSV9ERUZfQ0ZBCXJzcCxTUys4LUFSR09GRlNFVAogCUNGSV9SRUxfT0ZGU0VUCXJheCxSQVgtQVJHT0ZGU0VUCiAJQ0ZJX1JFTF9PRkZTRVQJcmN4LFJDWC1BUkdPRkZTRVQKQEAgLTcwMyw4ICs3MDcsOCBAQAogCS5xdWFkIHN5c19yZWFkbGlua2F0CQkvKiAzMDUgKi8KIAkucXVhZCBzeXNfZmNobW9kYXQKIAkucXVhZCBzeXNfZmFjY2Vzc2F0Ci0JLnF1YWQgcXVpZXRfbmlfc3lzY2FsbAkJLyogcHNlbGVjdDYgZm9yIG5vdyAqLwotCS5xdWFkIHF1aWV0X25pX3N5c2NhbGwJCS8qIHBwb2xsIGZvciBub3cgKi8KKwkucXVhZCBjb21wYXRfc3lzX3BzZWxlY3Q2CisJLnF1YWQgY29tcGF0X3N5c19wcG9sbAogCS5xdWFkIHN5c191bnNoYXJlCQkvKiAzMTAgKi8KIAkucXVhZCBjb21wYXRfc3lzX3NldF9yb2J1c3RfbGlzdAogCS5xdWFkIGNvbXBhdF9zeXNfZ2V0X3JvYnVzdF9saXN0CkBAIC03MTMsNCArNzE3LDUgQEAKIAkucXVhZCBzeXNfdGVlCiAJLnF1YWQgY29tcGF0X3N5c192bXNwbGljZQogCS5xdWFkIGNvbXBhdF9zeXNfbW92ZV9wYWdlcworCS5xdWFkIHN5c19nZXRjcHUKIGlhMzJfc3lzY2FsbF9lbmQ6CQkKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2lhMzIvcHRyYWNlMzIuYyBiL2FyY2gveDg2XzY0L2lhMzIvcHRyYWNlMzIuYwppbmRleCA2NTljMDcyLi5kMTgxOThlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL3B0cmFjZTMyLmMKKysrIGIvYXJjaC94ODZfNjQvaWEzMi9wdHJhY2UzMi5jCkBAIC0xMTcsNiArMTE3LDEwIEBACiAJCQlpZiAoKDB4NTQ1NCA+PiAoKHZhbCA+PiAoMTYgKyA0KmkpKSAmIDB4ZikpICYgMSkKIAkJCSAgICAgICByZXR1cm4gLUVJTzsKIAkJY2hpbGQtPnRocmVhZC5kZWJ1Z3JlZzcgPSB2YWw7IAorCQlpZiAodmFsKQorCQkJc2V0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX0RFQlVHKTsKKwkJZWxzZQorCQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfREVCVUcpOwogCQlicmVhazsgCiAJCSAgICAKIAlkZWZhdWx0OgpAQCAtMzcxLDggKzM3NSwxMCBAQAogCQlyZXQgPSAtRUlPOwogCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdSwgc2l6ZW9mKCp1KSkpCiAJCQlicmVhazsKLQkJLyogbm8gY2hlY2tpbmcgdG8gYmUgYnVnLXRvLWJ1ZyBjb21wYXRpYmxlIHdpdGggaTM4NiAqLwotCQlfX2NvcHlfZnJvbV91c2VyKCZjaGlsZC0+dGhyZWFkLmkzODcuZnhzYXZlLCB1LCBzaXplb2YoKnUpKTsKKwkJLyogbm8gY2hlY2tpbmcgdG8gYmUgYnVnLXRvLWJ1ZyBjb21wYXRpYmxlIHdpdGggaTM4Ni4gKi8KKwkJLyogYnV0IHNpbGVuY2Ugd2FybmluZyAqLworCQlpZiAoX19jb3B5X2Zyb21fdXNlcigmY2hpbGQtPnRocmVhZC5pMzg3LmZ4c2F2ZSwgdSwgc2l6ZW9mKCp1KSkpCisJCQk7CiAJCXNldF9zdG9wcGVkX2NoaWxkX3VzZWRfbWF0aChjaGlsZCk7CiAJCWNoaWxkLT50aHJlYWQuaTM4Ny5meHNhdmUubXhjc3IgJj0gbXhjc3JfZmVhdHVyZV9tYXNrOwogCQlyZXQgPSAwOyAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2lhMzIvc3lzX2lhMzIuYyBiL2FyY2gveDg2XzY0L2lhMzIvc3lzX2lhMzIuYwppbmRleCA5YzEzMDk5Li5mMjgwZDM2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL3N5c19pYTMyLmMKKysrIGIvYXJjaC94ODZfNjQvaWEzMi9zeXNfaWEzMi5jCkBAIC02MCw2ICs2MCw3IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaHVpZC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9mc25vdGlmeS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGFzbS9tbWFuLmg+CiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTM4OSw3ICszOTAsOSBAQAogCQl9CiAJfQogCXNldF9mcyAoS0VSTkVMX0RTKTsKLQlyZXQgPSBzeXNfcnRfc2lncHJvY21hc2soaG93LCBzZXQgPyAmcyA6IE5VTEwsIG9zZXQgPyAmcyA6IE5VTEwsCisJcmV0ID0gc3lzX3J0X3NpZ3Byb2NtYXNrKGhvdywKKwkJCQkgc2V0ID8gKHNpZ3NldF90IF9fdXNlciAqKSZzIDogTlVMTCwKKwkJCQkgb3NldCA/IChzaWdzZXRfdCBfX3VzZXIgKikmcyA6IE5VTEwsCiAJCQkJIHNpZ3NldHNpemUpOyAKIAlzZXRfZnMgKG9sZF9mcyk7CiAJaWYgKHJldCkgcmV0dXJuIHJldDsKQEAgLTU0MSw3ICs1NDQsNyBAQAogCWludCBiaXRjb3VudCA9IDA7CiAJCiAJc2V0X2ZzIChLRVJORUxfRFMpOwotCXJldCA9IHN5c19zeXNpbmZvKCZzKTsKKwlyZXQgPSBzeXNfc3lzaW5mbygoc3RydWN0IHN5c2luZm8gX191c2VyICopJnMpOwogCXNldF9mcyAob2xkX2ZzKTsKIAogICAgICAgICAvKiBDaGVjayB0byBzZWUgaWYgYW55IG1lbW9yeSB2YWx1ZSBpcyB0b28gbGFyZ2UgZm9yIDMyLWJpdCBhbmQgc2NhbGUKQEAgLTU4OSw3ICs1OTIsNyBAQAogCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMgKCk7CiAJCiAJc2V0X2ZzIChLRVJORUxfRFMpOwotCXJldCA9IHN5c19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwocGlkLCAmdCk7CisJcmV0ID0gc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbChwaWQsIChzdHJ1Y3QgdGltZXNwZWMgX191c2VyICopJnQpOwogCXNldF9mcyAob2xkX2ZzKTsKIAlpZiAocHV0X2NvbXBhdF90aW1lc3BlYygmdCwgaW50ZXJ2YWwpKQogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTYwNSw3ICs2MDgsNyBAQAogCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKIAkJCiAJc2V0X2ZzIChLRVJORUxfRFMpOwotCXJldCA9IHN5c19ydF9zaWdwZW5kaW5nKCZzLCBzaWdzZXRzaXplKTsKKwlyZXQgPSBzeXNfcnRfc2lncGVuZGluZygoc2lnc2V0X3QgX191c2VyICopJnMsIHNpZ3NldHNpemUpOwogCXNldF9mcyAob2xkX2ZzKTsKIAlpZiAoIXJldCkgewogCQlzd2l0Y2ggKF9OU0lHX1dPUkRTKSB7CkBAIC02MzAsNyArNjMzLDcgQEAKIAlpZiAoY29weV9zaWdpbmZvX2Zyb21fdXNlcjMyKCZpbmZvLCB1aW5mbykpCiAJCXJldHVybiAtRUZBVUxUOwogCXNldF9mcyAoS0VSTkVMX0RTKTsKLQlyZXQgPSBzeXNfcnRfc2lncXVldWVpbmZvKHBpZCwgc2lnLCAmaW5mbyk7CisJcmV0ID0gc3lzX3J0X3NpZ3F1ZXVlaW5mbyhwaWQsIHNpZywgKHNpZ2luZm9fdCBfX3VzZXIgKikmaW5mbyk7CiAJc2V0X2ZzIChvbGRfZnMpOwogCXJldHVybiByZXQ7CiB9CkBAIC02NDUsNyArNjQ4LDcgQEAKIH0KIAogCi0jaWZkZWYgQ09ORklHX1NZU0NUTAorI2lmZGVmIENPTkZJR19TWVNDVExfU1lTQ0FMTAogc3RydWN0IHN5c2N0bF9pYTMyIHsKIAl1bnNpZ25lZCBpbnQJbmFtZTsKIAlpbnQJCW5sZW47CkBAIC02NjYsOSArNjY5LDYgQEAKIAlzaXplX3Qgb2xkbGVuOwogCWludCBfX3VzZXIgKm5hbWVwOwogCWxvbmcgcmV0OwotCWV4dGVybiBpbnQgZG9fc3lzY3RsKGludCAqbmFtZSwgaW50IG5sZW4sIHZvaWQgKm9sZHZhbCwgc2l6ZV90ICpvbGRsZW5wLAotCQkgICAgIHZvaWQgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbik7Ci0KIAogCWlmIChjb3B5X2Zyb21fdXNlcigmYTMyLCBhcmdzMzIsIHNpemVvZiAoYTMyKSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtNjkyLDcgKzY5Miw4IEBACiAKIAlzZXRfZnMoS0VSTkVMX0RTKTsKIAlsb2NrX2tlcm5lbCgpOwotCXJldCA9IGRvX3N5c2N0bChuYW1lcCwgYTMyLm5sZW4sIG9sZHZhbHAsICZvbGRsZW4sIG5ld3ZhbHAsIChzaXplX3QpIGEzMi5uZXdsZW4pOworCXJldCA9IGRvX3N5c2N0bChuYW1lcCwgYTMyLm5sZW4sIG9sZHZhbHAsIChzaXplX3QgX191c2VyICopJm9sZGxlbiwKKwkJCW5ld3ZhbHAsIChzaXplX3QpIGEzMi5uZXdsZW4pOwogCXVubG9ja19rZXJuZWwoKTsKIAlzZXRfZnMob2xkX2ZzKTsKIApAQCAtNzQzLDcgKzc0NCw4IEBACiAJCXJldHVybiAtRUZBVUxUOwogCQkKIAlzZXRfZnMoS0VSTkVMX0RTKTsKLQlyZXQgPSBzeXNfc2VuZGZpbGUob3V0X2ZkLCBpbl9mZCwgb2Zmc2V0ID8gJm9mIDogTlVMTCwgY291bnQpOworCXJldCA9IHN5c19zZW5kZmlsZShvdXRfZmQsIGluX2ZkLCBvZmZzZXQgPyAob2ZmX3QgX191c2VyICopJm9mIDogTlVMTCwKKwkJCSAgIGNvdW50KTsKIAlzZXRfZnMob2xkX2ZzKTsKIAkKIAlpZiAob2Zmc2V0ICYmIHB1dF91c2VyKG9mLCBvZmZzZXQpKQpAQCAtNzc4LDcgKzc4MCw3IEBACiAKIGFzbWxpbmthZ2UgbG9uZyBzeXMzMl9vbGR1bmFtZShzdHJ1Y3Qgb2xkb2xkX3V0c25hbWUgX191c2VyICogbmFtZSkKIHsKLQlpbnQgZXJyb3I7CisJaW50IGVycjsKIAogCWlmICghbmFtZSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC03ODcsMjcgKzc4OSwzMSBAQAogICAKICAgCWRvd25fcmVhZCgmdXRzX3NlbSk7CiAJCi0JZXJyb3IgPSBfX2NvcHlfdG9fdXNlcigmbmFtZS0+c3lzbmFtZSwmc3lzdGVtX3V0c25hbWUuc3lzbmFtZSxfX09MRF9VVFNfTEVOKTsKLQkgX19wdXRfdXNlcigwLG5hbWUtPnN5c25hbWUrX19PTERfVVRTX0xFTik7Ci0JIF9fY29weV90b191c2VyKCZuYW1lLT5ub2RlbmFtZSwmc3lzdGVtX3V0c25hbWUubm9kZW5hbWUsX19PTERfVVRTX0xFTik7Ci0JIF9fcHV0X3VzZXIoMCxuYW1lLT5ub2RlbmFtZStfX09MRF9VVFNfTEVOKTsKLQkgX19jb3B5X3RvX3VzZXIoJm5hbWUtPnJlbGVhc2UsJnN5c3RlbV91dHNuYW1lLnJlbGVhc2UsX19PTERfVVRTX0xFTik7Ci0JIF9fcHV0X3VzZXIoMCxuYW1lLT5yZWxlYXNlK19fT0xEX1VUU19MRU4pOwotCSBfX2NvcHlfdG9fdXNlcigmbmFtZS0+dmVyc2lvbiwmc3lzdGVtX3V0c25hbWUudmVyc2lvbixfX09MRF9VVFNfTEVOKTsKLQkgX19wdXRfdXNlcigwLG5hbWUtPnZlcnNpb24rX19PTERfVVRTX0xFTik7CisJZXJyID0gX19jb3B5X3RvX3VzZXIoJm5hbWUtPnN5c25hbWUsJnN5c3RlbV91dHNuYW1lLnN5c25hbWUsCisJCQkJX19PTERfVVRTX0xFTik7CisJZXJyIHw9IF9fcHV0X3VzZXIoMCxuYW1lLT5zeXNuYW1lK19fT0xEX1VUU19MRU4pOworCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmbmFtZS0+bm9kZW5hbWUsJnN5c3RlbV91dHNuYW1lLm5vZGVuYW1lLAorCQkJCV9fT0xEX1VUU19MRU4pOworCWVyciB8PSBfX3B1dF91c2VyKDAsbmFtZS0+bm9kZW5hbWUrX19PTERfVVRTX0xFTik7CisJZXJyIHw9IF9fY29weV90b191c2VyKCZuYW1lLT5yZWxlYXNlLCZzeXN0ZW1fdXRzbmFtZS5yZWxlYXNlLAorCQkJCV9fT0xEX1VUU19MRU4pOworCWVyciB8PSBfX3B1dF91c2VyKDAsbmFtZS0+cmVsZWFzZStfX09MRF9VVFNfTEVOKTsKKwllcnIgfD0gX19jb3B5X3RvX3VzZXIoJm5hbWUtPnZlcnNpb24sJnN5c3RlbV91dHNuYW1lLnZlcnNpb24sCisJCQkJX19PTERfVVRTX0xFTik7CisJZXJyIHw9IF9fcHV0X3VzZXIoMCxuYW1lLT52ZXJzaW9uK19fT0xEX1VUU19MRU4pOwogCSB7IAogCQkgY2hhciAqYXJjaCA9ICJ4ODZfNjQiOwogCQkgaWYgKHBlcnNvbmFsaXR5KGN1cnJlbnQtPnBlcnNvbmFsaXR5KSA9PSBQRVJfTElOVVgzMikKIAkJCSBhcmNoID0gImk2ODYiOwogCQkgCi0JCSBfX2NvcHlfdG9fdXNlcigmbmFtZS0+bWFjaGluZSxhcmNoLHN0cmxlbihhcmNoKSsxKTsKKwkJIGVyciB8PSBfX2NvcHlfdG9fdXNlcigmbmFtZS0+bWFjaGluZSxhcmNoLHN0cmxlbihhcmNoKSsxKTsKIAkgfQogCQogCSB1cF9yZWFkKCZ1dHNfc2VtKTsKIAkgCi0JIGVycm9yID0gZXJyb3IgPyAtRUZBVUxUIDogMDsKKwkgZXJyID0gZXJyID8gLUVGQVVMVCA6IDA7CiAJIAotCSByZXR1cm4gZXJyb3I7CisJIHJldHVybiBlcnI7CiB9CiAKIGxvbmcgc3lzMzJfdW5hbWUoc3RydWN0IG9sZF91dHNuYW1lIF9fdXNlciAqIG5hbWUpCkBAIC04MzEsNyArODM3LDcgQEAKIAkKIAlzZWcgPSBnZXRfZnMoKTsgCiAJc2V0X2ZzKEtFUk5FTF9EUyk7IAotCXJldCA9IHN5c191c3RhdChkZXYsJnUpOyAKKwlyZXQgPSBzeXNfdXN0YXQoZGV2LCAoc3RydWN0IHVzdGF0IF9fdXNlciAqKSZ1KTsKIAlzZXRfZnMoc2VnKTsKIAlpZiAocmV0ID49IDApIHsgCiAJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSx1MzJwLHNpemVvZihzdHJ1Y3QgdXN0YXQzMikpIHx8IApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlIGIvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlCmluZGV4IGI1YWFlYWYuLjNjN2NiZmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvTWFrZWZpbGUKQEAgLTExLDcgKzExLDcgQEAKIAkJcGNpLWRtYS5vIHBjaS1ub21tdS5vIGFsdGVybmF0aXZlLm8KIAogb2JqLSQoQ09ORklHX1NUQUNLVFJBQ0UpCSs9IHN0YWNrdHJhY2Uubwotb2JqLSQoQ09ORklHX1g4Nl9NQ0UpICAgICAgICAgKz0gbWNlLm8KK29iai0kKENPTkZJR19YODZfTUNFKQkJKz0gbWNlLm8gdGhlcm1fdGhyb3Qubwogb2JqLSQoQ09ORklHX1g4Nl9NQ0VfSU5URUwpCSs9IG1jZV9pbnRlbC5vCiBvYmotJChDT05GSUdfWDg2X01DRV9BTUQpCSs9IG1jZV9hbWQubwogb2JqLSQoQ09ORklHX01UUlIpCQkrPSAuLi8uLi9pMzg2L2tlcm5lbC9jcHUvbXRyci8KQEAgLTIwLDggKzIwLDggQEAKIG9iai0kKENPTkZJR19NSUNST0NPREUpCQkrPSBtaWNyb2NvZGUubwogb2JqLSQoQ09ORklHX1g4Nl9DUFVJRCkJCSs9IGNwdWlkLm8KIG9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubyBzbXBib290Lm8gdHJhbXBvbGluZS5vCi1vYmotJChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpCSs9IGFwaWMubyAgbm1pLm8KLW9iai0kKENPTkZJR19YODZfSU9fQVBJQykJKz0gaW9fYXBpYy5vIG1wcGFyc2UubyBcCitvYmoteQkJCQkrPSBhcGljLm8gIG5taS5vCitvYmoteQkJCQkrPSBpb19hcGljLm8gbXBwYXJzZS5vIFwKIAkJZ2VuYXBpYy5vIGdlbmFwaWNfY2x1c3Rlci5vIGdlbmFwaWNfZmxhdC5vCiBvYmotJChDT05GSUdfS0VYRUMpCQkrPSBtYWNoaW5lX2tleGVjLm8gcmVsb2NhdGVfa2VybmVsLm8gY3Jhc2gubwogb2JqLSQoQ09ORklHX0NSQVNIX0RVTVApCSs9IGNyYXNoX2R1bXAubwpAQCAtMzksMTIgKzM5LDE0IEBACiBvYmotJChDT05GSUdfQVVESVQpCQkrPSBhdWRpdC5vCiAKIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8KK29iai0kKENPTkZJR19QQ0kpCQkrPSBlYXJseS1xdWlya3MubwogCiBvYmoteQkJCQkrPSB0b3BvbG9neS5vCiBvYmoteQkJCQkrPSBpbnRlbF9jYWNoZWluZm8ubwogCiBDRkxBR1NfdnN5c2NhbGwubwkJOj0gJChQUk9GSUxJTkcpIC1nMAogCit0aGVybV90aHJvdC15ICAgICAgICAgICAgICAgICAgICs9IC4uLy4uL2kzODYva2VybmVsL2NwdS9tY2hlY2svdGhlcm1fdGhyb3QubwogYm9vdGZsYWcteQkJCSs9IC4uLy4uL2kzODYva2VybmVsL2Jvb3RmbGFnLm8KIGNwdWlkLSQoc3Vic3QgbSx5LCQoQ09ORklHX1g4Nl9DUFVJRCkpICArPSAuLi8uLi9pMzg2L2tlcm5lbC9jcHVpZC5vCiB0b3BvbG9neS15ICAgICAgICAgICAgICAgICAgICAgKz0gLi4vLi4vaTM4Ni9rZXJuZWwvdG9wb2xvZ3kubwpAQCAtNTQsNCArNTYsMyBAQAogaTgyMzcteQkJCQkrPSAuLi8uLi9pMzg2L2tlcm5lbC9pODIzNy5vCiBtc3ItJChzdWJzdCBtLHksJChDT05GSUdfWDg2X01TUikpICArPSAuLi8uLi9pMzg2L2tlcm5lbC9tc3IubwogYWx0ZXJuYXRpdmUteQkJCSs9IC4uLy4uL2kzODYva2VybmVsL2FsdGVybmF0aXZlLm8KLQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2FwZXJ0dXJlLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXBlcnR1cmUuYwppbmRleCA1OGFmOGU3Li5iNDg3Mzk2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYXBlcnR1cmUuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXBlcnR1cmUuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxhc20vZTgyMC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9wcm90by5oPgpAQCAtMzMsNiArMzQsMTggQEAKIAogaW50IGZpeF9hcGVydHVyZSBfX2luaXRkYXRhID0gMTsKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBnYXJ0X3Jlc291cmNlID0geworCS5uYW1lCT0gIkdBUlQiLAorCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHZvaWQgX19pbml0IGluc2VydF9hcGVydHVyZV9yZXNvdXJjZSh1MzIgYXBlcl9iYXNlLCB1MzIgYXBlcl9zaXplKQoreworCWdhcnRfcmVzb3VyY2Uuc3RhcnQgPSBhcGVyX2Jhc2U7CisJZ2FydF9yZXNvdXJjZS5lbmQgPSBhcGVyX2Jhc2UgKyBhcGVyX3NpemUgLSAxOworCWluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZnYXJ0X3Jlc291cmNlKTsKK30KKwogLyogVGhpcyBjb2RlIHJ1bnMgYmVmb3JlIHRoZSBQQ0kgc3Vic3lzdGVtIGlzIGluaXRpYWxpemVkLCBzbyBqdXN0CiAgICBhY2Nlc3MgdGhlIG5vcnRoYnJpZGdlIGRpcmVjdGx5LiAqLwogCkBAIC00OCw3ICs2MSw3IEBACiAKIAkvKiAKIAkgKiBBcGVydHVyZSBoYXMgdG8gYmUgbmF0dXJhbGx5IGFsaWduZWQuIFRoaXMgbWVhbnMgYW4gMkdCIGFwZXJ0dXJlIHdvbid0Ci0JICogaGF2ZSBtdWNoIGNoYW5jZXMgdG8gZmluZCBhIHBsYWNlIGluIHRoZSBsb3dlciA0R0Igb2YgbWVtb3J5LgorCSAqIGhhdmUgbXVjaCBjaGFuY2Ugb2YgZmluZGluZyBhIHBsYWNlIGluIHRoZSBsb3dlciA0R0Igb2YgbWVtb3J5LgogCSAqIFVuZm9ydHVuYXRlbHkgd2UgY2Fubm90IG1vdmUgaXQgdXAgYmVjYXVzZSB0aGF0IHdvdWxkIG1ha2UgdGhlCiAJICogSU9NTVUgdXNlbGVzcy4KIAkgKi8KQEAgLTYyLDYgKzc1LDcgQEAKIAl9CiAJcHJpbnRrKCJNYXBwaW5nIGFwZXJ0dXJlIG92ZXIgJWQgS0Igb2YgUkFNIEAgJWx4XG4iLAogCSAgICAgICBhcGVyX3NpemUgPj4gMTAsIF9fcGEocCkpOyAKKwlpbnNlcnRfYXBlcnR1cmVfcmVzb3VyY2UoKHUzMilfX3BhKHApLCBhcGVyX3NpemUpOwogCXJldHVybiAodTMyKV9fcGEocCk7IAogfQogCkBAIC0xOTgsNyArMjEyLDcgQEAKIAl1NjQgYXBlcl9iYXNlLCBsYXN0X2FwZXJfYmFzZSA9IDA7CiAJaW50IHZhbGlkX2FncCA9IDA7CiAKLQlpZiAoaW9tbXVfYXBlcnR1cmVfZGlzYWJsZWQgfHwgIWZpeF9hcGVydHVyZSkKKwlpZiAoaW9tbXVfYXBlcnR1cmVfZGlzYWJsZWQgfHwgIWZpeF9hcGVydHVyZSB8fCAhZWFybHlfcGNpX2FsbG93ZWQoKSkKIAkJcmV0dXJuOwogCiAJcHJpbnRrKCJDaGVja2luZyBhcGVydHVyZS4uLlxuIik7IApAQCAtMjMzLDggKzI0NywxMyBAQAogCQlsYXN0X2FwZXJfYmFzZSA9IGFwZXJfYmFzZTsKIAl9IAogCi0JaWYgKCFmaXggJiYgIWZhbGxiYWNrX2FwZXJfZm9yY2UpIAorCWlmICghZml4ICYmICFmYWxsYmFja19hcGVyX2ZvcmNlKSB7CisJCWlmIChsYXN0X2FwZXJfYmFzZSkgeworCQkJdW5zaWduZWQgbG9uZyBuID0gKDMyICogMTAyNCAqIDEwMjQpIDw8IGxhc3RfYXBlcl9vcmRlcjsKKwkJCWluc2VydF9hcGVydHVyZV9yZXNvdXJjZSgodTMyKWxhc3RfYXBlcl9iYXNlLCBuKTsKKwkJfQogCQlyZXR1cm47IAorCX0KIAogCWlmICghZmFsbGJhY2tfYXBlcl9mb3JjZSkKIAkJYXBlcl9hbGxvYyA9IHNlYXJjaF9hZ3BfYnJpZGdlKCZhcGVyX29yZGVyLCAmdmFsaWRfYWdwKTsgCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvYXBpYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL2FwaWMuYwppbmRleCAyYjhjZWYwLi4xMzVmZjI1IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYXBpYy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hcGljLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KQEAgLTM2LDEzICszNywyMCBAQAogI2luY2x1ZGUgPGFzbS9pZGxlLmg+CiAjaW5jbHVkZSA8YXNtL3Byb3RvLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KIAoraW50IGFwaWNfbWFwcGVkOwogaW50IGFwaWNfdmVyYm9zaXR5OwogaW50IGFwaWNfcnVuc19tYWluX3RpbWVyOwogaW50IGFwaWNfY2FsaWJyYXRlX3BtdG1yIF9faW5pdGRhdGE7CiAKIGludCBkaXNhYmxlX2FwaWNfdGltZXIgX19pbml0ZGF0YTsKIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBsYXBpY19yZXNvdXJjZSA9IHsKKwkubmFtZSA9ICJMb2NhbCBBUElDIiwKKwkuZmxhZ3MgPSBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWSwKK307CisKIC8qCiAgKiBjcHVfbWFzayB0aGF0IGRlbm90ZXMgdGhlIENQVXMgdGhhdCBuZWVkcyB0aW1lciBpbnRlcnJ1cHQgY29taW5nIGluIGFzCiAgKiBJUElzIGluIHBsYWNlIG9mIGxvY2FsIEFQSUMgdGltZXJzCkBAIC0xMzYsNzIgKzE0NCw0MCBAQAogCWFwaWNfcmVhZChBUElDX0VTUik7CiB9CiAKLXZvaWQgX19pbml0IGNvbm5lY3RfYnNwX0FQSUModm9pZCkKLXsKLQlpZiAocGljX21vZGUpIHsKLQkJLyoKLQkJICogRG8gbm90IHRydXN0IHRoZSBsb2NhbCBBUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cC4KLQkJICovCi0JCWNsZWFyX2xvY2FsX0FQSUMoKTsKLQkJLyoKLQkJICogUElDIG1vZGUsIGVuYWJsZSBBUElDIG1vZGUgaW4gdGhlIElNQ1IsIGkuZS4KLQkJICogY29ubmVjdCBCU1AncyBsb2NhbCBBUElDIHRvIElOVCBhbmQgTk1JIGxpbmVzLgotCQkgKi8KLQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAibGVhdmluZyBQSUMgbW9kZSwgZW5hYmxpbmcgQVBJQyBtb2RlLlxuIik7Ci0JCW91dGIoMHg3MCwgMHgyMik7Ci0JCW91dGIoMHgwMSwgMHgyMyk7Ci0JfQotfQotCiB2b2lkIGRpc2Nvbm5lY3RfYnNwX0FQSUMoaW50IHZpcnRfd2lyZV9zZXR1cCkKIHsKLQlpZiAocGljX21vZGUpIHsKLQkJLyoKLQkJICogUHV0IHRoZSBib2FyZCBiYWNrIGludG8gUElDIG1vZGUgKGhhcyBhbiBlZmZlY3QKLQkJICogb25seSBvbiBjZXJ0YWluIG9sZGVyIGJvYXJkcykuICBOb3RlIHRoYXQgQVBJQwotCQkgKiBpbnRlcnJ1cHRzLCBpbmNsdWRpbmcgSVBJcywgd29uJ3Qgd29yayBiZXlvbmQKLQkJICogdGhpcyBwb2ludCEgIFRoZSBvbmx5IGV4Y2VwdGlvbiBhcmUgSU5JVCBJUElzLgotCQkgKi8KLQkJYXBpY19wcmludGsoQVBJQ19RVUlFVCwgImRpc2FibGluZyBBUElDIG1vZGUsIGVudGVyaW5nIFBJQyBtb2RlLlxuIik7Ci0JCW91dGIoMHg3MCwgMHgyMik7Ci0JCW91dGIoMHgwMCwgMHgyMyk7CisJLyogR28gYmFjayB0byBWaXJ0dWFsIFdpcmUgY29tcGF0aWJpbGl0eSBtb2RlICovCisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCS8qIEZvciB0aGUgc3B1cmlvdXMgaW50ZXJydXB0IHVzZSB2ZWN0b3IgRiwgYW5kIGVuYWJsZSBpdCAqLworCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfU1BJVik7CisJdmFsdWUgJj0gfkFQSUNfVkVDVE9SX01BU0s7CisJdmFsdWUgfD0gQVBJQ19TUElWX0FQSUNfRU5BQkxFRDsKKwl2YWx1ZSB8PSAweGY7CisJYXBpY193cml0ZShBUElDX1NQSVYsIHZhbHVlKTsKKworCWlmICghdmlydF93aXJlX3NldHVwKSB7CisJCS8qIEZvciBMVlQwIG1ha2UgaXQgZWRnZSB0cmlnZ2VyZWQsIGFjdGl2ZSBoaWdoLCBleHRlcm5hbCBhbmQgZW5hYmxlZCAqLworCQl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWVDApOworCQl2YWx1ZSAmPSB+KEFQSUNfTU9ERV9NQVNLIHwgQVBJQ19TRU5EX1BFTkRJTkcgfAorCQkJQVBJQ19JTlBVVF9QT0xBUklUWSB8IEFQSUNfTFZUX1JFTU9URV9JUlIgfAorCQkJQVBJQ19MVlRfTEVWRUxfVFJJR0dFUiB8IEFQSUNfTFZUX01BU0tFRCApOworCQl2YWx1ZSB8PSBBUElDX0xWVF9SRU1PVEVfSVJSIHwgQVBJQ19TRU5EX1BFTkRJTkc7CisJCXZhbHVlID0gU0VUX0FQSUNfREVMSVZFUllfTU9ERSh2YWx1ZSwgQVBJQ19NT0RFX0VYVElOVCk7CisJCWFwaWNfd3JpdGUoQVBJQ19MVlQwLCB2YWx1ZSk7CisJfSBlbHNlIHsKKwkJLyogRGlzYWJsZSBMVlQwICovCisJCWFwaWNfd3JpdGUoQVBJQ19MVlQwLCBBUElDX0xWVF9NQVNLRUQpOwogCX0KLQllbHNlIHsKLQkJLyogR28gYmFjayB0byBWaXJ0dWFsIFdpcmUgY29tcGF0aWJpbGl0eSBtb2RlICovCi0JCXVuc2lnbmVkIGxvbmcgdmFsdWU7CiAKLQkJLyogRm9yIHRoZSBzcHVyaW91cyBpbnRlcnJ1cHQgdXNlIHZlY3RvciBGLCBhbmQgZW5hYmxlIGl0ICovCi0JCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfU1BJVik7Ci0JCXZhbHVlICY9IH5BUElDX1ZFQ1RPUl9NQVNLOwotCQl2YWx1ZSB8PSBBUElDX1NQSVZfQVBJQ19FTkFCTEVEOwotCQl2YWx1ZSB8PSAweGY7Ci0JCWFwaWNfd3JpdGUoQVBJQ19TUElWLCB2YWx1ZSk7Ci0KLQkJaWYgKCF2aXJ0X3dpcmVfc2V0dXApIHsKLQkJCS8qIEZvciBMVlQwIG1ha2UgaXQgZWRnZSB0cmlnZ2VyZWQsIGFjdGl2ZSBoaWdoLCBleHRlcm5hbCBhbmQgZW5hYmxlZCAqLwotCQkJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlQwKTsKLQkJCXZhbHVlICY9IH4oQVBJQ19NT0RFX01BU0sgfCBBUElDX1NFTkRfUEVORElORyB8Ci0JCQkJQVBJQ19JTlBVVF9QT0xBUklUWSB8IEFQSUNfTFZUX1JFTU9URV9JUlIgfAotCQkJCUFQSUNfTFZUX0xFVkVMX1RSSUdHRVIgfCBBUElDX0xWVF9NQVNLRUQgKTsKLQkJCXZhbHVlIHw9IEFQSUNfTFZUX1JFTU9URV9JUlIgfCBBUElDX1NFTkRfUEVORElORzsKLQkJCXZhbHVlID0gU0VUX0FQSUNfREVMSVZFUllfTU9ERSh2YWx1ZSwgQVBJQ19NT0RFX0VYVElOVCk7Ci0JCQlhcGljX3dyaXRlKEFQSUNfTFZUMCwgdmFsdWUpOwotCQl9Ci0JCWVsc2UgewotCQkJLyogRGlzYWJsZSBMVlQwICovCi0JCQlhcGljX3dyaXRlKEFQSUNfTFZUMCwgQVBJQ19MVlRfTUFTS0VEKTsKLQkJfQotCi0JCS8qIEZvciBMVlQxIG1ha2UgaXQgZWRnZSB0cmlnZ2VyZWQsIGFjdGl2ZSBoaWdoLCBubWkgYW5kIGVuYWJsZWQgKi8KLQkJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlQxKTsKLQkJdmFsdWUgJj0gfigKLQkJCUFQSUNfTU9ERV9NQVNLIHwgQVBJQ19TRU5EX1BFTkRJTkcgfAorCS8qIEZvciBMVlQxIG1ha2UgaXQgZWRnZSB0cmlnZ2VyZWQsIGFjdGl2ZSBoaWdoLCBubWkgYW5kIGVuYWJsZWQgKi8KKwl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWVDEpOworCXZhbHVlICY9IH4oQVBJQ19NT0RFX01BU0sgfCBBUElDX1NFTkRfUEVORElORyB8CiAJCQlBUElDX0lOUFVUX1BPTEFSSVRZIHwgQVBJQ19MVlRfUkVNT1RFX0lSUiB8CiAJCQlBUElDX0xWVF9MRVZFTF9UUklHR0VSIHwgQVBJQ19MVlRfTUFTS0VEKTsKLQkJdmFsdWUgfD0gQVBJQ19MVlRfUkVNT1RFX0lSUiB8IEFQSUNfU0VORF9QRU5ESU5HOwotCQl2YWx1ZSA9IFNFVF9BUElDX0RFTElWRVJZX01PREUodmFsdWUsIEFQSUNfTU9ERV9OTUkpOwotCQlhcGljX3dyaXRlKEFQSUNfTFZUMSwgdmFsdWUpOwotCX0KKwl2YWx1ZSB8PSBBUElDX0xWVF9SRU1PVEVfSVJSIHwgQVBJQ19TRU5EX1BFTkRJTkc7CisJdmFsdWUgPSBTRVRfQVBJQ19ERUxJVkVSWV9NT0RFKHZhbHVlLCBBUElDX01PREVfTk1JKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUMSwgdmFsdWUpOwogfQogCiB2b2lkIGRpc2FibGVfbG9jYWxfQVBJQyh2b2lkKQpAQCAtMjk3LDggKzI3Myw2IEBACiAJCQkJfCBBUElDX0RNX0lOSVQpOwogfQogCi1leHRlcm4gdm9pZCBfX2Vycm9yX2luX2FwaWNfYyAodm9pZCk7Ci0KIC8qCiAgKiBBbiBpbml0aWFsIHNldHVwIG9mIHRoZSB2aXJ0dWFsIHdpcmUgbW9kZS4KICAqLwpAQCAtMzQ1LDggKzMxOSw3IEBACiAKIAl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWUik7CiAKLQlpZiAoKFNQVVJJT1VTX0FQSUNfVkVDVE9SICYgMHgwZikgIT0gMHgwZikKLQkJX19lcnJvcl9pbl9hcGljX2MoKTsKKwlCVUlMRF9CVUdfT04oKFNQVVJJT1VTX0FQSUNfVkVDVE9SICYgMHgwZikgIT0gMHgwZik7CiAKIAkvKgogCSAqIERvdWJsZS1jaGVjayB3aGV0aGVyIHRoaXMgQVBJQyBpcyByZWFsbHkgcmVnaXN0ZXJlZC4KQEAgLTM5OSwzMiArMzcyLDggQEAKIAkgKi8KIAl2YWx1ZSB8PSBBUElDX1NQSVZfQVBJQ19FTkFCTEVEOwogCi0JLyoKLQkgKiBTb21lIHVua25vd24gSW50ZWwgSU8vQVBJQyAob3IgQVBJQykgZXJyYXRhIGlzIGJpdGluZyB1cyB3aXRoCi0JICogY2VydGFpbiBuZXR3b3JraW5nIGNhcmRzLiBJZiBoaWdoIGZyZXF1ZW5jeSBpbnRlcnJ1cHRzIGFyZQotCSAqIGhhcHBlbmluZyBvbiBhIHBhcnRpY3VsYXIgSU9BUElDIHBpbiwgcGx1cyB0aGUgSU9BUElDIHJvdXRpbmcKLQkgKiBlbnRyeSBpcyBtYXNrZWQvdW5tYXNrZWQgYXQgYSBoaWdoIHJhdGUgYXMgd2VsbCB0aGVuIHNvb25lciBvcgotCSAqIGxhdGVyIElPQVBJQyBsaW5lIGdldHMgJ3N0dWNrJywgbm8gbW9yZSBpbnRlcnJ1cHRzIGFyZSByZWNlaXZlZAotCSAqIGZyb20gdGhlIGRldmljZS4gSWYgZm9jdXMgQ1BVIGlzIGRpc2FibGVkIHRoZW4gdGhlIGhhbmcgZ29lcwotCSAqIGF3YXksIG9oIHdlbGwgOi0oCi0JICoKLQkgKiBbIFRoaXMgYnVnIGNhbiBiZSByZXByb2R1Y2VkIGVhc2lseSB3aXRoIGEgbGV2ZWwtdHJpZ2dlcmVkCi0JICogICBQQ0kgTmUyMDAwIG5ldHdvcmtpbmcgY2FyZHMgYW5kIFBJSS9QSUlJIHByb2Nlc3NvcnMsIGR1YWwKLQkgKiAgIEJYIGNoaXBzZXQuIF0KLQkgKi8KLQkvKgotCSAqIEFjdHVhbGx5IGRpc2FibGluZyB0aGUgZm9jdXMgQ1BVIGNoZWNrIGp1c3QgbWFrZXMgdGhlIGhhbmcgbGVzcwotCSAqIGZyZXF1ZW50IGFzIGl0IG1ha2VzIHRoZSBpbnRlcnJ1cHQgZGlzdHJpYnV0b24gbW9kZWwgYmUgbW9yZQotCSAqIGxpa2UgTFJVIHRoYW4gTVJVICh0aGUgc2hvcnQtdGVybSBsb2FkIGlzIG1vcmUgZXZlbiBhY3Jvc3MgQ1BVcykuCi0JICogU2VlIGFsc28gdGhlIGNvbW1lbnQgaW4gZW5kX2xldmVsX2lvYXBpY19pcnEoKS4gIC0tbWFjcm8KLQkgKi8KLSNpZiAxCi0JLyogRW5hYmxlIGZvY3VzIHByb2Nlc3NvciAoYml0PT0wKSAqLwotCXZhbHVlICY9IH5BUElDX1NQSVZfRk9DVVNfRElTQUJMRUQ7Ci0jZWxzZQotCS8qIERpc2FibGUgZm9jdXMgcHJvY2Vzc29yIChiaXQ9PTEpICovCi0JdmFsdWUgfD0gQVBJQ19TUElWX0ZPQ1VTX0RJU0FCTEVEOwotI2VuZGlmCisJLyogV2UgYWx3YXlzIHVzZSBwcm9jZXNzb3IgZm9jdXMgKi8KKwogCS8qCiAJICogU2V0IHNwdXJpb3VzIElSUSB2ZWN0b3IKIAkgKi8KQEAgLTQ0Miw3ICszOTEsNyBAQAogCSAqIFRPRE86IHNldCB1cCB0aHJvdWdoLWxvY2FsLUFQSUMgZnJvbSB0aHJvdWdoLUkvTy1BUElDPyAtLW1hY3JvCiAJICovCiAJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlQwKSAmIEFQSUNfTFZUX01BU0tFRDsKLQlpZiAoIXNtcF9wcm9jZXNzb3JfaWQoKSAmJiAocGljX21vZGUgfHwgIXZhbHVlKSkgeworCWlmICghc21wX3Byb2Nlc3Nvcl9pZCgpICYmICF2YWx1ZSkgewogCQl2YWx1ZSA9IEFQSUNfRE1fRVhUSU5UOwogCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJlbmFibGVkIEV4dElOVCBvbiBDUFUjJWRcbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJfSBlbHNlIHsKQEAgLTQ3OSw4ICs0MjgsNyBAQAogCX0KIAogCW5taV93YXRjaGRvZ19kZWZhdWx0KCk7Ci0JaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfTE9DQUxfQVBJQykKLQkJc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2coKTsKKwlzZXR1cF9hcGljX25taV93YXRjaGRvZyhOVUxMKTsKIAlhcGljX3BtX2FjdGl2YXRlKCk7CiB9CiAKQEAgLTUyNyw4ICs0NzUsNyBAQAogCWFwaWNfcG1fc3RhdGUuYXBpY190bWljdCA9IGFwaWNfcmVhZChBUElDX1RNSUNUKTsKIAlhcGljX3BtX3N0YXRlLmFwaWNfdGRjciA9IGFwaWNfcmVhZChBUElDX1REQ1IpOwogCWFwaWNfcG1fc3RhdGUuYXBpY190aG1yID0gYXBpY19yZWFkKEFQSUNfTFZUVEhNUik7Ci0JbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7Ci0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJZGlzYWJsZV9sb2NhbF9BUElDKCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCXJldHVybiAwOwpAQCAtNjA2LDE4ICs1NTMsMjQgQEAKIAogc3RhdGljIGludCBfX2luaXQgYXBpY19zZXRfdmVyYm9zaXR5KGNoYXIgKnN0cikKIHsKKwlpZiAoc3RyID09IE5VTEwpICB7CisJCXNraXBfaW9hcGljX3NldHVwID0gMDsKKwkJaW9hcGljX2ZvcmNlID0gMTsKKwkJcmV0dXJuIDA7CisJfQogCWlmIChzdHJjbXAoImRlYnVnIiwgc3RyKSA9PSAwKQogCQlhcGljX3ZlcmJvc2l0eSA9IEFQSUNfREVCVUc7CiAJZWxzZSBpZiAoc3RyY21wKCJ2ZXJib3NlIiwgc3RyKSA9PSAwKQogCQlhcGljX3ZlcmJvc2l0eSA9IEFQSUNfVkVSQk9TRTsKLQllbHNlCisJZWxzZSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFQSUMgVmVyYm9zaXR5IGxldmVsICVzIG5vdCByZWNvZ25pc2VkIgotCQkJCSIgdXNlIGFwaWM9dmVyYm9zZSBvciBhcGljPWRlYnVnIiwgc3RyKTsKKwkJCQkiIHVzZSBhcGljPXZlcmJvc2Ugb3IgYXBpYz1kZWJ1Z1xuIiwgc3RyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9Ci0KLV9fc2V0dXAoImFwaWM9IiwgYXBpY19zZXRfdmVyYm9zaXR5KTsKK2Vhcmx5X3BhcmFtKCJhcGljIiwgYXBpY19zZXRfdmVyYm9zaXR5KTsKIAogLyoKICAqIERldGVjdCBhbmQgZW5hYmxlIGxvY2FsIEFQSUNzIG9uIG5vbi1TTVAgYm9hcmRzLgpAQCAtNjM4LDYgKzU5MSw0MCBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCitzdGF0aWMgc3RydWN0IHJlc291cmNlICogX19pbml0IGlvYXBpY19zZXR1cF9yZXNvdXJjZXModm9pZCkKK3sKKyNkZWZpbmUgSU9BUElDX1JFU09VUkNFX05BTUVfU0laRSAxMQorCXVuc2lnbmVkIGxvbmcgbjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwljaGFyICptZW07CisJaW50IGk7CisKKwlpZiAobnJfaW9hcGljcyA8PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCW4gPSBJT0FQSUNfUkVTT1VSQ0VfTkFNRV9TSVpFICsgc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSk7CisJbiAqPSBucl9pb2FwaWNzOworCisJcmVzID0gYWxsb2NfYm9vdG1lbShuKTsKKworCWlmICghcmVzKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChyZXMsIDAsIG4pOworCW1lbSA9ICh2b2lkICopJnJlc1tucl9pb2FwaWNzXTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNzOyBpKyspIHsKKwkJcmVzW2ldLm5hbWUgPSBtZW07CisJCXJlc1tpXS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9CVVNZOworCQlzbnByaW50ZihtZW0sIElPQVBJQ19SRVNPVVJDRV9OQU1FX1NJWkUsICJJT0FQSUMgJXUiLCBpKTsKKwkJbWVtICs9IElPQVBJQ19SRVNPVVJDRV9OQU1FX1NJWkU7CisJfQorCisJcmV0dXJuIHJlczsKK30KKyNlbmRpZgorCiB2b2lkIF9faW5pdCBpbml0X2FwaWNfbWFwcGluZ3Modm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGFwaWNfcGh5czsKQEAgLTY1NCwxOSArNjQxLDI2IEBACiAJCWFwaWNfcGh5cyA9IG1wX2xhcGljX2FkZHI7CiAKIAlzZXRfZml4bWFwX25vY2FjaGUoRklYX0FQSUNfQkFTRSwgYXBpY19waHlzKTsKKwlhcGljX21hcHBlZCA9IDE7CiAJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCJtYXBwZWQgQVBJQyB0byAlMTZseCAoJTE2bHgpXG4iLCBBUElDX0JBU0UsIGFwaWNfcGh5cyk7CiAKKwkvKiBQdXQgbG9jYWwgQVBJQyBpbnRvIHRoZSByZXNvdXJjZSBtYXAuICovCisJbGFwaWNfcmVzb3VyY2Uuc3RhcnQgPSBhcGljX3BoeXM7CisJbGFwaWNfcmVzb3VyY2UuZW5kID0gbGFwaWNfcmVzb3VyY2Uuc3RhcnQgKyBQQUdFX1NJWkUgLSAxOworCWluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsICZsYXBpY19yZXNvdXJjZSk7CisKIAkvKgogCSAqIEZldGNoIHRoZSBBUElDIElEIG9mIHRoZSBCU1AgaW4gY2FzZSB3ZSBoYXZlIGEKIAkgKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKG9yIHRoZSBNUCB0YWJsZSBpcyBicm9rZW4pLgogCSAqLwogCWJvb3RfY3B1X2lkID0gR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKTsKIAotI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogCXsKIAkJdW5zaWduZWQgbG9uZyBpb2FwaWNfcGh5cywgaWR4ID0gRklYX0lPX0FQSUNfQkFTRV8wOwogCQlpbnQgaTsKKwkJc3RydWN0IHJlc291cmNlICppb2FwaWNfcmVzOwogCisJCWlvYXBpY19yZXMgPSBpb2FwaWNfc2V0dXBfcmVzb3VyY2VzKCk7CiAJCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNzOyBpKyspIHsKIAkJCWlmIChzbXBfZm91bmRfY29uZmlnKSB7CiAJCQkJaW9hcGljX3BoeXMgPSBtcF9pb2FwaWNzW2ldLm1wY19hcGljYWRkcjsKQEAgLTY3OCw5ICs2NzIsMTUgQEAKIAkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwibWFwcGVkIElPQVBJQyB0byAlMDE2bHggKCUwMTZseClcbiIsCiAJCQkJCV9fZml4X3RvX3ZpcnQoaWR4KSwgaW9hcGljX3BoeXMpOwogCQkJaWR4Kys7CisKKwkJCWlmIChpb2FwaWNfcmVzKSB7CisJCQkJaW9hcGljX3Jlcy0+c3RhcnQgPSBpb2FwaWNfcGh5czsKKwkJCQlpb2FwaWNfcmVzLT5lbmQgPSBpb2FwaWNfcGh5cyArICg0ICogMTAyNCkgLSAxOworCQkJCWluc2VydF9yZXNvdXJjZSgmaW9tZW1fcmVzb3VyY2UsIGlvYXBpY19yZXMpOworCQkJCWlvYXBpY19yZXMrKzsKKwkJCX0KIAkJfQogCX0KLSNlbmRpZgogfQogCiAvKgpAQCAtOTUxLDcgKzk1MSw3IEBACiAJICogV2UgdGFrZSB0aGUgJ2xvbmcnIHJldHVybiBwYXRoLCBhbmQgdGhlcmUgZXZlcnkgc3Vic3lzdGVtCiAJICogZ3JhYnMgdGhlIGFwcHJvcHJpYXRlIGxvY2tzIChrZXJuZWwgbG9jay8gaXJxIGxvY2spLgogCSAqCi0JICogd2UgbWlnaHQgd2FudCB0byBkZWNvdXBsZSBwcm9maWxpbmcgZnJvbSB0aGUgJ2xvbmcgcGF0aCcsCisJICogV2UgbWlnaHQgd2FudCB0byBkZWNvdXBsZSBwcm9maWxpbmcgZnJvbSB0aGUgJ2xvbmcgcGF0aCcsCiAJICogYW5kIGRvIHRoZSBwcm9maWxpbmcgdG90YWxseSBpbiBhc3NlbWJseS4KIAkgKgogCSAqIEN1cnJlbnRseSB0aGlzIGlzbid0IHRvbyBtdWNoIG9mIGFuIGlzc3VlIChwZXJmb3JtYW5jZSB3aXNlKSwKQEAgLTExMjMsMTkgKzExMjMsMTUgQEAKIAogCXZlcmlmeV9sb2NhbF9BUElDKCk7CiAKLQljb25uZWN0X2JzcF9BUElDKCk7Ci0KIAlwaHlzX2NwdV9wcmVzZW50X21hcCA9IHBoeXNpZF9tYXNrX29mX3BoeXNpZChib290X2NwdV9pZCk7CiAJYXBpY193cml0ZShBUElDX0lELCBTRVRfQVBJQ19JRChib290X2NwdV9pZCkpOwogCiAJc2V0dXBfbG9jYWxfQVBJQygpOwogCi0jaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCiAJaWYgKHNtcF9mb3VuZF9jb25maWcgJiYgIXNraXBfaW9hcGljX3NldHVwICYmIG5yX2lvYXBpY3MpCi0JCQlzZXR1cF9JT19BUElDKCk7CisJCXNldHVwX0lPX0FQSUMoKTsKIAllbHNlCiAJCW5yX2lvYXBpY3MgPSAwOwotI2VuZGlmCiAJc2V0dXBfYm9vdF9BUElDX2Nsb2NrKCk7CiAJY2hlY2tfbm1pX3dhdGNoZG9nKCk7CiAJcmV0dXJuIDA7CkBAIC0xMTQ0LDE0ICsxMTQwLDE3IEBACiBzdGF0aWMgX19pbml0IGludCBzZXR1cF9kaXNhYmxlYXBpYyhjaGFyICpzdHIpIAogeyAKIAlkaXNhYmxlX2FwaWMgPSAxOwotCXJldHVybiAxOwotfSAKKwljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfQVBJQywgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgiZGlzYWJsZWFwaWMiLCBzZXR1cF9kaXNhYmxlYXBpYyk7CiAKKy8qIHNhbWUgYXMgZGlzYWJsZWFwaWMsIGZvciBjb21wYXRpYmlsaXR5ICovCiBzdGF0aWMgX19pbml0IGludCBzZXR1cF9ub2xhcGljKGNoYXIgKnN0cikgCiB7IAotCWRpc2FibGVfYXBpYyA9IDE7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIHNldHVwX2Rpc2FibGVhcGljKHN0cik7CiB9IAorZWFybHlfcGFyYW0oIm5vbGFwaWMiLCBzZXR1cF9ub2xhcGljKTsKIAogc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfbm9hcGljdGltZXIoY2hhciAqc3RyKSAKIHsgCkBAIC0xMTg0LDExICsxMTgzLDUgQEAKIH0KIF9fc2V0dXAoImFwaWNwbXRpbWVyIiwgc2V0dXBfYXBpY3BtdGltZXIpOwogCi0vKiBkdW1teSBwYXJzaW5nOiBzZWUgc2V0dXAuYyAqLwotCi1fX3NldHVwKCJkaXNhYmxlYXBpYyIsIHNldHVwX2Rpc2FibGVhcGljKTsgCi1fX3NldHVwKCJub2xhcGljIiwgc2V0dXBfbm9sYXBpYyk7ICAvKiBzYW1lIGFzIGRpc2FibGVhcGljLCBmb3IgY29tcGF0aWJpbGl0eSAqLwotCiBfX3NldHVwKCJub2FwaWN0aW1lciIsIHNldHVwX25vYXBpY3RpbWVyKTsgCiAKLS8qIG5vICJsYXBpYyIgZmxhZyAtIHdlIG9ubHkgdXNlIHRoZSBsYXBpYyB3aGVuIHRoZSBCSU9TIHRlbGxzIHVzIHNvLiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2NyYXNoLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvY3Jhc2guYwppbmRleCBkOGQ1NzUwLi4zNTI1Zjg4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvY3Jhc2guYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvY3Jhc2guYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGFzbS9ubWkuaD4KICNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hfYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9rZGVidWcuaD4KIAogLyogVGhpcyBrZWVwcyBhIHRyYWNrIG9mIHdoaWNoIG9uZSBpcyBjcmFzaGluZyBjcHUuICovCiBzdGF0aWMgaW50IGNyYXNoaW5nX2NwdTsKQEAgLTY4LDcgKzY5LDcgQEAKIAkgKiBmb3IgdGhlIGRhdGEgSSBwYXNzLCBhbmQgSSBuZWVkIHRhZ3MKIAkgKiBvbiB0aGUgZGF0YSB0byBpbmRpY2F0ZSB3aGF0IGluZm9ybWF0aW9uIEkgaGF2ZQogCSAqIHNxdWlycmVsbGVkIGF3YXkuICBFTEYgbm90ZXMgaGFwcGVuIHRvIHByb3ZpZGUKLQkgKiBhbGwgb2YgdGhhdCB0aGF0IG5vIG5lZWQgdG8gaW52ZW50IHNvbWV0aGluZyBuZXcuCisJICogYWxsIG9mIHRoYXQsIG5vIG5lZWQgdG8gaW52ZW50IHNvbWV0aGluZyBuZXcuCiAJICovCiAKIAlidWYgPSAodTMyKilwZXJfY3B1X3B0cihjcmFzaF9ub3RlcywgY3B1KTsKQEAgLTk1LDE1ICs5NiwyNSBAQAogI2lmZGVmIENPTkZJR19TTVAKIHN0YXRpYyBhdG9taWNfdCB3YWl0aW5nX2Zvcl9jcmFzaF9pcGk7CiAKLXN0YXRpYyBpbnQgY3Jhc2hfbm1pX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1KQorc3RhdGljIGludCBjcmFzaF9ubWlfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCXVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICpkYXRhKQogeworCXN0cnVjdCBwdF9yZWdzICpyZWdzOworCWludCBjcHU7CisKKwlpZiAodmFsICE9IERJRV9OTUlfSVBJKQorCQlyZXR1cm4gTk9USUZZX09LOworCisJcmVncyA9ICgoc3RydWN0IGRpZV9hcmdzICopZGF0YSktPnJlZ3M7CisJY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKwogCS8qCiAJICogRG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhpcyBoYW5kbGVyIGlzIGludm9rZWQgb24gY3Jhc2hpbmcgY3B1LgogCSAqIE90aGVyd2lzZSwgc3lzdGVtIHdpbGwgY29tcGxldGVseSBoYW5nLiBDcmFzaGluZyBjcHUgY2FuIGdldAogCSAqIGFuIE5NSSBpZiBzeXN0ZW0gd2FzIGluaXRpYWxseSBib290ZWQgd2l0aCBubWlfd2F0Y2hkb2cgcGFyYW1ldGVyLgogCSAqLwogCWlmIChjcHUgPT0gY3Jhc2hpbmdfY3B1KQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIE5PVElGWV9TVE9QOwogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKIAljcmFzaF9zYXZlX3RoaXNfY3B1KHJlZ3MsIGNwdSk7CkBAIC0xMjcsMTIgKzEzOCwxNyBAQAogICogY3B1IGhvdHBsdWcgc2hvdWxkbid0IG1hdHRlci4KICAqLwogCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNyYXNoX25taV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGNyYXNoX25taV9jYWxsYmFjaywKK307CisKIHN0YXRpYyB2b2lkIG5taV9zaG9vdGRvd25fY3B1cyh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgbXNlY3M7CiAKIAlhdG9taWNfc2V0KCZ3YWl0aW5nX2Zvcl9jcmFzaF9pcGksIG51bV9vbmxpbmVfY3B1cygpIC0gMSk7Ci0Jc2V0X25taV9jYWxsYmFjayhjcmFzaF9ubWlfY2FsbGJhY2spOworCWlmIChyZWdpc3Rlcl9kaWVfbm90aWZpZXIoJmNyYXNoX25taV9uYikpCisJCXJldHVybjsgICAgICAgICAvKiByZXR1cm4gd2hhdD8gKi8KIAogCS8qCiAJICogRW5zdXJlIHRoZSBuZXcgY2FsbGJhY2sgZnVuY3Rpb24gaXMgc2V0IGJlZm9yZSBzZW5kaW5nCkBAIC0xNzgsOSArMTk0LDcgQEAKIAlpZihjcHVfaGFzX2FwaWMpCiAJCSBkaXNhYmxlX2xvY2FsX0FQSUMoKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9JT19BUElDKQogCWRpc2FibGVfSU9fQVBJQygpOwotI2VuZGlmCiAKIAljcmFzaF9zYXZlX3NlbGYocmVncyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvZTgyMC5jIGIvYXJjaC94ODZfNjQva2VybmVsL2U4MjAuYwppbmRleCA3MDhhM2NkLi5iM2YwOTA4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvZTgyMC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lODIwLmMKQEAgLTI1LDYgKzI1LDggQEAKICNpbmNsdWRlIDxhc20vYm9vdHNldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAKK3N0cnVjdCBlODIwbWFwIGU4MjAgX19pbml0ZGF0YTsKKwogLyogCiAgKiBQRk4gb2YgbGFzdCBtZW1vcnkgcGFnZS4KICAqLwpAQCAtNDEsNyArNDMsNyBAQAogLyogCiAgKiBMYXN0IHBmbiB3aGljaCB0aGUgdXNlciB3YW50cyB0byB1c2UuCiAgKi8KLXVuc2lnbmVkIGxvbmcgZW5kX3VzZXJfcGZuID0gTUFYTUVNPj5QQUdFX1NISUZUOyAgCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIGVuZF91c2VyX3BmbiA9IE1BWE1FTT4+UEFHRV9TSElGVDsKIAogZXh0ZXJuIHN0cnVjdCByZXNvdXJjZSBjb2RlX3Jlc291cmNlLCBkYXRhX3Jlc291cmNlOwogCkBAIC03MCwxMiArNzIsNyBAQAogCQlyZXR1cm4gMTsKIAl9IAogI2VuZGlmCi0JLyoga2VybmVsIGNvZGUgKyA2NDBrIG1lbW9yeSBob2xlIChsYXRlciBzaG91bGQgbm90IGJlIG5lZWRlZCwgYnV0IAotCSAgIGJlIHBhcmFub2lkIGZvciBub3cpICovCi0JaWYgKGxhc3QgPj0gNjQwKjEwMjQgJiYgYWRkciA8IDEwMjQqMTAyNCkgewotCQkqYWRkcnAgPSAxMDI0KjEwMjQ7Ci0JCXJldHVybiAxOwotCX0KKwkvKiBrZXJuZWwgY29kZSAqLwogCWlmIChsYXN0ID49IF9fcGFfc3ltYm9sKCZfdGV4dCkgJiYgbGFzdCA8IF9fcGFfc3ltYm9sKCZfZW5kKSkgewogCQkqYWRkcnAgPSBfX3BhX3N5bWJvbCgmX2VuZCk7CiAJCXJldHVybiAxOwpAQCAtMTY1LDU5ICsxNjIsMTQgQEAKIAlyZXR1cm4gLTFVTDsJCQogfSAKIAotLyogCi0gKiBGcmVlIGJvb3RtZW0gYmFzZWQgb24gdGhlIGU4MjAgdGFibGUgZm9yIGEgbm9kZS4KLSAqLwotdm9pZCBfX2luaXQgZTgyMF9ib290bWVtX2ZyZWUocGdfZGF0YV90ICpwZ2RhdCwgdW5zaWduZWQgbG9uZyBzdGFydCx1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewotCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLm1hcFtpXTsgCi0JCXVuc2lnbmVkIGxvbmcgbGFzdCwgYWRkcjsKLQotCQlpZiAoZWktPnR5cGUgIT0gRTgyMF9SQU0gfHwgCi0JCSAgICBlaS0+YWRkcitlaS0+c2l6ZSA8PSBzdGFydCB8fCAKLQkJICAgIGVpLT5hZGRyID49IGVuZCkKLQkJCWNvbnRpbnVlOwotCi0JCWFkZHIgPSByb3VuZF91cChlaS0+YWRkciwgUEFHRV9TSVpFKTsKLQkJaWYgKGFkZHIgPCBzdGFydCkgCi0JCQlhZGRyID0gc3RhcnQ7Ci0KLQkJbGFzdCA9IHJvdW5kX2Rvd24oZWktPmFkZHIgKyBlaS0+c2l6ZSwgUEFHRV9TSVpFKTsgCi0JCWlmIChsYXN0ID49IGVuZCkKLQkJCWxhc3QgPSBlbmQ7IAotCi0JCWlmIChsYXN0ID4gYWRkciAmJiBsYXN0LWFkZHIgPj0gUEFHRV9TSVpFKQotCQkJZnJlZV9ib290bWVtX25vZGUocGdkYXQsIGFkZHIsIGxhc3QtYWRkcik7Ci0JfQotfQotCiAvKgogICogRmluZCB0aGUgaGlnaGVzdCBwYWdlIGZyYW1lIG51bWJlciB3ZSBoYXZlIGF2YWlsYWJsZQogICovCiB1bnNpZ25lZCBsb25nIF9faW5pdCBlODIwX2VuZF9vZl9yYW0odm9pZCkKIHsKLQlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGVuZF9wZm4gPSAwOworCWVuZF9wZm4gPSBmaW5kX21heF9wZm5fd2l0aF9hY3RpdmVfcmVnaW9ucygpOwogCQotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAubWFwW2ldOyAKLQkJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOwotCi0JCXN0YXJ0ID0gcm91bmRfdXAoZWktPmFkZHIsIFBBR0VfU0laRSk7IAotCQllbmQgPSByb3VuZF9kb3duKGVpLT5hZGRyICsgZWktPnNpemUsIFBBR0VfU0laRSk7IAotCQlpZiAoc3RhcnQgPj0gZW5kKQotCQkJY29udGludWU7Ci0JCWlmIChlaS0+dHlwZSA9PSBFODIwX1JBTSkgeyAKLQkJaWYgKGVuZCA+IGVuZF9wZm48PFBBR0VfU0hJRlQpCi0JCQllbmRfcGZuID0gZW5kPj5QQUdFX1NISUZUOwotCQl9IGVsc2UgeyAKLQkJCWlmIChlbmQgPiBlbmRfcGZuX21hcDw8UEFHRV9TSElGVCkgCi0JCQkJZW5kX3Bmbl9tYXAgPSBlbmQ+PlBBR0VfU0hJRlQ7Ci0JCX0gCi0JfQotCiAJaWYgKGVuZF9wZm4gPiBlbmRfcGZuX21hcCkgCiAJCWVuZF9wZm5fbWFwID0gZW5kX3BmbjsKIAlpZiAoZW5kX3Bmbl9tYXAgPiBNQVhNRU0+PlBBR0VfU0hJRlQpCkBAIC0yMjcsNDMgKzE3OSwxMCBAQAogCWlmIChlbmRfcGZuID4gZW5kX3Bmbl9tYXApIAogCQllbmRfcGZuID0gZW5kX3Bmbl9tYXA7IAogCisJcHJpbnRrKCJlbmRfcGZuX21hcCA9ICVsdVxuIiwgZW5kX3Bmbl9tYXApOwogCXJldHVybiBlbmRfcGZuOwkKIH0KIAotLyogCi0gKiBDb21wdXRlIGhvdyBtdWNoIG1lbW9yeSBpcyBtaXNzaW5nIGluIGEgcmFuZ2UuCi0gKiBVbmxpa2UgdGhlIG90aGVyIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgdGhlIGFyZ3VtZW50cyBhcmUgaW4gcGFnZSBudW1iZXJzLgotICovCi11bnNpZ25lZCBsb25nIF9faW5pdAotZTgyMF9ob2xlX3NpemUodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKLXsKLQl1bnNpZ25lZCBsb25nIHJhbSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IHN0YXJ0X3BmbiA8PCBQQUdFX1NISUZUOwotCXVuc2lnbmVkIGxvbmcgZW5kID0gZW5kX3BmbiA8PCBQQUdFX1NISUZUOwotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7Ci0JCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAubWFwW2ldOwotCQl1bnNpZ25lZCBsb25nIGxhc3QsIGFkZHI7Ci0KLQkJaWYgKGVpLT50eXBlICE9IEU4MjBfUkFNIHx8Ci0JCSAgICBlaS0+YWRkcitlaS0+c2l6ZSA8PSBzdGFydCB8fAotCQkgICAgZWktPmFkZHIgPj0gZW5kKQotCQkJY29udGludWU7Ci0KLQkJYWRkciA9IHJvdW5kX3VwKGVpLT5hZGRyLCBQQUdFX1NJWkUpOwotCQlpZiAoYWRkciA8IHN0YXJ0KQotCQkJYWRkciA9IHN0YXJ0OwotCi0JCWxhc3QgPSByb3VuZF9kb3duKGVpLT5hZGRyICsgZWktPnNpemUsIFBBR0VfU0laRSk7Ci0JCWlmIChsYXN0ID49IGVuZCkKLQkJCWxhc3QgPSBlbmQ7Ci0KLQkJaWYgKGxhc3QgPiBhZGRyKQotCQkJcmFtICs9IGxhc3QgLSBhZGRyOwotCX0KLQlyZXR1cm4gKChlbmQgLSBzdGFydCkgLSByYW0pID4+IFBBR0VfU0hJRlQ7Ci19Ci0KIC8qCiAgKiBNYXJrIGU4MjAgcmVzZXJ2ZWQgYXJlYXMgYXMgYnVzeSBmb3IgdGhlIHJlc291cmNlIG1hbmFnZXIuCiAgKi8KQEAgLTM0NSw2ICsyNjQsNDkgQEAKIAl9CiB9CiAKKy8qIFdhbGsgdGhlIGU4MjAgbWFwIGFuZCByZWdpc3RlciBhY3RpdmUgcmVnaW9ucyB3aXRoaW4gYSBub2RlICovCit2b2lkIF9faW5pdAorZTgyMF9yZWdpc3Rlcl9hY3RpdmVfcmVnaW9ucyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGVuZF9wZm4pCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBlaV9zdGFydHBmbiwgZWlfZW5kcGZuOworCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAubWFwW2ldOworCQllaV9zdGFydHBmbiA9IHJvdW5kX3VwKGVpLT5hZGRyLCBQQUdFX1NJWkUpID4+IFBBR0VfU0hJRlQ7CisJCWVpX2VuZHBmbiA9IHJvdW5kX2Rvd24oZWktPmFkZHIgKyBlaS0+c2l6ZSwgUEFHRV9TSVpFKQorCQkJCQkJCQk+PiBQQUdFX1NISUZUOworCisJCS8qIFNraXAgbWFwIGVudHJpZXMgc21hbGxlciB0aGFuIGEgcGFnZSAqLworCQlpZiAoZWlfc3RhcnRwZm4gPiBlaV9lbmRwZm4pCisJCQljb250aW51ZTsKKworCQkvKiBDaGVjayBpZiBlbmRfcGZuX21hcCBzaG91bGQgYmUgdXBkYXRlZCAqLworCQlpZiAoZWktPnR5cGUgIT0gRTgyMF9SQU0gJiYgZWlfZW5kcGZuID4gZW5kX3Bmbl9tYXApCisJCQllbmRfcGZuX21hcCA9IGVpX2VuZHBmbjsKKworCQkvKiBTa2lwIGlmIG1hcCBpcyBvdXRzaWRlIHRoZSBub2RlICovCisJCWlmIChlaS0+dHlwZSAhPSBFODIwX1JBTSB8fAorCQkJCWVpX2VuZHBmbiA8PSBzdGFydF9wZm4gfHwKKwkJCQllaV9zdGFydHBmbiA+PSBlbmRfcGZuKQorCQkJY29udGludWU7CisKKwkJLyogQ2hlY2sgZm9yIG92ZXJsYXBzICovCisJCWlmIChlaV9zdGFydHBmbiA8IHN0YXJ0X3BmbikKKwkJCWVpX3N0YXJ0cGZuID0gc3RhcnRfcGZuOworCQlpZiAoZWlfZW5kcGZuID4gZW5kX3BmbikKKwkJCWVpX2VuZHBmbiA9IGVuZF9wZm47CisKKwkJLyogT2JleSBlbmRfdXNlcl9wZm4gdG8gc2F2ZSBvbiBtZW1tYXAgKi8KKwkJaWYgKGVpX3N0YXJ0cGZuID49IGVuZF91c2VyX3BmbikKKwkJCWNvbnRpbnVlOworCQlpZiAoZWlfZW5kcGZuID4gZW5kX3VzZXJfcGZuKQorCQkJZWlfZW5kcGZuID0gZW5kX3VzZXJfcGZuOworCisJCWFkZF9hY3RpdmVfcmFuZ2UobmlkLCBlaV9zdGFydHBmbiwgZWlfZW5kcGZuKTsKKwl9Cit9CisKIC8qIAogICogQWRkIGEgbWVtb3J5IHJlZ2lvbiB0byB0aGUga2VybmVsIGU4MjAgbWFwLgogICovIApAQCAtNTY1LDEzICs1MjcsNiBAQAogICogSWYgd2UncmUgbHVja3kgYW5kIGxpdmUgb24gYSBtb2Rlcm4gc3lzdGVtLCB0aGUgc2V0dXAgY29kZQogICogd2lsbCBoYXZlIGdpdmVuIHVzIGEgbWVtb3J5IG1hcCB0aGF0IHdlIGNhbiB1c2UgdG8gcHJvcGVybHkKICAqIHNldCB1cCBtZW1vcnkuICBJZiB3ZSBhcmVuJ3QsIHdlJ2xsIGZha2UgYSBtZW1vcnkgbWFwLgotICoKLSAqIFdlIGNoZWNrIHRvIHNlZSB0aGF0IHRoZSBtZW1vcnkgbWFwIGNvbnRhaW5zIGF0IGxlYXN0IDIgZWxlbWVudHMKLSAqIGJlZm9yZSB3ZSdsbCB1c2UgaXQsIGJlY2F1c2UgdGhlIGRldGVjdGlvbiBjb2RlIGluIHNldHVwLlMgbWF5Ci0gKiBub3QgYmUgcGVyZmVjdCBhbmQgbW9zdCBldmVyeSBQQyBrbm93biB0byBtYW4gaGFzIHR3byBtZW1vcnkKLSAqIHJlZ2lvbnM6IG9uZSBmcm9tIDAgdG8gNjQwaywgYW5kIG9uZSBmcm9tIDFtYiB1cC4gIChUaGUgSUJNCi0gKiB0aGlua3BhZCA1NjB4LCBmb3IgZXhhbXBsZSwgZG9lcyBub3QgY29vcGVyYXRlIHdpdGggdGhlIG1lbW9yeQotICogZGV0ZWN0aW9uIGNvZGUuKQogICovCiBzdGF0aWMgaW50IF9faW5pdCBjb3B5X2U4MjBfbWFwKHN0cnVjdCBlODIwZW50cnkgKiBiaW9zbWFwLCBpbnQgbnJfbWFwKQogewpAQCAtNTg5LDM0ICs1NDQsMTkgQEAKIAkJaWYgKHN0YXJ0ID4gZW5kKQogCQkJcmV0dXJuIC0xOwogCi0JCS8qCi0JCSAqIFNvbWUgQklPU2VzIGNsYWltIFJBTSBpbiB0aGUgNjQwayAtIDFNIHJlZ2lvbi4KLQkJICogTm90IHJpZ2h0LiBGaXggaXQgdXAuCi0JCSAqIAotCQkgKiBUaGlzIHNob3VsZCBiZSByZW1vdmVkIG9uIEhhbW1lciB3aGljaCBpcyBzdXBwb3NlZCB0byBub3QKLQkJICogaGF2ZSBub24gZTgyMCBjb3ZlcmVkIElTQSBtYXBwaW5ncyB0aGVyZSwgYnV0IEkgaGFkIHNvbWUgc3RyYW5nZQotCQkgKiBwcm9ibGVtcyBzbyBpdCBzdGF5cyBmb3Igbm93LiAgLUFLCi0JCSAqLwotCQlpZiAodHlwZSA9PSBFODIwX1JBTSkgewotCQkJaWYgKHN0YXJ0IDwgMHgxMDAwMDBVTEwgJiYgZW5kID4gMHhBMDAwMFVMTCkgewotCQkJCWlmIChzdGFydCA8IDB4QTAwMDBVTEwpCi0JCQkJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0LCAweEEwMDAwVUxMLXN0YXJ0LCB0eXBlKTsKLQkJCQlpZiAoZW5kIDw9IDB4MTAwMDAwVUxMKQotCQkJCQljb250aW51ZTsKLQkJCQlzdGFydCA9IDB4MTAwMDAwVUxMOwotCQkJCXNpemUgPSBlbmQgLSBzdGFydDsKLQkJCX0KLQkJfQotCiAJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0LCBzaXplLCB0eXBlKTsKIAl9IHdoaWxlIChiaW9zbWFwKyssLS1ucl9tYXApOwogCXJldHVybiAwOwogfQogCit2b2lkIGVhcmx5X3BhbmljKGNoYXIgKm1zZykKK3sKKwllYXJseV9wcmludGsobXNnKTsKKwlwYW5pYyhtc2cpOworfQorCiB2b2lkIF9faW5pdCBzZXR1cF9tZW1vcnlfcmVnaW9uKHZvaWQpCiB7Ci0JY2hhciAqd2hvID0gIkJJT1MtZTgyMCI7Ci0KIAkvKgogCSAqIFRyeSB0byBjb3B5IHRoZSBCSU9TLXN1cHBsaWVkIEU4MjAtbWFwLgogCSAqCkBAIC02MjQsNTEgKzU2NCw3MCBAQAogCSAqIHRoZSBuZXh0IHNlY3Rpb24gZnJvbSAxbWItPmFwcHJvcHJpYXRlX21lbV9rCiAJICovCiAJc2FuaXRpemVfZTgyMF9tYXAoRTgyMF9NQVAsICZFODIwX01BUF9OUik7Ci0JaWYgKGNvcHlfZTgyMF9tYXAoRTgyMF9NQVAsIEU4MjBfTUFQX05SKSA8IDApIHsKLQkJdW5zaWduZWQgbG9uZyBtZW1fc2l6ZTsKLQotCQkvKiBjb21wYXJlIHJlc3VsdHMgZnJvbSBvdGhlciBtZXRob2RzIGFuZCB0YWtlIHRoZSBncmVhdGVyICovCi0JCWlmIChBTFRfTUVNX0sgPCBFWFRfTUVNX0spIHsKLQkJCW1lbV9zaXplID0gRVhUX01FTV9LOwotCQkJd2hvID0gIkJJT1MtODgiOwotCQl9IGVsc2UgewotCQkJbWVtX3NpemUgPSBBTFRfTUVNX0s7Ci0JCQl3aG8gPSAiQklPUy1lODAxIjsKLQkJfQotCi0JCWU4MjAubnJfbWFwID0gMDsKLQkJYWRkX21lbW9yeV9yZWdpb24oMCwgTE9XTUVNU0laRSgpLCBFODIwX1JBTSk7Ci0JCWFkZF9tZW1vcnlfcmVnaW9uKEhJR0hfTUVNT1JZLCBtZW1fc2l6ZSA8PCAxMCwgRTgyMF9SQU0pOwotICAJfQorCWlmIChjb3B5X2U4MjBfbWFwKEU4MjBfTUFQLCBFODIwX01BUF9OUikgPCAwKQorCQllYXJseV9wYW5pYygiQ2Fubm90IGZpbmQgYSB2YWxpZCBtZW1vcnkgbWFwIik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiQklPUy1wcm92aWRlZCBwaHlzaWNhbCBSQU0gbWFwOlxuIik7Ci0JZTgyMF9wcmludF9tYXAod2hvKTsKKwllODIwX3ByaW50X21hcCgiQklPUy1lODIwIik7CiB9CiAKLXZvaWQgX19pbml0IHBhcnNlX21lbW9wdChjaGFyICpwLCBjaGFyICoqZnJvbSkgCi17IAotCWVuZF91c2VyX3BmbiA9IG1lbXBhcnNlKHAsIGZyb20pOwotCWVuZF91c2VyX3BmbiA+Pj0gUEFHRV9TSElGVDsJCi19IAotCi12b2lkIF9faW5pdCBwYXJzZV9tZW1tYXBvcHQoY2hhciAqcCwgY2hhciAqKmZyb20pCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9tZW1vcHQoY2hhciAqcCkKIHsKKwlpZiAoIXApCisJCXJldHVybiAtRUlOVkFMOworCWVuZF91c2VyX3BmbiA9IG1lbXBhcnNlKHAsICZwKTsKKwllbmRfdXNlcl9wZm4gPj49IFBBR0VfU0hJRlQ7CQorCXJldHVybiAwOworfSAKK2Vhcmx5X3BhcmFtKCJtZW0iLCBwYXJzZV9tZW1vcHQpOworCitzdGF0aWMgaW50IHVzZXJkZWYgX19pbml0ZGF0YTsKKworc3RhdGljIGludCBfX2luaXQgcGFyc2VfbWVtbWFwX29wdChjaGFyICpwKQoreworCWNoYXIgKm9sZHA7CiAJdW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0X2F0LCBtZW1fc2l6ZTsKIAotCW1lbV9zaXplID0gbWVtcGFyc2UocCwgZnJvbSk7Ci0JcCA9ICpmcm9tOworCWlmICghc3RyY21wKHAsICJleGFjdG1hcCIpKSB7CisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKwkJLyogSWYgd2UgYXJlIGRvaW5nIGEgY3Jhc2ggZHVtcCwgd2UKKwkJICogc3RpbGwgbmVlZCB0byBrbm93IHRoZSByZWFsIG1lbQorCQkgKiBzaXplIGJlZm9yZSBvcmlnaW5hbCBtZW1vcnkgbWFwIGlzCisJCSAqIHJlc2V0LgorCQkgKi8KKwkJc2F2ZWRfbWF4X3BmbiA9IGU4MjBfZW5kX29mX3JhbSgpOworI2VuZGlmCisJCWVuZF9wZm5fbWFwID0gMDsKKwkJZTgyMC5ucl9tYXAgPSAwOworCQl1c2VyZGVmID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJb2xkcCA9IHA7CisJbWVtX3NpemUgPSBtZW1wYXJzZShwLCAmcCk7CisJaWYgKHAgPT0gb2xkcCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCpwID09ICdAJykgewotCQlzdGFydF9hdCA9IG1lbXBhcnNlKHArMSwgZnJvbSk7CisJCXN0YXJ0X2F0ID0gbWVtcGFyc2UocCsxLCAmcCk7CiAJCWFkZF9tZW1vcnlfcmVnaW9uKHN0YXJ0X2F0LCBtZW1fc2l6ZSwgRTgyMF9SQU0pOwogCX0gZWxzZSBpZiAoKnAgPT0gJyMnKSB7Ci0JCXN0YXJ0X2F0ID0gbWVtcGFyc2UocCsxLCBmcm9tKTsKKwkJc3RhcnRfYXQgPSBtZW1wYXJzZShwKzEsICZwKTsKIAkJYWRkX21lbW9yeV9yZWdpb24oc3RhcnRfYXQsIG1lbV9zaXplLCBFODIwX0FDUEkpOwogCX0gZWxzZSBpZiAoKnAgPT0gJyQnKSB7Ci0JCXN0YXJ0X2F0ID0gbWVtcGFyc2UocCsxLCBmcm9tKTsKKwkJc3RhcnRfYXQgPSBtZW1wYXJzZShwKzEsICZwKTsKIAkJYWRkX21lbW9yeV9yZWdpb24oc3RhcnRfYXQsIG1lbV9zaXplLCBFODIwX1JFU0VSVkVEKTsKIAl9IGVsc2UgewogCQllbmRfdXNlcl9wZm4gPSAobWVtX3NpemUgPj4gUEFHRV9TSElGVCk7CiAJfQotCXAgPSAqZnJvbTsKKwlyZXR1cm4gKnAgPT0gJ1wwJyA/IDAgOiAtRUlOVkFMOworfQorZWFybHlfcGFyYW0oIm1lbW1hcCIsIHBhcnNlX21lbW1hcF9vcHQpOworCit2b2lkIGZpbmlzaF9lODIwX3BhcnNpbmcodm9pZCkKK3sKKwlpZiAodXNlcmRlZikgeworCQlwcmludGsoS0VSTl9JTkZPICJ1c2VyLWRlZmluZWQgcGh5c2ljYWwgUkFNIG1hcDpcbiIpOworCQllODIwX3ByaW50X21hcCgidXNlciIpOworCX0KIH0KIAogdW5zaWduZWQgbG9uZyBwY2lfbWVtX3N0YXJ0ID0gMHhhZWVkYmFiZTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9lYXJseS1xdWlya3MuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lYXJseS1xdWlya3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDhlMzhhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2Vhcmx5LXF1aXJrcy5jCkBAIC0wLDAgKzEsMTIyIEBACisvKiBWYXJpb3VzIHdvcmthcm91bmRzIGZvciBjaGlwc2V0IGJ1Z3MuCisgICBUaGlzIGNvZGUgcnVucyB2ZXJ5IGVhcmx5IGFuZCBjYW4ndCB1c2UgdGhlIHJlZ3VsYXIgUENJIHN1YnN5c3RlbQorICAgVGhlIGVudHJpZXMgYXJlIGtleWVkIHRvIFBDSSBicmlkZ2VzIHdoaWNoIHVzdWFsbHkgaWRlbnRpZnkgY2hpcHNldHMKKyAgIHVuaXF1ZWx5LgorICAgVGhpcyBpcyBvbmx5IGZvciB3aG9sZSBjbGFzc2VzIG9mIGNoaXBzZXRzIHdpdGggc3BlY2lmaWMgcHJvYmxlbXMgd2hpY2gKKyAgIG5lZWQgZWFybHkgaW52YXNpdmUgYWN0aW9uIChlLmcuIGJlZm9yZSB0aGUgdGltZXJzIGFyZSBpbml0aWFsaXplZCkuCisgICBNb3N0IFBDSSBkZXZpY2Ugc3BlY2lmaWMgd29ya2Fyb3VuZHMgY2FuIGJlIGRvbmUgbGF0ZXIgYW5kIHNob3VsZCBiZQorICAgaW4gc3RhbmRhcmQgUENJIHF1aXJrcworICAgTWFpbmJvYXJkIHNwZWNpZmljIGJ1Z3Mgc2hvdWxkIGJlIGhhbmRsZWQgYnkgRE1JIGVudHJpZXMuCisgICBDUFUgc3BlY2lmaWMgYnVncyBpbiBzZXR1cC5jICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgorI2luY2x1ZGUgPGFzbS9wY2ktZGlyZWN0Lmg+CisjaW5jbHVkZSA8YXNtL3Byb3RvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCitzdGF0aWMgdm9pZCB2aWFfYnVncyh2b2lkKQoreworI2lmZGVmIENPTkZJR19JT01NVQorCWlmICgoZW5kX3BmbiA+IE1BWF9ETUEzMl9QRk4gfHwgIGZvcmNlX2lvbW11KSAmJgorCSAgICAhaW9tbXVfYXBlcnR1cmVfYWxsb3dlZCkgeworCQlwcmludGsoS0VSTl9JTkZPCisgICJMb29rcyBsaWtlIGEgVklBIGNoaXBzZXQuIERpc2FibGluZyBJT01NVS4gT3ZlcnJpZGUgd2l0aCBpb21tdT1hbGxvd2VkXG4iKTsKKwkJaW9tbXVfYXBlcnR1cmVfZGlzYWJsZWQgPSAxOworCX0KKyNlbmRpZgorfQorCisjaWZkZWYgQ09ORklHX0FDUEkKKworc3RhdGljIGludCBudmlkaWFfaHBldF9kZXRlY3RlZCBfX2luaXRkYXRhOworCitzdGF0aWMgaW50IF9faW5pdCBudmlkaWFfaHBldF9jaGVjayh1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwludmlkaWFfaHBldF9kZXRlY3RlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgbnZpZGlhX2J1Z3Modm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQUNQSQorCS8qCisJICogQWxsIHRpbWVyIG92ZXJyaWRlcyBvbiBOdmlkaWEgYXJlCisJICogd3JvbmcgdW5sZXNzIEhQRVQgaXMgZW5hYmxlZC4KKwkgKi8KKwludmlkaWFfaHBldF9kZXRlY3RlZCA9IDA7CisJYWNwaV90YWJsZV9wYXJzZShBQ1BJX0hQRVQsIG52aWRpYV9ocGV0X2NoZWNrKTsKKwlpZiAobnZpZGlhX2hwZXRfZGV0ZWN0ZWQgPT0gMCkgeworCQlhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUgPSAxOworCQlwcmludGsoS0VSTl9JTkZPICJOdmlkaWEgYm9hcmQgIgorCQkgICAgICAgImRldGVjdGVkLiBJZ25vcmluZyBBQ1BJICIKKwkJICAgICAgICJ0aW1lciBvdmVycmlkZS5cbiIpOworCX0KKyNlbmRpZgorCS8qIFJFRC1QRU4gc2tpcCB0aGVtIG9uIG1wdGFibGVzIHRvbz8gKi8KKworfQorCitzdGF0aWMgdm9pZCBhdGlfYnVncyh2b2lkKQoreworI2lmIDEgLyogZm9yIHRlc3RpbmcgKi8KKwlwcmludGsoIkFUSSBib2FyZCBkZXRlY3RlZFxuIik7CisjZW5kaWYKKwkvKiBObyBidWdzIHJpZ2h0IG5vdyAqLworfQorCitzdHJ1Y3QgY2hpcHNldCB7CisJdTE2IHZlbmRvcjsKKwl2b2lkICgqZikodm9pZCk7Cit9OworCitzdGF0aWMgc3RydWN0IGNoaXBzZXQgZWFybHlfcXJrW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgbnZpZGlhX2J1Z3MgfSwKKwl7IFBDSV9WRU5ET1JfSURfVklBLCB2aWFfYnVncyB9LAorCXsgUENJX1ZFTkRPUl9JRF9BVEksIGF0aV9idWdzIH0sCisJe30KK307CisKK3ZvaWQgX19pbml0IGVhcmx5X3F1aXJrcyh2b2lkKQoreworCWludCBudW0sIHNsb3QsIGZ1bmM7CisKKwlpZiAoIWVhcmx5X3BjaV9hbGxvd2VkKCkpCisJCXJldHVybjsKKworCS8qIFBvb3IgbWFuJ3MgUENJIGRpc2NvdmVyeSAqLworCWZvciAobnVtID0gMDsgbnVtIDwgMzI7IG51bSsrKSB7CisJCWZvciAoc2xvdCA9IDA7IHNsb3QgPCAzMjsgc2xvdCsrKSB7CisJCQlmb3IgKGZ1bmMgPSAwOyBmdW5jIDwgODsgZnVuYysrKSB7CisJCQkJdTMyIGNsYXNzOworCQkJCXUzMiB2ZW5kb3I7CisJCQkJdTggdHlwZTsKKwkJCQlpbnQgaTsKKwkJCQljbGFzcyA9IHJlYWRfcGNpX2NvbmZpZyhudW0sc2xvdCxmdW5jLAorCQkJCQkJCVBDSV9DTEFTU19SRVZJU0lPTik7CisJCQkJaWYgKGNsYXNzID09IDB4ZmZmZmZmZmYpCisJCQkJCWJyZWFrOworCisJCSAgICAgICAJCWlmICgoY2xhc3MgPj4gMTYpICE9IFBDSV9DTEFTU19CUklER0VfUENJKQorCQkJCQljb250aW51ZTsKKworCQkJCXZlbmRvciA9IHJlYWRfcGNpX2NvbmZpZyhudW0sIHNsb3QsIGZ1bmMsCisJCQkJCQkJIFBDSV9WRU5ET1JfSUQpOworCQkJCXZlbmRvciAmPSAweGZmZmY7CisKKwkJCQlmb3IgKGkgPSAwOyBlYXJseV9xcmtbaV0uZjsgaSsrKQorCQkJCQlpZiAoZWFybHlfcXJrW2ldLnZlbmRvciA9PSB2ZW5kb3IpIHsKKwkJCQkJCWVhcmx5X3Fya1tpXS5mKCk7CisJCQkJCQlyZXR1cm47CisJCQkJCX0KKworCQkJCXR5cGUgPSByZWFkX3BjaV9jb25maWdfYnl0ZShudW0sIHNsb3QsIGZ1bmMsCisJCQkJCQkJICAgIFBDSV9IRUFERVJfVFlQRSk7CisJCQkJaWYgKCEodHlwZSAmIDB4ODApKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9lYXJseV9wcmludGsuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lYXJseV9wcmludGsuYwppbmRleCAxNDAwNTFlLi5lMjJlY2Q1IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvZWFybHlfcHJpbnRrLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2Vhcmx5X3ByaW50ay5jCkBAIC0yMTUsMjAgKzIxNSwxNiBAQAogCiBzdGF0aWMgaW50IF9faW5pdGRhdGEga2VlcF9lYXJseTsKIAotaW50IF9faW5pdCBzZXR1cF9lYXJseV9wcmludGsoY2hhciAqb3B0KQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfZWFybHlfcHJpbnRrKGNoYXIgKmJ1ZikKIHsKLQljaGFyICpzcGFjZTsKLQljaGFyIGJ1ZlsyNTZdOworCWlmICghYnVmKQorCQlyZXR1cm4gMDsKIAogCWlmIChlYXJseV9jb25zb2xlX2luaXRpYWxpemVkKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIDA7CisJZWFybHlfY29uc29sZV9pbml0aWFsaXplZCA9IDE7CiAKLQlzdHJsY3B5KGJ1ZixvcHQsc2l6ZW9mKGJ1ZikpOwotCXNwYWNlID0gc3RyY2hyKGJ1ZiwgJyAnKTsKLQlpZiAoc3BhY2UpCi0JCSpzcGFjZSA9IDA7Ci0KLQlpZiAoc3Ryc3RyKGJ1Ziwia2VlcCIpKQorCWlmICghc3RyY21wKGJ1Ziwia2VlcCIpKQogCQlrZWVwX2Vhcmx5ID0gMTsKIAogCWlmICghc3RybmNtcChidWYsICJzZXJpYWwiLCA2KSkgewpAQCAtMjQ4LDExICsyNDQsMTIgQEAKICAJCWVhcmx5X2NvbnNvbGUgPSAmc2ltbm93X2NvbnNvbGU7CiAgCQlrZWVwX2Vhcmx5ID0gMTsKIAl9Ci0JZWFybHlfY29uc29sZV9pbml0aWFsaXplZCA9IDE7CiAJcmVnaXN0ZXJfY29uc29sZShlYXJseV9jb25zb2xlKTsKIAlyZXR1cm4gMDsKIH0KIAorZWFybHlfcGFyYW0oImVhcmx5cHJpbnRrIiwgc2V0dXBfZWFybHlfcHJpbnRrKTsKKwogdm9pZCBfX2luaXQgZGlzYWJsZV9lYXJseV9wcmludGsodm9pZCkKIHsKIAlpZiAoIWVhcmx5X2NvbnNvbGVfaW5pdGlhbGl6ZWQgfHwgIWVhcmx5X2NvbnNvbGUpCkBAIC0yNjYsNCArMjYzLDMgQEAKIAl9CiB9CiAKLV9fc2V0dXAoImVhcmx5cHJpbnRrPSIsIHNldHVwX2Vhcmx5X3ByaW50ayk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lbnRyeS5TCmluZGV4IGFhOGQ4OTMuLjI4MDI1MjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9lbnRyeS5TCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lbnRyeS5TCkBAIC00LDggKzQsNiBAQAogICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKICAqICBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgIEFuZGkgS2xlZW4gU3VTRSBMYWJzCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAwICBQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+Ci0gKiAKLSAqICAkSWQkCiAgKi8KIAogLyoKQEAgLTIyLDE1ICsyMCwyNSBAQAogICogYXQgdGhlIHRvcCBvZiB0aGUga2VybmVsIHByb2Nlc3Mgc3RhY2suCQogICogLSBwYXJ0aWFsIHN0YWNrIGZyYW1lOiBwYXJ0aWFsbHkgc2F2ZWQgcmVnaXN0ZXJzIHVwdG8gUjExLgogICogLSBmdWxsIHN0YWNrIGZyYW1lOiBMaWtlIHBhcnRpYWwgc3RhY2sgZnJhbWUsIGJ1dCBhbGwgcmVnaXN0ZXIgc2F2ZWQuIAotICoJCi0gKiBUT0RPOgkgCi0gKiAtIHNjaGVkdWxlIGl0IGNhcmVmdWxseSBmb3IgdGhlIGZpbmFsIGhhcmR3YXJlLgorICoKKyAqIFNvbWUgbWFjcm8gdXNhZ2U6CisgKiAtIENGSSBtYWNyb3MgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgZHdhcmYyIHVud2luZCBpbmZvcm1hdGlvbiBmb3IgYmV0dGVyCisgKiBiYWNrdHJhY2VzLiBUaGV5IGRvbid0IGNoYW5nZSBhbnkgY29kZS4KKyAqIC0gU0FWRV9BTEwvUkVTVE9SRV9BTEwgLSBTYXZlL3Jlc3RvcmUgYWxsIHJlZ2lzdGVycworICogLSBTQVZFX0FSR1MvUkVTVE9SRV9BUkdTIC0gU2F2ZS9yZXN0b3JlIHJlZ2lzdGVycyB0aGF0IEMgZnVuY3Rpb25zIG1vZGlmeS4KKyAqIFRoZXJlIGFyZSB1bmZvcnR1bmF0ZWx5IGxvdHMgb2Ygc3BlY2lhbCBjYXNlcyB3aGVyZSBzb21lIHJlZ2lzdGVycworICogbm90IHRvdWNoZWQuIFRoZSBtYWNybyBpcyBhIGJpZyBtZXNzIHRoYXQgc2hvdWxkIGJlIGNsZWFuZWQgdXAuCisgKiAtIFNBVkVfUkVTVC9SRVNUT1JFX1JFU1QgLSBIYW5kbGUgdGhlIHJlZ2lzdGVycyBub3Qgc2F2ZWQgYnkgU0FWRV9BUkdTLgorICogR2l2ZXMgYSBmdWxsIHN0YWNrIGZyYW1lLgorICogLSBFTlRSWS9FTkQgRGVmaW5lIGZ1bmN0aW9ucyBpbiB0aGUgc3ltYm9sIHRhYmxlLgorICogLSBGSVhVUF9UT1BfT0ZfU1RBQ0svUkVTVE9SRV9UT1BfT0ZfU1RBQ0sgLSBGaXggdXAgdGhlIGhhcmR3YXJlIHN0YWNrCisgKiBmcmFtZSB0aGF0IGlzIG90aGVyd2lzZSB1bmRlZmluZWQgYWZ0ZXIgYSBTWVNDQUxMCisgKiAtIFRSQUNFX0lSUV8qIC0gVHJhY2UgaGFyZCBpbnRlcnJ1cHQgc3RhdGUgZm9yIGxvY2sgZGVidWdnaW5nLgorICogLSBlcnJvcmVudHJ5L3BhcmFub2lkZW50cnkvemVyb2VudHJ5IC0gRGVmaW5lIGV4Y2VwdGlvbiBlbnRyeSBwb2ludHMuCiAgKi8KIAotI2RlZmluZSBBU1NFTUJMWSAxCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+Ci0jaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9kd2FyZjIuaD4KQEAgLTExNSw2ICsxMjMsNyBAQAogCS5tYWNybwlDRklfREVGQVVMVF9TVEFDSyBzdGFydD0xCiAJLmlmIFxzdGFydAogCUNGSV9TVEFSVFBST0MJc2ltcGxlCisJQ0ZJX1NJR05BTF9GUkFNRQogCUNGSV9ERUZfQ0ZBCXJzcCxTUys4CiAJLmVsc2UKIAlDRklfREVGX0NGQV9PRkZTRVQgU1MrOApAQCAtMTQ2LDYgKzE1NSwxMCBAQAogLyogcmRpOglwcmV2ICovCQogRU5UUlkocmV0X2Zyb21fZm9yaykKIAlDRklfREVGQVVMVF9TVEFDSworCXB1c2gga2VybmVsX2VmbGFncyglcmlwKQorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CisJcG9wZgkJCQkjIHJlc2V0IGtlcm5lbCBlZmxhZ3MKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKIAljYWxsIHNjaGVkdWxlX3RhaWwKIAlHRVRfVEhSRUFEX0lORk8oJXJjeCkKIAl0ZXN0bCAkKF9USUZfU1lTQ0FMTF9UUkFDRXxfVElGX1NZU0NBTExfQVVESVQpLHRocmVhZGluZm9fZmxhZ3MoJXJjeCkKQEAgLTE5OSw2ICsyMTIsNyBAQAogCiBFTlRSWShzeXN0ZW1fY2FsbCkKIAlDRklfU1RBUlRQUk9DCXNpbXBsZQorCUNGSV9TSUdOQUxfRlJBTUUKIAlDRklfREVGX0NGQQlyc3AsUERBX1NUQUNLT0ZGU0VUCiAJQ0ZJX1JFR0lTVEVSCXJpcCxyY3gKIAkvKkNGSV9SRUdJU1RFUglyZmxhZ3MscjExKi8KQEAgLTMxNiw2ICszMzAsNyBAQAogICovIAkKIEVOVFJZKGludF9yZXRfZnJvbV9zeXNfY2FsbCkKIAlDRklfU1RBUlRQUk9DCXNpbXBsZQorCUNGSV9TSUdOQUxfRlJBTUUKIAlDRklfREVGX0NGQQlyc3AsU1MrOC1BUkdPRkZTRVQKIAkvKkNGSV9SRUxfT0ZGU0VUCXNzLFNTLUFSR09GRlNFVCovCiAJQ0ZJX1JFTF9PRkZTRVQJcnNwLFJTUC1BUkdPRkZTRVQKQEAgLTQ3Niw2ICs0OTEsNyBAQAogICovCiAJLm1hY3JvIF9mcmFtZSByZWYKIAlDRklfU1RBUlRQUk9DIHNpbXBsZQorCUNGSV9TSUdOQUxfRlJBTUUKIAlDRklfREVGX0NGQSByc3AsU1MrOC1ccmVmCiAJLypDRklfUkVMX09GRlNFVCBzcyxTUy1ccmVmKi8KIAlDRklfUkVMX09GRlNFVCByc3AsUlNQLVxyZWYKQEAgLTUxMSw3ICs1MjcsMTIgQEAKIAl0ZXN0bCAkMyxDUyglcmRpKQogCWplIDFmCiAJc3dhcGdzCQotMToJaW5jbAklZ3M6cGRhX2lycWNvdW50CSMgUkVELVBFTiBzaG91bGQgY2hlY2sgcHJlZW1wdCBjb3VudAorCS8qIGlycWNvdW50IGlzIHVzZWQgdG8gY2hlY2sgaWYgYSBDUFUgaXMgYWxyZWFkeSBvbiBhbiBpbnRlcnJ1cHQKKwkgICBzdGFjayBvciBub3QuIFdoaWxlIHRoaXMgaXMgZXNzZW50aWFsbHkgcmVkdW5kYW50IHdpdGggcHJlZW1wdF9jb3VudAorCSAgIGl0IGlzIGEgbGl0dGxlIGNoZWFwZXIgdG8gdXNlIGEgc2VwYXJhdGUgY291bnRlciBpbiB0aGUgUERBCisJICAgKHNob3J0IG9mIG1vdmluZyBpcnFfZW50ZXIgaW50byBhc3NlbWJseSwgd2hpY2ggd291bGQgYmUgdG9vCisJICAgIG11Y2ggd29yaykgKi8KKzE6CWluY2wJJWdzOnBkYV9pcnFjb3VudAogCWNtb3ZlcSAlZ3M6cGRhX2lycXN0YWNrcHRyLCVyc3AKIAlwdXNoICAgICVyYnAJCQkjIGJhY2tsaW5rIGZvciBvbGQgdW53aW5kZXIKIAkvKgpAQCAtNjE5LDggKzY0MCw3IEBACiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKIAkvKiBSZXR1cm5pbmcgdG8ga2VybmVsIHNwYWNlLiBDaGVjayBpZiB3ZSBuZWVkIHByZWVtcHRpb24gKi8KIAkvKiByY3g6CSB0aHJlYWRpbmZvLiBpbnRlcnJ1cHRzIG9mZi4gKi8KLQkucDJhbGlnbgotcmV0aW50X2tlcm5lbDoJCitFTlRSWShyZXRpbnRfa2VybmVsKQogCWNtcGwgJDAsdGhyZWFkaW5mb19wcmVlbXB0X2NvdW50KCVyY3gpCiAJam56ICByZXRpbnRfcmVzdG9yZV9hcmdzCiAJYnQgICRUSUZfTkVFRF9SRVNDSEVELHRocmVhZGluZm9fZmxhZ3MoJXJjeCkKQEAgLTY3OSw3ICs2OTksNiBAQAogRU5EKGNhbGxfZnVuY3Rpb25faW50ZXJydXB0KQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMJCiBFTlRSWShhcGljX3RpbWVyX2ludGVycnVwdCkKIAlhcGljaW50ZXJydXB0IExPQ0FMX1RJTUVSX1ZFQ1RPUixzbXBfYXBpY190aW1lcl9pbnRlcnJ1cHQKIEVORChhcGljX3RpbWVyX2ludGVycnVwdCkKQEAgLTY5MSw3ICs3MTAsNiBAQAogRU5UUlkoc3B1cmlvdXNfaW50ZXJydXB0KQogCWFwaWNpbnRlcnJ1cHQgU1BVUklPVVNfQVBJQ19WRUNUT1Isc21wX3NwdXJpb3VzX2ludGVycnVwdAogRU5EKHNwdXJpb3VzX2ludGVycnVwdCkKLSNlbmRpZgogCQkJCQogLyoKICAqIEV4Y2VwdGlvbiBlbnRyeSBwb2ludHMuCkBAIC03NjgsNyArNzg2LDkgQEAKIAl0ZXN0bCAkMyxDUyglcnNwKQogCWpueiAgIHBhcmFub2lkX3VzZXJzcGFjZVx0cmFjZQogcGFyYW5vaWRfc3dhcGdzXHRyYWNlOgorCS5pZiBcdHJhY2UKIAlUUkFDRV9JUlFTX0lSRVRRIDAKKwkuZW5kaWYKIAlzd2FwZ3MKIHBhcmFub2lkX3Jlc3RvcmVcdHJhY2U6CiAJUkVTVE9SRV9BTEwgOApAQCAtODE0LDcgKzgzNCw3IEBACiAgKiBFeGNlcHRpb24gZW50cnkgcG9pbnQuIFRoaXMgZXhwZWN0cyBhbiBlcnJvciBjb2RlL29yaWdfcmF4IG9uIHRoZSBzdGFjawogICogYW5kIHRoZSBleGNlcHRpb24gaGFuZGxlciBpbiAlcmF4LgkKICAqLyAJCSAgCQkJCQotRU5UUlkoZXJyb3JfZW50cnkpCitLUFJPQkVfRU5UUlkoZXJyb3JfZW50cnkpCiAJX2ZyYW1lIFJESQogCS8qIHJkaSBzbG90IGNvbnRhaW5zIHJheCwgb2xkcmF4IGNvbnRhaW5zIGVycm9yIGNvZGUgKi8KIAljbGQJCkBAIC04OTgsNyArOTE4LDcgQEAKIAljbXBxICRnc19jaGFuZ2UsUklQKCVyc3ApCiAgICAgICAgIGplICAgZXJyb3Jfc3dhcGdzCiAJam1wICBlcnJvcl9zdGkKLUVORChlcnJvcl9lbnRyeSkKK0tQUk9CRV9FTkQoZXJyb3JfZW50cnkpCiAJCiAgICAgICAgLyogUmVsb2FkIGdzIHNlbGVjdG9yIHdpdGggZXhjZXB0aW9uIGhhbmRsaW5nICovCiAgICAgICAgLyogZWRpOiAgbmV3IHNlbGVjdG9yICovIApAQCAtMTAyMCw4ICsxMDQwLDcgQEAKIAogS1BST0JFX0VOVFJZKHBhZ2VfZmF1bHQpCiAJZXJyb3JlbnRyeSBkb19wYWdlX2ZhdWx0Ci1FTkQocGFnZV9mYXVsdCkKLQkucHJldmlvdXMgLnRleHQKK0tQUk9CRV9FTkQocGFnZV9mYXVsdCkKIAogRU5UUlkoY29wcm9jZXNzb3JfZXJyb3IpCiAJemVyb2VudHJ5IGRvX2NvcHJvY2Vzc29yX2Vycm9yCkBAIC0xMDQyLDggKzEwNjEsNyBAQAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA4CQkKIAlwYXJhbm9pZGVudHJ5IGRvX2RlYnVnLCBERUJVR19TVEFDSwogCXBhcmFub2lkZXhpdAotRU5EKGRlYnVnKQotCS5wcmV2aW91cyAudGV4dAorS1BST0JFX0VORChkZWJ1ZykKIAogCS8qIHJ1bnMgb24gZXhjZXB0aW9uIHN0YWNrICovCQogS1BST0JFX0VOVFJZKG5taSkKQEAgLTEwNTcsOCArMTA3NSw3IEBACiAJam1wIHBhcmFub2lkX2V4aXQxCiAgCUNGSV9FTkRQUk9DCiAjZW5kaWYKLUVORChubWkpCi0JLnByZXZpb3VzIC50ZXh0CitLUFJPQkVfRU5EKG5taSkKIAogS1BST0JFX0VOVFJZKGludDMpCiAgCUlOVFJfRlJBTUUKQEAgLTEwNjcsOCArMTA4NCw3IEBACiAgCXBhcmFub2lkZW50cnkgZG9faW50MywgREVCVUdfU1RBQ0sKICAJam1wIHBhcmFub2lkX2V4aXQxCiAgCUNGSV9FTkRQUk9DCi1FTkQoaW50MykKLQkucHJldmlvdXMgLnRleHQKK0tQUk9CRV9FTkQoaW50MykKIAogRU5UUlkob3ZlcmZsb3cpCiAJemVyb2VudHJ5IGRvX292ZXJmbG93CkBAIC0xMTE2LDggKzExMzIsNyBAQAogCiBLUFJPQkVfRU5UUlkoZ2VuZXJhbF9wcm90ZWN0aW9uKQogCWVycm9yZW50cnkgZG9fZ2VuZXJhbF9wcm90ZWN0aW9uCi1FTkQoZ2VuZXJhbF9wcm90ZWN0aW9uKQotCS5wcmV2aW91cyAudGV4dAorS1BST0JFX0VORChnZW5lcmFsX3Byb3RlY3Rpb24pCiAKIEVOVFJZKGFsaWdubWVudF9jaGVjaykKIAllcnJvcmVudHJ5IGRvX2FsaWdubWVudF9jaGVjawpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfY2x1c3Rlci5jIGIvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfY2x1c3Rlci5jCmluZGV4IDMwMjA5MTcuLmNkYjkwZTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2NsdXN0ZXIuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpY19jbHVzdGVyLmMKQEAgLTExOCw3ICsxMTgsNiBAQAogCS5uYW1lID0gImNsdXN0ZXJlZCIsCiAJLmludF9kZWxpdmVyeV9tb2RlID0gZGVzdF9GaXhlZCwKIAkuaW50X2Rlc3RfbW9kZSA9IChBUElDX0RFU1RfUEhZU0lDQUwgIT0gMCksCi0JLmludF9kZWxpdmVyeV9kZXN0ID0gQVBJQ19ERVNUX1BIWVNJQ0FMIHwgQVBJQ19ETV9GSVhFRCwKIAkudGFyZ2V0X2NwdXMgPSBjbHVzdGVyX3RhcmdldF9jcHVzLAogCS5hcGljX2lkX3JlZ2lzdGVyZWQgPSBjbHVzdGVyX2FwaWNfaWRfcmVnaXN0ZXJlZCwKIAkuaW5pdF9hcGljX2xkciA9IGNsdXN0ZXJfaW5pdF9hcGljX2xkciwKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2ZsYXQuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9nZW5hcGljX2ZsYXQuYwppbmRleCBlYjg2ZDM3Li41MGFkMTUzIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvZ2VuYXBpY19mbGF0LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2dlbmFwaWNfZmxhdC5jCkBAIC00OSw4ICs0OSw3IEBACiAJdW5zaWduZWQgbG9uZyBjZmc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOwotCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCiAJLyoKIAkgKiBXYWl0IGZvciBpZGxlLgpAQCAtMTIxLDcgKzEyMCw2IEBACiAJLm5hbWUgPSAiZmxhdCIsCiAJLmludF9kZWxpdmVyeV9tb2RlID0gZGVzdF9Mb3dlc3RQcmlvLAogCS5pbnRfZGVzdF9tb2RlID0gKEFQSUNfREVTVF9MT0dJQ0FMICE9IDApLAotCS5pbnRfZGVsaXZlcnlfZGVzdCA9IEFQSUNfREVTVF9MT0dJQ0FMIHwgQVBJQ19ETV9MT1dFU1QsCiAJLnRhcmdldF9jcHVzID0gZmxhdF90YXJnZXRfY3B1cywKIAkuYXBpY19pZF9yZWdpc3RlcmVkID0gZmxhdF9hcGljX2lkX3JlZ2lzdGVyZWQsCiAJLmluaXRfYXBpY19sZHIgPSBmbGF0X2luaXRfYXBpY19sZHIsCkBAIC0xODAsNyArMTc4LDYgQEAKIAkubmFtZSA9ICJwaHlzaWNhbCBmbGF0IiwKIAkuaW50X2RlbGl2ZXJ5X21vZGUgPSBkZXN0X0ZpeGVkLAogCS5pbnRfZGVzdF9tb2RlID0gKEFQSUNfREVTVF9QSFlTSUNBTCAhPSAwKSwKLQkuaW50X2RlbGl2ZXJ5X2Rlc3QgPSBBUElDX0RFU1RfUEhZU0lDQUwgfCBBUElDX0RNX0ZJWEVELAogCS50YXJnZXRfY3B1cyA9IHBoeXNmbGF0X3RhcmdldF9jcHVzLAogCS5hcGljX2lkX3JlZ2lzdGVyZWQgPSBmbGF0X2FwaWNfaWRfcmVnaXN0ZXJlZCwKIAkuaW5pdF9hcGljX2xkciA9IGZsYXRfaW5pdF9hcGljX2xkciwvKm5vdCBuZWVkZWQsIGJ1dCBzaG91bGRuJ3QgaHVydCovCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5TIGIvYXJjaC94ODZfNjQva2VybmVsL2hlYWQuUwppbmRleCBjOTczOWNhLi4xZTZmODA4IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkLlMKQEAgLTUsOCArNSw2IEBACiAgKiAgQ29weXJpZ2h0IChDKSAyMDAwIFBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDAgS2Fyc3RlbiBLZWlsIDxra2VpbEBzdXNlLmRlPgogICogIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIEFuZGkgS2xlZW4gPGFrQHN1c2UuZGU+Ci0gKgotICogICRJZDogaGVhZC5TLHYgMS40OSAyMDAyLzAzLzE5IDE3OjM5OjI1IGFrIEV4cCAkCiAgKi8KIAogCkBAIC0xODcsMTIgKzE4NSwxNSBAQAogCQogCS8qIEZpbmFsbHkganVtcCB0byBydW4gQyBjb2RlIGFuZCB0byBiZSBvbiByZWFsIGtlcm5lbCBhZGRyZXNzCiAJICogU2luY2Ugd2UgYXJlIHJ1bm5pbmcgb24gaWRlbnRpdHktbWFwcGVkIHNwYWNlIHdlIGhhdmUgdG8ganVtcAotCSAqIHRvIHRoZSBmdWxsIDY0Yml0IGFkZHJlc3MgLCB0aGlzIGlzIG9ubHkgcG9zc2libGUgYXMgaW5kaXJlY3QKLQkgKiBqdW1wCisJICogdG8gdGhlIGZ1bGwgNjRiaXQgYWRkcmVzcywgdGhpcyBpcyBvbmx5IHBvc3NpYmxlIGFzIGluZGlyZWN0CisJICoganVtcC4gIEluIGFkZGl0aW9uIHdlIG5lZWQgdG8gZW5zdXJlICVjcyBpcyBzZXQgc28gd2UgbWFrZSB0aGlzCisJICogYSBmYXIgcmV0dXJuLgogCSAqLwogCW1vdnEJaW5pdGlhbF9jb2RlKCVyaXApLCVyYXgKLQlwdXNocQkkMAkJIyBmYWtlIHJldHVybiBhZGRyZXNzCi0Jam1wCSolcmF4CisJcHVzaHEJJDAJCSMgZmFrZSByZXR1cm4gYWRkcmVzcyB0byBzdG9wIHVud2luZGVyCisJcHVzaHEJJF9fS0VSTkVMX0NTCSMgc2V0IGNvcnJlY3QgY3MKKwlwdXNocQklcmF4CQkjIHRhcmdldCBhZGRyZXNzIGluIG5lZ2F0aXZlIHNwYWNlCisJbHJldHEKIAogCS8qIFNNUCBib290dXAgY2hhbmdlcyB0aGVzZSB0d28gKi8KIAkuYWxpZ24JOApAQCAtMzcxLDcgKzM3Miw3IEBACiAJLnF1YWQJMCwwCQkJLyogVFNTICovCiAJLnF1YWQJMCwwCQkJLyogTERUICovCiAJLnF1YWQgICAwLDAsMAkJCS8qIHRocmVlIFRMUyBkZXNjcmlwdG9ycyAqLyAKLQkucXVhZAkwCQkJLyogdW51c2VkICovCisJLnF1YWQJMHgwMDAwZjQwMDAwMDAwMDAwCS8qIG5vZGUvQ1BVIHN0b3JlZCBpbiBsaW1pdCAqLwogZ2R0X2VuZDoJCiAJLyogYXNtL3NlZ21lbnQuaDpHRFRfRU5UUklFUyBtdXN0IG1hdGNoIHRoaXMgKi8JCiAJLyogVGhpcyBzaG91bGQgYmUgYSBtdWx0aXBsZSBvZiB0aGUgY2FjaGUgbGluZSBzaXplICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZDY0LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZDY0LmMKaW5kZXggMzY2NDdjZS4uOTU2MWViMyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2hlYWQ2NC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9oZWFkNjQuYwpAQCAtNDUsMzggKzQ1LDE2IEBACiAJbmV3X2RhdGEgPSAqKGludCAqKSAoeDg2X2Jvb3RfcGFyYW1zICsgTkVXX0NMX1BPSU5URVIpOwogCWlmICghbmV3X2RhdGEpIHsKIAkJaWYgKE9MRF9DTF9NQUdJQyAhPSAqICh1MTYgKikgT0xEX0NMX01BR0lDX0FERFIpIHsKLQkJCXByaW50aygic28gb2xkIGJvb3Rsb2FkZXIgdGhhdCBpdCBkb2VzIG5vdCBzdXBwb3J0IGNvbW1hbmRsaW5lPyFcbiIpOwogCQkJcmV0dXJuOwogCQl9CiAJCW5ld19kYXRhID0gT0xEX0NMX0JBU0VfQUREUiArICogKHUxNiAqKSBPTERfQ0xfT0ZGU0VUOwotCQlwcmludGsoIm9sZCBib290bG9hZGVyIGNvbnZlbnRpb24sIG1heWJlIGxvYWRsaW4/XG4iKTsKIAl9CiAJY29tbWFuZF9saW5lID0gKGNoYXIgKikgKCh1NjQpKG5ld19kYXRhKSk7CiAJbWVtY3B5KHNhdmVkX2NvbW1hbmRfbGluZSwgY29tbWFuZF9saW5lLCBDT01NQU5EX0xJTkVfU0laRSk7Ci0JcHJpbnRrKCJCb290ZGF0YSBvayAoY29tbWFuZCBsaW5lIGlzICVzKVxuIiwgc2F2ZWRfY29tbWFuZF9saW5lKTsJCi19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9ib290X2NwdV9kYXRhKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IGR1bW15LCBlYXg7Ci0KLQkvKiBnZXQgdmVuZG9yIGluZm8gKi8KLQljcHVpZCgwLCAodW5zaWduZWQgaW50ICopJmJvb3RfY3B1X2RhdGEuY3B1aWRfbGV2ZWwsCi0JICAgICAgKHVuc2lnbmVkIGludCAqKSZib290X2NwdV9kYXRhLng4Nl92ZW5kb3JfaWRbMF0sCi0JICAgICAgKHVuc2lnbmVkIGludCAqKSZib290X2NwdV9kYXRhLng4Nl92ZW5kb3JfaWRbOF0sCi0JICAgICAgKHVuc2lnbmVkIGludCAqKSZib290X2NwdV9kYXRhLng4Nl92ZW5kb3JfaWRbNF0pOwotCi0JLyogZ2V0IGNwdSB0eXBlICovCi0JY3B1aWQoMSwgJmVheCwgJmR1bW15LCAmZHVtbXksCi0JCSh1bnNpZ25lZCBpbnQgKikgJmJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpOwotCWJvb3RfY3B1X2RhdGEueDg2ID0gKGVheCA+PiA4KSAmIDB4ZjsKLQlib290X2NwdV9kYXRhLng4Nl9tb2RlbCA9IChlYXggPj4gNCkgJiAweGY7Ci0JYm9vdF9jcHVfZGF0YS54ODZfbWFzayA9IGVheCAmIDB4ZjsKIH0KIAogdm9pZCBfX2luaXQgeDg2XzY0X3N0YXJ0X2tlcm5lbChjaGFyICogcmVhbF9tb2RlX2RhdGEpCiB7Ci0JY2hhciAqczsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKQEAgLTg0LDEwICs2Miw3IEBACiAJYXNtIHZvbGF0aWxlKCJsaWR0ICUwIiA6OiAibSIgKGlkdF9kZXNjcikpOwogCWNsZWFyX2JzcygpOwogCi0JLyoKLQkgKiBUaGlzIG11c3QgYmUgY2FsbGVkIHJlYWxseSwgcmVhbGx5IGVhcmx5OgotCSAqLwotCWxvY2tkZXBfaW5pdCgpOworCWVhcmx5X3ByaW50aygiS2VybmVsIGFsaXZlXG4iKTsKIAogCS8qCiAJICogc3dpdGNoIHRvIGluaXRfbGV2ZWw0X3BndCBmcm9tIGJvb3RfbGV2ZWw0X3BndApAQCAtMTAzLDIyICs3OCw1IEBACiAjaWZkZWYgQ09ORklHX1NNUAogCWNwdV9zZXQoMCwgY3B1X29ubGluZV9tYXApOwogI2VuZGlmCi0JcyA9IHN0cnN0cihzYXZlZF9jb21tYW5kX2xpbmUsICJlYXJseXByaW50az0iKTsKLQlpZiAocyAhPSBOVUxMKQotCQlzZXR1cF9lYXJseV9wcmludGsoc3RyY2hyKHMsICc9JykgKyAxKTsKLSNpZmRlZiBDT05GSUdfTlVNQQotCXMgPSBzdHJzdHIoc2F2ZWRfY29tbWFuZF9saW5lLCAibnVtYT0iKTsKLQlpZiAocyAhPSBOVUxMKQotCQludW1hX3NldHVwKHMrNSk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKLQlpZiAoc3Ryc3RyKHNhdmVkX2NvbW1hbmRfbGluZSwgImRpc2FibGVhcGljIikpCi0JCWRpc2FibGVfYXBpYyA9IDE7Ci0jZW5kaWYKLQkvKiBZb3UgbmVlZCBlYXJseSBjb25zb2xlIHRvIHNlZSB0aGF0ICovCi0JaWYgKF9fcGFfc3ltYm9sKCZfZW5kKSA+PSBLRVJORUxfVEVYVF9TSVpFKQotCQlwYW5pYygiS2VybmVsIHRvbyBiaWcgZm9yIGtlcm5lbCBtYXBwaW5nXG4iKTsKLQotCXNldHVwX2Jvb3RfY3B1X2RhdGEoKTsKIAlzdGFydF9rZXJuZWwoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9pODI1OS5jIGIvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMKaW5kZXggMDQzNGIxZi4uMmRkNTFmMyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMKQEAgLTU1LDcgKzU1LDYgQEAKICAqLwogQlVJTERfMTZfSVJRUygweDApCiAKLSNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIC8qCiAgKiBUaGUgSU8tQVBJQyBnaXZlcyB1cyBtYW55IG1vcmUgaW50ZXJydXB0IHNvdXJjZXMuIE1vc3Qgb2YgdGhlc2UgCiAgKiBhcmUgdW51c2VkIGJ1dCBhbiBTTVAgc3lzdGVtIGlzIHN1cHBvc2VkIHRvIGhhdmUgZW5vdWdoIG1lbW9yeSAuLi4KQEAgLTc1LDggKzc0LDYgQEAKIAlCVUlMRF8xNV9JUlFTKDB4ZSkKICNlbmRpZgogCi0jZW5kaWYKLQogI3VuZGVmIEJVSUxEXzE2X0lSUVMKICN1bmRlZiBCVUlMRF8xNV9JUlFTCiAjdW5kZWYgQkkKQEAgLTEwMCw3ICs5Nyw2IEBACiB2b2lkICgqaW50ZXJydXB0W05SX0lSUVNdKSh2b2lkKSA9IHsKIAlJUlFMSVNUXzE2KDB4MCksCiAKLSNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKIAkJCSBJUlFMSVNUXzE2KDB4MSksIElSUUxJU1RfMTYoMHgyKSwgSVJRTElTVF8xNigweDMpLAogCUlSUUxJU1RfMTYoMHg0KSwgSVJRTElTVF8xNigweDUpLCBJUlFMSVNUXzE2KDB4NiksIElSUUxJU1RfMTYoMHg3KSwKIAlJUlFMSVNUXzE2KDB4OCksIElSUUxJU1RfMTYoMHg5KSwgSVJRTElTVF8xNigweGEpLCBJUlFMSVNUXzE2KDB4YiksCkBAIC0xMTAsNyArMTA2LDYgQEAKIAksIElSUUxJU1RfMTUoMHhlKQogI2VuZGlmCiAKLSNlbmRpZgogfTsKIAogI3VuZGVmIElSUQpAQCAtMTI4LDYgKzEyMyw4IEBACiAKIERFRklORV9TUElOTE9DSyhpODI1OUFfbG9jayk7CiAKK3N0YXRpYyBpbnQgaTgyNTlBX2F1dG9fZW9pOworCiBzdGF0aWMgdm9pZCBlbmRfODI1OUFfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQogewogCWlmIChpcnEgPiAyNTYpIHsgCkBAIC0zNDEsNiArMzM4LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJaTgyNTlBX2F1dG9fZW9pID0gYXV0b19lb2k7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTlBX2xvY2ssIGZsYWdzKTsKIAogCW91dGIoMHhmZiwgMHgyMSk7CS8qIG1hc2sgYWxsIG9mIDgyNTlBLTEgKi8KQEAgLTM5OSw3ICszOTgsNyBAQAogCiBzdGF0aWMgaW50IGk4MjU5QV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKIHsKLQlpbml0XzgyNTlBKDApOworCWluaXRfODI1OUEoaTgyNTlBX2F1dG9fZW9pKTsKIAlyZXN0b3JlX0VMQ1IoaXJxX3RyaWdnZXIpOwogCXJldHVybiAwOwogfQpAQCAtNDUzLDkgKzQ1Miw3IEBACiB7CiAJaW50IGk7CiAKLSNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIAlpbml0X2JzcF9BUElDKCk7Ci0jZW5kaWYKIAlpbml0XzgyNTlBKDApOwogCiAJZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgewpAQCAtNTgxLDE0ICs1NzgsMTIgQEAKIAlzZXRfaW50cl9nYXRlKFRIRVJNQUxfQVBJQ19WRUNUT1IsIHRoZXJtYWxfaW50ZXJydXB0KTsKIAlzZXRfaW50cl9nYXRlKFRIUkVTSE9MRF9BUElDX1ZFQ1RPUiwgdGhyZXNob2xkX2ludGVycnVwdCk7CiAKLSNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIAkvKiBzZWxmIGdlbmVyYXRlZCBJUEkgZm9yIGxvY2FsIEFQSUMgdGltZXIgKi8KIAlzZXRfaW50cl9nYXRlKExPQ0FMX1RJTUVSX1ZFQ1RPUiwgYXBpY190aW1lcl9pbnRlcnJ1cHQpOwogCiAJLyogSVBJIHZlY3RvcnMgZm9yIEFQSUMgc3B1cmlvdXMgYW5kIGVycm9yIGludGVycnVwdHMgKi8KIAlzZXRfaW50cl9nYXRlKFNQVVJJT1VTX0FQSUNfVkVDVE9SLCBzcHVyaW91c19pbnRlcnJ1cHQpOwogCXNldF9pbnRyX2dhdGUoRVJST1JfQVBJQ19WRUNUT1IsIGVycm9yX2ludGVycnVwdCk7Ci0jZW5kaWYKIAogCS8qCiAJICogU2V0IHRoZSBjbG9jayB0byBIWiBIeiwgd2UgYWxyZWFkeSBoYXZlIGEgdmFsaWQKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jCmluZGV4IDkyNGE0YTMuLjA0OTEwMTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYwpAQCAtNDgsNyArNDgsNyBAQAogCiBzdGF0aWMgaW50IG5vX3RpbWVyX2NoZWNrOwogCi1pbnQgZGlzYWJsZV90aW1lcl9waW5fMSBfX2luaXRkYXRhOworc3RhdGljIGludCBkaXNhYmxlX3RpbWVyX3Bpbl8xIF9faW5pdGRhdGE7CiAKIGludCB0aW1lcl9vdmVyXzgyNTQgX19pbml0ZGF0YSA9IDA7CiAKQEAgLTExMSw2ICsxMTEsMzMgQEAKIAlGSU5BTDsJCQkJCQkJCVwKIH0KIAordW5pb24gZW50cnlfdW5pb24geworCXN0cnVjdCB7IHUzMiB3MSwgdzI7IH07CisJc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgZW50cnk7Cit9OworCitzdGF0aWMgc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgaW9hcGljX3JlYWRfZW50cnkoaW50IGFwaWMsIGludCBwaW4pCit7CisJdW5pb24gZW50cnlfdW5pb24gZXU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlldS53MSA9IGlvX2FwaWNfcmVhZChhcGljLCAweDEwICsgMiAqIHBpbik7CisJZXUudzIgPSBpb19hcGljX3JlYWQoYXBpYywgMHgxMSArIDIgKiBwaW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGV1LmVudHJ5OworfQorCitzdGF0aWMgdm9pZCBpb2FwaWNfd3JpdGVfZW50cnkoaW50IGFwaWMsIGludCBwaW4sIHN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bmlvbiBlbnRyeV91bmlvbiBldTsKKwlldS5lbnRyeSA9IGU7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJaW9fYXBpY193cml0ZShhcGljLCAweDEwICsgMipwaW4sIGV1LncxKTsKKwlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTEgKyAyKnBpbiwgZXUudzIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Cit9CisKICNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdm9pZCBzZXRfaW9hcGljX2FmZmluaXR5X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKIHsKQEAgLTE5NiwxMyArMjIzLDkgQEAKIHN0YXRpYyB2b2lkIGNsZWFyX0lPX0FQSUNfcGluKHVuc2lnbmVkIGludCBhcGljLCB1bnNpZ25lZCBpbnQgcGluKQogewogCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGVudHJ5OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBDaGVjayBkZWxpdmVyeV9tb2RlIHRvIGJlIHN1cmUgd2UncmUgbm90IGNsZWFyaW5nIGFuIFNNSSBwaW4gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLQkqKCgoaW50KikmZW50cnkpICsgMCkgPSBpb19hcGljX3JlYWQoYXBpYywgMHgxMCArIDIgKiBwaW4pOwotCSooKChpbnQqKSZlbnRyeSkgKyAxKSA9IGlvX2FwaWNfcmVhZChhcGljLCAweDExICsgMiAqIHBpbik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwllbnRyeSA9IGlvYXBpY19yZWFkX2VudHJ5KGFwaWMsIHBpbik7CiAJaWYgKGVudHJ5LmRlbGl2ZXJ5X21vZGUgPT0gZGVzdF9TTUkpCiAJCXJldHVybjsKIAkvKgpAQCAtMjEwLDEwICsyMzMsNyBAQAogCSAqLwogCW1lbXNldCgmZW50cnksIDAsIHNpemVvZihlbnRyeSkpOwogCWVudHJ5Lm1hc2sgPSAxOwotCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMCArIDIgKiBwaW4sICooKChpbnQgKikmZW50cnkpICsgMCkpOwotCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMSArIDIgKiBwaW4sICooKChpbnQgKikmZW50cnkpICsgMSkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJaW9hcGljX3dyaXRlX2VudHJ5KGFwaWMsIHBpbiwgZW50cnkpOwogfQogCiBzdGF0aWMgdm9pZCBjbGVhcl9JT19BUElDICh2b2lkKQpAQCAtMjI1LDE0ICsyNDUsNiBAQAogCQkJY2xlYXJfSU9fQVBJQ19waW4oYXBpYywgcGluKTsKIH0KIAotLyoKLSAqIHN1cHBvcnQgZm9yIGJyb2tlbiBNUCBCSU9TcywgZW5hYmxlcyBoYW5kLXJlZGlyZWN0aW9uIG9mIFBJUlEwLTcgdG8KLSAqIHNwZWNpZmljIENQVS1zaWRlIElSUXMuCi0gKi8KLQotI2RlZmluZSBNQVhfUElSUVMgOAotc3RhdGljIGludCBwaXJxX2VudHJpZXMgW01BWF9QSVJRU107Ci1zdGF0aWMgaW50IHBpcnFzX2VuYWJsZWQ7CiBpbnQgc2tpcF9pb2FwaWNfc2V0dXA7CiBpbnQgaW9hcGljX2ZvcmNlOwogCkBAIC0yNDEsMTggKzI1MywxNyBAQAogc3RhdGljIGludCBfX2luaXQgZGlzYWJsZV9pb2FwaWNfc2V0dXAoY2hhciAqc3RyKQogewogCXNraXBfaW9hcGljX3NldHVwID0gMTsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0KK2Vhcmx5X3BhcmFtKCJub2FwaWMiLCBkaXNhYmxlX2lvYXBpY19zZXR1cCk7CiAKLXN0YXRpYyBpbnQgX19pbml0IGVuYWJsZV9pb2FwaWNfc2V0dXAoY2hhciAqc3RyKQorLyogQWN0dWFsbHkgdGhlIG5leHQgaXMgb2Jzb2xldGUsIGJ1dCBrZWVwIGl0IGZvciBwYXJhbm9pZCByZWFzb25zIC1BSyAqLworc3RhdGljIGludCBfX2luaXQgZGlzYWJsZV90aW1lcl9waW5fc2V0dXAoY2hhciAqYXJnKQogewotCWlvYXBpY19mb3JjZSA9IDE7Ci0Jc2tpcF9pb2FwaWNfc2V0dXAgPSAwOworCWRpc2FibGVfdGltZXJfcGluXzEgPSAxOwogCXJldHVybiAxOwogfQotCi1fX3NldHVwKCJub2FwaWMiLCBkaXNhYmxlX2lvYXBpY19zZXR1cCk7Ci1fX3NldHVwKCJhcGljIiwgZW5hYmxlX2lvYXBpY19zZXR1cCk7CitfX3NldHVwKCJkaXNhYmxlX3RpbWVyX3Bpbl8xIiwgZGlzYWJsZV90aW1lcl9waW5fc2V0dXApOwogCiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9kaXNhYmxlXzgyNTRfdGltZXIoY2hhciAqcykKIHsKQEAgLTI2OCwxMzUgKzI3OSw2IEBACiBfX3NldHVwKCJkaXNhYmxlXzgyNTRfdGltZXIiLCBzZXR1cF9kaXNhYmxlXzgyNTRfdGltZXIpOwogX19zZXR1cCgiZW5hYmxlXzgyNTRfdGltZXIiLCBzZXR1cF9lbmFibGVfODI1NF90aW1lcik7CiAKLSNpbmNsdWRlIDxhc20vcGNpLWRpcmVjdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotCi0jaWZkZWYgQ09ORklHX0FDUEkKLQotc3RhdGljIGludCBudmlkaWFfaHBldF9kZXRlY3RlZCBfX2luaXRkYXRhOwotCi1zdGF0aWMgaW50IF9faW5pdCBudmlkaWFfaHBldF9jaGVjayh1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQludmlkaWFfaHBldF9kZXRlY3RlZCA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyogVGVtcG9yYXJ5IEhhY2suIE52aWRpYSBhbmQgVklBIGJvYXJkcyBjdXJyZW50bHkgb25seSB3b3JrIHdpdGggSU8tQVBJQwotICAgb2ZmLiBDaGVjayBmb3IgYW4gTnZpZGlhIG9yIFZJQSBQQ0kgYnJpZGdlIGFuZCB0dXJuIGl0IG9mZi4KLSAgIFVzZSBwY2kgZGlyZWN0IGluZnJhc3RydWN0dXJlIGJlY2F1c2UgdGhpcyBydW5zIGJlZm9yZSB0aGUgUENJIHN1YnN5c3RlbS4gCi0KLSAgIENhbiBiZSBvdmVyd3JpdHRlbiB3aXRoICJhcGljIgotCi0gICBBbmQgYW5vdGhlciBoYWNrIHRvIGRpc2FibGUgdGhlIElPTU1VIG9uIFZJQSBjaGlwc2V0cy4KLQotICAgLi4uIGFuZCBvdGhlcnMuIFJlYWxseSBzaG91bGQgbW92ZSB0aGlzIHNvbWV3aGVyZSBlbHNlLgotCi0gICBLbHVkZ2UtTy1SYW1hLiAqLwotdm9pZCBfX2luaXQgY2hlY2tfaW9hcGljKHZvaWQpIAoteyAKLQlpbnQgbnVtLHNsb3QsZnVuYzsgCi0JLyogUG9vciBtYW4ncyBQQ0kgZGlzY292ZXJ5ICovCi0JZm9yIChudW0gPSAwOyBudW0gPCAzMjsgbnVtKyspIHsgCi0JCWZvciAoc2xvdCA9IDA7IHNsb3QgPCAzMjsgc2xvdCsrKSB7IAotCQkJZm9yIChmdW5jID0gMDsgZnVuYyA8IDg7IGZ1bmMrKykgeyAKLQkJCQl1MzIgY2xhc3M7Ci0JCQkJdTMyIHZlbmRvcjsKLQkJCQl1OCB0eXBlOwotCQkJCWNsYXNzID0gcmVhZF9wY2lfY29uZmlnKG51bSxzbG90LGZ1bmMsCi0JCQkJCQkJUENJX0NMQVNTX1JFVklTSU9OKTsKLQkJCQlpZiAoY2xhc3MgPT0gMHhmZmZmZmZmZikKLQkJCQkJYnJlYWs7IAotCi0JCSAgICAgICAJCWlmICgoY2xhc3MgPj4gMTYpICE9IFBDSV9DTEFTU19CUklER0VfUENJKQotCQkJCQljb250aW51ZTsgCi0KLQkJCQl2ZW5kb3IgPSByZWFkX3BjaV9jb25maWcobnVtLCBzbG90LCBmdW5jLCAKLQkJCQkJCQkgUENJX1ZFTkRPUl9JRCk7Ci0JCQkJdmVuZG9yICY9IDB4ZmZmZjsKLQkJCQlzd2l0Y2ggKHZlbmRvcikgeyAKLQkJCQljYXNlIFBDSV9WRU5ET1JfSURfVklBOgotI2lmZGVmIENPTkZJR19JT01NVQotCQkJCQlpZiAoKGVuZF9wZm4gPiBNQVhfRE1BMzJfUEZOIHx8Ci0JCQkJCSAgICAgZm9yY2VfaW9tbXUpICYmCi0JCQkJCSAgICAhaW9tbXVfYXBlcnR1cmVfYWxsb3dlZCkgewotCQkJCQkJcHJpbnRrKEtFUk5fSU5GTwotICAgICJMb29rcyBsaWtlIGEgVklBIGNoaXBzZXQuIERpc2FibGluZyBJT01NVS4gT3ZlcnJpZGUgd2l0aCBcImlvbW11PWFsbG93ZWRcIlxuIik7Ci0JCQkJCQlpb21tdV9hcGVydHVyZV9kaXNhYmxlZCA9IDE7Ci0JCQkJCX0KLSNlbmRpZgotCQkJCQlyZXR1cm47Ci0JCQkJY2FzZSBQQ0lfVkVORE9SX0lEX05WSURJQToKLSNpZmRlZiBDT05GSUdfQUNQSQotCQkJCQkvKgotCQkJCQkgKiBBbGwgdGltZXIgb3ZlcnJpZGVzIG9uIE52aWRpYSBhcmUKLQkJCQkJICogd3JvbmcgdW5sZXNzIEhQRVQgaXMgZW5hYmxlZC4KLQkJCQkJICovCi0JCQkJCW52aWRpYV9ocGV0X2RldGVjdGVkID0gMDsKLQkJCQkJYWNwaV90YWJsZV9wYXJzZShBQ1BJX0hQRVQsCi0JCQkJCQkJbnZpZGlhX2hwZXRfY2hlY2spOwotCQkJCQlpZiAobnZpZGlhX2hwZXRfZGV0ZWN0ZWQgPT0gMCkgewotCQkJCQkJYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlID0gMTsKLQkJCQkJCXByaW50ayhLRVJOX0lORk8gIk52aWRpYSBib2FyZCAiCi0JCQkJCQkgICAgImRldGVjdGVkLiBJZ25vcmluZyBBQ1BJICIKLQkJCQkJCSAgICAidGltZXIgb3ZlcnJpZGUuXG4iKTsKLQkJCQkJfQotI2VuZGlmCi0JCQkJCS8qIFJFRC1QRU4gc2tpcCB0aGVtIG9uIG1wdGFibGVzIHRvbz8gKi8KLQkJCQkJcmV0dXJuOwotCi0JCQkJLyogVGhpcyBzaG91bGQgYmUgYWN0dWFsbHkgZGVmYXVsdCwgYnV0Ci0JCQkJICAgZm9yIDIuNi4xNiBsZXQncyBkbyBpdCBmb3IgQVRJIG9ubHkgd2hlcmUKLQkJCQkgICBpdCdzIHJlYWxseSBuZWVkZWQuICovCi0JCQkJY2FzZSBQQ0lfVkVORE9SX0lEX0FUSToKLQkJCQkJaWYgKHRpbWVyX292ZXJfODI1NCA9PSAxKSB7CQotCQkJCQkJdGltZXJfb3Zlcl84MjU0ID0gMDsJCi0JCQkJCXByaW50ayhLRVJOX0lORk8KLQkJIkFUSSBib2FyZCBkZXRlY3RlZC4gRGlzYWJsaW5nIHRpbWVyIHJvdXRpbmcgb3ZlciA4MjU0LlxuIik7Ci0JCQkJCX0JCi0JCQkJCXJldHVybjsKLQkJCQl9IAotCi0KLQkJCQkvKiBObyBtdWx0aS1mdW5jdGlvbiBkZXZpY2U/ICovCi0JCQkJdHlwZSA9IHJlYWRfcGNpX2NvbmZpZ19ieXRlKG51bSxzbG90LGZ1bmMsCi0JCQkJCQkJICAgIFBDSV9IRUFERVJfVFlQRSk7Ci0JCQkJaWYgKCEodHlwZSAmIDB4ODApKQotCQkJCQlicmVhazsKLQkJCX0gCi0JCX0KLQl9Ci19IAotCi1zdGF0aWMgaW50IF9faW5pdCBpb2FwaWNfcGlycV9zZXR1cChjaGFyICpzdHIpCi17Ci0JaW50IGksIG1heDsKLQlpbnQgaW50c1tNQVhfUElSUVMrMV07Ci0KLQlnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9QSVJRUzsgaSsrKQotCQlwaXJxX2VudHJpZXNbaV0gPSAtMTsKLQotCXBpcnFzX2VuYWJsZWQgPSAxOwotCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIlBJUlEgcmVkaXJlY3Rpb24sIHdvcmtpbmcgYXJvdW5kIGJyb2tlbiBNUC1CSU9TLlxuIik7Ci0JbWF4ID0gTUFYX1BJUlFTOwotCWlmIChpbnRzWzBdIDwgTUFYX1BJUlFTKQotCQltYXggPSBpbnRzWzBdOwotCi0JZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0JCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLiBQSVJRJWQgLT4gSVJRICVkXG4iLCBpLCBpbnRzW2krMV0pOwotCQkvKgotCQkgKiBQSVJRcyBhcmUgbWFwcGVkIHVwc2lkZSBkb3duLCB1c3VhbGx5LgotCQkgKi8KLQkJcGlycV9lbnRyaWVzW01BWF9QSVJRUy1pLTFdID0gaW50c1tpKzFdOwotCX0KLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgicGlycT0iLCBpb2FwaWNfcGlycV9zZXR1cCk7CiAKIC8qCiAgKiBGaW5kIHRoZSBJUlEgZW50cnkgbnVtYmVyIG9mIGEgY2VydGFpbiBwaW4uCkBAIC00MjUsOSArMzA3LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbXBfaXJxX2VudHJpZXM7IGkrKykgewogCQlpbnQgbGJ1cyA9IG1wX2lycXNbaV0ubXBjX3NyY2J1czsKIAotCQlpZiAoKG1wX2J1c19pZF90b190eXBlW2xidXNdID09IE1QX0JVU19JU0EgfHwKLQkJICAgICBtcF9idXNfaWRfdG9fdHlwZVtsYnVzXSA9PSBNUF9CVVNfRUlTQSB8fAotCQkgICAgIG1wX2J1c19pZF90b190eXBlW2xidXNdID09IE1QX0JVU19NQ0EpICYmCisJCWlmICh0ZXN0X2JpdChsYnVzLCBtcF9idXNfbm90X3BjaSkgJiYKIAkJICAgIChtcF9pcnFzW2ldLm1wY19pcnF0eXBlID09IHR5cGUpICYmCiAJCSAgICAobXBfaXJxc1tpXS5tcGNfc3JjYnVzaXJxID09IGlycSkpCiAKQEAgLTQ0Myw5ICszMjMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBtcF9pcnFfZW50cmllczsgaSsrKSB7CiAJCWludCBsYnVzID0gbXBfaXJxc1tpXS5tcGNfc3JjYnVzOwogCi0JCWlmICgobXBfYnVzX2lkX3RvX3R5cGVbbGJ1c10gPT0gTVBfQlVTX0lTQSB8fAotCQkgICAgIG1wX2J1c19pZF90b190eXBlW2xidXNdID09IE1QX0JVU19FSVNBIHx8Ci0JCSAgICAgbXBfYnVzX2lkX3RvX3R5cGVbbGJ1c10gPT0gTVBfQlVTX01DQSkgJiYKKwkJaWYgKHRlc3RfYml0KGxidXMsIG1wX2J1c19ub3RfcGNpKSAmJgogCQkgICAgKG1wX2lycXNbaV0ubXBjX2lycXR5cGUgPT0gdHlwZSkgJiYKIAkJICAgIChtcF9pcnFzW2ldLm1wY19zcmNidXNpcnEgPT0gaXJxKSkKIAkJCWJyZWFrOwpAQCAtNDg1LDcgKzM2Myw3IEBACiAJCQkgICAgbXBfaXJxc1tpXS5tcGNfZHN0YXBpYyA9PSBNUF9BUElDX0FMTCkKIAkJCQlicmVhazsKIAotCQlpZiAoKG1wX2J1c19pZF90b190eXBlW2xidXNdID09IE1QX0JVU19QQ0kpICYmCisJCWlmICghdGVzdF9iaXQobGJ1cywgbXBfYnVzX25vdF9wY2kpICYmCiAJCSAgICAhbXBfaXJxc1tpXS5tcGNfaXJxdHlwZSAmJgogCQkgICAgKGJ1cyA9PSBsYnVzKSAmJgogCQkgICAgKHNsb3QgPT0gKChtcF9pcnFzW2ldLm1wY19zcmNidXNpcnEgPj4gMikgJiAweDFmKSkpIHsKQEAgLTUwOCwyNyArMzg2LDYgQEAKIAlyZXR1cm4gYmVzdF9ndWVzczsKIH0KIAotLyoKLSAqIEVJU0EgRWRnZS9MZXZlbCBjb250cm9sIHJlZ2lzdGVyLCBFTENSCi0gKi8KLXN0YXRpYyBpbnQgRUlTQV9FTENSKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JaWYgKGlycSA8IDE2KSB7Ci0JCXVuc2lnbmVkIGludCBwb3J0ID0gMHg0ZDAgKyAoaXJxID4+IDMpOwotCQlyZXR1cm4gKGluYihwb3J0KSA+PiAoaXJxICYgNykpICYgMTsKLQl9Ci0JYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiQnJva2VuIE1QdGFibGUgcmVwb3J0cyBJU0EgaXJxICVkXG4iLCBpcnEpOwotCXJldHVybiAwOwotfQotCi0vKiBFSVNBIGludGVycnVwdHMgYXJlIGFsd2F5cyBwb2xhcml0eSB6ZXJvIGFuZCBjYW4gYmUgZWRnZSBvciBsZXZlbAotICogdHJpZ2dlciBkZXBlbmRpbmcgb24gdGhlIEVMQ1IgdmFsdWUuICBJZiBhbiBpbnRlcnJ1cHQgaXMgbGlzdGVkIGFzCi0gKiBFSVNBIGNvbmZvcm1pbmcgaW4gdGhlIE1QIHRhYmxlLCB0aGF0IG1lYW5zIGl0cyB0cmlnZ2VyIHR5cGUgbXVzdAotICogYmUgcmVhZCBpbiBmcm9tIHRoZSBFTENSICovCi0KLSNkZWZpbmUgZGVmYXVsdF9FSVNBX3RyaWdnZXIoaWR4KQkoRUlTQV9FTENSKG1wX2lycXNbaWR4XS5tcGNfc3JjYnVzaXJxKSkKLSNkZWZpbmUgZGVmYXVsdF9FSVNBX3BvbGFyaXR5KGlkeCkJKDApCi0KIC8qIElTQSBpbnRlcnJ1cHRzIGFyZSBhbHdheXMgcG9sYXJpdHkgemVybyBlZGdlIHRyaWdnZXJlZCwKICAqIHdoZW4gbGlzdGVkIGFzIGNvbmZvcm1pbmcgaW4gdGhlIE1QIHRhYmxlLiAqLwogCkBAIC01NDEsMTIgKzM5OCw2IEBACiAjZGVmaW5lIGRlZmF1bHRfUENJX3RyaWdnZXIoaWR4KQkoMSkKICNkZWZpbmUgZGVmYXVsdF9QQ0lfcG9sYXJpdHkoaWR4KQkoMSkKIAotLyogTUNBIGludGVycnVwdHMgYXJlIGFsd2F5cyBwb2xhcml0eSB6ZXJvIGxldmVsIHRyaWdnZXJlZCwKLSAqIHdoZW4gbGlzdGVkIGFzIGNvbmZvcm1pbmcgaW4gdGhlIE1QIHRhYmxlLiAqLwotCi0jZGVmaW5lIGRlZmF1bHRfTUNBX3RyaWdnZXIoaWR4KQkoMSkKLSNkZWZpbmUgZGVmYXVsdF9NQ0FfcG9sYXJpdHkoaWR4KQkoMCkKLQogc3RhdGljIGludCBfX2luaXQgTVBCSU9TX3BvbGFyaXR5KGludCBpZHgpCiB7CiAJaW50IGJ1cyA9IG1wX2lycXNbaWR4XS5tcGNfc3JjYnVzOwpAQCAtNTU4LDM4ICs0MDksMTEgQEAKIAlzd2l0Y2ggKG1wX2lycXNbaWR4XS5tcGNfaXJxZmxhZyAmIDMpCiAJewogCQljYXNlIDA6IC8qIGNvbmZvcm1zLCBpZS4gYnVzLXR5cGUgZGVwZW5kZW50IHBvbGFyaXR5ICovCi0JCXsKLQkJCXN3aXRjaCAobXBfYnVzX2lkX3RvX3R5cGVbYnVzXSkKLQkJCXsKLQkJCQljYXNlIE1QX0JVU19JU0E6IC8qIElTQSBwaW4gKi8KLQkJCQl7Ci0JCQkJCXBvbGFyaXR5ID0gZGVmYXVsdF9JU0FfcG9sYXJpdHkoaWR4KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTVBfQlVTX0VJU0E6IC8qIEVJU0EgcGluICovCi0JCQkJewotCQkJCQlwb2xhcml0eSA9IGRlZmF1bHRfRUlTQV9wb2xhcml0eShpZHgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBNUF9CVVNfUENJOiAvKiBQQ0kgcGluICovCi0JCQkJewotCQkJCQlwb2xhcml0eSA9IGRlZmF1bHRfUENJX3BvbGFyaXR5KGlkeCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE1QX0JVU19NQ0E6IC8qIE1DQSBwaW4gKi8KLQkJCQl7Ci0JCQkJCXBvbGFyaXR5ID0gZGVmYXVsdF9NQ0FfcG9sYXJpdHkoaWR4KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRlZmF1bHQ6Ci0JCQkJewotCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJicm9rZW4gQklPUyEhXG4iKTsKLQkJCQkJcG9sYXJpdHkgPSAxOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9CisJCQlpZiAodGVzdF9iaXQoYnVzLCBtcF9idXNfbm90X3BjaSkpCisJCQkJcG9sYXJpdHkgPSBkZWZhdWx0X0lTQV9wb2xhcml0eShpZHgpOworCQkJZWxzZQorCQkJCXBvbGFyaXR5ID0gZGVmYXVsdF9QQ0lfcG9sYXJpdHkoaWR4KTsKIAkJCWJyZWFrOwotCQl9CiAJCWNhc2UgMTogLyogaGlnaCBhY3RpdmUgKi8KIAkJewogCQkJcG9sYXJpdHkgPSAwOwpAQCAtNjI3LDM4ICs0NTEsMTEgQEAKIAlzd2l0Y2ggKChtcF9pcnFzW2lkeF0ubXBjX2lycWZsYWc+PjIpICYgMykKIAl7CiAJCWNhc2UgMDogLyogY29uZm9ybXMsIGllLiBidXMtdHlwZSBkZXBlbmRlbnQgKi8KLQkJewotCQkJc3dpdGNoIChtcF9idXNfaWRfdG9fdHlwZVtidXNdKQotCQkJewotCQkJCWNhc2UgTVBfQlVTX0lTQTogLyogSVNBIHBpbiAqLwotCQkJCXsKLQkJCQkJdHJpZ2dlciA9IGRlZmF1bHRfSVNBX3RyaWdnZXIoaWR4KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTVBfQlVTX0VJU0E6IC8qIEVJU0EgcGluICovCi0JCQkJewotCQkJCQl0cmlnZ2VyID0gZGVmYXVsdF9FSVNBX3RyaWdnZXIoaWR4KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTVBfQlVTX1BDSTogLyogUENJIHBpbiAqLwotCQkJCXsKLQkJCQkJdHJpZ2dlciA9IGRlZmF1bHRfUENJX3RyaWdnZXIoaWR4KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTVBfQlVTX01DQTogLyogTUNBIHBpbiAqLwotCQkJCXsKLQkJCQkJdHJpZ2dlciA9IGRlZmF1bHRfTUNBX3RyaWdnZXIoaWR4KTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRlZmF1bHQ6Ci0JCQkJewotCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJicm9rZW4gQklPUyEhXG4iKTsKLQkJCQkJdHJpZ2dlciA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KKwkJCWlmICh0ZXN0X2JpdChidXMsIG1wX2J1c19ub3RfcGNpKSkKKwkJCQl0cmlnZ2VyID0gZGVmYXVsdF9JU0FfdHJpZ2dlcihpZHgpOworCQkJZWxzZQorCQkJCXRyaWdnZXIgPSBkZWZhdWx0X1BDSV90cmlnZ2VyKGlkeCk7CiAJCQlicmVhazsKLQkJfQogCQljYXNlIDE6IC8qIGVkZ2UgKi8KIAkJewogCQkJdHJpZ2dlciA9IDA7CkBAIC03NjQsNDkgKzU2MSwxNyBAQAogCWlmIChtcF9pcnFzW2lkeF0ubXBjX2RzdGlycSAhPSBwaW4pCiAJCXByaW50ayhLRVJOX0VSUiAiYnJva2VuIEJJT1Mgb3IgTVBUQUJMRSBwYXJzZXIsIGF5aWVlISFcbiIpOwogCi0Jc3dpdGNoIChtcF9idXNfaWRfdG9fdHlwZVtidXNdKQotCXsKLQkJY2FzZSBNUF9CVVNfSVNBOiAvKiBJU0EgcGluICovCi0JCWNhc2UgTVBfQlVTX0VJU0E6Ci0JCWNhc2UgTVBfQlVTX01DQToKLQkJewotCQkJaXJxID0gbXBfaXJxc1tpZHhdLm1wY19zcmNidXNpcnE7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIE1QX0JVU19QQ0k6IC8qIFBDSSBwaW4gKi8KLQkJewotCQkJLyoKLQkJCSAqIFBDSSBJUlFzIGFyZSBtYXBwZWQgaW4gb3JkZXIKLQkJCSAqLwotCQkJaSA9IGlycSA9IDA7Ci0JCQl3aGlsZSAoaSA8IGFwaWMpCi0JCQkJaXJxICs9IG5yX2lvYXBpY19yZWdpc3RlcnNbaSsrXTsKLQkJCWlycSArPSBwaW47Ci0JCQlpcnEgPSBnc2lfaXJxX3NoYXJpbmcoaXJxKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWRlZmF1bHQ6Ci0JCXsKLQkJCXByaW50ayhLRVJOX0VSUiAidW5rbm93biBidXMgdHlwZSAlZC5cbiIsYnVzKTsgCi0JCQlpcnEgPSAwOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JQlVHX09OKGlycSA+PSBOUl9JUlFTKTsKLQotCS8qCi0JICogUENJIElSUSBjb21tYW5kIGxpbmUgcmVkaXJlY3Rpb24uIFllcywgbGltaXRzIGFyZSBoYXJkY29kZWQuCi0JICovCi0JaWYgKChwaW4gPj0gMTYpICYmIChwaW4gPD0gMjMpKSB7Ci0JCWlmIChwaXJxX2VudHJpZXNbcGluLTE2XSAhPSAtMSkgewotCQkJaWYgKCFwaXJxX2VudHJpZXNbcGluLTE2XSkgewotCQkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgImRpc2FibGluZyBQSVJRJWRcbiIsIHBpbi0xNik7Ci0JCQl9IGVsc2UgewotCQkJCWlycSA9IHBpcnFfZW50cmllc1twaW4tMTZdOwotCQkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgInVzaW5nIFBJUlElZCAtPiBJUlEgJWRcbiIsCi0JCQkJCQlwaW4tMTYsIGlycSk7Ci0JCQl9Ci0JCX0KKwlpZiAodGVzdF9iaXQoYnVzLCBtcF9idXNfbm90X3BjaSkpIHsKKwkJaXJxID0gbXBfaXJxc1tpZHhdLm1wY19zcmNidXNpcnE7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUENJIElSUXMgYXJlIG1hcHBlZCBpbiBvcmRlcgorCQkgKi8KKwkJaSA9IGlycSA9IDA7CisJCXdoaWxlIChpIDwgYXBpYykKKwkJCWlycSArPSBucl9pb2FwaWNfcmVnaXN0ZXJzW2krK107CisJCWlycSArPSBwaW47CisJCWlycSA9IGdzaV9pcnFfc2hhcmluZyhpcnEpOwogCX0KIAlCVUdfT04oaXJxID49IE5SX0lSUVMpOwogCXJldHVybiBpcnE7CkBAIC05NDMsOSArNzA4LDkgQEAKIAkJCWlmICghYXBpYyAmJiAoaXJxIDwgMTYpKQogCQkJCWRpc2FibGVfODI1OUFfaXJxKGlycSk7CiAJCX0KKwkJaW9hcGljX3dyaXRlX2VudHJ5KGFwaWMsIHBpbiwgZW50cnkpOworCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCQlpb19hcGljX3dyaXRlKGFwaWMsIDB4MTErMipwaW4sICooKChpbnQgKikmZW50cnkpKzEpKTsKLQkJaW9fYXBpY193cml0ZShhcGljLCAweDEwKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSswKSk7CiAJCXNldF9uYXRpdmVfaXJxX2luZm8oaXJxLCBUQVJHRVRfQ1BVUyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CiAJfQpAQCAtMTA4MywxMCArODQ4LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDw9IHJlZ18wMS5iaXRzLmVudHJpZXM7IGkrKykgewogCQlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSBlbnRyeTsKIAotCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLQkJKigoKGludCAqKSZlbnRyeSkrMCkgPSBpb19hcGljX3JlYWQoYXBpYywgMHgxMCtpKjIpOwotCQkqKCgoaW50ICopJmVudHJ5KSsxKSA9IGlvX2FwaWNfcmVhZChhcGljLCAweDExK2kqMik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJCWVudHJ5ID0gaW9hcGljX3JlYWRfZW50cnkoYXBpYywgaSk7CiAKIAkJcHJpbnRrKEtFUk5fREVCVUcgIiAlMDJ4ICUwM1ggJTAyWCAgIiwKIAkJCWksCkBAIC0xMjgxLDkgKzEwNDMsNiBAQAogCQlpcnFfMl9waW5baV0ucGluID0gLTE7CiAJCWlycV8yX3BpbltpXS5uZXh0ID0gMDsKIAl9Ci0JaWYgKCFwaXJxc19lbmFibGVkKQotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1BJUlFTOyBpKyspCi0JCQlwaXJxX2VudHJpZXNbaV0gPSAtMTsKIAogCS8qCiAJICogVGhlIG51bWJlciBvZiBJTy1BUElDIElSUSByZWdpc3RlcnMgKD09ICNwaW5zKToKQEAgLTEyOTksMTEgKzEwNTgsNyBAQAogCQkvKiBTZWUgaWYgYW55IG9mIHRoZSBwaW5zIGlzIGluIEV4dElOVCBtb2RlICovCiAJCWZvciAocGluID0gMDsgcGluIDwgbnJfaW9hcGljX3JlZ2lzdGVyc1thcGljXTsgcGluKyspIHsKIAkJCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGVudHJ5OwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JCQkqKCgoaW50ICopJmVudHJ5KSArIDApID0gaW9fYXBpY19yZWFkKGFwaWMsIDB4MTAgKyAyICogcGluKTsKLQkJCSooKChpbnQgKikmZW50cnkpICsgMSkgPSBpb19hcGljX3JlYWQoYXBpYywgMHgxMSArIDIgKiBwaW4pOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLQorCQkJZW50cnkgPSBpb2FwaWNfcmVhZF9lbnRyeShhcGljLCBwaW4pOwogCiAJCQkvKiBJZiB0aGUgaW50ZXJydXB0IGxpbmUgaXMgZW5hYmxlZCBhbmQgaW4gRXh0SW50IG1vZGUKIAkJCSAqIEkgaGF2ZSBmb3VuZCB0aGUgcGluIHdoZXJlIHRoZSBpODI1OSBpcyBjb25uZWN0ZWQuCkBAIC0xMzU1LDcgKzExMTAsNiBAQAogCSAqLwogCWlmIChpb2FwaWNfaTgyNTkucGluICE9IC0xKSB7CiAJCXN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5IGVudHJ5OwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJCW1lbXNldCgmZW50cnksIDAsIHNpemVvZihlbnRyeSkpOwogCQllbnRyeS5tYXNrICAgICAgICAgICAgPSAwOyAvKiBFbmFibGVkICovCkBAIC0xMzcyLDg0ICsxMTI2LDEzIEBACiAJCS8qCiAJCSAqIEFkZCBpdCB0byB0aGUgSU8tQVBJQyBpcnEtcm91dGluZyB0YWJsZToKIAkJICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCQlpb19hcGljX3dyaXRlKGlvYXBpY19pODI1OS5hcGljLCAweDExKzIqaW9hcGljX2k4MjU5LnBpbiwKLQkJCSooKChpbnQgKikmZW50cnkpKzEpKTsKLQkJaW9fYXBpY193cml0ZShpb2FwaWNfaTgyNTkuYXBpYywgMHgxMCsyKmlvYXBpY19pODI1OS5waW4sCi0JCQkqKCgoaW50ICopJmVudHJ5KSswKSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJCWlvYXBpY193cml0ZV9lbnRyeShpb2FwaWNfaTgyNTkuYXBpYywgaW9hcGljX2k4MjU5LnBpbiwgZW50cnkpOwogCX0KIAogCWRpc2Nvbm5lY3RfYnNwX0FQSUMoaW9hcGljX2k4MjU5LnBpbiAhPSAtMSk7CiB9CiAKIC8qCi0gKiBmdW5jdGlvbiB0byBzZXQgdGhlIElPLUFQSUMgcGh5c2ljYWwgSURzIGJhc2VkIG9uIHRoZQotICogdmFsdWVzIHN0b3JlZCBpbiB0aGUgTVBDIHRhYmxlLgotICoKLSAqIGJ5IE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4gIFR1ZSBEZWMgMjEgMTI6MjU6MDUgQ1NUIDE5OTkKLSAqLwotCi1zdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfaW9hcGljX2lkc19mcm9tX21wYyAodm9pZCkKLXsKLQl1bmlvbiBJT19BUElDX3JlZ18wMCByZWdfMDA7Ci0JaW50IGFwaWM7Ci0JaW50IGk7Ci0JdW5zaWduZWQgY2hhciBvbGRfaWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qCi0JICogU2V0IHRoZSBJT0FQSUMgSUQgdG8gdGhlIHZhbHVlIHN0b3JlZCBpbiB0aGUgTVBDIHRhYmxlLgotCSAqLwotCWZvciAoYXBpYyA9IDA7IGFwaWMgPCBucl9pb2FwaWNzOyBhcGljKyspIHsKLQotCQkvKiBSZWFkIHRoZSByZWdpc3RlciAwIHZhbHVlICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCQlyZWdfMDAucmF3ID0gaW9fYXBpY19yZWFkKGFwaWMsIDApOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCQkKLQkJb2xkX2lkID0gbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkOwotCi0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgSU8tQVBJQyAlZFxuIiwgbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkKTsKLQotCi0JCS8qCi0JCSAqIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSBJUlEgcm91dGluZyB0YWJsZQotCQkgKiBpZiB0aGUgSUQgY2hhbmdlZC4KLQkJICovCi0JCWlmIChvbGRfaWQgIT0gbXBfaW9hcGljc1thcGljXS5tcGNfYXBpY2lkKQotCQkJZm9yIChpID0gMDsgaSA8IG1wX2lycV9lbnRyaWVzOyBpKyspCi0JCQkJaWYgKG1wX2lycXNbaV0ubXBjX2RzdGFwaWMgPT0gb2xkX2lkKQotCQkJCQltcF9pcnFzW2ldLm1wY19kc3RhcGljCi0JCQkJCQk9IG1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZDsKLQotCQkvKgotCQkgKiBSZWFkIHRoZSByaWdodCB2YWx1ZSBmcm9tIHRoZSBNUEMgdGFibGUgYW5kCi0JCSAqIHdyaXRlIGl0IGludG8gdGhlIElEIHJlZ2lzdGVyLgotCSAJICovCi0JCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSxLRVJOX0lORk8gIi4uLmNoYW5naW5nIElPLUFQSUMgcGh5c2ljYWwgQVBJQyBJRCB0byAlZCAuLi4iLAotCQkJCW1wX2lvYXBpY3NbYXBpY10ubXBjX2FwaWNpZCk7Ci0KLQkJcmVnXzAwLmJpdHMuSUQgPSBtcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQ7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCQlpb19hcGljX3dyaXRlKGFwaWMsIDAsIHJlZ18wMC5yYXcpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCi0JCS8qCi0JCSAqIFNhbml0eSBjaGVjawotCQkgKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JCXJlZ18wMC5yYXcgPSBpb19hcGljX3JlYWQoYXBpYywgMCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JCWlmIChyZWdfMDAuYml0cy5JRCAhPSBtcF9pb2FwaWNzW2FwaWNdLm1wY19hcGljaWQpCi0JCQlwcmludGsoImNvdWxkIG5vdCBzZXQgSUQhXG4iKTsKLQkJZWxzZQotCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCIgb2suXG4iKTsKLQl9Ci19Ci0KLS8qCiAgKiBUaGVyZSBpcyBhIG5hc3R5IGJ1ZyBpbiBzb21lIG9sZGVyIFNNUCBib2FyZHMsIHRoZWlyIG1wdGFibGUgbGllcwogICogYWJvdXQgdGhlIHRpbWVyIElSUS4gV2UgZG8gdGhlIGZvbGxvd2luZyB0byB3b3JrIGFyb3VuZCB0aGUgc2l0dWF0aW9uOgogICoKQEAgLTE5NjQsMTEgKzE2NDcsNiBAQAogCiAJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiRU5BQkxJTkcgSU8tQVBJQyBJUlFzXG4iKTsKIAotCS8qCi0JICogU2V0IHVwIHRoZSBJTy1BUElDIElSUSByb3V0aW5nIHRhYmxlLgotCSAqLwotCWlmICghYWNwaV9pb2FwaWMpCi0JCXNldHVwX2lvYXBpY19pZHNfZnJvbV9tcGMoKTsKIAlzeW5jX0FyYl9JRHMoKTsKIAlzZXR1cF9JT19BUElDX2lycXMoKTsKIAlpbml0X0lPX0FQSUNfdHJhcHMoKTsKQEAgLTE5ODcsMTcgKzE2NjUsMTIgQEAKIHsKIAlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSAqZW50cnk7CiAJc3RydWN0IHN5c2ZzX2lvYXBpY19kYXRhICpkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7CiAKIAlkYXRhID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHN5c2ZzX2lvYXBpY19kYXRhLCBkZXYpOwogCWVudHJ5ID0gZGF0YS0+ZW50cnk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY19yZWdpc3RlcnNbZGV2LT5pZF07IGkgKyssIGVudHJ5ICsrICkgewotCQkqKCgoaW50ICopZW50cnkpICsgMSkgPSBpb19hcGljX3JlYWQoZGV2LT5pZCwgMHgxMSArIDIgKiBpKTsKLQkJKigoKGludCAqKWVudHJ5KSArIDApID0gaW9fYXBpY19yZWFkKGRldi0+aWQsIDB4MTAgKyAyICogaSk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY19yZWdpc3RlcnNbZGV2LT5pZF07IGkgKyssIGVudHJ5ICsrICkKKwkJKmVudHJ5ID0gaW9hcGljX3JlYWRfZW50cnkoZGV2LT5pZCwgaSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwMTksMTEgKzE2OTIsOSBAQAogCQlyZWdfMDAuYml0cy5JRCA9IG1wX2lvYXBpY3NbZGV2LT5pZF0ubXBjX2FwaWNpZDsKIAkJaW9fYXBpY193cml0ZShkZXYtPmlkLCAwLCByZWdfMDAucmF3KTsKIAl9Ci0JZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY19yZWdpc3RlcnNbZGV2LT5pZF07IGkgKyssIGVudHJ5ICsrICkgewotCQlpb19hcGljX3dyaXRlKGRldi0+aWQsIDB4MTErMippLCAqKCgoaW50ICopZW50cnkpKzEpKTsKLQkJaW9fYXBpY193cml0ZShkZXYtPmlkLCAweDEwKzIqaSwgKigoKGludCAqKWVudHJ5KSswKSk7Ci0JfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY19yZWdpc3RlcnNbZGV2LT5pZF07IGkrKykKKwkJaW9hcGljX3dyaXRlX2VudHJ5KGRldi0+aWQsIGksIGVudHJ5W2ldKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjA3NywxOSArMTc0OCw2IEBACiAKICNkZWZpbmUgSU9fQVBJQ19NQVhfSUQJCTB4RkUKIAotaW50IF9faW5pdCBpb19hcGljX2dldF92ZXJzaW9uIChpbnQgaW9hcGljKQotewotCXVuaW9uIElPX0FQSUNfcmVnXzAxCXJlZ18wMTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JcmVnXzAxLnJhdyA9IGlvX2FwaWNfcmVhZChpb2FwaWMsIDEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmVnXzAxLmJpdHMudmVyc2lvbjsKLX0KLQotCiBpbnQgX19pbml0IGlvX2FwaWNfZ2V0X3JlZGlyX2VudHJpZXMgKGludCBpb2FwaWMpCiB7CiAJdW5pb24gSU9fQVBJQ19yZWdfMDEJcmVnXzAxOwpAQCAtMjE0OCwxMCArMTgwNiwxMCBAQAogCWlmICghaW9hcGljICYmIChpcnEgPCAxNikpCiAJCWRpc2FibGVfODI1OUFfaXJxKGlycSk7CiAKKwlpb2FwaWNfd3JpdGVfZW50cnkoaW9hcGljLCBwaW4sIGVudHJ5KTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCWlvX2FwaWNfd3JpdGUoaW9hcGljLCAweDExKzIqcGluLCAqKCgoaW50ICopJmVudHJ5KSsxKSk7Ci0JaW9fYXBpY193cml0ZShpb2FwaWMsIDB4MTArMipwaW4sICooKChpbnQgKikmZW50cnkpKzApKTsKLQlzZXRfbmF0aXZlX2lycV9pbmZvKHVzZV9wY2lfdmVjdG9yKCkgPyAgZW50cnkudmVjdG9yIDogaXJxLCBUQVJHRVRfQ1BVUyk7CisJc2V0X25hdGl2ZV9pcnFfaW5mbyh1c2VfcGNpX3ZlY3RvcigpID8gZW50cnkudmVjdG9yIDogaXJxLCBUQVJHRVRfQ1BVUyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2lvcG9ydC5jIGIvYXJjaC94ODZfNjQva2VybmVsL2lvcG9ydC5jCmluZGV4IGI4MTYxNDkuLmZlMDYzZDMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9pb3BvcnQuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaW9wb3J0LmMKQEAgLTU2LDYgKzU2LDcgQEAKIAogCQltZW1zZXQoYml0bWFwLCAweGZmLCBJT19CSVRNQVBfQllURVMpOwogCQl0LT5pb19iaXRtYXBfcHRyID0gYml0bWFwOworCQlzZXRfdGhyZWFkX2ZsYWcoVElGX0lPX0JJVE1BUCk7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9pcnEuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pcnEuYwppbmRleCA1MjIxYTUzLi5iMzY3N2U2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2lycS5jCkBAIC0yMCwxMSArMjAsNiBAQAogI2luY2x1ZGUgPGFzbS9pZGxlLmg+CiAKIGF0b21pY190IGlycV9lcnJfY291bnQ7Ci0jaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCi0jaWZkZWYgQVBJQ19NSVNNQVRDSF9ERUJVRwotYXRvbWljX3QgaXJxX21pc19jb3VudDsKLSNlbmRpZgotI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVwogLyoKQEAgLTkyLDE4ICs4NywxMSBAQAogCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCiAJCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGNwdV9wZGEoaiktPl9fbm1pX2NvdW50KTsKIAkJc2VxX3B1dGMocCwgJ1xuJyk7Ci0jaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAJCXNlcV9wcmludGYocCwgIkxPQzogIik7CiAJCWZvcl9lYWNoX29ubGluZV9jcHUoaikKIAkJCXNlcV9wcmludGYocCwgIiUxMHUgIiwgY3B1X3BkYShqKS0+YXBpY190aW1lcl9pcnFzKTsKIAkJc2VxX3B1dGMocCwgJ1xuJyk7Ci0jZW5kaWYKIAkJc2VxX3ByaW50ZihwLCAiRVJSOiAlMTB1XG4iLCBhdG9taWNfcmVhZCgmaXJxX2Vycl9jb3VudCkpOwotI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwotI2lmZGVmIEFQSUNfTUlTTUFUQ0hfREVCVUcKLQkJc2VxX3ByaW50ZihwLCAiTUlTOiAlMTB1XG4iLCBhdG9taWNfcmVhZCgmaXJxX21pc19jb3VudCkpOwotI2VuZGlmCi0jZW5kaWYKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jIGIvYXJjaC94ODZfNjQva2VybmVsL21hY2hpbmVfa2V4ZWMuYwppbmRleCAxMDYwNzZiLi4wNDk3ZTNiIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKQEAgLTE1LDYgKzE1LDE1IEBACiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKKyNkZWZpbmUgUEFHRV9BTElHTkVEIF9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXyhQQUdFX1NJWkUpKSkKK3N0YXRpYyB1NjQga2V4ZWNfcGdkWzUxMl0gUEFHRV9BTElHTkVEOworc3RhdGljIHU2NCBrZXhlY19wdWQwWzUxMl0gUEFHRV9BTElHTkVEOworc3RhdGljIHU2NCBrZXhlY19wbWQwWzUxMl0gUEFHRV9BTElHTkVEOworc3RhdGljIHU2NCBrZXhlY19wdGUwWzUxMl0gUEFHRV9BTElHTkVEOworc3RhdGljIHU2NCBrZXhlY19wdWQxWzUxMl0gUEFHRV9BTElHTkVEOworc3RhdGljIHU2NCBrZXhlY19wbWQxWzUxMl0gUEFHRV9BTElHTkVEOworc3RhdGljIHU2NCBrZXhlY19wdGUxWzUxMl0gUEFHRV9BTElHTkVEOworCiBzdGF0aWMgdm9pZCBpbml0X2xldmVsMl9wYWdlKHBtZF90ICpsZXZlbDJwLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyBlbmRfYWRkcjsKQEAgLTE0NCwzMiArMTUzLDE5IEBACiAJCSk7CiB9CiAKLXR5cGVkZWYgTk9SRVRfVFlQRSB2b2lkICgqcmVsb2NhdGVfbmV3X2tlcm5lbF90KSh1bnNpZ25lZCBsb25nIGluZGlyZWN0aW9uX3BhZ2UsCi0JCQkJCXVuc2lnbmVkIGxvbmcgY29udHJvbF9jb2RlX2J1ZmZlciwKLQkJCQkJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyZXNzLAotCQkJCQl1bnNpZ25lZCBsb25nIHBndGFibGUpIEFUVFJJQl9OT1JFVDsKLQotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgcmVsb2NhdGVfbmV3X2tlcm5lbFtdOwotZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgcmVsb2NhdGVfbmV3X2tlcm5lbF9zaXplOwotCiBpbnQgbWFjaGluZV9rZXhlY19wcmVwYXJlKHN0cnVjdCBraW1hZ2UgKmltYWdlKQogewotCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGd0YWJsZSwgY29udHJvbF9jb2RlX2J1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BndGFibGU7CiAJaW50IHJlc3VsdDsKIAogCS8qIENhbGN1bGF0ZSB0aGUgb2Zmc2V0cyAqLwogCXN0YXJ0X3BndGFibGUgPSBwYWdlX3RvX3BmbihpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UpIDw8IFBBR0VfU0hJRlQ7Ci0JY29udHJvbF9jb2RlX2J1ZmZlciA9IHN0YXJ0X3BndGFibGUgKyBQQUdFX1NJWkU7CiAKIAkvKiBTZXR1cCB0aGUgaWRlbnRpdHkgbWFwcGVkIDY0Yml0IHBhZ2UgdGFibGUgKi8KIAlyZXN1bHQgPSBpbml0X3BndGFibGUoaW1hZ2UsIHN0YXJ0X3BndGFibGUpOwogCWlmIChyZXN1bHQpCiAJCXJldHVybiByZXN1bHQ7CiAKLQkvKiBQbGFjZSB0aGUgY29kZSBpbiB0aGUgcmVib290IGNvZGUgYnVmZmVyICovCi0JbWVtY3B5KF9fdmEoY29udHJvbF9jb2RlX2J1ZmZlciksIHJlbG9jYXRlX25ld19rZXJuZWwsCi0JCQkJCQlyZWxvY2F0ZV9uZXdfa2VybmVsX3NpemUpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4NCwyOCArMTgwLDM0IEBACiAgKi8KIE5PUkVUX1RZUEUgdm9pZCBtYWNoaW5lX2tleGVjKHN0cnVjdCBraW1hZ2UgKmltYWdlKQogewotCXVuc2lnbmVkIGxvbmcgcGFnZV9saXN0OwotCXVuc2lnbmVkIGxvbmcgY29udHJvbF9jb2RlX2J1ZmZlcjsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BndGFibGU7Ci0JcmVsb2NhdGVfbmV3X2tlcm5lbF90IHJuazsKKwl1bnNpZ25lZCBsb25nIHBhZ2VfbGlzdFtQQUdFU19OUl07CisJdm9pZCAqY29udHJvbF9wYWdlOwogCiAJLyogSW50ZXJydXB0cyBhcmVuJ3QgYWNjZXB0YWJsZSB3aGlsZSB3ZSByZWJvb3QgKi8KIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCi0JLyogQ2FsY3VsYXRlIHRoZSBvZmZzZXRzICovCi0JcGFnZV9saXN0ID0gaW1hZ2UtPmhlYWQ7Ci0Jc3RhcnRfcGd0YWJsZSA9IHBhZ2VfdG9fcGZuKGltYWdlLT5jb250cm9sX2NvZGVfcGFnZSkgPDwgUEFHRV9TSElGVDsKLQljb250cm9sX2NvZGVfYnVmZmVyID0gc3RhcnRfcGd0YWJsZSArIFBBR0VfU0laRTsKKwljb250cm9sX3BhZ2UgPSBwYWdlX2FkZHJlc3MoaW1hZ2UtPmNvbnRyb2xfY29kZV9wYWdlKSArIFBBR0VfU0laRTsKKwltZW1jcHkoY29udHJvbF9wYWdlLCByZWxvY2F0ZV9rZXJuZWwsIFBBR0VfU0laRSk7CiAKLQkvKiBTZXQgdGhlIGxvdyBoYWxmIG9mIHRoZSBwYWdlIHRhYmxlIHRvIG15IGlkZW50aXR5IG1hcHBlZAotCSAqIHBhZ2UgdGFibGUgZm9yIGtleGVjLiAgTGVhdmUgdGhlIGhpZ2ggaGFsZiBwb2ludGluZyBhdCB0aGUKLQkgKiBrZXJuZWwgcGFnZXMuICAgRG9uJ3QgYm90aGVyIHRvIGZsdXNoIHRoZSBnbG9iYWwgcGFnZXMKLQkgKiBhcyB0aGF0IHdpbGwgaGFwcGVuIHdoZW4gSSBmdWxseSBzd2l0Y2ggdG8gbXkgaWRlbnRpdHkgbWFwcGVkCi0JICogcGFnZSB0YWJsZSBhbnl3YXkuCi0JICovCi0JbWVtY3B5KF9fdmEocmVhZF9jcjMoKSksIF9fdmEoc3RhcnRfcGd0YWJsZSksIFBBR0VfU0laRS8yKTsKLQlfX2ZsdXNoX3RsYigpOworCXBhZ2VfbGlzdFtQQV9DT05UUk9MX1BBR0VdID0gX19wYShjb250cm9sX3BhZ2UpOworCXBhZ2VfbGlzdFtWQV9DT05UUk9MX1BBR0VdID0gKHVuc2lnbmVkIGxvbmcpcmVsb2NhdGVfa2VybmVsOworCXBhZ2VfbGlzdFtQQV9QR0RdID0gX19wYShrZXhlY19wZ2QpOworCXBhZ2VfbGlzdFtWQV9QR0RdID0gKHVuc2lnbmVkIGxvbmcpa2V4ZWNfcGdkOworCXBhZ2VfbGlzdFtQQV9QVURfMF0gPSBfX3BhKGtleGVjX3B1ZDApOworCXBhZ2VfbGlzdFtWQV9QVURfMF0gPSAodW5zaWduZWQgbG9uZylrZXhlY19wdWQwOworCXBhZ2VfbGlzdFtQQV9QTURfMF0gPSBfX3BhKGtleGVjX3BtZDApOworCXBhZ2VfbGlzdFtWQV9QTURfMF0gPSAodW5zaWduZWQgbG9uZylrZXhlY19wbWQwOworCXBhZ2VfbGlzdFtQQV9QVEVfMF0gPSBfX3BhKGtleGVjX3B0ZTApOworCXBhZ2VfbGlzdFtWQV9QVEVfMF0gPSAodW5zaWduZWQgbG9uZylrZXhlY19wdGUwOworCXBhZ2VfbGlzdFtQQV9QVURfMV0gPSBfX3BhKGtleGVjX3B1ZDEpOworCXBhZ2VfbGlzdFtWQV9QVURfMV0gPSAodW5zaWduZWQgbG9uZylrZXhlY19wdWQxOworCXBhZ2VfbGlzdFtQQV9QTURfMV0gPSBfX3BhKGtleGVjX3BtZDEpOworCXBhZ2VfbGlzdFtWQV9QTURfMV0gPSAodW5zaWduZWQgbG9uZylrZXhlY19wbWQxOworCXBhZ2VfbGlzdFtQQV9QVEVfMV0gPSBfX3BhKGtleGVjX3B0ZTEpOworCXBhZ2VfbGlzdFtWQV9QVEVfMV0gPSAodW5zaWduZWQgbG9uZylrZXhlY19wdGUxOwogCisJcGFnZV9saXN0W1BBX1RBQkxFX1BBR0VdID0KKwkgICh1bnNpZ25lZCBsb25nKV9fcGEocGFnZV9hZGRyZXNzKGltYWdlLT5jb250cm9sX2NvZGVfcGFnZSkpOwogCiAJLyogVGhlIHNlZ21lbnQgcmVnaXN0ZXJzIGFyZSBmdW5ueSB0aGluZ3MsIHRoZXkgaGF2ZSBib3RoIGEKIAkgKiB2aXNpYmxlIGFuZCBhbiBpbnZpc2libGUgcGFydC4gIFdoZW5ldmVyIHRoZSB2aXNpYmxlIHBhcnQgaXMKQEAgLTIyMiw3ICsyMjQsMzYgQEAKIAkgKi8KIAlzZXRfZ2R0KHBoeXNfdG9fdmlydCgwKSwwKTsKIAlzZXRfaWR0KHBoeXNfdG9fdmlydCgwKSwwKTsKKwogCS8qIG5vdyBjYWxsIGl0ICovCi0Jcm5rID0gKHJlbG9jYXRlX25ld19rZXJuZWxfdCkgY29udHJvbF9jb2RlX2J1ZmZlcjsKLQkoKnJuaykocGFnZV9saXN0LCBjb250cm9sX2NvZGVfYnVmZmVyLCBpbWFnZS0+c3RhcnQsIHN0YXJ0X3BndGFibGUpOworCXJlbG9jYXRlX2tlcm5lbCgodW5zaWduZWQgbG9uZylpbWFnZS0+aGVhZCwgKHVuc2lnbmVkIGxvbmcpcGFnZV9saXN0LAorCQkJaW1hZ2UtPnN0YXJ0KTsKIH0KKworLyogY3Jhc2hrZXJuZWw9c2l6ZUBhZGRyIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gdG8gcmVzZXJ2ZSBmb3IKKyAqIGEgY3Jhc2gga2VybmVsLiAgQnkgcmVzZXJ2aW5nIHRoaXMgbWVtb3J5IHdlIGd1YXJhbnRlZQorICogdGhhdCBsaW51eCBuZXZlciBzZXQncyBpdCB1cCBhcyBhIERNQSB0YXJnZXQuCisgKiBVc2VmdWwgZm9yIGhvbGRpbmcgY29kZSB0byBkbyBzb21ldGhpbmcgYXBwcm9wcmlhdGUKKyAqIGFmdGVyIGEga2VybmVsIHBhbmljLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9jcmFzaGtlcm5lbChjaGFyICphcmcpCit7CisJdW5zaWduZWQgbG9uZyBzaXplLCBiYXNlOworCWNoYXIgKnA7CisJaWYgKCFhcmcpCisJCXJldHVybiAtRUlOVkFMOworCXNpemUgPSBtZW1wYXJzZShhcmcsICZwKTsKKwlpZiAoYXJnID09IHApCisJCXJldHVybiAtRUlOVkFMOworCWlmICgqcCA9PSAnQCcpIHsKKwkJYmFzZSA9IG1lbXBhcnNlKHArMSwgJnApOworCQkvKiBGSVhNRTogRG8gSSB3YW50IGEgc2FuaXR5IGNoZWNrIHRvIHZhbGlkYXRlIHRoZQorCQkgKiBtZW1vcnkgcmFuZ2U/ICBZZXMgeW91IGRvLCBidXQgaXQncyB0b28gZWFybHkgZm9yCisJCSAqIGU4MjAgLUFLICovCisJCWNyYXNoa19yZXMuc3RhcnQgPSBiYXNlOworCQljcmFzaGtfcmVzLmVuZCAgID0gYmFzZSArIHNpemUgLSAxOworCX0KKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJjcmFzaGtlcm5lbCIsIHNldHVwX2NyYXNoa2VybmVsKTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL21jZS5jIGIvYXJjaC94ODZfNjQva2VybmVsL21jZS5jCmluZGV4IDRlMDE3ZmIuLmJiZWE4ODggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9tY2UuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvbWNlLmMKQEAgLTE4Miw3ICsxODIsNyBAQAogCQlnb3RvIG91dDI7CiAKIAltZW1zZXQoJm0sIDAsIHNpemVvZihzdHJ1Y3QgbWNlKSk7Ci0JbS5jcHUgPSBzYWZlX3NtcF9wcm9jZXNzb3JfaWQoKTsKKwltLmNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlyZG1zcmwoTVNSX0lBMzJfTUNHX1NUQVRVUywgbS5tY2dzdGF0dXMpOwogCWlmICghKG0ubWNnc3RhdHVzICYgTUNHX1NUQVRVU19SSVBWKSkKIAkJa2lsbF9pdCA9IDE7CkBAIC0yNzQsNiArMjc0LDMzIEBACiAJYXRvbWljX2RlYygmbWNlX2VudHJ5KTsKIH0KIAorI2lmZGVmIENPTkZJR19YODZfTUNFX0lOVEVMCisvKioqCisgKiBtY2VfbG9nX3RoZXJtX3Rocm90X2V2ZW50IC0gTG9ncyB0aGUgdGhlcm1hbCB0aHJvdHRsaW5nIGV2ZW50IHRvIG1jZWxvZworICogQGNwdTogVGhlIENQVSBvbiB3aGljaCB0aGUgZXZlbnQgb2NjdXJlZC4KKyAqIEBzdGF0dXM6IEV2ZW50IHN0YXR1cyBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgdGhlcm1hbCBpbnRlcnJ1cHQgYWZ0ZXIgdGhlCisgKiBldmVudCBoYXMgYmVlbiBwcm9jZXNzZWQgYW5kIHRoZSBkZWNpc2lvbiB3YXMgbWFkZSB0byBsb2cgdGhlIGV2ZW50CisgKiBmdXJ0aGVyLgorICoKKyAqIFRoZSBzdGF0dXMgcGFyYW1ldGVyIHdpbGwgYmUgc2F2ZWQgdG8gdGhlICdzdGF0dXMnIGZpZWxkIG9mICdzdHJ1Y3QgbWNlJworICogYW5kIGhpc3RvcmljYWxseSBoYXMgYmVlbiB0aGUgcmVnaXN0ZXIgdmFsdWUgb2YgdGhlCisgKiBNU1JfSUEzMl9USEVSTUFMX1NUQVRVUyAoSW50ZWwpIG1zci4KKyAqLwordm9pZCBtY2VfbG9nX3RoZXJtX3Rocm90X2V2ZW50KHVuc2lnbmVkIGludCBjcHUsIF9fdTY0IHN0YXR1cykKK3sKKwlzdHJ1Y3QgbWNlIG07CisKKwltZW1zZXQoJm0sIDAsIHNpemVvZihtKSk7CisJbS5jcHUgPSBjcHU7CisJbS5iYW5rID0gTUNFX1RIRVJNQUxfQkFOSzsKKwltLnN0YXR1cyA9IHN0YXR1czsKKwlyZHRzY2xsKG0udHNjKTsKKwltY2VfbG9nKCZtKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfWDg2X01DRV9JTlRFTCAqLworCiAvKgogICogUGVyaW9kaWMgcG9sbGluZyB0aW1lciBmb3IgInNpbGVudCIgbWFjaGluZSBjaGVjayBlcnJvcnMuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9tY2VfaW50ZWwuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tY2VfaW50ZWwuYwppbmRleCA4ZjUzM2QyLi42NTUxNTA1IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbWNlX2ludGVsLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL21jZV9pbnRlbC5jCkBAIC0xMSwzNiArMTEsMjEgQEAKICNpbmNsdWRlIDxhc20vbWNlLmg+CiAjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogI2luY2x1ZGUgPGFzbS9pZGxlLmg+Ci0KLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBuZXh0X2NoZWNrKTsKKyNpbmNsdWRlIDxhc20vdGhlcm1fdGhyb3QuaD4KIAogYXNtbGlua2FnZSB2b2lkIHNtcF90aGVybWFsX2ludGVycnVwdCh2b2lkKQogewotCXN0cnVjdCBtY2UgbTsKKwlfX3U2NCBtc3JfdmFsOwogCiAJYWNrX0FQSUNfaXJxKCk7CiAKIAlleGl0X2lkbGUoKTsKIAlpcnFfZW50ZXIoKTsKLQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgX19nZXRfY3B1X3ZhcihuZXh0X2NoZWNrKSkpCi0JCWdvdG8gZG9uZTsKIAotCV9fZ2V0X2NwdV92YXIobmV4dF9jaGVjaykgPSBqaWZmaWVzICsgSFoqMzAwOwotCW1lbXNldCgmbSwgMCwgc2l6ZW9mKG0pKTsKLQltLmNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQltLmJhbmsgPSBNQ0VfVEhFUk1BTF9CQU5LOwotCXJkdHNjbGwobS50c2MpOwotCXJkbXNybChNU1JfSUEzMl9USEVSTV9TVEFUVVMsIG0uc3RhdHVzKTsKLQlpZiAobS5zdGF0dXMgJiAweDEpIHsKLQkJcHJpbnRrKEtFUk5fRU1FUkcKLQkJCSJDUFUlZDogVGVtcGVyYXR1cmUgYWJvdmUgdGhyZXNob2xkLCBjcHUgY2xvY2sgdGhyb3R0bGVkXG4iLCBtLmNwdSk7Ci0JCWFkZF90YWludChUQUlOVF9NQUNISU5FX0NIRUNLKTsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9FTUVSRyAiQ1BVJWQ6IFRlbXBlcmF0dXJlL3NwZWVkIG5vcm1hbFxuIiwgbS5jcHUpOwotCX0KKwlyZG1zcmwoTVNSX0lBMzJfVEhFUk1fU1RBVFVTLCBtc3JfdmFsKTsKKwlpZiAodGhlcm1fdGhyb3RfcHJvY2Vzcyhtc3JfdmFsICYgMSkpCisJCW1jZV9sb2dfdGhlcm1fdGhyb3RfZXZlbnQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBtc3JfdmFsKTsKIAotCW1jZV9sb2coJm0pOwotZG9uZToKIAlpcnFfZXhpdCgpOwogfQogCkBAIC05Miw2ICs3Nyw5IEBACiAJYXBpY193cml0ZShBUElDX0xWVFRITVIsIGwgJiB+QVBJQ19MVlRfTUFTS0VEKTsKIAlwcmludGsoS0VSTl9JTkZPICJDUFUlZDogVGhlcm1hbCBtb25pdG9yaW5nIGVuYWJsZWQgKCVzKVxuIiwKIAkJY3B1LCB0bTIgPyAiVE0yIiA6ICJUTTEiKTsKKworCS8qIGVuYWJsZSB0aGVybWFsIHRocm90dGxlIHByb2Nlc3NpbmcgKi8KKwlhdG9taWNfc2V0KCZ0aGVybV90aHJvdF9lbiwgMSk7CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvbXBwYXJzZS5jIGIvYXJjaC94ODZfNjQva2VybmVsL21wcGFyc2UuYwppbmRleCBhMWFiNDE5Li4yMGU4OGY0IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbXBwYXJzZS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9tcHBhcnNlLmMKQEAgLTQxLDggKzQxLDcgQEAKICAqIFZhcmlvdXMgTGludXgtaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGNyZWF0ZWQgZnJvbSB0aGUKICAqIE1QLXRhYmxlLgogICovCi11bnNpZ25lZCBjaGFyIGFwaWNfdmVyc2lvbiBbTUFYX0FQSUNTXTsKLXVuc2lnbmVkIGNoYXIgbXBfYnVzX2lkX3RvX3R5cGUgW01BWF9NUF9CVVNTRVNdID0geyBbMCAuLi4gTUFYX01QX0JVU1NFUy0xXSA9IC0xIH07CitERUNMQVJFX0JJVE1BUChtcF9idXNfbm90X3BjaSwgTUFYX01QX0JVU1NFUyk7CiBpbnQgbXBfYnVzX2lkX3RvX3BjaV9idXMgW01BWF9NUF9CVVNTRVNdID0geyBbMCAuLi4gTUFYX01QX0JVU1NFUy0xXSA9IC0xIH07CiAKIHN0YXRpYyBpbnQgbXBfY3VycmVudF9wY2lfaWQgPSAwOwpAQCAtNTYsNyArNTUsNiBAQAogaW50IG1wX2lycV9lbnRyaWVzOwogCiBpbnQgbnJfaW9hcGljczsKLWludCBwaWNfbW9kZTsKIHVuc2lnbmVkIGxvbmcgbXBfbGFwaWNfYWRkciA9IDA7CiAKIApAQCAtNzEsMTkgKzY5LDYgQEAKIC8qIEJpdG1hc2sgb2YgcGh5c2ljYWxseSBleGlzdGluZyBDUFVzICovCiBwaHlzaWRfbWFza190IHBoeXNfY3B1X3ByZXNlbnRfbWFwID0gUEhZU0lEX01BU0tfTk9ORTsKIAotLyogQUNQSSBNQURUIGVudHJ5IHBhcnNpbmcgZnVuY3Rpb25zICovCi0jaWZkZWYgQ09ORklHX0FDUEkKLWV4dGVybiBzdHJ1Y3QgYWNwaV9ib290X2ZsYWdzIGFjcGlfYm9vdDsKLSNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKLWV4dGVybiBpbnQgYWNwaV9wYXJzZV9sYXBpYyAoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlcik7Ci1leHRlcm4gaW50IGFjcGlfcGFyc2VfbGFwaWNfYWRkcl9vdnIgKGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICpoZWFkZXIpOwotZXh0ZXJuIGludCBhY3BpX3BhcnNlX2xhcGljX25taSAoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlcik7Ci0jZW5kaWYgLypDT05GSUdfWDg2X0xPQ0FMX0FQSUMqLwotI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwotZXh0ZXJuIGludCBhY3BpX3BhcnNlX2lvYXBpYyAoYWNwaV90YWJsZV9lbnRyeV9oZWFkZXIgKmhlYWRlcik7Ci0jZW5kaWYgLypDT05GSUdfWDg2X0lPX0FQSUMqLwotI2VuZGlmIC8qQ09ORklHX0FDUEkqLwotCiB1OCBiaW9zX2NwdV9hcGljaWRbTlJfQ1BVU10gPSB7IFswIC4uLiBOUl9DUFVTLTFdID0gQkFEX0FQSUNJRCB9OwogCiAKQEAgLTEwOCwyNCArOTMsMjAgQEAKIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCBNUF9wcm9jZXNzb3JfaW5mbyAoc3RydWN0IG1wY19jb25maWdfcHJvY2Vzc29yICptKQogewogCWludCBjcHU7Ci0JdW5zaWduZWQgY2hhciB2ZXI7CiAJY3B1bWFza190IHRtcF9tYXA7CisJY2hhciAqYm9vdHVwX2NwdSA9ICIiOwogCiAJaWYgKCEobS0+bXBjX2NwdWZsYWcgJiBDUFVfRU5BQkxFRCkpIHsKIAkJZGlzYWJsZWRfY3B1cysrOwogCQlyZXR1cm47CiAJfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAiUHJvY2Vzc29yICMlZCAlZDolZCBBUElDIHZlcnNpb24gJWRcbiIsCi0JCW0tPm1wY19hcGljaWQsCi0JICAgICAgIChtLT5tcGNfY3B1ZmVhdHVyZSAmIENQVV9GQU1JTFlfTUFTSyk+PjgsCi0JICAgICAgIChtLT5tcGNfY3B1ZmVhdHVyZSAmIENQVV9NT0RFTF9NQVNLKT4+NCwKLQkJbS0+bXBjX2FwaWN2ZXIpOwotCiAJaWYgKG0tPm1wY19jcHVmbGFnICYgQ1BVX0JPT1RQUk9DRVNTT1IpIHsKLQkJRHByaW50aygiICAgIEJvb3R1cCBDUFVcbiIpOworCQlib290dXBfY3B1ID0gIiAoQm9vdHVwLUNQVSkiOwogCQlib290X2NwdV9pZCA9IG0tPm1wY19hcGljaWQ7CiAJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiUHJvY2Vzc29yICMlZCVzXG4iLCBtLT5tcGNfYXBpY2lkLCBib290dXBfY3B1KTsKKwogCWlmIChudW1fcHJvY2Vzc29ycyA+PSBOUl9DUFVTKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIldBUk5JTkc6IE5SX0NQVVMgbGltaXQgb2YgJWkgcmVhY2hlZC4iCiAJCQkiIFByb2Nlc3NvciBpZ25vcmVkLlxuIiwgTlJfQ1BVUyk7CkBAIC0xMzYsMjQgKzExNyw3IEBACiAJY3B1c19jb21wbGVtZW50KHRtcF9tYXAsIGNwdV9wcmVzZW50X21hcCk7CiAJY3B1ID0gZmlyc3RfY3B1KHRtcF9tYXApOwogCi0jaWYgTUFYX0FQSUNTIDwgMjU1CQotCWlmICgoaW50KW0tPm1wY19hcGljaWQgPiBNQVhfQVBJQ1MpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJQcm9jZXNzb3IgIyVkIElOVkFMSUQuIChNYXggSUQ6ICVkKS5cbiIsCi0JCQltLT5tcGNfYXBpY2lkLCBNQVhfQVBJQ1MpOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0JdmVyID0gbS0+bXBjX2FwaWN2ZXI7Ci0KIAlwaHlzaWRfc2V0KG0tPm1wY19hcGljaWQsIHBoeXNfY3B1X3ByZXNlbnRfbWFwKTsKLQkvKgotCSAqIFZhbGlkYXRlIHZlcnNpb24KLQkgKi8KLQlpZiAodmVyID09IDB4MCkgewotCQlwcmludGsoS0VSTl9FUlIgIkJJT1MgYnVnLCBBUElDIHZlcnNpb24gaXMgMCBmb3IgQ1BVIyVkISBmaXhpbmcgdXAgdG8gMHgxMC4gKHRlbGwgeW91ciBodyB2ZW5kb3IpXG4iLCBtLT5tcGNfYXBpY2lkKTsKLQkJdmVyID0gMHgxMDsKLQl9Ci0JYXBpY192ZXJzaW9uW20tPm1wY19hcGljaWRdID0gdmVyOwogIAlpZiAobS0+bXBjX2NwdWZsYWcgJiBDUFVfQk9PVFBST0NFU1NPUikgewogIAkJLyoKICAJCSAqIGJpb3NfY3B1X2FwaWNpZCBpcyByZXF1aXJlZCB0byBoYXZlIHByb2Nlc3NvcnMgbGlzdGVkCkBAIC0xNzgsMTUgKzE0MiwxMSBAQAogCURwcmludGsoIkJ1cyAjJWQgaXMgJXNcbiIsIG0tPm1wY19idXNpZCwgc3RyKTsKIAogCWlmIChzdHJuY21wKHN0ciwgIklTQSIsIDMpID09IDApIHsKLQkJbXBfYnVzX2lkX3RvX3R5cGVbbS0+bXBjX2J1c2lkXSA9IE1QX0JVU19JU0E7Ci0JfSBlbHNlIGlmIChzdHJuY21wKHN0ciwgIkVJU0EiLCA0KSA9PSAwKSB7Ci0JCW1wX2J1c19pZF90b190eXBlW20tPm1wY19idXNpZF0gPSBNUF9CVVNfRUlTQTsKKwkJc2V0X2JpdChtLT5tcGNfYnVzaWQsIG1wX2J1c19ub3RfcGNpKTsKIAl9IGVsc2UgaWYgKHN0cm5jbXAoc3RyLCAiUENJIiwgMykgPT0gMCkgewotCQltcF9idXNfaWRfdG9fdHlwZVttLT5tcGNfYnVzaWRdID0gTVBfQlVTX1BDSTsKKwkJY2xlYXJfYml0KG0tPm1wY19idXNpZCwgbXBfYnVzX25vdF9wY2kpOwogCQltcF9idXNfaWRfdG9fcGNpX2J1c1ttLT5tcGNfYnVzaWRdID0gbXBfY3VycmVudF9wY2lfaWQ7CiAJCW1wX2N1cnJlbnRfcGNpX2lkKys7Ci0JfSBlbHNlIGlmIChzdHJuY21wKHN0ciwgIk1DQSIsIDMpID09IDApIHsKLQkJbXBfYnVzX2lkX3RvX3R5cGVbbS0+bXBjX2J1c2lkXSA9IE1QX0JVU19NQ0E7CiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJVbmtub3duIGJ1c3R5cGUgJXNcbiIsIHN0cik7CiAJfQpAQCAtMTk3LDggKzE1Nyw4IEBACiAJaWYgKCEobS0+bXBjX2ZsYWdzICYgTVBDX0FQSUNfVVNBQkxFKSkKIAkJcmV0dXJuOwogCi0JcHJpbnRrKCJJL08gQVBJQyAjJWQgVmVyc2lvbiAlZCBhdCAweCVYLlxuIiwKLQkJbS0+bXBjX2FwaWNpZCwgbS0+bXBjX2FwaWN2ZXIsIG0tPm1wY19hcGljYWRkcik7CisJcHJpbnRrKCJJL08gQVBJQyAjJWQgYXQgMHglWC5cbiIsCisJCW0tPm1wY19hcGljaWQsIG0tPm1wY19hcGljYWRkcik7CiAJaWYgKG5yX2lvYXBpY3MgPj0gTUFYX0lPX0FQSUNTKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiTWF4ICMgb2YgSS9PIEFQSUNzICglZCkgZXhjZWVkZWQgKGZvdW5kICVkKS5cbiIsCiAJCQlNQVhfSU9fQVBJQ1MsIG5yX2lvYXBpY3MpOwpAQCAtMjMyLDE5ICsxOTIsNiBAQAogCQkJbS0+bXBjX2lycXR5cGUsIG0tPm1wY19pcnFmbGFnICYgMywKIAkJCShtLT5tcGNfaXJxZmxhZyA+PiAyKSAmMywgbS0+bXBjX3NyY2J1c2lkLAogCQkJbS0+bXBjX3NyY2J1c2lycSwgbS0+bXBjX2Rlc3RhcGljLCBtLT5tcGNfZGVzdGFwaWNsaW50KTsKLQkvKgotCSAqIFdlbGwgaXQgc2VlbXMgYWxsIFNNUCBib2FyZHMgaW4gZXhpc3RlbmNlCi0JICogdXNlIEV4dElOVC9MVlQxID09IExJTlQwIGFuZAotCSAqIE5NSS9MVlQyID09IExJTlQxIC0gdGhlIGZvbGxvd2luZyBjaGVjawotCSAqIHdpbGwgc2hvdyB1cyBpZiB0aGlzIGFzc3VtcHRpb25zIGlzIGZhbHNlLgotCSAqIFVudGlsIHRoZW4gd2UgZG8gbm90IGhhdmUgdG8gYWRkIGJhZ2dhZ2UuCi0JICovCi0JaWYgKChtLT5tcGNfaXJxdHlwZSA9PSBtcF9FeHRJTlQpICYmCi0JCShtLT5tcGNfZGVzdGFwaWNsaW50ICE9IDApKQotCQkJQlVHKCk7Ci0JaWYgKChtLT5tcGNfaXJxdHlwZSA9PSBtcF9OTUkpICYmCi0JCShtLT5tcGNfZGVzdGFwaWNsaW50ICE9IDEpKQotCQkJQlVHKCk7CiB9CiAKIC8qCkBAIC0yNTgsNyArMjA1LDcgQEAKIAl1bnNpZ25lZCBjaGFyICptcHQ9KCh1bnNpZ25lZCBjaGFyICopbXBjKStjb3VudDsKIAogCWlmIChtZW1jbXAobXBjLT5tcGNfc2lnbmF0dXJlLE1QQ19TSUdOQVRVUkUsNCkpIHsKLQkJcHJpbnRrKCJTTVAgbXB0YWJsZTogYmFkIHNpZ25hdHVyZSBbJWMlYyVjJWNdIVxuIiwKKwkJcHJpbnRrKCJNUFRBQkxFOiBiYWQgc2lnbmF0dXJlIFslYyVjJWMlY10hXG4iLAogCQkJbXBjLT5tcGNfc2lnbmF0dXJlWzBdLAogCQkJbXBjLT5tcGNfc2lnbmF0dXJlWzFdLAogCQkJbXBjLT5tcGNfc2lnbmF0dXJlWzJdLApAQCAtMjY2LDMxICsyMTMsMzEgQEAKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChtcGZfY2hlY2tzdW0oKHVuc2lnbmVkIGNoYXIgKiltcGMsbXBjLT5tcGNfbGVuZ3RoKSkgewotCQlwcmludGsoIlNNUCBtcHRhYmxlOiBjaGVja3N1bSBlcnJvciFcbiIpOworCQlwcmludGsoIk1QVEFCTEU6IGNoZWNrc3VtIGVycm9yIVxuIik7CiAJCXJldHVybiAwOwogCX0KIAlpZiAobXBjLT5tcGNfc3BlYyE9MHgwMSAmJiBtcGMtPm1wY19zcGVjIT0weDA0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU01QIG1wdGFibGU6IGJhZCB0YWJsZSB2ZXJzaW9uICglZCkhIVxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICJNUFRBQkxFOiBiYWQgdGFibGUgdmVyc2lvbiAoJWQpISFcbiIsCiAJCQltcGMtPm1wY19zcGVjKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmICghbXBjLT5tcGNfbGFwaWMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJTTVAgbXB0YWJsZTogbnVsbCBsb2NhbCBBUElDIGFkZHJlc3MhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJNUFRBQkxFOiBudWxsIGxvY2FsIEFQSUMgYWRkcmVzcyFcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAJbWVtY3B5KHN0cixtcGMtPm1wY19vZW0sOCk7Ci0Jc3RyWzhdPTA7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiT0VNIElEOiAlcyAiLHN0cik7CisJc3RyWzhdID0gMDsKKwlwcmludGsoS0VSTl9JTkZPICJNUFRBQkxFOiBPRU0gSUQ6ICVzICIsc3RyKTsKIAogCW1lbWNweShzdHIsbXBjLT5tcGNfcHJvZHVjdGlkLDEyKTsKLQlzdHJbMTJdPTA7Ci0JcHJpbnRrKCJQcm9kdWN0IElEOiAlcyAiLHN0cik7CisJc3RyWzEyXSA9IDA7CisJcHJpbnRrKCJNUFRBQkxFOiBQcm9kdWN0IElEOiAlcyAiLHN0cik7CiAKLQlwcmludGsoIkFQSUMgYXQ6IDB4JVhcbiIsbXBjLT5tcGNfbGFwaWMpOworCXByaW50aygiTVBUQUJMRTogQVBJQyBhdDogMHglWFxuIixtcGMtPm1wY19sYXBpYyk7CiAKIAkvKiBzYXZlIHRoZSBsb2NhbCBBUElDIGFkZHJlc3MsIGl0IG1pZ2h0IGJlIG5vbi1kZWZhdWx0ICovCiAJaWYgKCFhY3BpX2xhcGljKQotCW1wX2xhcGljX2FkZHIgPSBtcGMtPm1wY19sYXBpYzsKKwkJbXBfbGFwaWNfYWRkciA9IG1wYy0+bXBjX2xhcGljOwogCiAJLyoKIAkgKglOb3cgcHJvY2VzcyB0aGUgY29uZmlndXJhdGlvbiBibG9ja3MuCkBAIC0zMDIsNyArMjQ5LDcgQEAKIAkJCQlzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgKm09CiAJCQkJCShzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgKiltcHQ7CiAJCQkJaWYgKCFhY3BpX2xhcGljKQotCQkJCU1QX3Byb2Nlc3Nvcl9pbmZvKG0pOworCQkJCQlNUF9wcm9jZXNzb3JfaW5mbyhtKTsKIAkJCQltcHQgKz0gc2l6ZW9mKCptKTsKIAkJCQljb3VudCArPSBzaXplb2YoKm0pOwogCQkJCWJyZWFrOwpAQCAtMzIxLDggKzI2OCw4IEBACiAJCQkJc3RydWN0IG1wY19jb25maWdfaW9hcGljICptPQogCQkJCQkoc3RydWN0IG1wY19jb25maWdfaW9hcGljICopbXB0OwogCQkJCU1QX2lvYXBpY19pbmZvKG0pOwotCQkJCW1wdCs9c2l6ZW9mKCptKTsKLQkJCQljb3VudCs9c2l6ZW9mKCptKTsKKwkJCQltcHQgKz0gc2l6ZW9mKCptKTsKKwkJCQljb3VudCArPSBzaXplb2YoKm0pOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSBNUF9JTlRTUkM6CkBAIC0zMzEsOCArMjc4LDggQEAKIAkJCQkJKHN0cnVjdCBtcGNfY29uZmlnX2ludHNyYyAqKW1wdDsKIAogCQkJCU1QX2ludHNyY19pbmZvKG0pOwotCQkJCW1wdCs9c2l6ZW9mKCptKTsKLQkJCQljb3VudCs9c2l6ZW9mKCptKTsKKwkJCQltcHQgKz0gc2l6ZW9mKCptKTsKKwkJCQljb3VudCArPSBzaXplb2YoKm0pOwogCQkJCWJyZWFrOwogCQkJfQogCQkJY2FzZSBNUF9MSU5UU1JDOgpAQCAtMzQwLDE1ICsyODcsMTUgQEAKIAkJCQlzdHJ1Y3QgbXBjX2NvbmZpZ19saW50c3JjICptPQogCQkJCQkoc3RydWN0IG1wY19jb25maWdfbGludHNyYyAqKW1wdDsKIAkJCQlNUF9saW50c3JjX2luZm8obSk7Ci0JCQkJbXB0Kz1zaXplb2YoKm0pOwotCQkJCWNvdW50Kz1zaXplb2YoKm0pOworCQkJCW1wdCArPSBzaXplb2YoKm0pOworCQkJCWNvdW50ICs9IHNpemVvZigqbSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAl9CiAJY2x1c3RlcmVkX2FwaWNfY2hlY2soKTsKIAlpZiAoIW51bV9wcm9jZXNzb3JzKQotCQlwcmludGsoS0VSTl9FUlIgIlNNUCBtcHRhYmxlOiBubyBwcm9jZXNzb3JzIHJlZ2lzdGVyZWQhXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJNUFRBQkxFOiBubyBwcm9jZXNzb3JzIHJlZ2lzdGVyZWQhXG4iKTsKIAlyZXR1cm4gbnVtX3Byb2Nlc3NvcnM7CiB9CiAKQEAgLTQ0NCwxMyArMzkxLDEwIEBACiAJICogMiBDUFVzLCBudW1iZXJlZCAwICYgMS4KIAkgKi8KIAlwcm9jZXNzb3IubXBjX3R5cGUgPSBNUF9QUk9DRVNTT1I7Ci0JLyogRWl0aGVyIGFuIGludGVncmF0ZWQgQVBJQyBvciBhIGRpc2NyZXRlIDgyNDg5RFguICovCi0JcHJvY2Vzc29yLm1wY19hcGljdmVyID0gbXBjX2RlZmF1bHRfdHlwZSA+IDQgPyAweDEwIDogMHgwMTsKKwlwcm9jZXNzb3IubXBjX2FwaWN2ZXIgPSAwOwogCXByb2Nlc3Nvci5tcGNfY3B1ZmxhZyA9IENQVV9FTkFCTEVEOwotCXByb2Nlc3Nvci5tcGNfY3B1ZmVhdHVyZSA9IChib290X2NwdV9kYXRhLng4NiA8PCA4KSB8Ci0JCQkJICAgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsIDw8IDQpIHwKLQkJCQkgICBib290X2NwdV9kYXRhLng4Nl9tYXNrOwotCXByb2Nlc3Nvci5tcGNfZmVhdHVyZWZsYWcgPSBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5WzBdOworCXByb2Nlc3Nvci5tcGNfY3B1ZmVhdHVyZSA9IDA7CisJcHJvY2Vzc29yLm1wY19mZWF0dXJlZmxhZyA9IDA7CiAJcHJvY2Vzc29yLm1wY19yZXNlcnZlZFswXSA9IDA7CiAJcHJvY2Vzc29yLm1wY19yZXNlcnZlZFsxXSA9IDA7CiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewpAQCAtNDY5LDE0ICs0MTMsNiBAQAogCQljYXNlIDU6CiAJCQltZW1jcHkoYnVzLm1wY19idXN0eXBlLCAiSVNBICAgIiwgNik7CiAJCQlicmVhazsKLQkJY2FzZSAyOgotCQljYXNlIDY6Ci0JCWNhc2UgMzoKLQkJCW1lbWNweShidXMubXBjX2J1c3R5cGUsICJFSVNBICAiLCA2KTsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCWNhc2UgNzoKLQkJCW1lbWNweShidXMubXBjX2J1c3R5cGUsICJNQ0EgICAiLCA2KTsKIAl9CiAJTVBfYnVzX2luZm8oJmJ1cyk7CiAJaWYgKG1wY19kZWZhdWx0X3R5cGUgPiA0KSB7CkBAIC00ODcsNyArNDIzLDcgQEAKIAogCWlvYXBpYy5tcGNfdHlwZSA9IE1QX0lPQVBJQzsKIAlpb2FwaWMubXBjX2FwaWNpZCA9IDI7Ci0JaW9hcGljLm1wY19hcGljdmVyID0gbXBjX2RlZmF1bHRfdHlwZSA+IDQgPyAweDEwIDogMHgwMTsKKwlpb2FwaWMubXBjX2FwaWN2ZXIgPSAwOwogCWlvYXBpYy5tcGNfZmxhZ3MgPSBNUENfQVBJQ19VU0FCTEU7CiAJaW9hcGljLm1wY19hcGljYWRkciA9IDB4RkVDMDAwMDA7CiAJTVBfaW9hcGljX2luZm8oJmlvYXBpYyk7CkBAIC01MzAsMTMgKzQ2Niw2IEBACiAgCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBBQ1BJIGZvciBwcm9jZXNzb3IgKExBUElDKSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uXG4iKTsKIAogCXByaW50aygiSW50ZWwgTXVsdGlQcm9jZXNzb3IgU3BlY2lmaWNhdGlvbiB2MS4lZFxuIiwgbXBmLT5tcGZfc3BlY2lmaWNhdGlvbik7Ci0JaWYgKG1wZi0+bXBmX2ZlYXR1cmUyICYgKDE8PDcpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiAgICBJTUNSIGFuZCBQSUMgY29tcGF0aWJpbGl0eSBtb2RlLlxuIik7Ci0JCXBpY19tb2RlID0gMTsKLQl9IGVsc2UgewotCQlwcmludGsoS0VSTl9JTkZPICIgICAgVmlydHVhbCBXaXJlIGNvbXBhdGliaWxpdHkgbW9kZS5cbiIpOwotCQlwaWNfbW9kZSA9IDA7Ci0JfQogCiAJLyoKIAkgKiBOb3cgc2VlIGlmIHdlIG5lZWQgdG8gcmVhZCBmdXJ0aGVyLgpAQCAtNjE2LDcgKzU0NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19pbml0IGZpbmRfaW50ZWxfc21wICh2b2lkKQordm9pZCBfX2luaXQgZmluZF9zbXBfY29uZmlnKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGFkZHJlc3M7CiAKQEAgLTYzMyw5ICs1NjIsNyBAQAogCQkJc21wX3NjYW5fY29uZmlnKDB4RjAwMDAsMHgxMDAwMCkpCiAJCXJldHVybjsKIAkvKgotCSAqIElmIGl0IGlzIGFuIFNNUCBtYWNoaW5lIHdlIHNob3VsZCBrbm93IG5vdywgdW5sZXNzIHRoZQotCSAqIGNvbmZpZ3VyYXRpb24gaXMgaW4gYW4gRUlTQS9NQ0EgYnVzIG1hY2hpbmUgd2l0aCBhbgotCSAqIGV4dGVuZGVkIGJpb3MgZGF0YSBhcmVhLgorCSAqIElmIGl0IGlzIGFuIFNNUCBtYWNoaW5lIHdlIHNob3VsZCBrbm93IG5vdy4KIAkgKgogCSAqIHRoZXJlIGlzIGEgcmVhbC1tb2RlIHNlZ21lbnRlZCBwb2ludGVyIHBvaW50aW5nIHRvIHRoZQogCSAqIDRLIEVCREEgYXJlYSBhdCAweDQwRSwgY2FsY3VsYXRlIGFuZCBzY2FuIGl0IGhlcmUuCkBAIC02NTYsNjkgKzU4Myw0MSBAQAogCSBwcmludGsoS0VSTl9JTkZPICJObyBtcHRhYmxlIGZvdW5kLlxuIik7CiB9CiAKLS8qCi0gKiAtIEludGVsIE1QIENvbmZpZ3VyYXRpb24gVGFibGUKLSAqLwotdm9pZCBfX2luaXQgZmluZF9zbXBfY29uZmlnICh2b2lkKQotewotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCWZpbmRfaW50ZWxfc21wKCk7Ci0jZW5kaWYKLX0KLQotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUEktYmFzZWQgTVAgQ29uZmlndXJhdGlvbgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogI2lmZGVmIENPTkZJR19BQ1BJCiAKLXZvaWQgX19pbml0IG1wX3JlZ2lzdGVyX2xhcGljX2FkZHJlc3MgKAotCXU2NAkJCWFkZHJlc3MpCit2b2lkIF9faW5pdCBtcF9yZWdpc3Rlcl9sYXBpY19hZGRyZXNzKHU2NCBhZGRyZXNzKQogewogCW1wX2xhcGljX2FkZHIgPSAodW5zaWduZWQgbG9uZykgYWRkcmVzczsKLQogCXNldF9maXhtYXBfbm9jYWNoZShGSVhfQVBJQ19CQVNFLCBtcF9sYXBpY19hZGRyKTsKLQogCWlmIChib290X2NwdV9pZCA9PSAtMVUpCiAJCWJvb3RfY3B1X2lkID0gR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKTsKLQotCURwcmludGsoIkJvb3QgQ1BVID0gJWRcbiIsIGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CiB9CiAKLQotdm9pZCBfX2NwdWluaXQgbXBfcmVnaXN0ZXJfbGFwaWMgKAotCXU4CQkJaWQsIAotCXU4CQkJZW5hYmxlZCkKK3ZvaWQgX19jcHVpbml0IG1wX3JlZ2lzdGVyX2xhcGljICh1OCBpZCwgdTggZW5hYmxlZCkKIHsKIAlzdHJ1Y3QgbXBjX2NvbmZpZ19wcm9jZXNzb3IgcHJvY2Vzc29yOwogCWludAkJCWJvb3RfY3B1ID0gMDsKIAkKLQlpZiAoaWQgPj0gTUFYX0FQSUNTKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlByb2Nlc3NvciAjJWQgaW52YWxpZCAobWF4ICVkKVxuIiwKLQkJCWlkLCBNQVhfQVBJQ1MpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlkID09IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCkKKwlpZiAoaWQgPT0gYm9vdF9jcHVfaWQpCiAJCWJvb3RfY3B1ID0gMTsKIAogCXByb2Nlc3Nvci5tcGNfdHlwZSA9IE1QX1BST0NFU1NPUjsKIAlwcm9jZXNzb3IubXBjX2FwaWNpZCA9IGlkOwotCXByb2Nlc3Nvci5tcGNfYXBpY3ZlciA9IEdFVF9BUElDX1ZFUlNJT04oYXBpY19yZWFkKEFQSUNfTFZSKSk7CisJcHJvY2Vzc29yLm1wY19hcGljdmVyID0gMDsKIAlwcm9jZXNzb3IubXBjX2NwdWZsYWcgPSAoZW5hYmxlZCA/IENQVV9FTkFCTEVEIDogMCk7CiAJcHJvY2Vzc29yLm1wY19jcHVmbGFnIHw9IChib290X2NwdSA/IENQVV9CT09UUFJPQ0VTU09SIDogMCk7Ci0JcHJvY2Vzc29yLm1wY19jcHVmZWF0dXJlID0gKGJvb3RfY3B1X2RhdGEueDg2IDw8IDgpIHwgCi0JCShib290X2NwdV9kYXRhLng4Nl9tb2RlbCA8PCA0KSB8IGJvb3RfY3B1X2RhdGEueDg2X21hc2s7Ci0JcHJvY2Vzc29yLm1wY19mZWF0dXJlZmxhZyA9IGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHlbMF07CisJcHJvY2Vzc29yLm1wY19jcHVmZWF0dXJlID0gMDsKKwlwcm9jZXNzb3IubXBjX2ZlYXR1cmVmbGFnID0gMDsKIAlwcm9jZXNzb3IubXBjX3Jlc2VydmVkWzBdID0gMDsKIAlwcm9jZXNzb3IubXBjX3Jlc2VydmVkWzFdID0gMDsKIAogCU1QX3Byb2Nlc3Nvcl9pbmZvKCZwcm9jZXNzb3IpOwogfQogCi0jaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCi0KICNkZWZpbmUgTVBfSVNBX0JVUwkJMAogI2RlZmluZSBNUF9NQVhfSU9BUElDX1BJTgkxMjcKIApAQCAtNzI5LDExICs2MjgsOSBAQAogCXUzMgkJCXBpbl9wcm9ncmFtbWVkWzRdOwogfSBtcF9pb2FwaWNfcm91dGluZ1tNQVhfSU9fQVBJQ1NdOwogCi0KLXN0YXRpYyBpbnQgbXBfZmluZF9pb2FwaWMgKAotCWludAkJCWdzaSkKK3N0YXRpYyBpbnQgbXBfZmluZF9pb2FwaWMoaW50IGdzaSkKIHsKLQlpbnQJCQlpID0gMDsKKwlpbnQgaSA9IDA7CiAKIAkvKiBGaW5kIHRoZSBJT0FQSUMgdGhhdCBtYW5hZ2VzIHRoaXMgR1NJLiAqLwogCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNzOyBpKyspIHsKQEAgLTc0MywxNyArNjQwLDEyIEBACiAJfQogCiAJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogVW5hYmxlIHRvIGxvY2F0ZSBJT0FQSUMgZm9yIEdTSSAlZFxuIiwgZ3NpKTsKLQogCXJldHVybiAtMTsKIH0KLQkKIAotdm9pZCBfX2luaXQgbXBfcmVnaXN0ZXJfaW9hcGljICgKLQl1OAkJCWlkLCAKLQl1MzIJCQlhZGRyZXNzLAotCXUzMgkJCWdzaV9iYXNlKQordm9pZCBfX2luaXQgbXBfcmVnaXN0ZXJfaW9hcGljKHU4IGlkLCB1MzIgYWRkcmVzcywgdTMyIGdzaV9iYXNlKQogewotCWludAkJCWlkeCA9IDA7CisJaW50IGlkeCA9IDA7CiAKIAlpZiAobnJfaW9hcGljcyA+PSBNQVhfSU9fQVBJQ1MpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogTWF4ICMgb2YgSS9PIEFQSUNzICglZCkgZXhjZWVkZWQgIgpAQCAtNzc0LDcgKzY2Niw3IEBACiAKIAlzZXRfZml4bWFwX25vY2FjaGUoRklYX0lPX0FQSUNfQkFTRV8wICsgaWR4LCBhZGRyZXNzKTsKIAltcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNpZCA9IGlkOwotCW1wX2lvYXBpY3NbaWR4XS5tcGNfYXBpY3ZlciA9IGlvX2FwaWNfZ2V0X3ZlcnNpb24oaWR4KTsKKwltcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWN2ZXIgPSAwOwogCQogCS8qIAogCSAqIEJ1aWxkIGJhc2ljIElSUSBsb29rdXAgdGFibGUgdG8gZmFjaWxpdGF0ZSBnc2ktPmlvX2FwaWMgbG9va3VwcwpAQCAtNzg1LDIxICs2NzcsMTUgQEAKIAltcF9pb2FwaWNfcm91dGluZ1tpZHhdLmdzaV9lbmQgPSBnc2lfYmFzZSArIAogCQlpb19hcGljX2dldF9yZWRpcl9lbnRyaWVzKGlkeCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJJT0FQSUNbJWRdOiBhcGljX2lkICVkLCB2ZXJzaW9uICVkLCBhZGRyZXNzIDB4JXgsICIKKwlwcmludGsoS0VSTl9JTkZPICJJT0FQSUNbJWRdOiBhcGljX2lkICVkLCBhZGRyZXNzIDB4JXgsICIKIAkJIkdTSSAlZC0lZFxuIiwgaWR4LCBtcF9pb2FwaWNzW2lkeF0ubXBjX2FwaWNpZCwgCi0JCW1wX2lvYXBpY3NbaWR4XS5tcGNfYXBpY3ZlciwgbXBfaW9hcGljc1tpZHhdLm1wY19hcGljYWRkciwKKwkJbXBfaW9hcGljc1tpZHhdLm1wY19hcGljYWRkciwKIAkJbXBfaW9hcGljX3JvdXRpbmdbaWR4XS5nc2lfc3RhcnQsCiAJCW1wX2lvYXBpY19yb3V0aW5nW2lkeF0uZ3NpX2VuZCk7Ci0KLQlyZXR1cm47CiB9CiAKLQotdm9pZCBfX2luaXQgbXBfb3ZlcnJpZGVfbGVnYWN5X2lycSAoCi0JdTgJCQlidXNfaXJxLAotCXU4CQkJcG9sYXJpdHksIAotCXU4CQkJdHJpZ2dlciwgCi0JdTMyCQkJZ3NpKQordm9pZCBfX2luaXQKK21wX292ZXJyaWRlX2xlZ2FjeV9pcnEodTggYnVzX2lycSwgdTggcG9sYXJpdHksIHU4IHRyaWdnZXIsIHUzMglnc2kpCiB7CiAJc3RydWN0IG1wY19jb25maWdfaW50c3JjIGludHNyYzsKIAlpbnQJCQlpb2FwaWMgPSAtMTsKQEAgLTgzNywyMiArNzIzLDE4IEBACiAJbXBfaXJxc1ttcF9pcnFfZW50cmllc10gPSBpbnRzcmM7CiAJaWYgKCsrbXBfaXJxX2VudHJpZXMgPT0gTUFYX0lSUV9TT1VSQ0VTKQogCQlwYW5pYygiTWF4ICMgb2YgaXJxIHNvdXJjZXMgZXhjZWVkZWQhXG4iKTsKLQotCXJldHVybjsKIH0KIAotCi12b2lkIF9faW5pdCBtcF9jb25maWdfYWNwaV9sZWdhY3lfaXJxcyAodm9pZCkKK3ZvaWQgX19pbml0IG1wX2NvbmZpZ19hY3BpX2xlZ2FjeV9pcnFzKHZvaWQpCiB7CiAJc3RydWN0IG1wY19jb25maWdfaW50c3JjIGludHNyYzsKLQlpbnQJCQlpID0gMDsKLQlpbnQJCQlpb2FwaWMgPSAtMTsKKwlpbnQgaSA9IDA7CisJaW50IGlvYXBpYyA9IC0xOwogCiAJLyogCiAJICogRmFicmljYXRlIHRoZSBsZWdhY3kgSVNBIGJ1cyAoYnVzICMzMSkuCiAJICovCi0JbXBfYnVzX2lkX3RvX3R5cGVbTVBfSVNBX0JVU10gPSBNUF9CVVNfSVNBOwotCURwcmludGsoIkJ1cyAjJWQgaXMgSVNBXG4iLCBNUF9JU0FfQlVTKTsKKwlzZXRfYml0KE1QX0lTQV9CVVMsIG1wX2J1c19ub3RfcGNpKTsKIAogCS8qIAogCSAqIExvY2F0ZSB0aGUgSU9BUElDIHRoYXQgbWFuYWdlcyB0aGUgSVNBIElSUXMgKDAtMTUpLiAKQEAgLTkwNSwyNCArNzg3LDIyIEBACiAJCWlmICgrK21wX2lycV9lbnRyaWVzID09IE1BWF9JUlFfU09VUkNFUykKIAkJCXBhbmljKCJNYXggIyBvZiBpcnEgc291cmNlcyBleGNlZWRlZCFcbiIpOwogCX0KLQotCXJldHVybjsKIH0KIAogI2RlZmluZSBNQVhfR1NJX05VTQk0MDk2CiAKIGludCBtcF9yZWdpc3Rlcl9nc2kodTMyIGdzaSwgaW50IHRyaWdnZXJpbmcsIGludCBwb2xhcml0eSkKIHsKLQlpbnQJCQlpb2FwaWMgPSAtMTsKLQlpbnQJCQlpb2FwaWNfcGluID0gMDsKLQlpbnQJCQlpZHgsIGJpdCA9IDA7Ci0Jc3RhdGljIGludAkJcGNpX2lycSA9IDE2OworCWludCBpb2FwaWMgPSAtMTsKKwlpbnQgaW9hcGljX3BpbiA9IDA7CisJaW50IGlkeCwgYml0ID0gMDsKKwlzdGF0aWMgaW50IHBjaV9pcnEgPSAxNjsKIAkvKgogCSAqIE1hcHBpbmcgYmV0d2VlbiBHbG9iYWwgU3lzdGVtIEludGVycnVwdHMsIHdoaWNoCiAJICogcmVwcmVzZW50IGFsbCBwb3NzaWJsZSBpbnRlcnJ1cHRzLCB0byB0aGUgSVJRcwogCSAqIGFzc2lnbmVkIHRvIGFjdHVhbCBkZXZpY2VzLgogCSAqLwotCXN0YXRpYyBpbnQJCWdzaV90b19pcnFbTUFYX0dTSV9OVU1dOworCXN0YXRpYyBpbnQgZ3NpX3RvX2lycVtNQVhfR1NJX05VTV07CiAKIAlpZiAoYWNwaV9pcnFfbW9kZWwgIT0gQUNQSV9JUlFfTU9ERUxfSU9BUElDKQogCQlyZXR1cm4gZ3NpOwpAQCAtOTk2LDYgKzg3Niw0IEBACiAJCXBvbGFyaXR5ID09IEFDUElfQUNUSVZFX0hJR0ggPyAwIDogMSk7CiAJcmV0dXJuIGdzaTsKIH0KLQotI2VuZGlmIC8qQ09ORklHX1g4Nl9JT19BUElDKi8KICNlbmRpZiAvKkNPTkZJR19BQ1BJKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9ubWkuYwppbmRleCA1YmFhMGM3Li40ZDZmYjA0IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvbm1pLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL25taS5jCkBAIC0yOCw3MSArMjgsMTM4IEBACiAjaW5jbHVkZSA8YXNtL21jZS5oPgogI2luY2x1ZGUgPGFzbS9pbnRlbF9hcmNoX3BlcmZtb24uaD4KIAotLyoKLSAqIGxhcGljX25taV9vd25lciB0cmFja3MgdGhlIG93bmVyc2hpcCBvZiB0aGUgbGFwaWMgTk1JIGhhcmR3YXJlOgotICogLSBpdCBtYXkgYmUgcmVzZXJ2ZWQgYnkgc29tZSBvdGhlciBkcml2ZXIsIG9yIG5vdAotICogLSB3aGVuIG5vdCByZXNlcnZlZCBieSBzb21lIG90aGVyIGRyaXZlciwgaXQgbWF5IGJlIHVzZWQgZm9yCi0gKiAgIHRoZSBOTUkgd2F0Y2hkb2csIG9yIG5vdAotICoKLSAqIFRoaXMgaXMgbWFpbnRhaW5lZCBzZXBhcmF0ZWx5IGZyb20gbm1pX2FjdGl2ZSBiZWNhdXNlIHRoZSBOTUkKLSAqIHdhdGNoZG9nIG1heSBhbHNvIGJlIGRyaXZlbiBmcm9tIHRoZSBJL08gQVBJQyB0aW1lci4KKy8qIHBlcmZjdHJfbm1pX293bmVyIHRyYWNrcyB0aGUgb3duZXJzaGlwIG9mIHRoZSBwZXJmY3RyIHJlZ2lzdGVyczoKKyAqIGV2dHNlbF9ubWlfb3duZXIgdHJhY2tzIHRoZSBvd25lcnNoaXAgb2YgdGhlIGV2ZW50IHNlbGVjdGlvbgorICogLSBkaWZmZXJlbnQgcGVyZm9ybWFuY2UgY291bnRlcnMvIGV2ZW50IHNlbGVjdGlvbiBtYXkgYmUgcmVzZXJ2ZWQgZm9yCisgKiAgIGRpZmZlcmVudCBzdWJzeXN0ZW1zIHRoaXMgcmVzZXJ2YXRpb24gc3lzdGVtIGp1c3QgdHJpZXMgdG8gY29vcmRpbmF0ZQorICogICB0aGluZ3MgYSBsaXR0bGUKICAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyhsYXBpY19ubWlfb3duZXJfbG9jayk7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGxhcGljX25taV9vd25lcjsKLSNkZWZpbmUgTEFQSUNfTk1JX1dBVENIRE9HCSgxPDwwKQotI2RlZmluZSBMQVBJQ19OTUlfUkVTRVJWRUQJKDE8PDEpCitzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQsIHBlcmZjdHJfbm1pX293bmVyKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCwgZXZudHNlbF9ubWlfb3duZXJbMl0pOworCisvKiB0aGlzIG51bWJlciBpcyBjYWxjdWxhdGVkIGZyb20gSW50ZWwncyBNU1JfUDRfQ1JVX0VTQ1I1IHJlZ2lzdGVyIGFuZCBpdCdzCisgKiBvZmZzZXQgZnJvbSBNU1JfUDRfQlNVX0VTQ1IwLiAgSXQgd2lsbCBiZSB0aGUgbWF4IGZvciBhbGwgcGxhdGZvcm1zIChmb3Igbm93KQorICovCisjZGVmaW5lIE5NSV9NQVhfQ09VTlRFUl9CSVRTIDY2CiAKIC8qIG5taV9hY3RpdmU6Ci0gKiArMTogdGhlIGxhcGljIE5NSSB3YXRjaGRvZyBpcyBhY3RpdmUsIGJ1dCBjYW4gYmUgZGlzYWJsZWQKLSAqICAwOiB0aGUgbGFwaWMgTk1JIHdhdGNoZG9nIGhhcyBub3QgYmVlbiBzZXQgdXAsIGFuZCBjYW5ub3QKKyAqID4wOiB0aGUgbGFwaWMgTk1JIHdhdGNoZG9nIGlzIGFjdGl2ZSwgYnV0IGNhbiBiZSBkaXNhYmxlZAorICogPDA6IHRoZSBsYXBpYyBOTUkgd2F0Y2hkb2cgaGFzIG5vdCBiZWVuIHNldCB1cCwgYW5kIGNhbm5vdAogICogICAgIGJlIGVuYWJsZWQKLSAqIC0xOiB0aGUgbGFwaWMgTk1JIHdhdGNoZG9nIGlzIGRpc2FibGVkLCBidXQgY2FuIGJlIGVuYWJsZWQKKyAqICAwOiB0aGUgbGFwaWMgTk1JIHdhdGNoZG9nIGlzIGRpc2FibGVkLCBidXQgY2FuIGJlIGVuYWJsZWQKICAqLwotaW50IG5taV9hY3RpdmU7CQkvKiBvcHJvZmlsZSB1c2VzIHRoaXMgKi8KK2F0b21pY190IG5taV9hY3RpdmUgPSBBVE9NSUNfSU5JVCgwKTsJCS8qIG9wcm9maWxlIHVzZXMgdGhpcyAqLwogaW50IHBhbmljX29uX3RpbWVvdXQ7CiAKIHVuc2lnbmVkIGludCBubWlfd2F0Y2hkb2cgPSBOTUlfREVGQVVMVDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbm1pX2h6ID0gSFo7Ci1zdGF0aWMgdW5zaWduZWQgaW50IG5taV9wZXJmY3RyX21zcjsJLyogdGhlIE1TUiB0byByZXNldCBpbiBOTUkgaGFuZGxlciAqLwotc3RhdGljIHVuc2lnbmVkIGludCBubWlfcDRfY2Njcl92YWw7CiAKLS8qIE5vdGUgdGhhdCB0aGVzZSBldmVudHMgZG9uJ3QgdGljayB3aGVuIHRoZSBDUFUgaWRsZXMuIFRoaXMgbWVhbnMKLSAgIHRoZSBmcmVxdWVuY3kgdmFyaWVzIHdpdGggQ1BVIGxvYWQuICovCitzdHJ1Y3Qgbm1pX3dhdGNoZG9nX2N0bGJsayB7CisJaW50IGVuYWJsZWQ7CisJdTY0IGNoZWNrX2JpdDsKKwl1bnNpZ25lZCBpbnQgY2Njcl9tc3I7CisJdW5zaWduZWQgaW50IHBlcmZjdHJfbXNyOyAgLyogdGhlIE1TUiB0byByZXNldCBpbiBOTUkgaGFuZGxlciAqLworCXVuc2lnbmVkIGludCBldm50c2VsX21zcjsgIC8qIHRoZSBNU1IgdG8gc2VsZWN0IHRoZSBldmVudHMgdG8gaGFuZGxlICovCit9Oworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBubWlfd2F0Y2hkb2dfY3RsYmxrLCBubWlfd2F0Y2hkb2dfY3RsYmxrKTsKIAotI2RlZmluZSBLN19FVk5UU0VMX0VOQUJMRQkoMSA8PCAyMikKLSNkZWZpbmUgSzdfRVZOVFNFTF9JTlQJCSgxIDw8IDIwKQotI2RlZmluZSBLN19FVk5UU0VMX09TCQkoMSA8PCAxNykKLSNkZWZpbmUgSzdfRVZOVFNFTF9VU1IJCSgxIDw8IDE2KQotI2RlZmluZSBLN19FVkVOVF9DWUNMRVNfUFJPQ0VTU09SX0lTX1JVTk5JTkcJMHg3NgotI2RlZmluZSBLN19OTUlfRVZFTlQJCUs3X0VWRU5UX0NZQ0xFU19QUk9DRVNTT1JfSVNfUlVOTklORworLyogbG9jYWwgcHJvdG90eXBlcyAqLworc3RhdGljIGludCB1bmtub3duX25taV9wYW5pY19jYWxsYmFjayhzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGNwdSk7CiAKLSNkZWZpbmUgQVJDSF9QRVJGTU9OX05NSV9FVkVOVF9TRUwJQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1NFTAotI2RlZmluZSBBUkNIX1BFUkZNT05fTk1JX0VWRU5UX1VNQVNLCUFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19VTUFTSworLyogY29udmVydHMgYW4gbXNyIHRvIGFuIGFwcHJvcHJpYXRlIHJlc2VydmF0aW9uIGJpdCAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbm1pX3BlcmZjdHJfbXNyX3RvX2JpdCh1bnNpZ25lZCBpbnQgbXNyKQoreworCS8qIHJldHVybnMgdGhlIGJpdCBvZmZzZXQgb2YgdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIgcmVnaXN0ZXIgKi8KKwlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgeworCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6CisJCXJldHVybiAobXNyIC0gTVNSX0s3X1BFUkZDVFIwKTsKKwljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCWlmIChjcHVfaGFzKCZib290X2NwdV9kYXRhLCBYODZfRkVBVFVSRV9BUkNIX1BFUkZNT04pKQorCQkJcmV0dXJuIChtc3IgLSBNU1JfQVJDSF9QRVJGTU9OX1BFUkZDVFIwKTsKKwkJZWxzZQorCQkJcmV0dXJuIChtc3IgLSBNU1JfUDRfQlBVX1BFUkZDVFIwKTsKKwl9CisJcmV0dXJuIDA7Cit9CiAKLSNkZWZpbmUgTVNSX1A0X01JU0NfRU5BQkxFCTB4MUEwCi0jZGVmaW5lIE1TUl9QNF9NSVNDX0VOQUJMRV9QRVJGX0FWQUlMCSgxPDw3KQotI2RlZmluZSBNU1JfUDRfTUlTQ19FTkFCTEVfUEVCU19VTkFWQUlMCSgxPDwxMikKLSNkZWZpbmUgTVNSX1A0X1BFUkZDVFIwCQkweDMwMAotI2RlZmluZSBNU1JfUDRfQ0NDUjAJCTB4MzYwCi0jZGVmaW5lIFA0X0VTQ1JfRVZFTlRfU0VMRUNUKE4pCSgoTik8PDI1KQotI2RlZmluZSBQNF9FU0NSX09TCQkoMTw8MykKLSNkZWZpbmUgUDRfRVNDUl9VU1IJCSgxPDwyKQotI2RlZmluZSBQNF9DQ0NSX09WRl9QTUkwCSgxPDwyNikKLSNkZWZpbmUgUDRfQ0NDUl9PVkZfUE1JMQkoMTw8MjcpCi0jZGVmaW5lIFA0X0NDQ1JfVEhSRVNIT0xEKE4pCSgoTik8PDIwKQotI2RlZmluZSBQNF9DQ0NSX0NPTVBMRU1FTlQJKDE8PDE5KQotI2RlZmluZSBQNF9DQ0NSX0NPTVBBUkUJCSgxPDwxOCkKLSNkZWZpbmUgUDRfQ0NDUl9SRVFVSVJFRAkoMzw8MTYpCi0jZGVmaW5lIFA0X0NDQ1JfRVNDUl9TRUxFQ1QoTikJKChOKTw8MTMpCi0jZGVmaW5lIFA0X0NDQ1JfRU5BQkxFCQkoMTw8MTIpCi0vKiBTZXQgdXAgSVFfQ09VTlRFUjAgdG8gYmVoYXZlIGxpa2UgYSBjbG9jaywgYnkgaGF2aW5nIElRX0NDQ1IwIGZpbHRlcgotICAgQ1JVX0VTQ1IwICh3aXRoIGFueSBub24tbnVsbCBldmVudCBzZWxlY3RvcikgdGhyb3VnaCBhIGNvbXBsZW1lbnRlZAotICAgbWF4IHRocmVzaG9sZC4gW0lBMzItVm9sMywgU2VjdGlvbiAxNC45LjldICovCi0jZGVmaW5lIE1TUl9QNF9JUV9DT1VOVEVSMAkweDMwQwotI2RlZmluZSBQNF9OTUlfQ1JVX0VTQ1IwCShQNF9FU0NSX0VWRU5UX1NFTEVDVCgweDNGKXxQNF9FU0NSX09TfFA0X0VTQ1JfVVNSKQotI2RlZmluZSBQNF9OTUlfSVFfQ0NDUjAJXAotCShQNF9DQ0NSX09WRl9QTUkwfFA0X0NDQ1JfVEhSRVNIT0xEKDE1KXxQNF9DQ0NSX0NPTVBMRU1FTlR8CVwKLQkgUDRfQ0NDUl9DT01QQVJFfFA0X0NDQ1JfUkVRVUlSRUR8UDRfQ0NDUl9FU0NSX1NFTEVDVCg0KXxQNF9DQ0NSX0VOQUJMRSkKKy8qIGNvbnZlcnRzIGFuIG1zciB0byBhbiBhcHByb3ByaWF0ZSByZXNlcnZhdGlvbiBiaXQgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5taV9ldm50c2VsX21zcl90b19iaXQodW5zaWduZWQgaW50IG1zcikKK3sKKwkvKiByZXR1cm5zIHRoZSBiaXQgb2Zmc2V0IG9mIHRoZSBldmVudCBzZWxlY3Rpb24gcmVnaXN0ZXIgKi8KKwlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgeworCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6CisJCXJldHVybiAobXNyIC0gTVNSX0s3X0VWTlRTRUwwKTsKKwljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCWlmIChjcHVfaGFzKCZib290X2NwdV9kYXRhLCBYODZfRkVBVFVSRV9BUkNIX1BFUkZNT04pKQorCQkJcmV0dXJuIChtc3IgLSBNU1JfQVJDSF9QRVJGTU9OX0VWRU5UU0VMMCk7CisJCWVsc2UKKwkJCXJldHVybiAobXNyIC0gTVNSX1A0X0JTVV9FU0NSMCk7CisJfQorCXJldHVybiAwOworfQorCisvKiBjaGVja3MgZm9yIGEgYml0IGF2YWlsYWJpbGl0eSAoaGFjayBmb3Igb3Byb2ZpbGUpICovCitpbnQgYXZhaWxfdG9fcmVzcnZfcGVyZmN0cl9ubWlfYml0KHVuc2lnbmVkIGludCBjb3VudGVyKQoreworCUJVR19PTihjb3VudGVyID4gTk1JX01BWF9DT1VOVEVSX0JJVFMpOworCisJcmV0dXJuICghdGVzdF9iaXQoY291bnRlciwgJl9fZ2V0X2NwdV92YXIocGVyZmN0cl9ubWlfb3duZXIpKSk7Cit9CisKKy8qIGNoZWNrcyB0aGUgYW4gbXNyIGZvciBhdmFpbGFiaWxpdHkgKi8KK2ludCBhdmFpbF90b19yZXNydl9wZXJmY3RyX25taSh1bnNpZ25lZCBpbnQgbXNyKQoreworCXVuc2lnbmVkIGludCBjb3VudGVyOworCisJY291bnRlciA9IG5taV9wZXJmY3RyX21zcl90b19iaXQobXNyKTsKKwlCVUdfT04oY291bnRlciA+IE5NSV9NQVhfQ09VTlRFUl9CSVRTKTsKKworCXJldHVybiAoIXRlc3RfYml0KGNvdW50ZXIsICZfX2dldF9jcHVfdmFyKHBlcmZjdHJfbm1pX293bmVyKSkpOworfQorCitpbnQgcmVzZXJ2ZV9wZXJmY3RyX25taSh1bnNpZ25lZCBpbnQgbXNyKQoreworCXVuc2lnbmVkIGludCBjb3VudGVyOworCisJY291bnRlciA9IG5taV9wZXJmY3RyX21zcl90b19iaXQobXNyKTsKKwlCVUdfT04oY291bnRlciA+IE5NSV9NQVhfQ09VTlRFUl9CSVRTKTsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChjb3VudGVyLCAmX19nZXRfY3B1X3ZhcihwZXJmY3RyX25taV9vd25lcikpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCByZWxlYXNlX3BlcmZjdHJfbm1pKHVuc2lnbmVkIGludCBtc3IpCit7CisJdW5zaWduZWQgaW50IGNvdW50ZXI7CisKKwljb3VudGVyID0gbm1pX3BlcmZjdHJfbXNyX3RvX2JpdChtc3IpOworCUJVR19PTihjb3VudGVyID4gTk1JX01BWF9DT1VOVEVSX0JJVFMpOworCisJY2xlYXJfYml0KGNvdW50ZXIsICZfX2dldF9jcHVfdmFyKHBlcmZjdHJfbm1pX293bmVyKSk7Cit9CisKK2ludCByZXNlcnZlX2V2bnRzZWxfbm1pKHVuc2lnbmVkIGludCBtc3IpCit7CisJdW5zaWduZWQgaW50IGNvdW50ZXI7CisKKwljb3VudGVyID0gbm1pX2V2bnRzZWxfbXNyX3RvX2JpdChtc3IpOworCUJVR19PTihjb3VudGVyID4gTk1JX01BWF9DT1VOVEVSX0JJVFMpOworCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGNvdW50ZXIsICZfX2dldF9jcHVfdmFyKGV2bnRzZWxfbm1pX293bmVyKSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCit2b2lkIHJlbGVhc2VfZXZudHNlbF9ubWkodW5zaWduZWQgaW50IG1zcikKK3sKKwl1bnNpZ25lZCBpbnQgY291bnRlcjsKKworCWNvdW50ZXIgPSBubWlfZXZudHNlbF9tc3JfdG9fYml0KG1zcik7CisJQlVHX09OKGNvdW50ZXIgPiBOTUlfTUFYX0NPVU5URVJfQklUUyk7CisKKwljbGVhcl9iaXQoY291bnRlciwgJl9fZ2V0X2NwdV92YXIoZXZudHNlbF9ubWlfb3duZXIpKTsKK30KIAogc3RhdGljIF9fY3B1aW5pdCBpbmxpbmUgaW50IG5taV9rbm93bl9jcHUodm9pZCkKIHsKQEAgLTEwOSw3ICsxNzYsNyBAQAogfQogCiAvKiBSdW4gYWZ0ZXIgY29tbWFuZCBsaW5lIGFuZCBjcHVfaW5pdCBpbml0LCBidXQgYmVmb3JlIGFsbCBvdGhlciBjaGVja3MgKi8KLXZvaWQgX19jcHVpbml0IG5taV93YXRjaGRvZ19kZWZhdWx0KHZvaWQpCit2b2lkIG5taV93YXRjaGRvZ19kZWZhdWx0KHZvaWQpCiB7CiAJaWYgKG5taV93YXRjaGRvZyAhPSBOTUlfREVGQVVMVCkKIAkJcmV0dXJuOwpAQCAtMTQ1LDYgKzIxMiwxMiBAQAogCWludCAqY291bnRzOwogCWludCBjcHU7CiAKKwlpZiAoKG5taV93YXRjaGRvZyA9PSBOTUlfTk9ORSkgfHwgKG5taV93YXRjaGRvZyA9PSBOTUlfREVGQVVMVCkpCisJCXJldHVybiAwOworCisJaWYgKCFhdG9taWNfcmVhZCgmbm1pX2FjdGl2ZSkpCisJCXJldHVybiAwOworCiAJY291bnRzID0ga21hbGxvYyhOUl9DUFVTICogc2l6ZW9mKGludCksIEdGUF9LRVJORUwpOwogCWlmICghY291bnRzKQogCQlyZXR1cm4gLTE7CkBAIC0xNjIsMjYgKzIzNSw0MyBAQAogCW1kZWxheSgoMTAqMTAwMCkvbm1pX2h6KTsgLy8gd2FpdCAxMCB0aWNrcwogCiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKCFwZXJfY3B1KG5taV93YXRjaGRvZ19jdGxibGssIGNwdSkuZW5hYmxlZCkKKwkJCWNvbnRpbnVlOwogCQlpZiAoY3B1X3BkYShjcHUpLT5fX25taV9jb3VudCAtIGNvdW50c1tjcHVdIDw9IDUpIHsKLQkJCWVuZGZsYWcgPSAxOwogCQkJcHJpbnRrKCJDUFUjJWQ6IE5NSSBhcHBlYXJzIHRvIGJlIHN0dWNrICglZC0+JWQpIVxuIiwKIAkJCSAgICAgICBjcHUsCiAJCQkgICAgICAgY291bnRzW2NwdV0sCiAJCQkgICAgICAgY3B1X3BkYShjcHUpLT5fX25taV9jb3VudCk7Ci0JCQlubWlfYWN0aXZlID0gMDsKLQkJCWxhcGljX25taV9vd25lciAmPSB+TEFQSUNfTk1JX1dBVENIRE9HOwotCQkJbm1pX3BlcmZjdHJfbXNyID0gMDsKLQkJCWtmcmVlKGNvdW50cyk7Ci0JCQlyZXR1cm4gLTE7CisJCQlwZXJfY3B1KG5taV93YXRjaGRvZ19jdGxibGssIGNwdSkuZW5hYmxlZCA9IDA7CisJCQlhdG9taWNfZGVjKCZubWlfYWN0aXZlKTsKIAkJfQogCX0KKwlpZiAoIWF0b21pY19yZWFkKCZubWlfYWN0aXZlKSkgeworCQlrZnJlZShjb3VudHMpOworCQlhdG9taWNfc2V0KCZubWlfYWN0aXZlLCAtMSk7CisJCXJldHVybiAtMTsKKwl9CiAJZW5kZmxhZyA9IDE7CiAJcHJpbnRrKCJPSy5cbiIpOwogCiAJLyogbm93IHRoYXQgd2Uga25vdyBpdCB3b3JrcyB3ZSBjYW4gcmVkdWNlIE5NSSBmcmVxdWVuY3kgdG8KIAkgICBzb21ldGhpbmcgbW9yZSByZWFzb25hYmxlOyBtYWtlcyBhIGRpZmZlcmVuY2UgaW4gc29tZSBjb25maWdzICovCi0JaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfTE9DQUxfQVBJQykKKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9MT0NBTF9BUElDKSB7CisJCXN0cnVjdCBubWlfd2F0Y2hkb2dfY3RsYmxrICp3ZCA9ICZfX2dldF9jcHVfdmFyKG5taV93YXRjaGRvZ19jdGxibGspOworCiAJCW5taV9oeiA9IDE7CisJCS8qCisJCSAqIE9uIEludGVsIENQVXMgd2l0aCBBUkNIX1BFUkZNT04gb25seSAzMiBiaXRzIGluIHRoZSBjb3VudGVyCisJCSAqIGFyZSB3cml0YWJsZSwgd2l0aCBoaWdoZXIgYml0cyBzaWduIGV4dGVuZGluZyBmcm9tIGJpdCAzMS4KKwkJICogU28sIHdlIGNhbiBvbmx5IHByb2dyYW0gdGhlIGNvdW50ZXIgd2l0aCAzMSBiaXQgdmFsdWVzIGFuZAorCQkgKiAzMm5kIGJpdCBzaG91bGQgYmUgMSwgZm9yIDMzLi4gdG8gYmUgMS4KKwkJICogRmluZCB0aGUgYXBwcm9wcmlhdGUgbm1pX2h6CisJCSAqLworCSAJaWYgKHdkLT5wZXJmY3RyX21zciA9PSBNU1JfQVJDSF9QRVJGTU9OX1BFUkZDVFIwICYmCisJCQkoKHU2NCljcHVfa2h6ICogMTAwMCkgPiAweDdmZmZmZmZmVUxMKSB7CisJCQlubWlfaHogPSAoKHU2NCljcHVfa2h6ICogMTAwMCkgLyAweDdmZmZmZmZmVUwgKyAxOworCQl9CisJfQogCiAJa2ZyZWUoY291bnRzKTsKIAlyZXR1cm4gMDsKQEAgLTIwMSw5MSArMjkxLDY1IEBACiAKIAlnZXRfb3B0aW9uKCZzdHIsICZubWkpOwogCi0JaWYgKG5taSA+PSBOTUlfSU5WQUxJRCkKKwlpZiAoKG5taSA+PSBOTUlfSU5WQUxJRCkgfHwgKG5taSA8IE5NSV9OT05FKSkKIAkJcmV0dXJuIDA7CisKKwlpZiAoKG5taSA9PSBOTUlfTE9DQUxfQVBJQykgJiYgKG5taV9rbm93bl9jcHUoKSA9PSAwKSkKKwkJcmV0dXJuIDA7ICAvKiBubyBsYXBpYyBzdXBwb3J0ICovCiAJbm1pX3dhdGNoZG9nID0gbm1pOwogCXJldHVybiAxOwogfQogCiBfX3NldHVwKCJubWlfd2F0Y2hkb2c9Iiwgc2V0dXBfbm1pX3dhdGNoZG9nKTsKIAotc3RhdGljIHZvaWQgZGlzYWJsZV9pbnRlbF9hcmNoX3dhdGNoZG9nKHZvaWQpOwotCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2xhcGljX25taV93YXRjaGRvZyh2b2lkKQogewotCWlmIChubWlfYWN0aXZlIDw9IDApCisJQlVHX09OKG5taV93YXRjaGRvZyAhPSBOTUlfTE9DQUxfQVBJQyk7CisKKwlpZiAoYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpIDw9IDApCiAJCXJldHVybjsKLQlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgewotCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6Ci0JCXdybXNyKE1TUl9LN19FVk5UU0VMMCwgMCwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKLQkJaWYgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSB7Ci0JCQl3cm1zcihNU1JfUDRfSVFfQ0NDUjAsIDAsIDApOwotCQkJd3Jtc3IoTVNSX1A0X0NSVV9FU0NSMCwgMCwgMCk7Ci0JCX0gZWxzZSBpZiAoY3B1X2hhcygmYm9vdF9jcHVfZGF0YSwgWDg2X0ZFQVRVUkVfQVJDSF9QRVJGTU9OKSkgewotCQkJZGlzYWJsZV9pbnRlbF9hcmNoX3dhdGNoZG9nKCk7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCW5taV9hY3RpdmUgPSAtMTsKLQkvKiB0ZWxsIGRvX25taSgpIGFuZCBvdGhlcnMgdGhhdCB3ZSdyZSBub3QgYWN0aXZlIGFueSBtb3JlICovCi0Jbm1pX3dhdGNoZG9nID0gMDsKKworCW9uX2VhY2hfY3B1KHN0b3BfYXBpY19ubWlfd2F0Y2hkb2csIE5VTEwsIDAsIDEpOworCisJQlVHX09OKGF0b21pY19yZWFkKCZubWlfYWN0aXZlKSAhPSAwKTsKIH0KIAogc3RhdGljIHZvaWQgZW5hYmxlX2xhcGljX25taV93YXRjaGRvZyh2b2lkKQogewotCWlmIChubWlfYWN0aXZlIDwgMCkgewotCQlubWlfd2F0Y2hkb2cgPSBOTUlfTE9DQUxfQVBJQzsKLQkJdG91Y2hfbm1pX3dhdGNoZG9nKCk7Ci0JCXNldHVwX2FwaWNfbm1pX3dhdGNoZG9nKCk7Ci0JfQotfQorCUJVR19PTihubWlfd2F0Y2hkb2cgIT0gTk1JX0xPQ0FMX0FQSUMpOwogCi1pbnQgcmVzZXJ2ZV9sYXBpY19ubWkodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgb2xkX293bmVyOworCS8qIGFyZSB3ZSBhbHJlYWR5IGVuYWJsZWQgKi8KKwlpZiAoYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpICE9IDApCisJCXJldHVybjsKIAotCXNwaW5fbG9jaygmbGFwaWNfbm1pX293bmVyX2xvY2spOwotCW9sZF9vd25lciA9IGxhcGljX25taV9vd25lcjsKLQlsYXBpY19ubWlfb3duZXIgfD0gTEFQSUNfTk1JX1JFU0VSVkVEOwotCXNwaW5fdW5sb2NrKCZsYXBpY19ubWlfb3duZXJfbG9jayk7Ci0JaWYgKG9sZF9vd25lciAmIExBUElDX05NSV9SRVNFUlZFRCkKLQkJcmV0dXJuIC1FQlVTWTsKLQlpZiAob2xkX293bmVyICYgTEFQSUNfTk1JX1dBVENIRE9HKQotCQlkaXNhYmxlX2xhcGljX25taV93YXRjaGRvZygpOwotCXJldHVybiAwOwotfQorCS8qIGFyZSB3ZSBsYXBpYyBhd2FyZSAqLworCWlmIChubWlfa25vd25fY3B1KCkgPD0gMCkKKwkJcmV0dXJuOwogCi12b2lkIHJlbGVhc2VfbGFwaWNfbm1pKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IG5ld19vd25lcjsKLQotCXNwaW5fbG9jaygmbGFwaWNfbm1pX293bmVyX2xvY2spOwotCW5ld19vd25lciA9IGxhcGljX25taV9vd25lciAmIH5MQVBJQ19OTUlfUkVTRVJWRUQ7Ci0JbGFwaWNfbm1pX293bmVyID0gbmV3X293bmVyOwotCXNwaW5fdW5sb2NrKCZsYXBpY19ubWlfb3duZXJfbG9jayk7Ci0JaWYgKG5ld19vd25lciAmIExBUElDX05NSV9XQVRDSERPRykKLQkJZW5hYmxlX2xhcGljX25taV93YXRjaGRvZygpOworCW9uX2VhY2hfY3B1KHNldHVwX2FwaWNfbm1pX3dhdGNoZG9nLCBOVUxMLCAwLCAxKTsKKwl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKIH0KIAogdm9pZCBkaXNhYmxlX3RpbWVyX25taV93YXRjaGRvZyh2b2lkKQogewotCWlmICgobm1pX3dhdGNoZG9nICE9IE5NSV9JT19BUElDKSB8fCAobm1pX2FjdGl2ZSA8PSAwKSkKKwlCVUdfT04obm1pX3dhdGNoZG9nICE9IE5NSV9JT19BUElDKTsKKworCWlmIChhdG9taWNfcmVhZCgmbm1pX2FjdGl2ZSkgPD0gMCkKIAkJcmV0dXJuOwogCiAJZGlzYWJsZV9pcnEoMCk7Ci0JdW5zZXRfbm1pX2NhbGxiYWNrKCk7Ci0Jbm1pX2FjdGl2ZSA9IC0xOwotCW5taV93YXRjaGRvZyA9IE5NSV9OT05FOworCW9uX2VhY2hfY3B1KHN0b3BfYXBpY19ubWlfd2F0Y2hkb2csIE5VTEwsIDAsIDEpOworCisJQlVHX09OKGF0b21pY19yZWFkKCZubWlfYWN0aXZlKSAhPSAwKTsKIH0KIAogdm9pZCBlbmFibGVfdGltZXJfbm1pX3dhdGNoZG9nKHZvaWQpCiB7Ci0JaWYgKG5taV9hY3RpdmUgPCAwKSB7Ci0JCW5taV93YXRjaGRvZyA9IE5NSV9JT19BUElDOworCUJVR19PTihubWlfd2F0Y2hkb2cgIT0gTk1JX0lPX0FQSUMpOworCisJaWYgKGF0b21pY19yZWFkKCZubWlfYWN0aXZlKSA9PSAwKSB7CiAJCXRvdWNoX25taV93YXRjaGRvZygpOwotCQlubWlfYWN0aXZlID0gMTsKKwkJb25fZWFjaF9jcHUoc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2csIE5VTEwsIDAsIDEpOwogCQllbmFibGVfaXJxKDApOwogCX0KIH0KQEAgLTI5NiwxNSArMzYwLDIwIEBACiAKIHN0YXRpYyBpbnQgbGFwaWNfbm1pX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewotCW5taV9wbV9hY3RpdmUgPSBubWlfYWN0aXZlOwotCWRpc2FibGVfbGFwaWNfbm1pX3dhdGNoZG9nKCk7CisJLyogb25seSBDUFUwIGdvZXMgaGVyZSwgb3RoZXIgQ1BVcyBzaG91bGQgYmUgb2ZmbGluZSAqLworCW5taV9wbV9hY3RpdmUgPSBhdG9taWNfcmVhZCgmbm1pX2FjdGl2ZSk7CisJc3RvcF9hcGljX25taV93YXRjaGRvZyhOVUxMKTsKKwlCVUdfT04oYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpICE9IDApOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGxhcGljX25taV9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKIHsKLQlpZiAobm1pX3BtX2FjdGl2ZSA+IDApCi0JZW5hYmxlX2xhcGljX25taV93YXRjaGRvZygpOworCS8qIG9ubHkgQ1BVMCBnb2VzIGhlcmUsIG90aGVyIENQVXMgc2hvdWxkIGJlIG9mZmxpbmUgKi8KKwlpZiAobm1pX3BtX2FjdGl2ZSA+IDApIHsKKwkJc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2coTlVMTCk7CisJCXRvdWNoX25taV93YXRjaGRvZygpOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzIzLDcgKzM5MiwxMyBAQAogewogCWludCBlcnJvcjsKIAotCWlmIChubWlfYWN0aXZlID09IDAgfHwgbm1pX3dhdGNoZG9nICE9IE5NSV9MT0NBTF9BUElDKQorCS8qIHNob3VsZCByZWFsbHkgYmUgYSBCVUdfT04gYnV0IGIvYyB0aGlzIGlzIGFuCisJICogaW5pdCBjYWxsLCBpdCBqdXN0IGRvZXNuJ3Qgd29yay4gIC1kY3oKKwkgKi8KKwlpZiAobm1pX3dhdGNoZG9nICE9IE5NSV9MT0NBTF9BUElDKQorCQlyZXR1cm4gMDsKKworCWlmICggYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpIDwgMCApCiAJCXJldHVybiAwOwogCiAJZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJm5taV9zeXNjbGFzcyk7CkBAIC0zNDEsNzQgKzQxNiwyMDkgQEAKICAqIE9yaWdpbmFsIGNvZGUgd3JpdHRlbiBieSBLZWl0aCBPd2Vucy4KICAqLwogCi1zdGF0aWMgdm9pZCBjbGVhcl9tc3JfcmFuZ2UodW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGludCBuKQotewotCXVuc2lnbmVkIGludCBpOworLyogTm90ZSB0aGF0IHRoZXNlIGV2ZW50cyBkb24ndCB0aWNrIHdoZW4gdGhlIENQVSBpZGxlcy4gVGhpcyBtZWFucworICAgdGhlIGZyZXF1ZW5jeSB2YXJpZXMgd2l0aCBDUFUgbG9hZC4gKi8KIAotCWZvcihpID0gMDsgaSA8IG47ICsraSkKLQkJd3Jtc3IoYmFzZStpLCAwLCAwKTsKLX0KKyNkZWZpbmUgSzdfRVZOVFNFTF9FTkFCTEUJKDEgPDwgMjIpCisjZGVmaW5lIEs3X0VWTlRTRUxfSU5UCQkoMSA8PCAyMCkKKyNkZWZpbmUgSzdfRVZOVFNFTF9PUwkJKDEgPDwgMTcpCisjZGVmaW5lIEs3X0VWTlRTRUxfVVNSCQkoMSA8PCAxNikKKyNkZWZpbmUgSzdfRVZFTlRfQ1lDTEVTX1BST0NFU1NPUl9JU19SVU5OSU5HCTB4NzYKKyNkZWZpbmUgSzdfTk1JX0VWRU5UCQlLN19FVkVOVF9DWUNMRVNfUFJPQ0VTU09SX0lTX1JVTk5JTkcKIAotc3RhdGljIHZvaWQgc2V0dXBfazdfd2F0Y2hkb2codm9pZCkKK3N0YXRpYyBpbnQgc2V0dXBfazdfd2F0Y2hkb2codm9pZCkKIHsKLQlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgcGVyZmN0cl9tc3IsIGV2bnRzZWxfbXNyOwogCXVuc2lnbmVkIGludCBldm50c2VsOworCXN0cnVjdCBubWlfd2F0Y2hkb2dfY3RsYmxrICp3ZCA9ICZfX2dldF9jcHVfdmFyKG5taV93YXRjaGRvZ19jdGxibGspOwogCi0Jbm1pX3BlcmZjdHJfbXNyID0gTVNSX0s3X1BFUkZDVFIwOworCXBlcmZjdHJfbXNyID0gTVNSX0s3X1BFUkZDVFIwOworCWV2bnRzZWxfbXNyID0gTVNSX0s3X0VWTlRTRUwwOworCWlmICghcmVzZXJ2ZV9wZXJmY3RyX25taShwZXJmY3RyX21zcikpCisJCWdvdG8gZmFpbDsKIAotCWZvcihpID0gMDsgaSA8IDQ7ICsraSkgewotCQkvKiBTaW11bGF0b3IgbWF5IG5vdCBzdXBwb3J0IGl0ICovCi0JCWlmIChjaGVja2luZ193cm1zcmwoTVNSX0s3X0VWTlRTRUwwK2ksIDBVTCkpIHsKLQkJCW5taV9wZXJmY3RyX21zciA9IDA7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd3Jtc3JsKE1TUl9LN19QRVJGQ1RSMCtpLCAwVUwpOwotCX0KKwlpZiAoIXJlc2VydmVfZXZudHNlbF9ubWkoZXZudHNlbF9tc3IpKQorCQlnb3RvIGZhaWwxOworCisJLyogU2ltdWxhdG9yIG1heSBub3Qgc3VwcG9ydCBpdCAqLworCWlmIChjaGVja2luZ193cm1zcmwoZXZudHNlbF9tc3IsIDBVTCkpCisJCWdvdG8gZmFpbDI7CisJd3Jtc3JsKHBlcmZjdHJfbXNyLCAwVUwpOwogCiAJZXZudHNlbCA9IEs3X0VWTlRTRUxfSU5UCiAJCXwgSzdfRVZOVFNFTF9PUwogCQl8IEs3X0VWTlRTRUxfVVNSCiAJCXwgSzdfTk1JX0VWRU5UOwogCi0Jd3Jtc3IoTVNSX0s3X0VWTlRTRUwwLCBldm50c2VsLCAwKTsKLQl3cm1zcmwoTVNSX0s3X1BFUkZDVFIwLCAtKCh1NjQpY3B1X2toeiAqIDEwMDAgLyBubWlfaHopKTsKKwkvKiBzZXR1cCB0aGUgdGltZXIgKi8KKwl3cm1zcihldm50c2VsX21zciwgZXZudHNlbCwgMCk7CisJd3Jtc3JsKHBlcmZjdHJfbXNyLCAtKCh1NjQpY3B1X2toeiAqIDEwMDAgLyBubWlfaHopKTsKIAlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKIAlldm50c2VsIHw9IEs3X0VWTlRTRUxfRU5BQkxFOwotCXdybXNyKE1TUl9LN19FVk5UU0VMMCwgZXZudHNlbCwgMCk7CisJd3Jtc3IoZXZudHNlbF9tc3IsIGV2bnRzZWwsIDApOworCisJd2QtPnBlcmZjdHJfbXNyID0gcGVyZmN0cl9tc3I7CisJd2QtPmV2bnRzZWxfbXNyID0gZXZudHNlbF9tc3I7CisJd2QtPmNjY3JfbXNyID0gMDsgIC8vdW51c2VkCisJd2QtPmNoZWNrX2JpdCA9IDFVTEw8PDYzOworCXJldHVybiAxOworZmFpbDI6CisJcmVsZWFzZV9ldm50c2VsX25taShldm50c2VsX21zcik7CitmYWlsMToKKwlyZWxlYXNlX3BlcmZjdHJfbm1pKHBlcmZjdHJfbXNyKTsKK2ZhaWw6CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRpc2FibGVfaW50ZWxfYXJjaF93YXRjaGRvZyh2b2lkKQorc3RhdGljIHZvaWQgc3RvcF9rN193YXRjaGRvZyh2b2lkKQogewotCXVuc2lnbmVkIGVieDsKKwlzdHJ1Y3Qgbm1pX3dhdGNoZG9nX2N0bGJsayAqd2QgPSAmX19nZXRfY3B1X3ZhcihubWlfd2F0Y2hkb2dfY3RsYmxrKTsKIAotCS8qCi0JICogQ2hlY2sgd2hldGhlciB0aGUgQXJjaGl0ZWN0dXJhbCBQZXJmTW9uIHN1cHBvcnRzCi0JICogVW5oYWx0ZWQgQ29yZSBDeWNsZXMgRXZlbnQgb3Igbm90LgotCSAqIE5PVEU6IENvcnJlc3BvbmRpbmcgYml0ID0gMCBpbiBlYnAgaW5kaWNhdGVzIGV2ZW50IHByZXNlbnQuCi0JICovCi0JZWJ4ID0gY3B1aWRfZWJ4KDEwKTsKLQlpZiAoIShlYnggJiBBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfUFJFU0VOVCkpCi0JCXdybXNyKE1TUl9BUkNIX1BFUkZNT05fRVZFTlRTRUwwLCAwLCAwKTsKKwl3cm1zcih3ZC0+ZXZudHNlbF9tc3IsIDAsIDApOworCisJcmVsZWFzZV9ldm50c2VsX25taSh3ZC0+ZXZudHNlbF9tc3IpOworCXJlbGVhc2VfcGVyZmN0cl9ubWkod2QtPnBlcmZjdHJfbXNyKTsKIH0KIAorLyogTm90ZSB0aGF0IHRoZXNlIGV2ZW50cyBkb24ndCB0aWNrIHdoZW4gdGhlIENQVSBpZGxlcy4gVGhpcyBtZWFucworICAgdGhlIGZyZXF1ZW5jeSB2YXJpZXMgd2l0aCBDUFUgbG9hZC4gKi8KKworI2RlZmluZSBNU1JfUDRfTUlTQ19FTkFCTEVfUEVSRl9BVkFJTAkoMTw8NykKKyNkZWZpbmUgUDRfRVNDUl9FVkVOVF9TRUxFQ1QoTikJKChOKTw8MjUpCisjZGVmaW5lIFA0X0VTQ1JfT1MJCSgxPDwzKQorI2RlZmluZSBQNF9FU0NSX1VTUgkJKDE8PDIpCisjZGVmaW5lIFA0X0NDQ1JfT1ZGX1BNSTAJKDE8PDI2KQorI2RlZmluZSBQNF9DQ0NSX09WRl9QTUkxCSgxPDwyNykKKyNkZWZpbmUgUDRfQ0NDUl9USFJFU0hPTEQoTikJKChOKTw8MjApCisjZGVmaW5lIFA0X0NDQ1JfQ09NUExFTUVOVAkoMTw8MTkpCisjZGVmaW5lIFA0X0NDQ1JfQ09NUEFSRQkJKDE8PDE4KQorI2RlZmluZSBQNF9DQ0NSX1JFUVVJUkVECSgzPDwxNikKKyNkZWZpbmUgUDRfQ0NDUl9FU0NSX1NFTEVDVChOKQkoKE4pPDwxMykKKyNkZWZpbmUgUDRfQ0NDUl9FTkFCTEUJCSgxPDwxMikKKyNkZWZpbmUgUDRfQ0NDUl9PVkYgCQkoMTw8MzEpCisvKiBTZXQgdXAgSVFfQ09VTlRFUjAgdG8gYmVoYXZlIGxpa2UgYSBjbG9jaywgYnkgaGF2aW5nIElRX0NDQ1IwIGZpbHRlcgorICAgQ1JVX0VTQ1IwICh3aXRoIGFueSBub24tbnVsbCBldmVudCBzZWxlY3RvcikgdGhyb3VnaCBhIGNvbXBsZW1lbnRlZAorICAgbWF4IHRocmVzaG9sZC4gW0lBMzItVm9sMywgU2VjdGlvbiAxNC45LjldICovCisKK3N0YXRpYyBpbnQgc2V0dXBfcDRfd2F0Y2hkb2codm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgcGVyZmN0cl9tc3IsIGV2bnRzZWxfbXNyLCBjY2NyX21zcjsKKwl1bnNpZ25lZCBpbnQgZXZudHNlbCwgY2Njcl92YWw7CisJdW5zaWduZWQgaW50IG1pc2NfZW5hYmxlLCBkdW1teTsKKwl1bnNpZ25lZCBpbnQgaHRfbnVtOworCXN0cnVjdCBubWlfd2F0Y2hkb2dfY3RsYmxrICp3ZCA9ICZfX2dldF9jcHVfdmFyKG5taV93YXRjaGRvZ19jdGxibGspOworCisJcmRtc3IoTVNSX0lBMzJfTUlTQ19FTkFCTEUsIG1pc2NfZW5hYmxlLCBkdW1teSk7CisJaWYgKCEobWlzY19lbmFibGUgJiBNU1JfUDRfTUlTQ19FTkFCTEVfUEVSRl9BVkFJTCkpCisJCXJldHVybiAwOworCisjaWZkZWYgQ09ORklHX1NNUAorCS8qIGRldGVjdCB3aGljaCBoeXBlcnRocmVhZCB3ZSBhcmUgb24gKi8KKwlpZiAoc21wX251bV9zaWJsaW5ncyA9PSAyKSB7CisJCXVuc2lnbmVkIGludCBlYngsIGFwaWNpZDsKKworICAgICAgICAJZWJ4ID0gY3B1aWRfZWJ4KDEpOworCSAgICAgICAgYXBpY2lkID0gKGVieCA+PiAyNCkgJiAweGZmOworICAgICAgICAJaHRfbnVtID0gYXBpY2lkICYgMTsKKwl9IGVsc2UKKyNlbmRpZgorCQlodF9udW0gPSAwOworCisJLyogcGVyZm9ybWFuY2UgY291bnRlcnMgYXJlIHNoYXJlZCByZXNvdXJjZXMKKwkgKiBhc3NpZ24gZWFjaCBoeXBlcnRocmVhZCBpdHMgb3duIHNldAorCSAqIChyZS11c2UgdGhlIEVTQ1IwIHJlZ2lzdGVyLCBzZWVtcyBzYWZlCisJICogYW5kIGtlZXBzIHRoZSBjY2NyX3ZhbCB0aGUgc2FtZSkKKwkgKi8KKwlpZiAoIWh0X251bSkgeworCQkvKiBsb2dpY2FsIGNwdSAwICovCisJCXBlcmZjdHJfbXNyID0gTVNSX1A0X0lRX1BFUkZDVFIwOworCQlldm50c2VsX21zciA9IE1TUl9QNF9DUlVfRVNDUjA7CisJCWNjY3JfbXNyID0gTVNSX1A0X0lRX0NDQ1IwOworCQljY2NyX3ZhbCA9IFA0X0NDQ1JfT1ZGX1BNSTAgfCBQNF9DQ0NSX0VTQ1JfU0VMRUNUKDQpOworCX0gZWxzZSB7CisJCS8qIGxvZ2ljYWwgY3B1IDEgKi8KKwkJcGVyZmN0cl9tc3IgPSBNU1JfUDRfSVFfUEVSRkNUUjE7CisJCWV2bnRzZWxfbXNyID0gTVNSX1A0X0NSVV9FU0NSMDsKKwkJY2Njcl9tc3IgPSBNU1JfUDRfSVFfQ0NDUjE7CisJCWNjY3JfdmFsID0gUDRfQ0NDUl9PVkZfUE1JMSB8IFA0X0NDQ1JfRVNDUl9TRUxFQ1QoNCk7CisJfQorCisJaWYgKCFyZXNlcnZlX3BlcmZjdHJfbm1pKHBlcmZjdHJfbXNyKSkKKwkJZ290byBmYWlsOworCisJaWYgKCFyZXNlcnZlX2V2bnRzZWxfbm1pKGV2bnRzZWxfbXNyKSkKKwkJZ290byBmYWlsMTsKKworCWV2bnRzZWwgPSBQNF9FU0NSX0VWRU5UX1NFTEVDVCgweDNGKQorCSAJfCBQNF9FU0NSX09TCisJCXwgUDRfRVNDUl9VU1I7CisKKwljY2NyX3ZhbCB8PSBQNF9DQ0NSX1RIUkVTSE9MRCgxNSkKKwkJIHwgUDRfQ0NDUl9DT01QTEVNRU5UCisJCSB8IFA0X0NDQ1JfQ09NUEFSRQorCQkgfCBQNF9DQ0NSX1JFUVVJUkVEOworCisJd3Jtc3IoZXZudHNlbF9tc3IsIGV2bnRzZWwsIDApOworCXdybXNyKGNjY3JfbXNyLCBjY2NyX3ZhbCwgMCk7CisJd3Jtc3JsKHBlcmZjdHJfbXNyLCAtKCh1NjQpY3B1X2toeiAqIDEwMDAgLyBubWlfaHopKTsKKwlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKKwljY2NyX3ZhbCB8PSBQNF9DQ0NSX0VOQUJMRTsKKwl3cm1zcihjY2NyX21zciwgY2Njcl92YWwsIDApOworCisJd2QtPnBlcmZjdHJfbXNyID0gcGVyZmN0cl9tc3I7CisJd2QtPmV2bnRzZWxfbXNyID0gZXZudHNlbF9tc3I7CisJd2QtPmNjY3JfbXNyID0gY2Njcl9tc3I7CisJd2QtPmNoZWNrX2JpdCA9IDFVTEw8PDM5OworCXJldHVybiAxOworZmFpbDE6CisJcmVsZWFzZV9wZXJmY3RyX25taShwZXJmY3RyX21zcik7CitmYWlsOgorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdG9wX3A0X3dhdGNoZG9nKHZvaWQpCit7CisJc3RydWN0IG5taV93YXRjaGRvZ19jdGxibGsgKndkID0gJl9fZ2V0X2NwdV92YXIobm1pX3dhdGNoZG9nX2N0bGJsayk7CisKKwl3cm1zcih3ZC0+Y2Njcl9tc3IsIDAsIDApOworCXdybXNyKHdkLT5ldm50c2VsX21zciwgMCwgMCk7CisKKwlyZWxlYXNlX2V2bnRzZWxfbm1pKHdkLT5ldm50c2VsX21zcik7CisJcmVsZWFzZV9wZXJmY3RyX25taSh3ZC0+cGVyZmN0cl9tc3IpOworfQorCisjZGVmaW5lIEFSQ0hfUEVSRk1PTl9OTUlfRVZFTlRfU0VMCUFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19TRUwKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX05NSV9FVkVOVF9VTUFTSwlBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfVU1BU0sKKwogc3RhdGljIGludCBzZXR1cF9pbnRlbF9hcmNoX3dhdGNoZG9nKHZvaWQpCiB7CisJdW5zaWduZWQgaW50IGVieDsKKwl1bmlvbiBjcHVpZDEwX2VheCBlYXg7CisJdW5zaWduZWQgaW50IHVudXNlZDsKKwl1bnNpZ25lZCBpbnQgcGVyZmN0cl9tc3IsIGV2bnRzZWxfbXNyOwogCXVuc2lnbmVkIGludCBldm50c2VsOwotCXVuc2lnbmVkIGVieDsKKwlzdHJ1Y3Qgbm1pX3dhdGNoZG9nX2N0bGJsayAqd2QgPSAmX19nZXRfY3B1X3ZhcihubWlfd2F0Y2hkb2dfY3RsYmxrKTsKIAogCS8qCiAJICogQ2hlY2sgd2hldGhlciB0aGUgQXJjaGl0ZWN0dXJhbCBQZXJmTW9uIHN1cHBvcnRzCiAJICogVW5oYWx0ZWQgQ29yZSBDeWNsZXMgRXZlbnQgb3Igbm90LgotCSAqIE5PVEU6IENvcnJlc3BvbmRpbmcgYml0ID0gMCBpbiBlYnAgaW5kaWNhdGVzIGV2ZW50IHByZXNlbnQuCisJICogTk9URTogQ29ycmVzcG9uZGluZyBiaXQgPSAwIGluIGVieCBpbmRpY2F0ZXMgZXZlbnQgcHJlc2VudC4KIAkgKi8KLQllYnggPSBjcHVpZF9lYngoMTApOwotCWlmICgoZWJ4ICYgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1BSRVNFTlQpKQotCQlyZXR1cm4gMDsKKwljcHVpZCgxMCwgJihlYXguZnVsbCksICZlYngsICZ1bnVzZWQsICZ1bnVzZWQpOworCWlmICgoZWF4LnNwbGl0Lm1hc2tfbGVuZ3RoIDwgKEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19JTkRFWCsxKSkgfHwKKwkgICAgKGVieCAmIEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19QUkVTRU5UKSkKKwkJZ290byBmYWlsOwogCi0Jbm1pX3BlcmZjdHJfbXNyID0gTVNSX0FSQ0hfUEVSRk1PTl9QRVJGQ1RSMDsKKwlwZXJmY3RyX21zciA9IE1TUl9BUkNIX1BFUkZNT05fUEVSRkNUUjA7CisJZXZudHNlbF9tc3IgPSBNU1JfQVJDSF9QRVJGTU9OX0VWRU5UU0VMMDsKIAotCWNsZWFyX21zcl9yYW5nZShNU1JfQVJDSF9QRVJGTU9OX0VWRU5UU0VMMCwgMik7Ci0JY2xlYXJfbXNyX3JhbmdlKE1TUl9BUkNIX1BFUkZNT05fUEVSRkNUUjAsIDIpOworCWlmICghcmVzZXJ2ZV9wZXJmY3RyX25taShwZXJmY3RyX21zcikpCisJCWdvdG8gZmFpbDsKKworCWlmICghcmVzZXJ2ZV9ldm50c2VsX25taShldm50c2VsX21zcikpCisJCWdvdG8gZmFpbDE7CisKKwl3cm1zcmwocGVyZmN0cl9tc3IsIDBVTCk7CiAKIAlldm50c2VsID0gQVJDSF9QRVJGTU9OX0VWRU5UU0VMX0lOVAogCQl8IEFSQ0hfUEVSRk1PTl9FVkVOVFNFTF9PUwpAQCAtNDE2LDg0ICs2MjYsMTIyIEBACiAJCXwgQVJDSF9QRVJGTU9OX05NSV9FVkVOVF9TRUwKIAkJfCBBUkNIX1BFUkZNT05fTk1JX0VWRU5UX1VNQVNLOwogCi0Jd3Jtc3IoTVNSX0FSQ0hfUEVSRk1PTl9FVkVOVFNFTDAsIGV2bnRzZWwsIDApOwotCXdybXNybChNU1JfQVJDSF9QRVJGTU9OX1BFUkZDVFIwLCAtKCh1NjQpY3B1X2toeiAqIDEwMDAgLyBubWlfaHopKTsKKwkvKiBzZXR1cCB0aGUgdGltZXIgKi8KKwl3cm1zcihldm50c2VsX21zciwgZXZudHNlbCwgMCk7CisJd3Jtc3JsKHBlcmZjdHJfbXNyLCAtKCh1NjQpY3B1X2toeiAqIDEwMDAgLyBubWlfaHopKTsKKwogCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOwogCWV2bnRzZWwgfD0gQVJDSF9QRVJGTU9OX0VWRU5UU0VMMF9FTkFCTEU7Ci0Jd3Jtc3IoTVNSX0FSQ0hfUEVSRk1PTl9FVkVOVFNFTDAsIGV2bnRzZWwsIDApOworCXdybXNyKGV2bnRzZWxfbXNyLCBldm50c2VsLCAwKTsKKworCXdkLT5wZXJmY3RyX21zciA9IHBlcmZjdHJfbXNyOworCXdkLT5ldm50c2VsX21zciA9IGV2bnRzZWxfbXNyOworCXdkLT5jY2NyX21zciA9IDA7ICAvL3VudXNlZAorCXdkLT5jaGVja19iaXQgPSAxVUxMIDw8IChlYXguc3BsaXQuYml0X3dpZHRoIC0gMSk7CiAJcmV0dXJuIDE7CitmYWlsMToKKwlyZWxlYXNlX3BlcmZjdHJfbm1pKHBlcmZjdHJfbXNyKTsKK2ZhaWw6CisJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIGludCBzZXR1cF9wNF93YXRjaGRvZyh2b2lkKQorc3RhdGljIHZvaWQgc3RvcF9pbnRlbF9hcmNoX3dhdGNoZG9nKHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IG1pc2NfZW5hYmxlLCBkdW1teTsKKwl1bnNpZ25lZCBpbnQgZWJ4OworCXVuaW9uIGNwdWlkMTBfZWF4IGVheDsKKwl1bnNpZ25lZCBpbnQgdW51c2VkOworCXN0cnVjdCBubWlfd2F0Y2hkb2dfY3RsYmxrICp3ZCA9ICZfX2dldF9jcHVfdmFyKG5taV93YXRjaGRvZ19jdGxibGspOwogCi0JcmRtc3IoTVNSX1A0X01JU0NfRU5BQkxFLCBtaXNjX2VuYWJsZSwgZHVtbXkpOwotCWlmICghKG1pc2NfZW5hYmxlICYgTVNSX1A0X01JU0NfRU5BQkxFX1BFUkZfQVZBSUwpKQotCQlyZXR1cm4gMDsKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgdGhlIEFyY2hpdGVjdHVyYWwgUGVyZk1vbiBzdXBwb3J0cworCSAqIFVuaGFsdGVkIENvcmUgQ3ljbGVzIEV2ZW50IG9yIG5vdC4KKwkgKiBOT1RFOiBDb3JyZXNwb25kaW5nIGJpdCA9IDAgaW4gZWJ4IGluZGljYXRlcyBldmVudCBwcmVzZW50LgorCSAqLworCWNwdWlkKDEwLCAmKGVheC5mdWxsKSwgJmVieCwgJnVudXNlZCwgJnVudXNlZCk7CisJaWYgKChlYXguc3BsaXQubWFza19sZW5ndGggPCAoQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX0lOREVYKzEpKSB8fAorCSAgICAoZWJ4ICYgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1BSRVNFTlQpKQorCQlyZXR1cm47CiAKLQlubWlfcGVyZmN0cl9tc3IgPSBNU1JfUDRfSVFfQ09VTlRFUjA7Ci0Jbm1pX3A0X2NjY3JfdmFsID0gUDRfTk1JX0lRX0NDQ1IwOwotI2lmZGVmIENPTkZJR19TTVAKLQlpZiAoc21wX251bV9zaWJsaW5ncyA9PSAyKQotCQlubWlfcDRfY2Njcl92YWwgfD0gUDRfQ0NDUl9PVkZfUE1JMTsKLSNlbmRpZgorCXdybXNyKHdkLT5ldm50c2VsX21zciwgMCwgMCk7CiAKLQlpZiAoIShtaXNjX2VuYWJsZSAmIE1TUl9QNF9NSVNDX0VOQUJMRV9QRUJTX1VOQVZBSUwpKQotCQljbGVhcl9tc3JfcmFuZ2UoMHgzRjEsIDIpOwotCS8qIE1TUiAweDNGMCBzZWVtcyB0byBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBvZiAweEZDMDAsIGJ1dCBjdXJyZW50Ci0JICAgZG9jcyBkb2Vzbid0IGZ1bGx5IGRlZmluZSBpdCwgc28gbGVhdmUgaXQgYWxvbmUgZm9yIG5vdy4gKi8KLQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPj0gMHgzKSB7Ci0JCS8qIE1TUl9QNF9JUV9FU0NSMC8xICgweDNiYS8weDNiYikgcmVtb3ZlZCAqLwotCQljbGVhcl9tc3JfcmFuZ2UoMHgzQTAsIDI2KTsKLQkJY2xlYXJfbXNyX3JhbmdlKDB4M0JDLCAzKTsKLQl9IGVsc2UgewotCQljbGVhcl9tc3JfcmFuZ2UoMHgzQTAsIDMxKTsKLQl9Ci0JY2xlYXJfbXNyX3JhbmdlKDB4M0MwLCA2KTsKLQljbGVhcl9tc3JfcmFuZ2UoMHgzQzgsIDYpOwotCWNsZWFyX21zcl9yYW5nZSgweDNFMCwgMik7Ci0JY2xlYXJfbXNyX3JhbmdlKE1TUl9QNF9DQ0NSMCwgMTgpOwotCWNsZWFyX21zcl9yYW5nZShNU1JfUDRfUEVSRkNUUjAsIDE4KTsKLQotCXdybXNyKE1TUl9QNF9DUlVfRVNDUjAsIFA0X05NSV9DUlVfRVNDUjAsIDApOwotCXdybXNyKE1TUl9QNF9JUV9DQ0NSMCwgUDRfTk1JX0lRX0NDQ1IwICYgflA0X0NDQ1JfRU5BQkxFLCAwKTsKLQlEcHJpbnRrKCJzZXR0aW5nIFA0X0lRX0NPVU5URVIwIHRvIDB4JTA4bHhcbiIsIC0oY3B1X2toeiAqIDEwMDBVTCAvIG5taV9oeikpOwotCXdybXNybChNU1JfUDRfSVFfQ09VTlRFUjAsIC0oKHU2NCljcHVfa2h6ICogMTAwMCAvIG5taV9oeikpOwotCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOwotCXdybXNyKE1TUl9QNF9JUV9DQ0NSMCwgbm1pX3A0X2NjY3JfdmFsLCAwKTsKLQlyZXR1cm4gMTsKKwlyZWxlYXNlX2V2bnRzZWxfbm1pKHdkLT5ldm50c2VsX21zcik7CisJcmVsZWFzZV9wZXJmY3RyX25taSh3ZC0+cGVyZmN0cl9tc3IpOwogfQogCi12b2lkIHNldHVwX2FwaWNfbm1pX3dhdGNoZG9nKHZvaWQpCit2b2lkIHNldHVwX2FwaWNfbm1pX3dhdGNoZG9nKHZvaWQgKnVudXNlZCkKIHsKLQlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgewotCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6Ci0JCWlmIChib290X2NwdV9kYXRhLng4NiAhPSAxNSkKLQkJCXJldHVybjsKLQkJaWYgKHN0cnN0cihib290X2NwdV9kYXRhLng4Nl9tb2RlbF9pZCwgIlNjcmV3ZHJpdmVyIikpCi0JCQlyZXR1cm47Ci0JCXNldHVwX2s3X3dhdGNoZG9nKCk7Ci0JCWJyZWFrOwotCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKLQkJaWYgKGNwdV9oYXMoJmJvb3RfY3B1X2RhdGEsIFg4Nl9GRUFUVVJFX0FSQ0hfUEVSRk1PTikpIHsKLQkJCWlmICghc2V0dXBfaW50ZWxfYXJjaF93YXRjaGRvZygpKQorCXN0cnVjdCBubWlfd2F0Y2hkb2dfY3RsYmxrICp3ZCA9ICZfX2dldF9jcHVfdmFyKG5taV93YXRjaGRvZ19jdGxibGspOworCisJLyogb25seSBzdXBwb3J0IExPQ0FMIGFuZCBJTyBBUElDcyBmb3Igbm93ICovCisJaWYgKChubWlfd2F0Y2hkb2cgIT0gTk1JX0xPQ0FMX0FQSUMpICYmCisJICAgIChubWlfd2F0Y2hkb2cgIT0gTk1JX0lPX0FQSUMpKQorCSAgICAJcmV0dXJuOworCisJaWYgKHdkLT5lbmFibGVkID09IDEpCisJCXJldHVybjsKKworCS8qIGNoZWFwIGhhY2sgdG8gc3VwcG9ydCBzdXNwZW5kL3Jlc3VtZSAqLworCS8qIGlmIGNwdTAgaXMgbm90IGFjdGl2ZSBuZWl0aGVyIHNob3VsZCB0aGUgb3RoZXIgY3B1cyAqLworCWlmICgoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IDApICYmIChhdG9taWNfcmVhZCgmbm1pX2FjdGl2ZSkgPD0gMCkpCisJCXJldHVybjsKKworCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpIHsKKwkJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKKwkJY2FzZSBYODZfVkVORE9SX0FNRDoKKwkJCWlmIChzdHJzdHIoYm9vdF9jcHVfZGF0YS54ODZfbW9kZWxfaWQsICJTY3Jld2RyaXZlciIpKQogCQkJCXJldHVybjsKLQkJfSBlbHNlIGlmIChib290X2NwdV9kYXRhLng4NiA9PSAxNSkgeworCQkJaWYgKCFzZXR1cF9rN193YXRjaGRvZygpKQorCQkJCXJldHVybjsKKwkJCWJyZWFrOworCQljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CisJCQlpZiAoY3B1X2hhcygmYm9vdF9jcHVfZGF0YSwgWDg2X0ZFQVRVUkVfQVJDSF9QRVJGTU9OKSkgeworCQkJCWlmICghc2V0dXBfaW50ZWxfYXJjaF93YXRjaGRvZygpKQorCQkJCQlyZXR1cm47CisJCQkJYnJlYWs7CisJCQl9CiAJCQlpZiAoIXNldHVwX3A0X3dhdGNoZG9nKCkpCiAJCQkJcmV0dXJuOwotCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CiAJCQlyZXR1cm47CiAJCX0KLQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybjsKIAl9Ci0JbGFwaWNfbm1pX293bmVyID0gTEFQSUNfTk1JX1dBVENIRE9HOwotCW5taV9hY3RpdmUgPSAxOworCXdkLT5lbmFibGVkID0gMTsKKwlhdG9taWNfaW5jKCZubWlfYWN0aXZlKTsKK30KKwordm9pZCBzdG9wX2FwaWNfbm1pX3dhdGNoZG9nKHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3Qgbm1pX3dhdGNoZG9nX2N0bGJsayAqd2QgPSAmX19nZXRfY3B1X3ZhcihubWlfd2F0Y2hkb2dfY3RsYmxrKTsKKworCS8qIG9ubHkgc3VwcG9ydCBMT0NBTCBhbmQgSU8gQVBJQ3MgZm9yIG5vdyAqLworCWlmICgobm1pX3dhdGNoZG9nICE9IE5NSV9MT0NBTF9BUElDKSAmJgorCSAgICAobm1pX3dhdGNoZG9nICE9IE5NSV9JT19BUElDKSkKKwkgICAgCXJldHVybjsKKworCWlmICh3ZC0+ZW5hYmxlZCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAobm1pX3dhdGNoZG9nID09IE5NSV9MT0NBTF9BUElDKSB7CisJCXN3aXRjaCAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yKSB7CisJCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6CisJCQlpZiAoc3Ryc3RyKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsX2lkLCAiU2NyZXdkcml2ZXIiKSkKKwkJCQlyZXR1cm47CisJCQlzdG9wX2s3X3dhdGNoZG9nKCk7CisJCQlicmVhazsKKwkJY2FzZSBYODZfVkVORE9SX0lOVEVMOgorCQkJaWYgKGNwdV9oYXMoJmJvb3RfY3B1X2RhdGEsIFg4Nl9GRUFUVVJFX0FSQ0hfUEVSRk1PTikpIHsKKwkJCQlzdG9wX2ludGVsX2FyY2hfd2F0Y2hkb2coKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN0b3BfcDRfd2F0Y2hkb2coKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuOworCQl9CisJfQorCXdkLT5lbmFibGVkID0gMDsKKwlhdG9taWNfZGVjKCZubWlfYWN0aXZlKTsKIH0KIAogLyoKQEAgLTUyNiw5MyArNzc0LDEwOSBAQAogIAl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7CiB9CiAKLXZvaWQgX19rcHJvYmVzIG5taV93YXRjaGRvZ190aWNrKHN0cnVjdCBwdF9yZWdzICogcmVncywgdW5zaWduZWQgcmVhc29uKQoraW50IF9fa3Byb2JlcyBubWlfd2F0Y2hkb2dfdGljayhzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHVuc2lnbmVkIHJlYXNvbikKIHsKIAlpbnQgc3VtOwogCWludCB0b3VjaGVkID0gMDsKKwlzdHJ1Y3Qgbm1pX3dhdGNoZG9nX2N0bGJsayAqd2QgPSAmX19nZXRfY3B1X3ZhcihubWlfd2F0Y2hkb2dfY3RsYmxrKTsKKwl1NjQgZHVtbXk7CisJaW50IHJjPTA7CisKKwkvKiBjaGVjayBmb3Igb3RoZXIgdXNlcnMgZmlyc3QgKi8KKwlpZiAobm90aWZ5X2RpZShESUVfTk1JLCAibm1pIiwgcmVncywgcmVhc29uLCAyLCBTSUdJTlQpCisJCQk9PSBOT1RJRllfU1RPUCkgeworCQlyYyA9IDE7CisJCXRvdWNoZWQgPSAxOworCX0KIAogCXN1bSA9IHJlYWRfcGRhKGFwaWNfdGltZXJfaXJxcyk7CiAJaWYgKF9fZ2V0X2NwdV92YXIobm1pX3RvdWNoKSkgewogCQlfX2dldF9jcHVfdmFyKG5taV90b3VjaCkgPSAwOwogCQl0b3VjaGVkID0gMTsKIAl9CisKICNpZmRlZiBDT05GSUdfWDg2X01DRQogCS8qIENvdWxkIGNoZWNrIG9vcHNfaW5fcHJvZ3Jlc3MgaGVyZSB0b28sIGJ1dCBpdCdzIHNhZmVyCiAJICAgbm90IHRvbyAqLwogCWlmIChhdG9taWNfcmVhZCgmbWNlX2VudHJ5KSA+IDApCiAJCXRvdWNoZWQgPSAxOwogI2VuZGlmCisJLyogaWYgdGhlIGFwaWMgdGltZXIgaXNuJ3QgZmlyaW5nLCB0aGlzIGNwdSBpc24ndCBkb2luZyBtdWNoICovCiAJaWYgKCF0b3VjaGVkICYmIF9fZ2V0X2NwdV92YXIobGFzdF9pcnFfc3VtKSA9PSBzdW0pIHsKIAkJLyoKIAkJICogQXlpZWUsIGxvb2tzIGxpa2UgdGhpcyBDUFUgaXMgc3R1Y2sgLi4uCiAJCSAqIHdhaXQgYSBmZXcgSVJRcyAoNSBzZWNvbmRzKSBiZWZvcmUgZG9pbmcgdGhlIG9vcHMgLi4uCiAJCSAqLwogCQlsb2NhbF9pbmMoJl9fZ2V0X2NwdV92YXIoYWxlcnRfY291bnRlcikpOwotCQlpZiAobG9jYWxfcmVhZCgmX19nZXRfY3B1X3ZhcihhbGVydF9jb3VudGVyKSkgPT0gNSpubWlfaHopIHsKLQkJCWlmIChub3RpZnlfZGllKERJRV9OTUksICJubWkiLCByZWdzLCByZWFzb24sIDIsIFNJR0lOVCkKLQkJCQkJCQk9PSBOT1RJRllfU1RPUCkgewotCQkJCWxvY2FsX3NldCgmX19nZXRfY3B1X3ZhcihhbGVydF9jb3VudGVyKSwgMCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZGllX25taSgiTk1JIFdhdGNoZG9nIGRldGVjdGVkIExPQ0tVUCBvbiBDUFUgJWRcbiIsIHJlZ3MpOwotCQl9CisJCWlmIChsb2NhbF9yZWFkKCZfX2dldF9jcHVfdmFyKGFsZXJ0X2NvdW50ZXIpKSA9PSA1Km5taV9oeikKKwkJCWRpZV9ubWkoIk5NSSBXYXRjaGRvZyBkZXRlY3RlZCBMT0NLVVAgb24gQ1BVICVkXG4iLCByZWdzLAorCQkJCXBhbmljX29uX3RpbWVvdXQpOwogCX0gZWxzZSB7CiAJCV9fZ2V0X2NwdV92YXIobGFzdF9pcnFfc3VtKSA9IHN1bTsKIAkJbG9jYWxfc2V0KCZfX2dldF9jcHVfdmFyKGFsZXJ0X2NvdW50ZXIpLCAwKTsKIAl9Ci0JaWYgKG5taV9wZXJmY3RyX21zcikgewotIAkJaWYgKG5taV9wZXJmY3RyX21zciA9PSBNU1JfUDRfSVFfQ09VTlRFUjApIHsKLSAJCQkvKgotIAkJCSAqIFA0IHF1aXJrczoKLSAJCQkgKiAtIEFuIG92ZXJmbG93biBwZXJmY3RyIHdpbGwgYXNzZXJ0IGl0cyBpbnRlcnJ1cHQKLSAJCQkgKiAgIHVudGlsIHRoZSBPVkYgZmxhZyBpbiBpdHMgQ0NDUiBpcyBjbGVhcmVkLgotIAkJCSAqIC0gTFZUUEMgaXMgbWFza2VkIG9uIGludGVycnVwdCBhbmQgbXVzdCBiZQotIAkJCSAqICAgdW5tYXNrZWQgYnkgdGhlIExWVFBDIGhhbmRsZXIuCi0gCQkJICovCi0gCQkJd3Jtc3IoTVNSX1A0X0lRX0NDQ1IwLCBubWlfcDRfY2Njcl92YWwsIDApOwotIAkJCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOwotIAkJfSBlbHNlIGlmIChubWlfcGVyZmN0cl9tc3IgPT0gTVNSX0FSQ0hfUEVSRk1PTl9QRVJGQ1RSMCkgewotCQkJLyoKLQkJCSAqIEZvciBJbnRlbCBiYXNlZCBhcmNoaXRlY3R1cmFsIHBlcmZtb24KLQkJCSAqIC0gTFZUUEMgaXMgbWFza2VkIG9uIGludGVycnVwdCBhbmQgbXVzdCBiZQotCQkJICogICB1bm1hc2tlZCBieSB0aGUgTFZUUEMgaGFuZGxlci4KKworCS8qIHNlZSBpZiB0aGUgbm1pIHdhdGNoZG9nIHdlbnQgb2ZmICovCisJaWYgKHdkLT5lbmFibGVkKSB7CisJCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpIHsKKwkJCXJkbXNybCh3ZC0+cGVyZmN0cl9tc3IsIGR1bW15KTsKKwkJCWlmIChkdW1teSAmIHdkLT5jaGVja19iaXQpeworCQkJCS8qIHRoaXMgd2Fzbid0IGEgd2F0Y2hkb2cgdGltZXIgaW50ZXJydXB0ICovCisJCQkJZ290byBkb25lOworCQkJfQorCisJCQkvKiBvbmx5IEludGVsIHVzZXMgdGhlIGNjY3IgbXNyICovCisJIAkJaWYgKHdkLT5jY2NyX21zciAhPSAwKSB7CisJIAkJCS8qCisJIAkJCSAqIFA0IHF1aXJrczoKKwkgCQkJICogLSBBbiBvdmVyZmxvd24gcGVyZmN0ciB3aWxsIGFzc2VydCBpdHMgaW50ZXJydXB0CisJIAkJCSAqICAgdW50aWwgdGhlIE9WRiBmbGFnIGluIGl0cyBDQ0NSIGlzIGNsZWFyZWQuCisJIAkJCSAqIC0gTFZUUEMgaXMgbWFza2VkIG9uIGludGVycnVwdCBhbmQgbXVzdCBiZQorCSAJCQkgKiAgIHVubWFza2VkIGJ5IHRoZSBMVlRQQyBoYW5kbGVyLgorCSAJCQkgKi8KKwkJCQlyZG1zcmwod2QtPmNjY3JfbXNyLCBkdW1teSk7CisJCQkJZHVtbXkgJj0gflA0X0NDQ1JfT1ZGOworCSAJCQl3cm1zcmwod2QtPmNjY3JfbXNyLCBkdW1teSk7CisJIAkJCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOworCSAJCX0gZWxzZSBpZiAod2QtPnBlcmZjdHJfbXNyID09IE1TUl9BUkNIX1BFUkZNT05fUEVSRkNUUjApIHsKKwkJCQkvKgorCQkJCSAqIEFyY2hQZXJmb20vQ29yZSBEdW8gbmVlZHMgdG8gcmUtdW5tYXNrCisJCQkJICogdGhlIGFwaWMgdmVjdG9yCisJCQkJICovCisJCQkJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisJCQl9CisJCQkvKiBzdGFydCB0aGUgY3ljbGUgb3ZlciBhZ2FpbiAqLworCQkJd3Jtc3JsKHdkLT5wZXJmY3RyX21zciwgLSgodTY0KWNwdV9raHogKiAxMDAwIC8gbm1pX2h6KSk7CisJCQlyYyA9IDE7CisJCX0gZWxzZSAJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfSU9fQVBJQykgeworCQkJLyogZG9uJ3Qga25vdyBob3cgdG8gYWNjdXJhdGVseSBjaGVjayBmb3IgdGhpcy4KKwkJCSAqIGp1c3QgYXNzdW1lIGl0IHdhcyBhIHdhdGNoZG9nIHRpbWVyIGludGVycnVwdAorCQkJICogVGhpcyBtYXRjaGVzIHRoZSBvbGQgYmVoYXZpb3VyLgogCQkJICovCi0JCQlhcGljX3dyaXRlKEFQSUNfTFZUUEMsIEFQSUNfRE1fTk1JKTsKLQkJfQotCQl3cm1zcmwobm1pX3BlcmZjdHJfbXNyLCAtKCh1NjQpY3B1X2toeiAqIDEwMDAgLyBubWlfaHopKTsKKwkJCXJjID0gMTsKKwkJfSBlbHNlCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmtub3duIGVuYWJsZWQgTk1JIGhhcmR3YXJlPyFcbiIpOwogCX0KK2RvbmU6CisJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgX19rcHJvYmVzIGludCBkdW1teV9ubWlfY2FsbGJhY2soc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBpbnQgY3B1KQotewotCXJldHVybiAwOwotfQotIAotc3RhdGljIG5taV9jYWxsYmFja190IG5taV9jYWxsYmFjayA9IGR1bW15X25taV9jYWxsYmFjazsKLSAKIGFzbWxpbmthZ2UgX19rcHJvYmVzIHZvaWQgZG9fbm1pKHN0cnVjdCBwdF9yZWdzICogcmVncywgbG9uZyBlcnJvcl9jb2RlKQogewotCWludCBjcHUgPSBzYWZlX3NtcF9wcm9jZXNzb3JfaWQoKTsKLQogCW5taV9lbnRlcigpOwogCWFkZF9wZGEoX19ubWlfY291bnQsMSk7Ci0JaWYgKCFyY3VfZGVyZWZlcmVuY2Uobm1pX2NhbGxiYWNrKShyZWdzLCBjcHUpKQotCQlkZWZhdWx0X2RvX25taShyZWdzKTsKKwlkZWZhdWx0X2RvX25taShyZWdzKTsKIAlubWlfZXhpdCgpOwogfQogCi12b2lkIHNldF9ubWlfY2FsbGJhY2sobm1pX2NhbGxiYWNrX3QgY2FsbGJhY2spCitpbnQgZG9fbm1pX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICogcmVncywgaW50IGNwdSkKIHsKLQl2bWFsbG9jX3N5bmNfYWxsKCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKG5taV9jYWxsYmFjaywgY2FsbGJhY2spOworI2lmZGVmIENPTkZJR19TWVNDVEwKKwlpZiAodW5rbm93bl9ubWlfcGFuaWMpCisJCXJldHVybiB1bmtub3duX25taV9wYW5pY19jYWxsYmFjayhyZWdzLCBjcHUpOworI2VuZGlmCisJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChzZXRfbm1pX2NhbGxiYWNrKTsKLQotdm9pZCB1bnNldF9ubWlfY2FsbGJhY2sodm9pZCkKLXsKLQlubWlfY2FsbGJhY2sgPSBkdW1teV9ubWlfY2FsbGJhY2s7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh1bnNldF9ubWlfY2FsbGJhY2spOwogCiAjaWZkZWYgQ09ORklHX1NZU0NUTAogCkBAIC02MjEsMzYgKzg4NSw0MiBAQAogCXVuc2lnbmVkIGNoYXIgcmVhc29uID0gZ2V0X25taV9yZWFzb24oKTsKIAljaGFyIGJ1Zls2NF07CiAKLQlpZiAoIShyZWFzb24gJiAweGMwKSkgewotCQlzcHJpbnRmKGJ1ZiwgIk5NSSByZWNlaXZlZCBmb3IgdW5rbm93biByZWFzb24gJTAyeFxuIiwgcmVhc29uKTsKLQkJZGllX25taShidWYscmVncyk7Ci0JfQorCXNwcmludGYoYnVmLCAiTk1JIHJlY2VpdmVkIGZvciB1bmtub3duIHJlYXNvbiAlMDJ4XG4iLCByZWFzb24pOworCWRpZV9ubWkoYnVmLCByZWdzLCAxKTsJLyogQWx3YXlzIHBhbmljIGhlcmUgKi8KIAlyZXR1cm4gMDsKIH0KIAogLyoKLSAqIHByb2MgaGFuZGxlciBmb3IgL3Byb2Mvc3lzL2tlcm5lbC91bmtub3duX25taV9wYW5pYworICogcHJvYyBoYW5kbGVyIGZvciAvcHJvYy9zeXMva2VybmVsL25taQogICovCi1pbnQgcHJvY191bmtub3duX25taV9wYW5pYyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKK2ludCBwcm9jX25taV9lbmFibGVkKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgsIGxvZmZfdCAqcHBvcykKIHsKIAlpbnQgb2xkX3N0YXRlOwogCi0Jb2xkX3N0YXRlID0gdW5rbm93bl9ubWlfcGFuaWM7CisJbm1pX3dhdGNoZG9nX2VuYWJsZWQgPSAoYXRvbWljX3JlYWQoJm5taV9hY3RpdmUpID4gMCkgPyAxIDogMDsKKwlvbGRfc3RhdGUgPSBubWlfd2F0Y2hkb2dfZW5hYmxlZDsKIAlwcm9jX2RvaW50dmVjKHRhYmxlLCB3cml0ZSwgZmlsZSwgYnVmZmVyLCBsZW5ndGgsIHBwb3MpOwotCWlmICghIW9sZF9zdGF0ZSA9PSAhIXVua25vd25fbm1pX3BhbmljKQorCWlmICghIW9sZF9zdGF0ZSA9PSAhIW5taV93YXRjaGRvZ19lbmFibGVkKQogCQlyZXR1cm4gMDsKIAotCWlmICh1bmtub3duX25taV9wYW5pYykgewotCQlpZiAocmVzZXJ2ZV9sYXBpY19ubWkoKSA8IDApIHsKLQkJCXVua25vd25fbm1pX3BhbmljID0gMDsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRfbm1pX2NhbGxiYWNrKHVua25vd25fbm1pX3BhbmljX2NhbGxiYWNrKTsKLQkJfQorCWlmIChhdG9taWNfcmVhZCgmbm1pX2FjdGl2ZSkgPCAwKSB7CisJCXByaW50ayggS0VSTl9XQVJOSU5HICJOTUkgd2F0Y2hkb2cgaXMgcGVybWFuZW50bHkgZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBpZiBubWlfd2F0Y2hkb2cgaXMgbm90IHNldCB5ZXQsIHRoZW4gc2V0IGl0ICovCisJbm1pX3dhdGNoZG9nX2RlZmF1bHQoKTsKKworCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpIHsKKwkJaWYgKG5taV93YXRjaGRvZ19lbmFibGVkKQorCQkJZW5hYmxlX2xhcGljX25taV93YXRjaGRvZygpOworCQllbHNlCisJCQlkaXNhYmxlX2xhcGljX25taV93YXRjaGRvZygpOwogCX0gZWxzZSB7Ci0JCXJlbGVhc2VfbGFwaWNfbm1pKCk7Ci0JCXVuc2V0X25taV9jYWxsYmFjaygpOworCQlwcmludGsoIEtFUk5fV0FSTklORworCQkJIk5NSSB3YXRjaGRvZyBkb2Vzbid0IGtub3cgd2hhdCBoYXJkd2FyZSB0byB0b3VjaFxuIik7CisJCXJldHVybiAtRUlPOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTY1OSw4ICs5MjksMTIgQEAKIAogRVhQT1JUX1NZTUJPTChubWlfYWN0aXZlKTsKIEVYUE9SVF9TWU1CT0wobm1pX3dhdGNoZG9nKTsKLUVYUE9SVF9TWU1CT0wocmVzZXJ2ZV9sYXBpY19ubWkpOwotRVhQT1JUX1NZTUJPTChyZWxlYXNlX2xhcGljX25taSk7CitFWFBPUlRfU1lNQk9MKGF2YWlsX3RvX3Jlc3J2X3BlcmZjdHJfbm1pKTsKK0VYUE9SVF9TWU1CT0woYXZhaWxfdG9fcmVzcnZfcGVyZmN0cl9ubWlfYml0KTsKK0VYUE9SVF9TWU1CT0wocmVzZXJ2ZV9wZXJmY3RyX25taSk7CitFWFBPUlRfU1lNQk9MKHJlbGVhc2VfcGVyZmN0cl9ubWkpOworRVhQT1JUX1NZTUJPTChyZXNlcnZlX2V2bnRzZWxfbm1pKTsKK0VYUE9SVF9TWU1CT0wocmVsZWFzZV9ldm50c2VsX25taSk7CiBFWFBPUlRfU1lNQk9MKGRpc2FibGVfdGltZXJfbm1pX3dhdGNoZG9nKTsKIEVYUE9SVF9TWU1CT0woZW5hYmxlX3RpbWVyX25taV93YXRjaGRvZyk7CiBFWFBPUlRfU1lNQk9MKHRvdWNoX25taV93YXRjaGRvZyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWNhbGdhcnkuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktY2FsZ2FyeS5jCmluZGV4IDE0NjkyNGIuLmNmYjA5YjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktY2FsZ2FyeS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktY2FsZ2FyeS5jCkBAIC04Niw3ICs4Niw4IEBACiAKICNkZWZpbmUgTUFYX05VTV9PRl9QSEJTCQk4IC8qIGhvdyBtYW55IFBIQnMgaW4gdG90YWw/ICovCiAjZGVmaW5lIE1BWF9OVU1fQ0hBU1NJUwkJOCAvKiBtYXggbnVtYmVyIG9mIGNoYXNzaXMgKi8KLSNkZWZpbmUgTUFYX1BIQl9CVVNfTlVNCQkoTUFYX05VTV9PRl9QSEJTICogTUFYX05VTV9DSEFTU0lTICogMikgLyogbWF4IGRldi0+YnVzLT5udW1iZXIgKi8KKy8qIE1BWF9QSEJfQlVTX05VTSBpcyB0aGUgbWF4aW1hbCBwb3NzaWJsZSBkZXYtPmJ1cy0+bnVtYmVyICovCisjZGVmaW5lIE1BWF9QSEJfQlVTX05VTQkJKE1BWF9OVU1fT0ZfUEhCUyAqIE1BWF9OVU1fQ0hBU1NJUyAqIDIpCiAjZGVmaW5lIFBIQlNfUEVSX0NBTEdBUlkJNAogCiAvKiByZWdpc3RlciBvZmZzZXRzIGluIENhbGdhcnkncyBpbnRlcm5hbCByZWdpc3RlciBzcGFjZSAqLwpAQCAtMTExLDMxICsxMTIsNDkgQEAKIAkweEIwMDAgLyogUEhCMyAqLwogfTsKIAotc3RhdGljIGNoYXIgYnVzX3RvX3BoYltNQVhfUEhCX0JVU19OVU1dOwotdm9pZCogdGNlX3RhYmxlX2t2YVtNQVhfUEhCX0JVU19OVU1dOwogdW5zaWduZWQgaW50IHNwZWNpZmllZF90YWJsZV9zaXplID0gVENFX1RBQkxFX1NJWkVfVU5TUEVDSUZJRUQ7CiBzdGF0aWMgaW50IHRyYW5zbGF0ZV9lbXB0eV9zbG90cyBfX3JlYWRfbW9zdGx5ID0gMDsKIHN0YXRpYyBpbnQgY2FsZ2FyeV9kZXRlY3RlZCBfX3JlYWRfbW9zdGx5ID0gMDsKIAotLyoKLSAqIHRoZSBiaXRtYXAgb2YgUEhCcyB0aGUgdXNlciByZXF1ZXN0ZWQgdGhhdCB3ZSBkaXNhYmxlCi0gKiB0cmFuc2xhdGlvbiBvbi4KLSAqLwotc3RhdGljIERFQ0xBUkVfQklUTUFQKHRyYW5zbGF0aW9uX2Rpc2FibGVkLCBNQVhfUEhCX0JVU19OVU0pOworc3RydWN0IGNhbGdhcnlfYnVzX2luZm8geworCXZvaWQgKnRjZV9zcGFjZTsKKwl1bnNpZ25lZCBjaGFyIHRyYW5zbGF0aW9uX2Rpc2FibGVkOworCXNpZ25lZCBjaGFyIHBoYmlkOworfTsKKworc3RhdGljIHN0cnVjdCBjYWxnYXJ5X2J1c19pbmZvIGJ1c19pbmZvW01BWF9QSEJfQlVTX05VTV0gPSB7IHsgTlVMTCwgMCwgMCB9LCB9OwogCiBzdGF0aWMgdm9pZCB0Y2VfY2FjaGVfYmxhc3Qoc3RydWN0IGlvbW11X3RhYmxlICp0YmwpOwogCiAvKiBlbmFibGUgdGhpcyB0byBzdHJlc3MgdGVzdCB0aGUgY2hpcCdzIFRDRSBjYWNoZSAqLwogI2lmZGVmIENPTkZJR19JT01NVV9ERUJVRwotc3RhdGljIGlubGluZSB2b2lkIHRjZV9jYWNoZV9ibGFzdF9zdHJlc3Moc3RydWN0IGlvbW11X3RhYmxlICp0YmwpCitpbnQgZGVidWdnaW5nIF9fcmVhZF9tb3N0bHkgPSAxOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmVyaWZ5X2JpdF9yYW5nZSh1bnNpZ25lZCBsb25nKiBiaXRtYXAsCisJaW50IGV4cGVjdGVkLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQl0Y2VfY2FjaGVfYmxhc3QodGJsKTsKKwl1bnNpZ25lZCBsb25nIGlkeCA9IHN0YXJ0OworCisJQlVHX09OKHN0YXJ0ID49IGVuZCk7CisKKwl3aGlsZSAoaWR4IDwgZW5kKSB7CisJCWlmICghIXRlc3RfYml0KGlkeCwgYml0bWFwKSAhPSBleHBlY3RlZCkKKwkJCXJldHVybiBpZHg7CisJCSsraWR4OworCX0KKworCS8qIGFsbCBiaXRzIGhhdmUgdGhlIGV4cGVjdGVkIHZhbHVlICovCisJcmV0dXJuIH4wVUw7CiB9Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHRjZV9jYWNoZV9ibGFzdF9zdHJlc3Moc3RydWN0IGlvbW11X3RhYmxlICp0YmwpCisjZWxzZSAvKiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQgKi8KK2ludCBkZWJ1Z2dpbmcgX19yZWFkX21vc3RseSA9IDA7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB2ZXJpZnlfYml0X3JhbmdlKHVuc2lnbmVkIGxvbmcqIGJpdG1hcCwKKwlpbnQgZXhwZWN0ZWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogeworCXJldHVybiB+MFVMOwogfQotI2VuZGlmIC8qIEJMQVNUX1RDRV9DQUNIRV9PTl9VTk1BUCAqLworI2VuZGlmIC8qIENPTkZJR19JT01NVV9ERUJVRyAqLwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBudW1fZG1hX3BhZ2VzKHVuc2lnbmVkIGxvbmcgZG1hLCB1bnNpZ25lZCBpbnQgZG1hbGVuKQogewpAQCAtMTQ5LDcgKzE2OCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHRyYW5zbGF0ZV9waGIoc3RydWN0IHBjaV9kZXYqIGRldikKIHsKLQlpbnQgZGlzYWJsZWQgPSB0ZXN0X2JpdChkZXYtPmJ1cy0+bnVtYmVyLCB0cmFuc2xhdGlvbl9kaXNhYmxlZCk7CisJaW50IGRpc2FibGVkID0gYnVzX2luZm9bZGV2LT5idXMtPm51bWJlcl0udHJhbnNsYXRpb25fZGlzYWJsZWQ7CiAJcmV0dXJuICFkaXNhYmxlZDsKIH0KIApAQCAtMTU4LDYgKzE3Nyw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBpbmRleDsKIAl1bnNpZ25lZCBsb25nIGVuZDsKKwl1bnNpZ25lZCBsb25nIGJhZGJpdDsKIAogCWluZGV4ID0gc3RhcnRfYWRkciA+PiBQQUdFX1NISUZUOwogCkBAIC0xNjksMTQgKzE4OSwxNSBAQAogCWlmIChlbmQgPiB0YmwtPml0X3NpemUpIC8qIGRvbid0IGdvIG9mZiB0aGUgdGFibGUgKi8KIAkJZW5kID0gdGJsLT5pdF9zaXplOwogCi0Jd2hpbGUgKGluZGV4IDwgZW5kKSB7Ci0JCWlmICh0ZXN0X2JpdChpbmRleCwgdGJsLT5pdF9tYXApKQorCWJhZGJpdCA9IHZlcmlmeV9iaXRfcmFuZ2UodGJsLT5pdF9tYXAsIDAsIGluZGV4LCBlbmQpOworCWlmIChiYWRiaXQgIT0gfjBVTCkgeworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQogCQkJcHJpbnRrKEtFUk5fRVJSICJDYWxnYXJ5OiBlbnRyeSBhbHJlYWR5IGFsbG9jYXRlZCBhdCAiCiAJCQkgICAgICAgIjB4JWx4IHRibCAlcCBkbWEgMHglbHggbnBhZ2VzICV1XG4iLAotCQkJICAgICAgIGluZGV4LCB0YmwsIHN0YXJ0X2FkZHIsIG5wYWdlcyk7Ci0JCSsraW5kZXg7CisJCQkgICAgICAgYmFkYml0LCB0YmwsIHN0YXJ0X2FkZHIsIG5wYWdlcyk7CiAJfQotCXNldF9iaXRfc3RyaW5nKHRibC0+aXRfbWFwLCBzdGFydF9hZGRyID4+IFBBR0VfU0hJRlQsIG5wYWdlcyk7CisKKwlzZXRfYml0X3N0cmluZyh0YmwtPml0X21hcCwgaW5kZXgsIG5wYWdlcyk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGlvbW11X3JhbmdlX2FsbG9jKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLApAQCAtMjQzLDcgKzI2NCw3IEBACiAJdW5zaWduZWQgaW50IG5wYWdlcykKIHsKIAl1bnNpZ25lZCBsb25nIGVudHJ5OwotCXVuc2lnbmVkIGxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIGJhZGJpdDsKIAogCWVudHJ5ID0gZG1hX2FkZHIgPj4gUEFHRV9TSElGVDsKIApAQCAtMjUxLDE2ICsyNzIsMTUgQEAKIAogCXRjZV9mcmVlKHRibCwgZW50cnksIG5wYWdlcyk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyArK2kpIHsKLQkJaWYgKCF0ZXN0X2JpdChlbnRyeSArIGksIHRibC0+aXRfbWFwKSkKKwliYWRiaXQgPSB2ZXJpZnlfYml0X3JhbmdlKHRibC0+aXRfbWFwLCAxLCBlbnRyeSwgZW50cnkgKyBucGFnZXMpOworCWlmIChiYWRiaXQgIT0gfjBVTCkgeworCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQogCQkJcHJpbnRrKEtFUk5fRVJSICJDYWxnYXJ5OiBiaXQgaXMgb2ZmIGF0IDB4JWx4ICIKIAkJCSAgICAgICAidGJsICVwIGRtYSAweCVMeCBlbnRyeSAweCVseCBucGFnZXMgJXVcbiIsCi0JCQkgICAgICAgZW50cnkgKyBpLCB0YmwsIGRtYV9hZGRyLCBlbnRyeSwgbnBhZ2VzKTsKKwkJCSAgICAgICBiYWRiaXQsIHRibCwgZG1hX2FkZHIsIGVudHJ5LCBucGFnZXMpOwogCX0KIAogCV9fY2xlYXJfYml0X3N0cmluZyh0YmwtPml0X21hcCwgZW50cnksIG5wYWdlcyk7Ci0KLQl0Y2VfY2FjaGVfYmxhc3Rfc3RyZXNzKHRibCk7CiB9CiAKIHN0YXRpYyB2b2lkIGlvbW11X2ZyZWUoc3RydWN0IGlvbW11X3RhYmxlICp0YmwsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCkBAIC00NTQsNyArNDc0LDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgYnVzbm9fdG9fcGhiaWQodW5zaWduZWQgY2hhciBudW0pCiB7Ci0JcmV0dXJuIGJ1c190b19waGJbbnVtXTsKKwlyZXR1cm4gYnVzX2luZm9bbnVtXS5waGJpZDsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNwbGl0X3F1ZXVlX29mZnNldCh1bnNpZ25lZCBjaGFyIG51bSkKQEAgLTYzMSw2ICs2NTEsMTAgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJdGJsID0gZGV2LT5zeXNkYXRhOworCXRibC0+aXRfYmFzZSA9ICh1bnNpZ25lZCBsb25nKWJ1c19pbmZvW2Rldi0+YnVzLT5udW1iZXJdLnRjZV9zcGFjZTsKKwl0Y2VfZnJlZSh0YmwsIDAsIHRibC0+aXRfc2l6ZSk7CisKIAljYWxnYXJ5X3Jlc2VydmVfcmVnaW9ucyhkZXYpOwogCiAJLyogc2V0IFRBUnMgZm9yIGVhY2ggUEhCICovCkBAIC02NTQsMTEgKzY3OCwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgY2FsZ2FyeV9mcmVlX3RhcihzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgX19pbml0IGNhbGdhcnlfZnJlZV9idXMoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1NjQgdmFsNjQ7CiAJc3RydWN0IGlvbW11X3RhYmxlICp0YmwgPSBkZXYtPnN5c2RhdGE7CiAJdm9pZCBfX2lvbWVtICp0YXJnZXQ7CisJdW5zaWduZWQgaW50IGJpdG1hcHN6OwogCiAJdGFyZ2V0ID0gY2FsZ2FyeV9yZWcodGJsLT5iYmFyLCB0YXJfb2Zmc2V0KGRldi0+YnVzLT5udW1iZXIpKTsKIAl2YWw2NCA9IGJlNjRfdG9fY3B1KHJlYWRxKHRhcmdldCkpOwpAQCAtNjY2LDggKzY5MSwxNSBAQAogCXdyaXRlcShjcHVfdG9fYmU2NCh2YWw2NCksIHRhcmdldCk7CiAJcmVhZHEodGFyZ2V0KTsgLyogZmx1c2ggKi8KIAorCWJpdG1hcHN6ID0gdGJsLT5pdF9zaXplIC8gQklUU19QRVJfQllURTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXRibC0+aXRfbWFwLCBnZXRfb3JkZXIoYml0bWFwc3opKTsKKwl0YmwtPml0X21hcCA9IE5VTEw7CisKIAlrZnJlZSh0YmwpOwogCWRldi0+c3lzZGF0YSA9IE5VTEw7CisKKwkvKiBDYW4ndCBmcmVlIGJvb3RtZW0gYWxsb2NhdGVkIG1lbW9yeSBhZnRlciBzeXN0ZW0gaXMgdXAgOi0oICovCisJYnVzX2luZm9bZGV2LT5idXMtPm51bWJlcl0udGNlX3NwYWNlID0gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgY2FsZ2FyeV93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGRhdGEpCkBAIC03NzIsMTIgKzgwNCwxMSBAQAogCXJldHVybiBhZGRyZXNzOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBjYWxnYXJ5X2luaXRfb25lX25vbnRyYXNsYXRlZChzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgX19pbml0IGNhbGdhcnlfaW5pdF9vbmVfbm9udHJhc2xhdGVkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CisJcGNpX2Rldl9nZXQoZGV2KTsKIAlkZXYtPnN5c2RhdGEgPSBOVUxMOwogCWRldi0+YnVzLT5zZWxmID0gZGV2OwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGNhbGdhcnlfaW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKmRldikKQEAgLTc5OCw2ICs4MjksNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gaW91bm1hcDsKIAorCXBjaV9kZXZfZ2V0KGRldik7CiAJZGV2LT5idXMtPnNlbGYgPSBkZXY7CiAJY2FsZ2FyeV9lbmFibGVfdHJhbnNsYXRpb24oZGV2KTsKIApAQCAtODI0LDEwICs4NTYsOSBAQAogCQkJY2FsZ2FyeV9pbml0X29uZV9ub250cmFzbGF0ZWQoZGV2KTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCWlmICghdGNlX3RhYmxlX2t2YVtkZXYtPmJ1cy0+bnVtYmVyXSAmJiAhdHJhbnNsYXRlX2VtcHR5X3Nsb3RzKSB7Ci0JCQlwY2lfZGV2X3B1dChkZXYpOworCQlpZiAoIWJ1c19pbmZvW2Rldi0+YnVzLT5udW1iZXJdLnRjZV9zcGFjZSAmJiAhdHJhbnNsYXRlX2VtcHR5X3Nsb3RzKQogCQkJY29udGludWU7Ci0JCX0KKwogCQlyZXQgPSBjYWxnYXJ5X2luaXRfb25lKGRldik7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yOwpAQCAtODQwLDE1ICs4NzEsMTggQEAKIAkJZGV2ID0gcGNpX2ZpbmRfZGV2aWNlX3JldmVyc2UoUENJX1ZFTkRPUl9JRF9JQk0sCiAJCQkJCSAgICAgIFBDSV9ERVZJQ0VfSURfSUJNX0NBTEdBUlksCiAJCQkJCSAgICAgIGRldik7CisJCWlmICghZGV2KQorCQkJYnJlYWs7CiAJCWlmICghdHJhbnNsYXRlX3BoYihkZXYpKSB7CiAJCQlwY2lfZGV2X3B1dChkZXYpOwogCQkJY29udGludWU7CiAJCX0KLQkJaWYgKCF0Y2VfdGFibGVfa3ZhW2Rldi0+YnVzLT5udW1iZXJdICYmICF0cmFuc2xhdGVfZW1wdHlfc2xvdHMpCisJCWlmICghYnVzX2luZm9bZGV2LT5idXMtPm51bWJlcl0udGNlX3NwYWNlICYmICF0cmFuc2xhdGVfZW1wdHlfc2xvdHMpCiAJCQljb250aW51ZTsKKwogCQljYWxnYXJ5X2Rpc2FibGVfdHJhbnNsYXRpb24oZGV2KTsKLQkJY2FsZ2FyeV9mcmVlX3RhcihkZXYpOwotCQlwY2lfZGV2X3B1dChkZXYpOworCQljYWxnYXJ5X2ZyZWVfYnVzKGRldik7CisJCXBjaV9kZXZfcHV0KGRldik7IC8qIFVuZG8gY2FsZ2FyeV9pbml0X29uZSgpJ3MgcGNpX2Rldl9nZXQoKSAqLwogCX0KIAogCXJldHVybiByZXQ7CkBAIC04OTAsMTMgKzkyNCwxNSBAQAogCWlmIChzd2lvdGxiIHx8IG5vX2lvbW11IHx8IGlvbW11X2RldGVjdGVkKQogCQlyZXR1cm47CiAKKwlpZiAoIWVhcmx5X3BjaV9hbGxvd2VkKCkpCisJCXJldHVybjsKKwogCXNwZWNpZmllZF90YWJsZV9zaXplID0gZGV0ZXJtaW5lX3RjZV90YWJsZV9zaXplKGVuZF9wZm4gKiBQQUdFX1NJWkUpOwogCiAJZm9yIChidXMgPSAwOyBidXMgPCBNQVhfUEhCX0JVU19OVU07IGJ1cysrKSB7CiAJCWludCBkZXY7Ci0KLQkJdGNlX3RhYmxlX2t2YVtidXNdID0gTlVMTDsKLQkJYnVzX3RvX3BoYltidXNdID0gLTE7CisJCXN0cnVjdCBjYWxnYXJ5X2J1c19pbmZvICppbmZvID0gJmJ1c19pbmZvW2J1c107CisJCWluZm8tPnBoYmlkID0gLTE7CiAKIAkJaWYgKHJlYWRfcGNpX2NvbmZpZyhidXMsIDAsIDAsIDApICE9IFBDSV9WRU5ET1JfREVWSUNFX0lEX0NBTEdBUlkpCiAJCQljb250aW51ZTsKQEAgLTkwNywxMiArOTQzLDkgQEAKIAkJICovCiAJCXBoYiA9IChwaGIgKyAxKSAlIFBIQlNfUEVSX0NBTEdBUlk7CiAKLQkJaWYgKHRlc3RfYml0KGJ1cywgdHJhbnNsYXRpb25fZGlzYWJsZWQpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJDYWxnYXJ5OiB0cmFuc2xhdGlvbiBpcyBkaXNhYmxlZCBmb3IgIgotCQkJICAgICAgICJQSEIgMHgleFxuIiwgYnVzKTsKLQkJCS8qIHNraXAgdGhpcyBwaGIsIGRvbid0IGFsbG9jYXRlIGEgdGJsIGZvciBpdCAqLworCQlpZiAoaW5mby0+dHJhbnNsYXRpb25fZGlzYWJsZWQpCiAJCQljb250aW51ZTsKLQkJfQorCiAJCS8qCiAJCSAqIFNjYW4gdGhlIHNsb3RzIG9mIHRoZSBQQ0kgYnVzIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGRldmljZSBwcmVzZW50LgogCQkgKiBUaGUgcGFyZW50IGJ1cyB3aWxsIGJlIHRoZSB6ZXJvLWl0aCBkZXZpY2UsIHNvIHN0YXJ0IGF0IDEuCkBAIC05MjMsOCArOTU2LDggQEAKIAkJCQl0YmwgPSBhbGxvY190Y2VfdGFibGUoKTsKIAkJCQlpZiAoIXRibCkKIAkJCQkJZ290byBjbGVhbnVwOwotCQkJCXRjZV90YWJsZV9rdmFbYnVzXSA9IHRibDsKLQkJCQlidXNfdG9fcGhiW2J1c10gPSBwaGI7CisJCQkJaW5mby0+dGNlX3NwYWNlID0gdGJsOworCQkJCWluZm8tPnBoYmlkID0gcGhiOwogCQkJCWNhbGdhcnlfZm91bmQgPSAxOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtOTM0LDE1ICs5NjcsMjAgQEAKIAlpZiAoY2FsZ2FyeV9mb3VuZCkgewogCQlpb21tdV9kZXRlY3RlZCA9IDE7CiAJCWNhbGdhcnlfZGV0ZWN0ZWQgPSAxOwotCQlwcmludGsoS0VSTl9JTkZPICJQQ0ktRE1BOiBDYWxnYXJ5IElPTU1VIGRldGVjdGVkLiAiCi0JCSAgICAgICAiVENFIHRhYmxlIHNwZWMgaXMgJWQuXG4iLCBzcGVjaWZpZWRfdGFibGVfc2l6ZSk7CisJCXByaW50ayhLRVJOX0lORk8gIlBDSS1ETUE6IENhbGdhcnkgSU9NTVUgZGV0ZWN0ZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJLURNQTogQ2FsZ2FyeSBUQ0UgdGFibGUgc3BlYyBpcyAlZCwgIgorCQkgICAgICAgIkNPTkZJR19JT01NVV9ERUJVRyBpcyAlcy5cbiIsIHNwZWNpZmllZF90YWJsZV9zaXplLAorCQkgICAgICAgZGVidWdnaW5nID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CiAJfQogCXJldHVybjsKIAogY2xlYW51cDoKLQlmb3IgKC0tYnVzOyBidXMgPj0gMDsgLS1idXMpCi0JCWlmICh0Y2VfdGFibGVfa3ZhW2J1c10pCi0JCQlmcmVlX3RjZV90YWJsZSh0Y2VfdGFibGVfa3ZhW2J1c10pOworCWZvciAoLS1idXM7IGJ1cyA+PSAwOyAtLWJ1cykgeworCQlzdHJ1Y3QgY2FsZ2FyeV9idXNfaW5mbyAqaW5mbyA9ICZidXNfaW5mb1tidXNdOworCisJCWlmIChpbmZvLT50Y2Vfc3BhY2UpCisJCQlmcmVlX3RjZV90YWJsZShpbmZvLT50Y2Vfc3BhY2UpOworCX0KIH0KIAogaW50IF9faW5pdCBjYWxnYXJ5X2lvbW11X2luaXQodm9pZCkKQEAgLTEwMTYsNyArMTA1NCw3IEBACiAJCQlpZiAoYnJpZGdlIDwgTUFYX1BIQl9CVVNfTlVNKSB7CiAJCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ2FsZ2FyeTogZGlzYWJsaW5nICIKIAkJCQkgICAgICAgInRyYW5zbGF0aW9uIGZvciBQSEIgMHgleFxuIiwgYnJpZGdlKTsKLQkJCQlzZXRfYml0KGJyaWRnZSwgdHJhbnNsYXRpb25fZGlzYWJsZWQpOworCQkJCWJ1c19pbmZvW2JyaWRnZV0udHJhbnNsYXRpb25fZGlzYWJsZWQgPSAxOwogCQkJfQogCQl9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktZG1hLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWRtYS5jCmluZGV4IDljNDRmNGYuLjRkY2I2NzEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktZG1hLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3BjaS1kbWEuYwpAQCAtMjM2LDYgKzIzNiw5IEBACiB7CiAgICAgaW9tbXVfbWVyZ2UgPSAxOwogCisJaWYgKCFwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogICAgIHdoaWxlICgqcCkgewogCSAgICBpZiAoIXN0cm5jbXAocCwib2ZmIiwzKSkKIAkJICAgIG5vX2lvbW11ID0gMTsKQEAgLTI3OCw5ICsyODEsOSBAQAogCSAgICBpZiAoKnAgPT0gJywnKQogCQkgICAgKytwOwogICAgIH0KLSAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKIH0KLV9fc2V0dXAoImlvbW11PSIsIGlvbW11X3NldHVwKTsKK2Vhcmx5X3BhcmFtKCJpb21tdSIsIGlvbW11X3NldHVwKTsKIAogdm9pZCBfX2luaXQgcGNpX2lvbW11X2FsbG9jKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLWdhcnQuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktZ2FydC5jCmluZGV4IDZkM2U2MWIuLjE2MjYxYTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktZ2FydC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktZ2FydC5jCkBAIC0yMzksOCArMjM5LDYgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHBoeXNfbWVtLCBidXM7CiAKLQlCVUdfT04oZGlyID09IERNQV9OT05FKTsKLQogCWlmICghZGV2KQogCQlkZXYgPSAmZmFsbGJhY2tfZGV2OwogCkBAIC0zODMsNyArMzgxLDYgQEAKIAl1bnNpZ25lZCBsb25nIHBhZ2VzID0gMDsKIAlpbnQgbmVlZCA9IDAsIG5leHRuZWVkOwogCi0JQlVHX09OKGRpciA9PSBETUFfTk9ORSk7CiAJaWYgKG5lbnRzID09IDApIAogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3BjaS1ub21tdS5jIGIvYXJjaC94ODZfNjQva2VybmVsL3BjaS1ub21tdS5jCmluZGV4IGFhZDc2MDkuLmRmMDlhYjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9wY2ktbm9tbXUuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcGNpLW5vbW11LmMKQEAgLTU5LDcgKzU5LDYgQEAKIHsKIAlpbnQgaTsKIAotCUJVR19PTihkaXJlY3Rpb24gPT0gRE1BX05PTkUpOwogIAlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKyApIHsKIAkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzID0gJnNnW2ldOwogCQlCVUdfT04oIXMtPnBhZ2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggYmI2NzQ1ZC4uNDU4MDA2YSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcHJvY2Vzcy5jCkBAIC04MCwyNSArODAsMjUgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWRsZV9ub3RpZmllcl91bnJlZ2lzdGVyKTsKIAotZW51bSBpZGxlX3N0YXRlIHsgQ1BVX0lETEUsIENQVV9OT1RfSURMRSB9Owotc3RhdGljIERFRklORV9QRVJfQ1BVKGVudW0gaWRsZV9zdGF0ZSwgaWRsZV9zdGF0ZSkgPSBDUFVfTk9UX0lETEU7Ci0KIHZvaWQgZW50ZXJfaWRsZSh2b2lkKQogewotCV9fZ2V0X2NwdV92YXIoaWRsZV9zdGF0ZSkgPSBDUFVfSURMRTsKKwl3cml0ZV9wZGEoaXNpZGxlLCAxKTsKIAlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbigmaWRsZV9ub3RpZmllciwgSURMRV9TVEFSVCwgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdF9pZGxlKHZvaWQpCiB7Ci0JX19nZXRfY3B1X3ZhcihpZGxlX3N0YXRlKSA9IENQVV9OT1RfSURMRTsKKwlpZiAocmVhZF9wZGEoaXNpZGxlKSA9PSAwKQorCQlyZXR1cm47CisJd3JpdGVfcGRhKGlzaWRsZSwgMCk7CiAJYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJmlkbGVfbm90aWZpZXIsIElETEVfRU5ELCBOVUxMKTsKIH0KIAogLyogQ2FsbGVkIGZyb20gaW50ZXJydXB0cyB0byBzaWduaWZ5IGlkbGUgZW5kICovCiB2b2lkIGV4aXRfaWRsZSh2b2lkKQogewotCWlmIChjdXJyZW50LT5waWQgfCByZWFkX3BkYShpcnFjb3VudCkpCisJLyogaWRsZSBsb29wIGhhcyBwaWQgMCAqLworCWlmIChjdXJyZW50LT5waWQpCiAJCXJldHVybjsKIAlfX2V4aXRfaWRsZSgpOwogfQpAQCAtMjIwLDYgKzIyMCw5IEBACiAJCQkJcGxheV9kZWFkKCk7CiAJCQllbnRlcl9pZGxlKCk7CiAJCQlpZGxlKCk7CisJCQkvKiBJbiBtYW55IGNhc2VzIHRoZSBpbnRlcnJ1cHQgdGhhdCBlbmRlZCBpZGxlCisJCQkgICBoYXMgYWxyZWFkeSBjYWxsZWQgZXhpdF9pZGxlLiBCdXQgc29tZSBpZGxlCisJCQkgICBsb29wcyBjYW4gYmUgd29rZW4gdXAgd2l0aG91dCBpbnRlcnJ1cHQuICovCiAJCQlfX2V4aXRfaWRsZSgpOwogCQl9CiAKQEAgLTM1MCw2ICszNTMsNyBAQAogCiAJCWtmcmVlKHQtPmlvX2JpdG1hcF9wdHIpOwogCQl0LT5pb19iaXRtYXBfcHRyID0gTlVMTDsKKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX0lPX0JJVE1BUCk7CiAJCS8qCiAJCSAqIENhcmVmdWwsIGNsZWFyIHRoaXMgaW4gdGhlIFRTUyB0b286CiAJCSAqLwpAQCAtMzY5LDYgKzM3Myw3IEBACiAJCWlmICh0LT5mbGFncyAmIF9USUZfSUEzMikKIAkJCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3RhdHVzIHw9IFRTX0NPTVBBVDsKIAl9CisJdC0+ZmxhZ3MgJj0gfl9USUZfREVCVUc7CiAKIAl0c2stPnRocmVhZC5kZWJ1Z3JlZzAgPSAwOwogCXRzay0+dGhyZWFkLmRlYnVncmVnMSA9IDA7CkBAIC00NjEsNyArNDY2LDcgQEAKIAlhc20oIm1vdiAlJWVzLCUwIiA6ICI9bSIgKHAtPnRocmVhZC5lcykpOwogCWFzbSgibW92ICUlZHMsJTAiIDogIj1tIiAocC0+dGhyZWFkLmRzKSk7CiAKLQlpZiAodW5saWtlbHkobWUtPnRocmVhZC5pb19iaXRtYXBfcHRyICE9IE5VTEwpKSB7IAorCWlmICh1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyhtZSwgVElGX0lPX0JJVE1BUCkpKSB7CiAJCXAtPnRocmVhZC5pb19iaXRtYXBfcHRyID0ga21hbGxvYyhJT19CSVRNQVBfQllURVMsIEdGUF9LRVJORUwpOwogCQlpZiAoIXAtPnRocmVhZC5pb19iaXRtYXBfcHRyKSB7CiAJCQlwLT50aHJlYWQuaW9fYml0bWFwX21heCA9IDA7CkBAIC00NjksNiArNDc0LDcgQEAKIAkJfQogCQltZW1jcHkocC0+dGhyZWFkLmlvX2JpdG1hcF9wdHIsIG1lLT50aHJlYWQuaW9fYml0bWFwX3B0ciwKIAkJCQlJT19CSVRNQVBfQllURVMpOworCQlzZXRfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9JT19CSVRNQVApOwogCX0gCiAKIAkvKgpAQCAtNDk4LDYgKzUwNCw0MCBAQAogICovCiAjZGVmaW5lIGxvYWRkZWJ1Zyh0aHJlYWQscikgc2V0X2RlYnVncmVnKHRocmVhZC0+ZGVidWdyZWcgIyMgciwgcikKIAorc3RhdGljIGlubGluZSB2b2lkIF9fc3dpdGNoX3RvX3h0cmEoc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2X3AsCisJCQkgICAgIAkgICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0X3AsCisJCQkgICAgIAkgICAgc3RydWN0IHRzc19zdHJ1Y3QgKnRzcykKK3sKKwlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqcHJldiwgKm5leHQ7CisKKwlwcmV2ID0gJnByZXZfcC0+dGhyZWFkLAorCW5leHQgPSAmbmV4dF9wLT50aHJlYWQ7CisKKwlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcobmV4dF9wLCBUSUZfREVCVUcpKSB7CisJCWxvYWRkZWJ1ZyhuZXh0LCAwKTsKKwkJbG9hZGRlYnVnKG5leHQsIDEpOworCQlsb2FkZGVidWcobmV4dCwgMik7CisJCWxvYWRkZWJ1ZyhuZXh0LCAzKTsKKwkJLyogbm8gNCBhbmQgNSAqLworCQlsb2FkZGVidWcobmV4dCwgNik7CisJCWxvYWRkZWJ1ZyhuZXh0LCA3KTsKKwl9CisKKwlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcobmV4dF9wLCBUSUZfSU9fQklUTUFQKSkgeworCQkvKgorCQkgKiBDb3B5IHRoZSByZWxldmFudCByYW5nZSBvZiB0aGUgSU8gYml0bWFwLgorCQkgKiBOb3JtYWxseSB0aGlzIGlzIDEyOCBieXRlcyBvciBsZXNzOgorCQkgKi8KKwkJbWVtY3B5KHRzcy0+aW9fYml0bWFwLCBuZXh0LT5pb19iaXRtYXBfcHRyLAorCQkgICAgICAgbWF4KHByZXYtPmlvX2JpdG1hcF9tYXgsIG5leHQtPmlvX2JpdG1hcF9tYXgpKTsKKwl9IGVsc2UgaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKHByZXZfcCwgVElGX0lPX0JJVE1BUCkpIHsKKwkJLyoKKwkJICogQ2xlYXIgYW55IHBvc3NpYmxlIGxlZnRvdmVyIGJpdHM6CisJCSAqLworCQltZW1zZXQodHNzLT5pb19iaXRtYXAsIDB4ZmYsIHByZXYtPmlvX2JpdG1hcF9tYXgpOworCX0KK30KKwogLyoKICAqCXN3aXRjaF90byh4LHkpIHNob3VsZCBzd2l0Y2ggdGFza3MgZnJvbSB4IHRvIHkuCiAgKgpAQCAtNTE1LDYgKzU1NSwxMCBAQAogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7ICAKIAlzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7CiAKKwkvKiB3ZSdyZSBnb2luZyB0byB1c2UgdGhpcyBzb29uLCBhZnRlciBhIGZldyBleHBlbnNpdmUgdGhpbmdzICovCisJaWYgKG5leHRfcC0+ZnB1X2NvdW50ZXI+NSkKKwkJcHJlZmV0Y2goJm5leHQtPmkzODcuZnhzYXZlKTsKKwogCS8qCiAJICogUmVsb2FkIGVzcDAsIExEVCBhbmQgdGhlIHBhZ2UgdGFibGUgcG9pbnRlcjoKIAkgKi8KQEAgLTU4Myw0MSArNjI3LDI5IEBACiAJICAgQW5kIHRoZSBBTUQgd29ya2Fyb3VuZCByZXF1aXJlcyBpdCB0byBiZSBhZnRlciBEUyByZWxvYWQuICovCiAJdW5sYXp5X2ZwdShwcmV2X3ApOwogCXdyaXRlX3BkYShrZXJuZWxzdGFjaywKLQkJICB0YXNrX3N0YWNrX3BhZ2UobmV4dF9wKSArIFRIUkVBRF9TSVpFIC0gUERBX1NUQUNLT0ZGU0VUKTsKKwkodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UobmV4dF9wKSArIFRIUkVBRF9TSVpFIC0gUERBX1NUQUNLT0ZGU0VUKTsKKyNpZmRlZiBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IKKwl3cml0ZV9wZGEoc3RhY2tfY2FuYXJ5LCBuZXh0X3AtPnN0YWNrX2NhbmFyeSk7CisJLyoKKwkgKiBCdWlsZCB0aW1lIG9ubHkgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBzdGFja19jYW5hcnkgaXMgYXQKKwkgKiBvZmZzZXQgNDAgaW4gdGhlIHBkYTsgdGhpcyBpcyBhIGdjYyBBQkkgcmVxdWlyZW1lbnQKKwkgKi8KKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHg4NjY0X3BkYSwgc3RhY2tfY2FuYXJ5KSAhPSA0MCk7CisjZW5kaWYKIAogCS8qCi0JICogTm93IG1heWJlIHJlbG9hZCB0aGUgZGVidWcgcmVnaXN0ZXJzCisJICogTm93IG1heWJlIHJlbG9hZCB0aGUgZGVidWcgcmVnaXN0ZXJzIGFuZCBoYW5kbGUgSS9PIGJpdG1hcHMKIAkgKi8KLQlpZiAodW5saWtlbHkobmV4dC0+ZGVidWdyZWc3KSkgewotCQlsb2FkZGVidWcobmV4dCwgMCk7Ci0JCWxvYWRkZWJ1ZyhuZXh0LCAxKTsKLQkJbG9hZGRlYnVnKG5leHQsIDIpOwotCQlsb2FkZGVidWcobmV4dCwgMyk7Ci0JCS8qIG5vIDQgYW5kIDUgKi8KLQkJbG9hZGRlYnVnKG5leHQsIDYpOwotCQlsb2FkZGVidWcobmV4dCwgNyk7Ci0JfQorCWlmICh1bmxpa2VseSgodGFza190aHJlYWRfaW5mbyhuZXh0X3ApLT5mbGFncyAmIF9USUZfV09SS19DVFhTVykpCisJICAgIHx8IHRlc3RfdHNrX3RocmVhZF9mbGFnKHByZXZfcCwgVElGX0lPX0JJVE1BUCkpCisJCV9fc3dpdGNoX3RvX3h0cmEocHJldl9wLCBuZXh0X3AsIHRzcyk7CiAKLQotCS8qIAotCSAqIEhhbmRsZSB0aGUgSU8gYml0bWFwIAotCSAqLyAKLQlpZiAodW5saWtlbHkocHJldi0+aW9fYml0bWFwX3B0ciB8fCBuZXh0LT5pb19iaXRtYXBfcHRyKSkgewotCQlpZiAobmV4dC0+aW9fYml0bWFwX3B0cikKLQkJCS8qCi0JCQkgKiBDb3B5IHRoZSByZWxldmFudCByYW5nZSBvZiB0aGUgSU8gYml0bWFwLgotCQkJICogTm9ybWFsbHkgdGhpcyBpcyAxMjggYnl0ZXMgb3IgbGVzczoKLSAJCQkgKi8KLQkJCW1lbWNweSh0c3MtPmlvX2JpdG1hcCwgbmV4dC0+aW9fYml0bWFwX3B0ciwKLQkJCQltYXgocHJldi0+aW9fYml0bWFwX21heCwgbmV4dC0+aW9fYml0bWFwX21heCkpOwotCQllbHNlIHsKLQkJCS8qCi0JCQkgKiBDbGVhciBhbnkgcG9zc2libGUgbGVmdG92ZXIgYml0czoKLQkJCSAqLwotCQkJbWVtc2V0KHRzcy0+aW9fYml0bWFwLCAweGZmLCBwcmV2LT5pb19iaXRtYXBfbWF4KTsKLQkJfQotCX0KLQorCS8qIElmIHRoZSB0YXNrIGhhcyB1c2VkIGZwdSB0aGUgbGFzdCA1IHRpbWVzbGljZXMsIGp1c3QgZG8gYSBmdWxsCisJICogcmVzdG9yZSBvZiB0aGUgbWF0aCBzdGF0ZSBpbW1lZGlhdGVseSB0byBhdm9pZCB0aGUgdHJhcDsgdGhlCisJICogY2hhbmNlcyBvZiBuZWVkaW5nIEZQVSBzb29uIGFyZSBvYnZpb3VzbHkgaGlnaCBub3cKKwkgKi8KKwlpZiAobmV4dF9wLT5mcHVfY291bnRlcj41KQorCQltYXRoX3N0YXRlX3Jlc3RvcmUoKTsKIAlyZXR1cm4gcHJldl9wOwogfQogCkBAIC04MzQsNyArODY2LDcgQEAKIAogdW5zaWduZWQgbG9uZyBhcmNoX2FsaWduX3N0YWNrKHVuc2lnbmVkIGxvbmcgc3ApCiB7Ci0JaWYgKHJhbmRvbWl6ZV92YV9zcGFjZSkKKwlpZiAoIShjdXJyZW50LT5wZXJzb25hbGl0eSAmIEFERFJfTk9fUkFORE9NSVpFKSAmJiByYW5kb21pemVfdmFfc3BhY2UpCiAJCXNwIC09IGdldF9yYW5kb21faW50KCkgJSA4MTkyOwogCXJldHVybiBzcCAmIH4weGY7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggMmQ1MDAyNC4uYWRkYzE0YSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wdHJhY2UuYwpAQCAtMTE2LDE3ICsxMTYsMTcgQEAKIAlyZXR1cm4gYWRkcjsKIH0KIAotc3RhdGljIGludCBpc19hdF9wb3BmKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGludCBpc19zZXR0aW5nX3RyYXBfZmxhZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbnQgaSwgY29waWVkOwotCXVuc2lnbmVkIGNoYXIgb3Bjb2RlWzE2XTsKKwl1bnNpZ25lZCBjaGFyIG9wY29kZVsxNV07CiAJdW5zaWduZWQgbG9uZyBhZGRyID0gY29udmVydF9yaXBfdG9fbGluZWFyKGNoaWxkLCByZWdzKTsKIAogCWNvcGllZCA9IGFjY2Vzc19wcm9jZXNzX3ZtKGNoaWxkLCBhZGRyLCBvcGNvZGUsIHNpemVvZihvcGNvZGUpLCAwKTsKIAlmb3IgKGkgPSAwOyBpIDwgY29waWVkOyBpKyspIHsKIAkJc3dpdGNoIChvcGNvZGVbaV0pIHsKLQkJLyogcG9wZiAqLwotCQljYXNlIDB4OWQ6CisJCS8qIHBvcGYgYW5kIGlyZXQgKi8KKwkJY2FzZSAweDlkOiBjYXNlIDB4Y2Y6CiAJCQlyZXR1cm4gMTsKIAogCQkJLyogQ0hFQ0tNRTogNjQgNjUgKi8KQEAgLTEzOCwxNCArMTM4LDE3IEBACiAJCWNhc2UgMHgyNjogY2FzZSAweDJlOgogCQljYXNlIDB4MzY6IGNhc2UgMHgzZToKIAkJY2FzZSAweDY0OiBjYXNlIDB4NjU6Ci0JCWNhc2UgMHhmMDogY2FzZSAweGYyOiBjYXNlIDB4ZjM6CisJCWNhc2UgMHhmMjogY2FzZSAweGYzOgogCQkJY29udGludWU7CiAKLQkJLyogUkVYIHByZWZpeGVzICovCiAJCWNhc2UgMHg0MCAuLi4gMHg0ZjoKKwkJCWlmIChyZWdzLT5jcyAhPSBfX1VTRVJfQ1MpCisJCQkJLyogMzItYml0IG1vZGU6IHJlZ2lzdGVyIGluY3JlbWVudCAqLworCQkJCXJldHVybiAwOworCQkJLyogNjQtYml0IG1vZGU6IFJFWCBwcmVmaXggKi8KIAkJCWNvbnRpbnVlOwogCi0JCQkvKiBDSEVDS01FOiBmMCwgZjIsIGYzICovCisJCQkvKiBDSEVDS01FOiBmMiwgZjMgKi8KIAogCQkvKgogCQkgKiBwdXNoZjogTk9URSEgV2Ugc2hvdWxkIHByb2JhYmx5IG5vdCBsZXQKQEAgLTE4NiwxMCArMTg5LDggQEAKIAkgKiAuLmJ1dCBpZiBURiBpcyBjaGFuZ2VkIGJ5IHRoZSBpbnN0cnVjdGlvbiB3ZSB3aWxsIHRyYWNlLAogCSAqIGRvbid0IG1hcmsgaXQgYXMgYmVpbmcgInVzIiB0aGF0IHNldCBpdCwgc28gdGhhdCB3ZQogCSAqIHdvbid0IGNsZWFyIGl0IGJ5IGhhbmQgbGF0ZXIuCi0JICoKLQkgKiBBSzogdGhpcyBpcyBub3QgZW5vdWdoLCBMQUhGIGFuZCBJUkVUIGNhbiBjaGFuZ2UgVEYgaW4gdXNlciBzcGFjZSB0b28uCiAJICovCi0JaWYgKGlzX2F0X3BvcGYoY2hpbGQsIHJlZ3MpKQorCWlmIChpc19zZXR0aW5nX3RyYXBfZmxhZyhjaGlsZCwgcmVncykpCiAJCXJldHVybjsKIAogCWNoaWxkLT5wdHJhY2UgfD0gUFRfRFRSQUNFOwpAQCAtNDIwLDkgKzQyMSwxMyBAQAogCQkJCWlmICgoMHg1NTU0ID4+ICgoZGF0YSA+PiAoMTYgKyA0KmkpKSAmIDB4ZikpICYgMSkKIAkJCQkJYnJlYWs7CiAJCQlpZiAoaSA9PSA0KSB7Ci0JCQkJY2hpbGQtPnRocmVhZC5kZWJ1Z3JlZzcgPSBkYXRhOworCQkJICBjaGlsZC0+dGhyZWFkLmRlYnVncmVnNyA9IGRhdGE7CisJCQkgIGlmIChkYXRhKQorCQkJICAJc2V0X3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX0RFQlVHKTsKKwkJCSAgZWxzZQorCQkJICAJY2xlYXJfdHNrX3RocmVhZF9mbGFnKGNoaWxkLCBUSUZfREVCVUcpOwogCQkJICByZXQgPSAwOwotCQkgIH0KKwkJICAJfQogCQkgIGJyZWFrOwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TIGIvYXJjaC94ODZfNjQva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCmluZGV4IGQyNGZhOWIuLjE0ZTk1ODcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKQEAgLTcsMzEgKzcsMTY5IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgogCi0JLyoKLQkgKiBNdXN0IGJlIHJlbG9jYXRhYmxlIFBJQyBjb2RlIGNhbGxhYmxlIGFzIGEgQyBmdW5jdGlvbiwgdGhhdCBvbmNlCi0JICogaXQgc3RhcnRzIGNhbiBub3QgdXNlIHRoZSBwcmV2aW91cyBwcm9jZXNzZXMgc3RhY2suCi0JICovCi0JLmdsb2JsIHJlbG9jYXRlX25ld19rZXJuZWwKKy8qCisgKiBNdXN0IGJlIHJlbG9jYXRhYmxlIFBJQyBjb2RlIGNhbGxhYmxlIGFzIGEgQyBmdW5jdGlvbgorICovCisKKyNkZWZpbmUgUFRSKHgpICh4IDw8IDMpCisjZGVmaW5lIFBBR0VfQUxJR05FRCAoMSA8PCBQQUdFX1NISUZUKQorI2RlZmluZSBQQUdFX0FUVFIgMHg2MyAvKiBfUEFHRV9QUkVTRU5UfF9QQUdFX1JXfF9QQUdFX0FDQ0VTU0VEfF9QQUdFX0RJUlRZICovCisKKwkudGV4dAorCS5hbGlnbiBQQUdFX0FMSUdORUQKIAkuY29kZTY0Ci1yZWxvY2F0ZV9uZXdfa2VybmVsOgotCS8qICVyZGkgcGFnZV9saXN0Ci0JICogJXJzaSByZWJvb3RfY29kZV9idWZmZXIKKwkuZ2xvYmwgcmVsb2NhdGVfa2VybmVsCityZWxvY2F0ZV9rZXJuZWw6CisJLyogJXJkaSBpbmRpcmVjdGlvbl9wYWdlCisJICogJXJzaSBwYWdlX2xpc3QKIAkgKiAlcmR4IHN0YXJ0IGFkZHJlc3MKLQkgKiAlcmN4IHBhZ2VfdGFibGUKLQkgKiAlcjggIGFyZzUKLQkgKiAlcjkgIGFyZzYKKwkgKi8KKworCS8qIG1hcCB0aGUgY29udHJvbCBwYWdlIGF0IGl0cyB2aXJ0dWFsIGFkZHJlc3MgKi8KKworCW1vdnEJJDB4MDAwMGZmODAwMDAwMDAwMCwgJXIxMCAgICAgICAgLyogbWFzayAqLworCW1vdgkkKDM5IC0gMyksICVjbCAgICAgICAgICAgICAgICAgICAvKiBiaXRzIHRvIHNoaWZ0ICovCisJbW92cQlQVFIoVkFfQ09OVFJPTF9QQUdFKSglcnNpKSwgJXIxMSAvKiBhZGRyZXNzIHRvIG1hcCAqLworCisJbW92cQklcjExLCAlcjkKKwlhbmRxCSVyMTAsICVyOQorCXNocnEJJWNsLCAlcjkKKworCW1vdnEJUFRSKFZBX1BHRCkoJXJzaSksICVyOAorCWFkZHEJJXI4LCAlcjkKKwltb3ZxCVBUUihQQV9QVURfMCkoJXJzaSksICVyOAorCW9ycQkkUEFHRV9BVFRSLCAlcjgKKwltb3ZxCSVyOCwgKCVyOSkKKworCXNocnEJJDksICVyMTAKKwlzdWIJJDksICVjbAorCisJbW92cQklcjExLCAlcjkKKwlhbmRxCSVyMTAsICVyOQorCXNocnEJJWNsLCAlcjkKKworCW1vdnEJUFRSKFZBX1BVRF8wKSglcnNpKSwgJXI4CisJYWRkcQklcjgsICVyOQorCW1vdnEJUFRSKFBBX1BNRF8wKSglcnNpKSwgJXI4CisJb3JxCSRQQUdFX0FUVFIsICVyOAorCW1vdnEJJXI4LCAoJXI5KQorCisJc2hycQkkOSwgJXIxMAorCXN1YgkkOSwgJWNsCisKKwltb3ZxCSVyMTEsICVyOQorCWFuZHEJJXIxMCwgJXI5CisJc2hycQklY2wsICVyOQorCisJbW92cQlQVFIoVkFfUE1EXzApKCVyc2kpLCAlcjgKKwlhZGRxCSVyOCwgJXI5CisJbW92cQlQVFIoUEFfUFRFXzApKCVyc2kpLCAlcjgKKwlvcnEJJFBBR0VfQVRUUiwgJXI4CisJbW92cQklcjgsICglcjkpCisKKwlzaHJxCSQ5LCAlcjEwCisJc3ViCSQ5LCAlY2wKKworCW1vdnEJJXIxMSwgJXI5CisJYW5kcQklcjEwLCAlcjkKKwlzaHJxCSVjbCwgJXI5CisKKwltb3ZxCVBUUihWQV9QVEVfMCkoJXJzaSksICVyOAorCWFkZHEJJXI4LCAlcjkKKwltb3ZxCVBUUihQQV9DT05UUk9MX1BBR0UpKCVyc2kpLCAlcjgKKwlvcnEJJFBBR0VfQVRUUiwgJXI4CisJbW92cQklcjgsICglcjkpCisKKwkvKiBpZGVudGl0eSBtYXAgdGhlIGNvbnRyb2wgcGFnZSBhdCBpdHMgcGh5c2ljYWwgYWRkcmVzcyAqLworCisJbW92cQkkMHgwMDAwZmY4MDAwMDAwMDAwLCAlcjEwICAgICAgICAvKiBtYXNrICovCisJbW92CSQoMzkgLSAzKSwgJWNsICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgdG8gc2hpZnQgKi8KKwltb3ZxCVBUUihQQV9DT05UUk9MX1BBR0UpKCVyc2kpLCAlcjExIC8qIGFkZHJlc3MgdG8gbWFwICovCisKKwltb3ZxCSVyMTEsICVyOQorCWFuZHEJJXIxMCwgJXI5CisJc2hycQklY2wsICVyOQorCisJbW92cQlQVFIoVkFfUEdEKSglcnNpKSwgJXI4CisJYWRkcQklcjgsICVyOQorCW1vdnEJUFRSKFBBX1BVRF8xKSglcnNpKSwgJXI4CisJb3JxCSRQQUdFX0FUVFIsICVyOAorCW1vdnEJJXI4LCAoJXI5KQorCisJc2hycQkkOSwgJXIxMAorCXN1YgkkOSwgJWNsCisKKwltb3ZxCSVyMTEsICVyOQorCWFuZHEJJXIxMCwgJXI5CisJc2hycQklY2wsICVyOQorCisJbW92cQlQVFIoVkFfUFVEXzEpKCVyc2kpLCAlcjgKKwlhZGRxCSVyOCwgJXI5CisJbW92cQlQVFIoUEFfUE1EXzEpKCVyc2kpLCAlcjgKKwlvcnEJJFBBR0VfQVRUUiwgJXI4CisJbW92cQklcjgsICglcjkpCisKKwlzaHJxCSQ5LCAlcjEwCisJc3ViCSQ5LCAlY2wKKworCW1vdnEJJXIxMSwgJXI5CisJYW5kcQklcjEwLCAlcjkKKwlzaHJxCSVjbCwgJXI5CisKKwltb3ZxCVBUUihWQV9QTURfMSkoJXJzaSksICVyOAorCWFkZHEJJXI4LCAlcjkKKwltb3ZxCVBUUihQQV9QVEVfMSkoJXJzaSksICVyOAorCW9ycQkkUEFHRV9BVFRSLCAlcjgKKwltb3ZxCSVyOCwgKCVyOSkKKworCXNocnEJJDksICVyMTAKKwlzdWIJJDksICVjbAorCisJbW92cQklcjExLCAlcjkKKwlhbmRxCSVyMTAsICVyOQorCXNocnEJJWNsLCAlcjkKKworCW1vdnEJUFRSKFZBX1BURV8xKSglcnNpKSwgJXI4CisJYWRkcQklcjgsICVyOQorCW1vdnEJUFRSKFBBX0NPTlRST0xfUEFHRSkoJXJzaSksICVyOAorCW9ycQkkUEFHRV9BVFRSLCAlcjgKKwltb3ZxCSVyOCwgKCVyOSkKKworcmVsb2NhdGVfbmV3X2tlcm5lbDoKKwkvKiAlcmRpIGluZGlyZWN0aW9uX3BhZ2UKKwkgKiAlcnNpIHBhZ2VfbGlzdAorCSAqICVyZHggc3RhcnQgYWRkcmVzcwogCSAqLwogCiAJLyogemVybyBvdXQgZmxhZ3MsIGFuZCBkaXNhYmxlIGludGVycnVwdHMgKi8KIAlwdXNocSAkMAogCXBvcGZxCiAKLQkvKiBzZXQgYSBuZXcgc3RhY2sgYXQgdGhlIGJvdHRvbSBvZiBvdXIgcGFnZS4uLiAqLwotCWxlYSAgIDQwOTYoJXJzaSksICVyc3AKKwkvKiBnZXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBjb250cm9sIHBhZ2Ugbm93ICovCisJLyogdGhpcyBpcyBpbXBvc3NpYmxlIGFmdGVyIHBhZ2UgdGFibGUgc3dpdGNoICovCisJbW92cQlQVFIoUEFfQ09OVFJPTF9QQUdFKSglcnNpKSwgJXI4CiAKLQkvKiBzdG9yZSB0aGUgcGFyYW1ldGVycyBiYWNrIG9uIHRoZSBzdGFjayAqLwotCXB1c2hxCSVyZHggLyogc3RvcmUgdGhlIHN0YXJ0IGFkZHJlc3MgKi8KKwkvKiBnZXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBwYWdlIHRhYmxlIG5vdyB0b28gKi8KKwltb3ZxCVBUUihQQV9UQUJMRV9QQUdFKSglcnNpKSwgJXJjeAorCisJLyogc3dpdGNoIHRvIG5ldyBzZXQgb2YgcGFnZSB0YWJsZXMgKi8KKwltb3ZxCVBUUihQQV9QR0QpKCVyc2kpLCAlcjkKKwltb3ZxCSVyOSwgJWNyMworCisJLyogc2V0dXAgYSBuZXcgc3RhY2sgYXQgdGhlIGVuZCBvZiB0aGUgcGh5c2ljYWwgY29udHJvbCBwYWdlICovCisJbGVhCTQwOTYoJXI4KSwgJXJzcAorCisJLyoganVtcCB0byBpZGVudGl0eSBtYXBwZWQgcGFnZSAqLworCWFkZHEJJChpZGVudGl0eV9tYXBwZWQgLSByZWxvY2F0ZV9rZXJuZWwpLCAlcjgKKwlwdXNocQklcjgKKwlyZXQKKworaWRlbnRpdHlfbWFwcGVkOgorCS8qIHN0b3JlIHRoZSBzdGFydCBhZGRyZXNzIG9uIHRoZSBzdGFjayAqLworCXB1c2hxICAgJXJkeAogCiAJLyogU2V0IGNyMCB0byBhIGtub3duIHN0YXRlOgogCSAqIDMxIDEgPT0gUGFnaW5nIGVuYWJsZWQKQEAgLTEzNiw4ICsyNzQsMyBAQAogCXhvcnEJJXIxNSwgJXIxNQogCiAJcmV0Ci1yZWxvY2F0ZV9uZXdfa2VybmVsX2VuZDoKLQotCS5nbG9ibCByZWxvY2F0ZV9uZXdfa2VybmVsX3NpemUKLXJlbG9jYXRlX25ld19rZXJuZWxfc2l6ZToKLQkucXVhZCByZWxvY2F0ZV9uZXdfa2VybmVsX2VuZCAtIHJlbG9jYXRlX25ld19rZXJuZWwKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMKaW5kZXggNGIzOWYwZC4uMGIwMGJiMiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3NldHVwLmMKQEAgLTc0LDE2ICs3NCw2IEBACiAKIHVuc2lnbmVkIGxvbmcgbW11X2NyNF9mZWF0dXJlczsKIAotaW50IGFjcGlfZGlzYWJsZWQ7Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZGlzYWJsZWQpOwotI2lmZGVmCUNPTkZJR19BQ1BJCi1leHRlcm4gaW50IF9faW5pdGRhdGEgYWNwaV9odDsKLWV4dGVybiBhY3BpX2ludGVycnVwdF9mbGFncwlhY3BpX3NjaV9mbGFnczsKLWludCBfX2luaXRkYXRhIGFjcGlfZm9yY2UgPSAwOwotI2VuZGlmCi0KLWludCBhY3BpX251bWEgX19pbml0ZGF0YTsKLQogLyogQm9vdCBsb2FkZXIgSUQgYXMgYW4gaW50ZWdlciwgZm9yIHRoZSBiZW5lZml0IG9mIHByb2NfZG9pbnR2ZWMgKi8KIGludCBib290bG9hZGVyX3R5cGU7CiAKQEAgLTEwNyw3ICs5Nyw2IEBACiAKIHN0cnVjdCBlZGlkX2luZm8gZWRpZF9pbmZvOwogRVhQT1JUX1NZTUJPTF9HUEwoZWRpZF9pbmZvKTsKLXN0cnVjdCBlODIwbWFwIGU4MjA7CiAKIGV4dGVybiBpbnQgcm9vdF9tb3VudGZsYWdzOwogCkBAIC0yNzYsMTg0ICsyNjUsMjEgQEAKIAl9CiB9CiAKLS8qIENoZWNrIGZvciBmdWxsIGFyZ3VtZW50IHdpdGggbm8gdHJhaWxpbmcgY2hhcmFjdGVycyAqLwotc3RhdGljIGludCBmdWxsYXJnKGNoYXIgKnAsIGNoYXIgKmFyZykKLXsKLQlpbnQgbCA9IHN0cmxlbihhcmcpOwotCXJldHVybiAhbWVtY21wKHAsIGFyZywgbCkgJiYgKHBbbF0gPT0gMCB8fCBpc3NwYWNlKHBbbF0pKTsKLX0KLQotc3RhdGljIF9faW5pdCB2b2lkIHBhcnNlX2NtZGxpbmVfZWFybHkgKGNoYXIgKiogY21kbGluZV9wKQotewotCWNoYXIgYyA9ICcgJywgKnRvID0gY29tbWFuZF9saW5lLCAqZnJvbSA9IENPTU1BTkRfTElORTsKLQlpbnQgbGVuID0gMDsKLQlpbnQgdXNlcmRlZiA9IDA7Ci0KLQlmb3IgKDs7KSB7Ci0JCWlmIChjICE9ICcgJykgCi0JCQlnb3RvIG5leHRfY2hhcjsgCi0KLSNpZmRlZiAgQ09ORklHX1NNUAotCQkvKgotCQkgKiBJZiB0aGUgQklPUyBlbnVtZXJhdGVzIHBoeXNpY2FsIHByb2Nlc3NvcnMgYmVmb3JlIGxvZ2ljYWwsCi0JCSAqIG1heGNwdXM9TiBhdCBlbnVtZXJhdGlvbi10aW1lIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgSFQuCi0JCSAqLwotCQllbHNlIGlmICghbWVtY21wKGZyb20sICJtYXhjcHVzPSIsIDgpKSB7Ci0JCQlleHRlcm4gdW5zaWduZWQgaW50IG1heGNwdXM7Ci0KLQkJCW1heGNwdXMgPSBzaW1wbGVfc3RydG91bChmcm9tICsgOCwgTlVMTCwgMCk7Ci0JCX0KLSNlbmRpZgotI2lmZGVmIENPTkZJR19BQ1BJCi0JCS8qICJhY3BpPW9mZiIgZGlzYWJsZXMgYm90aCBBQ1BJIHRhYmxlIHBhcnNpbmcgYW5kIGludGVycHJldGVyIGluaXQgKi8KLQkJaWYgKGZ1bGxhcmcoZnJvbSwiYWNwaT1vZmYiKSkKLQkJCWRpc2FibGVfYWNwaSgpOwotCi0JCWlmIChmdWxsYXJnKGZyb20sICJhY3BpPWZvcmNlIikpIHsgCi0JCQkvKiBhZGQgbGF0ZXIgd2hlbiB3ZSBkbyBETUkgaG9ycm9yczogKi8KLQkJCWFjcGlfZm9yY2UgPSAxOwotCQkJYWNwaV9kaXNhYmxlZCA9IDA7Ci0JCX0KLQotCQkvKiBhY3BpPWh0IGp1c3QgbWVhbnM6IGRvIEFDUEkgTUFEVCBwYXJzaW5nIAotCQkgICBhdCBib290dXAsIGJ1dCBkb24ndCBlbmFibGUgdGhlIGZ1bGwgQUNQSSBpbnRlcnByZXRlciAqLwotCQlpZiAoZnVsbGFyZyhmcm9tLCAiYWNwaT1odCIpKSB7IAotCQkJaWYgKCFhY3BpX2ZvcmNlKQotCQkJCWRpc2FibGVfYWNwaSgpOwotCQkJYWNwaV9odCA9IDE7IAotCQl9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoZnVsbGFyZyhmcm9tLCAicGNpPW5vYWNwaSIpKSAKLQkJCWFjcGlfZGlzYWJsZV9wY2koKTsKLQkJZWxzZSBpZiAoZnVsbGFyZyhmcm9tLCAiYWNwaT1ub2lycSIpKQotCQkJYWNwaV9ub2lycV9zZXQoKTsKLQotCQllbHNlIGlmIChmdWxsYXJnKGZyb20sICJhY3BpX3NjaT1lZGdlIikpCi0JCQlhY3BpX3NjaV9mbGFncy50cmlnZ2VyID0gIDE7Ci0JCWVsc2UgaWYgKGZ1bGxhcmcoZnJvbSwgImFjcGlfc2NpPWxldmVsIikpCi0JCQlhY3BpX3NjaV9mbGFncy50cmlnZ2VyID0gMzsKLQkJZWxzZSBpZiAoZnVsbGFyZyhmcm9tLCAiYWNwaV9zY2k9aGlnaCIpKQotCQkJYWNwaV9zY2lfZmxhZ3MucG9sYXJpdHkgPSAxOwotCQllbHNlIGlmIChmdWxsYXJnKGZyb20sICJhY3BpX3NjaT1sb3ciKSkKLQkJCWFjcGlfc2NpX2ZsYWdzLnBvbGFyaXR5ID0gMzsKLQotCQkvKiBhY3BpPXN0cmljdCBkaXNhYmxlcyBvdXQtb2Ytc3BlYyB3b3JrYXJvdW5kcyAqLwotCQllbHNlIGlmIChmdWxsYXJnKGZyb20sICJhY3BpPXN0cmljdCIpKSB7Ci0JCQlhY3BpX3N0cmljdCA9IDE7Ci0JCX0KLSNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKLQkJZWxzZSBpZiAoZnVsbGFyZyhmcm9tLCAiYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlIikpCi0JCQlhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUgPSAxOwotI2VuZGlmCi0jZW5kaWYKLQotCQlpZiAoZnVsbGFyZyhmcm9tLCAiZGlzYWJsZV90aW1lcl9waW5fMSIpKQotCQkJZGlzYWJsZV90aW1lcl9waW5fMSA9IDE7Ci0JCWlmIChmdWxsYXJnKGZyb20sICJlbmFibGVfdGltZXJfcGluXzEiKSkKLQkJCWRpc2FibGVfdGltZXJfcGluXzEgPSAtMTsKLQotCQlpZiAoZnVsbGFyZyhmcm9tLCAibm9sYXBpYyIpIHx8IGZ1bGxhcmcoZnJvbSwgImRpc2FibGVhcGljIikpIHsKLQkJCWNsZWFyX2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKLQkJCWRpc2FibGVfYXBpYyA9IDE7Ci0JCX0KLQotCQlpZiAoZnVsbGFyZyhmcm9tLCAibm9hcGljIikpCi0JCQlza2lwX2lvYXBpY19zZXR1cCA9IDE7Ci0KLQkJaWYgKGZ1bGxhcmcoZnJvbSwiYXBpYyIpKSB7Ci0JCQlza2lwX2lvYXBpY19zZXR1cCA9IDA7Ci0JCQlpb2FwaWNfZm9yY2UgPSAxOwotCQl9Ci0JCQkKLQkJaWYgKCFtZW1jbXAoZnJvbSwgIm1lbT0iLCA0KSkKLQkJCXBhcnNlX21lbW9wdChmcm9tKzQsICZmcm9tKTsgCi0KLQkJaWYgKCFtZW1jbXAoZnJvbSwgIm1lbW1hcD0iLCA3KSkgewotCQkJLyogZXhhY3RtYXAgb3B0aW9uIGlzIGZvciB1c2VkIGRlZmluZWQgbWVtb3J5ICovCi0JCQlpZiAoIW1lbWNtcChmcm9tKzcsICJleGFjdG1hcCIsIDgpKSB7Ci0jaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKLQkJCQkvKiBJZiB3ZSBhcmUgZG9pbmcgYSBjcmFzaCBkdW1wLCB3ZQotCQkJCSAqIHN0aWxsIG5lZWQgdG8ga25vdyB0aGUgcmVhbCBtZW0KLQkJCQkgKiBzaXplIGJlZm9yZSBvcmlnaW5hbCBtZW1vcnkgbWFwIGlzCi0JCQkJICogcmVzZXQuCi0JCQkJICovCi0JCQkJc2F2ZWRfbWF4X3BmbiA9IGU4MjBfZW5kX29mX3JhbSgpOwotI2VuZGlmCi0JCQkJZnJvbSArPSA4Kzc7Ci0JCQkJZW5kX3Bmbl9tYXAgPSAwOwotCQkJCWU4MjAubnJfbWFwID0gMDsKLQkJCQl1c2VyZGVmID0gMTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcnNlX21lbW1hcG9wdChmcm9tKzcsICZmcm9tKTsKLQkJCQl1c2VyZGVmID0gMTsKLQkJCX0KLQkJfQotCi0jaWZkZWYgQ09ORklHX05VTUEKLQkJaWYgKCFtZW1jbXAoZnJvbSwgIm51bWE9IiwgNSkpCi0JCQludW1hX3NldHVwKGZyb20rNSk7IAotI2VuZGlmCi0KLQkJaWYgKCFtZW1jbXAoZnJvbSwiaW9tbXU9Iiw2KSkgeyAKLQkJCWlvbW11X3NldHVwKGZyb20rNik7IAotCQl9Ci0KLQkJaWYgKGZ1bGxhcmcoZnJvbSwib29wcz1wYW5pYyIpKQotCQkJcGFuaWNfb25fb29wcyA9IDE7Ci0KLQkJaWYgKCFtZW1jbXAoZnJvbSwgIm5vZXhlYz0iLCA3KSkKLQkJCW5vbnhfc2V0dXAoZnJvbSArIDcpOwotCi0jaWZkZWYgQ09ORklHX0tFWEVDCi0JCS8qIGNyYXNoa2VybmVsPXNpemVAYWRkciBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIHRvIHJlc2VydmUgZm9yCi0JCSAqIGEgY3Jhc2gga2VybmVsLiAgQnkgcmVzZXJ2aW5nIHRoaXMgbWVtb3J5IHdlIGd1YXJhbnRlZQotCQkgKiB0aGF0IGxpbnV4IG5ldmVyIHNldCdzIGl0IHVwIGFzIGEgRE1BIHRhcmdldC4KLQkJICogVXNlZnVsIGZvciBob2xkaW5nIGNvZGUgdG8gZG8gc29tZXRoaW5nIGFwcHJvcHJpYXRlCi0JCSAqIGFmdGVyIGEga2VybmVsIHBhbmljLgotCQkgKi8KLQkJZWxzZSBpZiAoIW1lbWNtcChmcm9tLCAiY3Jhc2hrZXJuZWw9IiwgMTIpKSB7Ci0JCQl1bnNpZ25lZCBsb25nIHNpemUsIGJhc2U7Ci0JCQlzaXplID0gbWVtcGFyc2UoZnJvbSsxMiwgJmZyb20pOwotCQkJaWYgKCpmcm9tID09ICdAJykgewotCQkJCWJhc2UgPSBtZW1wYXJzZShmcm9tKzEsICZmcm9tKTsKLQkJCQkvKiBGSVhNRTogRG8gSSB3YW50IGEgc2FuaXR5IGNoZWNrCi0JCQkJICogdG8gdmFsaWRhdGUgdGhlIG1lbW9yeSByYW5nZT8KLQkJCQkgKi8KLQkJCQljcmFzaGtfcmVzLnN0YXJ0ID0gYmFzZTsKLQkJCQljcmFzaGtfcmVzLmVuZCAgID0gYmFzZSArIHNpemUgLSAxOwotCQkJfQotCQl9Ci0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19QUk9DX1ZNQ09SRQotCQkvKiBlbGZjb3JlaGRyPSBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIGVsZiBjb3JlIGhlYWRlcgotCQkgKiBzdG9yZWQgYnkgdGhlIGNyYXNoZWQga2VybmVsLiBUaGlzIG9wdGlvbiB3aWxsIGJlIHBhc3NlZAotCQkgKiBieSBrZXhlYyBsb2FkZXIgdG8gdGhlIGNhcHR1cmUga2VybmVsLgotCQkgKi8KLQkJZWxzZSBpZighbWVtY21wKGZyb20sICJlbGZjb3JlaGRyPSIsIDExKSkKLQkJCWVsZmNvcmVoZHJfYWRkciA9IG1lbXBhcnNlKGZyb20rMTEsICZmcm9tKTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0JCWVsc2UgaWYgKCFtZW1jbXAoZnJvbSwgImFkZGl0aW9uYWxfY3B1cz0iLCAxNikpCi0JCQlzZXR1cF9hZGRpdGlvbmFsX2NwdXMoZnJvbSsxNik7Ci0jZW5kaWYKLQotCW5leHRfY2hhcjoKLQkJYyA9ICooZnJvbSsrKTsKLQkJaWYgKCFjKQotCQkJYnJlYWs7Ci0JCWlmIChDT01NQU5EX0xJTkVfU0laRSA8PSArK2xlbikKLQkJCWJyZWFrOwotCQkqKHRvKyspID0gYzsKLQl9Ci0JaWYgKHVzZXJkZWYpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAidXNlci1kZWZpbmVkIHBoeXNpY2FsIFJBTSBtYXA6XG4iKTsKLQkJZTgyMF9wcmludF9tYXAoInVzZXIiKTsKLQl9Ci0JKnRvID0gJ1wwJzsKLQkqY21kbGluZV9wID0gY29tbWFuZF9saW5lOworLyogZWxmY29yZWhkcj0gc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBlbGYgY29yZSBoZWFkZXIKKyAqIHN0b3JlZCBieSB0aGUgY3Jhc2hlZCBrZXJuZWwuIFRoaXMgb3B0aW9uIHdpbGwgYmUgcGFzc2VkCisgKiBieSBrZXhlYyBsb2FkZXIgdG8gdGhlIGNhcHR1cmUga2VybmVsLgorICovCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9lbGZjb3JlaGRyKGNoYXIgKmFyZykKK3sKKwljaGFyICplbmQ7CisJaWYgKCFhcmcpCisJCXJldHVybiAtRUlOVkFMOworCWVsZmNvcmVoZHJfYWRkciA9IG1lbXBhcnNlKGFyZywgJmVuZCk7CisJcmV0dXJuIGVuZCA+IGFyZyA/IDAgOiAtRUlOVkFMOwogfQorZWFybHlfcGFyYW0oImVsZmNvcmVoZHIiLCBzZXR1cF9lbGZjb3JlaGRyKTsKKyNlbmRpZgogCiAjaWZuZGVmIENPTkZJR19OVU1BCiBzdGF0aWMgdm9pZCBfX2luaXQKQEAgLTQ2Niw3ICsyOTIsOCBAQAogCWlmIChib290bWFwID09IC0xTCkKIAkJcGFuaWMoIkNhbm5vdCBmaW5kIGJvb3RtZW0gbWFwIG9mIHNpemUgJWxkXG4iLGJvb3RtYXBfc2l6ZSk7CiAJYm9vdG1hcF9zaXplID0gaW5pdF9ib290bWVtKGJvb3RtYXAgPj4gUEFHRV9TSElGVCwgZW5kX3Bmbik7Ci0JZTgyMF9ib290bWVtX2ZyZWUoTk9ERV9EQVRBKDApLCAwLCBlbmRfcGZuIDw8IFBBR0VfU0hJRlQpOworCWU4MjBfcmVnaXN0ZXJfYWN0aXZlX3JlZ2lvbnMoMCwgc3RhcnRfcGZuLCBlbmRfcGZuKTsKKwlmcmVlX2Jvb3RtZW1fd2l0aF9hY3RpdmVfcmVnaW9ucygwLCBlbmRfcGZuKTsKIAlyZXNlcnZlX2Jvb3RtZW0oYm9vdG1hcCwgYm9vdG1hcF9zaXplKTsKIH0gCiAjZW5kaWYKQEAgLTUyMSw2ICszNDgsOCBAQAogCiB2b2lkIF9faW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCiB7CisJcHJpbnRrKEtFUk5fSU5GTyAiQ29tbWFuZCBsaW5lOiAlc1xuIiwgc2F2ZWRfY29tbWFuZF9saW5lKTsKKwogIAlST09UX0RFViA9IG9sZF9kZWNvZGVfZGV2KE9SSUdfUk9PVF9ERVYpOwogIAlzY3JlZW5faW5mbyA9IFNDUkVFTl9JTkZPOwogCWVkaWRfaW5mbyA9IEVESURfSU5GTzsKQEAgLTU0NywxNiArMzc2LDIyIEBACiAJZGF0YV9yZXNvdXJjZS5zdGFydCA9IHZpcnRfdG9fcGh5cygmX2V0ZXh0KTsKIAlkYXRhX3Jlc291cmNlLmVuZCA9IHZpcnRfdG9fcGh5cygmX2VkYXRhKS0xOwogCi0JcGFyc2VfY21kbGluZV9lYXJseShjbWRsaW5lX3ApOwotCiAJZWFybHlfaWRlbnRpZnlfY3B1KCZib290X2NwdV9kYXRhKTsKIAorCXN0cmxjcHkoY29tbWFuZF9saW5lLCBzYXZlZF9jb21tYW5kX2xpbmUsIENPTU1BTkRfTElORV9TSVpFKTsKKwkqY21kbGluZV9wID0gY29tbWFuZF9saW5lOworCisJcGFyc2VfZWFybHlfcGFyYW0oKTsKKworCWZpbmlzaF9lODIwX3BhcnNpbmcoKTsKKworCWU4MjBfcmVnaXN0ZXJfYWN0aXZlX3JlZ2lvbnMoMCwgMCwgLTFVTCk7CiAJLyoKIAkgKiBwYXJ0aWFsbHkgdXNlZCBwYWdlcyBhcmUgbm90IHVzYWJsZSAtIHRodXMKIAkgKiB3ZSBhcmUgcm91bmRpbmcgdXB3YXJkczoKIAkgKi8KIAllbmRfcGZuID0gZTgyMF9lbmRfb2ZfcmFtKCk7Ci0JbnVtX3BoeXNwYWdlcyA9IGVuZF9wZm47CQkvKiBmb3IgcGZuX3ZhbGlkICovCisJbnVtX3BoeXNwYWdlcyA9IGVuZF9wZm47CiAKIAljaGVja19lZmVyKCk7CiAKQEAgLTU3Niw2ICs0MTEsMTQgQEAKIAlhY3BpX2Jvb3RfdGFibGVfaW5pdCgpOwogI2VuZGlmCiAKKwkvKiBIb3cgbWFueSBlbmQtb2YtbWVtb3J5IHZhcmlhYmxlcyB5b3UgaGF2ZSwgZ3JhbmRtYSEgKi8KKwltYXhfbG93X3BmbiA9IGVuZF9wZm47CisJbWF4X3BmbiA9IGVuZF9wZm47CisJaGlnaF9tZW1vcnkgPSAodm9pZCAqKV9fdmEoZW5kX3BmbiAqIFBBR0VfU0laRSAtIDEpICsgMTsKKworCS8qIFJlbW92ZSBhY3RpdmUgcmFuZ2VzIHNvIHJlZGlzY292ZXJ5IHdpdGggTlVNQS1hd2FyZW5lc3MgaGFwcGVucyAqLworCXJlbW92ZV9hbGxfYWN0aXZlX3JhbmdlcygpOworCiAjaWZkZWYgQ09ORklHX0FDUElfTlVNQQogCS8qCiAJICogUGFyc2UgU1JBVCB0byBkaXNjb3ZlciBub2Rlcy4KQEAgLTYyNSwxMiArNDY4LDEwIEBACiAgICAgICAgICovCiAgICAgICAgYWNwaV9yZXNlcnZlX2Jvb3RtZW0oKTsKICNlbmRpZgotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogCS8qCiAJICogRmluZCBhbmQgcmVzZXJ2ZSBwb3NzaWJsZSBib290LXRpbWUgU01QIGNvbmZpZ3VyYXRpb246CiAJICovCiAJZmluZF9zbXBfY29uZmlnKCk7Ci0jZW5kaWYKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKIAlpZiAoTE9BREVSX1RZUEUgJiYgSU5JVFJEX1NUQVJUKSB7CiAJCWlmIChJTklUUkRfU1RBUlQgKyBJTklUUkRfU0laRSA8PSAoZW5kX3BmbiA8PCBQQUdFX1NISUZUKSkgewpAQCAtNjU3LDcgKzQ5OCw5IEBACiAKIAlwYWdpbmdfaW5pdCgpOwogCi0JY2hlY2tfaW9hcGljKCk7CisjaWZkZWYgQ09ORklHX1BDSQorCWVhcmx5X3F1aXJrcygpOworI2VuZGlmCiAKIAkvKgogCSAqIHNldCB0aGlzIGVhcmx5LCBzbyB3ZSBkb250IGFsbG9jYXRlIGNwdTAKQEAgLTY3NCwxNCArNTE3LDEyIEBACiAKIAlpbml0X2NwdV90b19ub2RlKCk7CiAKLSNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIAkvKgogCSAqIGdldCBib290LXRpbWUgU01QIGNvbmZpZ3VyYXRpb246CiAJICovCiAJaWYgKHNtcF9mb3VuZF9jb25maWcpCiAJCWdldF9zbXBfY29uZmlnKCk7CiAJaW5pdF9hcGljX21hcHBpbmdzKCk7Ci0jZW5kaWYKIAogCS8qCiAJICogUmVxdWVzdCBhZGRyZXNzIHNwYWNlIGZvciBhbGwgc3RhbmRhcmQgUkFNIGFuZCBST00gcmVzb3VyY2VzCkBAIC04MzksNyArNjgwLDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9hbWQoc3RydWN0IGNwdWluZm9feDg2ICpjKQorc3RhdGljIHZvaWQgX19jcHVpbml0IGluaXRfYW1kKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKIAl1bnNpZ25lZCBsZXZlbDsKIApAQCAtODk1LDYgKzczNiwxMiBAQAogCiAJLyogRml4IGNwdWlkNCBlbXVsYXRpb24gZm9yIG1vcmUgKi8KIAludW1fY2FjaGVfbGVhdmVzID0gMzsKKworCS8qIFdoZW4gdGhlcmUgaXMgb25seSBvbmUgY29yZSBubyBuZWVkIHRvIHN5bmNocm9uaXplIFJEVFNDICovCisJaWYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPT0gMSkKKwkgICAgICAgIHNldF9iaXQoWDg2X0ZFQVRVUkVfU1lOQ19SRFRTQywgJmMtPng4Nl9jYXBhYmlsaXR5KTsKKwllbHNlCisJICAgICAgICBjbGVhcl9iaXQoWDg2X0ZFQVRVUkVfU1lOQ19SRFRTQywgJmMtPng4Nl9jYXBhYmlsaXR5KTsKIH0KIAogc3RhdGljIHZvaWQgX19jcHVpbml0IGRldGVjdF9odChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCkBAIC05NzYsOCArODIzLDcgQEAKIAkJbm9kZSA9IGZpcnN0X25vZGUobm9kZV9vbmxpbmVfbWFwKTsKIAludW1hX3NldF9ub2RlKGNwdSwgbm9kZSk7CiAKLQlpZiAoYWNwaV9udW1hID4gMCkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVICVkLyV4IC0+IE5vZGUgJWRcbiIsIGNwdSwgYXBpY2lkLCBub2RlKTsKKwlwcmludGsoS0VSTl9JTkZPICJDUFUgJWQvJXggLT4gTm9kZSAlZFxuIiwgY3B1LCBhcGljaWQsIG5vZGUpOwogI2VuZGlmCiB9CiAKQEAgLTEwMTEsNiArODU3LDggQEAKIAlpZiAoKGMtPng4NiA9PSAweGYgJiYgYy0+eDg2X21vZGVsID49IDB4MDMpIHx8CiAJICAgIChjLT54ODYgPT0gMHg2ICYmIGMtPng4Nl9tb2RlbCA+PSAweDBlKSkKIAkJc2V0X2JpdChYODZfRkVBVFVSRV9DT05TVEFOVF9UU0MsICZjLT54ODZfY2FwYWJpbGl0eSk7CisJaWYgKGMtPng4NiA9PSA2KQorCQlzZXRfYml0KFg4Nl9GRUFUVVJFX1JFUF9HT09ELCAmYy0+eDg2X2NhcGFiaWxpdHkpOwogCXNldF9iaXQoWDg2X0ZFQVRVUkVfU1lOQ19SRFRTQywgJmMtPng4Nl9jYXBhYmlsaXR5KTsKICAJYy0+eDg2X21heF9jb3JlcyA9IGludGVsX251bV9jcHVfY29yZXMoYyk7CiAKQEAgLTEyMjksOCArMTA3Nyw4IEBACiAKIAkJLyogSW50ZWwtZGVmaW5lZCAoIzIpICovCiAJCSJwbmkiLCBOVUxMLCBOVUxMLCAibW9uaXRvciIsICJkc19jcGwiLCAidm14IiwgInNteCIsICJlc3QiLAotCQkidG0yIiwgTlVMTCwgImNpZCIsIE5VTEwsIE5VTEwsICJjeDE2IiwgInh0cHIiLCBOVUxMLAotCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCQkidG0yIiwgInNzc2UzIiwgImNpZCIsIE5VTEwsIE5VTEwsICJjeDE2IiwgInh0cHIiLCBOVUxMLAorCQlOVUxMLCBOVUxMLCAiZGNhIiwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKIAogCQkvKiBWSUEvQ3lyaXgvQ2VudGF1ci1kZWZpbmVkICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXA2NC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NldHVwNjQuYwppbmRleCA0MTdkZTU2Li44YzRiODBmIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXA2NC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cDY0LmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxhc20vcHJvdG8uaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KIAotY2hhciB4ODZfYm9vdF9wYXJhbXNbQk9PVF9QQVJBTV9TSVpFXSBfX2luaXRkYXRhID0gezAsfTsKK2NoYXIgeDg2X2Jvb3RfcGFyYW1zW0JPT1RfUEFSQU1fU0laRV0gX19pbml0ZGF0YTsKIAogY3B1bWFza190IGNwdV9pbml0aWFsaXplZCBfX2NwdWluaXRkYXRhID0gQ1BVX01BU0tfTk9ORTsKIApAQCAtNDYsOCArNDYsMTAgQEAKIG9uCUVuYWJsZShkZWZhdWx0KQogb2ZmCURpc2FibGUKICovIAotaW50IF9faW5pdCBub254X3NldHVwKGNoYXIgKnN0cikKK3N0YXRpYyBpbnQgX19pbml0IG5vbnhfc2V0dXAoY2hhciAqc3RyKQogeworCWlmICghc3RyKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIXN0cm5jbXAoc3RyLCAib24iLCAyKSkgewogICAgICAgICAgICAgICAgIF9fc3VwcG9ydGVkX3B0ZV9tYXNrIHw9IF9QQUdFX05YOyAKICAJCWRvX25vdF9ueCA9IDA7IApAQCAtNTUsOSArNTcsOSBAQAogCQlkb19ub3RfbnggPSAxOwogCQlfX3N1cHBvcnRlZF9wdGVfbWFzayAmPSB+X1BBR0VfTlg7CiAgICAgICAgIH0KLQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKIH0gCi1fX3NldHVwKCJub2V4ZWM9Iiwgbm9ueF9zZXR1cCk7CS8qIHBhcnNlZCBlYXJseSBhY3R1YWxseSAqLworZWFybHlfcGFyYW0oIm5vZXhlYyIsIG5vbnhfc2V0dXApOwogCiBpbnQgZm9yY2VfcGVyc29uYWxpdHkzMiA9IDA7IAogCkBAIC05MywxMiArOTUsOSBAQAogI2VuZGlmCiAKIAkvKiBDb3B5IHNlY3Rpb24gZm9yIGVhY2ggQ1BVICh3ZSBkaXNjYXJkIHRoZSBvcmlnaW5hbCkgKi8KLQlzaXplID0gQUxJR04oX19wZXJfY3B1X2VuZCAtIF9fcGVyX2NwdV9zdGFydCwgU01QX0NBQ0hFX0JZVEVTKTsKLSNpZmRlZiBDT05GSUdfTU9EVUxFUwotCWlmIChzaXplIDwgUEVSQ1BVX0VOT1VHSF9ST09NKQotCQlzaXplID0gUEVSQ1BVX0VOT1VHSF9ST09NOwotI2VuZGlmCisJc2l6ZSA9IFBFUkNQVV9FTk9VR0hfUk9PTTsKIAorCXByaW50ayhLRVJOX0lORk8gIlBFUkNQVTogQWxsb2NhdGluZyAlbHUgYnl0ZXMgb2YgcGVyIGNwdSBkYXRhXG4iLCBzaXplKTsKIAlmb3JfZWFjaF9jcHVfbWFzayAoaSwgY3B1X3Bvc3NpYmxlX21hcCkgewogCQljaGFyICpwdHI7CiAKQEAgLTEyMiw3ICsxMjEsMTAgQEAKIAogCS8qIFNldHVwIHVwIGRhdGEgdGhhdCBtYXkgYmUgbmVlZGVkIGluIF9fZ2V0X2ZyZWVfcGFnZXMgZWFybHkgKi8KIAlhc20gdm9sYXRpbGUoIm1vdmwgJTAsJSVmcyA7IG1vdmwgJTAsJSVncyIgOjogInIiICgwKSk7IAorCS8qIE1lbW9yeSBjbG9iYmVycyB1c2VkIHRvIG9yZGVyIFBEQSBhY2Nlc3NlZCAqLworCW1iKCk7CiAJd3Jtc3JsKE1TUl9HU19CQVNFLCBwZGEpOworCW1iKCk7CiAKIAlwZGEtPmNwdW51bWJlciA9IGNwdTsgCiAJcGRhLT5pcnFjb3VudCA9IC0xOwpAQCAtMTc4LDYgKzE4MCw4IEBACiAgICAgICAgIH0gICAgICAgCiB9CiAKK3Vuc2lnbmVkIGxvbmcga2VybmVsX2VmbGFnczsKKwogLyoKICAqIGNwdV9pbml0KCkgaW5pdGlhbGl6ZXMgc3RhdGUgdGhhdCBpcyBwZXItQ1BVLiBTb21lIGRhdGEgaXMgYWxyZWFkeQogICogaW5pdGlhbGl6ZWQgKG5hdHVyYWxseSkgaW4gdGhlIGJvb3RzdHJhcCBwcm9jZXNzLCBzdWNoIGFzIHRoZSBHRFQKQEAgLTIzNSwyOCArMjM5LDE3IEBACiAJICogc2V0IHVwIGFuZCBsb2FkIHRoZSBwZXItQ1BVIFRTUwogCSAqLwogCWZvciAodiA9IDA7IHYgPCBOX0VYQ0VQVElPTl9TVEFDS1M7IHYrKykgeworCQlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG9yZGVyW05fRVhDRVBUSU9OX1NUQUNLU10gPSB7CisJCQlbMCAuLi4gTl9FWENFUFRJT05fU1RBQ0tTIC0gMV0gPSBFWENFUFRJT05fU1RBQ0tfT1JERVIsCisJCQlbREVCVUdfU1RBQ0sgLSAxXSA9IERFQlVHX1NUQUNLX09SREVSCisJCX07CiAJCWlmIChjcHUpIHsKLQkJCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgb3JkZXJbTl9FWENFUFRJT05fU1RBQ0tTXSA9IHsKLQkJCQlbMCAuLi4gTl9FWENFUFRJT05fU1RBQ0tTIC0gMV0gPSBFWENFUFRJT05fU1RBQ0tfT1JERVIsCi0JCQkJW0RFQlVHX1NUQUNLIC0gMV0gPSBERUJVR19TVEFDS19PUkRFUgotCQkJfTsKLQogCQkJZXN0YWNrcyA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDLCBvcmRlclt2XSk7CiAJCQlpZiAoIWVzdGFja3MpCiAJCQkJcGFuaWMoIkNhbm5vdCBhbGxvY2F0ZSBleGNlcHRpb24gc3RhY2sgJWxkICVkXG4iLAogCQkJCSAgICAgIHYsIGNwdSk7IAogCQl9Ci0JCXN3aXRjaCAodiArIDEpIHsKLSNpZiBERUJVR19TVEtTWiA+IEVYQ0VQVElPTl9TVEtTWgotCQljYXNlIERFQlVHX1NUQUNLOgotCQkJY3B1X3BkYShjcHUpLT5kZWJ1Z3N0YWNrID0gKHVuc2lnbmVkIGxvbmcpZXN0YWNrczsKLQkJCWVzdGFja3MgKz0gREVCVUdfU1RLU1o7Ci0JCQlicmVhazsKLSNlbmRpZgotCQlkZWZhdWx0OgotCQkJZXN0YWNrcyArPSBFWENFUFRJT05fU1RLU1o7Ci0JCQlicmVhazsKLQkJfQorCQllc3RhY2tzICs9IFBBR0VfU0laRSA8PCBvcmRlclt2XTsKIAkJb3JpZ19pc3QtPmlzdFt2XSA9IHQtPmlzdFt2XSA9ICh1bnNpZ25lZCBsb25nKWVzdGFja3M7CiAJfQogCkBAIC0yOTAsNCArMjgzLDYgQEAKIAlzZXRfZGVidWdyZWcoMFVMLCA3KTsKIAogCWZwdV9pbml0KCk7IAorCisJcmF3X2xvY2FsX3NhdmVfZmxhZ3Moa2VybmVsX2VmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggMjgxNjExNy4uNDllYzMyNCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zaWduYWwuYwpAQCAtMzgsMzcgKzM4LDYgQEAKICAgICAgICAgICAgIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncyk7IAogCiBhc21saW5rYWdlIGxvbmcKLXN5c19ydF9zaWdzdXNwZW5kKHNpZ3NldF90IF9fdXNlciAqdW5ld3NldCwgc2l6ZV90IHNpZ3NldHNpemUsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXNpZ3NldF90IHNhdmVzZXQsIG5ld3NldDsKLQotCS8qIFhYWDogRG9uJ3QgcHJlY2x1ZGUgaGFuZGxpbmcgZGlmZmVyZW50IHNpemVkIHNpZ3NldF90J3MuICAqLwotCWlmIChzaWdzZXRzaXplICE9IHNpemVvZihzaWdzZXRfdCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZuZXdzZXQsIHVuZXdzZXQsIHNpemVvZihuZXdzZXQpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0Jc2lnZGVsc2V0bWFzaygmbmV3c2V0LCB+X0JMT0NLQUJMRSk7Ci0KLQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQlzYXZlc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKLQljdXJyZW50LT5ibG9ja2VkID0gbmV3c2V0OwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLSNpZmRlZiBERUJVR19TSUcKLQlwcmludGsoInJ0X3NpZ3N1c3BlbmQgc2F2c2V0KCVseCkgbmV3c2V0KCVseCkgcmVncyglcCkgcmlwKCVseClcbiIsCi0JCXNhdmVzZXQsIG5ld3NldCwgcmVncywgcmVncy0+cmlwKTsKLSNlbmRpZiAKLQlyZWdzLT5yYXggPSAtRUlOVFI7Ci0Jd2hpbGUgKDEpIHsKLQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7Ci0JCXNjaGVkdWxlKCk7Ci0JCWlmIChkb19zaWduYWwocmVncywgJnNhdmVzZXQpKQotCQkJcmV0dXJuIC1FSU5UUjsKLQl9Ci19Ci0KLWFzbWxpbmthZ2UgbG9uZwogc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICp1c3MsIHN0YWNrX3QgX191c2VyICp1b3NzLAogCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKQEAgLTMwOCwxMSArMjc3LDYgQEAKICNlbmRpZgogCiAJLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KLQl7IAotCQlzdHJ1Y3QgZXhlY19kb21haW4gKmVkID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbjsKLQkJaWYgKHVubGlrZWx5KGVkICYmIGVkLT5zaWduYWxfaW52bWFwICYmIHNpZyA8IDMyKSkKLQkJCXNpZyA9IGVkLT5zaWduYWxfaW52bWFwW3NpZ107Ci0JfSAKIAlyZWdzLT5yZGkgPSBzaWc7CiAJLyogSW4gY2FzZSB0aGUgc2lnbmFsIGhhbmRsZXIgd2FzIGRlY2xhcmVkIHdpdGhvdXQgcHJvdG90eXBlcyAqLyAKIAlyZWdzLT5yYXggPSAwOwkKQEAgLTM0MSwxMSArMzA1LDExIEBACiAJCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgZnJhbWUsIHJlZ3MtPnJpcCwgZnJhbWUtPnByZXRjb2RlKTsKICNlbmRpZgogCi0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiAKIGdpdmVfc2lnc2VndjoKIAlmb3JjZV9zaWdzZWd2KHNpZywgY3VycmVudCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKIC8qCkBAIC00MDgsNyArMzcyLDcgQEAKICNlbmRpZgogCXJldCA9IHNldHVwX3J0X2ZyYW1lKHNpZywga2EsIGluZm8sIG9sZHNldCwgcmVncyk7CiAKLQlpZiAocmV0KSB7CisJaWYgKHJldCA9PSAwKSB7CiAJCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwogCQlzaWdvcnNldHMoJmN1cnJlbnQtPmJsb2NrZWQsJmN1cnJlbnQtPmJsb2NrZWQsJmthLT5zYS5zYV9tYXNrKTsKIAkJaWYgKCEoa2EtPnNhLnNhX2ZsYWdzICYgU0FfTk9ERUZFUikpCkBAIC00MjUsMTEgKzM4OSwxMiBAQAogICogd2FudCB0byBoYW5kbGUuIFRodXMgeW91IGNhbm5vdCBraWxsIGluaXQgZXZlbiB3aXRoIGEgU0lHS0lMTCBldmVuIGJ5CiAgKiBtaXN0YWtlLgogICovCi1pbnQgZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzaWdzZXRfdCAqb2xkc2V0KQorc3RhdGljIHZvaWQgZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBrX3NpZ2FjdGlvbiBrYTsKIAlzaWdpbmZvX3QgaW5mbzsKIAlpbnQgc2lnbnI7CisJc2lnc2V0X3QgKm9sZHNldDsKIAogCS8qCiAJICogV2Ugd2FudCB0aGUgY29tbW9uIGNhc2UgdG8gZ28gZmFzdCwgd2hpY2gKQEAgLTQzOCw5ICs0MDMsMTEgQEAKIAkgKiBpZiBzby4KIAkgKi8KIAlpZiAoIXVzZXJfbW9kZShyZWdzKSkKLQkJcmV0dXJuIDE7CisJCXJldHVybjsKIAotCWlmICghb2xkc2V0KQorCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9SRVNUT1JFX1NJR01BU0spKQorCQlvbGRzZXQgPSAmY3VycmVudC0+c2F2ZWRfc2lnbWFzazsKKwllbHNlCiAJCW9sZHNldCA9ICZjdXJyZW50LT5ibG9ja2VkOwogCiAJc2lnbnIgPSBnZXRfc2lnbmFsX3RvX2RlbGl2ZXIoJmluZm8sICZrYSwgcmVncywgTlVMTCk7CkBAIC00NTQsMzAgKzQyMSw0NiBAQAogCQkJc2V0X2RlYnVncmVnKGN1cnJlbnQtPnRocmVhZC5kZWJ1Z3JlZzcsIDcpOwogCiAJCS8qIFdoZWUhICBBY3R1YWxseSBkZWxpdmVyIHRoZSBzaWduYWwuICAqLwotCQlyZXR1cm4gaGFuZGxlX3NpZ25hbChzaWduciwgJmluZm8sICZrYSwgb2xkc2V0LCByZWdzKTsKKwkJaWYgKGhhbmRsZV9zaWduYWwoc2lnbnIsICZpbmZvLCAma2EsIG9sZHNldCwgcmVncykgPT0gMCkgeworCQkJLyogYSBzaWduYWwgd2FzIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQ7IHRoZSBzYXZlZAorCQkJICogc2lnbWFzayB3aWxsIGhhdmUgYmVlbiBzdG9yZWQgaW4gdGhlIHNpZ25hbCBmcmFtZSwKKwkJCSAqIGFuZCB3aWxsIGJlIHJlc3RvcmVkIGJ5IHNpZ3JldHVybiwgc28gd2UgY2FuIHNpbXBseQorCQkJICogY2xlYXIgdGhlIFRJRl9SRVNUT1JFX1NJR01BU0sgZmxhZyAqLworCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1JFU1RPUkVfU0lHTUFTSyk7CisJCX0KKwkJcmV0dXJuOwogCX0KIAogCS8qIERpZCB3ZSBjb21lIGZyb20gYSBzeXN0ZW0gY2FsbD8gKi8KIAlpZiAoKGxvbmcpcmVncy0+b3JpZ19yYXggPj0gMCkgewogCQkvKiBSZXN0YXJ0IHRoZSBzeXN0ZW0gY2FsbCAtIG5vIGhhbmRsZXJzIHByZXNlbnQgKi8KIAkJbG9uZyByZXMgPSByZWdzLT5yYXg7Ci0JCWlmIChyZXMgPT0gLUVSRVNUQVJUTk9IQU5EIHx8Ci0JCSAgICByZXMgPT0gLUVSRVNUQVJUU1lTIHx8Ci0JCSAgICByZXMgPT0gLUVSRVNUQVJUTk9JTlRSKSB7CisJCXN3aXRjaCAocmVzKSB7CisJCWNhc2UgLUVSRVNUQVJUTk9IQU5EOgorCQljYXNlIC1FUkVTVEFSVFNZUzoKKwkJY2FzZSAtRVJFU1RBUlROT0lOVFI6CiAJCQlyZWdzLT5yYXggPSByZWdzLT5vcmlnX3JheDsKIAkJCXJlZ3MtPnJpcCAtPSAyOwotCQl9Ci0JCWlmIChyZWdzLT5yYXggPT0gKHVuc2lnbmVkIGxvbmcpLUVSRVNUQVJUX1JFU1RBUlRCTE9DSykgeworCQkJYnJlYWs7CisJCWNhc2UgLUVSRVNUQVJUX1JFU1RBUlRCTE9DSzoKIAkJCXJlZ3MtPnJheCA9IHRlc3RfdGhyZWFkX2ZsYWcoVElGX0lBMzIpID8KIAkJCQkJX19OUl9pYTMyX3Jlc3RhcnRfc3lzY2FsbCA6CiAJCQkJCV9fTlJfcmVzdGFydF9zeXNjYWxsOwogCQkJcmVncy0+cmlwIC09IDI7CisJCQlicmVhazsKIAkJfQogCX0KLQlyZXR1cm4gMDsKKworCS8qIGlmIHRoZXJlJ3Mgbm8gc2lnbmFsIHRvIGRlbGl2ZXIsIHdlIGp1c3QgcHV0IHRoZSBzYXZlZCBzaWdtYXNrCisJICAgYmFjay4gKi8KKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKSkgeworCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZjdXJyZW50LT5zYXZlZF9zaWdtYXNrLCBOVUxMKTsKKwl9CiB9CiAKLXZvaWQgZG9fbm90aWZ5X3Jlc3VtZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2lnc2V0X3QgKm9sZHNldCwgX191MzIgdGhyZWFkX2luZm9fZmxhZ3MpCit2b2lkCitkb19ub3RpZnlfcmVzdW1lKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB2b2lkICp1bnVzZWQsIF9fdTMyIHRocmVhZF9pbmZvX2ZsYWdzKQogewogI2lmZGVmIERFQlVHX1NJRwogCXByaW50aygiZG9fbm90aWZ5X3Jlc3VtZSBmbGFnczoleCByaXA6JWx4IHJzcDolbHggY2FsbGVyOiVseCBwZW5kaW5nOiVseFxuIiwKQEAgLTQ5MSw4ICs0NzQsOCBAQAogCX0KIAogCS8qIGRlYWwgd2l0aCBwZW5kaW5nIHNpZ25hbCBkZWxpdmVyeSAqLwotCWlmICh0aHJlYWRfaW5mb19mbGFncyAmIF9USUZfU0lHUEVORElORykKLQkJZG9fc2lnbmFsKHJlZ3Msb2xkc2V0KTsKKwlpZiAodGhyZWFkX2luZm9fZmxhZ3MgJiAoX1RJRl9TSUdQRU5ESU5HfF9USUZfUkVTVE9SRV9TSUdNQVNLKSkKKwkJZG9fc2lnbmFsKHJlZ3MpOwogfQogCiB2b2lkIHNpZ25hbF9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdm9pZCBfX3VzZXIgKmZyYW1lLCBjaGFyICp3aGVyZSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zbXAuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zbXAuYwppbmRleCAwNmFmNmNhLi40ZjY3Njk3IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3NtcC5jCkBAIC01MjIsMjYgKzUyMiwzIEBACiAJfQogfQogCi1pbnQgc2FmZV9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpCi17Ci0JdW5zaWduZWQgYXBpY2lkLCBpOwotCi0JaWYgKGRpc2FibGVfYXBpYykKLQkJcmV0dXJuIDA7Ci0KLQlhcGljaWQgPSBoYXJkX3NtcF9wcm9jZXNzb3JfaWQoKTsKLQlpZiAoYXBpY2lkIDwgTlJfQ1BVUyAmJiB4ODZfY3B1X3RvX2FwaWNpZFthcGljaWRdID09IGFwaWNpZCkKLQkJcmV0dXJuIGFwaWNpZDsKLQotCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyArK2kpIHsKLQkJaWYgKHg4Nl9jcHVfdG9fYXBpY2lkW2ldID09IGFwaWNpZCkKLQkJCXJldHVybiBpOwotCX0KLQotCS8qIE5vIGVudHJpZXMgaW4geDg2X2NwdV90b19hcGljaWQ/ICBFaXRoZXIgbm8gTVBTfEFDUEksCi0JICogb3IgY2FsbGVkIHRvbyBlYXJseS4gIEVpdGhlciB3YXksIHdlIG11c3QgYmUgQ1BVIDAuICovCi0gICAgICAJaWYgKHg4Nl9jcHVfdG9fYXBpY2lkWzBdID09IEJBRF9BUElDSUQpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDA7IC8qIFNob3VsZCBub3QgaGFwcGVuICovCi19CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYwppbmRleCAzYWU5ZmZkLi43YjdhNjg3IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMKQEAgLTEwOTEsNyArMTA5MSw2IEBACiAJLyoKIAkgKiBTd2l0Y2ggZnJvbSBQSUMgdG8gQVBJQyBtb2RlLgogCSAqLwotCWNvbm5lY3RfYnNwX0FQSUMoKTsKIAlzZXR1cF9sb2NhbF9BUElDKCk7CiAKIAlpZiAoR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKSAhPSBib290X2NwdV9pZCkgewpAQCAtMTE3NiwxMiArMTE3NSw5IEBACiB2b2lkIF9faW5pdCBzbXBfY3B1c19kb25lKHVuc2lnbmVkIGludCBtYXhfY3B1cykKIHsKIAlzbXBfY2xlYW51cF9ib290KCk7Ci0KLSNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKIAlzZXR1cF9pb2FwaWNfZGVzdCgpOwotI2VuZGlmCi0KIAljaGVja19ubWlfd2F0Y2hkb2coKTsKKwl0aW1lX2luaXRfZ3RvZCgpOwogfQogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCkBAIC0xMjM0LDYgKzEyMzAsOCBAQAogCWlmIChjcHUgPT0gMCkKIAkJcmV0dXJuIC1FQlVTWTsKIAorCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpCisJCXN0b3BfYXBpY19ubWlfd2F0Y2hkb2coTlVMTCk7CiAJY2xlYXJfbG9jYWxfQVBJQygpOwogCiAJLyoKQEAgLTEyNzMsMTEgKzEyNzEsMTEgQEAKICAJcHJpbnRrKEtFUk5fRVJSICJDUFUgJXUgZGlkbid0IGRpZS4uLlxuIiwgY3B1KTsKIH0KIAotX19pbml0IGludCBzZXR1cF9hZGRpdGlvbmFsX2NwdXMoY2hhciAqcykKK3N0YXRpYyBfX2luaXQgaW50IHNldHVwX2FkZGl0aW9uYWxfY3B1cyhjaGFyICpzKQogewotCXJldHVybiBnZXRfb3B0aW9uKCZzLCAmYWRkaXRpb25hbF9jcHVzKTsKKwlyZXR1cm4gcyAmJiBnZXRfb3B0aW9uKCZzLCAmYWRkaXRpb25hbF9jcHVzKSA/IDAgOiAtRUlOVkFMOwogfQotX19zZXR1cCgiYWRkaXRpb25hbF9jcHVzPSIsIHNldHVwX2FkZGl0aW9uYWxfY3B1cyk7CitlYXJseV9wYXJhbSgiYWRkaXRpb25hbF9jcHVzIiwgc2V0dXBfYWRkaXRpb25hbF9jcHVzKTsKIAogI2Vsc2UgLyogLi4uICFDT05GSUdfSE9UUExVR19DUFUgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3N0YWNrdHJhY2UuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggMzJjZjU1ZS4uNjAyNmIzMSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3N0YWNrdHJhY2UuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc3RhY2t0cmFjZS5jCkBAIC03LDIxNSArNyw0OSBAQAogICovCiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3N0YWNrdHJhY2UuaD4KIAotI2luY2x1ZGUgPGFzbS9zbXAuaD4KLQotc3RhdGljIGlubGluZSBpbnQKLWluX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQpCitzdGF0aWMgdm9pZCBzYXZlX3N0YWNrX3dhcm5pbmcodm9pZCAqZGF0YSwgY2hhciAqbXNnKQogewotCXJldHVybiBhZGRyID49IHN0YXJ0ICYmIGFkZHIgPD0gZW5kOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZwotZ2V0X3N0YWNrX2VuZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgc3RhY2spCitzdGF0aWMgdm9pZAorc2F2ZV9zdGFja193YXJuaW5nX3N5bWJvbCh2b2lkICpkYXRhLCBjaGFyICptc2csIHVuc2lnbmVkIGxvbmcgc3ltYm9sKQogewotCXVuc2lnbmVkIGxvbmcgc3RhY2tfc3RhcnQsIHN0YWNrX2VuZCwgZmxhZ3M7Ci0JaW50IGksIGNwdTsKLQotCS8qCi0JICogVGhlIG1vc3QgY29tbW9uIGNhc2UgaXMgdGhhdCB3ZSBhcmUgaW4gdGhlIHRhc2sgc3RhY2s6Ci0JICovCi0Jc3RhY2tfc3RhcnQgPSAodW5zaWduZWQgbG9uZyl0YXNrLT50aHJlYWRfaW5mbzsKLQlzdGFja19lbmQgPSBzdGFja19zdGFydCArIFRIUkVBRF9TSVpFOwotCi0JaWYgKGluX3JhbmdlKHN0YWNrX3N0YXJ0LCBzdGFjaywgc3RhY2tfZW5kKSkKLQkJcmV0dXJuIHN0YWNrX2VuZDsKLQotCS8qCi0JICogV2UgYXJlIGluIGFuIGludGVycnVwdCBpZiBpcnFzdGFja3B0ciBpcyBzZXQ6Ci0JICovCi0JcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQljcHUgPSBzYWZlX3NtcF9wcm9jZXNzb3JfaWQoKTsKLQlzdGFja19lbmQgPSAodW5zaWduZWQgbG9uZyljcHVfcGRhKGNwdSktPmlycXN0YWNrcHRyOwotCi0JaWYgKHN0YWNrX2VuZCkgewotCQlzdGFja19zdGFydCA9IHN0YWNrX2VuZCAmIH4oSVJRU1RBQ0tTSVpFLTEpOwotCQlpZiAoaW5fcmFuZ2Uoc3RhY2tfc3RhcnQsIHN0YWNrLCBzdGFja19lbmQpKQotCQkJZ290byBvdXRfcmVzdG9yZTsKLQkJLyoKLQkJICogV2UgZ2V0IGhlcmUgaWYgd2UgYXJlIGluIGFuIElSUSBjb250ZXh0IGJ1dCB3ZQotCQkgKiBhcmUgYWxzbyBpbiBhbiBleGNlcHRpb24gc3RhY2suCi0JCSAqLwotCX0KLQotCS8qCi0JICogSXRlcmF0ZSBvdmVyIGFsbCBleGNlcHRpb24gc3RhY2tzLCBhbmQgZmlndXJlIG91dCB3aGV0aGVyCi0JICogJ3N0YWNrJyBpcyBpbiBvbmUgb2YgdGhlbToKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTl9FWENFUFRJT05fU1RBQ0tTOyBpKyspIHsKLQkJLyoKLQkJICogc2V0ICdlbmQnIHRvIHRoZSBlbmQgb2YgdGhlIGV4Y2VwdGlvbiBzdGFjay4KLQkJICovCi0JCXN0YWNrX2VuZCA9IHBlcl9jcHUoaW5pdF90c3MsIGNwdSkuaXN0W2ldOwotCQlzdGFja19zdGFydCA9IHN0YWNrX2VuZCAtIEVYQ0VQVElPTl9TVEtTWjsKLQotCQkvKgotCQkgKiBJcyAnc3RhY2snIGFib3ZlIHRoaXMgZXhjZXB0aW9uIGZyYW1lJ3MgZW5kPwotCQkgKiBJZiB5ZXMgdGhlbiBza2lwIHRvIHRoZSBuZXh0IGZyYW1lLgotCQkgKi8KLQkJaWYgKHN0YWNrID49IHN0YWNrX2VuZCkKLQkJCWNvbnRpbnVlOwotCQkvKgotCQkgKiBJcyAnc3RhY2snIGFib3ZlIHRoaXMgZXhjZXB0aW9uIGZyYW1lJ3Mgc3RhcnQgYWRkcmVzcz8KLQkJICogSWYgeWVzIHRoZW4gd2UgZm91bmQgdGhlIHJpZ2h0IGZyYW1lLgotCQkgKi8KLQkJaWYgKHN0YWNrID49IHN0YWNrX3N0YXJ0KQotCQkJZ290byBvdXRfcmVzdG9yZTsKLQotCQkvKgotCQkgKiBJZiB0aGlzIGlzIGEgZGVidWcgc3RhY2ssIGFuZCBpZiBpdCBoYXMgYSBsYXJnZXIgc2l6ZSB0aGFuCi0JCSAqIHRoZSB1c3VhbCBleGNlcHRpb24gc3RhY2tzLCB0aGVuICdzdGFjaycgbWlnaHQgc3RpbGwKLQkJICogYmUgd2l0aGluIHRoZSBsb3dlciBwb3J0aW9uIG9mIHRoZSBkZWJ1ZyBzdGFjazoKLQkJICovCi0jaWYgREVCVUdfU1RLU1ogPiBFWENFUFRJT05fU1RLU1oKLQkJaWYgKGkgPT0gREVCVUdfU1RBQ0sgLSAxICYmIHN0YWNrID49IHN0YWNrX2VuZCAtIERFQlVHX1NUS1NaKSB7Ci0JCQkvKgotCQkJICogQmxhY2sgbWFnaWMuIEEgbGFyZ2UgZGVidWcgc3RhY2sgaXMgY29tcG9zZWQgb2YKLQkJCSAqIG11bHRpcGxlIGV4Y2VwdGlvbiBzdGFjayBlbnRyaWVzLCB3aGljaCB3ZQotCQkJICogaXRlcmF0ZSB0aHJvdWdoIG5vdy4gRG9udCBsb29rOgotCQkJICovCi0JCQlkbyB7Ci0JCQkJc3RhY2tfZW5kIC09IEVYQ0VQVElPTl9TVEtTWjsKLQkJCQlzdGFja19zdGFydCAtPSBFWENFUFRJT05fU1RLU1o7Ci0JCQl9IHdoaWxlIChzdGFjayA8IHN0YWNrX3N0YXJ0KTsKLQotCQkJZ290byBvdXRfcmVzdG9yZTsKLQkJfQotI2VuZGlmCi0JfQotCS8qCi0JICogT2ssICdzdGFjaycgaXMgbm90IHBvaW50aW5nIHRvIGFueSBvZiB0aGUgc3lzdGVtIHN0YWNrcy4KLQkgKi8KLQlzdGFja19lbmQgPSAwOwotCi1vdXRfcmVzdG9yZToKLQlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIHN0YWNrX2VuZDsKIH0KIAotCi0vKgotICogU2F2ZSBzdGFjay1iYWNrdHJhY2UgYWRkcmVzc2VzIGludG8gYSBzdGFja190cmFjZSBidWZmZXI6Ci0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotc2F2ZV9jb250ZXh0X3N0YWNrKHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UsIHVuc2lnbmVkIGludCBza2lwLAotCQkgICB1bnNpZ25lZCBsb25nIHN0YWNrLCB1bnNpZ25lZCBsb25nIHN0YWNrX2VuZCkKK3N0YXRpYyBpbnQgc2F2ZV9zdGFja19zdGFjayh2b2lkICpkYXRhLCBjaGFyICpuYW1lKQogewotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQotI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCi0JdW5zaWduZWQgbG9uZyBwcmV2X3N0YWNrID0gMDsKLQotCXdoaWxlIChpbl9yYW5nZShwcmV2X3N0YWNrLCBzdGFjaywgc3RhY2tfZW5kKSkgewotCQlwcl9kZWJ1Zygic3RhY2s6ICAgICAgICAgICVwXG4iLCAodm9pZCAqKXN0YWNrKTsKLQkJYWRkciA9ICh1bnNpZ25lZCBsb25nKSgoKHVuc2lnbmVkIGxvbmcgKilzdGFjaylbMV0pOwotCQlwcl9kZWJ1ZygiYWRkcjogICAgICAgICAgICVwXG4iLCAodm9pZCAqKWFkZHIpOwotCQlpZiAoIXNraXApCi0JCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IGFkZHItMTsKLQkJZWxzZQotCQkJc2tpcC0tOwotCQlpZiAodHJhY2UtPm5yX2VudHJpZXMgPj0gdHJhY2UtPm1heF9lbnRyaWVzKQotCQkJYnJlYWs7Ci0JCWlmICghYWRkcikKLQkJCXJldHVybiAwOwotCQkvKgotCQkgKiBTdGFjayBmcmFtZXMgbXVzdCBnbyBmb3J3YXJkcyAob3RoZXJ3aXNlIGEgbG9vcCBjb3VsZAotCQkgKiBoYXBwZW4gaWYgdGhlIHN0YWNrZnJhbWUgaXMgY29ycnVwdGVkKSwgc28gd2UgbW92ZQotCQkgKiBwcmV2X3N0YWNrIGZvcndhcmRzOgotCQkgKi8KLQkJcHJldl9zdGFjayA9IHN0YWNrOwotCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nKSgoKHVuc2lnbmVkIGxvbmcgKilzdGFjaylbMF0pOwotCX0KLQlwcl9kZWJ1ZygiaW52YWxpZDogICAgICAgICVwXG4iLCAodm9pZCAqKXN0YWNrKTsKLSNlbHNlCi0Jd2hpbGUgKHN0YWNrIDwgc3RhY2tfZW5kKSB7Ci0JCWFkZHIgPSAoKHVuc2lnbmVkIGxvbmcgKilzdGFjaylbMF07Ci0JCXN0YWNrICs9IHNpemVvZihsb25nKTsKLQkJaWYgKF9fa2VybmVsX3RleHRfYWRkcmVzcyhhZGRyKSkgewotCQkJaWYgKCFza2lwKQotCQkJCXRyYWNlLT5lbnRyaWVzW3RyYWNlLT5ucl9lbnRyaWVzKytdID0gYWRkci0xOwotCQkJZWxzZQotCQkJCXNraXAtLTsKLQkJCWlmICh0cmFjZS0+bnJfZW50cmllcyA+PSB0cmFjZS0+bWF4X2VudHJpZXMpCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0jZW5kaWYKLQlyZXR1cm4gc3RhY2s7CisJc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSA9IChzdHJ1Y3Qgc3RhY2tfdHJhY2UgKilkYXRhOworCXJldHVybiB0cmFjZS0+YWxsX2NvbnRleHRzID8gMCA6IC0xOwogfQogCi0jZGVmaW5lIE1BWF9TVEFDS1MgMTAKK3N0YXRpYyB2b2lkIHNhdmVfc3RhY2tfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSA9IChzdHJ1Y3Qgc3RhY2tfdHJhY2UgKilkYXRhOworCWlmICh0cmFjZS0+c2tpcCA+IDApIHsKKwkJdHJhY2UtPnNraXAtLTsKKwkJcmV0dXJuOworCX0KKwlpZiAodHJhY2UtPm5yX2VudHJpZXMgPCB0cmFjZS0+bWF4X2VudHJpZXMgLSAxKQorCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IGFkZHI7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgc2F2ZV9zdGFja19vcHMgPSB7CisJLndhcm5pbmcgPSBzYXZlX3N0YWNrX3dhcm5pbmcsCisJLndhcm5pbmdfc3ltYm9sID0gc2F2ZV9zdGFja193YXJuaW5nX3N5bWJvbCwKKwkuc3RhY2sgPSBzYXZlX3N0YWNrX3N0YWNrLAorCS5hZGRyZXNzID0gc2F2ZV9zdGFja19hZGRyZXNzLAorfTsKIAogLyoKICAqIFNhdmUgc3RhY2stYmFja3RyYWNlIGFkZHJlc3NlcyBpbnRvIGEgc3RhY2tfdHJhY2UgYnVmZmVyLgotICogSWYgYWxsX2NvbnRleHRzIGlzIHNldCwgYWxsIGNvbnRleHRzIChoYXJkaXJxLCBzb2Z0aXJxIGFuZCBwcm9jZXNzKQotICogYXJlIHNhdmVkLiBJZiBub3Qgc2V0IHRoZW4gb25seSB0aGUgY3VycmVudCBjb250ZXh0IGlzIHNhdmVkLgogICovCi12b2lkIHNhdmVfc3RhY2tfdHJhY2Uoc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSwKLQkJICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgYWxsX2NvbnRleHRzLAotCQkgICAgICB1bnNpZ25lZCBpbnQgc2tpcCkKK3ZvaWQgc2F2ZV9zdGFja190cmFjZShzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0JdW5zaWduZWQgbG9uZyBzdGFjayA9ICh1bnNpZ25lZCBsb25nKSZzdGFjazsKLQlpbnQgaSwgbnJfc3RhY2tzID0gMCwgc3RhY2tzX2RvbmVbTUFYX1NUQUNLU107Ci0KLQlXQVJOX09OKHRyYWNlLT5ucl9lbnRyaWVzIHx8ICF0cmFjZS0+bWF4X2VudHJpZXMpOwotCi0JaWYgKCF0YXNrKQotCQl0YXNrID0gY3VycmVudDsKLQotCXByX2RlYnVnKCJ0YXNrOiAlcCwgdGk6ICVwXG4iLCB0YXNrLCB0YXNrLT50aHJlYWRfaW5mbyk7Ci0KLQlpZiAoIXRhc2sgfHwgdGFzayA9PSBjdXJyZW50KSB7Ci0JCS8qIEdyYWIgcmJwIHJpZ2h0IGZyb20gb3VyIHJlZ3M6ICovCi0JCWFzbSAoIm1vdiAlJXJicCwgJTAiIDogIj1yIiAoc3RhY2spKTsKLQkJcHJfZGVidWcoInJicDogICAgICAgICAgICAlcFxuIiwgKHZvaWQgKilzdGFjayk7Ci0JfSBlbHNlIHsKLQkJLyogcmJwIGlzIHRoZSBsYXN0IHJlZyBwdXNoZWQgYnkgc3dpdGNoX3RvKCk6ICovCi0JCXN0YWNrID0gdGFzay0+dGhyZWFkLnJzcDsKLQkJcHJfZGVidWcoIm90aGVyIHRhc2sgcnNwOiAlcFxuIiwgKHZvaWQgKilzdGFjayk7Ci0JCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcpKCgodW5zaWduZWQgbG9uZyAqKXN0YWNrKVswXSk7Ci0JCXByX2RlYnVnKCJvdGhlciB0YXNrIHJicDogJXBcbiIsICh2b2lkICopc3RhY2spOwotCX0KLQotCXdoaWxlICgxKSB7Ci0JCXVuc2lnbmVkIGxvbmcgc3RhY2tfZW5kID0gZ2V0X3N0YWNrX2VuZCh0YXNrLCBzdGFjayk7Ci0KLQkJcHJfZGVidWcoInN0YWNrOiAgICAgICAgICAlcFxuIiwgKHZvaWQgKilzdGFjayk7Ci0JCXByX2RlYnVnKCJzdGFjayBlbmQ6ICAgICAgJXBcbiIsICh2b2lkICopc3RhY2tfZW5kKTsKLQotCQkvKgotCQkgKiBJbnZhbGlkIHN0YWNrIGFkZHJlcz8KLQkJICovCi0JCWlmICghc3RhY2tfZW5kKQotCQkJcmV0dXJuOwotCQkvKgotCQkgKiBXZXJlIHdlIGluIHRoaXMgc3RhY2sgYWxyZWFkeT8gKHJlY3Vyc2lvbikKLQkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBucl9zdGFja3M7IGkrKykKLQkJCWlmIChzdGFja3NfZG9uZVtpXSA9PSBzdGFja19lbmQpCi0JCQkJcmV0dXJuOwotCQlzdGFja3NfZG9uZVtucl9zdGFja3NdID0gc3RhY2tfZW5kOwotCi0JCXN0YWNrID0gc2F2ZV9jb250ZXh0X3N0YWNrKHRyYWNlLCBza2lwLCBzdGFjaywgc3RhY2tfZW5kKTsKLQkJaWYgKCFhbGxfY29udGV4dHMgfHwgIXN0YWNrIHx8Ci0JCQkJdHJhY2UtPm5yX2VudHJpZXMgPj0gdHJhY2UtPm1heF9lbnRyaWVzKQotCQkJcmV0dXJuOwotCQl0cmFjZS0+ZW50cmllc1t0cmFjZS0+bnJfZW50cmllcysrXSA9IFVMT05HX01BWDsKLQkJaWYgKHRyYWNlLT5ucl9lbnRyaWVzID49IHRyYWNlLT5tYXhfZW50cmllcykKLQkJCXJldHVybjsKLQkJaWYgKCsrbnJfc3RhY2tzID49IE1BWF9TVEFDS1MpCi0JCQlyZXR1cm47Ci0JfQorCWR1bXBfdHJhY2UodGFzaywgTlVMTCwgTlVMTCwgJnNhdmVfc3RhY2tfb3BzLCB0cmFjZSk7CisJdHJhY2UtPmVudHJpZXNbdHJhY2UtPm5yX2VudHJpZXMrK10gPSBVTE9OR19NQVg7CiB9CitFWFBPUlRfU1lNQk9MKHNhdmVfc3RhY2tfdHJhY2UpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdGNlLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdGNlLmMKaW5kZXggNTUzMGRkYS4uY2JhYmZkZiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3RjZS5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90Y2UuYwpAQCAtMSw0ICsxLDYgQEAKIC8qCisgKiBUaGlzIGZpbGUgbWFuYWdlcyB0aGUgdHJhbnNsYXRpb24gZW50cmllcyBmb3IgdGhlIElCTSBDYWxnYXJ5IElPTU1VLgorICoKICAqIERlcml2ZWQgZnJvbSBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYwogICoKICAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA2CkBAIC0xMDQsMTQgKzEwNiw2IEBACiAJLyogc2V0IHRoZSB0Y2UgdGFibGUgc2l6ZSAtIG1lYXN1cmVkIGluIGVudHJpZXMgKi8KIAl0YmwtPml0X3NpemUgPSB0YWJsZV9zaXplX3RvX251bWJlcl9vZl9lbnRyaWVzKHNwZWNpZmllZF90YWJsZV9zaXplKTsKIAotCXRibC0+aXRfYmFzZSA9ICh1bnNpZ25lZCBsb25nKXRjZV90YWJsZV9rdmFbZGV2LT5idXMtPm51bWJlcl07Ci0JaWYgKCF0YmwtPml0X2Jhc2UpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDYWxnYXJ5OiBpb21tdV90YWJsZV9zZXRwYXJtczogIgotCQkgICAgICAgIm5vIHRhYmxlIGFsbG9jYXRlZD8hXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb25lOwotCX0KLQogCS8qCiAJICogbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCBmb3IgdGhlIGJpdG1hcCBzaXplIGluIG51bWJlciBvZgogCSAqIGVudHJpZXM7IHdlIG5lZWQgb25lIGJpdCBwZXIgZW50cnkKQEAgLTE2MCw4ICsxNTQsNiBAQAogCWlmIChyZXQpCiAJCWdvdG8gZnJlZV90Ymw7CiAKLQl0Y2VfZnJlZSh0YmwsIDAsIHRibC0+aXRfc2l6ZSk7Ci0KIAl0YmwtPmJiYXIgPSBiYmFyOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jCmluZGV4IDc3MDBlNmMuLjFjMjU1ZWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYwpAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaWZkZWYgQ09ORklHX0FDUEkKQEAgLTM5LDkgKzQxLDcgQEAKICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bGludXgvaHBldC5oPgotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogI2luY2x1ZGUgPGFzbS9hcGljLmg+Ci0jZW5kaWYKIAogI2lmZGVmIENPTkZJR19DUFVfRlJFUQogc3RhdGljIHZvaWQgY3B1ZnJlcV9kZWxheWVkX2dldCh2b2lkKTsKQEAgLTQ5LDcgKzQ5LDcgQEAKIGV4dGVybiB2b2lkIGk4MjU0X3RpbWVyX3Jlc3VtZSh2b2lkKTsKIGV4dGVybiBpbnQgdXNpbmdfYXBpY190aW1lcjsKIAotc3RhdGljIGNoYXIgKnRpbWVfaW5pdF9ndG9kKHZvaWQpOworc3RhdGljIGNoYXIgKnRpbWVuYW1lID0gTlVMTDsKIAogREVGSU5FX1NQSU5MT0NLKHJ0Y19sb2NrKTsKIEVYUE9SVF9TWU1CT0wocnRjX2xvY2spOwpAQCAtMTg3LDIwICsxODcsMTUgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHBjID0gaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKTsKIAotCS8qIEFzc3VtZSB0aGUgbG9jayBmdW5jdGlvbiBoYXMgZWl0aGVyIG5vIHN0YWNrIGZyYW1lIG9yIG9ubHkgYSBzaW5nbGUgCi0JICAgd29yZC4gIFRoaXMgY2hlY2tzIGlmIHRoZSBhZGRyZXNzIG9uIHRoZSBzdGFjayBsb29rcyBsaWtlIGEga2VybmVsIAotCSAgIHRleHQgYWRkcmVzcy4KLQkgICBUaGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBmb3IgZmFsc2UgaGl0cywgYnV0IGluIHRoYXQgY2FzZSB0aGUgdGljawotCSAgIGlzIGp1c3QgYWNjb3VudGVkIHRvIHRoZSBzcGlubG9jayBmdW5jdGlvbi4KLQkgICBCZXR0ZXIgd291bGQgYmUgdG8gd3JpdGUgdGhlc2UgZnVuY3Rpb25zIGluIGFzc2VtYmxlciBhZ2FpbgotCSAgIGFuZCBjaGVjayBleGFjdGx5LiAqLworCS8qIEFzc3VtZSB0aGUgbG9jayBmdW5jdGlvbiBoYXMgZWl0aGVyIG5vIHN0YWNrIGZyYW1lIG9yIGEgY29weQorCSAgIG9mIGVmbGFncyBmcm9tIFBVU0hGCisJICAgRWZsYWdzIGFsd2F5cyBoYXMgYml0cyAyMiBhbmQgdXAgY2xlYXJlZCB1bmxpa2Uga2VybmVsIGFkZHJlc3Nlcy4gKi8KIAlpZiAoIXVzZXJfbW9kZShyZWdzKSAmJiBpbl9sb2NrX2Z1bmN0aW9ucyhwYykpIHsKLQkJY2hhciAqdiA9ICooY2hhciAqKilyZWdzLT5yc3A7Ci0JCWlmICgodiA+PSBfc3RleHQgJiYgdiA8PSBfZXRleHQpIHx8Ci0JCQkodiA+PSBfc2luaXR0ZXh0ICYmIHYgPD0gX2Vpbml0dGV4dCkgfHwKLQkJCSh2ID49IChjaGFyICopTU9EVUxFU19WQUREUiAgJiYgdiA8PSAoY2hhciAqKU1PRFVMRVNfRU5EKSkKLQkJCXJldHVybiAodW5zaWduZWQgbG9uZyl2OwotCQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nICopcmVncy0+cnNwKVsxXTsKKwkJdW5zaWduZWQgbG9uZyAqc3AgPSAodW5zaWduZWQgbG9uZyAqKXJlZ3MtPnJzcDsKKwkJaWYgKHNwWzBdID4+IDIyKQorCQkJcmV0dXJuIHNwWzBdOworCQlpZiAoc3BbMV0gPj4gMjIpCisJCQlyZXR1cm4gc3BbMV07CiAJfQogCXJldHVybiBwYzsKIH0KQEAgLTI4MSw2ICsyNzYsNyBAQAogICoJCU5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gcmV0dXJuIGFjY3VyYXRlCiAgKgkJdGltZSBldmVuIGluIHRoZSBhYnNlbmNlIG9mIG11bHRpcGxlIHRpbWVyIHRpY2tzLgogICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBjeWNsZXNfMl9ucyh1bnNpZ25lZCBsb25nIGxvbmcgY3ljKTsKIHVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfY2xvY2sodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHNlcTsKQEAgLTMwNSw4ICszMDEsNyBAQAogCQkJYmFzZSA9IG1vbm90b25pY19iYXNlOwogCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKIAkJdGhpc19vZmZzZXQgPSBnZXRfY3ljbGVzX3N5bmMoKTsKLQkJLyogRklYTUU6IDEwMDAgb3IgMTAwMDAwMD8gKi8KLQkJb2Zmc2V0ID0gKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpKjEwMDAgLyBjcHVfa2h6OworCQlvZmZzZXQgPSBjeWNsZXNfMl9ucyh0aGlzX29mZnNldCAtIGxhc3Rfb2Zmc2V0KTsKIAl9CiAJcmV0dXJuIGJhc2UgKyBvZmZzZXQ7CiB9CkBAIC00MTAsOCArNDA1LDcgQEAKIAkJCW9mZnNldCAlPSBVU0VDX1BFUl9USUNLOwogCQl9CiAKLQkJLyogRklYTUU6IDEwMDAgb3IgMTAwMDAwMD8gKi8KLQkJbW9ub3RvbmljX2Jhc2UgKz0gKHRzYyAtIHZ4dGltZS5sYXN0X3RzYykgKiAxMDAwMDAwIC8gY3B1X2toejsKKwkJbW9ub3RvbmljX2Jhc2UgKz0gY3ljbGVzXzJfbnModHNjIC0gdnh0aW1lLmxhc3RfdHNjKTsKIAogCQl2eHRpbWUubGFzdF90c2MgPSB0c2MgLSB2eHRpbWUucXVvdCAqIGRlbGF5IC8gdnh0aW1lLnRzY19xdW90OwogCkBAIC00NDEsMTIgKzQzNSw4IEBACiAgKiBoYXZlIHRvIGNhbGwgdGhlIGxvY2FsIGludGVycnVwdCBoYW5kbGVyLgogICovCiAKLSNpZm5kZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCi0JcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcsIHJlZ3MpOwotI2Vsc2UKIAlpZiAoIXVzaW5nX2FwaWNfdGltZXIpCiAJCXNtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQocmVncyk7Ci0jZW5kaWYKIAogLyoKICAqIElmIHdlIGhhdmUgYW4gZXh0ZXJuYWxseSBzeW5jaHJvbml6ZWQgTGludXggY2xvY2ssIHRoZW4gdXBkYXRlIENNT1MgY2xvY2sKQEAgLTQ3MCwxMCArNDYwLDggQEAKIAlpZiAoYXBpY19ydW5zX21haW5fdGltZXIgPiAxKQogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJbWFpbl90aW1lcl9oYW5kbGVyKHJlZ3MpOwotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogCWlmICh1c2luZ19hcGljX3RpbWVyKQogCQlzbXBfc2VuZF90aW1lcl9icm9hZGNhc3RfaXBpKCk7Ci0jZW5kaWYKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTg5MywxMSArODgxLDE3IEBACiAJdGltZXJfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCBDUFVfTUFTS19OT05FLCAidGltZXIiLCBOVUxMLCBOVUxMCiB9OwogCitzdGF0aWMgaW50IF9fY3B1aW5pdAordGltZV9jcHVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJdW5zaWduZWQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpIGhjcHU7CisJaWYgKGFjdGlvbiA9PSBDUFVfT05MSU5FKQorCQl2c3lzY2FsbF9zZXRfY3B1KGNwdSk7CisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCiB2b2lkIF9faW5pdCB0aW1lX2luaXQodm9pZCkKIHsKLQljaGFyICp0aW1lbmFtZTsKLQljaGFyICpndG9kOwotCiAJaWYgKG5vaHBldCkKIAkJdnh0aW1lLmhwZXRfYWRkcmVzcyA9IDA7CiAKQEAgLTkzMSwxOCArOTI1LDE3IEBACiAJfQogCiAJdnh0aW1lLm1vZGUgPSBWWFRJTUVfVFNDOwotCWd0b2QgPSB0aW1lX2luaXRfZ3RvZCgpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAidGltZS5jOiBVc2luZyAlbGQuJTA2bGQgTUh6IFdBTEwgJXMgR1RPRCAlcyB0aW1lci5cbiIsCi0JICAgICAgIHZ4dGltZV9oeiAvIDEwMDAwMDAsIHZ4dGltZV9oeiAlIDEwMDAwMDAsIHRpbWVuYW1lLCBndG9kKTsKLQlwcmludGsoS0VSTl9JTkZPICJ0aW1lLmM6IERldGVjdGVkICVkLiUwM2QgTUh6IHByb2Nlc3Nvci5cbiIsCi0JCWNwdV9raHogLyAxMDAwLCBjcHVfa2h6ICUgMTAwMCk7CiAJdnh0aW1lLnF1b3QgPSAoVVNFQ19QRVJfU0VDIDw8IFVTX1NDQUxFKSAvIHZ4dGltZV9oejsKIAl2eHRpbWUudHNjX3F1b3QgPSAoVVNFQ19QRVJfTVNFQyA8PCBVU19TQ0FMRSkgLyBjcHVfa2h6OwogCXZ4dGltZS5sYXN0X3RzYyA9IGdldF9jeWNsZXNfc3luYygpOwotCXNldHVwX2lycSgwLCAmaXJxMCk7Ci0KIAlzZXRfY3ljMm5zX3NjYWxlKGNwdV9raHopOworCXNldHVwX2lycSgwLCAmaXJxMCk7CisJaG90Y3B1X25vdGlmaWVyKHRpbWVfY3B1X25vdGlmaWVyLCAwKTsKKwl0aW1lX2NwdV9ub3RpZmllcihOVUxMLCBDUFVfT05MSU5FLCAodm9pZCAqKShsb25nKXNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKyNpZm5kZWYgQ09ORklHX1NNUAorCXRpbWVfaW5pdF9ndG9kKCk7CisjZW5kaWYKIH0KIAogLyoKQEAgLTk3MywxMiArOTY2LDE4IEBACiAvKgogICogRGVjaWRlIHdoYXQgbW9kZSBnZXR0aW1lb2ZkYXkgc2hvdWxkIHVzZS4KICAqLwotX19pbml0IHN0YXRpYyBjaGFyICp0aW1lX2luaXRfZ3RvZCh2b2lkKQordm9pZCB0aW1lX2luaXRfZ3RvZCh2b2lkKQogewogCWNoYXIgKnRpbWV0eXBlOwogCiAJaWYgKHVuc3luY2hyb25pemVkX3RzYygpKQogCQlub3RzYyA9IDE7CisKKyAJaWYgKGNwdV9oYXMoJmJvb3RfY3B1X2RhdGEsIFg4Nl9GRUFUVVJFX1JEVFNDUCkpCisJCXZnZXRjcHVfbW9kZSA9IFZHRVRDUFVfUkRUU0NQOworCWVsc2UKKwkJdmdldGNwdV9tb2RlID0gVkdFVENQVV9MU0w7CisKIAlpZiAodnh0aW1lLmhwZXRfYWRkcmVzcyAmJiBub3RzYykgewogCQl0aW1ldHlwZSA9IGhwZXRfdXNlX3RpbWVyID8gIkhQRVQiIDogIlBJVC9IUEVUIjsKIAkJaWYgKGhwZXRfdXNlX3RpbWVyKQpAQCAtMTAwMSw3ICsxMDAwLDE2IEBACiAJCXRpbWV0eXBlID0gaHBldF91c2VfdGltZXIgPyAiSFBFVC9UU0MiIDogIlBJVC9UU0MiOwogCQl2eHRpbWUubW9kZSA9IFZYVElNRV9UU0M7CiAJfQotCXJldHVybiB0aW1ldHlwZTsKKworCXByaW50ayhLRVJOX0lORk8gInRpbWUuYzogVXNpbmcgJWxkLiUwNmxkIE1IeiBXQUxMICVzIEdUT0QgJXMgdGltZXIuXG4iLAorCSAgICAgICB2eHRpbWVfaHogLyAxMDAwMDAwLCB2eHRpbWVfaHogJSAxMDAwMDAwLCB0aW1lbmFtZSwgdGltZXR5cGUpOworCXByaW50ayhLRVJOX0lORk8gInRpbWUuYzogRGV0ZWN0ZWQgJWQuJTAzZCBNSHogcHJvY2Vzc29yLlxuIiwKKwkJY3B1X2toeiAvIDEwMDAsIGNwdV9raHogJSAxMDAwKTsKKwl2eHRpbWUucXVvdCA9IChVU0VDX1BFUl9TRUMgPDwgVVNfU0NBTEUpIC8gdnh0aW1lX2h6OworCXZ4dGltZS50c2NfcXVvdCA9IChVU0VDX1BFUl9NU0VDIDw8IFVTX1NDQUxFKSAvIGNwdV9raHo7CisJdnh0aW1lLmxhc3RfdHNjID0gZ2V0X2N5Y2xlc19zeW5jKCk7CisKKwlzZXRfY3ljMm5zX3NjYWxlKGNwdV9raHopOwogfQogCiBfX3NldHVwKCJyZXBvcnRfbG9zdF90aWNrcyIsIHRpbWVfc2V0dXApOwpAQCAtMTAzMSw4ICsxMDM5LDE2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIHNlYzsKIAl1bnNpZ25lZCBsb25nIGN0aW1lID0gZ2V0X2Ntb3NfdGltZSgpOwotCXVuc2lnbmVkIGxvbmcgc2xlZXBfbGVuZ3RoID0gKGN0aW1lIC0gc2xlZXBfc3RhcnQpICogSFo7CisJbG9uZyBzbGVlcF9sZW5ndGggPSAoY3RpbWUgLSBzbGVlcF9zdGFydCkgKiBIWjsKIAorCWlmIChzbGVlcF9sZW5ndGggPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlRpbWUgc2tldyBkZXRlY3RlZCBpbiB0aW1lciByZXN1bWUhXG4iKTsKKwkJLyogVGhlIHRpbWUgYWZ0ZXIgdGhlIHJlc3VtZSBtdXN0IG5vdCBiZSBlYXJsaWVyIHRoYW4gdGhlIHRpbWUKKwkJICogYmVmb3JlIHRoZSBzdXNwZW5kIG9yIHNvbWUgbmFzdHkgdGhpbmdzIHdpbGwgaGFwcGVuCisJCSAqLworCQlzbGVlcF9sZW5ndGggPSAwOworCQljdGltZSA9IHNsZWVwX3N0YXJ0OworCX0KIAlpZiAodnh0aW1lLmhwZXRfYWRkcmVzcykKIAkJaHBldF9yZWVuYWJsZSgpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC90cmFtcG9saW5lLlMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhbXBvbGluZS5TCmluZGV4IDIzYTAzZWI5Li5jNzliOTlhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdHJhbXBvbGluZS5TCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC90cmFtcG9saW5lLlMKQEAgLTY0LDcgKzY0LDcgQEAKIAkud29yZAkwLCAwCQkJIyBpZHQgYmFzZSA9IDBMCiAKIGdkdF80ODoKLQkuc2hvcnQJX19LRVJORUwzMl9DUyArIDcJIyBnZHQgbGltaXQKKwkuc2hvcnQJR0RUX0VOVFJJRVMqOCAtIDEJIyBnZHQgbGltaXQKIAkubG9uZwljcHVfZ2R0X3RhYmxlLV9fU1RBUlRfS0VSTkVMX21hcAogCiAuZ2xvYmwgdHJhbXBvbGluZV9lbmQKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC90cmFwcy5jIGIvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMKaW5kZXggYjEyNDk3Ny4uMDFmMmE4ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3RyYXBzLmMKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlIDxhc20vcGRhLmg+CiAjaW5jbHVkZSA8YXNtL3Byb3RvLmg+CiAjaW5jbHVkZSA8YXNtL25taS5oPgorI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CiAKIGFzbWxpbmthZ2Ugdm9pZCBkaXZpZGVfZXJyb3Iodm9pZCk7CiBhc21saW5rYWdlIHZvaWQgZGVidWcodm9pZCk7CkBAIC0xNDIsNyArMTQzLDcgQEAKICNlbmRpZgogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyAqaW5fZXhjZXB0aW9uX3N0YWNrKHVuc2lnbmVkIGNwdSwgdW5zaWduZWQgbG9uZyBzdGFjaywKLQkJCQkJdW5zaWduZWQgKnVzZWRwLCBjb25zdCBjaGFyICoqaWRwKQorCQkJCQl1bnNpZ25lZCAqdXNlZHAsIGNoYXIgKippZHApCiB7CiAJc3RhdGljIGNoYXIgaWRzW11bOF0gPSB7CiAJCVtERUJVR19TVEFDSyAtIDFdID0gIiNEQiIsCkBAIC0xNjEsMjYgKzE2Miw3IEBACiAJICogJ3N0YWNrJyBpcyBpbiBvbmUgb2YgdGhlbToKIAkgKi8KIAlmb3IgKGsgPSAwOyBrIDwgTl9FWENFUFRJT05fU1RBQ0tTOyBrKyspIHsKLQkJdW5zaWduZWQgbG9uZyBlbmQ7Ci0KLQkJLyoKLQkJICogc2V0ICdlbmQnIHRvIHRoZSBlbmQgb2YgdGhlIGV4Y2VwdGlvbiBzdGFjay4KLQkJICovCi0JCXN3aXRjaCAoayArIDEpIHsKLQkJLyoKLQkJICogVE9ETzogdGhpcyBibG9jayBpcyBub3QgbmVlZGVkIGkgdGhpbmssIGJlY2F1c2UKLQkJICogc2V0dXA2NC5jOmNwdV9pbml0KCkgc2V0cyB1cCB0LT5pc3RbREVCVUdfU1RBQ0tdCi0JCSAqIHByb3Blcmx5IHRvby4KLQkJICovCi0jaWYgREVCVUdfU1RLU1ogPiBFWENFUFRJT05fU1RLU1oKLQkJY2FzZSBERUJVR19TVEFDSzoKLQkJCWVuZCA9IGNwdV9wZGEoY3B1KS0+ZGVidWdzdGFjayArIERFQlVHX1NUS1NaOwotCQkJYnJlYWs7Ci0jZW5kaWYKLQkJZGVmYXVsdDoKLQkJCWVuZCA9IHBlcl9jcHUob3JpZ19pc3QsIGNwdSkuaXN0W2tdOwotCQkJYnJlYWs7Ci0JCX0KKwkJdW5zaWduZWQgbG9uZyBlbmQgPSBwZXJfY3B1KG9yaWdfaXN0LCBjcHUpLmlzdFtrXTsKIAkJLyoKIAkJICogSXMgJ3N0YWNrJyBhYm92ZSB0aGlzIGV4Y2VwdGlvbiBmcmFtZSdzIGVuZD8KIAkJICogSWYgeWVzIHRoZW4gc2tpcCB0byB0aGUgbmV4dCBmcmFtZS4KQEAgLTIzNCwxMyArMjE2LDE5IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgc2hvd190cmFjZV91bndpbmQoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvLCB2b2lkICpjb250ZXh0KQorc3RydWN0IG9wc19hbmRfZGF0YSB7CisJc3RydWN0IHN0YWNrdHJhY2Vfb3BzICpvcHM7CisJdm9pZCAqZGF0YTsKK307CisKK3N0YXRpYyBpbnQgZHVtcF90cmFjZV91bndpbmQoc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvLCB2b2lkICpjb250ZXh0KQogeworCXN0cnVjdCBvcHNfYW5kX2RhdGEgKm9hZCA9IChzdHJ1Y3Qgb3BzX2FuZF9kYXRhICopY29udGV4dDsKIAlpbnQgbiA9IDA7CiAKIAl3aGlsZSAodW53aW5kKGluZm8pID09IDAgJiYgVU5XX1BDKGluZm8pKSB7CiAJCW4rKzsKLQkJcHJpbnRrX2FkZHJlc3MoVU5XX1BDKGluZm8pKTsKKwkJb2FkLT5vcHMtPmFkZHJlc3Mob2FkLT5kYXRhLCBVTldfUEMoaW5mbykpOwogCQlpZiAoYXJjaF91bndfdXNlcl9tb2RlKGluZm8pKQogCQkJYnJlYWs7CiAJfQpAQCAtMjU0LDQ1ICsyNDIsNTMgQEAKICAqIHNldmVyZSBleGNlcHRpb24gKGRvdWJsZSBmYXVsdCwgbm1pLCBzdGFjayBmYXVsdCwgZGVidWcsIG1jZSkgaGFyZHdhcmUgc3RhY2sKICAqLwogCi12b2lkIHNob3dfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nICogc3RhY2spCit2b2lkIGR1bXBfdHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nICogc3RhY2ssCisJCXN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhKQogewotCWNvbnN0IHVuc2lnbmVkIGNwdSA9IHNhZmVfc21wX3Byb2Nlc3Nvcl9pZCgpOworCWNvbnN0IHVuc2lnbmVkIGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAl1bnNpZ25lZCBsb25nICppcnFzdGFja19lbmQgPSAodW5zaWduZWQgbG9uZyAqKWNwdV9wZGEoY3B1KS0+aXJxc3RhY2twdHI7CiAJdW5zaWduZWQgdXNlZCA9IDA7CiAKLQlwcmludGsoIlxuQ2FsbCBUcmFjZTpcbiIpOwotCiAJaWYgKCF0c2spCiAJCXRzayA9IGN1cnJlbnQ7CiAKIAlpZiAoY2FsbF90cmFjZSA+PSAwKSB7CiAJCWludCB1bndfcmV0ID0gMDsKIAkJc3RydWN0IHVud2luZF9mcmFtZV9pbmZvIGluZm87CisJCXN0cnVjdCBvcHNfYW5kX2RhdGEgb2FkID0geyAub3BzID0gb3BzLCAuZGF0YSA9IGRhdGEgfTsKIAogCQlpZiAocmVncykgewogCQkJaWYgKHVud2luZF9pbml0X2ZyYW1lX2luZm8oJmluZm8sIHRzaywgcmVncykgPT0gMCkKLQkJCQl1bndfcmV0ID0gc2hvd190cmFjZV91bndpbmQoJmluZm8sIE5VTEwpOworCQkJCXVud19yZXQgPSBkdW1wX3RyYWNlX3Vud2luZCgmaW5mbywgJm9hZCk7CiAJCX0gZWxzZSBpZiAodHNrID09IGN1cnJlbnQpCi0JCQl1bndfcmV0ID0gdW53aW5kX2luaXRfcnVubmluZygmaW5mbywgc2hvd190cmFjZV91bndpbmQsIE5VTEwpOworCQkJdW53X3JldCA9IHVud2luZF9pbml0X3J1bm5pbmcoJmluZm8sIGR1bXBfdHJhY2VfdW53aW5kLCAmb2FkKTsKIAkJZWxzZSB7CiAJCQlpZiAodW53aW5kX2luaXRfYmxvY2tlZCgmaW5mbywgdHNrKSA9PSAwKQotCQkJCXVud19yZXQgPSBzaG93X3RyYWNlX3Vud2luZCgmaW5mbywgTlVMTCk7CisJCQkJdW53X3JldCA9IGR1bXBfdHJhY2VfdW53aW5kKCZpbmZvLCAmb2FkKTsKIAkJfQogCQlpZiAodW53X3JldCA+IDApIHsKIAkJCWlmIChjYWxsX3RyYWNlID09IDEgJiYgIWFyY2hfdW53X3VzZXJfbW9kZSgmaW5mbykpIHsKLQkJCQlwcmludF9zeW1ib2woIkRXQVJGMiB1bndpbmRlciBzdHVjayBhdCAlc1xuIiwKKwkJCQlvcHMtPndhcm5pbmdfc3ltYm9sKGRhdGEsICJEV0FSRjIgdW53aW5kZXIgc3R1Y2sgYXQgJXNcbiIsCiAJCQkJCSAgICAgVU5XX1BDKCZpbmZvKSk7CiAJCQkJaWYgKChsb25nKVVOV19TUCgmaW5mbykgPCAwKSB7Ci0JCQkJCXByaW50aygiTGVmdG92ZXIgaW5leGFjdCBiYWNrdHJhY2U6XG4iKTsKKwkJCQkJb3BzLT53YXJuaW5nKGRhdGEsICJMZWZ0b3ZlciBpbmV4YWN0IGJhY2t0cmFjZTpcbiIpOwogCQkJCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopVU5XX1NQKCZpbmZvKTsKKwkJCQkJaWYgKCFzdGFjaykKKwkJCQkJCXJldHVybjsKIAkJCQl9IGVsc2UKLQkJCQkJcHJpbnRrKCJGdWxsIGluZXhhY3QgYmFja3RyYWNlIGFnYWluOlxuIik7CisJCQkJCW9wcy0+d2FybmluZyhkYXRhLCAiRnVsbCBpbmV4YWN0IGJhY2t0cmFjZSBhZ2FpbjpcbiIpOwogCQkJfSBlbHNlIGlmIChjYWxsX3RyYWNlID49IDEpCiAJCQkJcmV0dXJuOwogCQkJZWxzZQotCQkJCXByaW50aygiRnVsbCBpbmV4YWN0IGJhY2t0cmFjZSBhZ2FpbjpcbiIpOworCQkJCW9wcy0+d2FybmluZyhkYXRhLCAiRnVsbCBpbmV4YWN0IGJhY2t0cmFjZSBhZ2FpbjpcbiIpOwogCQl9IGVsc2UKLQkJCXByaW50aygiSW5leGFjdCBiYWNrdHJhY2U6XG4iKTsKKwkJCW9wcy0+d2FybmluZyhkYXRhLCAiSW5leGFjdCBiYWNrdHJhY2U6XG4iKTsKKwl9CisJaWYgKCFzdGFjaykgeworCQl1bnNpZ25lZCBsb25nIGR1bW15OworCQlzdGFjayA9ICZkdW1teTsKKwkJaWYgKHRzayAmJiB0c2sgIT0gY3VycmVudCkKKwkJCXN0YWNrID0gKHVuc2lnbmVkIGxvbmcgKil0c2stPnRocmVhZC5yc3A7CiAJfQogCiAJLyoKQEAgLTMwMyw3ICsyOTksOSBAQAogI2RlZmluZSBIQU5ETEVfU1RBQ0soY29uZCkgXAogCWRvIHdoaWxlIChjb25kKSB7IFwKIAkJdW5zaWduZWQgbG9uZyBhZGRyID0gKnN0YWNrKys7IFwKLQkJaWYgKGtlcm5lbF90ZXh0X2FkZHJlc3MoYWRkcikpIHsgXAorCQlpZiAob29wc19pbl9wcm9ncmVzcyA/IAkJXAorCQkJX19rZXJuZWxfdGV4dF9hZGRyZXNzKGFkZHIpIDogXAorCQkJa2VybmVsX3RleHRfYWRkcmVzcyhhZGRyKSkgeyBcCiAJCQkvKiBcCiAJCQkgKiBJZiB0aGUgYWRkcmVzcyBpcyBlaXRoZXIgaW4gdGhlIHRleHQgc2VnbWVudCBvZiB0aGUgXAogCQkJICoga2VybmVsLCBvciBpbiB0aGUgcmVnaW9uIHdoaWNoIGNvbnRhaW5zIHZtYWxsb2MnZWQgXApAQCAtMzEyLDcgKzMxMCw3IEBACiAJCQkgKiBkb3duIHRoZSBjYXVzZSBvZiB0aGUgY3Jhc2ggd2lsbCBiZSBhYmxlIHRvIGZpZ3VyZSBcCiAJCQkgKiBvdXQgdGhlIGNhbGwgcGF0aCB0aGF0IHdhcyB0YWtlbi4gXAogCQkJICovIFwKLQkJCXByaW50a19hZGRyZXNzKGFkZHIpOyBcCisJCQlvcHMtPmFkZHJlc3MoZGF0YSwgYWRkcik7ICAgXAogCQl9IFwKIAl9IHdoaWxlICgwKQogCkBAIC0zMjEsMTYgKzMxOSwxNyBAQAogCSAqIGN1cnJlbnQgc3RhY2sgYWRkcmVzcy4gSWYgdGhlIHN0YWNrcyBjb25zaXN0IG9mIG5lc3RlZAogCSAqIGV4Y2VwdGlvbnMKIAkgKi8KLQlmb3IgKCA7IDsgKSB7Ci0JCWNvbnN0IGNoYXIgKmlkOworCWZvciAoOzspIHsKKwkJY2hhciAqaWQ7CiAJCXVuc2lnbmVkIGxvbmcgKmVzdGFja19lbmQ7CiAJCWVzdGFja19lbmQgPSBpbl9leGNlcHRpb25fc3RhY2soY3B1LCAodW5zaWduZWQgbG9uZylzdGFjaywKIAkJCQkJCSZ1c2VkLCAmaWQpOwogCiAJCWlmIChlc3RhY2tfZW5kKSB7Ci0JCQlwcmludGsoIiA8JXM+IiwgaWQpOworCQkJaWYgKG9wcy0+c3RhY2soZGF0YSwgaWQpIDwgMCkKKwkJCQlicmVhazsKIAkJCUhBTkRMRV9TVEFDSyAoc3RhY2sgPCBlc3RhY2tfZW5kKTsKLQkJCXByaW50aygiIDxFT0U+Iik7CisJCQlvcHMtPnN0YWNrKGRhdGEsICI8RU9FPiIpOwogCQkJLyoKIAkJCSAqIFdlIGxpbmsgdG8gdGhlIG5leHQgc3RhY2sgdmlhIHRoZQogCQkJICogc2Vjb25kLXRvLWxhc3QgcG9pbnRlciAoaW5kZXggLTIgdG8gZW5kKSBpbiB0aGUKQEAgLTM0NSw3ICszNDQsOCBAQAogCQkJCShJUlFTVEFDS1NJWkUgLSA2NCkgLyBzaXplb2YoKmlycXN0YWNrKTsKIAogCQkJaWYgKHN0YWNrID49IGlycXN0YWNrICYmIHN0YWNrIDwgaXJxc3RhY2tfZW5kKSB7Ci0JCQkJcHJpbnRrKCIgPElSUT4iKTsKKwkJCQlpZiAob3BzLT5zdGFjayhkYXRhLCAiSVJRIikgPCAwKQorCQkJCQlicmVhazsKIAkJCQlIQU5ETEVfU1RBQ0sgKHN0YWNrIDwgaXJxc3RhY2tfZW5kKTsKIAkJCQkvKgogCQkJCSAqIFdlIGxpbmsgdG8gdGhlIG5leHQgc3RhY2sgKHdoaWNoIHdvdWxkIGJlCkBAIC0zNTQsNyArMzU0LDcgQEAKIAkJCQkgKi8KIAkJCQlzdGFjayA9ICh1bnNpZ25lZCBsb25nICopIChpcnFzdGFja19lbmRbLTFdKTsKIAkJCQlpcnFzdGFja19lbmQgPSBOVUxMOwotCQkJCXByaW50aygiIDxFT0k+Iik7CisJCQkJb3BzLT5zdGFjayhkYXRhLCAiRU9JIik7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCX0KQEAgLTM2MiwxOSArMzYyLDU3IEBACiAJfQogCiAJLyoKLQkgKiBUaGlzIHByaW50cyB0aGUgcHJvY2VzcyBzdGFjazoKKwkgKiBUaGlzIGhhbmRsZXMgdGhlIHByb2Nlc3Mgc3RhY2s6CiAJICovCiAJSEFORExFX1NUQUNLICgoKGxvbmcpIHN0YWNrICYgKFRIUkVBRF9TSVpFLTEpKSAhPSAwKTsKICN1bmRlZiBIQU5ETEVfU1RBQ0sKK30KK0VYUE9SVF9TWU1CT0woZHVtcF90cmFjZSk7CiAKK3N0YXRpYyB2b2lkCitwcmludF90cmFjZV93YXJuaW5nX3N5bWJvbCh2b2lkICpkYXRhLCBjaGFyICptc2csIHVuc2lnbmVkIGxvbmcgc3ltYm9sKQoreworCXByaW50X3N5bWJvbChtc2csIHN5bWJvbCk7CiAJcHJpbnRrKCJcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBfc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgKiByc3ApCitzdGF0aWMgdm9pZCBwcmludF90cmFjZV93YXJuaW5nKHZvaWQgKmRhdGEsIGNoYXIgKm1zZykKK3sKKwlwcmludGsoIiVzXG4iLCBtc2cpOworfQorCitzdGF0aWMgaW50IHByaW50X3RyYWNlX3N0YWNrKHZvaWQgKmRhdGEsIGNoYXIgKm5hbWUpCit7CisJcHJpbnRrKCIgPCVzPiAiLCBuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfdHJhY2VfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcHJpbnRrX2FkZHJlc3MoYWRkcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3RhY2t0cmFjZV9vcHMgcHJpbnRfdHJhY2Vfb3BzID0geworCS53YXJuaW5nID0gcHJpbnRfdHJhY2Vfd2FybmluZywKKwkud2FybmluZ19zeW1ib2wgPSBwcmludF90cmFjZV93YXJuaW5nX3N5bWJvbCwKKwkuc3RhY2sgPSBwcmludF90cmFjZV9zdGFjaywKKwkuYWRkcmVzcyA9IHByaW50X3RyYWNlX2FkZHJlc3MsCit9OworCit2b2lkCitzaG93X3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyAqc3RhY2spCit7CisJcHJpbnRrKCJcbkNhbGwgVHJhY2U6XG4iKTsKKwlkdW1wX3RyYWNlKHRzaywgcmVncywgc3RhY2ssICZwcmludF90cmFjZV9vcHMsIE5VTEwpOworCXByaW50aygiXG4iKTsKK30KKworc3RhdGljIHZvaWQKK19zaG93X3N0YWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyAqcnNwKQogewogCXVuc2lnbmVkIGxvbmcgKnN0YWNrOwogCWludCBpOwotCWNvbnN0IGludCBjcHUgPSBzYWZlX3NtcF9wcm9jZXNzb3JfaWQoKTsKKwljb25zdCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXVuc2lnbmVkIGxvbmcgKmlycXN0YWNrX2VuZCA9ICh1bnNpZ25lZCBsb25nICopIChjcHVfcGRhKGNwdSktPmlycXN0YWNrcHRyKTsKIAl1bnNpZ25lZCBsb25nICppcnFzdGFjayA9ICh1bnNpZ25lZCBsb25nICopIChjcHVfcGRhKGNwdSktPmlycXN0YWNrcHRyIC0gSVJRU1RBQ0tTSVpFKTsKIApAQCAtNDI4LDcgKzQ2Niw3IEBACiAJaW50IGk7CiAJaW50IGluX2tlcm5lbCA9ICF1c2VyX21vZGUocmVncyk7CiAJdW5zaWduZWQgbG9uZyByc3A7Ci0JY29uc3QgaW50IGNwdSA9IHNhZmVfc21wX3Byb2Nlc3Nvcl9pZCgpOyAKKwljb25zdCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyID0gY3B1X3BkYShjcHUpLT5wY3VycmVudDsKIAogCQlyc3AgPSByZWdzLT5yc3A7CkBAIC01MDMsOSArNTQxLDExIEBACiAKIHVuc2lnbmVkIF9fa3Byb2JlcyBsb25nIG9vcHNfYmVnaW4odm9pZCkKIHsKLQlpbnQgY3B1ID0gc2FmZV9zbXBfcHJvY2Vzc29yX2lkKCk7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJb29wc19lbnRlcigpOworCiAJLyogcmFjeSwgYnV0IGJldHRlciB0aGFuIHJpc2tpbmcgZGVhZGxvY2suICovCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWlmICghc3Bpbl90cnlsb2NrKCZkaWVfbG9jaykpIHsgCkBAIC01MzQsNiArNTc0LDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGllX2xvY2ssIGZsYWdzKTsKIAlpZiAocGFuaWNfb25fb29wcykKIAkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiIpOworCW9vcHNfZXhpdCgpOwogfQogCiB2b2lkIF9fa3Byb2JlcyBfX2RpZShjb25zdCBjaGFyICogc3RyLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIGxvbmcgZXJyKQpAQCAtNTcwLDcgKzYxMSw3IEBACiAJZG9fZXhpdChTSUdTRUdWKTsgCiB9CiAKLXZvaWQgX19rcHJvYmVzIGRpZV9ubWkoY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3ZvaWQgX19rcHJvYmVzIGRpZV9ubWkoY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGRvX3BhbmljKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBvb3BzX2JlZ2luKCk7CiAKQEAgLTU3OCwxMyArNjE5LDEyIEBACiAJICogV2UgYXJlIGluIHRyb3VibGUgYW55d2F5LCBsZXRzIGF0IGxlYXN0IHRyeQogCSAqIHRvIGdldCBhIG1lc3NhZ2Ugb3V0LgogCSAqLwotCXByaW50ayhzdHIsIHNhZmVfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlwcmludGsoc3RyLCBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXNob3dfcmVnaXN0ZXJzKHJlZ3MpOwogCWlmIChrZXhlY19zaG91bGRfY3Jhc2goY3VycmVudCkpCiAJCWNyYXNoX2tleGVjKHJlZ3MpOwotCWlmIChwYW5pY19vbl90aW1lb3V0IHx8IHBhbmljX29uX29vcHMpCi0JCXBhbmljKCJubWkgd2F0Y2hkb2ciKTsKLQlwcmludGsoImNvbnNvbGUgc2h1dHMgdXAgLi4uXG4iKTsKKwlpZiAoZG9fcGFuaWMgfHwgcGFuaWNfb25fb29wcykKKwkJcGFuaWMoIk5vbiBtYXNrYWJsZSBpbnRlcnJ1cHQiKTsKIAlvb3BzX2VuZChmbGFncyk7CiAJbm1pX2V4aXQoKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CkBAIC03MzAsOCArNzcwLDE1IEBACiBzdGF0aWMgX19rcHJvYmVzIHZvaWQKIG1lbV9wYXJpdHlfZXJyb3IodW5zaWduZWQgY2hhciByZWFzb24sIHN0cnVjdCBwdF9yZWdzICogcmVncykKIHsKLQlwcmludGsoIlVoaHVoLiBOTUkgcmVjZWl2ZWQuIERhemVkIGFuZCBjb25mdXNlZCwgYnV0IHRyeWluZyB0byBjb250aW51ZVxuIik7Ci0JcHJpbnRrKCJZb3UgcHJvYmFibHkgaGF2ZSBhIGhhcmR3YXJlIHByb2JsZW0gd2l0aCB5b3VyIFJBTSBjaGlwc1xuIik7CisJcHJpbnRrKEtFUk5fRU1FUkcgIlVoaHVoLiBOTUkgcmVjZWl2ZWQgZm9yIHVua25vd24gcmVhc29uICUwMnguXG4iLAorCQlyZWFzb24pOworCXByaW50ayhLRVJOX0VNRVJHICJZb3UgcHJvYmFibHkgaGF2ZSBhIGhhcmR3YXJlIHByb2JsZW0gd2l0aCB5b3VyICIKKwkJIlJBTSBjaGlwc1xuIik7CisKKwlpZiAocGFuaWNfb25fdW5yZWNvdmVyZWRfbm1pKQorCQlwYW5pYygiTk1JOiBOb3QgY29udGludWluZyIpOworCisJcHJpbnRrKEtFUk5fRU1FUkcgIkRhemVkIGFuZCBjb25mdXNlZCwgYnV0IHRyeWluZyB0byBjb250aW51ZVxuIik7CiAKIAkvKiBDbGVhciBhbmQgZGlzYWJsZSB0aGUgbWVtb3J5IHBhcml0eSBlcnJvciBsaW5lLiAqLwogCXJlYXNvbiA9IChyZWFzb24gJiAweGYpIHwgNDsKQEAgLTc1NCw5ICs4MDEsMTUgQEAKIAogc3RhdGljIF9fa3Byb2JlcyB2b2lkCiB1bmtub3duX25taV9lcnJvcih1bnNpZ25lZCBjaGFyIHJlYXNvbiwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQotewlwcmludGsoIlVoaHVoLiBOTUkgcmVjZWl2ZWQgZm9yIHVua25vd24gcmVhc29uICUwMnguXG4iLCByZWFzb24pOwotCXByaW50aygiRGF6ZWQgYW5kIGNvbmZ1c2VkLCBidXQgdHJ5aW5nIHRvIGNvbnRpbnVlXG4iKTsKLQlwcmludGsoIkRvIHlvdSBoYXZlIGEgc3RyYW5nZSBwb3dlciBzYXZpbmcgbW9kZSBlbmFibGVkP1xuIik7Cit7CisJcHJpbnRrKEtFUk5fRU1FUkcgIlVoaHVoLiBOTUkgcmVjZWl2ZWQgZm9yIHVua25vd24gcmVhc29uICUwMnguXG4iLAorCQlyZWFzb24pOworCXByaW50ayhLRVJOX0VNRVJHICJEbyB5b3UgaGF2ZSBhIHN0cmFuZ2UgcG93ZXIgc2F2aW5nIG1vZGUgZW5hYmxlZD9cbiIpOworCisJaWYgKHBhbmljX29uX3VucmVjb3ZlcmVkX25taSkKKwkJcGFuaWMoIk5NSTogTm90IGNvbnRpbnVpbmciKTsKKworCXByaW50ayhLRVJOX0VNRVJHICJEYXplZCBhbmQgY29uZnVzZWQsIGJ1dCB0cnlpbmcgdG8gY29udGludWVcbiIpOwogfQogCiAvKiBSdW5zIG9uIElTVCBzdGFjay4gVGhpcyBjb2RlIG11c3Qga2VlcCBpbnRlcnJ1cHRzIG9mZiBhbGwgdGhlIHRpbWUuCkBAIC03NzYsMTcgKzgyOSwxNSBAQAogCQlpZiAobm90aWZ5X2RpZShESUVfTk1JX0lQSSwgIm5taV9pcGkiLCByZWdzLCByZWFzb24sIDIsIFNJR0lOVCkKIAkJCQkJCQkJPT0gTk9USUZZX1NUT1ApCiAJCQlyZXR1cm47Ci0jaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAJCS8qCiAJCSAqIE9rLCBzbyB0aGlzIGlzIG5vbmUgb2YgdGhlIGRvY3VtZW50ZWQgTk1JIHNvdXJjZXMsCiAJCSAqIHNvIGl0IG11c3QgYmUgdGhlIE5NSSB3YXRjaGRvZy4KIAkJICovCi0JCWlmIChubWlfd2F0Y2hkb2cgPiAwKSB7Ci0JCQlubWlfd2F0Y2hkb2dfdGljayhyZWdzLHJlYXNvbik7CisJCWlmIChubWlfd2F0Y2hkb2dfdGljayhyZWdzLHJlYXNvbikpCiAJCQlyZXR1cm47Ci0JCX0KLSNlbmRpZgotCQl1bmtub3duX25taV9lcnJvcihyZWFzb24sIHJlZ3MpOworCQlpZiAoIWRvX25taV9jYWxsYmFjayhyZWdzLGNwdSkpCisJCQl1bmtub3duX25taV9lcnJvcihyZWFzb24sIHJlZ3MpOworCiAJCXJldHVybjsKIAl9CiAJaWYgKG5vdGlmeV9kaWUoRElFX05NSSwgIm5taSIsIHJlZ3MsIHJlYXNvbiwgMiwgU0lHSU5UKSA9PSBOT1RJRllfU1RPUCkKQEAgLTEwNzEsNiArMTEyMiw3IEBACiAJCWluaXRfZnB1KG1lKTsKIAlyZXN0b3JlX2ZwdV9jaGVja2luZygmbWUtPnRocmVhZC5pMzg3LmZ4c2F2ZSk7CiAJdGFza190aHJlYWRfaW5mbyhtZSktPnN0YXR1cyB8PSBUU19VU0VERlBVOworCW1lLT5mcHVfY291bnRlcisrOwogfQogCiB2b2lkIF9faW5pdCB0cmFwX2luaXQodm9pZCkKQEAgLTExMDksMjQgKzExNjEsMzAgQEAKIH0KIAogCi0vKiBBY3R1YWwgcGFyc2luZyBpcyBkb25lIGVhcmx5IGluIHNldHVwLmMuICovCi1zdGF0aWMgaW50IF9faW5pdCBvb3BzX2R1bW15KGNoYXIgKnMpCitzdGF0aWMgaW50IF9faW5pdCBvb3BzX3NldHVwKGNoYXIgKnMpCiB7IAotCXBhbmljX29uX29vcHMgPSAxOwotCXJldHVybiAxOworCWlmICghcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFzdHJjbXAocywgInBhbmljIikpCisJCXBhbmljX29uX29vcHMgPSAxOworCXJldHVybiAwOwogfSAKLV9fc2V0dXAoIm9vcHM9Iiwgb29wc19kdW1teSk7IAorZWFybHlfcGFyYW0oIm9vcHMiLCBvb3BzX3NldHVwKTsKIAogc3RhdGljIGludCBfX2luaXQga3N0YWNrX3NldHVwKGNoYXIgKnMpCiB7CisJaWYgKCFzKQorCQlyZXR1cm4gLUVJTlZBTDsKIAlrc3RhY2tfZGVwdGhfdG9fcHJpbnQgPSBzaW1wbGVfc3RydG91bChzLE5VTEwsMCk7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9Ci1fX3NldHVwKCJrc3RhY2s9Iiwga3N0YWNrX3NldHVwKTsKK2Vhcmx5X3BhcmFtKCJrc3RhY2siLCBrc3RhY2tfc2V0dXApOwogCiAjaWZkZWYgQ09ORklHX1NUQUNLX1VOV0lORAogc3RhdGljIGludCBfX2luaXQgY2FsbF90cmFjZV9zZXR1cChjaGFyICpzKQogeworCWlmICghcykKKwkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHN0cmNtcChzLCAib2xkIikgPT0gMCkKIAkJY2FsbF90cmFjZSA9IC0xOwogCWVsc2UgaWYgKHN0cmNtcChzLCAiYm90aCIpID09IDApCkBAIC0xMTM1LDcgKzExOTMsNyBAQAogCQljYWxsX3RyYWNlID0gMTsKIAllbHNlIGlmIChzdHJjbXAocywgIm5ldyIpID09IDApCiAJCWNhbGxfdHJhY2UgPSAyOwotCXJldHVybiAxOworCXJldHVybiAwOwogfQotX19zZXR1cCgiY2FsbF90cmFjZT0iLCBjYWxsX3RyYWNlX3NldHVwKTsKK2Vhcmx5X3BhcmFtKCJjYWxsX3RyYWNlIiwgY2FsbF90cmFjZV9zZXR1cCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TIGIvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggN2M0ZGUzMS4uZDA1NjRmMSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTEzLDYgKzEzLDEyIEBACiBPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKIEVOVFJZKHBoeXNfc3RhcnR1cF82NCkKIGppZmZpZXNfNjQgPSBqaWZmaWVzOworUEhEUlMgeworCXRleHQgUFRfTE9BRCBGTEFHUyg1KTsJLyogUl9FICovCisJZGF0YSBQVF9MT0FEIEZMQUdTKDcpOwkvKiBSV0UgKi8KKwl1c2VyIFBUX0xPQUQgRkxBR1MoNyk7CS8qIFJXRSAqLworCW5vdGUgUFRfTk9URSBGTEFHUyg0KTsJLyogUl9fICovCit9CiBTRUNUSU9OUwogewogICAuID0gX19TVEFSVF9LRVJORUw7CkBAIC0zMSw3ICszNyw3IEBACiAJS1BST0JFU19URVhUCiAJKiguZml4dXApCiAJKiguZ251Lndhcm5pbmcpCi0JfSA9IDB4OTA5MAorCX0gOnRleHQgPSAweDkwOTAKICAgCQkJCS8qIG91dC1vZi1saW5lIGxvY2sgdGV4dCAqLwogICAudGV4dC5sb2NrIDogQVQoQUREUigudGV4dC5sb2NrKSAtIExPQURfT0ZGU0VUKSB7ICooLnRleHQubG9jaykgfQogCkBAIC01Nyw3ICs2Myw3IEBACiAgIC5kYXRhIDogQVQoQUREUiguZGF0YSkgLSBMT0FEX09GRlNFVCkgewogCSooLmRhdGEpCiAJQ09OU1RSVUNUT1JTCi0JfQorCX0gOmRhdGEKIAogICBfZWRhdGEgPSAuOwkJCS8qIEVuZCBvZiBkYXRhIHNlY3Rpb24gKi8KIApAQCAtODksNyArOTUsNyBAQAogI2RlZmluZSBWVklSVCh4KSAoQUREUih4KSAtIFZWSVJUX09GRlNFVCkKIAogICAuID0gVlNZU0NBTExfQUREUjsKLSAgLnZzeXNjYWxsXzAgOgkgQVQoVlNZU0NBTExfUEhZU19BRERSKSB7ICooLnZzeXNjYWxsXzApIH0KKyAgLnZzeXNjYWxsXzAgOgkgQVQoVlNZU0NBTExfUEhZU19BRERSKSB7ICooLnZzeXNjYWxsXzApIH0gOnVzZXIKICAgX192c3lzY2FsbF8wID0gVlNZU0NBTExfVklSVF9BRERSOwogCiAgIC4gPSBBTElHTihDT05GSUdfWDg2X0wxX0NBQ0hFX0JZVEVTKTsKQEAgLTk5LDYgKzEwNSw5IEBACiAgIC52eHRpbWUgOiBBVChWTE9BRCgudnh0aW1lKSkgeyAqKC52eHRpbWUpIH0KICAgdnh0aW1lID0gVlZJUlQoLnZ4dGltZSk7CiAKKyAgLnZnZXRjcHVfbW9kZSA6IEFUKFZMT0FEKC52Z2V0Y3B1X21vZGUpKSB7ICooLnZnZXRjcHVfbW9kZSkgfQorICB2Z2V0Y3B1X21vZGUgPSBWVklSVCgudmdldGNwdV9tb2RlKTsKKwogICAud2FsbF9qaWZmaWVzIDogQVQoVkxPQUQoLndhbGxfamlmZmllcykpIHsgKigud2FsbF9qaWZmaWVzKSB9CiAgIHdhbGxfamlmZmllcyA9IFZWSVJUKC53YWxsX2ppZmZpZXMpOwogCkBAIC0xMzIsNyArMTQxLDcgQEAKICAgLiA9IEFMSUdOKDgxOTIpOwkJLyogaW5pdF90YXNrICovCiAgIC5kYXRhLmluaXRfdGFzayA6IEFUKEFERFIoLmRhdGEuaW5pdF90YXNrKSAtIExPQURfT0ZGU0VUKSB7CiAJKiguZGF0YS5pbml0X3Rhc2spCi0gIH0KKyAgfSA6ZGF0YQogCiAgIC4gPSBBTElHTig0MDk2KTsKICAgLmRhdGEucGFnZV9hbGlnbmVkIDogQVQoQUREUiguZGF0YS5wYWdlX2FsaWduZWQpIC0gTE9BRF9PRkZTRVQpIHsKQEAgLTIwNywxNCArMjE2LDEyIEBACiAgIF9faW5pdHJhbWZzX3N0YXJ0ID0gLjsKICAgLmluaXQucmFtZnMgOiBBVChBRERSKC5pbml0LnJhbWZzKSAtIExPQURfT0ZGU0VUKSB7ICooLmluaXQucmFtZnMpIH0KICAgX19pbml0cmFtZnNfZW5kID0gLjsKLSAgLyogdGVtcG9yYXJ5IGhlcmUgdG8gd29yayBhcm91bmQgTlJfQ1BVUy4gSWYgeW91IHNlZSB0aGlzIGNvbW1lbnQgaW4gMi42LjE3KwotICAgY29tcGxhaW4gKi8KLSAgLiA9IEFMSUdOKDQwOTYpOwkKLSAgX19pbml0X2VuZCA9IC47CQotICAuID0gQUxJR04oQ09ORklHX1g4Nl9MMV9DQUNIRV9CWVRFUyk7CisgICAgLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOwogICBfX3Blcl9jcHVfc3RhcnQgPSAuOwogICAuZGF0YS5wZXJjcHUgIDogQVQoQUREUiguZGF0YS5wZXJjcHUpIC0gTE9BRF9PRkZTRVQpIHsgKiguZGF0YS5wZXJjcHUpIH0KICAgX19wZXJfY3B1X2VuZCA9IC47CisgIC4gPSBBTElHTig0MDk2KTsKKyAgX19pbml0X2VuZCA9IC47CiAKICAgLiA9IEFMSUdOKDQwOTYpOwogICBfX25vc2F2ZV9iZWdpbiA9IC47CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdnNtcC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3ZzbXAuYwppbmRleCA5MmY3MGM3Li4wNDRlODUyIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvdnNtcC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC92c21wLmMKQEAgLTIwLDYgKzIwLDkgQEAKIAl2b2lkICphZGRyZXNzOwogCXVuc2lnbmVkIGludCBjYXAsIGN0bDsKIAorCWlmICghZWFybHlfcGNpX2FsbG93ZWQoKSkKKwkJcmV0dXJuIDA7CisKIAkvKiBDaGVjayBpZiB3ZSBhcmUgcnVubmluZyBvbiBhIFNjYWxlTVAgdlNNUCBib3ggKi8KIAlpZiAoKHJlYWRfcGNpX2NvbmZpZ18xNigwLCAweDFmLCAwLCBQQ0lfVkVORE9SX0lEKSAhPSBQQ0lfVkVORE9SX0lEX1NDQUxFTVApIHx8CiAJICAgIChyZWFkX3BjaV9jb25maWdfMTYoMCwgMHgxZiwgMCwgUENJX0RFVklDRV9JRCkgIT0gUENJX0RFVklDRV9JRF9TQ0FMRU1QX1ZTTVBfQ1RMKSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3ZzeXNjYWxsLmMKaW5kZXggZjYwMzAzNy4uYWM0OGMzOCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3ZzeXNjYWxsLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3ZzeXNjYWxsLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2dldGNwdS5oPgogCiAjaW5jbHVkZSA8YXNtL3ZzeXNjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTMzLDExICszNCwxNSBAQAogI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgorI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL3RvcG9sb2d5Lmg+CiAKICNkZWZpbmUgX192c3lzY2FsbChucikgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCxfX3NlY3Rpb25fXygiLnZzeXNjYWxsXyIgI25yKSkpCiAKIGludCBfX3N5c2N0bF92c3lzY2FsbCBfX3NlY3Rpb25fc3lzY3RsX3ZzeXNjYWxsID0gMTsKIHNlcWxvY2tfdCBfX3h0aW1lX2xvY2sgX19zZWN0aW9uX3h0aW1lX2xvY2sgPSBTRVFMT0NLX1VOTE9DS0VEOworaW50IF9fdmdldGNwdV9tb2RlIF9fc2VjdGlvbl92Z2V0Y3B1X21vZGU7CiAKICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiAKQEAgLTcyLDcgKzc3LDggQEAKIAkJCQkgX192eHRpbWUudHNjX3F1b3QpID4+IDMyOwogCQkJLyogU2VlIGNvbW1lbnQgaW4geDg2XzY0IGRvX2dldHRpbWVvZmRheS4gKi8KIAkJfSBlbHNlIHsKLQkJCXVzZWMgKz0gKChyZWFkbCgodm9pZCAqKWZpeF90b192aXJ0KFZTWVNDQUxMX0hQRVQpICsgMHhmMCkgLQorCQkJdXNlYyArPSAoKHJlYWRsKCh2b2lkIF9faW9tZW0gKikKKwkJCQkgICBmaXhfdG9fdmlydChWU1lTQ0FMTF9IUEVUKSArIDB4ZjApIC0KIAkJCQkgIF9fdnh0aW1lLmxhc3QpICogX192eHRpbWUucXVvdCkgPj4gMzI7CiAJCX0KIAl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZfX3h0aW1lX2xvY2ssIHNlcXVlbmNlKSk7CkBAIC0xMjcsOSArMTMzLDQ2IEBACiAJcmV0dXJuIF9feHRpbWUudHZfc2VjOwogfQogCi1sb25nIF9fdnN5c2NhbGwoMikgdmVub3N5c18wKHZvaWQpCisvKiBGYXN0IHdheSB0byBnZXQgY3VycmVudCBDUFUgYW5kIG5vZGUuCisgICBUaGlzIGhlbHBzIHRvIGRvIHBlciBub2RlIGFuZCBwZXIgQ1BVIGNhY2hlcyBpbiB1c2VyIHNwYWNlLgorICAgVGhlIHJlc3VsdCBpcyBub3QgZ3VhcmFudGVlZCB3aXRob3V0IENQVSBhZmZpbml0eSwgYnV0IHVzdWFsbHkKKyAgIHdvcmtzIG91dCBiZWNhdXNlIHRoZSBzY2hlZHVsZXIgdHJpZXMgdG8ga2VlcCBhIHRocmVhZCBvbiB0aGUgc2FtZQorICAgQ1BVLgorCisgICB0Y2FjaGUgbXVzdCBwb2ludCB0byBhIHR3byBlbGVtZW50IHNpemVkIGxvbmcgYXJyYXkuCisgICBBbGwgYXJndW1lbnRzIGNhbiBiZSBOVUxMLiAqLworbG9uZyBfX3ZzeXNjYWxsKDIpCit2Z2V0Y3B1KHVuc2lnbmVkICpjcHUsIHVuc2lnbmVkICpub2RlLCBzdHJ1Y3QgZ2V0Y3B1X2NhY2hlICp0Y2FjaGUpCiB7Ci0JcmV0dXJuIC1FTk9TWVM7CisJdW5zaWduZWQgaW50IGR1bW15LCBwOworCXVuc2lnbmVkIGxvbmcgaiA9IDA7CisKKwkvKiBGYXN0IGNhY2hlIC0gb25seSByZWNvbXB1dGUgdmFsdWUgb25jZSBwZXIgamlmZmllcyBhbmQgYXZvaWQKKwkgICByZWxhdGl2ZWx5IGNvc3RseSByZHRzY3AvY3B1aWQgb3RoZXJ3aXNlLgorCSAgIFRoaXMgd29ya3MgYmVjYXVzZSB0aGUgc2NoZWR1bGVyIHVzdWFsbHkga2VlcHMgdGhlIHByb2Nlc3MKKwkgICBvbiB0aGUgc2FtZSBDUFUgYW5kIHRoaXMgc3lzY2FsbCBkb2Vzbid0IGd1YXJhbnRlZSBpdHMKKwkgICByZXN1bHRzIGFueXdheXMuCisJICAgV2UgZG8gdGhpcyBoZXJlIGJlY2F1c2Ugb3RoZXJ3aXNlIHVzZXIgc3BhY2Ugd291bGQgZG8gaXQgb24KKwkgICBpdHMgb3duIGluIGEgbGlrZWx5IGluZmVyaW9yIHdheSAobm8gYWNjZXNzIHRvIGppZmZpZXMpLgorCSAgIElmIHlvdSBkb24ndCBsaWtlIGl0IHBhc3MgTlVMTC4gKi8KKwlpZiAodGNhY2hlICYmIHRjYWNoZS0+dDAgPT0gKGogPSBfX2ppZmZpZXMpKSB7CisJCXAgPSB0Y2FjaGUtPnQxOworCX0gZWxzZSBpZiAoX192Z2V0Y3B1X21vZGUgPT0gVkdFVENQVV9SRFRTQ1ApIHsKKwkJLyogTG9hZCBwZXIgQ1BVIGRhdGEgZnJvbSBSRFRTQ1AgKi8KKwkJcmR0c2NwKGR1bW15LCBkdW1teSwgcCk7CisJfSBlbHNlIHsKKwkJLyogTG9hZCBwZXIgQ1BVIGRhdGEgZnJvbSBHRFQgKi8KKwkJYXNtKCJsc2wgJTEsJTAiIDogIj1yIiAocCkgOiAiciIgKF9fUEVSX0NQVV9TRUcpKTsKKwl9CisJaWYgKHRjYWNoZSkgeworCQl0Y2FjaGUtPnQwID0gajsKKwkJdGNhY2hlLT50MSA9IHA7CisJfQorCWlmIChjcHUpCisJCSpjcHUgPSBwICYgMHhmZmY7CisJaWYgKG5vZGUpCisJCSpub2RlID0gcCA+PiAxMjsKKwlyZXR1cm4gMDsKIH0KIAogbG9uZyBfX3ZzeXNjYWxsKDMpIHZlbm9zeXNfMSh2b2lkKQpAQCAtMTQ5LDcgKzE5Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlleHRlcm4gdTE2IHZzeXNjMSwgdnN5c2MyOwotCXUxNiAqbWFwMSwgKm1hcDI7CisJdTE2IF9faW9tZW0gKm1hcDE7CisJdTE2IF9faW9tZW0gKm1hcDI7CiAJaW50IHJldCA9IHByb2NfZG9pbnR2ZWMoY3RsLCB3cml0ZSwgZmlscCwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIAlpZiAoIXdyaXRlKQogCQlyZXR1cm4gcmV0OwpAQCAtMTY0LDExICsyMDgsMTEgQEAKIAkJZ290byBvdXQ7CiAJfQogCWlmICghc3lzY3RsX3ZzeXNjYWxsKSB7Ci0JCSptYXAxID0gU1lTQ0FMTDsKLQkJKm1hcDIgPSBTWVNDQUxMOworCQl3cml0ZXcoU1lTQ0FMTCwgbWFwMSk7CisJCXdyaXRldyhTWVNDQUxMLCBtYXAyKTsKIAl9IGVsc2UgewotCQkqbWFwMSA9IE5PUDI7Ci0JCSptYXAyID0gTk9QMjsKKwkJd3JpdGV3KE5PUDIsIG1hcDEpOworCQl3cml0ZXcoTk9QMiwgbWFwMik7CiAJfQogCWlvdW5tYXAobWFwMik7CiBvdXQ6CkBAIC0yMDAsNiArMjQ0LDQzIEBACiAKICNlbmRpZgogCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgd3JpdGVfcmR0c2NwX2NiKHZvaWQgKmluZm8pCit7CisJd3JpdGVfcmR0c2NwX2F1eCgodW5zaWduZWQgbG9uZylpbmZvKTsKK30KKwordm9pZCBfX2NwdWluaXQgdnN5c2NhbGxfc2V0X2NwdShpbnQgY3B1KQoreworCXVuc2lnbmVkIGxvbmcgKmQ7CisJdW5zaWduZWQgbG9uZyBub2RlID0gMDsKKyNpZmRlZiBDT05GSUdfTlVNQQorCW5vZGUgPSBjcHVfdG9fbm9kZVtjcHVdOworI2VuZGlmCisJaWYgKGNwdV9oYXMoJmNwdV9kYXRhW2NwdV0sIFg4Nl9GRUFUVVJFX1JEVFNDUCkpIHsKKwkJdm9pZCAqaW5mbyA9ICh2b2lkICopKChub2RlIDw8IDEyKSB8IGNwdSk7CisJCS8qIENhbiBoYXBwZW4gb24gcHJlZW1wdGl2ZSBrZXJuZWwgKi8KKwkJaWYgKGdldF9jcHUoKSA9PSBjcHUpCisJCQl3cml0ZV9yZHRzY3BfY2IoaW5mbyk7CisjaWZkZWYgQ09ORklHX1NNUAorCQllbHNlIHsKKwkJCS8qIHRoZSBub3RpZmllciBpcyB1bmZvcnR1bmF0ZWx5IG5vdCBleGVjdXRlZCBvbiB0aGUKKwkJCSAgIHRhcmdldCBDUFUgKi8KKwkJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsd3JpdGVfcmR0c2NwX2NiLGluZm8sMCwxKTsKKwkJfQorI2VuZGlmCisJCXB1dF9jcHUoKTsKKwl9CisKKwkvKiBTdG9yZSBjcHUgbnVtYmVyIGluIGxpbWl0IHNvIHRoYXQgaXQgY2FuIGJlIGxvYWRlZCBxdWlja2x5CisJICAgaW4gdXNlciBzcGFjZSBpbiB2Z2V0Y3B1LgorCSAgIDEyIGJpdHMgZm9yIHRoZSBDUFUgYW5kIDggYml0cyBmb3IgdGhlIG5vZGUuICovCisJZCA9ICh1bnNpZ25lZCBsb25nICopKGNwdV9nZHQoY3B1KSArIEdEVF9FTlRSWV9QRVJfQ1BVKTsKKwkqZCA9IDB4MGY0MDAwMDAwMDAwMFVMTDsKKwkqZCB8PSBjcHU7CisJKmQgfD0gKG5vZGUgJiAweGYpIDw8IDEyOworCSpkIHw9IChub2RlID4+IDQpIDw8IDQ4OworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgbWFwX3ZzeXNjYWxsKHZvaWQpCiB7CiAJZXh0ZXJuIGNoYXIgX192c3lzY2FsbF8wOwpAQCAtMjE0LDYgKzI5NSw3IEBACiAJCQlWU1lTQ0FMTF9BRERSKF9fTlJfdmdldHRpbWVvZmRheSkpKTsKIAlCVUdfT04oKHVuc2lnbmVkIGxvbmcpICZ2dGltZSAhPSBWU1lTQ0FMTF9BRERSKF9fTlJfdnRpbWUpKTsKIAlCVUdfT04oKFZTWVNDQUxMX0FERFIoMCkgIT0gX19maXhfdG9fdmlydChWU1lTQ0FMTF9GSVJTVF9QQUdFKSkpOworCUJVR19PTigodW5zaWduZWQgbG9uZykgJnZnZXRjcHUgIT0gVlNZU0NBTExfQUREUihfX05SX3ZnZXRjcHUpKTsKIAltYXBfdnN5c2NhbGwoKTsKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAJcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKGtlcm5lbF9yb290X3RhYmxlMiwgMCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwveDg2NjRfa3N5bXMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC94ODY2NF9rc3ltcy5jCmluZGV4IDM3MDk1MmMuLmMzNDU0YWYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC94ODY2NF9rc3ltcy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC94ODY2NF9rc3ltcy5jCkBAIC0yOSw2ICsyOSw3IEBACiBFWFBPUlRfU1lNQk9MKGNvcHlfdXNlcl9nZW5lcmljKTsKIEVYUE9SVF9TWU1CT0woY29weV9mcm9tX3VzZXIpOwogRVhQT1JUX1NZTUJPTChjb3B5X3RvX3VzZXIpOworRVhQT1JUX1NZTUJPTChfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKTsKIAogRVhQT1JUX1NZTUJPTChjb3B5X3BhZ2UpOwogRVhQT1JUX1NZTUJPTChjbGVhcl9wYWdlKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2xpYi9NYWtlZmlsZSBiL2FyY2gveDg2XzY0L2xpYi9NYWtlZmlsZQppbmRleCBjY2VmNmFlLi5iNzhkNDE3IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC94ODZfNjQvbGliL01ha2VmaWxlCkBAIC05LDQgKzksNCBAQAogbGliLXkgOj0gY3N1bS1wYXJ0aWFsLm8gY3N1bS1jb3B5Lm8gY3N1bS13cmFwcGVycy5vIGRlbGF5Lm8gXAogCXVzZXJjb3B5Lm8gZ2V0dXNlci5vIHB1dHVzZXIubyAgXAogCXRodW5rLm8gY2xlYXJfcGFnZS5vIGNvcHlfcGFnZS5vIGJpdHN0ci5vIGJpdG9wcy5vCi1saWIteSArPSBtZW1jcHkubyBtZW1tb3ZlLm8gbWVtc2V0Lm8gY29weV91c2VyLm8KK2xpYi15ICs9IG1lbWNweS5vIG1lbW1vdmUubyBtZW1zZXQubyBjb3B5X3VzZXIubyByd2xvY2subwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvbGliL2NsZWFyX3BhZ2UuUyBiL2FyY2gveDg2XzY0L2xpYi9jbGVhcl9wYWdlLlMKaW5kZXggMWY4MWI3OS4uOWExMGE3OCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbGliL2NsZWFyX3BhZ2UuUworKysgYi9hcmNoL3g4Nl82NC9saWIvY2xlYXJfcGFnZS5TCkBAIC0xLDEwICsxLDIyIEBACisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9kd2FyZjIuaD4KKwogLyoKICAqIFplcm8gYSBwYWdlLiAJCiAgKiByZGkJcGFnZQogICovCQkJCi0JLmdsb2JsIGNsZWFyX3BhZ2UKLQkucDJhbGlnbiA0Ci1jbGVhcl9wYWdlOgorCUFMSUdOCitjbGVhcl9wYWdlX2M6CisJQ0ZJX1NUQVJUUFJPQworCW1vdmwgJDQwOTYvOCwlZWN4CisJeG9ybCAlZWF4LCVlYXgKKwlyZXAgc3Rvc3EKKwlyZXQKKwlDRklfRU5EUFJPQworRU5EUFJPQyhjbGVhcl9wYWdlKQorCitFTlRSWShjbGVhcl9wYWdlKQorCUNGSV9TVEFSVFBST0MKIAl4b3JsICAgJWVheCwlZWF4CiAJbW92bCAgICQ0MDk2LzY0LCVlY3gKIAkucDJhbGlnbiA0CkBAIC0yMywyOCArMzUsMjUgQEAKIAlqbnoJLkxsb29wCiAJbm9wCiAJcmV0Ci1jbGVhcl9wYWdlX2VuZDoKKwlDRklfRU5EUFJPQworLkxjbGVhcl9wYWdlX2VuZDoKK0VORFBST0MoY2xlYXJfcGFnZSkKIAogCS8qIFNvbWUgQ1BVcyBydW4gZmFzdGVyIHVzaW5nIHRoZSBzdHJpbmcgaW5zdHJ1Y3Rpb25zLgogCSAgIEl0IGlzIGFsc28gYSBsb3Qgc2ltcGxlci4gVXNlIHRoaXMgd2hlbiBwb3NzaWJsZSAqLwogCiAjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KIAorCS5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwiYXgiCisxOgkuYnl0ZSAweGViCQkJCQkvKiBqbXAgPGRpc3A4PiAqLworCS5ieXRlIChjbGVhcl9wYWdlX2MgLSBjbGVhcl9wYWdlKSAtICgyZiAtIDFiKQkvKiBvZmZzZXQgKi8KKzI6CisJLnByZXZpb3VzCiAJLnNlY3Rpb24gLmFsdGluc3RydWN0aW9ucywiYSIKIAkuYWxpZ24gOAotCS5xdWFkICBjbGVhcl9wYWdlCi0JLnF1YWQgIGNsZWFyX3BhZ2VfYwotCS5ieXRlICBYODZfRkVBVFVSRV9SRVBfR09PRAotCS5ieXRlICBjbGVhcl9wYWdlX2VuZC1jbGVhcl9wYWdlCi0JLmJ5dGUgIGNsZWFyX3BhZ2VfY19lbmQtY2xlYXJfcGFnZV9jCi0JLnByZXZpb3VzCi0KLQkuc2VjdGlvbiAuYWx0aW5zdHJfcmVwbGFjZW1lbnQsImF4IgotY2xlYXJfcGFnZV9jOgotCW1vdmwgJDQwOTYvOCwlZWN4Ci0JeG9ybCAlZWF4LCVlYXgKLQlyZXAgCi0Jc3Rvc3EKLQlyZXQKLWNsZWFyX3BhZ2VfY19lbmQ6CisJLnF1YWQgY2xlYXJfcGFnZQorCS5xdWFkIDFiCisJLmJ5dGUgWDg2X0ZFQVRVUkVfUkVQX0dPT0QKKwkuYnl0ZSAuTGNsZWFyX3BhZ2VfZW5kIC0gY2xlYXJfcGFnZQorCS5ieXRlIDJiIC0gMWIKIAkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2xpYi9jb3B5X3BhZ2UuUyBiL2FyY2gveDg2XzY0L2xpYi9jb3B5X3BhZ2UuUwppbmRleCA4ZmExOWQ5Li4wZWJiMDNiIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9saWIvY29weV9wYWdlLlMKKysrIGIvYXJjaC94ODZfNjQvbGliL2NvcHlfcGFnZS5TCkBAIC0xLDE3ICsxLDMzIEBACiAvKiBXcml0dGVuIDIwMDMgYnkgQW5kaSBLbGVlbiwgYmFzZWQgb24gYSBrZXJuZWwgYnkgRXZhbmRybyBNZW5lemVzICovCiAJCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9kd2FyZjIuaD4KKworCUFMSUdOCitjb3B5X3BhZ2VfYzoKKwlDRklfU1RBUlRQUk9DCisJbW92bCAkNDA5Ni84LCVlY3gKKwlyZXAgbW92c3EKKwlyZXQKKwlDRklfRU5EUFJPQworRU5EUFJPQyhjb3B5X3BhZ2VfYykKKwogLyogRG9uJ3QgdXNlIHN0cmVhbWluZyBzdG9yZSBiZWNhdXNlIGl0J3MgYmV0dGVyIHdoZW4gdGhlIHRhcmdldAogICAgZW5kcyB1cCBpbiBjYWNoZS4gKi8KIAkgICAgCiAvKiBDb3VsZCB2YXJ5IHRoZSBwcmVmZXRjaCBkaXN0YW5jZSBiYXNlZCBvbiBTTVAvVVAgKi8KIAotCS5nbG9ibCBjb3B5X3BhZ2UKLQkucDJhbGlnbiA0Ci1jb3B5X3BhZ2U6CitFTlRSWShjb3B5X3BhZ2UpCisJQ0ZJX1NUQVJUUFJPQwogCXN1YnEJJDMqOCwlcnNwCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDMqOAogCW1vdnEJJXJieCwoJXJzcCkKKwlDRklfUkVMX09GRlNFVCByYngsIDAKIAltb3ZxCSVyMTIsMSo4KCVyc3ApCisJQ0ZJX1JFTF9PRkZTRVQgcjEyLCAxKjgKIAltb3ZxCSVyMTMsMio4KCVyc3ApCisJQ0ZJX1JFTF9PRkZTRVQgcjEzLCAyKjgKIAogCW1vdmwJJCg0MDk2LzY0KS01LCVlY3gKIAkucDJhbGlnbiA0CkBAIC03MiwzMCArODgsMzMgQEAKIAlqbnoJLkxvb3AyCiAKIAltb3ZxCSglcnNwKSwlcmJ4CisJQ0ZJX1JFU1RPUkUgcmJ4CiAJbW92cQkxKjgoJXJzcCksJXIxMgorCUNGSV9SRVNUT1JFIHIxMgogCW1vdnEJMio4KCVyc3ApLCVyMTMKKwlDRklfUkVTVE9SRSByMTMKIAlhZGRxCSQzKjgsJXJzcAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtMyo4CiAJcmV0CisuTGNvcHlfcGFnZV9lbmQ6CisJQ0ZJX0VORFBST0MKK0VORFBST0MoY29weV9wYWdlKQogCiAJLyogU29tZSBDUFVzIHJ1biBmYXN0ZXIgdXNpbmcgdGhlIHN0cmluZyBjb3B5IGluc3RydWN0aW9ucy4KIAkgICBJdCBpcyBhbHNvIGEgbG90IHNpbXBsZXIuIFVzZSB0aGlzIHdoZW4gcG9zc2libGUgKi8KIAogI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CiAKKwkuc2VjdGlvbiAuYWx0aW5zdHJfcmVwbGFjZW1lbnQsImF4IgorMToJLmJ5dGUgMHhlYgkJCQkJLyogam1wIDxkaXNwOD4gKi8KKwkuYnl0ZSAoY29weV9wYWdlX2MgLSBjb3B5X3BhZ2UpIC0gKDJmIC0gMWIpCS8qIG9mZnNldCAqLworMjoKKwkucHJldmlvdXMKIAkuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLCJhIgogCS5hbGlnbiA4Ci0JLnF1YWQgIGNvcHlfcGFnZQotCS5xdWFkICBjb3B5X3BhZ2VfYwotCS5ieXRlICBYODZfRkVBVFVSRV9SRVBfR09PRAotCS5ieXRlICBjb3B5X3BhZ2VfY19lbmQtY29weV9wYWdlX2MKLQkuYnl0ZSAgY29weV9wYWdlX2NfZW5kLWNvcHlfcGFnZV9jCi0JLnByZXZpb3VzCi0KLQkuc2VjdGlvbiAuYWx0aW5zdHJfcmVwbGFjZW1lbnQsImF4IgotY29weV9wYWdlX2M6Ci0JbW92bCAkNDA5Ni84LCVlY3gKLQlyZXAgCi0JbW92c3EgCi0JcmV0Ci1jb3B5X3BhZ2VfY19lbmQ6CisJLnF1YWQgY29weV9wYWdlCisJLnF1YWQgMWIKKwkuYnl0ZSBYODZfRkVBVFVSRV9SRVBfR09PRAorCS5ieXRlIC5MY29weV9wYWdlX2VuZCAtIGNvcHlfcGFnZQorCS5ieXRlIDJiIC0gMWIKIAkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2xpYi9jb3B5X3VzZXIuUyBiL2FyY2gveDg2XzY0L2xpYi9jb3B5X3VzZXIuUwppbmRleCBmNjQ1NjliLi43MGJlYmQzIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9saWIvY29weV91c2VyLlMKKysrIGIvYXJjaC94ODZfNjQvbGliL2NvcHlfdXNlci5TCkBAIC00LDU2ICs0LDc4IEBACiAgKiBGdW5jdGlvbnMgdG8gY29weSBmcm9tIGFuZCB0byB1c2VyIHNwYWNlLgkJCiAgKi8JCSAKIAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CisKICNkZWZpbmUgRklYX0FMSUdOTUVOVCAxCiAKLQkjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KLQkjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0JI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgotCSNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKworCS5tYWNybyBBTFRFUk5BVElWRV9KVU1QIGZlYXR1cmUsb3JpZyxhbHQKKzA6CisJLmJ5dGUgMHhlOQkvKiAzMmJpdCBqdW1wICovCisJLmxvbmcgXG9yaWctMWYJLyogYnkgZGVmYXVsdCBqdW1wIHRvIG9yaWcgKi8KKzE6CisJLnNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LCJheCIKKzI6CS5ieXRlIDB4ZTkJICAgICAgICAgICAgIC8qIG5lYXIganVtcCB3aXRoIDMyYml0IGltbWVkaWF0ZSAqLworCS5sb25nIFxhbHQtMWIgLyogb2Zmc2V0ICovICAgLyogb3IgYWx0ZXJuYXRpdmVseSB0byBhbHQgKi8KKwkucHJldmlvdXMKKwkuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLCJhIgorCS5hbGlnbiA4CisJLnF1YWQgIDBiCisJLnF1YWQgIDJiCisJLmJ5dGUgIFxmZWF0dXJlCQkgICAgIC8qIHdoZW4gZmVhdHVyZSBpcyBzZXQgKi8KKwkuYnl0ZSAgNQorCS5ieXRlICA1CisJLnByZXZpb3VzCisJLmVuZG0KIAogLyogU3RhbmRhcmQgY29weV90b191c2VyIHdpdGggc2VnbWVudCBsaW1pdCBjaGVja2luZyAqLwkJCi0JLmdsb2JsIGNvcHlfdG9fdXNlcgotCS5wMmFsaWduIDQJCi1jb3B5X3RvX3VzZXI6CitFTlRSWShjb3B5X3RvX3VzZXIpCisJQ0ZJX1NUQVJUUFJPQwogCUdFVF9USFJFQURfSU5GTyglcmF4KQogCW1vdnEgJXJkaSwlcmN4CiAJYWRkcSAlcmR4LCVyY3gKIAlqYyAgYmFkX3RvX3VzZXIKIAljbXBxIHRocmVhZGluZm9fYWRkcl9saW1pdCglcmF4KSwlcmN4CiAJamFlIGJhZF90b191c2VyCi0yOgotCS5ieXRlIDB4ZTkJLyogMzJiaXQganVtcCAqLwotCS5sb25nIC5MY3VnLTFmCi0xOgorCXhvcmwgJWVheCwlZWF4CS8qIGNsZWFyIHplcm8gZmxhZyAqLworCUFMVEVSTkFUSVZFX0pVTVAgWDg2X0ZFQVRVUkVfUkVQX0dPT0QsY29weV91c2VyX2dlbmVyaWNfdW5yb2xsZWQsY29weV91c2VyX2dlbmVyaWNfc3RyaW5nCisJQ0ZJX0VORFBST0MKIAotCS5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwiYXgiCi0zOgkuYnl0ZSAweGU5CQkJLyogcmVwbGFjZW1lbnQgam1wIHdpdGggOCBiaXQgaW1tZWRpYXRlICovCi0JLmxvbmcgY29weV91c2VyX2dlbmVyaWNfYy0xYgkvKiBvZmZzZXQgKi8KLQkucHJldmlvdXMKLQkuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLCJhIgotCS5hbGlnbiA4Ci0JLnF1YWQgIDJiCi0JLnF1YWQgIDNiCi0JLmJ5dGUgIFg4Nl9GRUFUVVJFX1JFUF9HT09ECi0JLmJ5dGUgIDUKLQkuYnl0ZSAgNQotCS5wcmV2aW91cworRU5UUlkoY29weV91c2VyX2dlbmVyaWMpCisJQ0ZJX1NUQVJUUFJPQworCW1vdmwgJDEsJWVjeAkvKiBzZXQgemVybyBmbGFnICovCisJQUxURVJOQVRJVkVfSlVNUCBYODZfRkVBVFVSRV9SRVBfR09PRCxjb3B5X3VzZXJfZ2VuZXJpY191bnJvbGxlZCxjb3B5X3VzZXJfZ2VuZXJpY19zdHJpbmcKKwlDRklfRU5EUFJPQworCitFTlRSWShfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKQorCUNGSV9TVEFSVFBST0MKKwl4b3JsICVlY3gsJWVjeAkvKiBjbGVhciB6ZXJvIGZsYWcgKi8KKwlBTFRFUk5BVElWRV9KVU1QIFg4Nl9GRUFUVVJFX1JFUF9HT09ELGNvcHlfdXNlcl9nZW5lcmljX3Vucm9sbGVkLGNvcHlfdXNlcl9nZW5lcmljX3N0cmluZworCUNGSV9FTkRQUk9DCiAKIC8qIFN0YW5kYXJkIGNvcHlfZnJvbV91c2VyIHdpdGggc2VnbWVudCBsaW1pdCBjaGVja2luZyAqLwkKLQkuZ2xvYmwgY29weV9mcm9tX3VzZXIKLQkucDJhbGlnbiA0CQotY29weV9mcm9tX3VzZXI6CitFTlRSWShjb3B5X2Zyb21fdXNlcikKKwlDRklfU1RBUlRQUk9DCiAJR0VUX1RIUkVBRF9JTkZPKCVyYXgpCiAJbW92cSAlcnNpLCVyY3gKIAlhZGRxICVyZHgsJXJjeAogCWpjICBiYWRfZnJvbV91c2VyCiAJY21wcSB0aHJlYWRpbmZvX2FkZHJfbGltaXQoJXJheCksJXJjeAogCWphZSAgYmFkX2Zyb21fdXNlcgotCS8qIEZBTEwgVEhST1VHSCB0byBjb3B5X3VzZXJfZ2VuZXJpYyAqLworCW1vdmwgJDEsJWVjeAkvKiBzZXQgemVybyBmbGFnICovCisJQUxURVJOQVRJVkVfSlVNUCBYODZfRkVBVFVSRV9SRVBfR09PRCxjb3B5X3VzZXJfZ2VuZXJpY191bnJvbGxlZCxjb3B5X3VzZXJfZ2VuZXJpY19zdHJpbmcKKwlDRklfRU5EUFJPQworRU5EUFJPQyhjb3B5X2Zyb21fdXNlcikKIAkKIAkuc2VjdGlvbiAuZml4dXAsImF4IgogCS8qIG11c3QgemVybyBkZXN0ICovCiBiYWRfZnJvbV91c2VyOgorCUNGSV9TVEFSVFBST0MKIAltb3ZsICVlZHgsJWVjeAogCXhvcmwgJWVheCwlZWF4CiAJcmVwCkBAIC02MSw0MCArODMsMzIgQEAKIGJhZF90b191c2VyOgogCW1vdmwJJWVkeCwlZWF4CiAJcmV0CisJQ0ZJX0VORFBST0MKK0VORChiYWRfZnJvbV91c2VyKQogCS5wcmV2aW91cwogCQogCQkKIC8qCi0gKiBjb3B5X3VzZXJfZ2VuZXJpYyAtIG1lbW9yeSBjb3B5IHdpdGggZXhjZXB0aW9uIGhhbmRsaW5nLgorICogY29weV91c2VyX2dlbmVyaWNfdW5yb2xsZWQgLSBtZW1vcnkgY29weSB3aXRoIGV4Y2VwdGlvbiBoYW5kbGluZy4KKyAqIFRoaXMgdmVyc2lvbiBpcyBmb3IgQ1BVcyBsaWtlIFA0IHRoYXQgZG9uJ3QgaGF2ZSBlZmZpY2llbnQgbWljcm8gY29kZSBmb3IgcmVwIG1vdnNxCiAgKiAJCiAgKiBJbnB1dDoJCiAgKiByZGkgZGVzdGluYXRpb24KICAqIHJzaSBzb3VyY2UKICAqIHJkeCBjb3VudAorICogZWN4IHplcm8gZmxhZyAtLSBpZiB0cnVlIHplcm8gZGVzdGluYXRpb24gb24gZXJyb3IKICAqCiAgKiBPdXRwdXQ6CQkKICAqIGVheCB1bmNvcGllZCBieXRlcyBvciAwIGlmIHN1Y2Nlc3NmdWwuCiAgKi8KLQkuZ2xvYmwgY29weV91c2VyX2dlbmVyaWMKLQkucDJhbGlnbiA0Ci1jb3B5X3VzZXJfZ2VuZXJpYzoKLQkuYnl0ZSAweDY2LDB4NjYsMHg5MAkvKiA1IGJ5dGUgbm9wIGZvciByZXBsYWNlbWVudCBqdW1wICovCi0JLmJ5dGUgMHg2NiwweDkwCi0xOgotCS5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwiYXgiCi0yOgkuYnl0ZSAweGU5CSAgICAgICAgICAgICAvKiBuZWFyIGp1bXAgd2l0aCAzMmJpdCBpbW1lZGlhdGUgKi8KLQkubG9uZyBjb3B5X3VzZXJfZ2VuZXJpY19jLTFiIC8qIG9mZnNldCAqLwotCS5wcmV2aW91cwotCS5zZWN0aW9uIC5hbHRpbnN0cnVjdGlvbnMsImEiCi0JLmFsaWduIDgKLQkucXVhZCAgY29weV91c2VyX2dlbmVyaWMKLQkucXVhZCAgMmIKLQkuYnl0ZSAgWDg2X0ZFQVRVUkVfUkVQX0dPT0QKLQkuYnl0ZSAgNQotCS5ieXRlICA1Ci0JLnByZXZpb3VzCi0uTGN1ZzoKK0VOVFJZKGNvcHlfdXNlcl9nZW5lcmljX3Vucm9sbGVkKQorCUNGSV9TVEFSVFBST0MKIAlwdXNocSAlcmJ4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDgKKwlDRklfUkVMX09GRlNFVCByYngsIDAKKwlwdXNocSAlcmN4CisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDgKKwlDRklfUkVMX09GRlNFVCByY3gsIDAKIAl4b3JsICVlYXgsJWVheAkJLyp6ZXJvIGZvciB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgKi8KIAogI2lmZGVmIEZJWF9BTElHTk1FTlQKQEAgLTE2OCw5ICsxODIsMTYgQEAKIAlkZWNsICVlY3gKIAlqbnogLkxsb29wXzEKIAorCUNGSV9SRU1FTUJFUl9TVEFURQogLkxlbmRlOgorCXBvcHEgJXJjeAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtOAorCUNGSV9SRVNUT1JFIHJjeAogCXBvcHEgJXJieAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtOAorCUNGSV9SRVNUT1JFIHJieAogCXJldAorCUNGSV9SRVNUT1JFX1NUQVRFCiAKICNpZmRlZiBGSVhfQUxJR05NRU5UCiAJLyogYWxpZ24gZGVzdGluYXRpb24gKi8KQEAgLTI1Miw2ICsyNzMsOCBAQAogCWFkZGwgJWVjeCwlZWR4CiAJLyogZWR4OiBieXRlcyB0byB6ZXJvLCByZGk6IGRlc3QsIGVheDp6ZXJvICovCiAuTHplcm9fcmVzdDoKKwljbXBsICQwLCglcnNwKQorCWp6ICAgLkxlX3plcm8KIAltb3ZxICVyZHgsJXJjeAogLkxlX2J5dGU6CiAJeG9ybCAlZWF4LCVlYXgKQEAgLTI2MSw2ICsyODQsOSBAQAogLkxlX3plcm86CiAJbW92cSAlcmR4LCVyYXgKIAlqbXAgLkxlbmRlCisJQ0ZJX0VORFBST0MKK0VORFBST0MoY29weV91c2VyX2dlbmVyaWMpCisKIAogCS8qIFNvbWUgQ1BVcyBydW4gZmFzdGVyIHVzaW5nIHRoZSBzdHJpbmcgY29weSBpbnN0cnVjdGlvbnMuCiAJICAgVGhpcyBpcyBhbHNvIGEgbG90IHNpbXBsZXIuIFVzZSB0aGVtIHdoZW4gcG9zc2libGUuCkBAIC0yNzAsNiArMjk2LDcgQEAKICAvKiByZGkJZGVzdGluYXRpb24KICAgKiByc2kgc291cmNlCiAgICogcmR4IGNvdW50CisgICogZWN4IHplcm8gZmxhZwogICAqCiAgICogT3V0cHV0OgogICAqIGVheCB1bmNvcGllZCBieXRlcyBvciAwIGlmIHN1Y2Nlc3NmdWxsLgpAQCAtMjgwLDIyICszMDcsNDggQEAKICAgKiBBbmQgbW9yZSB3b3VsZCBiZSBkYW5nZXJvdXMgYmVjYXVzZSBib3RoIEludGVsIGFuZCBBTUQgaGF2ZQogICAqIGVycmF0YSB3aXRoIHJlcCBtb3ZzcSA+IDRHQi4gSWYgc29tZW9uZSBmZWVscyB0aGUgbmVlZCB0byBmaXgKICAgKiB0aGlzIHBsZWFzZSBjb25zaWRlciB0aGlzLgotICAgKi8KLWNvcHlfdXNlcl9nZW5lcmljX2M6CisgICovCitFTlRSWShjb3B5X3VzZXJfZ2VuZXJpY19zdHJpbmcpCisJQ0ZJX1NUQVJUUFJPQworCW1vdmwgJWVjeCwlcjhkCQkvKiBzYXZlIHplcm8gZmxhZyAqLwogCW1vdmwgJWVkeCwlZWN4CiAJc2hybCAkMywlZWN4CiAJYW5kbCAkNywlZWR4CQorCWp6ICAgMTBmCiAxOglyZXAgCiAJbW92c3EgCiAJbW92bCAlZWR4LCVlY3gKIDI6CXJlcAogCW1vdnNiCi00Ogltb3ZsICVlY3gsJWVheAorOToJbW92bCAlZWN4LCVlYXgKIAlyZXQKLTM6CWxlYSAoJXJkeCwlcmN4LDgpLCVyYXgKKworCS8qIG11bHRpcGxlIG9mIDggYnl0ZSAqLworMTA6CXJlcAorCW1vdnNxCisJeG9yICVlYXgsJWVheAogCXJldAogCisJLyogZXhjZXB0aW9uIGhhbmRsaW5nICovCiszOiAgICAgIGxlYSAoJXJkeCwlcmN4LDgpLCVyYXgJLyogZXhjZXB0aW9uIG9uIHF1YWQgbG9vcCAqLworCWptcCA2ZgorNToJbW92bCAlZWN4LCVlYXgJCS8qIGV4Y2VwdGlvbiBvbiBieXRlIGxvb3AgKi8KKwkvKiBlYXg6IGxlZnQgb3ZlciBieXRlcyAqLworNjoJdGVzdGwgJXI4ZCwlcjhkCQkvKiB6ZXJvIGZsYWcgc2V0PyAqLworCWp6IDdmCisJbW92bCAlZWF4LCVlY3gJCS8qIGluaXRpYWxpemUgeDg2IGxvb3AgY291bnRlciAqLworCXB1c2ggJXJheAorCXhvcmwgJWVheCwlZWF4Cis4OglyZXAKKwlzdG9zYiAJCQkvKiB6ZXJvIHRoZSByZXN0ICovCisxMToJcG9wICVyYXgKKzc6CXJldAorCUNGSV9FTkRQUk9DCitFTkQoY29weV91c2VyX2dlbmVyaWNfYykKKwogCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiCiAJLnF1YWQgMWIsM2IKLQkucXVhZCAyYiw0YgorCS5xdWFkIDJiLDViCisJLnF1YWQgOGIsMTFiCisJLnF1YWQgMTBiLDNiCiAJLnByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9saWIvY3N1bS1jb3B5LlMgYi9hcmNoL3g4Nl82NC9saWIvY3N1bS1jb3B5LlMKaW5kZXggNzJmZDU1ZS4uZjBkYmEzNiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbGliL2NzdW0tY29weS5TCisrKyBiL2FyY2gveDg2XzY0L2xpYi9jc3VtLWNvcHkuUwpAQCAtNSw4ICs1LDkgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLiBObyB3YXJyYW50eSBmb3IgYW55dGhpbmcgZ2l2ZW4gYXQgYWxsLgogICovCi0gCSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0JI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAKIC8qCiAgKiBDaGVja3N1bSBjb3B5IHdpdGggZXhjZXB0aW9uIGhhbmRsaW5nLgpAQCAtNTMsMTkgKzU0LDI0IEBACiAJLmVuZG0KIAkKIAkJCQkKLQkuZ2xvYmwgY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYwotCS5wMmFsaWduIDQKLWNzdW1fcGFydGlhbF9jb3B5X2dlbmVyaWM6CitFTlRSWShjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKQorCUNGSV9TVEFSVFBST0MKIAljbXBsCSAkMyo2NCwlZWR4CiAJamxlCSAuTGlnbm9yZQogCiAuTGlnbm9yZToJCQogCXN1YnEgICQ3KjgsJXJzcAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA3KjgKIAltb3ZxICAlcmJ4LDIqOCglcnNwKQorCUNGSV9SRUxfT0ZGU0VUIHJieCwgMio4CiAJbW92cSAgJXIxMiwzKjgoJXJzcCkKKwlDRklfUkVMX09GRlNFVCByMTIsIDMqOAogCW1vdnEgICVyMTQsNCo4KCVyc3ApCisJQ0ZJX1JFTF9PRkZTRVQgcjE0LCA0KjgKIAltb3ZxICAlcjEzLDUqOCglcnNwKQorCUNGSV9SRUxfT0ZGU0VUIHIxMywgNSo4CiAJbW92cSAgJXJicCw2KjgoJXJzcCkKKwlDRklfUkVMX09GRlNFVCByYnAsIDYqOAogCiAJbW92cSAgJXI4LCglcnNwKQogCW1vdnEgICVyOSwxKjgoJXJzcCkKQEAgLTIwOCwxNCArMjE0LDIyIEBACiAJYWRkbCAlZWJ4LCVlYXgKIAlhZGNsICVyOWQsJWVheAkJLyogY2FycnkgKi8KIAkJCQorCUNGSV9SRU1FTUJFUl9TVEFURQogLkxlbmRlOgogCW1vdnEgMio4KCVyc3ApLCVyYngKKwlDRklfUkVTVE9SRSByYngKIAltb3ZxIDMqOCglcnNwKSwlcjEyCisJQ0ZJX1JFU1RPUkUgcjEyCiAJbW92cSA0KjgoJXJzcCksJXIxNAorCUNGSV9SRVNUT1JFIHIxNAogCW1vdnEgNSo4KCVyc3ApLCVyMTMKKwlDRklfUkVTVE9SRSByMTMKIAltb3ZxIDYqOCglcnNwKSwlcmJwCisJQ0ZJX1JFU1RPUkUgcmJwCiAJYWRkcSAkNyo4LCVyc3AKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTcqOAogCXJldAorCUNGSV9SRVNUT1JFX1NUQVRFCiAKIAkvKiBFeGNlcHRpb24gaGFuZGxlcnMuIFZlcnkgc2ltcGxlLCB6ZXJvaW5nIGlzIGRvbmUgaW4gdGhlIHdyYXBwZXJzICovCiAuTGJhZF9zb3VyY2U6CkBAIC0yMzEsMyArMjQ1LDUgQEAKIAlqeiAgIC5MZW5kZQkKIAltb3ZsICQtRUZBVUxULCglcmF4KQogCWptcCAuTGVuZGUKKwlDRklfRU5EUFJPQworRU5EUFJPQyhjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvbGliL2dldHVzZXIuUyBiL2FyY2gveDg2XzY0L2xpYi9nZXR1c2VyLlMKaW5kZXggMzg0NGQ1ZS4uNTQ0ODg3NiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbGliL2dldHVzZXIuUworKysgYi9hcmNoL3g4Nl82NC9saWIvZ2V0dXNlci5TCkBAIC0yNywyNSArMjcsMjYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9kd2FyZjIuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogCiAJLnRleHQKLQkucDJhbGlnbiA0Ci0uZ2xvYmwgX19nZXRfdXNlcl8xCi1fX2dldF91c2VyXzE6CQorRU5UUlkoX19nZXRfdXNlcl8xKQorCUNGSV9TVEFSVFBST0MKIAlHRVRfVEhSRUFEX0lORk8oJXI4KQogCWNtcHEgdGhyZWFkaW5mb19hZGRyX2xpbWl0KCVyOCksJXJjeAogCWphZSBiYWRfZ2V0X3VzZXIKIDE6CW1vdnpiICglcmN4KSwlZWR4CiAJeG9ybCAlZWF4LCVlYXgKIAlyZXQKKwlDRklfRU5EUFJPQworRU5EUFJPQyhfX2dldF91c2VyXzEpCiAKLQkucDJhbGlnbiA0Ci0uZ2xvYmwgX19nZXRfdXNlcl8yCi1fX2dldF91c2VyXzI6CitFTlRSWShfX2dldF91c2VyXzIpCisJQ0ZJX1NUQVJUUFJPQwogCUdFVF9USFJFQURfSU5GTyglcjgpCiAJYWRkcSAkMSwlcmN4CiAJamMgMjBmCkBAIC01NywxMCArNTgsMTEgQEAKIAlyZXQKIDIwOglkZWNxICAgICVyY3gKIAlqbXAJYmFkX2dldF91c2VyCisJQ0ZJX0VORFBST0MKK0VORFBST0MoX19nZXRfdXNlcl8yKQogCi0JLnAyYWxpZ24gNAotLmdsb2JsIF9fZ2V0X3VzZXJfNAotX19nZXRfdXNlcl80OgorRU5UUlkoX19nZXRfdXNlcl80KQorCUNGSV9TVEFSVFBST0MKIAlHRVRfVEhSRUFEX0lORk8oJXI4KQogCWFkZHEgJDMsJXJjeAogCWpjIDMwZgpAQCAtNzIsMTAgKzc0LDExIEBACiAJcmV0CiAzMDoJc3VicSAkMywlcmN4CiAJam1wIGJhZF9nZXRfdXNlcgorCUNGSV9FTkRQUk9DCitFTkRQUk9DKF9fZ2V0X3VzZXJfNCkKIAotCS5wMmFsaWduIDQKLS5nbG9ibCBfX2dldF91c2VyXzgKLV9fZ2V0X3VzZXJfODoKK0VOVFJZKF9fZ2V0X3VzZXJfOCkKKwlDRklfU1RBUlRQUk9DCiAJR0VUX1RIUkVBRF9JTkZPKCVyOCkKIAlhZGRxICQ3LCVyY3gKIAlqYyA0MGYKQEAgLTg3LDExICs5MCwxNiBAQAogCXJldAogNDA6CXN1YnEgJDcsJXJjeAogCWptcCBiYWRfZ2V0X3VzZXIKKwlDRklfRU5EUFJPQworRU5EUFJPQyhfX2dldF91c2VyXzgpCiAKIGJhZF9nZXRfdXNlcjoKKwlDRklfU1RBUlRQUk9DCiAJeG9ybCAlZWR4LCVlZHgKIAltb3ZxICQoLUVGQVVMVCksJXJheAogCXJldAorCUNGSV9FTkRQUk9DCitFTkQoYmFkX2dldF91c2VyKQogCiAuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgogCS5xdWFkIDFiLGJhZF9nZXRfdXNlcgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvbGliL2lvbWFwX2NvcHkuUyBiL2FyY2gveDg2XzY0L2xpYi9pb21hcF9jb3B5LlMKaW5kZXggOGJiYWRlNS4uMDVhOTVlNyAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbGliL2lvbWFwX2NvcHkuUworKysgYi9hcmNoL3g4Nl82NC9saWIvaW9tYXBfY29weS5TCkBAIC0xNSwxMiArMTUsMTYgQEAKICAqIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CisKIC8qCiAgKiBvdmVycmlkZSBnZW5lcmljIHZlcnNpb24gaW4gbGliL2lvbWFwX2NvcHkuYwogICovCi0gCS5nbG9ibCBfX2lvd3JpdGUzMl9jb3B5Ci0JLnAyYWxpZ24gNAotX19pb3dyaXRlMzJfY29weToKK0VOVFJZKF9faW93cml0ZTMyX2NvcHkpCisJQ0ZJX1NUQVJUUFJPQwogCW1vdmwgJWVkeCwlZWN4CiAJcmVwIG1vdnNkCiAJcmV0CisJQ0ZJX0VORFBST0MKK0VORFBST0MoX19pb3dyaXRlMzJfY29weSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2xpYi9tZW1jcHkuUyBiL2FyY2gveDg2XzY0L2xpYi9tZW1jcHkuUwppbmRleCA1NTU0OTQ4Li45NjdiMjJmIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9saWIvbWVtY3B5LlMKKysrIGIvYXJjaC94ODZfNjQvbGliL21lbWNweS5TCkBAIC0xLDYgKzEsMTAgQEAKIC8qIENvcHlyaWdodCAyMDAyIEFuZGkgS2xlZW4gKi8KIAkKLQkjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4JCQorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CisjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KKwogLyoKICAqIG1lbWNweSAtIENvcHkgYSBtZW1vcnkgYmxvY2suCiAgKgpAQCAtMTMsMTIgKzE3LDI2IEBACiAgKiByYXggb3JpZ2luYWwgZGVzdGluYXRpb24KICAqLwkKIAotIAkuZ2xvYmwgX19tZW1jcHkKLQkuZ2xvYmwgbWVtY3B5Ci0JLnAyYWxpZ24gNAotX19tZW1jcHk6Ci1tZW1jcHk6CQkKKwlBTElHTgorbWVtY3B5X2M6CisJQ0ZJX1NUQVJUUFJPQworCW1vdnEgJXJkaSwlcmF4CisJbW92bCAlZWR4LCVlY3gKKwlzaHJsICQzLCVlY3gKKwlhbmRsICQ3LCVlZHgKKwlyZXAgbW92c3EKKwltb3ZsICVlZHgsJWVjeAorCXJlcCBtb3ZzYgorCXJldAorCUNGSV9FTkRQUk9DCitFTkRQUk9DKG1lbWNweV9jKQorCitFTlRSWShfX21lbWNweSkKK0VOVFJZKG1lbWNweSkKKwlDRklfU1RBUlRQUk9DCiAJcHVzaHEgJXJieAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA4CisJQ0ZJX1JFTF9PRkZTRVQgcmJ4LCAwCiAJbW92cSAlcmRpLCVyYXgKIAogCW1vdmwgJWVkeCwlZWN4CkBAIC04NiwzNiArMTA0LDI3IEBACiAKIC5MZW5kZToKIAlwb3BxICVyYngKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTgKKwlDRklfUkVTVE9SRSByYngKIAlyZXQKIC5MZmluYWw6CisJQ0ZJX0VORFBST0MKK0VORFBST0MobWVtY3B5KQorRU5EUFJPQyhfX21lbWNweSkKIAogCS8qIFNvbWUgQ1BVcyBydW4gZmFzdGVyIHVzaW5nIHRoZSBzdHJpbmcgY29weSBpbnN0cnVjdGlvbnMuCiAJICAgSXQgaXMgYWxzbyBhIGxvdCBzaW1wbGVyLiBVc2UgdGhpcyB3aGVuIHBvc3NpYmxlICovCiAKKwkuc2VjdGlvbiAuYWx0aW5zdHJfcmVwbGFjZW1lbnQsImF4IgorMToJLmJ5dGUgMHhlYgkJCQkvKiBqbXAgPGRpc3A4PiAqLworCS5ieXRlIChtZW1jcHlfYyAtIG1lbWNweSkgLSAoMmYgLSAxYikJLyogb2Zmc2V0ICovCisyOgorCS5wcmV2aW91cwogCS5zZWN0aW9uIC5hbHRpbnN0cnVjdGlvbnMsImEiCiAJLmFsaWduIDgKLQkucXVhZCAgbWVtY3B5Ci0JLnF1YWQgIG1lbWNweV9jCi0JLmJ5dGUgIFg4Nl9GRUFUVVJFX1JFUF9HT09ECi0JLmJ5dGUgIC5MZmluYWwtbWVtY3B5Ci0JLmJ5dGUgIG1lbWNweV9jX2VuZC1tZW1jcHlfYwotCS5wcmV2aW91cwotCi0JLnNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LCJheCIKLSAvKiByZGkJZGVzdGluYXRpb24KLSAgKiByc2kgc291cmNlCi0gICogcmR4IGNvdW50Ci0gICovCi1tZW1jcHlfYzoKLQltb3ZxICVyZGksJXJheAotCW1vdmwgJWVkeCwlZWN4Ci0Jc2hybCAkMywlZWN4Ci0JYW5kbCAkNywlZWR4CQotCXJlcCAKLQltb3ZzcSAKLQltb3ZsICVlZHgsJWVjeAotCXJlcAotCW1vdnNiCi0JcmV0Ci1tZW1jcHlfY19lbmQ6CisJLnF1YWQgbWVtY3B5CisJLnF1YWQgMWIKKwkuYnl0ZSBYODZfRkVBVFVSRV9SRVBfR09PRAorCS5ieXRlIC5MZmluYWwgLSBtZW1jcHkKKwkuYnl0ZSAyYiAtIDFiCiAJLnByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9saWIvbWVtc2V0LlMgYi9hcmNoL3g4Nl82NC9saWIvbWVtc2V0LlMKaW5kZXggYWQzOTdmMi4uMDllZDFmNiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbGliL21lbXNldC5TCisrKyBiL2FyY2gveDg2XzY0L2xpYi9tZW1zZXQuUwpAQCAtMSw0ICsxLDkgQEAKIC8qIENvcHlyaWdodCAyMDAyIEFuZGkgS2xlZW4sIFN1U0UgTGFicyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9kd2FyZjIuaD4KKwogLyoKICAqIElTTyBDIG1lbXNldCAtIHNldCBhIG1lbW9yeSBibG9jayB0byBhIGJ5dGUgdmFsdWUuCiAgKgkKQEAgLTgsMTEgKzEzLDI5IEBACiAgKiAKICAqIHJheCAgIG9yaWdpbmFsIGRlc3RpbmF0aW9uCiAgKi8JCi0gCS5nbG9ibCBfX21lbXNldAotCS5nbG9ibCBtZW1zZXQKLQkucDJhbGlnbiA0Ci1tZW1zZXQ6CQotX19tZW1zZXQ6CisJQUxJR04KK21lbXNldF9jOgorCUNGSV9TVEFSVFBST0MKKwltb3ZxICVyZGksJXI5CisJbW92bCAlZWR4LCVyOGQKKwlhbmRsICQ3LCVyOGQKKwltb3ZsICVlZHgsJWVjeAorCXNocmwgJDMsJWVjeAorCS8qIGV4cGFuZCBieXRlIHZhbHVlICAqLworCW1vdnpibCAlc2lsLCVlc2kKKwltb3ZhYnMgJDB4MDEwMTAxMDEwMTAxMDEwMSwlcmF4CisJbXVscSAlcnNpCQkvKiB3aXRoIHJheCwgY2xvYmJlcnMgcmR4ICovCisJcmVwIHN0b3NxCisJbW92bCAlcjhkLCVlY3gKKwlyZXAgc3Rvc2IKKwltb3ZxICVyOSwlcmF4CisJcmV0CisJQ0ZJX0VORFBST0MKK0VORFBST0MobWVtc2V0X2MpCisKK0VOVFJZKG1lbXNldCkKK0VOVFJZKF9fbWVtc2V0KQorCUNGSV9TVEFSVFBST0MKIAltb3ZxICVyZGksJXIxMAogCW1vdnEgJXJkeCwlcjExCiAKQEAgLTI1LDYgKzQ4LDcgQEAKIAltb3ZsICAlZWRpLCVyOWQKIAlhbmRsICAkNywlcjlkCiAJam56ICAuTGJhZF9hbGlnbm1lbnQKKwlDRklfUkVNRU1CRVJfU1RBVEUKIC5MYWZ0ZXJfYmFkX2FsaWdubWVudDoKIAogCW1vdmwgJXIxMWQsJWVjeApAQCAtNzUsNiArOTksNyBAQAogCW1vdnEJJXIxMCwlcmF4CiAJcmV0CiAKKwlDRklfUkVTVE9SRV9TVEFURQogLkxiYWRfYWxpZ25tZW50OgogCWNtcHEgJDcsJXIxMQogCWpiZQkuTGhhbmRsZV83CkBAIC04NCw0MiArMTA5LDI2IEBACiAJYWRkcSAlcjgsJXJkaQogCXN1YnEgJXI4LCVyMTEKIAlqbXAgLkxhZnRlcl9iYWRfYWxpZ25tZW50CisuTGZpbmFsOgorCUNGSV9FTkRQUk9DCitFTkRQUk9DKG1lbXNldCkKK0VORFBST0MoX19tZW1zZXQpCiAKIAkvKiBTb21lIENQVXMgcnVuIGZhc3RlciB1c2luZyB0aGUgc3RyaW5nIGluc3RydWN0aW9ucy4KIAkgICBJdCBpcyBhbHNvIGEgbG90IHNpbXBsZXIuIFVzZSB0aGlzIHdoZW4gcG9zc2libGUgKi8KIAogI2luY2x1ZGUgPGFzbS9jcHVmZWF0dXJlLmg+CiAKKwkuc2VjdGlvbiAuYWx0aW5zdHJfcmVwbGFjZW1lbnQsImF4IgorMToJLmJ5dGUgMHhlYgkJCQkvKiBqbXAgPGRpc3A4PiAqLworCS5ieXRlIChtZW1zZXRfYyAtIG1lbXNldCkgLSAoMmYgLSAxYikJLyogb2Zmc2V0ICovCisyOgorCS5wcmV2aW91cwogCS5zZWN0aW9uIC5hbHRpbnN0cnVjdGlvbnMsImEiCiAJLmFsaWduIDgKLQkucXVhZCAgbWVtc2V0Ci0JLnF1YWQgIG1lbXNldF9jCi0JLmJ5dGUgIFg4Nl9GRUFUVVJFX1JFUF9HT09ECi0JLmJ5dGUgIG1lbXNldF9jX2VuZC1tZW1zZXRfYwotCS5ieXRlICBtZW1zZXRfY19lbmQtbWVtc2V0X2MKLQkucHJldmlvdXMKLQotCS5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwiYXgiCi0gLyogcmRpCWRlc3RpbmF0aW9uCi0gICogcnNpIHZhbHVlCi0gICogcmR4IGNvdW50Ci0gICovCi1tZW1zZXRfYzoKLQltb3ZxICVyZGksJXI5Ci0JbW92bCAlZWR4LCVyOGQKLQlhbmRsICQ3LCVyOGQJCQotCW1vdmwgJWVkeCwlZWN4Ci0Jc2hybCAkMywlZWN4CQkKLQkvKiBleHBhbmQgYnl0ZSB2YWx1ZSAgKi8KLQltb3Z6YmwgJXNpbCwlZXNpCi0JbW92YWJzICQweDAxMDEwMTAxMDEwMTAxMDEsJXJheAotCW11bHEgICAlcnNpCQkvKiB3aXRoIHJheCwgY2xvYmJlcnMgcmR4ICovCi0JcmVwCi0Jc3Rvc3EJCi0JbW92bCAlcjhkLCVlY3gKLQlyZXAKLQlzdG9zYgotCW1vdnEgJXI5LCVyYXgKLQlyZXQKLW1lbXNldF9jX2VuZDoKKwkucXVhZCBtZW1zZXQKKwkucXVhZCAxYgorCS5ieXRlIFg4Nl9GRUFUVVJFX1JFUF9HT09ECisJLmJ5dGUgLkxmaW5hbCAtIG1lbXNldAorCS5ieXRlIDJiIC0gMWIKIAkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2xpYi9wdXR1c2VyLlMgYi9hcmNoL3g4Nl82NC9saWIvcHV0dXNlci5TCmluZGV4IDdmNTU5MzkuLjQ5ODlmNWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2xpYi9wdXR1c2VyLlMKKysrIGIvYXJjaC94ODZfNjQvbGliL3B1dHVzZXIuUwpAQCAtMjUsMjUgKzI1LDI2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KIAogCS50ZXh0Ci0JLnAyYWxpZ24gNAotLmdsb2JsIF9fcHV0X3VzZXJfMQotX19wdXRfdXNlcl8xOgorRU5UUlkoX19wdXRfdXNlcl8xKQorCUNGSV9TVEFSVFBST0MKIAlHRVRfVEhSRUFEX0lORk8oJXI4KQogCWNtcHEgdGhyZWFkaW5mb19hZGRyX2xpbWl0KCVyOCksJXJjeAogCWphZSBiYWRfcHV0X3VzZXIKIDE6CW1vdmIgJWRsLCglcmN4KQogCXhvcmwgJWVheCwlZWF4CiAJcmV0CisJQ0ZJX0VORFBST0MKK0VORFBST0MoX19wdXRfdXNlcl8xKQogCi0JLnAyYWxpZ24gNAotLmdsb2JsIF9fcHV0X3VzZXJfMgotX19wdXRfdXNlcl8yOgorRU5UUlkoX19wdXRfdXNlcl8yKQorCUNGSV9TVEFSVFBST0MKIAlHRVRfVEhSRUFEX0lORk8oJXI4KQogCWFkZHEgJDEsJXJjeAogCWpjIDIwZgpAQCAtNTUsMTAgKzU2LDExIEBACiAJcmV0CiAyMDoJZGVjcSAlcmN4CiAJam1wIGJhZF9wdXRfdXNlcgorCUNGSV9FTkRQUk9DCitFTkRQUk9DKF9fcHV0X3VzZXJfMikKIAotCS5wMmFsaWduIDQKLS5nbG9ibCBfX3B1dF91c2VyXzQKLV9fcHV0X3VzZXJfNDoKK0VOVFJZKF9fcHV0X3VzZXJfNCkKKwlDRklfU1RBUlRQUk9DCiAJR0VUX1RIUkVBRF9JTkZPKCVyOCkKIAlhZGRxICQzLCVyY3gKIAlqYyAzMGYKQEAgLTcwLDEwICs3MiwxMSBAQAogCXJldAogMzA6CXN1YnEgJDMsJXJjeAogCWptcCBiYWRfcHV0X3VzZXIKKwlDRklfRU5EUFJPQworRU5EUFJPQyhfX3B1dF91c2VyXzQpCiAKLQkucDJhbGlnbiA0Ci0uZ2xvYmwgX19wdXRfdXNlcl84Ci1fX3B1dF91c2VyXzg6CitFTlRSWShfX3B1dF91c2VyXzgpCisJQ0ZJX1NUQVJUUFJPQwogCUdFVF9USFJFQURfSU5GTyglcjgpCiAJYWRkcSAkNywlcmN4CiAJamMgNDBmCkBAIC04NSwxMCArODgsMTUgQEAKIAlyZXQKIDQwOglzdWJxICQ3LCVyY3gKIAlqbXAgYmFkX3B1dF91c2VyCisJQ0ZJX0VORFBST0MKK0VORFBST0MoX19wdXRfdXNlcl84KQogCiBiYWRfcHV0X3VzZXI6CisJQ0ZJX1NUQVJUUFJPQwogCW1vdnEgJCgtRUZBVUxUKSwlcmF4CiAJcmV0CisJQ0ZJX0VORFBST0MKK0VORChiYWRfcHV0X3VzZXIpCiAKIC5zZWN0aW9uIF9fZXhfdGFibGUsImEiCiAJLnF1YWQgMWIsYmFkX3B1dF91c2VyCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9saWIvcndsb2NrLlMgYi9hcmNoL3g4Nl82NC9saWIvcndsb2NrLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkZTFmOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2XzY0L2xpYi9yd2xvY2suUwpAQCAtMCwwICsxLDM4IEBACisvKiBTbG93IHBhdGhzIG9mIHJlYWQvd3JpdGUgc3BpbmxvY2tzLiAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9yd2xvY2suaD4KKyNpbmNsdWRlIDxhc20vYWx0ZXJuYXRpdmUtYXNtLmk+CisjaW5jbHVkZSA8YXNtL2R3YXJmMi5oPgorCisvKiByZGk6CXBvaW50ZXIgdG8gcndsb2NrX3QgKi8KK0VOVFJZKF9fd3JpdGVfbG9ja19mYWlsZWQpCisJQ0ZJX1NUQVJUUFJPQworCUxPQ0tfUFJFRklYCisJYWRkbCAkUldfTE9DS19CSUFTLCglcmRpKQorMToJcmVwCisJbm9wCisJY21wbCAkUldfTE9DS19CSUFTLCglcmRpKQorCWpuZSAxYgorCUxPQ0tfUFJFRklYCisJc3VibCAkUldfTE9DS19CSUFTLCglcmRpKQorCWpueiAgX193cml0ZV9sb2NrX2ZhaWxlZAorCXJldAorCUNGSV9FTkRQUk9DCitFTkQoX193cml0ZV9sb2NrX2ZhaWxlZCkKKworLyogcmRpOglwb2ludGVyIHRvIHJ3bG9ja190ICovCitFTlRSWShfX3JlYWRfbG9ja19mYWlsZWQpCisJQ0ZJX1NUQVJUUFJPQworCUxPQ0tfUFJFRklYCisJaW5jbCAoJXJkaSkKKzE6CXJlcAorCW5vcAorCWNtcGwgJDEsKCVyZGkpCisJanMgMWIKKwlMT0NLX1BSRUZJWAorCWRlY2wgKCVyZGkpCisJanMgX19yZWFkX2xvY2tfZmFpbGVkCisJcmV0CisJQ0ZJX0VORFBST0MKK0VORChfX3JlYWRfbG9ja19mYWlsZWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9saWIvdGh1bmsuUyBiL2FyY2gveDg2XzY0L2xpYi90aHVuay5TCmluZGV4IDMzMmVhNWQuLjAwMjU1MzUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2xpYi90aHVuay5TCisrKyBiL2FyY2gveDg2XzY0L2xpYi90aHVuay5TCkBAIC0xLDEwICsxLDkgQEAKLQkvKgotCSAqIFNhdmUgcmVnaXN0ZXJzIGJlZm9yZSBjYWxsaW5nIGFzc2VtYmx5IGZ1bmN0aW9ucy4gVGhpcyBhdm9pZHMKLQkgKiBkaXN0dXJiYW5jZSBvZiByZWdpc3RlciBhbGxvY2F0aW9uIGluIHNvbWUgaW5saW5lIGFzc2VtYmx5IGNvbnN0cnVjdHMuCi0JICogQ29weXJpZ2h0IDIwMDEsMjAwMiBieSBBbmRpIEtsZWVuLCBTdVNFIExhYnMuCi0JICogU3ViamVjdCB0byB0aGUgR05VIHB1YmxpYyBsaWNlbnNlLCB2LjIuIE5vIHdhcnJhbnR5IG9mIGFueSBraW5kLgotCSAqICRJZDogdGh1bmsuUyx2IDEuMiAyMDAyLzAzLzEzIDIwOjA2OjU4IGFrIEV4cCAkCi0JICovCisvKgorICogU2F2ZSByZWdpc3RlcnMgYmVmb3JlIGNhbGxpbmcgYXNzZW1ibHkgZnVuY3Rpb25zLiBUaGlzIGF2b2lkcworICogZGlzdHVyYmFuY2Ugb2YgcmVnaXN0ZXIgYWxsb2NhdGlvbiBpbiBzb21lIGlubGluZSBhc3NlbWJseSBjb25zdHJ1Y3RzLgorICogQ29weXJpZ2h0IDIwMDEsMjAwMiBieSBBbmRpIEtsZWVuLCBTdVNFIExhYnMuCisgKiBTdWJqZWN0IHRvIHRoZSBHTlUgcHVibGljIGxpY2Vuc2UsIHYuMi4gTm8gd2FycmFudHkgb2YgYW55IGtpbmQuCisgKi8KIAogCSNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAkjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgpAQCAtNjcsMzMgKzY2LDMgQEAKIAlSRVNUT1JFX0FSR1MgMQogCXJldAogCUNGSV9FTkRQUk9DCi0KLSNpZmRlZiBDT05GSUdfU01QCi0vKiBTdXBwb3J0IGZvciByZWFkL3dyaXRlIHNwaW5sb2Nrcy4gKi8KLQkudGV4dAotLyogcmF4Oglwb2ludGVyIHRvIHJ3bG9ja190ICovCQotRU5UUlkoX193cml0ZV9sb2NrX2ZhaWxlZCkKLQlsb2NrCi0JYWRkbCAkUldfTE9DS19CSUFTLCglcmF4KQotMToJcmVwCi0Jbm9wCi0JY21wbCAkUldfTE9DS19CSUFTLCglcmF4KQotCWpuZSAxYgotCWxvY2sgCi0Jc3VibCAkUldfTE9DS19CSUFTLCglcmF4KQotCWpueiAgX193cml0ZV9sb2NrX2ZhaWxlZAotCXJldAotCi0vKiByYXg6CXBvaW50ZXIgdG8gcndsb2NrX3QgKi8JCi1FTlRSWShfX3JlYWRfbG9ja19mYWlsZWQpCi0JbG9jawotCWluY2wgKCVyYXgpCi0xOglyZXAKLQlub3AKLQljbXBsICQxLCglcmF4KQotCWpzIDFiCi0JbG9jawotCWRlY2wgKCVyYXgpCi0JanMgX19yZWFkX2xvY2tfZmFpbGVkCi0JcmV0Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L21tL2ZhdWx0LmMgYi9hcmNoL3g4Nl82NC9tbS9mYXVsdC5jCmluZGV4IDQxOTg3OTguLjFhMTdiMDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L21tL2ZhdWx0LmMKKysrIGIvYXJjaC94ODZfNjQvbW0vZmF1bHQuYwpAQCAtNDAsOCArNDAsNyBAQAogI2RlZmluZSBQRl9SU1ZECSgxPDwzKQogI2RlZmluZSBQRl9JTlNUUgkoMTw8NCkKIAotI2lmZGVmIENPTkZJR19LUFJPQkVTCi1BVE9NSUNfTk9USUZJRVJfSEVBRChub3RpZnlfcGFnZV9mYXVsdF9jaGFpbik7CitzdGF0aWMgQVRPTUlDX05PVElGSUVSX0hFQUQobm90aWZ5X3BhZ2VfZmF1bHRfY2hhaW4pOwogCiAvKiBIb29rIHRvIHJlZ2lzdGVyIGZvciBwYWdlIGZhdWx0IG5vdGlmaWNhdGlvbnMgKi8KIGludCByZWdpc3Rlcl9wYWdlX2ZhdWx0X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCkBAIC00OSwxMSArNDgsMTMgQEAKIAl2bWFsbG9jX3N5bmNfYWxsKCk7CiAJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3Rlcigmbm90aWZ5X3BhZ2VfZmF1bHRfY2hhaW4sIG5iKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJlZ2lzdGVyX3BhZ2VfZmF1bHRfbm90aWZpZXIpOwogCiBpbnQgdW5yZWdpc3Rlcl9wYWdlX2ZhdWx0X25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCiB7CiAJcmV0dXJuIGF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZub3RpZnlfcGFnZV9mYXVsdF9jaGFpbiwgbmIpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodW5yZWdpc3Rlcl9wYWdlX2ZhdWx0X25vdGlmaWVyKTsKIAogc3RhdGljIGlubGluZSBpbnQgbm90aWZ5X3BhZ2VfZmF1bHQoZW51bSBkaWVfdmFsIHZhbCwgY29uc3QgY2hhciAqc3RyLAogCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGxvbmcgZXJyLCBpbnQgdHJhcCwgaW50IHNpZykKQEAgLTY3LDEzICs2OCw2IEBACiAJfTsKIAlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJm5vdGlmeV9wYWdlX2ZhdWx0X2NoYWluLCB2YWwsICZhcmdzKTsKIH0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBub3RpZnlfcGFnZV9mYXVsdChlbnVtIGRpZV92YWwgdmFsLCBjb25zdCBjaGFyICpzdHIsCi0JCQlzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIsIGludCB0cmFwLCBpbnQgc2lnKQotewotCXJldHVybiBOT1RJRllfRE9ORTsKLX0KLSNlbmRpZgogCiB2b2lkIGJ1c3Rfc3BpbmxvY2tzKGludCB5ZXMpCiB7CkBAIC0xMDIsNyArOTYsNyBAQAogc3RhdGljIG5vaW5saW5lIGludCBpc19wcmVmZXRjaChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBhZGRyLAogCQkJCXVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSkKIHsgCi0JdW5zaWduZWQgY2hhciAqaW5zdHI7CisJdW5zaWduZWQgY2hhciBfX3VzZXIgKmluc3RyOwogCWludCBzY2FuX21vcmUgPSAxOwogCWludCBwcmVmZXRjaCA9IDA7IAogCXVuc2lnbmVkIGNoYXIgKm1heF9pbnN0cjsKQEAgLTExMSw3ICsxMDUsNyBAQAogCWlmIChlcnJvcl9jb2RlICYgUEZfSU5TVFIpCiAJCXJldHVybiAwOwogCQotCWluc3RyID0gKHVuc2lnbmVkIGNoYXIgKiljb252ZXJ0X3JpcF90b19saW5lYXIoY3VycmVudCwgcmVncyk7CisJaW5zdHIgPSAodW5zaWduZWQgY2hhciBfX3VzZXIgKiljb252ZXJ0X3JpcF90b19saW5lYXIoY3VycmVudCwgcmVncyk7CiAJbWF4X2luc3RyID0gaW5zdHIgKyAxNTsKIAogCWlmICh1c2VyX21vZGUocmVncykgJiYgaW5zdHIgPj0gKHVuc2lnbmVkIGNoYXIgKilUQVNLX1NJWkUpCkBAIC0xMjIsNyArMTE2LDcgQEAKIAkJdW5zaWduZWQgY2hhciBpbnN0cl9oaTsKIAkJdW5zaWduZWQgY2hhciBpbnN0cl9sbzsKIAotCQlpZiAoX19nZXRfdXNlcihvcGNvZGUsIGluc3RyKSkKKwkJaWYgKF9fZ2V0X3VzZXIob3Bjb2RlLCAoY2hhciBfX3VzZXIgKilpbnN0cikpCiAJCQlicmVhazsgCiAKIAkJaW5zdHJfaGkgPSBvcGNvZGUgJiAweGYwOyAKQEAgLTE2MCw3ICsxNTQsNyBAQAogCQljYXNlIDB4MDA6CiAJCQkvKiBQcmVmZXRjaCBpbnN0cnVjdGlvbiBpcyAweDBGMEQgb3IgMHgwRjE4ICovCiAJCQlzY2FuX21vcmUgPSAwOwotCQkJaWYgKF9fZ2V0X3VzZXIob3Bjb2RlLCBpbnN0cikpIAorCQkJaWYgKF9fZ2V0X3VzZXIob3Bjb2RlLCAoY2hhciBfX3VzZXIgKilpbnN0cikpCiAJCQkJYnJlYWs7CiAJCQlwcmVmZXRjaCA9IChpbnN0cl9sbyA9PSAweEYpICYmCiAJCQkJKG9wY29kZSA9PSAweDBEIHx8IG9wY29kZSA9PSAweDE4KTsKQEAgLTE3Niw3ICsxNzAsNyBAQAogc3RhdGljIGludCBiYWRfYWRkcmVzcyh2b2lkICpwKSAKIHsgCiAJdW5zaWduZWQgbG9uZyBkdW1teTsKLQlyZXR1cm4gX19nZXRfdXNlcihkdW1teSwgKHVuc2lnbmVkIGxvbmcgKilwKTsKKwlyZXR1cm4gX19nZXRfdXNlcihkdW1teSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopcCk7CiB9IAogCiB2b2lkIGR1bXBfcGFnZXRhYmxlKHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L21tL2luaXQuYyBiL2FyY2gveDg2XzY0L21tL2luaXQuYwppbmRleCA1MmZkNDJjLi4zZTE2ZmUwIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9tbS9pbml0LmMKKysrIGIvYXJjaC94ODZfNjQvbW0vaW5pdC5jCkBAIC0yMjksNyArMjI5LDYgQEAKIAogCS8qIGFjdHVhbGx5IHVzdWFsbHkgc29tZSBtb3JlICovCiAJaWYgKHNpemUgPj0gTEFSR0VfUEFHRV9TSVpFKSB7IAotCQlwcmludGsoIlNNQklPUyBhcmVhIHRvbyBsb25nICVsdVxuIiwgc2l6ZSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlzZXRfcG1kKHRlbXBfbWFwcGluZ3NbMF0ucG1kLCAgX19wbWQobWFwIHwgX0tFUk5QR19UQUJMRSB8IF9QQUdFX1BTRSkpOwpAQCAtMjUwLDEyICsyNDksMTMgQEAKIH0KIAogc3RhdGljIHZvaWQgX19tZW1pbml0Ci1waHlzX3BtZF9pbml0KHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmQpCitwaHlzX3BtZF9pbml0KHBtZF90ICpwbWRfcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQlpbnQgaTsKKwlpbnQgaSA9IHBtZF9pbmRleChhZGRyZXNzKTsKIAotCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9QTUQ7IHBtZCsrLCBpKyssIGFkZHJlc3MgKz0gUE1EX1NJWkUpIHsKKwlmb3IgKDsgaSA8IFBUUlNfUEVSX1BNRDsgaSsrLCBhZGRyZXNzICs9IFBNRF9TSVpFKSB7CiAJCXVuc2lnbmVkIGxvbmcgZW50cnk7CisJCXBtZF90ICpwbWQgPSBwbWRfcGFnZSArIHBtZF9pbmRleChhZGRyZXNzKTsKIAogCQlpZiAoYWRkcmVzcyA+PSBlbmQpIHsKIAkJCWlmICghYWZ0ZXJfYm9vdG1lbSkKQEAgLTI2Myw2ICsyNjMsMTAgQEAKIAkJCQkJc2V0X3BtZChwbWQsIF9fcG1kKDApKTsKIAkJCWJyZWFrOwogCQl9CisKKwkJaWYgKHBtZF92YWwoKnBtZCkpCisJCQljb250aW51ZTsKKwogCQllbnRyeSA9IF9QQUdFX05YfF9QQUdFX1BTRXxfS0VSTlBHX1RBQkxFfF9QQUdFX0dMT0JBTHxhZGRyZXNzOwogCQllbnRyeSAmPSBfX3N1cHBvcnRlZF9wdGVfbWFzazsKIAkJc2V0X3BtZChwbWQsIF9fcG1kKGVudHJ5KSk7CkBAIC0yNzIsNDUgKzI3Niw0MSBAQAogc3RhdGljIHZvaWQgX19tZW1pbml0CiBwaHlzX3BtZF91cGRhdGUocHVkX3QgKnB1ZCwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKLQlwbWRfdCAqcG1kID0gcG1kX29mZnNldChwdWQsICh1bnNpZ25lZCBsb25nKV9fdmEoYWRkcmVzcykpOwotCi0JaWYgKHBtZF9ub25lKCpwbWQpKSB7Ci0JCXNwaW5fbG9jaygmaW5pdF9tbS5wYWdlX3RhYmxlX2xvY2spOwotCQlwaHlzX3BtZF9pbml0KHBtZCwgYWRkcmVzcywgZW5kKTsKLQkJc3Bpbl91bmxvY2soJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrKTsKLQkJX19mbHVzaF90bGJfYWxsKCk7Ci0JfQorCXBtZF90ICpwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwwKTsKKwlzcGluX2xvY2soJmluaXRfbW0ucGFnZV90YWJsZV9sb2NrKTsKKwlwaHlzX3BtZF9pbml0KHBtZCwgYWRkcmVzcywgZW5kKTsKKwlzcGluX3VubG9jaygmaW5pdF9tbS5wYWdlX3RhYmxlX2xvY2spOworCV9fZmx1c2hfdGxiX2FsbCgpOwogfQogCi1zdGF0aWMgdm9pZCBfX21lbWluaXQgcGh5c19wdWRfaW5pdChwdWRfdCAqcHVkLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kKQorc3RhdGljIHZvaWQgX19tZW1pbml0IHBoeXNfcHVkX2luaXQocHVkX3QgKnB1ZF9wYWdlLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kKQogeyAKLQlsb25nIGkgPSBwdWRfaW5kZXgoYWRkcmVzcyk7CisJaW50IGkgPSBwdWRfaW5kZXgoYWRkcik7CiAKLQlwdWQgPSBwdWQgKyBpOwogCi0JaWYgKGFmdGVyX2Jvb3RtZW0gJiYgcHVkX3ZhbCgqcHVkKSkgewotCQlwaHlzX3BtZF91cGRhdGUocHVkLCBhZGRyZXNzLCBlbmQpOwotCQlyZXR1cm47Ci0JfQotCi0JZm9yICg7IGkgPCBQVFJTX1BFUl9QVUQ7IHB1ZCsrLCBpKyspIHsKKwlmb3IgKDsgaSA8IFBUUlNfUEVSX1BVRDsgaSsrLCBhZGRyID0gKGFkZHIgJiBQVURfTUFTSykgKyBQVURfU0laRSApIHsKIAkJaW50IG1hcDsgCi0JCXVuc2lnbmVkIGxvbmcgcGFkZHIsIHBtZF9waHlzOworCQl1bnNpZ25lZCBsb25nIHBtZF9waHlzOworCQlwdWRfdCAqcHVkID0gcHVkX3BhZ2UgKyBwdWRfaW5kZXgoYWRkcik7CiAJCXBtZF90ICpwbWQ7CiAKLQkJcGFkZHIgPSAoYWRkcmVzcyAmIFBHRElSX01BU0spICsgaSpQVURfU0laRTsKLQkJaWYgKHBhZGRyID49IGVuZCkKKwkJaWYgKGFkZHIgPj0gZW5kKQogCQkJYnJlYWs7CiAKLQkJaWYgKCFhZnRlcl9ib290bWVtICYmICFlODIwX2FueV9tYXBwZWQocGFkZHIsIHBhZGRyK1BVRF9TSVpFLCAwKSkgeworCQlpZiAoIWFmdGVyX2Jvb3RtZW0gJiYgIWU4MjBfYW55X21hcHBlZChhZGRyLGFkZHIrUFVEX1NJWkUsMCkpIHsKIAkJCXNldF9wdWQocHVkLCBfX3B1ZCgwKSk7IAogCQkJY29udGludWU7CiAJCX0gCiAKKwkJaWYgKHB1ZF92YWwoKnB1ZCkpIHsKKwkJCXBoeXNfcG1kX3VwZGF0ZShwdWQsIGFkZHIsIGVuZCk7CisJCQljb250aW51ZTsKKwkJfQorCiAJCXBtZCA9IGFsbG9jX2xvd19wYWdlKCZtYXAsICZwbWRfcGh5cyk7CiAJCXNwaW5fbG9jaygmaW5pdF9tbS5wYWdlX3RhYmxlX2xvY2spOwogCQlzZXRfcHVkKHB1ZCwgX19wdWQocG1kX3BoeXMgfCBfS0VSTlBHX1RBQkxFKSk7Ci0JCXBoeXNfcG1kX2luaXQocG1kLCBwYWRkciwgZW5kKTsKKwkJcGh5c19wbWRfaW5pdChwbWQsIGFkZHIsIGVuZCk7CiAJCXNwaW5fdW5sb2NrKCZpbml0X21tLnBhZ2VfdGFibGVfbG9jayk7CiAJCXVubWFwX2xvd19wYWdlKG1hcCk7CiAJfQpAQCAtNDAzLDY5ICs0MDMsMTUgQEAKIAlfX2ZsdXNoX3RsYl9hbGwoKTsKIH0KIAotLyogQ29tcHV0ZSB6b25lIHNpemVzIGZvciB0aGUgRE1BIGFuZCBETUEzMiB6b25lcyBpbiBhIG5vZGUuICovCi1fX2luaXQgdm9pZAotc2l6ZV96b25lcyh1bnNpZ25lZCBsb25nICp6LCB1bnNpZ25lZCBsb25nICpoLAotCSAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCi17Ci0gCWludCBpOwotIAl1bnNpZ25lZCBsb25nIHc7Ci0KLSAJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKQotIAkJeltpXSA9IDA7Ci0KLSAJaWYgKHN0YXJ0X3BmbiA8IE1BWF9ETUFfUEZOKQotIAkJeltaT05FX0RNQV0gPSBNQVhfRE1BX1BGTiAtIHN0YXJ0X3BmbjsKLSAJaWYgKHN0YXJ0X3BmbiA8IE1BWF9ETUEzMl9QRk4pIHsKLSAJCXVuc2lnbmVkIGxvbmcgZG1hMzJfcGZuID0gTUFYX0RNQTMyX1BGTjsKLSAJCWlmIChkbWEzMl9wZm4gPiBlbmRfcGZuKQotIAkJCWRtYTMyX3BmbiA9IGVuZF9wZm47Ci0gCQl6W1pPTkVfRE1BMzJdID0gZG1hMzJfcGZuIC0gc3RhcnRfcGZuOwotIAl9Ci0gCXpbWk9ORV9OT1JNQUxdID0gZW5kX3BmbiAtIHN0YXJ0X3BmbjsKLQotIAkvKiBSZW1vdmUgbG93ZXIgem9uZXMgZnJvbSBoaWdoZXIgb25lcy4gKi8KLSAJdyA9IDA7Ci0gCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykgewotIAkJaWYgKHpbaV0pCi0gCQkJeltpXSAtPSB3OwotIAkgICAgICAgIHcgKz0geltpXTsKLQl9Ci0KLQkvKiBDb21wdXRlIGhvbGVzICovCi0JdyA9IHN0YXJ0X3BmbjsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1pPTkVTOyBpKyspIHsKLQkJdW5zaWduZWQgbG9uZyBzID0gdzsKLQkJdyArPSB6W2ldOwotCQloW2ldID0gZTgyMF9ob2xlX3NpemUocywgdyk7Ci0JfQotCi0JLyogQWRkIHRoZSBzcGFjZSBwYWNlIG5lZWRlZCBmb3IgbWVtX21hcCB0byB0aGUgaG9sZXMgdG9vLiAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykKLQkJaFtpXSArPSAoeltpXSAqIHNpemVvZihzdHJ1Y3QgcGFnZSkpIC8gUEFHRV9TSVpFOwotCi0JLyogVGhlIDE2TUIgRE1BIHpvbmUgaGFzIHRoZSBrZXJuZWwgYW5kIG90aGVyIG1pc2MgbWFwcGluZ3MuCi0gCSAgIEFjY291bnQgdGhlbSB0b28gKi8KLQlpZiAoaFtaT05FX0RNQV0pIHsKLQkJaFtaT05FX0RNQV0gKz0gZG1hX3Jlc2VydmU7Ci0JCWlmIChoW1pPTkVfRE1BXSA+PSB6W1pPTkVfRE1BXSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSJLZXJuZWwgdG9vIGxhcmdlIGFuZCBmaWxsaW5nIHVwIFpPTkVfRE1BP1xuIik7Ci0JCQloW1pPTkVfRE1BXSA9IHpbWk9ORV9ETUFdOwotCQl9Ci0JfQotfQotCiAjaWZuZGVmIENPTkZJR19OVU1BCiB2b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgem9uZXNbTUFYX05SX1pPTkVTXSwgaG9sZXNbTUFYX05SX1pPTkVTXTsKLQorCXVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdID0ge01BWF9ETUFfUEZOLAorCQkJCQkJCU1BWF9ETUEzMl9QRk4sCisJCQkJCQkJZW5kX3Bmbn07CiAJbWVtb3J5X3ByZXNlbnQoMCwgMCwgZW5kX3Bmbik7CiAJc3BhcnNlX2luaXQoKTsKLQlzaXplX3pvbmVzKHpvbmVzLCBob2xlcywgMCwgZW5kX3Bmbik7Ci0JZnJlZV9hcmVhX2luaXRfbm9kZSgwLCBOT0RFX0RBVEEoMCksIHpvbmVzLAotCQkJICAgIF9fcGEoUEFHRV9PRkZTRVQpID4+IFBBR0VfU0hJRlQsIGhvbGVzKTsKKwlmcmVlX2FyZWFfaW5pdF9ub2RlcyhtYXhfem9uZV9wZm5zKTsKIH0KICNlbmRpZgogCkBAIC01OTcsMTIgKzU0Myw2IEBACiAKIAlwY2lfaW9tbXVfYWxsb2MoKTsKIAotCS8qIEhvdyBtYW55IGVuZC1vZi1tZW1vcnkgdmFyaWFibGVzIHlvdSBoYXZlLCBncmFuZG1hISAqLwotCW1heF9sb3dfcGZuID0gZW5kX3BmbjsKLQltYXhfcGZuID0gZW5kX3BmbjsKLQludW1fcGh5c3BhZ2VzID0gZW5kX3BmbjsKLQloaWdoX21lbW9yeSA9ICh2b2lkICopIF9fdmEoZW5kX3BmbiAqIFBBR0VfU0laRSk7Ci0KIAkvKiBjbGVhciB0aGUgemVyby1wYWdlICovCiAJbWVtc2V0KGVtcHR5X3plcm9fcGFnZSwgMCwgUEFHRV9TSVpFKTsKIApAQCAtNjE0LDcgKzU1NCw4IEBACiAjZWxzZQogCXRvdGFscmFtX3BhZ2VzID0gZnJlZV9hbGxfYm9vdG1lbSgpOwogI2VuZGlmCi0JcmVzZXJ2ZWRwYWdlcyA9IGVuZF9wZm4gLSB0b3RhbHJhbV9wYWdlcyAtIGU4MjBfaG9sZV9zaXplKDAsIGVuZF9wZm4pOworCXJlc2VydmVkcGFnZXMgPSBlbmRfcGZuIC0gdG90YWxyYW1fcGFnZXMgLQorCQkJCQlhYnNlbnRfcGFnZXNfaW5fcmFuZ2UoMCwgZW5kX3Bmbik7CiAKIAlhZnRlcl9ib290bWVtID0gMTsKIApAQCAtNzE0LDggKzY1NSwxMCBAQAogI2Vsc2UgICAgICAgCQkKIAlyZXNlcnZlX2Jvb3RtZW0ocGh5cywgbGVuKTsgICAgCiAjZW5kaWYKLQlpZiAocGh5cytsZW4gPD0gTUFYX0RNQV9QRk4qUEFHRV9TSVpFKQorCWlmIChwaHlzK2xlbiA8PSBNQVhfRE1BX1BGTipQQUdFX1NJWkUpIHsKIAkJZG1hX3Jlc2VydmUgKz0gbGVuIC8gUEFHRV9TSVpFOworCQlzZXRfZG1hX3Jlc2VydmUoZG1hX3Jlc2VydmUpOworCX0KIH0KIAogaW50IGtlcm5fYWRkcl92YWxpZCh1bnNpZ25lZCBsb25nIGFkZHIpIApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvbW0vazh0b3BvbG9neS5jIGIvYXJjaC94ODZfNjQvbW0vazh0b3BvbG9neS5jCmluZGV4IDdjNDVjMmQuLmI1YjhkYmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L21tL2s4dG9wb2xvZ3kuYworKysgYi9hcmNoL3g4Nl82NC9tbS9rOHRvcG9sb2d5LmMKQEAgLTU0LDYgKzU0LDkgQEAKIAogCW5vZGVzX2NsZWFyKG5vZGVzX3BhcnNlZCk7CiAKKwlpZiAoIWVhcmx5X3BjaV9hbGxvd2VkKCkpCisJCXJldHVybiAtMTsKKwogCW5iID0gZmluZF9ub3J0aGJyaWRnZSgpOyAKIAlpZiAobmIgPCAwKSAKIAkJcmV0dXJuIG5iOwpAQCAtMTQ2LDYgKzE0OSw5IEBACiAJCQogCQlub2Rlc1tub2RlaWRdLnN0YXJ0ID0gYmFzZTsgCiAJCW5vZGVzW25vZGVpZF0uZW5kID0gbGltaXQ7CisJCWU4MjBfcmVnaXN0ZXJfYWN0aXZlX3JlZ2lvbnMobm9kZWlkLAorCQkJCW5vZGVzW25vZGVpZF0uc3RhcnQgPj4gUEFHRV9TSElGVCwKKwkJCQlub2Rlc1tub2RlaWRdLmVuZCA+PiBQQUdFX1NISUZUKTsKIAogCQlwcmV2YmFzZSA9IGJhc2U7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L21tL251bWEuYyBiL2FyY2gveDg2XzY0L21tL251bWEuYwppbmRleCBiMmZhYzE0Li44MjlhMDA4YiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQvbW0vbnVtYS5jCisrKyBiL2FyY2gveDg2XzY0L21tL251bWEuYwpAQCAtMTYxLDcgKzE2MSw3IEBACiAJCQkJCSBib290bWFwX3N0YXJ0ID4+IFBBR0VfU0hJRlQsIAogCQkJCQkgc3RhcnRfcGZuLCBlbmRfcGZuKTsgCiAKLQllODIwX2Jvb3RtZW1fZnJlZShOT0RFX0RBVEEobm9kZWlkKSwgc3RhcnQsIGVuZCk7CisJZnJlZV9ib290bWVtX3dpdGhfYWN0aXZlX3JlZ2lvbnMobm9kZWlkLCBlbmQpOwogCiAJcmVzZXJ2ZV9ib290bWVtX25vZGUoTk9ERV9EQVRBKG5vZGVpZCksIG5vZGVkYXRhX3BoeXMsIHBnZGF0X3NpemUpOyAKIAlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZWlkKSwgYm9vdG1hcF9zdGFydCwgYm9vdG1hcF9wYWdlczw8UEFHRV9TSElGVCk7CkBAIC0xNzUsMTMgKzE3NSwxMSBAQAogdm9pZCBfX2luaXQgc2V0dXBfbm9kZV96b25lcyhpbnQgbm9kZWlkKQogeyAKIAl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbiwgbWVtbWFwc2l6ZSwgbGltaXQ7Ci0JdW5zaWduZWQgbG9uZyB6b25lc1tNQVhfTlJfWk9ORVNdOwotCXVuc2lnbmVkIGxvbmcgaG9sZXNbTUFYX05SX1pPTkVTXTsKIAogIAlzdGFydF9wZm4gPSBub2RlX3N0YXJ0X3Bmbihub2RlaWQpOwogIAllbmRfcGZuID0gbm9kZV9lbmRfcGZuKG5vZGVpZCk7CiAKLQlEcHJpbnRrKEtFUk5fSU5GTyAiU2V0dGluZyB1cCBub2RlICVkICVseC0lbHhcbiIsCisJRHByaW50ayhLRVJOX0lORk8gIlNldHRpbmcgdXAgbWVtbWFwIGZvciBub2RlICVkICVseC0lbHhcbiIsCiAJCW5vZGVpZCwgc3RhcnRfcGZuLCBlbmRfcGZuKTsKIAogCS8qIFRyeSB0byBhbGxvY2F0ZSBtZW1fbWFwIGF0IGVuZCB0byBub3QgZmlsbCB1cCBwcmVjaW91cyA8NEdCCkBAIC0xOTUsMTAgKzE5Myw2IEBACiAJCQkJcm91bmRfZG93bihsaW1pdCAtIG1lbW1hcHNpemUsIFBBR0VfU0laRSksIAogCQkJCWxpbWl0KTsKICNlbmRpZgotCi0Jc2l6ZV96b25lcyh6b25lcywgaG9sZXMsIHN0YXJ0X3BmbiwgZW5kX3Bmbik7Ci0JZnJlZV9hcmVhX2luaXRfbm9kZShub2RlaWQsIE5PREVfREFUQShub2RlaWQpLCB6b25lcywKLQkJCSAgICBzdGFydF9wZm4sIGhvbGVzKTsKIH0gCiAKIHZvaWQgX19pbml0IG51bWFfaW5pdF9hcnJheSh2b2lkKQpAQCAtMjI1LDcgKzIxOSw3IEBACiBpbnQgbnVtYV9mYWtlIF9faW5pdGRhdGEgPSAwOwogCiAvKiBOdW1hIGVtdWxhdGlvbiAqLwotc3RhdGljIGludCBudW1hX2VtdWxhdGlvbih1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQorc3RhdGljIGludCBfX2luaXQgbnVtYV9lbXVsYXRpb24odW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3BmbikKIHsKICAJaW50IGk7CiAgCXN0cnVjdCBib290bm9kZSBub2Rlc1tNQVhfTlVNTk9ERVNdOwpAQCAtMjU5LDggKzI1MywxMSBAQAogIAkJcHJpbnRrKEtFUk5fRVJSICJObyBOVU1BIGhhc2ggZnVuY3Rpb24gZm91bmQuIEVtdWxhdGlvbiBkaXNhYmxlZC5cbiIpOwogIAkJcmV0dXJuIC0xOwogIAl9Ci0gCWZvcl9lYWNoX29ubGluZV9ub2RlKGkpCisgCWZvcl9lYWNoX29ubGluZV9ub2RlKGkpIHsKKwkJZTgyMF9yZWdpc3Rlcl9hY3RpdmVfcmVnaW9ucyhpLCBub2Rlc1tpXS5zdGFydCA+PiBQQUdFX1NISUZULAorCQkJCQkJbm9kZXNbaV0uZW5kID4+IFBBR0VfU0hJRlQpOwogIAkJc2V0dXBfbm9kZV9ib290bWVtKGksIG5vZGVzW2ldLnN0YXJ0LCBub2Rlc1tpXS5lbmQpOworCX0KICAJbnVtYV9pbml0X2FycmF5KCk7CiAgCXJldHVybiAwOwogfQpAQCAtMjk5LDYgKzI5Niw3IEBACiAJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykKIAkJbnVtYV9zZXRfbm9kZShpLCAwKTsKIAlub2RlX3RvX2NwdW1hc2tbMF0gPSBjcHVtYXNrX29mX2NwdSgwKTsKKwllODIwX3JlZ2lzdGVyX2FjdGl2ZV9yZWdpb25zKDAsIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CiAJc2V0dXBfbm9kZV9ib290bWVtKDAsIHN0YXJ0X3BmbiA8PCBQQUdFX1NISUZULCBlbmRfcGZuIDw8IFBBR0VfU0hJRlQpOwogfQogCkBAIC0zNDAsMTcgKzMzOCwyMyBAQAogdm9pZCBfX2luaXQgcGFnaW5nX2luaXQodm9pZCkKIHsgCiAJaW50IGk7CisJdW5zaWduZWQgbG9uZyBtYXhfem9uZV9wZm5zW01BWF9OUl9aT05FU10gPSB7IE1BWF9ETUFfUEZOLAorCQlNQVhfRE1BMzJfUEZOLAorCQllbmRfcGZufTsKIAogCWFyY2hfc3BhcnNlX2luaXQoKTsKIAogCWZvcl9lYWNoX29ubGluZV9ub2RlKGkpIHsKIAkJc2V0dXBfbm9kZV96b25lcyhpKTsgCiAJfQorCisJZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7CiB9IAogCi0vKiBbbnVtYT1vZmZdICovCi1fX2luaXQgaW50IG51bWFfc2V0dXAoY2hhciAqb3B0KSAKK3N0YXRpYyBfX2luaXQgaW50IG51bWFfc2V0dXAoY2hhciAqb3B0KQogeyAKKwlpZiAoIW9wdCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCFzdHJuY21wKG9wdCwib2ZmIiwzKSkKIAkJbnVtYV9vZmYgPSAxOwogI2lmZGVmIENPTkZJR19OVU1BX0VNVQpAQCAtMzY2LDkgKzM3MCwxMSBAQAogCWlmICghc3RybmNtcChvcHQsImhvdGFkZD0iLCA3KSkKIAkJaG90YWRkX3BlcmNlbnQgPSBzaW1wbGVfc3RydG91bChvcHQrNywgTlVMTCwgMTApOwogI2VuZGlmCi0JcmV0dXJuIDE7CisJcmV0dXJuIDA7CiB9IAogCitlYXJseV9wYXJhbSgibnVtYSIsIG51bWFfc2V0dXApOworCiAvKgogICogU2V0dXAgZWFybHkgY3B1X3RvX25vZGUuCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvbW0vcGFnZWF0dHIuYyBiL2FyY2gveDg2XzY0L21tL3BhZ2VhdHRyLmMKaW5kZXggMjY4NWIxZi4uM2UyMzFkNzYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L21tL3BhZ2VhdHRyLmMKKysrIGIvYXJjaC94ODZfNjQvbW0vcGFnZWF0dHIuYwpAQCAtMTA4LDggKzEwOCw4IEBACiAJQlVHX09OKHB1ZF9ub25lKCpwdWQpKTsKIAlwbWQgPSBwbWRfb2Zmc2V0KHB1ZCwgYWRkcmVzcyk7CiAJQlVHX09OKHBtZF92YWwoKnBtZCkgJiBfUEFHRV9QU0UpOwotCXBncHJvdF92YWwocmVmX3Byb3QpIHw9IF9QQUdFX1BTRTsKIAlsYXJnZV9wdGUgPSBta19wdGVfcGh5cyhfX3BhKGFkZHJlc3MpICYgTEFSR0VfUEFHRV9NQVNLLCByZWZfcHJvdCk7CisJbGFyZ2VfcHRlID0gcHRlX21raHVnZShsYXJnZV9wdGUpOwogCXNldF9wdGUoKHB0ZV90ICopcG1kLCBsYXJnZV9wdGUpOwogfSAgICAgIAogCkBAIC0xMTksMzIgKzExOSwyOCBAQAogeyAKIAlwdGVfdCAqa3B0ZTsgCiAJc3RydWN0IHBhZ2UgKmtwdGVfcGFnZTsKLQl1bnNpZ25lZCBrcHRlX2ZsYWdzOwogCXBncHJvdF90IHJlZl9wcm90MjsKIAlrcHRlID0gbG9va3VwX2FkZHJlc3MoYWRkcmVzcyk7CiAJaWYgKCFrcHRlKSByZXR1cm4gMDsKIAlrcHRlX3BhZ2UgPSB2aXJ0X3RvX3BhZ2UoKCh1bnNpZ25lZCBsb25nKWtwdGUpICYgUEFHRV9NQVNLKTsKLQlrcHRlX2ZsYWdzID0gcHRlX3ZhbCgqa3B0ZSk7IAogCWlmIChwZ3Byb3RfdmFsKHByb3QpICE9IHBncHJvdF92YWwocmVmX3Byb3QpKSB7IAotCQlpZiAoKGtwdGVfZmxhZ3MgJiBfUEFHRV9QU0UpID09IDApIHsgCisJCWlmICghcHRlX2h1Z2UoKmtwdGUpKSB7CiAJCQlzZXRfcHRlKGtwdGUsIHBmbl9wdGUocGZuLCBwcm90KSk7CiAJCX0gZWxzZSB7CiAgCQkJLyoKIAkJCSAqIHNwbGl0X2xhcmdlX3BhZ2Ugd2lsbCB0YWtlIHRoZSByZWZlcmVuY2UgZm9yIHRoaXMKIAkJCSAqIGNoYW5nZV9wYWdlX2F0dHIgb24gdGhlIHNwbGl0IHBhZ2UuCiAgCQkJICovCi0KIAkJCXN0cnVjdCBwYWdlICpzcGxpdDsKLQkJCXJlZl9wcm90MiA9IF9fcGdwcm90KHBncHJvdF92YWwocHRlX3BncHJvdCgqbG9va3VwX2FkZHJlc3MoYWRkcmVzcykpKSAmIH4oMTw8X1BBR0VfQklUX1BTRSkpOwotCisJCQlyZWZfcHJvdDIgPSBwdGVfcGdwcm90KHB0ZV9jbHJodWdlKCprcHRlKSk7CiAJCQlzcGxpdCA9IHNwbGl0X2xhcmdlX3BhZ2UoYWRkcmVzcywgcHJvdCwgcmVmX3Byb3QyKTsKIAkJCWlmICghc3BsaXQpCiAJCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQlzZXRfcHRlKGtwdGUsbWtfcHRlKHNwbGl0LCByZWZfcHJvdDIpKTsKKwkJCXNldF9wdGUoa3B0ZSwgbWtfcHRlKHNwbGl0LCByZWZfcHJvdDIpKTsKIAkJCWtwdGVfcGFnZSA9IHNwbGl0OwotCQl9CQorCQl9CiAJCXBhZ2VfcHJpdmF0ZShrcHRlX3BhZ2UpKys7Ci0JfSBlbHNlIGlmICgoa3B0ZV9mbGFncyAmIF9QQUdFX1BTRSkgPT0gMCkgeyAKKwl9IGVsc2UgaWYgKCFwdGVfaHVnZSgqa3B0ZSkpIHsKIAkJc2V0X3B0ZShrcHRlLCBwZm5fcHRlKHBmbiwgcmVmX3Byb3QpKTsKIAkJQlVHX09OKHBhZ2VfcHJpdmF0ZShrcHRlX3BhZ2UpID09IDApOwogCQlwYWdlX3ByaXZhdGUoa3B0ZV9wYWdlKS0tOwpAQCAtMTkwLDEwICsxODYsMTIgQEAKIAkJICogbG93bWVtICovCiAJCWlmIChfX3BhKGFkZHJlc3MpIDwgS0VSTkVMX1RFWFRfU0laRSkgewogCQkJdW5zaWduZWQgbG9uZyBhZGRyMjsKLQkJCXBncHJvdF90IHByb3QyID0gcHJvdDsKKwkJCXBncHJvdF90IHByb3QyOwogCQkJYWRkcjIgPSBfX1NUQVJUX0tFUk5FTF9tYXAgKyBfX3BhKGFkZHJlc3MpOwotIAkJCXBncHJvdF92YWwocHJvdDIpICY9IH5fUEFHRV9OWDsKLQkJCWVyciA9IF9fY2hhbmdlX3BhZ2VfYXR0cihhZGRyMiwgcGZuLCBwcm90MiwgUEFHRV9LRVJORUxfRVhFQyk7CisJCQkvKiBNYWtlIHN1cmUgdGhlIGtlcm5lbCBtYXBwaW5ncyBzdGF5IGV4ZWN1dGFibGUgKi8KKwkJCXByb3QyID0gcHRlX3BncHJvdChwdGVfbWtleGVjKHBmbl9wdGUoMCwgcHJvdCkpKTsKKwkJCWVyciA9IF9fY2hhbmdlX3BhZ2VfYXR0cihhZGRyMiwgcGZuLCBwcm90MiwKKwkJCQkJCSBQQUdFX0tFUk5FTF9FWEVDKTsKIAkJfSAKIAl9IAkKIAl1cF93cml0ZSgmaW5pdF9tbS5tbWFwX3NlbSk7IApkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvbW0vc3JhdC5jIGIvYXJjaC94ODZfNjQvbW0vc3JhdC5jCmluZGV4IDUwMmZjZTYuLmY4YzA0ZDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L21tL3NyYXQuYworKysgYi9hcmNoL3g4Nl82NC9tbS9zcmF0LmMKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlIDxhc20vbnVtYS5oPgogI2luY2x1ZGUgPGFzbS9lODIwLmg+CiAKK2ludCBhY3BpX251bWEgX19pbml0ZGF0YTsKKwogI2lmIChkZWZpbmVkKENPTkZJR19BQ1BJX0hPVFBMVUdfTUVNT1JZKSB8fCBcCiAJZGVmaW5lZChDT05GSUdfQUNQSV9IT1RQTFVHX01FTU9SWV9NT0RVTEUpKSBcCiAJCSYmICFkZWZpbmVkKENPTkZJR19NRU1PUllfSE9UUExVRykKQEAgLTkxLDYgKzkzLDcgQEAKIAkJYXBpY2lkX3RvX25vZGVbaV0gPSBOVU1BX05PX05PREU7CiAJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1OT0RFUzsgaSsrKQogCQlub2Rlc19hZGRbaV0uc3RhcnQgPSBub2Rlc1tpXS5lbmQgPSAwOworCXJlbW92ZV9hbGxfYWN0aXZlX3JhbmdlcygpOwogfQogCiBzdGF0aWMgX19pbml0IGlubGluZSBpbnQgc3JhdF9kaXNhYmxlZCh2b2lkKQpAQCAtMTczLDcgKzE3Niw3IEBACiAKIAlpZiAobWVtIDwgMCkKIAkJcmV0dXJuIDA7Ci0JYWxsb3dlZCA9IChlbmRfcGZuIC0gZTgyMF9ob2xlX3NpemUoMCwgZW5kX3BmbikpICogUEFHRV9TSVpFOworCWFsbG93ZWQgPSAoZW5kX3BmbiAtIGFic2VudF9wYWdlc19pbl9yYW5nZSgwLCBlbmRfcGZuKSkgKiBQQUdFX1NJWkU7CiAJYWxsb3dlZCA9IChhbGxvd2VkIC8gMTAwKSAqIGhvdGFkZF9wZXJjZW50OwogCWlmIChhbGxvY2F0ZWQgKyBtZW0gPiBhbGxvd2VkKSB7CiAJCXVuc2lnbmVkIGxvbmcgcmFuZ2U7CkBAIC0yMjMsOCArMjI2LDEwIEBACiAJfQogCiAJLyogVGhpcyBjaGVjayBtaWdodCBiZSBhIGJpdCB0b28gc3RyaWN0LCBidXQgSSdtIGtlZXBpbmcgaXQgZm9yIG5vdy4gKi8KLQlpZiAoZTgyMF9ob2xlX3NpemUoc19wZm4sIGVfcGZuKSAhPSBlX3BmbiAtIHNfcGZuKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU1JBVDogSG90cGx1ZyBhcmVhIGhhcyBleGlzdGluZyBtZW1vcnlcbiIpOworCWlmIChhYnNlbnRfcGFnZXNfaW5fcmFuZ2Uoc19wZm4sIGVfcGZuKSAhPSBlX3BmbiAtIHNfcGZuKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIlNSQVQ6IEhvdHBsdWcgYXJlYSAlbHUgLT4gJWx1IGhhcyBleGlzdGluZyBtZW1vcnlcbiIsCisJCQlzX3BmbiwgZV9wZm4pOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0zMTcsNiArMzIyLDEwIEBACiAKIAlwcmludGsoS0VSTl9JTkZPICJTUkFUOiBOb2RlICV1IFBYTSAldSAlTHgtJUx4XG4iLCBub2RlLCBweG0sCiAJICAgICAgIG5kLT5zdGFydCwgbmQtPmVuZCk7CisJZTgyMF9yZWdpc3Rlcl9hY3RpdmVfcmVnaW9ucyhub2RlLCBuZC0+c3RhcnQgPj4gUEFHRV9TSElGVCwKKwkJCQkJCW5kLT5lbmQgPj4gUEFHRV9TSElGVCk7CisJcHVzaF9ub2RlX2JvdW5kYXJpZXMobm9kZSwgbmQtPnN0YXJ0ID4+IFBBR0VfU0hJRlQsCisJCQkJCQluZC0+ZW5kID4+IFBBR0VfU0hJRlQpOwogCiAjaWZkZWYgUkVTRVJWRV9IT1RBREQKICAJaWYgKG1hLT5mbGFncy5ob3RfcGx1Z2dhYmxlICYmIHJlc2VydmVfaG90YWRkKG5vZGUsIHN0YXJ0LCBlbmQpIDwgMCkgewpAQCAtMzQxLDEzICszNTAsMTMgQEAKIAkJdW5zaWduZWQgbG9uZyBzID0gbm9kZXNbaV0uc3RhcnQgPj4gUEFHRV9TSElGVDsKIAkJdW5zaWduZWQgbG9uZyBlID0gbm9kZXNbaV0uZW5kID4+IFBBR0VfU0hJRlQ7CiAJCXB4bXJhbSArPSBlIC0gczsKLQkJcHhtcmFtIC09IGU4MjBfaG9sZV9zaXplKHMsIGUpOworCQlweG1yYW0gLT0gYWJzZW50X3BhZ2VzX2luX3JhbmdlKHMsIGUpOwogCQlweG1yYW0gLT0gbm9kZXNfYWRkW2ldLmVuZCAtIG5vZGVzX2FkZFtpXS5zdGFydDsKIAkJaWYgKChsb25nKXB4bXJhbSA8IDApCiAJCQlweG1yYW0gPSAwOwogCX0KIAotCWU4MjByYW0gPSBlbmRfcGZuIC0gZTgyMF9ob2xlX3NpemUoMCwgZW5kX3Bmbik7CisJZTgyMHJhbSA9IGVuZF9wZm4gLSBhYnNlbnRfcGFnZXNfaW5fcmFuZ2UoMCwgZW5kX3Bmbik7CiAJLyogV2Ugc2VlbSB0byBsb3NlIDMgcGFnZXMgc29tZXdoZXJlLiBBbGxvdyBhIGJpdCBvZiBzbGFjay4gKi8KIAlpZiAoKGxvbmcpKGU4MjByYW0gLSBweG1yYW0pID49IDEqMTAyNCoxMDI0KSB7CiAJCXByaW50ayhLRVJOX0VSUgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQvcGNpL01ha2VmaWxlIGIvYXJjaC94ODZfNjQvcGNpL01ha2VmaWxlCmluZGV4IGEzZjZhZDUuLjFlYjE4ZjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L3BjaS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9wY2kvTWFrZWZpbGUKQEAgLTksNyArOSw3IEBACiBvYmotJChDT05GSUdfUENJX0RJUkVDVCkrPSBkaXJlY3Qubwogb2JqLXkJCSs9IGZpeHVwLm8gaW5pdC5vCiBvYmotJChDT05GSUdfQUNQSSkJKz0gYWNwaS5vCi1vYmoteQkJCSs9IGxlZ2FjeS5vIGlycS5vIGNvbW1vbi5vCitvYmoteQkJCSs9IGxlZ2FjeS5vIGlycS5vIGNvbW1vbi5vIGVhcmx5Lm8KICMgbW1jb25maWcgaGFzIGEgNjRiaXQgc3BlY2lhbAogb2JqLSQoQ09ORklHX1BDSV9NTUNPTkZJRykgKz0gbW1jb25maWcubyBkaXJlY3QubwogCkBAIC0yMywzICsyMyw0IEBACiBmaXh1cC15ICArPSAuLi8uLi9pMzg2L3BjaS9maXh1cC5vCiBpMzg2LXkgICs9IC4uLy4uL2kzODYvcGNpL2kzODYubwogaW5pdC15ICs9IC4uLy4uL2kzODYvcGNpL2luaXQubworZWFybHkteSArPSAuLi8uLi9pMzg2L3BjaS9lYXJseS5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9wY2kvbW1jb25maWcuYyBiL2FyY2gveDg2XzY0L3BjaS9tbWNvbmZpZy5jCmluZGV4IDNjNTVjNzYuLjc3MzJmNDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L3BjaS9tbWNvbmZpZy5jCisrKyBiL2FyY2gveDg2XzY0L3BjaS9tbWNvbmZpZy5jCkBAIC0xNTYsMTUgKzE1Niw0NSBAQAogCQkJYWRkciA9IHBjaV9kZXZfYmFzZSgwLCBrLCBQQ0lfREVWRk4oaSwgMCkpOwogCQkJaWYgKGFkZHIgPT0gTlVMTHx8IHJlYWRsKGFkZHIpICE9IHZhbDEpIHsKIAkJCQlzZXRfYml0KGkgKyAzMiprLCBmYWxsYmFja19zbG90cyk7Ci0JCQkJcHJpbnRrKEtFUk5fTk9USUNFCi0JCQkJIlBDSTogTm8gbW1jb25maWcgcG9zc2libGUgb24gZGV2aWNlICV4OiV4XG4iLAotCQkJCQlrLCBpKTsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlBDSTogTm8gbW1jb25maWcgcG9zc2libGUiCisJCQkJICAgICAgICIgb24gZGV2aWNlICUwMng6JTAyeFxuIiwgaywgaSk7CiAJCQl9CiAJCX0KIAl9CiB9CiAKLXZvaWQgX19pbml0IHBjaV9tbWNmZ19pbml0KHZvaWQpCitzdGF0aWMgX19pbml0IHZvaWQgcGNpX21tY2ZnX2luc2VydF9yZXNvdXJjZXModm9pZCkKK3sKKyNkZWZpbmUgUENJX01NQ0ZHX1JFU09VUkNFX05BTUVfTEVOIDE5CisJaW50IGk7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJY2hhciAqbmFtZXM7CisJdW5zaWduZWQgbnVtX2J1c2VzOworCisJcmVzID0ga2NhbGxvYyhQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU4gKyBzaXplb2YoKnJlcyksCisJCQlwY2lfbW1jZmdfY29uZmlnX251bSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXJlcykgeworCQlwcmludGsoS0VSTl9FUlIgIlBDSTogVW5hYmxlIHRvIGFsbG9jYXRlIE1NQ09ORklHIHJlc291cmNlc1xuIik7CisJCXJldHVybjsKKwl9CisKKwluYW1lcyA9ICh2b2lkICopJnJlc1twY2lfbW1jZmdfY29uZmlnX251bV07CisJZm9yIChpID0gMDsgaSA8IHBjaV9tbWNmZ19jb25maWdfbnVtOyBpKyssIHJlcysrKSB7CisJCW51bV9idXNlcyA9IHBjaV9tbWNmZ19jb25maWdbaV0uZW5kX2J1c19udW1iZXIgLQorCQkgICAgcGNpX21tY2ZnX2NvbmZpZ1tpXS5zdGFydF9idXNfbnVtYmVyICsgMTsKKwkJcmVzLT5uYW1lID0gbmFtZXM7CisJCXNucHJpbnRmKG5hbWVzLCBQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU4sICJQQ0kgTU1DT05GSUcgJXUiLAorCQkJcGNpX21tY2ZnX2NvbmZpZ1tpXS5wY2lfc2VnbWVudF9ncm91cF9udW1iZXIpOworCQlyZXMtPnN0YXJ0ID0gcGNpX21tY2ZnX2NvbmZpZ1tpXS5iYXNlX2FkZHJlc3M7CisJCXJlcy0+ZW5kID0gcmVzLT5zdGFydCArIChudW1fYnVzZXMgPDwgMjApIC0gMTsKKwkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9CVVNZOworCQlpbnNlcnRfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCByZXMpOworCQluYW1lcyArPSBQQ0lfTU1DRkdfUkVTT1VSQ0VfTkFNRV9MRU47CisJfQorfQorCit2b2lkIF9faW5pdCBwY2lfbW1jZmdfaW5pdChpbnQgdHlwZSkKIHsKIAlpbnQgaTsKIApAQCAtMTc3LDcgKzIwNyw5IEBACiAJICAgIChwY2lfbW1jZmdfY29uZmlnWzBdLmJhc2VfYWRkcmVzcyA9PSAwKSkKIAkJcmV0dXJuOwogCi0JaWYgKCFlODIwX2FsbF9tYXBwZWQocGNpX21tY2ZnX2NvbmZpZ1swXS5iYXNlX2FkZHJlc3MsCisJLyogT25seSBkbyB0aGlzIGNoZWNrIHdoZW4gdHlwZSAxIHdvcmtzLiBJZiBpdCBkb2Vzbid0IHdvcmsKKyAgICAgICAgICAgYXNzdW1lIHdlIHJ1biBvbiBhIE1hYyBhbmQgYWx3YXlzIHVzZSBNQ0ZHICovCisJaWYgKHR5cGUgPT0gMSAmJiAhZTgyMF9hbGxfbWFwcGVkKHBjaV9tbWNmZ19jb25maWdbMF0uYmFzZV9hZGRyZXNzLAogCQkJcGNpX21tY2ZnX2NvbmZpZ1swXS5iYXNlX2FkZHJlc3MgKyBNTUNPTkZJR19BUEVSX01JTiwKIAkJCUU4MjBfUkVTRVJWRUQpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiUENJOiBCSU9TIEJ1ZzogTUNGRyBhcmVhIGF0ICV4IGlzIG5vdCBFODIwLXJlc2VydmVkXG4iLApAQCAtMTg2LDcgKzIxOCw2IEBACiAJCXJldHVybjsKIAl9CiAKLQkvKiBSRUQtUEVOIGkzODYgZG9lc24ndCBkbyBfbm9jYWNoZSByaWdodCBub3cgKi8KIAlwY2lfbW1jZmdfdmlydCA9IGttYWxsb2Moc2l6ZW9mKCpwY2lfbW1jZmdfdmlydCkgKiBwY2lfbW1jZmdfY29uZmlnX251bSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHBjaV9tbWNmZ192aXJ0ID09IE5VTEwpIHsKIAkJcHJpbnRrKCJQQ0k6IENhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBtbWNvbmZpZyBzdHJ1Y3R1cmVzXG4iKTsKQEAgLTIwNSw2ICsyMzYsNyBAQAogCX0KIAogCXVucmVhY2hhYmxlX2RldmljZXMoKTsKKwlwY2lfbW1jZmdfaW5zZXJ0X3Jlc291cmNlcygpOwogCiAJcmF3X3BjaV9vcHMgPSAmcGNpX21tY2ZnOwogCXBjaV9wcm9iZSA9IChwY2lfcHJvYmUgJiB+UENJX1BST0JFX01BU0spIHwgUENJX1BST0JFX01NQ09ORjsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsa3RyYWNlLmMgYi9ibG9jay9ibGt0cmFjZS5jCmluZGV4IDI2NWY3YTguLjJiNGVmMmIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsa3RyYWNlLmMKKysrIGIvYmxvY2svYmxrdHJhY2UuYwpAQCAtMjE3LDcgKzIxNyw3IEBACiAKIHN0YXRpYyBpbnQgYmxrX2Ryb3BwZWRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKLQlmaWxwLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+dS5nZW5lcmljX2lwOworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNvcm4vY2hhci9pMmMuYyBiL2RyaXZlcnMvYWNvcm4vY2hhci9pMmMuYwppbmRleCBjMjZjMDhiLi5iZGI5YzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Fjb3JuL2NoYXIvaTJjLmMKKysrIGIvZHJpdmVycy9hY29ybi9jaGFyL2kyYy5jCkBAIC0zMDgsNyArMzA4LDYgQEAKIAkuZ2V0c2RhCQk9IGlvY19nZXRzZGEsCiAJLmdldHNjbAkJPSBpb2NfZ2V0c2NsLAogCS51ZGVsYXkJCT0gODAsCi0JLm1kZWxheQkJPSA4MCwKIAkudGltZW91dAk9IDEwMAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2kyY19lYy5jIGIvZHJpdmVycy9hY3BpL2kyY19lYy5jCmluZGV4IDY4MDljMjguLjYzNDJlNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9pMmNfZWMuYworKysgYi9kcml2ZXJzL2FjcGkvaTJjX2VjLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogCQlJMkNfRlVOQ19TTUJVU19JMkNfQkxPQ0sgfCBJMkNfRlVOQ19TTUJVU19IV1BFQ19DQUxDKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGFjcGlfZWNfc21idXNfYWxnb3JpdGhtID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIGFjcGlfZWNfc21idXNfYWxnb3JpdGhtID0gewogCS5zbWJ1c194ZmVyID0gYWNwaV9lY19zbWJfYWNjZXNzLAogCS5mdW5jdGlvbmFsaXR5ID0gYWNwaV9lY19zbWJfZnVuYywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvb3NsLmMgYi9kcml2ZXJzL2FjcGkvb3NsLmMKaW5kZXggNTA3ZjA1MS4uMjBiZWVhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL29zbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9vc2wuYwpAQCAtMTA3OSw3ICsxMDc5LDcgQEAKIAogYWNwaV9zdGF0dXMgYWNwaV9vc19kZWxldGVfY2FjaGUoYWNwaV9jYWNoZV90ICogY2FjaGUpCiB7Ci0JKHZvaWQpa21lbV9jYWNoZV9kZXN0cm95KGNhY2hlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koY2FjaGUpOwogCXJldHVybiAoQUVfT0spOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9LY29uZmlnIGIvZHJpdmVycy9hdGEvS2NvbmZpZwppbmRleCA5OTgzN2Q5Li4zZjRhYTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9LY29uZmlnCisrKyBiL2RyaXZlcnMvYXRhL0tjb25maWcKQEAgLTMxMSw3ICszMTEsNyBAQAogCiBjb25maWcgUEFUQV9MRUdBQ1kKIAl0cmlzdGF0ZSAiTGVnYWN5IElTQSBQQVRBIHN1cHBvcnQgKEV4cGVyaW1lbnRhbCkiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJZGVwZW5kcyBvbiBJU0EgJiYgRVhQRVJJTUVOVEFMCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBJU0EvVkxCIGJ1cyBsZWdhY3kgUEFUQQogCSAgcG9ydHMgYW5kIGFsbG93cyB0aGVtIHRvIGJlIGFjY2Vzc2VkIHZpYSB0aGUgbmV3IEFUQSBsYXllci4KQEAgLTQwMCw2ICs0MDAsNyBAQAogCiBjb25maWcgUEFUQV9RREkKIAl0cmlzdGF0ZSAiUURJIFZMQiBQQVRBIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJU0EKIAloZWxwCiAJICBTdXBwb3J0IGZvciBRREkgNjUwMCBhbmQgNjU4MCBQQVRBIGNvbnRyb2xsZXJzIG9uIFZFU0EgbG9jYWwgYnVzLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5jIGIvZHJpdmVycy9hdGEvYXRhX2dlbmVyaWMuYwppbmRleCAxZDFjMzBhLi4zNzc0MjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9hdGFfZ2VuZXJpYy5jCisrKyBiL2RyaXZlcnMvYXRhL2F0YV9nZW5lcmljLmMKQEAgLTE0Myw3ICsxNDMsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYyBiL2RyaXZlcnMvYXRhL2F0YV9waWl4LmMKaW5kZXggZmZhMTExZS4uNTcxOTcwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYXRhX3BpaXguYworKysgYi9kcml2ZXJzL2F0YS9hdGFfcGlpeC5jCkBAIC02NDMsMTEgKzY0Myw5IEBACiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCi0JaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmcGlpeF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKSB7Ci0JCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9JTkZPLCAicG9ydCBkaXNhYmxlZC4gaWdub3JpbmcuXG4iKTsKLQkJYXAtPmVoX2NvbnRleHQuaS5hY3Rpb24gJj0gfkFUQV9FSF9SRVNFVF9NQVNLOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmcGlpeF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQorCQlyZXR1cm4gLUVOT0VOVDsKKwkJCiAJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwogCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCmluZGV4IDc1M2IwMTUuLmI0YWJkNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYwpAQCAtNTQ1Myw2ICs1NDUzLDExIEBACiAJaW50IHJjOwogCiAJRFBSSU5USygiRU5URVJcbiIpOworCQorCWlmIChlbnQtPmlycSA9PSAwKSB7CisJCWRldl9wcmludGsoS0VSTl9FUlIsIGRldiwgImlzIG5vdCBhdmFpbGFibGU6IE5vIGludGVycnVwdCBhc3NpZ25lZC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CiAJLyogYWxsb2MgYSBjb250YWluZXIgZm9yIG91ciBsaXN0IG9mIEFUQSBwb3J0cyAoYnVzZXMpICovCiAJaG9zdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdGFfaG9zdCkgKwogCQkgICAgICAgKGVudC0+bl9wb3J0cyAqIHNpemVvZih2b2lkICopKSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtZWguYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1laC5jCmluZGV4IDNmYTgwZjAuLjAyYjJiMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1laC5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1laC5jCkBAIC0xNTE1LDcgKzE1MTUsMTEgQEAKIAlpZiAocHJlcmVzZXQpIHsKIAkJcmMgPSBwcmVyZXNldChhcCk7CiAJCWlmIChyYykgewotCQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwKKwkJCWlmIChyYyA9PSAtRU5PRU5UKSB7CisJCQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0RFQlVHLCAicG9ydCBkaXNhYmxlZC4gaWdub3JpbmcuXG4iKTsKKwkJCQlhcC0+ZWhfY29udGV4dC5pLmFjdGlvbiAmPSB+QVRBX0VIX1JFU0VUX01BU0s7CisJCQl9IGVsc2UKKwkJCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLAogCQkJCQkicHJlcmVzZXQgZmFpbGVkIChlcnJubz0lZClcbiIsIHJjKTsKIAkJCXJldHVybiByYzsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCmluZGV4IDY4OGJiNTUuLjA4YjNhNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYworKysgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKQEAgLTg4MSw3ICs4ODEsNyBAQAogCXByb2JlX2VudC0+cHJpdmF0ZV9kYXRhID0gcG9ydFswXS0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKHBvcnRfbWFzayAmIEFUQV9QT1JUX1BSSU1BUlkpIHsKLQkJcHJvYmVfZW50LT5pcnEgPSAxNDsKKwkJcHJvYmVfZW50LT5pcnEgPSBBVEFfUFJJTUFSWV9JUlE7CiAJCXByb2JlX2VudC0+cG9ydFswXS5jbWRfYWRkciA9IEFUQV9QUklNQVJZX0NNRDsKIAkJcHJvYmVfZW50LT5wb3J0WzBdLmFsdHN0YXR1c19hZGRyID0KIAkJcHJvYmVfZW50LT5wb3J0WzBdLmN0bF9hZGRyID0gQVRBX1BSSU1BUllfQ1RMOwpAQCAtODk2LDkgKzg5Niw5IEBACiAKIAlpZiAocG9ydF9tYXNrICYgQVRBX1BPUlRfU0VDT05EQVJZKSB7CiAJCWlmIChwcm9iZV9lbnQtPmlycSkKLQkJCXByb2JlX2VudC0+aXJxMiA9IDE1OworCQkJcHJvYmVfZW50LT5pcnEyID0gQVRBX1NFQ09OREFSWV9JUlE7CiAJCWVsc2UKLQkJCXByb2JlX2VudC0+aXJxID0gMTU7CisJCQlwcm9iZV9lbnQtPmlycSA9IEFUQV9TRUNPTkRBUllfSVJROwogCQlwcm9iZV9lbnQtPnBvcnRbMV0uY21kX2FkZHIgPSBBVEFfU0VDT05EQVJZX0NNRDsKIAkJcHJvYmVfZW50LT5wb3J0WzFdLmFsdHN0YXR1c19hZGRyID0KIAkJcHJvYmVfZW50LT5wb3J0WzFdLmN0bF9hZGRyID0gQVRBX1NFQ09OREFSWV9DVEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jIGIvZHJpdmVycy9hdGEvcGF0YV9hbGkuYwppbmRleCA4NDQ4ZWU2Li44N2FmM2I1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2FsaS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYWxpLmMKQEAgLTM2OSw3ICszNjksNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKQEAgLTQxMCw3ICs0MTAsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKQEAgLTQ0OCw3ICs0NDgsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKQEAgLTQ4NSw3ICs0ODUsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FtZC5jCmluZGV4IDMyOTNjZjkuLjU5OWVlMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYW1kLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9hbWQuYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX2FtZCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMi4zIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjQiCiAKIC8qKgogICoJdGltaW5nX3NldHVwCQktCXNoYXJlZCB0aW1pbmcgY29tcHV0YXRpb24gYW5kIGxvYWQKQEAgLTEzNywxMSArMTM3LDggQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAJdTggYXRhNjY7CiAKLQlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZhbWRfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkgewotCQlhdGFfcG9ydF9kaXNhYmxlKGFwKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXU6IHBvcnQgZGlzYWJsZWQuIGlnbm9yaW5nLlxuIiwgYXAtPmlkKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJmFtZF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQorCQlyZXR1cm4gLUVOT0VOVDsKIAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDIsICZhdGE2Nik7CiAJaWYgKGF0YTY2ICYgYml0bWFza1thcC0+cG9ydF9ub10pCkBAIC0xNjcsMTEgKzE2NCw5IEBACiAJCXsgMHg0MCwgMSwgMHgwMSwgMHgwMSB9CiAJfTsKIAotCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJmFtZF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKSB7Ci0JCWF0YV9wb3J0X2Rpc2FibGUoYXApOwotCQlwcmludGsoS0VSTl9JTkZPICJhdGEldTogcG9ydCBkaXNhYmxlZC4gaWdub3JpbmcuXG4iLCBhcC0+aWQpOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmYW1kX2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCisJCXJldHVybiAtRU5PRU5UOworCiAJLyogTm8gaG9zdCBzaWRlIGNhYmxlIGRldGVjdGlvbiAqLwogCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKIAlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CkBAIC0yNjIsMTIgKzI1Nyw4IEBACiAJdTggYXRhNjY7CiAJdTE2IHVkbWE7CiAKLQlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZudl9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKSB7Ci0JCWF0YV9wb3J0X2Rpc2FibGUoYXApOwotCQlwcmludGsoS0VSTl9JTkZPICJhdGEldTogcG9ydCBkaXNhYmxlZC4gaWdub3JpbmcuXG4iLCBhcC0+aWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KKwlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZudl9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQorCQlyZXR1cm4gLUVOT0VOVDsKIAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTIsICZhdGE2Nik7CiAJaWYgKGF0YTY2ICYgYml0bWFza1thcC0+cG9ydF9ub10pCkBAIC0zNjgsNyArMzU5LDcgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCkBAIC00MDIsNyArMzkzLDcgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCkBAIC00MzYsNyArNDI3LDcgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCkBAIC00NzAsNyArNDYxLDcgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCkBAIC01MDQsNyArNDk1LDcgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCkBAIC01MzgsNyArNTI5LDcgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2FydG9wLmMKaW5kZXggZDZlZjNiZi4uYzRjY2I3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9hcnRvcC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXJ0b3AuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX2FydG9wIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC40LjEiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjQuMiIKIAogLyoKICAqCVRoZSBBUlRPUCBoYXMgMzMgTWh6IGFuZCAib3ZlciBjbG9ja2VkIiB0aW1pbmcgdGFibGVzLiBVbnRpbCB3ZQpAQCAtNDcsMTEgKzQ3LDkgQEAKIAkJeyAweDRBVSwgMVUsIDB4MDRVTCwgMHgwNFVMIH0sCS8qIHBvcnQgMSAqLwogCX07CiAKLQlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZhcnRvcF9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKSB7Ci0JCWF0YV9wb3J0X2Rpc2FibGUoYXApOwotCQlwcmludGsoS0VSTl9JTkZPICJhdGEldTogcG9ydCBkaXNhYmxlZC4gaWdub3JpbmcuXG4iLCBhcC0+aWQpOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmYXJ0b3BfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKIAlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBNDA7CiAJcmV0dXJuIGF0YV9zdGRfcHJlcmVzZXQoYXApOwogfQpAQCAtOTAsMTEgKzg4LDkgQEAKIAl1OCB0bXA7CiAKIAkvKiBPZGQgbnVtYmVyZWQgZGV2aWNlIGlkcyBhcmUgdGhlIHVuaXRzIHdpdGggZW5hYmxlIGJpdHMgKHRoZSAtUiBjYXJkcykgKi8KLQlpZiAocGRldi0+ZGV2aWNlICUgMSAmJiAhcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJmFydG9wX2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpIHsKLQkJYXRhX3BvcnRfZGlzYWJsZShhcCk7Ci0JCXByaW50ayhLRVJOX0lORk8gImF0YSV1OiBwb3J0IGRpc2FibGVkLiBpZ25vcmluZy5cbiIsIGFwLT5pZCk7Ci0JCXJldHVybiAwOwotCX0KKwlpZiAocGRldi0+ZGV2aWNlICUgMSAmJiAhcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJmFydG9wX2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCisJCXJldHVybiAtRU5PRU5UOworCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg0OSwgJnRtcCk7CiAJaWYgKHRtcCAmICgxID4+IGFwLT5wb3J0X25vKSkKIAkJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwpAQCAtMzQ0LDcgKzM0MCw3IEBACiAJLmJtZG1hX3N0YXR1cwkJPSBhdGFfYm1kbWFfc3RhdHVzLAogCS5xY19wcmVwCQk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJCT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgkJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LApAQCAtMzc5LDggKzM3NSw2IEBACiAJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAogCS5kYXRhX3hmZXIJCT0gYXRhX3Bpb19kYXRhX3hmZXIsCiAKLQkuZW5nX3RpbWVvdXQJCT0gYXRhX2VuZ190aW1lb3V0LAotCiAJLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jIGIvZHJpdmVycy9hdGEvcGF0YV9hdGlpeHAuYwppbmRleCAzZjc4YTFlLi42YzIyNjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2F0aWl4cC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXRpaXhwLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9hdGlpeHAiCi0jZGVmaW5lIERSVl9WRVJTSU9OICIwLjQuMiIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNC4zIgogCiBlbnVtIHsKIAlBVElJWFBfSURFX1BJT19USU1JTkcJPSAweDQwLApAQCAtNDEsMTEgKzQxLDkgQEAKIAkJeyAweDQ4LCAxLCAweDA4LCAweDAwIH0KIAl9OwogCi0JaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmYXRpaXhwX2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpIHsKLQkJYXRhX3BvcnRfZGlzYWJsZShhcCk7Ci0JCXByaW50ayhLRVJOX0lORk8gImF0YSV1OiBwb3J0IGRpc2FibGVkLiBpZ25vcmluZy5cbiIsIGFwLT5pZCk7Ci0JCXJldHVybiAwOwotCX0KKwlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZhdGlpeHBfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKIAlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBODA7CiAJcmV0dXJuIGF0YV9zdGRfcHJlcmVzZXQoYXApOwogfQpAQCAtMjQ0LDcgKzI0Miw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gYXRhX3Bpb19kYXRhX3hmZXIsCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NHguYyBiL2RyaXZlcnMvYXRhL3BhdGFfY21kNjR4LmMKaW5kZXggYWJmMWJiNy4uZTkyYjBlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jbWQ2NHguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NtZDY0eC5jCkBAIC0zMDEsNyArMzAxLDcgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCkBAIC0zMzUsNyArMzM1LDcgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCkBAIC0zNjksNyArMzY5LDcgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUyMC5jIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MjAuYwppbmRleCA3OTJjZTQ4Li5hNmM2Y2ViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUyMC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTIwLmMKQEAgLTE5Myw4ICsxOTMsNiBAQAogCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKIAkuZGF0YV94ZmVyCQk9IGF0YV9waW9fZGF0YV94ZmVyLAogCi0JLmVuZ190aW1lb3V0CQk9IGF0YV9lbmdfdGltZW91dCwKLQogCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTMwLmMKaW5kZXggZjNkOGEzYi4uN2JiYTRkOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTMwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MzAuYwpAQCAtMjA3LDcgKzIwNyw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBjczU1MzBfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gYXRhX3Bpb19kYXRhX3hmZXIsCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzUuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTM1LmMKaW5kZXggNjlkNmI0Mi4uZDY0ZmNkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9jczU1MzUuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2NzNTUzNS5jCkBAIC0yMTEsNyArMjExLDcgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2N5cHJlc3MuYyBiL2RyaXZlcnMvYXRhL3BhdGFfY3lwcmVzcy5jCmluZGV4IGZkNTU0NzRlLi5kZmE1YWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2N5cHJlc3MuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2N5cHJlc3MuYwpAQCAtMTYyLDcgKzE2Miw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gYXRhX3Bpb19kYXRhX3hmZXIsCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9lZmFyLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2VmYXIuYwppbmRleCBjMzBiYzE4Li45NWNkMWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2VmYXIuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2VmYXIuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX2VmYXIiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjQuMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNC4yIgogCiAvKioKICAqCWVmYXJfcHJlX3Jlc2V0CS0JY2hlY2sgZm9yIDQwLzgwIHBpbgpAQCAtNDIsMTEgKzQyLDkgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAJdTggdG1wOwogCi0JaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmZWZhcl9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKSB7Ci0JCWF0YV9wb3J0X2Rpc2FibGUoYXApOwotCQlwcmludGsoS0VSTl9JTkZPICJhdGEldTogcG9ydCBkaXNhYmxlZC4gaWdub3JpbmcuXG4iLCBhcC0+aWQpOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmZWZhcl9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQorCQlyZXR1cm4gLUVOT0VOVDsKKwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDcsICZ0bXApOwogCWlmICh0bXAgJiAoMiA+PiBhcC0+cG9ydF9ubykpCiAJCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKQEAgLTI2Myw4ICsyNjEsNiBAQAogCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKIAkuZGF0YV94ZmVyCQk9IGF0YV9waW9fZGF0YV94ZmVyLAogCi0JLmVuZ190aW1lb3V0CQk9IGF0YV9lbmdfdGltZW91dCwKLQogCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0MzY2LmMKaW5kZXggOTRiYjFkZi4uY2Y2NTZlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzNjYuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2hwdDM2Ni5jCkBAIC0zNjAsNyArMzYwLDcgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDM3eC5jIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzN3guYwppbmRleCA1MzJhNzkyLi4xMDMxOGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDM3eC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0Mzd4LmMKQEAgLTc5Myw3ICs3OTMsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKQEAgLTgzMiw3ICs4MzIsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKQEAgLTg3Miw3ICs4NzIsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKQEAgLTkxMiw3ICs5MTIsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gybi5jIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDJuLmMKaW5kZXggMDZjOGRiMC4uNWM1ZDRmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDJuLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDJuLmMKQEAgLTM3Miw3ICszNzIsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gaHB0M3gybl9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDMuYwppbmRleCAxNTI3NzAxLi4xZjA4NGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaXNhcG5wLmMgYi9kcml2ZXJzL2F0YS9wYXRhX2lzYXBucC5jCmluZGV4IDczOTQ4YzguLjY0MGI4YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaXNhcG5wLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9pc2FwbnAuYwpAQCAtNTIsNyArNTIsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjF4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2l0ODIxeC5jCmluZGV4IGFmMzkwOTcuLjgyYTQ2ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfaXQ4MjF4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9pdDgyMXguYwpAQCAtNzAzLDcgKzcwMyw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBpdDgyMXhfc21hcnRfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gYXRhX3Bpb19kYXRhX3hmZXIsCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApAQCAtNzM5LDcgKzczOSw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBpdDgyMXhfcGFzc3RocnVfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gYXRhX3Bpb19kYXRhX3hmZXIsCiAKIAkuaXJxX2NsZWFyCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfam1pY3Jvbi5jIGIvZHJpdmVycy9hdGEvcGF0YV9qbWljcm9uLmMKaW5kZXggNjgzMmE2NC4uYmUzYTg2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9qbWljcm9uLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9qbWljcm9uLmMKQEAgLTUxLDcgKzUxLDcgQEAKIAkvKiBDaGVjayBpZiBvdXIgcG9ydCBpcyBlbmFibGVkICovCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsICZjb250cm9sKTsKIAlpZiAoKGNvbnRyb2wgJiBwb3J0X21hc2spID09IDApCi0JCXJldHVybiAwOworCQlyZXR1cm4gLUVOT0VOVDsKIAogCS8qIFRoZXJlIGFyZSB0d28gYmFzaWMgbWFwcGluZ3MuIE9uZSBoYXMgdGhlIHR3byBTQVRBIHBvcnRzIG1lcmdlZAogCSAgIGFzIG1hc3Rlci9zbGF2ZSBhbmQgdGhlIHNlY29uZGFyeSBhcyBQQVRBLCB0aGUgb3RoZXIgaGFzIG9ubHkgdGhlCkBAIC0xNjQsOCArMTY0LDcgQEAKIAkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCiAJLmRhdGFfeGZlcgkJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAotCS8qIFRpbWVvdXQgaGFuZGxpbmcuIFNwZWNpYWwgcmVjb3ZlcnkgaG9va3MgaGVyZSAqLwotCS5lbmdfdGltZW91dAkJPSBhdGFfZW5nX3RpbWVvdXQsCisJLyogSVJRLXJlbGF0ZWQgaG9va3MgKi8KIAkuaXJxX2hhbmRsZXIJCT0gYXRhX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbGVnYWN5LmMgYi9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jCmluZGV4IGFkMzdjMjIuLjEwMjMxZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbGVnYWN5LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9sZWdhY3kuYwpAQCAtMTYxLDcgKzE2MSw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gYXRhX3Bpb19kYXRhX3hmZXJfbm9pcnEsCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApAQCAtMTg2LDcgKzE4Niw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gYXRhX3Bpb19kYXRhX3hmZXJfbm9pcnEsCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApAQCAtMjk2LDcgKzI5Niw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gcGRjX2RhdGFfeGZlcl92bGIsCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApAQCAtMzQ4LDcgKzM0OCw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gYXRhX3Bpb19kYXRhX3hmZXIsCS8qIENoZWNrIHZsYi9ub2lycSAqLwogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKQEAgLTQxMSw3ICs0MTEsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAkvKiBGSVhNRTogQ2hlY2sgMzJiaXQgYW5kIG5vaXJxICovCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApAQCAtNTI5LDcgKzUyOSw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gYXRhX3Bpb19kYXRhX3hmZXIsCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApAQCAtNjU5LDcgKzY1OSw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBvcHRpODJjNDZ4X3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfbXBpaXguYyBiL2RyaXZlcnMvYXRhL3BhdGFfbXBpaXguYwppbmRleCAxOTU4YzRlLi4zYzY1MzkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX21waWl4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9tcGlpeC5jCkBAIC0xOCw3ICsxOCw3IEBACiAgKiBUaGUgZHJpdmVyIGNvbmNpb3VzbHkga2VlcHMgdGhpcyBsb2dpYyBpbnRlcm5hbGx5IHRvIGF2b2lkIHB1c2hpbmcgcXVpcmt5CiAgKiBQQVRBIGhpc3RvcnkgaW50byB0aGUgY2xlYW4gbGliYXRhIGxheWVyLgogICoKLSAqIFRoaW5rcGFkIHNwZWNpZmljIG5vdGU6IElmIHlvdSBib290IGFuIE1QSUlYIHVzaW5nIHRoaW5rcGFkIHdpdGggYSBQQ01DSUEKKyAqIFRoaW5rcGFkIHNwZWNpZmljIG5vdGU6IElmIHlvdSBib290IGFuIE1QSUlYIHVzaW5nIGEgdGhpbmtwYWQgd2l0aCBhIFBDTUNJQQogICogaGFyZCBkaXNrIHByZXNlbnQgdGhpcyBkcml2ZXIgd2lsbCBub3QgZGV0ZWN0IGl0LiBUaGlzIGlzIG5vdCBhIGJ1Zy4gSW4gdGhpcwogICogY29uZmlndXJhdGlvbiB0aGUgc2Vjb25kYXJ5IHBvcnQgb2YgdGhlIE1QSUlYIGlzIGRpc2FibGVkIGFuZCB0aGUgYWRkcmVzc2VzCiAgKiBhcmUgZGVjb2RlZCBieSB0aGUgUENNQ0lBIGJyaWRnZSBhbmQgdGhlcmVmb3JlIGFyZSBmb3IgYSBnZW5lcmljIElERSBkcml2ZXIKQEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9tcGlpeCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuNy4xIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC43LjIiCiAKIGVudW0gewogCUlERVRJTSA9IDB4NkMsCQkvKiBJREUgY29udHJvbCByZWdpc3RlciAqLwpAQCAtNTQsMTEgKzU0LDggQEAKIAkJeyAweDZGLCAxLCAweDgwLCAweDgwIH0KIAl9OwogCi0JaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmbXBpaXhfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkgewotCQlhdGFfcG9ydF9kaXNhYmxlKGFwKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXU6IHBvcnQgZGlzYWJsZWQuIGlnbm9yaW5nLlxuIiwgYXAtPmlkKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJm1waWl4X2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCisJCXJldHVybiAtRU5PRU5UOwogCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKIAlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX25ldGNlbGwuYyBiL2RyaXZlcnMvYXRhL3BhdGFfbmV0Y2VsbC5jCmluZGV4IDE2Y2IyNTQuLjc2ZWI5YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbmV0Y2VsbC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbmV0Y2VsbC5jCkBAIC05MCw4ICs5MCw3IEBACiAJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAogCS5kYXRhX3hmZXIJCT0gYXRhX3Bpb19kYXRhX3hmZXIsCiAKLQkvKiBUaW1lb3V0IGhhbmRsaW5nLiBTcGVjaWFsIHJlY292ZXJ5IGhvb2tzIGhlcmUgKi8KLQkuZW5nX3RpbWVvdXQJCT0gYXRhX2VuZ190aW1lb3V0LAorCS8qIElSUS1yZWxhdGVkIGhvb2tzICovCiAJLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX25zODc0MTAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfbnM4NzQxMC5jCmluZGV4IDkzZDY2NDYuLjIwMDVhOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfbnM4NzQxMC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfbnM4NzQxMC5jCkBAIC00NSwxMSArNDUsOCBAQAogCQl7IDB4NDcsIDEsIDB4MDgsIDB4MDggfQogCX07CiAKLQlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZuczg3NDEwX2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpIHsKLQkJYXRhX3BvcnRfZGlzYWJsZShhcCk7Ci0JCXByaW50ayhLRVJOX0lORk8gImF0YSV1OiBwb3J0IGRpc2FibGVkLiBpZ25vcmluZy5cbiIsIGFwLT5pZCk7Ci0JCXJldHVybiAwOwotCX0KKwlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZuczg3NDEwX2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCisJCXJldHVybiAtRU5PRU5UOwogCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKIAlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CiB9CkBAIC0xNzksNyArMTc2LDcgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IG5zODc0MTBfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gYXRhX3Bpb19kYXRhX3hmZXIsCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9vbGRwaWl4LmMgYi9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYwppbmRleCAwNGM2MThhLi4zMWEyODVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX29sZHBpaXguYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX29sZHBpaXgiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjUuMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNS4yIgogCiAvKioKICAqCW9sZHBpaXhfcHJlX3Jlc2V0CQktCXByb2JlIGJlZ2luCkBAIC00MiwxMSArNDIsOCBAQAogCQl7IDB4NDNVLCAxVSwgMHg4MFVMLCAweDgwVUwgfSwJLyogcG9ydCAxICovCiAJfTsKIAotCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJm9sZHBpaXhfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkgewotCQlhdGFfcG9ydF9kaXNhYmxlKGFwKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXU6IHBvcnQgZGlzYWJsZWQuIGlnbm9yaW5nLlxuIiwgYXAtPmlkKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJm9sZHBpaXhfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CiAJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwogCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfb3B0aS5jIGIvZHJpdmVycy9hdGEvcGF0YV9vcHRpLmMKaW5kZXggYzNkMDEzMi4uNTdmZTIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9vcHRpLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9vcHRpLmMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9vcHRpIgotI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjQiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjIuNSIKIAogZW51bSB7CiAJUkVBRF9SRUcJPSAwLAkvKiBpbmRleCBvZiBSZWFkIGN5Y2xlIHRpbWluZyByZWdpc3RlciAqLwpAQCAtNTksMTEgKzU5LDkgQEAKIAkJeyAweDQwLCAxLCAweDA4LCAweDAwIH0KIAl9OwogCi0JaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmb3B0aV9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKSB7Ci0JCWF0YV9wb3J0X2Rpc2FibGUoYXApOwotCQlwcmludGsoS0VSTl9JTkZPICJhdGEldTogcG9ydCBkaXNhYmxlZC4gaWdub3JpbmcuXG4iLCBhcC0+aWQpOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmb3B0aV9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKQorCQlyZXR1cm4gLUVOT0VOVDsKKwogCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE0MDsKIAlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CiB9CkBAIC0yMjksNyArMjI3LDcgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX29wdGlkbWEuYyBiL2RyaXZlcnMvYXRhL3BhdGFfb3B0aWRtYS5jCmluZGV4IDE3N2E0NTUuLjcyOTZhMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfb3B0aWRtYS5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfb3B0aWRtYS5jCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgInBhdGFfb3B0aWRtYSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMi4xIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjIiCiAKIGVudW0gewogCVJFQURfUkVHCT0gMCwJLyogaW5kZXggb2YgUmVhZCBjeWNsZSB0aW1pbmcgcmVnaXN0ZXIgKi8KQEAgLTU5LDExICs1OSw5IEBACiAJCTB4NDAsIDEsIDB4MDgsIDB4MDAKIAl9OwogCi0JaWYgKGFwLT5wb3J0X25vICYmICFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmb3B0aWRtYV9lbmFibGVfYml0cykpIHsKLQkJYXRhX3BvcnRfZGlzYWJsZShhcCk7Ci0JCXByaW50ayhLRVJOX0lORk8gImF0YSV1OiBwb3J0IGRpc2FibGVkLiBpZ25vcmluZy5cbiIsIGFwLT5pZCk7Ci0JCXJldHVybiAwOwotCX0KKwlpZiAoYXAtPnBvcnRfbm8gJiYgIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZvcHRpZG1hX2VuYWJsZV9iaXRzKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKIAlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBNDA7CiAJcmV0dXJuIGF0YV9zdGRfcHJlcmVzZXQoYXApOwogfQpAQCAtMzg4LDcgKzM4Niw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gYXRhX3Bpb19kYXRhX3hmZXIsCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApAQCAtNDIzLDcgKzQyMSw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gYXRhX3Bpb19kYXRhX3hmZXIsCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9wY21jaWEuYyBiL2RyaXZlcnMvYXRhL3BhdGFfcGNtY2lhLmMKaW5kZXggNjJiMjVjZC4uY2I1MDFlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9wY21jaWEuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3BjbWNpYS5jCkBAIC04Nyw3ICs4Nyw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gYXRhX3Bpb19kYXRhX3hmZXJfbm9pcnEsCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDI3eC5jIGIvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDI3eC5jCmluZGV4IDMxYWI5YzguLmJkNGVkNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyN3guYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMjd4LmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2RlZmluZSBEUlZfTkFNRQkicGF0YV9wZGMyMDI3eCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNzQtYWMzIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC43NC1hYzUiCiAjdW5kZWYgUERDX0RFQlVHCiAKICNpZmRlZiBQRENfREVCVUcKQEAgLTMxMSwxMCArMzExLDggQEAKIHN0YXRpYyBpbnQgcGRjMjAyN3hfcHJlcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAkvKiBDaGVjayB3aGV0aGVyIHBvcnQgZW5hYmxlZCAqLwotCWlmICghcGRjMjAyN3hfcG9ydF9lbmFibGVkKGFwKSkgewotCQlwcmludGsoS0VSTl9JTkZPICJhdGEldTogcG9ydCBkaXNhYmxlZC4gaWdub3JpbmcuXG4iLCBhcC0+aWQpOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKCFwZGMyMDI3eF9wb3J0X2VuYWJsZWQoYXApKQorCQlyZXR1cm4gLUVOT0VOVDsKIAlwZGMyMDI3eF9jYmxfZGV0ZWN0KGFwKTsKIAlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3FkaS5jIGIvZHJpdmVycy9hdGEvcGF0YV9xZGkuYwppbmRleCAzNWNmZGYwYS4uNzk3N2Y0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9xZGkuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3FkaS5jCkBAIC0xODQsNyArMTg0LDcgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IHFkaV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBxZGlfZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKQEAgLTIxMiw3ICsyMTIsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gcWRpX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IHFkaV9kYXRhX3hmZXIsCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9yYWRpc3lzLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3JhZGlzeXMuYwppbmRleCAyNzdmODQxLi5jMjBiY2Y0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3JhZGlzeXMuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3JhZGlzeXMuYwpAQCAtMjU1LDggKzI1NSw2IEBACiAJLnFjX2lzc3VlCQk9IHJhZGlzeXNfcWNfaXNzdWVfcHJvdCwKIAkuZGF0YV94ZmVyCQk9IGF0YV9waW9fZGF0YV94ZmVyLAogCi0JLmVuZ190aW1lb3V0CQk9IGF0YV9lbmdfdGltZW91dCwKLQogCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9yejEwMDAuYyBiL2RyaXZlcnMvYXRhL3BhdGFfcnoxMDAwLmMKaW5kZXggM2M2ZDg0Zi4uZWNjYzZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9yejEwMDAuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3J6MTAwMC5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5mcmVlemUJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2MxMjAwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NjMTIwMC5jCmluZGV4IDQxNjZjMWEuLjEwN2U2Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2MxMjAwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zYzEyMDAuYwpAQCAtMjE3LDcgKzIxNyw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBzYzEyMDBfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gYXRhX3Bpb19kYXRhX3hmZXIsCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zZXJ2ZXJ3b3Jrcy5jIGIvZHJpdmVycy9hdGEvcGF0YV9zZXJ2ZXJ3b3Jrcy5jCmluZGV4IGFmNDU2MTEuLmE1YzhkN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2VydmVyd29ya3MuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NlcnZlcndvcmtzLmMKQEAgLTQxLDcgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9zZXJ2ZXJ3b3JrcyIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMy42IgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4zLjciCiAKICNkZWZpbmUgU1ZXS1NfQ1NCNV9SRVZJU0lPTl9ORVcJMHg5MiAvKiBtaW4gUENJX1JFVklTSU9OX0lEIGZvciBVRE1BNSAoQTIuMCkgKi8KICNkZWZpbmUgU1ZXS1NfQ1NCNl9SRVZJU0lPTgkweGEwIC8qIG1pbiBQQ0lfUkVWSVNJT05fSUQgZm9yIFVETUE0IChBMS4wKSAqLwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJeyBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjVJREUsIFBDSV9WRU5ET1JfSURfREVMTCwgZGVsbF9jYWJsZSB9LAogCXsgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2SURFLCBQQ0lfVkVORE9SX0lEX0RFTEwsIGRlbGxfY2FibGUgfSwKIAl7IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNUlERSwgUENJX1ZFTkRPUl9JRF9TVU4sICBzdW5fY2FibGUgfSwKLQl7IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfT1NCNCwgUENJX0FOWV9JRCwgb3NiNF9jYWJsZSB9LAorCXsgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0SURFLCBQQ0lfQU5ZX0lELCBvc2I0X2NhYmxlIH0sCiAJeyBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0NTQjVJREUsIFBDSV9BTllfSUQsIGNzYl9jYWJsZSB9LAogCXsgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I2SURFLCBQQ0lfQU5ZX0lELCBjc2JfY2FibGUgfSwKIAl7IFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNklERTIsIFBDSV9BTllfSUQsIGNzYl9jYWJsZSB9LApAQCAtMzUyLDEwICszNTIsMTIgQEAKIAogCS5xY19wcmVwIAk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQk9IGF0YV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAk9IGF0YV9lbmdfdGltZW91dCwKKwogCS5kYXRhX3hmZXIJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAogCS5pcnFfaGFuZGxlcgk9IGF0YV9pbnRlcnJ1cHQsCisJLmlycV9jbGVhcgk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCisKIAkucG9ydF9zdGFydAk9IGF0YV9wb3J0X3N0YXJ0LAogCS5wb3J0X3N0b3AJPSBhdGFfcG9ydF9zdG9wLAogCS5ob3N0X3N0b3AJPSBhdGFfaG9zdF9zdG9wCkBAIC0zODUsMTAgKzM4NywxMiBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKKwkuaXJxX2NsZWFyCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKKwogCS5wb3J0X3N0YXJ0CT0gYXRhX3BvcnRfc3RhcnQsCiAJLnBvcnRfc3RvcAk9IGF0YV9wb3J0X3N0b3AsCiAJLmhvc3Rfc3RvcAk9IGF0YV9ob3N0X3N0b3AKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jCmluZGV4IDhmN2RiOTYuLmM4YjJlMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zaWw2ODAuYwpAQCAtMjUxLDcgKzI1MSw3IEBACiAKIAkucWNfcHJlcCAJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJPSBhdGFfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJPSBhdGFfZW5nX3RpbWVvdXQsCisKIAkuZGF0YV94ZmVyCT0gYXRhX3Bpb19kYXRhX3hmZXIsCiAKIAkuaXJxX2hhbmRsZXIJPSBhdGFfaW50ZXJydXB0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zaXMuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lzLmMKaW5kZXggMmU1NTUxNjguLjE3NzkxZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2lzLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zaXMuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2F0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJwYXRhX3NpcyIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuNC4zIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC40LjQiCiAKIHN0cnVjdCBzaXNfY2hpcHNldCB7CiAJdTE2IGRldmljZTsJCQkvKiBQQ0kgaG9zdCBJRCAqLwpAQCAtNzQsMTEgKzc0LDkgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3QtPmRldik7CiAJdTE2IHRtcDsKIAotCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJnNpc19lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKSB7Ci0JCWF0YV9wb3J0X2Rpc2FibGUoYXApOwotCQlwcmludGsoS0VSTl9JTkZPICJhdGEldTogcG9ydCBkaXNhYmxlZC4gaWdub3JpbmcuXG4iLCBhcC0+aWQpOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmc2lzX2VuYWJsZV9iaXRzW2FwLT5wb3J0X25vXSkpCisJCXJldHVybiAtRU5PRU5UOworCiAJLyogVGhlIHRvcCBiaXQgb2YgdGhpcyByZWdpc3RlciBpcyB0aGUgY2FibGUgZGV0ZWN0IGJpdCAqLwogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4NTAgKyAyICogYXAtPnBvcnRfbm8sICZ0bXApOwogCWlmICh0bXAgJiAweDgwMDApCkBAIC01NzUsOCArNTczLDYgQEAKIAkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCiAJLmRhdGFfeGZlcgkJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAotCS5lbmdfdGltZW91dAkJPSBhdGFfZW5nX3RpbWVvdXQsCi0KIAkuaXJxX2hhbmRsZXIJCT0gYXRhX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCiAKQEAgLTYxMCw4ICs2MDYsNiBAQAogCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKIAkuZGF0YV94ZmVyCQk9IGF0YV9waW9fZGF0YV94ZmVyLAogCi0JLmVuZ190aW1lb3V0CQk9IGF0YV9lbmdfdGltZW91dCwKLQogCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIApAQCAtNjQ2LDggKzY0MCw2IEBACiAJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAogCS5kYXRhX3hmZXIJCT0gYXRhX3Bpb19kYXRhX3hmZXIsCiAKLQkuZW5nX3RpbWVvdXQJCT0gYXRhX2VuZ190aW1lb3V0LAotCiAJLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLAogCkBAIC02ODEsOCArNjczLDYgQEAKIAkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCiAJLmRhdGFfeGZlcgkJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAotCS5lbmdfdGltZW91dAkJPSBhdGFfZW5nX3RpbWVvdXQsCi0KIAkuaXJxX2hhbmRsZXIJCT0gYXRhX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCiAKQEAgLTcxNiw4ICs3MDYsNiBAQAogCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKIAkuZGF0YV94ZmVyCQk9IGF0YV9waW9fZGF0YV94ZmVyLAogCi0JLmVuZ190aW1lb3V0CQk9IGF0YV9lbmdfdGltZW91dCwKLQogCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9zbDgyYzEwNS5jIGIvZHJpdmVycy9hdGEvcGF0YV9zbDgyYzEwNS5jCmluZGV4IGY4NDk5NzguLjViNzYyYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfc2w4MmMxMDUuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3NsODJjMTA1LmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRSAicGF0YV9zbDgyYzEwNSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMi4yIgorI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjMiCiAKIGVudW0gewogCS8qCkBAIC00OSwxMSArNDksOCBAQAogCX07CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCi0JaWYgKGFwLT5wb3J0X25vICYmICFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmc2w4MmMxMDVfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkgewotCQlhdGFfcG9ydF9kaXNhYmxlKGFwKTsKLQkJZGV2X3ByaW50ayhLRVJOX0lORk8sICZwZGV2LT5kZXYsICJwb3J0IGRpc2FibGVkLiBpZ25vcmluZy5cbiIpOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKGFwLT5wb3J0X25vICYmICFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmc2w4MmMxMDVfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CiAJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwogCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKIH0KQEAgLTI2NCw3ICsyNjEsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfdHJpZmxleC5jIGIvZHJpdmVycy9hdGEvcGF0YV90cmlmbGV4LmMKaW5kZXggMzZmNzg4Ny4uYTk1NGVkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV90cmlmbGV4LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV90cmlmbGV4LmMKQEAgLTQ2LDEzICs0NiwxMyBAQAogI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4yLjUiCiAKIC8qKgotICoJdHJpZmxleF9wcm9iZV9pbml0CQktCXByb2JlIGJlZ2luCisgKgl0cmlmbGV4X3ByZXJlc2V0CQktCXByb2JlIGJlZ2luCiAgKglAYXA6IEFUQSBwb3J0CiAgKgogICoJU2V0IHVwIGNhYmxlIHR5cGUgYW5kIHVzZSBnZW5lcmljIHByb2JlIGluaXQKICAqLwogCi1zdGF0aWMgaW50IHRyaWZsZXhfcHJvYmVfaW5pdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQorc3RhdGljIGludCB0cmlmbGV4X3ByZXJlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfYml0cyB0cmlmbGV4X2VuYWJsZV9iaXRzW10gPSB7CiAJCXsgMHg4MCwgMSwgMHgwMSwgMHgwMSB9LApAQCAtNjEsMTEgKzYxLDggQEAKIAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihhcC0+aG9zdC0+ZGV2KTsKIAotCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJnRyaWZsZXhfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkgewotCQlhdGFfcG9ydF9kaXNhYmxlKGFwKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXU6IHBvcnQgZGlzYWJsZWQuIGlnbm9yaW5nLlxuIiwgYXAtPmlkKTsKLQkJcmV0dXJuIDA7Ci0JfQorCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJnRyaWZsZXhfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CiAJYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwogCXJldHVybiBhdGFfc3RkX3ByZXJlc2V0KGFwKTsKIH0KQEAgLTc0LDcgKzcxLDcgQEAKIAogc3RhdGljIHZvaWQgdHJpZmxleF9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7Ci0JYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCB0cmlmbGV4X3Byb2JlX2luaXQsIGF0YV9zdGRfc29mdHJlc2V0LCBOVUxMLCBhdGFfc3RkX3Bvc3RyZXNldCk7CisJYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCB0cmlmbGV4X3ByZXJlc2V0LCBhdGFfc3RkX3NvZnRyZXNldCwgTlVMTCwgYXRhX3N0ZF9wb3N0cmVzZXQpOwogfQogCiAvKioKQEAgLTIyMSw3ICsyMTgsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfdmlhLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3ZpYS5jCmluZGV4IDFiMmZmMTMuLjdiNWRkMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfdmlhLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV92aWEuYwpAQCAtNjAsNyArNjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJwYXRhX3ZpYSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMS4xMyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjAuMS4xNCIKIAogLyoKICAqCVRoZSBmb2xsb3dpbmcgY29tZXMgZGlyZWN0bHkgZnJvbSBWb2p0ZWNoIFBhdmxpaydzIGlkZS9wY2kvdmlhODJjeHh4CkBAIC0xNTUsMTEgKzE1NSw4IEBACiAKIAkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0LT5kZXYpOwogCi0JCWlmICghcGNpX3Rlc3RfY29uZmlnX2JpdHMocGRldiwgJnZpYV9lbmFibGVfYml0c1thcC0+cG9ydF9ub10pKSB7Ci0JCQlhdGFfcG9ydF9kaXNhYmxlKGFwKTsKLQkJCXByaW50ayhLRVJOX0lORk8gImF0YSV1OiBwb3J0IGRpc2FibGVkLiBpZ25vcmluZy5cbiIsIGFwLT5pZCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQorCQlpZiAoIXBjaV90ZXN0X2NvbmZpZ19iaXRzKHBkZXYsICZ2aWFfZW5hYmxlX2JpdHNbYXAtPnBvcnRfbm9dKSkKKwkJCXJldHVybiAtRU5PRU5UOwogCX0KIAogCWlmICgoY29uZmlnLT5mbGFncyAmIFZJQV9VRE1BKSA+PSBWSUFfVURNQV82NikKQEAgLTMyNSw3ICszMjIsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKQEAgLTM2MCw3ICszNTcsNyBAQAogCiAJLnFjX3ByZXAgCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CT0gYXRhX2VuZ190aW1lb3V0LAorCiAJLmRhdGFfeGZlcgk9IGF0YV9waW9fZGF0YV94ZmVyX25vaXJxLAogCiAJLmlycV9oYW5kbGVyCT0gYXRhX2ludGVycnVwdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfbXYuYyBiL2RyaXZlcnMvYXRhL3NhdGFfbXYuYwppbmRleCBmZGNlNmUwLi5jMDE0OTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX212LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9tdi5jCkBAIC00NjMsNiArNDYzLDcgQEAKIAogCS5xY19wcmVwCQk9IG12X3FjX3ByZXBfaWllLAogCS5xY19pc3N1ZQkJPSBtdl9xY19pc3N1ZSwKKwkuZGF0YV94ZmVyCQk9IGF0YV9tbWlvX2RhdGFfeGZlciwKIAogCS5lbmdfdGltZW91dAkJPSBtdl9lbmdfdGltZW91dCwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2Jhc2UuaCBiL2RyaXZlcnMvYmFzZS9iYXNlLmgKaW5kZXggYzNiOGRjOS4uZDI2NjQ0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2Jhc2UuaAorKysgYi9kcml2ZXJzL2Jhc2UvYmFzZS5oCkBAIC0xNiw3ICsxNiw3IEBACiBleHRlcm4gaW50IGF0dHJpYnV0ZV9jb250YWluZXJfaW5pdCh2b2lkKTsKIAogZXh0ZXJuIGludCBidXNfYWRkX2RldmljZShzdHJ1Y3QgZGV2aWNlICogZGV2KTsKLWV4dGVybiB2b2lkIGJ1c19hdHRhY2hfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKiBkZXYpOworZXh0ZXJuIGludCBidXNfYXR0YWNoX2RldmljZShzdHJ1Y3QgZGV2aWNlICogZGV2KTsKIGV4dGVybiB2b2lkIGJ1c19yZW1vdmVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSAqZ2V0X2J1cyhzdHJ1Y3QgYnVzX3R5cGUgKiBidXMpOwogZXh0ZXJuIHZvaWQgcHV0X2J1cyhzdHJ1Y3QgYnVzX3R5cGUgKiBidXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2J1cy5jIGIvZHJpdmVycy9iYXNlL2J1cy5jCmluZGV4IDJlOTU0ZDAuLjEyMTczZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9idXMuYworKysgYi9kcml2ZXJzL2Jhc2UvYnVzLmMKQEAgLTM3MSwxMiArMzcxLDIwIEBACiAJaWYgKGJ1cykgewogCQlwcl9kZWJ1ZygiYnVzICVzOiBhZGQgZGV2aWNlICVzXG4iLCBidXMtPm5hbWUsIGRldi0+YnVzX2lkKTsKIAkJZXJyb3IgPSBkZXZpY2VfYWRkX2F0dHJzKGJ1cywgZGV2KTsKLQkJaWYgKCFlcnJvcikgewotCQkJc3lzZnNfY3JlYXRlX2xpbmsoJmJ1cy0+ZGV2aWNlcy5rb2JqLCAmZGV2LT5rb2JqLCBkZXYtPmJ1c19pZCk7Ci0JCQlzeXNmc19jcmVhdGVfbGluaygmZGV2LT5rb2JqLCAmZGV2LT5idXMtPnN1YnN5cy5rc2V0LmtvYmosICJzdWJzeXN0ZW0iKTsKLQkJCXN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosICZkZXYtPmJ1cy0+c3Vic3lzLmtzZXQua29iaiwgImJ1cyIpOwotCQl9CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZidXMtPmRldmljZXMua29iaiwKKwkJCQkJCSZkZXYtPmtvYmosIGRldi0+YnVzX2lkKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwKKwkJCQkmZGV2LT5idXMtPnN1YnN5cy5rc2V0LmtvYmosICJzdWJzeXN0ZW0iKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwKKwkJCQkmZGV2LT5idXMtPnN1YnN5cy5rc2V0LmtvYmosICJidXMiKTsKIAl9CitvdXQ6CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0zODQsMTYgKzM5MiwyNCBAQAogICoJYnVzX2F0dGFjaF9kZXZpY2UgLSBhZGQgZGV2aWNlIHRvIGJ1cwogICoJQGRldjoJZGV2aWNlIHRyaWVkIHRvIGF0dGFjaCB0byBhIGRyaXZlcgogICoKKyAqCS0gQWRkIGRldmljZSB0byBidXMncyBsaXN0IG9mIGRldmljZXMuCiAgKgktIFRyeSB0byBhdHRhY2ggdG8gZHJpdmVyLgogICovCi12b2lkIGJ1c19hdHRhY2hfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKiBkZXYpCitpbnQgYnVzX2F0dGFjaF9kZXZpY2Uoc3RydWN0IGRldmljZSAqIGRldikKIHsKLQlzdHJ1Y3QgYnVzX3R5cGUgKiBidXMgPSBkZXYtPmJ1czsKKwlzdHJ1Y3QgYnVzX3R5cGUgKmJ1cyA9IGRldi0+YnVzOworCWludCByZXQgPSAwOwogCiAJaWYgKGJ1cykgewotCQlkZXZpY2VfYXR0YWNoKGRldik7Ci0JCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX2J1cywgJmJ1cy0+a2xpc3RfZGV2aWNlcyk7CisJCWRldi0+aXNfcmVnaXN0ZXJlZCA9IDE7CisJCXJldCA9IGRldmljZV9hdHRhY2goZGV2KTsKKwkJaWYgKHJldCA+PSAwKSB7CisJCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9idXMsICZidXMtPmtsaXN0X2RldmljZXMpOworCQkJcmV0ID0gMDsKKwkJfSBlbHNlCisJCQlkZXYtPmlzX3JlZ2lzdGVyZWQgPSAwOwogCX0KKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTQxMiw3ICs0MjgsOCBAQAogCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiYnVzIik7CiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmJ1cy0+ZGV2aWNlcy5rb2JqLCBkZXYtPmJ1c19pZCk7CiAJCWRldmljZV9yZW1vdmVfYXR0cnMoZGV2LT5idXMsIGRldik7Ci0JCWtsaXN0X3JlbW92ZSgmZGV2LT5rbm9kZV9idXMpOworCQlkZXYtPmlzX3JlZ2lzdGVyZWQgPSAwOworCQlrbGlzdF9kZWwoJmRldi0+a25vZGVfYnVzKTsKIAkJcHJfZGVidWcoImJ1cyAlczogcmVtb3ZlIGRldmljZSAlc1xuIiwgZGV2LT5idXMtPm5hbWUsIGRldi0+YnVzX2lkKTsKIAkJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGRldik7CiAJCXB1dF9idXMoZGV2LT5idXMpOwpAQCAtNDU1LDEwICs0NzIsMTcgQEAKICAqIFRoYW5rcyB0byBkcml2ZXJzIG1ha2luZyB0aGVpciB0YWJsZXMgX19kZXZpbml0LCB3ZSBjYW4ndCBhbGxvdyBtYW51YWwKICAqIGJpbmQgYW5kIHVuYmluZCBmcm9tIHVzZXJzcGFjZSB1bmxlc3MgQ09ORklHX0hPVFBMVUcgaXMgZW5hYmxlZC4KICAqLwotc3RhdGljIHZvaWQgYWRkX2JpbmRfZmlsZXMoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3N0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGFkZF9iaW5kX2ZpbGVzKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCiB7Ci0JZHJpdmVyX2NyZWF0ZV9maWxlKGRydiwgJmRyaXZlcl9hdHRyX3VuYmluZCk7Ci0JZHJpdmVyX2NyZWF0ZV9maWxlKGRydiwgJmRyaXZlcl9hdHRyX2JpbmQpOworCWludCByZXQ7CisKKwlyZXQgPSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJ2LCAmZHJpdmVyX2F0dHJfdW5iaW5kKTsKKwlpZiAocmV0ID09IDApIHsKKwkJcmV0ID0gZHJpdmVyX2NyZWF0ZV9maWxlKGRydiwgJmRyaXZlcl9hdHRyX2JpbmQpOworCQlpZiAocmV0KQorCQkJZHJpdmVyX3JlbW92ZV9maWxlKGRydiwgJmRyaXZlcl9hdHRyX3VuYmluZCk7CisJfQorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHJlbW92ZV9iaW5kX2ZpbGVzKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCkBAIC00NjcsNyArNDkxLDcgQEAKIAlkcml2ZXJfcmVtb3ZlX2ZpbGUoZHJ2LCAmZHJpdmVyX2F0dHJfdW5iaW5kKTsKIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgYWRkX2JpbmRfZmlsZXMoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikge30KK3N0YXRpYyBpbmxpbmUgaW50IGFkZF9iaW5kX2ZpbGVzKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpIHsgcmV0dXJuIDA7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfYmluZF9maWxlcyhzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KSB7fQogI2VuZGlmCiAKQEAgLTQ3Niw3ICs1MDAsNyBAQAogICoJQGRydjoJZHJpdmVyLgogICoKICAqLwotaW50IGJ1c19hZGRfZHJpdmVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZHJ2KQoraW50IGJ1c19hZGRfZHJpdmVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCiB7CiAJc3RydWN0IGJ1c190eXBlICogYnVzID0gZ2V0X2J1cyhkcnYtPmJ1cyk7CiAJaW50IGVycm9yID0gMDsKQEAgLTQ4NCwyNyArNTA4LDM5IEBACiAJaWYgKGJ1cykgewogCQlwcl9kZWJ1ZygiYnVzICVzOiBhZGQgZHJpdmVyICVzXG4iLCBidXMtPm5hbWUsIGRydi0+bmFtZSk7CiAJCWVycm9yID0ga29iamVjdF9zZXRfbmFtZSgmZHJ2LT5rb2JqLCAiJXMiLCBkcnYtPm5hbWUpOwotCQlpZiAoZXJyb3IpIHsKLQkJCXB1dF9idXMoYnVzKTsKLQkJCXJldHVybiBlcnJvcjsKLQkJfQorCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF9wdXRfYnVzOwogCQlkcnYtPmtvYmoua3NldCA9ICZidXMtPmRyaXZlcnM7Ci0JCWlmICgoZXJyb3IgPSBrb2JqZWN0X3JlZ2lzdGVyKCZkcnYtPmtvYmopKSkgewotCQkJcHV0X2J1cyhidXMpOwotCQkJcmV0dXJuIGVycm9yOwotCQl9CisJCWlmICgoZXJyb3IgPSBrb2JqZWN0X3JlZ2lzdGVyKCZkcnYtPmtvYmopKSkKKwkJCWdvdG8gb3V0X3B1dF9idXM7CiAKLQkJZHJpdmVyX2F0dGFjaChkcnYpOworCQllcnJvciA9IGRyaXZlcl9hdHRhY2goZHJ2KTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXRfdW5yZWdpc3RlcjsKIAkJa2xpc3RfYWRkX3RhaWwoJmRydi0+a25vZGVfYnVzLCAmYnVzLT5rbGlzdF9kcml2ZXJzKTsKIAkJbW9kdWxlX2FkZF9kcml2ZXIoZHJ2LT5vd25lciwgZHJ2KTsKIAotCQlkcml2ZXJfYWRkX2F0dHJzKGJ1cywgZHJ2KTsKLQkJYWRkX2JpbmRfZmlsZXMoZHJ2KTsKKwkJZXJyb3IgPSBkcml2ZXJfYWRkX2F0dHJzKGJ1cywgZHJ2KTsKKwkJaWYgKGVycm9yKSB7CisJCQkvKiBIb3cgdGhlIGhlbGwgZG8gd2UgZ2V0IG91dCBvZiB0aGlzIHBpY2tsZT8gR2l2ZSB1cCAqLworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogZHJpdmVyX2FkZF9hdHRycyglcykgZmFpbGVkXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgZHJ2LT5uYW1lKTsKKwkJfQorCQllcnJvciA9IGFkZF9iaW5kX2ZpbGVzKGRydik7CisJCWlmIChlcnJvcikgeworCQkJLyogRGl0dG8gKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGFkZF9iaW5kX2ZpbGVzKCVzKSBmYWlsZWRcbiIsCisJCQkJX19GVU5DVElPTl9fLCBkcnYtPm5hbWUpOworCQl9CiAJfQogCXJldHVybiBlcnJvcjsKK291dF91bnJlZ2lzdGVyOgorCWtvYmplY3RfdW5yZWdpc3RlcigmZHJ2LT5rb2JqKTsKK291dF9wdXRfYnVzOgorCXB1dF9idXMoYnVzKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKLQogLyoqCiAgKglidXNfcmVtb3ZlX2RyaXZlciAtIGRlbGV0ZSBkcml2ZXIgZnJvbSBidXMncyBrbm93bGVkZ2UuCiAgKglAZHJ2Oglkcml2ZXIuCkBAIC01MzAsMTYgKzU2NiwyMSBAQAogCiAKIC8qIEhlbHBlciBmb3IgYnVzX3Jlc2Nhbl9kZXZpY2VzJ3MgaXRlciAqLwotc3RhdGljIGludCBidXNfcmVzY2FuX2RldmljZXNfaGVscGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGJ1c19yZXNjYW5fZGV2aWNlc19oZWxwZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkJdm9pZCAqZGF0YSkKIHsKKwlpbnQgcmV0ID0gMDsKKwogCWlmICghZGV2LT5kcml2ZXIpIHsKIAkJaWYgKGRldi0+cGFyZW50KQkvKiBOZWVkZWQgZm9yIFVTQiAqLwogCQkJZG93bigmZGV2LT5wYXJlbnQtPnNlbSk7Ci0JCWRldmljZV9hdHRhY2goZGV2KTsKKwkJcmV0ID0gZGV2aWNlX2F0dGFjaChkZXYpOwogCQlpZiAoZGV2LT5wYXJlbnQpCiAJCQl1cCgmZGV2LT5wYXJlbnQtPnNlbSk7CisJCWlmIChyZXQgPiAwKQorCQkJcmV0ID0gMDsKIAl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJldCA8IDAgPyByZXQgOiAwOwogfQogCiAvKioKQEAgLTU1MCw5ICs1OTEsOSBAQAogICogYXR0YWNoZWQgYW5kIHJlc2NhbiBpdCBhZ2FpbnN0IGV4aXN0aW5nIGRyaXZlcnMgdG8gc2VlIGlmIGl0IG1hdGNoZXMKICAqIGFueSBieSBjYWxsaW5nIGRldmljZV9hdHRhY2goKSBmb3IgdGhlIHVuYm91bmQgZGV2aWNlcy4KICAqLwotdm9pZCBidXNfcmVzY2FuX2RldmljZXMoc3RydWN0IGJ1c190eXBlICogYnVzKQoraW50IGJ1c19yZXNjYW5fZGV2aWNlcyhzdHJ1Y3QgYnVzX3R5cGUgKiBidXMpCiB7Ci0JYnVzX2Zvcl9lYWNoX2RldihidXMsIE5VTEwsIE5VTEwsIGJ1c19yZXNjYW5fZGV2aWNlc19oZWxwZXIpOworCXJldHVybiBidXNfZm9yX2VhY2hfZGV2KGJ1cywgTlVMTCwgTlVMTCwgYnVzX3Jlc2Nhbl9kZXZpY2VzX2hlbHBlcik7CiB9CiAKIC8qKgpAQCAtNTY0LDcgKzYwNSw3IEBACiAgKiB0byB1c2UgaWYgcHJvYmluZyBjcml0ZXJpYSBjaGFuZ2VkIGR1cmluZyBhIGRldmljZXMgbGlmZXRpbWUgYW5kCiAgKiBkcml2ZXIgYXR0YWNobWVudCBzaG91bGQgY2hhbmdlIGFjY29yZGluZ2x5LgogICovCi12b2lkIGRldmljZV9yZXByb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK2ludCBkZXZpY2VfcmVwcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaWYgKGRldi0+ZHJpdmVyKSB7CiAJCWlmIChkZXYtPnBhcmVudCkgICAgICAgIC8qIE5lZWRlZCBmb3IgVVNCICovCkBAIC01NzMsMTQgKzYxNCwxNCBAQAogCQlpZiAoZGV2LT5wYXJlbnQpCiAJCQl1cCgmZGV2LT5wYXJlbnQtPnNlbSk7CiAJfQotCi0JYnVzX3Jlc2Nhbl9kZXZpY2VzX2hlbHBlcihkZXYsIE5VTEwpOworCXJldHVybiBidXNfcmVzY2FuX2RldmljZXNfaGVscGVyKGRldiwgTlVMTCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfcmVwcm9iZSk7CiAKLXN0cnVjdCBidXNfdHlwZSAqIGdldF9idXMoc3RydWN0IGJ1c190eXBlICogYnVzKQorc3RydWN0IGJ1c190eXBlICpnZXRfYnVzKHN0cnVjdCBidXNfdHlwZSAqYnVzKQogewotCXJldHVybiBidXMgPyBjb250YWluZXJfb2Yoc3Vic3lzX2dldCgmYnVzLT5zdWJzeXMpLCBzdHJ1Y3QgYnVzX3R5cGUsIHN1YnN5cykgOiBOVUxMOworCXJldHVybiBidXMgPyBjb250YWluZXJfb2Yoc3Vic3lzX2dldCgmYnVzLT5zdWJzeXMpLAorCQkJCXN0cnVjdCBidXNfdHlwZSwgc3Vic3lzKSA6IE5VTEw7CiB9CiAKIHZvaWQgcHV0X2J1cyhzdHJ1Y3QgYnVzX3R5cGUgKiBidXMpCkBAIC02NTUsMjIgKzY5Niw2IEBACiAJcHV0X2RldmljZShkZXYpOwogfQogCi1zdGF0aWMgdm9pZCBrbGlzdF9kcml2ZXJzX2dldChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKLXsKLQlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2ID0gY29udGFpbmVyX29mKG4sIHN0cnVjdCBkZXZpY2VfZHJpdmVyLAotCQkJCQkJIGtub2RlX2J1cyk7Ci0KLQlnZXRfZHJpdmVyKGRydik7Ci19Ci0KLXN0YXRpYyB2b2lkIGtsaXN0X2RyaXZlcnNfcHV0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQotewotCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZV9kcml2ZXIsCi0JCQkJCQkga25vZGVfYnVzKTsKLQotCXB1dF9kcml2ZXIoZHJ2KTsKLX0KLQogLyoqCiAgKglidXNfcmVnaXN0ZXIgLSByZWdpc3RlciBhIGJ1cyB3aXRoIHRoZSBzeXN0ZW0uCiAgKglAYnVzOglidXMuCkBAIC03MDYsNyArNzMxLDcgQEAKIAkJZ290byBidXNfZHJpdmVyc19mYWlsOwogCiAJa2xpc3RfaW5pdCgmYnVzLT5rbGlzdF9kZXZpY2VzLCBrbGlzdF9kZXZpY2VzX2dldCwga2xpc3RfZGV2aWNlc19wdXQpOwotCWtsaXN0X2luaXQoJmJ1cy0+a2xpc3RfZHJpdmVycywga2xpc3RfZHJpdmVyc19nZXQsIGtsaXN0X2RyaXZlcnNfcHV0KTsKKwlrbGlzdF9pbml0KCZidXMtPmtsaXN0X2RyaXZlcnMsIE5VTEwsIE5VTEwpOwogCWJ1c19hZGRfYXR0cnMoYnVzKTsKIAogCXByX2RlYnVnKCJidXMgdHlwZSAnJXMnIHJlZ2lzdGVyZWRcbiIsIGJ1cy0+bmFtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9jbGFzcy5jCmluZGV4IGRlODkwODMuLmIwNmIwZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9jbGFzcy5jCkBAIC0xOSw2ICsxOSw4IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgImJhc2UuaCIKIAorZXh0ZXJuIHN0cnVjdCBzdWJzeXN0ZW0gZGV2aWNlc19zdWJzeXM7CisKICNkZWZpbmUgdG9fY2xhc3NfYXR0cihfYXR0cikgY29udGFpbmVyX29mKF9hdHRyLCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlLCBhdHRyKQogI2RlZmluZSB0b19jbGFzcyhvYmopIGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBjbGFzcywgc3Vic3lzLmtzZXQua29iaikKIApAQCAtMTk3LDcgKzE5OSw3IEBACiAgKiBOb3RlLCB0aGUgcG9pbnRlciBjcmVhdGVkIGhlcmUgaXMgdG8gYmUgZGVzdHJveWVkIHdoZW4gZmluaXNoZWQgYnkKICAqIG1ha2luZyBhIGNhbGwgdG8gY2xhc3NfZGVzdHJveSgpLgogICovCi1zdHJ1Y3QgY2xhc3MgKmNsYXNzX2NyZWF0ZShzdHJ1Y3QgbW9kdWxlICpvd25lciwgY2hhciAqbmFtZSkKK3N0cnVjdCBjbGFzcyAqY2xhc3NfY3JlYXRlKHN0cnVjdCBtb2R1bGUgKm93bmVyLCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBjbGFzcyAqY2xzOwogCWludCByZXR2YWw7CkBAIC0zNjEsNyArMzYzLDcgQEAKIAlwcl9kZWJ1ZygiJXMgLSBuYW1lID0gJXNcbiIsIF9fRlVOQ1RJT05fXywgY2xhc3NfZGV2LT5jbGFzc19pZCk7CiAKIAlpZiAoY2xhc3NfZGV2LT5kZXYpIHsKLQkJLyogYWRkIHBoeXNpY2FsIGRldmljZSwgYmFja2luZyB0aGlzIGRldmljZSAgKi8KKwkJLyogYWRkIGRldmljZSwgYmFja2luZyB0aGlzIGNsYXNzIGRldmljZSAoZGVwcmVjYXRlZCkgKi8KIAkJc3RydWN0IGRldmljZSAqZGV2ID0gY2xhc3NfZGV2LT5kZXY7CiAJCWNoYXIgKnBhdGggPSBrb2JqZWN0X2dldF9wYXRoKCZkZXYtPmtvYmosIEdGUF9LRVJORUwpOwogCkBAIC02NzksNyArNjgxLDggQEAKIHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZV9jcmVhdGUoc3RydWN0IGNsYXNzICpjbHMsCiAJCQkJCSBzdHJ1Y3QgY2xhc3NfZGV2aWNlICpwYXJlbnQsCiAJCQkJCSBkZXZfdCBkZXZ0LAotCQkJCQkgc3RydWN0IGRldmljZSAqZGV2aWNlLCBjaGFyICpmbXQsIC4uLikKKwkJCQkJIHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCQkJIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogewogCXZhX2xpc3QgYXJnczsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYgPSBOVUxMOwpAQCAtODM5LDYgKzg0Miw3IEBACiB7CiAJc3RydWN0IGNsYXNzICpwYXJlbnQ7CiAJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldjsKIAogCWlmICghY2xhc3NfaW50ZiB8fCAhY2xhc3NfaW50Zi0+Y2xhc3MpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtODUzLDYgKzg1NywxMCBAQAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsYXNzX2RldiwgJnBhcmVudC0+Y2hpbGRyZW4sIG5vZGUpCiAJCQljbGFzc19pbnRmLT5hZGQoY2xhc3NfZGV2LCBjbGFzc19pbnRmKTsKIAl9CisJaWYgKGNsYXNzX2ludGYtPmFkZF9kZXYpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZwYXJlbnQtPmRldmljZXMsIG5vZGUpCisJCQljbGFzc19pbnRmLT5hZGRfZGV2KGRldiwgY2xhc3NfaW50Zik7CisJfQogCXVwKCZwYXJlbnQtPnNlbSk7CiAKIAlyZXR1cm4gMDsKQEAgLTg2Miw2ICs4NzAsNyBAQAogewogCXN0cnVjdCBjbGFzcyAqIHBhcmVudCA9IGNsYXNzX2ludGYtPmNsYXNzOwogCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKIAlpZiAoIXBhcmVudCkKIAkJcmV0dXJuOwpAQCAtODcyLDEyICs4ODEsMzEgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGFzc19kZXYsICZwYXJlbnQtPmNoaWxkcmVuLCBub2RlKQogCQkJY2xhc3NfaW50Zi0+cmVtb3ZlKGNsYXNzX2RldiwgY2xhc3NfaW50Zik7CiAJfQorCWlmIChjbGFzc19pbnRmLT5yZW1vdmVfZGV2KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmcGFyZW50LT5kZXZpY2VzLCBub2RlKQorCQkJY2xhc3NfaW50Zi0+cmVtb3ZlX2RldihkZXYsIGNsYXNzX2ludGYpOworCX0KIAl1cCgmcGFyZW50LT5zZW0pOwogCiAJY2xhc3NfcHV0KHBhcmVudCk7CiB9CiAKK2ludCB2aXJ0dWFsX2RldmljZV9wYXJlbnQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmICghZGV2LT5jbGFzcykKKwkJcmV0dXJuIC1FTk9ERVY7CiAKKwlpZiAoIWRldi0+Y2xhc3MtPnZpcnR1YWxfZGlyKSB7CisJCXN0YXRpYyBzdHJ1Y3Qga29iamVjdCAqdmlydHVhbF9kaXIgPSBOVUxMOworCisJCWlmICghdmlydHVhbF9kaXIpCisJCQl2aXJ0dWFsX2RpciA9IGtvYmplY3RfYWRkX2RpcigmZGV2aWNlc19zdWJzeXMua3NldC5rb2JqLCAidmlydHVhbCIpOworCQlkZXYtPmNsYXNzLT52aXJ0dWFsX2RpciA9IGtvYmplY3RfYWRkX2Rpcih2aXJ0dWFsX2RpciwgZGV2LT5jbGFzcy0+bmFtZSk7CisJfQorCisJZGV2LT5rb2JqLnBhcmVudCA9IGRldi0+Y2xhc3MtPnZpcnR1YWxfZGlyOworCXJldHVybiAwOworfQogCiBpbnQgX19pbml0IGNsYXNzZXNfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2NvcmUuYyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKaW5kZXggYmU2YjViYy4uYjIyNGJiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NvcmUuYworKysgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCkBAIC0zLDYgKzMsOCBAQAogICoKICAqIENvcHlyaWdodCAoYykgMjAwMi0zIFBhdHJpY2sgTW9jaGVsCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMyBPcGVuIFNvdXJjZSBEZXZlbG9wbWVudCBMYWJzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KKyAqIENvcHlyaWdodCAoYykgMjAwNiBOb3ZlbGwsIEluYy4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCiAgKgpAQCAtOTIsNiArOTQsOCBAQAogCiAJaWYgKGRldi0+cmVsZWFzZSkKIAkJZGV2LT5yZWxlYXNlKGRldik7CisJZWxzZSBpZiAoZGV2LT5jbGFzcyAmJiBkZXYtPmNsYXNzLT5kZXZfcmVsZWFzZSkKKwkJZGV2LT5jbGFzcy0+ZGV2X3JlbGVhc2UoZGV2KTsKIAllbHNlIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJEZXZpY2UgJyVzJyBkb2VzIG5vdCBoYXZlIGEgcmVsZWFzZSgpIGZ1bmN0aW9uLCAiCiAJCQkiaXQgaXMgYnJva2VuIGFuZCBtdXN0IGJlIGZpeGVkLlxuIiwKQEAgLTE0OSwxNyArMTUzLDIxIEBACiAJCQkgICAgICAgIk1JTk9SPSV1IiwgTUlOT1IoZGV2LT5kZXZ0KSk7CiAJfQogCi0JLyogYWRkIGJ1cyBuYW1lIG9mIHBoeXNpY2FsIGRldmljZSAqLworCS8qIGFkZCBidXMgbmFtZSAoc2FtZSBhcyBTVUJTWVNURU0sIGRlcHJlY2F0ZWQpICovCiAJaWYgKGRldi0+YnVzKQogCQlhZGRfdWV2ZW50X3ZhcihlbnZwLCBudW1fZW52cCwgJmksCiAJCQkgICAgICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKIAkJCSAgICAgICAiUEhZU0RFVkJVUz0lcyIsIGRldi0+YnVzLT5uYW1lKTsKIAotCS8qIGFkZCBkcml2ZXIgbmFtZSBvZiBwaHlzaWNhbCBkZXZpY2UgKi8KLQlpZiAoZGV2LT5kcml2ZXIpCisJLyogYWRkIGRyaXZlciBuYW1lIChQSFlTREVWKiB2YWx1ZXMgYXJlIGRlcHJlY2F0ZWQpKi8KKwlpZiAoZGV2LT5kcml2ZXIpIHsKKwkJYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAorCQkJICAgICAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCisJCQkgICAgICAgIkRSSVZFUj0lcyIsIGRldi0+ZHJpdmVyLT5uYW1lKTsKIAkJYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAogCQkJICAgICAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCiAJCQkgICAgICAgIlBIWVNERVZEUklWRVI9JXMiLCBkZXYtPmRyaXZlci0+bmFtZSk7CisJfQogCiAJLyogdGVybWluYXRlLCBzZXQgdG8gbmV4dCBmcmVlIHNsb3QsIHNocmluayBhdmFpbGFibGUgc3BhY2UgKi8KIAllbnZwW2ldID0gTlVMTDsKQEAgLTE3Nyw2ICsxODUsMTUgQEAKIAkJfQogCX0KIAorCWlmIChkZXYtPmNsYXNzICYmIGRldi0+Y2xhc3MtPmRldl91ZXZlbnQpIHsKKwkJLyogaGF2ZSB0aGUgY2xhc3Mgc3BlY2lmaWMgZnVuY3Rpb24gYWRkIGl0cyBzdHVmZiAqLworCQlyZXR2YWwgPSBkZXYtPmNsYXNzLT5kZXZfdWV2ZW50KGRldiwgZW52cCwgbnVtX2VudnAsIGJ1ZmZlciwgYnVmZmVyX3NpemUpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXByX2RlYnVnKCIlcyAtIGRldl91ZXZlbnQoKSByZXR1cm5lZCAlZFxuIiwKKwkJCQkJIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwkJfQorCX0KKwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTE5Myw2ICsyMTAsNzIgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBpbnQgZGV2aWNlX2FkZF9ncm91cHMoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCBpOworCWludCBlcnJvciA9IDA7CisKKwlpZiAoZGV2LT5ncm91cHMpIHsKKwkJZm9yIChpID0gMDsgZGV2LT5ncm91cHNbaV07IGkrKykgeworCQkJZXJyb3IgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgZGV2LT5ncm91cHNbaV0pOworCQkJaWYgKGVycm9yKSB7CisJCQkJd2hpbGUgKC0taSA+PSAwKQorCQkJCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgZGV2LT5ncm91cHNbaV0pOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgZGV2aWNlX3JlbW92ZV9ncm91cHMoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCBpOworCWlmIChkZXYtPmdyb3VwcykgeworCQlmb3IgKGkgPSAwOyBkZXYtPmdyb3Vwc1tpXTsgaSsrKSB7CisJCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgZGV2LT5ncm91cHNbaV0pOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGRldmljZV9hZGRfYXR0cnMoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBjbGFzcyAqY2xhc3MgPSBkZXYtPmNsYXNzOworCWludCBlcnJvciA9IDA7CisJaW50IGk7CisKKwlpZiAoIWNsYXNzKQorCQlyZXR1cm4gMDsKKworCWlmIChjbGFzcy0+ZGV2X2F0dHJzKSB7CisJCWZvciAoaSA9IDA7IGF0dHJfbmFtZShjbGFzcy0+ZGV2X2F0dHJzW2ldKTsgaSsrKSB7CisJCQllcnJvciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZjbGFzcy0+ZGV2X2F0dHJzW2ldKTsKKwkJCWlmIChlcnJvcikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoZXJyb3IpCisJCXdoaWxlICgtLWkgPj0gMCkKKwkJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZjbGFzcy0+ZGV2X2F0dHJzW2ldKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIGRldmljZV9yZW1vdmVfYXR0cnMoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBjbGFzcyAqY2xhc3MgPSBkZXYtPmNsYXNzOworCWludCBpOworCisJaWYgKCFjbGFzcykKKwkJcmV0dXJuOworCisJaWYgKGNsYXNzLT5kZXZfYXR0cnMpIHsKKwkJZm9yIChpID0gMDsgYXR0cl9uYW1lKGNsYXNzLT5kZXZfYXR0cnNbaV0pOyBpKyspCisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmY2xhc3MtPmRldl9hdHRyc1tpXSk7CisJfQorfQorCisKIHN0YXRpYyBzc2l6ZV90IHNob3dfZGV2KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQljaGFyICpidWYpCiB7CkBAIC0yMzYsNiArMzE5LDMyIEBACiAJfQogfQogCisvKioKKyAqIGRldmljZV9jcmVhdGVfYmluX2ZpbGUgLSBjcmVhdGUgc3lzZnMgYmluYXJ5IGF0dHJpYnV0ZSBmaWxlIGZvciBkZXZpY2UuCisgKiBAZGV2OiBkZXZpY2UuCisgKiBAYXR0cjogZGV2aWNlIGJpbmFyeSBhdHRyaWJ1dGUgZGVzY3JpcHRvci4KKyAqLworaW50IGRldmljZV9jcmVhdGVfYmluX2ZpbGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0cikKK3sKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCWlmIChkZXYpCisJCWVycm9yID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZkZXYtPmtvYmosIGF0dHIpOworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9jcmVhdGVfYmluX2ZpbGUpOworCisvKioKKyAqIGRldmljZV9yZW1vdmVfYmluX2ZpbGUgLSByZW1vdmUgc3lzZnMgYmluYXJ5IGF0dHJpYnV0ZSBmaWxlCisgKiBAZGV2OiBkZXZpY2UuCisgKiBAYXR0cjogZGV2aWNlIGJpbmFyeSBhdHRyaWJ1dGUgZGVzY3JpcHRvci4KKyAqLwordm9pZCBkZXZpY2VfcmVtb3ZlX2Jpbl9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmF0dHIpCit7CisJaWYgKGRldikKKwkJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZkZXYtPmtvYmosIGF0dHIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX3JlbW92ZV9iaW5fZmlsZSk7CisKIHN0YXRpYyB2b2lkIGtsaXN0X2NoaWxkcmVuX2dldChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfcGFyZW50KTsKQEAgLTI4OSwxMiArMzk4LDIwIEBACiB7CiAJc3RydWN0IGRldmljZSAqcGFyZW50ID0gTlVMTDsKIAljaGFyICpjbGFzc19uYW1lID0gTlVMTDsKKwlzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICpjbGFzc19pbnRmOwogCWludCBlcnJvciA9IC1FSU5WQUw7CiAKIAlkZXYgPSBnZXRfZGV2aWNlKGRldik7CiAJaWYgKCFkZXYgfHwgIXN0cmxlbihkZXYtPmJ1c19pZCkpCiAJCWdvdG8gRXJyb3I7CiAKKwkvKiBpZiB0aGlzIGlzIGEgY2xhc3MgZGV2aWNlLCBhbmQgaGFzIG5vIHBhcmVudCwgY3JlYXRlIG9uZSAqLworCWlmICgoZGV2LT5jbGFzcykgJiYgKGRldi0+cGFyZW50ID09IE5VTEwpKSB7CisJCWVycm9yID0gdmlydHVhbF9kZXZpY2VfcGFyZW50KGRldik7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gRXJyb3I7CisJfQorCiAJcGFyZW50ID0gZ2V0X2RldmljZShkZXYtPnBhcmVudCk7CiAKIAlwcl9kZWJ1ZygiREVWOiByZWdpc3RlcmluZyBkZXZpY2U6IElEID0gJyVzJ1xuIiwgZGV2LT5idXNfaWQpOwpAQCAtMzA3LDYgKzQyNCwxMCBAQAogCWlmICgoZXJyb3IgPSBrb2JqZWN0X2FkZCgmZGV2LT5rb2JqKSkpCiAJCWdvdG8gRXJyb3I7CiAKKwkvKiBub3RpZnkgcGxhdGZvcm0gb2YgZGV2aWNlIGVudHJ5ICovCisJaWYgKHBsYXRmb3JtX25vdGlmeSkKKwkJcGxhdGZvcm1fbm90aWZ5KGRldik7CisKIAlkZXYtPnVldmVudF9hdHRyLmF0dHIubmFtZSA9ICJ1ZXZlbnQiOwogCWRldi0+dWV2ZW50X2F0dHIuYXR0ci5tb2RlID0gU19JV1VTUjsKIAlpZiAoZGV2LT5kcml2ZXIpCkBAIC0zNDAsMTIgKzQ2MSwxNyBAQAogCQkJCSAgInN1YnN5c3RlbSIpOwogCQlzeXNmc19jcmVhdGVfbGluaygmZGV2LT5jbGFzcy0+c3Vic3lzLmtzZXQua29iaiwgJmRldi0+a29iaiwKIAkJCQkgIGRldi0+YnVzX2lkKTsKLQotCQlzeXNmc19jcmVhdGVfbGluaygmZGV2LT5rb2JqLCAmZGV2LT5wYXJlbnQtPmtvYmosICJkZXZpY2UiKTsKLQkJY2xhc3NfbmFtZSA9IG1ha2VfY2xhc3NfbmFtZShkZXYtPmNsYXNzLT5uYW1lLCAmZGV2LT5rb2JqKTsKLQkJc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+cGFyZW50LT5rb2JqLCAmZGV2LT5rb2JqLCBjbGFzc19uYW1lKTsKKwkJaWYgKHBhcmVudCkgeworCQkJc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwgJmRldi0+cGFyZW50LT5rb2JqLCAiZGV2aWNlIik7CisJCQljbGFzc19uYW1lID0gbWFrZV9jbGFzc19uYW1lKGRldi0+Y2xhc3MtPm5hbWUsICZkZXYtPmtvYmopOworCQkJc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+cGFyZW50LT5rb2JqLCAmZGV2LT5rb2JqLCBjbGFzc19uYW1lKTsKKwkJfQogCX0KIAorCWlmICgoZXJyb3IgPSBkZXZpY2VfYWRkX2F0dHJzKGRldikpKQorCQlnb3RvIEF0dHJzRXJyb3I7CisJaWYgKChlcnJvciA9IGRldmljZV9hZGRfZ3JvdXBzKGRldikpKQorCQlnb3RvIEdyb3VwRXJyb3I7CiAJaWYgKChlcnJvciA9IGRldmljZV9wbV9hZGQoZGV2KSkpCiAJCWdvdG8gUE1FcnJvcjsKIAlpZiAoKGVycm9yID0gYnVzX2FkZF9kZXZpY2UoZGV2KSkpCkBAIC0zNTYsMTUgKzQ4MiwxNiBAQAogCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9wYXJlbnQsICZwYXJlbnQtPmtsaXN0X2NoaWxkcmVuKTsKIAogCWlmIChkZXYtPmNsYXNzKSB7Ci0JCS8qIHRpZSB0aGUgY2xhc3MgdG8gdGhlIGRldmljZSAqLwogCQlkb3duKCZkZXYtPmNsYXNzLT5zZW0pOworCQkvKiB0aWUgdGhlIGNsYXNzIHRvIHRoZSBkZXZpY2UgKi8KIAkJbGlzdF9hZGRfdGFpbCgmZGV2LT5ub2RlLCAmZGV2LT5jbGFzcy0+ZGV2aWNlcyk7CisKKwkJLyogbm90aWZ5IGFueSBpbnRlcmZhY2VzIHRoYXQgdGhlIGRldmljZSBpcyBoZXJlICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xhc3NfaW50ZiwgJmRldi0+Y2xhc3MtPmludGVyZmFjZXMsIG5vZGUpCisJCQlpZiAoY2xhc3NfaW50Zi0+YWRkX2RldikKKwkJCQljbGFzc19pbnRmLT5hZGRfZGV2KGRldiwgY2xhc3NfaW50Zik7CiAJCXVwKCZkZXYtPmNsYXNzLT5zZW0pOwogCX0KLQotCS8qIG5vdGlmeSBwbGF0Zm9ybSBvZiBkZXZpY2UgZW50cnkgKi8KLQlpZiAocGxhdGZvcm1fbm90aWZ5KQotCQlwbGF0Zm9ybV9ub3RpZnkoZGV2KTsKICBEb25lOgogIAlrZnJlZShjbGFzc19uYW1lKTsKIAlwdXRfZGV2aWNlKGRldik7CkBAIC0zNzIsNiArNDk5LDEwIEBACiAgQnVzRXJyb3I6CiAJZGV2aWNlX3BtX3JlbW92ZShkZXYpOwogIFBNRXJyb3I6CisJZGV2aWNlX3JlbW92ZV9ncm91cHMoZGV2KTsKKyBHcm91cEVycm9yOgorIAlkZXZpY2VfcmVtb3ZlX2F0dHJzKGRldik7CisgQXR0cnNFcnJvcjoKIAlpZiAoZGV2LT5kZXZ0X2F0dHIpIHsKIAkJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgZGV2LT5kZXZ0X2F0dHIpOwogCQlrZnJlZShkZXYtPmRldnRfYXR0cik7CkBAIC00NDksNiArNTgwLDcgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlICogcGFyZW50ID0gZGV2LT5wYXJlbnQ7CiAJY2hhciAqY2xhc3NfbmFtZSA9IE5VTEw7CisJc3RydWN0IGNsYXNzX2ludGVyZmFjZSAqY2xhc3NfaW50ZjsKIAogCWlmIChwYXJlbnQpCiAJCWtsaXN0X2RlbCgmZGV2LT5rbm9kZV9wYXJlbnQpOwpAQCAtNDU4LDE0ICs1OTAsMjMgQEAKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+a29iaiwgInN1YnN5c3RlbSIpOwogCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5jbGFzcy0+c3Vic3lzLmtzZXQua29iaiwgZGV2LT5idXNfaWQpOwogCQljbGFzc19uYW1lID0gbWFrZV9jbGFzc19uYW1lKGRldi0+Y2xhc3MtPm5hbWUsICZkZXYtPmtvYmopOwotCQlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAiZGV2aWNlIik7Ci0JCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPnBhcmVudC0+a29iaiwgY2xhc3NfbmFtZSk7CisJCWlmIChwYXJlbnQpIHsKKwkJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJkZXZpY2UiKTsKKwkJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPnBhcmVudC0+a29iaiwgY2xhc3NfbmFtZSk7CisJCX0KIAkJa2ZyZWUoY2xhc3NfbmFtZSk7CiAJCWRvd24oJmRldi0+Y2xhc3MtPnNlbSk7CisJCS8qIG5vdGlmeSBhbnkgaW50ZXJmYWNlcyB0aGF0IHRoZSBkZXZpY2UgaXMgbm93IGdvbmUgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjbGFzc19pbnRmLCAmZGV2LT5jbGFzcy0+aW50ZXJmYWNlcywgbm9kZSkKKwkJCWlmIChjbGFzc19pbnRmLT5yZW1vdmVfZGV2KQorCQkJCWNsYXNzX2ludGYtPnJlbW92ZV9kZXYoZGV2LCBjbGFzc19pbnRmKTsKKwkJLyogcmVtb3ZlIHRoZSBkZXZpY2UgZnJvbSB0aGUgY2xhc3MgbGlzdCAqLwogCQlsaXN0X2RlbF9pbml0KCZkZXYtPm5vZGUpOwogCQl1cCgmZGV2LT5jbGFzcy0+c2VtKTsKIAl9CiAJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldi0+dWV2ZW50X2F0dHIpOworCWRldmljZV9yZW1vdmVfZ3JvdXBzKGRldik7CisJZGV2aWNlX3JlbW92ZV9hdHRycyhkZXYpOwogCiAJLyogTm90aWZ5IHRoZSBwbGF0Zm9ybSBvZiB0aGUgcmVtb3ZhbCwgaW4gY2FzZSB0aGV5CiAJICogbmVlZCB0byBkbyBhbnl0aGluZy4uLgpAQCAtNTc5LDcgKzcyMCw3IEBACiAgKiBiZWVuIGNyZWF0ZWQgd2l0aCBhIGNhbGwgdG8gY2xhc3NfY3JlYXRlKCkuCiAgKi8KIHN0cnVjdCBkZXZpY2UgKmRldmljZV9jcmVhdGUoc3RydWN0IGNsYXNzICpjbGFzcywgc3RydWN0IGRldmljZSAqcGFyZW50LAotCQkJICAgICBkZXZfdCBkZXZ0LCBjaGFyICpmbXQsIC4uLikKKwkJCSAgICAgZGV2X3QgZGV2dCwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiAJdmFfbGlzdCBhcmdzOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IE5VTEw7CkBAIC01ODcsMTAgKzcyOCw2IEBACiAKIAlpZiAoY2xhc3MgPT0gTlVMTCB8fCBJU19FUlIoY2xhc3MpKQogCQlnb3RvIGVycm9yOwotCWlmIChwYXJlbnQgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlcyBkb2VzIG5vdCB3b3JrIHlldCBmb3IgTlVMTCBwYXJlbnRzXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlnb3RvIGVycm9yOwotCX0KIAogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldikgewpAQCAtNjQ0LDMgKzc4MSw1OCBAQAogCQlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX2Rlc3Ryb3kpOworCisvKioKKyAqIGRldmljZV9yZW5hbWUgLSByZW5hbWVzIGEgZGV2aWNlCisgKiBAZGV2OiB0aGUgcG9pbnRlciB0byB0aGUgc3RydWN0IGRldmljZSB0byBiZSByZW5hbWVkCisgKiBAbmV3X25hbWU6IHRoZSBuZXcgbmFtZSBvZiB0aGUgZGV2aWNlCisgKi8KK2ludCBkZXZpY2VfcmVuYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqbmV3X25hbWUpCit7CisJY2hhciAqb2xkX2NsYXNzX25hbWUgPSBOVUxMOworCWNoYXIgKm5ld19jbGFzc19uYW1lID0gTlVMTDsKKwljaGFyICpvbGRfc3ltbGlua19uYW1lID0gTlVMTDsKKwlpbnQgZXJyb3I7CisKKwlkZXYgPSBnZXRfZGV2aWNlKGRldik7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJfZGVidWcoIkRFVklDRTogcmVuYW1pbmcgJyVzJyB0byAnJXMnXG4iLCBkZXYtPmJ1c19pZCwgbmV3X25hbWUpOworCisJaWYgKChkZXYtPmNsYXNzKSAmJiAoZGV2LT5wYXJlbnQpKQorCQlvbGRfY2xhc3NfbmFtZSA9IG1ha2VfY2xhc3NfbmFtZShkZXYtPmNsYXNzLT5uYW1lLCAmZGV2LT5rb2JqKTsKKworCWlmIChkZXYtPmNsYXNzKSB7CisJCW9sZF9zeW1saW5rX25hbWUgPSBrbWFsbG9jKEJVU19JRF9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFvbGRfc3ltbGlua19uYW1lKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXN0cmxjcHkob2xkX3N5bWxpbmtfbmFtZSwgZGV2LT5idXNfaWQsIEJVU19JRF9TSVpFKTsKKwl9CisKKwlzdHJsY3B5KGRldi0+YnVzX2lkLCBuZXdfbmFtZSwgQlVTX0lEX1NJWkUpOworCisJZXJyb3IgPSBrb2JqZWN0X3JlbmFtZSgmZGV2LT5rb2JqLCBuZXdfbmFtZSk7CisKKwlpZiAob2xkX2NsYXNzX25hbWUpIHsKKwkJbmV3X2NsYXNzX25hbWUgPSBtYWtlX2NsYXNzX25hbWUoZGV2LT5jbGFzcy0+bmFtZSwgJmRldi0+a29iaik7CisJCWlmIChuZXdfY2xhc3NfbmFtZSkgeworCQkJc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+cGFyZW50LT5rb2JqLCAmZGV2LT5rb2JqLAorCQkJCQkgIG5ld19jbGFzc19uYW1lKTsKKwkJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPnBhcmVudC0+a29iaiwgb2xkX2NsYXNzX25hbWUpOworCQl9CisJfQorCWlmIChkZXYtPmNsYXNzKSB7CisJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmNsYXNzLT5zdWJzeXMua3NldC5rb2JqLAorCQkJCSAgb2xkX3N5bWxpbmtfbmFtZSk7CisJCXN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmNsYXNzLT5zdWJzeXMua3NldC5rb2JqLCAmZGV2LT5rb2JqLAorCQkJCSAgZGV2LT5idXNfaWQpOworCX0KKwlwdXRfZGV2aWNlKGRldik7CisKKwlrZnJlZShvbGRfY2xhc3NfbmFtZSk7CisJa2ZyZWUobmV3X2NsYXNzX25hbWUpOworCWtmcmVlKG9sZF9zeW1saW5rX25hbWUpOworCisJcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2RkLmMgYi9kcml2ZXJzL2Jhc2UvZGQuYwppbmRleCA4ODljNzExLi5iNWY0M2MzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZGQuYworKysgYi9kcml2ZXJzL2Jhc2UvZGQuYwpAQCAtMTcsNiArMTcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCiAjaW5jbHVkZSAiYmFzZS5oIgogI2luY2x1ZGUgInBvd2VyL3Bvd2VyLmgiCkBAIC0zOCw2NiArMzksNzMgQEAKICAqCiAgKglUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggQGRldi0+c2VtIGhlbGQuCiAgKi8KLXZvaWQgZGV2aWNlX2JpbmRfZHJpdmVyKHN0cnVjdCBkZXZpY2UgKiBkZXYpCitpbnQgZGV2aWNlX2JpbmRfZHJpdmVyKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlpZiAoa2xpc3Rfbm9kZV9hdHRhY2hlZCgmZGV2LT5rbm9kZV9kcml2ZXIpKQotCQlyZXR1cm47CisJaW50IHJldDsKKworCWlmIChrbGlzdF9ub2RlX2F0dGFjaGVkKCZkZXYtPmtub2RlX2RyaXZlcikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRldmljZSAlcyBhbHJlYWR5IGJvdW5kXG4iLAorCQkJX19GVU5DVElPTl9fLCBrb2JqZWN0X25hbWUoJmRldi0+a29iaikpOworCQlyZXR1cm4gMDsKKwl9CiAKIAlwcl9kZWJ1ZygiYm91bmQgZGV2aWNlICclcycgdG8gZHJpdmVyICclcydcbiIsCiAJCSBkZXYtPmJ1c19pZCwgZGV2LT5kcml2ZXItPm5hbWUpOwogCWtsaXN0X2FkZF90YWlsKCZkZXYtPmtub2RlX2RyaXZlciwgJmRldi0+ZHJpdmVyLT5rbGlzdF9kZXZpY2VzKTsKLQlzeXNmc19jcmVhdGVfbGluaygmZGV2LT5kcml2ZXItPmtvYmosICZkZXYtPmtvYmosCisJcmV0ID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+ZHJpdmVyLT5rb2JqLCAmZGV2LT5rb2JqLAogCQkJICBrb2JqZWN0X25hbWUoJmRldi0+a29iaikpOwotCXN5c2ZzX2NyZWF0ZV9saW5rKCZkZXYtPmtvYmosICZkZXYtPmRyaXZlci0+a29iaiwgImRyaXZlciIpOworCWlmIChyZXQgPT0gMCkgeworCQlyZXQgPSBzeXNmc19jcmVhdGVfbGluaygmZGV2LT5rb2JqLCAmZGV2LT5kcml2ZXItPmtvYmosCisJCQkJCSJkcml2ZXIiKTsKKwkJaWYgKHJldCkKKwkJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmRyaXZlci0+a29iaiwKKwkJCQkJa29iamVjdF9uYW1lKCZkZXYtPmtvYmopKTsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAotLyoqCi0gKglkcml2ZXJfcHJvYmVfZGV2aWNlIC0gYXR0ZW1wdCB0byBiaW5kIGRldmljZSAmIGRyaXZlci4KLSAqCUBkcnY6CWRyaXZlci4KLSAqCUBkZXY6CWRldmljZS4KLSAqCi0gKglGaXJzdCwgd2UgY2FsbCB0aGUgYnVzJ3MgbWF0Y2ggZnVuY3Rpb24sIGlmIG9uZSBwcmVzZW50LCB3aGljaAotICoJc2hvdWxkIGNvbXBhcmUgdGhlIGRldmljZSBJRHMgdGhlIGRyaXZlciBzdXBwb3J0cyB3aXRoIHRoZQotICoJZGV2aWNlIElEcyBvZiB0aGUgZGV2aWNlLiBOb3RlIHdlIGRvbid0IGRvIHRoaXMgb3Vyc2VsdmVzCi0gKgliZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIGZvcm1hdCBvZiB0aGUgSUQgc3RydWN0dXJlcywgbm9yIHdoYXQKLSAqCWlzIHRvIGJlIGNvbnNpZGVyZWQgYSBtYXRjaCBhbmQgd2hhdCBpcyBub3QuCi0gKgotICoJVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgYSBtYXRjaCBpcyBmb3VuZCwgYW4gZXJyb3IgaWYgb25lCi0gKglvY2N1cnMgKHRoYXQgaXMgbm90IC1FTk9ERVYgb3IgLUVOWElPKSwgYW5kIDAgb3RoZXJ3aXNlLgotICoKLSAqCVRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBAZGV2LT5zZW0gaGVsZC4gIFdoZW4gY2FsbGVkCi0gKglmb3IgYSBVU0IgaW50ZXJmYWNlLCBAZGV2LT5wYXJlbnQtPnNlbSBtdXN0IGJlIGhlbGQgYXMgd2VsbC4KLSAqLwotaW50IGRyaXZlcl9wcm9iZV9kZXZpY2Uoc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYsIHN0cnVjdCBkZXZpY2UgKiBkZXYpCitzdHJ1Y3Qgc3R1cGlkX3RocmVhZF9zdHJ1Y3R1cmUgeworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnY7CisJc3RydWN0IGRldmljZSAqZGV2OworfTsKKworc3RhdGljIGF0b21pY190IHByb2JlX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgaW50IHJlYWxseV9wcm9iZSh2b2lkICp2b2lkX2RhdGEpCiB7CisJc3RydWN0IHN0dXBpZF90aHJlYWRfc3RydWN0dXJlICpkYXRhID0gdm9pZF9kYXRhOworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSBkYXRhLT5kcnY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YS0+ZGV2OwogCWludCByZXQgPSAwOwogCi0JaWYgKGRydi0+YnVzLT5tYXRjaCAmJiAhZHJ2LT5idXMtPm1hdGNoKGRldiwgZHJ2KSkKLQkJZ290byBEb25lOworCWF0b21pY19pbmMoJnByb2JlX2NvdW50KTsKKwlwcl9kZWJ1ZygiJXM6IFByb2JpbmcgZHJpdmVyICVzIHdpdGggZGV2aWNlICVzXG4iLAorCQkgZHJ2LT5idXMtPm5hbWUsIGRydi0+bmFtZSwgZGV2LT5idXNfaWQpOwogCi0JcHJfZGVidWcoIiVzOiBNYXRjaGVkIERldmljZSAlcyB3aXRoIERyaXZlciAlc1xuIiwKLQkJIGRydi0+YnVzLT5uYW1lLCBkZXYtPmJ1c19pZCwgZHJ2LT5uYW1lKTsKIAlkZXYtPmRyaXZlciA9IGRydjsKIAlpZiAoZGV2LT5idXMtPnByb2JlKSB7CiAJCXJldCA9IGRldi0+YnVzLT5wcm9iZShkZXYpOwogCQlpZiAocmV0KSB7CiAJCQlkZXYtPmRyaXZlciA9IE5VTEw7Ci0JCQlnb3RvIFByb2JlRmFpbGVkOworCQkJZ290byBwcm9iZV9mYWlsZWQ7CiAJCX0KIAl9IGVsc2UgaWYgKGRydi0+cHJvYmUpIHsKIAkJcmV0ID0gZHJ2LT5wcm9iZShkZXYpOwogCQlpZiAocmV0KSB7CiAJCQlkZXYtPmRyaXZlciA9IE5VTEw7Ci0JCQlnb3RvIFByb2JlRmFpbGVkOworCQkJZ290byBwcm9iZV9mYWlsZWQ7CiAJCX0KIAl9Ci0JZGV2aWNlX2JpbmRfZHJpdmVyKGRldik7CisJaWYgKGRldmljZV9iaW5kX2RyaXZlcihkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGRldmljZV9iaW5kX2RyaXZlciglcykgZmFpbGVkXG4iLAorCQkJX19GVU5DVElPTl9fLCBkZXYtPmJ1c19pZCk7CisJCS8qIEhvdyBkb2VzIHVuZG8gYSAtPnByb2JlPyAgV2UncmUgc2NyZXdlZC4gKi8KKwl9CiAJcmV0ID0gMTsKIAlwcl9kZWJ1ZygiJXM6IEJvdW5kIERldmljZSAlcyB0byBEcml2ZXIgJXNcbiIsCiAJCSBkcnYtPmJ1cy0+bmFtZSwgZGV2LT5idXNfaWQsIGRydi0+bmFtZSk7Ci0JZ290byBEb25lOworCWdvdG8gZG9uZTsKIAotIFByb2JlRmFpbGVkOgorcHJvYmVfZmFpbGVkOgogCWlmIChyZXQgPT0gLUVOT0RFViB8fCByZXQgPT0gLUVOWElPKSB7CiAJCS8qIERyaXZlciBtYXRjaGVkLCBidXQgZGlkbid0IHN1cHBvcnQgZGV2aWNlCiAJCSAqIG9yIGRldmljZSBub3QgZm91bmQuCkBAIC0xMTAsNyArMTE4LDcxIEBACiAJCSAgICAgICAiJXM6IHByb2JlIG9mICVzIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLAogCQkgICAgICAgZHJ2LT5uYW1lLCBkZXYtPmJ1c19pZCwgcmV0KTsKIAl9Ci0gRG9uZToKK2RvbmU6CisJa2ZyZWUoZGF0YSk7CisJYXRvbWljX2RlYygmcHJvYmVfY291bnQpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZHJpdmVyX3Byb2JlX2RvbmUKKyAqIERldGVybWluZSBpZiB0aGUgcHJvYmUgc2VxdWVuY2UgaXMgZmluaXNoZWQgb3Igbm90LgorICoKKyAqIFNob3VsZCBzb21laG93IGZpZ3VyZSBvdXQgaG93IHRvIHVzZSBhIHNlbWFwaG9yZSwgbm90IGFuIGF0b21pYyB2YXJpYWJsZS4uLgorICovCitpbnQgZHJpdmVyX3Byb2JlX2RvbmUodm9pZCkKK3sKKwlwcl9kZWJ1ZygiJXM6IHByb2JlX2NvdW50ID0gJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkJIGF0b21pY19yZWFkKCZwcm9iZV9jb3VudCkpOworCWlmIChhdG9taWNfcmVhZCgmcHJvYmVfY291bnQpKQorCQlyZXR1cm4gLUVCVVNZOworCXJldHVybiAwOworfQorCisvKioKKyAqIGRyaXZlcl9wcm9iZV9kZXZpY2UgLSBhdHRlbXB0IHRvIGJpbmQgZGV2aWNlICYgZHJpdmVyIHRvZ2V0aGVyCisgKiBAZHJ2OiBkcml2ZXIgdG8gYmluZCBhIGRldmljZSB0bworICogQGRldjogZGV2aWNlIHRvIHRyeSB0byBiaW5kIHRvIHRoZSBkcml2ZXIKKyAqCisgKiBGaXJzdCwgd2UgY2FsbCB0aGUgYnVzJ3MgbWF0Y2ggZnVuY3Rpb24sIGlmIG9uZSBwcmVzZW50LCB3aGljaCBzaG91bGQKKyAqIGNvbXBhcmUgdGhlIGRldmljZSBJRHMgdGhlIGRyaXZlciBzdXBwb3J0cyB3aXRoIHRoZSBkZXZpY2UgSURzIG9mIHRoZQorICogZGV2aWNlLiBOb3RlIHdlIGRvbid0IGRvIHRoaXMgb3Vyc2VsdmVzIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB0aGUKKyAqIGZvcm1hdCBvZiB0aGUgSUQgc3RydWN0dXJlcywgbm9yIHdoYXQgaXMgdG8gYmUgY29uc2lkZXJlZCBhIG1hdGNoIGFuZAorICogd2hhdCBpcyBub3QuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgYSBtYXRjaCBpcyBmb3VuZCwgYW4gZXJyb3IgaWYgb25lIG9jY3VycworICogKHRoYXQgaXMgbm90IC1FTk9ERVYgb3IgLUVOWElPKSwgYW5kIDAgb3RoZXJ3aXNlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBAZGV2LT5zZW0gaGVsZC4gIFdoZW4gY2FsbGVkIGZvciBhCisgKiBVU0IgaW50ZXJmYWNlLCBAZGV2LT5wYXJlbnQtPnNlbSBtdXN0IGJlIGhlbGQgYXMgd2VsbC4KKyAqLworaW50IGRyaXZlcl9wcm9iZV9kZXZpY2Uoc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYsIHN0cnVjdCBkZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHN0dXBpZF90aHJlYWRfc3RydWN0dXJlICpkYXRhOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcHJvYmVfdGFzazsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghZGV2aWNlX2lzX3JlZ2lzdGVyZWQoZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGRydi0+YnVzLT5tYXRjaCAmJiAhZHJ2LT5idXMtPm1hdGNoKGRldiwgZHJ2KSkKKwkJZ290byBkb25lOworCisJcHJfZGVidWcoIiVzOiBNYXRjaGVkIERldmljZSAlcyB3aXRoIERyaXZlciAlc1xuIiwKKwkJIGRydi0+YnVzLT5uYW1lLCBkZXYtPmJ1c19pZCwgZHJ2LT5uYW1lKTsKKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWRhdGEtPmRydiA9IGRydjsKKwlkYXRhLT5kZXYgPSBkZXY7CisKKwlpZiAoZHJ2LT5tdWx0aXRocmVhZF9wcm9iZSkgeworCQlwcm9iZV90YXNrID0ga3RocmVhZF9ydW4ocmVhbGx5X3Byb2JlLCBkYXRhLAorCQkJCQkgInByb2JlLSVzIiwgZGV2LT5idXNfaWQpOworCQlpZiAoSVNfRVJSKHByb2JlX3Rhc2spKQorCQkJcmV0ID0gUFRSX0VSUihwcm9iZV90YXNrKTsKKwl9IGVsc2UKKwkJcmV0ID0gcmVhbGx5X3Byb2JlKGRhdGEpOworCitkb25lOgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEzOSw4ICsyMTEsOSBAQAogCiAJZG93bigmZGV2LT5zZW0pOwogCWlmIChkZXYtPmRyaXZlcikgewotCQlkZXZpY2VfYmluZF9kcml2ZXIoZGV2KTsKLQkJcmV0ID0gMTsKKwkJcmV0ID0gZGV2aWNlX2JpbmRfZHJpdmVyKGRldik7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IDE7CiAJfSBlbHNlCiAJCXJldCA9IGJ1c19mb3JfZWFjaF9kcnYoZGV2LT5idXMsIE5VTEwsIGRldiwgX19kZXZpY2VfYXR0YWNoKTsKIAl1cCgmZGV2LT5zZW0pOwpAQCAtMTgyLDkgKzI1NSw5IEBACiAgKglyZXR1cm5zIDAgYW5kIHRoZSBAZGV2LT5kcml2ZXIgaXMgc2V0LCB3ZSd2ZSBmb3VuZCBhCiAgKgljb21wYXRpYmxlIHBhaXIuCiAgKi8KLXZvaWQgZHJpdmVyX2F0dGFjaChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydikKK2ludCBkcml2ZXJfYXR0YWNoKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZHJ2KQogewotCWJ1c19mb3JfZWFjaF9kZXYoZHJ2LT5idXMsIE5VTEwsIGRydiwgX19kcml2ZXJfYXR0YWNoKTsKKwlyZXR1cm4gYnVzX2Zvcl9lYWNoX2RldihkcnYtPmJ1cywgTlVMTCwgZHJ2LCBfX2RyaXZlcl9hdHRhY2gpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kcml2ZXIuYyBiL2RyaXZlcnMvYmFzZS9kcml2ZXIuYwppbmRleCA1NjI2MDBkLi4xMjE0Y2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9iYXNlL2RyaXZlci5jCkBAIC0xNDIsMjAgKzE0Miw2IEBACiAJa29iamVjdF9wdXQoJmRydi0+a29iaik7CiB9CiAKLXN0YXRpYyB2b2lkIGtsaXN0X2RldmljZXNfZ2V0KHN0cnVjdCBrbGlzdF9ub2RlICpuKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgZGV2aWNlLCBrbm9kZV9kcml2ZXIpOwotCi0JZ2V0X2RldmljZShkZXYpOwotfQotCi1zdGF0aWMgdm9pZCBrbGlzdF9kZXZpY2VzX3B1dChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yobiwgc3RydWN0IGRldmljZSwga25vZGVfZHJpdmVyKTsKLQotCXB1dF9kZXZpY2UoZGV2KTsKLX0KLQogLyoqCiAgKglkcml2ZXJfcmVnaXN0ZXIgLSByZWdpc3RlciBkcml2ZXIgd2l0aCBidXMKICAqCUBkcnY6CWRyaXZlciB0byByZWdpc3RlcgpAQCAtMTc1LDcgKzE2MSw3IEBACiAJICAgIChkcnYtPmJ1cy0+c2h1dGRvd24gJiYgZHJ2LT5zaHV0ZG93bikpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiRHJpdmVyICclcycgbmVlZHMgdXBkYXRpbmcgLSBwbGVhc2UgdXNlIGJ1c190eXBlIG1ldGhvZHNcbiIsIGRydi0+bmFtZSk7CiAJfQotCWtsaXN0X2luaXQoJmRydi0+a2xpc3RfZGV2aWNlcywga2xpc3RfZGV2aWNlc19nZXQsIGtsaXN0X2RldmljZXNfcHV0KTsKKwlrbGlzdF9pbml0KCZkcnYtPmtsaXN0X2RldmljZXMsIE5VTEwsIE5VTEwpOwogCWluaXRfY29tcGxldGlvbigmZHJ2LT51bmxvYWRlZCk7CiAJcmV0dXJuIGJ1c19hZGRfZHJpdmVyKGRydik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCmluZGV4IDVkNmMwMTEuLjc3YmY4ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCkBAIC02MDIsNyArNjAyLDcgQEAKIAljbGFzc191bnJlZ2lzdGVyKCZmaXJtd2FyZV9jbGFzcyk7CiB9CiAKLW1vZHVsZV9pbml0KGZpcm13YXJlX2NsYXNzX2luaXQpOworZnNfaW5pdGNhbGwoZmlybXdhcmVfY2xhc3NfaW5pdCk7CiBtb2R1bGVfZXhpdChmaXJtd2FyZV9jbGFzc19leGl0KTsKIAogRVhQT1JUX1NZTUJPTChyZWxlYXNlX2Zpcm13YXJlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKaW5kZXggMmI4NzU1ZC4uOTQwY2U0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9iYXNlL3BsYXRmb3JtLmMKQEAgLTUwNSwxMiArNTA1LDM2IEBACiAJcmV0dXJuIChzdHJuY21wKHBkZXYtPm5hbWUsIGRydi0+bmFtZSwgQlVTX0lEX1NJWkUpID09IDApOwogfQogCi1zdGF0aWMgaW50IHBsYXRmb3JtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBwbGF0Zm9ybV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc2cpCiB7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoZGV2LT5kcml2ZXIgJiYgZGV2LT5kcml2ZXItPnN1c3BlbmQpCi0JCXJldCA9IGRldi0+ZHJpdmVyLT5zdXNwZW5kKGRldiwgc3RhdGUpOworCQlyZXQgPSBkZXYtPmRyaXZlci0+c3VzcGVuZChkZXYsIG1lc2cpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbGF0Zm9ybV9zdXNwZW5kX2xhdGUoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICpkcnYgPSB0b19wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlLCBkZXYpOworCWludCByZXQgPSAwOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+c3VzcGVuZF9sYXRlKQorCQlyZXQgPSBkcnYtPnN1c3BlbmRfbGF0ZShwZGV2LCBtZXNnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGxhdGZvcm1fcmVzdW1lX2Vhcmx5KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyICpkcnYgPSB0b19wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlLCBkZXYpOworCWludCByZXQgPSAwOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+cmVzdW1lX2Vhcmx5KQorCQlyZXQgPSBkcnYtPnJlc3VtZV9lYXJseShwZGV2KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC01MzEsNiArNTU1LDggQEAKIAkubWF0Y2gJCT0gcGxhdGZvcm1fbWF0Y2gsCiAJLnVldmVudAkJPSBwbGF0Zm9ybV91ZXZlbnQsCiAJLnN1c3BlbmQJPSBwbGF0Zm9ybV9zdXNwZW5kLAorCS5zdXNwZW5kX2xhdGUJPSBwbGF0Zm9ybV9zdXNwZW5kX2xhdGUsCisJLnJlc3VtZV9lYXJseQk9IHBsYXRmb3JtX3Jlc3VtZV9lYXJseSwKIAkucmVzdW1lCQk9IHBsYXRmb3JtX3Jlc3VtZSwKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChwbGF0Zm9ybV9idXNfdHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvcmVzdW1lLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcmVzdW1lLmMKaW5kZXggODI2MDkzZS4uMDIwYmUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3Bvd2VyL3Jlc3VtZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9yZXN1bWUuYwpAQCAtMzgsMTMgKzM4LDM1IEBACiAJCWRldl9kYmcoZGV2LCJyZXN1bWluZ1xuIik7CiAJCWVycm9yID0gZGV2LT5idXMtPnJlc3VtZShkZXYpOwogCX0KKwlpZiAoZGV2LT5jbGFzcyAmJiBkZXYtPmNsYXNzLT5yZXN1bWUpIHsKKwkJZGV2X2RiZyhkZXYsImNsYXNzIHJlc3VtZVxuIik7CisJCWVycm9yID0gZGV2LT5jbGFzcy0+cmVzdW1lKGRldik7CisJfQogCXVwKCZkZXYtPnNlbSk7CiAJVFJBQ0VfUkVTVU1FKGVycm9yKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIAorc3RhdGljIGludCByZXN1bWVfZGV2aWNlX2Vhcmx5KHN0cnVjdCBkZXZpY2UgKiBkZXYpCit7CisJaW50IGVycm9yID0gMDsKIAorCVRSQUNFX0RFVklDRShkZXYpOworCVRSQUNFX1JFU1VNRSgwKTsKKwlpZiAoZGV2LT5idXMgJiYgZGV2LT5idXMtPnJlc3VtZV9lYXJseSkgeworCQlkZXZfZGJnKGRldiwiRUFSTFkgcmVzdW1lXG4iKTsKKwkJZXJyb3IgPSBkZXYtPmJ1cy0+cmVzdW1lX2Vhcmx5KGRldik7CisJfQorCVRSQUNFX1JFU1VNRShlcnJvcik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogUmVzdW1lIHRoZSBkZXZpY2VzIHRoYXQgaGF2ZSBlaXRoZXIgbm90IGdvbmUgdGhyb3VnaAorICogdGhlIGxhdGUgc3VzcGVuZCwgb3IgdGhhdCBkaWQgZ28gdGhyb3VnaCBpdCBidXQgYWxzbworICogd2VudCB0aHJvdWdoIHRoZSBlYXJseSByZXN1bWUKKyAqLwogdm9pZCBkcG1fcmVzdW1lKHZvaWQpCiB7CiAJZG93bigmZHBtX2xpc3Rfc2VtKTsKQEAgLTc0LDYgKzk2LDcgQEAKIAogdm9pZCBkZXZpY2VfcmVzdW1lKHZvaWQpCiB7CisJbWlnaHRfc2xlZXAoKTsKIAlkb3duKCZkcG1fc2VtKTsKIAlkcG1fcmVzdW1lKCk7CiAJdXAoJmRwbV9zZW0pOwpAQCAtODMsMTIgKzEwNiwxMiBAQAogCiAKIC8qKgotICoJZGV2aWNlX3Bvd2VyX3VwX2lycSAtIFBvd2VyIG9uIHNvbWUgZGV2aWNlcy4KKyAqCWRwbV9wb3dlcl91cCAtIFBvd2VyIG9uIHNvbWUgZGV2aWNlcy4KICAqCiAgKglXYWxrIHRoZSBkcG1fb2ZmX2lycSBsaXN0IGFuZCBwb3dlciBlYWNoIGRldmljZSB1cC4gVGhpcwogICoJaXMgdXNlZCBmb3IgZGV2aWNlcyB0aGF0IHJlcXVpcmVkIHRoZXkgYmUgcG93ZXJlZCBkb3duIHdpdGgKLSAqCWludGVycnVwdHMgZGlzYWJsZWQuIEFzIGRldmljZXMgYXJlIHBvd2VyZWQgb24sIHRoZXkgYXJlIG1vdmVkIHRvCi0gKgl0aGUgZHBtX3N1c3BlbmRlZCBsaXN0LgorICoJaW50ZXJydXB0cyBkaXNhYmxlZC4gQXMgZGV2aWNlcyBhcmUgcG93ZXJlZCBvbiwgdGhleSBhcmUgbW92ZWQKKyAqCXRvIHRoZSBkcG1fYWN0aXZlIGxpc3QuCiAgKgogICoJSW50ZXJydXB0cyBtdXN0IGJlIGRpc2FibGVkIHdoZW4gY2FsbGluZyB0aGlzLgogICovCkBAIC05OSwxNiArMTIyLDE0IEBACiAJCXN0cnVjdCBsaXN0X2hlYWQgKiBlbnRyeSA9IGRwbV9vZmZfaXJxLm5leHQ7CiAJCXN0cnVjdCBkZXZpY2UgKiBkZXYgPSB0b19kZXZpY2UoZW50cnkpOwogCi0JCWdldF9kZXZpY2UoZGV2KTsKLQkJbGlzdF9tb3ZlX3RhaWwoZW50cnksICZkcG1fYWN0aXZlKTsKLQkJcmVzdW1lX2RldmljZShkZXYpOwotCQlwdXRfZGV2aWNlKGRldik7CisJCWxpc3RfbW92ZV90YWlsKGVudHJ5LCAmZHBtX29mZik7CisJCXJlc3VtZV9kZXZpY2VfZWFybHkoZGV2KTsKIAl9CiB9CiAKIAogLyoqCi0gKglkZXZpY2VfcG1fcG93ZXJfdXAgLSBUdXJuIG9uIGFsbCBkZXZpY2VzIHRoYXQgbmVlZCBzcGVjaWFsIGF0dGVudGlvbi4KKyAqCWRldmljZV9wb3dlcl91cCAtIFR1cm4gb24gYWxsIGRldmljZXMgdGhhdCBuZWVkIHNwZWNpYWwgYXR0ZW50aW9uLgogICoKICAqCVBvd2VyIG9uIHN5c3RlbSBkZXZpY2VzIHRoZW4gZGV2aWNlcyB0aGF0IHJlcXVpcmVkIHdlIHNodXQgdGhlbSBkb3duCiAgKgl3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc3VzcGVuZC5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3N1c3BlbmQuYwppbmRleCA2OTUwOWUwLi5lY2UxMzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc3VzcGVuZC5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zdXNwZW5kLmMKQEAgLTM0LDYgKzM0LDcgQEAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBQTV9FVkVOVF9TVVNQRU5EOglyZXR1cm4gInN1c3BlbmQiOwogCWNhc2UgUE1fRVZFTlRfRlJFRVpFOglyZXR1cm4gImZyZWV6ZSI7CisJY2FzZSBQTV9FVkVOVF9QUkVUSEFXOglyZXR1cm4gInByZXRoYXciOwogCWRlZmF1bHQ6CQlyZXR1cm4gIih1bmtub3duIHN1c3BlbmQgZXZlbnQpIjsKIAl9CiB9CkBAIC02NSw3ICs2NiwxOSBAQAogCiAJZGV2LT5wb3dlci5wcmV2X3N0YXRlID0gZGV2LT5wb3dlci5wb3dlcl9zdGF0ZTsKIAotCWlmIChkZXYtPmJ1cyAmJiBkZXYtPmJ1cy0+c3VzcGVuZCAmJiAhZGV2LT5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCkgeworCWlmIChkZXYtPmNsYXNzICYmIGRldi0+Y2xhc3MtPnN1c3BlbmQgJiYgIWRldi0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpIHsKKwkJZGV2X2RiZyhkZXYsICJjbGFzcyAlcyVzXG4iLAorCQkJc3VzcGVuZF92ZXJiKHN0YXRlLmV2ZW50KSwKKwkJCSgoc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCkKKwkJCQkJJiYgZGV2aWNlX21heV93YWtldXAoZGV2KSkKKwkJCQk/ICIsIG1heSB3YWtldXAiCisJCQkJOiAiIgorCQkJKTsKKwkJZXJyb3IgPSBkZXYtPmNsYXNzLT5zdXNwZW5kKGRldiwgc3RhdGUpOworCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZGV2LT5jbGFzcy0+c3VzcGVuZCwgZXJyb3IpOworCX0KKworCWlmICghZXJyb3IgJiYgZGV2LT5idXMgJiYgZGV2LT5idXMtPnN1c3BlbmQgJiYgIWRldi0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpIHsKIAkJZGV2X2RiZyhkZXYsICIlcyVzXG4iLAogCQkJc3VzcGVuZF92ZXJiKHN0YXRlLmV2ZW50KSwKIAkJCSgoc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCkKQEAgLTgxLDE1ICs5NCw0MiBAQAogfQogCiAKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLCBvbmx5IGEgc2luZ2xlIENQVQorICogcnVubmluZy4gV2UgY2FuJ3QgZG8gZG93bigpIG9uIGEgc2VtYXBob3JlIChhbmQgd2UgZG9uJ3QKKyAqIG5lZWQgdGhlIHByb3RlY3Rpb24pCisgKi8KK3N0YXRpYyBpbnQgc3VzcGVuZF9kZXZpY2VfbGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJaWYgKGRldi0+YnVzICYmIGRldi0+YnVzLT5zdXNwZW5kX2xhdGUgJiYgIWRldi0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpIHsKKwkJZGV2X2RiZyhkZXYsICJMQVRFICVzJXNcbiIsCisJCQlzdXNwZW5kX3ZlcmIoc3RhdGUuZXZlbnQpLAorCQkJKChzdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9TVVNQRU5EKQorCQkJCQkmJiBkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQkJCT8gIiwgbWF5IHdha2V1cCIKKwkJCQk6ICIiCisJCQkpOworCQllcnJvciA9IGRldi0+YnVzLT5zdXNwZW5kX2xhdGUoZGV2LCBzdGF0ZSk7CisJCXN1c3BlbmRfcmVwb3J0X3Jlc3VsdChkZXYtPmJ1cy0+c3VzcGVuZF9sYXRlLCBlcnJvcik7CisJfQorCXJldHVybiBlcnJvcjsKK30KKwogLyoqCiAgKglkZXZpY2Vfc3VzcGVuZCAtIFNhdmUgc3RhdGUgYW5kIHN0b3AgYWxsIGRldmljZXMgaW4gc3lzdGVtLgogICoJQHN0YXRlOgkJUG93ZXIgc3RhdGUgdG8gcHV0IGVhY2ggZGV2aWNlIGluLgogICoKICAqCVdhbGsgdGhlIGRwbV9hY3RpdmUgbGlzdCwgY2FsbCAtPnN1c3BlbmQoKSBmb3IgZWFjaCBkZXZpY2UsIGFuZCBtb3ZlCi0gKglpdCB0byBkcG1fb2ZmLgotICoJQ2hlY2sgdGhlIHJldHVybiB2YWx1ZSBmb3IgZWFjaC4gSWYgaXQgcmV0dXJucyAwLCB0aGVuIHdlIG1vdmUgdGhlCi0gKgl0aGUgZGV2aWNlIHRvIHRoZSBkcG1fb2ZmIGxpc3QuIElmIGl0IHJldHVybnMgLUVBR0FJTiwgd2UgbW92ZSBpdCB0bwotICoJdGhlIGRwbV9vZmZfaXJxIGxpc3QuIElmIHdlIGdldCBhIGRpZmZlcmVudCBlcnJvciwgdHJ5IGFuZCBiYWNrIG91dC4KKyAqCWl0IHRvIHRoZSBkcG1fb2ZmIGxpc3QuCisgKgorICoJKEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIGlmIGl0IHJldHVybnMgLUVBR0FJTiwgdGhhdCB1c2VkIHRvIG1lYW4KKyAqCXRoYXQgdGhlIGRldmljZSB3b3VsZCBiZSBjYWxsZWQgYWdhaW4gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICoJVGhlc2UgZGF5cywgd2UgdXNlIHRoZSAic3VzcGVuZF9sYXRlKCkiIGNhbGxiYWNrIGZvciB0aGF0LCBzbyB3ZQorICoJcHJpbnQgYSB3YXJuaW5nIGFuZCBjb25zaWRlciBpdCBhbiBlcnJvcikuCisgKgorICoJSWYgd2UgZ2V0IGEgZGlmZmVyZW50IGVycm9yLCB0cnkgYW5kIGJhY2sgb3V0LgogICoKICAqCUlmIHdlIGhpdCBhIGZhaWx1cmUgd2l0aCBhbnkgb2YgdGhlIGRldmljZXMsIGNhbGwgZGV2aWNlX3Jlc3VtZSgpCiAgKglhYm92ZSB0byBicmluZyB0aGUgc3VzcGVuZGVkIGRldmljZXMgYmFjayB0byBsaWZlLgpAQCAtMTAwLDYgKzE0MCw3IEBACiB7CiAJaW50IGVycm9yID0gMDsKIAorCW1pZ2h0X3NsZWVwKCk7CiAJZG93bigmZHBtX3NlbSk7CiAJZG93bigmZHBtX2xpc3Rfc2VtKTsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9hY3RpdmUpICYmIGVycm9yID09IDApIHsKQEAgLTExNSwzOSArMTU2LDI3IEBACiAKIAkJLyogQ2hlY2sgaWYgdGhlIGRldmljZSBnb3QgcmVtb3ZlZCAqLwogCQlpZiAoIWxpc3RfZW1wdHkoJmRldi0+cG93ZXIuZW50cnkpKSB7Ci0JCQkvKiBNb3ZlIGl0IHRvIHRoZSBkcG1fb2ZmIG9yIGRwbV9vZmZfaXJxIGxpc3QgKi8KKwkJCS8qIE1vdmUgaXQgdG8gdGhlIGRwbV9vZmYgbGlzdCAqLwogCQkJaWYgKCFlcnJvcikKIAkJCQlsaXN0X21vdmUoJmRldi0+cG93ZXIuZW50cnksICZkcG1fb2ZmKTsKLQkJCWVsc2UgaWYgKGVycm9yID09IC1FQUdBSU4pIHsKLQkJCQlsaXN0X21vdmUoJmRldi0+cG93ZXIuZW50cnksICZkcG1fb2ZmX2lycSk7Ci0JCQkJZXJyb3IgPSAwOwotCQkJfQogCQl9CiAJCWlmIChlcnJvcikKIAkJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHN1c3BlbmQgZGV2aWNlICVzOiAiCi0JCQkJImVycm9yICVkXG4iLCBrb2JqZWN0X25hbWUoJmRldi0+a29iaiksIGVycm9yKTsKKwkJCQkiZXJyb3IgJWQlc1xuIiwKKwkJCQlrb2JqZWN0X25hbWUoJmRldi0+a29iaiksIGVycm9yLAorCQkJCWVycm9yID09IC1FQUdBSU4gPyAiIChwbGVhc2UgY29udmVydCB0byBzdXNwZW5kX2xhdGUpIiA6ICIiKTsKIAkJcHV0X2RldmljZShkZXYpOwogCX0KIAl1cCgmZHBtX2xpc3Rfc2VtKTsKLQlpZiAoZXJyb3IpIHsKLQkJLyogd2UgZmFpbGVkLi4uIGJlZm9yZSByZXN1bWluZywgYnJpbmcgYmFjayBkZXZpY2VzIGZyb20KLQkJICogZHBtX29mZl9pcnEgbGlzdCBiYWNrIHRvIG1haW4gZHBtX29mZiBsaXN0LCB3ZSBkbyB3YW50Ci0JCSAqIHRvIGNhbGwgcmVzdW1lKCkgb24gdGhlbSwgaW4gY2FzZSB0aGV5IHBhcnRpYWxseSBzdXNwZW5kZWQKLQkJICogZGVzcGl0ZSByZXR1cm5pbmcgLUVBR0FJTgotCQkgKi8KLQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZkcG1fb2ZmX2lycSkpIHsKLQkJCXN0cnVjdCBsaXN0X2hlYWQgKiBlbnRyeSA9IGRwbV9vZmZfaXJxLm5leHQ7Ci0JCQlsaXN0X21vdmUoZW50cnksICZkcG1fb2ZmKTsKLQkJfQorCWlmIChlcnJvcikKIAkJZHBtX3Jlc3VtZSgpOwotCX0KKwogCXVwKCZkcG1fc2VtKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKIEVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9zdXNwZW5kKTsKIAotCiAvKioKICAqCWRldmljZV9wb3dlcl9kb3duIC0gU2h1dCBkb3duIHNwZWNpYWwgZGV2aWNlcy4KICAqCUBzdGF0ZToJCVBvd2VyIHN0YXRlIHRvIGVudGVyLgpAQCAtMTYyLDE0ICsxOTEsMTcgQEAKIAlpbnQgZXJyb3IgPSAwOwogCXN0cnVjdCBkZXZpY2UgKiBkZXY7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoZGV2LCAmZHBtX29mZl9pcnEsIHBvd2VyLmVudHJ5KSB7Ci0JCWlmICgoZXJyb3IgPSBzdXNwZW5kX2RldmljZShkZXYsIHN0YXRlKSkpCi0JCQlicmVhazsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmRwbV9vZmYpKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKiBlbnRyeSA9IGRwbV9vZmYucHJldjsKKworCQlkZXYgPSB0b19kZXZpY2UoZW50cnkpOworCQllcnJvciA9IHN1c3BlbmRfZGV2aWNlX2xhdGUoZGV2LCBzdGF0ZSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gRXJyb3I7CisJCWxpc3RfbW92ZSgmZGV2LT5wb3dlci5lbnRyeSwgJmRwbV9vZmZfaXJxKTsKIAl9Ci0JaWYgKGVycm9yKQotCQlnb3RvIEVycm9yOwotCWlmICgoZXJyb3IgPSBzeXNkZXZfc3VzcGVuZChzdGF0ZSkpKQotCQlnb3RvIEVycm9yOworCisJZXJyb3IgPSBzeXNkZXZfc3VzcGVuZChzdGF0ZSk7CiAgRG9uZToKIAlyZXR1cm4gZXJyb3I7CiAgRXJyb3I6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvc3lzZnMuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCmluZGV4IDQwZDcyNDIuLjJkNDc1MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci9zeXNmcy5jCkBAIC03LDIyICs3LDI5IEBACiAjaW5jbHVkZSAicG93ZXIuaCIKIAogCisjaWZkZWYJQ09ORklHX1BNX1NZU0ZTX0RFUFJFQ0FURUQKKwogLyoqCiAgKglzdGF0ZSAtIENvbnRyb2wgY3VycmVudCBwb3dlciBzdGF0ZSBvZiBkZXZpY2UKICAqCiAgKglzaG93KCkgcmV0dXJucyB0aGUgY3VycmVudCBwb3dlciBzdGF0ZSBvZiB0aGUgZGV2aWNlLiAnMCcgaW5kaWNhdGVzCi0gKgl0aGUgZGV2aWNlIGlzIG9uLiBPdGhlciB2YWx1ZXMgKDEtMykgaW5kaWNhdGUgdGhlIGRldmljZSBpcyBpbiBhIGxvdworICoJdGhlIGRldmljZSBpcyBvbi4gT3RoZXIgdmFsdWVzICgyKSBpbmRpY2F0ZSB0aGUgZGV2aWNlIGlzIGluIHNvbWUgbG93CiAgKglwb3dlciBzdGF0ZS4KICAqCi0gKglzdG9yZSgpIHNldHMgdGhlIGN1cnJlbnQgcG93ZXIgc3RhdGUsIHdoaWNoIGlzIGFuIGludGVnZXIgdmFsdWUKLSAqCWJldHdlZW4gMC0zLiBJZiB0aGUgZGV2aWNlIGlzIG9uICgnMCcpLCBhbmQgdGhlIHZhbHVlIHdyaXR0ZW4gaXMKLSAqCWdyZWF0ZXIgdGhhbiAwLCB0aGVuIHRoZSBkZXZpY2UgaXMgcGxhY2VkIGRpcmVjdGx5IGludG8gdGhlIGxvdy1wb3dlcgotICoJc3RhdGUgKHZpYSBpdHMgZHJpdmVyJ3MgLT5zdXNwZW5kKCkgbWV0aG9kKS4KLSAqCUlmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGluIGEgbG93LXBvd2VyIHN0YXRlLCBhbmQgdGhlIHZhbHVlIGlzIDAsCi0gKgl0aGUgZGV2aWNlIGlzIHBvd2VyZWQgYmFjayBvbiAodmlhIHRoZSAtPnJlc3VtZSgpIG1ldGhvZCkuCi0gKglJZiB0aGUgZGV2aWNlIGlzIGluIGEgbG93LXBvd2VyIHN0YXRlLCBhbmQgYSBkaWZmZXJlbnQgbG93LXBvd2VyIHN0YXRlCi0gKglpcyByZXF1ZXN0ZWQsIHRoZSBkZXZpY2UgaXMgZmlyc3QgcmVzdW1lZCwgdGhlbiBzdXNwZW5kZWQgaW50byB0aGUgbmV3Ci0gKglsb3ctcG93ZXIgc3RhdGUuCisgKglzdG9yZSgpIHNldHMgdGhlIGN1cnJlbnQgcG93ZXIgc3RhdGUsIHdoaWNoIGlzIGFuIGludGVnZXIgdmFsdWVkCisgKgkwLCAyLCBvciAzLiAgRGV2aWNlcyB3aXRoIGJ1cy5zdXNwZW5kX2xhdGUoKSwgb3IgYnVzLnJlc3VtZV9lYXJseSgpCisgKgltZXRob2RzIGZhaWwgdGhpcyBvcGVyYXRpb247IHRob3NlIG1ldGhvZHMgY291bGRuJ3QgYmUgY2FsbGVkLgorICoJT3RoZXJ3aXNlLAorICoKKyAqCS0gSWYgdGhlIHJlY29yZGVkIGRldi0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgbWF0Y2hlcyB0aGUKKyAqCSAgdGFyZ2V0IHZhbHVlLCBub3RoaW5nIGlzIGRvbmUuCisgKgktIElmIHRoZSByZWNvcmRlZCBldmVudCBjb2RlIGlzIG5vbnplcm8sIHRoZSBkZXZpY2UgaXMgcmVhY3RpdmF0ZWQKKyAqCSAgYnkgY2FsbGluZyBidXMucmVzdW1lKCkgYW5kL29yIGNsYXNzLnJlc3VtZSgpLgorICoJLSBJZiB0aGUgdGFyZ2V0IHZhbHVlIGlzIG5vbnplcm8sIHRoZSBkZXZpY2UgaXMgc3VzcGVuZGVkIGJ5CisgKgkgIGNhbGxpbmcgY2xhc3Muc3VzcGVuZCgpIGFuZC9vciBidXMuc3VzcGVuZCgpIHdpdGggZXZlbnQgY29kZQorICoJICBQTV9FVkVOVF9TVVNQRU5ELgorICoKKyAqCVRoaXMgbWVjaGFuaXNtIGlzIERFUFJFQ0FURUQgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRlc3RpbmcuCiAgKi8KIAogc3RhdGljIHNzaXplX3Qgc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICogZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqIGJ1ZikKQEAgLTM4LDYgKzQ1LDEwIEBACiAJcG1fbWVzc2FnZV90IHN0YXRlOwogCWludCBlcnJvciA9IC1FSU5WQUw7CiAKKwkvKiBkaXNhbGxvdyBpbmNvbXBsZXRlIHN1c3BlbmQgc2VxdWVuY2VzICovCisJaWYgKGRldi0+YnVzICYmIChkZXYtPmJ1cy0+c3VzcGVuZF9sYXRlIHx8IGRldi0+YnVzLT5yZXN1bWVfZWFybHkpKQorCQlyZXR1cm4gZXJyb3I7CisKIAlzdGF0ZS5ldmVudCA9IFBNX0VWRU5UX1NVU1BFTkQ7CiAJLyogT2xkZXIgYXBwcyBleHBlY3RlZCB0byB3cml0ZSAiMyIgaGVyZSAtIGNvbmZ1c2VkIHdpdGggUENJIEQzICovCiAJaWYgKChuID09IDEpICYmICFzdHJjbXAoYnVmLCAiMyIpKQpAQCAtNTcsNiArNjgsOCBAQAogc3RhdGljIERFVklDRV9BVFRSKHN0YXRlLCAwNjQ0LCBzdGF0ZV9zaG93LCBzdGF0ZV9zdG9yZSk7CiAKIAorI2VuZGlmCS8qIENPTkZJR19QTV9TWVNGU19ERVBSRUNBVEVEICovCisKIC8qCiAgKgl3YWtldXAgLSBSZXBvcnQvY2hhbmdlIGN1cnJlbnQgd2FrZXVwIG9wdGlvbiBmb3IgZGV2aWNlCiAgKgpAQCAtMTMwLDcgKzE0Myw5IEBACiAKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKiBwb3dlcl9hdHRyc1tdID0geworI2lmZGVmCUNPTkZJR19QTV9TWVNGU19ERVBSRUNBVEVECiAJJmRldl9hdHRyX3N0YXRlLmF0dHIsCisjZW5kaWYKIAkmZGV2X2F0dHJfd2FrZXVwLmF0dHIsCiAJTlVMTCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2xvb3AuYyBiL2RyaXZlcnMvYmxvY2svbG9vcC5jCmluZGV4IDdiM2I5NGQuLmM3NzQxMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbG9vcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbG9vcC5jCkBAIC02NjIsNyArNjYyLDggQEAKIAogCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG9sZF9maWxlLT5mX21hcHBpbmcsIGxvLT5vbGRfZ2ZwX21hc2spOwogCWxvLT5sb19iYWNraW5nX2ZpbGUgPSBmaWxlOwotCWxvLT5sb19ibG9ja3NpemUgPSBtYXBwaW5nLT5ob3N0LT5pX2Jsa3NpemU7CisJbG8tPmxvX2Jsb2Nrc2l6ZSA9IFNfSVNCTEsobWFwcGluZy0+aG9zdC0+aV9tb2RlKSA/CisJCW1hcHBpbmctPmhvc3QtPmlfYmRldi0+YmRfYmxvY2tfc2l6ZSA6IFBBR0VfU0laRTsKIAlsby0+b2xkX2dmcF9tYXNrID0gbWFwcGluZ19nZnBfbWFzayhtYXBwaW5nKTsKIAltYXBwaW5nX3NldF9nZnBfbWFzayhtYXBwaW5nLCBsby0+b2xkX2dmcF9tYXNrICYgfihfX0dGUF9JT3xfX0dGUF9GUykpOwogCWNvbXBsZXRlKCZwLT53YWl0KTsKQEAgLTc5NCw3ICs3OTUsOSBAQAogCQlpZiAoIShsb19mbGFncyAmIExPX0ZMQUdTX1VTRV9BT1BTKSAmJiAhZmlsZS0+Zl9vcC0+d3JpdGUpCiAJCQlsb19mbGFncyB8PSBMT19GTEFHU19SRUFEX09OTFk7CiAKLQkJbG9fYmxvY2tzaXplID0gaW5vZGUtPmlfYmxrc2l6ZTsKKwkJbG9fYmxvY2tzaXplID0gU19JU0JMSyhpbm9kZS0+aV9tb2RlKSA/CisJCQlpbm9kZS0+aV9iZGV2LT5iZF9ibG9ja19zaXplIDogUEFHRV9TSVpFOworCiAJCWVycm9yID0gMDsKIAl9IGVsc2UgewogCQlnb3RvIG91dF9wdXRmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay91Yi5jIGIvZHJpdmVycy9ibG9jay91Yi5jCmluZGV4IGQ2MmI0OWYuLjQ1YThmNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svdWIuYworKysgYi9kcml2ZXJzL2Jsb2NrL3ViLmMKQEAgLTM1OCw3ICszNTgsNyBAQAogc3RhdGljIHZvaWQgdWJfY21kX2J1aWxkX3BhY2tldChzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX2x1biAqbHVuLAogICAgIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kLCBzdHJ1Y3QgdWJfcmVxdWVzdCAqdXJxKTsKIHN0YXRpYyB2b2lkIHViX3J3X2NtZF9kb25lKHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZCk7Ci1zdGF0aWMgdm9pZCB1Yl9lbmRfcnEoc3RydWN0IHJlcXVlc3QgKnJxLCBpbnQgdXB0b2RhdGUpOworc3RhdGljIHZvaWQgdWJfZW5kX3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgdW5zaWduZWQgaW50IHN0YXR1cyk7CiBzdGF0aWMgaW50IHViX3J3X2NtZF9yZXRyeShzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX2x1biAqbHVuLAogICAgIHN0cnVjdCB1Yl9yZXF1ZXN0ICp1cnEsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kKTsKIHN0YXRpYyBpbnQgdWJfc3VibWl0X3Njc2koc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kKTsKQEAgLTYzOSw5ICs2MzksMTUgQEAKIAlzdHJ1Y3QgdWJfcmVxdWVzdCAqdXJxOwogCWludCBuX2VsZW07CiAKLQlpZiAoYXRvbWljX3JlYWQoJnNjLT5wb2lzb24pIHx8IGx1bi0+Y2hhbmdlZCkgeworCWlmIChhdG9taWNfcmVhZCgmc2MtPnBvaXNvbikpIHsKIAkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChycSk7Ci0JCXViX2VuZF9ycShycSwgMCk7CisJCXViX2VuZF9ycShycSwgRElEX05PX0NPTk5FQ1QgPDwgMTYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobHVuLT5jaGFuZ2VkICYmICFibGtfcGNfcmVxdWVzdChycSkpIHsKKwkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChycSk7CisJCXViX2VuZF9ycShycSwgU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC02OTMsNyArNjk5LDcgQEAKIAogZHJvcDoKIAl1Yl9wdXRfY21kKGx1biwgY21kKTsKLQl1Yl9lbmRfcnEocnEsIDApOworCXViX2VuZF9ycShycSwgRElEX0VSUk9SIDw8IDE2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzYxLDQ3ICs3NjcsNTMgQEAKIAlzdHJ1Y3QgdWJfbHVuICpsdW4gPSBjbWQtPmx1bjsKIAlzdHJ1Y3QgdWJfcmVxdWVzdCAqdXJxID0gY21kLT5iYWNrOwogCXN0cnVjdCByZXF1ZXN0ICpycTsKLQlpbnQgdXB0b2RhdGU7CisJdW5zaWduZWQgaW50IHNjc2lfc3RhdHVzOwogCiAJcnEgPSB1cnEtPnJxOwogCiAJaWYgKGNtZC0+ZXJyb3IgPT0gMCkgewotCQl1cHRvZGF0ZSA9IDE7Ci0KIAkJaWYgKGJsa19wY19yZXF1ZXN0KHJxKSkgewogCQkJaWYgKGNtZC0+YWN0X2xlbiA+PSBycS0+ZGF0YV9sZW4pCiAJCQkJcnEtPmRhdGFfbGVuID0gMDsKIAkJCWVsc2UKIAkJCQlycS0+ZGF0YV9sZW4gLT0gY21kLT5hY3RfbGVuOwogCQl9CisJCXNjc2lfc3RhdHVzID0gMDsKIAl9IGVsc2UgewotCQl1cHRvZGF0ZSA9IDA7Ci0KIAkJaWYgKGJsa19wY19yZXF1ZXN0KHJxKSkgewogCQkJLyogVUJfU0VOU0VfU0laRSBpcyBzbWFsbGVyIHRoYW4gU0NTSV9TRU5TRV9CVUZGRVJTSVpFICovCiAJCQltZW1jcHkocnEtPnNlbnNlLCBzYy0+dG9wX3NlbnNlLCBVQl9TRU5TRV9TSVpFKTsKIAkJCXJxLT5zZW5zZV9sZW4gPSBVQl9TRU5TRV9TSVpFOwogCQkJaWYgKHNjLT50b3Bfc2Vuc2VbMF0gIT0gMCkKLQkJCQlycS0+ZXJyb3JzID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCQkJCXNjc2lfc3RhdHVzID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwogCQkJZWxzZQotCQkJCXJxLT5lcnJvcnMgPSBESURfRVJST1IgPDwgMTY7CisJCQkJc2NzaV9zdGF0dXMgPSBESURfRVJST1IgPDwgMTY7CiAJCX0gZWxzZSB7CiAJCQlpZiAoY21kLT5lcnJvciA9PSAtRUlPKSB7CiAJCQkJaWYgKHViX3J3X2NtZF9yZXRyeShzYywgbHVuLCB1cnEsIGNtZCkgPT0gMCkKIAkJCQkJcmV0dXJuOwogCQkJfQorCQkJc2NzaV9zdGF0dXMgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CiAJCX0KIAl9CiAKIAl1cnEtPnJxID0gTlVMTDsKIAogCXViX3B1dF9jbWQobHVuLCBjbWQpOwotCXViX2VuZF9ycShycSwgdXB0b2RhdGUpOworCXViX2VuZF9ycShycSwgc2NzaV9zdGF0dXMpOwogCWJsa19zdGFydF9xdWV1ZShsdW4tPmRpc2stPnF1ZXVlKTsKIH0KIAotc3RhdGljIHZvaWQgdWJfZW5kX3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgaW50IHVwdG9kYXRlKQorc3RhdGljIHZvaWQgdWJfZW5kX3JxKHN0cnVjdCByZXF1ZXN0ICpycSwgdW5zaWduZWQgaW50IHNjc2lfc3RhdHVzKQogeworCWludCB1cHRvZGF0ZTsKKworCWlmIChzY3NpX3N0YXR1cyA9PSAwKSB7CisJCXVwdG9kYXRlID0gMTsKKwl9IGVsc2UgeworCQl1cHRvZGF0ZSA9IDA7CisJCXJxLT5lcnJvcnMgPSBzY3NpX3N0YXR1czsKKwl9CiAJZW5kX3RoYXRfcmVxdWVzdF9maXJzdChycSwgdXB0b2RhdGUsIHJxLT5oYXJkX25yX3NlY3RvcnMpOwogCWVuZF90aGF0X3JlcXVlc3RfbGFzdChycSwgdXB0b2RhdGUpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwppbmRleCA1MmVhOTRiLi4xYjIxYzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwpAQCAtNDM5LDYgKzQzOSwxNCBAQAogICAgICAgICAgSWYgeW91IGhhdmUgYW4gU0dJIEFsdGl4IHdpdGggYW4gYXR0YWNoZWQgU0FCcmljawogICAgICAgICAgc2F5IFkgb3IgTSBoZXJlLCBvdGhlcndpc2Ugc2F5IE4uCiAKK2NvbmZpZyBNU1BFQworCXRyaXN0YXRlICJNZW1vcnkgc3BlY2lhbCBvcGVyYXRpb25zIGRyaXZlciIKKwlkZXBlbmRzIG9uIElBNjQKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhbiBpYTY0IGFuZCB5b3Ugd2FudCB0byBlbmFibGUgbWVtb3J5IHNwZWNpYWwKKwkgIG9wZXJhdGlvbnMgc3VwcG9ydCAoZm9ybWVybHkga25vd24gYXMgZmV0Y2hvcCksIHNheSBZIGhlcmUsCisJICBvdGhlcndpc2Ugc2F5IE4uCisKIHNvdXJjZSAiZHJpdmVycy9zZXJpYWwvS2NvbmZpZyIKIAogY29uZmlnIFVOSVg5OF9QVFlTCkBAIC03MzksNyArNzQ3LDcgQEAKIAogY29uZmlnIFJUQwogCXRyaXN0YXRlICJFbmhhbmNlZCBSZWFsIFRpbWUgQ2xvY2sgU3VwcG9ydCIKLQlkZXBlbmRzIG9uICFQUEMgJiYgIVBBUklTQyAmJiAhSUE2NCAmJiAhTTY4SyAmJiAoIVNQQVJDIHx8IFBDSSkgJiYgIUZSViAmJiAhQVJNCisJZGVwZW5kcyBvbiAhUFBDICYmICFQQVJJU0MgJiYgIUlBNjQgJiYgIU02OEsgJiYgKCFTUEFSQyB8fCBQQ0kpICYmICFGUlYgJiYgIUFSTSAmJiAhU1VQRVJICiAJLS0taGVscC0tLQogCSAgSWYgeW91IHNheSBZIGhlcmUgYW5kIGNyZWF0ZSBhIGNoYXJhY3RlciBzcGVjaWFsIGZpbGUgL2Rldi9ydGMgd2l0aAogCSAgbWFqb3IgbnVtYmVyIDEwIGFuZCBtaW5vciBudW1iZXIgMTM1IHVzaW5nIG1rbm9kICgibWFuIG1rbm9kIiksIHlvdQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCmluZGV4IDhjNmRmYzYyLi5iNTgzZDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL01ha2VmaWxlCkBAIC00Nyw2ICs0Nyw3IEBACiBvYmotJChDT05GSUdfSFZDX0RSSVZFUikJKz0gaHZjX2NvbnNvbGUubwogb2JqLSQoQ09ORklHX1JBV19EUklWRVIpCSs9IHJhdy5vCiBvYmotJChDT05GSUdfU0dJX1NOU0MpCQkrPSBzbnNjLm8gc25zY19ldmVudC5vCitvYmotJChDT05GSUdfTVNQRUMpCQkrPSBtc3BlYy5vCiBvYmotJChDT05GSUdfTU1USU1FUikJCSs9IG1tdGltZXIubwogb2JqLSQoQ09ORklHX1ZJT0NPTlMpCQkrPSB2aW9jb25zLm8KIG9iai0kKENPTkZJR19WSU9UQVBFKQkJKz0gdmlvdGFwZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHBldC5jIGIvZHJpdmVycy9jaGFyL2hwZXQuYwppbmRleCA4YWZiYTMzLi41OGIwZWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHBldC5jCisrKyBiL2RyaXZlcnMvY2hhci9ocGV0LmMKQEAgLTg2OCw4ICs4NjgsOCBAQAogCWRvX2Rpdih0ZW1wLCBwZXJpb2QpOwogCWhwZXRwLT5ocF90aWNrX2ZyZXEgPSB0ZW1wOyAvKiB0aWNrcyBwZXIgc2Vjb25kICovCiAKLQlwcmludGsoS0VSTl9JTkZPICJocGV0JWQ6IGF0IE1NSU8gMHglbHggKHZpcnR1YWwgMHglcCksIElSUSVzIiwKLQkJaHBldHAtPmhwX3doaWNoLCBoZHAtPmhkX3BoeXNfYWRkcmVzcywgaGRwLT5oZF9hZGRyZXNzLAorCXByaW50ayhLRVJOX0lORk8gImhwZXQlZDogYXQgTU1JTyAweCVseCwgSVJRJXMiLAorCQlocGV0cC0+aHBfd2hpY2gsIGhkcC0+aGRfcGh5c19hZGRyZXNzLAogCQlocGV0cC0+aHBfbnRpbWVyID4gMSA/ICJzIiA6ICIiKTsKIAlmb3IgKGkgPSAwOyBpIDwgaHBldHAtPmhwX250aW1lcjsgaSsrKQogCQlwcmludGsoIiVzICVkIiwgaSA+IDAgPyAiLCIgOiAiIiwgaGRwLT5oZF9pcnFbaV0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21lbS5jIGIvZHJpdmVycy9jaGFyL21lbS5jCmluZGV4IDkxN2IyMDQuLjRhYzcwZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tZW0uYworKysgYi9kcml2ZXJzL2NoYXIvbWVtLmMKQEAgLTIzOCw2ICsyMzgsMzIgQEAKIH0KICNlbmRpZgogCisjaWZuZGVmIENPTkZJR19NTVUKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF91bm1hcHBlZF9hcmVhX21lbShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkJCQkgICB1bnNpZ25lZCBsb25nIGxlbiwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBwZ29mZiwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlpZiAoIXZhbGlkX21tYXBfcGh5c19hZGRyX3JhbmdlKHBnb2ZmLCBsZW4pKQorCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC1FSU5WQUw7CisJcmV0dXJuIHBnb2ZmOworfQorCisvKiBjYW4ndCBkbyBhbiBpbi1wbGFjZSBwcml2YXRlIG1hcHBpbmcgaWYgdGhlcmUncyBubyBNTVUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHByaXZhdGVfbWFwcGluZ19vayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlyZXR1cm4gdm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFOworfQorI2Vsc2UKKyNkZWZpbmUgZ2V0X3VubWFwcGVkX2FyZWFfbWVtCU5VTEwKKworc3RhdGljIGlubGluZSBpbnQgcHJpdmF0ZV9tYXBwaW5nX29rKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXJldHVybiAxOworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgbW1hcF9tZW0oc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCiB7CiAJc2l6ZV90IHNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CkBAIC0yNDUsNiArMjcxLDkgQEAKIAlpZiAoIXZhbGlkX21tYXBfcGh5c19hZGRyX3JhbmdlKHZtYS0+dm1fcGdvZmYsIHNpemUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmICghcHJpdmF0ZV9tYXBwaW5nX29rKHZtYSkpCisJCXJldHVybiAtRU5PU1lTOworCiAJdm1hLT52bV9wYWdlX3Byb3QgPSBwaHlzX21lbV9hY2Nlc3NfcHJvdChmaWxlLCB2bWEtPnZtX3Bnb2ZmLAogCQkJCQkJIHNpemUsCiAJCQkJCQkgdm1hLT52bV9wYWdlX3Byb3QpOwpAQCAtNzgyLDYgKzgxMSw3IEBACiAJLndyaXRlCQk9IHdyaXRlX21lbSwKIAkubW1hcAkJPSBtbWFwX21lbSwKIAkub3BlbgkJPSBvcGVuX21lbSwKKwkuZ2V0X3VubWFwcGVkX2FyZWEgPSBnZXRfdW5tYXBwZWRfYXJlYV9tZW0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBrbWVtX2ZvcHMgPSB7CkBAIC03OTAsNiArODIwLDcgQEAKIAkud3JpdGUJCT0gd3JpdGVfa21lbSwKIAkubW1hcAkJPSBtbWFwX2ttZW0sCiAJLm9wZW4JCT0gb3Blbl9rbWVtLAorCS5nZXRfdW5tYXBwZWRfYXJlYSA9IGdldF91bm1hcHBlZF9hcmVhX21lbSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG51bGxfZm9wcyA9IHsKQEAgLTgxNSw2ICs4NDYsMTAgQEAKIAkubW1hcAkJPSBtbWFwX3plcm8sCiB9OwogCisvKgorICogY2FwYWJpbGl0aWVzIGZvciAvZGV2L3plcm8KKyAqIC0gcGVybWl0cyBwcml2YXRlIG1hcHBpbmdzLCAiY29waWVzIiBhcmUgdGFrZW4gb2YgdGhlIHNvdXJjZSBvZiB6ZXJvcworICovCiBzdGF0aWMgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gemVyb19iZGkgPSB7CiAJLmNhcGFiaWxpdGllcwk9IEJESV9DQVBfTUFQX0NPUFksCiB9OwpAQCAtODYyLDkgKzg5NywxMyBAQAogCXN3aXRjaCAoaW1pbm9yKGlub2RlKSkgewogCQljYXNlIDE6CiAJCQlmaWxwLT5mX29wID0gJm1lbV9mb3BzOworCQkJZmlscC0+Zl9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0KKwkJCQkmZGlyZWN0bHlfbWFwcGFibGVfY2Rldl9iZGk7CiAJCQlicmVhazsKIAkJY2FzZSAyOgogCQkJZmlscC0+Zl9vcCA9ICZrbWVtX2ZvcHM7CisJCQlmaWxwLT5mX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPQorCQkJCSZkaXJlY3RseV9tYXBwYWJsZV9jZGV2X2JkaTsKIAkJCWJyZWFrOwogCQljYXNlIDM6CiAJCQlmaWxwLT5mX29wID0gJm51bGxfZm9wczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9tc3BlYy5jIGIvZHJpdmVycy9jaGFyL21zcGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyNmIxZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9tc3BlYy5jCkBAIC0wLDAgKzEsNDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisvKgorICogU04gUGxhdGZvcm0gU3BlY2lhbCBNZW1vcnkgKG1zcGVjKSBTdXBwb3J0CisgKgorICogVGhpcyBkcml2ZXIgZXhwb3J0cyB0aGUgU04gc3BlY2lhbCBtZW1vcnkgKG1zcGVjKSBmYWNpbGl0eSB0byB1c2VyCisgKiBwcm9jZXNzZXMuCisgKiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgbWVtb3J5IG1hZGUgYXZhaWxhYmxlIHRocnUgdGhpcyBkcml2ZXI6CisgKiBmZXRjaG9wcywgdW5jYWNoZWQgYW5kIGNhY2hlZC4KKyAqCisgKiBGZXRjaG9wcyBhcmUgYXRvbWljIG1lbW9yeSBvcGVyYXRpb25zIHRoYXQgYXJlIGltcGxlbWVudGVkIGluIHRoZQorICogbWVtb3J5IGNvbnRyb2xsZXIgb24gU0dJIFNOIGhhcmR3YXJlLgorICoKKyAqIFVuY2FjaGVkIGFyZSB1c2VkIGZvciBtZW1vcnkgd3JpdGUgY29tYmluaW5nIGZlYXR1cmUgb2YgdGhlIGlhNjQKKyAqIGNwdS4KKyAqCisgKiBDYWNoZWQgYXJlIHVzZWQgZm9yIGFyZWFzIG9mIG1lbW9yeSB0aGF0IGFyZSB1c2VkIGFzIGNhY2hlZCBhZGRyZXNzZXMKKyAqIG9uIG91ciBwYXJ0aXRpb24gYW5kIHVzZWQgYXMgdW5jYWNoZWQgYWRkcmVzc2VzIGZyb20gb3RoZXIgcGFydGl0aW9ucy4KKyAqIER1ZSB0byBhIGRlc2lnbiBjb25zdHJhaW50IG9mIHRoZSBTTjIgU2h1YiwgeW91IGNhbiBub3QgaGF2ZSBwcm9jZXNzb3JzCisgKiBvbiB0aGUgc2FtZSBGU0IgcGVyZm9ybSBib3RoIGEgY2FjaGVkIGFuZCB1bmNhY2hlZCByZWZlcmVuY2UgdG8gdGhlCisgKiBzYW1lIGNhY2hlIGxpbmUuICBUaGVzZSBzcGVjaWFsIG1lbW9yeSBjYWNoZWQgcmVnaW9ucyBwcmV2ZW50IHRoZQorICoga2VybmVsIGZyb20gZXZlciBkcm9wcGluZyBpbiBhIFRMQiBlbnRyeSBhbmQgdGhlcmVmb3JlIHByZXZlbnQgdGhlCisgKiBwcm9jZXNzb3IgZnJvbSBldmVyIHNwZWN1bGF0aW5nIGEgY2FjaGUgbGluZSBmcm9tIHRoaXMgcGFnZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbnVtYS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS91bmNhY2hlZC5oPgorI2luY2x1ZGUgPGFzbS9zbi9hZGRycy5oPgorI2luY2x1ZGUgPGFzbS9zbi9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL3NuL21zcGVjLmg+CisjaW5jbHVkZSA8YXNtL3NuL3NuX2NwdWlkLmg+CisjaW5jbHVkZSA8YXNtL3NuL2lvLmg+CisjaW5jbHVkZSA8YXNtL3NuL2J0ZS5oPgorI2luY2x1ZGUgPGFzbS9zbi9zaHViaW8uaD4KKworCisjZGVmaW5lIEZFVENIT1BfSUQJIlNHSSBGZXRjaG9wLCIKKyNkZWZpbmUgQ0FDSEVEX0lECSJDYWNoZWQsIgorI2RlZmluZSBVTkNBQ0hFRF9JRAkiVW5jYWNoZWQiCisjZGVmaW5lIFJFVklTSU9OCSI0LjAiCisjZGVmaW5lIE1TUEVDX0JBU0VOQU1FCSJtc3BlYyIKKworLyoKKyAqIFBhZ2UgdHlwZXMgYWxsb2NhdGVkIGJ5IHRoZSBkZXZpY2UuCisgKi8KK2VudW0geworCU1TUEVDX0ZFVENIT1AgPSAxLAorCU1TUEVDX0NBQ0hFRCwKKwlNU1BFQ19VTkNBQ0hFRAorfTsKKworc3RhdGljIGludCBpc19zbjI7CisKKy8qCisgKiBPbmUgb2YgdGhlc2Ugc3RydWN0dXJlcyBpcyBhbGxvY2F0ZWQgd2hlbiBhbiBtc3BlYyByZWdpb24gaXMgbW1hcGVkLiBUaGUKKyAqIHN0cnVjdHVyZSBpcyBwb2ludGVkIHRvIGJ5IHRoZSB2bWEtPnZtX3ByaXZhdGVfZGF0YSBmaWVsZCBpbiB0aGUgdm1hIHN0cnVjdC4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcmVjb3JkIHRoZSBhZGRyZXNzZXMgb2YgdGhlIG1zcGVjIHBhZ2VzLgorICovCitzdHJ1Y3Qgdm1hX2RhdGEgeworCWF0b21pY190IHJlZmNudDsJLyogTnVtYmVyIG9mIHZtYXMgc2hhcmluZyB0aGUgZGF0YS4gKi8KKwlzcGlubG9ja190IGxvY2s7CS8qIFNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHZtYS4gKi8KKwlpbnQgY291bnQ7CQkvKiBOdW1iZXIgb2YgcGFnZXMgYWxsb2NhdGVkLiAqLworCWludCB0eXBlOwkJLyogVHlwZSBvZiBwYWdlcyBhbGxvY2F0ZWQuICovCisJdW5zaWduZWQgbG9uZyBtYWRkclswXTsJLyogQXJyYXkgb2YgTVNQRUMgYWRkcmVzc2VzLiAqLworfTsKKworLyogdXNlZCBvbiBzaHViMiB0byBjbGVhciBGT1AgY2FjaGUgaW4gdGhlIEhVQiAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2NyYXRjaF9wYWdlW01BWF9OVU1OT0RFU107CisjZGVmaW5lIFNIMl9BTU9fQ0FDSEVfRU5UUklFUwk0CisKK3N0YXRpYyBpbmxpbmUgaW50Cittc3BlY196ZXJvX2Jsb2NrKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IGxlbikKK3sKKwlpbnQgc3RhdHVzOworCisJaWYgKGlzX3NuMikgeworCQlpZiAoaXNfc2h1YjIoKSkgeworCQkJaW50IG5pZDsKKwkJCXZvaWQgKnA7CisJCQlpbnQgaTsKKworCQkJbmlkID0gbmFzaWRfdG9fY25vZGVpZChnZXRfbm9kZV9udW1iZXIoX19wYShhZGRyKSkpOworCQkJcCA9ICh2b2lkICopVE9fQU1PKHNjcmF0Y2hfcGFnZVtuaWRdKTsKKworCQkJZm9yIChpPTA7IGkgPCBTSDJfQU1PX0NBQ0hFX0VOVFJJRVM7IGkrKykgeworCQkJCUZFVENIT1BfTE9BRF9PUChwLCBGRVRDSE9QX0xPQUQpOworCQkJCXAgKz0gRkVUQ0hPUF9WQVJfU0laRTsKKwkJCX0KKwkJfQorCisJCXN0YXR1cyA9IGJ0ZV9jb3B5KDAsIGFkZHIgJiB+X19JQTY0X1VOQ0FDSEVEX09GRlNFVCwgbGVuLAorCQkJCSAgQlRFX1dBQ1FVSVJFIHwgQlRFX1pFUk9fRklMTCwgTlVMTCk7CisJfSBlbHNlIHsKKwkJbWVtc2V0KChjaGFyICopIGFkZHIsIDAsIGxlbik7CisJCXN0YXR1cyA9IDA7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBtc3BlY19vcGVuCisgKgorICogQ2FsbGVkIHdoZW4gYSBkZXZpY2UgbWFwcGluZyBpcyBjcmVhdGVkIGJ5IGEgbWVhbnMgb3RoZXIgdGhhbiBtbWFwCisgKiAodmlhIGZvcmssIGV0Yy4pLiAgSW5jcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IG9uIHRoZSB1bmRlcmx5aW5nCisgKiBtc3BlYyBkYXRhIHNvIGl0IGlzIG5vdCBmcmVlZCBwcmVtYXR1cmVseS4KKyAqLworc3RhdGljIHZvaWQKK21zcGVjX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHZtYV9kYXRhICp2ZGF0YTsKKworCXZkYXRhID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisJYXRvbWljX2luYygmdmRhdGEtPnJlZmNudCk7Cit9CisKKy8qCisgKiBtc3BlY19jbG9zZQorICoKKyAqIENhbGxlZCB3aGVuIHVubWFwcGluZyBhIGRldmljZSBtYXBwaW5nLiBGcmVlcyBhbGwgbXNwZWMgcGFnZXMKKyAqIGJlbG9uZ2luZyB0byB0aGUgdm1hLgorICovCitzdGF0aWMgdm9pZAorbXNwZWNfY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHZtYV9kYXRhICp2ZGF0YTsKKwlpbnQgaSwgcGFnZXMsIHJlc3VsdCwgdmRhdGFfc2l6ZTsKKworCXZkYXRhID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZ2ZGF0YS0+cmVmY250KSkKKwkJcmV0dXJuOworCisJcGFnZXMgPSAodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUOworCXZkYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHZtYV9kYXRhKSArIHBhZ2VzICogc2l6ZW9mKGxvbmcpOworCWZvciAoaSA9IDA7IGkgPCBwYWdlczsgaSsrKSB7CisJCWlmICh2ZGF0YS0+bWFkZHJbaV0gPT0gMCkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBDbGVhciB0aGUgcGFnZSBiZWZvcmUgc3RpY2tpbmcgaXQgYmFjaworCQkgKiBpbnRvIHRoZSBwb29sLgorCQkgKi8KKwkJcmVzdWx0ID0gbXNwZWNfemVyb19ibG9jayh2ZGF0YS0+bWFkZHJbaV0sIFBBR0VfU0laRSk7CisJCWlmICghcmVzdWx0KQorCQkJdW5jYWNoZWRfZnJlZV9wYWdlKHZkYXRhLT5tYWRkcltpXSk7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1zcGVjX2Nsb3NlKCk6ICIKKwkJCSAgICAgICAiZmFpbGVkIHRvIHplcm8gcGFnZSAlaVxuIiwKKwkJCSAgICAgICByZXN1bHQpOworCX0KKworCWlmICh2ZGF0YV9zaXplIDw9IFBBR0VfU0laRSkKKwkJa2ZyZWUodmRhdGEpOworCWVsc2UKKwkJdmZyZWUodmRhdGEpOworfQorCisKKy8qCisgKiBtc3BlY19ub3BmbgorICoKKyAqIENyZWF0ZXMgYSBtc3BlYyBwYWdlIGFuZCBtYXBzIGl0IHRvIHVzZXIgc3BhY2UuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCittc3BlY19ub3BmbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXVuc2lnbmVkIGxvbmcgcGFkZHIsIG1hZGRyOworCXVuc2lnbmVkIGxvbmcgcGZuOworCWludCBpbmRleDsKKwlzdHJ1Y3Qgdm1hX2RhdGEgKnZkYXRhID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisKKwlpbmRleCA9IChhZGRyZXNzIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKKwltYWRkciA9ICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nKSB2ZGF0YS0+bWFkZHJbaW5kZXhdOworCWlmIChtYWRkciA9PSAwKSB7CisJCW1hZGRyID0gdW5jYWNoZWRfYWxsb2NfcGFnZShudW1hX25vZGVfaWQoKSk7CisJCWlmIChtYWRkciA9PSAwKQorCQkJcmV0dXJuIE5PUEZOX09PTTsKKworCQlzcGluX2xvY2soJnZkYXRhLT5sb2NrKTsKKwkJaWYgKHZkYXRhLT5tYWRkcltpbmRleF0gPT0gMCkgeworCQkJdmRhdGEtPmNvdW50Kys7CisJCQl2ZGF0YS0+bWFkZHJbaW5kZXhdID0gbWFkZHI7CisJCX0gZWxzZSB7CisJCQl1bmNhY2hlZF9mcmVlX3BhZ2UobWFkZHIpOworCQkJbWFkZHIgPSB2ZGF0YS0+bWFkZHJbaW5kZXhdOworCQl9CisJCXNwaW5fdW5sb2NrKCZ2ZGF0YS0+bG9jayk7CisJfQorCisJaWYgKHZkYXRhLT50eXBlID09IE1TUEVDX0ZFVENIT1ApCisJCXBhZGRyID0gVE9fQU1PKG1hZGRyKTsKKwllbHNlCisJCXBhZGRyID0gX19wYShUT19DQUMobWFkZHIpKTsKKworCXBmbiA9IHBhZGRyID4+IFBBR0VfU0hJRlQ7CisKKwlyZXR1cm4gcGZuOworfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IG1zcGVjX3ZtX29wcyA9IHsKKwkub3BlbiA9IG1zcGVjX29wZW4sCisJLmNsb3NlID0gbXNwZWNfY2xvc2UsCisJLm5vcGZuID0gbXNwZWNfbm9wZm4KK307CisKKy8qCisgKiBtc3BlY19tbWFwCisgKgorICogQ2FsbGVkIHdoZW4gbW1hcGluZyB0aGUgZGV2aWNlLiAgSW5pdGlhbGl6ZXMgdGhlIHZtYSB3aXRoIGEgZmF1bHQgaGFuZGxlcgorICogYW5kIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgbmVjZXNzYXJ5IHRvIGFsbG9jYXRlLCB0cmFjaywgYW5kIGZyZWUgdGhlCisgKiB1bmRlcmx5aW5nIHBhZ2VzLgorICovCitzdGF0aWMgaW50Cittc3BlY19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgaW50IHR5cGUpCit7CisJc3RydWN0IHZtYV9kYXRhICp2ZGF0YTsKKwlpbnQgcGFnZXMsIHZkYXRhX3NpemU7CisKKwlpZiAodm1hLT52bV9wZ29mZiAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgPT0gMCkKKwkJcmV0dXJuIC1FUEVSTTsKKworCXBhZ2VzID0gKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKKwl2ZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2bWFfZGF0YSkgKyBwYWdlcyAqIHNpemVvZihsb25nKTsKKwlpZiAodmRhdGFfc2l6ZSA8PSBQQUdFX1NJWkUpCisJCXZkYXRhID0ga21hbGxvYyh2ZGF0YV9zaXplLCBHRlBfS0VSTkVMKTsKKwllbHNlCisJCXZkYXRhID0gdm1hbGxvYyh2ZGF0YV9zaXplKTsKKwlpZiAoIXZkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQodmRhdGEsIDAsIHZkYXRhX3NpemUpOworCisJdmRhdGEtPnR5cGUgPSB0eXBlOworCXNwaW5fbG9ja19pbml0KCZ2ZGF0YS0+bG9jayk7CisJdmRhdGEtPnJlZmNudCA9IEFUT01JQ19JTklUKDEpOworCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gdmRhdGE7CisKKwl2bWEtPnZtX2ZsYWdzIHw9IChWTV9JTyB8IFZNX0xPQ0tFRCB8IFZNX1JFU0VSVkVEIHwgVk1fUEZOTUFQKTsKKwlpZiAodmRhdGEtPnR5cGUgPT0gTVNQRUNfRkVUQ0hPUCB8fCB2ZGF0YS0+dHlwZSA9PSBNU1BFQ19VTkNBQ0hFRCkKKwkJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKwl2bWEtPnZtX29wcyA9ICZtc3BlY192bV9vcHM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZmV0Y2hvcF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlyZXR1cm4gbXNwZWNfbW1hcChmaWxlLCB2bWEsIE1TUEVDX0ZFVENIT1ApOworfQorCitzdGF0aWMgaW50CitjYWNoZWRfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJcmV0dXJuIG1zcGVjX21tYXAoZmlsZSwgdm1hLCBNU1BFQ19DQUNIRUQpOworfQorCitzdGF0aWMgaW50Cit1bmNhY2hlZF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlyZXR1cm4gbXNwZWNfbW1hcChmaWxlLCB2bWEsIE1TUEVDX1VOQ0FDSEVEKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZmV0Y2hvcF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5tbWFwID0gZmV0Y2hvcF9tbWFwCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgZmV0Y2hvcF9taXNjZGV2ID0geworCS5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZSA9ICJzZ2lfZmV0Y2hvcCIsCisJLmZvcHMgPSAmZmV0Y2hvcF9mb3BzCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjYWNoZWRfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubW1hcCA9IGNhY2hlZF9tbWFwCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgY2FjaGVkX21pc2NkZXYgPSB7CisJLm1pbm9yID0gTUlTQ19EWU5BTUlDX01JTk9SLAorCS5uYW1lID0gIm1zcGVjX2NhY2hlZCIsCisJLmZvcHMgPSAmY2FjaGVkX2ZvcHMKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVuY2FjaGVkX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm1tYXAgPSB1bmNhY2hlZF9tbWFwCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgdW5jYWNoZWRfbWlzY2RldiA9IHsKKwkubWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgPSAibXNwZWNfdW5jYWNoZWQiLAorCS5mb3BzID0gJnVuY2FjaGVkX2ZvcHMKK307CisKKy8qCisgKiBtc3BlY19pbml0CisgKgorICogQ2FsbGVkIGF0IGJvb3QgdGltZSB0byBpbml0aWFsaXplIHRoZSBtc3BlYyBmYWNpbGl0eS4KKyAqLworc3RhdGljIGludCBfX2luaXQKK21zcGVjX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCWludCBuaWQ7CisKKwkvKgorCSAqIFRoZSBmZXRjaG9wIGRldmljZSBvbmx5IHdvcmtzIG9uIFNOMiBoYXJkd2FyZSwgdW5jYWNoZWQgYW5kIGNhY2hlZAorCSAqIG1lbW9yeSBkcml2ZXJzIHNob3VsZCBib3RoIGJlIHZhbGlkIG9uIGFsbCBpYTY0IGhhcmR3YXJlCisJICovCisJaWYgKGlhNjRfcGxhdGZvcm1faXMoInNuMiIpKSB7CisJCWlzX3NuMiA9IDE7CisJCWlmIChpc19zaHViMigpKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CisJCQkJaW50IGFjdHVhbF9uaWQ7CisJCQkJaW50IG5hc2lkOworCQkJCXVuc2lnbmVkIGxvbmcgcGh5czsKKworCQkJCXNjcmF0Y2hfcGFnZVtuaWRdID0gdW5jYWNoZWRfYWxsb2NfcGFnZShuaWQpOworCQkJCWlmIChzY3JhdGNoX3BhZ2VbbmlkXSA9PSAwKQorCQkJCQlnb3RvIGZyZWVfc2NyYXRjaF9wYWdlczsKKwkJCQlwaHlzID0gX19wYShzY3JhdGNoX3BhZ2VbbmlkXSk7CisJCQkJbmFzaWQgPSBnZXRfbm9kZV9udW1iZXIocGh5cyk7CisJCQkJYWN0dWFsX25pZCA9IG5hc2lkX3RvX2Nub2RlaWQobmFzaWQpOworCQkJCWlmIChhY3R1YWxfbmlkICE9IG5pZCkKKwkJCQkJZ290byBmcmVlX3NjcmF0Y2hfcGFnZXM7CisJCQl9CisJCX0KKworCQlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZmZXRjaG9wX21pc2NkZXYpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBkZXZpY2UgJWlcbiIsCisJCQkgICAgICAgRkVUQ0hPUF9JRCwgcmV0KTsKKwkJCWdvdG8gZnJlZV9zY3JhdGNoX3BhZ2VzOworCQl9CisJfQorCXJldCA9IG1pc2NfcmVnaXN0ZXIoJmNhY2hlZF9taXNjZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBkZXZpY2UgJWlcbiIsCisJCSAgICAgICBDQUNIRURfSUQsIHJldCk7CisJCWlmIChpc19zbjIpCisJCQltaXNjX2RlcmVnaXN0ZXIoJmZldGNob3BfbWlzY2Rldik7CisJCWdvdG8gZnJlZV9zY3JhdGNoX3BhZ2VzOworCX0KKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZ1bmNhY2hlZF9taXNjZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBkZXZpY2UgJWlcbiIsCisJCSAgICAgICBVTkNBQ0hFRF9JRCwgcmV0KTsKKwkJbWlzY19kZXJlZ2lzdGVyKCZjYWNoZWRfbWlzY2Rldik7CisJCWlmIChpc19zbjIpCisJCQltaXNjX2RlcmVnaXN0ZXIoJmZldGNob3BfbWlzY2Rldik7CisJCWdvdG8gZnJlZV9zY3JhdGNoX3BhZ2VzOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzICVzIGluaXRpYWxpemVkIGRldmljZXM6ICVzICVzICVzXG4iLAorCSAgICAgICBNU1BFQ19CQVNFTkFNRSwgUkVWSVNJT04sIGlzX3NuMiA/IEZFVENIT1BfSUQgOiAiIiwKKwkgICAgICAgQ0FDSEVEX0lELCBVTkNBQ0hFRF9JRCk7CisKKwlyZXR1cm4gMDsKKworIGZyZWVfc2NyYXRjaF9wYWdlczoKKwlmb3JfZWFjaF9ub2RlKG5pZCkgeworCQlpZiAoc2NyYXRjaF9wYWdlW25pZF0gIT0gMCkKKwkJCXVuY2FjaGVkX2ZyZWVfcGFnZShzY3JhdGNoX3BhZ2VbbmlkXSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorbXNwZWNfZXhpdCh2b2lkKQoreworCWludCBuaWQ7CisKKwltaXNjX2RlcmVnaXN0ZXIoJnVuY2FjaGVkX21pc2NkZXYpOworCW1pc2NfZGVyZWdpc3RlcigmY2FjaGVkX21pc2NkZXYpOworCWlmIChpc19zbjIpIHsKKwkJbWlzY19kZXJlZ2lzdGVyKCZmZXRjaG9wX21pc2NkZXYpOworCisJCWZvcl9lYWNoX25vZGUobmlkKSB7CisJCQlpZiAoc2NyYXRjaF9wYWdlW25pZF0gIT0gMCkKKwkJCQl1bmNhY2hlZF9mcmVlX3BhZ2Uoc2NyYXRjaF9wYWdlW25pZF0pOworCQl9CisJfQorfQorCittb2R1bGVfaW5pdChtc3BlY19pbml0KTsKK21vZHVsZV9leGl0KG1zcGVjX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTaWxpY29uIEdyYXBoaWNzLCBJbmMuIDxsaW51eC1hbHRpeEBzZ2kuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIFNHSSBTTiBzcGVjaWFsIG1lbW9yeSBvcGVyYXRpb25zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnCmluZGV4IGZmZjg5YzIuLmYxMTRkN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci93YXRjaGRvZy9LY29uZmlnCkBAIC01MTAsNiArNTEwLDE0IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzaHdkdC4KIAorY29uZmlnIFNIX1dEVF9NTUFQCisJYm9vbCAiQWxsb3cgbW1hcCBvZiBTSCBXRFQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTSF9XRFQKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdXNlciBhcHBsaWNhdGlvbnMgd2lsbCBiZSBhYmxlIHRvIG1tYXAgdGhlCisJICBXRFQvQ1BHIHJlZ2lzdGVycy4KKyMKICMgU1BBUkM2NCBBcmNoaXRlY3R1cmUKIAogY29uZmlnIFdBVENIRE9HX0NQMVhYWApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3dhdGNoZG9nL3Nod2R0LmMgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2h3ZHQuYwppbmRleCAxMzU1MDM4Li5lNWI4YzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2h3ZHQuYworKysgYi9kcml2ZXJzL2NoYXIvd2F0Y2hkb2cvc2h3ZHQuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLQorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vd2F0Y2hkb2cuaD4KQEAgLTEyNSw3ICsxMjUsNiBAQAogCiAvKioKICAqIAlzaF93ZHRfc3RvcCAtIFN0b3AgdGhlIFdhdGNoZG9nCi0gKgogICogCVN0b3BzIHRoZSB3YXRjaGRvZy4KICAqLwogc3RhdGljIHZvaWQgc2hfd2R0X3N0b3Aodm9pZCkKQEAgLTE0MSwyMiArMTQwLDIwIEBACiAKIC8qKgogICogCXNoX3dkdF9rZWVwYWxpdmUgLSBLZWVwIHRoZSBVc2Vyc3BhY2UgV2F0Y2hkb2cgQWxpdmUKLSAqCiAgKiAJVGhlIFVzZXJzcGFjZSB3YXRjaGRvZyBnb3QgYSBLZWVwQWxpdmU6IHNjaGVkdWxlIHRoZSBuZXh0IGhlYXJ0YmVhdC4KICAqLwotc3RhdGljIHZvaWQgc2hfd2R0X2tlZXBhbGl2ZSh2b2lkKQorc3RhdGljIGlubGluZSB2b2lkIHNoX3dkdF9rZWVwYWxpdmUodm9pZCkKIHsKIAluZXh0X2hlYXJ0YmVhdCA9IGppZmZpZXMgKyAoaGVhcnRiZWF0ICogSFopOwogfQogCiAvKioKICAqIAlzaF93ZHRfc2V0X2hlYXJ0YmVhdCAtIFNldCB0aGUgVXNlcnNwYWNlIFdhdGNoZG9nIGhlYXJ0YmVhdAotICoKICAqIAlTZXQgdGhlIFVzZXJzcGFjZSBXYXRjaGRvZyBoZWFydGJlYXQKICAqLwogc3RhdGljIGludCBzaF93ZHRfc2V0X2hlYXJ0YmVhdChpbnQgdCkKIHsKLQlpZiAoKHQgPCAxKSB8fCAodCA+IDM2MDApKSAvKiBhcmJpdHJhcnkgdXBwZXIgbGltaXQgKi8KKwlpZiAodW5saWtlbHkoKHQgPCAxKSB8fCAodCA+IDM2MDApKSkgLyogYXJiaXRyYXJ5IHVwcGVyIGxpbWl0ICovCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaGVhcnRiZWF0ID0gdDsKQEAgLTE2NSw3ICsxNjIsNiBAQAogCiAvKioKICAqIAlzaF93ZHRfcGluZyAtIFBpbmcgdGhlIFdhdGNoZG9nCi0gKgogICoJQGRhdGE6IFVudXNlZAogICoKICAqIAlDbGVhcnMgb3ZlcmZsb3cgYml0LCByZXNldHMgdGltZXIgY291bnRlci4KQEAgLTE4MiwxNCArMTc4LDEzIEBACiAJCXNoX3dkdF93cml0ZV9jbnQoMCk7CiAKIAkJbW9kX3RpbWVyKCZ0aW1lciwgbmV4dF9waW5nX3BlcmlvZChjbG9ja19kaXZpc2lvbl9yYXRpbykpOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJIZWFydGJlYXQgbG9zdCEgV2lsbCBub3QgcGluZyB0aGUgd2F0Y2hkb2dcbiIpOwotCX0KKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkhlYXJ0YmVhdCBsb3N0ISBXaWxsIG5vdCBwaW5nICIKKwkJICAgICAgICJ0aGUgd2F0Y2hkb2dcbiIpOwogfQogCiAvKioKICAqIAlzaF93ZHRfb3BlbiAtIE9wZW4gdGhlIERldmljZQotICoKICAqIAlAaW5vZGU6IGlub2RlIG9mIGRldmljZQogICogCUBmaWxlOiBmaWxlIGhhbmRsZSBvZiBkZXZpY2UKICAqCkBAIC0yMDksNyArMjA0LDYgQEAKIAogLyoqCiAgKiAJc2hfd2R0X2Nsb3NlIC0gQ2xvc2UgdGhlIERldmljZQotICoKICAqIAlAaW5vZGU6IGlub2RlIG9mIGRldmljZQogICogCUBmaWxlOiBmaWxlIGhhbmRsZSBvZiBkZXZpY2UKICAqCkBAIC0yMjAsNyArMjE0LDggQEAKIAlpZiAoc2h3ZHRfZXhwZWN0X2Nsb3NlID09IDQyKSB7CiAJCXNoX3dkdF9zdG9wKCk7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCBQRlggIlVuZXhwZWN0ZWQgY2xvc2UsIG5vdCBzdG9wcGluZyB3YXRjaGRvZyFcbiIpOworCQlwcmludGsoS0VSTl9DUklUIFBGWCAiVW5leHBlY3RlZCBjbG9zZSwgbm90ICIKKwkJICAgICAgICJzdG9wcGluZyB3YXRjaGRvZyFcbiIpOwogCQlzaF93ZHRfa2VlcGFsaXZlKCk7CiAJfQogCkBAIC0yMzIsNyArMjI3LDYgQEAKIAogLyoqCiAgKiAJc2hfd2R0X3dyaXRlIC0gV3JpdGUgdG8gRGV2aWNlCi0gKgogICogCUBmaWxlOiBmaWxlIGhhbmRsZSBvZiBkZXZpY2UKICAqIAlAYnVmOiBidWZmZXIgdG8gd3JpdGUKICAqIAlAY291bnQ6IGxlbmd0aCBvZiBidWZmZXIKQEAgLTI2NCw4ICsyNTgsNTYgQEAKIH0KIAogLyoqCi0gKiAJc2hfd2R0X2lvY3RsIC0gUXVlcnkgRGV2aWNlCisgKiAJc2hfd2R0X21tYXAgLSBtYXAgV0RUL0NQRyByZWdpc3RlcnMgaW50byB1c2Vyc3BhY2UKKyAqIAlAZmlsZTogZmlsZSBzdHJ1Y3R1cmUgZm9yIHRoZSBkZXZpY2UKKyAqIAlAdm1hOiBWTUEgdG8gbWFwIHRoZSByZWdpc3RlcnMgaW50bwogICoKKyAqIAlBIHNpbXBsZSBtbWFwKCkgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBjb3JuZXIgY2FzZXMgd2hlcmUgdGhlIGNvdW50ZXIKKyAqIAluZWVkcyB0byBiZSBtYXBwZWQgaW4gdXNlcnNwYWNlIGRpcmVjdGx5LiBEdWUgdG8gdGhlIHJlbGF0aXZlbHkgc21hbGwKKyAqIAlzaXplIG9mIHRoZSBhcmVhLCBuZWlnaGJvdXJpbmcgcmVnaXN0ZXJzIG5vdCBuZWNlc3NhcmlseSB0aWVkIHRvIHRoZQorICogCUNQRyB3aWxsIGFsc28gYmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSByZWdpc3RlciBwYWdlLCBzbyB0aGlzIHJlbWFpbnMKKyAqIAljb25maWd1cmFibGUgZm9yIHVzZXJzIHRoYXQgcmVhbGx5IGtub3cgd2hhdCB0aGV5J3JlIGRvaW5nLgorICoKKyAqCUFkZGl0aW9uYWx5LCB0aGUgcmVnaXN0ZXIgcGFnZSBtYXBzIGluIHRoZSBDUEcgcmVnaXN0ZXIgYmFzZSByZWxhdGl2ZQorICoJdG8gdGhlIG5lYXJlc3QgcGFnZS1hbGlnbmVkIGJvdW5kYXJ5LCB3aGljaCByZXF1aXJlcyB0aGF0IHVzZXJzcGFjZSBkbworICoJdGhlIGFwcHJvcHJpYXRlIENQVSBzdWJ0eXBlIG1hdGggZm9yIGNhbGN1bGF0aW5nIHRoZSBwYWdlIG9mZnNldCBmb3IKKyAqCXRoZSBjb3VudGVyIHZhbHVlLgorICovCitzdGF0aWMgaW50IHNoX3dkdF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpbnQgcmV0ID0gLUVOT1NZUzsKKworI2lmZGVmIENPTkZJR19TSF9XRFRfTU1BUAorCXVuc2lnbmVkIGxvbmcgYWRkcjsKKworCS8qIE9ubHkgc3VwcG9ydCB0aGUgc2ltcGxlIGNhc2VzIHdoZXJlIHdlIG1hcCBpbiBhIHJlZ2lzdGVyIHBhZ2UuICovCisJaWYgKCgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSAhPSBQQUdFX1NJWkUpIHx8IHZtYS0+dm1fcGdvZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBQaWNrIFdUQ05UIGFzIHRoZSBzdGFydCwgaXQncyB1c3VhbGx5IHRoZSBmaXJzdCByZWdpc3RlciBhZnRlciB0aGUKKwkgKiBGUlFDUiwgYW5kIG5laXRoZXIgb25lIGFyZSBnZW5lcmFsbHkgcGFnZS1hbGlnbmVkIG91dCBvZiB0aGUgYm94LgorCSAqLworCWFkZHIgPSBXVENOVCAmIH4oUEFHRV9TSVpFIC0gMSk7CisKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisKKwlpZiAoaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgYWRkciA+PiBQQUdFX1NISUZULAorCQkJICAgICAgIFBBR0VfU0laRSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIiVzOiBpb19yZW1hcF9wZm5fcmFuZ2UgZmFpbGVkXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJcmV0ID0gMDsKKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiAJc2hfd2R0X2lvY3RsIC0gUXVlcnkgRGV2aWNlCiAgKiAJQGlub2RlOiBpbm9kZSBvZiBkZXZpY2UKICAqIAlAZmlsZTogZmlsZSBoYW5kbGUgb2YgZGV2aWNlCiAgKiAJQGNtZDogd2F0Y2hkb2cgY29tbWFuZApAQCAtMzI2LDcgKzM2OCw2IEBACiAKIC8qKgogICogCXNoX3dkdF9ub3RpZnlfc3lzIC0gTm90aWZpZXIgSGFuZGxlcgotICoKICAqIAlAdGhpczogbm90aWZpZXIgYmxvY2sKICAqIAlAY29kZTogbm90aWZpZXIgZXZlbnQKICAqIAlAdW51c2VkOiB1bnVzZWQKQEAgLTMzNyw5ICszNzgsOCBAQAogc3RhdGljIGludCBzaF93ZHRfbm90aWZ5X3N5cyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqdW51c2VkKQogewotCWlmIChjb2RlID09IFNZU19ET1dOIHx8IGNvZGUgPT0gU1lTX0hBTFQpIHsKKwlpZiAoY29kZSA9PSBTWVNfRE9XTiB8fCBjb2RlID09IFNZU19IQUxUKQogCQlzaF93ZHRfc3RvcCgpOwotCX0KIAogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KQEAgLTM1MSwxMCArMzkxLDEyIEBACiAJLmlvY3RsCQk9IHNoX3dkdF9pb2N0bCwKIAkub3BlbgkJPSBzaF93ZHRfb3BlbiwKIAkucmVsZWFzZQk9IHNoX3dkdF9jbG9zZSwKKwkubW1hcAkJPSBzaF93ZHRfbW1hcCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBzaF93ZHRfaW5mbyA9IHsKLQkub3B0aW9ucwkJPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lDQ0xPU0UsCisJLm9wdGlvbnMJCT0gV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX1NFVFRJTUVPVVQgfAorCQkJCSAgV0RJT0ZfTUFHSUNDTE9TRSwKIAkuZmlybXdhcmVfdmVyc2lvbgk9IDEsCiAJLmlkZW50aXR5CQk9ICJTSCBXRFQiLAogfTsKQEAgLTM3MSw3ICs0MTMsNiBAQAogCiAvKioKICAqIAlzaF93ZHRfaW5pdCAtIEluaXRpYWxpemUgbW9kdWxlCi0gKgogICogCVJlZ2lzdGVycyB0aGUgZGV2aWNlIGFuZCBub3RpZmllciBoYW5kbGVyLiBBY3R1YWwgZGV2aWNlCiAgKiAJaW5pdGlhbGl6YXRpb24gaXMgaGFuZGxlZCBieSBzaF93ZHRfb3BlbigpLgogICovCkBAIC0zODEsMTUgKzQyMiwxNSBAQAogCiAJaWYgKChjbG9ja19kaXZpc2lvbl9yYXRpbyA8IDB4NSkgfHwgKGNsb2NrX2RpdmlzaW9uX3JhdGlvID4gMHg3KSkgewogCQljbG9ja19kaXZpc2lvbl9yYXRpbyA9IFdUQ1NSX0NLU180MDk2OwotCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiY2xvY2tfZGl2aXNpb25fcmF0aW8gdmFsdWUgbXVzdCBiZSAweDU8PXg8PTB4NywgdXNpbmcgJWRcbiIsCi0JCQljbG9ja19kaXZpc2lvbl9yYXRpbyk7CisJCXByaW50ayhLRVJOX0lORk8gUEZYICJjbG9ja19kaXZpc2lvbl9yYXRpbyB2YWx1ZSBtdXN0ICIKKwkJICAgICAgICJiZSAweDU8PXg8PTB4NywgdXNpbmcgJWRcbiIsIGNsb2NrX2RpdmlzaW9uX3JhdGlvKTsKIAl9CiAKLQlpZiAoc2hfd2R0X3NldF9oZWFydGJlYXQoaGVhcnRiZWF0KSkKLQl7CisJcmMgPSBzaF93ZHRfc2V0X2hlYXJ0YmVhdChoZWFydGJlYXQpOworCWlmICh1bmxpa2VseShyYykpIHsKIAkJaGVhcnRiZWF0ID0gV0FUQ0hET0dfSEVBUlRCRUFUOwotCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiaGVhcnRiZWF0IHZhbHVlIG11c3QgYmUgMTw9eDw9MzYwMCwgdXNpbmcgJWRcbiIsCi0JCQloZWFydGJlYXQpOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiaGVhcnRiZWF0IHZhbHVlIG11c3QgIgorCQkgICAgICAgImJlIDE8PXg8PTM2MDAsIHVzaW5nICVkXG4iLCBoZWFydGJlYXQpOwogCX0KIAogCWluaXRfdGltZXIoJnRpbWVyKTsKQEAgLTM5NywxNSArNDM4LDE2IEBACiAJdGltZXIuZGF0YSA9IDA7CiAKIAlyYyA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmc2hfd2R0X25vdGlmaWVyKTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FuJ3QgcmVnaXN0ZXIgcmVib290IG5vdGlmaWVyIChlcnI9JWQpXG4iLCByYyk7CisJaWYgKHVubGlrZWx5KHJjKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCByZWdpc3RlciByZWJvb3Qgbm90aWZpZXIgKGVycj0lZClcbiIsCisJCSAgICAgICByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKIAlyYyA9IG1pc2NfcmVnaXN0ZXIoJnNoX3dkdF9taXNjZGV2KTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ2FuJ3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKLQkJCXNoX3dkdF9taXNjZGV2Lm1pbm9yLCByYyk7CisJaWYgKHVubGlrZWx5KHJjKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDYW4ndCByZWdpc3RlciBtaXNjZGV2IG9uICIKKwkJICAgICAgICJtaW5vcj0lZCAoZXJyPSVkKVxuIiwgc2hfd2R0X21pc2NkZXYubWlub3IsIHJjKTsKIAkJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnNoX3dkdF9ub3RpZmllcik7CiAJCXJldHVybiByYzsKIAl9CkBAIC00MTgsNyArNDYwLDYgQEAKIAogLyoqCiAgKiAJc2hfd2R0X2V4aXQgLSBEZWluaXRpYWxpemUgbW9kdWxlCi0gKgogICogCVVucmVnaXN0ZXJzIHRoZSBkZXZpY2UgYW5kIG5vdGlmaWVyIGhhbmRsZXIuIEFjdHVhbCBkZXZpY2UKICAqIAlkZWluaXRpYWxpemF0aW9uIGlzIGhhbmRsZWQgYnkgc2hfd2R0X2Nsb3NlKCkuCiAgKi8KQEAgLTQzNCwxNCArNDc1LDEzIEBACiBNT0RVTEVfQUxJQVNfTUlTQ0RFVihXQVRDSERPR19NSU5PUik7CiAKIG1vZHVsZV9wYXJhbShjbG9ja19kaXZpc2lvbl9yYXRpbywgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoY2xvY2tfZGl2aXNpb25fcmF0aW8sICJDbG9jayBkaXZpc2lvbiByYXRpby4gVmFsaWQgcmFuZ2VzIGFyZSBmcm9tIDB4NSAoMS4zMW1zKSB0byAweDcgKDUuMjVtcykuIERlZmF1bHRzIHRvIDB4Ny4iKTsKK01PRFVMRV9QQVJNX0RFU0MoY2xvY2tfZGl2aXNpb25fcmF0aW8sICJDbG9jayBkaXZpc2lvbiByYXRpby4gVmFsaWQgcmFuZ2VzIGFyZSBmcm9tIDB4NSAoMS4zMW1zKSB0byAweDcgKDUuMjVtcykuIChkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKGNsb2NrX2RpdmlzaW9uX3JhdGlvKSAiKSIpOwogCiBtb2R1bGVfcGFyYW0oaGVhcnRiZWF0LCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhoZWFydGJlYXQsICJXYXRjaGRvZyBoZWFydGJlYXQgaW4gc2Vjb25kcy4gKDE8PWhlYXJ0YmVhdDw9MzYwMCwgZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19IRUFSVEJFQVQpICIpIik7CiAKIG1vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgKGRlZmF1bHQ9Q09ORklHX1dBVENIRE9HX05PV0FZT1VUKSIpOworTU9EVUxFX1BBUk1fREVTQyhub3dheW91dCwgIldhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2Ugc3RhcnRlZCAoZGVmYXVsdD0iIF9fTU9EVUxFX1NUUklORyhXQVRDSERPR19OT1dBWU9VVCkgIikiKTsKIAogbW9kdWxlX2luaXQoc2hfd2R0X2luaXQpOwogbW9kdWxlX2V4aXQoc2hfd2R0X2V4aXQpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Vpc2EvZWlzYS1idXMuYyBiL2RyaXZlcnMvZWlzYS9laXNhLWJ1cy5jCmluZGV4IDYwNzhlMmYuLjNhMzY1ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWlzYS9laXNhLWJ1cy5jCisrKyBiL2RyaXZlcnMvZWlzYS9laXNhLWJ1cy5jCkBAIC0xMjgsOSArMTI4LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZWlzYV9idXNfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsIGludCBudW1fZW52cCwKKwkJCSAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBlaXNhX2RldmljZSAqZWRldiA9IHRvX2Vpc2FfZGV2aWNlKGRldik7CisJaW50IGkgPSAwOworCWludCBsZW5ndGggPSAwOworCisJYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLCBidWZmZXIsIGJ1ZmZlcl9zaXplLCAmbGVuZ3RoLAorCQkgICAgICAgIk1PREFMSUFTPSIgRUlTQV9ERVZJQ0VfTU9EQUxJQVNfRk1ULCBlZGV2LT5pZC5zaWcpOworCWVudnBbaV0gPSBOVUxMOworCXJldHVybiAwOworfQorCiBzdHJ1Y3QgYnVzX3R5cGUgZWlzYV9idXNfdHlwZSA9IHsKIAkubmFtZSAgPSAiZWlzYSIsCiAJLm1hdGNoID0gZWlzYV9idXNfbWF0Y2gsCisJLnVldmVudCA9IGVpc2FfYnVzX3VldmVudCwKIH07CiAKIGludCBlaXNhX2RyaXZlcl9yZWdpc3RlciAoc3RydWN0IGVpc2FfZHJpdmVyICplZHJ2KQpAQCAtMTYwLDYgKzE3NCwxNCBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIoZW5hYmxlZCwgU19JUlVHTywgZWlzYV9zaG93X3N0YXRlLCBOVUxMKTsKIAorc3RhdGljIHNzaXplX3QgZWlzYV9zaG93X21vZGFsaWFzIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisgICAgICAgIHN0cnVjdCBlaXNhX2RldmljZSAqZWRldiA9IHRvX2Vpc2FfZGV2aWNlIChkZXYpOworICAgICAgICByZXR1cm4gc3ByaW50ZiAoYnVmLCBFSVNBX0RFVklDRV9NT0RBTElBU19GTVQgIlxuIiwgZWRldi0+aWQuc2lnKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKG1vZGFsaWFzLCBTX0lSVUdPLCBlaXNhX3Nob3dfbW9kYWxpYXMsIE5VTEwpOworCiBzdGF0aWMgaW50IF9faW5pdCBlaXNhX2luaXRfZGV2aWNlIChzdHJ1Y3QgZWlzYV9yb290X2RldmljZSAqcm9vdCwKIAkJCQkgICAgc3RydWN0IGVpc2FfZGV2aWNlICplZGV2LAogCQkJCSAgICBpbnQgc2xvdCkKQEAgLTIwOSw2ICsyMzEsNyBAQAogCiAJZGV2aWNlX2NyZWF0ZV9maWxlICgmZWRldi0+ZGV2LCAmZGV2X2F0dHJfc2lnbmF0dXJlKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUgKCZlZGV2LT5kZXYsICZkZXZfYXR0cl9lbmFibGVkKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUgKCZlZGV2LT5kZXYsICZkZXZfYXR0cl9tb2RhbGlhcyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaXQ4Ny5jIGIvZHJpdmVycy9od21vbi9pdDg3LmMKaW5kZXggMDZkZjkyYi4uYjBlZTU3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pdDg3LmMKKysrIGIvZHJpdmVycy9od21vbi9pdDg3LmMKQEAgLTI0Myw2ICsyNDMsNyBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaXQ4N19pc2FfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCQkubmFtZQk9ICJpdDg3LWlzYSIsCiAJfSwKIAkuYXR0YWNoX2FkYXB0ZXIJPSBpdDg3X2lzYV9hdHRhY2hfYWRhcHRlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03OC5jIGIvZHJpdmVycy9od21vbi9sbTc4LmMKaW5kZXggYTZjZTdhYi4uZmExNzE1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTc4LmMKKysrIGIvZHJpdmVycy9od21vbi9sbTc4LmMKQEAgLTE3NSw2ICsxNzUsNyBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbG03OF9pc2FfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCQkubmFtZQk9ICJsbTc4LWlzYSIsCiAJfSwKIAkuYXR0YWNoX2FkYXB0ZXIJPSBsbTc4X2lzYV9hdHRhY2hfYWRhcHRlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcGM4NzM2MC5jIGIvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKaW5kZXggYWUwNWU0OC4uMjM2ZjlmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKKysrIGIvZHJpdmVycy9od21vbi9wYzg3MzYwLmMKQEAgLTIzOCw2ICsyMzgsNyBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgcGM4NzM2MF9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5uYW1lCT0gInBjODczNjAiLAogCX0sCiAJLmF0dGFjaF9hZGFwdGVyCT0gcGM4NzM2MF9kZXRlY3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3NpczU1OTUuYyBiL2RyaXZlcnMvaHdtb24vc2lzNTU5NS5jCmluZGV4IDA2M2Y3MWMuLjM3ODNhZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vc2lzNTU5NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vc2lzNTU5NS5jCkBAIC0yMDAsNiArMjAwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHNpczU1OTVfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCQkubmFtZQk9ICJzaXM1NTk1IiwKIAl9LAogCS5hdHRhY2hfYWRhcHRlcgk9IHNpczU1OTVfZGV0ZWN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zbXNjNDdiMzk3LmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYwppbmRleCBiNjA4NjE4Li5hODU4NjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYworKysgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N2IzOTcuYwpAQCAtMjI4LDYgKzIyOCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzbXNjNDdiMzk3X2RyaXZlciA9IHsKIAkuZHJpdmVyID0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSAic21zYzQ3YjM5NyIsCiAJfSwKIAkuYXR0YWNoX2FkYXB0ZXIJPSBzbXNjNDdiMzk3X2RldGVjdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYyBiL2RyaXZlcnMvaHdtb24vc21zYzQ3bTEuYwppbmRleCA4MjVlOGY3Li42YzgxYjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xLmMKKysrIGIvZHJpdmVycy9od21vbi9zbXNjNDdtMS5jCkBAIC0xMjgsNiArMTI4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHNtc2M0N20xX2RyaXZlciA9IHsKIAkuZHJpdmVyID0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSAic21zYzQ3bTEiLAogCX0sCiAJLmF0dGFjaF9hZGFwdGVyCT0gc21zYzQ3bTFfZGV0ZWN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi92aWE2ODZhLmMgYi9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYwppbmRleCAxNjYyOThmLi45NWFlMDU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYworKysgYi9kcml2ZXJzL2h3bW9uL3ZpYTY4NmEuYwpAQCAtNTc0LDYgKzU3NCw3IEBACiAgICBzbWJ1c19kcml2ZXIgYW5kIGlzYV9kcml2ZXIsIGFuZCBjbGllbnRzIGNvdWxkIGJlIG9mIGVpdGhlciBraW5kICovCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdmlhNjg2YV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5uYW1lCT0gInZpYTY4NmEiLAogCX0sCiAJLmF0dGFjaF9hZGFwdGVyCT0gdmlhNjg2YV9kZXRlY3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3Z0ODIzMS5jIGIvZHJpdmVycy9od21vbi92dDgyMzEuYwppbmRleCA2ODZmM2RlLi4yMzZjY2YwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3Z0ODIzMS5jCisrKyBiL2RyaXZlcnMvaHdtb24vdnQ4MjMxLmMKQEAgLTU4Nyw2ICs1ODcsNyBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdnQ4MjMxX2RyaXZlciA9IHsKIAkuZHJpdmVyID0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSAidnQ4MjMxIiwKIAl9LAogCS5hdHRhY2hfYWRhcHRlcgk9IHZ0ODIzMV9kZXRlY3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jIGIvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYwppbmRleCA0MDMwMWJjLi5iMjFkNmI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKQEAgLTkwMyw2ICs5MDMsNyBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdzgzNjI3ZWhmX2RyaXZlciA9IHsKIAkuZHJpdmVyID0geworCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSAidzgzNjI3ZWhmIiwKIAl9LAogCS5hdHRhY2hfYWRhcHRlcgk9IHc4MzYyN2VoZl9kZXRlY3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMgYi9kcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMKaW5kZXggNzkzNjhkNS4uMzAyOTUwMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNjI3aGYuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4MzYyN2hmLmMKQEAgLTMzOSw2ICszMzksNyBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdzgzNjI3aGZfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCQkubmFtZQk9ICJ3ODM2MjdoZiIsCiAJfSwKIAkuYXR0YWNoX2FkYXB0ZXIJPSB3ODM2MjdoZl9kZXRlY3QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc4MWQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCmluZGV4IDdiZTQ2OWUuLjk1MjIxYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCisrKyBiL2RyaXZlcnMvaHdtb24vdzgzNzgxZC5jCkBAIC0yODgsNiArMjg4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHc4Mzc4MWRfaXNhX2RyaXZlciA9IHsKIAkuZHJpdmVyID0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAkJLm5hbWUgPSAidzgzNzgxZC1pc2EiLAogCX0sCiAJLmF0dGFjaF9hZGFwdGVyID0gdzgzNzgxZF9pc2FfYXR0YWNoX2FkYXB0ZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9LY29uZmlnIGIvZHJpdmVycy9pMmMvS2NvbmZpZwppbmRleCAyNDM4M2FmLi4xMTkzNWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL0tjb25maWcKQEAgLTEsNSArMSw1IEBACiAjCi0jIENoYXJhY3RlciBkZXZpY2UgY29uZmlndXJhdGlvbgorIyBJMkMgc3Vic3lzdGVtIGNvbmZpZ3VyYXRpb24KICMKIAogbWVudSAiSTJDIHN1cHBvcnQiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvYWxnb3MvS2NvbmZpZwppbmRleCAzMDQwODAxLi5jMDM0ODIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9hbGdvcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL0tjb25maWcKQEAgLTUzLDEyICs1Myw2IEBACiAJdHJpc3RhdGUgIk1QQzh4eCBDUE0gSTJDIGludGVyZmFjZSIKIAlkZXBlbmRzIG9uIDh4eCAmJiBJMkMKIAotY29uZmlnIEkyQ19BTEdPX1NJQllURQotCXRyaXN0YXRlICJTaUJ5dGUgU01CdXMgaW50ZXJmYWNlIgotCWRlcGVuZHMgb24gU0lCWVRFX1NCMXh4eF9TT0MgJiYgSTJDCi0JaGVscAotCSAgU3VwcG9ydHMgdGhlIFNpQnl0ZSBTT0Mgb24tY2hpcCBJMkMgaW50ZXJmYWNlcyAoMiBjaGFubmVscykuCi0KIGNvbmZpZyBJMkNfQUxHT19TR0kKIAl0cmlzdGF0ZSAiSTJDIFNHSSBpbnRlcmZhY2VzIgogCWRlcGVuZHMgb24gSTJDICYmIChTR0lfSVAyMiB8fCBTR0lfSVAzMiB8fCBYODZfVklTV1MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9NYWtlZmlsZSBiL2RyaXZlcnMvaTJjL2FsZ29zL01ha2VmaWxlCmluZGV4IDg2N2ZlMWYuLjIwOGJlMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2FsZ29zL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL2FsZ29zL01ha2VmaWxlCkBAIC02LDcgKzYsNiBAQAogb2JqLSQoQ09ORklHX0kyQ19BTEdPUENGKQkrPSBpMmMtYWxnby1wY2Yubwogb2JqLSQoQ09ORklHX0kyQ19BTEdPUENBKQkrPSBpMmMtYWxnby1wY2Eubwogb2JqLSQoQ09ORklHX0kyQ19BTEdPSVRFKQkrPSBpMmMtYWxnby1pdGUubwotb2JqLSQoQ09ORklHX0kyQ19BTEdPX1NJQllURSkJKz0gaTJjLWFsZ28tc2lieXRlLm8KIG9iai0kKENPTkZJR19JMkNfQUxHT19TR0kpCSs9IGkyYy1hbGdvLXNnaS5vCiAKIGlmZXEgKCQoQ09ORklHX0kyQ19ERUJVR19BTEdPKSx5KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tYml0LmMgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1iaXQuYwppbmRleCBhYjIzMGMwLi4yMWMzNmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1iaXQuYworKysgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1iaXQuYwpAQCAtNzYsMTcgKzc2LDE1IEBACiAgKiBSYWlzZSBzY2wgbGluZSwgYW5kIGRvIGNoZWNraW5nIGZvciBkZWxheXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBzbG93ZXIKICAqIGRldmljZXMuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHNjbGhpKHN0cnVjdCBpMmNfYWxnb19iaXRfZGF0YSAqYWRhcCkKK3N0YXRpYyBpbnQgc2NsaGkoc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhICphZGFwKQogewogCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CiAKIAlzZXRzY2woYWRhcCwxKTsKIAogCS8qIE5vdCBhbGwgYWRhcHRlcnMgaGF2ZSBzY2wgc2Vuc2UgbGluZS4uLiAqLwotCWlmIChhZGFwLT5nZXRzY2wgPT0gTlVMTCApIHsKLQkJdWRlbGF5KGFkYXAtPnVkZWxheSk7Ci0JCXJldHVybiAwOwotCX0KKwlpZiAoIWFkYXAtPmdldHNjbCkKKwkJZ290byBkb25lOwogCiAJc3RhcnQ9amlmZmllczsKIAl3aGlsZSAoISBnZXRzY2woYWRhcCkgKSB7CQpAQCAtMTAxLDYgKzk5LDggQEAKIAkJY29uZF9yZXNjaGVkKCk7CiAJfQogCURFQlNUQVQocHJpbnRrKEtFUk5fREVCVUcgIm5lZWRlZCAlbGQgamlmZmllc1xuIiwgamlmZmllcy1zdGFydCkpOworCitkb25lOgogCXVkZWxheShhZGFwLT51ZGVsYXkpOwogCXJldHVybiAwOwogfSAKQEAgLTEyMSw3ICsxMjEsNiBAQAogCURFQlBST1RPKHByaW50aygiIFNyICIpKTsKIAlzZXRzZGEoYWRhcCwxKTsKIAlzY2xoaShhZGFwKTsKLQl1ZGVsYXkoYWRhcC0+dWRlbGF5KTsKIAkKIAlzZGFsbyhhZGFwKTsKIAlzY2xsbyhhZGFwKTsKQEAgLTMwNiw3ICszMDUsNyBAQAogICogMCBjaGlwIGRpZCBub3QgYW5zd2VyCiAgKiAteCB0cmFuc21pc3Npb24gZXJyb3IKICAqLwotc3RhdGljIGlubGluZSBpbnQgdHJ5X2FkZHJlc3Moc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwKK3N0YXRpYyBpbnQgdHJ5X2FkZHJlc3Moc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwKIAkJICAgICAgIHVuc2lnbmVkIGNoYXIgYWRkciwgaW50IHJldHJpZXMpCiB7CiAJc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhICphZGFwID0gaTJjX2FkYXAtPmFsZ29fZGF0YTsKQEAgLTM1NCwxNSArMzUzLDExIEBACiAJCQlyZXR1cm4gKHJldHZhbDwwKT8gcmV0dmFsIDogLUVGQVVMVDsKIAkJCSAgICAgICAgLyogZ290IGEgYmV0dGVyIG9uZSA/PyAqLwogCQl9Ci0jaWYgMAotCQkvKiBmcm9tIGFzbS9kZWxheS5oICovCi0JCV9fZGVsYXkoYWRhcC0+bWRlbGF5ICogKGxvb3BzX3Blcl9zZWMgLyAxMDAwKSApOwotI2VuZGlmCiAJfQogCXJldHVybiB3cmNvdW50OwogfQogCi1zdGF0aWMgaW5saW5lIGludCByZWFkYnl0ZXMoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZykKK3N0YXRpYyBpbnQgcmVhZGJ5dGVzKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIHN0cnVjdCBpMmNfbXNnICptc2cpCiB7CiAJaW50IGludmFsOwogCWludCByZGNvdW50PTA7ICAgCS8qIGNvdW50cyBieXRlcyByZWFkICovCkBAIC00MTIsNyArNDA3LDcgQEAKICAqIC14IGFuIGVycm9yIG9jY3VycmVkIChsaWtlOiAtRVJFTU9URUlPIGlmIHRoZSBkZXZpY2UgZGlkIG5vdCBhbnN3ZXIsIG9yCiAgKgktRVRJTUVET1VULCBmb3IgZXhhbXBsZSBpZiB0aGUgbGluZXMgYXJlIHN0dWNrLi4uKSAKICAqLwotc3RhdGljIGlubGluZSBpbnQgYml0X2RvQWRkcmVzcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNnKSAKK3N0YXRpYyBpbnQgYml0X2RvQWRkcmVzcyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNnKQogewogCXVuc2lnbmVkIHNob3J0IGZsYWdzID0gbXNnLT5mbGFnczsKIAl1bnNpZ25lZCBzaG9ydCBuYWtfb2sgPSBtc2ctPmZsYWdzICYgSTJDX01fSUdOT1JFX05BSzsKQEAgLTUxNyw3ICs1MTIsNyBAQAogCiAvKiAtLS0tLWV4cG9ydGVkIGFsZ29yaXRobSBkYXRhOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpMmNfYml0X2FsZ28gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gaTJjX2JpdF9hbGdvID0gewogCS5tYXN0ZXJfeGZlcgk9IGJpdF94ZmVyLAogCS5mdW5jdGlvbmFsaXR5CT0gYml0X2Z1bmMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNhLmMgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2EuYwppbmRleCBiODhhNmZjLi45MDgxYzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2EuYworKysgYi9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1wY2EuYwpAQCAtMzU1LDcgKzM1NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBwY2FfYWxnbyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBwY2FfYWxnbyA9IHsKIAkubWFzdGVyX3hmZXIJPSBwY2FfeGZlciwKIAkuZnVuY3Rpb25hbGl0eQk9IHBjYV9mdW5jLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXBjZi5jIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNmLmMKaW5kZXggNWIyNDkzMC4uM2IyMDAzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNmLmMKKysrIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNmLmMKQEAgLTQ1OCw3ICs0NTgsNyBAQAogCiAvKiAtLS0tLWV4cG9ydGVkIGFsZ29yaXRobSBkYXRhOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBwY2ZfYWxnbyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBwY2ZfYWxnbyA9IHsKIAkubWFzdGVyX3hmZXIJPSBwY2ZfeGZlciwKIAkuZnVuY3Rpb25hbGl0eQk9IHBjZl9mdW5jLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXNnaS5jIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tc2dpLmMKaW5kZXggOTMyYzRmYS4uNDkwZDk5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tc2dpLmMKKysrIGIvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tc2dpLmMKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCXJldHVybiBJMkNfRlVOQ19TTUJVU19FTVVMOwogfQogCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc2dpX2FsZ28gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gc2dpX2FsZ28gPSB7CiAJLm1hc3Rlcl94ZmVyCT0gc2dpX3hmZXIsCiAJLmZ1bmN0aW9uYWxpdHkJPSBzZ2lfZnVuYywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxnby1zaWJ5dGUuYyBiL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXNpYnl0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmQ0MWM2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvaTJjL2FsZ29zL2kyYy1hbGdvLXNpYnl0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIGkyYy1hbGdvLXNpYnl0ZS5jIGkyYyBkcml2ZXIgYWxnb3JpdGhtcyBmb3IgYml0LXNoaWZ0IGFkYXB0ZXJzCQkgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKiAgIENvcHlyaWdodCAoQykgMjAwMSwyMDAyLDIwMDMgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAgICAgQ29weXJpZ2h0IChDKSAxOTk1LTIwMDAgU2ltb24gRy4gVm9nbAotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCQkgICAgICovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLS8qIFdpdGggc29tZSBjaGFuZ2VzIGZyb20gS3n2c3RpIE3kbGtraSA8a21hbGtraUBjYy5odXQuZmk+IGFuZCBldmVuCi0gICBGcm9kbyBMb29pamFhcmQgPGZyb2RvbEBkZHMubmw+LiAgKi8KLQotLyogUG9ydGVkIGZvciBTaUJ5dGUgU09DcyBieSBCcm9hZGNvbSBDb3Jwb3JhdGlvbi4gICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9yZWdzLmg+Ci0jaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfc21idXMuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy1hbGdvLXNpYnl0ZS5oPgotCi0vKiAtLS0tLSBnbG9iYWwgZGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBTTUJfQ1NSKGEscikgKChsb25nKShhLT5yZWdfYmFzZSArIHIpKQotCi0vKiAtLS0tLSBnbG9iYWwgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkqLwotCi0vKiBtb2R1bGUgcGFyYW1ldGVyczoKLSAqLwotc3RhdGljIGludCBiaXRfc2NhbjsJLyogaGF2ZSBhIGxvb2sgYXQgd2hhdCdzIGhhbmdpbmcgJ3JvdW5kCQkqLwotCi0KLXN0YXRpYyBpbnQgc21idXNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyY19hZGFwLCB1MTYgYWRkciwgCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgZmxhZ3MsIGNoYXIgcmVhZF93cml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICB1OCBjb21tYW5kLCBpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKiBkYXRhKQotewotCXN0cnVjdCBpMmNfYWxnb19zaWJ5dGVfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7Ci0gICAgICAgIGludCBkYXRhX2J5dGVzID0gMDsKLSAgICAgICAgaW50IGVycm9yOwotCi0gICAgICAgIHdoaWxlIChjc3JfaW4zMihTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVRVUykpICYgTV9TTUJfQlVTWSkKLSAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgc3dpdGNoIChzaXplKSB7Ci0gICAgICAgIGNhc2UgSTJDX1NNQlVTX1FVSUNLOgotICAgICAgICAgICAgICAgIGNzcl9vdXQzMigoVl9TTUJfQUREUihhZGRyKSB8IChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEID8gTV9TTUJfUURBVEEgOiAwKSB8Ci0JCQkgICBWX1NNQl9UVF9RVUlDS0NNRCksIFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBUlQpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJMkNfU01CVVNfQllURToKLSAgICAgICAgICAgICAgICBpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3NyX291dDMyKChWX1NNQl9BRERSKGFkZHIpIHwgVl9TTUJfVFRfUkQxQllURSksCi0JCQkJICBTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVJUKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2J5dGVzID0gMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY3NyX291dDMyKFZfU01CX0NNRChjb21tYW5kKSwgU01CX0NTUihhZGFwLCBSX1NNQl9DTUQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMigoVl9TTUJfQUREUihhZGRyKSB8IFZfU01CX1RUX1dSMUJZVEUpLAotCQkJCSAgU01CX0NTUihhZGFwLCBSX1NNQl9TVEFSVCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJMkNfU01CVVNfQllURV9EQVRBOgotICAgICAgICAgICAgICAgIGNzcl9vdXQzMihWX1NNQl9DTUQoY29tbWFuZCksIFNNQl9DU1IoYWRhcCwgUl9TTUJfQ01EKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMigoVl9TTUJfQUREUihhZGRyKSB8IFZfU01CX1RUX0NNRF9SRDFCWVRFKSwKLQkJCQkgIFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBUlQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfYnl0ZXMgPSAxOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjc3Jfb3V0MzIoVl9TTUJfTEIoZGF0YS0+Ynl0ZSksIFNNQl9DU1IoYWRhcCwgUl9TTUJfREFUQSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3NyX291dDMyKChWX1NNQl9BRERSKGFkZHIpIHwgVl9TTUJfVFRfV1IyQllURSksCi0JCQkJICBTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVJUKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6Ci0gICAgICAgICAgICAgICAgY3NyX291dDMyKFZfU01CX0NNRChjb21tYW5kKSwgU01CX0NTUihhZGFwLCBSX1NNQl9DTUQpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3NyX291dDMyKChWX1NNQl9BRERSKGFkZHIpIHwgVl9TTUJfVFRfQ01EX1JEMkJZVEUpLAotCQkJCSAgU01CX0NTUihhZGFwLCBSX1NNQl9TVEFSVCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9ieXRlcyA9IDI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNzcl9vdXQzMihWX1NNQl9MQihkYXRhLT53b3JkICYgMHhmZiksIFNNQl9DU1IoYWRhcCwgUl9TTUJfREFUQSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3NyX291dDMyKFZfU01CX01CKGRhdGEtPndvcmQgPj4gOCksIFNNQl9DU1IoYWRhcCwgUl9TTUJfREFUQSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3NyX291dDMyKChWX1NNQl9BRERSKGFkZHIpIHwgVl9TTUJfVFRfV1IyQllURSksCi0JCQkJICBTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVJUKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAvKiBYWFhLVyBiZXR0ZXIgZXJyb3IgY29kZT8gKi8KLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChjc3JfaW4zMihTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVRVUykpICYgTV9TTUJfQlVTWSkKLSAgICAgICAgICAgICAgICA7Ci0KLSAgICAgICAgZXJyb3IgPSBjc3JfaW4zMihTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVRVUykpOwotICAgICAgICBpZiAoZXJyb3IgJiBNX1NNQl9FUlJPUikgewotICAgICAgICAgICAgICAgIC8qIENsZWFyIGVycm9yIGJpdCBieSB3cml0aW5nIGEgMSAqLwotICAgICAgICAgICAgICAgIGNzcl9vdXQzMihNX1NNQl9FUlJPUiwgU01CX0NTUihhZGFwLCBSX1NNQl9TVEFUVVMpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAgICAgLyogWFhYS1cgYmV0dGVyIGVycm9yIGNvZGU/ICovCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0YV9ieXRlcyA9PSAxKQotICAgICAgICAgICAgICAgIGRhdGEtPmJ5dGUgPSBjc3JfaW4zMihTTUJfQ1NSKGFkYXAsIFJfU01CX0RBVEEpKSAmIDB4ZmY7Ci0gICAgICAgIGlmIChkYXRhX2J5dGVzID09IDIpCi0gICAgICAgICAgICAgICAgZGF0YS0+d29yZCA9IGNzcl9pbjMyKFNNQl9DU1IoYWRhcCwgUl9TTUJfREFUQSkpICYgMHhmZmZmOwotCi0gICAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGFsZ29fY29udHJvbChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIAotCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTMyIGJpdF9mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlyZXR1cm4gKEkyQ19GVU5DX1NNQlVTX1FVSUNLIHwgSTJDX0ZVTkNfU01CVVNfQllURSB8Ci0gICAgICAgICAgICAgICAgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKTsKLX0KLQotCi0vKiAtLS0tLWV4cG9ydGVkIGFsZ29yaXRobSBkYXRhOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCi0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpMmNfc2lieXRlX2FsZ28gPSB7Ci0JLnNtYnVzX3hmZXIJPSBzbWJ1c194ZmVyLAotCS5hbGdvX2NvbnRyb2wJPSBhbGdvX2NvbnRyb2wsIC8qIGlvY3RsICovCi0JLmZ1bmN0aW9uYWxpdHkJPSBiaXRfZnVuYywKLX07Ci0KLS8qIAotICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIHRvIGxvYWQgYWxnb3JpdGhtcyBhdCBydW50aW1lIAotICovCi1pbnQgaTJjX3NpYnl0ZV9hZGRfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIGludCBzcGVlZCkKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgaTJjX2FsZ29fc2lieXRlX2RhdGEgKmFkYXAgPSBpMmNfYWRhcC0+YWxnb19kYXRhOwotCi0JLyogcmVnaXN0ZXIgbmV3IGFkYXB0ZXIgdG8gaTJjIG1vZHVsZS4uLiAqLwotCWkyY19hZGFwLT5hbGdvID0gJmkyY19zaWJ5dGVfYWxnbzsKLSAgICAgICAgCi0gICAgICAgIC8qIFNldCB0aGUgZnJlcXVlbmN5IHRvIDEwMCBrSHogKi8KLSAgICAgICAgY3NyX291dDMyKHNwZWVkLCBTTUJfQ1NSKGFkYXAsUl9TTUJfRlJFUSkpOwotICAgICAgICBjc3Jfb3V0MzIoMCwgU01CX0NTUihhZGFwLFJfU01CX0NPTlRST0wpKTsKLQotCS8qIHNjYW4gYnVzICovCi0JaWYgKGJpdF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKLSAgICAgICAgICAgICAgICBpbnQgcmM7Ci0JCXByaW50ayhLRVJOX0lORk8gIiBpMmMtYWxnby1zaWJ5dGUubzogc2Nhbm5pbmcgYnVzICVzLlxuIiwKLQkJICAgICAgIGkyY19hZGFwLT5uYW1lKTsKLQkJZm9yIChpID0gMHgwMDsgaSA8IDB4N2Y7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYS1cgaXMgdGhpcyBhIHJlYWxpc3RpYyBwcm9iZT8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gc21idXNfeGZlcihpMmNfYWRhcCwgaSwgMCwgSTJDX1NNQlVTX1JFQUQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX0JZVEVfREFUQSwgJmRhdGEpOwotCQkJaWYgKCFyYykgewotCQkJCXByaW50aygiKCUwMngpIixpKTsgCi0JCQl9IGVsc2UgCi0JCQkJcHJpbnRrKCIuIik7IAotCQl9Ci0JCXByaW50aygiXG4iKTsKLQl9Ci0KLQlyZXR1cm4gaTJjX2FkZF9hZGFwdGVyKGkyY19hZGFwKTsKLX0KLQotCi1pbnQgaTJjX3NpYnl0ZV9kZWxfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlpbnQgcmVzOwotCi0JaWYgKChyZXMgPSBpMmNfZGVsX2FkYXB0ZXIoYWRhcCkpIDwgMCkKLQkJcmV0dXJuIHJlczsKLQotCXJldHVybiAwOwotfQotCi1pbnQgX19pbml0IGkyY19hbGdvX3NpYnl0ZV9pbml0ICh2b2lkKQotewotCXByaW50aygiaTJjLWFsZ28tc2lieXRlLm86IGkyYyBTaUJ5dGUgYWxnb3JpdGhtIG1vZHVsZVxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotRVhQT1JUX1NZTUJPTChpMmNfc2lieXRlX2FkZF9idXMpOwotRVhQT1JUX1NZTUJPTChpMmNfc2lieXRlX2RlbF9idXMpOwotCi0jaWZkZWYgTU9EVUxFCi1NT0RVTEVfQVVUSE9SKCJLaXAgV2Fsa2VyLCBCcm9hZGNvbSBDb3JwLiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTaUJ5dGUgSTJDLUJ1cyBhbGdvcml0aG0iKTsKLW1vZHVsZV9wYXJhbShiaXRfc2NhbiwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoYml0X3NjYW4sICJTY2FuIGZvciBhY3RpdmUgY2hpcHMgb24gdGhlIGJ1cyIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi1pbnQgaW5pdF9tb2R1bGUodm9pZCkgCi17Ci0JcmV0dXJuIGkyY19hbGdvX3NpYnl0ZV9pbml0KCk7Ci19Ci0KLXZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkgCi17Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKaW5kZXggODg0MzIwZS4uOWU1NmMzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKQEAgLTc1LDExICs3NSwxMSBAQAogCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWFtZDgxMTEuCiAKIGNvbmZpZyBJMkNfQVUxNTUwCi0JdHJpc3RhdGUgIkF1MTU1MCBTTUJ1cyBpbnRlcmZhY2UiCi0JZGVwZW5kcyBvbiBJMkMgJiYgU09DX0FVMTU1MAorCXRyaXN0YXRlICJBdTE1NTAvQXUxMjAwIFNNQnVzIGludGVyZmFjZSIKKwlkZXBlbmRzIG9uIEkyQyAmJiAoU09DX0FVMTU1MCB8fCBTT0NfQVUxMjAwKQogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZQotCSAgQXUxNTUwIFNNQnVzIGludGVyZmFjZS4KKwkgIEF1MTU1MCBhbmQgQXUxMjAwIFNNQnVzIGludGVyZmFjZS4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWF1MTU1MC4KQEAgLTI4Nyw2ICsyODcsMTYgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGkyYy1vY29yZXMuCiAKK2NvbmZpZyBJMkNfT01BUAorCXRyaXN0YXRlICJPTUFQIEkyQyBhZGFwdGVyIgorCWRlcGVuZHMgb24gSTJDICYmIEFSQ0hfT01BUAorCWRlZmF1bHQgeSBpZiBNQUNIX09NQVBfSDMgfHwgTUFDSF9PTUFQX09TSworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZQorCSAgSTJDIGludGVyZmFjZSBvbiB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgT01BUDEvMiBmYW1pbHkgb2YgcHJvY2Vzc29ycy4KKwkgIExpa2UgT01BUDE1MTAvMTYxMC8xNzEwLzU5MTIgYW5kIE9NQVAyNDJ4LgorCSAgRm9yIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cudGkuY29tL29tYXAuCisKIGNvbmZpZyBJMkNfUEFSUE9SVAogCXRyaXN0YXRlICJQYXJhbGxlbCBwb3J0IGFkYXB0ZXIiCiAJZGVwZW5kcyBvbiBJMkMgJiYgUEFSUE9SVApAQCAtNDgyLDE5ICs0OTIsMTkgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIGkyYy12aWEuCiAKIGNvbmZpZyBJMkNfVklBUFJPCi0JdHJpc3RhdGUgIlZJQSA4MkM1OTYvODJDNjg2LzgyM3giCisJdHJpc3RhdGUgIlZJQSA4MkM1OTYvODJDNjg2LzgyeHgiCiAJZGVwZW5kcyBvbiBJMkMgJiYgUENJCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlIFZJQQotCSAgODJDNTk2LzgyQzY4Ni84MjN4IEkyQyBpbnRlcmZhY2VzLiAgU3BlY2lmaWNhbGx5LCB0aGUgZm9sbG93aW5nIAorCSAgODJDNTk2LzgyQzY4Ni84Mnh4IEkyQyBpbnRlcmZhY2VzLiAgU3BlY2lmaWNhbGx5LCB0aGUgZm9sbG93aW5nCiAJICBjaGlwc2V0cyBhcmUgc3VwcG9ydGVkOgotCSAgODJDNTk2QS9CCi0JICA4MkM2ODZBL0IKLQkgIDgyMzEKLQkgIDgyMzMKLQkgIDgyMzNBCi0JICA4MjM1Ci0JICA4MjM3CisJICAgIFZUODJDNTk2QS9CCisJICAgIFZUODJDNjg2QS9CCisJICAgIFZUODIzMQorCSAgICBWVDgyMzMvQQorCSAgICBWVDgyMzUKKwkgICAgVlQ4MjM3Ui9BCisJICAgIFZUODI1MQogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBpMmMtdmlhcHJvLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCmluZGV4IGFjNTZkZjUuLjQ5M2M4NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKQEAgLTI0LDYgKzI0LDcgQEAKIG9iai0kKENPTkZJR19JMkNfTVY2NFhYWCkJKz0gaTJjLW12NjR4eHgubwogb2JqLSQoQ09ORklHX0kyQ19ORk9SQ0UyKQkrPSBpMmMtbmZvcmNlMi5vCiBvYmotJChDT05GSUdfSTJDX09DT1JFUykJKz0gaTJjLW9jb3Jlcy5vCitvYmotJChDT05GSUdfSTJDX09NQVApCQkrPSBpMmMtb21hcC5vCiBvYmotJChDT05GSUdfSTJDX1BBUlBPUlQpCSs9IGkyYy1wYXJwb3J0Lm8KIG9iai0kKENPTkZJR19JMkNfUEFSUE9SVF9MSUdIVCkJKz0gaTJjLXBhcnBvcnQtbGlnaHQubwogb2JqLSQoQ09ORklHX0kyQ19QQ0FfSVNBKQkrPSBpMmMtcGNhLWlzYS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1MzUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTUzNS5jCmluZGV4IGQzZWY0NmEuLmU3NWQzMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTUzNS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTUzNS5jCkBAIC00NjgsNyArNDY4LDcgQEAKIAkgICAgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfREFUQTsKIH0KIAotc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNtYnVzX2FsZ29yaXRobSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7CiAJLnNtYnVzX3hmZXIJPSBhbGkxNTM1X2FjY2VzcywKIAkuZnVuY3Rpb25hbGl0eQk9IGFsaTE1MzVfZnVuYywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1NjMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCmluZGV4IGU2ZjYzMjAuLjMzZmJiNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYWxpMTU2My5jCkBAIC0zNjcsNyArMzY3LDcgQEAKIAlyZWxlYXNlX3JlZ2lvbihhbGkxNTYzX3NtYmEsQUxJMTU2M19TTUJfSU9TSVpFKTsKIH0KIAotc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGFsaTE1NjNfYWxnb3JpdGhtID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIGFsaTE1NjNfYWxnb3JpdGhtID0gewogCS5zbWJ1c194ZmVyCT0gYWxpMTU2M19hY2Nlc3MsCiAJLmZ1bmN0aW9uYWxpdHkJPSBhbGkxNTYzX2Z1bmMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbGkxNXgzLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1eDMuYwppbmRleCA3YTVjMDk0Li4zZjExYjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1eDMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFsaTE1eDMuYwpAQCAtNDYzLDcgKzQ2Myw3IEBACiAJICAgIEkyQ19GVU5DX1NNQlVTX0JMT0NLX0RBVEE7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0gewogCS5zbWJ1c194ZmVyCT0gYWxpMTV4M19hY2Nlc3MsCiAJLmZ1bmN0aW9uYWxpdHkJPSBhbGkxNXgzX2Z1bmMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYW1kNzU2LmMKaW5kZXggMTc1MGRlZC4uMmQyMWFmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ3NTYuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDc1Ni5jCkBAIC0yOTQsNyArMjk0LDcgQEAKIAkgICAgSTJDX0ZVTkNfU01CVVNfQkxPQ0tfREFUQSB8IEkyQ19GVU5DX1NNQlVTX1BST0NfQ0FMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNtYnVzX2FsZ29yaXRobSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7CiAJLnNtYnVzX3hmZXIJPSBhbWQ3NTZfYWNjZXNzLAogCS5mdW5jdGlvbmFsaXR5CT0gYW1kNzU2X2Z1bmMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hbWQ4MTExLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDgxMTEuYwppbmRleCBlNWVmNTYwLi4wZmJjNzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDgxMTEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWFtZDgxMTEuYwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJCUkyQ19GVU5DX1NNQlVTX0kyQ19CTE9DSyB8IEkyQ19GVU5DX1NNQlVTX0hXUEVDX0NBTEM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0gewogCS5zbWJ1c194ZmVyID0gYW1kODExMV9hY2Nlc3MsCiAJLmZ1bmN0aW9uYWxpdHkgPSBhbWQ4MTExX2Z1bmMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdTE1NTAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXUxNTUwLmMKaW5kZXggZDA2ZWRjZS4uZDdlN2MzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdTE1NTAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF1MTU1MC5jCkBAIC0zNCw4ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KIAotI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC1wYjF4MDAvcGIxNTUwLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfcHNjLmg+CiAKICNpbmNsdWRlICJpMmMtYXUxNTUwLmgiCkBAIC0xMTgsMTMgKzExNywxOSBAQAogCiAJLyogUmVzZXQgdGhlIEZJRk9zLCBjbGVhciBldmVudHMuCiAJKi8KLQlzcC0+cHNjX3NtYnBjciA9IFBTQ19TTUJQQ1JfREM7CisJc3RhdCA9IHNwLT5wc2Nfc21ic3RhdDsKIAlzcC0+cHNjX3NtYmV2bnQgPSBQU0NfU01CRVZOVF9BTExDTFI7CiAJYXVfc3luYygpOwotCWRvIHsKLQkJc3RhdCA9IHNwLT5wc2Nfc21icGNyOworCisJaWYgKCEoc3RhdCAmIFBTQ19TTUJTVEFUX1RFKSB8fCAhKHN0YXQgJiBQU0NfU01CU1RBVF9SRSkpIHsKKwkJc3AtPnBzY19zbWJwY3IgPSBQU0NfU01CUENSX0RDOwogCQlhdV9zeW5jKCk7Ci0JfSB3aGlsZSAoKHN0YXQgJiBQU0NfU01CUENSX0RDKSAhPSAwKTsKKwkJZG8geworCQkJc3RhdCA9IHNwLT5wc2Nfc21icGNyOworCQkJYXVfc3luYygpOworCQl9IHdoaWxlICgoc3RhdCAmIFBTQ19TTUJQQ1JfREMpICE9IDApOworCQl1ZGVsYXkoNTApOworCX0KIAogCS8qIFdyaXRlIG91dCB0aGUgaTJjIGNoaXAgYWRkcmVzcyBhbmQgc3BlY2lmeSBvcGVyYXRpb24KIAkqLwpAQCAtMjc5LDEwICsyODQsMTAgQEAKIHN0YXRpYyB1MzIKIGF1MTU1MF9mdW5jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKIHsKLQlyZXR1cm4gSTJDX0ZVTkNfSTJDOworCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMOwogfQogCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gYXUxNTUwX2FsZ28gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gYXUxNTUwX2FsZ28gPSB7CiAJLm1hc3Rlcl94ZmVyCT0gYXUxNTUwX3hmZXIsCiAJLmZ1bmN0aW9uYWxpdHkJPSBhdTE1NTBfZnVuYywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWVsZWt0b3IuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWxla3Rvci5jCmluZGV4IDU5ZjgzMDguLmNhYThlNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWxla3Rvci5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWxla3Rvci5jCkBAIC0xOTYsNyArMTk2LDYgQEAKIAkuZ2V0Y2xvY2sgICA9IHBjZl9pc2FfZ2V0Y2xvY2ssCiAJLndhaXRmb3JwaW4gPSBwY2ZfaXNhX3dhaXRmb3JwaW4sCiAJLnVkZWxheQkgICAgPSAxMCwKLQkubWRlbGF5CSAgICA9IDEwLAogCS50aW1lb3V0ICAgID0gMTAwLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1oeWRyYS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1oeWRyYS5jCmluZGV4IGUwY2IzYjAuLjQ1N2Q0OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaHlkcmEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWh5ZHJhLmMKQEAgLTk5LDcgKzk5LDYgQEAKIAkuZ2V0c2RhCQk9IGh5ZHJhX2JpdF9nZXRzZGEsCiAJLmdldHNjbAkJPSBoeWRyYV9iaXRfZ2V0c2NsLAogCS51ZGVsYXkJCT0gNSwKLQkubWRlbGF5CQk9IDUsCiAJLnRpbWVvdXQJPSBIWgogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYwppbmRleCA3YmUxZDBhLi5iYmIyZmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYwpAQCAtNDM0LDcgKzQzNCw3IEBACiAJICAgICB8IChpc2ljaDQgPyBJMkNfRlVOQ19TTUJVU19IV1BFQ19DQUxDIDogMCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0gewogCS5zbWJ1c194ZmVyCT0gaTgwMV9hY2Nlc3MsCiAJLmZ1bmN0aW9uYWxpdHkJPSBpODAxX2Z1bmMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODEwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MTAuYwppbmRleCA3NDhiZTMwLi5iNjZmYjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MTAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MTAuYwpAQCAtMTY2LDcgKzE2Niw2IEBACiAJLmdldHNkYQkJPSBiaXRfaTgxMGkyY19nZXRzZGEsCiAJLmdldHNjbAkJPSBiaXRfaTgxMGkyY19nZXRzY2wsCiAJLnVkZWxheQkJPSBDWUNMRV9ERUxBWSwKLQkubWRlbGF5CQk9IENZQ0xFX0RFTEFZLAogCS50aW1lb3V0CT0gVElNRU9VVCwKIH07CiAKQEAgLTE4Miw3ICsxODEsNiBAQAogCS5nZXRzZGEJCT0gYml0X2k4MTBkZGNfZ2V0c2RhLAogCS5nZXRzY2wJCT0gYml0X2k4MTBkZGNfZ2V0c2NsLAogCS51ZGVsYXkJCT0gQ1lDTEVfREVMQVksCi0JLm1kZWxheQkJPSBDWUNMRV9ERUxBWSwKIAkudGltZW91dAk9IFRJTUVPVVQsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaWJtX2lpYy5jCmluZGV4IDA1OTliYmQ2Li41YmNjYjVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlibV9paWMuYwpAQCAtNjI1LDcgKzYyNSw3IEBACiAJcmV0dXJuIEkyQ19GVU5DX0kyQyB8IEkyQ19GVU5DX1NNQlVTX0VNVUwgfCBJMkNfRlVOQ18xMEJJVF9BRERSOwogfQogCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gaWljX2FsZ28gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gaWljX2FsZ28gPSB7CiAJLm1hc3Rlcl94ZmVyIAk9IGlpY194ZmVyLAogCS5mdW5jdGlvbmFsaXR5CT0gaWljX2Z1bmMKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlvcDN4eC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pb3AzeHguYwppbmRleCA0OGM1NjkzLi44ZTQxMzE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlvcDN4eC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW9wM3h4LmMKQEAgLTQwMSw3ICs0MDEsNyBAQAogCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMOwogfQogCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gaW9wM3h4X2kyY19hbGdvID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIGlvcDN4eF9pMmNfYWxnbyA9IHsKIAkubWFzdGVyX3hmZXIJPSBpb3AzeHhfaTJjX21hc3Rlcl94ZmVyLAogCS5hbGdvX2NvbnRyb2wJPSBpb3AzeHhfaTJjX2FsZ29fY29udHJvbCwKIAkuZnVuY3Rpb25hbGl0eQk9IGlvcDN4eF9pMmNfZnVuYywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXNhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzYS5jCmluZGV4IGMzZTFkM2U4Li40MzgwNjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzYS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXNhLmMKQEAgLTQzLDcgKzQzLDcgQEAKIHN0YXRpYyB1MzIgaXNhX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKIAogLyogVGhpcyBpcyB0aGUgYWN0dWFsIGFsZ29yaXRobSB3ZSBkZWZpbmUgKi8KLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpc2FfYWxnb3JpdGhtID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIGlzYV9hbGdvcml0aG0gPSB7CiAJLmZ1bmN0aW9uYWxpdHkJPSBpc2FfZnVuYywKIH07CiAKQEAgLTg5LDkgKzg5LDE0IEBACiAJZGV2X2RiZygmaXNhX2FkYXB0ZXIuZGV2LCAiRHJpdmVyICVzIHJlZ2lzdGVyZWRcbiIsIGRyaXZlci0+ZHJpdmVyLm5hbWUpOwogCiAJLyogTm93IGxvb2sgZm9yIGNsaWVudHMgKi8KLQlkcml2ZXItPmF0dGFjaF9hZGFwdGVyKCZpc2FfYWRhcHRlcik7Ci0KLQlyZXR1cm4gMDsKKwlyZXMgPSBkcml2ZXItPmF0dGFjaF9hZGFwdGVyKCZpc2FfYWRhcHRlcik7CisJaWYgKHJlcykgeworCQlkZXZfZXJyKCZpc2FfYWRhcHRlci5kZXYsCisJCQkiRHJpdmVyICVzIGZhaWxlZCB0byBhdHRhY2ggYWRhcHRlciwgdW5yZWdpc3RlcmluZ1xuIiwKKwkJCWRyaXZlci0+ZHJpdmVyLm5hbWUpOworCQlkcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyLT5kcml2ZXIpOworCX0KKwlyZXR1cm4gcmVzOwogfQogCiBpbnQgaTJjX2lzYV9kZWxfZHJpdmVyKHN0cnVjdCBpMmNfZHJpdmVyICpkcml2ZXIpCkBAIC0xMjUsNiArMTMwLDggQEAKIAogc3RhdGljIGludCBfX2luaXQgaTJjX2lzYV9pbml0KHZvaWQpCiB7CisJaW50IGVycjsKKwogCW11dGV4X2luaXQoJmlzYV9hZGFwdGVyLmNsaXN0X2xvY2spOwogCUlOSVRfTElTVF9IRUFEKCZpc2FfYWRhcHRlci5jbGllbnRzKTsKIApAQCAtMTMzLDggKzE0MCwxNiBAQAogCXNwcmludGYoaXNhX2FkYXB0ZXIuZGV2LmJ1c19pZCwgImkyYy0lZCIsIGlzYV9hZGFwdGVyLm5yKTsKIAlpc2FfYWRhcHRlci5kZXYuZHJpdmVyID0gJmkyY19hZGFwdGVyX2RyaXZlcjsKIAlpc2FfYWRhcHRlci5kZXYucmVsZWFzZSA9ICZpMmNfYWRhcHRlcl9kZXZfcmVsZWFzZTsKLQlkZXZpY2VfcmVnaXN0ZXIoJmlzYV9hZGFwdGVyLmRldik7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZpc2FfYWRhcHRlci5kZXYsICZkZXZfYXR0cl9uYW1lKTsKKwllcnIgPSBkZXZpY2VfcmVnaXN0ZXIoJmlzYV9hZGFwdGVyLmRldik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgImkyYy1pc2E6IEZhaWxlZCB0byByZWdpc3RlciBkZXZpY2VcbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmaXNhX2FkYXB0ZXIuZGV2LCAmZGV2X2F0dHJfbmFtZSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgImkyYy1pc2E6IEZhaWxlZCB0byBjcmVhdGUgbmFtZSBmaWxlXG4iKTsKKwkJZ290byBleGl0X3VucmVnaXN0ZXI7CisJfQogCiAJLyogQWRkIHRoaXMgYWRhcHRlciB0byB0aGUgaTJjX2FkYXB0ZXIgY2xhc3MgKi8KIAltZW1zZXQoJmlzYV9hZGFwdGVyLmNsYXNzX2RldiwgMHgwMCwgc2l6ZW9mKHN0cnVjdCBjbGFzc19kZXZpY2UpKTsKQEAgLTE0MiwxMSArMTU3LDI0IEBACiAJaXNhX2FkYXB0ZXIuY2xhc3NfZGV2LmNsYXNzID0gJmkyY19hZGFwdGVyX2NsYXNzOwogCXN0cmxjcHkoaXNhX2FkYXB0ZXIuY2xhc3NfZGV2LmNsYXNzX2lkLCBpc2FfYWRhcHRlci5kZXYuYnVzX2lkLAogCQlCVVNfSURfU0laRSk7Ci0JY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZpc2FfYWRhcHRlci5jbGFzc19kZXYpOworCWVyciA9IGNsYXNzX2RldmljZV9yZWdpc3RlcigmaXNhX2FkYXB0ZXIuY2xhc3NfZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTJjLWlzYTogRmFpbGVkIHRvIHJlZ2lzdGVyIGNsYXNzIGRldmljZVxuIik7CisJCWdvdG8gZXhpdF9yZW1vdmVfbmFtZTsKKwl9CiAKIAlkZXZfZGJnKCZpc2FfYWRhcHRlci5kZXYsICIlcyByZWdpc3RlcmVkXG4iLCBpc2FfYWRhcHRlci5uYW1lKTsKIAogCXJldHVybiAwOworCitleGl0X3JlbW92ZV9uYW1lOgorCWRldmljZV9yZW1vdmVfZmlsZSgmaXNhX2FkYXB0ZXIuZGV2LCAmZGV2X2F0dHJfbmFtZSk7CitleGl0X3VucmVnaXN0ZXI6CisJaW5pdF9jb21wbGV0aW9uKCZpc2FfYWRhcHRlci5kZXZfcmVsZWFzZWQpOyAvKiBOZWVkZWQ/ICovCisJZGV2aWNlX3VucmVnaXN0ZXIoJmlzYV9hZGFwdGVyLmRldik7CisJd2FpdF9mb3JfY29tcGxldGlvbigmaXNhX2FkYXB0ZXIuZGV2X3JlbGVhc2VkKTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGkyY19pc2FfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHAyMDAwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDIwMDAuYwppbmRleCBjZDZmNDVkLi5kZDNmNGNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDIwMDAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDIwMDAuYwpAQCAtMTE0LDcgKzExNCw2IEBACiAJZHJ2X2RhdGEtPmFsZ29fZGF0YS5nZXRzZGEgPSBpeHAyMDAwX2JpdF9nZXRzZGE7CiAJZHJ2X2RhdGEtPmFsZ29fZGF0YS5nZXRzY2wgPSBpeHAyMDAwX2JpdF9nZXRzY2w7CiAJZHJ2X2RhdGEtPmFsZ29fZGF0YS51ZGVsYXkgPSA2OwotCWRydl9kYXRhLT5hbGdvX2RhdGEubWRlbGF5ID0gNjsKIAlkcnZfZGF0YS0+YWxnb19kYXRhLnRpbWVvdXQgPSAxMDA7CiAKIAlkcnZfZGF0YS0+YWRhcHRlci5pZCA9IEkyQ19IV19CX0lYUDIwMDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDR4eC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1peHA0eHguYwppbmRleCAyZWQwNzExLi5hYjU3MzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWl4cDR4eC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaXhwNHh4LmMKQEAgLTEyMiw3ICsxMjIsNiBAQAogCWRydl9kYXRhLT5hbGdvX2RhdGEuZ2V0c2RhID0gaXhwNHh4X2JpdF9nZXRzZGE7CiAJZHJ2X2RhdGEtPmFsZ29fZGF0YS5nZXRzY2wgPSBpeHA0eHhfYml0X2dldHNjbDsKIAlkcnZfZGF0YS0+YWxnb19kYXRhLnVkZWxheSA9IDEwOwotCWRydl9kYXRhLT5hbGdvX2RhdGEubWRlbGF5ID0gMTA7CiAJZHJ2X2RhdGEtPmFsZ29fZGF0YS50aW1lb3V0ID0gMTAwOwogCiAJZHJ2X2RhdGEtPmFkYXB0ZXIuaWQgPSBJMkNfSFdfQl9JWFA0WFg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tcGMuYwppbmRleCAzNzdhYjQwLi4xNTVhOTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXBjLmMKQEAgLTI3Miw3ICsyNzIsNyBAQAogCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMOwogfQogCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gbXBjX2FsZ28gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gbXBjX2FsZ28gPSB7CiAJLm1hc3Rlcl94ZmVyID0gbXBjX3hmZXIsCiAJLmZ1bmN0aW9uYWxpdHkgPSBtcGNfZnVuY3Rpb25hbGl0eSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW12NjR4eHguYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXY2NHh4eC5jCmluZGV4IGFjNWNkZTEuLmVhY2JhZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXY2NHh4eC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXY2NHh4eC5jCkBAIC00MzEsNyArNDMxLDcgQEAKIAlyZXR1cm4gbnVtOwogfQogCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gbXY2NHh4eF9pMmNfYWxnbyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBtdjY0eHh4X2kyY19hbGdvID0gewogCS5tYXN0ZXJfeGZlciA9IG12NjR4eHhfaTJjX3hmZXIsCiAJLmZ1bmN0aW9uYWxpdHkgPSBtdjY0eHh4X2kyY19mdW5jdGlvbmFsaXR5LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbmZvcmNlMi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLmMKaW5kZXggNjA0YjQ5ZS4uZTAyOTJlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogc3RhdGljIHUzMiBuZm9yY2UyX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKIAogCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNtYnVzX2FsZ29yaXRobSA9IHsKIAkuc21idXNfeGZlciA9IG5mb3JjZTJfYWNjZXNzLAogCS5mdW5jdGlvbmFsaXR5ID0gbmZvcmNlMl9mdW5jLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2NvcmVzLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9jb3Jlcy5jCmluZGV4IDU5MjgyNDAuLjk1MmEyOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2NvcmVzLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY29yZXMuYwpAQCAtMTk5LDcgKzE5OSw3IEBACiAJcmV0dXJuIEkyQ19GVU5DX0kyQyB8IEkyQ19GVU5DX1NNQlVTX0VNVUw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBvY29yZXNfYWxnb3JpdGhtID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIG9jb3Jlc19hbGdvcml0aG0gPSB7CiAJLm1hc3Rlcl94ZmVyCT0gb2NvcmVzX3hmZXIsCiAJLmZ1bmN0aW9uYWxpdHkJPSBvY29yZXNfZnVuYywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9tYXAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDg3ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9tYXAuYwpAQCAtMCwwICsxLDY3NiBAQAorLyoKKyAqIFRJIE9NQVAgSTJDIG1hc3RlciBtb2RlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVGV4YXMgSW5zdHJ1bWVudHMuCisgKgorICogVXBkYXRlZCB0byB3b3JrIHdpdGggbXVsdGlwbGUgSTJDIGludGVyZmFjZXMgb24gMjR4eCBieQorICogVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4gYW5kIEltcmUgRGVhayA8aW1yZS5kZWFrQG5va2lhLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgorICoKKyAqIENsZWFuZWQgdXAgYnkgSnVoYSBZcmr2bOQgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisvKiB0aW1lb3V0IHdhaXRpbmcgZm9yIHRoZSBjb250cm9sbGVyIHRvIHJlc3BvbmQgKi8KKyNkZWZpbmUgT01BUF9JMkNfVElNRU9VVCAobXNlY3NfdG9famlmZmllcygxMDAwKSkKKworI2RlZmluZSBPTUFQX0kyQ19SRVZfUkVHCQkweDAwCisjZGVmaW5lIE9NQVBfSTJDX0lFX1JFRwkJCTB4MDQKKyNkZWZpbmUgT01BUF9JMkNfU1RBVF9SRUcJCTB4MDgKKyNkZWZpbmUgT01BUF9JMkNfSVZfUkVHCQkJMHgwYworI2RlZmluZSBPTUFQX0kyQ19TWVNTX1JFRwkJMHgxMAorI2RlZmluZSBPTUFQX0kyQ19CVUZfUkVHCQkweDE0CisjZGVmaW5lIE9NQVBfSTJDX0NOVF9SRUcJCTB4MTgKKyNkZWZpbmUgT01BUF9JMkNfREFUQV9SRUcJCTB4MWMKKyNkZWZpbmUgT01BUF9JMkNfU1lTQ19SRUcJCTB4MjAKKyNkZWZpbmUgT01BUF9JMkNfQ09OX1JFRwkJMHgyNAorI2RlZmluZSBPTUFQX0kyQ19PQV9SRUcJCQkweDI4CisjZGVmaW5lIE9NQVBfSTJDX1NBX1JFRwkJCTB4MmMKKyNkZWZpbmUgT01BUF9JMkNfUFNDX1JFRwkJMHgzMAorI2RlZmluZSBPTUFQX0kyQ19TQ0xMX1JFRwkJMHgzNAorI2RlZmluZSBPTUFQX0kyQ19TQ0xIX1JFRwkJMHgzOAorI2RlZmluZSBPTUFQX0kyQ19TWVNURVNUX1JFRwkJMHgzYworCisvKiBJMkMgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAoT01BUF9JMkNfSUUpOiAqLworI2RlZmluZSBPTUFQX0kyQ19JRV9YUkRZCSgxIDw8IDQpCS8qIFRYIGRhdGEgcmVhZHkgaW50IGVuYWJsZSAqLworI2RlZmluZSBPTUFQX0kyQ19JRV9SUkRZCSgxIDw8IDMpCS8qIFJYIGRhdGEgcmVhZHkgaW50IGVuYWJsZSAqLworI2RlZmluZSBPTUFQX0kyQ19JRV9BUkRZCSgxIDw8IDIpCS8qIEFjY2VzcyByZWFkeSBpbnQgZW5hYmxlICovCisjZGVmaW5lIE9NQVBfSTJDX0lFX05BQ0sJKDEgPDwgMSkJLyogTm8gYWNrIGludGVycnVwdCBlbmFibGUgKi8KKyNkZWZpbmUgT01BUF9JMkNfSUVfQUwJCSgxIDw8IDApCS8qIEFyYml0cmF0aW9uIGxvc3QgaW50IGVuYSAqLworCisvKiBJMkMgU3RhdHVzIFJlZ2lzdGVyIChPTUFQX0kyQ19TVEFUKTogKi8KKyNkZWZpbmUgT01BUF9JMkNfU1RBVF9TQkQJKDEgPDwgMTUpCS8qIFNpbmdsZSBieXRlIGRhdGEgKi8KKyNkZWZpbmUgT01BUF9JMkNfU1RBVF9CQgkoMSA8PCAxMikJLyogQnVzIGJ1c3kgKi8KKyNkZWZpbmUgT01BUF9JMkNfU1RBVF9ST1ZSCSgxIDw8IDExKQkvKiBSZWNlaXZlIG92ZXJydW4gKi8KKyNkZWZpbmUgT01BUF9JMkNfU1RBVF9YVURGCSgxIDw8IDEwKQkvKiBUcmFuc21pdCB1bmRlcmZsb3cgKi8KKyNkZWZpbmUgT01BUF9JMkNfU1RBVF9BQVMJKDEgPDwgOSkJLyogQWRkcmVzcyBhcyBzbGF2ZSAqLworI2RlZmluZSBPTUFQX0kyQ19TVEFUX0FEMAkoMSA8PCA4KQkvKiBBZGRyZXNzIHplcm8gKi8KKyNkZWZpbmUgT01BUF9JMkNfU1RBVF9YUkRZCSgxIDw8IDQpCS8qIFRyYW5zbWl0IGRhdGEgcmVhZHkgKi8KKyNkZWZpbmUgT01BUF9JMkNfU1RBVF9SUkRZCSgxIDw8IDMpCS8qIFJlY2VpdmUgZGF0YSByZWFkeSAqLworI2RlZmluZSBPTUFQX0kyQ19TVEFUX0FSRFkJKDEgPDwgMikJLyogUmVnaXN0ZXIgYWNjZXNzIHJlYWR5ICovCisjZGVmaW5lIE9NQVBfSTJDX1NUQVRfTkFDSwkoMSA8PCAxKQkvKiBObyBhY2sgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBPTUFQX0kyQ19TVEFUX0FMCSgxIDw8IDApCS8qIEFyYml0cmF0aW9uIGxvc3QgaW50IGVuYSAqLworCisvKiBJMkMgQnVmZmVyIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKE9NQVBfSTJDX0JVRik6ICovCisjZGVmaW5lIE9NQVBfSTJDX0JVRl9SRE1BX0VOCSgxIDw8IDE1KQkvKiBSWCBETUEgY2hhbm5lbCBlbmFibGUgKi8KKyNkZWZpbmUgT01BUF9JMkNfQlVGX1hETUFfRU4JKDEgPDwgNykJLyogVFggRE1BIGNoYW5uZWwgZW5hYmxlICovCisKKy8qIEkyQyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChPTUFQX0kyQ19DT04pOiAqLworI2RlZmluZSBPTUFQX0kyQ19DT05fRU4JCSgxIDw8IDE1KQkvKiBJMkMgbW9kdWxlIGVuYWJsZSAqLworI2RlZmluZSBPTUFQX0kyQ19DT05fQkUJCSgxIDw8IDE0KQkvKiBCaWcgZW5kaWFuIG1vZGUgKi8KKyNkZWZpbmUgT01BUF9JMkNfQ09OX1NUQgkoMSA8PCAxMSkJLyogU3RhcnQgYnl0ZSBtb2RlIChtYXN0ZXIpICovCisjZGVmaW5lIE9NQVBfSTJDX0NPTl9NU1QJKDEgPDwgMTApCS8qIE1hc3Rlci9zbGF2ZSBtb2RlICovCisjZGVmaW5lIE9NQVBfSTJDX0NPTl9UUlgJKDEgPDwgOSkJLyogVFgvUlggbW9kZSAobWFzdGVyIG9ubHkpICovCisjZGVmaW5lIE9NQVBfSTJDX0NPTl9YQQkJKDEgPDwgOCkJLyogRXhwYW5kIGFkZHJlc3MgKi8KKyNkZWZpbmUgT01BUF9JMkNfQ09OX1JNCQkoMSA8PCAyKQkvKiBSZXBlYXQgbW9kZSAobWFzdGVyIG9ubHkpICovCisjZGVmaW5lIE9NQVBfSTJDX0NPTl9TVFAJKDEgPDwgMSkJLyogU3RvcCBjb25kIChtYXN0ZXIgb25seSkgKi8KKyNkZWZpbmUgT01BUF9JMkNfQ09OX1NUVAkoMSA8PCAwKQkvKiBTdGFydCBjb25kaXRpb24gKG1hc3RlcikgKi8KKworLyogSTJDIFN5c3RlbSBUZXN0IFJlZ2lzdGVyIChPTUFQX0kyQ19TWVNURVNUKTogKi8KKyNpZmRlZiBERUJVRworI2RlZmluZSBPTUFQX0kyQ19TWVNURVNUX1NUX0VOCQkoMSA8PCAxNSkJLyogU3lzdGVtIHRlc3QgZW5hYmxlICovCisjZGVmaW5lIE9NQVBfSTJDX1NZU1RFU1RfRlJFRQkJKDEgPDwgMTQpCS8qIEZyZWUgcnVubmluZyBtb2RlICovCisjZGVmaW5lIE9NQVBfSTJDX1NZU1RFU1RfVE1PREVfTUFTSwkoMyA8PCAxMikJLyogVGVzdCBtb2RlIHNlbGVjdCAqLworI2RlZmluZSBPTUFQX0kyQ19TWVNURVNUX1RNT0RFX1NISUZUCSgxMikJCS8qIFRlc3QgbW9kZSBzZWxlY3QgKi8KKyNkZWZpbmUgT01BUF9JMkNfU1lTVEVTVF9TQ0xfSQkJKDEgPDwgMykJLyogU0NMIGxpbmUgc2Vuc2UgaW4gKi8KKyNkZWZpbmUgT01BUF9JMkNfU1lTVEVTVF9TQ0xfTwkJKDEgPDwgMikJLyogU0NMIGxpbmUgZHJpdmUgb3V0ICovCisjZGVmaW5lIE9NQVBfSTJDX1NZU1RFU1RfU0RBX0kJCSgxIDw8IDEpCS8qIFNEQSBsaW5lIHNlbnNlIGluICovCisjZGVmaW5lIE9NQVBfSTJDX1NZU1RFU1RfU0RBX08JCSgxIDw8IDApCS8qIFNEQSBsaW5lIGRyaXZlIG91dCAqLworI2VuZGlmCisKKy8qIEkyQyBTeXN0ZW0gU3RhdHVzIHJlZ2lzdGVyIChPTUFQX0kyQ19TWVNTKTogKi8KKyNkZWZpbmUgT01BUF9JMkNfU1lTU19SRE9ORQkJKDEgPDwgMCkJLyogUmVzZXQgRG9uZSAqLworCisvKiBJMkMgU3lzdGVtIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKE9NQVBfSTJDX1NZU0MpOiAqLworI2RlZmluZSBPTUFQX0kyQ19TWVNDX1NSU1QJCSgxIDw8IDEpCS8qIFNvZnQgUmVzZXQgKi8KKworLyogUkVWSVNJVDogVXNlIHBsYXRmb3JtX2RhdGEgaW5zdGVhZCBvZiBtb2R1bGUgcGFyYW1ldGVycyAqLworLyogRmFzdCBNb2RlID0gNDAwIGtIeiwgU3RhbmRhcmQgPSAxMDAga0h6ICovCitzdGF0aWMgaW50IGNsb2NrID0gMTAwOyAvKiBEZWZhdWx0OiAxMDAga0h6ICovCittb2R1bGVfcGFyYW0oY2xvY2ssIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGNsb2NrLCAiU2V0IEkyQyBjbG9jayBpbiBrSHo6IDQwMD1mYXN0IG1vZGUgKGRlZmF1bHQgPT0gMTAwKSIpOworCitzdHJ1Y3Qgb21hcF9pMmNfZGV2IHsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXZvaWQgX19pb21lbQkJKmJhc2U7CQkvKiB2aXJ0dWFsICovCisJaW50CQkJaXJxOworCXN0cnVjdCBjbGsJCSppY2xrOwkJLyogSW50ZXJmYWNlIGNsb2NrICovCisJc3RydWN0IGNsawkJKmZjbGs7CQkvKiBGdW5jdGlvbmFsIGNsb2NrICovCisJc3RydWN0IGNvbXBsZXRpb24JY21kX2NvbXBsZXRlOworCXN0cnVjdCByZXNvdXJjZQkJKmlvYXJlYTsKKwl1MTYJCQljbWRfZXJyOworCXU4CQkJKmJ1ZjsKKwlzaXplX3QJCQlidWZfbGVuOworCXN0cnVjdCBpMmNfYWRhcHRlcglhZGFwdGVyOworCXVuc2lnbmVkCQlyZXYxOjE7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9pMmNfd3JpdGVfcmVnKHN0cnVjdCBvbWFwX2kyY19kZXYgKmkyY19kZXYsCisJCQkJICAgICAgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlfX3Jhd193cml0ZXcodmFsLCBpMmNfZGV2LT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgb21hcF9pMmNfcmVhZF9yZWcoc3RydWN0IG9tYXBfaTJjX2RldiAqaTJjX2RldiwgaW50IHJlZykKK3sKKwlyZXR1cm4gX19yYXdfcmVhZHcoaTJjX2Rldi0+YmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9pMmNfZ2V0X2Nsb2NrcyhzdHJ1Y3Qgb21hcF9pMmNfZGV2ICpkZXYpCit7CisJaWYgKGNwdV9pc19vbWFwMTZ4eCgpIHx8IGNwdV9pc19vbWFwMjR4eCgpKSB7CisJCWRldi0+aWNsayA9IGNsa19nZXQoZGV2LT5kZXYsICJpMmNfaWNrIik7CisJCWlmIChJU19FUlIoZGV2LT5pY2xrKSkgeworCQkJZGV2LT5pY2xrID0gTlVMTDsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJZGV2LT5mY2xrID0gY2xrX2dldChkZXYtPmRldiwgImkyY19mY2siKTsKKwlpZiAoSVNfRVJSKGRldi0+ZmNsaykpIHsKKwkJaWYgKGRldi0+aWNsayAhPSBOVUxMKSB7CisJCQljbGtfcHV0KGRldi0+aWNsayk7CisJCQlkZXYtPmljbGsgPSBOVUxMOworCQl9CisJCWRldi0+ZmNsayA9IE5VTEw7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvbWFwX2kyY19wdXRfY2xvY2tzKHN0cnVjdCBvbWFwX2kyY19kZXYgKmRldikKK3sKKwljbGtfcHV0KGRldi0+ZmNsayk7CisJZGV2LT5mY2xrID0gTlVMTDsKKwlpZiAoZGV2LT5pY2xrICE9IE5VTEwpIHsKKwkJY2xrX3B1dChkZXYtPmljbGspOworCQlkZXYtPmljbGsgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgb21hcF9pMmNfZW5hYmxlX2Nsb2NrcyhzdHJ1Y3Qgb21hcF9pMmNfZGV2ICpkZXYpCit7CisJaWYgKGRldi0+aWNsayAhPSBOVUxMKQorCQljbGtfZW5hYmxlKGRldi0+aWNsayk7CisJY2xrX2VuYWJsZShkZXYtPmZjbGspOworfQorCitzdGF0aWMgdm9pZCBvbWFwX2kyY19kaXNhYmxlX2Nsb2NrcyhzdHJ1Y3Qgb21hcF9pMmNfZGV2ICpkZXYpCit7CisJaWYgKGRldi0+aWNsayAhPSBOVUxMKQorCQljbGtfZGlzYWJsZShkZXYtPmljbGspOworCWNsa19kaXNhYmxlKGRldi0+ZmNsayk7Cit9CisKK3N0YXRpYyBpbnQgb21hcF9pMmNfaW5pdChzdHJ1Y3Qgb21hcF9pMmNfZGV2ICpkZXYpCit7CisJdTE2IHBzYyA9IDA7CisJdW5zaWduZWQgbG9uZyBmY2xrX3JhdGUgPSAxMjAwMDAwMDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwlpZiAoIWRldi0+cmV2MSkgeworCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19TWVNDX1JFRywgT01BUF9JMkNfU1lTQ19TUlNUKTsKKwkJLyogRm9yIHNvbWUgcmVhc29uIHdlIG5lZWQgdG8gc2V0IHRoZSBFTiBiaXQgYmVmb3JlIHRoZQorCQkgKiByZXNldCBkb25lIGJpdCBnZXRzIHNldC4gKi8KKwkJdGltZW91dCA9IGppZmZpZXMgKyBPTUFQX0kyQ19USU1FT1VUOworCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHLCBPTUFQX0kyQ19DT05fRU4pOworCQl3aGlsZSAoIShvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX1NZU1NfUkVHKSAmCisJCQkgT01BUF9JMkNfU1lTU19SRE9ORSkpIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQkJZGV2X3dhcm4oZGV2LT5kZXYsICJ0aW1lb3V0IHdhaXRpbmciCisJCQkJCQkiZm9yIGNvbnRyb2xsZXIgcmVzZXRcbiIpOworCQkJCXJldHVybiAtRVRJTUVET1VUOworCQkJfQorCQkJbXNsZWVwKDEpOworCQl9CisJfQorCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcsIDApOworCisJaWYgKGNwdV9jbGFzc19pc19vbWFwMSgpKSB7CisJCXN0cnVjdCBjbGsgKmFybXhvcl9jazsKKworCQlhcm14b3JfY2sgPSBjbGtfZ2V0KE5VTEwsICJhcm14b3JfY2siKTsKKwkJaWYgKElTX0VSUihhcm14b3JfY2spKQorCQkJZGV2X3dhcm4oZGV2LT5kZXYsICJDb3VsZCBub3QgZ2V0IGFybXhvcl9ja1xuIik7CisJCWVsc2UgeworCQkJZmNsa19yYXRlID0gY2xrX2dldF9yYXRlKGFybXhvcl9jayk7CisJCQljbGtfcHV0KGFybXhvcl9jayk7CisJCX0KKwkJLyogVFJNIGZvciA1OTEyIHNheXMgdGhlIEkyQyBjbG9jayBtdXN0IGJlIHByZXNjYWxlZCB0byBiZQorCQkgKiBiZXR3ZWVuIDcgLSAxMiBNSHouIFRoZSBYT1IgaW5wdXQgY2xvY2sgaXMgdHlwaWNhbGx5CisJCSAqIDEyLCAxMyBvciAxOS4yIE1Iei4gU28gd2Ugc2hvdWxkIGhhdmUgY29kZSB0aGF0IHByb2R1Y2VzOgorCQkgKgorCQkgKiBYT1IgTUh6CURpdmlkZXIJCVByZXNjYWxlcgorCQkgKiAxMgkJMQkJMAorCQkgKiAxMwkJMgkJMQorCQkgKiAxOS4yCQkyCQkxCisJCSAqLworCQlpZiAoZmNsa19yYXRlID4gMTYwMDAwMDApCisJCQlwc2MgPSAoZmNsa19yYXRlICsgODAwMDAwMCkgLyAxMjAwMDAwMDsKKwl9CisKKwkvKiBTZXR1cCBjbG9jayBwcmVzY2FsZXIgdG8gb2J0YWluIGFwcHJveCAxMk1IeiBJMkMgbW9kdWxlIGNsb2NrOiAqLworCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1BTQ19SRUcsIHBzYyk7CisKKwkvKiBQcm9ncmFtIGRlc2lyZWQgb3BlcmF0aW5nIHJhdGUgKi8KKwlmY2xrX3JhdGUgLz0gKHBzYyArIDEpICogMTAwMDsKKwlpZiAocHNjID4gMikKKwkJcHNjID0gMjsKKworCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1NDTExfUkVHLAorCQkJICAgZmNsa19yYXRlIC8gKGNsb2NrICogMikgLSA3ICsgcHNjKTsKKwlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19TQ0xIX1JFRywKKwkJCSAgIGZjbGtfcmF0ZSAvIChjbG9jayAqIDIpIC0gNyArIHBzYyk7CisKKwkvKiBUYWtlIHRoZSBJMkMgbW9kdWxlIG91dCBvZiByZXNldDogKi8KKwlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHLCBPTUFQX0kyQ19DT05fRU4pOworCisJLyogRW5hYmxlIGludGVycnVwdHMgKi8KKwlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19JRV9SRUcsCisJCQkgICAoT01BUF9JMkNfSUVfWFJEWSB8IE9NQVBfSTJDX0lFX1JSRFkgfAorCQkJICAgIE9NQVBfSTJDX0lFX0FSRFkgfCBPTUFQX0kyQ19JRV9OQUNLIHwKKwkJCSAgICBPTUFQX0kyQ19JRV9BTCkpOworCXJldHVybiAwOworfQorCisvKgorICogV2FpdGluZyBvbiBCdXMgQnVzeQorICovCitzdGF0aWMgaW50IG9tYXBfaTJjX3dhaXRfZm9yX2JiKHN0cnVjdCBvbWFwX2kyY19kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIE9NQVBfSTJDX1RJTUVPVVQ7CisJd2hpbGUgKG9tYXBfaTJjX3JlYWRfcmVnKGRldiwgT01BUF9JMkNfU1RBVF9SRUcpICYgT01BUF9JMkNfU1RBVF9CQikgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJZGV2X3dhcm4oZGV2LT5kZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIGJ1cyByZWFkeVxuIik7CisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwkJfQorCQltc2xlZXAoMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMb3cgbGV2ZWwgbWFzdGVyIHJlYWQvd3JpdGUgdHJhbnNhY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgb21hcF9pMmNfeGZlcl9tc2coc3RydWN0IGkyY19hZGFwdGVyICphZGFwLAorCQkJICAgICBzdHJ1Y3QgaTJjX21zZyAqbXNnLCBpbnQgc3RvcCkKK3sKKwlzdHJ1Y3Qgb21hcF9pMmNfZGV2ICpkZXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCWludCByOworCXUxNiB3OworCisJZGV2X2RiZyhkZXYtPmRldiwgImFkZHI6IDB4JTA0eCwgbGVuOiAlZCwgZmxhZ3M6IDB4JXgsIHN0b3A6ICVkXG4iLAorCQltc2ctPmFkZHIsIG1zZy0+bGVuLCBtc2ctPmZsYWdzLCBzdG9wKTsKKworCWlmIChtc2ctPmxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1NBX1JFRywgbXNnLT5hZGRyKTsKKworCS8qIFJFVklTSVQ6IENvdWxkIHRoZSBTVEIgYml0IG9mIEkyQ19DT04gYmUgdXNlZCB3aXRoIHByb2Jpbmc/ICovCisJZGV2LT5idWYgPSBtc2ctPmJ1ZjsKKwlkZXYtPmJ1Zl9sZW4gPSBtc2ctPmxlbjsKKworCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0NOVF9SRUcsIGRldi0+YnVmX2xlbik7CisKKwlpbml0X2NvbXBsZXRpb24oJmRldi0+Y21kX2NvbXBsZXRlKTsKKwlkZXYtPmNtZF9lcnIgPSAwOworCisJdyA9IE9NQVBfSTJDX0NPTl9FTiB8IE9NQVBfSTJDX0NPTl9NU1QgfCBPTUFQX0kyQ19DT05fU1RUOworCWlmIChtc2ctPmZsYWdzICYgSTJDX01fVEVOKQorCQl3IHw9IE9NQVBfSTJDX0NPTl9YQTsKKwlpZiAoIShtc2ctPmZsYWdzICYgSTJDX01fUkQpKQorCQl3IHw9IE9NQVBfSTJDX0NPTl9UUlg7CisJaWYgKHN0b3ApCisJCXcgfD0gT01BUF9JMkNfQ09OX1NUUDsKKwlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHLCB3KTsKKworCXIgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmZGV2LT5jbWRfY29tcGxldGUsCisJCQkJCQkgICAgICBPTUFQX0kyQ19USU1FT1VUKTsKKwlkZXYtPmJ1Zl9sZW4gPSAwOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisJaWYgKHIgPT0gMCkgeworCQlkZXZfZXJyKGRldi0+ZGV2LCAiY29udHJvbGxlciB0aW1lZCBvdXRcbiIpOworCQlvbWFwX2kyY19pbml0KGRldik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCWlmIChsaWtlbHkoIWRldi0+Y21kX2VycikpCisJCXJldHVybiAwOworCisJLyogV2UgaGF2ZSBhbiBlcnJvciAqLworCWlmIChkZXYtPmNtZF9lcnIgJiAoT01BUF9JMkNfU1RBVF9BTCB8IE9NQVBfSTJDX1NUQVRfUk9WUiB8CisJCQkgICAgT01BUF9JMkNfU1RBVF9YVURGKSkgeworCQlvbWFwX2kyY19pbml0KGRldik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChkZXYtPmNtZF9lcnIgJiBPTUFQX0kyQ19TVEFUX05BQ0spIHsKKwkJaWYgKG1zZy0+ZmxhZ3MgJiBJMkNfTV9JR05PUkVfTkFLKQorCQkJcmV0dXJuIDA7CisJCWlmIChzdG9wKSB7CisJCQl3ID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19DT05fUkVHKTsKKwkJCXcgfD0gT01BUF9JMkNfQ09OX1NUUDsKKwkJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcsIHcpOworCQl9CisJCXJldHVybiAtRVJFTU9URUlPOworCX0KKwlyZXR1cm4gLUVJTzsKK30KKworCisvKgorICogUHJlcGFyZSBjb250cm9sbGVyIGZvciBhIHRyYW5zYWN0aW9uIGFuZCBjYWxsIG9tYXBfaTJjX3hmZXJfbXNnCisgKiB0byBkbyB0aGUgd29yayBkdXJpbmcgSVJRIHByb2Nlc3NpbmcuCisgKi8KK3N0YXRpYyBpbnQKK29tYXBfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyBtc2dzW10sIGludCBudW0pCit7CisJc3RydWN0IG9tYXBfaTJjX2RldiAqZGV2ID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKKwlpbnQgaTsKKwlpbnQgcjsKKworCW9tYXBfaTJjX2VuYWJsZV9jbG9ja3MoZGV2KTsKKworCS8qIFJFVklTSVQ6IGluaXRpYWxpemUgYW5kIHVzZSBhZGFwLT5yZXRyaWVzLiBUaGlzIGlzIGFuIG9wdGlvbmFsCisJICogZmVhdHVyZSAqLworCWlmICgociA9IG9tYXBfaTJjX3dhaXRfZm9yX2JiKGRldikpIDwgMCkKKwkJZ290byBvdXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJciA9IG9tYXBfaTJjX3hmZXJfbXNnKGFkYXAsICZtc2dzW2ldLCAoaSA9PSAobnVtIC0gMSkpKTsKKwkJaWYgKHIgIT0gMCkKKwkJCWJyZWFrOworCX0KKworCWlmIChyID09IDApCisJCXIgPSBudW07CitvdXQ6CisJb21hcF9pMmNfZGlzYWJsZV9jbG9ja3MoZGV2KTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHUzMgorb21hcF9pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQyB8IChJMkNfRlVOQ19TTUJVU19FTVVMICYgfkkyQ19GVU5DX1NNQlVTX1FVSUNLKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitvbWFwX2kyY19jb21wbGV0ZV9jbWQoc3RydWN0IG9tYXBfaTJjX2RldiAqZGV2LCB1MTYgZXJyKQoreworCWRldi0+Y21kX2VyciB8PSBlcnI7CisJY29tcGxldGUoJmRldi0+Y21kX2NvbXBsZXRlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitvbWFwX2kyY19hY2tfc3RhdChzdHJ1Y3Qgb21hcF9pMmNfZGV2ICpkZXYsIHUxNiBzdGF0KQoreworCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX1NUQVRfUkVHLCBzdGF0KTsKK30KKworc3RhdGljIGlycXJldHVybl90CitvbWFwX2kyY19yZXYxX2lzcihpbnQgdGhpc19pcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG9tYXBfaTJjX2RldiAqZGV2ID0gZGV2X2lkOworCXUxNiBpdiwgdzsKKworCWl2ID0gb21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19JVl9SRUcpOworCXN3aXRjaCAoaXYpIHsKKwljYXNlIDB4MDA6CS8qIE5vbmUgKi8KKwkJYnJlYWs7CisJY2FzZSAweDAxOgkvKiBBcmJpdHJhdGlvbiBsb3N0ICovCisJCWRldl9lcnIoZGV2LT5kZXYsICJBcmJpdHJhdGlvbiBsb3N0XG4iKTsKKwkJb21hcF9pMmNfY29tcGxldGVfY21kKGRldiwgT01BUF9JMkNfU1RBVF9BTCk7CisJCWJyZWFrOworCWNhc2UgMHgwMjoJLyogTm8gYWNrbm93bGVkZ2VtZW50ICovCisJCW9tYXBfaTJjX2NvbXBsZXRlX2NtZChkZXYsIE9NQVBfSTJDX1NUQVRfTkFDSyk7CisJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcsIE9NQVBfSTJDX0NPTl9TVFApOworCQlicmVhazsKKwljYXNlIDB4MDM6CS8qIFJlZ2lzdGVyIGFjY2VzcyByZWFkeSAqLworCQlvbWFwX2kyY19jb21wbGV0ZV9jbWQoZGV2LCAwKTsKKwkJYnJlYWs7CisJY2FzZSAweDA0OgkvKiBSZWNlaXZlIGRhdGEgcmVhZHkgKi8KKwkJaWYgKGRldi0+YnVmX2xlbikgeworCQkJdyA9IG9tYXBfaTJjX3JlYWRfcmVnKGRldiwgT01BUF9JMkNfREFUQV9SRUcpOworCQkJKmRldi0+YnVmKysgPSB3OworCQkJZGV2LT5idWZfbGVuLS07CisJCQlpZiAoZGV2LT5idWZfbGVuKSB7CisJCQkJKmRldi0+YnVmKysgPSB3ID4+IDg7CisJCQkJZGV2LT5idWZfbGVuLS07CisJCQl9CisJCX0gZWxzZQorCQkJZGV2X2VycihkZXYtPmRldiwgIlJSRFkgSVJRIHdoaWxlIG5vIGRhdGEgcmVxdWVzdGVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAweDA1OgkvKiBUcmFuc21pdCBkYXRhIHJlYWR5ICovCisJCWlmIChkZXYtPmJ1Zl9sZW4pIHsKKwkJCXcgPSAqZGV2LT5idWYrKzsKKwkJCWRldi0+YnVmX2xlbi0tOworCQkJaWYgKGRldi0+YnVmX2xlbikgeworCQkJCXcgfD0gKmRldi0+YnVmKysgPDwgODsKKwkJCQlkZXYtPmJ1Zl9sZW4tLTsKKwkJCX0KKwkJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0RBVEFfUkVHLCB3KTsKKwkJfSBlbHNlCisJCQlkZXZfZXJyKGRldi0+ZGV2LCAiWFJEWSBJUlEgd2hpbGUgbm8gZGF0YSB0byBzZW5kXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90CitvbWFwX2kyY19pc3IoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBvbWFwX2kyY19kZXYgKmRldiA9IGRldl9pZDsKKwl1MTYgYml0czsKKwl1MTYgc3RhdCwgdzsKKwlpbnQgY291bnQgPSAwOworCisJYml0cyA9IG9tYXBfaTJjX3JlYWRfcmVnKGRldiwgT01BUF9JMkNfSUVfUkVHKTsKKwl3aGlsZSAoKHN0YXQgPSAob21hcF9pMmNfcmVhZF9yZWcoZGV2LCBPTUFQX0kyQ19TVEFUX1JFRykpKSAmIGJpdHMpIHsKKwkJZGV2X2RiZyhkZXYtPmRldiwgIklSUSAoSVNSID0gMHglMDR4KVxuIiwgc3RhdCk7CisJCWlmIChjb3VudCsrID09IDEwMCkgeworCQkJZGV2X3dhcm4oZGV2LT5kZXYsICJUb28gbXVjaCB3b3JrIGluIG9uZSBJUlFcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19TVEFUX1JFRywgc3RhdCk7CisKKwkJaWYgKHN0YXQgJiBPTUFQX0kyQ19TVEFUX0FSRFkpIHsKKwkJCW9tYXBfaTJjX2NvbXBsZXRlX2NtZChkZXYsIDApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN0YXQgJiBPTUFQX0kyQ19TVEFUX1JSRFkpIHsKKwkJCXcgPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX0RBVEFfUkVHKTsKKwkJCWlmIChkZXYtPmJ1Zl9sZW4pIHsKKwkJCQkqZGV2LT5idWYrKyA9IHc7CisJCQkJZGV2LT5idWZfbGVuLS07CisJCQkJaWYgKGRldi0+YnVmX2xlbikgeworCQkJCQkqZGV2LT5idWYrKyA9IHcgPj4gODsKKwkJCQkJZGV2LT5idWZfbGVuLS07CisJCQkJfQorCQkJfSBlbHNlCisJCQkJZGV2X2VycihkZXYtPmRldiwgIlJSRFkgSVJRIHdoaWxlIG5vIGRhdGEiCisJCQkJCQkicmVxdWVzdGVkXG4iKTsKKwkJCW9tYXBfaTJjX2Fja19zdGF0KGRldiwgT01BUF9JMkNfU1RBVF9SUkRZKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdGF0ICYgT01BUF9JMkNfU1RBVF9YUkRZKSB7CisJCQl3ID0gMDsKKwkJCWlmIChkZXYtPmJ1Zl9sZW4pIHsKKwkJCQl3ID0gKmRldi0+YnVmKys7CisJCQkJZGV2LT5idWZfbGVuLS07CisJCQkJaWYgKGRldi0+YnVmX2xlbikgeworCQkJCQl3IHw9ICpkZXYtPmJ1ZisrIDw8IDg7CisJCQkJCWRldi0+YnVmX2xlbi0tOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWRldl9lcnIoZGV2LT5kZXYsICJYUkRZIElSUSB3aGlsZSBubyIKKwkJCQkJImRhdGEgdG8gc2VuZFxuIik7CisJCQlvbWFwX2kyY193cml0ZV9yZWcoZGV2LCBPTUFQX0kyQ19EQVRBX1JFRywgdyk7CisJCQlvbWFwX2kyY19hY2tfc3RhdChkZXYsIE9NQVBfSTJDX1NUQVRfWFJEWSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RhdCAmIE9NQVBfSTJDX1NUQVRfUk9WUikgeworCQkJZGV2X2VycihkZXYtPmRldiwgIlJlY2VpdmUgb3ZlcnJ1blxuIik7CisJCQlkZXYtPmNtZF9lcnIgfD0gT01BUF9JMkNfU1RBVF9ST1ZSOworCQl9CisJCWlmIChzdGF0ICYgT01BUF9JMkNfU1RBVF9YVURGKSB7CisJCQlkZXZfZXJyKGRldi0+ZGV2LCAiVHJhbnNtaXQgb3ZlcmZsb3dcbiIpOworCQkJZGV2LT5jbWRfZXJyIHw9IE9NQVBfSTJDX1NUQVRfWFVERjsKKwkJfQorCQlpZiAoc3RhdCAmIE9NQVBfSTJDX1NUQVRfTkFDSykgeworCQkJb21hcF9pMmNfY29tcGxldGVfY21kKGRldiwgT01BUF9JMkNfU1RBVF9OQUNLKTsKKwkJCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcsCisJCQkJCSAgIE9NQVBfSTJDX0NPTl9TVFApOworCQl9CisJCWlmIChzdGF0ICYgT01BUF9JMkNfU1RBVF9BTCkgeworCQkJZGV2X2VycihkZXYtPmRldiwgIkFyYml0cmF0aW9uIGxvc3RcbiIpOworCQkJb21hcF9pMmNfY29tcGxldGVfY21kKGRldiwgT01BUF9JMkNfU1RBVF9BTCk7CisJCX0KKwl9CisKKwlyZXR1cm4gY291bnQgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gb21hcF9pMmNfYWxnbyA9IHsKKwkubWFzdGVyX3hmZXIJPSBvbWFwX2kyY194ZmVyLAorCS5mdW5jdGlvbmFsaXR5CT0gb21hcF9pMmNfZnVuYywKK307CisKK3N0YXRpYyBpbnQKK29tYXBfaTJjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG9tYXBfaTJjX2RldgkqZGV2OworCXN0cnVjdCBpMmNfYWRhcHRlcgkqYWRhcDsKKwlzdHJ1Y3QgcmVzb3VyY2UJCSptZW0sICppcnEsICppb2FyZWE7CisJaW50IHI7CisKKwkvKiBOT1RFOiBkcml2ZXIgdXNlcyB0aGUgc3RhdGljIHJlZ2lzdGVyIG1hcHBpbmcgKi8KKwltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghbWVtKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIG1lbSByZXNvdXJjZT9cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaXJxID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlpZiAoIWlycSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBpcnEgcmVzb3VyY2U/XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaW9hcmVhID0gcmVxdWVzdF9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIChtZW0tPmVuZCAtIG1lbS0+c3RhcnQpICsgMSwKKwkJCXBkZXYtPm5hbWUpOworCWlmICghaW9hcmVhKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkkyQyByZWdpb24gYWxyZWFkeSBjbGFpbWVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoY2xvY2sgPiAyMDApCisJCWNsb2NrID0gNDAwOwkvKiBGYXN0IG1vZGUgKi8KKwllbHNlCisJCWNsb2NrID0gMTAwOwkvKiBTdGFuZGFyZCBtb2RlICovCisKKwlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb21hcF9pMmNfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpIHsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3JlbGVhc2VfcmVnaW9uOworCX0KKworCWRldi0+ZGV2ID0gJnBkZXYtPmRldjsKKwlkZXYtPmlycSA9IGlycS0+c3RhcnQ7CisJZGV2LT5iYXNlID0gKHZvaWQgX19pb21lbSAqKSBJT19BRERSRVNTKG1lbS0+c3RhcnQpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CisKKwlpZiAoKHIgPSBvbWFwX2kyY19nZXRfY2xvY2tzKGRldikpICE9IDApCisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCisJb21hcF9pMmNfZW5hYmxlX2Nsb2NrcyhkZXYpOworCisJaWYgKGNwdV9pc19vbWFwMTV4eCgpKQorCQlkZXYtPnJldjEgPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX1JFVl9SRUcpIDwgMHgyMDsKKworCS8qIHJlc2V0IEFTQVAsIGNsZWFyaW5nIGFueSBJUlFzICovCisJb21hcF9pMmNfaW5pdChkZXYpOworCisJciA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBkZXYtPnJldjEgPyBvbWFwX2kyY19yZXYxX2lzciA6IG9tYXBfaTJjX2lzciwKKwkJCTAsIHBkZXYtPm5hbWUsIGRldik7CisKKwlpZiAocikgeworCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbHVyZSByZXF1ZXN0aW5nIGlycSAlaVxuIiwgZGV2LT5pcnEpOworCQlnb3RvIGVycl91bnVzZV9jbG9ja3M7CisJfQorCXIgPSBvbWFwX2kyY19yZWFkX3JlZyhkZXYsIE9NQVBfSTJDX1JFVl9SRUcpICYgMHhmZjsKKwlkZXZfaW5mbyhkZXYtPmRldiwgImJ1cyAlZCByZXYlZC4lZCBhdCAlZCBrSHpcbiIsCisJCSBwZGV2LT5pZCwgciA+PiA0LCByICYgMHhmLCBjbG9jayk7CisKKwlhZGFwID0gJmRldi0+YWRhcHRlcjsKKwlpMmNfc2V0X2FkYXBkYXRhKGFkYXAsIGRldik7CisJYWRhcC0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlhZGFwLT5jbGFzcyA9IEkyQ19DTEFTU19IV01PTjsKKwlzdHJuY3B5KGFkYXAtPm5hbWUsICJPTUFQIEkyQyBhZGFwdGVyIiwgc2l6ZW9mKGFkYXAtPm5hbWUpKTsKKwlhZGFwLT5hbGdvID0gJm9tYXBfaTJjX2FsZ287CisJYWRhcC0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisKKwkvKiBpMmMgZGV2aWNlIGRyaXZlcnMgbWF5IGJlIGFjdGl2ZSBvbiByZXR1cm4gZnJvbSBhZGRfYWRhcHRlcigpICovCisJciA9IGkyY19hZGRfYWRhcHRlcihhZGFwKTsKKwlpZiAocikgeworCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmFpbHVyZSBhZGRpbmcgYWRhcHRlclxuIik7CisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCX0KKworCW9tYXBfaTJjX2Rpc2FibGVfY2xvY2tzKGRldik7CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworZXJyX3VudXNlX2Nsb2NrczoKKwlvbWFwX2kyY19kaXNhYmxlX2Nsb2NrcyhkZXYpOworCW9tYXBfaTJjX3B1dF9jbG9ja3MoZGV2KTsKK2Vycl9mcmVlX21lbToKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlrZnJlZShkZXYpOworZXJyX3JlbGVhc2VfcmVnaW9uOgorCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcsIDApOworCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCAobWVtLT5lbmQgLSBtZW0tPnN0YXJ0KSArIDEpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQKK29tYXBfaTJjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBvbWFwX2kyY19kZXYJKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByZXNvdXJjZQkJKm1lbTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJaTJjX2RlbF9hZGFwdGVyKCZkZXYtPmFkYXB0ZXIpOworCW9tYXBfaTJjX3dyaXRlX3JlZyhkZXYsIE9NQVBfSTJDX0NPTl9SRUcsIDApOworCW9tYXBfaTJjX3B1dF9jbG9ja3MoZGV2KTsKKwlrZnJlZShkZXYpOworCW1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbS0+c3RhcnQsIChtZW0tPmVuZCAtIG1lbS0+c3RhcnQpICsgMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9tYXBfaTJjX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gb21hcF9pMmNfcHJvYmUsCisJLnJlbW92ZQkJPSBvbWFwX2kyY19yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImkyY19vbWFwIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKKy8qIEkyQyBtYXkgYmUgbmVlZGVkIHRvIGJyaW5nIHVwIG90aGVyIGRyaXZlcnMgKi8KK3N0YXRpYyBpbnQgX19pbml0CitvbWFwX2kyY19pbml0X2RyaXZlcih2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm9tYXBfaTJjX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwob21hcF9pMmNfaW5pdF9kcml2ZXIpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgb21hcF9pMmNfZXhpdF9kcml2ZXIodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb21hcF9pMmNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG9tYXBfaTJjX2V4aXRfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiAoYW5kIG90aGVycykiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVEkgT01BUCBJMkMgYnVzIGFkYXB0ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC1saWdodC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wYXJwb3J0LWxpZ2h0LmMKaW5kZXggZTA5ZWJiYi4uNWViMmJkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wYXJwb3J0LWxpZ2h0LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wYXJwb3J0LWxpZ2h0LmMKQEAgLTEwMyw3ICsxMDMsNiBAQAogCS5nZXRzZGEJCT0gcGFycG9ydF9nZXRzZGEsCiAJLmdldHNjbAkJPSBwYXJwb3J0X2dldHNjbCwKIAkudWRlbGF5CQk9IDUwLAotCS5tZGVsYXkJCT0gNTAsCiAJLnRpbWVvdXQJPSBIWiwKIH07IAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBhcnBvcnQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC5jCmluZGV4IDkzNGJkNTUuLjQ4YTgyOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGFycG9ydC5jCkBAIC0xMzgsNyArMTM4LDYgQEAKIAkuZ2V0c2RhCQk9IHBhcnBvcnRfZ2V0c2RhLAogCS5nZXRzY2wJCT0gcGFycG9ydF9nZXRzY2wsCiAJLnVkZWxheQkJPSA2MCwKLQkubWRlbGF5CQk9IDYwLAogCS50aW1lb3V0CT0gSFosCiB9OyAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jCmluZGV4IDhmMmY2NWIuLjMwYzdhMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGlpeDQuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBpaXg0LmMKQEAgLTM3Niw3ICszNzYsNyBAQAogCSAgICBJMkNfRlVOQ19TTUJVU19CTE9DS19EQVRBOwogfQogCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNtYnVzX2FsZ29yaXRobSA9IHsKIAkuc21idXNfeGZlcgk9IHBpaXg0X2FjY2VzcywKIAkuZnVuY3Rpb25hbGl0eQk9IHBpaXg0X2Z1bmMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wb3dlcm1hYy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wb3dlcm1hYy5jCmluZGV4IGQ2NThkOTEuLmE1MDhjYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG93ZXJtYWMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBvd2VybWFjLmMKQEAgLTE3NSw3ICsxNzUsNyBAQAogfQogCiAvKiBGb3Igbm93LCB3ZSBvbmx5IGhhbmRsZSBzbWJ1cyAqLwotc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGkyY19wb3dlcm1hY19hbGdvcml0aG0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gaTJjX3Bvd2VybWFjX2FsZ29yaXRobSA9IHsKIAkuc21idXNfeGZlcgk9IGkyY19wb3dlcm1hY19zbWJ1c194ZmVyLAogCS5tYXN0ZXJfeGZlcgk9IGkyY19wb3dlcm1hY19tYXN0ZXJfeGZlciwKIAkuZnVuY3Rpb25hbGl0eQk9IGkyY19wb3dlcm1hY19mdW5jLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wcm9zYXZhZ2UuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHJvc2F2YWdlLmMKaW5kZXggOTQ3OTUyNS4uNzc0NWUyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wcm9zYXZhZ2UuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXByb3NhdmFnZS5jCkBAIC0xODAsNyArMTgwLDYgQEAKIAlwLT5hbGdvLmdldHNkYQkgID0gYml0X3MzdmlhX2dldHNkYTsKIAlwLT5hbGdvLmdldHNjbAkgID0gYml0X3MzdmlhX2dldHNjbDsKIAlwLT5hbGdvLnVkZWxheQkgID0gQ1lDTEVfREVMQVk7Ci0JcC0+YWxnby5tZGVsYXkJICA9IENZQ0xFX0RFTEFZOwogCXAtPmFsZ28udGltZW91dAkgID0gVElNRU9VVDsKIAlwLT5hbGdvLmRhdGEJICA9IHA7CiAJcC0+bW12Z2EJICA9IG1tdmdhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcHhhLmMKaW5kZXggZWUxMTRiNC4uY2Q0YWQ5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1weGEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXB4YS5jCkBAIC05MjYsNyArOTI2LDcgQEAKIAlyZXR1cm4gSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfRU1VTDsKIH0KIAotc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIGkyY19weGFfYWxnb3JpdGhtID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIGkyY19weGFfYWxnb3JpdGhtID0gewogCS5tYXN0ZXJfeGZlcgk9IGkyY19weGFfeGZlciwKIAkuZnVuY3Rpb25hbGl0eQk9IGkyY19weGFfZnVuY3Rpb25hbGl0eSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXMzYzI0MTAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jCmluZGV4IDVkMjk1MGUuLjllYmU0MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jCkBAIC01NjYsNyArNTY2LDcgQEAKIAogLyogaTJjIGJ1cyByZWdpc3RyYXRpb24gaW5mbyAqLwogCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gczNjMjR4eF9pMmNfYWxnb3JpdGhtID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIHMzYzI0eHhfaTJjX2FsZ29yaXRobSA9IHsKIAkubWFzdGVyX3hmZXIJCT0gczNjMjR4eF9pMmNfeGZlciwKIAkuZnVuY3Rpb25hbGl0eQkJPSBzM2MyNHh4X2kyY19mdW5jLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2F2YWdlNC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zYXZhZ2U0LmMKaW5kZXggMGM4NTE4Mi4uMjA5ZjQ3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zYXZhZ2U0LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zYXZhZ2U0LmMKQEAgLTE0MCw3ICsxNDAsNiBAQAogCS5nZXRzZGEJCT0gYml0X3NhdmkyY19nZXRzZGEsCiAJLmdldHNjbAkJPSBiaXRfc2F2aTJjX2dldHNjbCwKIAkudWRlbGF5CQk9IENZQ0xFX0RFTEFZLAotCS5tZGVsYXkJCT0gQ1lDTEVfREVMQVksCiAJLnRpbWVvdXQJPSBUSU1FT1VUCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpYnl0ZS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaWJ5dGUuYwppbmRleCBmYTUwM2VkLi44ZjJiMWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpYnl0ZS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lieXRlLmMKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA0IFN0ZXZlbiBKLiBIaWxsCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiwyMDAzIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMCBTaW1vbiBHLiBWb2dsCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKQEAgLTE3LDExICsxOCwxNjIgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1zaWJ5dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfcmVncy5oPgogI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX3NtYnVzLmg+CiAKKworc3RydWN0IGkyY19hbGdvX3NpYnl0ZV9kYXRhIHsKKwl2b2lkICpkYXRhOwkJLyogcHJpdmF0ZSBkYXRhICovCisJaW50ICAgYnVzOwkJLyogd2hpY2ggYnVzICovCisJdm9pZCAqcmVnX2Jhc2U7CQkvKiBDU1IgYmFzZSAqLworfTsKKworLyogLS0tLS0gZ2xvYmFsIGRlZmluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgU01CX0NTUihhLHIpICgobG9uZykoYS0+cmVnX2Jhc2UgKyByKSkKKworLyogLS0tLS0gZ2xvYmFsIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogbW9kdWxlIHBhcmFtZXRlcnM6CisgKi8KK3N0YXRpYyBpbnQgYml0X3NjYW47CS8qIGhhdmUgYSBsb29rIGF0IHdoYXQncyBoYW5naW5nICdyb3VuZCAqLworbW9kdWxlX3BhcmFtKGJpdF9zY2FuLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhiaXRfc2NhbiwgIlNjYW4gZm9yIGFjdGl2ZSBjaGlwcyBvbiB0aGUgYnVzIik7CisKKworc3RhdGljIGludCBzbWJ1c194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXAsIHUxNiBhZGRyLAorCQkgICAgICB1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLAorCQkgICAgICB1OCBjb21tYW5kLCBpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKiBkYXRhKQoreworCXN0cnVjdCBpMmNfYWxnb19zaWJ5dGVfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisJaW50IGRhdGFfYnl0ZXMgPSAwOworCWludCBlcnJvcjsKKworCXdoaWxlIChjc3JfaW4zMihTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVRVUykpICYgTV9TTUJfQlVTWSkKKwkJOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSBJMkNfU01CVVNfUVVJQ0s6CisJCWNzcl9vdXQzMigoVl9TTUJfQUREUihhZGRyKSB8CisJCQkgICAocmVhZF93cml0ZSA9PSBJMkNfU01CVVNfUkVBRCA/IE1fU01CX1FEQVRBIDogMCkgfAorCQkJICAgVl9TTUJfVFRfUVVJQ0tDTUQpLCBTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVJUKSk7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0JZVEU6CisJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSB7CisJCQljc3Jfb3V0MzIoKFZfU01CX0FERFIoYWRkcikgfCBWX1NNQl9UVF9SRDFCWVRFKSwKKwkJCQkgIFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBUlQpKTsKKwkJCWRhdGFfYnl0ZXMgPSAxOworCQl9IGVsc2UgeworCQkJY3NyX291dDMyKFZfU01CX0NNRChjb21tYW5kKSwgU01CX0NTUihhZGFwLCBSX1NNQl9DTUQpKTsKKwkJCWNzcl9vdXQzMigoVl9TTUJfQUREUihhZGRyKSB8IFZfU01CX1RUX1dSMUJZVEUpLAorCQkJCSAgU01CX0NTUihhZGFwLCBSX1NNQl9TVEFSVCkpOworCQl9CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0JZVEVfREFUQToKKwkJY3NyX291dDMyKFZfU01CX0NNRChjb21tYW5kKSwgU01CX0NTUihhZGFwLCBSX1NNQl9DTUQpKTsKKwkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKKwkJCWNzcl9vdXQzMigoVl9TTUJfQUREUihhZGRyKSB8IFZfU01CX1RUX0NNRF9SRDFCWVRFKSwKKwkJCQkgIFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBUlQpKTsKKwkJCWRhdGFfYnl0ZXMgPSAxOworCQl9IGVsc2UgeworCQkJY3NyX291dDMyKFZfU01CX0xCKGRhdGEtPmJ5dGUpLAorCQkJCSAgU01CX0NTUihhZGFwLCBSX1NNQl9EQVRBKSk7CisJCQljc3Jfb3V0MzIoKFZfU01CX0FERFIoYWRkcikgfCBWX1NNQl9UVF9XUjJCWVRFKSwKKwkJCQkgIFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBUlQpKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6CisJCWNzcl9vdXQzMihWX1NNQl9DTUQoY29tbWFuZCksIFNNQl9DU1IoYWRhcCwgUl9TTUJfQ01EKSk7CisJCWlmIChyZWFkX3dyaXRlID09IEkyQ19TTUJVU19SRUFEKSB7CisJCQljc3Jfb3V0MzIoKFZfU01CX0FERFIoYWRkcikgfCBWX1NNQl9UVF9DTURfUkQyQllURSksCisJCQkJICBTTUJfQ1NSKGFkYXAsIFJfU01CX1NUQVJUKSk7CisJCQlkYXRhX2J5dGVzID0gMjsKKwkJfSBlbHNlIHsKKwkJCWNzcl9vdXQzMihWX1NNQl9MQihkYXRhLT53b3JkICYgMHhmZiksCisJCQkJICBTTUJfQ1NSKGFkYXAsIFJfU01CX0RBVEEpKTsKKwkJCWNzcl9vdXQzMihWX1NNQl9NQihkYXRhLT53b3JkID4+IDgpLAorCQkJCSAgU01CX0NTUihhZGFwLCBSX1NNQl9EQVRBKSk7CisJCQljc3Jfb3V0MzIoKFZfU01CX0FERFIoYWRkcikgfCBWX1NNQl9UVF9XUjJCWVRFKSwKKwkJCQkgIFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBUlQpKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7ICAgICAgLyogWFhYS1cgYmV0dGVyIGVycm9yIGNvZGU/ICovCisJfQorCisJd2hpbGUgKGNzcl9pbjMyKFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBVFVTKSkgJiBNX1NNQl9CVVNZKQorCQk7CisKKwllcnJvciA9IGNzcl9pbjMyKFNNQl9DU1IoYWRhcCwgUl9TTUJfU1RBVFVTKSk7CisJaWYgKGVycm9yICYgTV9TTUJfRVJST1IpIHsKKwkJLyogQ2xlYXIgZXJyb3IgYml0IGJ5IHdyaXRpbmcgYSAxICovCisJCWNzcl9vdXQzMihNX1NNQl9FUlJPUiwgU01CX0NTUihhZGFwLCBSX1NNQl9TVEFUVVMpKTsKKwkJcmV0dXJuIC0xOyAgICAgIC8qIFhYWEtXIGJldHRlciBlcnJvciBjb2RlPyAqLworCX0KKworCWlmIChkYXRhX2J5dGVzID09IDEpCisJCWRhdGEtPmJ5dGUgPSBjc3JfaW4zMihTTUJfQ1NSKGFkYXAsIFJfU01CX0RBVEEpKSAmIDB4ZmY7CisJaWYgKGRhdGFfYnl0ZXMgPT0gMikKKwkJZGF0YS0+d29yZCA9IGNzcl9pbjMyKFNNQl9DU1IoYWRhcCwgUl9TTUJfREFUQSkpICYgMHhmZmZmOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgYml0X2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiAoSTJDX0ZVTkNfU01CVVNfUVVJQ0sgfCBJMkNfRlVOQ19TTUJVU19CWVRFIHwKKwkJSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKTsKK30KKworCisvKiAtLS0tLWV4cG9ydGVkIGFsZ29yaXRobSBkYXRhOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCSovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBpMmNfc2lieXRlX2FsZ28gPSB7CisJLnNtYnVzX3hmZXIJPSBzbWJ1c194ZmVyLAorCS5mdW5jdGlvbmFsaXR5CT0gYml0X2Z1bmMsCit9OworCisvKgorICogcmVnaXN0ZXJpbmcgZnVuY3Rpb25zIHRvIGxvYWQgYWxnb3JpdGhtcyBhdCBydW50aW1lCisgKi8KK2ludCBpMmNfc2lieXRlX2FkZF9idXMoc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcCwgaW50IHNwZWVkKQoreworCWludCBpOworCXN0cnVjdCBpMmNfYWxnb19zaWJ5dGVfZGF0YSAqYWRhcCA9IGkyY19hZGFwLT5hbGdvX2RhdGE7CisKKwkvKiByZWdpc3RlciBuZXcgYWRhcHRlciB0byBpMmMgbW9kdWxlLi4uICovCisJaTJjX2FkYXAtPmFsZ28gPSAmaTJjX3NpYnl0ZV9hbGdvOworCisJLyogU2V0IHRoZSBmcmVxdWVuY3kgdG8gMTAwIGtIeiAqLworCWNzcl9vdXQzMihzcGVlZCwgU01CX0NTUihhZGFwLFJfU01CX0ZSRVEpKTsKKwljc3Jfb3V0MzIoMCwgU01CX0NTUihhZGFwLFJfU01CX0NPTlRST0wpKTsKKworCS8qIHNjYW4gYnVzICovCisJaWYgKGJpdF9zY2FuKSB7CisJCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CisJCWludCByYzsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiIGkyYy1hbGdvLXNpYnl0ZS5vOiBzY2FubmluZyBidXMgJXMuXG4iLAorCQkgICAgICAgaTJjX2FkYXAtPm5hbWUpOworCQlmb3IgKGkgPSAweDAwOyBpIDwgMHg3ZjsgaSsrKSB7CisJCQkvKiBYWFhLVyBpcyB0aGlzIGEgcmVhbGlzdGljIHByb2JlPyAqLworCQkJcmMgPSBzbWJ1c194ZmVyKGkyY19hZGFwLCBpLCAwLCBJMkNfU01CVVNfUkVBRCwgMCwKKwkJCQkJSTJDX1NNQlVTX0JZVEVfREFUQSwgJmRhdGEpOworCQkJaWYgKCFyYykgeworCQkJCXByaW50aygiKCUwMngpIixpKTsKKwkJCX0gZWxzZQorCQkJCXByaW50aygiLiIpOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9CisKKwlyZXR1cm4gaTJjX2FkZF9hZGFwdGVyKGkyY19hZGFwKTsKK30KKworCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvX3NpYnl0ZV9kYXRhIHNpYnl0ZV9ib2FyZF9kYXRhWzJdID0gewogCXsgTlVMTCwgMCwgKHZvaWQgKikgKENLU0VHMStBX1NNQl9CQVNFKDApKSB9LAogCXsgTlVMTCwgMSwgKHZvaWQgKikgKENLU0VHMStBX1NNQl9CQVNFKDEpKSB9CkBAIC01OCwxMyArMjEwLDEzIEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpMmNfc2lieXRlX2V4aXQodm9pZCkKIHsKLQlpMmNfc2lieXRlX2RlbF9idXMoJnNpYnl0ZV9ib2FyZF9hZGFwdGVyWzBdKTsKLQlpMmNfc2lieXRlX2RlbF9idXMoJnNpYnl0ZV9ib2FyZF9hZGFwdGVyWzFdKTsKKwlpMmNfZGVsX2J1cygmc2lieXRlX2JvYXJkX2FkYXB0ZXJbMF0pOworCWkyY19kZWxfYnVzKCZzaWJ5dGVfYm9hcmRfYWRhcHRlclsxXSk7CiB9CiAKIG1vZHVsZV9pbml0KGkyY19zaWJ5dGVfaW5pdCk7CiBtb2R1bGVfZXhpdChpMmNfc2lieXRlX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJLaXAgV2Fsa2VyIDxrd2Fsa2VyQGJyb2FkY29tLmNvbT4sIFN0ZXZlbiBKLiBIaWxsIDxzamhpbGxAcmVhbGl0eWRpbHV0ZWQuY29tPiIpOworTU9EVUxFX0FVVEhPUigiS2lwIFdhbGtlciAoQnJvYWRjb20gQ29ycC4pLCBTdGV2ZW4gSi4gSGlsbCA8c2poaWxsQHJlYWxpdHlkaWx1dGVkLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU01CdXMgYWRhcHRlciByb3V0aW5lcyBmb3IgU2lCeXRlIGJvYXJkcyIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM1NTk1LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczU1OTUuYwppbmRleCBiNTdhYjc0ZC4uMzhiYmZkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM1NTk1LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM1NTk1LmMKQEAgLTM1OCw3ICszNTgsNyBAQAogCSAgICBJMkNfRlVOQ19TTUJVU19QUk9DX0NBTEw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0gewogCS5zbWJ1c194ZmVyCT0gc2lzNTU5NV9hY2Nlc3MsCiAJLmZ1bmN0aW9uYWxpdHkJPSBzaXM1NTk1X2Z1bmMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM2MzAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzNjMwLmMKaW5kZXggYWNiNzVlMi4uZGVjMGJhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM2MzAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczYzMC5jCkBAIC00NTAsNyArNDUwLDcgQEAKIH0KIAogCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNtYnVzX2FsZ29yaXRobSA9IHsKIAkuc21idXNfeGZlcgk9IHNpczYzMF9hY2Nlc3MsCiAJLmZ1bmN0aW9uYWxpdHkJPSBzaXM2MzBfZnVuYywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczk2eC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zaXM5NnguYwppbmRleCAxYTczYzA1Li43ZmQwN2ZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXNpczk2eC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc2lzOTZ4LmMKQEAgLTI0Miw3ICsyNDIsNyBAQAogCSAgICBJMkNfRlVOQ19TTUJVU19QUk9DX0NBTEw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0gewogCS5zbWJ1c194ZmVyCT0gc2lzOTZ4X2FjY2VzcywKIAkuZnVuY3Rpb25hbGl0eQk9IHNpczk2eF9mdW5jLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtc3R1Yi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zdHViLmMKaW5kZXggNzNmNDgxZS4uYTU0YWRjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zdHViLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1zdHViLmMKQEAgLTI3LDYgKzI3LDEwIEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KIAorc3RhdGljIHVuc2lnbmVkIHNob3J0IGNoaXBfYWRkcjsKK21vZHVsZV9wYXJhbShjaGlwX2FkZHIsIHVzaG9ydCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGNoaXBfYWRkciwgIkNoaXAgYWRkcmVzcyAoYmV0d2VlbiAweDAzIGFuZCAweDc3KVxuIik7CisKIHN0YXRpYyB1OCAgc3R1Yl9wb2ludGVyOwogc3RhdGljIHU4ICBzdHViX2J5dGVzWzI1Nl07CiBzdGF0aWMgdTE2IHN0dWJfd29yZHNbMjU2XTsKQEAgLTM3LDYgKzQxLDkgQEAKIHsKIAlzMzIgcmV0OwogCisJaWYgKGFkZHIgIT0gY2hpcF9hZGRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXN3aXRjaCAoc2l6ZSkgewogCiAJY2FzZSBJMkNfU01CVVNfUVVJQ0s6CkBAIC0xMDgsNyArMTE1LDcgQEAKIAkJSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBOwogfQogCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIHNtYnVzX2FsZ29yaXRobSA9IHsKIAkuZnVuY3Rpb25hbGl0eQk9IHN0dWJfZnVuYywKIAkuc21idXNfeGZlcgk9IHN0dWJfeGZlciwKIH07CkBAIC0xMjIsNyArMTI5LDE3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGkyY19zdHViX2luaXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJpMmMtc3R1YiBsb2FkZWRcbiIpOworCWlmICghY2hpcF9hZGRyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTJjLXN0dWI6IFBsZWFzZSBzcGVjaWZ5IGEgY2hpcCBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChjaGlwX2FkZHIgPCAweDAzIHx8IGNoaXBfYWRkciA+IDB4NzcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMmMtc3R1YjogSW52YWxpZCBjaGlwIGFkZHJlc3MgMHglMDJ4XG4iLAorCQkgICAgICAgY2hpcF9hZGRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiaTJjLXN0dWI6IFZpcnR1YWwgY2hpcCBhdCAweCUwMnhcbiIsIGNoaXBfYWRkcik7CiAJcmV0dXJuIGkyY19hZGRfYWRhcHRlcigmc3R1Yl9hZGFwdGVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aWEuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhLmMKaW5kZXggNDg0YmJhYy4uOTEwZTIwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aWEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXZpYS5jCkBAIC04MSw3ICs4MSw2IEBACiAJLmdldHNkYQkJPSBiaXRfdmlhX2dldHNkYSwKIAkuZ2V0c2NsCQk9IGJpdF92aWFfZ2V0c2NsLAogCS51ZGVsYXkJCT0gNSwKLQkubWRlbGF5CQk9IDUsCiAJLnRpbWVvdXQJPSBIWgogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aWFwcm8uYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlhcHJvLmMKaW5kZXggNDdlNTJiZi4uZWZjNmJiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aWFwcm8uYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXZpYXByby5jCkBAIC0zNCw2ICszNCw4IEBACiAgICBWVDgyMzNBICAgICAgICAgICAgMHgzMTQ3ICAgICAgICAgICAgIHllcz8KICAgIFZUODIzNSAgICAgICAgICAgICAweDMxNzcgICAgICAgICAgICAgeWVzCiAgICBWVDgyMzdSICAgICAgICAgICAgMHgzMjI3ICAgICAgICAgICAgIHllcworICAgVlQ4MjM3QSAgICAgICAgICAgIDB4MzMzNyAgICAgICAgICAgICB5ZXMKKyAgIFZUODI1MSAgICAgICAgICAgICAweDMyODcgICAgICAgICAgICAgeWVzCiAKICAgIE5vdGU6IHdlIGFzc3VtZSB0aGVyZSBjYW4gb25seSBiZSBvbmUgZGV2aWNlLCB3aXRoIG9uZSBTTUJ1cyBpbnRlcmZhY2UuCiAqLwpAQCAtMjk3LDcgKzI5OSw3IEBACiAJcmV0dXJuIGZ1bmM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBzbWJ1c19hbGdvcml0aG0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gc21idXNfYWxnb3JpdGhtID0gewogCS5zbWJ1c194ZmVyCT0gdnQ1OTZfYWNjZXNzLAogCS5mdW5jdGlvbmFsaXR5CT0gdnQ1OTZfZnVuYywKIH07CkBAIC0zODEsNyArMzgzLDkgQEAKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJWVDU5Nl9zbWJhID0gMHglWFxuIiwgdnQ1OTZfc21iYSk7CiAKIAlzd2l0Y2ggKHBkZXYtPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9WSUFfODI1MToKIAljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyMzc6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1ZJQV84MjM3QToKIAljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyMzU6CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1ZJQV84MjMzQToKIAljYXNlIFBDSV9ERVZJQ0VfSURfVklBXzgyMzNfMDoKQEAgLTQzMiw4ICs0MzYsMTIgQEAKIAkgIC5kcml2ZXJfZGF0YSA9IFNNQkJBMyB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODIzNyksCiAJICAuZHJpdmVyX2RhdGEgPSBTTUJCQTMgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyMzdBKSwKKwkgIC5kcml2ZXJfZGF0YSA9IFNNQkJBMyB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODIzMV80KSwKIAkgIC5kcml2ZXJfZGF0YSA9IFNNQkJBMSB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODI1MSksCisJICAuZHJpdmVyX2RhdGEgPSBTTUJCQTMgfSwKIAl7IDAsIH0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdm9vZG9vMy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12b29kb28zLmMKaW5kZXggYjY3NTc3My4uNmM4ZDI1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12b29kb28zLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12b29kb28zLmMKQEAgLTE2MCw3ICsxNjAsNiBAQAogCS5nZXRzZGEJCT0gYml0X3Zvb2kyY19nZXRzZGEsCiAJLmdldHNjbAkJPSBiaXRfdm9vaTJjX2dldHNjbCwKIAkudWRlbGF5CQk9IENZQ0xFX0RFTEFZLAotCS5tZGVsYXkJCT0gQ1lDTEVfREVMQVksCiAJLnRpbWVvdXQJPSBUSU1FT1VUCiB9OwogCkBAIC0xNzcsNyArMTc2LDYgQEAKIAkuZ2V0c2RhCQk9IGJpdF92b29kZGNfZ2V0c2RhLAogCS5nZXRzY2wJCT0gYml0X3Zvb2RkY19nZXRzY2wsCiAJLnVkZWxheQkJPSBDWUNMRV9ERUxBWSwKLQkubWRlbGF5CQk9IENZQ0xFX0RFTEFZLAogCS50aW1lb3V0CT0gVElNRU9VVAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9hY2IuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfYWNiLmMKaW5kZXggZWFlOWU4MS4uMzJhYWIwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9hY2IuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2FjYi5jCkBAIC0zODMsNyArMzgzLDcgQEAKIH0KIAogLyogRm9yIG5vdywgd2Ugb25seSBoYW5kbGUgY29tYmluZWQgbW9kZSAoc21idXMpICovCi1zdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gc2N4MjAwX2FjYl9hbGdvcml0aG0gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gc2N4MjAwX2FjYl9hbGdvcml0aG0gPSB7CiAJLnNtYnVzX3hmZXIJPSBzY3gyMDBfYWNiX3NtYnVzX3hmZXIsCiAJLmZ1bmN0aW9uYWxpdHkJPSBzY3gyMDBfYWNiX2Z1bmMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9pMmMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfaTJjLmMKaW5kZXggY2IzZWY1YS4uOGI2NWE1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9pMmMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2kyYy5jCkBAIC03MSwxMiArNzEsMTIgQEAKICAqLwogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIHNjeDIwMF9pMmNfZGF0YSA9IHsKLQlOVUxMLAotCXNjeDIwMF9pMmNfc2V0c2RhLAotCXNjeDIwMF9pMmNfc2V0c2NsLAotCXNjeDIwMF9pMmNfZ2V0c2RhLAotCXNjeDIwMF9pMmNfZ2V0c2NsLAotCTEwLCAxMCwgMTAwLAkJLyogd2FpdHMsIHRpbWVvdXQgKi8KKwkuc2V0c2RhCQk9IHNjeDIwMF9pMmNfc2V0c2RhLAorCS5zZXRzY2wJCT0gc2N4MjAwX2kyY19zZXRzY2wsCisJLmdldHNkYQkJPSBzY3gyMDBfaTJjX2dldHNkYSwKKwkuZ2V0c2NsCQk9IHNjeDIwMF9pMmNfZ2V0c2NsLAorCS51ZGVsYXkJCT0gMTAsCisJLnRpbWVvdXQJPSAxMDAsCiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIHNjeDIwMF9pMmNfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvZWVwcm9tLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9lZXByb20uYwppbmRleCAxM2MxMDgyLi5jZWMzYTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9lZXByb20uYworKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9lZXByb20uYwpAQCAtMjA5LDEwICsyMDksMTQgQEAKIAl9CiAKIAkvKiBjcmVhdGUgdGhlIHN5c2ZzIGVlcHJvbSBmaWxlICovCi0Jc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJmVlcHJvbV9hdHRyKTsKKwllcnIgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmZWVwcm9tX2F0dHIpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9kZXRhY2g7CiAKIAlyZXR1cm4gMDsKIAorZXhpdF9kZXRhY2g6CisJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CiBleGl0X2tmcmVlOgogCWtmcmVlKGRhdGEpOwogZXhpdDoKQEAgLTIyMyw2ICsyMjcsOCBAQAogewogCWludCBlcnI7CiAKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmNsaWVudC0+ZGV2LmtvYmosICZlZXByb21fYXR0cik7CisKIAllcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9pc3AxMzAxX29tYXAuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL2lzcDEzMDFfb21hcC5jCmluZGV4IGY5MjUwNWIuLjE4MmYwNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2NoaXBzL2lzcDEzMDFfb21hcC5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL2lzcDEzMDFfb21hcC5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiX2NoOS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYl9nYWRnZXQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC91c2Jfb3RnLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9tYXg2ODc1LmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9tYXg2ODc1LmMKaW5kZXggODhkMmRkZS4uNzY2NDVjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvbWF4Njg3NS5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL21heDY4NzUuYwpAQCAtMTk5LDggKzE5OSw3IEBACiAJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJLyogSW5pdCBmYWtlIGNsaWVudCBkYXRhICovCi0JLyogc2V0IHRoZSBjbGllbnQgZGF0YSB0byB0aGUgaTJjX2NsaWVudCBzbyB0aGF0IGl0IHdpbGwgZ2V0IGZyZWVkICovCi0JaTJjX3NldF9jbGllbnRkYXRhKGZha2VfY2xpZW50LCBmYWtlX2NsaWVudCk7CisJaTJjX3NldF9jbGllbnRkYXRhKGZha2VfY2xpZW50LCBOVUxMKTsKIAlmYWtlX2NsaWVudC0+YWRkciA9IGFkZHJlc3MgfCAxOwogCWZha2VfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKIAlmYWtlX2NsaWVudC0+ZHJpdmVyID0gJm1heDY4NzVfZHJpdmVyOwpAQCAtMjE0LDEzICsyMTMsMTcgQEAKIAkJZ290byBleGl0X2tmcmVlMjsKIAogCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoZmFrZV9jbGllbnQpKSAhPSAwKQotCQlnb3RvIGV4aXRfZGV0YWNoOworCQlnb3RvIGV4aXRfZGV0YWNoMTsKIAotCXN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcmVhbF9jbGllbnQtPmRldi5rb2JqLCAmdXNlcl9lZXByb21fYXR0cik7CisJZXJyID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZyZWFsX2NsaWVudC0+ZGV2LmtvYmosICZ1c2VyX2VlcHJvbV9hdHRyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZGV0YWNoMjsKIAogCXJldHVybiAwOwogCi1leGl0X2RldGFjaDoKK2V4aXRfZGV0YWNoMjoKKwlpMmNfZGV0YWNoX2NsaWVudChmYWtlX2NsaWVudCk7CitleGl0X2RldGFjaDE6CiAJaTJjX2RldGFjaF9jbGllbnQocmVhbF9jbGllbnQpOwogZXhpdF9rZnJlZTI6CiAJa2ZyZWUoZmFrZV9jbGllbnQpOwpAQCAtMjI5LDE0ICsyMzIsMjQgQEAKIAlyZXR1cm4gZXJyOwogfQogCisvKiBXaWxsIGJlIGNhbGxlZCBmb3IgYm90aCB0aGUgcmVhbCBjbGllbnQgYW5kIHRoZSBmYWtlIGNsaWVudCAqLwogc3RhdGljIGludCBtYXg2ODc1X2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlpbnQgZXJyOworCXN0cnVjdCBtYXg2ODc1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCS8qIGRhdGEgaXMgTlVMTCBmb3IgdGhlIGZha2UgY2xpZW50ICovCisJaWYgKGRhdGEpCisJCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmY2xpZW50LT5kZXYua29iaiwgJnVzZXJfZWVwcm9tX2F0dHIpOwogCiAJZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWtmcmVlKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKworCWlmIChkYXRhKQkJLyogcmVhbCBjbGllbnQgKi8KKwkJa2ZyZWUoZGF0YSk7CisJZWxzZQkJCS8qIGZha2UgY2xpZW50ICovCisJCWtmcmVlKGNsaWVudCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2NoaXBzL3BjYTk1MzkuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL3BjYTk1MzkuYwppbmRleCBjYjIyMjgwLi5mNDNjNGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9wY2E5NTM5LmMKKysrIGIvZHJpdmVycy9pMmMvY2hpcHMvcGNhOTUzOS5jCkBAIC0xNDgsMTEgKzE0OCwxNiBAQAogCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQogCQlnb3RvIGV4aXRfa2ZyZWU7CiAKLQkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAoZG9uJ3QgY2FyZSBhYm91dCBmYWlsdXJlKSAqLwotCXN5c2ZzX2NyZWF0ZV9ncm91cCgmbmV3X2NsaWVudC0+ZGV2LmtvYmosICZwY2E5NTM5X2RlZmF0dHJfZ3JvdXApOworCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzICovCisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwKKwkJCQkgJnBjYTk1MzlfZGVmYXR0cl9ncm91cCk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2RldGFjaDsKIAogCXJldHVybiAwOwogCitleGl0X2RldGFjaDoKKwlpMmNfZGV0YWNoX2NsaWVudChuZXdfY2xpZW50KTsKIGV4aXRfa2ZyZWU6CiAJa2ZyZWUoZGF0YSk7CiBleGl0OgpAQCAtMTYzLDYgKzE2OCw4IEBACiB7CiAJaW50IGVycjsKIAorCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnBjYTk1MzlfZGVmYXR0cl9ncm91cCk7CisKIAlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9wY2Y4NTc0LmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9wY2Y4NTc0LmMKaW5kZXggYzNlNjQ0OS4uMzJiMjU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvcGNmODU3NC5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL3BjZjg1NzQuYwpAQCAtMTA1LDYgKzEwNSwxNiBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIod3JpdGUsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3dyaXRlLCBzZXRfd3JpdGUpOwogCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGNmODU3NF9hdHRyaWJ1dGVzW10gPSB7CisJJmRldl9hdHRyX3JlYWQuYXR0ciwKKwkmZGV2X2F0dHJfd3JpdGUuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBwY2Y4NTc0X2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gcGNmODU3NF9hdHRyaWJ1dGVzLAorfTsKKwogLyoKICAqIFJlYWwgY29kZQogICovCkBAIC0xNjYsMTMgKzE3NiwxMyBAQAogCXBjZjg1NzRfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfcmVhZCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsICZkZXZfYXR0cl93cml0ZSk7CisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJnBjZjg1NzRfYXR0cl9ncm91cCk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2RldGFjaDsKIAlyZXR1cm4gMDsKIAotLyogT0ssIHRoaXMgaXMgbm90IGV4YWN0bHkgZ29vZCBwcm9ncmFtbWluZyBwcmFjdGljZSwgdXN1YWxseS4gQnV0IGl0IGlzCi0gICB2ZXJ5IGNvZGUtZWZmaWNpZW50IGluIHRoaXMgY2FzZS4gKi8KLQorICAgICAgZXhpdF9kZXRhY2g6CisJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CiAgICAgICBleGl0X2ZyZWU6CiAJa2ZyZWUoZGF0YSk7CiAgICAgICBleGl0OgpAQCAtMTgzLDYgKzE5Myw4IEBACiB7CiAJaW50IGVycjsKIAorCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJnBjZjg1NzRfYXR0cl9ncm91cCk7CisKIAlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9wY2Y4NTkxLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9wY2Y4NTkxLmMKaW5kZXggOTI1YTZiMy4uNGRjMzYzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvcGNmODU5MS5jCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL3BjZjg1OTEuYwpAQCAtMTU4LDYgKzE1OCwyOCBAQAogc3RhdGljIERFVklDRV9BVFRSKG91dDBfZW5hYmxlLCBTX0lXVVNSIHwgU19JUlVHTywgCiAJCSAgIHNob3dfb3V0MF9lbmFibGUsIHNldF9vdXQwX2VuYWJsZSk7CiAKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpwY2Y4NTkxX2F0dHJpYnV0ZXNbXSA9IHsKKwkmZGV2X2F0dHJfb3V0MF9lbmFibGUuYXR0ciwKKwkmZGV2X2F0dHJfb3V0MF9vdXRwdXQuYXR0ciwKKwkmZGV2X2F0dHJfaW4wX2lucHV0LmF0dHIsCisJJmRldl9hdHRyX2luMV9pbnB1dC5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBjZjg1OTFfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBwY2Y4NTkxX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcGNmODU5MV9hdHRyaWJ1dGVzX29wdFtdID0geworCSZkZXZfYXR0cl9pbjJfaW5wdXQuYXR0ciwKKwkmZGV2X2F0dHJfaW4zX2lucHV0LmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgcGNmODU5MV9hdHRyX2dyb3VwX29wdCA9IHsKKwkuYXR0cnMgPSBwY2Y4NTkxX2F0dHJpYnV0ZXNfb3B0LAorfTsKKwogLyoKICAqIFJlYWwgY29kZQogICovCkBAIC0yMTEsMjQgKzIzMywzMSBAQAogCXBjZjg1OTFfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CiAKIAkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfb3V0MF9lbmFibGUpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfb3V0MF9vdXRwdXQpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4wX2lucHV0KTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwgJmRldl9hdHRyX2luMV9pbnB1dCk7CisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJnBjZjg1OTFfYXR0cl9ncm91cCk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2RldGFjaDsKIAogCS8qIFJlZ2lzdGVyIGlucHV0MiBpZiBub3QgaW4gInR3byBkaWZmZXJlbnRpYWwgaW5wdXRzIiBtb2RlICovCi0JaWYgKGlucHV0X21vZGUgIT0gMyApCi0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4yX2lucHV0KTsKLQkJCi0JLyogUmVnaXN0ZXIgaW5wdXQzIG9ubHkgaW4gImZvdXIgc2luZ2xlIGVuZGVkIGlucHV0cyIgbW9kZSAqLwotCWlmIChpbnB1dF9tb2RlID09IDApCi0JCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfaW4zX2lucHV0KTsKLQkKLQlyZXR1cm4gMDsKLQkKLQkvKiBPSywgdGhpcyBpcyBub3QgZXhhY3RseSBnb29kIHByb2dyYW1taW5nIHByYWN0aWNlLCB1c3VhbGx5LiBCdXQgaXQgaXMKLQkgICB2ZXJ5IGNvZGUtZWZmaWNpZW50IGluIHRoaXMgY2FzZS4gKi8KKwlpZiAoaW5wdXRfbW9kZSAhPSAzKSB7CisJCWlmICgoZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCQkJCSAgICAgICZkZXZfYXR0cl9pbjJfaW5wdXQpKSkKKwkJCWdvdG8gZXhpdF9zeXNmc19yZW1vdmU7CisJfQogCisJLyogUmVnaXN0ZXIgaW5wdXQzIG9ubHkgaW4gImZvdXIgc2luZ2xlIGVuZGVkIGlucHV0cyIgbW9kZSAqLworCWlmIChpbnB1dF9tb2RlID09IDApIHsKKwkJaWYgKChlcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKKwkJCQkJICAgICAgJmRldl9hdHRyX2luM19pbnB1dCkpKQorCQkJZ290byBleGl0X3N5c2ZzX3JlbW92ZTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXhpdF9zeXNmc19yZW1vdmU6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZuZXdfY2xpZW50LT5kZXYua29iaiwgJnBjZjg1OTFfYXR0cl9ncm91cF9vcHQpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmbmV3X2NsaWVudC0+ZGV2LmtvYmosICZwY2Y4NTkxX2F0dHJfZ3JvdXApOworZXhpdF9kZXRhY2g6CisJaTJjX2RldGFjaF9jbGllbnQobmV3X2NsaWVudCk7CiBleGl0X2tmcmVlOgogCWtmcmVlKGRhdGEpOwogZXhpdDoKQEAgLTIzOSw2ICsyNjgsOSBAQAogewogCWludCBlcnI7CiAKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZwY2Y4NTkxX2F0dHJfZ3JvdXBfb3B0KTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZwY2Y4NTkxX2F0dHJfZ3JvdXApOworCiAJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvdHBzNjUwMTAuYyBiL2RyaXZlcnMvaTJjL2NoaXBzL3RwczY1MDEwLmMKaW5kZXggMGJlNmZkNi4uNmE3NTc4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvY2hpcHMvdHBzNjUwMTAuYworKysgYi9kcml2ZXJzL2kyYy9jaGlwcy90cHM2NTAxMC5jCkBAIC0zMDUsNyArMzA1LDcgQEAKIAogc3RhdGljIGludCBkYmdfdHBzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGRiZ19zaG93LCBpbm9kZS0+dS5nZW5lcmljX2lwKTsKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZGJnX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z19mb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKaW5kZXggOWNiMjc3ZC4uMDEyMzNmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYworKysgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCkBAIC0xODMsMTUgKzE4MywyMSBAQAogCXNwcmludGYoYWRhcC0+ZGV2LmJ1c19pZCwgImkyYy0lZCIsIGFkYXAtPm5yKTsKIAlhZGFwLT5kZXYuZHJpdmVyID0gJmkyY19hZGFwdGVyX2RyaXZlcjsKIAlhZGFwLT5kZXYucmVsZWFzZSA9ICZpMmNfYWRhcHRlcl9kZXZfcmVsZWFzZTsKLQlkZXZpY2VfcmVnaXN0ZXIoJmFkYXAtPmRldik7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZhZGFwLT5kZXYsICZkZXZfYXR0cl9uYW1lKTsKKwlyZXMgPSBkZXZpY2VfcmVnaXN0ZXIoJmFkYXAtPmRldik7CisJaWYgKHJlcykKKwkJZ290byBvdXRfbGlzdDsKKwlyZXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmFkYXAtPmRldiwgJmRldl9hdHRyX25hbWUpOworCWlmIChyZXMpCisJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CiAKIAkvKiBBZGQgdGhpcyBhZGFwdGVyIHRvIHRoZSBpMmNfYWRhcHRlciBjbGFzcyAqLwogCW1lbXNldCgmYWRhcC0+Y2xhc3NfZGV2LCAweDAwLCBzaXplb2Yoc3RydWN0IGNsYXNzX2RldmljZSkpOwogCWFkYXAtPmNsYXNzX2Rldi5kZXYgPSAmYWRhcC0+ZGV2OwogCWFkYXAtPmNsYXNzX2Rldi5jbGFzcyA9ICZpMmNfYWRhcHRlcl9jbGFzczsKIAlzdHJsY3B5KGFkYXAtPmNsYXNzX2Rldi5jbGFzc19pZCwgYWRhcC0+ZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUpOwotCWNsYXNzX2RldmljZV9yZWdpc3RlcigmYWRhcC0+Y2xhc3NfZGV2KTsKKwlyZXMgPSBjbGFzc19kZXZpY2VfcmVnaXN0ZXIoJmFkYXAtPmNsYXNzX2Rldik7CisJaWYgKHJlcykKKwkJZ290byBvdXRfcmVtb3ZlX25hbWU7CiAKIAlkZXZfZGJnKCZhZGFwLT5kZXYsICJhZGFwdGVyIFslc10gcmVnaXN0ZXJlZFxuIiwgYWRhcC0+bmFtZSk7CiAKQEAgLTIwNiw2ICsyMTIsMTcgQEAKIG91dF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZjb3JlX2xpc3RzKTsKIAlyZXR1cm4gcmVzOworCitvdXRfcmVtb3ZlX25hbWU6CisJZGV2aWNlX3JlbW92ZV9maWxlKCZhZGFwLT5kZXYsICZkZXZfYXR0cl9uYW1lKTsKK291dF91bnJlZ2lzdGVyOgorCWluaXRfY29tcGxldGlvbigmYWRhcC0+ZGV2X3JlbGVhc2VkKTsgLyogTmVlZGVkPyAqLworCWRldmljZV91bnJlZ2lzdGVyKCZhZGFwLT5kZXYpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmFkYXAtPmRldl9yZWxlYXNlZCk7CitvdXRfbGlzdDoKKwlsaXN0X2RlbCgmYWRhcC0+bGlzdCk7CisJaWRyX3JlbW92ZSgmaTJjX2FkYXB0ZXJfaWRyLCBhZGFwLT5ucik7CisJZ290byBvdXRfdW5sb2NrOwogfQogCiAKQEAgLTM5NCwxNCArNDExLDE0IEBACiBpbnQgaTJjX2F0dGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisJaW50IHJlcyA9IDA7CiAKIAltdXRleF9sb2NrKCZhZGFwdGVyLT5jbGlzdF9sb2NrKTsKIAlpZiAoX19pMmNfY2hlY2tfYWRkcihjbGllbnQtPmFkYXB0ZXIsIGNsaWVudC0+YWRkcikpIHsKLQkJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5jbGlzdF9sb2NrKTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkJcmVzID0gLUVCVVNZOworCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCWxpc3RfYWRkX3RhaWwoJmNsaWVudC0+bGlzdCwmYWRhcHRlci0+Y2xpZW50cyk7Ci0JbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5jbGlzdF9sb2NrKTsKIAkKIAlpZiAoYWRhcHRlci0+Y2xpZW50X3JlZ2lzdGVyKSAgewogCQlpZiAoYWRhcHRlci0+Y2xpZW50X3JlZ2lzdGVyKGNsaWVudCkpICB7CkBAIC00MjIsMTAgKzQzOSwyNiBAQAogCQkiJWQtJTA0eCIsIGkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpLCBjbGllbnQtPmFkZHIpOwogCWRldl9kYmcoJmFkYXB0ZXItPmRldiwgImNsaWVudCBbJXNdIHJlZ2lzdGVyZWQgd2l0aCBidXMgaWQgJXNcbiIsCiAJCWNsaWVudC0+bmFtZSwgY2xpZW50LT5kZXYuYnVzX2lkKTsKLQlkZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfY2xpZW50X25hbWUpOwotCQotCXJldHVybiAwOworCXJlcyA9IGRldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOworCWlmIChyZXMpCisJCWdvdG8gb3V0X2xpc3Q7CisJcmVzID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2NsaWVudF9uYW1lKTsKKwlpZiAocmVzKQorCQlnb3RvIG91dF91bnJlZ2lzdGVyOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmYWRhcHRlci0+Y2xpc3RfbG9jayk7CisJcmV0dXJuIHJlczsKKworb3V0X3VucmVnaXN0ZXI6CisJaW5pdF9jb21wbGV0aW9uKCZjbGllbnQtPnJlbGVhc2VkKTsgLyogTmVlZGVkPyAqLworCWRldmljZV91bnJlZ2lzdGVyKCZjbGllbnQtPmRldik7CisJd2FpdF9mb3JfY29tcGxldGlvbigmY2xpZW50LT5yZWxlYXNlZCk7CitvdXRfbGlzdDoKKwlsaXN0X2RlbCgmY2xpZW50LT5saXN0KTsKKwlkZXZfZXJyKCZhZGFwdGVyLT5kZXYsICJGYWlsZWQgdG8gYXR0YWNoIGkyYyBjbGllbnQgJXMgYXQgMHglMDJ4ICIKKwkJIiglZClcbiIsIGNsaWVudC0+bmFtZSwgY2xpZW50LT5hZGRyLCByZXMpOworCWdvdG8gb3V0X3VubG9jazsKIH0KIAogCkBAIC02NzQsMTEgKzcwNywxNiBAQAogCiAJLyogRmluYWxseSBjYWxsIHRoZSBjdXN0b20gZGV0ZWN0aW9uIGZ1bmN0aW9uICovCiAJZXJyID0gZm91bmRfcHJvYyhhZGFwdGVyLCBhZGRyLCBraW5kKTsKLQogCS8qIC1FTk9ERVYgY2FuIGJlIHJldHVybmVkIGlmIHRoZXJlIGlzIGEgY2hpcCBhdCB0aGUgZ2l2ZW4gYWRkcmVzcwogCSAgIGJ1dCBpdCBpc24ndCBzdXBwb3J0ZWQgYnkgdGhpcyBjaGlwIGRyaXZlci4gV2UgY2F0Y2ggaXQgaGVyZSBhcwogCSAgIHRoaXMgaXNuJ3QgYW4gZXJyb3IuICovCi0JcmV0dXJuIChlcnIgPT0gLUVOT0RFVikgPyAwIDogZXJyOworCWlmIChlcnIgPT0gLUVOT0RFVikKKwkJZXJyID0gMDsKKworCWlmIChlcnIpCisJCWRldl93YXJuKCZhZGFwdGVyLT5kZXYsICJDbGllbnQgY3JlYXRpb24gZmFpbGVkIGF0IDB4JXggKCVkKVxuIiwKKwkJCSBhZGRyLCBlcnIpOworCXJldHVybiBlcnI7CiB9CiAKIGludCBpMmNfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLApAQCAtODY4LDcgKzkwNiw3IEBACiAJICAgICAgICAgICAgICAgICAgIEkyQ19TTUJVU19SRUFELDAsSTJDX1NNQlVTX0JZVEUsICZkYXRhKSkKIAkJcmV0dXJuIC0xOwogCWVsc2UKLQkJcmV0dXJuIDB4MEZGICYgZGF0YS5ieXRlOworCQlyZXR1cm4gZGF0YS5ieXRlOwogfQogCiBzMzIgaTJjX3NtYnVzX3dyaXRlX2J5dGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggdmFsdWUpCkBAIC04ODQsNyArOTIyLDcgQEAKIAkgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX1JFQUQsY29tbWFuZCwgSTJDX1NNQlVTX0JZVEVfREFUQSwmZGF0YSkpCiAJCXJldHVybiAtMTsKIAllbHNlCi0JCXJldHVybiAweDBGRiAmIGRhdGEuYnl0ZTsKKwkJcmV0dXJuIGRhdGEuYnl0ZTsKIH0KIAogczMyIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwgdTggdmFsdWUpCkBAIC05MDMsNyArOTQxLDcgQEAKIAkgICAgICAgICAgICAgICAgICAgSTJDX1NNQlVTX1JFQUQsY29tbWFuZCwgSTJDX1NNQlVTX1dPUkRfREFUQSwgJmRhdGEpKQogCQlyZXR1cm4gLTE7CiAJZWxzZQotCQlyZXR1cm4gMHgwRkZGRiAmIGRhdGEud29yZDsKKwkJcmV0dXJuIGRhdGEud29yZDsKIH0KIAogczMyIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggY29tbWFuZCwgdTE2IHZhbHVlKQpAQCAtMTAwNiw3ICsxMDQ0LDcgQEAKIAkJZWxzZSB7CiAJCQltc2dbMF0ubGVuPTM7CiAJCQltc2didWYwWzFdID0gZGF0YS0+d29yZCAmIDB4ZmY7Ci0JCQltc2didWYwWzJdID0gKGRhdGEtPndvcmQgPj4gOCkgJiAweGZmOworCQkJbXNnYnVmMFsyXSA9IGRhdGEtPndvcmQgPj4gODsKIAkJfQogCQlicmVhazsKIAljYXNlIEkyQ19TTUJVU19QUk9DX0NBTEw6CkBAIC0xMDE1LDcgKzEwNTMsNyBAQAogCQltc2dbMF0ubGVuID0gMzsKIAkJbXNnWzFdLmxlbiA9IDI7CiAJCW1zZ2J1ZjBbMV0gPSBkYXRhLT53b3JkICYgMHhmZjsKLQkJbXNnYnVmMFsyXSA9IChkYXRhLT53b3JkID4+IDgpICYgMHhmZjsKKwkJbXNnYnVmMFsyXSA9IGRhdGEtPndvcmQgPj4gODsKIAkJYnJlYWs7CiAJY2FzZSBJMkNfU01CVVNfQkxPQ0tfREFUQToKIAkJaWYgKHJlYWRfd3JpdGUgPT0gSTJDX1NNQlVTX1JFQUQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2kyYy1kZXYuYyBiL2RyaXZlcnMvaTJjL2kyYy1kZXYuYwppbmRleCA1OGNjZGRkLi4zZjg2OTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9pMmMtZGV2LmMKKysrIGIvZHJpdmVycy9pMmMvaTJjLWRldi5jCkBAIC0zMiw0MyArMzIsMzUgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy1kZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi1zdGF0aWMgc3RydWN0IGkyY19jbGllbnQgaTJjZGV2X2NsaWVudF90ZW1wbGF0ZTsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBpMmNkZXZfZHJpdmVyOwogCiBzdHJ1Y3QgaTJjX2RldiB7Ci0JaW50IG1pbm9yOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA7CiAJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwogfTsKLSNkZWZpbmUgdG9faTJjX2RldihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGkyY19kZXYsIGNsYXNzX2RldikKIAogI2RlZmluZSBJMkNfTUlOT1JTCTI1Ngotc3RhdGljIHN0cnVjdCBpMmNfZGV2ICppMmNfZGV2X2FycmF5W0kyQ19NSU5PUlNdOwotc3RhdGljIERFRklORV9TUElOTE9DSyhpMmNfZGV2X2FycmF5X2xvY2spOworc3RhdGljIExJU1RfSEVBRChpMmNfZGV2X2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhpMmNfZGV2X2xpc3RfbG9jayk7CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2RldiAqaTJjX2Rldl9nZXRfYnlfbWlub3IodW5zaWduZWQgaW5kZXgpCiB7CiAJc3RydWN0IGkyY19kZXYgKmkyY19kZXY7CiAKLQlzcGluX2xvY2soJmkyY19kZXZfYXJyYXlfbG9jayk7Ci0JaTJjX2RldiA9IGkyY19kZXZfYXJyYXlbaW5kZXhdOwotCXNwaW5fdW5sb2NrKCZpMmNfZGV2X2FycmF5X2xvY2spOwotCXJldHVybiBpMmNfZGV2OwotfQotCi1zdGF0aWMgc3RydWN0IGkyY19kZXYgKmkyY19kZXZfZ2V0X2J5X2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQotewotCXN0cnVjdCBpMmNfZGV2ICppMmNfZGV2ID0gTlVMTDsKLQotCXNwaW5fbG9jaygmaTJjX2Rldl9hcnJheV9sb2NrKTsKLQlpZiAoKGkyY19kZXZfYXJyYXlbYWRhcC0+bnJdKSAmJgotCSAgICAoaTJjX2Rldl9hcnJheVthZGFwLT5ucl0tPmFkYXAgPT0gYWRhcCkpCi0JCWkyY19kZXYgPSBpMmNfZGV2X2FycmF5W2FkYXAtPm5yXTsKLQlzcGluX3VubG9jaygmaTJjX2Rldl9hcnJheV9sb2NrKTsKKwlzcGluX2xvY2soJmkyY19kZXZfbGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGkyY19kZXYsICZpMmNfZGV2X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGkyY19kZXYtPmFkYXAtPm5yID09IGluZGV4KQorCQkJZ290byBmb3VuZDsKKwl9CisJaTJjX2RldiA9IE5VTEw7Citmb3VuZDoKKwlzcGluX3VubG9jaygmaTJjX2Rldl9saXN0X2xvY2spOwogCXJldHVybiBpMmNfZGV2OwogfQogCkBAIC03NiwzMCArNjgsMjggQEAKIHsKIAlzdHJ1Y3QgaTJjX2RldiAqaTJjX2RldjsKIAorCWlmIChhZGFwLT5uciA+PSBJMkNfTUlOT1JTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTJjLWRldjogT3V0IG9mIGRldmljZSBtaW5vcnMgKCVkKVxuIiwKKwkJICAgICAgIGFkYXAtPm5yKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisJfQorCiAJaTJjX2RldiA9IGt6YWxsb2Moc2l6ZW9mKCppMmNfZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpMmNfZGV2KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpMmNfZGV2LT5hZGFwID0gYWRhcDsKIAotCXNwaW5fbG9jaygmaTJjX2Rldl9hcnJheV9sb2NrKTsKLQlpZiAoaTJjX2Rldl9hcnJheVthZGFwLT5ucl0pIHsKLQkJc3Bpbl91bmxvY2soJmkyY19kZXZfYXJyYXlfbG9jayk7Ci0JCWRldl9lcnIoJmFkYXAtPmRldiwgImkyYy1kZXYgYWxyZWFkeSBoYXMgYSBkZXZpY2UgYXNzaWduZWQgdG8gdGhpcyBhZGFwdGVyXG4iKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0JaTJjX2Rldi0+bWlub3IgPSBhZGFwLT5ucjsKLQlpMmNfZGV2X2FycmF5W2FkYXAtPm5yXSA9IGkyY19kZXY7Ci0Jc3Bpbl91bmxvY2soJmkyY19kZXZfYXJyYXlfbG9jayk7CisJc3Bpbl9sb2NrKCZpMmNfZGV2X2xpc3RfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmaTJjX2Rldi0+bGlzdCwgJmkyY19kZXZfbGlzdCk7CisJc3Bpbl91bmxvY2soJmkyY19kZXZfbGlzdF9sb2NrKTsKIAlyZXR1cm4gaTJjX2RldjsKLWVycm9yOgotCWtmcmVlKGkyY19kZXYpOwotCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogfQogCiBzdGF0aWMgdm9pZCByZXR1cm5faTJjX2RldihzdHJ1Y3QgaTJjX2RldiAqaTJjX2RldikKIHsKLQlzcGluX2xvY2soJmkyY19kZXZfYXJyYXlfbG9jayk7Ci0JaTJjX2Rldl9hcnJheVtpMmNfZGV2LT5taW5vcl0gPSBOVUxMOwotCXNwaW5fdW5sb2NrKCZpMmNfZGV2X2FycmF5X2xvY2spOworCXNwaW5fbG9jaygmaTJjX2Rldl9saXN0X2xvY2spOworCWxpc3RfZGVsKCZpMmNfZGV2LT5saXN0KTsKKwlzcGluX3VubG9jaygmaTJjX2Rldl9saXN0X2xvY2spOwogfQogCiBzdGF0aWMgc3NpemVfdCBzaG93X2FkYXB0ZXJfbmFtZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXYsIGNoYXIgKmJ1ZikKQEAgLTM3NSwxMiArMzY1LDEzIEBACiAJaWYgKCFhZGFwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWNsaWVudCA9IGttYWxsb2Moc2l6ZW9mKCpjbGllbnQpLCBHRlBfS0VSTkVMKTsKKwljbGllbnQgPSBremFsbG9jKHNpemVvZigqY2xpZW50KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjbGllbnQpIHsKIAkJaTJjX3B1dF9hZGFwdGVyKGFkYXApOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtY3B5KGNsaWVudCwgJmkyY2Rldl9jbGllbnRfdGVtcGxhdGUsIHNpemVvZigqY2xpZW50KSk7CisJc25wcmludGYoY2xpZW50LT5uYW1lLCBJMkNfTkFNRV9TSVpFLCAiaTJjLWRldiAlZCIsIGFkYXAtPm5yKTsKKwljbGllbnQtPmRyaXZlciA9ICZpMmNkZXZfZHJpdmVyOwogCiAJLyogcmVnaXN0ZXJlZCB3aXRoIGFkYXB0ZXIsIHBhc3NlZCBhcyBjbGllbnQgdG8gdXNlciAqLwogCWNsaWVudC0+YWRhcHRlciA9IGFkYXA7CkBAIC00MTUsNDEgKzQwNiw0NyBAQAogc3RhdGljIGludCBpMmNkZXZfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQogewogCXN0cnVjdCBpMmNfZGV2ICppMmNfZGV2OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlpbnQgcmVzOwogCiAJaTJjX2RldiA9IGdldF9mcmVlX2kyY19kZXYoYWRhcCk7CiAJaWYgKElTX0VSUihpMmNfZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoaTJjX2Rldik7CiAKLQlwcl9kZWJ1ZygiaTJjLWRldjogYWRhcHRlciBbJXNdIHJlZ2lzdGVyZWQgYXMgbWlub3IgJWRcbiIsCi0JCSBhZGFwLT5uYW1lLCBpMmNfZGV2LT5taW5vcik7Ci0KIAkvKiByZWdpc3RlciB0aGlzIGkyYyBkZXZpY2Ugd2l0aCB0aGUgZHJpdmVyIGNvcmUgKi8KLQlpMmNfZGV2LT5hZGFwID0gYWRhcDsKLQlkZXYgPSAmYWRhcC0+ZGV2OwogCWkyY19kZXYtPmNsYXNzX2RldiA9IGNsYXNzX2RldmljZV9jcmVhdGUoaTJjX2Rldl9jbGFzcywgTlVMTCwKLQkJCQkJCSBNS0RFVihJMkNfTUFKT1IsIGkyY19kZXYtPm1pbm9yKSwKLQkJCQkJCSBkZXYsICJpMmMtJWQiLCBpMmNfZGV2LT5taW5vcik7Ci0JaWYgKCFpMmNfZGV2LT5jbGFzc19kZXYpCisJCQkJCQkgTUtERVYoSTJDX01BSk9SLCBhZGFwLT5uciksCisJCQkJCQkgJmFkYXAtPmRldiwgImkyYy0lZCIsCisJCQkJCQkgYWRhcC0+bnIpOworCWlmICghaTJjX2Rldi0+Y2xhc3NfZGV2KSB7CisJCXJlcyA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyb3I7Ci0JY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGkyY19kZXYtPmNsYXNzX2RldiwgJmNsYXNzX2RldmljZV9hdHRyX25hbWUpOworCX0KKwlyZXMgPSBjbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoaTJjX2Rldi0+Y2xhc3NfZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfbmFtZSk7CisJaWYgKHJlcykKKwkJZ290byBlcnJvcl9kZXN0cm95OworCisJcHJfZGVidWcoImkyYy1kZXY6IGFkYXB0ZXIgWyVzXSByZWdpc3RlcmVkIGFzIG1pbm9yICVkXG4iLAorCQkgYWRhcC0+bmFtZSwgYWRhcC0+bnIpOwogCXJldHVybiAwOworZXJyb3JfZGVzdHJveToKKwljbGFzc19kZXZpY2VfZGVzdHJveShpMmNfZGV2X2NsYXNzLCBNS0RFVihJMkNfTUFKT1IsIGFkYXAtPm5yKSk7CiBlcnJvcjoKIAlyZXR1cm5faTJjX2RldihpMmNfZGV2KTsKIAlrZnJlZShpMmNfZGV2KTsKLQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgaW50IGkyY2Rldl9kZXRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCiB7CiAJc3RydWN0IGkyY19kZXYgKmkyY19kZXY7CiAKLQlpMmNfZGV2ID0gaTJjX2Rldl9nZXRfYnlfYWRhcHRlcihhZGFwKTsKLQlpZiAoIWkyY19kZXYpCi0JCXJldHVybiAtRU5PREVWOworCWkyY19kZXYgPSBpMmNfZGV2X2dldF9ieV9taW5vcihhZGFwLT5ucik7CisJaWYgKCFpMmNfZGV2KSAvKiBhdHRhY2hfYWRhcHRlciBtdXN0IGhhdmUgZmFpbGVkICovCisJCXJldHVybiAwOwogCisJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGkyY19kZXYtPmNsYXNzX2RldiwgJmNsYXNzX2RldmljZV9hdHRyX25hbWUpOwogCXJldHVybl9pMmNfZGV2KGkyY19kZXYpOwotCWNsYXNzX2RldmljZV9kZXN0cm95KGkyY19kZXZfY2xhc3MsIE1LREVWKEkyQ19NQUpPUiwgaTJjX2Rldi0+bWlub3IpKTsKKwljbGFzc19kZXZpY2VfZGVzdHJveShpMmNfZGV2X2NsYXNzLCBNS0RFVihJMkNfTUFKT1IsIGFkYXAtPm5yKSk7CiAJa2ZyZWUoaTJjX2Rldik7CiAKIAlwcl9kZWJ1ZygiaTJjLWRldjogYWRhcHRlciBbJXNdIHVucmVnaXN0ZXJlZFxuIiwgYWRhcC0+bmFtZSk7CkBAIC00NzEsMTIgKzQ2OCw2IEBACiAJLmRldGFjaF9jbGllbnQJPSBpMmNkZXZfZGV0YWNoX2NsaWVudCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCBpMmNkZXZfY2xpZW50X3RlbXBsYXRlID0gewotCS5uYW1lCQk9ICJJMkMgL2RldiBlbnRyeSIsCi0JLmFkZHIJCT0gLTEsCi0JLmRyaXZlcgkJPSAmaTJjZGV2X2RyaXZlciwKLX07Ci0KIHN0YXRpYyBpbnQgX19pbml0IGkyY19kZXZfaW5pdCh2b2lkKQogewogCWludCByZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUuYyBiL2RyaXZlcnMvaWRlL2lkZS5jCmluZGV4IGRlZmQ0YjQuLjljODQ2OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS5jCkBAIC0xMjA3LDcgKzEyMDcsNyBAQAogCiBFWFBPUlRfU1lNQk9MKHN5c3RlbV9idXNfY2xvY2spOwogCi1zdGF0aWMgaW50IGdlbmVyaWNfaWRlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IGdlbmVyaWNfaWRlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKIHsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSBkZXYtPmRyaXZlcl9kYXRhOwogCXN0cnVjdCByZXF1ZXN0IHJxOwpAQCAtMTIyMSw3ICsxMjIxLDkgQEAKIAlycS5zcGVjaWFsID0gJmFyZ3M7CiAJcnEuZW5kX2lvX2RhdGEgPSAmcnFwbTsKIAlycXBtLnBtX3N0ZXAgPSBpZGVfcG1fc3RhdGVfc3RhcnRfc3VzcGVuZDsKLQlycXBtLnBtX3N0YXRlID0gc3RhdGUuZXZlbnQ7CisJaWYgKG1lc2cuZXZlbnQgPT0gUE1fRVZFTlRfUFJFVEhBVykKKwkJbWVzZy5ldmVudCA9IFBNX0VWRU5UX0ZSRUVaRTsKKwlycXBtLnBtX3N0YXRlID0gbWVzZy5ldmVudDsKIAogCXJldHVybiBpZGVfZG9fZHJpdmVfY21kKGRyaXZlLCAmcnEsIGlkZV93YWl0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL3BwYy9wbWFjLmMgYi9kcml2ZXJzL2lkZS9wcGMvcG1hYy5jCmluZGV4IDk5NmM2OTQuLjMxYWQ3OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BwYy9wbWFjLmMKKysrIGIvZHJpdmVycy9pZGUvcHBjL3BtYWMuYwpAQCAtMTM2OSwxNSArMTM2OSwxNiBAQAogfQogCiBzdGF0aWMgaW50Ci1wbWFjX2lkZV9tYWNpb19zdXNwZW5kKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3BtYWNfaWRlX21hY2lvX3N1c3BlbmQoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgcG1fbWVzc2FnZV90IG1lc2cpCiB7CiAJaWRlX2h3aWZfdAkqaHdpZiA9IChpZGVfaHdpZl90ICopZGV2X2dldF9kcnZkYXRhKCZtZGV2LT5vZmRldi5kZXYpOwogCWludAkJcmMgPSAwOwogCi0JaWYgKHN0YXRlLmV2ZW50ICE9IG1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCAmJiBzdGF0ZS5ldmVudCA+PSBQTV9FVkVOVF9TVVNQRU5EKSB7CisJaWYgKG1lc2cuZXZlbnQgIT0gbWRldi0+b2ZkZXYuZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50CisJCQkmJiBtZXNnLmV2ZW50ID09IFBNX0VWRU5UX1NVU1BFTkQpIHsKIAkJcmMgPSBwbWFjX2lkZV9kb19zdXNwZW5kKGh3aWYpOwogCQlpZiAocmMgPT0gMCkKLQkJCW1kZXYtPm9mZGV2LmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOworCQkJbWRldi0+b2ZkZXYuZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gbWVzZzsKIAl9CiAKIAlyZXR1cm4gcmM7CkBAIC0xNDczLDE1ICsxNDc0LDE2IEBACiB9CiAKIHN0YXRpYyBpbnQKLXBtYWNfaWRlX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitwbWFjX2lkZV9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IG1lc2cpCiB7CiAJaWRlX2h3aWZfdAkqaHdpZiA9IChpZGVfaHdpZl90ICopcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCWludAkJcmMgPSAwOwogCQotCWlmIChzdGF0ZS5ldmVudCAhPSBwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgJiYgc3RhdGUuZXZlbnQgPj0gMikgeworCWlmIChtZXNnLmV2ZW50ICE9IHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudAorCQkJJiYgbWVzZy5ldmVudCA9PSBQTV9FVkVOVF9TVVNQRU5EKSB7CiAJCXJjID0gcG1hY19pZGVfZG9fc3VzcGVuZChod2lmKTsKIAkJaWYgKHJjID09IDApCi0JCQlwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBzdGF0ZTsKKwkJCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IG1lc2c7CiAJfQogCiAJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmMgYi9kcml2ZXJzL2llZWUxMzk0L3BjaWx5bnguYwppbmRleCBlNmY0MTIzLi5iNGYxNDZmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmMKKysrIGIvZHJpdmVycy9pZWVlMTM5NC9wY2lseW54LmMKQEAgLTEzNyw3ICsxMzcsNiBAQAogCS5nZXRzZGEJCQk9IGJpdF9nZXRzZGEsCiAJLmdldHNjbAkJCT0gYml0X2dldHNjbCwKIAkudWRlbGF5CQkJPSA1LAotCS5tZGVsYXkJCQk9IDUsCiAJLnRpbWVvdXQJCT0gMTAwLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvbWFkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYwppbmRleCAwODJmMDNjLi40OTNmNGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9tYWQuYwpAQCAtMjk4NywxMCArMjk4Nyw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgaWJfbWFkX2NsZWFudXBfbW9kdWxlKHZvaWQpCiB7CiAJaWJfdW5yZWdpc3Rlcl9jbGllbnQoJm1hZF9jbGllbnQpOwotCi0JaWYgKGttZW1fY2FjaGVfZGVzdHJveShpYl9tYWRfY2FjaGUpKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiRmFpbGVkIHRvIGRlc3Ryb3kgaWJfbWFkIGNhY2hlXG4iKTsKLQl9CisJa21lbV9jYWNoZV9kZXN0cm95KGliX21hZF9jYWNoZSk7CiB9CiAKIG1vZHVsZV9pbml0KGliX21hZF9pbml0X21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZnMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9mcy5jCmluZGV4IGE1ZWIzMGEuLmM4YThhZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9mcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9mcy5jCkBAIC02MSwxMCArNjEsOSBAQAogCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCWlub2RlLT5pX3VpZCA9IDA7CiAJaW5vZGUtPmlfZ2lkID0gMDsKLQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotCWlub2RlLT51LmdlbmVyaWNfaXAgPSBkYXRhOworCWlub2RlLT5pX3ByaXZhdGUgPSBkYXRhOwogCWlmICgobW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUikgewogCQlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CiAJCWlub2RlLT5pX25saW5rKys7CkBAIC0xMTksNyArMTE4LDcgQEAKIAl1MTYgaTsKIAlzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQ7CiAKLQlkZCA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT51LmdlbmVyaWNfaXA7CisJZGQgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOwogCiAJZm9yIChpID0gMDsgaSA8IE5VTV9DT1VOVEVSUzsgaSsrKQogCQljb3VudGVyc1tpXSA9IGlwYXRoX3NuYXBfY250cihkZCwgaSk7CkBAIC0xMzksNyArMTM4LDcgQEAKIAlzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQ7CiAJdTY0IGd1aWQ7CiAKLQlkZCA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT51LmdlbmVyaWNfaXA7CisJZGQgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOwogCiAJZ3VpZCA9IGJlNjRfdG9fY3B1KGRkLT5pcGF0aF9ndWlkKTsKIApAQCAtMTc4LDcgKzE3Nyw3IEBACiAJdTMyIHRtcCwgdG1wMjsKIAlzdHJ1Y3QgaXBhdGhfZGV2ZGF0YSAqZGQ7CiAKLQlkZCA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT51LmdlbmVyaWNfaXA7CisJZGQgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOwogCiAJLyogc28gd2Ugb25seSBpbml0aWFsaXplIG5vbi16ZXJvIGZpZWxkcy4gKi8KIAltZW1zZXQocG9ydGluZm8sIDAsIHNpemVvZiBwb3J0aW5mbyk7CkBAIC0zMjUsNyArMzI0LDcgQEAKIAkJZ290byBiYWlsOwogCX0KIAotCWRkID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPnUuZ2VuZXJpY19pcDsKKwlkZCA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CiAJaWYgKGlwYXRoX2VlcHJvbV9yZWFkKGRkLCBwb3MsIHRtcCwgY291bnQpKSB7CiAJCWlwYXRoX2Rldl9lcnIoZGQsICJmYWlsZWQgdG8gcmVhZCBmcm9tIGZsYXNoXG4iKTsKIAkJcmV0ID0gLUVOWElPOwpAQCAtMzgxLDcgKzM4MCw3IEBACiAJCWdvdG8gYmFpbF90bXA7CiAJfQogCi0JZGQgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwOworCWRkID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfcHJpdmF0ZTsKIAlpZiAoaXBhdGhfZWVwcm9tX3dyaXRlKGRkLCBwb3MsIHRtcCwgY291bnQpKSB7CiAJCXJldCA9IC1FTlhJTzsKIAkJaXBhdGhfZGV2X2VycihkZCwgImZhaWxlZCB0byB3cml0ZSB0byBmbGFzaFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaWJhNjExMC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2liYTYxMTAuYwppbmRleCBiZjI0NTVhLi41YzliNTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfaWJhNjExMC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9pYmE2MTEwLmMKQEAgLTc0Miw3ICs3NDIsNiBAQAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIEhUX0NBUEFCSUxJVFlfSUQgICAweDA4CS8qIEhUIGNhcGFiaWxpdGllcyBub3QgZGVmaW5lZCBpbiBrZXJuZWwgKi8KICNkZWZpbmUgSFRfSU5UUl9ESVNDX0NPTkZJRyAgMHg4MAkvKiBIVCBpbnRlcnJ1cHQgYW5kIGRpc2NvdmVyeSBjYXAgKi8KICNkZWZpbmUgSFRfSU5UUl9SRUdfSU5ERVggICAgMgkvKiBpbnRjb25maWcgcmVxdWlyZXMgaW5kaXJlY3QgYWNjZXNzZXMgKi8KIApAQCAtOTczLDcgKzk3Miw3IEBACiAJICogZG8gdGhpcyBlYXJseSwgYmVmb3JlIHdlIGV2ZXIgZW5hYmxlIGVycm9ycyBvciBoYXJkd2FyZSBlcnJvcnMsCiAJICogbW9zdGx5IHRvIGF2b2lkIGNhdXNpbmcgdGhlIGNoaXAgdG8gZW50ZXIgZnJlZXplIG1vZGUuCiAJICovCi0JcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBIVF9DQVBBQklMSVRZX0lEKTsKKwlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfSFQpOwogCWlmICghcG9zKSB7CiAJCWlwYXRoX2Rldl9lcnIoZGQsICJDb3VsZG4ndCBmaW5kIEh5cGVyVHJhbnNwb3J0ICIKIAkJCSAgICAgICJjYXBhYmlsaXR5OyBubyBpbnRlcnJ1cHRzXG4iKTsKQEAgLTk5Niw3ICs5OTUsNyBAQAogCQllbHNlIGlmIChjYXBfdHlwZSA9PSBIVF9JTlRSX0RJU0NfQ09ORklHKQogCQkJaWhhbmRsZXIgPSBzZXRfaW50X2hhbmRsZXIoZGQsIHBkZXYsIHBvcyk7CiAJfSB3aGlsZSAoKHBvcyA9IHBjaV9maW5kX25leHRfY2FwYWJpbGl0eShwZGV2LCBwb3MsCi0JCQkJCQkgSFRfQ0FQQUJJTElUWV9JRCkpKTsKKwkJCQkJCSBQQ0lfQ0FQX0lEX0hUKSkpOwogCiAJaWYgKCFpaGFuZGxlcikgewogCQlpcGF0aF9kZXZfZXJyKGRkLCAiQ291bGRuJ3QgZmluZCBpbnRlcnJ1cHQgaGFuZGxlciBpbiAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX2ZzLmMKaW5kZXggNWRkZTM4MC4uZjFjYjgzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9mcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfZnMuYwpAQCAtMTQxLDcgKzE0MSw3IEBACiAJCXJldHVybiByZXQ7CiAKIAlzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc2VxLT5wcml2YXRlID0gaW5vZGUtPnUuZ2VuZXJpY19pcDsKKwlzZXEtPnByaXZhdGUgPSBpbm9kZS0+aV9wcml2YXRlOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNDcsNyArMjQ3LDcgQEAKIAkJcmV0dXJuIHJldDsKIAogCXNlcSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzZXEtPnByaXZhdGUgPSBpbm9kZS0+dS5nZW5lcmljX2lwOworCXNlcS0+cHJpdmF0ZSA9IGlub2RlLT5pX3ByaXZhdGU7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vaHA2ODBfdHNfaW5wdXQuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vaHA2ODBfdHNfaW5wdXQuYwppbmRleCBmYTk3ZTBmLi5lZTZjMmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2hwNjgwX3RzX2lucHV0LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9ocDY4MF90c19pbnB1dC5jCkBAIC0xNSw3ICsxNSw2IEBACiAjZGVmaW5lIEhQNjgwX1RTX0FCU19ZX01JTgk4MAogI2RlZmluZSBIUDY4MF9UU19BQlNfWV9NQVgJOTEwCiAKLSNkZWZpbmUJU0NQQ1IJMHhhNDAwMDExNgogI2RlZmluZQlQSERSCTB4YTQwMDAxMmUKICNkZWZpbmUgU0NQRFIJMHhhNDAwMDEzNgogCkBAIC03NywxOSArNzYsNiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBocDY4MF90c19pbml0KHZvaWQpCiB7Ci0JdTggc2NwZHI7Ci0JdTE2IHNjcGNyOwotCi0Jc2NwZHIgPSBjdHJsX2luYihTQ1BEUik7Ci0Jc2NwZHIgfD0gU0NQRFJfVFNfU0NBTl9YIHwgU0NQRFJfVFNfU0NBTl9ZOwotCXNjcGRyICY9IH5TQ1BEUl9UU19TQ0FOX0VOQUJMRTsKLQljdHJsX291dGIoc2NwZHIsIFNDUERSKTsKLQotCXNjcGNyID0gY3RybF9pbncoU0NQQ1IpOwotCXNjcGNyICY9IH5TQ1BDUl9UU19NQVNLOwotCXNjcGNyIHw9IFNDUENSX1RTX0VOQUJMRTsKLQljdHJsX291dHcoc2NwY3IsIFNDUENSKTsKLQogCWhwNjgwX3RzX2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwogCWlmICghaHA2ODBfdHNfZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlmcy5jIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWZzLmMKaW5kZXggOWVhNmJkMC4uMmRkMWI1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWZzLmMKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWZzLmMKQEAgLTEwNCw3ICsxMDQsNiBAQAogCWlub2RlLT5pX2lubyA9IDE7CiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCWlub2RlLT5pX2Jsb2NrcyA9IDA7Ci0JaW5vZGUtPmlfYmxrc2l6ZSA9IDEwMjQ7CiAJaW5vZGUtPmlfdWlkID0gaW5vZGUtPmlfZ2lkID0gMDsKIAlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPIHwgU19JV1VTUjsKIAlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CkBAIC0xNDksNyArMTQ4LDYgQEAKIAlpZiAoIWlub2RlKQogCQlyZXR1cm47CiAJaW5vZGUtPmlfaW5vID0gbnVtYmVyKzI7Ci0JaW5vZGUtPmlfYmxrc2l6ZSA9IDEwMjQ7CiAJaW5vZGUtPmlfdWlkID0gY29uZmlnLnNldHVpZCA/IGNvbmZpZy51aWQgOiBjdXJyZW50LT5mc3VpZDsKIAlpbm9kZS0+aV9naWQgPSBjb25maWcuc2V0Z2lkID8gY29uZmlnLmdpZCA6IGN1cnJlbnQtPmZzZ2lkOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2Jhcy1naWdhc2V0LmMgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9iYXMtZ2lnYXNldC5jCmluZGV4IDM4NDVkZWYuLjVjZmJlNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2Jhcy1naWdhc2V0LmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvYmFzLWdpZ2FzZXQuYwpAQCAtMTkyLDcgKzE5Miw3IEBACiAJCXJldHVybiAiYml0IHN0dWZmaW5nIGVycm9yLCB0aW1lb3V0LCBvciB1bmtub3duIFVTQiBlcnJvciI7CiAJY2FzZSAtRUlMU0VROgogCQlyZXR1cm4gIkNSQyBtaXNtYXRjaCwgdGltZW91dCwgb3IgdW5rbm93biBVU0IgZXJyb3IiOwotCWNhc2UgLUVUSU1FRE9VVDoKKwljYXNlIC1FVElNRToKIAkJcmV0dXJuICJ0aW1lZCBvdXQiOwogCWNhc2UgLUVQSVBFOgogCQlyZXR1cm4gImVuZHBvaW50IHN0YWxsZWQiOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmY191c2IuaCBiL2RyaXZlcnMvaXNkbi9oaXNheC9oZmNfdXNiLmgKaW5kZXggZWM1MmMxYS4uNjM0OTM2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2hpc2F4L2hmY191c2IuaAorKysgYi9kcml2ZXJzL2lzZG4vaGlzYXgvaGZjX3VzYi5oCkBAIC0xMzcsMTEgKzEzNywxMSBAQAogCXstRU5YSU8sICJVUkIgYWxyZWFkeSBxdWV1ZWQifSwKIAl7LUVGQklHLCAiVG9vIG11Y2ggSVNPIGZyYW1lcyByZXF1ZXN0ZWQifSwKIAl7LUVOT1NSLCAiQnVmZmVyIGVycm9yIChvdmVycnVuKSJ9LAotCXstRVBJUEUsICJTcGVjaWZpZWQgZW5kcG9pbnQgaXMgc3RhbGxlZCAoZGV2aWNlIG5vdCByZXNwb25kaW5nKSJ9LAorCXstRVBJUEUsICJTcGVjaWZpZWQgZW5kcG9pbnQgaXMgc3RhbGxlZCJ9LAogCXstRU9WRVJGTE9XLCAiQmFiYmxlIChiYWQgY2FibGU/KSJ9LAogCXstRVBST1RPLCAiQml0LXN0dWZmIGVycm9yIChiYWQgY2FibGU/KSJ9LAotCXstRUlMU0VRLCAiQ1JDL1RpbWVvdXQifSwKLQl7LUVUSU1FRE9VVCwgIk5BSyAoZGV2aWNlIGRvZXMgbm90IHJlc3BvbmQpIn0sCisJey1FSUxTRVEsICJDUkMgb3IgbWlzc2luZyB0b2tlbiJ9LAorCXstRVRJTUUsICJEZXZpY2UgZGlkIG5vdCByZXNwb25kIn0sCiAJey1FU0hVVERPV04sICJEZXZpY2UgdW5wbHVnZ2VkIn0sCiAJey0xLCBOVUxMfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9jaW5lcmd5VDIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9jaW5lcmd5VDIuYwppbmRleCAwMDFjNzFiLi40MTBmYTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jCkBAIC05ODEsNyArOTgxLDcgQEAKIAlpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgfHwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKLQlpZiAoc3RhdGUuZXZlbnQgPiBQTV9FVkVOVF9PTikgeworCWlmICgxKSB7CiAJCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwogCiAJCWNpbmVyZ3l0Ml9zdXNwZW5kX3JjKGNpbmVyZ3l0Mik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItdXJiLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItdXJiLmMKaW5kZXggOTAwMmYzNS4uODhiMjgzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLXVyYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi11cmIuYwpAQCAtODAsNyArODAsNiBAQAogCiAJc3dpdGNoICh1cmItPnN0YXR1cykgewogCQljYXNlIDA6ICAgICAgICAgLyogc3VjY2VzcyAqLwotCQljYXNlIC1FVElNRURPVVQ6ICAgIC8qIE5BSyAqLwogCQkJYnJlYWs7CiAJCWNhc2UgLUVDT05OUkVTRVQ6ICAgLyoga2lsbCAqLwogCQljYXNlIC1FTk9FTlQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMKaW5kZXggNmMxY2I3Ny4uYzlkNjYzNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMKQEAgLTIxNSw3ICsyMTUsNyBAQAogCQljYXNlIC1FQ09OTlJFU0VUOgogCQljYXNlIC1FTk9FTlQ6CiAJCWNhc2UgLUVTSFVURE9XTjoKLQkJY2FzZSAtRVRJTUVET1VUOgorCQljYXNlIC1FVElNRToKIAkJCS8qIHRoaXMgdXJiIGlzIGRlYWQsIGNsZWFudXAgKi8KIAkJCWRwcmludGsoIiVzOnVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZFxuIiwKIAkJCQkJX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaTJjLmMKaW5kZXggNGI1NjJiMy4uMGRmYmNjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1pMmMuYwpAQCAtMTAwLDcgKzEwMCw2IEBACiAJLmdldHNkYSAgPSBidHR2X2JpdF9nZXRzZGEsCiAJLmdldHNjbCAgPSBidHR2X2JpdF9nZXRzY2wsCiAJLnVkZWxheSAgPSAxNiwKLQkubWRlbGF5ICA9IDEwLAogCS50aW1lb3V0ID0gMjAwLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYwppbmRleCA3MDY2MzgwLi43YmVhMzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pMmMuYwpAQCAtMTU1LDcgKzE1NSw2IEBACiAJLmdldHNkYSAgPSBjeDg4MDBfYml0X2dldHNkYSwKIAkuZ2V0c2NsICA9IGN4ODgwMF9iaXRfZ2V0c2NsLAogCS51ZGVsYXkgID0gMTYsCi0JLm1kZWxheSAgPSAxMCwKIAkudGltZW91dCA9IDIwMCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZwMzA1NC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZwMzA1NC1pMmMuYwppbmRleCA3NTFhNzU0Li4yYjRmMTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12cDMwNTQtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdnAzMDU0LWkyYy5jCkBAIC0xMDAsNyArMTAwLDYgQEAKIAkuZ2V0c2RhICA9IHZwMzA1NF9iaXRfZ2V0c2RhLAogCS5nZXRzY2wgID0gdnAzMDU0X2JpdF9nZXRzY2wsCiAJLnVkZWxheSAgPSAxNiwKLQkubWRlbGF5ICA9IDEwLAogCS50aW1lb3V0ID0gMjAwLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5jCmluZGV4IDFiMDdhNjEuLjVkOGNkMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1MTEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTExLmMKQEAgLTMwMSwxMCArMzAxLDExIEBACiBzdGF0aWMgc3RydWN0IHN5bWJvbGljX2xpc3QgdXJiX2Vycmxpc3RbXSA9IHsKIAl7IC1FTk9TUiwJIkJ1ZmZlciBlcnJvciAob3ZlcnJ1bikiIH0sCiAJeyAtRVBJUEUsCSJTdGFsbGVkIChkZXZpY2Ugbm90IHJlc3BvbmRpbmcpIiB9LAotCXsgLUVPVkVSRkxPVywJIkJhYmJsZSAoYmFkIGNhYmxlPykiIH0sCisJeyAtRU9WRVJGTE9XLAkiQmFiYmxlIChkZXZpY2Ugc2VuZHMgdG9vIG11Y2ggZGF0YSkiIH0sCiAJeyAtRVBST1RPLAkiQml0LXN0dWZmIGVycm9yIChiYWQgY2FibGU/KSIgfSwKLQl7IC1FSUxTRVEsCSJDUkMvVGltZW91dCIgfSwKLQl7IC1FVElNRURPVVQsCSJOQUsgKGRldmljZSBkb2VzIG5vdCByZXNwb25kKSIgfSwKKwl7IC1FSUxTRVEsCSJDUkMvVGltZW91dCAoYmFkIGNhYmxlPykiIH0sCisJeyAtRVRJTUUsCSJEZXZpY2UgZG9lcyBub3QgcmVzcG9uZCB0byB0b2tlbiIgfSwKKwl7IC1FVElNRURPVVQsCSJEZXZpY2UgZG9lcyBub3QgcmVzcG9uZCB0byBjb21tYW5kIiB9LAogCXsgLTEsIE5VTEwgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlmLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwppbmRleCBkNDcwMzk0Li41M2M0YjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwpAQCAtNzExLDcgKzcxMSw3IEBACiAJCQljYXNlIC1FT1ZFUkZMT1c6CWVycm1zZyA9ICJCYWJibGUgKGJhZCBjYWJsZT8pIjsgYnJlYWs7CiAJCQljYXNlIC1FUFJPVE86CQllcnJtc2cgPSAiQml0LXN0dWZmIGVycm9yIChiYWQgY2FibGU/KSI7IGJyZWFrOwogCQkJY2FzZSAtRUlMU0VROgkJZXJybXNnID0gIkNSQy9UaW1lb3V0IChjb3VsZCBiZSBhbnl0aGluZykiOyBicmVhazsKLQkJCWNhc2UgLUVUSU1FRE9VVDoJZXJybXNnID0gIk5BSyAoZGV2aWNlIGRvZXMgbm90IHJlc3BvbmQpIjsgYnJlYWs7CisJCQljYXNlIC1FVElNRToJCWVycm1zZyA9ICJEZXZpY2UgZG9lcyBub3QgcmVzcG9uZCI7IGJyZWFrOwogCQl9CiAJCVBXQ19ERUJVR19GTE9XKCJwd2NfaXNvY19oYW5kbGVyKCkgY2FsbGVkIHdpdGggc3RhdHVzICVkIFslc10uXG4iLCB1cmItPnN0YXR1cywgZXJybXNnKTsKIAkJLyogR2l2ZSB1cCBhZnRlciBhIG51bWJlciBvZiBjb250aWd1b3VzIGVycm9ycyBvbiB0aGUgVVNCIGJ1cy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjhjZi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby93OTk2OGNmLmMKaW5kZXggMjBmMjExYi4uMjkxMjMyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby93OTk2OGNmLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby93OTk2OGNmLmMKQEAgLTU4NiwxNSArNTg2LDE0IEBACiAJeyAtRUZCSUcsICAgICAiVG9vIG11Y2ggSVNPIGZyYW1lcyByZXF1ZXN0ZWQiIH0sCiAJeyAtRU5PU1IsICAgICAiQnVmZmVyIGVycm9yIChvdmVycnVuKSIgfSwKIAl7IC1FUElQRSwgICAgICJTcGVjaWZpZWQgZW5kcG9pbnQgaXMgc3RhbGxlZCAoZGV2aWNlIG5vdCByZXNwb25kaW5nKSJ9LAotCXsgLUVPVkVSRkxPVywgIkJhYmJsZSAoYmFkIGNhYmxlPykiIH0sCisJeyAtRU9WRVJGTE9XLCAiQmFiYmxlICh0b28gbXVjaCBkYXRhKSIgfSwKIAl7IC1FUFJPVE8sICAgICJCaXQtc3R1ZmYgZXJyb3IgKGJhZCBjYWJsZT8pIiB9LAogCXsgLUVJTFNFUSwgICAgIkNSQy9UaW1lb3V0IiB9LAotCXsgLUVUSU1FRE9VVCwgIk5BSyAoZGV2aWNlIGRvZXMgbm90IHJlc3BvbmQpIiB9LAorCXsgLUVUSU1FLCAgICAgIkRldmljZSBkb2VzIG5vdCByZXNwb25kIHRvIHRva2VuIiB9LAorCXsgLUVUSU1FRE9VVCwgIkRldmljZSBkb2VzIG5vdCByZXNwb25kIHRvIGNvbW1hbmQiIH0sCiAJeyAtMSwgTlVMTCB9CiB9OwogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1lbW9yeSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fY2FyZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMKaW5kZXggZjIyNDllZC4uMjlmNTljMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMKQEAgLTgyMCw3ICs4MjAsNiBAQAogCS5nZXRzZGEgPSB6b3Jhbl9pMmNfZ2V0c2RhLAogCS5nZXRzY2wgPSB6b3Jhbl9pMmNfZ2V0c2NsLAogCS51ZGVsYXkgPSAxMCwKLQkubWRlbGF5ID0gMCwKIAkudGltZW91dCA9IDEwMCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9pYm1hc20vaWJtYXNtZnMuYyBiL2RyaXZlcnMvbWlzYy9pYm1hc20vaWJtYXNtZnMuYwppbmRleCA0YTM1Y2FmLi5iOTlkYzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbWZzLmMKKysrIGIvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc21mcy5jCkBAIC0xNDcsNyArMTQ3LDYgQEAKIAlpZiAocmV0KSB7CiAJCXJldC0+aV9tb2RlID0gbW9kZTsKIAkJcmV0LT5pX3VpZCA9IHJldC0+aV9naWQgPSAwOwotCQlyZXQtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAkJcmV0LT5pX2Jsb2NrcyA9IDA7CiAJCXJldC0+aV9hdGltZSA9IHJldC0+aV9tdGltZSA9IHJldC0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAl9CkBAIC0xNzUsNyArMTc0LDcgQEAKIAl9CiAKIAlpbm9kZS0+aV9mb3AgPSBmb3BzOwotCWlub2RlLT51LmdlbmVyaWNfaXAgPSBkYXRhOworCWlub2RlLT5pX3ByaXZhdGUgPSBkYXRhOwogCiAJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CiAJcmV0dXJuIGRlbnRyeTsKQEAgLTI0NCw3ICsyNDMsNyBAQAogewogCXN0cnVjdCBpYm1hc21mc19jb21tYW5kX2RhdGEgKmNvbW1hbmRfZGF0YTsKIAotCWlmICghaW5vZGUtPnUuZ2VuZXJpY19pcCkKKwlpZiAoIWlub2RlLT5pX3ByaXZhdGUpCiAJCXJldHVybiAtRU5PREVWOwogCiAJY29tbWFuZF9kYXRhID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlibWFzbWZzX2NvbW1hbmRfZGF0YSksIEdGUF9LRVJORUwpOwpAQCAtMjUyLDcgKzI1MSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJY29tbWFuZF9kYXRhLT5jb21tYW5kID0gTlVMTDsKLQljb21tYW5kX2RhdGEtPnNwID0gaW5vZGUtPnUuZ2VuZXJpY19pcDsKKwljb21tYW5kX2RhdGEtPnNwID0gaW5vZGUtPmlfcHJpdmF0ZTsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBjb21tYW5kX2RhdGE7CiAJcmV0dXJuIDA7CiB9CkBAIC0zNTEsMTAgKzM1MCwxMCBAQAogCXN0cnVjdCBpYm1hc21mc19ldmVudF9kYXRhICpldmVudF9kYXRhOwogCXN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3A7IAogCi0JaWYgKCFpbm9kZS0+dS5nZW5lcmljX2lwKQorCWlmICghaW5vZGUtPmlfcHJpdmF0ZSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlzcCA9IGlub2RlLT51LmdlbmVyaWNfaXA7CisJc3AgPSBpbm9kZS0+aV9wcml2YXRlOwogCiAJZXZlbnRfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpYm1hc21mc19ldmVudF9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFldmVudF9kYXRhKQpAQCAtNDM5LDE0ICs0MzgsMTQgQEAKIHsKIAlzdHJ1Y3QgaWJtYXNtZnNfaGVhcnRiZWF0X2RhdGEgKnJoYmVhdDsKIAotCWlmICghaW5vZGUtPnUuZ2VuZXJpY19pcCkKKwlpZiAoIWlub2RlLT5pX3ByaXZhdGUpCiAJCXJldHVybiAtRU5PREVWOwogCiAJcmhiZWF0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlibWFzbWZzX2hlYXJ0YmVhdF9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyaGJlYXQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmhiZWF0LT5zcCA9IChzdHJ1Y3Qgc2VydmljZV9wcm9jZXNzb3IgKilpbm9kZS0+dS5nZW5lcmljX2lwOworCXJoYmVhdC0+c3AgPSBpbm9kZS0+aV9wcml2YXRlOwogCXJoYmVhdC0+YWN0aXZlID0gMDsKIAlpYm1hc21faW5pdF9yZXZlcnNlX2hlYXJ0YmVhdChyaGJlYXQtPnNwLCAmcmhiZWF0LT5oZWFydGJlYXQpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IHJoYmVhdDsKQEAgLTUwOCw3ICs1MDcsNyBAQAogCiBzdGF0aWMgaW50IHJlbW90ZV9zZXR0aW5nc19maWxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPnUuZ2VuZXJpY19pcDsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC8zYzUwOS5jIGIvZHJpdmVycy9uZXQvM2M1MDkuYwppbmRleCA1OWMzMzkyLi5iOTM2MzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC8zYzUwOS5jCisrKyBiL2RyaXZlcnMvbmV0LzNjNTA5LmMKQEAgLTIyNSw2ICsyMjUsNyBAQAogCQl7ICJUQ001MDk1IiB9LAogCQl7ICIiIH0KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKGVpc2EsIGVsM19laXNhX2lkcyk7CiAKIHN0YXRpYyBpbnQgZWwzX2Vpc2FfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzNjNTl4LmMgYi9kcml2ZXJzL25ldC8zYzU5eC5jCmluZGV4IGFmMzAxZjAuLmRmNDJlMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzNjNTl4LmMKKysrIGIvZHJpdmVycy9uZXQvM2M1OXguYwpAQCAtODUxLDYgKzg1MSw3IEBACiAJeyAiVENNNTk3MCIsIENIXzNDNTk3IH0sCiAJeyAiIiB9CiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShlaXNhLCB2b3J0ZXhfZWlzYV9pZHMpOwogCiBzdGF0aWMgaW50IHZvcnRleF9laXNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IHZvcnRleF9laXNhX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jIGIvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jCmluZGV4IDJhMGQ1MzguLjM4M2NlZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMKQEAgLTY3MSwxMCArNjcxLDggQEAKIAkJCSAqIEplYW4gSUkgKi8KIAkJCWRvbmUgPSAxOwogCQkJYnJlYWs7Ci0JCWNhc2UgLUVDT05OQUJPUlRFRDoJCS8qIC0xMDMgKi8KLQkJY2FzZSAtRUNPTk5SRVNFVDoJCS8qIC0xMDQgKi8KLQkJY2FzZSAtRVRJTUVET1VUOgkJLyogLTExMCAqLwotCQljYXNlIC1FTk9FTlQ6CQkJLyogLTIgKHVyYiB1bmxpbmtlZCBieSB1cykgICovCisJCWNhc2UgLUVDT05OUkVTRVQ6CisJCWNhc2UgLUVOT0VOVDoJCQkvKiB1cmIgdW5saW5rZWQgYnkgdXMgKi8KIAkJZGVmYXVsdDoJCQkvKiA/Pz8gLSBQbGF5IHNhZmUgKi8KIAkJCXVyYi0+c3RhdHVzID0gMDsKIAkJCW5ldGlmX3dha2VfcXVldWUoc2VsZi0+bmV0ZGV2KTsKQEAgLTcxMiwxMCArNzEwLDggQEAKIAkJCSAqIEplYW4gSUkgKi8KIAkJCWRvbmUgPSAxOwogCQkJYnJlYWs7Ci0JCWNhc2UgLUVDT05OQUJPUlRFRDoJCS8qIC0xMDMgKi8KLQkJY2FzZSAtRUNPTk5SRVNFVDoJCS8qIC0xMDQgKi8KLQkJY2FzZSAtRVRJTUVET1VUOgkJLyogLTExMCAqLwotCQljYXNlIC1FTk9FTlQ6CQkJLyogLTIgKHVyYiB1bmxpbmtlZCBieSB1cykgICovCisJCWNhc2UgLUVDT05OUkVTRVQ6CisJCWNhc2UgLUVOT0VOVDoJCQkvKiB1cmIgdW5saW5rZWQgYnkgdXMgKi8KIAkJZGVmYXVsdDoJCQkvKiA/Pz8gLSBQbGF5IHNhZmUgKi8KIAkJCWlmKHNrYiAhPSBOVUxMKSB7CiAJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKQEAgLTg0NSwxNCArODQxLDE0IEBACiAJCQlzZWxmLT5zdGF0cy5yeF9jcmNfZXJyb3JzKys7CQogCQkJLyogQWxzbyBwcmVjdXJzb3IgdG8gYSBob3QtdW5wbHVnIG9uIFVIQ0kuICovCiAJCQkvKiBGYWxsdGhyb3VnaC4uLiAqLwotCQljYXNlIC1FQ09OTlJFU0VUOgkJLyogLTEwNCAqLworCQljYXNlIC1FQ09OTlJFU0VUOgogCQkJLyogUmFuZG9tIGVycm9yLCBpZiBJIHJlbWVtYmVyIGNvcnJlY3RseSAqLwogCQkJLyogdWhjaV9jbGVhbnVwX3VubGluaygpIGlzIGdvaW5nIHRvIGtpbGwgdGhlIFJ4CiAJCQkgKiBVUkIganVzdCBhZnRlciB3ZSByZXR1cm4uIE5vIHByb2JsZW0sIGF0IHRoaXMKIAkJCSAqIHBvaW50IHRoZSBVUkIgd2lsbCBiZSBpZGxlIDstKSAtIEplYW4gSUkgKi8KLQkJY2FzZSAtRVNIVVRET1dOOgkJLyogLTEwOCAqLworCQljYXNlIC1FU0hVVERPV046CiAJCQkvKiBUaGF0J3MgdXN1YWxseSBhIGhvdC11bnBsdWcuIFN1Ym1pdCB3aWxsIGZhaWwuLi4gKi8KLQkJY2FzZSAtRVRJTUVET1VUOgkJLyogLTExMCAqLworCQljYXNlIC1FVElNRToKIAkJCS8qIFVzdWFsbHkgcHJlY3Vyc29yIHRvIGEgaG90LXVucGx1ZyBvbiBPSENJLiAqLwogCQlkZWZhdWx0OgogCQkJc2VsZi0+c3RhdHMucnhfZXJyb3JzKys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcmRhL3Zsc2lfaXIuaCBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oCmluZGV4IGE4MmE0YmEuLmMzN2YwYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oCisrKyBiL2RyaXZlcnMvbmV0L2lyZGEvdmxzaV9pci5oCkBAIC01OCw3ICs1OCw3IEBACiAKIC8qIFBERSgpIGludHJvZHVjZWQgaW4gMi41LjQgKi8KICNpZmRlZiBDT05GSUdfUFJPQ19GUwotI2RlZmluZSBQREUoaW5vZGUpICgoaW5vZGUpLT51LmdlbmVyaWNfaXApCisjZGVmaW5lIFBERShpbm9kZSkgKChpbm9kZSktPmlfcHJpdmF0ZSkKICNlbmRpZgogCiAvKiBpcmRhIGNyYzE2IGNhbGN1bGF0aW9uIGV4cG9ydGVkIGluIDIuNS40MiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmUzMjEwLmMgYi9kcml2ZXJzL25ldC9uZTMyMTAuYwppbmRleCAwZmE4ZTRkLi5kNjYzMjg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9uZTMyMTAuYworKysgYi9kcml2ZXJzL25ldC9uZTMyMTAuYwpAQCAtMzQzLDYgKzM0Myw3IEBACiAJeyAiTlZMMTgwMSIgfSwKIAl7ICIiIH0sCiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShlaXNhLCBuZTMyMTBfaWRzKTsKIAogc3RhdGljIHN0cnVjdCBlaXNhX2RyaXZlciBuZTMyMTBfZWlzYV9kcml2ZXIgPSB7CiAJLmlkX3RhYmxlID0gbmUzMjEwX2lkcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N0bmljLmMgYi9kcml2ZXJzL25ldC9zdG5pYy5jCmluZGV4IDNmZDdhNGYuLmU2ZjkwNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N0bmljLmMKKysrIGIvZHJpdmVycy9uZXQvc3RuaWMuYwpAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9zZS9zZS5oPgorI2luY2x1ZGUgPGFzbS9zZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaWZkZWYgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MKICNpbmNsdWRlIDxhc20vc2hfYmlvcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYyBiL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKaW5kZXggZTY2MWQwYTkuLmZiNWZhN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL2RlNHg1LmMKKysrIGIvZHJpdmVycy9uZXQvdHVsaXAvZGU0eDUuYwpAQCAtMjExNCw2ICsyMTE0LDcgQEAKICAgICAgICAgeyAiREVDNDI1MCIsIDAgfSwJLyogMCBpcyB0aGUgYm9hcmQgbmFtZSBpbmRleC4uLiAqLwogICAgICAgICB7ICIiIH0KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKGVpc2EsIGRlNHg1X2Vpc2FfaWRzKTsKIAogc3RhdGljIHN0cnVjdCBlaXNhX2RyaXZlciBkZTR4NV9laXNhX2RyaXZlciA9IHsKICAgICAgICAgLmlkX3RhYmxlID0gZGU0eDVfZWlzYV9pZHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2RlYnVnZnMuYwppbmRleCA5MjMyNzVlLi5iOWRmMDZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9kZWJ1Z2ZzLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAogc3RhdGljIGludCBvcGVuX2ZpbGVfZ2VuZXJpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+dS5nZW5lcmljX2lwOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3pkMTIwMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjAxLmMKaW5kZXggYTQ0ZGRhOS4uODBhZjlhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjAxLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjAxLmMKQEAgLTExOSw3ICsxMTksNyBAQAogCXN3aXRjaCh1cmItPnN0YXR1cykgewogCQljYXNlIC1FSUxTRVE6CiAJCWNhc2UgLUVOT0RFVjoKLQkJY2FzZSAtRVRJTUVET1VUOgorCQljYXNlIC1FVElNRToKIAkJY2FzZSAtRU5PRU5UOgogCQljYXNlIC1FUElQRToKIAkJY2FzZSAtRU9WRVJGTE9XOgpAQCAtMjAxLDcgKzIwMSw3IEBACiAJc3dpdGNoKHVyYi0+c3RhdHVzKSB7CiAJCWNhc2UgLUVJTFNFUToKIAkJY2FzZSAtRU5PREVWOgotCQljYXNlIC1FVElNRURPVVQ6CisJCWNhc2UgLUVUSU1FOgogCQljYXNlIC1FTk9FTlQ6CiAJCWNhc2UgLUVQSVBFOgogCQljYXNlIC1FT1ZFUkZMT1c6CmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL29wcm9maWxlZnMuYyBiL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2ZpbGVmcy5jCmluZGV4IDcxYzJkYTIuLjU3NTY0MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2ZpbGVmcy5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2ZpbGVmcy5jCkBAIC0zMSw3ICszMSw2IEBACiAJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQlpbm9kZS0+aV91aWQgPSAwOwogCQlpbm9kZS0+aV9naWQgPSAwOwotCQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJfQpAQCAtMTEwLDggKzEwOSw4IEBACiAKIHN0YXRpYyBpbnQgZGVmYXVsdF9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCiB7Ci0JaWYgKGlub2RlLT51LmdlbmVyaWNfaXApCi0JCWZpbHAtPnByaXZhdGVfZGF0YSA9IGlub2RlLT51LmdlbmVyaWNfaXA7CisJaWYgKGlub2RlLT5pX3ByaXZhdGUpCisJCWZpbHAtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1OCw3ICsxNTcsNyBAQAogCWlmICghZCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlkLT5kX2lub2RlLT51LmdlbmVyaWNfaXAgPSB2YWw7CisJZC0+ZF9pbm9kZS0+aV9wcml2YXRlID0gdmFsOwogCXJldHVybiAwOwogfQogCkBAIC0xNzEsNyArMTcwLDcgQEAKIAlpZiAoIWQpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JZC0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwID0gdmFsOworCWQtPmRfaW5vZGUtPmlfcHJpdmF0ZSA9IHZhbDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTk3LDcgKzE5Niw3IEBACiAJaWYgKCFkKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWQtPmRfaW5vZGUtPnUuZ2VuZXJpY19pcCA9IHZhbDsKKwlkLT5kX2lub2RlLT5pX3ByaXZhdGUgPSB2YWw7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL0tjb25maWcgYi9kcml2ZXJzL3BjaS9LY29uZmlnCmluZGV4IDRkNzYyZmMuLmMyN2U3ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL0tjb25maWcKKysrIGIvZHJpdmVycy9wY2kvS2NvbmZpZwpAQCAtMTcsNiArMTcsMzEgQEAKIAogCSAgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSwgc2F5IE4uCiAKK2NvbmZpZyBQQ0lfTVVMVElUSFJFQURfUFJPQkUKKwlib29sICJQQ0kgTXVsdGktdGhyZWFkZWQgcHJvYmUgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBQQ0kgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0aGUgUENJIGNvcmUgdG8gc3Bhd24gYSBuZXcgdGhyZWFkIGZvcgorCSAgZXZlcnkgUENJIGRldmljZSB0aGF0IGlzIHByb2JlZC4gIFRoaXMgY2FuIGNhdXNlIGEgaHVnZQorCSAgc3BlZWR1cCBpbiBib290IHRpbWVzIG9uIG11bHRpcHJvY2Vzc29yIG1hY2hpbmVzLCBhbmQgZXZlbiBhCisJICBzbWFsbGVyIHNwZWVkdXAgb24gc2luZ2xlIHByb2Nlc3NvciBtYWNoaW5lcy4KKworCSAgQnV0IGl0IGNhbiBhbHNvIGNhdXNlIGxvdHMgb2YgYmFkIHRoaW5ncyB0byBoYXBwZW4uICBBIG51bWJlcgorCSAgb2YgUENJIGRyaXZlcnMgY2FuIG5vdCBwcm9wZXJseSBoYW5kbGUgcnVubmluZyBpbiB0aGlzIHdheSwKKwkgIHNvbWUgd2lsbCBqdXN0IG5vdCB3b3JrIHByb3Blcmx5IGF0IGFsbCwgd2hpbGUgb3RoZXJzIG1pZ2h0CisJICBkZWNpZGUgdG8gYmxvdyB1cCBwb3dlciBzdXBwbGllcyB3aXRoIGEgaHVnZSBsb2FkIGFsbCBhdCBvbmNlLAorCSAgc28gdXNlIHRoaXMgb3B0aW9uIGF0IHlvdXIgb3duIHJpc2suCisKKwkgIEl0IGlzIHZlcnkgdW53aXNlIHRvIHVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgYXJlIG5vdCB1c2luZyBhCisJICBib290IHByb2Nlc3MgdGhhdCBjYW4gaGFuZGxlIGRldmljZXMgYmVpbmcgY3JlYXRlZCBpbiBhbnkKKwkgIG9yZGVyLiAgQSBwcm9ncmFtIHRoYXQgY2FuIGNyZWF0ZSBwZXJzaXN0YW50IGJsb2NrIGFuZCBuZXR3b3JrCisJICBkZXZpY2UgbmFtZXMgKGxpa2UgdWRldikgaXMgYSBnb29kIGlkZWEgaWYgeW91IHdpc2ggdG8gdXNlCisJICB0aGlzIG9wdGlvbi4KKworCSAgQWdhaW4sIHVzZSB0aGlzIG9wdGlvbiBhdCB5b3VyIG93biByaXNrLCB5b3UgaGF2ZSBiZWVuIHdhcm5lZCEKKworCSAgV2hlbiBpbiBkb3VidCwgc2F5IE4uCisKIGNvbmZpZyBQQ0lfREVCVUcKIAlib29sICJQQ0kgRGVidWdnaW5nIgogCWRlcGVuZHMgb24gUENJICYmIERFQlVHX0tFUk5FTApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvYnVzLmMgYi9kcml2ZXJzL3BjaS9idXMuYwppbmRleCA1ZjdkYjlkLi5hYWRhYTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9idXMuYworKysgYi9kcml2ZXJzL3BjaS9idXMuYwpAQCAtNzcsOSArNzcsMTIgQEAKICAqIFRoaXMgYWRkcyBhIHNpbmdsZSBwY2kgZGV2aWNlIHRvIHRoZSBnbG9iYWwKICAqIGRldmljZSBsaXN0IGFuZCBhZGRzIHN5c2ZzIGFuZCBwcm9jZnMgZW50cmllcwogICovCi12b2lkIF9fZGV2aW5pdCBwY2lfYnVzX2FkZF9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKK2ludCBfX2RldmluaXQgcGNpX2J1c19hZGRfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JZGV2aWNlX2FkZCgmZGV2LT5kZXYpOworCWludCByZXR2YWw7CisJcmV0dmFsID0gZGV2aWNlX2FkZCgmZGV2LT5kZXYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CiAKIAlkb3duX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiAJbGlzdF9hZGRfdGFpbCgmZGV2LT5nbG9iYWxfbGlzdCwgJnBjaV9kZXZpY2VzKTsKQEAgLTg3LDYgKzkwLDcgQEAKIAogCXBjaV9wcm9jX2F0dGFjaF9kZXZpY2UoZGV2KTsKIAlwY2lfY3JlYXRlX3N5c2ZzX2Rldl9maWxlcyhkZXYpOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTEwNCw2ICsxMDgsNyBAQAogdm9pZCBfX2RldmluaXQgcGNpX2J1c19hZGRfZGV2aWNlcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJaW50IHJldHZhbDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewogCQkvKgpAQCAtMTEyLDcgKzExNyw5IEBACiAJCSAqLwogCQlpZiAoIWxpc3RfZW1wdHkoJmRldi0+Z2xvYmFsX2xpc3QpKQogCQkJY29udGludWU7Ci0JCXBjaV9idXNfYWRkX2RldmljZShkZXYpOworCQlyZXR2YWwgPSBwY2lfYnVzX2FkZF9kZXZpY2UoZGV2KTsKKwkJaWYgKHJldHZhbCkKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiRXJyb3IgYWRkaW5nIGRldmljZSwgY29udGludWluZ1xuIik7CiAJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CkBAIC0xMjksMTAgKzEzNiwxMyBAQAogCQkJICAgICAgIGxpc3RfYWRkX3RhaWwoJmRldi0+c3Vib3JkaW5hdGUtPm5vZGUsCiAJCQkJCSAgICAgICAmZGV2LT5idXMtPmNoaWxkcmVuKTsKIAkJCSAgICAgICB1cF93cml0ZSgmcGNpX2J1c19zZW0pOwotCQkgICAgICAgfQorCQkJfQogCQkJcGNpX2J1c19hZGRfZGV2aWNlcyhkZXYtPnN1Ym9yZGluYXRlKTsKLQotCQkJc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+c3Vib3JkaW5hdGUtPmNsYXNzX2Rldi5rb2JqLCAmZGV2LT5kZXYua29iaiwgImJyaWRnZSIpOworCQkJcmV0dmFsID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+c3Vib3JkaW5hdGUtPmNsYXNzX2Rldi5rb2JqLAorCQkJCQkJICAgJmRldi0+ZGV2LmtvYmosICJicmlkZ2UiKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZGV2X2VycigmZGV2LT5kZXYsICJFcnJvciBjcmVhdGluZyBzeXNmcyAiCisJCQkJCSJicmlkZ2Ugc3ltbGluaywgY29udGludWluZy4uLlxuIik7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHAuaCBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCmluZGV4IGJlMTA0ZWMuLjdmZmYwN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocC5oCkBAIC0xNTAsNiArMTUwLDExIEBACiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CiB9OwogCitzdHJ1Y3QgYWNwaXBocF9pb2FwaWMgeworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJdTMyIGdzaV9iYXNlOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CiAKIC8qIFBDSSBidXMgYnJpZGdlIEhJRCAqLwogI2RlZmluZSBBQ1BJX1BDSV9IT1NUX0hJRAkJIlBOUDBBMDMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwppbmRleCBhZTY3YThmLi44M2U4ZTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKQEAgLTUzLDYgKzUzLDggQEAKICNpbmNsdWRlICJhY3BpcGhwLmgiCiAKIHN0YXRpYyBMSVNUX0hFQUQoYnJpZGdlX2xpc3QpOworc3RhdGljIExJU1RfSEVBRChpb2FwaWNfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGlvYXBpY19saXN0X2xvY2spOwogCiAjZGVmaW5lIE1ZX05BTUUgImFjcGlwaHBfZ2x1ZSIKIApAQCAtNzk3LDYgKzc5OSw3IEBACiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAJdTMyIGdzaV9iYXNlOwogCXU2NCBwaHlzX2FkZHI7CisJc3RydWN0IGFjcGlwaHBfaW9hcGljICppb2FwaWM7CiAKIAkvKiBFdmFsdWF0ZSBfU1RBIGlmIHByZXNlbnQgKi8KIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX1NUQSIsIE5VTEwsICZzdGEpOwpAQCAtODExLDQxICs4MTQsMTA3IEBACiAJaWYgKGdldF9nc2lfYmFzZShoYW5kbGUsICZnc2lfYmFzZSkpCiAJCXJldHVybiBBRV9PSzsKIAorCWlvYXBpYyA9IGttYWxsb2Moc2l6ZW9mKCppb2FwaWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlvYXBpYykKKwkJcmV0dXJuIEFFX05PX01FTU9SWTsKKwogCXBkZXYgPSBnZXRfYXBpY19wY2lfaW5mbyhoYW5kbGUpOwogCWlmICghcGRldikKLQkJcmV0dXJuIEFFX09LOworCQlnb3RvIGV4aXRfa2ZyZWU7CiAKLQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKLQkJcGNpX2Rldl9wdXQocGRldik7Ci0JCXJldHVybiBBRV9PSzsKLQl9CisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQorCQlnb3RvIGV4aXRfcGNpX2Rldl9wdXQ7CiAKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAotCWlmIChwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMCwgIkkvTyBBUElDKGFjcGlwaHApIikpIHsKLQkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCQlwY2lfZGV2X3B1dChwZGV2KTsKLQkJcmV0dXJuIEFFX09LOwotCX0KKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDAsICJJL08gQVBJQyhhY3BpcGhwKSIpKQorCQlnb3RvIGV4aXRfcGNpX2Rpc2FibGVfZGV2aWNlOwogCiAJcGh5c19hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwotCWlmIChhY3BpX3JlZ2lzdGVyX2lvYXBpYyhoYW5kbGUsIHBoeXNfYWRkciwgZ3NpX2Jhc2UpKSB7Ci0JCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKLQkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCQlwY2lfZGV2X3B1dChwZGV2KTsKKwlpZiAoYWNwaV9yZWdpc3Rlcl9pb2FwaWMoaGFuZGxlLCBwaHlzX2FkZHIsIGdzaV9iYXNlKSkKKwkJZ290byBleGl0X3BjaV9yZWxlYXNlX3JlZ2lvbjsKKworCWlvYXBpYy0+Z3NpX2Jhc2UgPSBnc2lfYmFzZTsKKwlpb2FwaWMtPmRldiA9IHBkZXY7CisJc3Bpbl9sb2NrKCZpb2FwaWNfbGlzdF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZpb2FwaWMtPmxpc3QsICZpb2FwaWNfbGlzdCk7CisJc3Bpbl91bmxvY2soJmlvYXBpY19saXN0X2xvY2spOworCisJcmV0dXJuIEFFX09LOworCisgZXhpdF9wY2lfcmVsZWFzZV9yZWdpb246CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOworIGV4aXRfcGNpX2Rpc2FibGVfZGV2aWNlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKyBleGl0X3BjaV9kZXZfcHV0OgorCXBjaV9kZXZfcHV0KHBkZXYpOworIGV4aXRfa2ZyZWU6CisJa2ZyZWUoaW9hcGljKTsKKworCXJldHVybiBBRV9PSzsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzCitpb2FwaWNfcmVtb3ZlKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGx2bCwgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJ2KQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIHN0YTsKKwlhY3BpX2hhbmRsZSB0bXA7CisJdTMyIGdzaV9iYXNlOworCXN0cnVjdCBhY3BpcGhwX2lvYXBpYyAqcG9zLCAqbiwgKmlvYXBpYyA9IE5VTEw7CisKKwkvKiBFdmFsdWF0ZSBfU1RBIGlmIHByZXNlbnQgKi8KKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX1NUQSIsIE5VTEwsICZzdGEpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiBzdGEgIT0gQUNQSV9TVEFfQUxMKQorCQlyZXR1cm4gQUVfQ1RSTF9ERVBUSDsKKworCS8qIFNjYW4gb25seSBQQ0kgYnVzIHNjb3BlICovCisJc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKGhhbmRsZSwgIl9ISUQiLCAmdG1wKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCisJCXJldHVybiBBRV9DVFJMX0RFUFRIOworCisJaWYgKGdldF9nc2lfYmFzZShoYW5kbGUsICZnc2lfYmFzZSkpCiAJCXJldHVybiBBRV9PSzsKKworCWFjcGlfdW5yZWdpc3Rlcl9pb2FwaWMoaGFuZGxlLCBnc2lfYmFzZSk7CisKKwlzcGluX2xvY2soJmlvYXBpY19saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sICZpb2FwaWNfbGlzdCwgbGlzdCkgeworCQlpZiAocG9zLT5nc2lfYmFzZSAhPSBnc2lfYmFzZSkKKwkJCWNvbnRpbnVlOworCQlpb2FwaWMgPSBwb3M7CisJCWxpc3RfZGVsKCZpb2FwaWMtPmxpc3QpOworCQlicmVhazsKIAl9CisJc3Bpbl91bmxvY2soJmlvYXBpY19saXN0X2xvY2spOworCisJaWYgKCFpb2FwaWMpCisJCXJldHVybiBBRV9PSzsKKworCXBjaV9yZWxlYXNlX3JlZ2lvbihpb2FwaWMtPmRldiwgMCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGlvYXBpYy0+ZGV2KTsKKwlwY2lfZGV2X3B1dChpb2FwaWMtPmRldik7CisJa2ZyZWUoaW9hcGljKTsKIAogCXJldHVybiBBRV9PSzsKIH0KIAogc3RhdGljIGludCBhY3BpcGhwX2NvbmZpZ3VyZV9pb2FwaWNzKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKKwlpb2FwaWNfYWRkKGhhbmRsZSwgMCwgTlVMTCwgTlVMTCk7CiAJYWNwaV93YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBoYW5kbGUsCiAJCQkgICAgQUNQSV9VSU5UMzJfTUFYLCBpb2FwaWNfYWRkLCBOVUxMLCBOVUxMKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhY3BpcGhwX3VuY29uZmlndXJlX2lvYXBpY3MoYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCWlvYXBpY19yZW1vdmUoaGFuZGxlLCAwLCBOVUxMLCBOVUxMKTsKKwlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIGhhbmRsZSwKKwkJCSAgICBBQ1BJX1VJTlQzMl9NQVgsIGlvYXBpY19yZW1vdmUsIE5VTEwsIE5VTEwpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHBvd2VyX29uX3Nsb3Qoc3RydWN0IGFjcGlwaHBfc2xvdCAqc2xvdCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CkBAIC05OTcsNyArMTA2Niw3IEBACiAgKiBAaGFuZGxlOiBoYW5kbGUgdG8gYWNwaSBuYW1lc3BhY2UKICAqCiAgKi8KLWludCBhY3BpcGhwX2J1c190cmltKGFjcGlfaGFuZGxlIGhhbmRsZSkKK3N0YXRpYyBpbnQgYWNwaXBocF9idXNfdHJpbShhY3BpX2hhbmRsZSBoYW5kbGUpCiB7CiAJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2U7CiAJaW50IHJldHZhbDsKQEAgLTEwNzQsMTAgKzExNDMsMTEgQEAKIAogCXBjaV9idXNfYXNzaWduX3Jlc291cmNlcyhidXMpOwogCWFjcGlwaHBfc2FuaXRpemVfYnVzKGJ1cyk7CisJYWNwaXBocF9zZXRfaHBwX3ZhbHVlcyhzbG90LT5icmlkZ2UtPmhhbmRsZSwgYnVzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZ1bmMsICZzbG90LT5mdW5jcywgc2libGluZykKKwkJYWNwaXBocF9jb25maWd1cmVfaW9hcGljcyhmdW5jLT5oYW5kbGUpOwogCXBjaV9lbmFibGVfYnJpZGdlcyhidXMpOwogCXBjaV9idXNfYWRkX2RldmljZXMoYnVzKTsKLQlhY3BpcGhwX3NldF9ocHBfdmFsdWVzKHNsb3QtPmJyaWRnZS0+aGFuZGxlLCBidXMpOwotCWFjcGlwaHBfY29uZmlndXJlX2lvYXBpY3Moc2xvdC0+YnJpZGdlLT5oYW5kbGUpOwogCiAJLyogYXNzb2NpYXRlIHBjaV9kZXYgdG8gb3VyIHJlcHJlc2VudGF0aW9uICovCiAJbGlzdF9mb3JfZWFjaCAobCwgJnNsb3QtPmZ1bmNzKSB7CkBAIC0xMTAzLDYgKzExNzMsMTYgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgdm9pZCBkaXNhYmxlX2JyaWRnZXMoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgeworCQlpZiAoZGV2LT5zdWJvcmRpbmF0ZSkgeworCQkJZGlzYWJsZV9icmlkZ2VzKGRldi0+c3Vib3JkaW5hdGUpOworCQkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisJCX0KKwl9Cit9CiAKIC8qKgogICogZGlzYWJsZV9kZXZpY2UgLSBkaXNhYmxlIGEgc2xvdApAQCAtMTEyNyw2ICsxMjA3LDE5IEBACiAJCQlmdW5jLT5icmlkZ2UgPSBOVUxMOwogCQl9CiAKKwkJaWYgKGZ1bmMtPnBjaV9kZXYpIHsKKwkJCXBjaV9zdG9wX2J1c19kZXZpY2UoZnVuYy0+cGNpX2Rldik7CisJCQlpZiAoZnVuYy0+cGNpX2Rldi0+c3Vib3JkaW5hdGUpIHsKKwkJCQlkaXNhYmxlX2JyaWRnZXMoZnVuYy0+cGNpX2Rldi0+c3Vib3JkaW5hdGUpOworCQkJCXBjaV9kaXNhYmxlX2RldmljZShmdW5jLT5wY2lfZGV2KTsKKwkJCX0KKwkJfQorCX0KKworCWxpc3RfZm9yX2VhY2ggKGwsICZzbG90LT5mdW5jcykgeworCQlmdW5jID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYWNwaXBocF9mdW5jLCBzaWJsaW5nKTsKKworCQlhY3BpcGhwX3VuY29uZmlndXJlX2lvYXBpY3MoZnVuYy0+aGFuZGxlKTsKIAkJYWNwaXBocF9idXNfdHJpbShmdW5jLT5oYW5kbGUpOwogCQkvKiB0cnkgdG8gcmVtb3ZlIGFueXdheS4KIAkJICogYWNwaXBocF9idXNfYWRkIG1pZ2h0IGhhdmUgYmVlbiBmYWlsZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9pYm0uYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9pYm0uYwppbmRleCAzMTc0NTdkLi5kMGEwN2Q5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfaWJtLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2libS5jCkBAIC00ODcsOSArNDg3LDcgQEAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCWVycigiJXM6IE5vdGlmaWNhdGlvbiBoYW5kbGVyIHJlbW92YWwgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOwogCS8qIHJlbW92ZSB0aGUgL3N5cyBlbnRyaWVzICovCi0JaWYgKHN5c2ZzX3JlbW92ZV9iaW5fZmlsZShzeXNkaXIsICZpYm1fYXBjaV90YWJsZV9hdHRyKSkKLQkJZXJyKCIlczogcmVtb3ZhbCBvZiBzeXNmcyBmaWxlIGFwY2lfdGFibGUgZmFpbGVkXG4iLAotCQkJCV9fRlVOQ1RJT05fXyk7CisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKHN5c2RpciwgJmlibV9hcGNpX3RhYmxlX2F0dHIpOwogfQogCiBtb2R1bGVfaW5pdChpYm1fYWNwaXBocF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX3N5c2ZzLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9zeXNmcy5jCmluZGV4IDhiM2RhMDAuLjViYWI2NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfc3lzZnMuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAKIHN0YXRpYyBpbnQgb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgY29udHJvbGxlciAqY3RybCA9IGlub2RlLT51LmdlbmVyaWNfaXA7CisJc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwgPSBpbm9kZS0+aV9wcml2YXRlOwogCXN0cnVjdCBjdHJsX2RiZyAqZGJnOwogCWludCByZXR2YWwgPSAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2Zha2VwaHAuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvZmFrZXBocC5jCmluZGV4IGRkMmI3NjIuLjA1YTRmMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvZmFrZXBocC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvZmFrZXBocC5jCkBAIC0xNzYsNyArMTc2LDkgQEAKIAlzdHJ1Y3QgcGNpX2J1cyAqYnVzID0gdGVtcC0+YnVzOwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAJaW50IGZ1bmM7CisJaW50IHJldHZhbDsKIAl1OCBoZHJfdHlwZTsKKwogCWlmICghcGNpX3JlYWRfY29uZmlnX2J5dGUodGVtcCwgUENJX0hFQURFUl9UWVBFLCAmaGRyX3R5cGUpKSB7CiAJCXRlbXAtPmhkcl90eXBlID0gaGRyX3R5cGUgJiAweDdmOwogCQlpZiAoIXBjaV9maW5kX3Nsb3QoYnVzLT5udW1iZXIsIHRlbXAtPmRldmZuKSkgewpAQCAtMTg1LDggKzE4NywxMiBAQAogCQkJCWRiZygiTmV3IGRldmljZSBvbiAlcyBmdW5jdGlvbiAleDoleFxuIiwKIAkJCQkJYnVzLT5uYW1lLCB0ZW1wLT5kZXZmbiA+PiAzLAogCQkJCQl0ZW1wLT5kZXZmbiAmIDcpOwotCQkJCXBjaV9idXNfYWRkX2RldmljZShkZXYpOwotCQkJCWFkZF9zbG90KGRldik7CisJCQkJcmV0dmFsID0gcGNpX2J1c19hZGRfZGV2aWNlKGRldik7CisJCQkJaWYgKHJldHZhbCkKKwkJCQkJZGV2X2VycigmZGV2LT5kZXYsICJlcnJvciBhZGRpbmcgIgorCQkJCQkJImRldmljZSwgY29udGludWluZy5cbiIpOworCQkJCWVsc2UKKwkJCQkJYWRkX3Nsb3QoZGV2KTsKIAkJCX0KIAkJfQogCQkvKiBtdWx0aWZ1bmN0aW9uIGRldmljZT8gKi8KQEAgLTIwNSw4ICsyMTEsMTIgQEAKIAkJCQkJZGJnKCJOZXcgZGV2aWNlIG9uICVzIGZ1bmN0aW9uICV4OiV4XG4iLAogCQkJCQkJYnVzLT5uYW1lLCB0ZW1wLT5kZXZmbiA+PiAzLAogCQkJCQkJdGVtcC0+ZGV2Zm4gJiA3KTsKLQkJCQkJcGNpX2J1c19hZGRfZGV2aWNlKGRldik7Ci0JCQkJCWFkZF9zbG90KGRldik7CisJCQkJCXJldHZhbCA9IHBjaV9idXNfYWRkX2RldmljZShkZXYpOworCQkJCQlpZiAocmV0dmFsKQorCQkJCQkJZGV2X2VycigmZGV2LT5kZXYsICJlcnJvciBhZGRpbmcgIgorCQkJCQkJCSJkZXZpY2UsIGNvbnRpbnVpbmcuXG4iKTsKKwkJCQkJZWxzZQorCQkJCQkJYWRkX3Nsb3QoZGV2KTsKIAkJCQl9CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpX2hvdHBsdWcuaCBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpX2hvdHBsdWcuaAppbmRleCBlOTI5YjdjLi43NzI1MjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2lfaG90cGx1Zy5oCkBAIC0xNzIsOCArMTcyLDggQEAKIAogZXh0ZXJuIGludCBwY2lfaHBfcmVnaXN0ZXIJCShzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90KTsKIGV4dGVybiBpbnQgcGNpX2hwX2RlcmVnaXN0ZXIJCShzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90KTsKLWV4dGVybiBpbnQgcGNpX2hwX2NoYW5nZV9zbG90X2luZm8JKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsCi0JCQkJCSBzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8gKmluZm8pOworZXh0ZXJuIGludCBfX211c3RfY2hlY2sgcGNpX2hwX2NoYW5nZV9zbG90X2luZm8JKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsCisJCQkJCQkgc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvICppbmZvKTsKIGV4dGVybiBzdHJ1Y3Qgc3Vic3lzdGVtIHBjaV9ob3RwbHVnX3Nsb3RzX3N1YnN5czsKIAogLyogUENJIFNldHRpbmcgUmVjb3JkIChUeXBlIDApICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaV9ob3RwbHVnX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpX2hvdHBsdWdfY29yZS5jCmluZGV4IGI3YjM3OGQuLmUyODIzZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpX2hvdHBsdWdfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpX2hvdHBsdWdfY29yZS5jCkBAIC00ODIsMzEgKzQ4Miw5NSBAQAogCiBzdGF0aWMgaW50IGZzX2FkZF9zbG90IChzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90KQogewotCWlmIChoYXNfcG93ZXJfZmlsZShzbG90KSA9PSAwKQotCQlzeXNmc19jcmVhdGVfZmlsZSgmc2xvdC0+a29iaiwgJmhvdHBsdWdfc2xvdF9hdHRyX3Bvd2VyLmF0dHIpOworCWludCByZXR2YWwgPSAwOwogCi0JaWYgKGhhc19hdHRlbnRpb25fZmlsZShzbG90KSA9PSAwKQotCQlzeXNmc19jcmVhdGVfZmlsZSgmc2xvdC0+a29iaiwgJmhvdHBsdWdfc2xvdF9hdHRyX2F0dGVudGlvbi5hdHRyKTsKKwlpZiAoaGFzX3Bvd2VyX2ZpbGUoc2xvdCkgPT0gMCkgeworCQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfZmlsZSgmc2xvdC0+a29iaiwgJmhvdHBsdWdfc2xvdF9hdHRyX3Bvd2VyLmF0dHIpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBleGl0X3Bvd2VyOworCX0KIAotCWlmIChoYXNfbGF0Y2hfZmlsZShzbG90KSA9PSAwKQotCQlzeXNmc19jcmVhdGVfZmlsZSgmc2xvdC0+a29iaiwgJmhvdHBsdWdfc2xvdF9hdHRyX2xhdGNoLmF0dHIpOworCWlmIChoYXNfYXR0ZW50aW9uX2ZpbGUoc2xvdCkgPT0gMCkgeworCQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfZmlsZSgmc2xvdC0+a29iaiwKKwkJCQkJICAgJmhvdHBsdWdfc2xvdF9hdHRyX2F0dGVudGlvbi5hdHRyKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXhpdF9hdHRlbnRpb247CisJfQogCi0JaWYgKGhhc19hZGFwdGVyX2ZpbGUoc2xvdCkgPT0gMCkKLQkJc3lzZnNfY3JlYXRlX2ZpbGUoJnNsb3QtPmtvYmosICZob3RwbHVnX3Nsb3RfYXR0cl9wcmVzZW5jZS5hdHRyKTsKKwlpZiAoaGFzX2xhdGNoX2ZpbGUoc2xvdCkgPT0gMCkgeworCQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfZmlsZSgmc2xvdC0+a29iaiwKKwkJCQkJICAgJmhvdHBsdWdfc2xvdF9hdHRyX2xhdGNoLmF0dHIpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBleGl0X2xhdGNoOworCX0KIAotCWlmIChoYXNfYWRkcmVzc19maWxlKHNsb3QpID09IDApCi0JCXN5c2ZzX2NyZWF0ZV9maWxlKCZzbG90LT5rb2JqLCAmaG90cGx1Z19zbG90X2F0dHJfYWRkcmVzcy5hdHRyKTsKKwlpZiAoaGFzX2FkYXB0ZXJfZmlsZShzbG90KSA9PSAwKSB7CisJCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZzbG90LT5rb2JqLAorCQkJCQkgICAmaG90cGx1Z19zbG90X2F0dHJfcHJlc2VuY2UuYXR0cik7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGV4aXRfYWRhcHRlcjsKKwl9CiAKLQlpZiAoaGFzX21heF9idXNfc3BlZWRfZmlsZShzbG90KSA9PSAwKQotCQlzeXNmc19jcmVhdGVfZmlsZSgmc2xvdC0+a29iaiwgJmhvdHBsdWdfc2xvdF9hdHRyX21heF9idXNfc3BlZWQuYXR0cik7CisJaWYgKGhhc19hZGRyZXNzX2ZpbGUoc2xvdCkgPT0gMCkgeworCQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfZmlsZSgmc2xvdC0+a29iaiwKKwkJCQkJICAgJmhvdHBsdWdfc2xvdF9hdHRyX2FkZHJlc3MuYXR0cik7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGV4aXRfYWRkcmVzczsKKwl9CiAKKwlpZiAoaGFzX21heF9idXNfc3BlZWRfZmlsZShzbG90KSA9PSAwKSB7CisJCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZzbG90LT5rb2JqLAorCQkJCQkgICAmaG90cGx1Z19zbG90X2F0dHJfbWF4X2J1c19zcGVlZC5hdHRyKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXhpdF9tYXhfc3BlZWQ7CisJfQorCisJaWYgKGhhc19jdXJfYnVzX3NwZWVkX2ZpbGUoc2xvdCkgPT0gMCkgeworCQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfZmlsZSgmc2xvdC0+a29iaiwKKwkJCQkJICAgJmhvdHBsdWdfc2xvdF9hdHRyX2N1cl9idXNfc3BlZWQuYXR0cik7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGV4aXRfY3VyX3NwZWVkOworCX0KKworCWlmIChoYXNfdGVzdF9maWxlKHNsb3QpID09IDApIHsKKwkJcmV0dmFsID0gc3lzZnNfY3JlYXRlX2ZpbGUoJnNsb3QtPmtvYmosCisJCQkJCSAgICZob3RwbHVnX3Nsb3RfYXR0cl90ZXN0LmF0dHIpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBleGl0X3Rlc3Q7CisJfQorCisJZ290byBleGl0OworCitleGl0X3Rlc3Q6CiAJaWYgKGhhc19jdXJfYnVzX3NwZWVkX2ZpbGUoc2xvdCkgPT0gMCkKLQkJc3lzZnNfY3JlYXRlX2ZpbGUoJnNsb3QtPmtvYmosICZob3RwbHVnX3Nsb3RfYXR0cl9jdXJfYnVzX3NwZWVkLmF0dHIpOworCQlzeXNmc19yZW1vdmVfZmlsZSgmc2xvdC0+a29iaiwgJmhvdHBsdWdfc2xvdF9hdHRyX2N1cl9idXNfc3BlZWQuYXR0cik7CiAKLQlpZiAoaGFzX3Rlc3RfZmlsZShzbG90KSA9PSAwKQotCQlzeXNmc19jcmVhdGVfZmlsZSgmc2xvdC0+a29iaiwgJmhvdHBsdWdfc2xvdF9hdHRyX3Rlc3QuYXR0cik7CitleGl0X2N1cl9zcGVlZDoKKwlpZiAoaGFzX21heF9idXNfc3BlZWRfZmlsZShzbG90KSA9PSAwKQorCQlzeXNmc19yZW1vdmVfZmlsZSgmc2xvdC0+a29iaiwgJmhvdHBsdWdfc2xvdF9hdHRyX21heF9idXNfc3BlZWQuYXR0cik7CiAKLQlyZXR1cm4gMDsKK2V4aXRfbWF4X3NwZWVkOgorCWlmIChoYXNfYWRkcmVzc19maWxlKHNsb3QpID09IDApCisJCXN5c2ZzX3JlbW92ZV9maWxlKCZzbG90LT5rb2JqLCAmaG90cGx1Z19zbG90X2F0dHJfYWRkcmVzcy5hdHRyKTsKKworZXhpdF9hZGRyZXNzOgorCWlmIChoYXNfYWRhcHRlcl9maWxlKHNsb3QpID09IDApCisJCXN5c2ZzX3JlbW92ZV9maWxlKCZzbG90LT5rb2JqLCAmaG90cGx1Z19zbG90X2F0dHJfcHJlc2VuY2UuYXR0cik7CisKK2V4aXRfYWRhcHRlcjoKKwlpZiAoaGFzX2xhdGNoX2ZpbGUoc2xvdCkgPT0gMCkKKwkJc3lzZnNfcmVtb3ZlX2ZpbGUoJnNsb3QtPmtvYmosICZob3RwbHVnX3Nsb3RfYXR0cl9sYXRjaC5hdHRyKTsKKworZXhpdF9sYXRjaDoKKwlpZiAoaGFzX2F0dGVudGlvbl9maWxlKHNsb3QpID09IDApCisJCXN5c2ZzX3JlbW92ZV9maWxlKCZzbG90LT5rb2JqLCAmaG90cGx1Z19zbG90X2F0dHJfYXR0ZW50aW9uLmF0dHIpOworCitleGl0X2F0dGVudGlvbjoKKwlpZiAoaGFzX3Bvd2VyX2ZpbGUoc2xvdCkgPT0gMCkKKwkJc3lzZnNfcmVtb3ZlX2ZpbGUoJnNsb3QtPmtvYmosICZob3RwbHVnX3Nsb3RfYXR0cl9wb3dlci5hdHRyKTsKK2V4aXRfcG93ZXI6CitleGl0OgorCXJldHVybiByZXR2YWw7CiB9CiAKIHN0YXRpYyB2b2lkIGZzX3JlbW92ZV9zbG90IChzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90KQpAQCAtNjI2LDggKzY5MCwxMSBAQAogICoKICAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBhbnl0aGluZyBlbHNlIGZvciBhbiBlcnJvci4KICAqLwotaW50IHBjaV9ocF9jaGFuZ2Vfc2xvdF9pbmZvIChzdHJ1Y3QgaG90cGx1Z19zbG90ICpzbG90LCBzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8gKmluZm8pCitpbnQgX19tdXN0X2NoZWNrIHBjaV9ocF9jaGFuZ2Vfc2xvdF9pbmZvKHN0cnVjdCBob3RwbHVnX3Nsb3QgKnNsb3QsCisJCQkJCSBzdHJ1Y3QgaG90cGx1Z19zbG90X2luZm8gKmluZm8pCiB7CisJaW50IHJldHZhbDsKKwogCWlmICgoc2xvdCA9PSBOVUxMKSB8fCAoaW5mbyA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTYzNiwzMiArNzAzLDYwIEBACiAJKiBmb3IgdGhlIGZpbGVzIHJlZmVycmluZyB0byB0aGUgZmllbGRzIHRoYXQgaGF2ZSBub3cgY2hhbmdlZC4KIAkqLwogCWlmICgoaGFzX3Bvd2VyX2ZpbGUoc2xvdCkgPT0gMCkgJiYKLQkgICAgKHNsb3QtPmluZm8tPnBvd2VyX3N0YXR1cyAhPSBpbmZvLT5wb3dlcl9zdGF0dXMpKQotCQlzeXNmc191cGRhdGVfZmlsZSgmc2xvdC0+a29iaiwgJmhvdHBsdWdfc2xvdF9hdHRyX3Bvd2VyLmF0dHIpOworCSAgICAoc2xvdC0+aW5mby0+cG93ZXJfc3RhdHVzICE9IGluZm8tPnBvd2VyX3N0YXR1cykpIHsKKwkJcmV0dmFsID0gc3lzZnNfdXBkYXRlX2ZpbGUoJnNsb3QtPmtvYmosCisJCQkJCSAgICZob3RwbHVnX3Nsb3RfYXR0cl9wb3dlci5hdHRyKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQogCiAJaWYgKChoYXNfYXR0ZW50aW9uX2ZpbGUoc2xvdCkgPT0gMCkgJiYKLQkgICAgKHNsb3QtPmluZm8tPmF0dGVudGlvbl9zdGF0dXMgIT0gaW5mby0+YXR0ZW50aW9uX3N0YXR1cykpCi0JCXN5c2ZzX3VwZGF0ZV9maWxlKCZzbG90LT5rb2JqLCAmaG90cGx1Z19zbG90X2F0dHJfYXR0ZW50aW9uLmF0dHIpOworCSAgICAoc2xvdC0+aW5mby0+YXR0ZW50aW9uX3N0YXR1cyAhPSBpbmZvLT5hdHRlbnRpb25fc3RhdHVzKSkgeworCQlyZXR2YWwgPSBzeXNmc191cGRhdGVfZmlsZSgmc2xvdC0+a29iaiwKKwkJCQkJICAgJmhvdHBsdWdfc2xvdF9hdHRyX2F0dGVudGlvbi5hdHRyKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQogCiAJaWYgKChoYXNfbGF0Y2hfZmlsZShzbG90KSA9PSAwKSAmJgotCSAgICAoc2xvdC0+aW5mby0+bGF0Y2hfc3RhdHVzICE9IGluZm8tPmxhdGNoX3N0YXR1cykpCi0JCXN5c2ZzX3VwZGF0ZV9maWxlKCZzbG90LT5rb2JqLCAmaG90cGx1Z19zbG90X2F0dHJfbGF0Y2guYXR0cik7CisJICAgIChzbG90LT5pbmZvLT5sYXRjaF9zdGF0dXMgIT0gaW5mby0+bGF0Y2hfc3RhdHVzKSkgeworCQlyZXR2YWwgPSBzeXNmc191cGRhdGVfZmlsZSgmc2xvdC0+a29iaiwKKwkJCQkJICAgJmhvdHBsdWdfc2xvdF9hdHRyX2xhdGNoLmF0dHIpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlpZiAoKGhhc19hZGFwdGVyX2ZpbGUoc2xvdCkgPT0gMCkgJiYKLQkgICAgKHNsb3QtPmluZm8tPmFkYXB0ZXJfc3RhdHVzICE9IGluZm8tPmFkYXB0ZXJfc3RhdHVzKSkKLQkJc3lzZnNfdXBkYXRlX2ZpbGUoJnNsb3QtPmtvYmosICZob3RwbHVnX3Nsb3RfYXR0cl9wcmVzZW5jZS5hdHRyKTsKKwkgICAgKHNsb3QtPmluZm8tPmFkYXB0ZXJfc3RhdHVzICE9IGluZm8tPmFkYXB0ZXJfc3RhdHVzKSkgeworCQlyZXR2YWwgPSBzeXNmc191cGRhdGVfZmlsZSgmc2xvdC0+a29iaiwKKwkJCQkJICAgJmhvdHBsdWdfc2xvdF9hdHRyX3ByZXNlbmNlLmF0dHIpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlpZiAoKGhhc19hZGRyZXNzX2ZpbGUoc2xvdCkgPT0gMCkgJiYKLQkgICAgKHNsb3QtPmluZm8tPmFkZHJlc3MgIT0gaW5mby0+YWRkcmVzcykpCi0JCXN5c2ZzX3VwZGF0ZV9maWxlKCZzbG90LT5rb2JqLCAmaG90cGx1Z19zbG90X2F0dHJfYWRkcmVzcy5hdHRyKTsKKwkgICAgKHNsb3QtPmluZm8tPmFkZHJlc3MgIT0gaW5mby0+YWRkcmVzcykpIHsKKwkJcmV0dmFsID0gc3lzZnNfdXBkYXRlX2ZpbGUoJnNsb3QtPmtvYmosCisJCQkJCSAgICZob3RwbHVnX3Nsb3RfYXR0cl9hZGRyZXNzLmF0dHIpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlpZiAoKGhhc19tYXhfYnVzX3NwZWVkX2ZpbGUoc2xvdCkgPT0gMCkgJiYKLQkgICAgKHNsb3QtPmluZm8tPm1heF9idXNfc3BlZWQgIT0gaW5mby0+bWF4X2J1c19zcGVlZCkpCi0JCXN5c2ZzX3VwZGF0ZV9maWxlKCZzbG90LT5rb2JqLCAmaG90cGx1Z19zbG90X2F0dHJfbWF4X2J1c19zcGVlZC5hdHRyKTsKKwkgICAgKHNsb3QtPmluZm8tPm1heF9idXNfc3BlZWQgIT0gaW5mby0+bWF4X2J1c19zcGVlZCkpIHsKKwkJcmV0dmFsID0gc3lzZnNfdXBkYXRlX2ZpbGUoJnNsb3QtPmtvYmosCisJCQkJCSAgICZob3RwbHVnX3Nsb3RfYXR0cl9tYXhfYnVzX3NwZWVkLmF0dHIpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlpZiAoKGhhc19jdXJfYnVzX3NwZWVkX2ZpbGUoc2xvdCkgPT0gMCkgJiYKLQkgICAgKHNsb3QtPmluZm8tPmN1cl9idXNfc3BlZWQgIT0gaW5mby0+Y3VyX2J1c19zcGVlZCkpCi0JCXN5c2ZzX3VwZGF0ZV9maWxlKCZzbG90LT5rb2JqLCAmaG90cGx1Z19zbG90X2F0dHJfY3VyX2J1c19zcGVlZC5hdHRyKTsKKwkgICAgKHNsb3QtPmluZm8tPmN1cl9idXNfc3BlZWQgIT0gaW5mby0+Y3VyX2J1c19zcGVlZCkpIHsKKwkJcmV0dmFsID0gc3lzZnNfdXBkYXRlX2ZpbGUoJnNsb3QtPmtvYmosCisJCQkJCSAgICZob3RwbHVnX3Nsb3RfYXR0cl9jdXJfYnVzX3NwZWVkLmF0dHIpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAltZW1jcHkgKHNsb3QtPmluZm8sIGluZm8sIHNpemVvZiAoc3RydWN0IGhvdHBsdWdfc2xvdF9pbmZvKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYwppbmRleCAzM2QxOTg3Li40MTI5MGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCkBAIC03NjIsMTQgKzc2MiwxNCBAQAogCWlmIChyYyB8fCAhZ2V0c3RhdHVzKSB7CiAJCWluZm8oIiVzOiBubyBhZGFwdGVyIG9uIHNsb3QoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIHBfc2xvdC0+bnVtYmVyKTsKIAkJbXV0ZXhfdW5sb2NrKCZwX3Nsb3QtPmN0cmwtPmNyaXRfc2VjdCk7Ci0JCXJldHVybiAxOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJaWYgKE1STF9TRU5TKHBfc2xvdC0+Y3RybC0+Y3RybGNhcCkpIHsJCiAJCXJjID0gcF9zbG90LT5ocGNfb3BzLT5nZXRfbGF0Y2hfc3RhdHVzKHBfc2xvdCwgJmdldHN0YXR1cyk7CiAJCWlmIChyYyB8fCBnZXRzdGF0dXMpIHsKIAkJCWluZm8oIiVzOiBsYXRjaCBvcGVuIG9uIHNsb3QoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIHBfc2xvdC0+bnVtYmVyKTsKIAkJCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KIAkKQEAgLTc3OCw3ICs3NzgsNyBAQAogCQlpZiAocmMgfHwgZ2V0c3RhdHVzKSB7CiAJCQlpbmZvKCIlczogYWxyZWFkeSBlbmFibGVkIG9uIHNsb3QoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIHBfc2xvdC0+bnVtYmVyKTsKIAkJCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIAltdXRleF91bmxvY2soJnBfc2xvdC0+Y3RybC0+Y3JpdF9zZWN0KTsKQEAgLTgxMyw3ICs4MTMsNyBAQAogCQlpZiAocmV0IHx8ICFnZXRzdGF0dXMpIHsKIAkJCWluZm8oIiVzOiBubyBhZGFwdGVyIG9uIHNsb3QoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIHBfc2xvdC0+bnVtYmVyKTsKIAkJCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0KIApAQCAtODIyLDcgKzgyMiw3IEBACiAJCWlmIChyZXQgfHwgZ2V0c3RhdHVzKSB7CiAJCQlpbmZvKCIlczogbGF0Y2ggb3BlbiBvbiBzbG90KCV4KVxuIiwgX19GVU5DVElPTl9fLCBwX3Nsb3QtPm51bWJlcik7CiAJCQltdXRleF91bmxvY2soJnBfc2xvdC0+Y3RybC0+Y3JpdF9zZWN0KTsKLQkJCXJldHVybiAxOworCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAl9CiAKQEAgLTgzMSw3ICs4MzEsNyBAQAogCQlpZiAocmV0IHx8ICFnZXRzdGF0dXMpIHsKIAkJCWluZm8oIiVzOiBhbHJlYWR5IGRpc2FibGVkIHNsb3QoJXgpXG4iLCBfX0ZVTkNUSU9OX18sIHBfc2xvdC0+bnVtYmVyKTsKIAkJCW11dGV4X3VubG9jaygmcF9zbG90LT5jdHJsLT5jcml0X3NlY3QpOwotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2locF9za2VsZXRvbi5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2locF9za2VsZXRvbi5jCmluZGV4IDhhZDQ0NjYuLjJiOWUxMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpaHBfc2tlbGV0b24uYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWhwX3NrZWxldG9uLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogUENJIEhvdCBQbHVnIENvbnRyb2xsZXIgU2tlbGV0b24gRHJpdmVyIC0gMC4yCisgKiBQQ0kgSG90IFBsdWcgQ29udHJvbGxlciBTa2VsZXRvbiBEcml2ZXIgLSAwLjMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMyBHcmVnIEtyb2FoLUhhcnRtYW4gKGdyZWdAa3JvYWguY29tKQogICogQ29weXJpZ2h0IChDKSAyMDAxLDIwMDMgSUJNIENvcnAuCkBAIC0yMSw3ICsyMSw3IEBACiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKgotICogVGhpcyBkcml2ZXIgaXMgdG8gYmUgdXNlZCBhcyBhIHNrZWxldG9uIGRyaXZlciB0byBiZSBzaG93IGhvdyB0byBpbnRlcmZhY2UKKyAqIFRoaXMgZHJpdmVyIGlzIHRvIGJlIHVzZWQgYXMgYSBza2VsZXRvbiBkcml2ZXIgdG8gc2hvdyBob3cgdG8gaW50ZXJmYWNlCiAgKiB3aXRoIHRoZSBwY2kgaG90cGx1ZyBjb3JlIGVhc2lseS4KICAqCiAgKiBTZW5kIGZlZWRiYWNrIHRvIDxncmVnQGtyb2FoLmNvbT4KQEAgLTU4LDggKzU4LDYgQEAKICNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICIgZm9ybWF0ICJcbiIsIE1ZX05BTUUgLCAjIyBhcmcpCiAjZGVmaW5lIHdhcm4oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAiIGZvcm1hdCAiXG4iLCBNWV9OQU1FICwgIyMgYXJnKQogCi0KLQogLyogbG9jYWwgdmFyaWFibGVzICovCiBzdGF0aWMgaW50IGRlYnVnOwogc3RhdGljIGludCBudW1fc2xvdHM7CkBAIC0xMDksNyArMTA3LDYgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi0KIHN0YXRpYyBpbnQgZGlzYWJsZV9zbG90KHN0cnVjdCBob3RwbHVnX3Nsb3QgKmhvdHBsdWdfc2xvdCkKIHsKIAlzdHJ1Y3Qgc2xvdCAqc2xvdCA9IGhvdHBsdWdfc2xvdC0+cHJpdmF0ZTsKQEAgLTM0Miw3ICszMzksNyBAQAogCWluZm8oRFJJVkVSX0RFU0MgIiB2ZXJzaW9uOiAiIERSSVZFUl9WRVJTSU9OICJcbiIpOwogCS8qCiAJICogRG8gc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gc3R1ZmYgZm9yIHlvdXIgZHJpdmVyIGhlcmUKLQkgKiBMaWtlIGluaXRpYWxpemluZyB5b3VyIGNvbnRyb2xsZXIgaGFyZHdhcmUgKGlmIGFueSkgYW5kCisJICogbGlrZSBpbml0aWFsaXppbmcgeW91ciBjb250cm9sbGVyIGhhcmR3YXJlIChpZiBhbnkpIGFuZAogCSAqIGRldGVybWluaW5nIHRoZSBudW1iZXIgb2Ygc2xvdHMgeW91IGhhdmUgaW4gdGhlIHN5c3RlbQogCSAqIHJpZ2h0IG5vdy4KIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwLmggYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocC5oCmluZGV4IDcyMDhiOTUuLmM3MTAzYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwLmgKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHAuaApAQCAtMTczLDcgKzE3Myw3IEBACiAjZGVmaW5lIG1zZ19idXR0b25fY2FuY2VsCSJQQ0kgc2xvdCAjJXMgLSBhY3Rpb24gY2FuY2VsZWQgZHVlIHRvIGJ1dHRvbiBwcmVzcy5cbiIKIAogLyogc3lzZnMgZnVuY3Rpb25zIGZvciB0aGUgaG90cGx1ZyBjb250cm9sbGVyIGluZm8gKi8KLWV4dGVybiB2b2lkIHNocGNocF9jcmVhdGVfY3RybF9maWxlcwkoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpOworZXh0ZXJuIGludCBfX211c3RfY2hlY2sgc2hwY2hwX2NyZWF0ZV9jdHJsX2ZpbGVzKHN0cnVjdCBjb250cm9sbGVyICpjdHJsKTsKIAogZXh0ZXJuIGludAlzaHBjaHBfc3lzZnNfZW5hYmxlX3Nsb3Qoc3RydWN0IHNsb3QgKnNsb3QpOwogZXh0ZXJuIGludAlzaHBjaHBfc3lzZnNfZGlzYWJsZV9zbG90KHN0cnVjdCBzbG90ICpzbG90KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2NvcmUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX2NvcmUuYwppbmRleCBhMTRlN2RlLi4yMzVjMThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9jb3JlLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfY29yZS5jCkBAIC00NDksMTAgKzQ0OSwxNCBAQAogCQljdHJsLT5zcGVlZCA9IFBDSV9TUEVFRF8zM01IejsKIAl9CiAKLQlzaHBjaHBfY3JlYXRlX2N0cmxfZmlsZXMoY3RybCk7CisJcmMgPSBzaHBjaHBfY3JlYXRlX2N0cmxfZmlsZXMoY3RybCk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9jbGVhbnVwX3Nsb3RzOwogCiAJcmV0dXJuIDA7CiAKK2Vycl9jbGVhbnVwX3Nsb3RzOgorCWNsZWFudXBfc2xvdHMoY3RybCk7CiBlcnJfb3V0X3JlbGVhc2VfY3RscjoKIAljdHJsLT5ocGNfb3BzLT5yZWxlYXNlX2N0bHIoY3RybCk7CiBlcnJfb3V0X2ZyZWVfY3RybDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX3N5c2ZzLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3NocGNocF9zeXNmcy5jCmluZGV4IDYyMGUxMTMuLjI5ZmE5ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvc2hwY2hwX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9zaHBjaHBfc3lzZnMuYwpAQCAtOTEsOSArOTEsOSBAQAogfQogc3RhdGljIERFVklDRV9BVFRSIChjdHJsLCBTX0lSVUdPLCBzaG93X2N0cmwsIE5VTEwpOwogCi12b2lkIHNocGNocF9jcmVhdGVfY3RybF9maWxlcyAoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCitpbnQgX19tdXN0X2NoZWNrIHNocGNocF9jcmVhdGVfY3RybF9maWxlcyAoc3RydWN0IGNvbnRyb2xsZXIgKmN0cmwpCiB7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlICgmY3RybC0+cGNpX2Rldi0+ZGV2LCAmZGV2X2F0dHJfY3RybCk7CisJcmV0dXJuIGRldmljZV9jcmVhdGVfZmlsZSAoJmN0cmwtPnBjaV9kZXYtPmRldiwgJmRldl9hdHRyX2N0cmwpOwogfQogCiB2b2lkIHNocGNocF9yZW1vdmVfY3RybF9maWxlcyhzdHJ1Y3QgY29udHJvbGxlciAqY3RybCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL21zaS5jIGIvZHJpdmVycy9wY2kvbXNpLmMKaW5kZXggYTgzYzFmNS4uMjdhMDU3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvbXNpLmMKKysrIGIvZHJpdmVycy9wY2kvbXNpLmMKQEAgLTQ1LDE2ICs0NSwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBtc2lfY2FjaGVfY3Rvcih2b2lkICpwLCBrbWVtX2NhY2hlX3QgKmNhY2hlLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCW1lbXNldChwLCAwLCBzaXplb2Yoc3RydWN0IG1zaV9kZXNjKSk7Ci19Ci0KIHN0YXRpYyBpbnQgbXNpX2NhY2hlX2luaXQodm9pZCkKIHsKLQltc2lfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm1zaV9jYWNoZSIsCi0JCQlzaXplb2Yoc3RydWN0IG1zaV9kZXNjKSwKLQkJICAgICAgIAkwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIG1zaV9jYWNoZV9jdG9yLCBOVUxMKTsKKwltc2lfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm1zaV9jYWNoZSIsIHNpemVvZihzdHJ1Y3QgbXNpX2Rlc2MpLAorCQkJCQkwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOwogCWlmICghbXNpX2NhY2hlcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTQwMiwxMSArMzk2LDEwIEBACiB7CiAJc3RydWN0IG1zaV9kZXNjICplbnRyeTsKIAotCWVudHJ5ID0ga21lbV9jYWNoZV9hbGxvYyhtc2lfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJZW50cnkgPSBrbWVtX2NhY2hlX3phbGxvYyhtc2lfY2FjaGVwLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWVudHJ5KQogCQlyZXR1cm4gTlVMTDsKIAotCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKHN0cnVjdCBtc2lfZGVzYykpOwogCWVudHJ5LT5saW5rLnRhaWwgPSBlbnRyeS0+bGluay5oZWFkID0gMDsJLyogc2luZ2xlIG1lc3NhZ2UgKi8KIAllbnRyeS0+ZGV2ID0gTlVMTDsKIApAQCAtOTAxLDYgKzg5NCwzMyBAQAogfQogCiAvKioKKyAqIHBjaV9tc2lfc3VwcG9ydGVkIC0gY2hlY2sgd2hldGhlciBNU0kgbWF5IGJlIGVuYWJsZWQgb24gZGV2aWNlCisgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBwY2lfZGV2IGRhdGEgc3RydWN0dXJlIG9mIE1TSSBkZXZpY2UgZnVuY3Rpb24KKyAqCisgKiBNU0kgbXVzdCBiZSBnbG9iYWxseSBlbmFibGVkIGFuZCBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSBhbmQgaXRzIHJvb3QKKyAqIGJ1cy4gQnV0LCB0aGUgcm9vdCBidXMgaXMgbm90IGVhc3kgdG8gZmluZCBzaW5jZSBzb21lIGFyY2hpdGVjdHVyZXMKKyAqIGhhdmUgdmlydHVhbCBidXNzZXMgb24gdG9wIG9mIHRoZSBQQ0kgaGllcmFyY2h5IChmb3IgaW5zdGFuY2UgdGhlCisgKiBoeXBlcnRyYW5zcG9ydCBidXMpLCB3aGlsZSB0aGUgYWN0dWFsIGJ1cyB3aGVyZSBNU0kgbXVzdCBiZSBzdXBwb3J0ZWQKKyAqIGlzIGJlbG93LiBTbyB3ZSB0ZXN0IHRoZSBNU0kgZmxhZyBvbiBhbGwgcGFyZW50IGJ1c3NlcyBhbmQgYXNzdW1lCisgKiB0aGF0IG5vIHF1aXJrIHdpbGwgZXZlciBzZXQgdGhlIE5PX01TSSBmbGFnIG9uIGEgbm9uLXJvb3QgYnVzLgorICoqLworc3RhdGljCitpbnQgcGNpX21zaV9zdXBwb3J0ZWQoc3RydWN0IHBjaV9kZXYgKiBkZXYpCit7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKworCWlmICghcGNpX21zaV9lbmFibGUgfHwgIWRldiB8fCBkZXYtPm5vX21zaSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBjaGVjayBNU0kgZmxhZ3Mgb2YgYWxsIHBhcmVudCBidXNzZXMgKi8KKwlmb3IgKGJ1cyA9IGRldi0+YnVzOyBidXM7IGJ1cyA9IGJ1cy0+cGFyZW50KQorCQlpZiAoYnVzLT5idXNfZmxhZ3MgJiBQQ0lfQlVTX0ZMQUdTX05PX01TSSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgogICogcGNpX2VuYWJsZV9tc2kgLSBjb25maWd1cmUgZGV2aWNlJ3MgTVNJIGNhcGFiaWxpdHkgc3RydWN0dXJlCiAgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBwY2lfZGV2IGRhdGEgc3RydWN0dXJlIG9mIE1TSSBkZXZpY2UgZnVuY3Rpb24KICAqCkBAIC05MTIsMTkgKzkzMiwxMSBAQAogICoqLwogaW50IHBjaV9lbmFibGVfbXNpKHN0cnVjdCBwY2lfZGV2KiBkZXYpCiB7Ci0Jc3RydWN0IHBjaV9idXMgKmJ1czsKLQlpbnQgcG9zLCB0ZW1wLCBzdGF0dXMgPSAtRUlOVkFMOworCWludCBwb3MsIHRlbXAsIHN0YXR1czsKIAl1MTYgY29udHJvbDsKIAotCWlmICghcGNpX21zaV9lbmFibGUgfHwgIWRldikKLSAJCXJldHVybiBzdGF0dXM7Ci0KLQlpZiAoZGV2LT5ub19tc2kpCi0JCXJldHVybiBzdGF0dXM7Ci0KLQlmb3IgKGJ1cyA9IGRldi0+YnVzOyBidXM7IGJ1cyA9IGJ1cy0+cGFyZW50KQotCQlpZiAoYnVzLT5idXNfZmxhZ3MgJiBQQ0lfQlVTX0ZMQUdTX05PX01TSSkKLQkJCXJldHVybiAtRUlOVkFMOworCWlmIChwY2lfbXNpX3N1cHBvcnRlZChkZXYpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAl0ZW1wID0gZGV2LT5pcnE7CiAKQEAgLTExMzQsMjIgKzExNDYsMTQgQEAKICAqKi8KIGludCBwY2lfZW5hYmxlX21zaXgoc3RydWN0IHBjaV9kZXYqIGRldiwgc3RydWN0IG1zaXhfZW50cnkgKmVudHJpZXMsIGludCBudmVjKQogewotCXN0cnVjdCBwY2lfYnVzICpidXM7CiAJaW50IHN0YXR1cywgcG9zLCBucl9lbnRyaWVzLCBmcmVlX3ZlY3RvcnM7CiAJaW50IGksIGosIHRlbXA7CiAJdTE2IGNvbnRyb2w7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICghcGNpX21zaV9lbmFibGUgfHwgIWRldiB8fCAhZW50cmllcykKKwlpZiAoIWVudHJpZXMgfHwgcGNpX21zaV9zdXBwb3J0ZWQoZGV2KSA8IDApCiAgCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChkZXYtPm5vX21zaSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmb3IgKGJ1cyA9IGRldi0+YnVzOyBidXM7IGJ1cyA9IGJ1cy0+cGFyZW50KQotCQlpZiAoYnVzLT5idXNfZmxhZ3MgJiBQQ0lfQlVTX0ZMQUdTX05PX01TSSkKLQkJCXJldHVybiAtRUlOVkFMOwotCiAJc3RhdHVzID0gbXNpX2luaXQoKTsKIAlpZiAoc3RhdHVzIDwgMCkKIAkJcmV0dXJuIHN0YXR1czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYyBiL2RyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwppbmRleCA0NzRlOWNkLi5iMWMwYzcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktZHJpdmVyLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLWRyaXZlci5jCkBAIC0xNyw2ICsxNywxNiBAQAogICogIFJlZ2lzdHJhdGlvbiBvZiBQQ0kgZHJpdmVycyBhbmQgaGFuZGxpbmcgb2YgaG90LXBsdWdnYWJsZSBkZXZpY2VzLgogICovCiAKKy8qIG11bHRpdGhyZWFkZWQgcHJvYmUgbG9naWMgKi8KK3N0YXRpYyBpbnQgcGNpX211bHRpdGhyZWFkX3Byb2JlID0KKyNpZmRlZiBDT05GSUdfUENJX01VTFRJVEhSRUFEX1BST0JFCisJMTsKKyNlbHNlCisJMDsKKyNlbmRpZgorX19tb2R1bGVfcGFyYW1fY2FsbCgiIiwgcGNpX211bHRpdGhyZWFkX3Byb2JlLCBwYXJhbV9zZXRfYm9vbCwgcGFyYW1fZ2V0X2Jvb2wsICZwY2lfbXVsdGl0aHJlYWRfcHJvYmUsIDA2NDQpOworCisKIC8qCiAgKiBEeW5hbWljIGRldmljZSBJRHMgYXJlIGRpc2FibGVkIGZvciAhQ09ORklHX0hPVFBMVUcKICAqLwpAQCAtNDYsNiArNTYsNyBAQAogCQlzdWJkZXZpY2U9UENJX0FOWV9JRCwgY2xhc3M9MCwgY2xhc3NfbWFzaz0wOwogCXVuc2lnbmVkIGxvbmcgZHJpdmVyX2RhdGE9MDsKIAlpbnQgZmllbGRzPTA7CisJaW50IHJldHZhbCA9IDA7CiAKIAlmaWVsZHMgPSBzc2NhbmYoYnVmLCAiJXggJXggJXggJXggJXggJXggJWx1eCIsCiAJCQkmdmVuZG9yLCAmZGV2aWNlLCAmc3VidmVuZG9yLCAmc3ViZGV2aWNlLApAQCAtNzIsMTAgKzgzLDEyIEBACiAJc3Bpbl91bmxvY2soJnBkcnYtPmR5bmlkcy5sb2NrKTsKIAogCWlmIChnZXRfZHJpdmVyKCZwZHJ2LT5kcml2ZXIpKSB7Ci0JCWRyaXZlcl9hdHRhY2goJnBkcnYtPmRyaXZlcik7CisJCXJldHZhbCA9IGRyaXZlcl9hdHRhY2goJnBkcnYtPmRyaXZlcik7CiAJCXB1dF9kcml2ZXIoJnBkcnYtPmRyaXZlcik7CiAJfQogCisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKIAlyZXR1cm4gY291bnQ7CiB9CiBzdGF0aWMgRFJJVkVSX0FUVFIobmV3X2lkLCBTX0lXVVNSLCBOVUxMLCBzdG9yZV9uZXdfaWQpOwpAQCAtMjc5LDYgKzI5MiwxOCBAQAogCXJldHVybiBpOwogfQogCitzdGF0aWMgaW50IHBjaV9kZXZpY2Vfc3VzcGVuZF9sYXRlKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IHBjaV9kcml2ZXIgKiBkcnYgPSBwY2lfZGV2LT5kcml2ZXI7CisJaW50IGkgPSAwOworCisJaWYgKGRydiAmJiBkcnYtPnN1c3BlbmRfbGF0ZSkgeworCQlpID0gZHJ2LT5zdXNwZW5kX2xhdGUocGNpX2Rldiwgc3RhdGUpOworCQlzdXNwZW5kX3JlcG9ydF9yZXN1bHQoZHJ2LT5zdXNwZW5kX2xhdGUsIGkpOworCX0KKwlyZXR1cm4gaTsKK30KIAogLyoKICAqIERlZmF1bHQgcmVzdW1lIG1ldGhvZCBmb3IgZGV2aWNlcyB0aGF0IGhhdmUgbm8gZHJpdmVyIHByb3ZpZGVkIHJlc3VtZSwKQEAgLTMxMyw2ICszMzgsMTcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKK3N0YXRpYyBpbnQgcGNpX2RldmljZV9yZXN1bWVfZWFybHkoc3RydWN0IGRldmljZSAqIGRldikKK3sKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBwY2lfZGV2ICogcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3QgcGNpX2RyaXZlciAqIGRydiA9IHBjaV9kZXYtPmRyaXZlcjsKKworCWlmIChkcnYgJiYgZHJ2LT5yZXN1bWVfZWFybHkpCisJCWVycm9yID0gZHJ2LT5yZXN1bWVfZWFybHkocGNpX2Rldik7CisJcmV0dXJuIGVycm9yOworfQorCiBzdGF0aWMgdm9pZCBwY2lfZGV2aWNlX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKQEAgLTM4Niw2ICs0MjIsMTEgQEAKIAlkcnYtPmRyaXZlci5vd25lciA9IG93bmVyOwogCWRydi0+ZHJpdmVyLmtvYmoua3R5cGUgPSAmcGNpX2RyaXZlcl9rb2JqX3R5cGU7CiAKKwlpZiAocGNpX211bHRpdGhyZWFkX3Byb2JlKQorCQlkcnYtPmRyaXZlci5tdWx0aXRocmVhZF9wcm9iZSA9IHBjaV9tdWx0aXRocmVhZF9wcm9iZTsKKwllbHNlCisJCWRydi0+ZHJpdmVyLm11bHRpdGhyZWFkX3Byb2JlID0gZHJ2LT5tdWx0aXRocmVhZF9wcm9iZTsKKwogCXNwaW5fbG9ja19pbml0KCZkcnYtPmR5bmlkcy5sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmZHJ2LT5keW5pZHMubGlzdCk7CiAKQEAgLTUwOSw4ICs1NTAsMTAgQEAKIAkucHJvYmUJCT0gcGNpX2RldmljZV9wcm9iZSwKIAkucmVtb3ZlCQk9IHBjaV9kZXZpY2VfcmVtb3ZlLAogCS5zdXNwZW5kCT0gcGNpX2RldmljZV9zdXNwZW5kLAotCS5zaHV0ZG93bgk9IHBjaV9kZXZpY2Vfc2h1dGRvd24sCisJLnN1c3BlbmRfbGF0ZQk9IHBjaV9kZXZpY2Vfc3VzcGVuZF9sYXRlLAorCS5yZXN1bWVfZWFybHkJPSBwY2lfZGV2aWNlX3Jlc3VtZV9lYXJseSwKIAkucmVzdW1lCQk9IHBjaV9kZXZpY2VfcmVzdW1lLAorCS5zaHV0ZG93bgk9IHBjaV9kZXZpY2Vfc2h1dGRvd24sCiAJLmRldl9hdHRycwk9IHBjaV9kZXZfYXR0cnMsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktc3lzZnMuYyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCmluZGV4IGZkZWZhN2QuLmExZDJlOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jCkBAIC0xMTcsNiArMTE3LDcgQEAKIAkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJaW50IHJldHZhbCA9IDA7CiAKIAkvKiB0aGlzIGNhbiBjcmFzaCB0aGUgbWFjaGluZSB3aGVuIGRvbmUgb24gdGhlICJ3cm9uZyIgZGV2aWNlICovCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQpAQCAtMTI2LDExICsxMjcsNTMgQEAKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCiAJaWYgKCpidWYgPT0gJzEnKQotCQlwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwkJcmV0dmFsID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOwogCXJldHVybiBjb3VudDsKIH0KIAorc3RhdGljIHNzaXplX3QKK21zaV9idXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisKKwlpZiAoIXBkZXYtPnN1Ym9yZGluYXRlKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBzcHJpbnRmIChidWYsICIldVxuIiwKKwkJCSEocGRldi0+c3Vib3JkaW5hdGUtPmJ1c19mbGFncyAmIFBDSV9CVVNfRkxBR1NfTk9fTVNJKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cittc2lfYnVzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisKKwkvKiBiYWQgdGhpbmdzIG1heSBoYXBwZW4gaWYgdGhlIG5vX21zaSBmbGFnIGlzIGNoYW5nZWQKKwkgKiB3aGlsZSBzb21lIGRyaXZlcnMgYXJlIGxvYWRlZCAqLworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIGNvdW50OworCisJaWYgKCFwZGV2LT5zdWJvcmRpbmF0ZSkKKwkJcmV0dXJuIGNvdW50OworCisJaWYgKCpidWYgPT0gJzAnKSB7CisJCXBkZXYtPnN1Ym9yZGluYXRlLT5idXNfZmxhZ3MgfD0gUENJX0JVU19GTEFHU19OT19NU0k7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJmb3JjZWQgc3Vib3JkaW5hdGUgYnVzIHRvIG5vdCBzdXBwb3J0IE1TSSwiCisJCQkgIiBiYWQgdGhpbmdzIGNvdWxkIGhhcHBlbi5cbiIpOworCX0KKworCWlmICgqYnVmID09ICcxJykgeworCQlwZGV2LT5zdWJvcmRpbmF0ZS0+YnVzX2ZsYWdzICY9IH5QQ0lfQlVTX0ZMQUdTX05PX01TSTsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImZvcmNlZCBzdWJvcmRpbmF0ZSBidXMgdG8gc3VwcG9ydCBNU0ksIgorCQkJICIgYmFkIHRoaW5ncyBjb3VsZCBoYXBwZW4uXG4iKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CiAKIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHBjaV9kZXZfYXR0cnNbXSA9IHsKIAlfX0FUVFJfUk8ocmVzb3VyY2UpLApAQCAtMTQ1LDYgKzE4OCw3IEBACiAJX19BVFRSKGVuYWJsZSwgMDYwMCwgaXNfZW5hYmxlZF9zaG93LCBpc19lbmFibGVkX3N0b3JlKSwKIAlfX0FUVFIoYnJva2VuX3Bhcml0eV9zdGF0dXMsKFNfSVJVR098U19JV1VTUiksCiAJCWJyb2tlbl9wYXJpdHlfc3RhdHVzX3Nob3csYnJva2VuX3Bhcml0eV9zdGF0dXNfc3RvcmUpLAorCV9fQVRUUihtc2lfYnVzLCAwNjQ0LCBtc2lfYnVzX3Nob3csIG1zaV9idXNfc3RvcmUpLAogCV9fQVRUUl9OVUxMLAogfTsKIApAQCAtMzg1LDE1ICs0MjksMzggQEAKIH0KIAogLyoqCisgKiBwY2lfcmVtb3ZlX3Jlc291cmNlX2ZpbGVzIC0gY2xlYW51cCByZXNvdXJjZSBmaWxlcworICogQGRldjogZGV2IHRvIGNsZWFudXAKKyAqCisgKiBJZiB3ZSBjcmVhdGVkIHJlc291cmNlIGZpbGVzIGZvciBAZGV2LCByZW1vdmUgdGhlbSBmcm9tIHN5c2ZzIGFuZAorICogZnJlZSB0aGVpciByZXNvdXJjZXMuCisgKi8KK3N0YXRpYyB2b2lkCitwY2lfcmVtb3ZlX3Jlc291cmNlX2ZpbGVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgeworCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqcmVzX2F0dHI7CisKKwkJcmVzX2F0dHIgPSBwZGV2LT5yZXNfYXR0cltpXTsKKwkJaWYgKHJlc19hdHRyKSB7CisJCQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCByZXNfYXR0cik7CisJCQlrZnJlZShyZXNfYXR0cik7CisJCX0KKwl9Cit9CisKKy8qKgogICogcGNpX2NyZWF0ZV9yZXNvdXJjZV9maWxlcyAtIGNyZWF0ZSByZXNvdXJjZSBmaWxlcyBpbiBzeXNmcyBmb3IgQGRldgogICogQGRldjogZGV2IGluIHF1ZXN0aW9uCiAgKgogICogV2FsayB0aGUgcmVzb3VyY2VzIGluIEBkZXYgY3JlYXRpbmcgZmlsZXMgZm9yIGVhY2ggcmVzb3VyY2UgYXZhaWxhYmxlLgogICovCi1zdGF0aWMgdm9pZAotcGNpX2NyZWF0ZV9yZXNvdXJjZV9maWxlcyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyBpbnQgcGNpX2NyZWF0ZV9yZXNvdXJjZV9maWxlcyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlpbnQgaTsKKwlpbnQgcmV0dmFsOwogCiAJLyogRXhwb3NlIHRoZSBQQ0kgcmVzb3VyY2VzIGZyb20gdGhpcyBkZXZpY2UgYXMgZmlsZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgUENJX1JPTV9SRVNPVVJDRTsgaSsrKSB7CkBAIC00MTYsMzUgKzQ4MywxOSBAQAogCQkJcmVzX2F0dHItPnNpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGkpOwogCQkJcmVzX2F0dHItPm1tYXAgPSBwY2lfbW1hcF9yZXNvdXJjZTsKIAkJCXJlc19hdHRyLT5wcml2YXRlID0gJnBkZXYtPnJlc291cmNlW2ldOwotCQkJc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgcmVzX2F0dHIpOworCQkJcmV0dmFsID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgcmVzX2F0dHIpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXBjaV9yZW1vdmVfcmVzb3VyY2VfZmlsZXMocGRldik7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfQotfQotCi0vKioKLSAqIHBjaV9yZW1vdmVfcmVzb3VyY2VfZmlsZXMgLSBjbGVhbnVwIHJlc291cmNlIGZpbGVzCi0gKiBAZGV2OiBkZXYgdG8gY2xlYW51cAotICoKLSAqIElmIHdlIGNyZWF0ZWQgcmVzb3VyY2UgZmlsZXMgZm9yIEBkZXYsIHJlbW92ZSB0aGVtIGZyb20gc3lzZnMgYW5kCi0gKiBmcmVlIHRoZWlyIHJlc291cmNlcy4KLSAqLwotc3RhdGljIHZvaWQKLXBjaV9yZW1vdmVfcmVzb3VyY2VfZmlsZXMoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUENJX1JPTV9SRVNPVVJDRTsgaSsrKSB7Ci0JCXN0cnVjdCBiaW5fYXR0cmlidXRlICpyZXNfYXR0cjsKLQotCQlyZXNfYXR0ciA9IHBkZXYtPnJlc19hdHRyW2ldOwotCQlpZiAocmVzX2F0dHIpIHsKLQkJCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosIHJlc19hdHRyKTsKLQkJCWtmcmVlKHJlc19hdHRyKTsKLQkJfQotCX0KKwlyZXR1cm4gMDsKIH0KICNlbHNlIC8qICFIQVZFX1BDSV9NTUFQICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcGNpX2NyZWF0ZV9yZXNvdXJjZV9maWxlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IHJldHVybjsgfQorc3RhdGljIGlubGluZSBpbnQgcGNpX2NyZWF0ZV9yZXNvdXJjZV9maWxlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX3JlbW92ZV9yZXNvdXJjZV9maWxlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7IHJldHVybjsgfQogI2VuZGlmIC8qIEhBVkVfUENJX01NQVAgKi8KIApAQCAtNTI5LDIyICs1ODAsMjcgQEAKIAkud3JpdGUgPSBwY2lfd3JpdGVfY29uZmlnLAogfTsKIAotaW50IHBjaV9jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK2ludCBfX211c3RfY2hlY2sgcGNpX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXMgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogeworCXN0cnVjdCBiaW5fYXR0cmlidXRlICpyb21fYXR0ciA9IE5VTEw7CisJaW50IHJldHZhbDsKKwogCWlmICghc3lzZnNfaW5pdGlhbGl6ZWQpCiAJCXJldHVybiAtRUFDQ0VTOwogCiAJaWYgKHBkZXYtPmNmZ19zaXplIDwgNDA5NikKLQkJc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJnBjaV9jb25maWdfYXR0cik7CisJCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZwY2lfY29uZmlnX2F0dHIpOwogCWVsc2UKLQkJc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJnBjaWVfY29uZmlnX2F0dHIpOworCQlyZXR2YWwgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmcGNpZV9jb25maWdfYXR0cik7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnI7CiAKLQlwY2lfY3JlYXRlX3Jlc291cmNlX2ZpbGVzKHBkZXYpOworCXJldHZhbCA9IHBjaV9jcmVhdGVfcmVzb3VyY2VfZmlsZXMocGRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJfYmluX2ZpbGU7CiAKIAkvKiBJZiB0aGUgZGV2aWNlIGhhcyBhIFJPTSwgdHJ5IHRvIGV4cG9zZSBpdCBpbiBzeXNmcy4gKi8KIAlpZiAocGNpX3Jlc291cmNlX2xlbihwZGV2LCBQQ0lfUk9NX1JFU09VUkNFKSkgewotCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqcm9tX2F0dHI7Ci0JCQogCQlyb21fYXR0ciA9IGt6YWxsb2Moc2l6ZW9mKCpyb21fYXR0ciksIEdGUF9BVE9NSUMpOwogCQlpZiAocm9tX2F0dHIpIHsKIAkJCXBkZXYtPnJvbV9hdHRyID0gcm9tX2F0dHI7CkBAIC01NTQsMTMgKzYxMCwyOCBAQAogCQkJcm9tX2F0dHItPmF0dHIub3duZXIgPSBUSElTX01PRFVMRTsKIAkJCXJvbV9hdHRyLT5yZWFkID0gcGNpX3JlYWRfcm9tOwogCQkJcm9tX2F0dHItPndyaXRlID0gcGNpX3dyaXRlX3JvbTsKLQkJCXN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosIHJvbV9hdHRyKTsKKwkJCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosIHJvbV9hdHRyKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBlcnJfcm9tOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX2Jpbl9maWxlOwogCQl9CiAJfQogCS8qIGFkZCBwbGF0Zm9ybS1zcGVjaWZpYyBhdHRyaWJ1dGVzICovCiAJcGNpYmlvc19hZGRfcGxhdGZvcm1fZW50cmllcyhwZGV2KTsKLQkKKwogCXJldHVybiAwOworCitlcnJfcm9tOgorCWtmcmVlKHJvbV9hdHRyKTsKK2Vycl9iaW5fZmlsZToKKwlpZiAocGRldi0+Y2ZnX3NpemUgPCA0MDk2KQorCQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmcGNpX2NvbmZpZ19hdHRyKTsKKwllbHNlCisJCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmcGRldi0+ZGV2LmtvYmosICZwY2llX2NvbmZpZ19hdHRyKTsKK2VycjoKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKioKQEAgLTU4OSwxMCArNjYwLDE0IEBACiBzdGF0aWMgaW50IF9faW5pdCBwY2lfc3lzZnNfaW5pdCh2b2lkKQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKLQkKKwlpbnQgcmV0dmFsOworCiAJc3lzZnNfaW5pdGlhbGl6ZWQgPSAxOwotCWZvcl9lYWNoX3BjaV9kZXYocGRldikKLQkJcGNpX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXMocGRldik7CisJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7CisJCXJldHZhbCA9IHBjaV9jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzKHBkZXYpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5jIGIvZHJpdmVycy9wY2kvcGNpLmMKaW5kZXggOWY3OWRkNi4uYTU0NDk5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLmMKQEAgLTQzMiwxMCArNDMyLDEyIEBACiAJY2FzZSBQTV9FVkVOVF9PTjoKIAkJcmV0dXJuIFBDSV9EMDsKIAljYXNlIFBNX0VWRU5UX0ZSRUVaRToKKwljYXNlIFBNX0VWRU5UX1BSRVRIQVc6CisJCS8qIFJFVklTSVQgYm90aCBmcmVlemUgYW5kIHByZS10aGF3ICJzaG91bGQiIHVzZSBEMCAqLwogCWNhc2UgUE1fRVZFTlRfU1VTUEVORDoKIAkJcmV0dXJuIFBDSV9EM2hvdDsKIAlkZWZhdWx0OgotCQlwcmludGsoIlRoZXkgYXNrZWQgbWUgZm9yIHN0YXRlICVkXG4iLCBzdGF0ZS5ldmVudCk7CisJCXByaW50aygiVW5yZWNvZ25pemVkIHN1c3BlbmQgZXZlbnQgJWRcbiIsIHN0YXRlLmV2ZW50KTsKIAkJQlVHKCk7CiAJfQogCXJldHVybiBQQ0lfRDA7CkBAIC00NDMsNiArNDQ1LDUxIEBACiAKIEVYUE9SVF9TWU1CT0wocGNpX2Nob29zZV9zdGF0ZSk7CiAKK3N0YXRpYyBpbnQgcGNpX3NhdmVfcGNpZV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBwb3MsIGkgPSAwOworCXN0cnVjdCBwY2lfY2FwX3NhdmVkX3N0YXRlICpzYXZlX3N0YXRlOworCXUxNiAqY2FwOworCisJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlpZiAocG9zIDw9IDApCisJCXJldHVybiAwOworCisJc2F2ZV9zdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKCpzYXZlX3N0YXRlKSArIHNpemVvZih1MTYpICogNCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYXZlX3N0YXRlKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiT3V0IG9mIG1lbW9yeSBpbiBwY2lfc2F2ZV9wY2llX3N0YXRlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNhcCA9ICh1MTYgKikmc2F2ZV9zdGF0ZS0+ZGF0YVswXTsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9ERVZDVEwsICZjYXBbaSsrXSk7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfRVhQX0xOS0NUTCwgJmNhcFtpKytdKTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9FWFBfU0xUQ1RMLCAmY2FwW2krK10pOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9SVENUTCwgJmNhcFtpKytdKTsKKwlwY2lfYWRkX3NhdmVkX2NhcChkZXYsIHNhdmVfc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwY2lfcmVzdG9yZV9wY2llX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IGkgPSAwLCBwb3M7CisJc3RydWN0IHBjaV9jYXBfc2F2ZWRfc3RhdGUgKnNhdmVfc3RhdGU7CisJdTE2ICpjYXA7CisKKwlzYXZlX3N0YXRlID0gcGNpX2ZpbmRfc2F2ZWRfY2FwKGRldiwgUENJX0NBUF9JRF9FWFApOworCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJaWYgKCFzYXZlX3N0YXRlIHx8IHBvcyA8PSAwKQorCQlyZXR1cm47CisJY2FwID0gKHUxNiAqKSZzYXZlX3N0YXRlLT5kYXRhWzBdOworCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9ERVZDVEwsIGNhcFtpKytdKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBwb3MgKyBQQ0lfRVhQX0xOS0NUTCwgY2FwW2krK10pOworCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIHBvcyArIFBDSV9FWFBfU0xUQ1RMLCBjYXBbaSsrXSk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9SVENUTCwgY2FwW2krK10pOworCXBjaV9yZW1vdmVfc2F2ZWRfY2FwKHNhdmVfc3RhdGUpOworCWtmcmVlKHNhdmVfc3RhdGUpOworfQorCiAvKioKICAqIHBjaV9zYXZlX3N0YXRlIC0gc2F2ZSB0aGUgUENJIGNvbmZpZ3VyYXRpb24gc3BhY2Ugb2YgYSBkZXZpY2UgYmVmb3JlIHN1c3BlbmRpbmcKICAqIEBkZXY6IC0gUENJIGRldmljZSB0aGF0IHdlJ3JlIGRlYWxpbmcgd2l0aApAQCAtNDU4LDYgKzUwNSw4IEBACiAJCXJldHVybiBpOwogCWlmICgoaSA9IHBjaV9zYXZlX21zaXhfc3RhdGUoZGV2KSkgIT0gMCkKIAkJcmV0dXJuIGk7CisJaWYgKChpID0gcGNpX3NhdmVfcGNpZV9zdGF0ZShkZXYpKSAhPSAwKQorCQlyZXR1cm4gaTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDcxLDYgKzUyMCw5IEBACiAJaW50IGk7CiAJaW50IHZhbDsKIAorCS8qIFBDSSBFeHByZXNzIHJlZ2lzdGVyIG11c3QgYmUgcmVzdG9yZWQgZmlyc3QgKi8KKwlwY2lfcmVzdG9yZV9wY2llX3N0YXRlKGRldik7CisKIAkvKgogCSAqIFRoZSBCYXNlIEFkZHJlc3MgcmVnaXN0ZXIgc2hvdWxkIGJlIHByb2dyYW1tZWQgYmVmb3JlIHRoZSBjb21tYW5kCiAJICogcmVnaXN0ZXIocykKQEAgLTk1MywxMyArMTAwNSwxMiBAQAogCQl9CiAJCXN0ciA9IGs7CiAJfQotCXJldHVybiAxOworCXJldHVybiAwOwogfQorZWFybHlfcGFyYW0oInBjaSIsIHBjaV9zZXR1cCk7CiAKIGRldmljZV9pbml0Y2FsbChwY2lfaW5pdCk7CiAKLV9fc2V0dXAoInBjaT0iLCBwY2lfc2V0dXApOwotCiAjaWYgZGVmaW5lZChDT05GSUdfSVNBKSB8fCBkZWZpbmVkKENPTkZJR19FSVNBKQogLyogRklYTUU6IFNvbWUgYm94ZXMgaGF2ZSBtdWx0aXBsZSBJU0EgYnJpZGdlcyEgKi8KIHN0cnVjdCBwY2lfZGV2ICppc2FfYnJpZGdlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmggYi9kcml2ZXJzL3BjaS9wY2kuaAppbmRleCAwOGQ1OGZjLi42YmYzMjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuaAorKysgYi9kcml2ZXJzL3BjaS9wY2kuaApAQCAtNDIsNyArNDIsNyBAQAogLyogTG9jayBmb3IgcmVhZC93cml0ZSBhY2Nlc3MgdG8gcGNpIGRldmljZSBhbmQgYnVzIGxpc3RzICovCiBleHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSBwY2lfYnVzX3NlbTsKIAotI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworI2lmZGVmIENPTkZJR19QQ0lfTVNJCiBleHRlcm4gaW50IHBjaV9tc2lfcXVpcms7CiAjZWxzZQogI2RlZmluZSBwY2lfbXNpX3F1aXJrIDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvS2NvbmZpZyBiL2RyaXZlcnMvcGNpL3BjaWUvS2NvbmZpZwppbmRleCAxMDEyZGI4Li4wYWQ5MmE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL0tjb25maWcKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9LY29uZmlnCkBAIC0zNCwzICszNCw0IEBACiAJICAgCiAJICBXaGVuIGluIGRvdWJ0LCBzYXkgTi4KIAorc291cmNlICJkcml2ZXJzL3BjaS9wY2llL2Flci9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9NYWtlZmlsZSBiL2RyaXZlcnMvcGNpL3BjaWUvTWFrZWZpbGUKaW5kZXggOTg0ZmE4Ny4uZTAwZmI5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BjaS9wY2llL01ha2VmaWxlCkBAIC01LDMgKzUsNiBAQAogcGNpZXBvcnRkcnYteQkJCTo9IHBvcnRkcnZfY29yZS5vIHBvcnRkcnZfcGNpLm8gcG9ydGRydl9idXMubwogCiBvYmotJChDT05GSUdfUENJRVBPUlRCVVMpCSs9IHBjaWVwb3J0ZHJ2Lm8KKworIyBCdWlsZCBQQ0kgRXhwcmVzcyBBRVIgaWYgbmVlZGVkCitvYmotJChDT05GSUdfUENJRUFFUikJCSs9IGFlci8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL0tjb25maWcgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMzdhNjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9LY29uZmlnCkBAIC0wLDAgKzEsMTIgQEAKKyMKKyMgUENJIEV4cHJlc3MgUm9vdCBQb3J0IERldmljZSBBRVIgQ29uZmlndXJhdGlvbgorIworCitjb25maWcgUENJRUFFUgorCWJvb2xlYW4gIlJvb3QgUG9ydCBBZHZhbmNlZCBFcnJvciBSZXBvcnRpbmcgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSUVQT1JUQlVTICYmIEFDUEkKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgUENJIEV4cHJlc3MgUm9vdCBQb3J0IEFkdmFuY2VkIEVycm9yIFJlcG9ydGluZworCSAgKEFFUikgZHJpdmVyIHN1cHBvcnQuIEVycm9yIHJlcG9ydGluZyBtZXNzYWdlcyBzZW50IHRvIFJvb3QKKwkgIFBvcnQgd2lsbCBiZSBoYW5kbGVkIGJ5IFBDSSBFeHByZXNzIEFFUiBkcml2ZXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2Flci9NYWtlZmlsZSBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTRmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFBDSS1FeHByZXNzIFJvb3QgUG9ydCBBZHZhbmNlZCBFcnJvciBSZXBvcnRpbmcgRHJpdmVyCisjCisKK29iai0kKENPTkZJR19QQ0lFQUVSKSArPSBhZXJkcml2ZXIubworCithZXJkcml2ZXItb2JqcyA6PSBhZXJkcnZfZXJycHJpbnQubyBhZXJkcnZfY29yZS5vIGFlcmRydi5vIGFlcmRydl9hY3BpLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2LmMgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDRhYzAyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2LmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiBkcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuYworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBBRVIgcm9vdCBwb3J0IHNlcnZpY2UgZHJpdmVyLiBUaGUgZHJpdmVyIHdpbGwKKyAqIHJlZ2lzdGVyIGFuIGlycSBoYW5kbGVyLiBXaGVuIHJvb3QgcG9ydCB0cmlnZ2VycyBhbiBBRVIgaW50ZXJydXB0LCB0aGUgaXJxCisgKiBoYW5kbGVyIHdpbGwgY29sbGVjdCByb290IHBvcnQgc3RhdHVzIGFuZCBzY2hlZHVsZSBhIHdvcmsuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEludGVsIENvcnAuCisgKglUb20gTG9uZyBOZ3V5ZW4gKHRvbS5sLm5ndXllbkBpbnRlbC5jb20pCisgKglaaGFuZyBZYW5taW4gKHlhbm1pbi56aGFuZ0BpbnRlbC5jb20pCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpZXBvcnRfaWYuaD4KKworI2luY2x1ZGUgImFlcmRydi5oIgorCisvKgorICogVmVyc2lvbiBJbmZvcm1hdGlvbgorICovCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MS4wIgorI2RlZmluZSBEUklWRVJfQVVUSE9SICJ0b20ubC5uZ3V5ZW5AaW50ZWwuY29tIgorI2RlZmluZSBEUklWRVJfREVTQyAiUm9vdCBQb3J0IEFkdmFuY2VkIEVycm9yIFJlcG9ydGluZyBEcml2ZXIiCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWVyX3Byb2JlIChzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldiwKKwljb25zdCBzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfaWQgKmlkICk7CitzdGF0aWMgdm9pZCBhZXJfcmVtb3ZlKHN0cnVjdCBwY2llX2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgYWVyX3N1c3BlbmQoc3RydWN0IHBjaWVfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3tyZXR1cm4gMDt9CitzdGF0aWMgaW50IGFlcl9yZXN1bWUoc3RydWN0IHBjaWVfZGV2aWNlICpkZXYpIHtyZXR1cm4gMDt9CitzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBhZXJfZXJyb3JfZGV0ZWN0ZWQoc3RydWN0IHBjaV9kZXYgKmRldiwKKwllbnVtIHBjaV9jaGFubmVsX3N0YXRlIGVycm9yKTsKK3N0YXRpYyB2b2lkIGFlcl9lcnJvcl9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKmRldik7CitzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBhZXJfcm9vdF9yZXNldChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKKworLyoKKyAqIFBDSSBFeHByZXNzIGJ1cydzIEFFUiBSb290IHNlcnZpY2UgZHJpdmVyIGRhdGEgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfaWQgYWVyX2lkW10gPSB7CisJeworCS52ZW5kb3IgCT0gUENJX0FOWV9JRCwKKwkuZGV2aWNlIAk9IFBDSV9BTllfSUQsCisJLnBvcnRfdHlwZSAJPSBQQ0lFX1JDX1BPUlQsCisJLnNlcnZpY2VfdHlwZSAJPSBQQ0lFX1BPUlRfU0VSVklDRV9BRVIsCisJfSwKKwl7IC8qIGVuZDogYWxsIHplcm9lcyAqLyB9Cit9OworCitzdGF0aWMgc3RydWN0IHBjaV9lcnJvcl9oYW5kbGVycyBhZXJfZXJyb3JfaGFuZGxlcnMgPSB7CisJLmVycm9yX2RldGVjdGVkID0gYWVyX2Vycm9yX2RldGVjdGVkLAorCS5yZXN1bWUgPSBhZXJfZXJyb3JfcmVzdW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9kcml2ZXIgYWVyZHJ2ID0geworCS5uYW1lCQk9ICJhZXIiLAorCS5pZF90YWJsZQk9ICZhZXJfaWRbMF0sCisKKwkucHJvYmUJCT0gYWVyX3Byb2JlLAorCS5yZW1vdmUJCT0gYWVyX3JlbW92ZSwKKworCS5zdXNwZW5kCT0gYWVyX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBhZXJfcmVzdW1lLAorCisJLmVycl9oYW5kbGVyCT0gJmFlcl9lcnJvcl9oYW5kbGVycywKKworCS5yZXNldF9saW5rCT0gYWVyX3Jvb3RfcmVzZXQsCit9OworCisvKioKKyAqIGFlcl9pcnEgLSBSb290IFBvcnQncyBJU1IKKyAqIEBpcnE6IElSUSBhc3NpZ25lZCB0byBSb290IFBvcnQKKyAqIEBjb250ZXh0OiBwb2ludGVyIHRvIFJvb3QgUG9ydCBkYXRhIHN0cnVjdHVyZQorICogQHI6IHBvaW50ZXIgc3RydWN0IHB0X3JlZ3MKKyAqCisgKiBJbnZva2VkIHdoZW4gUm9vdCBQb3J0IGRldGVjdHMgQUVSIG1lc3NhZ2VzLgorICoqLworc3RhdGljIGlycXJldHVybl90IGFlcl9pcnEoaW50IGlycSwgdm9pZCAqY29udGV4dCwgc3RydWN0IHB0X3JlZ3MgKiByKQoreworCXVuc2lnbmVkIGludCBzdGF0dXMsIGlkOworCXN0cnVjdCBwY2llX2RldmljZSAqcGRldiA9IChzdHJ1Y3QgcGNpZV9kZXZpY2UgKiljb250ZXh0OworCXN0cnVjdCBhZXJfcnBjICpycGMgPSBnZXRfc2VydmljZV9kYXRhKHBkZXYpOworCWludCBuZXh0X3Byb2RfaWR4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHBvczsKKworCXBvcyA9IHBjaV9maW5kX2Flcl9jYXBhYmlsaXR5KHBkZXYtPnBvcnQpOworCS8qCisJICogTXVzdCBsb2NrIGFjY2VzcyB0byBSb290IEVycm9yIFN0YXR1cyBSZWcsIFJvb3QgRXJyb3IgSUQgUmVnLAorCSAqIGFuZCBSb290IGVycm9yIHByb2R1Y2VyL2NvbnN1bWVyIGluZGV4CisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJwYy0+ZV9sb2NrLCBmbGFncyk7CisKKwkvKiBSZWFkIGVycm9yIHN0YXR1cyAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LT5wb3J0LCBwb3MgKyBQQ0lfRVJSX1JPT1RfU1RBVFVTLCAmc3RhdHVzKTsKKwlpZiAoIShzdGF0dXMgJiBST09UX0VSUl9TVEFUVVNfTUFTS1MpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwYy0+ZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwkvKiBSZWFkIGVycm9yIHNvdXJjZSBhbmQgY2xlYXIgZXJyb3Igc3RhdHVzICovCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYtPnBvcnQsIHBvcyArIFBDSV9FUlJfUk9PVF9DT1JfU1JDLCAmaWQpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldi0+cG9ydCwgcG9zICsgUENJX0VSUl9ST09UX1NUQVRVUywgc3RhdHVzKTsKKworCS8qIFN0b3JlIGVycm9yIHNvdXJjZSBmb3IgbGF0ZXIgRFBDIGhhbmRsZXIgKi8KKwluZXh0X3Byb2RfaWR4ID0gcnBjLT5wcm9kX2lkeCArIDE7CisJaWYgKG5leHRfcHJvZF9pZHggPT0gQUVSX0VSUk9SX1NPVVJDRVNfTUFYKQorCQluZXh0X3Byb2RfaWR4ID0gMDsKKwlpZiAobmV4dF9wcm9kX2lkeCA9PSBycGMtPmNvbnNfaWR4KSB7CisJCS8qCisJCSAqIEVycm9yIFN0b3JtIENvbmRpdGlvbiAtIHBvc3NpYmx5IHRoZSBzYW1lIGVycm9yIG9jY3VycmVkLgorCQkgKiBEcm9wIHRoZSBlcnJvci4KKwkJICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwYy0+ZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJcnBjLT5lX3NvdXJjZXNbcnBjLT5wcm9kX2lkeF0uc3RhdHVzID0gIHN0YXR1czsKKwlycGMtPmVfc291cmNlc1tycGMtPnByb2RfaWR4XS5pZCA9IGlkOworCXJwYy0+cHJvZF9pZHggPSBuZXh0X3Byb2RfaWR4OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwYy0+ZV9sb2NrLCBmbGFncyk7CisKKwkvKiAgSW52b2tlIERQQyBoYW5kbGVyICovCisJc2NoZWR1bGVfd29yaygmcnBjLT5kcGNfaGFuZGxlcik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogYWVyX2FsbG9jX3JwYyAtIGFsbG9jYXRlIFJvb3QgUG9ydCBkYXRhIHN0cnVjdHVyZQorICogQGRldjogcG9pbnRlciB0byB0aGUgcGNpZV9kZXYgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBJbnZva2VkIHdoZW4gUm9vdCBQb3J0J3MgQUVSIHNlcnZpY2UgaXMgbG9hZGVkLgorICoqLworc3RhdGljIHN0cnVjdCBhZXJfcnBjKiBhZXJfYWxsb2NfcnBjKHN0cnVjdCBwY2llX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhZXJfcnBjICpycGM7CisKKwlpZiAoIShycGMgPSAoc3RydWN0IGFlcl9ycGMgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWVyX3JwYyksCisJCUdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQocnBjLCAwLCBzaXplb2Yoc3RydWN0IGFlcl9ycGMpKTsKKwkvKgorCSAqIEluaXRpYWxpemUgUm9vdCBsb2NrIGFjY2VzcywgZV9sb2NrLCB0byBSb290IEVycm9yIFN0YXR1cyBSZWcsCisJICogUm9vdCBFcnJvciBJRCBSZWcsIGFuZCBSb290IGVycm9yIHByb2R1Y2VyL2NvbnN1bWVyIGluZGV4LgorCSAqLworCXJwYy0+ZV9sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOworCisJcnBjLT5ycGQgPSBkZXY7CisJSU5JVF9XT1JLKCZycGMtPmRwY19oYW5kbGVyLCBhZXJfaXNyLCAodm9pZCAqKWRldik7CisJcnBjLT5wcm9kX2lkeCA9IHJwYy0+Y29uc19pZHggPSAwOworCW11dGV4X2luaXQoJnJwYy0+cnBjX211dGV4KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZycGMtPndhaXRfcmVsZWFzZSk7CisKKwkvKiBVc2UgUENJRSBidXMgZnVuY3Rpb24gdG8gc3RvcmUgcnBjIGludG8gUENJRSBkZXZpY2UgKi8KKwlzZXRfc2VydmljZV9kYXRhKGRldiwgcnBjKTsKKworCXJldHVybiBycGM7Cit9CisKKy8qKgorICogYWVyX3JlbW92ZSAtIGNsZWFuIHVwIHJlc291cmNlcworICogQGRldjogcG9pbnRlciB0byB0aGUgcGNpZV9kZXYgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBJbnZva2VkIHdoZW4gUENJIEV4cHJlc3MgYnVzIHVubG9hZHMgb3IgQUVSIHByb2JlIGZhaWxzLgorICoqLworc3RhdGljIHZvaWQgYWVyX3JlbW92ZShzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgYWVyX3JwYyAqcnBjID0gZ2V0X3NlcnZpY2VfZGF0YShkZXYpOworCisJaWYgKHJwYykgeworCQkvKiBJZiByZWdpc3RlciBpbnRlcnJ1cHQgc2VydmljZSwgaXQgbXVzdCBiZSBmcmVlLiAqLworCQlpZiAocnBjLT5pc3IpCisJCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKworCQl3YWl0X2V2ZW50KHJwYy0+d2FpdF9yZWxlYXNlLCBycGMtPnByb2RfaWR4ID09IHJwYy0+Y29uc19pZHgpOworCisJCWFlcl9kZWxldGVfcm9vdHBvcnQocnBjKTsKKwkJc2V0X3NlcnZpY2VfZGF0YShkZXYsIE5VTEwpOworCX0KK30KKworLyoqCisgKiBhZXJfcHJvYmUgLSBpbml0aWFsaXplIHJlc291cmNlcworICogQGRldjogcG9pbnRlciB0byB0aGUgcGNpZV9kZXYgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBpZDogcG9pbnRlciB0byB0aGUgc2VydmljZSBpZCBkYXRhIHN0cnVjdHVyZQorICoKKyAqIEludm9rZWQgd2hlbiBQQ0kgRXhwcmVzcyBidXMgbG9hZHMgQUVSIHNlcnZpY2UgZHJpdmVyLgorICoqLworc3RhdGljIGludCBfX2RldmluaXQgYWVyX3Byb2JlIChzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldiwKKwkJCQljb25zdCBzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfaWQgKmlkICkKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBhZXJfcnBjICpycGM7CisJc3RydWN0IGRldmljZSAqZGV2aWNlID0gJmRldi0+ZGV2aWNlOworCisJLyogSW5pdCAqLworCWlmICgoc3RhdHVzID0gYWVyX2luaXQoZGV2KSkpCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBBbGxvYyBycGMgZGF0YSBzdHJ1Y3R1cmUgKi8KKwlpZiAoIShycGMgPSBhZXJfYWxsb2NfcnBjKGRldikpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogQWxsb2MgcnBjIGZhaWxzIG9uIFBDSUUgZGV2aWNlWyVzXVxuIiwKKwkJCV9fRlVOQ1RJT05fXywgZGV2aWNlLT5idXNfaWQpOworCQlhZXJfcmVtb3ZlKGRldik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFJlcXVlc3QgSVJRIElTUiAqLworCWlmICgoc3RhdHVzID0gcmVxdWVzdF9pcnEoZGV2LT5pcnEsIGFlcl9pcnEsIFNBX1NISVJRLCAiYWVyZHJ2IiwKKwkJCQlkZXYpKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IFJlcXVlc3QgSVNSIGZhaWxzIG9uIFBDSUUgZGV2aWNlWyVzXVxuIiwKKwkJCV9fRlVOQ1RJT05fXywgZGV2aWNlLT5idXNfaWQpOworCQlhZXJfcmVtb3ZlKGRldik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcnBjLT5pc3IgPSAxOworCisJYWVyX2VuYWJsZV9yb290cG9ydChycGMpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBhZXJfcm9vdF9yZXNldCAtIHJlc2V0IGxpbmsgb24gUm9vdCBQb3J0CisgKiBAZGV2OiBwb2ludGVyIHRvIFJvb3QgUG9ydCdzIHBjaV9kZXYgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBJbnZva2VkIGJ5IFBvcnQgQnVzIGRyaXZlciB3aGVuIHBlcmZvcm1pbmcgbGluayByZXNldCBhdCBSb290IFBvcnQuCisgKiovCitzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBhZXJfcm9vdF9yZXNldChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXUxNiBwMnBfY3RybDsKKwl1MzIgc3RhdHVzOworCWludCBwb3M7CisKKwlwb3MgPSBwY2lfZmluZF9hZXJfY2FwYWJpbGl0eShkZXYpOworCisJLyogRGlzYWJsZSBSb290J3MgaW50ZXJydXB0IGluIHJlc3BvbnNlIHRvIGVycm9yIG1lc3NhZ2VzICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfUk9PVF9DT01NQU5ELCAwKTsKKworCS8qIEFzc2VydCBTZWNvbmRhcnkgQnVzIFJlc2V0ICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQlJJREdFX0NPTlRST0wsICZwMnBfY3RybCk7CisJcDJwX2N0cmwgfD0gUENJX0NCX0JSSURHRV9DVExfQ0JfUkVTRVQ7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgUENJX0JSSURHRV9DT05UUk9MLCBwMnBfY3RybCk7CisKKwkvKiBEZS1hc3NlcnQgU2Vjb25kYXJ5IEJ1cyBSZXNldCAqLworCXAycF9jdHJsICY9IH5QQ0lfQ0JfQlJJREdFX0NUTF9DQl9SRVNFVDsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQlJJREdFX0NPTlRST0wsIHAycF9jdHJsKTsKKworCS8qCisJICogU3lzdGVtIHNvZnR3YXJlIG11c3Qgd2FpdCBmb3IgYXQgbGVhc3QgMTAwbXMgZnJvbSB0aGUgZW5kCisJICogb2YgYSByZXNldCBvZiBvbmUgb3IgbW9yZSBkZXZpY2UgYmVmb3JlIGl0IGlzIHBlcm1pdHRlZAorCSAqIHRvIGlzc3VlIENvbmZpZ3VyYXRpb24gUmVxdWVzdHMgdG8gdGhvc2UgZGV2aWNlcy4KKwkgKi8KKwltc2xlZXAoMjAwKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiQ29tcGxldGUgbGluayByZXNldCBhdCBSb290WyVzXVxuIiwgZGV2LT5kZXYuYnVzX2lkKTsKKworCS8qIEVuYWJsZSBSb290IFBvcnQncyBpbnRlcnJ1cHQgaW4gcmVzcG9uc2UgdG8gZXJyb3IgbWVzc2FnZXMgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfRVJSX1JPT1RfU1RBVFVTLCAmc3RhdHVzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX0VSUl9ST09UX1NUQVRVUywgc3RhdHVzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwKKwkJcG9zICsgUENJX0VSUl9ST09UX0NPTU1BTkQsCisJCVJPT1RfUE9SVF9JTlRSX09OX01FU0dfTUFTSyk7CisKKwlyZXR1cm4gUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEOworfQorCisvKioKKyAqIGFlcl9lcnJvcl9kZXRlY3RlZCAtIHVwZGF0ZSBzZXZlcml0eSBzdGF0dXMKKyAqIEBkZXY6IHBvaW50ZXIgdG8gUm9vdCBQb3J0J3MgcGNpX2RldiBkYXRhIHN0cnVjdHVyZQorICogQGVycm9yOiBlcnJvciBzZXZlcml0eSBiZWluZyBub3RpZmllZCBieSBwb3J0IGJ1cworICoKKyAqIEludm9rZWQgYnkgUG9ydCBCdXMgZHJpdmVyIGR1cmluZyBlcnJvciByZWNvdmVyeS4KKyAqKi8KK3N0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IGFlcl9lcnJvcl9kZXRlY3RlZChzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJZW51bSBwY2lfY2hhbm5lbF9zdGF0ZSBlcnJvcikKK3sKKwkvKiBSb290IFBvcnQgaGFzIG5vIGltcGFjdC4gQWx3YXlzIHJlY292ZXJzLiAqLworCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9DQU5fUkVDT1ZFUjsKK30KKworLyoqCisgKiBhZXJfZXJyb3JfcmVzdW1lIC0gY2xlYW4gdXAgY29ycmVzcG9uZGluZyBlcnJvciBzdGF0dXMgYml0cworICogQGRldjogcG9pbnRlciB0byBSb290IFBvcnQncyBwY2lfZGV2IGRhdGEgc3RydWN0dXJlCisgKgorICogSW52b2tlZCBieSBQb3J0IEJ1cyBkcml2ZXIgZHVyaW5nIG5vbmZhdGFsIHJlY292ZXJ5LgorICoqLworc3RhdGljIHZvaWQgYWVyX2Vycm9yX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBwb3M7CisJdTMyIHN0YXR1cywgbWFzazsKKwl1MTYgcmVnMTY7CisKKwkvKiBDbGVhbiB1cCBSb290IGRldmljZSBzdGF0dXMgKi8KKwlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9FWFApOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9ERVZTVEEsICZyZWcxNik7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgcG9zICsgUENJX0VYUF9ERVZTVEEsIHJlZzE2KTsKKworCS8qIENsZWFuIEFFUiBSb290IEVycm9yIFN0YXR1cyAqLworCXBvcyA9IHBjaV9maW5kX2Flcl9jYXBhYmlsaXR5KGRldik7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX0VSUl9VTkNPUl9TVEFUVVMsICZzdGF0dXMpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfVU5DT1JfU0VWRVIsICZtYXNrKTsKKwlpZiAoZGV2LT5lcnJvcl9zdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19ub3JtYWwpCisJCXN0YXR1cyAmPSB+bWFzazsgLyogQ2xlYXIgY29ycmVzcG9uZGluZyBub25mYXRhbCBiaXRzICovCisJZWxzZQorCQlzdGF0dXMgJj0gbWFzazsgLyogQ2xlYXIgY29ycmVzcG9uZGluZyBmYXRhbCBiaXRzICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfVU5DT1JfU1RBVFVTLCBzdGF0dXMpOworfQorCisvKioKKyAqIGFlcl9zZXJ2aWNlX2luaXQgLSByZWdpc3RlciBBRVIgcm9vdCBzZXJ2aWNlIGRyaXZlcgorICoKKyAqIEludm9rZWQgd2hlbiBBRVIgcm9vdCBzZXJ2aWNlIGRyaXZlciBpcyBsb2FkZWQuCisgKiovCitzdGF0aWMgaW50IF9faW5pdCBhZXJfc2VydmljZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBjaWVfcG9ydF9zZXJ2aWNlX3JlZ2lzdGVyKCZhZXJkcnYpOworfQorCisvKioKKyAqIGFlcl9zZXJ2aWNlX2V4aXQgLSB1bnJlZ2lzdGVyIEFFUiByb290IHNlcnZpY2UgZHJpdmVyCisgKgorICogSW52b2tlZCB3aGVuIEFFUiByb290IHNlcnZpY2UgZHJpdmVyIGlzIHVubG9hZGVkLgorICoqLworc3RhdGljIHZvaWQgX19leGl0IGFlcl9zZXJ2aWNlX2V4aXQodm9pZCkKK3sKKwlwY2llX3BvcnRfc2VydmljZV91bnJlZ2lzdGVyKCZhZXJkcnYpOworfQorCittb2R1bGVfaW5pdChhZXJfc2VydmljZV9pbml0KTsKK21vZHVsZV9leGl0KGFlcl9zZXJ2aWNlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2LmggYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWYwY2FkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2LmgKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgSW50ZWwgQ29ycC4KKyAqCVRvbSBMb25nIE5ndXllbiAodG9tLmwubmd1eWVuQGludGVsLmNvbSkKKyAqCVpoYW5nIFlhbm1pbiAoeWFubWluLnpoYW5nQGludGVsLmNvbSkKKyAqCisgKi8KKworI2lmbmRlZiBfQUVSRFJWX0hfCisjZGVmaW5lIF9BRVJEUlZfSF8KKworI2luY2x1ZGUgPGxpbnV4L3BjaWVwb3J0X2lmLmg+CisjaW5jbHVkZSA8bGludXgvYWVyLmg+CisKKyNkZWZpbmUgQUVSX05PTkZBVEFMCQkJMAorI2RlZmluZSBBRVJfRkFUQUwJCQkxCisjZGVmaW5lIEFFUl9DT1JSRUNUQUJMRQkJCTIKKyNkZWZpbmUgQUVSX1VOQ09SUkVDVEFCTEUJCTQKKyNkZWZpbmUgQUVSX0VSUk9SX01BU0sJCQkweDAwMWZmZmZmCisjZGVmaW5lIEFFUl9FUlJPUihkKQkJCShkICYgQUVSX0VSUk9SX01BU0spCisKKyNkZWZpbmUgT1NDX01FVEhPRF9SVU5fU1VDQ0VTUwkJMAorI2RlZmluZSBPU0NfTUVUSE9EX05PVF9TVVBQT1JURUQJMQorI2RlZmluZSBPU0NfTUVUSE9EX1JVTl9GQUlMVVJFCQkyCisKKy8qIFJvb3QgRXJyb3IgU3RhdHVzIFJlZ2lzdGVyIEJpdHMgKi8KKyNkZWZpbmUgUk9PVF9FUlJfU1RBVFVTX01BU0tTCQkJMHgwZgorCisjZGVmaW5lIFNZU1RFTV9FUlJPUl9JTlRSX09OX01FU0dfTUFTSwkoUENJX0VYUF9SVENUTF9TRUNFRXwJXAorCQkJCQlQQ0lfRVhQX1JUQ1RMX1NFTkZFRXwJXAorCQkJCQlQQ0lfRVhQX1JUQ1RMX1NFRkVFKQorI2RlZmluZSBST09UX1BPUlRfSU5UUl9PTl9NRVNHX01BU0sJKFBDSV9FUlJfUk9PVF9DTURfQ09SX0VOfAlcCisJCQkJCVBDSV9FUlJfUk9PVF9DTURfTk9ORkFUQUxfRU58CVwKKwkJCQkJUENJX0VSUl9ST09UX0NNRF9GQVRBTF9FTikKKyNkZWZpbmUgRVJSX0NPUl9JRChkKQkJCShkICYgMHhmZmZmKQorI2RlZmluZSBFUlJfVU5DT1JfSUQoZCkJCQkoZCA+PiAxNikKKworI2RlZmluZSBBRVJfU1VDQ0VTUwkJCTAKKyNkZWZpbmUgQUVSX1VOU1VDQ0VTUwkJCTEKKyNkZWZpbmUgQUVSX0VSUk9SX1NPVVJDRVNfTUFYCQkxMDAKKworI2RlZmluZSBBRVJfTE9HX1RMUF9NQVNLUwkJKFBDSV9FUlJfVU5DX1BPSVNPTl9UTFB8CVwKKwkJCQkJUENJX0VSUl9VTkNfRUNSQ3wJCVwKKwkJCQkJUENJX0VSUl9VTkNfVU5TVVB8CQlcCisJCQkJCVBDSV9FUlJfVU5DX0NPTVBfQUJPUlR8CQlcCisJCQkJCVBDSV9FUlJfVU5DX1VOWF9DT01QfAkJXAorCQkJCQlQQ0lfRVJSX1VOQ19NQUxGX1RMUCkKKworLyogQUVSIEVycm9yIEluZm8gRmxhZ3MgKi8KKyNkZWZpbmUgQUVSX1RMUF9IRUFERVJfVkFMSURfRkxBRwkweDAwMDAwMDAxCisjZGVmaW5lIEFFUl9NVUxUSV9FUlJPUl9WQUxJRF9GTEFHCTB4MDAwMDAwMDIKKworI2RlZmluZSBFUlJfQ09SUkVDVEFCTEVfRVJST1JfTUFTSwkweDAwMDAzMWMxCisjZGVmaW5lIEVSUl9VTkNPUlJFQ1RBQkxFX0VSUk9SX01BU0sJMHgwMDFmZjAxMAorCitzdHJ1Y3QgaGVhZGVyX2xvZ19yZWdzIHsKKwl1bnNpZ25lZCBpbnQgZHcwOworCXVuc2lnbmVkIGludCBkdzE7CisJdW5zaWduZWQgaW50IGR3MjsKKwl1bnNpZ25lZCBpbnQgZHczOworfTsKKworc3RydWN0IGFlcl9lcnJfaW5mbyB7CisJaW50IHNldmVyaXR5OwkJCS8qIDA6Tk9ORkFUQUwgfCAxOkZBVEFMIHwgMjpDT1IgKi8KKwlpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IHN0YXR1czsJCS8qIENPUi9VTkNPUiBFcnJvciBTdGF0dXMgKi8KKwlzdHJ1Y3QgaGVhZGVyX2xvZ19yZWdzIHRscDsgCS8qIFRMUCBIZWFkZXIgKi8KK307CisKK3N0cnVjdCBhZXJfZXJyX3NvdXJjZSB7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgaWQ7Cit9OworCitzdHJ1Y3QgYWVyX3JwYyB7CisJc3RydWN0IHBjaWVfZGV2aWNlICpycGQ7CS8qIFJvb3QgUG9ydCBkZXZpY2UgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZHBjX2hhbmRsZXI7CisJc3RydWN0IGFlcl9lcnJfc291cmNlIGVfc291cmNlc1tBRVJfRVJST1JfU09VUkNFU19NQVhdOworCXVuc2lnbmVkIHNob3J0IHByb2RfaWR4OwkvKiBFcnJvciBQcm9kdWNlciBJbmRleCAqLworCXVuc2lnbmVkIHNob3J0IGNvbnNfaWR4OwkvKiBFcnJvciBDb25zdW1lciBJbmRleCAqLworCWludCBpc3I7CisJc3BpbmxvY2tfdCBlX2xvY2s7CQkvKgorCQkJCQkgKiBMb2NrIGFjY2VzcyB0byBFcnJvciBTdGF0dXMvSUQgUmVncworCQkJCQkgKiBhbmQgZXJyb3IgcHJvZHVjZXIvY29uc3VtZXIgaW5kZXgKKwkJCQkJICovCisJc3RydWN0IG11dGV4IHJwY19tdXRleDsJCS8qCisJCQkJCSAqIG9ubHkgb25lIHRocmVhZCBjb3VsZCBkbworCQkJCQkgKiByZWNvdmVyeSBvbiB0aGUgc2FtZQorCQkJCQkgKiByb290IHBvcnQgaGllcmFjaHkKKwkJCQkJICovCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9yZWxlYXNlOworfTsKKworc3RydWN0IGFlcl9icm9hZGNhc3RfZGF0YSB7CisJZW51bSBwY2lfY2hhbm5lbF9zdGF0ZSBzdGF0ZTsKKwllbnVtIHBjaV9lcnNfcmVzdWx0IHJlc3VsdDsKK307CisKK3N0YXRpYyBpbmxpbmUgcGNpX2Vyc19yZXN1bHRfdCBtZXJnZV9yZXN1bHQoZW51bSBwY2lfZXJzX3Jlc3VsdCBvcmlnLAorCQllbnVtIHBjaV9lcnNfcmVzdWx0IG5ldykKK3sKKwlzd2l0Y2ggKG9yaWcpIHsKKwljYXNlIFBDSV9FUlNfUkVTVUxUX0NBTl9SRUNPVkVSOgorCWNhc2UgUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEOgorCQlvcmlnID0gbmV3OworCQlicmVhazsKKwljYXNlIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q6CisJCWlmIChuZXcgPT0gUENJX0VSU19SRVNVTFRfTkVFRF9SRVNFVCkKKwkJCW9yaWcgPSBuZXc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBvcmlnOworfQorCitleHRlcm4gc3RydWN0IGJ1c190eXBlIHBjaWVfcG9ydF9idXNfdHlwZTsKK2V4dGVybiB2b2lkIGFlcl9lbmFibGVfcm9vdHBvcnQoc3RydWN0IGFlcl9ycGMgKnJwYyk7CitleHRlcm4gdm9pZCBhZXJfZGVsZXRlX3Jvb3Rwb3J0KHN0cnVjdCBhZXJfcnBjICpycGMpOworZXh0ZXJuIGludCBhZXJfaW5pdChzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBhZXJfaXNyKHZvaWQgKmNvbnRleHQpOworZXh0ZXJuIHZvaWQgYWVyX3ByaW50X2Vycm9yKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBhZXJfZXJyX2luZm8gKmluZm8pOworZXh0ZXJuIGludCBhZXJfb3NjX3NldHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworCisjZW5kaWYgLy9fQUVSRFJWX0hfCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfYWNwaS5jIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2FjcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTY4ZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2FjcGkuYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogQWNjZXNzIEFDUEkgX09TQyBtZXRob2QKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgSW50ZWwgQ29ycC4KKyAqCVRvbSBMb25nIE5ndXllbiAodG9tLmwubmd1eWVuQGludGVsLmNvbSkKKyAqCVpoYW5nIFlhbm1pbiAoeWFubWluLnpoYW5nQGludGVsLmNvbSkKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS1hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJhZXJkcnYuaCIKKworLyoqCisgKiBhZXJfb3NjX3NldHVwIC0gcnVuIEFDUEkgX09TQyBtZXRob2QKKyAqCisgKiBSZXR1cm46CisgKglaZXJvIGlmIHN1Y2Nlc3MuIE5vbnplcm8gZm9yIG90aGVyd2lzZS4KKyAqCisgKiBJbnZva2VkIHdoZW4gUENJRSBidXMgbG9hZHMgQUVSIHNlcnZpY2UgZHJpdmVyLiBUbyBhdm9pZCBjb25mbGljdCB3aXRoCisgKiBCSU9TIEFFUiBzdXBwb3J0IHJlcXVpcmVzIEJJT1MgdG8geWllbGQgQUVSIGNvbnRyb2wgdG8gT1MgbmF0aXZlIGRyaXZlci4KKyAqKi8KK2ludCBhZXJfb3NjX3NldHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHJldHZhbCA9IE9TQ19NRVRIT0RfUlVOX1NVQ0NFU1M7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfaGFuZGxlIGhhbmRsZSA9IERFVklDRV9BQ1BJX0hBTkRMRSgmZGV2LT5kZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2OworCXN0cnVjdCBwY2lfYnVzICpwYXJlbnQ7CisKKwl3aGlsZSAoIWhhbmRsZSkgeworCQlpZiAoIXBkZXYgfHwgIXBkZXYtPmJ1cy0+cGFyZW50KQorCQkJYnJlYWs7CisJCXBhcmVudCA9IHBkZXYtPmJ1cy0+cGFyZW50OworCQlpZiAoIXBhcmVudC0+c2VsZikKKwkJCS8qIFBhcmVudCBtdXN0IGJlIGEgaG9zdCBicmlkZ2UgKi8KKwkJCWhhbmRsZSA9IGFjcGlfZ2V0X3BjaV9yb290YnJpZGdlX2hhbmRsZSgKKwkJCQkJcGNpX2RvbWFpbl9ucihwYXJlbnQpLAorCQkJCQlwYXJlbnQtPm51bWJlcik7CisJCWVsc2UKKwkJCWhhbmRsZSA9IERFVklDRV9BQ1BJX0hBTkRMRSgKKwkJCQkJJihwYXJlbnQtPnNlbGYtPmRldikpOworCQlwZGV2ID0gcGFyZW50LT5zZWxmOworCX0KKworCWlmICghaGFuZGxlKQorCQlyZXR1cm4gT1NDX01FVEhPRF9OT1RfU1VQUE9SVEVEOworCisJcGNpX29zY19zdXBwb3J0X3NldChPU0NfRVhUX1BDSV9DT05GSUdfU1VQUE9SVCk7CisJc3RhdHVzID0gcGNpX29zY19jb250cm9sX3NldChoYW5kbGUsIE9TQ19QQ0lfRVhQUkVTU19BRVJfQ09OVFJPTCB8CisJCU9TQ19QQ0lfRVhQUkVTU19DQVBfU1RSVUNUVVJFX0NPTlRST0wpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlpZiAoc3RhdHVzID09IEFFX1NVUFBPUlQpCisJCQlyZXR2YWwgPSBPU0NfTUVUSE9EX05PVF9TVVBQT1JURUQ7CisJIAllbHNlCisJCQlyZXR2YWwgPSBPU0NfTUVUSE9EX1JVTl9GQUlMVVJFOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9jb3JlLmMgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjN2U2NjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfY29yZS5jCkBAIC0wLDAgKzEsNzU4IEBACisvKgorICogZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBjb3JlIHBhcnQgb2YgUENJLUV4cHJlc3MgQUVSLiBXaGVuIGFuIHBjaS1leHByZXNzCisgKiBlcnJvciBpcyBkZWxpdmVyZWQsIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBjb2xsZWN0ZWQgYW5kIHByaW50ZWQgdG8KKyAqIGNvbnNvbGUsIHRoZW4sIGFuIGVycm9yIHJlY292ZXJ5IHByb2NlZHVyZSB3aWxsIGJlIGV4ZWN1dGVkIGJ5IGZvbGxvd2luZworICogdGhlIHBjaSBlcnJvciByZWNvdmVyeSBydWxlcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgSW50ZWwgQ29ycC4KKyAqCVRvbSBMb25nIE5ndXllbiAodG9tLmwubmd1eWVuQGludGVsLmNvbSkKKyAqCVpoYW5nIFlhbm1pbiAoeWFubWluLnpoYW5nQGludGVsLmNvbSkKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS1hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJhZXJkcnYuaCIKKworc3RhdGljIGludCBmb3JjZWxvYWQ7Cittb2R1bGVfcGFyYW0oZm9yY2Vsb2FkLCBib29sLCAwKTsKKworI2RlZmluZSBQQ0lfQ0ZHX1NQQUNFX1NJWkUJKDB4MTAwKQoraW50IHBjaV9maW5kX2Flcl9jYXBhYmlsaXR5KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHBvczsKKwl1MzIgcmVnMzIgPSAwOworCisJLyogQ2hlY2sgaWYgaXQncyBhIHBjaS1leHByZXNzIGRldmljZSAqLworCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX0VYUCk7CisJaWYgKCFwb3MpCisJCXJldHVybiAwOworCisJLyogQ2hlY2sgaWYgaXQgc3VwcG9ydHMgcGNpLWV4cHJlc3MgQUVSICovCisJcG9zID0gUENJX0NGR19TUEFDRV9TSVpFOworCXdoaWxlIChwb3MpIHsKKwkJaWYgKHBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcywgJnJlZzMyKSkKKwkJCXJldHVybiAwOworCisJCS8qIHNvbWUgYnJva2VuIGJvYXJkcyByZXR1cm4gfjAgKi8KKwkJaWYgKHJlZzMyID09IDB4ZmZmZmZmZmYpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoUENJX0VYVF9DQVBfSUQocmVnMzIpID09IFBDSV9FWFRfQ0FQX0lEX0VSUikKKwkJCWJyZWFrOworCisJCXBvcyA9IHJlZzMyID4+IDIwOworCX0KKworCXJldHVybiBwb3M7Cit9CisKK2ludCBwY2lfZW5hYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTE2IHJlZzE2ID0gMDsKKwlpbnQgcG9zOworCisJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlpZiAoIXBvcykKKwkJcmV0dXJuIC1FSU87CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIHBvcytQQ0lfRVhQX0RFVkNUTCwgJnJlZzE2KTsKKwlyZWcxNiA9IHJlZzE2IHwKKwkJUENJX0VYUF9ERVZDVExfQ0VSRSB8CisJCVBDSV9FWFBfREVWQ1RMX05GRVJFIHwKKwkJUENJX0VYUF9ERVZDVExfRkVSRSB8CisJCVBDSV9FWFBfREVWQ1RMX1VSUkU7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgcG9zK1BDSV9FWFBfREVWQ1RMLAorCQkJcmVnMTYpOworCXJldHVybiAwOworfQorCitpbnQgcGNpX2Rpc2FibGVfcGNpZV9lcnJvcl9yZXBvcnRpbmcoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1MTYgcmVnMTYgPSAwOworCWludCBwb3M7CisKKwlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9FWFApOworCWlmICghcG9zKQorCQlyZXR1cm4gLUVJTzsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcG9zK1BDSV9FWFBfREVWQ1RMLCAmcmVnMTYpOworCXJlZzE2ID0gcmVnMTYgJiB+KFBDSV9FWFBfREVWQ1RMX0NFUkUgfAorCQkJUENJX0VYUF9ERVZDVExfTkZFUkUgfAorCQkJUENJX0VYUF9ERVZDVExfRkVSRSB8CisJCQlQQ0lfRVhQX0RFVkNUTF9VUlJFKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBwb3MrUENJX0VYUF9ERVZDVEwsCisJCQlyZWcxNik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwY2lfY2xlYW51cF9hZXJfdW5jb3JyZWN0X2Vycm9yX3N0YXR1cyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBwb3M7CisJdTMyIHN0YXR1cywgbWFzazsKKworCXBvcyA9IHBjaV9maW5kX2Flcl9jYXBhYmlsaXR5KGRldik7CisJaWYgKCFwb3MpCisJCXJldHVybiAtRUlPOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX0VSUl9VTkNPUl9TVEFUVVMsICZzdGF0dXMpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfVU5DT1JfU0VWRVIsICZtYXNrKTsKKwlpZiAoZGV2LT5lcnJvcl9zdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19ub3JtYWwpCisJCXN0YXR1cyAmPSB+bWFzazsgLyogQ2xlYXIgY29ycmVzcG9uZGluZyBub25mYXRhbCBiaXRzICovCisJZWxzZQorCQlzdGF0dXMgJj0gbWFzazsgLyogQ2xlYXIgY29ycmVzcG9uZGluZyBmYXRhbCBiaXRzICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfVU5DT1JfU1RBVFVTLCBzdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9kZXZpY2VfaXRlcihzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwl1MTYgaWQgPSAqKHVuc2lnbmVkIGxvbmcgKilkYXRhOworCXU4IHNlY29uZGFyeSwgc3Vib3JkaW5hdGUsIGRfYnVzID0gaWQgPj4gODsKKworCWlmIChkZXZpY2UtPmJ1cyA9PSAmcGNpX2J1c190eXBlKSB7CisJCWRldiA9IHRvX3BjaV9kZXYoZGV2aWNlKTsKKwkJaWYgKGlkID09ICgoZGV2LT5idXMtPm51bWJlciA8PCA4KSB8IGRldi0+ZGV2Zm4pKSB7CisJCQkvKgorCQkJICogRGV2aWNlIElEIG1hdGNoCisJCQkgKi8KKwkJCSoodW5zaWduZWQgbG9uZyopZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldmljZTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJLyoKKwkJICogSWYgZGV2aWNlIGlzIFAyUCwgY2hlY2sgaWYgaXQgaXMgYW4gdXBzdHJlYW0/CisJCSAqLworCQlpZiAoZGV2LT5oZHJfdHlwZSAmIFBDSV9IRUFERVJfVFlQRV9CUklER0UpIHsKKwkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgUENJX1NFQ09OREFSWV9CVVMsCisJCQkJJnNlY29uZGFyeSk7CisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9TVUJPUkRJTkFURV9CVVMsCisJCQkJJnN1Ym9yZGluYXRlKTsKKwkJCWlmIChkX2J1cyA+PSBzZWNvbmRhcnkgJiYgZF9idXMgPD0gc3Vib3JkaW5hdGUpIHsKKwkJCQkqKHVuc2lnbmVkIGxvbmcqKWRhdGEgPSAodW5zaWduZWQgbG9uZylkZXZpY2U7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaW5kX3NvdXJjZV9kZXZpY2UgLSBzZWFyY2ggdGhyb3VnaCBkZXZpY2UgaGllcmFyY2h5IGZvciBzb3VyY2UgZGV2aWNlCisgKiBAcF9kZXY6IHBvaW50ZXIgdG8gUm9vdCBQb3J0IHBjaV9kZXYgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBpZDogZGV2aWNlIElEIG9mIGFnZW50IHdobyBzZW5kcyBhbiBlcnJvciBtZXNzYWdlIHRvIHRoaXMgUm9vdCBQb3J0CisgKgorICogSW52b2tlZCB3aGVuIGVycm9yIGlzIGRldGVjdGVkIGF0IHRoZSBSb290IFBvcnQuCisgKiovCitzdGF0aWMgc3RydWN0IGRldmljZSogZmluZF9zb3VyY2VfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpwYXJlbnQsIHUxNiBpZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gcGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldmljZTsKKwl1bnNpZ25lZCBsb25nIGRldmljZV9hZGRyOworCWludCBzdGF0dXM7CisKKwkvKiBJcyBSb290IFBvcnQgYW4gYWdlbnQgdGhhdCBzZW5kcyBlcnJvciBtZXNzYWdlPyAqLworCWlmIChpZCA9PSAoKGRldi0+YnVzLT5udW1iZXIgPDwgOCkgfCBkZXYtPmRldmZuKSkKKwkJcmV0dXJuICZkZXYtPmRldjsKKworCWRvIHsKKwkJZGV2aWNlX2FkZHIgPSBpZDsKKyAJCWlmICgoc3RhdHVzID0gZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZkZXYtPmRldiwKKwkJCSZkZXZpY2VfYWRkciwgZmluZF9kZXZpY2VfaXRlcikpKSB7CisJCQlkZXZpY2UgPSAoc3RydWN0IGRldmljZSopZGV2aWNlX2FkZHI7CisJCQlkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7CisJCQlpZiAoaWQgPT0gKChkZXYtPmJ1cy0+bnVtYmVyIDw8IDgpIHwgZGV2LT5kZXZmbikpCisJCQkJcmV0dXJuIGRldmljZTsKKwkJfQorIAl9d2hpbGUgKHN0YXR1cyk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcmVwb3J0X2Vycm9yX2RldGVjdGVkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgKmRhdGEpCit7CisJcGNpX2Vyc19yZXN1bHRfdCB2b3RlOworCXN0cnVjdCBwY2lfZXJyb3JfaGFuZGxlcnMgKmVycl9oYW5kbGVyOworCXN0cnVjdCBhZXJfYnJvYWRjYXN0X2RhdGEgKnJlc3VsdF9kYXRhOworCXJlc3VsdF9kYXRhID0gKHN0cnVjdCBhZXJfYnJvYWRjYXN0X2RhdGEgKikgZGF0YTsKKworCWRldi0+ZXJyb3Jfc3RhdGUgPSByZXN1bHRfZGF0YS0+c3RhdGU7CisKKwlpZiAoIWRldi0+ZHJpdmVyIHx8CisJCSFkZXYtPmRyaXZlci0+ZXJyX2hhbmRsZXIgfHwKKwkJIWRldi0+ZHJpdmVyLT5lcnJfaGFuZGxlci0+ZXJyb3JfZGV0ZWN0ZWQpIHsKKwkJaWYgKHJlc3VsdF9kYXRhLT5zdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19mcm96ZW4gJiYKKwkJCSEoZGV2LT5oZHJfdHlwZSAmIFBDSV9IRUFERVJfVFlQRV9CUklER0UpKSB7CisJCQkvKgorCQkJICogSW4gY2FzZSBvZiBmYXRhbCByZWNvdmVyeSwgaWYgb25lIG9mIGRvd24tCisJCQkgKiBzdHJlYW0gZGV2aWNlIGhhcyBubyBkcml2ZXIuIFdlIG1pZ2h0IGJlCisJCQkgKiB1bmFibGUgdG8gcmVjb3ZlciBiZWNhdXNlIGEgbGF0ZXIgaW5zbW9kCisJCQkgKiBvZiBhIGRyaXZlciBmb3IgdGhpcyBkZXZpY2UgaXMgdW5hd2FyZSBvZgorCQkJICogaXRzIGh3IHN0YXRlLgorCQkJICovCisJCQlwcmludGsoS0VSTl9ERUJVRyAiRGV2aWNlIElEWyVzXSBoYXMgJXNcbiIsCisJCQkJCWRldi0+ZGV2LmJ1c19pZCwgKGRldi0+ZHJpdmVyKSA/CisJCQkJCSJubyBBRVItYXdhcmUgZHJpdmVyIiA6ICJubyBkcml2ZXIiKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJZXJyX2hhbmRsZXIgPSBkZXYtPmRyaXZlci0+ZXJyX2hhbmRsZXI7CisJdm90ZSA9IGVycl9oYW5kbGVyLT5lcnJvcl9kZXRlY3RlZChkZXYsIHJlc3VsdF9kYXRhLT5zdGF0ZSk7CisJcmVzdWx0X2RhdGEtPnJlc3VsdCA9IG1lcmdlX3Jlc3VsdChyZXN1bHRfZGF0YS0+cmVzdWx0LCB2b3RlKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHJlcG9ydF9tbWlvX2VuYWJsZWQoc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlwY2lfZXJzX3Jlc3VsdF90IHZvdGU7CisJc3RydWN0IHBjaV9lcnJvcl9oYW5kbGVycyAqZXJyX2hhbmRsZXI7CisJc3RydWN0IGFlcl9icm9hZGNhc3RfZGF0YSAqcmVzdWx0X2RhdGE7CisJcmVzdWx0X2RhdGEgPSAoc3RydWN0IGFlcl9icm9hZGNhc3RfZGF0YSAqKSBkYXRhOworCisJaWYgKCFkZXYtPmRyaXZlciB8fAorCQkhZGV2LT5kcml2ZXItPmVycl9oYW5kbGVyIHx8CisJCSFkZXYtPmRyaXZlci0+ZXJyX2hhbmRsZXItPm1taW9fZW5hYmxlZCkKKwkJcmV0dXJuOworCisJZXJyX2hhbmRsZXIgPSBkZXYtPmRyaXZlci0+ZXJyX2hhbmRsZXI7CisJdm90ZSA9IGVycl9oYW5kbGVyLT5tbWlvX2VuYWJsZWQoZGV2KTsKKwlyZXN1bHRfZGF0YS0+cmVzdWx0ID0gbWVyZ2VfcmVzdWx0KHJlc3VsdF9kYXRhLT5yZXN1bHQsIHZvdGUpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcmVwb3J0X3Nsb3RfcmVzZXQoc3RydWN0IHBjaV9kZXYgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlwY2lfZXJzX3Jlc3VsdF90IHZvdGU7CisJc3RydWN0IHBjaV9lcnJvcl9oYW5kbGVycyAqZXJyX2hhbmRsZXI7CisJc3RydWN0IGFlcl9icm9hZGNhc3RfZGF0YSAqcmVzdWx0X2RhdGE7CisJcmVzdWx0X2RhdGEgPSAoc3RydWN0IGFlcl9icm9hZGNhc3RfZGF0YSAqKSBkYXRhOworCisJaWYgKCFkZXYtPmRyaXZlciB8fAorCQkhZGV2LT5kcml2ZXItPmVycl9oYW5kbGVyIHx8CisJCSFkZXYtPmRyaXZlci0+ZXJyX2hhbmRsZXItPnNsb3RfcmVzZXQpCisJCXJldHVybjsKKworCWVycl9oYW5kbGVyID0gZGV2LT5kcml2ZXItPmVycl9oYW5kbGVyOworCXZvdGUgPSBlcnJfaGFuZGxlci0+c2xvdF9yZXNldChkZXYpOworCXJlc3VsdF9kYXRhLT5yZXN1bHQgPSBtZXJnZV9yZXN1bHQocmVzdWx0X2RhdGEtPnJlc3VsdCwgdm90ZSk7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCByZXBvcnRfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBjaV9lcnJvcl9oYW5kbGVycyAqZXJyX2hhbmRsZXI7CisKKwlkZXYtPmVycm9yX3N0YXRlID0gcGNpX2NoYW5uZWxfaW9fbm9ybWFsOworCisJaWYgKCFkZXYtPmRyaXZlciB8fAorCQkhZGV2LT5kcml2ZXItPmVycl9oYW5kbGVyIHx8CisJCSFkZXYtPmRyaXZlci0+ZXJyX2hhbmRsZXItPnNsb3RfcmVzZXQpCisJCXJldHVybjsKKworCWVycl9oYW5kbGVyID0gZGV2LT5kcml2ZXItPmVycl9oYW5kbGVyOworCWVycl9oYW5kbGVyLT5yZXN1bWUoZGV2KTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogYnJvYWRjYXN0X2Vycm9yX21lc3NhZ2UgLSBoYW5kbGUgbWVzc2FnZSBicm9hZGNhc3QgdG8gZG93bnN0cmVhbSBkcml2ZXJzCisgKiBAZGV2aWNlOiBwb2ludGVyIHRvIGZyb20gd2hlcmUgaW4gYSBoaWVyYXJjaHkgbWVzc2FnZSBpcyBicm9hZGNhc3RlZCBkb3duCisgKiBAYXBpOiBjYWxsYmFjayB0byBiZSBicm9hZGNhc3RlZAorICogQHN0YXRlOiBlcnJvciBzdGF0ZQorICoKKyAqIEludm9rZWQgZHVyaW5nIGVycm9yIHJlY292ZXJ5IHByb2Nlc3MuIE9uY2UgYmVpbmcgaW52b2tlZCwgdGhlIGNvbnRlbnQKKyAqIG9mIGVycm9yIHNldmVyaXR5IHdpbGwgYmUgYnJvYWRjYXN0ZWQgdG8gYWxsIGRvd25zdHJlYW0gZHJpdmVycyBpbiBhCisgKiBoaWVyYXJjaHkgaW4gcXVlc3Rpb24uCisgKiovCitzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBicm9hZGNhc3RfZXJyb3JfbWVzc2FnZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCWVudW0gcGNpX2NoYW5uZWxfc3RhdGUgc3RhdGUsCisJY2hhciAqZXJyb3JfbWVzZywKKwl2b2lkICgqY2IpKHN0cnVjdCBwY2lfZGV2ICosIHZvaWQgKikpCit7CisJc3RydWN0IGFlcl9icm9hZGNhc3RfZGF0YSByZXN1bHRfZGF0YTsKKworCXByaW50ayhLRVJOX0RFQlVHICJCcm9hZGNhc3QgJXMgbWVzc2FnZVxuIiwgZXJyb3JfbWVzZyk7CisJcmVzdWx0X2RhdGEuc3RhdGUgPSBzdGF0ZTsKKwlpZiAoY2IgPT0gcmVwb3J0X2Vycm9yX2RldGVjdGVkKQorCQlyZXN1bHRfZGF0YS5yZXN1bHQgPSBQQ0lfRVJTX1JFU1VMVF9DQU5fUkVDT1ZFUjsKKwllbHNlCisJCXJlc3VsdF9kYXRhLnJlc3VsdCA9IFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRDsKKworCWlmIChkZXYtPmhkcl90eXBlICYgUENJX0hFQURFUl9UWVBFX0JSSURHRSkgeworCQkvKgorCQkgKiBJZiB0aGUgZXJyb3IgaXMgcmVwb3J0ZWQgYnkgYSBicmlkZ2UsIHdlIHRoaW5rIHRoaXMgZXJyb3IKKwkJICogaXMgcmVsYXRlZCB0byB0aGUgZG93bnN0cmVhbSBsaW5rIG9mIHRoZSBicmlkZ2UsIHNvIHdlCisJCSAqIGRvIGVycm9yIHJlY292ZXJ5IG9uIGFsbCBzdWJvcmRpbmF0ZXMgb2YgdGhlIGJyaWRnZSBpbnN0ZWFkCisJCSAqIG9mIHRoZSBicmlkZ2UgYW5kIGNsZWFyIHRoZSBlcnJvciBzdGF0dXMgb2YgdGhlIGJyaWRnZS4KKwkJICovCisJCWlmIChjYiA9PSByZXBvcnRfZXJyb3JfZGV0ZWN0ZWQpCisJCQlkZXYtPmVycm9yX3N0YXRlID0gc3RhdGU7CisJCXBjaV93YWxrX2J1cyhkZXYtPnN1Ym9yZGluYXRlLCBjYiwgJnJlc3VsdF9kYXRhKTsKKwkJaWYgKGNiID09IHJlcG9ydF9yZXN1bWUpIHsKKwkJCXBjaV9jbGVhbnVwX2Flcl91bmNvcnJlY3RfZXJyb3Jfc3RhdHVzKGRldik7CisJCQlkZXYtPmVycm9yX3N0YXRlID0gcGNpX2NoYW5uZWxfaW9fbm9ybWFsOworCQl9CisJfQorCWVsc2UgeworCQkvKgorCQkgKiBJZiB0aGUgZXJyb3IgaXMgcmVwb3J0ZWQgYnkgYW4gZW5kIHBvaW50LCB3ZSB0aGluayB0aGlzCisJCSAqIGVycm9yIGlzIHJlbGF0ZWQgdG8gdGhlIHVwc3RyZWFtIGxpbmsgb2YgdGhlIGVuZCBwb2ludC4KKwkJICovCisJCXBjaV93YWxrX2J1cyhkZXYtPmJ1cywgY2IsICZyZXN1bHRfZGF0YSk7CisJfQorCisJcmV0dXJuIHJlc3VsdF9kYXRhLnJlc3VsdDsKK30KKworc3RydWN0IGZpbmRfYWVyX3NlcnZpY2VfZGF0YSB7CisJc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciAqYWVyX2RyaXZlcjsKKwlpbnQgaXNfZG93bnN0cmVhbTsKK307CisKK3N0YXRpYyBpbnQgZmluZF9hZXJfc2VydmljZV9pdGVyKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyOworCXN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9kcml2ZXIgKnNlcnZpY2VfZHJpdmVyOworCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZV9kZXY7CisJc3RydWN0IGZpbmRfYWVyX3NlcnZpY2VfZGF0YSAqcmVzdWx0OworCisJcmVzdWx0ID0gKHN0cnVjdCBmaW5kX2Flcl9zZXJ2aWNlX2RhdGEgKikgZGF0YTsKKworCWlmIChkZXZpY2UtPmJ1cyA9PSAmcGNpZV9wb3J0X2J1c190eXBlKSB7CisJCXBjaWVfZGV2ID0gdG9fcGNpZV9kZXZpY2UoZGV2aWNlKTsKKwkJaWYgKHBjaWVfZGV2LT5pZC5wb3J0X3R5cGUgPT0gUENJRV9TV19ET1dOU1RSRUFNX1BPUlQpCisJCQlyZXN1bHQtPmlzX2Rvd25zdHJlYW0gPSAxOworCisJCWRyaXZlciA9IGRldmljZS0+ZHJpdmVyOworCQlpZiAoZHJpdmVyKSB7CisJCQlzZXJ2aWNlX2RyaXZlciA9IHRvX3NlcnZpY2VfZHJpdmVyKGRyaXZlcik7CisJCQlpZiAoc2VydmljZV9kcml2ZXItPmlkX3RhYmxlLT5zZXJ2aWNlX3R5cGUgPT0KKwkJCQkJUENJRV9QT1JUX1NFUlZJQ0VfQUVSKSB7CisJCQkJcmVzdWx0LT5hZXJfZHJpdmVyID0gc2VydmljZV9kcml2ZXI7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZmluZF9hZXJfc2VydmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQlzdHJ1Y3QgZmluZF9hZXJfc2VydmljZV9kYXRhICpkYXRhKQoreworCWludCByZXR2YWw7CisJcmV0dmFsID0gZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZkZXYtPmRldiwgZGF0YSwgZmluZF9hZXJfc2VydmljZV9pdGVyKTsKK30KKworc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgcmVzZXRfbGluayhzdHJ1Y3QgcGNpZV9kZXZpY2UgKmFlcmRldiwKKwkJc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqdWRldjsKKwlwY2lfZXJzX3Jlc3VsdF90IHN0YXR1czsKKwlzdHJ1Y3QgZmluZF9hZXJfc2VydmljZV9kYXRhIGRhdGE7CisKKwlpZiAoZGV2LT5oZHJfdHlwZSAmIFBDSV9IRUFERVJfVFlQRV9CUklER0UpCisJCXVkZXYgPSBkZXY7CisJZWxzZQorCQl1ZGV2PSBkZXYtPmJ1cy0+c2VsZjsKKworCWRhdGEuaXNfZG93bnN0cmVhbSA9IDA7CisJZGF0YS5hZXJfZHJpdmVyID0gTlVMTDsKKwlmaW5kX2Flcl9zZXJ2aWNlKHVkZXYsICZkYXRhKTsKKworCS8qCisJICogVXNlIHRoZSBhZXIgZHJpdmVyIG9mIHRoZSBlcnJvciBhZ2VudCBmaXJzdGx5LgorCSAqIElmIGl0IGhhc24ndCB0aGUgYWVyIGRyaXZlciwgdXNlIHRoZSByb290IHBvcnQncworCSAqLworCWlmICghZGF0YS5hZXJfZHJpdmVyIHx8ICFkYXRhLmFlcl9kcml2ZXItPnJlc2V0X2xpbmspIHsKKwkJaWYgKGRhdGEuaXNfZG93bnN0cmVhbSAmJgorCQkJYWVyZGV2LT5kZXZpY2UuZHJpdmVyICYmCisJCQl0b19zZXJ2aWNlX2RyaXZlcihhZXJkZXYtPmRldmljZS5kcml2ZXIpLT5yZXNldF9saW5rKSB7CisJCQlkYXRhLmFlcl9kcml2ZXIgPQorCQkJCXRvX3NlcnZpY2VfZHJpdmVyKGFlcmRldi0+ZGV2aWNlLmRyaXZlcik7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiTm8gbGluay1yZXNldCBzdXBwb3J0IHRvIERldmljZSBJRCIKKwkJCQkiWyVzXVxuIiwKKwkJCQlkZXYtPmRldi5idXNfaWQpOworCQkJcmV0dXJuIFBDSV9FUlNfUkVTVUxUX0RJU0NPTk5FQ1Q7CisJCX0KKwl9CisKKwlzdGF0dXMgPSBkYXRhLmFlcl9kcml2ZXItPnJlc2V0X2xpbmsodWRldik7CisJaWYgKHN0YXR1cyAhPSBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkxpbmsgcmVzZXQgYXQgdXBzdHJlYW0gRGV2aWNlIElEIgorCQkJIlslc10gZmFpbGVkXG4iLAorCQkJdWRldi0+ZGV2LmJ1c19pZCk7CisJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogZG9fcmVjb3ZlcnkgLSBoYW5kbGUgbm9uZmF0YWwvZmF0YWwgZXJyb3IgcmVjb3ZlcnkgcHJvY2VzcworICogQGFlcmRldjogcG9pbnRlciB0byBhIHBjaWVfZGV2aWNlIGRhdGEgc3RydWN0dXJlIG9mIHJvb3QgcG9ydAorICogQGRldjogcG9pbnRlciB0byBhIHBjaV9kZXYgZGF0YSBzdHJ1Y3R1cmUgb2YgYWdlbnQgZGV0ZWN0aW5nIGFuIGVycm9yCisgKiBAc2V2ZXJpdHk6IGVycm9yIHNldmVyaXR5IHR5cGUKKyAqCisgKiBJbnZva2VkIHdoZW4gYW4gZXJyb3IgaXMgbm9uZmF0YWwvZmF0YWwuIE9uY2UgYmVpbmcgaW52b2tlZCwgYnJvYWRjYXN0CisgKiBlcnJvciBkZXRlY3RlZCBtZXNzYWdlIHRvIGFsbCBkb3duc3RyZWFtIGRyaXZlcnMgd2l0aGluIGEgaGllcmFyY2h5IGluCisgKiBxdWVzdGlvbiBhbmQgcmV0dXJuIHRoZSByZXR1cm5lZCBjb2RlLgorICoqLworc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgZG9fcmVjb3Zlcnkoc3RydWN0IHBjaWVfZGV2aWNlICphZXJkZXYsCisJCXN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCWludCBzZXZlcml0eSkKK3sKKwlwY2lfZXJzX3Jlc3VsdF90IHN0YXR1cywgcmVzdWx0ID0gUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEOworCWVudW0gcGNpX2NoYW5uZWxfc3RhdGUgc3RhdGU7CisKKwlpZiAoc2V2ZXJpdHkgPT0gQUVSX0ZBVEFMKQorCQlzdGF0ZSA9IHBjaV9jaGFubmVsX2lvX2Zyb3plbjsKKwllbHNlCisJCXN0YXRlID0gcGNpX2NoYW5uZWxfaW9fbm9ybWFsOworCisJc3RhdHVzID0gYnJvYWRjYXN0X2Vycm9yX21lc3NhZ2UoZGV2LAorCQkJc3RhdGUsCisJCQkiZXJyb3JfZGV0ZWN0ZWQiLAorCQkJcmVwb3J0X2Vycm9yX2RldGVjdGVkKTsKKworCWlmIChzZXZlcml0eSA9PSBBRVJfRkFUQUwpIHsKKwkJcmVzdWx0ID0gcmVzZXRfbGluayhhZXJkZXYsIGRldik7CisJCWlmIChyZXN1bHQgIT0gUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEKSB7CisJCQkvKiBUT0RPOiBTaG91bGQgcGFuaWMgaGVyZT8gKi8KKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzID09IFBDSV9FUlNfUkVTVUxUX0NBTl9SRUNPVkVSKQorCQlzdGF0dXMgPSBicm9hZGNhc3RfZXJyb3JfbWVzc2FnZShkZXYsCisJCQkJc3RhdGUsCisJCQkJIm1taW9fZW5hYmxlZCIsCisJCQkJcmVwb3J0X21taW9fZW5hYmxlZCk7CisKKwlpZiAoc3RhdHVzID09IFBDSV9FUlNfUkVTVUxUX05FRURfUkVTRVQpIHsKKwkJLyoKKwkJICogVE9ETzogU2hvdWxkIGNhbGwgcGxhdGZvcm0tc3BlY2lmaWMKKwkJICogZnVuY3Rpb25zIHRvIHJlc2V0IHNsb3QgYmVmb3JlIGNhbGxpbmcKKwkJICogZHJpdmVycycgc2xvdF9yZXNldCBjYWxsYmFja3M/CisJCSAqLworCQlzdGF0dXMgPSBicm9hZGNhc3RfZXJyb3JfbWVzc2FnZShkZXYsCisJCQkJc3RhdGUsCisJCQkJInNsb3RfcmVzZXQiLAorCQkJCXJlcG9ydF9zbG90X3Jlc2V0KTsKKwl9CisKKwlpZiAoc3RhdHVzID09IFBDSV9FUlNfUkVTVUxUX1JFQ09WRVJFRCkKKwkJYnJvYWRjYXN0X2Vycm9yX21lc3NhZ2UoZGV2LAorCQkJCXN0YXRlLAorCQkJCSJyZXN1bWUiLAorCQkJCXJlcG9ydF9yZXN1bWUpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBoYW5kbGVfZXJyb3Jfc291cmNlIC0gaGFuZGxlIGxvZ2dpbmcgZXJyb3IgaW50byBhbiBldmVudCBsb2cKKyAqIEBhZXJkZXY6IHBvaW50ZXIgdG8gcGNpZV9kZXZpY2UgZGF0YSBzdHJ1Y3R1cmUgb2YgdGhlIHJvb3QgcG9ydAorICogQGRldjogcG9pbnRlciB0byBwY2lfZGV2IGRhdGEgc3RydWN0dXJlIG9mIGVycm9yIHNvdXJjZSBkZXZpY2UKKyAqIEBpbmZvOiBjb21wcmVoZW5zaXZlIGVycm9yIGluZm9ybWF0aW9uCisgKgorICogSW52b2tlZCB3aGVuIGFuIGVycm9yIGJlaW5nIGRldGVjdGVkIGJ5IFJvb3QgUG9ydC4KKyAqKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9lcnJvcl9zb3VyY2Uoc3RydWN0IHBjaWVfZGV2aWNlICogYWVyZGV2LAorCXN0cnVjdCBwY2lfZGV2ICpkZXYsCisJc3RydWN0IGFlcl9lcnJfaW5mbyBpbmZvKQoreworCXBjaV9lcnNfcmVzdWx0X3Qgc3RhdHVzID0gMDsKKwlpbnQgcG9zOworCisJaWYgKGluZm8uc2V2ZXJpdHkgPT0gQUVSX0NPUlJFQ1RBQkxFKSB7CisJCS8qCisJCSAqIENvcnJlY3RhYmxlIGVycm9yIGRvZXMgbm90IG5lZWQgc29mdHdhcmUgaW50ZXZlbnRpb24uCisJCSAqIE5vIG5lZWQgdG8gZ28gdGhyb3VnaCBlcnJvciByZWNvdmVyeSBwcm9jZXNzLgorCQkgKi8KKwkJcG9zID0gcGNpX2ZpbmRfYWVyX2NhcGFiaWxpdHkoZGV2KTsKKwkJaWYgKHBvcykKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfRVJSX0NPUl9TVEFUVVMsCisJCQkJCWluZm8uc3RhdHVzKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBkb19yZWNvdmVyeShhZXJkZXYsIGRldiwgaW5mby5zZXZlcml0eSk7CisJCWlmIChzdGF0dXMgPT0gUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiQUVSIGRyaXZlciBzdWNjZXNzZnVsbHkgcmVjb3ZlcmVkXG4iKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFRPRE86IFNob3VsZCBrZXJuZWwgcGFuaWMgaGVyZT8gKi8KKwkJCXByaW50ayhLRVJOX0RFQlVHICJBRVIgZHJpdmVyIGRpZG4ndCByZWNvdmVyXG4iKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBhZXJfZW5hYmxlX3Jvb3Rwb3J0IC0gZW5hYmxlIFJvb3QgUG9ydCdzIGludGVycnVwdHMgd2hlbiByZWNlaXZpbmcgbWVzc2FnZXMKKyAqIEBycGM6IHBvaW50ZXIgdG8gYSBSb290IFBvcnQgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBJbnZva2VkIHdoZW4gUENJRSBidXMgbG9hZHMgQUVSIHNlcnZpY2UgZHJpdmVyLgorICoqLwordm9pZCBhZXJfZW5hYmxlX3Jvb3Rwb3J0KHN0cnVjdCBhZXJfcnBjICpycGMpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBycGMtPnJwZC0+cG9ydDsKKwlpbnQgcG9zLCBhZXJfcG9zOworCXUxNiByZWcxNjsKKwl1MzIgcmVnMzI7CisKKwlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwkvKiBDbGVhciBQQ0lFIENhcGFiaWxpdHkncyBEZXZpY2UgU3RhdHVzICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zK1BDSV9FWFBfREVWU1RBLCAmcmVnMTYpOworCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBwb3MrUENJX0VYUF9ERVZTVEEsIHJlZzE2KTsKKworCS8qIERpc2FibGUgc3lzdGVtIGVycm9yIGdlbmVyYXRpb24gaW4gcmVzcG9uc2UgdG8gZXJyb3IgbWVzc2FnZXMgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfRVhQX1JUQ1RMLCAmcmVnMTYpOworCXJlZzE2ICY9IH4oU1lTVEVNX0VSUk9SX0lOVFJfT05fTUVTR19NQVNLKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX0VYUF9SVENUTCwgcmVnMTYpOworCisJYWVyX3BvcyA9IHBjaV9maW5kX2Flcl9jYXBhYmlsaXR5KHBkZXYpOworCS8qIENsZWFyIGVycm9yIHN0YXR1cyAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBhZXJfcG9zICsgUENJX0VSUl9ST09UX1NUQVRVUywgJnJlZzMyKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIGFlcl9wb3MgKyBQQ0lfRVJSX1JPT1RfU1RBVFVTLCByZWczMik7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGFlcl9wb3MgKyBQQ0lfRVJSX0NPUl9TVEFUVVMsICZyZWczMik7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBhZXJfcG9zICsgUENJX0VSUl9DT1JfU1RBVFVTLCByZWczMik7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGFlcl9wb3MgKyBQQ0lfRVJSX1VOQ09SX1NUQVRVUywgJnJlZzMyKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIGFlcl9wb3MgKyBQQ0lfRVJSX1VOQ09SX1NUQVRVUywgcmVnMzIpOworCisJLyogRW5hYmxlIFJvb3QgUG9ydCBkZXZpY2UgcmVwb3J0aW5nIGVycm9yIGl0c2VsZiAqLworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIHBvcytQQ0lfRVhQX0RFVkNUTCwgJnJlZzE2KTsKKwlyZWcxNiA9IHJlZzE2IHwKKwkJUENJX0VYUF9ERVZDVExfQ0VSRSB8CisJCVBDSV9FWFBfREVWQ1RMX05GRVJFIHwKKwkJUENJX0VYUF9ERVZDVExfRkVSRSB8CisJCVBDSV9FWFBfREVWQ1RMX1VSUkU7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIHBvcytQQ0lfRVhQX0RFVkNUTCwKKwkJcmVnMTYpOworCisJLyogRW5hYmxlIFJvb3QgUG9ydCdzIGludGVycnVwdCBpbiByZXNwb25zZSB0byBlcnJvciBtZXNzYWdlcyAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwKKwkJYWVyX3BvcyArIFBDSV9FUlJfUk9PVF9DT01NQU5ELAorCQlST09UX1BPUlRfSU5UUl9PTl9NRVNHX01BU0spOworfQorCisvKioKKyAqIGRpc2FibGVfcm9vdF9hZXIgLSBkaXNhYmxlIFJvb3QgUG9ydCdzIGludGVycnVwdHMgd2hlbiByZWNlaXZpbmcgbWVzc2FnZXMKKyAqIEBycGM6IHBvaW50ZXIgdG8gYSBSb290IFBvcnQgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBJbnZva2VkIHdoZW4gUENJRSBidXMgdW5sb2FkcyBBRVIgc2VydmljZSBkcml2ZXIuCisgKiovCitzdGF0aWMgdm9pZCBkaXNhYmxlX3Jvb3RfYWVyKHN0cnVjdCBhZXJfcnBjICpycGMpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBycGMtPnJwZC0+cG9ydDsKKwl1MzIgcmVnMzI7CisJaW50IHBvczsKKworCXBvcyA9IHBjaV9maW5kX2Flcl9jYXBhYmlsaXR5KHBkZXYpOworCS8qIERpc2FibGUgUm9vdCdzIGludGVycnVwdCBpbiByZXNwb25zZSB0byBlcnJvciBtZXNzYWdlcyAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgcG9zICsgUENJX0VSUl9ST09UX0NPTU1BTkQsIDApOworCisJLyogQ2xlYXIgUm9vdCdzIGVycm9yIHN0YXR1cyByZWcgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgcG9zICsgUENJX0VSUl9ST09UX1NUQVRVUywgJnJlZzMyKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIHBvcyArIFBDSV9FUlJfUk9PVF9TVEFUVVMsIHJlZzMyKTsKK30KKworLyoqCisgKiBnZXRfZV9zb3VyY2UgLSByZXRyaWV2ZSBhbiBlcnJvciBzb3VyY2UKKyAqIEBycGM6IHBvaW50ZXIgdG8gdGhlIHJvb3QgcG9ydCB3aGljaCBob2xkcyBhbiBlcnJvcgorICoKKyAqIEludm9rZWQgYnkgRFBDIGhhbmRsZXIgdG8gY29uc3VtZSBhbiBlcnJvci4KKyAqKi8KK3N0YXRpYyBzdHJ1Y3QgYWVyX2Vycl9zb3VyY2UqIGdldF9lX3NvdXJjZShzdHJ1Y3QgYWVyX3JwYyAqcnBjKQoreworCXN0cnVjdCBhZXJfZXJyX3NvdXJjZSAqZV9zb3VyY2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIExvY2sgYWNjZXNzIHRvIFJvb3QgZXJyb3IgcHJvZHVjZXIvY29uc3VtZXIgaW5kZXggKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnBjLT5lX2xvY2ssIGZsYWdzKTsKKwlpZiAocnBjLT5wcm9kX2lkeCA9PSBycGMtPmNvbnNfaWR4KSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwYy0+ZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiBOVUxMOworCX0KKwllX3NvdXJjZSA9ICZycGMtPmVfc291cmNlc1tycGMtPmNvbnNfaWR4XTsKKwlycGMtPmNvbnNfaWR4Kys7CisJaWYgKHJwYy0+Y29uc19pZHggPT0gQUVSX0VSUk9SX1NPVVJDRVNfTUFYKQorCQlycGMtPmNvbnNfaWR4ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycGMtPmVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGVfc291cmNlOworfQorCitzdGF0aWMgaW50IGdldF9kZXZpY2VfZXJyb3JfaW5mbyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgYWVyX2Vycl9pbmZvICppbmZvKQoreworCWludCBwb3M7CisKKwlwb3MgPSBwY2lfZmluZF9hZXJfY2FwYWJpbGl0eShkZXYpOworCisJLyogVGhlIGRldmljZSBtaWdodCBub3Qgc3VwcG9ydCBBRVIgKi8KKwlpZiAoIXBvcykKKwkJcmV0dXJuIEFFUl9TVUNDRVNTOworCisJaWYgKGluZm8tPnNldmVyaXR5ID09IEFFUl9DT1JSRUNUQUJMRSkgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfRVJSX0NPUl9TVEFUVVMsCisJCQkmaW5mby0+c3RhdHVzKTsKKwkJaWYgKCEoaW5mby0+c3RhdHVzICYgRVJSX0NPUlJFQ1RBQkxFX0VSUk9SX01BU0spKQorCQkJcmV0dXJuIEFFUl9VTlNVQ0NFU1M7CisJfSBlbHNlIGlmIChkZXYtPmhkcl90eXBlICYgUENJX0hFQURFUl9UWVBFX0JSSURHRSB8fAorCQlpbmZvLT5zZXZlcml0eSA9PSBBRVJfTk9ORkFUQUwpIHsKKworCQkvKiBMaW5rIGlzIHN0aWxsIGhlYWx0aHkgZm9yIElPIHJlYWRzICovCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9FUlJfVU5DT1JfU1RBVFVTLAorCQkJJmluZm8tPnN0YXR1cyk7CisJCWlmICghKGluZm8tPnN0YXR1cyAmIEVSUl9VTkNPUlJFQ1RBQkxFX0VSUk9SX01BU0spKQorCQkJcmV0dXJuIEFFUl9VTlNVQ0NFU1M7CisKKwkJaWYgKGluZm8tPnN0YXR1cyAmIEFFUl9MT0dfVExQX01BU0tTKSB7CisJCQlpbmZvLT5mbGFncyB8PSBBRVJfVExQX0hFQURFUl9WQUxJRF9GTEFHOworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwKKwkJCQlwb3MgKyBQQ0lfRVJSX0hFQURFUl9MT0csICZpbmZvLT50bHAuZHcwKTsKKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsCisJCQkJcG9zICsgUENJX0VSUl9IRUFERVJfTE9HICsgNCwgJmluZm8tPnRscC5kdzEpOworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwKKwkJCQlwb3MgKyBQQ0lfRVJSX0hFQURFUl9MT0cgKyA4LCAmaW5mby0+dGxwLmR3Mik7CisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LAorCQkJCXBvcyArIFBDSV9FUlJfSEVBREVSX0xPRyArIDEyLCAmaW5mby0+dGxwLmR3Myk7CisJCX0KKwl9CisKKwlyZXR1cm4gQUVSX1NVQ0NFU1M7Cit9CisKKy8qKgorICogYWVyX2lzcl9vbmVfZXJyb3IgLSBjb25zdW1lIGFuIGVycm9yIGRldGVjdGVkIGJ5IHJvb3QgcG9ydAorICogQHBfZGV2aWNlOiBwb2ludGVyIHRvIGVycm9yIHJvb3QgcG9ydCBzZXJ2aWNlIGRldmljZQorICogQGVfc3JjOiBwb2ludGVyIHRvIGFuIGVycm9yIHNvdXJjZQorICoqLworc3RhdGljIHZvaWQgYWVyX2lzcl9vbmVfZXJyb3Ioc3RydWN0IHBjaWVfZGV2aWNlICpwX2RldmljZSwKKwkJc3RydWN0IGFlcl9lcnJfc291cmNlICplX3NyYykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpzX2RldmljZTsKKwlzdHJ1Y3QgYWVyX2Vycl9pbmZvIGVfaW5mbyA9IHswLCAwLCAwLH07CisJaW50IGk7CisJdTE2IGlkOworCisJLyoKKwkgKiBUaGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgYm90aCBjb3JyZWN0YWJsZSBlcnJvciBhbmQKKwkgKiB1bmNvcnJlY3RhYmxlIGVycm9yIGJlaW5nIGxvZ2dlZC4gUmVwb3J0IGNvcnJlY3RhYmxlIGVycm9yIGZpcnN0LgorCSAqLworCWZvciAoaSA9IDE7IGkgJiBST09UX0VSUl9TVEFUVVNfTUFTS1MgOyBpIDw8PSAyKSB7CisJCWlmIChpID4gNCkKKwkJCWJyZWFrOworCQlpZiAoIShlX3NyYy0+c3RhdHVzICYgaSkpCisJCQljb250aW51ZTsKKworCQkvKiBJbml0IGNvbXByZWhlbnNpdmUgZXJyb3IgaW5mb3JtYXRpb24gKi8KKwkJaWYgKGkgJiBQQ0lfRVJSX1JPT1RfQ09SX1JDVikgeworCQkJaWQgPSBFUlJfQ09SX0lEKGVfc3JjLT5pZCk7CisJCQllX2luZm8uc2V2ZXJpdHkgPSBBRVJfQ09SUkVDVEFCTEU7CisJCX0gZWxzZSB7CisJCQlpZCA9IEVSUl9VTkNPUl9JRChlX3NyYy0+aWQpOworCQkJZV9pbmZvLnNldmVyaXR5ID0gKChlX3NyYy0+c3RhdHVzID4+IDYpICYgMSk7CisJCX0KKwkJaWYgKGVfc3JjLT5zdGF0dXMgJgorCQkJKFBDSV9FUlJfUk9PVF9NVUxUSV9DT1JfUkNWIHwKKwkJCSBQQ0lfRVJSX1JPT1RfTVVMVElfVU5DT1JfUkNWKSkKKwkJCWVfaW5mby5mbGFncyB8PSBBRVJfTVVMVElfRVJST1JfVkFMSURfRkxBRzsKKwkJaWYgKCEoc19kZXZpY2UgPSBmaW5kX3NvdXJjZV9kZXZpY2UocF9kZXZpY2UtPnBvcnQsIGlkKSkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlcy0+Y2FuJ3QgZmluZCBkZXZpY2Ugb2YgSUQlMDR4XG4iLAorCQkJCV9fRlVOQ1RJT05fXywgaWQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGdldF9kZXZpY2VfZXJyb3JfaW5mbyh0b19wY2lfZGV2KHNfZGV2aWNlKSwgJmVfaW5mbykgPT0KKwkJCQlBRVJfU1VDQ0VTUykgeworCQkJYWVyX3ByaW50X2Vycm9yKHRvX3BjaV9kZXYoc19kZXZpY2UpLCAmZV9pbmZvKTsKKwkJCWhhbmRsZV9lcnJvcl9zb3VyY2UocF9kZXZpY2UsCisJCQkJdG9fcGNpX2RldihzX2RldmljZSksCisJCQkJZV9pbmZvKTsKKwkJfQorCX0KK30KKworLyoqCisgKiBhZXJfaXNyIC0gY29uc3VtZSBlcnJvcnMgZGV0ZWN0ZWQgYnkgcm9vdCBwb3J0CisgKiBAY29udGV4dDogcG9pbnRlciB0byBhIHByaXZhdGUgZGF0YSBvZiBwY2llIGRldmljZQorICoKKyAqIEludm9rZWQsIGFzIERQQywgd2hlbiByb290IHBvcnQgcmVjb3JkcyBuZXcgZGV0ZWN0ZWQgZXJyb3IKKyAqKi8KK3ZvaWQgYWVyX2lzcih2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBwY2llX2RldmljZSAqcF9kZXZpY2UgPSAoc3RydWN0IHBjaWVfZGV2aWNlICopIGNvbnRleHQ7CisJc3RydWN0IGFlcl9ycGMgKnJwYyA9IGdldF9zZXJ2aWNlX2RhdGEocF9kZXZpY2UpOworCXN0cnVjdCBhZXJfZXJyX3NvdXJjZSAqZV9zcmM7CisKKwltdXRleF9sb2NrKCZycGMtPnJwY19tdXRleCk7CisJZV9zcmMgPSBnZXRfZV9zb3VyY2UocnBjKTsKKwl3aGlsZSAoZV9zcmMpIHsKKwkJYWVyX2lzcl9vbmVfZXJyb3IocF9kZXZpY2UsIGVfc3JjKTsKKwkJZV9zcmMgPSBnZXRfZV9zb3VyY2UocnBjKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZycGMtPnJwY19tdXRleCk7CisKKwl3YWtlX3VwKCZycGMtPndhaXRfcmVsZWFzZSk7Cit9CisKKy8qKgorICogYWVyX2RlbGV0ZV9yb290cG9ydCAtIGRpc2FibGUgcm9vdCBwb3J0IGFlciBhbmQgZGVsZXRlIHNlcnZpY2UgZGF0YQorICogQHJwYzogcG9pbnRlciB0byBhIHJvb3QgcG9ydCBkZXZpY2UgYmVpbmcgZGVsZXRlZAorICoKKyAqIEludm9rZWQgd2hlbiBBRVIgc2VydmljZSB1bmxvYWRlZCBvbiBhIHNwZWNpZmljIFJvb3QgUG9ydAorICoqLwordm9pZCBhZXJfZGVsZXRlX3Jvb3Rwb3J0KHN0cnVjdCBhZXJfcnBjICpycGMpCit7CisJLyogRGlzYWJsZSByb290IHBvcnQgQUVSIGl0c2VsZiAqLworCWRpc2FibGVfcm9vdF9hZXIocnBjKTsKKworCWtmcmVlKHJwYyk7Cit9CisKKy8qKgorICogYWVyX2luaXQgLSBwcm92aWRlIEFFUiBpbml0aWFsaXphdGlvbgorICogQGRldjogcG9pbnRlciB0byBBRVIgcGNpZSBkZXZpY2UKKyAqCisgKiBJbnZva2VkIHdoZW4gQUVSIHNlcnZpY2UgZHJpdmVyIGlzIGxvYWRlZC4KKyAqKi8KK2ludCBhZXJfaW5pdChzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldikKK3sKKwlpbnQgc3RhdHVzOworCisJLyogUnVuIF9PU0MgTWV0aG9kICovCisJc3RhdHVzID0gYWVyX29zY19zZXR1cChkZXYtPnBvcnQpOworCisJaWYoc3RhdHVzICE9IE9TQ19NRVRIT0RfUlVOX1NVQ0NFU1MpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBBRVIgc2VydmljZSBpbml0IGZhaWxzIC0gJXNcbiIsCisJCV9fRlVOQ1RJT05fXywKKwkJKHN0YXR1cyA9PSBPU0NfTUVUSE9EX05PVF9TVVBQT1JURUQpID8KKwkJCSJObyBBQ1BJIF9PU0Mgc3VwcG9ydCIgOiAiUnVuIEFDUEkgX09TQyBmYWlscyIpOworCisJCWlmICghZm9yY2Vsb2FkKQorCQkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlyZXR1cm4gQUVSX1NVQ0NFU1M7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9maW5kX2Flcl9jYXBhYmlsaXR5KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9lbmFibGVfcGNpZV9lcnJvcl9yZXBvcnRpbmcpOworRVhQT1JUX1NZTUJPTF9HUEwocGNpX2Rpc2FibGVfcGNpZV9lcnJvcl9yZXBvcnRpbmcpOworRVhQT1JUX1NZTUJPTF9HUEwocGNpX2NsZWFudXBfYWVyX3VuY29ycmVjdF9lcnJvcl9zdGF0dXMpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfZXJycHJpbnQuYyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9lcnJwcmludC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MzNkNGYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2VycnByaW50LmMKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBkcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfZXJycHJpbnQuYworICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEZvcm1hdCBlcnJvciBtZXNzYWdlcyBhbmQgcHJpbnQgdGhlbSB0byBjb25zb2xlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBJbnRlbCBDb3JwLgorICoJVG9tIExvbmcgTmd1eWVuICh0b20ubC5uZ3V5ZW5AaW50ZWwuY29tKQorICoJWmhhbmcgWWFubWluICh5YW5taW4uemhhbmdAaW50ZWwuY29tKQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKworI2luY2x1ZGUgImFlcmRydi5oIgorCisjZGVmaW5lIEFFUl9BR0VOVF9SRUNFSVZFUgkJMAorI2RlZmluZSBBRVJfQUdFTlRfUkVRVUVTVEVSCQkxCisjZGVmaW5lIEFFUl9BR0VOVF9DT01QTEVURVIJCTIKKyNkZWZpbmUgQUVSX0FHRU5UX1RSQU5TTUlUVEVSCQkzCisKKyNkZWZpbmUgQUVSX0FHRU5UX1JFUVVFU1RFUl9NQVNLCShQQ0lfRVJSX1VOQ19DT01QX1RJTUV8CVwKKwkJCQkJUENJX0VSUl9VTkNfVU5TVVApCisKKyNkZWZpbmUgQUVSX0FHRU5UX0NPTVBMRVRFUl9NQVNLCVBDSV9FUlJfVU5DX0NPTVBfQUJPUlQKKworI2RlZmluZSBBRVJfQUdFTlRfVFJBTlNNSVRURVJfTUFTSyh0LCBlKSAoZSAmIChQQ0lfRVJSX0NPUl9SRVBfUk9MTHwgXAorCSgodCA9PSBBRVJfQ09SUkVDVEFCTEUpID8gUENJX0VSUl9DT1JfUkVQX1RJTUVSOiAwKSkpCisKKyNkZWZpbmUgQUVSX0dFVF9BR0VOVCh0LCBlKQkJCQkJCVwKKwkoKGUgJiBBRVJfQUdFTlRfQ09NUExFVEVSX01BU0spID8gQUVSX0FHRU5UX0NPTVBMRVRFUiA6CQlcCisJKGUgJiBBRVJfQUdFTlRfUkVRVUVTVEVSX01BU0spID8gQUVSX0FHRU5UX1JFUVVFU1RFUiA6CQlcCisJKEFFUl9BR0VOVF9UUkFOU01JVFRFUl9NQVNLKHQsIGUpKSA/IEFFUl9BR0VOVF9UUkFOU01JVFRFUiA6CVwKKwlBRVJfQUdFTlRfUkVDRUlWRVIpCisKKyNkZWZpbmUgQUVSX1BIWVNJQ0FMX0xBWUVSX0VSUk9SX01BU0sJUENJX0VSUl9DT1JfUkNWUgorI2RlZmluZSBBRVJfREFUQV9MSU5LX0xBWUVSX0VSUk9SX01BU0sodCwgZSkJXAorCQkoUENJX0VSUl9VTkNfRExQfAkJXAorCQlQQ0lfRVJSX0NPUl9CQURfVExQfCAJCVwKKwkJUENJX0VSUl9DT1JfQkFEX0RMTFB8CQlcCisJCVBDSV9FUlJfQ09SX1JFUF9ST0xMfCAJCVwKKwkJKCh0ID09IEFFUl9DT1JSRUNUQUJMRSkgPwlcCisJCVBDSV9FUlJfQ09SX1JFUF9USU1FUjogMCkpCisKKyNkZWZpbmUgQUVSX1BIWVNJQ0FMX0xBWUVSX0VSUk9SCTAKKyNkZWZpbmUgQUVSX0RBVEFfTElOS19MQVlFUl9FUlJPUgkxCisjZGVmaW5lIEFFUl9UUkFOU0FDVElPTl9MQVlFUl9FUlJPUgkyCisKKyNkZWZpbmUgQUVSX0dFVF9MQVlFUl9FUlJPUih0LCBlKQkJCQlcCisJKChlICYgQUVSX1BIWVNJQ0FMX0xBWUVSX0VSUk9SX01BU0spID8JCQlcCisJQUVSX1BIWVNJQ0FMX0xBWUVSX0VSUk9SIDoJCQkJXAorCShlICYgQUVSX0RBVEFfTElOS19MQVlFUl9FUlJPUl9NQVNLKHQsIGUpKSA/CQlcCisJCUFFUl9EQVRBX0xJTktfTEFZRVJfRVJST1IgOiAJCQlcCisJCUFFUl9UUkFOU0FDVElPTl9MQVlFUl9FUlJPUikKKworLyoKKyAqIEFFUiBlcnJvciBzdHJpbmdzCisgKi8KK3N0YXRpYyBjaGFyKiBhZXJfZXJyb3Jfc2V2ZXJpdHlfc3RyaW5nW10gPSB7CisJIlVuY29ycmVjdGVkIChOb24tRmF0YWwpIiwKKwkiVW5jb3JyZWN0ZWQgKEZhdGFsKSIsCisJIkNvcnJlY3RlZCIKK307CisKK3N0YXRpYyBjaGFyKiBhZXJfZXJyb3JfbGF5ZXJbXSA9IHsKKwkiUGh5c2ljYWwgTGF5ZXIiLAorCSJEYXRhIExpbmsgTGF5ZXIiLAorCSJUcmFuc2FjdGlvbiBMYXllciIKK307CitzdGF0aWMgY2hhciogYWVyX2NvcnJlY3RhYmxlX2Vycm9yX3N0cmluZ1tdID0geworCSJSZWNlaXZlciBFcnJvciAgICAgICAgIiwJLyogQml0IFBvc2l0aW9uIDAgCSovCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCSJCYWQgVExQICAgICAgICAgICAgICAgIiwJLyogQml0IFBvc2l0aW9uIDYgCSovCisJIkJhZCBETExQICAgICAgICAgICAgICAiLAkvKiBCaXQgUG9zaXRpb24gNyAJKi8KKwkiUkVMQVlfTlVNIFJvbGxvdmVyICAgICIsCS8qIEJpdCBQb3NpdGlvbiA4IAkqLworCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCSJSZXBsYXkgVGltZXIgVGltZW91dCAgIiwJLyogQml0IFBvc2l0aW9uIDEyIAkqLworCSJBZHZpc29yeSBOb24tRmF0YWwgICAgIiwgCS8qIEJpdCBQb3NpdGlvbiAxMwkqLworCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorfTsKKworc3RhdGljIGNoYXIqIGFlcl91bmNvcnJlY3RhYmxlX2Vycm9yX3N0cmluZ1tdID0geworCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJIkRhdGEgTGluayBQcm90b2NvbCAgICAiLAkvKiBCaXQgUG9zaXRpb24gNAkqLworCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJIlBvaXNvbmVkIFRMUCAgICAgICAgICAiLAkvKiBCaXQgUG9zaXRpb24gMTIgCSovCisJIkZsb3cgQ29udHJvbCBQcm90b2NvbCAiLAkvKiBCaXQgUG9zaXRpb24gMTMJKi8KKwkiQ29tcGxldGlvbiBUaW1lb3V0ICAgICIsCS8qIEJpdCBQb3NpdGlvbiAxNCAJKi8KKwkiQ29tcGxldGVyIEFib3J0ICAgICAgICIsCS8qIEJpdCBQb3NpdGlvbiAxNSAJKi8KKwkiVW5leHBlY3RlZCBDb21wbGV0aW9uICIsCS8qIEJpdCBQb3NpdGlvbiAxNgkqLworCSJSZWNlaXZlciBPdmVyZmxvdyAgICAgIiwJLyogQml0IFBvc2l0aW9uIDE3CSovCisJIk1hbGZvcm1lZCBUTFAgICAgICAgICAiLAkvKiBCaXQgUG9zaXRpb24gMTgJKi8KKwkiRUNSQyAgICAgICAgICAgICAgICAgICIsCS8qIEJpdCBQb3NpdGlvbiAxOQkqLworCSJVbnN1cHBvcnRlZCBSZXF1ZXN0ICAgIiwJLyogQml0IFBvc2l0aW9uIDIwCSovCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorCU5VTEwsCisJTlVMTCwKKwlOVUxMLAorfTsKKworc3RhdGljIGNoYXIqIGFlcl9hZ2VudF9zdHJpbmdbXSA9IHsKKwkiUmVjZWl2ZXIgSUQiLAorCSJSZXF1ZXN0ZXIgSUQiLAorCSJDb21wbGV0ZXIgSUQiLAorCSJUcmFuc21pdHRlciBJRCIKK307CisKK3N0YXRpYyBjaGFyICogYWVyX2dldF9lcnJvcl9zb3VyY2VfbmFtZShpbnQgc2V2ZXJpdHksCisJCQl1bnNpZ25lZCBpbnQgc3RhdHVzLAorCQkJY2hhciBlcnJtc2dfYnVmZltdKQoreworCWludCBpOworCWNoYXIgKiBlcnJtc2cgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJaWYgKCEoc3RhdHVzICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisKKwkJaWYgKHNldmVyaXR5ID09IEFFUl9DT1JSRUNUQUJMRSkKKwkJCWVycm1zZyA9IGFlcl9jb3JyZWN0YWJsZV9lcnJvcl9zdHJpbmdbaV07CisJCWVsc2UKKwkJCWVycm1zZyA9IGFlcl91bmNvcnJlY3RhYmxlX2Vycm9yX3N0cmluZ1tpXTsKKworCQlpZiAoIWVycm1zZykgeworCQkJc3ByaW50ZihlcnJtc2dfYnVmZiwgIlVua25vd24gRXJyb3IgQml0ICUyZCAgIiwgaSk7CisJCQllcnJtc2cgPSBlcnJtc2dfYnVmZjsKKwkJfQorCisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnJtc2c7Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9nYnVmX2xvY2spOworc3RhdGljIGNoYXIgZXJybXNnX2J1ZmZbMTAwXTsKK3ZvaWQgYWVyX3ByaW50X2Vycm9yKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBhZXJfZXJyX2luZm8gKmluZm8pCit7CisJY2hhciAqIGVycm1zZzsKKwlpbnQgZXJyX2xheWVyLCBhZ2VudDsKKwljaGFyICogbG9nbGV2ZWw7CisKKwlpZiAoaW5mby0+c2V2ZXJpdHkgPT0gQUVSX0NPUlJFQ1RBQkxFKQorCQlsb2dsZXZlbCA9IEtFUk5fV0FSTklORzsKKwllbHNlCisJCWxvZ2xldmVsID0gS0VSTl9FUlI7CisKKwlwcmludGsoIiVzKy0tLS0tLSBQQ0ktRXhwcmVzcyBEZXZpY2UgRXJyb3IgLS0tLS0tK1xuIiwgbG9nbGV2ZWwpOworCXByaW50aygiJXNFcnJvciBTZXZlcml0eVx0XHQ6ICVzXG4iLCBsb2dsZXZlbCwKKwkJYWVyX2Vycm9yX3NldmVyaXR5X3N0cmluZ1tpbmZvLT5zZXZlcml0eV0pOworCisJaWYgKCBpbmZvLT5zdGF0dXMgPT0gMCkgeworCQlwcmludGsoIiVzUENJRSBCdXMgRXJyb3IgdHlwZVx0OiAoVW5hY2Nlc3NpYmxlKVxuIiwgbG9nbGV2ZWwpOworCQlwcmludGsoIiVzVW5hY2Nlc3NpYmxlIFJlY2VpdmVkXHQ6ICVzXG4iLCBsb2dsZXZlbCwKKwkJCWluZm8tPmZsYWdzICYgQUVSX01VTFRJX0VSUk9SX1ZBTElEX0ZMQUcgPworCQkJCSJNdWx0aXBsZSIgOiAiRmlyc3QiKTsKKwkJcHJpbnRrKCIlc1VucmVnaXN0ZXJlZCBBZ2VudCBJRFx0OiAlMDR4XG4iLCBsb2dsZXZlbCwKKwkJCShkZXYtPmJ1cy0+bnVtYmVyIDw8IDgpIHwgZGV2LT5kZXZmbik7CisJfSBlbHNlIHsKKwkJZXJyX2xheWVyID0gQUVSX0dFVF9MQVlFUl9FUlJPUihpbmZvLT5zZXZlcml0eSwgaW5mby0+c3RhdHVzKTsKKwkJcHJpbnRrKCIlc1BDSUUgQnVzIEVycm9yIHR5cGVcdDogJXNcbiIsIGxvZ2xldmVsLAorCQkJYWVyX2Vycm9yX2xheWVyW2Vycl9sYXllcl0pOworCisJCXNwaW5fbG9jaygmbG9nYnVmX2xvY2spOworCQllcnJtc2cgPSBhZXJfZ2V0X2Vycm9yX3NvdXJjZV9uYW1lKGluZm8tPnNldmVyaXR5LAorCQkJCWluZm8tPnN0YXR1cywKKwkJCQllcnJtc2dfYnVmZik7CisJCXByaW50aygiJXMlc1x0OiAlc1xuIiwgbG9nbGV2ZWwsIGVycm1zZywKKwkJCWluZm8tPmZsYWdzICYgQUVSX01VTFRJX0VSUk9SX1ZBTElEX0ZMQUcgPworCQkJCSJNdWx0aXBsZSIgOiAiRmlyc3QiKTsKKwkJc3Bpbl91bmxvY2soJmxvZ2J1Zl9sb2NrKTsKKworCQlhZ2VudCA9IEFFUl9HRVRfQUdFTlQoaW5mby0+c2V2ZXJpdHksIGluZm8tPnN0YXR1cyk7CisJCXByaW50aygiJXMlc1x0XHQ6ICUwNHhcbiIsIGxvZ2xldmVsLAorCQkJYWVyX2FnZW50X3N0cmluZ1thZ2VudF0sCisJCQkoZGV2LT5idXMtPm51bWJlciA8PCA4KSB8IGRldi0+ZGV2Zm4pOworCisJCXByaW50aygiJXNWZW5kb3JJRD0lMDR4aCwgRGV2aWNlSUQ9JTA0eGgsIgorCQkJIiBCdXM9JTAyeGgsIERldmljZT0lMDJ4aCwgRnVuY3Rpb249JTAyeGhcbiIsCisJCQlsb2dsZXZlbCwKKwkJCWRldi0+dmVuZG9yLAorCQkJZGV2LT5kZXZpY2UsCisJCQlkZXYtPmJ1cy0+bnVtYmVyLAorCQkJUENJX1NMT1QoZGV2LT5kZXZmbiksCisJCQlQQ0lfRlVOQyhkZXYtPmRldmZuKSk7CisKKwkJaWYgKGluZm8tPmZsYWdzICYgQUVSX1RMUF9IRUFERVJfVkFMSURfRkxBRykgeworCQkJdW5zaWduZWQgY2hhciAqdGxwID0gKHVuc2lnbmVkIGNoYXIgKikgJmluZm8tPnRscDsKKwkJCXByaW50aygiJXNUTEIgSGVhZGVyOlxuIiwgbG9nbGV2ZWwpOworCQkJcHJpbnRrKCIlcyUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeCIKKwkJCQkiICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeFxuIiwKKwkJCQlsb2dsZXZlbCwKKwkJCQkqKHRscCArIDMpLCAqKHRscCArIDIpLCAqKHRscCArIDEpLCAqdGxwLAorCQkJCSoodGxwICsgNyksICoodGxwICsgNiksICoodGxwICsgNSksICoodGxwICsgNCksCisJCQkJKih0bHAgKyAxMSksICoodGxwICsgMTApLCAqKHRscCArIDkpLAorCQkJCSoodGxwICsgOCksICoodGxwICsgMTUpLCAqKHRscCArIDE0KSwKKwkJCQkqKHRscCArIDEzKSwgKih0bHAgKyAxMikpOworCQl9CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnYuaCBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oCmluZGV4IDFkMzE3ZDIuLjY3ZmNkMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydi5oCkBAIC0zOSw3ICszOSw3IEBACiBleHRlcm4gaW50IHBjaWVfcG9ydF9kZXZpY2VfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogI2VuZGlmCiBleHRlcm4gdm9pZCBwY2llX3BvcnRfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLWV4dGVybiB2b2lkIHBjaWVfcG9ydF9idXNfcmVnaXN0ZXIodm9pZCk7CitleHRlcm4gaW50IHBjaWVfcG9ydF9idXNfcmVnaXN0ZXIodm9pZCk7CiBleHRlcm4gdm9pZCBwY2llX3BvcnRfYnVzX3VucmVnaXN0ZXIodm9pZCk7CiAKICNlbmRpZiAvKiBfUE9SVERSVl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2J1cy5jIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2J1cy5jCmluZGV4IDNlODRiNTAuLjNmMDk3NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9idXMuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfYnVzLmMKQEAgLTI0LDYgKzI0LDcgQEAKIAkuc3VzcGVuZAk9IHBjaWVfcG9ydF9idXNfc3VzcGVuZCwKIAkucmVzdW1lCQk9IHBjaWVfcG9ydF9idXNfcmVzdW1lLCAKIH07CitFWFBPUlRfU1lNQk9MX0dQTChwY2llX3BvcnRfYnVzX3R5cGUpOwogCiBzdGF0aWMgaW50IHBjaWVfcG9ydF9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9jb3JlLmMKaW5kZXggNTVjNjYyMi4uYmQ2NjE1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfY29yZS5jCkBAIC02LDYgKzYsNyBAQAogICogQ29weXJpZ2h0IChDKSBUb20gTG9uZyBOZ3V5ZW4gKHRvbS5sLm5ndXllbkBpbnRlbC5jb20pCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zMzksOCArMzQwLDcgQEAKIAogaW50IHBjaWVfcG9ydF9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZkZXYtPmRldiwgJnN0YXRlLCBzdXNwZW5kX2l0ZXIpOwotCXJldHVybiAwOworCXJldHVybiBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJmRldi0+ZGV2LCAmc3RhdGUsIHN1c3BlbmRfaXRlcik7CiB9CiAKIHN0YXRpYyBpbnQgcmVzdW1lX2l0ZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQpAQCAtMzU4LDggKzM1OCw3IEBACiAKIGludCBwY2llX3BvcnRfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWRldmljZV9mb3JfZWFjaF9jaGlsZCgmZGV2LT5kZXYsIE5VTEwsIHJlc3VtZV9pdGVyKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZkZXYtPmRldiwgTlVMTCwgcmVzdW1lX2l0ZXIpOwogfQogI2VuZGlmCiAKQEAgLTQwMiw5ICs0MDEsOSBAQAogCQlwY2lfZGlzYWJsZV9tc2koZGV2KTsKIH0KIAotdm9pZCBwY2llX3BvcnRfYnVzX3JlZ2lzdGVyKHZvaWQpCitpbnQgX19tdXN0X2NoZWNrIHBjaWVfcG9ydF9idXNfcmVnaXN0ZXIodm9pZCkKIHsKLQlidXNfcmVnaXN0ZXIoJnBjaWVfcG9ydF9idXNfdHlwZSk7CisJcmV0dXJuIGJ1c19yZWdpc3RlcigmcGNpZV9wb3J0X2J1c190eXBlKTsKIH0KIAogdm9pZCBwY2llX3BvcnRfYnVzX3VucmVnaXN0ZXIodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaWUvcG9ydGRydl9wY2kuYwppbmRleCA0NzhkMGQyLi4wMzc2OTBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2llL3BvcnRkcnZfcGNpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9wb3J0ZHJ2X3BjaS5jCkBAIC0xNCw4ICsxNCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpZXBvcnRfaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9hZXIuaD4KIAogI2luY2x1ZGUgInBvcnRkcnYuaCIKKyNpbmNsdWRlICJhZXIvYWVyZHJ2LmgiCiAKIC8qCiAgKiBWZXJzaW9uIEluZm9ybWF0aW9uCkBAIC0zMCw2ICszMiw0MyBAQAogLyogZ2xvYmFsIGRhdGEgKi8KIHN0YXRpYyBjb25zdCBjaGFyIGRldmljZV9uYW1lW10gPSAicGNpZXBvcnQtZHJpdmVyIjsKIAorc3RhdGljIGludCBwY2llX3BvcnRkcnZfc2F2ZV9jb25maWcoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlyZXR1cm4gcGNpX3NhdmVfc3RhdGUoZGV2KTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBwY2llX3BvcnRkcnZfcmVzdG9yZV9jb25maWcoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgcmV0dmFsOworCisJcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKKwlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisJcGNpX3NldF9tYXN0ZXIoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2llX3BvcnRkcnZfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJaW50IHJldCA9IHBjaWVfcG9ydF9kZXZpY2Vfc3VzcGVuZChkZXYsIHN0YXRlKTsKKworCWlmICghcmV0KQorCQlyZXQgPSBwY2llX3BvcnRkcnZfc2F2ZV9jb25maWcoZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBjaWVfcG9ydGRydl9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlwY2llX3BvcnRkcnZfcmVzdG9yZV9jb25maWcoZGV2KTsKKwlyZXR1cm4gcGNpZV9wb3J0X2RldmljZV9yZXN1bWUoZGV2KTsKK30KKyNlbHNlCisjZGVmaW5lIHBjaWVfcG9ydGRydl9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgcGNpZV9wb3J0ZHJ2X3Jlc3VtZSBOVUxMCisjZW5kaWYKKwogLyoKICAqIHBjaWVfcG9ydGRydl9wcm9iZSAtIFByb2JlIFBDSS1FeHByZXNzIHBvcnQgZGV2aWNlcwogICogQGRldjogUENJLUV4cHJlc3MgcG9ydCBkZXZpY2UgYmVpbmcgcHJvYmVkCkBAIC02MSw2ICsxMDAsMTAgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJcGNpZV9wb3J0ZHJ2X3NhdmVfY29uZmlnKGRldik7CisKKwlwY2lfZW5hYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKGRldik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzAsMzkgKzExMywxNTEgQEAKIAlrZnJlZShwY2lfZ2V0X2RydmRhdGEoZGV2KSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgcGNpZV9wb3J0ZHJ2X3NhdmVfY29uZmlnKHN0cnVjdCBwY2lfZGV2ICpkZXYpCitzdGF0aWMgaW50IGVycm9yX2RldGVjdGVkX2l0ZXIoc3RydWN0IGRldmljZSAqZGV2aWNlLCB2b2lkICpkYXRhKQogewotCXJldHVybiBwY2lfc2F2ZV9zdGF0ZShkZXYpOwotfQorCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZV9kZXZpY2U7CisJc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciAqZHJpdmVyOworCXN0cnVjdCBhZXJfYnJvYWRjYXN0X2RhdGEgKnJlc3VsdF9kYXRhOworCXBjaV9lcnNfcmVzdWx0X3Qgc3RhdHVzOwogCi1zdGF0aWMgaW50IHBjaWVfcG9ydGRydl9yZXN0b3JlX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCWludCByZXR2YWw7CisJcmVzdWx0X2RhdGEgPSAoc3RydWN0IGFlcl9icm9hZGNhc3RfZGF0YSAqKSBkYXRhOwogCi0JcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKLQlyZXR2YWwgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7Ci0JcGNpX3NldF9tYXN0ZXIoZGV2KTsKKwlpZiAoZGV2aWNlLT5idXMgPT0gJnBjaWVfcG9ydF9idXNfdHlwZSAmJiBkZXZpY2UtPmRyaXZlcikgeworCQlkcml2ZXIgPSB0b19zZXJ2aWNlX2RyaXZlcihkZXZpY2UtPmRyaXZlcik7CisJCWlmICghZHJpdmVyIHx8CisJCQkhZHJpdmVyLT5lcnJfaGFuZGxlciB8fAorCQkJIWRyaXZlci0+ZXJyX2hhbmRsZXItPmVycm9yX2RldGVjdGVkKQorCQkJcmV0dXJuIDA7CisKKwkJcGNpZV9kZXZpY2UgPSB0b19wY2llX2RldmljZShkZXZpY2UpOworCisJCS8qIEZvcndhcmQgZXJyb3IgZGV0ZWN0ZWQgbWVzc2FnZSB0byBzZXJ2aWNlIGRyaXZlcnMgKi8KKwkJc3RhdHVzID0gZHJpdmVyLT5lcnJfaGFuZGxlci0+ZXJyb3JfZGV0ZWN0ZWQoCisJCQlwY2llX2RldmljZS0+cG9ydCwKKwkJCXJlc3VsdF9kYXRhLT5zdGF0ZSk7CisJCXJlc3VsdF9kYXRhLT5yZXN1bHQgPQorCQkJbWVyZ2VfcmVzdWx0KHJlc3VsdF9kYXRhLT5yZXN1bHQsIHN0YXR1cyk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGNpZV9wb3J0ZHJ2X3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IHBjaWVfcG9ydGRydl9lcnJvcl9kZXRlY3RlZChzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQllbnVtIHBjaV9jaGFubmVsX3N0YXRlIGVycm9yKQogewotCWludCByZXQgPSBwY2llX3BvcnRfZGV2aWNlX3N1c3BlbmQoZGV2LCBzdGF0ZSk7CisJc3RydWN0IGFlcl9icm9hZGNhc3RfZGF0YSByZXN1bHRfZGF0YSA9CisJCQl7ZXJyb3IsIFBDSV9FUlNfUkVTVUxUX0NBTl9SRUNPVkVSfTsKKwlpbnQgcmV0dmFsOwogCi0JaWYgKCFyZXQpCi0JCXJldCA9IHBjaWVfcG9ydGRydl9zYXZlX2NvbmZpZyhkZXYpOwotCXJldHVybiByZXQ7CisJLyogY2FuIG5vdCBmYWlsICovCisJcmV0dmFsID0gZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZkZXYtPmRldiwgJnJlc3VsdF9kYXRhLCBlcnJvcl9kZXRlY3RlZF9pdGVyKTsKKworCXJldHVybiByZXN1bHRfZGF0YS5yZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgcGNpZV9wb3J0ZHJ2X3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyBpbnQgbW1pb19lbmFibGVkX2l0ZXIoc3RydWN0IGRldmljZSAqZGV2aWNlLCB2b2lkICpkYXRhKQogewotCXBjaWVfcG9ydGRydl9yZXN0b3JlX2NvbmZpZyhkZXYpOwotCXJldHVybiBwY2llX3BvcnRfZGV2aWNlX3Jlc3VtZShkZXYpOworCXN0cnVjdCBwY2llX2RldmljZSAqcGNpZV9kZXZpY2U7CisJc3RydWN0IHBjaWVfcG9ydF9zZXJ2aWNlX2RyaXZlciAqZHJpdmVyOworCXBjaV9lcnNfcmVzdWx0X3Qgc3RhdHVzLCAqcmVzdWx0OworCisJcmVzdWx0ID0gKHBjaV9lcnNfcmVzdWx0X3QgKikgZGF0YTsKKworCWlmIChkZXZpY2UtPmJ1cyA9PSAmcGNpZV9wb3J0X2J1c190eXBlICYmIGRldmljZS0+ZHJpdmVyKSB7CisJCWRyaXZlciA9IHRvX3NlcnZpY2VfZHJpdmVyKGRldmljZS0+ZHJpdmVyKTsKKwkJaWYgKGRyaXZlciAmJgorCQkJZHJpdmVyLT5lcnJfaGFuZGxlciAmJgorCQkJZHJpdmVyLT5lcnJfaGFuZGxlci0+bW1pb19lbmFibGVkKSB7CisJCQlwY2llX2RldmljZSA9IHRvX3BjaWVfZGV2aWNlKGRldmljZSk7CisKKwkJCS8qIEZvcndhcmQgZXJyb3IgbWVzc2FnZSB0byBzZXJ2aWNlIGRyaXZlcnMgKi8KKwkJCXN0YXR1cyA9IGRyaXZlci0+ZXJyX2hhbmRsZXItPm1taW9fZW5hYmxlZCgKKwkJCQkJcGNpZV9kZXZpY2UtPnBvcnQpOworCQkJKnJlc3VsdCA9IG1lcmdlX3Jlc3VsdCgqcmVzdWx0LCBzdGF0dXMpOworCQl9CisJfQorCisJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKKworc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgcGNpZV9wb3J0ZHJ2X21taW9fZW5hYmxlZChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXBjaV9lcnNfcmVzdWx0X3Qgc3RhdHVzID0gUENJX0VSU19SRVNVTFRfUkVDT1ZFUkVEOworCWludCByZXR2YWw7CisKKwkvKiBnZXQgdHJ1ZSByZXR1cm4gdmFsdWUgZnJvbSAmc3RhdHVzICovCisJcmV0dmFsID0gZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZkZXYtPmRldiwgJnN0YXR1cywgbW1pb19lbmFibGVkX2l0ZXIpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgc2xvdF9yZXNldF9pdGVyKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNpZV9kZXZpY2UgKnBjaWVfZGV2aWNlOworCXN0cnVjdCBwY2llX3BvcnRfc2VydmljZV9kcml2ZXIgKmRyaXZlcjsKKwlwY2lfZXJzX3Jlc3VsdF90IHN0YXR1cywgKnJlc3VsdDsKKworCXJlc3VsdCA9IChwY2lfZXJzX3Jlc3VsdF90ICopIGRhdGE7CisKKwlpZiAoZGV2aWNlLT5idXMgPT0gJnBjaWVfcG9ydF9idXNfdHlwZSAmJiBkZXZpY2UtPmRyaXZlcikgeworCQlkcml2ZXIgPSB0b19zZXJ2aWNlX2RyaXZlcihkZXZpY2UtPmRyaXZlcik7CisJCWlmIChkcml2ZXIgJiYKKwkJCWRyaXZlci0+ZXJyX2hhbmRsZXIgJiYKKwkJCWRyaXZlci0+ZXJyX2hhbmRsZXItPnNsb3RfcmVzZXQpIHsKKwkJCXBjaWVfZGV2aWNlID0gdG9fcGNpZV9kZXZpY2UoZGV2aWNlKTsKKworCQkJLyogRm9yd2FyZCBlcnJvciBtZXNzYWdlIHRvIHNlcnZpY2UgZHJpdmVycyAqLworCQkJc3RhdHVzID0gZHJpdmVyLT5lcnJfaGFuZGxlci0+c2xvdF9yZXNldCgKKwkJCQkJcGNpZV9kZXZpY2UtPnBvcnQpOworCQkJKnJlc3VsdCA9IG1lcmdlX3Jlc3VsdCgqcmVzdWx0LCBzdGF0dXMpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IHBjaWVfcG9ydGRydl9zbG90X3Jlc2V0KHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJcGNpX2Vyc19yZXN1bHRfdCBzdGF0dXM7CisJaW50IHJldHZhbDsKKworCS8qIElmIGZhdGFsLCByZXN0b3JlIGNmZyBzcGFjZSBmb3IgcG9zc2libGUgbGluayByZXNldCBhdCB1cHN0cmVhbSAqLworCWlmIChkZXYtPmVycm9yX3N0YXRlID09IHBjaV9jaGFubmVsX2lvX2Zyb3plbikgeworCQlwY2llX3BvcnRkcnZfcmVzdG9yZV9jb25maWcoZGV2KTsKKwkJcGNpX2VuYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhkZXYpOworCX0KKworCS8qIGdldCB0cnVlIHJldHVybiB2YWx1ZSBmcm9tICZzdGF0dXMgKi8KKwlyZXR2YWwgPSBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJmRldi0+ZGV2LCAmc3RhdHVzLCBzbG90X3Jlc2V0X2l0ZXIpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCByZXN1bWVfaXRlcihzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBjaWVfZGV2aWNlICpwY2llX2RldmljZTsKKwlzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfZHJpdmVyICpkcml2ZXI7CisKKwlpZiAoZGV2aWNlLT5idXMgPT0gJnBjaWVfcG9ydF9idXNfdHlwZSAmJiBkZXZpY2UtPmRyaXZlcikgeworCQlkcml2ZXIgPSB0b19zZXJ2aWNlX2RyaXZlcihkZXZpY2UtPmRyaXZlcik7CisJCWlmIChkcml2ZXIgJiYKKwkJCWRyaXZlci0+ZXJyX2hhbmRsZXIgJiYKKwkJCWRyaXZlci0+ZXJyX2hhbmRsZXItPnJlc3VtZSkgeworCQkJcGNpZV9kZXZpY2UgPSB0b19wY2llX2RldmljZShkZXZpY2UpOworCisJCQkvKiBGb3J3YXJkIGVycm9yIG1lc3NhZ2UgdG8gc2VydmljZSBkcml2ZXJzICovCisJCQlkcml2ZXItPmVycl9oYW5kbGVyLT5yZXN1bWUocGNpZV9kZXZpY2UtPnBvcnQpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBjaWVfcG9ydGRydl9lcnJfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaW50IHJldHZhbDsKKwkvKiBub3RoaW5nIHRvIGRvIHdpdGggZXJyb3IgdmFsdWUsIGlmIGl0IGV2ZXIgaGFwcGVucyAqLworCXJldHZhbCA9IGRldmljZV9mb3JfZWFjaF9jaGlsZCgmZGV2LT5kZXYsIE5VTEwsIHJlc3VtZV9pdGVyKTsKK30KIAogLyoKICAqIExJTlVYIERldmljZSBEcml2ZXIgTW9kZWwKQEAgLTExNCw2ICsyNjksMTMgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcG9ydF9wY2lfaWRzKTsKIAorc3RhdGljIHN0cnVjdCBwY2lfZXJyb3JfaGFuZGxlcnMgcGNpZV9wb3J0ZHJ2X2Vycl9oYW5kbGVyID0geworCQkuZXJyb3JfZGV0ZWN0ZWQgPSBwY2llX3BvcnRkcnZfZXJyb3JfZGV0ZWN0ZWQsCisJCS5tbWlvX2VuYWJsZWQgPSBwY2llX3BvcnRkcnZfbW1pb19lbmFibGVkLAorCQkuc2xvdF9yZXNldCA9IHBjaWVfcG9ydGRydl9zbG90X3Jlc2V0LAorCQkucmVzdW1lID0gcGNpZV9wb3J0ZHJ2X2Vycl9yZXN1bWUsCit9OworCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcGNpZV9wb3J0ZHJ2ID0gewogCS5uYW1lCQk9IChjaGFyICopZGV2aWNlX25hbWUsCiAJLmlkX3RhYmxlCT0gJnBvcnRfcGNpX2lkc1swXSwKQEAgLTEyMSwyMCArMjgzLDI1IEBACiAJLnByb2JlCQk9IHBjaWVfcG9ydGRydl9wcm9iZSwKIAkucmVtb3ZlCQk9IHBjaWVfcG9ydGRydl9yZW1vdmUsCiAKLSNpZmRlZglDT05GSUdfUE0KIAkuc3VzcGVuZAk9IHBjaWVfcG9ydGRydl9zdXNwZW5kLAogCS5yZXN1bWUJCT0gcGNpZV9wb3J0ZHJ2X3Jlc3VtZSwKLSNlbmRpZgkvKiBQTSAqLworCisJLmVycl9oYW5kbGVyIAk9ICZwY2llX3BvcnRkcnZfZXJyX2hhbmRsZXIsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBwY2llX3BvcnRkcnZfaW5pdCh2b2lkKQogewotCWludCByZXR2YWwgPSAwOworCWludCByZXR2YWw7CiAKLQlwY2llX3BvcnRfYnVzX3JlZ2lzdGVyKCk7CisJcmV0dmFsID0gcGNpZV9wb3J0X2J1c19yZWdpc3RlcigpOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJRTogYnVzX3JlZ2lzdGVyIGVycm9yOiAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byBvdXQ7CisJfQogCXJldHZhbCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnBjaWVfcG9ydGRydik7CiAJaWYgKHJldHZhbCkKIAkJcGNpZV9wb3J0X2J1c191bnJlZ2lzdGVyKCk7Cisgb3V0OgogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2JlLmMgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCmluZGV4IGM1YTU4ZDEuLmEzYjBhNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2JlLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYmUuYwpAQCAtMzM5LDYgKzMzOSw3IEBACiB7CiAJc3RydWN0IHBjaV9idXMgKmNoaWxkOwogCWludCBpOworCWludCByZXR2YWw7CiAKIAkvKgogCSAqIEFsbG9jYXRlIGEgbmV3IGJ1cywgYW5kIGluaGVyaXQgc3R1ZmYgZnJvbSB0aGUgcGFyZW50Li4KQEAgLTM1Niw4ICszNTcsMTMgQEAKIAogCWNoaWxkLT5jbGFzc19kZXYuY2xhc3MgPSAmcGNpYnVzX2NsYXNzOwogCXNwcmludGYoY2hpbGQtPmNsYXNzX2Rldi5jbGFzc19pZCwgIiUwNHg6JTAyeCIsIHBjaV9kb21haW5fbnIoY2hpbGQpLCBidXNucik7Ci0JY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZjaGlsZC0+Y2xhc3NfZGV2KTsKLQljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoJmNoaWxkLT5jbGFzc19kZXYsICZjbGFzc19kZXZpY2VfYXR0cl9jcHVhZmZpbml0eSk7CisJcmV0dmFsID0gY2xhc3NfZGV2aWNlX3JlZ2lzdGVyKCZjaGlsZC0+Y2xhc3NfZGV2KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm9yX3JlZ2lzdGVyOworCXJldHZhbCA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZSgmY2hpbGQtPmNsYXNzX2RldiwKKwkJCQkJICAmY2xhc3NfZGV2aWNlX2F0dHJfY3B1YWZmaW5pdHkpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3JfZmlsZV9jcmVhdGU7CiAKIAkvKgogCSAqIFNldCB1cCB0aGUgcHJpbWFyeSwgc2Vjb25kYXJ5IGFuZCBzdWJvcmRpbmF0ZQpAQCAtMzc1LDYgKzM4MSwxMiBAQAogCWJyaWRnZS0+c3Vib3JkaW5hdGUgPSBjaGlsZDsKIAogCXJldHVybiBjaGlsZDsKKworZXJyb3JfZmlsZV9jcmVhdGU6CisJY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoJmNoaWxkLT5jbGFzc19kZXYpOworZXJyb3JfcmVnaXN0ZXI6CisJa2ZyZWUoY2hpbGQpOworCXJldHVybiBOVUxMOwogfQogCiBzdHJ1Y3QgcGNpX2J1cyAqIF9fZGV2aW5pdCBwY2lfYWRkX25ld19idXMoc3RydWN0IHBjaV9idXMgKnBhcmVudCwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJ1c25yKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcXVpcmtzLmMgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwppbmRleCBkZWY3OGEyLi4wOGNkODZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9xdWlya3MuYworKysgYi9kcml2ZXJzL3BjaS9xdWlya3MuYwpAQCAtNTc3LDggKzU3Nyw2IEBACiB9CiBERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX1NJLAlQQ0lfQU5ZX0lELAkJCXF1aXJrX2lvYXBpY19ybXcgKTsKIAotaW50IHBjaV9tc2lfcXVpcms7Ci0KICNkZWZpbmUgQU1EODEzMV9yZXZBMCAgICAgICAgMHgwMQogI2RlZmluZSBBTUQ4MTMxX3JldkIwICAgICAgICAweDExCiAjZGVmaW5lIEFNRDgxMzFfTUlTQyAgICAgICAgIDB4NDAKQEAgLTU4NywxMiArNTg1LDYgQEAKIHsgCiAgICAgICAgIHVuc2lnbmVkIGNoYXIgcmV2aWQsIHRtcDsKICAgICAgICAgCi0JaWYgKGRldi0+c3Vib3JkaW5hdGUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBNU0kgcXVpcmsgZGV0ZWN0ZWQuICIKLQkJICAgICAgICJQQ0lfQlVTX0ZMQUdTX05PX01TSSBzZXQgZm9yIHN1Ym9yZGluYXRlIGJ1cy5cbiIpOwotCQlkZXYtPnN1Ym9yZGluYXRlLT5idXNfZmxhZ3MgfD0gUENJX0JVU19GTEFHU19OT19NU0k7Ci0JfQotCiAgICAgICAgIGlmIChucl9pb2FwaWNzID09IDApIAogICAgICAgICAgICAgICAgIHJldHVybjsKIApAQCAtNjA1LDEzICs1OTcsNiBAQAogICAgICAgICB9CiB9IAogREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzgxMzFfQlJJREdFLCBxdWlya19hbWRfODEzMV9pb2FwaWMpOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgcXVpcmtfc3Z3X21zaShzdHJ1Y3QgcGNpX2RldiAqZGV2KQotewotCXBjaV9tc2lfcXVpcmsgPSAxOwotCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSTogTVNJIHF1aXJrIGRldGVjdGVkLiBwY2lfbXNpX3F1aXJrIHNldC5cbiIpOwotfQotREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUywgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19HQ05CX0xFLCBxdWlya19zdndfbXNpICk7CiAjZW5kaWYgLyogQ09ORklHX1g4Nl9JT19BUElDICovCiAKIApAQCAtMTY5MCw2ICsxNjc1LDk1IEBACiBERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX05WSURJQSwgIFBDSV9ERVZJQ0VfSURfTlZJRElBX0NLODA0X1BDSUUsCiAJCQlxdWlya19udmlkaWFfY2s4MDRfcGNpZV9hZXJfZXh0X2NhcCk7CiAKKyNpZmRlZiBDT05GSUdfUENJX01TSQorLyogVG8gZGlzYWJsZSBNU0kgZ2xvYmFsbHkgKi8KK2ludCBwY2lfbXNpX3F1aXJrOworCisvKiBUaGUgU2VydmVyd29ya3MgUENJLVggY2hpcHNldCBkb2VzIG5vdCBzdXBwb3J0IE1TSS4gV2UgY2Fubm90IGVhc2lseSByZWx5CisgKiBvbiBzZXR0aW5nIFBDSV9CVVNfRkxBR1NfTk9fTVNJIGluIGl0cyBidXMgZmxhZ3MgYmVjYXVzZSB0aGVyZSBhcmUgYWN0dWFsbHkKKyAqIHNvbWUgb3RoZXIgYnVzc2VzIGNvbnRyb2xsZWQgYnkgdGhlIGNoaXBzZXQgZXZlbiBpZiBMaW51eCBpcyBub3QgYXdhcmUgb2YgaXQuCisgKiBJbnN0ZWFkIG9mIHNldHRpbmcgdGhlIGZsYWcgb24gYWxsIGJ1c3NlcyBpbiB0aGUgbWFjaGluZSwgc2ltcGx5IGRpc2FibGUgTVNJCisgKiBnbG9iYWxseS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHF1aXJrX3N2d19tc2koc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlwY2lfbXNpX3F1aXJrID0gMTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IE1TSSBxdWlyayBkZXRlY3RlZC4gcGNpX21zaV9xdWlyayBzZXQuXG4iKTsKK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MsIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfR0NOQl9MRSwgcXVpcmtfc3Z3X21zaSk7CisKKy8qIERpc2FibGUgTVNJIG9uIGNoaXBzZXRzIHRoYXQgYXJlIGtub3duIHRvIG5vdCBzdXBwb3J0IGl0ICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfZGlzYWJsZV9tc2koc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpZiAoZGV2LT5zdWJvcmRpbmF0ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IE1TSSBxdWlyayBkZXRlY3RlZC4gIgorCQkgICAgICAgIlBDSV9CVVNfRkxBR1NfTk9fTVNJIHNldCBmb3IgJXMgc3Vib3JkaW5hdGUgYnVzLlxuIiwKKwkJICAgICAgIHBjaV9uYW1lKGRldikpOworCQlkZXYtPnN1Ym9yZGluYXRlLT5idXNfZmxhZ3MgfD0gUENJX0JVU19GTEFHU19OT19NU0k7CisJfQorfQorREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzgxMzFfQlJJREdFLCBxdWlya19kaXNhYmxlX21zaSk7CisKKy8qIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgSHlwZXJ0cmFuc3BvcnQgY2FwYWJpbGl0aWVzIGFuZAorICogcmV0dXJuIDEgaWYgYSBIVCBNU0kgY2FwYWJpbGl0eSBpcyBmb3VuZCBhbmQgZW5hYmxlZCAqLworc3RhdGljIGludCBfX2RldmluaXQgbXNpX2h0X2NhcF9lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTggcG9zOworCWludCB0dGw7CisJZm9yIChwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KGRldiwgUENJX0NBUF9JRF9IVCksIHR0bCA9IDQ4OworCSAgICAgcG9zICYmIHR0bDsKKwkgICAgIHBvcyA9IHBjaV9maW5kX25leHRfY2FwYWJpbGl0eShkZXYsIHBvcywgUENJX0NBUF9JRF9IVCksIHR0bC0tKSB7CisJCXUzMiBjYXBfaGRyOworCQkvKiBNU0kgbWFwcGluZyBzZWN0aW9uIGFjY29yZGluZyB0byBIeXBlcnRyYW5zcG9ydCBzcGVjICovCisJCWlmIChwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MsICZjYXBfaGRyKSA9PSAwCisJCSAgICAmJiAoY2FwX2hkciAmIDB4ZjgwMDAwMDApID09IDB4YTgwMDAwMDAgLyogTVNJIG1hcHBpbmcgKi8pIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIlBDSTogRm91bmQgSFQgTVNJIG1hcHBpbmcgb24gJXMgd2l0aCBjYXBhYmlsaXR5ICVzXG4iLAorCQkJICAgICAgIHBjaV9uYW1lKGRldiksIGNhcF9oZHIgJiAweDEwMDAwID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJCQlyZXR1cm4gKGNhcF9oZHIgJiAweDEwMDAwKSAhPSAwOyAvKiBNU0kgbWFwcGluZyBjYXAgZW5hYmxlZCAqLworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBDaGVjayB0aGUgaHlwZXJ0cmFuc3BvcnQgTVNJIG1hcHBpbmcgdG8ga25vdyB3aGV0aGVyIE1TSSBpcyBlbmFibGVkIG9yIG5vdCAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX21zaV9odF9jYXAoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpZiAoZGV2LT5zdWJvcmRpbmF0ZSAmJiAhbXNpX2h0X2NhcF9lbmFibGVkKGRldikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBNU0kgcXVpcmsgZGV0ZWN0ZWQuICIKKwkJICAgICAgICJNU0kgZGlzYWJsZWQgb24gY2hpcHNldCAlcy5cbiIsCisJCSAgICAgICBwY2lfbmFtZShkZXYpKTsKKwkJZGV2LT5zdWJvcmRpbmF0ZS0+YnVzX2ZsYWdzIHw9IFBDSV9CVVNfRkxBR1NfTk9fTVNJOworCX0KK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfU0VSVkVSV09SS1MsIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfSFQyMDAwX1BDSUUsCisJCQlxdWlya19tc2lfaHRfY2FwKTsKKworLyogVGhlIG5WaWRpYSBDSzgwNCBjaGlwc2V0IG1heSBoYXZlIDIgSFQgTVNJIG1hcHBpbmdzLgorICogTVNJIGFyZSBzdXBwb3J0ZWQgaWYgdGhlIE1TSSBjYXBhYmlsaXR5IHNldCBpbiBhbnkgb2YgdGhlc2UgbWFwcGluZ3MuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya19udmlkaWFfY2s4MDRfbXNpX2h0X2NhcChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCisJaWYgKCFkZXYtPnN1Ym9yZGluYXRlKQorCQlyZXR1cm47CisKKwkvKiBjaGVjayBIVCBNU0kgY2FwIG9uIHRoaXMgY2hpcHNldCBhbmQgdGhlIHJvb3Qgb25lLgorCSAqIGEgc2luZ2xlIG9uZSBoYXZpbmcgTVNJIGlzIGVub3VnaCB0byBiZSBzdXJlIHRoYXQgTVNJIGFyZSBzdXBwb3J0ZWQuCisJICovCisJcGRldiA9IHBjaV9maW5kX3Nsb3QoZGV2LT5idXMtPm51bWJlciwgMCk7CisJaWYgKGRldi0+c3Vib3JkaW5hdGUgJiYgIW1zaV9odF9jYXBfZW5hYmxlZChkZXYpCisJICAgICYmICFtc2lfaHRfY2FwX2VuYWJsZWQocGRldikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBNU0kgcXVpcmsgZGV0ZWN0ZWQuICIKKwkJICAgICAgICJNU0kgZGlzYWJsZWQgb24gY2hpcHNldCAlcy5cbiIsCisJCSAgICAgICBwY2lfbmFtZShkZXYpKTsKKwkJZGV2LT5zdWJvcmRpbmF0ZS0+YnVzX2ZsYWdzIHw9IFBDSV9CVVNfRkxBR1NfTk9fTVNJOworCX0KK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9DSzgwNF9QQ0lFLAorCQkJcXVpcmtfbnZpZGlhX2NrODA0X21zaV9odF9jYXApOworI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCisKIEVYUE9SVF9TWU1CT0wocGNpZV9tY2hfcXVpcmspOwogI2lmZGVmIENPTkZJR19IT1RQTFVHCiBFWFBPUlRfU1lNQk9MKHBjaV9maXh1cF9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcmVtb3ZlLmMgYi9kcml2ZXJzL3BjaS9yZW1vdmUuYwppbmRleCA5OWZmYmQ0Li40MzAyODFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9yZW1vdmUuYworKysgYi9kcml2ZXJzL3BjaS9yZW1vdmUuYwpAQCAtMTYsOCArMTYsMTEgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHBjaV9kZXN0cm95X2RldihzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgcGNpX3N0b3BfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CisJaWYgKCFkZXYtPmdsb2JhbF9saXN0Lm5leHQpCisJCXJldHVybjsKKwogCWlmICghbGlzdF9lbXB0eSgmZGV2LT5nbG9iYWxfbGlzdCkpIHsKIAkJcGNpX3Byb2NfZGV0YWNoX2RldmljZShkZXYpOwogCQlwY2lfcmVtb3ZlX3N5c2ZzX2Rldl9maWxlcyhkZXYpOwpAQCAtMjcsNiArMzAsMTEgQEAKIAkJZGV2LT5nbG9iYWxfbGlzdC5uZXh0ID0gZGV2LT5nbG9iYWxfbGlzdC5wcmV2ID0gTlVMTDsKIAkJdXBfd3JpdGUoJnBjaV9idXNfc2VtKTsKIAl9Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9kZXN0cm95X2RldihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXBjaV9zdG9wX2RldihkZXYpOwogCiAJLyogUmVtb3ZlIHRoZSBkZXZpY2UgZnJvbSB0aGUgZGV2aWNlIGxpc3RzLCBhbmQgcHJldmVudCBhbnkgZnVydGhlcgogCSAqIGxpc3QgYWNjZXNzZXMgZnJvbSB0aGlzIGRldmljZSAqLwpAQCAtMTE5LDUgKzEyNywzMiBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgcGNpX3N0b3BfYnVzX2RldmljZXMoc3RydWN0IHBjaV9idXMgKmJ1cykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsLCAqbjsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShsLCBuLCAmYnVzLT5kZXZpY2VzKSB7CisJCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBwY2lfZGV2X2IobCk7CisJCXBjaV9zdG9wX2J1c19kZXZpY2UoZGV2KTsKKwl9Cit9CisKKy8qKgorICogcGNpX3N0b3BfYnVzX2RldmljZSAtIHN0b3AgYSBQQ0kgZGV2aWNlIGFuZCBhbnkgY2hpbGRyZW4KKyAqIEBkZXY6IHRoZSBkZXZpY2UgdG8gc3RvcAorICoKKyAqIFN0b3AgYSBQQ0kgZGV2aWNlIChkZXRhY2ggdGhlIGRyaXZlciwgcmVtb3ZlIGZyb20gdGhlIGdsb2JhbCBsaXN0CisgKiBhbmQgc28gb24pLiBUaGlzIGFsc28gc3RvcCBhbnkgc3Vib3JkaW5hdGUgYnVzZXMgYW5kIGNoaWxkcmVuIGluIGEKKyAqIGRlcHRoLWZpcnN0IG1hbm5lci4KKyAqLwordm9pZCBwY2lfc3RvcF9idXNfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJaWYgKGRldi0+c3Vib3JkaW5hdGUpCisJCXBjaV9zdG9wX2J1c19kZXZpY2VzKGRldi0+c3Vib3JkaW5hdGUpOworCisJcGNpX3N0b3BfZGV2KGRldik7Cit9CisKIEVYUE9SVF9TWU1CT0wocGNpX3JlbW92ZV9idXNfZGV2aWNlKTsKIEVYUE9SVF9TWU1CT0wocGNpX3JlbW92ZV9iZWhpbmRfYnJpZGdlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9zdG9wX2J1c19kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwppbmRleCA0N2MxMDcxLi41NDQwNDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwpAQCAtNTUsMTIgKzU1LDE5IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CiAJCXUxNiBjbGFzcyA9IGRldi0+Y2xhc3MgPj4gODsKIAotCQkvKiBEb24ndCB0b3VjaCBjbGFzc2xlc3MgZGV2aWNlcyBvciBob3N0IGJyaWRnZXMgb3IgaW9hcGljcy4gICovCisJCS8qIERvbid0IHRvdWNoIGNsYXNzbGVzcyBkZXZpY2VzIG9yIGhvc3QgYnJpZGdlcy4gKi8KIAkJaWYgKGNsYXNzID09IFBDSV9DTEFTU19OT1RfREVGSU5FRCB8fAotCQkgICAgY2xhc3MgPT0gUENJX0NMQVNTX0JSSURHRV9IT1NUIHx8Ci0JCSAgICBjbGFzcyA9PSBQQ0lfQ0xBU1NfU1lTVEVNX1BJQykKKwkJICAgIGNsYXNzID09IFBDSV9DTEFTU19CUklER0VfSE9TVCkKIAkJCWNvbnRpbnVlOwogCisJCS8qIERvbid0IHRvdWNoIGlvYXBpY3MgaWYgaXQgaGFzIHRoZSBhc3NpZ25lZCByZXNvdXJjZXMuICovCisJCWlmIChjbGFzcyA9PSBQQ0lfQ0xBU1NfU1lTVEVNX1BJQykgeworCQkJcmVzID0gJmRldi0+cmVzb3VyY2VbMF07CisJCQlpZiAocmVzWzBdLnN0YXJ0IHx8IHJlc1sxXS5zdGFydCB8fCByZXNbMl0uc3RhcnQgfHwKKwkJCSAgICByZXNbM10uc3RhcnQgfHwgcmVzWzRdLnN0YXJ0IHx8IHJlc1s1XS5zdGFydCkKKwkJCQljb250aW51ZTsKKwkJfQorCiAJCXBkZXZfc29ydF9yZXNvdXJjZXMoZGV2LCAmaGVhZCk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9LY29uZmlnIGIvZHJpdmVycy9ydGMvS2NvbmZpZwppbmRleCA3ZmYxZDg4Li4zM2E3YjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9LY29uZmlnCisrKyBiL2RyaXZlcnMvcnRjL0tjb25maWcKQEAgLTIzOCw2ICsyMzgsMTYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJ0Yy1zYTExMDAuCiAKK2NvbmZpZyBSVENfRFJWX1NICisJdHJpc3RhdGUgIlN1cGVySCBPbi1DaGlwIFJUQyIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBTVVBFUkgKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciB0aGUgb24tY2hpcCBSVEMgZm91bmQgaW4KKwkgIG1vc3QgU3VwZXJIIHByb2Nlc3NvcnMuCisKKyAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBydGMtc2guCisKIGNvbmZpZyBSVENfRFJWX1ZSNDFYWAogCXRyaXN0YXRlICJORUMgVlI0MVhYIgogCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIENQVV9WUjQxWFgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL01ha2VmaWxlIGIvZHJpdmVycy9ydGMvTWFrZWZpbGUKaW5kZXggYmJjZmIwOS4uZTcyZDQ2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9ydGMvTWFrZWZpbGUKQEAgLTMxLDMgKzMxLDQgQEAKIG9iai0kKENPTkZJR19SVENfRFJWX01BWDY5MDIpCSs9IHJ0Yy1tYXg2OTAyLm8KIG9iai0kKENPTkZJR19SVENfRFJWX1YzMDIwKQkrPSBydGMtdjMwMjAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfQVQ5MSkJKz0gcnRjLWF0OTEubworb2JqLSQoQ09ORklHX1JUQ19EUlZfU0gpCSs9IHJ0Yy1zaC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtc2guYyBiL2RyaXZlcnMvcnRjL3J0Yy1zaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyY2UwYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtc2guYwpAQCAtMCwwICsxLDQ2NyBAQAorLyoKKyAqIFN1cGVySCBPbi1DaGlwIFJUQyBTdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2ICBQYXVsIE11bmR0CisgKgorICogQmFzZWQgb24gdGhlIG9sZCBhcmNoL3NoL2tlcm5lbC9jcHUvcnRjLmMgYnk6CisgKgorICogIENvcHlyaWdodCAoQykgMjAwMCAgUGhpbGlwcCBSdW1wZiA8cHJ1bXBmQHR1eC5vcmc+CisgKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBUZXRzdXlhIE9rYWRhICYgTmlpYmUgWXV0YWthCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaWZkZWYgQ09ORklHX0NQVV9TSDMKKyNkZWZpbmUgcnRjX3JlZ19zaXplCQlzaXplb2YodTE2KQorI2RlZmluZSBSVENfQklUX0lOVkVSVEVECTAJLyogTm8gYnVnIG9uIFNINzcwOCwgU0g3NzA5QSAqLworI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NINCkKKyNkZWZpbmUgcnRjX3JlZ19zaXplCQlzaXplb2YodTMyKQorI2RlZmluZSBSVENfQklUX0lOVkVSVEVECTB4NDAJLyogYnVnIG9uIFNINzc1MCwgU0g3NzUwUyAqLworI2VuZGlmCisKKyNkZWZpbmUgUlRDX1JFRyhyKQkoKHIpICogcnRjX3JlZ19zaXplKQorCisjZGVmaW5lIFI2NENOVCAgCVJUQ19SRUcoMCkKKyNkZWZpbmUgUlNFQ0NOVCAJUlRDX1JFRygxKQorI2RlZmluZSBSTUlOQ05UIAlSVENfUkVHKDIpCisjZGVmaW5lIFJIUkNOVCAgCVJUQ19SRUcoMykKKyNkZWZpbmUgUldLQ05UICAJUlRDX1JFRyg0KQorI2RlZmluZSBSREFZQ05UIAlSVENfUkVHKDUpCisjZGVmaW5lIFJNT05DTlQgCVJUQ19SRUcoNikKKyNkZWZpbmUgUllSQ05UICAJUlRDX1JFRyg3KQorI2RlZmluZSBSU0VDQVIgIAlSVENfUkVHKDgpCisjZGVmaW5lIFJNSU5BUiAgCVJUQ19SRUcoOSkKKyNkZWZpbmUgUkhSQVIgICAJUlRDX1JFRygxMCkKKyNkZWZpbmUgUldLQVIgICAJUlRDX1JFRygxMSkKKyNkZWZpbmUgUkRBWUFSICAJUlRDX1JFRygxMikKKyNkZWZpbmUgUk1PTkFSICAJUlRDX1JFRygxMykKKyNkZWZpbmUgUkNSMSAgICAJUlRDX1JFRygxNCkKKyNkZWZpbmUgUkNSMiAgICAJUlRDX1JFRygxNSkKKworLyogUkNSMSBCaXRzICovCisjZGVmaW5lIFJDUjFfQ0YJCTB4ODAJLyogQ2FycnkgRmxhZyAgICAgICAgICAgICAqLworI2RlZmluZSBSQ1IxX0NJRQkweDEwCS8qIENhcnJ5IEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgUkNSMV9BSUUJMHgwOAkvKiBBbGFybSBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFJDUjFfQUYJCTB4MDEJLyogQWxhcm0gRmxhZyAgICAgICAgICAgICAqLworCisvKiBSQ1IyIEJpdHMgKi8KKyNkZWZpbmUgUkNSMl9QRUYJMHg4MAkvKiBQRXJpb2RpYyBpbnRlcnJ1cHQgRmxhZyAqLworI2RlZmluZSBSQ1IyX1BFU01BU0sJMHg3MAkvKiBQZXJpb2RpYyBpbnRlcnJ1cHQgU2V0ICAqLworI2RlZmluZSBSQ1IyX1JUQ0VOCTB4MDgJLyogRU5hYmxlIFJUQyAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNSMl9BREoJMHgwNAkvKiBBREp1c3RtZW50ICgzMC1zZWNvbmQpICAqLworI2RlZmluZSBSQ1IyX1JFU0VUCTB4MDIJLyogUmVzZXQgYml0ICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkNSMl9TVEFSVAkweDAxCS8qIFN0YXJ0IGJpdCAgICAgICAgICAgICAgICovCisKK3N0cnVjdCBzaF9ydGMgeworCXZvaWQgX19pb21lbSAqcmVnYmFzZTsKKwl1bnNpZ25lZCBsb25nIHJlZ3NpemU7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdW5zaWduZWQgaW50IGFsYXJtX2lycSwgcGVyaW9kaWNfaXJxLCBjYXJyeV9pcnE7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0Y19kZXY7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworc3RhdGljIGlycXJldHVybl90IHNoX3J0Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBpZDsKKwlzdHJ1Y3Qgc2hfcnRjICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBpbnQgdG1wLCBldmVudHMgPSAwOworCisJc3Bpbl9sb2NrKCZydGMtPmxvY2spOworCisJdG1wID0gcmVhZGIocnRjLT5yZWdiYXNlICsgUkNSMSk7CisKKwlpZiAodG1wICYgUkNSMV9BRikKKwkJZXZlbnRzIHw9IFJUQ19BRiB8IFJUQ19JUlFGOworCisJdG1wICY9IH4oUkNSMV9DRiB8IFJDUjFfQUYpOworCisJd3JpdGViKHRtcCwgcnRjLT5yZWdiYXNlICsgUkNSMSk7CisKKwlydGNfdXBkYXRlX2lycSgmcnRjLT5ydGNfZGV2LT5jbGFzc19kZXYsIDEsIGV2ZW50cyk7CisKKwlzcGluX3VubG9jaygmcnRjLT5sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHNoX3J0Y19wZXJpb2RpYyhpbnQgaXJxLCB2b2lkICppZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHNoX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGlkKTsKKworCXNwaW5fbG9jaygmcnRjLT5sb2NrKTsKKworCXJ0Y191cGRhdGVfaXJxKCZydGMtPnJ0Y19kZXYtPmNsYXNzX2RldiwgMSwgUlRDX1BGIHwgUlRDX0lSUUYpOworCisJc3Bpbl91bmxvY2soJnJ0Yy0+bG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaF9ydGNfc2V0cGllKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgc2hfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJc3Bpbl9sb2NrX2lycSgmcnRjLT5sb2NrKTsKKworCXRtcCA9IHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJDUjIpOworCisJaWYgKGVuYWJsZSkgeworCQl0bXAgJj0gflJDUjJfUEVTTUFTSzsKKwkJdG1wIHw9IFJDUjJfUEVGIHwgKDIgPDwgNCk7CisJfSBlbHNlCisJCXRtcCAmPSB+KFJDUjJfUEVTTUFTSyB8IFJDUjJfUEVGKTsKKworCXdyaXRlYih0bXAsIHJ0Yy0+cmVnYmFzZSArIFJDUjIpOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2hfcnRjX3NldGFpZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGUpCit7CisJc3RydWN0IHNoX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwl0bXAgPSByZWFkYihydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKKworCWlmIChlbmFibGUpCisJCXRtcCB8PSBSQ1IxX0FJRTsKKwllbHNlCisJCXRtcCAmPSB+UkNSMV9BSUU7CisKKwl3cml0ZWIodG1wLCBydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5sb2NrKTsKK30KKworc3RhdGljIGludCBzaF9ydGNfb3BlbihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNoX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IHRtcDsKKwlpbnQgcmV0OworCisJdG1wID0gcmVhZGIocnRjLT5yZWdiYXNlICsgUkNSMSk7CisJdG1wICY9IH5SQ1IxX0NGOworCXRtcCB8PSBSQ1IxX0NJRTsKKwl3cml0ZWIodG1wLCBydGMtPnJlZ2Jhc2UgKyBSQ1IxKTsKKworCXJldCA9IHJlcXVlc3RfaXJxKHJ0Yy0+cGVyaW9kaWNfaXJxLCBzaF9ydGNfcGVyaW9kaWMsIFNBX0lOVEVSUlVQVCwKKwkJCSAgInNoLXJ0YyBwZXJpb2QiLCBkZXYpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCWRldl9lcnIoZGV2LCAicmVxdWVzdCBwZXJpb2QgSVJRIGZhaWxlZCB3aXRoICVkLCBJUlEgJWRcbiIsCisJCQlyZXQsIHJ0Yy0+cGVyaW9kaWNfaXJxKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShydGMtPmNhcnJ5X2lycSwgc2hfcnRjX2ludGVycnVwdCwgU0FfSU5URVJSVVBULAorCQkJICAic2gtcnRjIGNhcnJ5IiwgZGV2KTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlkZXZfZXJyKGRldiwgInJlcXVlc3QgY2FycnkgSVJRIGZhaWxlZCB3aXRoICVkLCBJUlEgJWRcbiIsCisJCQlyZXQsIHJ0Yy0+Y2FycnlfaXJxKTsKKwkJZnJlZV9pcnEocnRjLT5wZXJpb2RpY19pcnEsIGRldik7CisJCWdvdG8gZXJyX2JhZF9jYXJyeTsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShydGMtPmFsYXJtX2lycSwgc2hfcnRjX2ludGVycnVwdCwgU0FfSU5URVJSVVBULAorCQkJICAic2gtcnRjIGFsYXJtIiwgZGV2KTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlkZXZfZXJyKGRldiwgInJlcXVlc3QgYWxhcm0gSVJRIGZhaWxlZCB3aXRoICVkLCBJUlEgJWRcbiIsCisJCQlyZXQsIHJ0Yy0+YWxhcm1faXJxKTsKKwkJZ290byBlcnJfYmFkX2FsYXJtOworCX0KKworCXJldHVybiAwOworCitlcnJfYmFkX2FsYXJtOgorCWZyZWVfaXJxKHJ0Yy0+Y2FycnlfaXJxLCBkZXYpOworZXJyX2JhZF9jYXJyeToKKwlmcmVlX2lycShydGMtPnBlcmlvZGljX2lycSwgZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNoX3J0Y19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc2hfcnRjICpydGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXNoX3J0Y19zZXRwaWUoZGV2LCAwKTsKKworCWZyZWVfaXJxKHJ0Yy0+cGVyaW9kaWNfaXJxLCBkZXYpOworCWZyZWVfaXJxKHJ0Yy0+Y2FycnlfaXJxLCBkZXYpOworCWZyZWVfaXJxKHJ0Yy0+YWxhcm1faXJxLCBkZXYpOworfQorCitzdGF0aWMgaW50IHNoX3J0Y19wcm9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNlcV9maWxlICpzZXEpCit7CisJc3RydWN0IHNoX3J0YyAqcnRjID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgaW50IHRtcDsKKworCXRtcCA9IHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJDUjEpOworCXNlcV9wcmludGYoc2VxLCAiYWxhcm1fSVJRXHQ6ICVzXG4iLAorCQkgICAodG1wICYgUkNSMV9BSUUpID8gInllcyIgOiAibm8iKTsKKwlzZXFfcHJpbnRmKHNlcSwgImNhcnJ5X0lSUVx0OiAlc1xuIiwKKwkJICAgKHRtcCAmIFJDUjFfQ0lFKSA/ICJ5ZXMiIDogIm5vIik7CisKKwl0bXAgPSByZWFkYihydGMtPnJlZ2Jhc2UgKyBSQ1IyKTsKKwlzZXFfcHJpbnRmKHNlcSwgInBlcmlvZGljX0lSUVx0OiAlc1xuIiwKKwkJICAgKHRtcCAmIFJDUjJfUEVGKSA/ICJ5ZXMiIDogIm5vIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaF9ydGNfaW9jdGwoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBpbnQgcmV0ID0gLUVOT0lPQ1RMQ01EOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19QSUVfT0ZGOgorCWNhc2UgUlRDX1BJRV9PTjoKKwkJc2hfcnRjX3NldHBpZShkZXYsIGNtZCA9PSBSVENfUElFX09OKTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBSVENfQUlFX09GRjoKKwljYXNlIFJUQ19BSUVfT046CisJCXNoX3J0Y19zZXRhaWUoZGV2LCBjbWQgPT0gUlRDX0FJRV9PTik7CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2hfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzaF9ydGMgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGludCBzZWMxMjgsIHNlYzIsIHlyLCB5cjEwMCwgY2ZfYml0OworCisJZG8geworCQl1bnNpZ25lZCBpbnQgdG1wOworCisJCXNwaW5fbG9ja19pcnEoJnJ0Yy0+bG9jayk7CisKKwkJdG1wID0gcmVhZGIocnRjLT5yZWdiYXNlICsgUkNSMSk7CisJCXRtcCAmPSB+UkNSMV9DRjsgLyogQ2xlYXIgQ0YtYml0ICovCisJCXRtcCB8PSBSQ1IxX0NJRTsKKwkJd3JpdGViKHRtcCwgcnRjLT5yZWdiYXNlICsgUkNSMSk7CisKKwkJc2VjMTI4ID0gcmVhZGIocnRjLT5yZWdiYXNlICsgUjY0Q05UKTsKKworCQl0bS0+dG1fc2VjCT0gQkNEMkJJTihyZWFkYihydGMtPnJlZ2Jhc2UgKyBSU0VDQ05UKSk7CisJCXRtLT50bV9taW4JPSBCQ0QyQklOKHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJNSU5DTlQpKTsKKwkJdG0tPnRtX2hvdXIJPSBCQ0QyQklOKHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJIUkNOVCkpOworCQl0bS0+dG1fd2RheQk9IEJDRDJCSU4ocmVhZGIocnRjLT5yZWdiYXNlICsgUldLQ05UKSk7CisJCXRtLT50bV9tZGF5CT0gQkNEMkJJTihyZWFkYihydGMtPnJlZ2Jhc2UgKyBSREFZQ05UKSk7CisJCXRtLT50bV9tb24JPSBCQ0QyQklOKHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJNT05DTlQpKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpCisJCXlyICA9IHJlYWR3KHJ0Yy0+cmVnYmFzZSArIFJZUkNOVCk7CisJCXlyMTAwID0gQkNEMkJJTih5ciA+PiA4KTsKKwkJeXIgJj0gMHhmZjsKKyNlbHNlCisJCXlyICA9IHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJZUkNOVCk7CisJCXlyMTAwID0gQkNEMkJJTigoeXIgPT0gMHg5OSkgPyAweDE5IDogMHgyMCk7CisjZW5kaWYKKworCQl0bS0+dG1feWVhciA9ICh5cjEwMCAqIDEwMCArIEJDRDJCSU4oeXIpKSAtIDE5MDA7CisKKwkJc2VjMiA9IHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFI2NENOVCk7CisJCWNmX2JpdCA9IHJlYWRiKHJ0Yy0+cmVnYmFzZSArIFJDUjEpICYgUkNSMV9DRjsKKworCQlzcGluX3VubG9ja19pcnEoJnJ0Yy0+bG9jayk7CisJfSB3aGlsZSAoY2ZfYml0ICE9IDAgfHwgKChzZWMxMjggXiBzZWMyKSAmIFJUQ19CSVRfSU5WRVJURUQpICE9IDApOworCisjaWYgUlRDX0JJVF9JTlZFUlRFRCAhPSAwCisJaWYgKChzZWMxMjggJiBSVENfQklUX0lOVkVSVEVEKSkKKwkJdG0tPnRtX3NlYy0tOworI2VuZGlmCisKKwlkZXZfZGJnKCZkZXYsICIlczogdG0gaXMgc2Vjcz0lZCwgbWlucz0lZCwgaG91cnM9JWQsICIKKwkJIm1kYXk9JWQsIG1vbj0lZCwgeWVhcj0lZCwgd2RheT0lZFxuIiwKKwkJX19GVU5DVElPTl9fLAorCQl0bS0+dG1fc2VjLCB0bS0+dG1fbWluLCB0bS0+dG1faG91ciwKKwkJdG0tPnRtX21kYXksIHRtLT50bV9tb24sIHRtLT50bV95ZWFyLCB0bS0+dG1fd2RheSk7CisKKwlpZiAocnRjX3ZhbGlkX3RtKHRtKSA8IDApCisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBkYXRlXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoX3J0Y19zZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzaF9ydGMgKnJ0YyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGludCB0bXA7CisJaW50IHllYXI7CisKKwlzcGluX2xvY2tfaXJxKCZydGMtPmxvY2spOworCisJLyogUmVzZXQgcHJlLXNjYWxlciAmIHN0b3AgUlRDICovCisJdG1wID0gcmVhZGIocnRjLT5yZWdiYXNlICsgUkNSMik7CisJdG1wIHw9IFJDUjJfUkVTRVQ7CisJd3JpdGViKHRtcCwgcnRjLT5yZWdiYXNlICsgUkNSMik7CisKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1fc2VjKSwgIHJ0Yy0+cmVnYmFzZSArIFJTRUNDTlQpOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV9taW4pLCAgcnRjLT5yZWdiYXNlICsgUk1JTkNOVCk7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX2hvdXIpLCBydGMtPnJlZ2Jhc2UgKyBSSFJDTlQpOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV93ZGF5KSwgcnRjLT5yZWdiYXNlICsgUldLQ05UKTsKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1fbWRheSksIHJ0Yy0+cmVnYmFzZSArIFJEQVlDTlQpOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV9tb24pLCAgcnRjLT5yZWdiYXNlICsgUk1PTkNOVCk7CisKKyNpZmRlZiBDT05GSUdfQ1BVX1NIMworCXllYXIgPSB0bS0+dG1feWVhciAlIDEwMDsKKwl3cml0ZWIoQklOMkJDRCh5ZWFyKSwgcnRjLT5yZWdiYXNlICsgUllSQ05UKTsKKyNlbHNlCisJeWVhciA9IChCSU4yQkNEKCh0bS0+dG1feWVhciArIDE5MDApIC8gMTAwKSA8PCA4KSB8CisJCUJJTjJCQ0QodG0tPnRtX3llYXIgJSAxMDApOworCXdyaXRldyh5ZWFyLCBydGMtPnJlZ2Jhc2UgKyBSWVJDTlQpOworI2VuZGlmCisKKwkvKiBTdGFydCBSVEMgKi8KKwl0bXAgPSByZWFkYihydGMtPnJlZ2Jhc2UgKyBSQ1IyKTsKKwl0bXAgJj0gflJDUjJfUkVTRVQ7CisJdG1wIHw9IFJDUjJfUlRDRU4gfCBSQ1IyX1NUQVJUOworCXdyaXRlYih0bXAsIHJ0Yy0+cmVnYmFzZSArIFJDUjIpOworCisJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBzaF9ydGNfb3BzID0geworCS5vcGVuCQk9IHNoX3J0Y19vcGVuLAorCS5yZWxlYXNlCT0gc2hfcnRjX3JlbGVhc2UsCisJLmlvY3RsCQk9IHNoX3J0Y19pb2N0bCwKKwkucmVhZF90aW1lCT0gc2hfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBzaF9ydGNfc2V0X3RpbWUsCisJLnByb2MJCT0gc2hfcnRjX3Byb2MsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzaF9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc2hfcnRjICpydGM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldCA9IC1FTk9FTlQ7CisKKwlydGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2hfcnRjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFydGMpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZydGMtPmxvY2spOworCisJcnRjLT5wZXJpb2RpY19pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmICh1bmxpa2VseShydGMtPnBlcmlvZGljX2lycSA8IDApKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIElSUSBmb3IgcGVyaW9kXG4iKTsKKwkJZ290byBlcnJfYmFkcmVzOworCX0KKworCXJ0Yy0+Y2FycnlfaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKKwlpZiAodW5saWtlbHkocnRjLT5jYXJyeV9pcnEgPCAwKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBJUlEgZm9yIGNhcnJ5XG4iKTsKKwkJZ290byBlcnJfYmFkcmVzOworCX0KKworCXJ0Yy0+YWxhcm1faXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAyKTsKKwlpZiAodW5saWtlbHkocnRjLT5hbGFybV9pcnEgPCAwKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBJUlEgZm9yIGFsYXJtXG4iKTsKKwkJZ290byBlcnJfYmFkcmVzOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lPLCAwKTsKKwlpZiAodW5saWtlbHkocmVzID09IE5VTEwpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIElPIHJlc291cmNlXG4iKTsKKwkJZ290byBlcnJfYmFkcmVzOworCX0KKworCXJ0Yy0+cmVnc2l6ZSA9IHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDE7CisKKwlydGMtPnJlcyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBydGMtPnJlZ3NpemUsIHBkZXYtPm5hbWUpOworCWlmICh1bmxpa2VseSghcnRjLT5yZXMpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJfYmFkcmVzOworCX0KKworCXJ0Yy0+cmVnYmFzZSA9ICh2b2lkIF9faW9tZW0gKilydGMtPnJlcy0+c3RhcnQ7CisJaWYgKHVubGlrZWx5KCFydGMtPnJlZ2Jhc2UpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2JhZG1hcDsKKwl9CisKKwlydGMtPnJ0Y19kZXYgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKCJzaCIsICZwZGV2LT5kZXYsCisJCQkJCSAgICZzaF9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKSB7CisJCXJldCA9IFBUUl9FUlIocnRjLT5ydGNfZGV2KTsKKwkJZ290byBlcnJfYmFkbWFwOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHJ0Yyk7CisKKwlyZXR1cm4gMDsKKworZXJyX2JhZG1hcDoKKwlyZWxlYXNlX3Jlc291cmNlKHJ0Yy0+cmVzKTsKK2Vycl9iYWRyZXM6CisJa2ZyZWUocnRjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNoX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc2hfcnRjICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChsaWtlbHkocnRjLT5ydGNfZGV2KSkKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yy0+cnRjX2Rldik7CisKKwlzaF9ydGNfc2V0cGllKCZwZGV2LT5kZXYsIDApOworCXNoX3J0Y19zZXRhaWUoJnBkZXYtPmRldiwgMCk7CisKKwlyZWxlYXNlX3Jlc291cmNlKHJ0Yy0+cmVzKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJa2ZyZWUocnRjKTsKKworCXJldHVybiAwOworfQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2hfcnRjX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAic2gtcnRjIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gc2hfcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2hfcnRjX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaF9ydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNoX3J0Y19wbGF0Zm9ybV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2hfcnRjX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2hfcnRjX3BsYXRmb3JtX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNoX3J0Y19pbml0KTsKK21vZHVsZV9leGl0KHNoX3J0Y19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBlckggb24tY2hpcCBSVEMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FoYTE3NDAuYyBiL2RyaXZlcnMvc2NzaS9haGExNzQwLmMKaW5kZXggMGU0YTdlYi4uNmIzNWVkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2FoYTE3NDAuYworKysgYi9kcml2ZXJzL3Njc2kvYWhhMTc0MC5jCkBAIC02ODEsNiArNjgxLDcgQEAKIAl7ICJBRFAwNDAwIiB9LAkJLyogMTc0NCAgKi8KIAl7ICIiIH0KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKGVpc2EsIGFoYTE3NDBfaWRzKTsKIAogc3RhdGljIHN0cnVjdCBlaXNhX2RyaXZlciBhaGExNzQwX2RyaXZlciA9IHsKIAkuaWRfdGFibGUgPSBhaGExNzQwX2lkcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc3NzBfb3NtLmMgYi9kcml2ZXJzL3Njc2kvYWljN3h4eC9haWM3NzcwX29zbS5jCmluZGV4IDg2N2NiZTIuLjFhYzExOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haWM3eHh4L2FpYzc3NzBfb3NtLmMKKysrIGIvZHJpdmVycy9zY3NpL2FpYzd4eHgvYWljNzc3MF9vc20uYwpAQCAtMTMyLDcgKzEzMiw4IEBACiAJeyAiQURQNzc3MCIsIDUgfSwgLyogQUlDNzc3MCBnZW5lcmljICovCiAJeyAiIiB9CiB9OwotICAKK01PRFVMRV9ERVZJQ0VfVEFCTEUoZWlzYSwgYWljNzc3MF9pZHMpOworCiBzdGF0aWMgc3RydWN0IGVpc2FfZHJpdmVyIGFpYzc3NzBfZHJpdmVyID0gewogCS5pZF90YWJsZQk9IGFpYzc3NzBfaWRzLAogCS5kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVzaC5jIGIvZHJpdmVycy9zY3NpL21lc2guYwppbmRleCA1OTJiNTJhLi42ODNmYzdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVzaC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tZXNoLmMKQEAgLTE3NTYsMTYgKzE3NTYsMjMgQEAKIAkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfTUVTSF9FTkFCTEUsIG1hY2lvX2dldF9vZl9ub2RlKG1zLT5tZGV2KSwgMCwgMCk7CiAJCW1zbGVlcCgxMCk7CiAJfQotfQkJCQorfQogCiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgbWVzaF9zdXNwZW5kKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgbWVzaF9zdXNwZW5kKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQogewogCXN0cnVjdCBtZXNoX3N0YXRlICptcyA9IChzdHJ1Y3QgbWVzaF9zdGF0ZSAqKW1hY2lvX2dldF9kcnZkYXRhKG1kZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoc3RhdGUuZXZlbnQgPT0gbWRldi0+b2ZkZXYuZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50IHx8IHN0YXRlLmV2ZW50IDwgMikKKwlzd2l0Y2ggKG1lc2cuZXZlbnQpIHsKKwljYXNlIFBNX0VWRU5UX1NVU1BFTkQ6CisJY2FzZSBQTV9FVkVOVF9GUkVFWkU6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKwlpZiAobWVzZy5ldmVudCA9PSBtZGV2LT5vZmRldi5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpCiAJCXJldHVybiAwOwogCiAJc2NzaV9ibG9ja19yZXF1ZXN0cyhtcy0+aG9zdCk7CkBAIC0xNzgwLDcgKzE3ODcsNyBAQAogCWRpc2FibGVfaXJxKG1zLT5tZXNoaW50cik7CiAJc2V0X21lc2hfcG93ZXIobXMsIDApOwogCi0JbWRldi0+b2ZkZXYuZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7CisJbWRldi0+b2ZkZXYuZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gbWVzZzsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NpbTcxMC5jIGIvZHJpdmVycy9zY3NpL3NpbTcxMC5jCmluZGV4IGIyN2U4NTQuLjU1MWJhY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zaW03MTAuYworKysgYi9kcml2ZXJzL3Njc2kvc2ltNzEwLmMKQEAgLTI4Miw2ICsyODIsNyBAQAogCXsgIkhXUDBDODAiIH0sCiAJeyAiIiB9CiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShlaXNhLCBzaW03MTBfZWlzYV9pZHMpOwogCiBzdGF0aWMgX19pbml0IGludAogc2ltNzEwX2Vpc2FfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKaW5kZXggNWI0OGFjMi4uMjYxZWFhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCkBAIC02NDIsMTIgKzY0MiwxNyBAQAogCXNlbGVjdCBTRVJJQUxfQ09SRV9DT05TT0xFCiAKIGNvbmZpZyBTRVJJQUxfU0hfU0NJCi0JdHJpc3RhdGUgIlNIIFNDSShGKSBzZXJpYWwgcG9ydCBzdXBwb3J0IgorCXRyaXN0YXRlICJTdXBlckggU0NJKEYpIHNlcmlhbCBwb3J0IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTVVBFUkggfHwgSDgzMDAKIAlzZWxlY3QgU0VSSUFMX0NPUkUKIAorY29uZmlnIFNFUklBTF9TSF9TQ0lfTlJfVUFSVFMKKwlpbnQgIk1heGltdW0gbnVtYmVyIG9mIFNDSShGKSBzZXJpYWwgcG9ydHMiCisJZGVwZW5kcyBvbiBTRVJJQUxfU0hfU0NJCisJZGVmYXVsdCAiMiIKKwogY29uZmlnIFNFUklBTF9TSF9TQ0lfQ09OU09MRQotCWJvb2wgIlN1cHBvcnQgZm9yIGNvbnNvbGUgb24gU0ggU0NJKEYpIgorCWJvb2wgIlN1cHBvcnQgZm9yIGNvbnNvbGUgb24gU3VwZXJIIFNDSShGKSIKIAlkZXBlbmRzIG9uIFNFUklBTF9TSF9TQ0k9eQogCXNlbGVjdCBTRVJJQUxfQ09SRV9DT05TT0xFCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3NoLXNjaS5jIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMKaW5kZXggY2JlZGUwNi4uZjMzNmJhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogU3VwZXJIIG9uLWNoaXAgc2VyaWFsIG1vZHVsZSBzdXBwb3J0LiAgKFNDSSB3aXRoIG5vIEZJRk8gLyB3aXRoIEZJRk8pCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMywgMjAwNCAgUGF1bCBNdW5kdAorICogIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDYgIFBhdWwgTXVuZHQKICAqCiAgKiBiYXNlZCBvZmYgb2YgdGhlIG9sZCBkcml2ZXJzL2NoYXIvc2gtc2NpLmMgYnk6CiAgKgpAQCAtMjAsMTAgKzIwLDkgQEAKIAogI3VuZGVmIERFQlVHCiAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KQEAgLTMyLDM0ICszMSwyNSBAQAogI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9mY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9nZW5lcmljX3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaWZkZWYgQ09ORklHX0NQVV9GUkVRCiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLQogI2lmIGRlZmluZWQoQ09ORklHX1NVUEVSSCkgJiYgIWRlZmluZWQoQ09ORklHX1NVUEVSSDY0KQogI2luY2x1ZGUgPGFzbS9jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9zaF9iaW9zLmg+CisjaW5jbHVkZSA8YXNtL2tnZGIuaD4KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MKLSNpbmNsdWRlIDxhc20vc2hfYmlvcy5oPgotI2VuZGlmCisjaW5jbHVkZSA8YXNtL3NjaS5oPgogCiAjaWYgZGVmaW5lZChDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFKSAmJiBkZWZpbmVkKENPTkZJR19NQUdJQ19TWVNSUSkKICNkZWZpbmUgU1VQUE9SVF9TWVNSUQpAQCAtNjcsMzYgKzU3LDUxIEBACiAKICNpbmNsdWRlICJzaC1zY2kuaCIKIAotI2lmZGVmIENPTkZJR19TSF9LR0RCCi0jaW5jbHVkZSA8YXNtL2tnZGIuaD4KK3N0cnVjdCBzY2lfcG9ydCB7CisJc3RydWN0IHVhcnRfcG9ydAlwb3J0OwogCi1zdGF0aWMgaW50IGtnZGJfZ2V0X2NoYXIoc3RydWN0IHNjaV9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIGtnZGJfcHV0X2NoYXIoc3RydWN0IHNjaV9wb3J0ICpwb3J0LCBjaGFyIGMpOwotc3RhdGljIHZvaWQga2dkYl9oYW5kbGVfZXJyb3Ioc3RydWN0IHNjaV9wb3J0ICpwb3J0KTsKKwkvKiBQb3J0IHR5cGUgKi8KKwl1bnNpZ25lZCBpbnQJCXR5cGU7CisKKwkvKiBQb3J0IElSUXM6IEVSSSwgUlhJLCBUWEksIEJSSSAob3B0aW9uYWwpICovCisJdW5zaWduZWQgaW50CQlpcnFzW1NDSXhfTlJfSVJRU107IAorCisJLyogUG9ydCBwaW4gY29uZmlndXJhdGlvbiAqLworCXZvaWQJCQkoKmluaXRfcGlucykoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgY2ZsYWcpOworCisJLyogUG9ydCBlbmFibGUgY2FsbGJhY2sgKi8KKwl2b2lkCQkJKCplbmFibGUpKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOworCisJLyogUG9ydCBkaXNhYmxlIGNhbGxiYWNrICovCisJdm9pZAkJCSgqZGlzYWJsZSkoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCk7CisKKwkvKiBCcmVhayB0aW1lciAqLworCXN0cnVjdCB0aW1lcl9saXN0CWJyZWFrX3RpbWVyOworCWludAkJCWJyZWFrX2ZsYWc7Cit9OworCisjaWZkZWYgQ09ORklHX1NIX0tHREIKIHN0YXRpYyBzdHJ1Y3Qgc2NpX3BvcnQgKmtnZGJfc2NpX3BvcnQ7Ci0jZW5kaWYgLyogQ09ORklHX1NIX0tHREIgKi8KKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRQotc3RhdGljIHN0cnVjdCBzY2lfcG9ydCAqc2VyaWFsX2NvbnNvbGVfcG9ydCA9IDA7Ci0jZW5kaWYgLyogQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRSAqLworc3RhdGljIHN0cnVjdCBzY2lfcG9ydCAqc2VyaWFsX2NvbnNvbGVfcG9ydDsKKyNlbmRpZgogCiAvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCiBzdGF0aWMgdm9pZCBzY2lfc3RvcF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIHNjaV9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIHNjaV9zdGFydF9yeChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgdHR5X3N0YXJ0KTsKLXN0YXRpYyB2b2lkIHNjaV9zdG9wX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOwotc3RhdGljIGludCBzY2lfcmVxdWVzdF9pcnEoc3RydWN0IHNjaV9wb3J0ICpwb3J0KTsKLXN0YXRpYyB2b2lkIHNjaV9mcmVlX2lycShzdHJ1Y3Qgc2NpX3BvcnQgKnBvcnQpOwogCi1zdGF0aWMgc3RydWN0IHNjaV9wb3J0IHNjaV9wb3J0c1tdOworI2RlZmluZSBTQ0lfTlBPUlRTIENPTkZJR19TRVJJQUxfU0hfU0NJX05SX1VBUlRTCisKK3N0YXRpYyBzdHJ1Y3Qgc2NpX3BvcnQgc2NpX3BvcnRzW1NDSV9OUE9SVFNdOwogc3RhdGljIHN0cnVjdCB1YXJ0X2RyaXZlciBzY2lfdWFydF9kcml2ZXI7CiAKLSNkZWZpbmUgU0NJX05QT1JUUyBzY2lfdWFydF9kcml2ZXIubnIKLQotI2lmIGRlZmluZWQoQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MpIHx8IGRlZmluZWQoQ09ORklHX1NIX0tHREIpCi0KLXN0YXRpYyB2b2lkIGhhbmRsZV9lcnJvcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewkJCQkvKiBDbGVhciBlcnJvciBmbGFncyAqLworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRSkgJiYgXAorICAgIGRlZmluZWQoQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MpIHx8IGRlZmluZWQoQ09ORklHX1NIX0tHREIpCitzdGF0aWMgaW5saW5lIHZvaWQgaGFuZGxlX2Vycm9yKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJLyogQ2xlYXIgZXJyb3IgZmxhZ3MgKi8KIAlzY2lfb3V0KHBvcnQsIFNDeFNSLCBTQ3hTUl9FUlJPUl9DTEVBUihwb3J0KSk7CiB9CiAKQEAgLTEwNiw4ICsxMTEsOCBAQAogCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKIAlpbnQgYzsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLSAgICAgICAgZG8geworCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisJZG8gewogCQlzdGF0dXMgPSBzY2lfaW4ocG9ydCwgU0N4U1IpOwogCQlpZiAoc3RhdHVzICYgU0N4U1JfRVJST1JTKHBvcnQpKSB7CiAJCQloYW5kbGVfZXJyb3IocG9ydCk7CkBAIC0xMTcsMzggKzEyMiwxOSBAQAogCWMgPSBzY2lfaW4ocG9ydCwgU0N4UkRSKTsKIAlzY2lfaW4ocG9ydCwgU0N4U1IpOyAgICAgICAgICAgIC8qIER1bW15IHJlYWQgKi8KIAlzY2lfb3V0KHBvcnQsIFNDeFNSLCBTQ3hTUl9SRHhGX0NMRUFSKHBvcnQpKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIGM7CiB9Ci0KLS8qIFRha2VuIGZyb20gc2gtc3R1Yi5jIG9mIEdEQiA0LjE4ICovCi1zdGF0aWMgY29uc3QgY2hhciBoZXhjaGFyc1tdID0gIjAxMjM0NTY3ODlhYmNkZWYiOwotCi1zdGF0aWMgX19pbmxpbmVfXyBjaGFyIGhpZ2hoZXgoaW50ICB4KQotewotCXJldHVybiBoZXhjaGFyc1soeCA+PiA0KSAmIDB4Zl07Ci19Ci0KLXN0YXRpYyBfX2lubGluZV9fIGNoYXIgbG93aGV4KGludCAgeCkKLXsKLQlyZXR1cm4gaGV4Y2hhcnNbeCAmIDB4Zl07Ci19Ci0KICNlbmRpZiAvKiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyB8fCBDT05GSUdfU0hfS0dEQiAqLwogCi0vKgotICogU2VuZCB0aGUgcGFja2V0IGluIGJ1ZmZlci4gIFRoZSBob3N0IGdldHMgb25lIGNoYW5jZSB0byByZWFkIGl0LgotICogVGhpcyByb3V0aW5lIGRvZXMgbm90IHdhaXQgZm9yIGEgcG9zaXRpdmUgYWNrbm93bGVkZ2UuCi0gKi8KLQotI2lmZGVmIENPTkZJR19TRVJJQUxfU0hfU0NJX0NPTlNPTEUKKyNpZiBkZWZpbmVkKENPTkZJR19TRVJJQUxfU0hfU0NJX0NPTlNPTEUpIHx8IGRlZmluZWQoQ09ORklHX1NIX0tHREIpCiBzdGF0aWMgdm9pZCBwdXRfY2hhcihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBjaGFyIGMpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAogCWRvIHsKIAkJc3RhdHVzID0gc2NpX2luKHBvcnQsIFNDeFNSKTsKQEAgLTE1OCw5ICsxNDQsMTEgQEAKIAlzY2lfaW4ocG9ydCwgU0N4U1IpOyAgICAgICAgICAgIC8qIER1bW15IHJlYWQgKi8KIAlzY2lfb3V0KHBvcnQsIFNDeFNSLCBTQ3hTUl9URHhFX0NMRUFSKHBvcnQpKTsKIAotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiB9CisjZW5kaWYKIAorI2lmZGVmIENPTkZJR19TRVJJQUxfU0hfU0NJX0NPTlNPTEUKIHN0YXRpYyB2b2lkIHB1dF9zdHJpbmcoc3RydWN0IHNjaV9wb3J0ICpzY2lfcG9ydCwgY29uc3QgY2hhciAqYnVmZmVyLCBpbnQgY291bnQpCiB7CiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZzY2lfcG9ydC0+cG9ydDsKQEAgLTIxMyw5NiArMjAxLDI4IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1NFUklBTF9TSF9TQ0lfQ09OU09MRSAqLwogCi0KICNpZmRlZiBDT05GSUdfU0hfS0dEQgotCi0vKiBJcyB0aGUgU0NJIHJlYWR5LCBpZSBpcyB0aGVyZSBhIGNoYXIgd2FpdGluZz8gKi8KLXN0YXRpYyBpbnQga2dkYl9pc19jaGFyX3JlYWR5KHN0cnVjdCBzY2lfcG9ydCAqcG9ydCkKLXsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgc3RhdHVzID0gc2NpX2luKHBvcnQsIFNDeFNSKTsKLQotICAgICAgICBpZiAoc3RhdHVzICYgKFNDeFNSX0VSUk9SUyhwb3J0KSB8IFNDeFNSX0JSSyhwb3J0KSkpCi0gICAgICAgICAgICAgICAga2dkYl9oYW5kbGVfZXJyb3IocG9ydCk7Ci0KLSAgICAgICAgcmV0dXJuIChzdGF0dXMgJiBTQ3hTUl9SRHhGKHBvcnQpKTsKLX0KLQotLyogV3JpdGUgYSBjaGFyICovCi1zdGF0aWMgdm9pZCBrZ2RiX3B1dF9jaGFyKHN0cnVjdCBzY2lfcG9ydCAqcG9ydCwgY2hhciBjKQotewotICAgICAgICB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7Ci0KLSAgICAgICAgZG8KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzY2lfaW4ocG9ydCwgU0N4U1IpOwotICAgICAgICB3aGlsZSAoIShzdGF0dXMgJiBTQ3hTUl9URHhFKHBvcnQpKSk7Ci0KLSAgICAgICAgc2NpX291dChwb3J0LCBTQ3hURFIsIGMpOwotICAgICAgICBzY2lfaW4ocG9ydCwgU0N4U1IpOyAgICAvKiBEdW1teSByZWFkICovCi0gICAgICAgIHNjaV9vdXQocG9ydCwgU0N4U1IsIFNDeFNSX1REeEVfQ0xFQVIocG9ydCkpOwotfQotCi0vKiBHZXQgYSBjaGFyIGlmIHRoZXJlIGlzIG9uZSwgZWxzZSByZXQgLTEgKi8KLXN0YXRpYyBpbnQga2dkYl9nZXRfY2hhcihzdHJ1Y3Qgc2NpX3BvcnQgKnBvcnQpCitzdGF0aWMgaW50IGtnZGJfc2NpX2dldGNoYXIodm9pZCkKIHsKICAgICAgICAgaW50IGM7CiAKLSAgICAgICAgaWYgKGtnZGJfaXNfY2hhcl9yZWFkeShwb3J0KSA9PSAwKQotICAgICAgICAgICAgICAgIGMgPSAtMTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgYyA9IHNjaV9pbihwb3J0LCBTQ3hSRFIpOwotICAgICAgICAgICAgICAgIHNjaV9pbihwb3J0LCBTQ3hTUik7ICAgIC8qIER1bW15IHJlYWQgKi8KLSAgICAgICAgICAgICAgICBzY2lfb3V0KHBvcnQsIFNDeFNSLCBTQ3hTUl9SRHhGX0NMRUFSKHBvcnQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjOwotfQotCi0vKiBDYWxsZWQgZnJvbSBrZ2Ric3R1Yi5jIHRvIGdldCBhIGNoYXJhY3RlciwgaS5lLiBpcyBibG9ja2luZyAqLwotc3RhdGljIGludCBrZ2RiX3NjaV9nZXRjaGFyKHZvaWQpCi17Ci0gICAgICAgIHZvbGF0aWxlIGludCBjOwotCiAgICAgICAgIC8qIEtlZXAgdHJ5aW5nIHRvIHJlYWQgYSBjaGFyYWN0ZXIsIHRoaXMgY291bGQgYmUgbmVhdGVyICovCi0gICAgICAgIHdoaWxlICgoYyA9IGtnZGJfZ2V0X2NoYXIoa2dkYl9zY2lfcG9ydCkpIDwgMCk7CisgICAgICAgIHdoaWxlICgoYyA9IGdldF9jaGFyKGtnZGJfc2NpX3BvcnQpKSA8IDApCisJCWNwdV9yZWxheCgpOwogCiAgICAgICAgIHJldHVybiBjOwogfQogCi0vKiBDYWxsZWQgZnJvbSBrZ2Ric3R1Yi5jIHRvIHB1dCBhIGNoYXJhY3RlciwganVzdCBhIHdyYXBwZXIgKi8KLXN0YXRpYyB2b2lkIGtnZGJfc2NpX3B1dGNoYXIoaW50IGMpCitzdGF0aWMgaW5saW5lIHZvaWQga2dkYl9zY2lfcHV0Y2hhcihpbnQgYykKIHsKLQotICAgICAgICBrZ2RiX3B1dF9jaGFyKGtnZGJfc2NpX3BvcnQsIGMpOworICAgICAgICBwdXRfY2hhcihrZ2RiX3NjaV9wb3J0LCBjKTsKIH0KLQotLyogQ2xlYXIgYW55IGVycm9ycyBvbiB0aGUgU0NJICovCi1zdGF0aWMgdm9pZCBrZ2RiX2hhbmRsZV9lcnJvcihzdHJ1Y3Qgc2NpX3BvcnQgKnBvcnQpCi17Ci0gICAgICAgIHNjaV9vdXQocG9ydCwgU0N4U1IsIFNDeFNSX0VSUk9SX0NMRUFSKHBvcnQpKTsgIC8qIENsZWFyIGVycm9yIGZsYWdzICovCi19Ci0KLS8qIEJyZWFrcG9pbnQgaWYgdGhlcmUncyBhIGJyZWFrIHNlbnQgb24gdGhlIHNlcmlhbCBwb3J0ICovCi1zdGF0aWMgdm9pZCBrZ2RiX2JyZWFrX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpwdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotICAgICAgICBzdHJ1Y3Qgc2NpX3BvcnQgKnBvcnQgPSBwdHI7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IHN0YXR1cyA9IHNjaV9pbihwb3J0LCBTQ3hTUik7Ci0KLSAgICAgICAgaWYgKHN0YXR1cyAmIFNDeFNSX0JSSyhwb3J0KSkgewotCi0gICAgICAgICAgICAgICAgLyogQnJlYWsgaW50byB0aGUgZGVidWdnZXIgaWYgYSBicmVhayBpcyBkZXRlY3RlZCAqLwotICAgICAgICAgICAgICAgIEJSRUFLUE9JTlQoKTsKLQotICAgICAgICAgICAgICAgIC8qIENsZWFyICovCi0gICAgICAgICAgICAgICAgc2NpX291dChwb3J0LCBTQ3hTUiwgU0N4U1JfQlJFQUtfQ0xFQVIocG9ydCkpOwotICAgICAgICB9Ci19Ci0KICNlbmRpZiAvKiBDT05GSUdfU0hfS0dEQiAqLwogCiAjaWYgZGVmaW5lZChfX0g4MzAwU19fKQogZW51bSB7IHNjaV9kaXNhYmxlLCBzY2lfZW5hYmxlIH07CiAKLXN0YXRpYyB2b2lkIGg4MzAwX3NjaV9lbmFibGUoc3RydWN0IHVhcnRfcG9ydCogcG9ydCwgdW5zaWduZWQgaW50IGN0cmwpCitzdGF0aWMgdm9pZCBoODMwMF9zY2lfY29uZmlnKHN0cnVjdCB1YXJ0X3BvcnQqIHBvcnQsIHVuc2lnbmVkIGludCBjdHJsKQogewogCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKm1zdHBjcmw9KHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilNU1RQQ1JMOwogCWludCBjaCA9IChwb3J0LT5tYXBiYXNlICAtIFNNUjApID4+IDM7CkBAIC0zMTQsMzIgKzIzNCw2NiBAQAogCQkqbXN0cGNybCAmPSB+bWFzazsKIAl9CiB9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoODMwMF9zY2lfZW5hYmxlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJaDgzMDBfc2NpX2NvbmZpZyhwb3J0LCBzY2lfZW5hYmxlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGg4MzAwX3NjaV9kaXNhYmxlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJaDgzMDBfc2NpX2NvbmZpZyhwb3J0LCBzY2lfZGlzYWJsZSk7Cit9CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoU0NJX09OTFkpIHx8IGRlZmluZWQoU0NJX0FORF9TQ0lGKQotI2lmIGRlZmluZWQoX19IODMwMEhfXykgfHwgZGVmaW5lZChfX0g4MzAwU19fKQorI2lmIGRlZmluZWQoU0NJX09OTFkpIHx8IGRlZmluZWQoU0NJX0FORF9TQ0lGKSAmJiBcCisgICAgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pCiBzdGF0aWMgdm9pZCBzY2lfaW5pdF9waW5zX3NjaShzdHJ1Y3QgdWFydF9wb3J0KiBwb3J0LCB1bnNpZ25lZCBpbnQgY2ZsYWcpCiB7CiAJaW50IGNoID0gKHBvcnQtPm1hcGJhc2UgLSBTTVIwKSA+PiAzOwogCiAJLyogc2V0IEREUiByZWdzICovCi0JSDgzMDBfR1BJT19ERFIoaDgzMDBfc2NpX3BpbnNbY2hdLnBvcnQsaDgzMDBfc2NpX3BpbnNbY2hdLnJ4LEg4MzAwX0dQSU9fSU5QVVQpOwotCUg4MzAwX0dQSU9fRERSKGg4MzAwX3NjaV9waW5zW2NoXS5wb3J0LGg4MzAwX3NjaV9waW5zW2NoXS50eCxIODMwMF9HUElPX09VVFBVVCk7CisJSDgzMDBfR1BJT19ERFIoaDgzMDBfc2NpX3BpbnNbY2hdLnBvcnQsCisJCSAgICAgICBoODMwMF9zY2lfcGluc1tjaF0ucngsCisJCSAgICAgICBIODMwMF9HUElPX0lOUFVUKTsKKwlIODMwMF9HUElPX0REUihoODMwMF9zY2lfcGluc1tjaF0ucG9ydCwKKwkJICAgICAgIGg4MzAwX3NjaV9waW5zW2NoXS50eCwKKwkJICAgICAgIEg4MzAwX0dQSU9fT1VUUFVUKTsKKwogCS8qIHR4IG1hcmsgb3V0cHV0Ki8KIAlIODMwMF9TQ0lfRFIoY2gpIHw9IGg4MzAwX3NjaV9waW5zW2NoXS50eDsKIH0KKyNlbHNlCisjZGVmaW5lIHNjaV9pbml0X3BpbnNfc2NpIE5VTEwKICNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpCitzdGF0aWMgdm9pZCBzY2lfaW5pdF9waW5zX2lyZGEoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnKQoreworCXVuc2lnbmVkIGludCBmY3JfdmFsID0gMDsKKworCWlmIChjZmxhZyAmIENSVFNDVFMpCisJCWZjcl92YWwgfD0gU0NGQ1JfTUNFOworCisJc2NpX291dChwb3J0LCBTQ0ZDUiwgZmNyX3ZhbCk7Cit9CisjZWxzZQorI2RlZmluZSBzY2lfaW5pdF9waW5zX2lyZGEgTlVMTAorI2VuZGlmCisKKyNpZmRlZiBTQ0lfT05MWQorI2RlZmluZSBzY2lfaW5pdF9waW5zX3NjaWYgTlVMTAogI2VuZGlmCiAKICNpZiBkZWZpbmVkKFNDSUZfT05MWSkgfHwgZGVmaW5lZChTQ0lfQU5EX1NDSUYpCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKQorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKQogLyogU0g3MzAwIGRvZXNuJ3QgdXNlIFJUUy9DVFMgKi8KIHN0YXRpYyB2b2lkIHNjaV9pbml0X3BpbnNfc2NpZihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgY2ZsYWcpCiB7CiAJc2NpX291dChwb3J0LCBTQ0ZDUiwgMCk7CiB9CiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU0gzKQotLyogRm9yIFNINzcwNSwgU0g3NzA3LCBTSDc3MDksIFNINzcwOUEsIFNINzcyOSAqLworLyogRm9yIFNINzcwNSwgU0g3NzA2LCBTSDc3MDcsIFNINzcwOSwgU0g3NzA5QSwgU0g3NzI5ICovCiBzdGF0aWMgdm9pZCBzY2lfaW5pdF9waW5zX3NjaWYoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnKQogewogCXVuc2lnbmVkIGludCBmY3JfdmFsID0gMDsKQEAgLTM2NiwyMCArMzIwLDcgQEAKIAogCXNjaV9vdXQocG9ydCwgU0NGQ1IsIGZjcl92YWwpOwogfQotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpCi1zdGF0aWMgdm9pZCBzY2lfaW5pdF9waW5zX2lyZGEoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnKQotewotCXVuc2lnbmVkIGludCBmY3JfdmFsID0gMDsKLQotCWlmIChjZmxhZyAmIENSVFNDVFMpCi0JCWZjcl92YWwgfD0gU0NGQ1JfTUNFOwotCi0Jc2NpX291dChwb3J0LCBTQ0ZDUiwgZmNyX3ZhbCk7Ci19Ci0jZW5kaWYKICNlbHNlCi0KIC8qIEZvciBTSDc3NTAgKi8KIHN0YXRpYyB2b2lkIHNjaV9pbml0X3BpbnNfc2NpZihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgY2ZsYWcpCiB7CkBAIC0zODgsNyArMzI5LDkgQEAKIAlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CiAJCWZjcl92YWwgfD0gU0NGQ1JfTUNFOwogCX0gZWxzZSB7Ci0jaWZkZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MAorI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMKKwkJLyogTm90aGluZyAqLworI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKQogCQljdHJsX291dHcoMHgwMDgwLCBTQ1NQVFIwKTsgLyogU2V0IFJUUyA9IDEgKi8KICNlbHNlCiAJCWN0cmxfb3V0dygweDAwODAsIFNDU1BUUjIpOyAvKiBTZXQgUlRTID0gMSAqLwpAQCAtMzk2LDEwICszMzksNDEgQEAKIAl9CiAJc2NpX291dChwb3J0LCBTQ0ZDUiwgZmNyX3ZhbCk7CiB9CisjZW5kaWYKIAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKQorc3RhdGljIGlubGluZSBpbnQgc2NpZl90eHJvb20oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gU0NJRl9UWFJPT01fTUFYIC0gKHNjaV9pbihwb3J0LCBTQ1RGRFIpICYgMHg3Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNjaWZfcnhyb29tKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIHNjaV9pbihwb3J0LCBTQ1JGRFIpICYgMHg3ZjsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBzY2lmX3R4cm9vbShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiBTQ0lGX1RYUk9PTV9NQVggLSAoc2NpX2luKHBvcnQsIFNDRkRSKSA+PiA4KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2NpZl9yeHJvb20oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZXR1cm4gc2NpX2luKHBvcnQsIFNDRkRSKSAmIFNDSUZfUkZEQ19NQVNLOworfQogI2VuZGlmCiAjZW5kaWYgLyogU0NJRl9PTkxZIHx8IFNDSV9BTkRfU0NJRiAqLwogCitzdGF0aWMgaW5saW5lIGludCBzY2lfdHhyb29tKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuICgoc2NpX2luKHBvcnQsIFNDeFNSKSAmIFNDSV9URFJFKSAhPSAwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2NpX3J4cm9vbShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiAoKHNjaV9pbihwb3J0LCBTQ3hTUikgJiBTQ3hTUl9SRHhGKHBvcnQpKSAhPSAwKTsKK30KKwogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqCiAgKiAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJydXB0IHJlbGF0ZWQgcm91dGluZXMgICAgICAgICAgICAgICAgICAgICAgICoKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KQEAgLTQwOCwxNCArMzgyLDEyIEBACiB7CiAJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnBvcnQtPmluZm8tPnhtaXQ7CiAJdW5zaWduZWQgaW50IHN0b3BwZWQgPSB1YXJ0X3R4X3N0b3BwZWQocG9ydCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBzaG9ydCBzdGF0dXM7CiAJdW5zaWduZWQgc2hvcnQgY3RybDsKLQlpbnQgY291bnQsIHR4cm9vbTsKKwlpbnQgY291bnQ7CiAKIAlzdGF0dXMgPSBzY2lfaW4ocG9ydCwgU0N4U1IpOwogCWlmICghKHN0YXR1cyAmIFNDeFNSX1REeEUocG9ydCkpKSB7Ci0JCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJY3RybCA9IHNjaV9pbihwb3J0LCBTQ1NDUik7CiAJCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpIHsKIAkJCWN0cmwgJj0gflNDSV9DVFJMX0ZMQUdTX1RJRTsKQEAgLTQyMywyNSArMzk1LDE1IEBACiAJCQljdHJsIHw9IFNDSV9DVFJMX0ZMQUdTX1RJRTsKIAkJfQogCQlzY2lfb3V0KHBvcnQsIFNDU0NSLCBjdHJsKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQlyZXR1cm47CiAJfQogCi0jaWYgIWRlZmluZWQoU0NJX09OTFkpCi0JaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGKSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCi0JCXR4cm9vbSA9IFNDSUZfVFhST09NX01BWCAtIChzY2lfaW4ocG9ydCwgU0NURkRSKSAmIDB4N2YpOwotI2Vsc2UKLQkJdHhyb29tID0gU0NJRl9UWFJPT01fTUFYIC0gKHNjaV9pbihwb3J0LCBTQ0ZEUik+PjgpOworI2lmbmRlZiBTQ0lfT05MWQorCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRikKKwkJY291bnQgPSBzY2lmX3R4cm9vbShwb3J0KTsKKwllbHNlCiAjZW5kaWYKLQl9IGVsc2UgewotCQl0eHJvb20gPSAoc2NpX2luKHBvcnQsIFNDeFNSKSAmIFNDSV9URFJFKT8xOjA7Ci0JfQotI2Vsc2UKLQl0eHJvb20gPSAoc2NpX2luKHBvcnQsIFNDeFNSKSAmIFNDSV9URFJFKT8xOjA7Ci0jZW5kaWYKLQotCWNvdW50ID0gdHhyb29tOworCQljb3VudCA9IHNjaV90eHJvb20ocG9ydCk7CiAKIAlkbyB7CiAJCXVuc2lnbmVkIGNoYXIgYzsKQEAgLTQ2OCw3ICs0MzAsNiBAQAogCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpIHsKIAkJc2NpX3N0b3BfdHgocG9ydCk7CiAJfSBlbHNlIHsKLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQljdHJsID0gc2NpX2luKHBvcnQsIFNDU0NSKTsKIAogI2lmICFkZWZpbmVkKFNDSV9PTkxZKQpAQCAtNDgwLDcgKzQ0MSw2IEBACiAKIAkJY3RybCB8PSBTQ0lfQ1RSTF9GTEFHU19USUU7CiAJCXNjaV9vdXQocG9ydCwgU0NTQ1IsIGN0cmwpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJfQogfQogCkBAIC00OTAsNiArNDUwLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzY2lfcmVjZWl2ZV9jaGFycyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LAogCQkJCSAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisJc3RydWN0IHNjaV9wb3J0ICpzY2lfcG9ydCA9IChzdHJ1Y3Qgc2NpX3BvcnQgKilwb3J0OwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT5pbmZvLT50dHk7CiAJaW50IGksIGNvdW50LCBjb3BpZWQgPSAwOwogCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKQEAgLTUwMSwxOCArNDYyLDExIEBACiAKIAl3aGlsZSAoMSkgewogI2lmICFkZWZpbmVkKFNDSV9PTkxZKQotCQlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1NDSUYpIHsKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkKLQkJCWNvdW50ID0gc2NpX2luKHBvcnQsIFNDUkZEUikgJiAweDdmOwotI2Vsc2UKLQkJCWNvdW50ID0gc2NpX2luKHBvcnQsIFNDRkRSKSZTQ0lGX1JGRENfTUFTSyA7CisJCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRikKKwkJCWNvdW50ID0gc2NpZl9yeHJvb20ocG9ydCk7CisJCWVsc2UKICNlbmRpZgotCQl9IGVsc2UgewotCQkJY291bnQgPSAoc2NpX2luKHBvcnQsIFNDeFNSKSZTQ3hTUl9SRHhGKHBvcnQpKT8xOjA7Ci0JCX0KLSNlbHNlCi0JCWNvdW50ID0gKHNjaV9pbihwb3J0LCBTQ3hTUikmU0N4U1JfUkR4Rihwb3J0KSk/MTowOwotI2VuZGlmCisJCQljb3VudCA9IHNjaV9yeHJvb20ocG9ydCk7CiAKIAkJLyogRG9uJ3QgY29weSBtb3JlIGJ5dGVzIHRoYW4gdGhlcmUgaXMgcm9vbSBmb3IgaW4gdGhlIGJ1ZmZlciAqLwogCQljb3VudCA9IHR0eV9idWZmZXJfcmVxdWVzdF9yb29tKHR0eSwgY291bnQpOwpAQCAtNTIzLDExICs0NzcsMTAgQEAKIAogCQlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1NDSSkgewogCQkJY2hhciBjID0gc2NpX2luKHBvcnQsIFNDeFJEUik7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmKCgoc3RydWN0IHNjaV9wb3J0ICopcG9ydCktPmJyZWFrX2ZsYWcKLQkJCSAgICB8fCB1YXJ0X2hhbmRsZV9zeXNycV9jaGFyKHBvcnQsIGMsIHJlZ3MpKSB7CisJCQlpZiAodWFydF9oYW5kbGVfc3lzcnFfY2hhcihwb3J0LCBjLCByZWdzKSB8fCBzY2lfcG9ydC0+YnJlYWtfZmxhZykKIAkJCQljb3VudCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJICAgIHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgYywgVFRZX05PUk1BTCk7CisJCQllbHNlIHsKKwkJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGMsIFRUWV9OT1JNQUwpOwogCQkJfQogCQl9IGVsc2UgewogCQkJZm9yIChpPTA7IGk8Y291bnQ7IGkrKykgewpAQCAtNTM1LDE1ICs0ODgsMTcgQEAKIAkJCQlzdGF0dXMgPSBzY2lfaW4ocG9ydCwgU0N4U1IpOwogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDMpCiAJCQkJLyogU2tpcCAiY2hhcnMiIGR1cmluZyBicmVhayAqLwotCQkJCWlmICgoKHN0cnVjdCBzY2lfcG9ydCAqKXBvcnQpLT5icmVha19mbGFnKSB7CisJCQkJaWYgKHNjaV9wb3J0LT5icmVha19mbGFnKSB7CiAJCQkJCWlmICgoYyA9PSAwKSAmJgogCQkJCQkgICAgKHN0YXR1cyAmIFNDeFNSX0ZFUihwb3J0KSkpIHsKIAkJCQkJCWNvdW50LS07IGktLTsKIAkJCQkJCWNvbnRpbnVlOwogCQkJCQl9CisKIAkJCQkJLyogTm9uemVybyA9PiBlbmQtb2YtYnJlYWsgKi8KIAkJCQkJcHJfZGVidWcoInNjaWY6IGRlYm91bmNlPCUwMng+XG4iLCBjKTsKLQkJCQkJKChzdHJ1Y3Qgc2NpX3BvcnQgKilwb3J0KS0+YnJlYWtfZmxhZyA9IDA7CisJCQkJCXNjaV9wb3J0LT5icmVha19mbGFnID0gMDsKKwogCQkJCQlpZiAoU1RFUEZOKGMpKSB7CiAJCQkJCQljb3VudC0tOyBpLS07CiAJCQkJCQljb250aW51ZTsKQEAgLTYwMCwxNSArNTU1LDE3IEBACiAvKiBFbnN1cmUgdGhhdCB0d28gY29uc2VjdXRpdmUgc2FtcGxlcyBmaW5kIHRoZSBicmVhayBvdmVyLiAqLwogc3RhdGljIHZvaWQgc2NpX2JyZWFrX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLSAgICBzdHJ1Y3Qgc2NpX3BvcnQgKiBwb3J0ID0gKHN0cnVjdCBzY2lfcG9ydCAqKWRhdGE7Ci0JaWYoc2NpX3J4ZF9pbigmcG9ydC0+cG9ydCkgPT0gMCkgeworCXN0cnVjdCBzY2lfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc2NpX3BvcnQgKilkYXRhOworCisJaWYgKHNjaV9yeGRfaW4oJnBvcnQtPnBvcnQpID09IDApIHsKIAkJcG9ydC0+YnJlYWtfZmxhZyA9IDE7Ci0JICAgIHNjaV9zY2hlZHVsZV9icmVha190aW1lcihwb3J0KTsKLQl9IGVsc2UgaWYocG9ydC0+YnJlYWtfZmxhZyA9PSAxKXsKKwkJc2NpX3NjaGVkdWxlX2JyZWFrX3RpbWVyKHBvcnQpOworCX0gZWxzZSBpZiAocG9ydC0+YnJlYWtfZmxhZyA9PSAxKSB7CiAJCS8qIGJyZWFrIGlzIG92ZXIuICovCiAJCXBvcnQtPmJyZWFrX2ZsYWcgPSAyOwotCSAgICBzY2lfc2NoZWR1bGVfYnJlYWtfdGltZXIocG9ydCk7Ci0JfSBlbHNlIHBvcnQtPmJyZWFrX2ZsYWcgPSAwOworCQlzY2lfc2NoZWR1bGVfYnJlYWtfdGltZXIocG9ydCk7CisJfSBlbHNlCisJCXBvcnQtPmJyZWFrX2ZsYWcgPSAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBzY2lfaGFuZGxlX2Vycm9ycyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQpAQCAtNjE3LDQwICs1NzQsNDEgQEAKIAl1bnNpZ25lZCBzaG9ydCBzdGF0dXMgPSBzY2lfaW4ocG9ydCwgU0N4U1IpOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT5pbmZvLT50dHk7CiAKLQlpZiAoc3RhdHVzJlNDeFNSX09SRVIocG9ydCkpIHsKKwlpZiAoc3RhdHVzICYgU0N4U1JfT1JFUihwb3J0KSkgewogCQkvKiBvdmVycnVuIGVycm9yICovCi0JCWlmKHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pKQorCQlpZiAodHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTikpCiAJCQljb3BpZWQrKzsKIAkJcHJfZGVidWcoInNjaTogb3ZlcnJ1biBlcnJvclxuIik7CiAJfQogCi0JaWYgKHN0YXR1cyZTQ3hTUl9GRVIocG9ydCkpIHsKKwlpZiAoc3RhdHVzICYgU0N4U1JfRkVSKHBvcnQpKSB7CiAJCWlmIChzY2lfcnhkX2luKHBvcnQpID09IDApIHsKIAkJCS8qIE5vdGlmeSBvZiBCUkVBSyAqLwotCQkJc3RydWN0IHNjaV9wb3J0ICogc2NpX3BvcnQgPSAoc3RydWN0IHNjaV9wb3J0ICopcG9ydDsKLQkJCWlmKCFzY2lfcG9ydC0+YnJlYWtfZmxhZykgewotCSAgICAgICAgICAgICAgICAJc2NpX3BvcnQtPmJyZWFrX2ZsYWcgPSAxOwotCSAgICAgICAgICAgICAgICAJc2NpX3NjaGVkdWxlX2JyZWFrX3RpbWVyKChzdHJ1Y3Qgc2NpX3BvcnQgKilwb3J0KTsKKwkJCXN0cnVjdCBzY2lfcG9ydCAqc2NpX3BvcnQgPSAoc3RydWN0IHNjaV9wb3J0ICopcG9ydDsKKworCQkJaWYgKCFzY2lfcG9ydC0+YnJlYWtfZmxhZykgeworCQkJCXNjaV9wb3J0LT5icmVha19mbGFnID0gMTsKKwkJCQlzY2lfc2NoZWR1bGVfYnJlYWtfdGltZXIoc2NpX3BvcnQpOworCiAJCQkJLyogRG8gc3lzcnEgaGFuZGxpbmcuICovCi0JCQkJaWYodWFydF9oYW5kbGVfYnJlYWsocG9ydCkpCisJCQkJaWYgKHVhcnRfaGFuZGxlX2JyZWFrKHBvcnQpKQogCQkJCQlyZXR1cm4gMDsKIAkJCSAgICAgICAgcHJfZGVidWcoInNjaTogQlJFQUsgZGV0ZWN0ZWRcbiIpOwotCQkJICAgICAgICBpZih0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9CUkVBSykpCisJCQkJaWYgKHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX0JSRUFLKSkKIAkJCQkgICAgICAgIGNvcGllZCsrOwogICAgICAgICAgICAgICAgICAgICAgICB9Ci0JCX0KLQkJZWxzZSB7CisJCX0gZWxzZSB7CiAJCQkvKiBmcmFtZSBlcnJvciAqLwotCQkJaWYodHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfRlJBTUUpKQorCQkJaWYgKHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX0ZSQU1FKSkKIAkJCQljb3BpZWQrKzsKIAkJCXByX2RlYnVnKCJzY2k6IGZyYW1lIGVycm9yXG4iKTsKIAkJfQogCX0KIAotCWlmIChzdGF0dXMmU0N4U1JfUEVSKHBvcnQpKSB7Ci0JCWlmKHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX1BBUklUWSkpCi0JCQljb3BpZWQrKzsKKwlpZiAoc3RhdHVzICYgU0N4U1JfUEVSKHBvcnQpKSB7CiAJCS8qIHBhcml0eSBlcnJvciAqLworCQlpZiAodHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfUEFSSVRZKSkKKwkJCWNvcGllZCsrOwogCQlwcl9kZWJ1Zygic2NpOiBwYXJpdHkgZXJyb3JcbiIpOwogCX0KIApAQCAtNjczLDcgKzYzMSw3IEBACiAJCXMtPmJyZWFrX2ZsYWcgPSAxOwogI2VuZGlmCiAJCS8qIE5vdGlmeSBvZiBCUkVBSyAqLwotCQlpZih0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9CUkVBSykpCisJCWlmICh0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIDAsIFRUWV9CUkVBSykpCiAJCQljb3BpZWQrKzsKIAkJcHJfZGVidWcoInNjaTogQlJFQUsgZGV0ZWN0ZWRcbiIpOwogCX0KQEAgLTY4Miw3ICs2NDAsNyBAQAogCS8qIFhYWDogSGFuZGxlIFNDSUYgb3ZlcnJ1biBlcnJvciAqLwogCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRiAmJiAoc2NpX2luKHBvcnQsIFNDTFNSKSAmIFNDSUZfT1JFUikgIT0gMCkgewogCQlzY2lfb3V0KHBvcnQsIFNDTFNSLCAwKTsKLQkJaWYodHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTikpIHsKKwkJaWYgKHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pKSB7CiAJCQljb3BpZWQrKzsKIAkJCXByX2RlYnVnKCJzY2k6IG92ZXJydW4gZXJyb3JcbiIpOwogCQl9CkBAIC02OTEsMTMgKzY0OSwxMiBAQAogCiAJaWYgKGNvcGllZCkKIAkJdHR5X2ZsaXBfYnVmZmVyX3B1c2godHR5KTsKKwogCXJldHVybiBjb3BpZWQ7CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBzY2lfcnhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKnB0ciwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2NpX3J4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpwb3J0LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gcHRyOwotCiAJLyogSSB0aGluayBzY2lfcmVjZWl2ZV9jaGFycyBoYXMgdG8gYmUgY2FsbGVkIGlycmVzcGVjdGl2ZQogCSAqIG9mIHdoZXRoZXIgdGhlIElfSVhPRkYgaXMgc2V0LCBvdGhlcndpc2UsIGhvdyBpcyB0aGUgaW50ZXJydXB0CiAJICogdG8gYmUgZGlzYWJsZWQ/CkBAIC03MTEsNyArNjY4LDkgQEAKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gcHRyOwogCisJc3Bpbl9sb2NrX2lycSgmcG9ydC0+bG9jayk7CiAJc2NpX3RyYW5zbWl0X2NoYXJzKHBvcnQpOworCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC03NTUsNiArNzE0LDEyIEBACiAKIAkvKiBIYW5kbGUgQlJFQUtzICovCiAJc2NpX2hhbmRsZV9icmVha3MocG9ydCk7CisKKyNpZmRlZiBDT05GSUdfU0hfS0dEQgorCS8qIEJyZWFrIGludG8gdGhlIGRlYnVnZ2VyIGlmIGEgYnJlYWsgaXMgZGV0ZWN0ZWQgKi8KKwlCUkVBS1BPSU5UKCk7CisjZW5kaWYKKwogCXNjaV9vdXQocG9ydCwgU0N4U1IsIFNDeFNSX0JSRUFLX0NMRUFSKHBvcnQpKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTc2OSwxNiArNzM0LDE2IEBACiAgICAgICAgIHNjcl9zdGF0dXMgPSBzY2lfaW4ocG9ydCxTQ1NDUik7CiAKIAkvKiBUeCBJbnRlcnJ1cHQgKi8KLSAgICAgICAgaWYgKChzc3Jfc3RhdHVzJjB4MDAyMCkgJiYgKHNjcl9zdGF0dXMmMHgwMDgwKSkKKyAgICAgICAgaWYgKChzc3Jfc3RhdHVzICYgMHgwMDIwKSAmJiAoc2NyX3N0YXR1cyAmIDB4MDA4MCkpCiAgICAgICAgICAgICAgICAgc2NpX3R4X2ludGVycnVwdChpcnEsIHB0ciwgcmVncyk7CiAJLyogUnggSW50ZXJydXB0ICovCi0gICAgICAgIGlmICgoc3NyX3N0YXR1cyYweDAwMDIpICYmIChzY3Jfc3RhdHVzJjB4MDA0MCkpCisgICAgICAgIGlmICgoc3NyX3N0YXR1cyAmIDB4MDAwMikgJiYgKHNjcl9zdGF0dXMgJiAweDAwNDApKQogICAgICAgICAgICAgICAgIHNjaV9yeF9pbnRlcnJ1cHQoaXJxLCBwdHIsIHJlZ3MpOwogCS8qIEVycm9yIEludGVycnVwdCAqLwotICAgICAgICBpZiAoKHNzcl9zdGF0dXMmMHgwMDgwKSAmJiAoc2NyX3N0YXR1cyYweDA0MDApKQorICAgICAgICBpZiAoKHNzcl9zdGF0dXMgJiAweDAwODApICYmIChzY3Jfc3RhdHVzICYgMHgwNDAwKSkKICAgICAgICAgICAgICAgICBzY2lfZXJfaW50ZXJydXB0KGlycSwgcHRyLCByZWdzKTsKIAkvKiBCcmVhayBJbnRlcnJ1cHQgKi8KLSAgICAgICAgaWYgKChzc3Jfc3RhdHVzJjB4MDAxMCkgJiYgKHNjcl9zdGF0dXMmMHgwMjAwKSkKKyAgICAgICAgaWYgKChzc3Jfc3RhdHVzICYgMHgwMDEwKSAmJiAoc2NyX3N0YXR1cyAmIDB4MDIwMCkpCiAgICAgICAgICAgICAgICAgc2NpX2JyX2ludGVycnVwdChpcnEsIHB0ciwgcmVncyk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC03ODksNyArNzU0LDggQEAKICAqIEhlcmUgd2UgZGVmaW5lIGEgdHJhbnNpc3Rpb24gbm90aWZpZXIgc28gdGhhdCB3ZSBjYW4gdXBkYXRlIGFsbCBvZiBvdXIKICAqIHBvcnRzJyBiYXVkIHJhdGUgd2hlbiB0aGUgcGVyaXBoZXJhbCBjbG9jayBjaGFuZ2VzLgogICovCi1zdGF0aWMgaW50IHNjaV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgcGhhc2UsIHZvaWQgKnApCitzdGF0aWMgaW50IHNjaV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQl1bnNpZ25lZCBsb25nIHBoYXNlLCB2b2lkICpwKQogewogCXN0cnVjdCBjcHVmcmVxX2ZyZXFzICpmcmVxcyA9IHA7CiAJaW50IGk7CkBAIC04MTYsOCArNzgyLDkgQEAKIAkJCWNsa19wdXQoY2xrKTsKIAkJfQogCi0JCXByaW50aygiJXM6IGdvdCBhIHBvc3RjaGFuZ2Ugbm90aWZpY2F0aW9uIGZvciBjcHUgJWQgKG9sZCAlZCwgbmV3ICVkKVxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIGZyZXFzLT5jcHUsIGZyZXFzLT5vbGQsIGZyZXFzLT5uZXcpOworCQlwcmludGsoS0VSTl9JTkZPICIlczogZ290IGEgcG9zdGNoYW5nZSBub3RpZmljYXRpb24gIgorCQkgICAgICAgImZvciBjcHUgJWQgKG9sZCAlZCwgbmV3ICVkKVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgZnJlcXMtPmNwdSwgZnJlcXMtPm9sZCwgZnJlcXMtPm5ldyk7CiAJfQogCiAJcmV0dXJuIE5PVElGWV9PSzsKQEAgLTg0MSw4ICs4MDgsOSBAQAogCQkJcHJpbnRrKEtFUk5fRVJSICJzY2k6IENhbm5vdCBhbGxvY2F0ZSBpcnEuKElSUT0wKVxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCQlpZiAocmVxdWVzdF9pcnEocG9ydC0+aXJxc1swXSwgc2NpX21weGVkX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKLQkJCQkic2NpIiwgcG9ydCkpIHsKKworCQlpZiAocmVxdWVzdF9pcnEocG9ydC0+aXJxc1swXSwgc2NpX21weGVkX2ludGVycnVwdCwKKwkJCQlTQV9JTlRFUlJVUFQsICJzY2kiLCBwb3J0KSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJzY2k6IENhbm5vdCBhbGxvY2F0ZSBpcnEuXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CkBAIC04NTAsOCArODE4LDggQEAKIAkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaGFuZGxlcnMpOyBpKyspIHsKIAkJCWlmICghcG9ydC0+aXJxc1tpXSkKIAkJCQljb250aW51ZTsKLQkJCWlmIChyZXF1ZXN0X2lycShwb3J0LT5pcnFzW2ldLCBoYW5kbGVyc1tpXSwgSVJRRl9ESVNBQkxFRCwKLQkJCQkJZGVzY1tpXSwgcG9ydCkpIHsKKwkJCWlmIChyZXF1ZXN0X2lycShwb3J0LT5pcnFzW2ldLCBoYW5kbGVyc1tpXSwKKwkJCQkJU0FfSU5URVJSVVBULCBkZXNjW2ldLCBwb3J0KSkgewogCQkJCXByaW50ayhLRVJOX0VSUiAic2NpOiBDYW5ub3QgYWxsb2NhdGUgaXJxLlxuIik7CiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAJCQl9CkBAIC05MDMsNTAgKzg3MSw0MiBAQAogCiBzdGF0aWMgdm9pZCBzY2lfc3RhcnRfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQlzdHJ1Y3Qgc2NpX3BvcnQgKnMgPSAmc2NpX3BvcnRzW3BvcnQtPmxpbmVdOworCXVuc2lnbmVkIHNob3J0IGN0cmw7CiAKLQlkaXNhYmxlX2lycShzLT5pcnFzW1NDSXhfVFhJX0lSUV0pOwotCXNjaV90cmFuc21pdF9jaGFycyhwb3J0KTsKLQllbmFibGVfaXJxKHMtPmlycXNbU0NJeF9UWElfSVJRXSk7CisJLyogU2V0IFRJRSAoVHJhbnNtaXQgSW50ZXJydXB0IEVuYWJsZSkgYml0IGluIFNDU0NSICovCisJY3RybCA9IHNjaV9pbihwb3J0LCBTQ1NDUik7CisJY3RybCB8PSBTQ0lfQ1RSTF9GTEFHU19USUU7CisJc2NpX291dChwb3J0LCBTQ1NDUiwgY3RybCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNjaV9zdG9wX3R4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBzaG9ydCBjdHJsOwogCiAJLyogQ2xlYXIgVElFIChUcmFuc21pdCBJbnRlcnJ1cHQgRW5hYmxlKSBiaXQgaW4gU0NTQ1IgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJY3RybCA9IHNjaV9pbihwb3J0LCBTQ1NDUik7CiAJY3RybCAmPSB+U0NJX0NUUkxfRkxBR1NfVElFOwogCXNjaV9vdXQocG9ydCwgU0NTQ1IsIGN0cmwpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgc2NpX3N0YXJ0X3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB0dHlfc3RhcnQpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBzaG9ydCBjdHJsOwogCiAJLyogU2V0IFJJRSAoUmVjZWl2ZSBJbnRlcnJ1cHQgRW5hYmxlKSBiaXQgaW4gU0NTQ1IgKi8KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJY3RybCA9IHNjaV9pbihwb3J0LCBTQ1NDUik7CiAJY3RybCB8PSBTQ0lfQ1RSTF9GTEFHU19SSUUgfCBTQ0lfQ1RSTF9GTEFHU19SRUlFOwogCXNjaV9vdXQocG9ydCwgU0NTQ1IsIGN0cmwpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgc2NpX3N0b3Bfcngoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIHNob3J0IGN0cmw7CiAKIAkvKiBDbGVhciBSSUUgKFJlY2VpdmUgSW50ZXJydXB0IEVuYWJsZSkgYml0IGluIFNDU0NSICovCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWN0cmwgPSBzY2lfaW4ocG9ydCwgU0NTQ1IpOwogCWN0cmwgJj0gfihTQ0lfQ1RSTF9GTEFHU19SSUUgfCBTQ0lfQ1RSTF9GTEFHU19SRUlFKTsKIAlzY2lfb3V0KHBvcnQsIFNDU0NSLCBjdHJsKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIHNjaV9lbmFibGVfbXMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKQEAgLTk2Myw5ICs5MjMsOCBAQAogewogCXN0cnVjdCBzY2lfcG9ydCAqcyA9ICZzY2lfcG9ydHNbcG9ydC0+bGluZV07CiAKLSNpZiBkZWZpbmVkKF9fSDgzMDBTX18pCi0JaDgzMDBfc2NpX2VuYWJsZShwb3J0LCBzY2lfZW5hYmxlKTsKLSNlbmRpZgorCWlmIChzLT5lbmFibGUpCisJCXMtPmVuYWJsZShwb3J0KTsKIAogCXNjaV9yZXF1ZXN0X2lycShzKTsKIAlzY2lfc3RhcnRfdHgocG9ydCk7CkBAIC05ODIsOSArOTQxLDggQEAKIAlzY2lfc3RvcF90eChwb3J0KTsKIAlzY2lfZnJlZV9pcnEocyk7CiAKLSNpZiBkZWZpbmVkKF9fSDgzMDBTX18pCi0JaDgzMDBfc2NpX2VuYWJsZShwb3J0LCBzY2lfZGlzYWJsZSk7Ci0jZW5kaWYKKwlpZiAocy0+ZGlzYWJsZSkKKwkJcy0+ZGlzYWJsZShwb3J0KTsKIH0KIAogc3RhdGljIHZvaWQgc2NpX3NldF90ZXJtaW9zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zLApAQCAtOTk3LDM0ICs5NTUsNiBAQAogCiAJYmF1ZCA9IHVhcnRfZ2V0X2JhdWRfcmF0ZShwb3J0LCB0ZXJtaW9zLCBvbGQsIDAsIHBvcnQtPnVhcnRjbGsvMTYpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQotCWRvIHsKLQkJc3RhdHVzID0gc2NpX2luKHBvcnQsIFNDeFNSKTsKLQl9IHdoaWxlICghKHN0YXR1cyAmIFNDeFNSX1RFTkQocG9ydCkpKTsKLQotCXNjaV9vdXQocG9ydCwgU0NTQ1IsIDB4MDApOwkvKiBURT0wLCBSRT0wLCBDS0UxPTAgKi8KLQotI2lmICFkZWZpbmVkKFNDSV9PTkxZKQotCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRikgewotCQlzY2lfb3V0KHBvcnQsIFNDRkNSLCBTQ0ZDUl9SRlJTVCB8IFNDRkNSX1RGUlNUKTsKLQl9Ci0jZW5kaWYKLQotCXNtcl92YWwgPSBzY2lfaW4ocG9ydCwgU0NTTVIpICYgMzsKLQlpZiAoKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgPT0gQ1M3KQotCQlzbXJfdmFsIHw9IDB4NDA7Ci0JaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJFTkIpCi0JCXNtcl92YWwgfD0gMHgyMDsKLQlpZiAodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkKLQkJc21yX3ZhbCB8PSAweDMwOwotCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NUT1BCKQotCQlzbXJfdmFsIHw9IDB4MDg7Ci0KLQl1YXJ0X3VwZGF0ZV90aW1lb3V0KHBvcnQsIHRlcm1pb3MtPmNfY2ZsYWcsIGJhdWQpOwotCi0Jc2NpX291dChwb3J0LCBTQ1NNUiwgc21yX3ZhbCk7Ci0KIAlzd2l0Y2ggKGJhdWQpIHsKIAkJY2FzZSAwOgogCQkJdCA9IC0xOwpAQCAtMTA0Miw2ICs5NzIsMzMgQEAKIAkJCWJyZWFrOwogCX0KIAorCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CisKKwlkbyB7CisJCXN0YXR1cyA9IHNjaV9pbihwb3J0LCBTQ3hTUik7CisJfSB3aGlsZSAoIShzdGF0dXMgJiBTQ3hTUl9URU5EKHBvcnQpKSk7CisKKwlzY2lfb3V0KHBvcnQsIFNDU0NSLCAweDAwKTsJLyogVEU9MCwgUkU9MCwgQ0tFMT0wICovCisKKyNpZiAhZGVmaW5lZChTQ0lfT05MWSkKKwlpZiAocG9ydC0+dHlwZSA9PSBQT1JUX1NDSUYpCisJCXNjaV9vdXQocG9ydCwgU0NGQ1IsIFNDRkNSX1JGUlNUIHwgU0NGQ1JfVEZSU1QpOworI2VuZGlmCisKKwlzbXJfdmFsID0gc2NpX2luKHBvcnQsIFNDU01SKSAmIDM7CisJaWYgKCh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NJWkUpID09IENTNykKKwkJc21yX3ZhbCB8PSAweDQwOworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CKQorCQlzbXJfdmFsIHw9IDB4MjA7CisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJPREQpCisJCXNtcl92YWwgfD0gMHgzMDsKKwlpZiAodGVybWlvcy0+Y19jZmxhZyAmIENTVE9QQikKKwkJc21yX3ZhbCB8PSAweDA4OworCisJdWFydF91cGRhdGVfdGltZW91dChwb3J0LCB0ZXJtaW9zLT5jX2NmbGFnLCBiYXVkKTsKKworCXNjaV9vdXQocG9ydCwgU0NTTVIsIHNtcl92YWwpOworCiAJaWYgKHQgPiAwKSB7CiAJCWlmKHQgPj0gMjU2KSB7CiAJCQlzY2lfb3V0KHBvcnQsIFNDU01SLCAoc2NpX2luKHBvcnQsIFNDU01SKSAmIH4zKSB8IDEpOwpAQCAtMTA5MiwxMSArMTA0OSwyMyBAQAogCiAJcG9ydC0+dHlwZSA9IHMtPnR5cGU7CiAKKwlzd2l0Y2ggKHBvcnQtPnR5cGUpIHsKKwljYXNlIFBPUlRfU0NJOgorCQlzLT5pbml0X3BpbnMgPSBzY2lfaW5pdF9waW5zX3NjaTsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX1NDSUY6CisJCXMtPmluaXRfcGlucyA9IHNjaV9pbml0X3BpbnNfc2NpZjsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX0lSREE6CisJCXMtPmluaXRfcGlucyA9IHNjaV9pbml0X3BpbnNfaXJkYTsKKwkJYnJlYWs7CisJfQorCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMSkgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g1XzEwMykKIAlpZiAocG9ydC0+bWFwYmFzZSA9PSAwKQogCQlwb3J0LT5tYXBiYXNlID0gb25jaGlwX3JlbWFwKFNDSUZfQUREUl9TSDUsIDEwMjQsICJTQ0lGIik7CiAKLQlwb3J0LT5tZW1iYXNlID0gKHZvaWQgKilwb3J0LT5tYXBiYXNlOworCXBvcnQtPm1lbWJhc2UgPSAodm9pZCBfX2lvbWVtICopcG9ydC0+bWFwYmFzZTsKICNlbmRpZgogfQogCkBAIC0xMTMyLDQxMiArMTEwMSw2MSBAQAogCS52ZXJpZnlfcG9ydAk9IHNjaV92ZXJpZnlfcG9ydCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc2NpX3BvcnQgc2NpX3BvcnRzW10gPSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4KQotCXsKLQkJLnBvcnQJPSB7Ci0JCQkubWVtYmFzZQk9ICh2b2lkICopMHhmZmZmZmU4MCwKLQkJCS5tYXBiYXNlCT0gMHhmZmZmZmU4MCwKLQkJCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCQkuaXJxCQk9IDI1LAotCQkJLm9wcwkJPSAmc2NpX3VhcnRfb3BzLAotCQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCQkJLmxpbmUJCT0gMCwKLQkJfSwKLQkJLnR5cGUJCT0gUE9SVF9TQ0ksCi0JCS5pcnFzCQk9IFNDSV9JUlFTLAotCX0sCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpCi0JewotCQkucG9ydAk9IHsKLQkJCS5tZW1iYXNlCT0gKHZvaWQgKilTQ0lGMCwKLQkJCS5tYXBiYXNlCT0gU0NJRjAsCi0JCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkJLmlycQkJPSA1NSwKLQkJCS5vcHMJCT0gJnNjaV91YXJ0X29wcywKLQkJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkJCS5saW5lCQk9IDAsCi0JCX0sCi0JCS50eXBlCQk9IFBPUlRfU0NJRiwKLQkJLmlycXMJCT0gU0gzX0lSREFfSVJRUywKLQkJLmluaXRfcGlucwk9IHNjaV9pbml0X3BpbnNfc2NpZiwKLQl9LAotCXsKLQkJLnBvcnQJPSB7Ci0JCQkubWVtYmFzZQk9ICh2b2lkICopU0NJRjIsCi0JCQkubWFwYmFzZQk9IFNDSUYyLAotCQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJCS5pcnEJCT0gNTksCi0JCQkub3BzCQk9ICZzY2lfdWFydF9vcHMsCi0JCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCQkubGluZQkJPSAxLAotCQl9LAotCQkudHlwZQkJPSBQT1JUX1NDSUYsCi0JCS5pcnFzCQk9IFNIM19TQ0lGX0lSUVMsCi0JCS5pbml0X3BpbnMJPSBzY2lfaW5pdF9waW5zX3NjaWYsCi0JfQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpCi0JewotCQkucG9ydAk9IHsKLQkJCS5tZW1iYXNlCT0gKHZvaWQgKikweGZmZmZmZTgwLAotCQkJLm1hcGJhc2UJPSAweGZmZmZmZTgwLAotCQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJCS5pcnEJCT0gMjUsCi0JCQkub3BzCQk9ICZzY2lfdWFydF9vcHMsCi0JCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCQkubGluZQkJPSAwLAotCQl9LAotCQkudHlwZQkJPSBQT1JUX1NDSSwKLQkJLmlycXMJCT0gU0NJX0lSUVMsCi0JfSwKLQl7Ci0JCS5wb3J0CT0gewotCQkJLm1lbWJhc2UJPSAodm9pZCAqKTB4YTQwMDAxNTAsCi0JCQkubWFwYmFzZQk9IDB4YTQwMDAxNTAsCi0JCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkJLmlycQkJPSA1OSwKLQkJCS5vcHMJCT0gJnNjaV91YXJ0X29wcywKLQkJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkJCS5saW5lCQk9IDEsCi0JCX0sCi0JCS50eXBlCQk9IFBPUlRfU0NJRiwKLQkJLmlycXMJCT0gU0gzX1NDSUZfSVJRUywKLQkJLmluaXRfcGlucwk9IHNjaV9pbml0X3BpbnNfc2NpZiwKLQl9LAotCXsKLQkJLnBvcnQJPSB7Ci0JCQkubWVtYmFzZQk9ICh2b2lkICopMHhhNDAwMDE0MCwKLQkJCS5tYXBiYXNlCT0gMHhhNDAwMDE0MCwKLQkJCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCQkuaXJxCQk9IDU1LAotCQkJLm9wcwkJPSAmc2NpX3VhcnRfb3BzLAotCQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCQkJLmxpbmUJCT0gMiwKLQkJfSwKLQkJLnR5cGUJCT0gUE9SVF9JUkRBLAotCQkuaXJxcwkJPSBTSDNfSVJEQV9JUlFTLAotCQkuaW5pdF9waW5zCT0gc2NpX2luaXRfcGluc19pcmRhLAotCX0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMwMCkKLQl7Ci0JCS5wb3J0CT0gewotCQkJLm1lbWJhc2UJPSAodm9pZCAqKTB4QTQ0MzAwMDAsCi0JCQkubWFwYmFzZQk9IDB4QTQ0MzAwMDAsCi0JCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkJLmlycQkJPSAyNSwKLQkJCS5vcHMJCT0gJnNjaV91YXJ0X29wcywKLQkJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkJCS5saW5lCQk9IDAsCi0JCX0sCi0JCS50eXBlCQk9IFBPUlRfU0NJRiwKLQkJLmlycXMJCT0gU0g3MzAwX1NDSUYwX0lSUVMsCi0JCS5pbml0X3BpbnMJPSBzY2lfaW5pdF9waW5zX3NjaWYsCi0JfSwKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCi0JewotCQkucG9ydAk9IHsKLQkJCS5tZW1iYXNlCT0gKHZvaWQgKikweGZmZTAwMDAwLAotCQkJLm1hcGJhc2UJPSAweGZmZTAwMDAwLAotCQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJCS5pcnEJCT0gMjUsCi0JCQkub3BzCQk9ICZzY2lfdWFydF9vcHMsCi0JCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCQkubGluZQkJPSAwLAotCQl9LAotCQkudHlwZQkJPSBQT1JUX1NDSUYsCi0JCS5pcnFzCQk9IFNINzMxODBfU0NJRl9JUlFTLAotCQkuaW5pdF9waW5zCT0gc2NpX2luaXRfcGluc19zY2lmLAotCX0sCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDRfMjAyKQotCXsKLQkJLnBvcnQJPSB7Ci0JCQkubWVtYmFzZQk9ICh2b2lkICopMHhmZmU4MDAwMCwKLQkJCS5tYXBiYXNlCT0gMHhmZmU4MDAwMCwKLQkJCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCQkuaXJxCQk9IDQzLAotCQkJLm9wcwkJPSAmc2NpX3VhcnRfb3BzLAotCQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCQkJLmxpbmUJCT0gMCwKLQkJfSwKLQkJLnR5cGUJCT0gUE9SVF9TQ0lGLAotCQkuaXJxcwkJPSBTSDRfU0NJRl9JUlFTLAotCQkuaW5pdF9waW5zCT0gc2NpX2luaXRfcGluc19zY2lmLAotCX0sCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkKLQl7Ci0JCS5wb3J0CT0gewotCQkJLm1lbWJhc2UJPSAodm9pZCAqKTB4ZmZlMDAwMDAsCi0JCQkubWFwYmFzZQk9IDB4ZmZlMDAwMDAsCi0JCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkJLmlycQkJPSAyNSwKLQkJCS5vcHMJCT0gJnNjaV91YXJ0X29wcywKLQkJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkJCS5saW5lCQk9IDAsCi0JCX0sCi0JCS50eXBlCQk9IFBPUlRfU0NJLAotCQkuaXJxcwkJPSBTQ0lfSVJRUywKLQl9LAotCXsKLQkJLnBvcnQJPSB7Ci0JCQkubWVtYmFzZQk9ICh2b2lkICopMHhmZmU4MDAwMCwKLQkJCS5tYXBiYXNlCT0gMHhmZmU4MDAwMCwKLQkJCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCQkuaXJxCQk9IDQzLAotCQkJLm9wcwkJPSAmc2NpX3VhcnRfb3BzLAotCQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCQkJLmxpbmUJCT0gMSwKLQkJfSwKLQkJLnR5cGUJCT0gUE9SVF9TQ0lGLAotCQkuaXJxcwkJPSBTSDRfU0NJRl9JUlFTLAotCQkuaW5pdF9waW5zCT0gc2NpX2luaXRfcGluc19zY2lmLAotCX0sCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjApCi0JewotCQkucG9ydAk9IHsKLQkJCS5tZW1iYXNlCT0gKHZvaWQgKikweGZlNjAwMDAwLAotCQkJLm1hcGJhc2UJPSAweGZlNjAwMDAwLAotCQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJCS5pcnEJCT0gNTUsCi0JCQkub3BzCQk9ICZzY2lfdWFydF9vcHMsCi0JCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCQkubGluZQkJPSAwLAotCQl9LAotCQkudHlwZQkJPSBQT1JUX1NDSUYsCi0JCS5pcnFzCQk9IFNINzc2MF9TQ0lGMF9JUlFTLAotCQkuaW5pdF9waW5zCT0gc2NpX2luaXRfcGluc19zY2lmLAotCX0sCi0JewotCQkucG9ydAk9IHsKLQkJCS5tZW1iYXNlCT0gKHZvaWQgKikweGZlNjEwMDAwLAotCQkJLm1hcGJhc2UJPSAweGZlNjEwMDAwLAotCQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJCS5pcnEJCT0gNzUsCi0JCQkub3BzCQk9ICZzY2lfdWFydF9vcHMsCi0JCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCQkubGluZQkJPSAxLAotCQl9LAotCQkudHlwZQkJPSBQT1JUX1NDSUYsCi0JCS5pcnFzCQk9IFNINzc2MF9TQ0lGMV9JUlFTLAotCQkuaW5pdF9waW5zCT0gc2NpX2luaXRfcGluc19zY2lmLAotCX0sCi0JewotCQkucG9ydAk9IHsKLQkJCS5tZW1iYXNlCT0gKHZvaWQgKikweGZlNjIwMDAwLAotCQkJLm1hcGJhc2UJPSAweGZlNjIwMDAwLAotCQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJCS5pcnEJCT0gNzksCi0JCQkub3BzCQk9ICZzY2lfdWFydF9vcHMsCi0JCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCQkubGluZQkJPSAyLAotCQl9LAotCQkudHlwZQkJPSBQT1JUX1NDSUYsCi0JCS5pcnFzCQk9IFNINzc2MF9TQ0lGMl9JUlFTLAotCQkuaW5pdF9waW5zCT0gc2NpX2luaXRfcGluc19zY2lmLAotCX0sCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TVDQwU1RCMSkKLQl7Ci0JCS5wb3J0CT0gewotCQkJLm1lbWJhc2UJPSAodm9pZCAqKTB4ZmZlMDAwMDAsCi0JCQkubWFwYmFzZQk9IDB4ZmZlMDAwMDAsCi0JCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkJLmlycQkJPSAyNiwKLQkJCS5vcHMJCT0gJnNjaV91YXJ0X29wcywKLQkJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkJCS5saW5lCQk9IDAsCi0JCX0sCi0JCS50eXBlCQk9IFBPUlRfU0NJRiwKLQkJLmlycXMJCT0gU1RCMV9TQ0lGMV9JUlFTLAotCQkuaW5pdF9waW5zCT0gc2NpX2luaXRfcGluc19zY2lmLAotCX0sCi0JewotCQkucG9ydAk9IHsKLQkJCS5tZW1iYXNlCT0gKHZvaWQgKikweGZmZTgwMDAwLAotCQkJLm1hcGJhc2UJPSAweGZmZTgwMDAwLAotCQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJCS5pcnEJCT0gNDMsCi0JCQkub3BzCQk9ICZzY2lfdWFydF9vcHMsCi0JCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCQkubGluZQkJPSAxLAotCQl9LAotCQkudHlwZQkJPSBQT1JUX1NDSUYsCi0JCS5pcnFzCQk9IFNINF9TQ0lGX0lSUVMsCi0JCS5pbml0X3BpbnMJPSBzY2lfaW5pdF9waW5zX3NjaWYsCi0JfSwKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDEpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINV8xMDMpCi0JewotCQkucG9ydAk9IHsKLQkJCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCQkuaXJxCQk9IDQyLAotCQkJLm9wcwkJPSAmc2NpX3VhcnRfb3BzLAotCQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCQkJLmxpbmUJCT0gMCwKLQkJfSwKLQkJLnR5cGUJCT0gUE9SVF9TQ0lGLAotCQkuaXJxcwkJPSBTSDVfU0NJRl9JUlFTLAotCQkuaW5pdF9waW5zCT0gc2NpX2luaXRfcGluc19zY2lmLAotCX0sCi0jZWxpZiBkZWZpbmVkKENPTkZJR19IODMwMDcpIHx8IGRlZmluZWQoQ09ORklHX0g4MzA2OCkKLQl7Ci0JCS5wb3J0CT0gewotCQkJLm1lbWJhc2UJPSAodm9pZCAqKTB4MDBmZmZmYjAsCi0JCQkubWFwYmFzZQk9IDB4MDBmZmZmYjAsCi0JCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkJLmlycQkJPSA1NCwKLQkJCS5vcHMJCT0gJnNjaV91YXJ0X29wcywKLQkJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkJCS5saW5lCQk9IDAsCi0JCX0sCi0JCS50eXBlCQk9IFBPUlRfU0NJLAotCQkuaXJxcwkJPSBIODMwMEhfU0NJX0lSUVMwLAotCQkuaW5pdF9waW5zCT0gc2NpX2luaXRfcGluc19zY2ksCi0JfSwKLQl7Ci0JCS5wb3J0CT0gewotCQkJLm1lbWJhc2UJPSAodm9pZCAqKTB4MDBmZmZmYjgsCi0JCQkubWFwYmFzZQk9IDB4MDBmZmZmYjgsCi0JCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkJLmlycQkJPSA1OCwKLQkJCS5vcHMJCT0gJnNjaV91YXJ0X29wcywKLQkJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkJCS5saW5lCQk9IDEsCi0JCX0sCi0JCS50eXBlCQk9IFBPUlRfU0NJLAotCQkuaXJxcwkJPSBIODMwMEhfU0NJX0lSUVMxLAotCQkuaW5pdF9waW5zCT0gc2NpX2luaXRfcGluc19zY2ksCi0JfSwKLQl7Ci0JCS5wb3J0CT0gewotCQkJLm1lbWJhc2UJPSAodm9pZCAqKTB4MDBmZmZmYzAsCi0JCQkubWFwYmFzZQk9IDB4MDBmZmZmYzAsCi0JCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkJLmlycQkJPSA2MiwKLQkJCS5vcHMJCT0gJnNjaV91YXJ0X29wcywKLQkJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkJCS5saW5lCQk9IDIsCi0JCX0sCi0JCS50eXBlCQk9IFBPUlRfU0NJLAotCQkuaXJxcwkJPSBIODMwMEhfU0NJX0lSUVMyLAotCQkuaW5pdF9waW5zCT0gc2NpX2luaXRfcGluc19zY2ksCi0JfSwKLSNlbGlmIGRlZmluZWQoQ09ORklHX0g4UzI2NzgpCi0JewotCQkucG9ydAk9IHsKLQkJCS5tZW1iYXNlCT0gKHZvaWQgKikweDAwZmZmZjc4LAotCQkJLm1hcGJhc2UJPSAweDAwZmZmZjc4LAotCQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJCS5pcnEJCT0gOTAsCi0JCQkub3BzCQk9ICZzY2lfdWFydF9vcHMsCi0JCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCQkubGluZQkJPSAwLAotCQl9LAotCQkudHlwZQkJPSBQT1JUX1NDSSwKLQkJLmlycXMJCT0gSDhTX1NDSV9JUlFTMCwKLQkJLmluaXRfcGlucwk9IHNjaV9pbml0X3BpbnNfc2NpLAotCX0sCi0JewotCQkucG9ydAk9IHsKLQkJCS5tZW1iYXNlCT0gKHZvaWQgKikweDAwZmZmZjgwLAotCQkJLm1hcGJhc2UJPSAweDAwZmZmZjgwLAotCQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJCS5pcnEJCT0gOTQsCi0JCQkub3BzCQk9ICZzY2lfdWFydF9vcHMsCi0JCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCQkubGluZQkJPSAxLAotCQl9LAotCQkudHlwZQkJPSBQT1JUX1NDSSwKLQkJLmlycXMJCT0gSDhTX1NDSV9JUlFTMSwKLQkJLmluaXRfcGlucwk9IHNjaV9pbml0X3BpbnNfc2NpLAotCX0sCi0JewotCQkucG9ydAk9IHsKLQkJCS5tZW1iYXNlCT0gKHZvaWQgKikweDAwZmZmZjg4LAotCQkJLm1hcGJhc2UJPSAweDAwZmZmZjg4LAotCQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJCS5pcnEJCT0gOTgsCi0JCQkub3BzCQk9ICZzY2lfdWFydF9vcHMsCi0JCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCQkubGluZQkJPSAyLAotCQl9LAotCQkudHlwZQkJPSBQT1JUX1NDSSwKLQkJLmlycXMJCT0gSDhTX1NDSV9JUlFTMiwKLQkJLmluaXRfcGlucwk9IHNjaV9pbml0X3BpbnNfc2NpLAotCX0sCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NzApCi0JewotCQkucG9ydCAgID0gewotCQkJLm1lbWJhc2UJPSAodm9pZCAqKTB4ZmY5MjMwMDAsCi0JCQkubWFwYmFzZQk9IDB4ZmY5MjMwMDAsCi0JCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkJLmlycQkJPSA2MSwKLQkJCS5vcHMJCT0gJnNjaV91YXJ0X29wcywKLQkJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkJCS5saW5lCQk9IDAsCi0JCX0sCi0JCS50eXBlCQk9IFBPUlRfU0NJRiwKLQkJLmlycXMJCT0gU0g3NzcwX1NDSUYwX0lSUVMsCi0JCS5pbml0X3BpbnMJPSBzY2lfaW5pdF9waW5zX3NjaWYsCi0JfSwKLQl7Ci0JCS5wb3J0ICAgPSB7Ci0JCQkubWVtYmFzZQk9ICh2b2lkICopMHhmZjkyNDAwMCwKLQkJCS5tYXBiYXNlCT0gMHhmZjkyNDAwMCwKLQkJCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCQkuaXJxCQk9IDYyLAotCQkJLm9wcwkJPSAmc2NpX3VhcnRfb3BzLAotCQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCQkJLmxpbmUJCT0gMSwKLQkJfSwKLQkJLnR5cGUJCT0gUE9SVF9TQ0lGLAotCQkuaXJxcwkJPSBTSDc3NzBfU0NJRjFfSVJRUywKLQkJLmluaXRfcGlucwk9IHNjaV9pbml0X3BpbnNfc2NpZiwKLQl9LAotCXsKLQkJLnBvcnQgICA9IHsKLQkJCS5tZW1iYXNlCT0gKHZvaWQgKikweGZmOTI1MDAwLAotCQkJLm1hcGJhc2UJPSAweGZmOTI1MDAwLAotCQkJLmlvdHlwZQkJPSBVUElPX01FTSwKLQkJCS5pcnEJCT0gNjMsCi0JCQkub3BzCQk9ICZzY2lfdWFydF9vcHMsCi0JCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCi0JCQkubGluZQkJPSAyLAotCQl9LAotCQkudHlwZQkJPSBQT1JUX1NDSUYsCi0JCS5pcnFzCQk9IFNINzc3MF9TQ0lGMl9JUlFTLAotCQkuaW5pdF9waW5zCT0gc2NpX2luaXRfcGluc19zY2lmLAotCX0sCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCi0JewotCQkucG9ydCAgID0gewotCQkJLm1lbWJhc2UJPSAodm9pZCAqKTB4ZmZlMDAwMDAsCi0JCQkubWFwYmFzZQk9IDB4ZmZlMDAwMDAsCi0JCQkuaW90eXBlCQk9IFVQSU9fTUVNLAotCQkJLmlycQkJPSA0MywKLQkJCS5vcHMJCT0gJnNjaV91YXJ0X29wcywKLQkJCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkJCS5saW5lCQk9IDAsCi0JCX0sCi0JCS50eXBlCQk9IFBPUlRfU0NJRiwKLQkJLmlycXMJCT0gU0g3NzgwX1NDSUYwX0lSUVMsCi0JCS5pbml0X3BpbnMJPSBzY2lfaW5pdF9waW5zX3NjaWYsCi0JfSwKLQl7Ci0JCS5wb3J0ICAgPSB7Ci0JCQkubWVtYmFzZQk9ICh2b2lkICopMHhmZmUxMDAwMCwKLQkJCS5tYXBiYXNlCT0gMHhmZmUxMDAwMCwKLQkJCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCQkuaXJxCQk9IDc5LAotCQkJLm9wcwkJPSAmc2NpX3VhcnRfb3BzLAotCQkJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAotCQkJLmxpbmUJCT0gMSwKLQkJfSwKLQkJLnR5cGUJCT0gUE9SVF9TQ0lGLAotCQkuaXJxcwkJPSBTSDc3ODBfU0NJRjFfSVJRUywKLQkJLmluaXRfcGlucwk9IHNjaV9pbml0X3BpbnNfc2NpZiwKLQl9LAotI2Vsc2UKLSNlcnJvciAiQ1BVIHN1YnR5cGUgbm90IGRlZmluZWQiCitzdGF0aWMgdm9pZCBfX2luaXQgc2NpX2luaXRfcG9ydHModm9pZCkKK3sKKwlzdGF0aWMgaW50IGZpcnN0ID0gMTsKKwlpbnQgaTsKKworCWlmICghZmlyc3QpCisJCXJldHVybjsKKworCWZpcnN0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTlBPUlRTOyBpKyspIHsKKwkJc2NpX3BvcnRzW2ldLnBvcnQub3BzCQk9ICZzY2lfdWFydF9vcHM7CisJCXNjaV9wb3J0c1tpXS5wb3J0LmlvdHlwZQk9IFVQSU9fTUVNOworCQlzY2lfcG9ydHNbaV0ucG9ydC5saW5lCQk9IGk7CisJCXNjaV9wb3J0c1tpXS5wb3J0LmZpZm9zaXplCT0gMTsKKworI2lmIGRlZmluZWQoX19IODMwMEhfXykgfHwgZGVmaW5lZChfX0g4MzAwU19fKQorI2lmZGVmIF9fSDgzMDBTX18KKwkJc2NpX3BvcnRzW2ldLmVuYWJsZQk9IGg4MzAwX3NjaV9lbmFibGU7CisJCXNjaV9wb3J0c1tpXS5kaXNhYmxlCT0gaDgzMDBfc2NpX2Rpc2FibGU7CiAjZW5kaWYKLX07CisJCXNjaV9wb3J0c1tpXS5wb3J0LnVhcnRjbGsgPSBDT05GSUdfQ1BVX0NMT0NLOworI2VsaWYgZGVmaW5lZChDT05GSUdfU1VQRVJINjQpCisJCXNjaV9wb3J0c1tpXS5wb3J0LnVhcnRjbGsgPSBjdXJyZW50X2NwdV9kYXRhLm1vZHVsZV9jbG9jayAqIDE2OworI2Vsc2UKKwkJLyoKKwkJICogWFhYOiBXZSBzaG91bGQgdXNlIGEgcHJvcGVyIFNDSS9TQ0lGIGNsb2NrCisJCSAqLworCQl7CisJCQlzdHJ1Y3QgY2xrICpjbGsgPSBjbGtfZ2V0KCJtb2R1bGVfY2xrIik7CisJCQlzY2lfcG9ydHNbaV0ucG9ydC51YXJ0Y2xrID0gY2xrX2dldF9yYXRlKGNsaykgKiAxNjsKKwkJCWNsa19wdXQoY2xrKTsKKwkJfQorI2VuZGlmCisKKwkJc2NpX3BvcnRzW2ldLmJyZWFrX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykmc2NpX3BvcnRzW2ldOworCQlzY2lfcG9ydHNbaV0uYnJlYWtfdGltZXIuZnVuY3Rpb24gPSBzY2lfYnJlYWtfdGltZXI7CisKKwkJaW5pdF90aW1lcigmc2NpX3BvcnRzW2ldLmJyZWFrX3RpbWVyKTsKKwl9Cit9CisKK2ludCBfX2luaXQgZWFybHlfc2NpX3NldHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJaWYgKHVubGlrZWx5KHBvcnQtPmxpbmUgPiBTQ0lfTlBPUlRTKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzY2lfaW5pdF9wb3J0cygpOworCisJc2NpX3BvcnRzW3BvcnQtPmxpbmVdLnBvcnQubWVtYmFzZQk9IHBvcnQtPm1lbWJhc2U7CisJc2NpX3BvcnRzW3BvcnQtPmxpbmVdLnBvcnQubWFwYmFzZQk9IHBvcnQtPm1hcGJhc2U7CisJc2NpX3BvcnRzW3BvcnQtPmxpbmVdLnBvcnQudHlwZQkJPSBwb3J0LT50eXBlOworCisJcmV0dXJuIDA7Cit9CiAKICNpZmRlZiBDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFCiAvKgpAQCAtMTU1OSwzNCArMTE3NywzOCBAQAogCWludCBmbG93ID0gJ24nOwogCWludCByZXQ7CiAKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgYW4gaW52YWxpZCB1YXJ0IG51bWJlciBoYXMgYmVlbiBzcGVjaWZpZWQsIGFuZAorCSAqIGlmIHNvLCBzZWFyY2ggZm9yIHRoZSBmaXJzdCBhdmFpbGFibGUgcG9ydCB0aGF0IGRvZXMgaGF2ZQorCSAqIGNvbnNvbGUgc3VwcG9ydC4KKwkgKi8KKwlpZiAoY28tPmluZGV4ID49IFNDSV9OUE9SVFMpCisJCWNvLT5pbmRleCA9IDA7CisKIAlzZXJpYWxfY29uc29sZV9wb3J0ID0gJnNjaV9wb3J0c1tjby0+aW5kZXhdOwogCXBvcnQgPSAmc2VyaWFsX2NvbnNvbGVfcG9ydC0+cG9ydDsKLQlwb3J0LT50eXBlID0gc2VyaWFsX2NvbnNvbGVfcG9ydC0+dHlwZTsKLQotI2lmZGVmIENPTkZJR19TVVBFUkg2NAotCS8qIFRoaXMgaXMgZXNwZWNpYWxseSBuZWVkZWQgb24gc2g2NCB0byByZW1hcCB0aGUgU0NJRiAqLwotCXNjaV9jb25maWdfcG9ydChwb3J0LCAwKTsKLSNlbmRpZgogCiAJLyoKLQkgKiBXZSBuZWVkIHRvIHNldCB0aGUgaW5pdGlhbCB1YXJ0Y2xrIGhlcmUsIHNpbmNlIG90aGVyd2lzZSBpdCB3aWxsCi0JICogb25seSBldmVyIGJlIHNldHVwIGF0IHNjaV9pbml0KCkgdGltZS4KKwkgKiBBbHNvIG5lZWQgdG8gY2hlY2sgcG9ydC0+dHlwZSwgd2UgZG9uJ3QgYWN0dWFsbHkgaGF2ZSBhbnkKKwkgKiBVUElPX1BPUlQgcG9ydHMsIGJ1dCB1YXJ0X3JlcG9ydF9wb3J0KCkgaGFuZGlseSBtaXNyZXBvcnRzCisJICogaXQgYW55d2F5cyBpZiB3ZSBkb24ndCBoYXZlIGEgcG9ydCBhdmFpbGFibGUgYnkgdGhlIHRpbWUgdGhpcyBpcworCSAqIGNhbGxlZC4KIAkgKi8KLSNpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykKLQlwb3J0LT51YXJ0Y2xrID0gQ09ORklHX0NQVV9DTE9DSzsKKwlpZiAoIXBvcnQtPnR5cGUpCisJCXJldHVybiAtRU5PREVWOworCWlmICghcG9ydC0+bWVtYmFzZSB8fCAhcG9ydC0+bWFwYmFzZSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLSNpZiBkZWZpbmVkKF9fSDgzMDBTX18pCi0JaDgzMDBfc2NpX2VuYWJsZShwb3J0LCBzY2lfZW5hYmxlKTsKLSNlbmRpZgotI2VsaWYgZGVmaW5lZChDT05GSUdfU1VQRVJINjQpCi0JcG9ydC0+dWFydGNsayA9IGN1cnJlbnRfY3B1X2RhdGEubW9kdWxlX2Nsb2NrICogMTY7Ci0jZWxzZQotCXsKLQkJc3RydWN0IGNsayAqY2xrID0gY2xrX2dldCgibW9kdWxlX2NsayIpOwotCQlwb3J0LT51YXJ0Y2xrID0gY2xrX2dldF9yYXRlKGNsaykgKiAxNjsKLQkJY2xrX3B1dChjbGspOwotCX0KLSNlbmRpZgorCXNwaW5fbG9ja19pbml0KCZwb3J0LT5sb2NrKTsKKworCXBvcnQtPnR5cGUgPSBzZXJpYWxfY29uc29sZV9wb3J0LT50eXBlOworCisJaWYgKHBvcnQtPmZsYWdzICYgVVBGX0lPUkVNQVApCisJCXNjaV9jb25maWdfcG9ydChwb3J0LCAwKTsKKworCWlmIChzZXJpYWxfY29uc29sZV9wb3J0LT5lbmFibGUpCisJCXNlcmlhbF9jb25zb2xlX3BvcnQtPmVuYWJsZShwb3J0KTsKKwogCWlmIChvcHRpb25zKQogCQl1YXJ0X3BhcnNlX29wdGlvbnMob3B0aW9ucywgJmJhdWQsICZwYXJpdHksICZiaXRzLCAmZmxvdyk7CiAKQEAgLTE2MDQsMTcgKzEyMjYsMTcgQEAKIAkuZGV2aWNlCQk9IHVhcnRfY29uc29sZV9kZXZpY2UsCiAJLndyaXRlCQk9IHNlcmlhbF9jb25zb2xlX3dyaXRlLAogCS5zZXR1cAkJPSBzZXJpYWxfY29uc29sZV9zZXR1cCwKLQkuZmxhZ3MJCT0gQ09OX1BSSU5UQlVGRkVSLAorCS5mbGFncwkJPSBDT05fUFJJTlRCVUZGRVIsIAogCS5pbmRleAkJPSAtMSwKIAkuZGF0YQkJPSAmc2NpX3VhcnRfZHJpdmVyLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2NpX2NvbnNvbGVfaW5pdCh2b2lkKQogeworCXNjaV9pbml0X3BvcnRzKCk7CiAJcmVnaXN0ZXJfY29uc29sZSgmc2VyaWFsX2NvbnNvbGUpOwogCXJldHVybiAwOwogfQotCiBjb25zb2xlX2luaXRjYWxsKHNjaV9jb25zb2xlX2luaXQpOwogI2VuZGlmIC8qIENPTkZJR19TRVJJQUxfU0hfU0NJX0NPTlNPTEUgKi8KIApAQCAtMTY0OSw2ICsxMjcxLDggQEAKIAlpbnQgcGFyaXR5ID0gJ24nOwogCWludCBmbG93ID0gJ24nOwogCisJc3Bpbl9sb2NrX2luaXQoJnBvcnQtPmxvY2spOworCiAJaWYgKGNvLT5pbmRleCAhPSBrZ2RiX3BvcnRudW0pCiAJCWNvLT5pbmRleCA9IGtnZGJfcG9ydG51bTsKIApAQCAtMTY3NywxMCArMTMwMSwxMCBAQAogLyogUmVnaXN0ZXIgdGhlIEtHREIgY29uc29sZSBzbyB3ZSBnZXQgbWVzc2FnZXMgKGQnb2ghKSAqLwogc3RhdGljIGludCBfX2luaXQga2dkYl9jb25zb2xlX2luaXQodm9pZCkKIHsKKwlzY2lfaW5pdF9wb3J0cygpOwogCXJlZ2lzdGVyX2NvbnNvbGUoJmtnZGJfY29uc29sZSk7CiAJcmV0dXJuIDA7CiB9Ci0KIGNvbnNvbGVfaW5pdGNhbGwoa2dkYl9jb25zb2xlX2luaXQpOwogI2VuZGlmIC8qIENPTkZJR19TSF9LR0RCX0NPTlNPTEUgKi8KIApAQCAtMTcwMSw2MCArMTMyNSwxMzIgQEAKIAkuZGV2X25hbWUJPSAidHR5U0MiLAogCS5tYWpvcgkJPSBTQ0lfTUFKT1IsCiAJLm1pbm9yCQk9IFNDSV9NSU5PUl9TVEFSVCwKKwkubnIJCT0gU0NJX05QT1JUUywKIAkuY29ucwkJPSBTQ0lfQ09OU09MRSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHNjaV9pbml0KHZvaWQpCisvKgorICogUmVnaXN0ZXIgYSBzZXQgb2Ygc2VyaWFsIGRldmljZXMgYXR0YWNoZWQgdG8gYSBwbGF0Zm9ybSBkZXZpY2UuICBUaGUKKyAqIGxpc3QgaXMgdGVybWluYXRlZCB3aXRoIGEgemVybyBmbGFncyBlbnRyeSwgd2hpY2ggbWVhbnMgd2UgZXhwZWN0CisgKiBhbGwgZW50cmllcyB0byBoYXZlIGF0IGxlYXN0IFVQRl9CT09UX0FVVE9DT05GIHNldC4gUGxhdGZvcm1zIHRoYXQgbmVlZAorICogcmVtYXBwaW5nIChzdWNoIGFzIHNoNjQpIHNob3VsZCBhbHNvIHNldCBVUEZfSU9SRU1BUC4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgc2NpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKLQlpbnQgY2hhbiwgcmV0OworCXN0cnVjdCBwbGF0X3NjaV9wb3J0ICpwID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgaTsKIAotCXByaW50aygiJXMiLCBiYW5uZXIpOworCWZvciAoaSA9IDA7IHAgJiYgcC0+ZmxhZ3MgIT0gMCAmJiBpIDwgU0NJX05QT1JUUzsgcCsrLCBpKyspIHsKKwkJc3RydWN0IHNjaV9wb3J0ICpzY2lwb3J0ID0gJnNjaV9wb3J0c1tpXTsKIAotCXNjaV91YXJ0X2RyaXZlci5uciA9IEFSUkFZX1NJWkUoc2NpX3BvcnRzKTsKKwkJc2NpcG9ydC0+cG9ydC5tYXBiYXNlCT0gcC0+bWFwYmFzZTsKIAotCXJldCA9IHVhcnRfcmVnaXN0ZXJfZHJpdmVyKCZzY2lfdWFydF9kcml2ZXIpOwotCWlmIChyZXQgPT0gMCkgewotCQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgU0NJX05QT1JUUzsgY2hhbisrKSB7Ci0JCQlzdHJ1Y3Qgc2NpX3BvcnQgKnNjaXBvcnQgPSAmc2NpX3BvcnRzW2NoYW5dOworCQkvKgorCQkgKiBGb3IgdGhlIHNpbXBsZSAoYW5kIG1ham9yaXR5IG9mKSBjYXNlcyB3aGVyZSB3ZSBkb24ndCBuZWVkCisJCSAqIHRvIGRvIGFueSByZW1hcHBpbmcsIGp1c3QgY2FzdCB0aGUgY29va2llIGRpcmVjdGx5LgorCQkgKi8KKwkJaWYgKHAtPm1hcGJhc2UgJiYgIXAtPm1lbWJhc2UgJiYgIShwLT5mbGFncyAmIFVQRl9JT1JFTUFQKSkKKwkJCXAtPm1lbWJhc2UgPSAodm9pZCBfX2lvbWVtICopcC0+bWFwYmFzZTsKIAotI2lmIGRlZmluZWQoX19IODMwMEhfXykgfHwgZGVmaW5lZChfX0g4MzAwU19fKQotCQkJc2NpcG9ydC0+cG9ydC51YXJ0Y2xrID0gQ09ORklHX0NQVV9DTE9DSzsKLSNlbGlmIGRlZmluZWQoQ09ORklHX1NVUEVSSDY0KQotCQkJc2NpcG9ydC0+cG9ydC51YXJ0Y2xrID0gY3VycmVudF9jcHVfZGF0YS5tb2R1bGVfY2xvY2sgKiAxNjsKLSNlbHNlCi0JCQlzdHJ1Y3QgY2xrICpjbGsgPSBjbGtfZ2V0KCJtb2R1bGVfY2xrIik7Ci0JCQlzY2lwb3J0LT5wb3J0LnVhcnRjbGsgPSBjbGtfZ2V0X3JhdGUoY2xrKSAqIDE2OwotCQkJY2xrX3B1dChjbGspOwotI2VuZGlmCi0JCQl1YXJ0X2FkZF9vbmVfcG9ydCgmc2NpX3VhcnRfZHJpdmVyLCAmc2NpcG9ydC0+cG9ydCk7Ci0JCQlzY2lwb3J0LT5icmVha190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpc2NpcG9ydDsKLQkJCXNjaXBvcnQtPmJyZWFrX3RpbWVyLmZ1bmN0aW9uID0gc2NpX2JyZWFrX3RpbWVyOwotCQkJaW5pdF90aW1lcigmc2NpcG9ydC0+YnJlYWtfdGltZXIpOwotCQl9CisJCXNjaXBvcnQtPnBvcnQubWVtYmFzZQk9IHAtPm1lbWJhc2U7CisKKwkJc2NpcG9ydC0+cG9ydC5pcnEJPSBwLT5pcnFzW1NDSXhfVFhJX0lSUV07CisJCXNjaXBvcnQtPnBvcnQuZmxhZ3MJPSBwLT5mbGFnczsKKwkJc2NpcG9ydC0+cG9ydC5kZXYJPSAmZGV2LT5kZXY7CisKKwkJc2NpcG9ydC0+dHlwZQkJPSBzY2lwb3J0LT5wb3J0LnR5cGUgPSBwLT50eXBlOworCisJCW1lbWNweSgmc2NpcG9ydC0+aXJxcywgJnAtPmlycXMsIHNpemVvZihwLT5pcnFzKSk7CisKKwkJdWFydF9hZGRfb25lX3BvcnQoJnNjaV91YXJ0X2RyaXZlciwgJnNjaXBvcnQtPnBvcnQpOwogCX0KIAogI2lmZGVmIENPTkZJR19DUFVfRlJFUQogCWNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnNjaV9uYiwgQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKTsKLQlwcmludGsoInNjaTogQ1BVIGZyZXF1ZW5jeSBub3RpZmllciByZWdpc3RlcmVkXG4iKTsKKwlkZXZfaW5mbygmZGV2LT5kZXYsICJzY2k6IENQVSBmcmVxdWVuY3kgbm90aWZpZXIgcmVnaXN0ZXJlZFxuIik7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TSF9TVEFOREFSRF9CSU9TCiAJc2hfYmlvc19nZGJfZGV0YWNoKCk7CiAjZW5kaWYKIAorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzY2lfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTlBPUlRTOyBpKyspCisJCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZzY2lfdWFydF9kcml2ZXIsICZzY2lfcG9ydHNbaV0ucG9ydCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2lfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTQ0lfTlBPUlRTOyBpKyspIHsKKwkJc3RydWN0IHNjaV9wb3J0ICpwID0gJnNjaV9wb3J0c1tpXTsKKworCQlpZiAocC0+dHlwZSAhPSBQT1JUX1VOS05PV04gJiYgcC0+cG9ydC5kZXYgPT0gJmRldi0+ZGV2KQorCQkJdWFydF9zdXNwZW5kX3BvcnQoJnNjaV91YXJ0X2RyaXZlciwgJnAtPnBvcnQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjaV9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFNDSV9OUE9SVFM7IGkrKykgeworCQlzdHJ1Y3Qgc2NpX3BvcnQgKnAgPSAmc2NpX3BvcnRzW2ldOworCisJCWlmIChwLT50eXBlICE9IFBPUlRfVU5LTk9XTiAmJiBwLT5wb3J0LmRldiA9PSAmZGV2LT5kZXYpCisJCQl1YXJ0X3Jlc3VtZV9wb3J0KCZzY2lfdWFydF9kcml2ZXIsICZwLT5wb3J0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2NpX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gc2NpX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2NpX3JlbW92ZSksCisJLnN1c3BlbmQJPSBzY2lfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNjaV9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gInNoLXNjaSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzY2lfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwcmludGsoYmFubmVyKTsKKworCXNjaV9pbml0X3BvcnRzKCk7CisKKwlyZXQgPSB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmc2NpX3VhcnRfZHJpdmVyKTsKKwlpZiAobGlrZWx5KHJldCA9PSAwKSkgeworCQlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNjaV9kcml2ZXIpOworCQlpZiAodW5saWtlbHkocmV0KSkKKwkJCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnNjaV91YXJ0X2RyaXZlcik7CisJfQorCiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNjaV9leGl0KHZvaWQpCiB7Ci0JaW50IGNoYW47Ci0KLQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgU0NJX05QT1JUUzsgY2hhbisrKQotCQl1YXJ0X3JlbW92ZV9vbmVfcG9ydCgmc2NpX3VhcnRfZHJpdmVyLCAmc2NpX3BvcnRzW2NoYW5dLnBvcnQpOwotCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNjaV9kcml2ZXIpOwogCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnNjaV91YXJ0X2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KHNjaV9pbml0KTsKIG1vZHVsZV9leGl0KHNjaV9leGl0KTsKIAorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvc2gtc2NpLmggYi9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuaAppbmRleCBhYjMyMGZhLi4yODY0M2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuaAorKysgYi9kcml2ZXJzL3NlcmlhbC9zaC1zY2kuaApAQCAtMTAsNyArMTAsOSBAQAogICogIE1vZGlmaWVkIHRvIHN1cHBvcnQgU0g3MzAwKFNILU1vYmlsZSkgU0NJRi4gVGFrYXNoaSBLdXN1ZGEgKEp1biAyMDAzKS4KICAqICBNb2RpZmllZCB0byBzdXBwb3J0IEg4LzMwMCBTZXJpZXMgWW9zaGlub3JpIFNhdG8gKEZlYiAyMDA0KS4KICAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykKICNpbmNsdWRlIDxhc20vZ3Bpby5oPgpAQCAtMjIsNDAgKzI0LDEzIEBACiAjZW5kaWYKICNlbmRpZgogCi0vKiBPZmZzZXRzIGludG8gdGhlIHNjaV9wb3J0LT5pcnFzIGFycmF5ICovCi0jZGVmaW5lIFNDSXhfRVJJX0lSUSAwCi0jZGVmaW5lIFNDSXhfUlhJX0lSUSAxCi0jZGVmaW5lIFNDSXhfVFhJX0lSUSAyCi0KLS8qICAgICAgICAgICAgICAgICAgICAgRVJJLCBSWEksIFRYSSwgQlJJICovCi0jZGVmaW5lIFNDSV9JUlFTICAgICAgeyAyMywgIDI0LCAgMjUsICAgMCB9Ci0jZGVmaW5lIFNIM19TQ0lGX0lSUVMgeyA1NiwgIDU3LCAgNTksICA1OCB9Ci0jZGVmaW5lIFNIM19JUkRBX0lSUVMgeyA1MiwgIDUzLCAgNTUsICA1NCB9Ci0jZGVmaW5lIFNINF9TQ0lGX0lSUVMgeyA0MCwgIDQxLCAgNDMsICA0MiB9Ci0jZGVmaW5lIFNUQjFfU0NJRjFfSVJRUyB7MjMsIDI0LCAgMjYsICAyNSB9Ci0jZGVmaW5lIFNINzc2MF9TQ0lGMF9JUlFTIHsgNTIsIDUzLCA1NSwgNTQgfQotI2RlZmluZSBTSDc3NjBfU0NJRjFfSVJRUyB7IDcyLCA3MywgNzUsIDc0IH0KLSNkZWZpbmUgU0g3NzYwX1NDSUYyX0lSUVMgeyA3NiwgNzcsIDc5LCA3OCB9Ci0jZGVmaW5lIFNINzMwMF9TQ0lGMF9JUlFTIHs4MCwgIDgwLCAgODAsICA4MCB9Ci0jZGVmaW5lIFNINzMxODBfU0NJRl9JUlFTIHs4MCwgIDgxLCAgODMsICA4MiB9Ci0jZGVmaW5lIEg4MzAwSF9TQ0lfSVJRUzAgezUyLCA1MywgNTQsICAgMCB9Ci0jZGVmaW5lIEg4MzAwSF9TQ0lfSVJRUzEgezU2LCA1NywgNTgsICAgMCB9Ci0jZGVmaW5lIEg4MzAwSF9TQ0lfSVJRUzIgezYwLCA2MSwgNjIsICAgMCB9Ci0jZGVmaW5lIEg4U19TQ0lfSVJRUzAgezg4LCA4OSwgOTAsICAgMCB9Ci0jZGVmaW5lIEg4U19TQ0lfSVJRUzEgezkyLCA5MywgOTQsICAgMCB9Ci0jZGVmaW5lIEg4U19TQ0lfSVJRUzIgezk2LCA5NywgOTgsICAgMCB9Ci0jZGVmaW5lIFNINV9TQ0lGX0lSUVMgezM5LCA0MCwgNDIsICAgMCB9Ci0jZGVmaW5lCVNINzc3MF9TQ0lGMF9JUlFTIHs2MSwgNjEsIDYxLCA2MSB9Ci0jZGVmaW5lCVNINzc3MF9TQ0lGMV9JUlFTIHs2MiwgNjIsIDYyLCA2MiB9Ci0jZGVmaW5lCVNINzc3MF9TQ0lGMl9JUlFTIHs2MywgNjMsIDYzLCA2MyB9Ci0jZGVmaW5lCVNINzc4MF9TQ0lGMF9JUlFTIHs0MCwgNDEsIDQzLCA0MiB9Ci0jZGVmaW5lCVNINzc4MF9TQ0lGMV9JUlFTIHs3NiwgNzcsIDc5LCA3OCB9Ci0KICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDgpCiAjIGRlZmluZSBTQ1NQVFIgMHhmZmZmZmY3YyAvKiA4IGJpdCAqLwogIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KSAgICAgICAgICAweDMwIC8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSAqLwogIyBkZWZpbmUgU0NJX09OTFkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNikKICMgZGVmaW5lIFNDUENSICAweEE0MDAwMTE2IC8qIDE2IGJpdCBTQ0kgYW5kIFNDSUYgKi8KICMgZGVmaW5lIFNDUERSICAweEE0MDAwMTM2IC8qIDggIGJpdCBTQ0kgYW5kIFNDSUYgKi8KICMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkgICAgICAgICAgMHgzMCAvKiBUSUU9MCxSSUU9MCxURT0xLFJFPTEgKi8KQEAgLTk5LDEyICs3NCwyMyBAQAogIyBkZWZpbmUgU0NQRFIgIDB4QTQwNTAxMzYgICAgICAgIC8qIDE2IGJpdCBTQ0lGICovCiAjIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpICAweDAwMzAgLyogVElFPTAsUklFPTAsVEU9MSxSRT0xICovCiAjIGRlZmluZSBTQ0lGX09OTFkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCkKKyMgZGVmaW5lIFNDU1BUUjAgMHhBNDQwMDAwMAkgIC8qIDE2IGJpdCBTQ0lGICovCisjIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpICAweDAwMzAgLyogVElFPTAsUklFPTAsVEU9MSxSRT0xICovCisjIGRlZmluZSBTQ0lGX09OTFkKICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCiAjIGRlZmluZSBTQ1BEUiAgMHhBNDA1MDEzOCAgICAgICAgLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDU1BUUjIgU0NQRFIKICMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEgICAvKiBvdmVycnVuIGVycm9yIGJpdCAqLwogIyBkZWZpbmUgU0NTQ1JfSU5JVChwb3J0KSAgMHgwMDM4IC8qIFRJRT0wLFJJRT0wLFRFPTEsUkU9MSAqLwogIyBkZWZpbmUgU0NJRl9PTkxZCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMpCisjIGRlZmluZSBTQ1NQVFIwIDB4ZmZlMDAwMTAJLyogMTYgYml0IFNDSUYgKi8KKyMgZGVmaW5lIFNDU1BUUjEgMHhmZmUxMDAxMAkvKiAxNiBiaXQgU0NJRiAqLworIyBkZWZpbmUgU0NTUFRSMiAweGZmZTIwMDEwCS8qIDE2IGJpdCBTQ0lGICovCisjIGRlZmluZSBTQ1NQVFIzIDB4ZmZlMzAwMTAJLyogMTYgYml0IFNDSUYgKi8KKyMgZGVmaW5lIFNDU0NSX0lOSVQocG9ydCkgMHgzMgkvKiBUSUU9MCxSSUU9MCxURT0xLFJFPTEsUkVJRT0wLENLRT0xICovCisjIGRlZmluZSBTQ0lGX09OTFkKICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINF8yMDIpCiAjIGRlZmluZSBTQ1NQVFIyIDB4ZmZlODAwMjAgLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEgICAvKiBvdmVycnVuIGVycm9yIGJpdCAqLwpAQCAtMTQ1LDcgKzEzMSw3IEBACiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCiAjIGRlZmluZSBTQ1NQVFIwCTB4ZmZlMDAwMjQJLyogMTYgYml0IFNDSUYgKi8KICMgZGVmaW5lIFNDU1BUUjEJMHhmZmUxMDAyNAkvKiAxNiBiaXQgU0NJRiAqLwotIyBkZWZpbmUgU0NJRl9PUEVSCTB4MDAwMQkJLyogT3ZlcnJ1biBlcnJvciBiaXQgKi8KKyMgZGVmaW5lIFNDSUZfT1JFUgkweDAwMDEJCS8qIE92ZXJydW4gZXJyb3IgYml0ICovCiAjIGRlZmluZSBTQ1NDUl9JTklUKHBvcnQpCTB4M2EJLyogVElFPTAsUklFPTAsVEU9MSxSRT0xLFJFSUU9MSAqLwogIyBkZWZpbmUgU0NJRl9PTkxZCiAjZWxzZQpAQCAtMjczLDE1ICsyNTksNiBAQAogICovCiAjZGVmaW5lIFNDSV9FVkVOVF9XUklURV9XQUtFVVAJMAogCi1zdHJ1Y3Qgc2NpX3BvcnQgewotCXN0cnVjdCB1YXJ0X3BvcnQgcG9ydDsKLQlpbnQgdHlwZTsKLQl1bnNpZ25lZCBjaGFyIGlycXNbNF07IC8qIEVSSSwgUlhJLCBUWEksIEJSSSAqLwotCXZvaWQgKCppbml0X3BpbnMpKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBjZmxhZyk7Ci0JaW50IGJyZWFrX2ZsYWc7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgYnJlYWtfdGltZXI7Ci19OwotCiAjZGVmaW5lIFNDSV9JTihzaXplLCBvZmZzZXQpCQkJCQlcCiAgIHVuc2lnbmVkIGludCBhZGRyID0gcG9ydC0+bWFwYmFzZSArIChvZmZzZXQpOwkJCVwKICAgaWYgKChzaXplKSA9PSA4KSB7CQkJCQkJXApAQCAtMzM2LDcgKzMxMyw5IEBACiAgIH0KIAogI2lmZGVmIENPTkZJR19DUFVfU0gzCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKQogI2RlZmluZSBTQ0lGX0ZOUyhuYW1lLCBzY2lmX29mZnNldCwgc2NpZl9zaXplKSBcCiAgIENQVV9TQ0lGX0ZOUyhuYW1lLCBzY2lmX29mZnNldCwgc2NpZl9zaXplKQogI2Vsc2UKQEAgLTM2Miw3ICszNDEsOSBAQAogICBDUFVfU0NJRl9GTlMobmFtZSwgc2g0X3NjaWZfb2Zmc2V0LCBzaDRfc2NpZl9zaXplKQogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApCiBTQ0lGX0ZOUyhTQ1NNUiwgIDB4MDAsIDE2KQogU0NJRl9GTlMoU0NCUlIsICAweDA0LCAgOCkKIFNDSUZfRk5TKFNDU0NSLCAgMHgwOCwgMTYpCkBAIC00NDcsNyArNDI4LDkgQEAKIAkJcmV0dXJuIGN0cmxfaW5iKFNDU1BUUikmMHgwMSA/IDEgOiAwOyAvKiBTQ0kgKi8KIAlyZXR1cm4gMTsKIH0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNykgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNikKIHN0YXRpYyBpbmxpbmUgaW50IHNjaV9yeGRfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKIHsKIAlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmZmZmZTgwKQpAQCAtNDY3LDYgKzQ1MCwxMyBAQAogCQlyZXR1cm4gY3RybF9pbmIoU0NQRFIpJjB4MTAgPyAxIDogMDsgLyogU0NJRiAqLwogCXJldHVybiAxOwogfQorI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKQorc3RhdGljIGlubGluZSBpbnQgc2NpX3J4ZF9pbihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCWlmIChwb3J0LT5tYXBiYXNlID09IFNDU1BUUjApCisJCXJldHVybiBjdHJsX2ludyhTQ1NQVFIwICsgMHgxMCkgJiAweDAxID8gMSA6IDA7CisJcmV0dXJuIDE7Cit9CiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApIHx8IFwKICAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkgfHwgXAogICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMikKQEAgLTUwNCw2ICs0OTQsMTkgQEAKIHsKIAlyZXR1cm4gY3RybF9pbmIoU0NQRFIpJjB4MDEgPyAxIDogMDsgLyogU0NJRjAgKi8KIH0KKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MykKK3N0YXRpYyBpbmxpbmUgaW50IHNjaV9yeGRfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmZTAwMDAwKQorCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMCkgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLworCWlmIChwb3J0LT5tYXBiYXNlID09IDB4ZmZlMTAwMDApCisJCXJldHVybiBjdHJsX2ludyhTQ1NQVFIxKSAmIDB4MDAwMSA/IDEgOiAwOyAvKiBTQ0lGICovCisJaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhmZmUyMDAwMCkKKwkJcmV0dXJuIGN0cmxfaW53KFNDU1BUUjIpICYgMHgwMDAxID8gMSA6IDA7IC8qIFNDSUYgKi8KKwlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmZTMwMDAwKQorCQlyZXR1cm4gY3RybF9pbncoU0NTUFRSMykgJiAweDAwMDEgPyAxIDogMDsgLyogU0NJRiAqLworCXJldHVybiAxOworfQogI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU1Q0MFNUQjEpCiBzdGF0aWMgaW5saW5lIGludCBzY2lfcnhkX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CkBAIC01ODcsNCArNTkwLDMgQEAKICNlbHNlIC8qIEdlbmVyaWMgU0ggKi8KICNkZWZpbmUgU0NCUlJfVkFMVUUoYnBzLCBjbGspICgoY2xrKzE2KmJwcykvKDMyKmJwcyktMSkKICNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9LY29uZmlnIGIvZHJpdmVycy91c2IvS2NvbmZpZwppbmRleCAwMDUwNDMxLi5mOWIxNzE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL0tjb25maWcKQEAgLTI1LDYgKzI1LDcgQEAKIAlkZWZhdWx0IHkgaWYgUFhBMjd4CiAJZGVmYXVsdCB5IGlmIEFSQ0hfRVA5M1hYCiAJZGVmYXVsdCB5IGlmIChBUkNIX0FUOTFSTTkyMDAgfHwgQVJDSF9BVDkxU0FNOTI2MSkKKwlkZWZhdWx0IHkgaWYgQVJDSF9QTlg0MDA4CiAJIyBQUEM6CiAJZGVmYXVsdCB5IGlmIFNUQjAzeHh4CiAJZGVmYXVsdCB5IGlmIFBQQ19NUEM1Mnh4CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL01ha2VmaWxlCmluZGV4IDQ3MTBlYjAuLjk3ZDU3Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL01ha2VmaWxlCkBAIC0xNCw2ICsxNCw3IEBACiBvYmotJChDT05GSUdfVVNCX09IQ0lfSENEKQkrPSBob3N0Lwogb2JqLSQoQ09ORklHX1VTQl9VSENJX0hDRCkJKz0gaG9zdC8KIG9iai0kKENPTkZJR19VU0JfU0w4MTFfSENEKQkrPSBob3N0Lworb2JqLSQoQ09ORklHX1VTQl9VMTMyX0hDRCkJKz0gaG9zdC8KIG9iai0kKENPTkZJR19FVFJBWF9VU0JfSE9TVCkJKz0gaG9zdC8KIG9iai0kKENPTkZJR19VU0JfT0hDSV9BVDkxKQkrPSBob3N0LwogCkBAIC0yMyw2ICsyNCw3IEBACiBvYmotJChDT05GSUdfVVNCX1NUT1JBR0UpCSs9IHN0b3JhZ2UvCiBvYmotJChDT05GSUdfVVNCKQkJKz0gc3RvcmFnZS8KIAorb2JqLSQoQ09ORklHX1VTQl9BQ0VDQUQpCSs9IGlucHV0Lwogb2JqLSQoQ09ORklHX1VTQl9BSVBURUspCSs9IGlucHV0Lwogb2JqLSQoQ09ORklHX1VTQl9BVElfUkVNT1RFKQkrPSBpbnB1dC8KIG9iai0kKENPTkZJR19VU0JfSElEKQkJKz0gaW5wdXQvCkBAIC0zMSw4ICszMyw4IEBACiBvYmotJChDT05GSUdfVVNCX01PVVNFKQkJKz0gaW5wdXQvCiBvYmotJChDT05GSUdfVVNCX01UT1VDSCkJKz0gaW5wdXQvCiBvYmotJChDT05GSUdfVVNCX1BPV0VSTUFURSkJKz0gaW5wdXQvCitvYmotJChDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SKSs9IGlucHV0Lwogb2JqLSQoQ09ORklHX1VTQl9XQUNPTSkJCSs9IGlucHV0Lwotb2JqLSQoQ09ORklHX1VTQl9BQ0VDQUQpCSs9IGlucHV0Lwogb2JqLSQoQ09ORklHX1VTQl9YUEFEKQkJKz0gaW5wdXQvCiAKIG9iai0kKENPTkZJR19VU0JfQ0FUQykJCSs9IG5ldC8KQEAgLTQ3LDIyICs0OSwyNCBAQAogCiBvYmotJChDT05GSUdfVVNCX1NFUklBTCkJKz0gc2VyaWFsLwogCitvYmotJChDT05GSUdfVVNCX0FEVVRVWCkJKz0gbWlzYy8KK29iai0kKENPTkZJR19VU0JfQVBQTEVESVNQTEFZKQkrPSBtaXNjLwogb2JqLSQoQ09ORklHX1VTQl9BVUVSU1dBTEQpCSs9IG1pc2MvCiBvYmotJChDT05GSUdfVVNCX0NZUFJFU1NfQ1k3QzYzKSs9IG1pc2MvCiBvYmotJChDT05GSUdfVVNCX0NZVEhFUk0pCSs9IG1pc2MvCiBvYmotJChDT05GSUdfVVNCX0VNSTI2KQkJKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfRU1JNjIpCQkrPSBtaXNjLworb2JqLSQoQ09ORklHX1VTQl9GVERJX0VMQU4pCSs9IG1pc2MvCiBvYmotJChDT05GSUdfVVNCX0lETU9VU0UpCSs9IG1pc2MvCiBvYmotJChDT05GSUdfVVNCX0xDRCkJCSs9IG1pc2MvCiBvYmotJChDT05GSUdfVVNCX0xEKQkJKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfTEVEKQkJKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfTEVHT1RPV0VSKQkrPSBtaXNjLworb2JqLSQoQ09ORklHX1VTQl9QSElER0VUU0VSVk8pCSs9IG1pc2MvCiBvYmotJChDT05GSUdfVVNCX1JJTzUwMCkJKz0gbWlzYy8KK29iai0kKENPTkZJR19VU0JfU0lTVVNCVkdBKQkrPSBtaXNjLwogb2JqLSQoQ09ORklHX1VTQl9URVNUKQkJKz0gbWlzYy8KIG9iai0kKENPTkZJR19VU0JfVVNTNzIwKQkrPSBtaXNjLwotb2JqLSQoQ09ORklHX1VTQl9QSElER0VUU0VSVk8pCSs9IG1pc2MvCi1vYmotJChDT05GSUdfVVNCX1NJU1VTQlZHQSkJKz0gbWlzYy8KLW9iai0kKENPTkZJR19VU0JfQVBQTEVESVNQTEFZKQkrPSBtaXNjLwogCiBvYmotJChDT05GSUdfVVNCX0FUTSkJCSs9IGF0bS8KIG9iai0kKENPTkZJR19VU0JfU1BFRURUT1VDSCkJKz0gYXRtLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYyBiL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKaW5kZXggYjM4OTkwYS4uNDY1OTYxYTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCisrKyBiL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKQEAgLTE2MjEsMjYgKzE2MjEsMzIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBjcmVhdGVfZnNfZW50cmllcyhzdHJ1Y3QgdWVhX3NvZnRjICpzYywgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfc3RhdF9zdGF0dXMuYXR0ciwKKwkmZGV2X2F0dHJfc3RhdF9tZmxhZ3MuYXR0ciwKKwkmZGV2X2F0dHJfc3RhdF9odW1hbl9zdGF0dXMuYXR0ciwKKwkmZGV2X2F0dHJfc3RhdF9kZWxpbi5hdHRyLAorCSZkZXZfYXR0cl9zdGF0X3ZpZGNwZS5hdHRyLAorCSZkZXZfYXR0cl9zdGF0X3VzcmF0ZS5hdHRyLAorCSZkZXZfYXR0cl9zdGF0X2RzcmF0ZS5hdHRyLAorCSZkZXZfYXR0cl9zdGF0X3VzYXR0ZW51YXRpb24uYXR0ciwKKwkmZGV2X2F0dHJfc3RhdF9kc2F0dGVudWF0aW9uLmF0dHIsCisJJmRldl9hdHRyX3N0YXRfdXNtYXJnaW4uYXR0ciwKKwkmZGV2X2F0dHJfc3RhdF9kc21hcmdpbi5hdHRyLAorCSZkZXZfYXR0cl9zdGF0X3R4Zmxvdy5hdHRyLAorCSZkZXZfYXR0cl9zdGF0X3J4Zmxvdy5hdHRyLAorCSZkZXZfYXR0cl9zdGF0X3VzY29yci5hdHRyLAorCSZkZXZfYXR0cl9zdGF0X2RzY29yci5hdHRyLAorCSZkZXZfYXR0cl9zdGF0X3VzdW5jLmF0dHIsCisJJmRldl9hdHRyX3N0YXRfZHN1bmMuYXR0ciwKK307CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhdHRyX2dycCA9IHsKKwkuYXR0cnMgPSBhdHRycywKK307CisKK3N0YXRpYyBpbnQgY3JlYXRlX2ZzX2VudHJpZXMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7Ci0JLyogc3lzZnMgaW50ZXJmYWNlICovCi0JZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9zdGF0X3N0YXR1cyk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9zdGF0X21mbGFncyk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9zdGF0X2h1bWFuX3N0YXR1cyk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9zdGF0X2RlbGluKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3N0YXRfdmlkY3BlKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3N0YXRfdXNyYXRlKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3N0YXRfZHNyYXRlKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3N0YXRfdXNhdHRlbnVhdGlvbik7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9zdGF0X2RzYXR0ZW51YXRpb24pOwotCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfc3RhdF91c21hcmdpbik7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9zdGF0X2RzbWFyZ2luKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3N0YXRfdHhmbG93KTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3N0YXRfcnhmbG93KTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3N0YXRfdXNjb3JyKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3N0YXRfZHNjb3JyKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3N0YXRfdXN1bmMpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfc3RhdF9kc3VuYyk7CisJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmaW50Zi0+ZGV2LmtvYmosICZhdHRyX2dycCk7CiB9CiAKIHN0YXRpYyBpbnQgdWVhX2JpbmQoc3RydWN0IHVzYmF0bV9kYXRhICp1c2JhdG0sIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLApAQCAtMTcwOCwzNyArMTcxNCwyNSBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWNyZWF0ZV9mc19lbnRyaWVzKHNjLCBpbnRmKTsKKwlyZXQgPSBjcmVhdGVfZnNfZW50cmllcyhpbnRmKTsKKwlpZiAocmV0KSB7CisJCXVlYV9zdG9wKHNjKTsKKwkJa2ZyZWUoc2MpOworCQlyZXR1cm4gcmV0OworCX0KIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZGVzdHJveV9mc19lbnRyaWVzKHN0cnVjdCB1ZWFfc29mdGMgKnNjLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfZnNfZW50cmllcyhzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKLQkvKiBzeXNmcyBpbnRlcmZhY2UgKi8KLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3N0YXRfc3RhdHVzKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3N0YXRfbWZsYWdzKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3N0YXRfaHVtYW5fc3RhdHVzKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3N0YXRfZGVsaW4pOwotCWRldmljZV9yZW1vdmVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfc3RhdF92aWRjcGUpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfc3RhdF91c3JhdGUpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfc3RhdF9kc3JhdGUpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfc3RhdF91c2F0dGVudWF0aW9uKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3N0YXRfZHNhdHRlbnVhdGlvbik7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9zdGF0X3VzbWFyZ2luKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3N0YXRfZHNtYXJnaW4pOwotCWRldmljZV9yZW1vdmVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfc3RhdF90eGZsb3cpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfc3RhdF9yeGZsb3cpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfc3RhdF91c2NvcnIpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfc3RhdF9kc2NvcnIpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfc3RhdF91c3VuYyk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9zdGF0X2RzdW5jKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAmYXR0cl9ncnApOwogfQogCiBzdGF0aWMgdm9pZCB1ZWFfdW5iaW5kKHN0cnVjdCB1c2JhdG1fZGF0YSAqdXNiYXRtLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKIHsKIAlzdHJ1Y3QgdWVhX3NvZnRjICpzYyA9IHVzYmF0bS0+ZHJpdmVyX2RhdGE7CiAKLQlkZXN0cm95X2ZzX2VudHJpZXMoc2MsIGludGYpOworCWRlc3Ryb3lfZnNfZW50cmllcyhpbnRmKTsKIAl1ZWFfc3RvcChzYyk7CiAJa2ZyZWUoc2MpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2xhc3MvdXNibHAuYyBiL2RyaXZlcnMvdXNiL2NsYXNzL3VzYmxwLmMKaW5kZXggNDhkZWU0YjguLjljYWMxMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NsYXNzL3VzYmxwLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvdXNibHAuYwpAQCAtODEzLDcgKzgxMyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVzYmxwX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2JscF9mb3BzID0gewogCS5vd25lciA9CVRISVNfTU9EVUxFLAogCS5yZWFkID0JCXVzYmxwX3JlYWQsCiAJLndyaXRlID0JdXNibHBfd3JpdGUsCkBAIC05MjcsNyArOTI3LDkgQEAKIAogCS8qIFJldHJpZXZlIGFuZCBzdG9yZSB0aGUgZGV2aWNlIElEIHN0cmluZy4gKi8KIAl1c2JscF9jYWNoZV9kZXZpY2VfaWRfc3RyaW5nKHVzYmxwKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2llZWUxMjg0X2lkKTsKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2llZWUxMjg0X2lkKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGFib3J0X2ludGZkYXRhOwogCiAjaWZkZWYgREVCVUcKIAl1c2JscF9jaGVja19zdGF0dXModXNibHAsIDApOwpAQCAtMTAyMSwxOCArMTAyMywxMyBAQAogCQlmb3IgKGUgPSAwOyBlIDwgaWZkLT5kZXNjLmJOdW1FbmRwb2ludHM7IGUrKykgewogCQkJZXBkID0gJmlmZC0+ZW5kcG9pbnRbZV0uZGVzYzsKIAotCQkJaWYgKChlcGQtPmJtQXR0cmlidXRlcyZVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykhPQotCQkJICAgIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspCi0JCQkJY29udGludWU7Ci0KLQkJCWlmICghKGVwZC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykpIHsKKwkJCWlmICh1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZXBkKSkKIAkJCQlpZiAoIWVwd3JpdGUpCiAJCQkJCWVwd3JpdGUgPSBlcGQ7CiAKLQkJCX0gZWxzZSB7CisJCQlpZiAodXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oZXBkKSkKIAkJCQlpZiAoIWVwcmVhZCkKIAkJCQkJZXByZWFkID0gZXBkOwotCQkJfQogCQl9CiAKIAkJLyogSWdub3JlIGJ1Z2d5IGhhcmR3YXJlIHdpdGhvdXQgdGhlIHJpZ2h0IGVuZHBvaW50cy4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9jb3JlL01ha2VmaWxlCmluZGV4IGVjNTEwOTIuLjM0ZTliYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvY29yZS9NYWtlZmlsZQpAQCAtNCw3ICs0LDcgQEAKIAogdXNiY29yZS1vYmpzCTo9IHVzYi5vIGh1Yi5vIGhjZC5vIHVyYi5vIG1lc3NhZ2UubyBkcml2ZXIubyBcCiAJCQljb25maWcubyBmaWxlLm8gYnVmZmVyLm8gc3lzZnMubyBlbmRwb2ludC5vIFwKLQkJCWRldmlvLm8gbm90aWZ5Lm8KKwkJCWRldmlvLm8gbm90aWZ5Lm8gZ2VuZXJpYy5vCiAKIGlmZXEgKCQoQ09ORklHX1BDSSkseSkKIAl1c2Jjb3JlLW9ianMJKz0gaGNkLXBjaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2J1ZmZlci5jIGIvZHJpdmVycy91c2IvY29yZS9idWZmZXIuYwppbmRleCBmNGY0ZWYwLi44NDA0NDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvYnVmZmVyLmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogCWRtYV9hZGRyX3QJCSpkbWEKICkKIHsKLQlzdHJ1Y3QgdXNiX2hjZAkJKmhjZCA9IGJ1cy0+aGNwcml2OworCXN0cnVjdCB1c2JfaGNkCQkqaGNkID0gYnVzX3RvX2hjZChidXMpOwogCWludCAJCQlpOwogCiAJLyogc29tZSBVU0IgaG9zdHMganVzdCB1c2UgUElPICovCkBAIC0xMjcsNyArMTI3LDcgQEAKIAlkbWFfYWRkcl90CQlkbWEKICkKIHsKLQlzdHJ1Y3QgdXNiX2hjZAkJKmhjZCA9IGJ1cy0+aGNwcml2OworCXN0cnVjdCB1c2JfaGNkCQkqaGNkID0gYnVzX3RvX2hjZChidXMpOwogCWludCAJCQlpOwogCiAJaWYgKCFhZGRyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9jb25maWcuYyBiL2RyaXZlcnMvdXNiL2NvcmUvY29uZmlnLmMKaW5kZXggNGM5ZTYzZS4uYmZiMzczMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9jb25maWcuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2NvbmZpZy5jCkBAIC00NzUsNyArNDc1LDkgQEAKIAkJaWYgKHJlc3VsdCA8IDApIHsKIAkJCWRldl9lcnIoZGRldiwgInVuYWJsZSB0byByZWFkIGNvbmZpZyBpbmRleCAlZCAiCiAJCQkgICAgImRlc2NyaXB0b3IvJXNcbiIsIGNmZ25vLCAic3RhcnQiKTsKLQkJCWdvdG8gZXJyOworCQkJZGV2X2VycihkZGV2LCAiY2hvcHBpbmcgdG8gJWQgY29uZmlnKHMpXG4iLCBjZmdubyk7CisJCQlkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zID0gY2Znbm87CisJCQlicmVhazsKIAkJfSBlbHNlIGlmIChyZXN1bHQgPCA0KSB7CiAJCQlkZXZfZXJyKGRkZXYsICJjb25maWcgaW5kZXggJWQgZGVzY3JpcHRvciB0b28gc2hvcnQgIgogCQkJICAgICIoZXhwZWN0ZWQgJWksIGdvdCAlaSlcbiIsIGNmZ25vLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9kZXZpY2VzLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmljZXMuYwppbmRleCBjMGYzNzM0Li4zNTM4YzJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RldmljZXMuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmljZXMuYwpAQCAtNTkzLDcgKzU5Myw3IEBACiAvKiBLZXJuZWwgbG9jayBmb3IgImxhc3RldiIgcHJvdGVjdGlvbiAqLwogc3RhdGljIHVuc2lnbmVkIGludCB1c2JfZGV2aWNlX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKIHsKLQlzdHJ1Y3QgdXNiX2RldmljZV9zdGF0dXMgKnN0ID0gKHN0cnVjdCB1c2JfZGV2aWNlX3N0YXR1cyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdXNiX2RldmljZV9zdGF0dXMgKnN0ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKIAogCWxvY2tfa2VybmVsKCk7CkBAIC02MDMsNyArNjAzLDcgQEAKIAkJCXVubG9ja19rZXJuZWwoKTsKIAkJCXJldHVybiBQT0xMSU47CiAJCX0KLQkJCisKIAkJLyogd2UgbWF5IGhhdmUgZHJvcHBlZCBCS0wgLSBuZWVkIHRvIGNoZWNrIGZvciBoYXZpbmcgbG9zdCB0aGUgcmFjZSAqLwogCQlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhKSB7CiAJCQlrZnJlZShzdCk7CkBAIC02NjcsNyArNjY3LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVzYmZzX2RldmljZXNfZm9wcyA9IHsKK2NvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNiZnNfZGV2aWNlc19mb3BzID0gewogCS5sbHNlZWsgPQl1c2JfZGV2aWNlX2xzZWVrLAogCS5yZWFkID0JCXVzYl9kZXZpY2VfcmVhZCwKIAkucG9sbCA9CQl1c2JfZGV2aWNlX3BvbGwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKaW5kZXggMjE4NjIxYi4uYTk0YzYzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwpAQCAtNTksNiArNTksOSBAQAogI2RlZmluZSBVU0JfREVWSUNFX01BWAkJCVVTQl9NQVhCVVMgKiAxMjgKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgKnVzYl9kZXZpY2VfY2xhc3M7CiAKKy8qIE11dHVhbCBleGNsdXNpb24gZm9yIHJlbW92YWwsIG9wZW4sIGFuZCByZWxlYXNlICovCitERUZJTkVfTVVURVgodXNiZnNfbXV0ZXgpOworCiBzdHJ1Y3QgYXN5bmMgewogCXN0cnVjdCBsaXN0X2hlYWQgYXN5bmNsaXN0OwogCXN0cnVjdCBkZXZfc3RhdGUgKnBzOwpAQCAtODcsOSArOTAsMTAgQEAKIAogI2RlZmluZQlNQVhfVVNCRlNfQlVGRkVSX1NJWkUJMTYzODQKIAotc3RhdGljIGlubGluZSBpbnQgY29ubmVjdGVkIChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KQorc3RhdGljIGlubGluZSBpbnQgY29ubmVjdGVkIChzdHJ1Y3QgZGV2X3N0YXRlICpwcykKIHsKLQlyZXR1cm4gZGV2LT5zdGF0ZSAhPSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQ7CisJcmV0dXJuICghbGlzdF9lbXB0eSgmcHMtPmxpc3QpICYmCisJCQlwcy0+ZGV2LT5zdGF0ZSAhPSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpOwogfQogCiBzdGF0aWMgbG9mZl90IHVzYmRldl9sc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCkBAIC0xMTgsNyArMTIyLDcgQEAKIAogc3RhdGljIHNzaXplX3QgdXNiZGV2X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgZGV2X3N0YXRlICpwcyA9IChzdHJ1Y3QgZGV2X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZXZfc3RhdGUgKnBzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwcy0+ZGV2OwogCXNzaXplX3QgcmV0ID0gMDsKIAl1bnNpZ25lZCBsZW47CkBAIC0xMjcsNyArMTMxLDcgQEAKIAogCXBvcyA9ICpwcG9zOwogCXVzYl9sb2NrX2RldmljZShkZXYpOwotCWlmICghY29ubmVjdGVkKGRldikpIHsKKwlpZiAoIWNvbm5lY3RlZChwcykpIHsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBlcnI7CiAJfSBlbHNlIGlmIChwb3MgPCAwKSB7CkBAIC0zMDEsNyArMzA1LDcgQEAKIAogc3RhdGljIHZvaWQgYXN5bmNfY29tcGxldGVkKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0gICAgICAgIHN0cnVjdCBhc3luYyAqYXMgPSAoc3RydWN0IGFzeW5jICopdXJiLT5jb250ZXh0OworICAgICAgICBzdHJ1Y3QgYXN5bmMgKmFzID0gdXJiLT5jb250ZXh0OwogICAgICAgICBzdHJ1Y3QgZGV2X3N0YXRlICpwcyA9IGFzLT5wczsKIAlzdHJ1Y3Qgc2lnaW5mbyBzaW5mbzsKIApAQCAtNTQxLDI1ICs1NDUsMjUgQEAKIAlzdHJ1Y3QgZGV2X3N0YXRlICpwczsKIAlpbnQgcmV0OwogCi0JLyogCi0JICogbm8gbG9ja2luZyBuZWNlc3NhcnkgaGVyZSwgYXMgY2hyZGV2X29wZW4gaGFzIHRoZSBrZXJuZWwgbG9jawotCSAqIChzdGlsbCBhY3F1aXJlIHRoZSBrZXJuZWwgbG9jayBmb3Igc2FmZXR5KQotCSAqLworCS8qIFByb3RlY3QgYWdhaW5zdCBzaW11bHRhbmVvdXMgcmVtb3ZhbCBvciByZWxlYXNlICovCisJbXV0ZXhfbG9jaygmdXNiZnNfbXV0ZXgpOworCiAJcmV0ID0gLUVOT01FTTsKIAlpZiAoIShwcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZfc3RhdGUpLCBHRlBfS0VSTkVMKSkpCi0JCWdvdG8gb3V0X25vbG9jazsKKwkJZ290byBvdXQ7CiAKLQlsb2NrX2tlcm5lbCgpOwogCXJldCA9IC1FTk9FTlQ7CiAJLyogY2hlY2sgaWYgd2UgYXJlIGNhbGxlZCBmcm9tIGEgcmVhbCBub2RlIG9yIHVzYmZzICovCiAJaWYgKGltYWpvcihpbm9kZSkgPT0gVVNCX0RFVklDRV9NQUpPUikKIAkJZGV2ID0gdXNiZGV2X2xvb2t1cF9taW5vcihpbWlub3IoaW5vZGUpKTsKIAlpZiAoIWRldikKLQkJZGV2ID0gaW5vZGUtPnUuZ2VuZXJpY19pcDsKLQlpZiAoIWRldikgewotCQlrZnJlZShwcyk7CisJCWRldiA9IGlub2RlLT5pX3ByaXZhdGU7CisJaWYgKCFkZXYpCiAJCWdvdG8gb3V0OwotCX0KKwlyZXQgPSB1c2JfYXV0b3Jlc3VtZV9kZXZpY2UoZGV2LCAxKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwogCXVzYl9nZXRfZGV2KGRldik7CiAJcmV0ID0gMDsKIAlwcy0+ZGV2ID0gZGV2OwpAQCAtNTc5LDMwICs1ODMsMzYgQEAKIAlsaXN0X2FkZF90YWlsKCZwcy0+bGlzdCwgJmRldi0+ZmlsZWxpc3QpOwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IHBzOwogIG91dDoKLQl1bmxvY2tfa2VybmVsKCk7Ci0gb3V0X25vbG9jazoKLSAgICAgICAgcmV0dXJuIHJldDsKKwlpZiAocmV0KQorCQlrZnJlZShwcyk7CisJbXV0ZXhfdW5sb2NrKCZ1c2Jmc19tdXRleCk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCB1c2JkZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgZGV2X3N0YXRlICpwcyA9IChzdHJ1Y3QgZGV2X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZXZfc3RhdGUgKnBzID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwcy0+ZGV2OwogCXVuc2lnbmVkIGludCBpZm51bTsKIAogCXVzYl9sb2NrX2RldmljZShkZXYpOworCisJLyogUHJvdGVjdCBhZ2FpbnN0IHNpbXVsdGFuZW91cyBvcGVuICovCisJbXV0ZXhfbG9jaygmdXNiZnNfbXV0ZXgpOwogCWxpc3RfZGVsX2luaXQoJnBzLT5saXN0KTsKKwltdXRleF91bmxvY2soJnVzYmZzX211dGV4KTsKKwogCWZvciAoaWZudW0gPSAwOyBwcy0+aWZjbGFpbWVkICYmIGlmbnVtIDwgOCpzaXplb2YocHMtPmlmY2xhaW1lZCk7CiAJCQlpZm51bSsrKSB7CiAJCWlmICh0ZXN0X2JpdChpZm51bSwgJnBzLT5pZmNsYWltZWQpKQogCQkJcmVsZWFzZWludGYocHMsIGlmbnVtKTsKIAl9CiAJZGVzdHJveV9hbGxfYXN5bmMocHMpOworCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UoZGV2LCAxKTsKIAl1c2JfdW5sb2NrX2RldmljZShkZXYpOwogCXVzYl9wdXRfZGV2KGRldik7Ci0JcHMtPmRldiA9IE5VTEw7CiAJa2ZyZWUocHMpOwotICAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBwcm9jX2NvbnRyb2woc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCkBAIC0xMzIyLDcgKzEzMzIsNyBAQAogCQl9CiAJfQogCi0JaWYgKCFjb25uZWN0ZWQocHMtPmRldikpIHsKKwlpZiAoIWNvbm5lY3RlZChwcykpIHsKIAkJa2ZyZWUoYnVmKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMTM0OSw3ICsxMzU5LDcgQEAKIAkvKiBsZXQga2VybmVsIGRyaXZlcnMgdHJ5IHRvIChyZSliaW5kIHRvIHRoZSBpbnRlcmZhY2UgKi8KIAljYXNlIFVTQkRFVkZTX0NPTk5FQ1Q6CiAJCXVzYl91bmxvY2tfZGV2aWNlKHBzLT5kZXYpOwotCQlidXNfcmVzY2FuX2RldmljZXMoaW50Zi0+ZGV2LmJ1cyk7CisJCXJldHZhbCA9IGJ1c19yZXNjYW5fZGV2aWNlcyhpbnRmLT5kZXYuYnVzKTsKIAkJdXNiX2xvY2tfZGV2aWNlKHBzLT5kZXYpOwogCQlicmVhazsKIApAQCAtMTQxMyw3ICsxNDIzLDcgQEAKICAqLwogc3RhdGljIGludCB1c2JkZXZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0cnVjdCBkZXZfc3RhdGUgKnBzID0gKHN0cnVjdCBkZXZfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRldl9zdGF0ZSAqcHMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBzLT5kZXY7CiAJdm9pZCBfX3VzZXIgKnAgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJaW50IHJldCA9IC1FTk9UVFk7CkBAIC0xNDIxLDcgKzE0MzEsNyBAQAogCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAl1c2JfbG9ja19kZXZpY2UoZGV2KTsKLQlpZiAoIWNvbm5lY3RlZChkZXYpKSB7CisJaWYgKCFjb25uZWN0ZWQocHMpKSB7CiAJCXVzYl91bmxvY2tfZGV2aWNlKGRldik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTE1NTYsMTggKzE1NjYsMTggQEAKIC8qIE5vIGtlcm5lbCBsb2NrIC0gZmluZSAqLwogc3RhdGljIHVuc2lnbmVkIGludCB1c2JkZXZfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQogewotCXN0cnVjdCBkZXZfc3RhdGUgKnBzID0gKHN0cnVjdCBkZXZfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0gICAgICAgIHVuc2lnbmVkIGludCBtYXNrID0gMDsKKwlzdHJ1Y3QgZGV2X3N0YXRlICpwcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CiAKIAlwb2xsX3dhaXQoZmlsZSwgJnBzLT53YWl0LCB3YWl0KTsKIAlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgIWxpc3RfZW1wdHkoJnBzLT5hc3luY19jb21wbGV0ZWQpKQogCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOwotCWlmICghY29ubmVjdGVkKHBzLT5kZXYpKQorCWlmICghY29ubmVjdGVkKHBzKSkKIAkJbWFzayB8PSBQT0xMRVJSIHwgUE9MTEhVUDsKIAlyZXR1cm4gbWFzazsKIH0KIAotc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2Jmc19kZXZpY2VfZmlsZV9vcGVyYXRpb25zID0geworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2Jmc19kZXZpY2VfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsgPQl1c2JkZXZfbHNlZWssCiAJLnJlYWQgPQkJdXNiZGV2X3JlYWQsCiAJLnBvbGwgPQkJdXNiZGV2X3BvbGwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jIGIvZHJpdmVycy91c2IvY29yZS9kcml2ZXIuYwppbmRleCBlYzg5MDY1Li5iMTA0NjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZHJpdmVyLmMKQEAgLTE3LDcgKzE3LDggQEAKICAqCiAgKiBOT1RFISBUaGlzIGlzIG5vdCBhY3R1YWxseSBhIGRyaXZlciBhdCBhbGwsIHJhdGhlciB0aGlzIGlzCiAgKiBqdXN0IGEgY29sbGVjdGlvbiBvZiBoZWxwZXIgcm91dGluZXMgdGhhdCBpbXBsZW1lbnQgdGhlCi0gKiBnZW5lcmljIFVTQiB0aGluZ3MgdGhhdCB0aGUgcmVhbCBkcml2ZXJzIGNhbiB1c2UuLgorICogbWF0Y2hpbmcsIHByb2JpbmcsIHJlbGVhc2luZywgc3VzcGVuZGluZyBhbmQgcmVzdW1pbmcgZm9yCisgKiByZWFsIGRyaXZlcnMuCiAgKgogICovCiAKQEAgLTM0LDM4ICszNSw2IEBACiAJc3RydWN0IHVzYl9kZXZpY2VfaWQgaWQ7CiB9OwogCi0KLXN0YXRpYyBpbnQgZ2VuZXJpY19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW50IGdlbmVyaWNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKLQotCS8qIGlmIHRoaXMgaXMgb25seSBhbiB1bmJpbmQsIG5vdCBhIHBoeXNpY2FsIGRpc2Nvbm5lY3QsIHRoZW4KLQkgKiB1bmNvbmZpZ3VyZSB0aGUgZGV2aWNlICovCi0JaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9DT05GSUdVUkVEKQotCQl1c2Jfc2V0X2NvbmZpZ3VyYXRpb24odWRldiwgMCk7Ci0KLQkvKiBpbiBjYXNlIHRoZSBjYWxsIGZhaWxlZCBvciB0aGUgZGV2aWNlIHdhcyBzdXNwZW5kZWQgKi8KLQlpZiAodWRldi0+c3RhdGUgPj0gVVNCX1NUQVRFX0NPTkZJR1VSRUQpCi0JCXVzYl9kaXNhYmxlX2RldmljZSh1ZGV2LCAwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGRldmljZV9kcml2ZXIgdXNiX2dlbmVyaWNfZHJpdmVyID0gewotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5uYW1lID0JInVzYiIsCi0JLmJ1cyA9ICZ1c2JfYnVzX3R5cGUsCi0JLnByb2JlID0gZ2VuZXJpY19wcm9iZSwKLQkucmVtb3ZlID0gZ2VuZXJpY19yZW1vdmUsCi19OwotCi0vKiBGdW4gaGFjayB0byBkZXRlcm1pbmUgaWYgdGhlIHN0cnVjdCBkZXZpY2UgaXMgYQotICogdXNiIGRldmljZSBvciBhIHVzYiBpbnRlcmZhY2UuICovCi1pbnQgdXNiX2dlbmVyaWNfZHJpdmVyX2RhdGE7Ci0KICNpZmRlZiBDT05GSUdfSE9UUExVRwogCiAvKgpAQCAtODAsNiArNDksNyBAQAogCXUzMiBpZFZlbmRvciA9IDA7CiAJdTMyIGlkUHJvZHVjdCA9IDA7CiAJaW50IGZpZWxkcyA9IDA7CisJaW50IHJldHZhbCA9IDA7CiAKIAlmaWVsZHMgPSBzc2NhbmYoYnVmLCAiJXggJXgiLCAmaWRWZW5kb3IsICZpZFByb2R1Y3QpOwogCWlmIChmaWVsZHMgPCAyKQpAQCAtOTksMTAgKzY5LDEyIEBACiAJc3Bpbl91bmxvY2soJnVzYl9kcnYtPmR5bmlkcy5sb2NrKTsKIAogCWlmIChnZXRfZHJpdmVyKGRyaXZlcikpIHsKLQkJZHJpdmVyX2F0dGFjaChkcml2ZXIpOworCQlyZXR2YWwgPSBkcml2ZXJfYXR0YWNoKGRyaXZlcik7CiAJCXB1dF9kcml2ZXIoZHJpdmVyKTsKIAl9CiAKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOwogCXJldHVybiBjb3VudDsKIH0KIHN0YXRpYyBEUklWRVJfQVRUUihuZXdfaWQsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX25ld19pZCk7CkBAIC0xMTUsNyArODcsNyBAQAogCQlnb3RvIGV4aXQ7CiAKIAlpZiAodXNiX2Rydi0+cHJvYmUgIT0gTlVMTCkKLQkJZXJyb3IgPSBzeXNmc19jcmVhdGVfZmlsZSgmdXNiX2Rydi0+ZHJpdmVyLmtvYmosCisJCWVycm9yID0gc3lzZnNfY3JlYXRlX2ZpbGUoJnVzYl9kcnYtPmRydndyYXAuZHJpdmVyLmtvYmosCiAJCQkJCSAgJmRyaXZlcl9hdHRyX25ld19pZC5hdHRyKTsKIGV4aXQ6CiAJcmV0dXJuIGVycm9yOwpAQCAtMTI3LDcgKzk5LDcgQEAKIAkJcmV0dXJuOwogCiAJaWYgKHVzYl9kcnYtPnByb2JlICE9IE5VTEwpCi0JCXN5c2ZzX3JlbW92ZV9maWxlKCZ1c2JfZHJ2LT5kcml2ZXIua29iaiwKKwkJc3lzZnNfcmVtb3ZlX2ZpbGUoJnVzYl9kcnYtPmRydndyYXAuZHJpdmVyLmtvYmosCiAJCQkJICAmZHJpdmVyX2F0dHJfbmV3X2lkLmF0dHIpOwogfQogCkBAIC0xNzQsMjEgKzE0Niw1NyBAQAogfQogCiAKLS8qIGNhbGxlZCBmcm9tIGRyaXZlciBjb3JlIHdpdGggdXNiX2J1c190eXBlLnN1YnN5cyB3cml0ZWxvY2sgKi8KKy8qIGNhbGxlZCBmcm9tIGRyaXZlciBjb3JlIHdpdGggZGV2IGxvY2tlZCAqLworc3RhdGljIGludCB1c2JfcHJvYmVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZV9kcml2ZXIgKnVkcml2ZXIgPSB0b191c2JfZGV2aWNlX2RyaXZlcihkZXYtPmRyaXZlcik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJaW50IGVycm9yID0gLUVOT0RFVjsKKworCWRldl9kYmcoZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAoIWlzX3VzYl9kZXZpY2UoZGV2KSkJLyogU2FuaXR5IGNoZWNrICovCisJCXJldHVybiBlcnJvcjsKKworCXVkZXYgPSB0b191c2JfZGV2aWNlKGRldik7CisKKwkvKiBUT0RPOiBBZGQgcmVhbCBtYXRjaGluZyBjb2RlICovCisKKwkvKiBUaGUgZGV2aWNlIHNob3VsZCBhbHdheXMgYXBwZWFyIHRvIGJlIGluIHVzZQorCSAqIHVubGVzcyB0aGUgZHJpdmVyIHN1cG9ydHMgYXV0b3N1c3BlbmQuCisJICovCisJdWRldi0+cG1fdXNhZ2VfY250ID0gISh1ZHJpdmVyLT5zdXBwb3J0c19hdXRvc3VzcGVuZCk7CisKKwllcnJvciA9IHVkcml2ZXItPnByb2JlKHVkZXYpOworCXJldHVybiBlcnJvcjsKK30KKworLyogY2FsbGVkIGZyb20gZHJpdmVyIGNvcmUgd2l0aCBkZXYgbG9ja2VkICovCitzdGF0aWMgaW50IHVzYl91bmJpbmRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZV9kcml2ZXIgKnVkcml2ZXIgPSB0b191c2JfZGV2aWNlX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwl1ZHJpdmVyLT5kaXNjb25uZWN0KHRvX3VzYl9kZXZpY2UoZGV2KSk7CisJcmV0dXJuIDA7Cit9CisKKworLyogY2FsbGVkIGZyb20gZHJpdmVyIGNvcmUgd2l0aCBkZXYgbG9ja2VkICovCiBzdGF0aWMgaW50IHVzYl9wcm9iZV9pbnRlcmZhY2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICogaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKLQlzdHJ1Y3QgdXNiX2RyaXZlciAqIGRyaXZlciA9IHRvX3VzYl9kcml2ZXIoZGV2LT5kcml2ZXIpOworCXN0cnVjdCB1c2JfZHJpdmVyICpkcml2ZXIgPSB0b191c2JfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKIAljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQ7CiAJaW50IGVycm9yID0gLUVOT0RFVjsKIAogCWRldl9kYmcoZGV2LCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlpZiAoIWRyaXZlci0+cHJvYmUpCisJaWYgKGlzX3VzYl9kZXZpY2UoZGV2KSkJCS8qIFNhbml0eSBjaGVjayAqLwogCQlyZXR1cm4gZXJyb3I7Ci0JLyogRklYTUUgd2UnZCBtdWNoIHByZWZlciB0byBqdXN0IHJlc3VtZSBpdCAuLi4gKi8KLQlpZiAoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKS0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkKLQkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7CisKKwlpbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOworCXVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCiAJaWQgPSB1c2JfbWF0Y2hfaWQoaW50ZiwgZHJpdmVyLT5pZF90YWJsZSk7CiAJaWYgKCFpZCkKQEAgLTE5Niw0OCArMjA0LDE2NSBAQAogCWlmIChpZCkgewogCQlkZXZfZGJnKGRldiwgIiVzIC0gZ290IGlkXG4iLCBfX0ZVTkNUSU9OX18pOwogCisJCWVycm9yID0gdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHVkZXYsIDEpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisKIAkJLyogSW50ZXJmYWNlICJwb3dlciBzdGF0ZSIgZG9lc24ndCBjb3JyZXNwb25kIHRvIGFueSBoYXJkd2FyZQogCQkgKiBzdGF0ZSB3aGF0c29ldmVyLiAgV2UgdXNlIGl0IHRvIHJlY29yZCB3aGVuIGl0J3MgYm91bmQgdG8KIAkJICogYSBkcml2ZXIgdGhhdCBtYXkgc3RhcnQgSS8wOiAgaXQncyBub3QgZnJvemVuL3F1aWVzY2VkLgogCQkgKi8KIAkJbWFya19hY3RpdmUoaW50Zik7CiAJCWludGYtPmNvbmRpdGlvbiA9IFVTQl9JTlRFUkZBQ0VfQklORElORzsKKworCQkvKiBUaGUgaW50ZXJmYWNlIHNob3VsZCBhbHdheXMgYXBwZWFyIHRvIGJlIGluIHVzZQorCQkgKiB1bmxlc3MgdGhlIGRyaXZlciBzdXBvcnRzIGF1dG9zdXNwZW5kLgorCQkgKi8KKwkJaW50Zi0+cG1fdXNhZ2VfY250ID0gIShkcml2ZXItPnN1cHBvcnRzX2F1dG9zdXNwZW5kKTsKKwogCQllcnJvciA9IGRyaXZlci0+cHJvYmUoaW50ZiwgaWQpOwogCQlpZiAoZXJyb3IpIHsKIAkJCW1hcmtfcXVpZXNjZWQoaW50Zik7CisJCQlpbnRmLT5uZWVkc19yZW1vdGVfd2FrZXVwID0gMDsKIAkJCWludGYtPmNvbmRpdGlvbiA9IFVTQl9JTlRFUkZBQ0VfVU5CT1VORDsKIAkJfSBlbHNlCiAJCQlpbnRmLT5jb25kaXRpb24gPSBVU0JfSU5URVJGQUNFX0JPVU5EOworCisJCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UodWRldiwgMSk7CiAJfQogCiAJcmV0dXJuIGVycm9yOwogfQogCi0vKiBjYWxsZWQgZnJvbSBkcml2ZXIgY29yZSB3aXRoIHVzYl9idXNfdHlwZS5zdWJzeXMgd3JpdGVsb2NrICovCisvKiBjYWxsZWQgZnJvbSBkcml2ZXIgY29yZSB3aXRoIGRldiBsb2NrZWQgKi8KIHN0YXRpYyBpbnQgdXNiX3VuYmluZF9pbnRlcmZhY2Uoc3RydWN0IGRldmljZSAqZGV2KQogeworCXN0cnVjdCB1c2JfZHJpdmVyICpkcml2ZXIgPSB0b191c2JfZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKLQlzdHJ1Y3QgdXNiX2RyaXZlciAqZHJpdmVyID0gdG9fdXNiX2RyaXZlcihpbnRmLT5kZXYuZHJpdmVyKTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlpbnQgZXJyb3I7CiAKIAlpbnRmLT5jb25kaXRpb24gPSBVU0JfSU5URVJGQUNFX1VOQklORElORzsKIAorCS8qIEF1dG9yZXN1bWUgZm9yIHNldF9pbnRlcmZhY2UgY2FsbCBiZWxvdyAqLworCXVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCWVycm9yID0gdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHVkZXYsIDEpOworCiAJLyogcmVsZWFzZSBhbGwgdXJicyBmb3IgdGhpcyBpbnRlcmZhY2UgKi8KIAl1c2JfZGlzYWJsZV9pbnRlcmZhY2UoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSwgaW50Zik7CiAKLQlpZiAoZHJpdmVyICYmIGRyaXZlci0+ZGlzY29ubmVjdCkKLQkJZHJpdmVyLT5kaXNjb25uZWN0KGludGYpOworCWRyaXZlci0+ZGlzY29ubmVjdChpbnRmKTsKIAogCS8qIHJlc2V0IG90aGVyIGludGVyZmFjZSBzdGF0ZSAqLwogCXVzYl9zZXRfaW50ZXJmYWNlKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksCiAJCQlpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlciwKIAkJCTApOwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisKIAlpbnRmLT5jb25kaXRpb24gPSBVU0JfSU5URVJGQUNFX1VOQk9VTkQ7CiAJbWFya19xdWllc2NlZChpbnRmKTsKKwlpbnRmLT5uZWVkc19yZW1vdGVfd2FrZXVwID0gMDsKKworCWlmICghZXJyb3IpCisJCXVzYl9hdXRvc3VzcGVuZF9kZXZpY2UodWRldiwgMSk7CiAKIAlyZXR1cm4gMDsKIH0KIAorLyoqCisgKiB1c2JfZHJpdmVyX2NsYWltX2ludGVyZmFjZSAtIGJpbmQgYSBkcml2ZXIgdG8gYW4gaW50ZXJmYWNlCisgKiBAZHJpdmVyOiB0aGUgZHJpdmVyIHRvIGJlIGJvdW5kCisgKiBAaWZhY2U6IHRoZSBpbnRlcmZhY2UgdG8gd2hpY2ggaXQgd2lsbCBiZSBib3VuZDsgbXVzdCBiZSBpbiB0aGUKKyAqCXVzYiBkZXZpY2UncyBhY3RpdmUgY29uZmlndXJhdGlvbgorICogQHByaXY6IGRyaXZlciBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGludGVyZmFjZQorICoKKyAqIFRoaXMgaXMgdXNlZCBieSB1c2IgZGV2aWNlIGRyaXZlcnMgdGhhdCBuZWVkIHRvIGNsYWltIG1vcmUgdGhhbiBvbmUKKyAqIGludGVyZmFjZSBvbiBhIGRldmljZSB3aGVuIHByb2JpbmcgKGF1ZGlvIGFuZCBhY20gYXJlIGN1cnJlbnQgZXhhbXBsZXMpLgorICogTm8gZGV2aWNlIGRyaXZlciBzaG91bGQgZGlyZWN0bHkgbW9kaWZ5IGludGVybmFsIHVzYl9pbnRlcmZhY2Ugb3IKKyAqIHVzYl9kZXZpY2Ugc3RydWN0dXJlIG1lbWJlcnMuCisgKgorICogRmV3IGRyaXZlcnMgc2hvdWxkIG5lZWQgdG8gdXNlIHRoaXMgcm91dGluZSwgc2luY2UgdGhlIG1vc3QgbmF0dXJhbAorICogd2F5IHRvIGJpbmQgdG8gYW4gaW50ZXJmYWNlIGlzIHRvIHJldHVybiB0aGUgcHJpdmF0ZSBkYXRhIGZyb20KKyAqIHRoZSBkcml2ZXIncyBwcm9iZSgpIG1ldGhvZC4KKyAqCisgKiBDYWxsZXJzIG11c3Qgb3duIHRoZSBkZXZpY2UgbG9jayBhbmQgdGhlIGRyaXZlciBtb2RlbCdzIHVzYl9idXNfdHlwZS5zdWJzeXMKKyAqIHdyaXRlbG9jay4gIFNvIGRyaXZlciBwcm9iZSgpIGVudHJpZXMgZG9uJ3QgbmVlZCBleHRyYSBsb2NraW5nLAorICogYnV0IG90aGVyIGNhbGwgY29udGV4dHMgbWF5IG5lZWQgdG8gZXhwbGljaXRseSBjbGFpbSB0aG9zZSBsb2Nrcy4KKyAqLworaW50IHVzYl9kcml2ZXJfY2xhaW1faW50ZXJmYWNlKHN0cnVjdCB1c2JfZHJpdmVyICpkcml2ZXIsCisJCQkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlLCB2b2lkKiBwcml2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpZmFjZS0+ZGV2OworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpZmFjZSk7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoZGV2LT5kcml2ZXIpCisJCXJldHVybiAtRUJVU1k7CisKKwlkZXYtPmRyaXZlciA9ICZkcml2ZXItPmRydndyYXAuZHJpdmVyOworCXVzYl9zZXRfaW50ZmRhdGEoaWZhY2UsIHByaXYpOworCisJbXV0ZXhfbG9ja19uZXN0ZWQoJnVkZXYtPnBtX211dGV4LCB1ZGV2LT5sZXZlbCk7CisJaWZhY2UtPmNvbmRpdGlvbiA9IFVTQl9JTlRFUkZBQ0VfQk9VTkQ7CisJbWFya19hY3RpdmUoaWZhY2UpOworCWlmYWNlLT5wbV91c2FnZV9jbnQgPSAhKGRyaXZlci0+c3VwcG9ydHNfYXV0b3N1c3BlbmQpOworCW11dGV4X3VubG9jaygmdWRldi0+cG1fbXV0ZXgpOworCisJLyogaWYgaW50ZXJmYWNlIHdhcyBhbHJlYWR5IGFkZGVkLCBiaW5kIG5vdzsgZWxzZSBsZXQKKwkgKiB0aGUgZnV0dXJlIGRldmljZV9hZGQoKSBiaW5kIGl0LCBieXBhc3NpbmcgcHJvYmUoKQorCSAqLworCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZChkZXYpKQorCQlyZXR2YWwgPSBkZXZpY2VfYmluZF9kcml2ZXIoZGV2KTsKKworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MKHVzYl9kcml2ZXJfY2xhaW1faW50ZXJmYWNlKTsKKworLyoqCisgKiB1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlIC0gdW5iaW5kIGEgZHJpdmVyIGZyb20gYW4gaW50ZXJmYWNlCisgKiBAZHJpdmVyOiB0aGUgZHJpdmVyIHRvIGJlIHVuYm91bmQKKyAqIEBpZmFjZTogdGhlIGludGVyZmFjZSBmcm9tIHdoaWNoIGl0IHdpbGwgYmUgdW5ib3VuZAorICoKKyAqIFRoaXMgY2FuIGJlIHVzZWQgYnkgZHJpdmVycyB0byByZWxlYXNlIGFuIGludGVyZmFjZSB3aXRob3V0IHdhaXRpbmcKKyAqIGZvciB0aGVpciBkaXNjb25uZWN0KCkgbWV0aG9kcyB0byBiZSBjYWxsZWQuICBJbiB0eXBpY2FsIGNhc2VzIHRoaXMKKyAqIGFsc28gY2F1c2VzIHRoZSBkcml2ZXIgZGlzY29ubmVjdCgpIG1ldGhvZCB0byBiZSBjYWxsZWQuCisgKgorICogVGhpcyBjYWxsIGlzIHN5bmNocm9ub3VzLCBhbmQgbWF5IG5vdCBiZSB1c2VkIGluIGFuIGludGVycnVwdCBjb250ZXh0LgorICogQ2FsbGVycyBtdXN0IG93biB0aGUgZGV2aWNlIGxvY2sgYW5kIHRoZSBkcml2ZXIgbW9kZWwncyB1c2JfYnVzX3R5cGUuc3Vic3lzCisgKiB3cml0ZWxvY2suICBTbyBkcml2ZXIgZGlzY29ubmVjdCgpIGVudHJpZXMgZG9uJ3QgbmVlZCBleHRyYSBsb2NraW5nLAorICogYnV0IG90aGVyIGNhbGwgY29udGV4dHMgbWF5IG5lZWQgdG8gZXhwbGljaXRseSBjbGFpbSB0aG9zZSBsb2Nrcy4KKyAqLwordm9pZCB1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlKHN0cnVjdCB1c2JfZHJpdmVyICpkcml2ZXIsCisJCQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaWZhY2UtPmRldjsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaWZhY2UpOworCisJLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBkb24ndCByZWxlYXNlIHNvbWV0aGluZyB0aGF0J3Mgbm90IG91cnMgKi8KKwlpZiAoIWRldi0+ZHJpdmVyIHx8IGRldi0+ZHJpdmVyICE9ICZkcml2ZXItPmRydndyYXAuZHJpdmVyKQorCQlyZXR1cm47CisKKwkvKiBkb24ndCByZWxlYXNlIGZyb20gd2l0aGluIGRpc2Nvbm5lY3QoKSAqLworCWlmIChpZmFjZS0+Y29uZGl0aW9uICE9IFVTQl9JTlRFUkZBQ0VfQk9VTkQpCisJCXJldHVybjsKKworCS8qIGRvbid0IHJlbGVhc2UgaWYgdGhlIGludGVyZmFjZSBoYXNuJ3QgYmVlbiBhZGRlZCB5ZXQgKi8KKwlpZiAoZGV2aWNlX2lzX3JlZ2lzdGVyZWQoZGV2KSkgeworCQlpZmFjZS0+Y29uZGl0aW9uID0gVVNCX0lOVEVSRkFDRV9VTkJJTkRJTkc7CisJCWRldmljZV9yZWxlYXNlX2RyaXZlcihkZXYpOworCX0KKworCWRldi0+ZHJpdmVyID0gTlVMTDsKKwl1c2Jfc2V0X2ludGZkYXRhKGlmYWNlLCBOVUxMKTsKKworCW11dGV4X2xvY2tfbmVzdGVkKCZ1ZGV2LT5wbV9tdXRleCwgdWRldi0+bGV2ZWwpOworCWlmYWNlLT5jb25kaXRpb24gPSBVU0JfSU5URVJGQUNFX1VOQk9VTkQ7CisJbWFya19xdWllc2NlZChpZmFjZSk7CisJaWZhY2UtPm5lZWRzX3JlbW90ZV93YWtldXAgPSAwOworCW11dGV4X3VubG9jaygmdWRldi0+cG1fbXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTCh1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlKTsKKwogLyogcmV0dXJucyAwIGlmIG5vIG1hdGNoLCAxIGlmIG1hdGNoICovCiBzdGF0aWMgaW50IHVzYl9tYXRjaF9vbmVfaWQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCkBAIC0zODEsMzUgKzUwNiwyMjMgQEAKIAogaW50IHVzYl9kZXZpY2VfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQogewotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOwotCXN0cnVjdCB1c2JfZHJpdmVyICp1c2JfZHJ2OwotCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZDsKKwkvKiBkZXZpY2VzIGFuZCBpbnRlcmZhY2VzIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkgKi8KKwlpZiAoaXNfdXNiX2RldmljZShkZXYpKSB7CiAKLQkvKiBjaGVjayBmb3IgZ2VuZXJpYyBkcml2ZXIsIHdoaWNoIHdlIGRvbid0IG1hdGNoIGFueSBkZXZpY2Ugd2l0aCAqLwotCWlmIChkcnYgPT0gJnVzYl9nZW5lcmljX2RyaXZlcikKLQkJcmV0dXJuIDA7CisJCS8qIGludGVyZmFjZSBkcml2ZXJzIG5ldmVyIG1hdGNoIGRldmljZXMgKi8KKwkJaWYgKCFpc191c2JfZGV2aWNlX2RyaXZlcihkcnYpKQorCQkJcmV0dXJuIDA7CiAKLQlpbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwotCXVzYl9kcnYgPSB0b191c2JfZHJpdmVyKGRydik7Ci0KLQlpZCA9IHVzYl9tYXRjaF9pZChpbnRmLCB1c2JfZHJ2LT5pZF90YWJsZSk7Ci0JaWYgKGlkKQorCQkvKiBUT0RPOiBBZGQgcmVhbCBtYXRjaGluZyBjb2RlICovCiAJCXJldHVybiAxOwogCi0JaWQgPSB1c2JfbWF0Y2hfZHluYW1pY19pZChpbnRmLCB1c2JfZHJ2KTsKLQlpZiAoaWQpCi0JCXJldHVybiAxOworCX0gZWxzZSB7CisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOworCQlzdHJ1Y3QgdXNiX2RyaXZlciAqdXNiX2RydjsKKwkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkOworCisJCS8qIGRldmljZSBkcml2ZXJzIG5ldmVyIG1hdGNoIGludGVyZmFjZXMgKi8KKwkJaWYgKGlzX3VzYl9kZXZpY2VfZHJpdmVyKGRydikpCisJCQlyZXR1cm4gMDsKKworCQlpbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOworCQl1c2JfZHJ2ID0gdG9fdXNiX2RyaXZlcihkcnYpOworCisJCWlkID0gdXNiX21hdGNoX2lkKGludGYsIHVzYl9kcnYtPmlkX3RhYmxlKTsKKwkJaWYgKGlkKQorCQkJcmV0dXJuIDE7CisKKwkJaWQgPSB1c2JfbWF0Y2hfZHluYW1pY19pZChpbnRmLCB1c2JfZHJ2KTsKKwkJaWYgKGlkKQorCQkJcmV0dXJuIDE7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZglDT05GSUdfSE9UUExVRworCisvKgorICogVGhpcyBzZW5kcyBhbiB1ZXZlbnQgdG8gdXNlcnNwYWNlLCB0eXBpY2FsbHkgaGVscGluZyB0byBsb2FkIGRyaXZlcgorICogb3Igb3RoZXIgbW9kdWxlcywgY29uZmlndXJlIHRoZSBkZXZpY2UsIGFuZCBtb3JlLiAgRHJpdmVycyBjYW4gcHJvdmlkZQorICogYSBNT0RVTEVfREVWSUNFX1RBQkxFIHRvIGhlbHAgd2l0aCBtb2R1bGUgbG9hZGluZyBzdWJ0YXNrcy4KKyAqCisgKiBXZSdyZSBjYWxsZWQgZWl0aGVyIGZyb20ga2h1YmQgKHRoZSB0eXBpY2FsIGNhc2UpIG9yIGZyb20gcm9vdCBodWIKKyAqIChpbml0LCBrYXBtZCwgbW9kcHJvYmUsIHJtbW9kLCBldGMpLCBidXQgdGhlIGFnZW50cyBuZWVkIHRvIGhhbmRsZQorICogZGVsYXlzIGluIGV2ZW50IGRlbGl2ZXJ5LiAgVXNlIHN5c2ZzIChhbmQgREVWUEFUSCkgdG8gbWFrZSBzdXJlIHRoZQorICogZGV2aWNlIChhbmQgdGhpcyBjb25maWd1cmF0aW9uISkgYXJlIHN0aWxsIHByZXNlbnQuCisgKi8KK3N0YXRpYyBpbnQgdXNiX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCisJCSAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdDsKKwlpbnQgaSA9IDA7CisJaW50IGxlbmd0aCA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBkcml2ZXIgaXMgb2Z0ZW4gbnVsbCBoZXJlOyBkZXZfZGJnKCkgd291bGQgb29wcyAqLworCXByX2RlYnVnICgidXNiICVzOiB1ZXZlbnRcbiIsIGRldi0+YnVzX2lkKTsKKworCWlmIChpc191c2JfZGV2aWNlKGRldikpIHsKKwkJdXNiX2RldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKKwkJYWx0ID0gTlVMTDsKKwl9IGVsc2UgeworCQlpbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOworCQl1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwkJYWx0ID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7CisJfQorCisJaWYgKHVzYl9kZXYtPmRldm51bSA8IDApIHsKKwkJcHJfZGVidWcgKCJ1c2IgJXM6IGFscmVhZHkgZGVsZXRlZD9cbiIsIGRldi0+YnVzX2lkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICghdXNiX2Rldi0+YnVzKSB7CisJCXByX2RlYnVnICgidXNiICVzOiBidXMgcmVtb3ZlZD9cbiIsIGRldi0+YnVzX2lkKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisjaWZkZWYJQ09ORklHX1VTQl9ERVZJQ0VGUworCS8qIElmIHRoaXMgaXMgYXZhaWxhYmxlLCB1c2Vyc3BhY2UgcHJvZ3JhbXMgY2FuIGRpcmVjdGx5IHJlYWQKKwkgKiBhbGwgdGhlIGRldmljZSBkZXNjcmlwdG9ycyB3ZSBkb24ndCB0ZWxsIHRoZW0gYWJvdXQuICBPcgorCSAqIGV2ZW4gYWN0IGFzIHVzZXJtb2RlIGRyaXZlcnMuCisJICoKKwkgKiBGSVhNRSByZWR1Y2UgaGFyZHdpcmVkIGludGVsbGlnZW5jZSBoZXJlCisJICovCisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCSAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCisJCQkgICAiREVWSUNFPS9wcm9jL2J1cy91c2IvJTAzZC8lMDNkIiwKKwkJCSAgIHVzYl9kZXYtPmJ1cy0+YnVzbnVtLCB1c2JfZGV2LT5kZXZudW0pKQorCQlyZXR1cm4gLUVOT01FTTsKKyNlbmRpZgorCisJLyogcGVyLWRldmljZSBjb25maWd1cmF0aW9ucyBhcmUgY29tbW9uICovCisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCSAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCisJCQkgICAiUFJPRFVDVD0leC8leC8leCIsCisJCQkgICBsZTE2X3RvX2NwdSh1c2JfZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKKwkJCSAgIGxlMTZfdG9fY3B1KHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSwKKwkJCSAgIGxlMTZfdG9fY3B1KHVzYl9kZXYtPmRlc2NyaXB0b3IuYmNkRGV2aWNlKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogY2xhc3MtYmFzZWQgZHJpdmVyIGJpbmRpbmcgbW9kZWxzICovCisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCSAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCisJCQkgICAiVFlQRT0lZC8lZC8lZCIsCisJCQkgICB1c2JfZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VDbGFzcywKKwkJCSAgIHVzYl9kZXYtPmRlc2NyaXB0b3IuYkRldmljZVN1YkNsYXNzLAorCQkJICAgdXNiX2Rldi0+ZGVzY3JpcHRvci5iRGV2aWNlUHJvdG9jb2wpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICghaXNfdXNiX2RldmljZShkZXYpKSB7CisKKwkJaWYgKGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKKwkJCSAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCisJCQkgICAiSU5URVJGQUNFPSVkLyVkLyVkIiwKKwkJCSAgIGFsdC0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MsCisJCQkgICBhbHQtPmRlc2MuYkludGVyZmFjZVN1YkNsYXNzLAorCQkJICAgYWx0LT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCkpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpZiAoYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAorCQkJICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKKwkJCSAgICJNT0RBTElBUz11c2I6diUwNFhwJTA0WGQlMDRYZGMlMDJYZHNjJTAyWGRwJTAyWGljJTAyWGlzYyUwMlhpcCUwMlgiLAorCQkJICAgbGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCQkgICBsZTE2X3RvX2NwdSh1c2JfZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksCisJCQkgICBsZTE2X3RvX2NwdSh1c2JfZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSksCisJCQkgICB1c2JfZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VDbGFzcywKKwkJCSAgIHVzYl9kZXYtPmRlc2NyaXB0b3IuYkRldmljZVN1YkNsYXNzLAorCQkJICAgdXNiX2Rldi0+ZGVzY3JpcHRvci5iRGV2aWNlUHJvdG9jb2wsCisJCQkgICBhbHQtPmRlc2MuYkludGVyZmFjZUNsYXNzLAorCQkJICAgYWx0LT5kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcywKKwkJCSAgIGFsdC0+ZGVzYy5iSW50ZXJmYWNlUHJvdG9jb2wpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZW52cFtpXSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworc3RhdGljIGludCB1c2JfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsCisJCQlpbnQgbnVtX2VudnAsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQoreworCXJldHVybiAtRU5PREVWOworfQorCisjZW5kaWYJLyogQ09ORklHX0hPVFBMVUcgKi8KKwogLyoqCi0gKiB1c2JfcmVnaXN0ZXJfZHJpdmVyIC0gcmVnaXN0ZXIgYSBVU0IgZHJpdmVyCi0gKiBAbmV3X2RyaXZlcjogVVNCIG9wZXJhdGlvbnMgZm9yIHRoZSBkcml2ZXIKKyAqIHVzYl9yZWdpc3Rlcl9kZXZpY2VfZHJpdmVyIC0gcmVnaXN0ZXIgYSBVU0IgZGV2aWNlIChub3QgaW50ZXJmYWNlKSBkcml2ZXIKKyAqIEBuZXdfdWRyaXZlcjogVVNCIG9wZXJhdGlvbnMgZm9yIHRoZSBkZXZpY2UgZHJpdmVyCiAgKiBAb3duZXI6IG1vZHVsZSBvd25lciBvZiB0aGlzIGRyaXZlci4KICAqCi0gKiBSZWdpc3RlcnMgYSBVU0IgZHJpdmVyIHdpdGggdGhlIFVTQiBjb3JlLiAgVGhlIGxpc3Qgb2YgdW5hdHRhY2hlZAotICogaW50ZXJmYWNlcyB3aWxsIGJlIHJlc2Nhbm5lZCB3aGVuZXZlciBhIG5ldyBkcml2ZXIgaXMgYWRkZWQsIGFsbG93aW5nCi0gKiB0aGUgbmV3IGRyaXZlciB0byBhdHRhY2ggdG8gYW55IHJlY29nbml6ZWQgZGV2aWNlcy4KKyAqIFJlZ2lzdGVycyBhIFVTQiBkZXZpY2UgZHJpdmVyIHdpdGggdGhlIFVTQiBjb3JlLiAgVGhlIGxpc3Qgb2YKKyAqIHVuYXR0YWNoZWQgZGV2aWNlcyB3aWxsIGJlIHJlc2Nhbm5lZCB3aGVuZXZlciBhIG5ldyBkcml2ZXIgaXMKKyAqIGFkZGVkLCBhbGxvd2luZyB0aGUgbmV3IGRyaXZlciB0byBhdHRhY2ggdG8gYW55IHJlY29nbml6ZWQgZGV2aWNlcy4KKyAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUgYW5kIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IHVzYl9yZWdpc3Rlcl9kZXZpY2VfZHJpdmVyKHN0cnVjdCB1c2JfZGV2aWNlX2RyaXZlciAqbmV3X3Vkcml2ZXIsCisJCXN0cnVjdCBtb2R1bGUgKm93bmVyKQoreworCWludCByZXR2YWwgPSAwOworCisJaWYgKHVzYl9kaXNhYmxlZCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW5ld191ZHJpdmVyLT5kcnZ3cmFwLmZvcl9kZXZpY2VzID0gMTsKKwluZXdfdWRyaXZlci0+ZHJ2d3JhcC5kcml2ZXIubmFtZSA9IChjaGFyICopIG5ld191ZHJpdmVyLT5uYW1lOworCW5ld191ZHJpdmVyLT5kcnZ3cmFwLmRyaXZlci5idXMgPSAmdXNiX2J1c190eXBlOworCW5ld191ZHJpdmVyLT5kcnZ3cmFwLmRyaXZlci5wcm9iZSA9IHVzYl9wcm9iZV9kZXZpY2U7CisJbmV3X3Vkcml2ZXItPmRydndyYXAuZHJpdmVyLnJlbW92ZSA9IHVzYl91bmJpbmRfZGV2aWNlOworCW5ld191ZHJpdmVyLT5kcnZ3cmFwLmRyaXZlci5vd25lciA9IG93bmVyOworCisJcmV0dmFsID0gZHJpdmVyX3JlZ2lzdGVyKCZuZXdfdWRyaXZlci0+ZHJ2d3JhcC5kcml2ZXIpOworCisJaWYgKCFyZXR2YWwpIHsKKwkJcHJfaW5mbygiJXM6IHJlZ2lzdGVyZWQgbmV3IGRldmljZSBkcml2ZXIgJXNcbiIsCisJCQl1c2Jjb3JlX25hbWUsIG5ld191ZHJpdmVyLT5uYW1lKTsKKwkJdXNiZnNfdXBkYXRlX3NwZWNpYWwoKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBlcnJvciAlZCByZWdpc3RlcmluZyBkZXZpY2UgIgorCQkJIglkcml2ZXIgJXNcbiIsCisJCQl1c2Jjb3JlX25hbWUsIHJldHZhbCwgbmV3X3Vkcml2ZXItPm5hbWUpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfcmVnaXN0ZXJfZGV2aWNlX2RyaXZlcik7CisKKy8qKgorICogdXNiX2RlcmVnaXN0ZXJfZGV2aWNlX2RyaXZlciAtIHVucmVnaXN0ZXIgYSBVU0IgZGV2aWNlIChub3QgaW50ZXJmYWNlKSBkcml2ZXIKKyAqIEB1ZHJpdmVyOiBVU0Igb3BlcmF0aW9ucyBvZiB0aGUgZGV2aWNlIGRyaXZlciB0byB1bnJlZ2lzdGVyCisgKiBDb250ZXh0OiBtdXN0IGJlIGFibGUgdG8gc2xlZXAKKyAqCisgKiBVbmxpbmtzIHRoZSBzcGVjaWZpZWQgZHJpdmVyIGZyb20gdGhlIGludGVybmFsIFVTQiBkcml2ZXIgbGlzdC4KKyAqLwordm9pZCB1c2JfZGVyZWdpc3Rlcl9kZXZpY2VfZHJpdmVyKHN0cnVjdCB1c2JfZGV2aWNlX2RyaXZlciAqdWRyaXZlcikKK3sKKwlwcl9pbmZvKCIlczogZGVyZWdpc3RlcmluZyBkZXZpY2UgZHJpdmVyICVzXG4iLAorCQkJdXNiY29yZV9uYW1lLCB1ZHJpdmVyLT5uYW1lKTsKKworCWRyaXZlcl91bnJlZ2lzdGVyKCZ1ZHJpdmVyLT5kcnZ3cmFwLmRyaXZlcik7CisJdXNiZnNfdXBkYXRlX3NwZWNpYWwoKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9kZXJlZ2lzdGVyX2RldmljZV9kcml2ZXIpOworCisvKioKKyAqIHVzYl9yZWdpc3Rlcl9kcml2ZXIgLSByZWdpc3RlciBhIFVTQiBpbnRlcmZhY2UgZHJpdmVyCisgKiBAbmV3X2RyaXZlcjogVVNCIG9wZXJhdGlvbnMgZm9yIHRoZSBpbnRlcmZhY2UgZHJpdmVyCisgKiBAb3duZXI6IG1vZHVsZSBvd25lciBvZiB0aGlzIGRyaXZlci4KKyAqCisgKiBSZWdpc3RlcnMgYSBVU0IgaW50ZXJmYWNlIGRyaXZlciB3aXRoIHRoZSBVU0IgY29yZS4gIFRoZSBsaXN0IG9mCisgKiB1bmF0dGFjaGVkIGludGVyZmFjZXMgd2lsbCBiZSByZXNjYW5uZWQgd2hlbmV2ZXIgYSBuZXcgZHJpdmVyIGlzCisgKiBhZGRlZCwgYWxsb3dpbmcgdGhlIG5ldyBkcml2ZXIgdG8gYXR0YWNoIHRvIGFueSByZWNvZ25pemVkIGludGVyZmFjZXMuCiAgKiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlIGFuZCAwIG9uIHN1Y2Nlc3MuCiAgKgogICogTk9URTogaWYgeW91IHdhbnQgeW91ciBkcml2ZXIgdG8gdXNlIHRoZSBVU0IgbWFqb3IgbnVtYmVyLCB5b3UgbXVzdCBjYWxsCkBAIC00MjMsMjMgKzczNiwyNSBAQAogCWlmICh1c2JfZGlzYWJsZWQoKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQluZXdfZHJpdmVyLT5kcml2ZXIubmFtZSA9IChjaGFyICopbmV3X2RyaXZlci0+bmFtZTsKLQluZXdfZHJpdmVyLT5kcml2ZXIuYnVzID0gJnVzYl9idXNfdHlwZTsKLQluZXdfZHJpdmVyLT5kcml2ZXIucHJvYmUgPSB1c2JfcHJvYmVfaW50ZXJmYWNlOwotCW5ld19kcml2ZXItPmRyaXZlci5yZW1vdmUgPSB1c2JfdW5iaW5kX2ludGVyZmFjZTsKLQluZXdfZHJpdmVyLT5kcml2ZXIub3duZXIgPSBvd25lcjsKKwluZXdfZHJpdmVyLT5kcnZ3cmFwLmZvcl9kZXZpY2VzID0gMDsKKwluZXdfZHJpdmVyLT5kcnZ3cmFwLmRyaXZlci5uYW1lID0gKGNoYXIgKikgbmV3X2RyaXZlci0+bmFtZTsKKwluZXdfZHJpdmVyLT5kcnZ3cmFwLmRyaXZlci5idXMgPSAmdXNiX2J1c190eXBlOworCW5ld19kcml2ZXItPmRydndyYXAuZHJpdmVyLnByb2JlID0gdXNiX3Byb2JlX2ludGVyZmFjZTsKKwluZXdfZHJpdmVyLT5kcnZ3cmFwLmRyaXZlci5yZW1vdmUgPSB1c2JfdW5iaW5kX2ludGVyZmFjZTsKKwluZXdfZHJpdmVyLT5kcnZ3cmFwLmRyaXZlci5vd25lciA9IG93bmVyOwogCXNwaW5fbG9ja19pbml0KCZuZXdfZHJpdmVyLT5keW5pZHMubG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJm5ld19kcml2ZXItPmR5bmlkcy5saXN0KTsKIAotCXJldHZhbCA9IGRyaXZlcl9yZWdpc3RlcigmbmV3X2RyaXZlci0+ZHJpdmVyKTsKKwlyZXR2YWwgPSBkcml2ZXJfcmVnaXN0ZXIoJm5ld19kcml2ZXItPmRydndyYXAuZHJpdmVyKTsKIAogCWlmICghcmV0dmFsKSB7Ci0JCXByX2luZm8oIiVzOiByZWdpc3RlcmVkIG5ldyBkcml2ZXIgJXNcbiIsCisJCXByX2luZm8oIiVzOiByZWdpc3RlcmVkIG5ldyBpbnRlcmZhY2UgZHJpdmVyICVzXG4iLAogCQkJdXNiY29yZV9uYW1lLCBuZXdfZHJpdmVyLT5uYW1lKTsKIAkJdXNiZnNfdXBkYXRlX3NwZWNpYWwoKTsKIAkJdXNiX2NyZWF0ZV9uZXdpZF9maWxlKG5ld19kcml2ZXIpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGVycm9yICVkIHJlZ2lzdGVyaW5nIGRyaXZlciAlc1xuIiwKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZXJyb3IgJWQgcmVnaXN0ZXJpbmcgaW50ZXJmYWNlICIKKwkJCSIJZHJpdmVyICVzXG4iLAogCQkJdXNiY29yZV9uYW1lLCByZXR2YWwsIG5ld19kcml2ZXItPm5hbWUpOwogCX0KIApAQCAtNDQ4LDggKzc2Myw4IEBACiBFWFBPUlRfU1lNQk9MX0dQTF9GVVRVUkUodXNiX3JlZ2lzdGVyX2RyaXZlcik7CiAKIC8qKgotICogdXNiX2RlcmVnaXN0ZXIgLSB1bnJlZ2lzdGVyIGEgVVNCIGRyaXZlcgotICogQGRyaXZlcjogVVNCIG9wZXJhdGlvbnMgb2YgdGhlIGRyaXZlciB0byB1bnJlZ2lzdGVyCisgKiB1c2JfZGVyZWdpc3RlciAtIHVucmVnaXN0ZXIgYSBVU0IgaW50ZXJmYWNlIGRyaXZlcgorICogQGRyaXZlcjogVVNCIG9wZXJhdGlvbnMgb2YgdGhlIGludGVyZmFjZSBkcml2ZXIgdG8gdW5yZWdpc3RlcgogICogQ29udGV4dDogbXVzdCBiZSBhYmxlIHRvIHNsZWVwCiAgKgogICogVW5saW5rcyB0aGUgc3BlY2lmaWVkIGRyaXZlciBmcm9tIHRoZSBpbnRlcm5hbCBVU0IgZHJpdmVyIGxpc3QuCkBAIC00NjAsMTIgKzc3NSw1NTQgQEAKICAqLwogdm9pZCB1c2JfZGVyZWdpc3RlcihzdHJ1Y3QgdXNiX2RyaXZlciAqZHJpdmVyKQogewotCXByX2luZm8oIiVzOiBkZXJlZ2lzdGVyaW5nIGRyaXZlciAlc1xuIiwgdXNiY29yZV9uYW1lLCBkcml2ZXItPm5hbWUpOworCXByX2luZm8oIiVzOiBkZXJlZ2lzdGVyaW5nIGludGVyZmFjZSBkcml2ZXIgJXNcbiIsCisJCQl1c2Jjb3JlX25hbWUsIGRyaXZlci0+bmFtZSk7CiAKIAl1c2JfcmVtb3ZlX25ld2lkX2ZpbGUoZHJpdmVyKTsKIAl1c2JfZnJlZV9keW5pZHMoZHJpdmVyKTsKLQlkcml2ZXJfdW5yZWdpc3RlcigmZHJpdmVyLT5kcml2ZXIpOworCWRyaXZlcl91bnJlZ2lzdGVyKCZkcml2ZXItPmRydndyYXAuZHJpdmVyKTsKIAogCXVzYmZzX3VwZGF0ZV9zcGVjaWFsKCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTF9GVVRVUkUodXNiX2RlcmVnaXN0ZXIpOworCisjaWZkZWYgQ09ORklHX1BNCisKKy8qIENhbGxlciBoYXMgbG9ja2VkIHVkZXYtPnBtX211dGV4ICovCitzdGF0aWMgaW50IHN1c3BlbmRfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBwbV9tZXNzYWdlX3QgbXNnKQoreworCXN0cnVjdCB1c2JfZGV2aWNlX2RyaXZlcgkqdWRyaXZlcjsKKwlpbnQJCQkJc3RhdHVzID0gMDsKKworCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQgfHwKKwkJCXVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpCisJCWdvdG8gZG9uZTsKKworCS8qIEZvciBkZXZpY2VzIHRoYXQgZG9uJ3QgaGF2ZSBhIGRyaXZlciwgd2UgZG8gYSBzdGFuZGFyZCBzdXNwZW5kLiAqLworCWlmICh1ZGV2LT5kZXYuZHJpdmVyID09IE5VTEwpIHsKKwkJdWRldi0+ZG9fcmVtb3RlX3dha2V1cCA9IDA7CisJCXN0YXR1cyA9IHVzYl9wb3J0X3N1c3BlbmQodWRldik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl1ZHJpdmVyID0gdG9fdXNiX2RldmljZV9kcml2ZXIodWRldi0+ZGV2LmRyaXZlcik7CisJc3RhdHVzID0gdWRyaXZlci0+c3VzcGVuZCh1ZGV2LCBtc2cpOworCitkb25lOgorCS8vIGRldl9kYmcoJnVkZXYtPmRldiwgIiVzOiBzdGF0dXMgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlpZiAoc3RhdHVzID09IDApCisJCXVkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9IG1zZy5ldmVudDsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBDYWxsZXIgaGFzIGxvY2tlZCB1ZGV2LT5wbV9tdXRleCAqLworc3RhdGljIGludCByZXN1bWVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoreworCXN0cnVjdCB1c2JfZGV2aWNlX2RyaXZlcgkqdWRyaXZlcjsKKwlpbnQJCQkJc3RhdHVzID0gMDsKKworCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQgfHwKKwkJCXVkZXYtPnN0YXRlICE9IFVTQl9TVEFURV9TVVNQRU5ERUQpCisJCWdvdG8gZG9uZTsKKworCS8qIENhbid0IHJlc3VtZSBpdCBpZiBpdCBkb2Vzbid0IGhhdmUgYSBkcml2ZXIuICovCisJaWYgKHVkZXYtPmRldi5kcml2ZXIgPT0gTlVMTCkgeworCQlzdGF0dXMgPSAtRU5PVENPTk47CisJCWdvdG8gZG9uZTsKKwl9CisKKwl1ZHJpdmVyID0gdG9fdXNiX2RldmljZV9kcml2ZXIodWRldi0+ZGV2LmRyaXZlcik7CisJc3RhdHVzID0gdWRyaXZlci0+cmVzdW1lKHVkZXYpOworCitkb25lOgorCS8vIGRldl9kYmcoJnVkZXYtPmRldiwgIiVzOiBzdGF0dXMgJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlpZiAoc3RhdHVzID09IDApCisJCXVkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9IFBNX0VWRU5UX09OOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIENhbGxlciBoYXMgbG9ja2VkIGludGYncyB1c2JfZGV2aWNlJ3MgcG1fbXV0ZXggKi8KK3N0YXRpYyBpbnQgc3VzcGVuZF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtc2cpCit7CisJc3RydWN0IHVzYl9kcml2ZXIJKmRyaXZlcjsKKwlpbnQJCQlzdGF0dXMgPSAwOworCisJLyogd2l0aCBubyBoYXJkd2FyZSwgVVNCIGludGVyZmFjZXMgb25seSB1c2UgRlJFRVpFIGFuZCBPTiBzdGF0ZXMgKi8KKwlpZiAoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKS0+c3RhdGUgPT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEIHx8CisJCQkhaXNfYWN0aXZlKGludGYpKQorCQlnb3RvIGRvbmU7CisKKwlpZiAoaW50Zi0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCkJLyogVGhpcyBjYW4ndCBoYXBwZW4gKi8KKwkJZ290byBkb25lOworCWRyaXZlciA9IHRvX3VzYl9kcml2ZXIoaW50Zi0+ZGV2LmRyaXZlcik7CisKKwlpZiAoZHJpdmVyLT5zdXNwZW5kICYmIGRyaXZlci0+cmVzdW1lKSB7CisJCXN0YXR1cyA9IGRyaXZlci0+c3VzcGVuZChpbnRmLCBtc2cpOworCQlpZiAoc3RhdHVzID09IDApCisJCQltYXJrX3F1aWVzY2VkKGludGYpOworCQllbHNlIGlmICghaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKS0+YXV0b19wbSkKKwkJCWRldl9lcnIoJmludGYtPmRldiwgIiVzIGVycm9yICVkXG4iLAorCQkJCQkic3VzcGVuZCIsIHN0YXR1cyk7CisJfSBlbHNlIHsKKwkJLy8gRklYTUUgZWxzZSBpZiB0aGVyZSdzIG5vIHN1c3BlbmQgbWV0aG9kLCBkaXNjb25uZWN0Li4uCisJCS8vIE5vdCBwb3NzaWJsZSBpZiBhdXRvX3BtIGlzIHNldC4uLgorCQlkZXZfd2FybigmaW50Zi0+ZGV2LCAibm8gc3VzcGVuZCBmb3IgZHJpdmVyICVzP1xuIiwKKwkJCQlkcml2ZXItPm5hbWUpOworCQltYXJrX3F1aWVzY2VkKGludGYpOworCX0KKworZG9uZToKKwkvLyBkZXZfZGJnKCZpbnRmLT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlpbnRmLT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPSBtc2cuZXZlbnQ7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogQ2FsbGVyIGhhcyBsb2NrZWQgaW50ZidzIHVzYl9kZXZpY2UncyBwbV9tdXRleCAqLworc3RhdGljIGludCByZXN1bWVfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfZHJpdmVyCSpkcml2ZXI7CisJaW50CQkJc3RhdHVzID0gMDsKKworCWlmIChpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQgfHwKKwkJCWlzX2FjdGl2ZShpbnRmKSkKKwkJZ290byBkb25lOworCisJLyogRG9uJ3QgbGV0IGF1dG9yZXN1bWUgaW50ZXJmZXJlIHdpdGggdW5iaW5kaW5nICovCisJaWYgKGludGYtPmNvbmRpdGlvbiA9PSBVU0JfSU5URVJGQUNFX1VOQklORElORykKKwkJZ290byBkb25lOworCisJLyogQ2FuJ3QgcmVzdW1lIGl0IGlmIGl0IGRvZXNuJ3QgaGF2ZSBhIGRyaXZlci4gKi8KKwlpZiAoaW50Zi0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCkgeworCQlzdGF0dXMgPSAtRU5PVENPTk47CisJCWdvdG8gZG9uZTsKKwl9CisJZHJpdmVyID0gdG9fdXNiX2RyaXZlcihpbnRmLT5kZXYuZHJpdmVyKTsKKworCWlmIChkcml2ZXItPnJlc3VtZSkgeworCQlzdGF0dXMgPSBkcml2ZXItPnJlc3VtZShpbnRmKTsKKwkJaWYgKHN0YXR1cykKKwkJCWRldl9lcnIoJmludGYtPmRldiwgIiVzIGVycm9yICVkXG4iLAorCQkJCQkicmVzdW1lIiwgc3RhdHVzKTsKKwkJZWxzZQorCQkJbWFya19hY3RpdmUoaW50Zik7CisJfSBlbHNlIHsKKwkJZGV2X3dhcm4oJmludGYtPmRldiwgIm5vIHJlc3VtZSBmb3IgZHJpdmVyICVzP1xuIiwKKwkJCQlkcml2ZXItPm5hbWUpOworCQltYXJrX2FjdGl2ZShpbnRmKTsKKwl9CisKK2RvbmU6CisJLy8gZGV2X2RiZygmaW50Zi0+ZGV2LCAiJXM6IHN0YXR1cyAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJaW50Zi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID0gUE1fRVZFTlRfT047CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiB1c2Jfc3VzcGVuZF9ib3RoIC0gc3VzcGVuZCBhIFVTQiBkZXZpY2UgYW5kIGl0cyBpbnRlcmZhY2VzCisgKiBAdWRldjogdGhlIHVzYl9kZXZpY2UgdG8gc3VzcGVuZAorICogQG1zZzogUG93ZXIgTWFuYWdlbWVudCBtZXNzYWdlIGRlc2NyaWJpbmcgdGhpcyBzdGF0ZSB0cmFuc2l0aW9uCisgKgorICogVGhpcyBpcyB0aGUgY2VudHJhbCByb3V0aW5lIGZvciBzdXNwZW5kaW5nIFVTQiBkZXZpY2VzLiAgSXQgY2FsbHMgdGhlCisgKiBzdXNwZW5kIG1ldGhvZHMgZm9yIGFsbCB0aGUgaW50ZXJmYWNlIGRyaXZlcnMgaW4gQHVkZXYgYW5kIHRoZW4gY2FsbHMKKyAqIHRoZSBzdXNwZW5kIG1ldGhvZCBmb3IgQHVkZXYgaXRzZWxmLiAgSWYgYW4gZXJyb3Igb2NjdXJzIGF0IGFueSBzdGFnZSwKKyAqIGFsbCB0aGUgaW50ZXJmYWNlcyB3aGljaCB3ZXJlIHN1c3BlbmRlZCBhcmUgcmVzdW1lZCBzbyB0aGF0IHRoZXkgcmVtYWluCisgKiBpbiB0aGUgc2FtZSBzdGF0ZSBhcyB0aGUgZGV2aWNlLgorICoKKyAqIElmIGFuIGF1dG9zdXNwZW5kIGlzIGluIHByb2dyZXNzIChAdWRldi0+YXV0b19wbSBpcyBzZXQpLCB0aGUgcm91dGluZQorICogY2hlY2tzIGZpcnN0IHRvIG1ha2Ugc3VyZSB0aGF0IG5laXRoZXIgdGhlIGRldmljZSBpdHNlbGYgb3IgYW55IG9mIGl0cworICogYWN0aXZlIGludGVyZmFjZXMgaXMgaW4gdXNlIChwbV91c2FnZV9jbnQgaXMgZ3JlYXRlciB0aGFuIDApLiAgSWYgdGhleQorICogYXJlLCB0aGUgYXV0b3N1c3BlbmQgZmFpbHMuCisgKgorICogSWYgdGhlIHN1c3BlbmQgc3VjY2VlZHMsIHRoZSByb3V0aW5lIHJlY3Vyc2l2ZWx5IHF1ZXVlcyBhbiBhdXRvc3VzcGVuZAorICogcmVxdWVzdCBmb3IgQHVkZXYncyBwYXJlbnQgZGV2aWNlLCB0aGVyZWJ5IHByb3BhZ2F0aW5nIHRoZSBjaGFuZ2UgdXAKKyAqIHRoZSBkZXZpY2UgdHJlZS4gIElmIGFsbCBvZiB0aGUgcGFyZW50J3MgY2hpbGRyZW4gYXJlIG5vdyBzdXNwZW5kZWQsCisgKiB0aGUgcGFyZW50IHdpbGwgYXV0b3N1c3BlbmQgaW4gdHVybi4KKyAqCisgKiBUaGUgc3VzcGVuZCBtZXRob2QgY2FsbHMgYXJlIHN1YmplY3QgdG8gbXV0dWFsIGV4Y2x1c2lvbiB1bmRlciBjb250cm9sCisgKiBvZiBAdWRldidzIHBtX211dGV4LiAgTWFueSBvZiB0aGVzZSBjYWxscyBhcmUgYWxzbyB1bmRlciB0aGUgcHJvdGVjdGlvbgorICogb2YgQHVkZXYncyBkZXZpY2UgbG9jayAoaW5jbHVkaW5nIGFsbCByZXF1ZXN0cyBvcmlnaW5hdGluZyBvdXRzaWRlIHRoZQorICogVVNCIHN1YnN5c3RlbSksIGJ1dCBhdXRvc3VzcGVuZCByZXF1ZXN0cyBnZW5lcmF0ZWQgYnkgYSBjaGlsZCBkZXZpY2Ugb3IKKyAqIGludGVyZmFjZSBkcml2ZXIgbWF5IG5vdCBiZS4gIFVzYmNvcmUgd2lsbCBpbnN1cmUgdGhhdCB0aGUgbWV0aG9kIGNhbGxzCisgKiBkbyBub3QgYXJyaXZlIGR1cmluZyBiaW5kLCB1bmJpbmQsIG9yIHJlc2V0IG9wZXJhdGlvbnMuICBIb3dldmVyLCBkcml2ZXJzCisgKiBtdXN0IGJlIHByZXBhcmVkIHRvIGhhbmRsZSBzdXNwZW5kIGNhbGxzIGFycml2aW5nIGF0IHVucHJlZGljdGFibGUgdGltZXMuCisgKiBUaGUgb25seSB3YXkgdG8gYmxvY2sgc3VjaCBjYWxscyBpcyB0byBkbyBhbiBhdXRvcmVzdW1lIChwcmV2ZW50aW5nCisgKiBhdXRvc3VzcGVuZHMpIHdoaWxlIGhvbGRpbmcgQHVkZXYncyBkZXZpY2UgbG9jayAocHJldmVudGluZyBvdXRzaWRlCisgKiBzdXNwZW5kcykuCisgKgorICogVGhlIGNhbGxlciBtdXN0IGhvbGQgQHVkZXYtPnBtX211dGV4LgorICoKKyAqIFRoaXMgcm91dGluZSBjYW4gcnVuIG9ubHkgaW4gcHJvY2VzcyBjb250ZXh0LgorICovCitpbnQgdXNiX3N1c3BlbmRfYm90aChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKK3sKKwlpbnQJCQlzdGF0dXMgPSAwOworCWludAkJCWkgPSAwOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRmOworCXN0cnVjdCB1c2JfZGV2aWNlCSpwYXJlbnQgPSB1ZGV2LT5wYXJlbnQ7CisKKwljYW5jZWxfZGVsYXllZF93b3JrKCZ1ZGV2LT5hdXRvc3VzcGVuZCk7CisJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkKKwkJcmV0dXJuIDA7CisJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpCisJCXJldHVybiAwOworCisJdWRldi0+ZG9fcmVtb3RlX3dha2V1cCA9IGRldmljZV9tYXlfd2FrZXVwKCZ1ZGV2LT5kZXYpOworCisJLyogRm9yIGF1dG9zdXNwZW5kLCBmYWlsIGZhc3QgaWYgYW55dGhpbmcgaXMgaW4gdXNlLgorCSAqIEFsc28gZmFpbCBpZiBhbnkgaW50ZXJmYWNlcyByZXF1aXJlIHJlbW90ZSB3YWtldXAgYnV0IGl0CisJICogaXNuJ3QgYXZhaWxhYmxlLiAqLworCWlmICh1ZGV2LT5hdXRvX3BtKSB7CisJCWlmICh1ZGV2LT5wbV91c2FnZV9jbnQgPiAwKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJaWYgKHVkZXYtPmFjdGNvbmZpZykgeworCQkJZm9yICg7IGkgPCB1ZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgeworCQkJCWludGYgPSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpXTsKKwkJCQlpZiAoIWlzX2FjdGl2ZShpbnRmKSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGludGYtPnBtX3VzYWdlX2NudCA+IDApCisJCQkJCXJldHVybiAtRUJVU1k7CisJCQkJaWYgKGludGYtPm5lZWRzX3JlbW90ZV93YWtldXAgJiYKKwkJCQkJCSF1ZGV2LT5kb19yZW1vdGVfd2FrZXVwKSB7CisJCQkJCWRldl9kYmcoJnVkZXYtPmRldiwKKwkicmVtb3RlIHdha2V1cCBuZWVkZWQgZm9yIGF1dG9zdXNwZW5kXG4iKTsKKwkJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkJCX0KKwkJCX0KKwkJCWkgPSAwOworCQl9CisJfQorCisJLyogU3VzcGVuZCBhbGwgdGhlIGludGVyZmFjZXMgYW5kIHRoZW4gdWRldiBpdHNlbGYgKi8KKwlpZiAodWRldi0+YWN0Y29uZmlnKSB7CisJCWZvciAoOyBpIDwgdWRldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOyBpKyspIHsKKwkJCWludGYgPSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpXTsKKwkJCXN0YXR1cyA9IHN1c3BlbmRfaW50ZXJmYWNlKGludGYsIG1zZyk7CisJCQlpZiAoc3RhdHVzICE9IDApCisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHN0YXR1cyA9PSAwKQorCQlzdGF0dXMgPSBzdXNwZW5kX2RldmljZSh1ZGV2LCBtc2cpOworCisJLyogSWYgdGhlIHN1c3BlbmQgZmFpbGVkLCByZXN1bWUgaW50ZXJmYWNlcyB0aGF0IGRpZCBnZXQgc3VzcGVuZGVkICovCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCXdoaWxlICgtLWkgPj0gMCkgeworCQkJaW50ZiA9IHVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlW2ldOworCQkJcmVzdW1lX2ludGVyZmFjZShpbnRmKTsKKwkJfQorCisJLyogSWYgdGhlIHN1c3BlbmQgc3VjY2VlZGVkLCBwcm9wYWdhdGUgaXQgdXAgdGhlIHRyZWUgKi8KKwl9IGVsc2UgaWYgKHBhcmVudCkKKwkJdXNiX2F1dG9zdXNwZW5kX2RldmljZShwYXJlbnQsIDApOworCisJLy8gZGV2X2RiZygmdWRldi0+ZGV2LCAiJXM6IHN0YXR1cyAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogdXNiX3Jlc3VtZV9ib3RoIC0gcmVzdW1lIGEgVVNCIGRldmljZSBhbmQgaXRzIGludGVyZmFjZXMKKyAqIEB1ZGV2OiB0aGUgdXNiX2RldmljZSB0byByZXN1bWUKKyAqCisgKiBUaGlzIGlzIHRoZSBjZW50cmFsIHJvdXRpbmUgZm9yIHJlc3VtaW5nIFVTQiBkZXZpY2VzLiAgSXQgY2FsbHMgdGhlCisgKiB0aGUgcmVzdW1lIG1ldGhvZCBmb3IgQHVkZXYgYW5kIHRoZW4gY2FsbHMgdGhlIHJlc3VtZSBtZXRob2RzIGZvciBhbGwKKyAqIHRoZSBpbnRlcmZhY2UgZHJpdmVycyBpbiBAdWRldi4KKyAqCisgKiBCZWZvcmUgc3RhcnRpbmcgdGhlIHJlc3VtZSwgdGhlIHJvdXRpbmUgY2FsbHMgaXRzZWxmIHJlY3Vyc2l2ZWx5IGZvcgorICogdGhlIHBhcmVudCBkZXZpY2Ugb2YgQHVkZXYsIHRoZXJlYnkgcHJvcGFnYXRpbmcgdGhlIGNoYW5nZSB1cCB0aGUgZGV2aWNlCisgKiB0cmVlIGFuZCBhc3N1cmluZyB0aGF0IEB1ZGV2IHdpbGwgYmUgYWJsZSB0byByZXN1bWUuICBJZiB0aGUgcGFyZW50IGlzCisgKiB1bmFibGUgdG8gcmVzdW1lIHN1Y2Nlc3NmdWxseSwgdGhlIHJvdXRpbmUgZmFpbHMuCisgKgorICogVGhlIHJlc3VtZSBtZXRob2QgY2FsbHMgYXJlIHN1YmplY3QgdG8gbXV0dWFsIGV4Y2x1c2lvbiB1bmRlciBjb250cm9sCisgKiBvZiBAdWRldidzIHBtX211dGV4LiAgTWFueSBvZiB0aGVzZSBjYWxscyBhcmUgYWxzbyB1bmRlciB0aGUgcHJvdGVjdGlvbgorICogb2YgQHVkZXYncyBkZXZpY2UgbG9jayAoaW5jbHVkaW5nIGFsbCByZXF1ZXN0cyBvcmlnaW5hdGluZyBvdXRzaWRlIHRoZQorICogVVNCIHN1YnN5c3RlbSksIGJ1dCBhdXRvcmVzdW1lIHJlcXVlc3RzIGdlbmVyYXRlZCBieSBhIGNoaWxkIGRldmljZSBvcgorICogaW50ZXJmYWNlIGRyaXZlciBtYXkgbm90IGJlLiAgVXNiY29yZSB3aWxsIGluc3VyZSB0aGF0IHRoZSBtZXRob2QgY2FsbHMKKyAqIGRvIG5vdCBhcnJpdmUgZHVyaW5nIGJpbmQsIHVuYmluZCwgb3IgcmVzZXQgb3BlcmF0aW9ucy4gIEhvd2V2ZXIsIGRyaXZlcnMKKyAqIG11c3QgYmUgcHJlcGFyZWQgdG8gaGFuZGxlIHJlc3VtZSBjYWxscyBhcnJpdmluZyBhdCB1bnByZWRpY3RhYmxlIHRpbWVzLgorICogVGhlIG9ubHkgd2F5IHRvIGJsb2NrIHN1Y2ggY2FsbHMgaXMgdG8gZG8gYW4gYXV0b3Jlc3VtZSAocHJldmVudGluZworICogb3RoZXIgYXV0b3Jlc3VtZXMpIHdoaWxlIGhvbGRpbmcgQHVkZXYncyBkZXZpY2UgbG9jayAocHJldmVudGluZyBvdXRzaWRlCisgKiByZXN1bWVzKS4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAdWRldi0+cG1fbXV0ZXguCisgKgorICogVGhpcyByb3V0aW5lIGNhbiBydW4gb25seSBpbiBwcm9jZXNzIGNvbnRleHQuCisgKi8KK2ludCB1c2JfcmVzdW1lX2JvdGgoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJaW50CQkJc3RhdHVzID0gMDsKKwlpbnQJCQlpOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRmOworCXN0cnVjdCB1c2JfZGV2aWNlCSpwYXJlbnQgPSB1ZGV2LT5wYXJlbnQ7CisKKwljYW5jZWxfZGVsYXllZF93b3JrKCZ1ZGV2LT5hdXRvc3VzcGVuZCk7CisJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBQcm9wYWdhdGUgdGhlIHJlc3VtZSB1cCB0aGUgdHJlZSwgaWYgbmVjZXNzYXJ5ICovCisJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpIHsKKwkJaWYgKHBhcmVudCkgeworCQkJbXV0ZXhfbG9ja19uZXN0ZWQoJnBhcmVudC0+cG1fbXV0ZXgsIHBhcmVudC0+bGV2ZWwpOworCQkJcGFyZW50LT5hdXRvX3BtID0gMTsKKwkJCXN0YXR1cyA9IHVzYl9yZXN1bWVfYm90aChwYXJlbnQpOworCQl9IGVsc2UgeworCisJCQkvKiBXZSBjYW4ndCBwcm9nYWdhdGUgYmV5b25kIHRoZSBVU0Igc3Vic3lzdGVtLAorCQkJICogc28gaWYgYSByb290IGh1YidzIGNvbnRyb2xsZXIgaXMgc3VzcGVuZGVkCisJCQkgKiB0aGVuIHdlJ3JlIHN0dWNrLiAqLworCQkJaWYgKHVkZXYtPmRldi5wYXJlbnQtPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ICE9CisJCQkJCVBNX0VWRU5UX09OKQorCQkJCXN0YXR1cyA9IC1FSE9TVFVOUkVBQ0g7CisJCX0KKwkJaWYgKHN0YXR1cyA9PSAwKQorCQkJc3RhdHVzID0gcmVzdW1lX2RldmljZSh1ZGV2KTsKKwkJaWYgKHBhcmVudCkKKwkJCW11dGV4X3VubG9jaygmcGFyZW50LT5wbV9tdXRleCk7CisJfSBlbHNlIHsKKworCQkvKiBOZWVkZWQgb25seSBmb3Igc2V0dGluZyB1ZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQKKwkJICogYW5kIGZvciBwb3NzaWJsZSBkZWJ1Z2dpbmcgbWVzc2FnZS4gKi8KKwkJc3RhdHVzID0gcmVzdW1lX2RldmljZSh1ZGV2KTsKKwl9CisKKwkvKiBOb3cgdGhlIHBhcmVudCB3b24ndCBzdXNwZW5kIHVudGlsIHdlIGFyZSBmaW5pc2hlZCAqLworCisJaWYgKHN0YXR1cyA9PSAwICYmIHVkZXYtPmFjdGNvbmZpZykgeworCQlmb3IgKGkgPSAwOyBpIDwgdWRldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOyBpKyspIHsKKwkJCWludGYgPSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVtpXTsKKwkJCXJlc3VtZV9pbnRlcmZhY2UoaW50Zik7CisJCX0KKwl9CisKKwkvLyBkZXZfZGJnKCZ1ZGV2LT5kZXYsICIlczogc3RhdHVzICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIENPTkZJR19VU0JfU1VTUEVORAorCisvKioKKyAqIHVzYl9hdXRvc3VzcGVuZF9kZXZpY2UgLSBkZWxheWVkIGF1dG9zdXNwZW5kIG9mIGEgVVNCIGRldmljZSBhbmQgaXRzIGludGVyZmFjZXMKKyAqIEB1ZGV2IC0gdGhlIHVzYl9kZXZpY2UgdG8gYXV0b3N1c3BlbmQKKyAqIEBkZWNfdXNhZ2VfY250IC0gZmxhZyB0byBkZWNyZW1lbnQgQHVkZXYncyBQTS11c2FnZSBjb3VudGVyCisgKgorICogVGhpcyByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIGNvcmUgc3Vic3lzdGVtIGlzIGZpbmlzaGVkIHVzaW5nCisgKiBAdWRldiBhbmQgd2FudHMgdG8gYWxsb3cgaXQgdG8gYXV0b3N1c3BlbmQuICBFeGFtcGxlcyB3b3VsZCBiZSB3aGVuCisgKiBAdWRldidzIGRldmljZSBmaWxlIGluIHVzYmZzIGlzIGNsb3NlZCBvciBhZnRlciBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlLgorICoKKyAqIEBkZWNfdXNhZ2VfY250IHNob3VsZCBiZSAxIGlmIHRoZSBzdWJzeXN0ZW0gcHJldmlvdXNseSBpbmNyZW1lbnRlZAorICogQHVkZXYncyB1c2FnZSBjb3VudGVyIChzdWNoIGFzIGJ5IHBhc3NpbmcgMSB0byB1c2JfYXV0b3Jlc3VtZV9kZXZpY2UpOworICogb3RoZXJ3aXNlIGl0IHNob3VsZCBiZSAwLgorICoKKyAqIElmIHRoZSB1c2FnZSBjb3VudGVyIGZvciBAdWRldiBvciBhbnkgb2YgaXRzIGFjdGl2ZSBpbnRlcmZhY2VzIGlzIGdyZWF0ZXIKKyAqIHRoYW4gMCwgdGhlIGF1dG9zdXNwZW5kIHJlcXVlc3Qgd2lsbCBub3QgYmUgcXVldWVkLiAgKElmIGFuIGludGVyZmFjZQorICogZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgYXV0b3N1c3BlbmQgdGhlbiBpdHMgdXNhZ2UgY291bnRlciBpcyBwZXJtYW5lbnRseQorICogcG9zaXRpdmUuKSAgTGlrZXdpc2UsIGlmIGFuIGludGVyZmFjZSBkcml2ZXIgcmVxdWlyZXMgcmVtb3RlLXdha2V1cAorICogY2FwYWJpbGl0eSBkdXJpbmcgYXV0b3N1c3BlbmQgYnV0IHJlbW90ZSB3YWtldXAgaXMgZGlzYWJsZWQsIHRoZQorICogYXV0b3N1c3BlbmQgd2lsbCBmYWlsLgorICoKKyAqIE9mdGVuIHRoZSBjYWxsZXIgd2lsbCBob2xkIEB1ZGV2J3MgZGV2aWNlIGxvY2ssIGJ1dCB0aGlzIGlzIG5vdAorICogbmVjZXNzYXJ5LgorICoKKyAqIFRoaXMgcm91dGluZSBjYW4gcnVuIG9ubHkgaW4gcHJvY2VzcyBjb250ZXh0LgorICovCit2b2lkIHVzYl9hdXRvc3VzcGVuZF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIGludCBkZWNfdXNhZ2VfY250KQoreworCW11dGV4X2xvY2tfbmVzdGVkKCZ1ZGV2LT5wbV9tdXRleCwgdWRldi0+bGV2ZWwpOworCXVkZXYtPnBtX3VzYWdlX2NudCAtPSBkZWNfdXNhZ2VfY250OworCWlmICh1ZGV2LT5wbV91c2FnZV9jbnQgPD0gMCkKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZ1ZGV2LT5hdXRvc3VzcGVuZCwKKwkJCQlVU0JfQVVUT1NVU1BFTkRfREVMQVkpOworCW11dGV4X3VubG9jaygmdWRldi0+cG1fbXV0ZXgpOworCS8vIGRldl9kYmcoJnVkZXYtPmRldiwgIiVzOiBjbnQgJWRcbiIsCisJLy8JCV9fRlVOQ1RJT05fXywgdWRldi0+cG1fdXNhZ2VfY250KTsKK30KKworLyoqCisgKiB1c2JfYXV0b3Jlc3VtZV9kZXZpY2UgLSBpbW1lZGlhdGVseSBhdXRvcmVzdW1lIGEgVVNCIGRldmljZSBhbmQgaXRzIGludGVyZmFjZXMKKyAqIEB1ZGV2IC0gdGhlIHVzYl9kZXZpY2UgdG8gYXV0b3Jlc3VtZQorICogQGluY191c2FnZV9jbnQgLSBmbGFnIHRvIGluY3JlbWVudCBAdWRldidzIFBNLXVzYWdlIGNvdW50ZXIKKyAqCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIGEgY29yZSBzdWJzeXN0ZW0gd2FudHMgdG8gdXNlIEB1ZGV2CisgKiBhbmQgbmVlZHMgdG8gZ3VhcmFudGVlIHRoYXQgaXQgaXMgbm90IHN1c3BlbmRlZC4gIEluIGFkZGl0aW9uLCB0aGUKKyAqIGNhbGxlciBjYW4gcHJldmVudCBAdWRldiBmcm9tIGJlaW5nIGF1dG9zdXNwZW5kZWQgc3Vic2VxdWVudGx5LiAgKE5vdGUKKyAqIHRoYXQgdGhpcyB3aWxsIG5vdCBwcmV2ZW50IHN1c3BlbmQgZXZlbnRzIG9yaWdpbmF0aW5nIGluIHRoZSBQTSBjb3JlLikKKyAqIEV4YW1wbGVzIHdvdWxkIGJlIHdoZW4gQHVkZXYncyBkZXZpY2UgZmlsZSBpbiB1c2JmcyBpcyBvcGVuZWQgKGF1dG9zdXNwZW5kCisgKiBzaG91bGQgYmUgcHJldmVudGVkIHVudGlsIHRoZSBmaWxlIGlzIGNsb3NlZCkgb3Igd2hlbiBhIHJlbW90ZS13YWtldXAKKyAqIHJlcXVlc3QgaXMgcmVjZWl2ZWQgKGxhdGVyIGF1dG9zdXNwZW5kcyBzaG91bGQgbm90IGJlIHByZXZlbnRlZCkuCisgKgorICogQGluY191c2FnZV9jbnQgc2hvdWxkIGJlIDEgdG8gaW5jcmVtZW50IEB1ZGV2J3MgdXNhZ2UgY291bnRlciBhbmQgcHJldmVudAorICogYXV0b3N1c3BlbmRzLiAgVGhpcyBwcmV2ZW50aW9uIHdpbGwgcGVyc2lzdCB1bnRpbCB0aGUgdXNhZ2UgY291bnRlciBpcworICogZGVjcmVtZW50ZWQgYWdhaW4gKHN1Y2ggYXMgYnkgcGFzc2luZyAxIHRvIHVzYl9hdXRvc3VzcGVuZF9kZXZpY2UpLgorICogT3RoZXJ3aXNlIEBpbmNfdXNhZ2VfY250IHNob3VsZCBiZSAwIHRvIGxlYXZlIHRoZSB1c2FnZSBjb3VudGVyIHVuY2hhbmdlZC4KKyAqIFJlZ2FyZGxlc3MsIGlmIHRoZSBhdXRvcmVzdW1lIGZhaWxzIHRoZW4gdGhlIHVzYWdlIGNvdW50ZXIgaXMgbm90CisgKiBpbmNyZW1lbnRlZC4KKyAqCisgKiBPZnRlbiB0aGUgY2FsbGVyIHdpbGwgaG9sZCBAdWRldidzIGRldmljZSBsb2NrLCBidXQgdGhpcyBpcyBub3QKKyAqIG5lY2Vzc2FyeSAoYW5kIGF0dGVtcHRpbmcgaXQgbWlnaHQgY2F1c2UgZGVhZGxvY2spLgorICoKKyAqIFRoaXMgcm91dGluZSBjYW4gcnVuIG9ubHkgaW4gcHJvY2VzcyBjb250ZXh0LgorICovCitpbnQgdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBpbnQgaW5jX3VzYWdlX2NudCkKK3sKKwlpbnQJc3RhdHVzOworCisJbXV0ZXhfbG9ja19uZXN0ZWQoJnVkZXYtPnBtX211dGV4LCB1ZGV2LT5sZXZlbCk7CisJdWRldi0+cG1fdXNhZ2VfY250ICs9IGluY191c2FnZV9jbnQ7CisJdWRldi0+YXV0b19wbSA9IDE7CisJc3RhdHVzID0gdXNiX3Jlc3VtZV9ib3RoKHVkZXYpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJdWRldi0+cG1fdXNhZ2VfY250IC09IGluY191c2FnZV9jbnQ7CisJbXV0ZXhfdW5sb2NrKCZ1ZGV2LT5wbV9tdXRleCk7CisJLy8gZGV2X2RiZygmdWRldi0+ZGV2LCAiJXM6IHN0YXR1cyAlZCBjbnQgJWRcbiIsCisJLy8JCV9fRlVOQ1RJT05fXywgc3RhdHVzLCB1ZGV2LT5wbV91c2FnZV9jbnQpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlIC0gZGVjcmVtZW50IGEgVVNCIGludGVyZmFjZSdzIFBNLXVzYWdlIGNvdW50ZXIKKyAqIEBpbnRmIC0gdGhlIHVzYl9pbnRlcmZhY2Ugd2hvc2UgY291bnRlciBzaG91bGQgYmUgZGVjcmVtZW50ZWQKKyAqCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIGJlIGNhbGxlZCBieSBhbiBpbnRlcmZhY2UgZHJpdmVyIHdoZW4gaXQgaXMKKyAqIGZpbmlzaGVkIHVzaW5nIEBpbnRmIGFuZCB3YW50cyB0byBhbGxvdyBpdCB0byBhdXRvc3VzcGVuZC4gIEEgdHlwaWNhbAorICogZXhhbXBsZSB3b3VsZCBiZSBhIGNoYXJhY3Rlci1kZXZpY2UgZHJpdmVyIHdoZW4gaXRzIGRldmljZSBmaWxlIGlzCisgKiBjbG9zZWQuCisgKgorICogVGhlIHJvdXRpbmUgZGVjcmVtZW50cyBAaW50ZidzIHVzYWdlIGNvdW50ZXIuICBXaGVuIHRoZSBjb3VudGVyIHJlYWNoZXMKKyAqIDAsIGEgZGVsYXllZCBhdXRvc3VzcGVuZCByZXF1ZXN0IGZvciBAaW50ZidzIGRldmljZSBpcyBxdWV1ZWQuICBXaGVuCisgKiB0aGUgZGVsYXkgZXhwaXJlcywgaWYgQGludGYtPnBtX3VzYWdlX2NudCBpcyBzdGlsbCA8PSAwIGFsb25nIHdpdGggYWxsCisgKiB0aGUgb3RoZXIgdXNhZ2UgY291bnRlcnMgZm9yIHRoZSBzaWJsaW5nIGludGVyZmFjZXMgYW5kIEBpbnRmJ3MKKyAqIHVzYl9kZXZpY2UsIHRoZSBkZXZpY2UgYW5kIGFsbCBpdHMgaW50ZXJmYWNlcyB3aWxsIGJlIGF1dG9zdXNwZW5kZWQuCisgKgorICogTm90ZSB0aGF0IEBpbnRmLT5wbV91c2FnZV9jbnQgaXMgb3duZWQgYnkgdGhlIGludGVyZmFjZSBkcml2ZXIuICBUaGUKKyAqIGNvcmUgd2lsbCBub3QgY2hhbmdlIGl0cyB2YWx1ZSBvdGhlciB0aGFuIHRoZSBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudAorICogaW4gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlIGFuZCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UuICBUaGUgZHJpdmVyCisgKiBtYXkgdXNlIHRoaXMgc2ltcGxlIGNvdW50ZXItb3JpZW50ZWQgZGlzY2lwbGluZSBvciBtYXkgc2V0IHRoZSB2YWx1ZQorICogYW55IHdheSBpdCBsaWtlcy4KKyAqCisgKiBJZiB0aGUgZHJpdmVyIGhhcyBzZXQgQGludGYtPm5lZWRzX3JlbW90ZV93YWtldXAgdGhlbiBhdXRvc3VzcGVuZCB3aWxsCisgKiB0YWtlIHBsYWNlIG9ubHkgaWYgdGhlIGRldmljZSdzIHJlbW90ZS13YWtldXAgZmFjaWxpdHkgaXMgZW5hYmxlZC4KKyAqCisgKiBTdXNwZW5kIG1ldGhvZCBjYWxscyBxdWV1ZWQgYnkgdGhpcyByb3V0aW5lIGNhbiBhcnJpdmUgYXQgYW55IHRpbWUKKyAqIHdoaWxlIEBpbnRmIGlzIHJlc3VtZWQgYW5kIGl0cyB1c2FnZSBjb3VudGVyIGlzIGVxdWFsIHRvIDAuICBUaGV5IGFyZQorICogbm90IHByb3RlY3RlZCBieSB0aGUgdXNiX2RldmljZSdzIGxvY2sgYnV0IG9ubHkgYnkgaXRzIHBtX211dGV4LgorICogRHJpdmVycyBtdXN0IHByb3ZpZGUgdGhlaXIgb3duIHN5bmNocm9uaXphdGlvbi4KKyAqCisgKiBUaGlzIHJvdXRpbmUgY2FuIHJ1biBvbmx5IGluIHByb2Nlc3MgY29udGV4dC4KKyAqLwordm9pZCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCisJbXV0ZXhfbG9ja19uZXN0ZWQoJnVkZXYtPnBtX211dGV4LCB1ZGV2LT5sZXZlbCk7CisJaWYgKGludGYtPmNvbmRpdGlvbiAhPSBVU0JfSU5URVJGQUNFX1VOQk9VTkQpIHsKKwkJaWYgKC0taW50Zi0+cG1fdXNhZ2VfY250IDw9IDApCisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnVkZXYtPmF1dG9zdXNwZW5kLAorCQkJCQlVU0JfQVVUT1NVU1BFTkRfREVMQVkpOworCX0KKwltdXRleF91bmxvY2soJnVkZXYtPnBtX211dGV4KTsKKwkvLyBkZXZfZGJnKCZpbnRmLT5kZXYsICIlczogY250ICVkXG4iLAorCS8vCQlfX0ZVTkNUSU9OX18sIGludGYtPnBtX3VzYWdlX2NudCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UpOworCisvKioKKyAqIHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZSAtIGluY3JlbWVudCBhIFVTQiBpbnRlcmZhY2UncyBQTS11c2FnZSBjb3VudGVyCisgKiBAaW50ZiAtIHRoZSB1c2JfaW50ZXJmYWNlIHdob3NlIGNvdW50ZXIgc2hvdWxkIGJlIGluY3JlbWVudGVkCisgKgorICogVGhpcyByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQgYnkgYW4gaW50ZXJmYWNlIGRyaXZlciB3aGVuIGl0IHdhbnRzIHRvCisgKiB1c2UgQGludGYgYW5kIG5lZWRzIHRvIGd1YXJhbnRlZSB0aGF0IGl0IGlzIG5vdCBzdXNwZW5kZWQuICBJbiBhZGRpdGlvbiwKKyAqIHRoZSByb3V0aW5lIHByZXZlbnRzIEBpbnRmIGZyb20gYmVpbmcgYXV0b3N1c3BlbmRlZCBzdWJzZXF1ZW50bHkuICAoTm90ZQorICogdGhhdCB0aGlzIHdpbGwgbm90IHByZXZlbnQgc3VzcGVuZCBldmVudHMgb3JpZ2luYXRpbmcgaW4gdGhlIFBNIGNvcmUuKQorICogVGhpcyBwcmV2ZW50aW9uIHdpbGwgcGVyc2lzdCB1bnRpbCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoKSBpcyBjYWxsZWQKKyAqIG9yIEBpbnRmIGlzIHVuYm91bmQuICBBIHR5cGljYWwgZXhhbXBsZSB3b3VsZCBiZSBhIGNoYXJhY3Rlci1kZXZpY2UKKyAqIGRyaXZlciB3aGVuIGl0cyBkZXZpY2UgZmlsZSBpcyBvcGVuZWQuCisgKgorICogVGhlIHJvdXRpbmUgaW5jcmVtZW50cyBAaW50ZidzIHVzYWdlIGNvdW50ZXIuICBTbyBsb25nIGFzIHRoZSBjb3VudGVyCisgKiBpcyBncmVhdGVyIHRoYW4gMCwgYXV0b3N1c3BlbmQgd2lsbCBub3QgYmUgYWxsb3dlZCBmb3IgQGludGYgb3IgaXRzCisgKiB1c2JfZGV2aWNlLiAgV2hlbiB0aGUgZHJpdmVyIGlzIGZpbmlzaGVkIHVzaW5nIEBpbnRmIGl0IHNob3VsZCBjYWxsCisgKiB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoKSB0byBkZWNyZW1lbnQgdGhlIHVzYWdlIGNvdW50ZXIgYW5kIHF1ZXVlCisgKiBhIGRlbGF5ZWQgYXV0b3N1c3BlbmQgcmVxdWVzdCAoaWYgdGhlIGNvdW50ZXIgaXMgPD0gMCkuCisgKgorICogTm90ZSB0aGF0IEBpbnRmLT5wbV91c2FnZV9jbnQgaXMgb3duZWQgYnkgdGhlIGludGVyZmFjZSBkcml2ZXIuICBUaGUKKyAqIGNvcmUgd2lsbCBub3QgY2hhbmdlIGl0cyB2YWx1ZSBvdGhlciB0aGFuIHRoZSBpbmNyZW1lbnQgYW5kIGRlY3JlbWVudAorICogaW4gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlIGFuZCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UuICBUaGUgZHJpdmVyCisgKiBtYXkgdXNlIHRoaXMgc2ltcGxlIGNvdW50ZXItb3JpZW50ZWQgZGlzY2lwbGluZSBvciBtYXkgc2V0IHRoZSB2YWx1ZQorICogYW55IHdheSBpdCBsaWtlcy4KKyAqCisgKiBSZXN1bWUgbWV0aG9kIGNhbGxzIGdlbmVyYXRlZCBieSB0aGlzIHJvdXRpbmUgY2FuIGFycml2ZSBhdCBhbnkgdGltZQorICogd2hpbGUgQGludGYgaXMgc3VzcGVuZGVkLiAgVGhleSBhcmUgbm90IHByb3RlY3RlZCBieSB0aGUgdXNiX2RldmljZSdzCisgKiBsb2NrIGJ1dCBvbmx5IGJ5IGl0cyBwbV9tdXRleC4gIERyaXZlcnMgbXVzdCBwcm92aWRlIHRoZWlyIG93bgorICogc3luY2hyb25pemF0aW9uLgorICoKKyAqIFRoaXMgcm91dGluZSBjYW4gcnVuIG9ubHkgaW4gcHJvY2VzcyBjb250ZXh0LgorICovCitpbnQgdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlpbnQJCQlzdGF0dXM7CisKKwltdXRleF9sb2NrX25lc3RlZCgmdWRldi0+cG1fbXV0ZXgsIHVkZXYtPmxldmVsKTsKKwlpZiAoaW50Zi0+Y29uZGl0aW9uID09IFVTQl9JTlRFUkZBQ0VfVU5CT1VORCkKKwkJc3RhdHVzID0gLUVOT0RFVjsKKwllbHNlIHsKKwkJKytpbnRmLT5wbV91c2FnZV9jbnQ7CisJCXVkZXYtPmF1dG9fcG0gPSAxOworCQlzdGF0dXMgPSB1c2JfcmVzdW1lX2JvdGgodWRldik7CisJCWlmIChzdGF0dXMgIT0gMCkKKwkJCS0taW50Zi0+cG1fdXNhZ2VfY250OworCX0KKwltdXRleF91bmxvY2soJnVkZXYtPnBtX211dGV4KTsKKwkvLyBkZXZfZGJnKCZpbnRmLT5kZXYsICIlczogc3RhdHVzICVkIGNudCAlZFxuIiwKKwkvLwkJX19GVU5DVElPTl9fLCBzdGF0dXMsIGludGYtPnBtX3VzYWdlX2NudCk7CisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZSk7CisKKyNlbmRpZiAvKiBDT05GSUdfVVNCX1NVU1BFTkQgKi8KKworc3RhdGljIGludCB1c2Jfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworCWludAlzdGF0dXM7CisKKwlpZiAoaXNfdXNiX2RldmljZShkZXYpKSB7CisJCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOworCisJCW11dGV4X2xvY2tfbmVzdGVkKCZ1ZGV2LT5wbV9tdXRleCwgdWRldi0+bGV2ZWwpOworCQl1ZGV2LT5hdXRvX3BtID0gMDsKKwkJc3RhdHVzID0gdXNiX3N1c3BlbmRfYm90aCh1ZGV2LCBtZXNzYWdlKTsKKwkJbXV0ZXhfdW5sb2NrKCZ1ZGV2LT5wbV9tdXRleCk7CisJfSBlbHNlCisJCXN0YXR1cyA9IDA7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCB1c2JfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQJc3RhdHVzOworCisJaWYgKGlzX3VzYl9kZXZpY2UoZGV2KSkgeworCQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKKworCQltdXRleF9sb2NrX25lc3RlZCgmdWRldi0+cG1fbXV0ZXgsIHVkZXYtPmxldmVsKTsKKwkJdWRldi0+YXV0b19wbSA9IDA7CisJCXN0YXR1cyA9IHVzYl9yZXN1bWVfYm90aCh1ZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZ1ZGV2LT5wbV9tdXRleCk7CisKKwkJLyogUmViaW5kIGRyaXZlcnMgdGhhdCBoYWQgbm8gc3VzcGVuZCBtZXRob2Q/ICovCisJfSBlbHNlCisJCXN0YXR1cyA9IDA7CisJcmV0dXJuIHN0YXR1czsKK30KKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdHJ1Y3QgYnVzX3R5cGUgdXNiX2J1c190eXBlID0geworCS5uYW1lID0JCSJ1c2IiLAorCS5tYXRjaCA9CXVzYl9kZXZpY2VfbWF0Y2gsCisJLnVldmVudCA9CXVzYl91ZXZlbnQsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPQl1c2Jfc3VzcGVuZCwKKwkucmVzdW1lID0JdXNiX3Jlc3VtZSwKKyNlbmRpZgorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZW5kcG9pbnQuYyBiL2RyaXZlcnMvdXNiL2NvcmUvZW5kcG9pbnQuYwppbmRleCAyNDdiNWE0Li4zZWJiOTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2VuZHBvaW50LmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9lbmRwb2ludC5jCkBAIC0yMDcsOSArMjA3LDkgQEAKIAlrZnJlZShlcF9kZXYpOwogfQogCi12b2lkIHVzYl9jcmVhdGVfZXBfZmlsZXMoc3RydWN0IGRldmljZSAqcGFyZW50LAotCQkJIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZW5kcG9pbnQsCi0JCQkgc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitpbnQgdXNiX2NyZWF0ZV9lcF9maWxlcyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVuZHBvaW50LAorCQkJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CiAJY2hhciBuYW1lWzhdOwogCXN0cnVjdCBlcF9kZXZpY2UgKmVwX2RldjsKQEAgLTI0MiwxOSArMjQyLDMzIEBACiAJcmV0dmFsID0gZGV2aWNlX3JlZ2lzdGVyKCZlcF9kZXYtPmRldik7CiAJaWYgKHJldHZhbCkKIAkJZ290byBlcnJvcjsKLQlzeXNmc19jcmVhdGVfZ3JvdXAoJmVwX2Rldi0+ZGV2LmtvYmosICZlcF9kZXZfYXR0cl9ncnApOworCXJldHZhbCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZXBfZGV2LT5kZXYua29iaiwgJmVwX2Rldl9hdHRyX2dycCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcl9ncm91cDsKIAogCWVuZHBvaW50LT5lcF9kZXYgPSBlcF9kZXY7CiAKIAkvKiBjcmVhdGUgdGhlIHN5bWxpbmsgdG8gdGhlIG9sZC1zdHlsZSAiZXBfWFgiIGRpcmVjdG9yeSAqLwogCXNwcmludGYobmFtZSwgImVwXyUwMngiLCBlbmRwb2ludC0+ZGVzYy5iRW5kcG9pbnRBZGRyZXNzKTsKLQlzeXNmc19jcmVhdGVfbGluaygmcGFyZW50LT5rb2JqLCAmZW5kcG9pbnQtPmVwX2Rldi0+ZGV2LmtvYmosIG5hbWUpOwotCisJcmV0dmFsID0gc3lzZnNfY3JlYXRlX2xpbmsoJnBhcmVudC0+a29iaiwKKwkJCQkgICAmZW5kcG9pbnQtPmVwX2Rldi0+ZGV2LmtvYmosIG5hbWUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3JfbGluazsKIGV4aXQ6Ci0JcmV0dXJuOworCXJldHVybiByZXR2YWw7CisKK2Vycm9yX2xpbms6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZlcF9kZXYtPmRldi5rb2JqLCAmZXBfZGV2X2F0dHJfZ3JwKTsKKworZXJyb3JfZ3JvdXA6CisJZGV2aWNlX3VucmVnaXN0ZXIoJmVwX2Rldi0+ZGV2KTsKKwllbmRwb2ludC0+ZXBfZGV2ID0gTlVMTDsKKwlkZXN0cm95X2VuZHBvaW50X2NsYXNzKCk7CisJcmV0dXJuIHJldHZhbDsKIGVycm9yOgogCWtmcmVlKGVwX2Rldik7Ci0JcmV0dXJuOworCWRlc3Ryb3lfZW5kcG9pbnRfY2xhc3MoKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiB2b2lkIHVzYl9yZW1vdmVfZXBfZmlsZXMoc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplbmRwb2ludCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZmlsZS5jIGIvZHJpdmVycy91c2IvY29yZS9maWxlLmMKaW5kZXggOGRlNGY4Yy4uYzM3NmM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9maWxlLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9maWxlLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2JfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVzYl9mb3BzID0gewogCS5vd25lciA9CVRISVNfTU9EVUxFLAogCS5vcGVuID0JCXVzYl9vcGVuLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZ2VuZXJpYy5jIGIvZHJpdmVycy91c2IvY29yZS9nZW5lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzMzJjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvZ2VuZXJpYy5jCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogZHJpdmVycy91c2IvZ2VuZXJpYy5jIC0gZ2VuZXJpYyBkcml2ZXIgZm9yIFVTQiBkZXZpY2VzIChub3QgaW50ZXJmYWNlcykKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDUgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KKyAqCisgKiBiYXNlZCBvbiBkcml2ZXJzL3VzYi91c2IuYyB3aGljaCBoYWQgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHRzOgorICoJKEMpIENvcHlyaWdodCBMaW51cyBUb3J2YWxkcyAxOTk5CisgKgkoQykgQ29weXJpZ2h0IEpvaGFubmVzIEVyZGZlbHQgMTk5OS0yMDAxCisgKgkoQykgQ29weXJpZ2h0IEFuZHJlYXMgR2FsIDE5OTkKKyAqCShDKSBDb3B5cmlnaHQgR3JlZ29yeSBQLiBTbWl0aCAxOTk5CisgKgkoQykgQ29weXJpZ2h0IERldGkgRmxpZWdsIDE5OTkgKG5ldyBVU0IgYXJjaGl0ZWN0dXJlKQorICoJKEMpIENvcHlyaWdodCBSYW5keSBEdW5sYXAgMjAwMAorICoJKEMpIENvcHlyaWdodCBEYXZpZCBCcm93bmVsbCAyMDAwLTIwMDQKKyAqCShDKSBDb3B5cmlnaHQgWWdnZHJhc2lsIENvbXB1dGluZywgSW5jLiAyMDAwCisgKgkJKHVzYl9kZXZpY2VfaWQgbWF0Y2hpbmcgY2hhbmdlcyBieSBBZGFtIEouIFJpY2h0ZXIpCisgKgkoQykgQ29weXJpZ2h0IEdyZWcgS3JvYWgtSGFydG1hbiAyMDAyLTIwMDMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgInVzYi5oIgorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnBsdXJhbChpbnQgbikKK3sKKwlyZXR1cm4gKG4gPT0gMSA/ICIiIDogInMiKTsKK30KKworc3RhdGljIGludCBjaG9vc2VfY29uZmlndXJhdGlvbihzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3sKKwlpbnQgaTsKKwlpbnQgbnVtX2NvbmZpZ3M7CisJaW50IGluc3VmZmljaWVudF9wb3dlciA9IDA7CisJc3RydWN0IHVzYl9ob3N0X2NvbmZpZyAqYywgKmJlc3Q7CisKKwliZXN0ID0gTlVMTDsKKwljID0gdWRldi0+Y29uZmlnOworCW51bV9jb25maWdzID0gdWRldi0+ZGVzY3JpcHRvci5iTnVtQ29uZmlndXJhdGlvbnM7CisJZm9yIChpID0gMDsgaSA8IG51bV9jb25maWdzOyAoaSsrLCBjKyspKSB7CisJCXN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IJKmRlc2MgPSBOVUxMOworCisJCS8qIEl0J3MgcG9zc2libGUgdGhhdCBhIGNvbmZpZyBoYXMgbm8gaW50ZXJmYWNlcyEgKi8KKwkJaWYgKGMtPmRlc2MuYk51bUludGVyZmFjZXMgPiAwKQorCQkJZGVzYyA9ICZjLT5pbnRmX2NhY2hlWzBdLT5hbHRzZXR0aW5nLT5kZXNjOworCisJCS8qCisJCSAqIEhQJ3MgVVNCIGJ1cy1wb3dlcmVkIGtleWJvYXJkIGhhcyBvbmx5IG9uZSBjb25maWd1cmF0aW9uCisJCSAqIGFuZCBpdCBjbGFpbXMgdG8gYmUgc2VsZi1wb3dlcmVkOyBvdGhlciBkZXZpY2VzIG1heSBoYXZlCisJCSAqIHNpbWlsYXIgZXJyb3JzIGluIHRoZWlyIGRlc2NyaXB0b3JzLiAgSWYgdGhlIG5leHQgdGVzdAorCQkgKiB3ZXJlIGFsbG93ZWQgdG8gZXhlY3V0ZSwgc3VjaCBjb25maWd1cmF0aW9ucyB3b3VsZCBhbHdheXMKKwkJICogYmUgcmVqZWN0ZWQgYW5kIHRoZSBkZXZpY2VzIHdvdWxkIG5vdCB3b3JrIGFzIGV4cGVjdGVkLgorCQkgKiBJbiB0aGUgbWVhbnRpbWUsIHdlIHJ1biB0aGUgcmlzayBvZiBzZWxlY3RpbmcgYSBjb25maWcKKwkJICogdGhhdCByZXF1aXJlcyBleHRlcm5hbCBwb3dlciBhdCBhIHRpbWUgd2hlbiB0aGF0IHBvd2VyCisJCSAqIGlzbid0IGF2YWlsYWJsZS4gIEl0IHNlZW1zIHRvIGJlIHRoZSBsZXNzZXIgb2YgdHdvIGV2aWxzLgorCQkgKgorCQkgKiBCdWd6aWxsYSAjNjQ0OCByZXBvcnRzIGEgZGV2aWNlIHRoYXQgYXBwZWFycyB0byBjcmFzaAorCQkgKiB3aGVuIGl0IHJlY2VpdmVzIGEgR0VUX0RFVklDRV9TVEFUVVMgcmVxdWVzdCEgIFdlIGRvbid0CisJCSAqIGhhdmUgYW55IG90aGVyIHdheSB0byB0ZWxsIHdoZXRoZXIgYSBkZXZpY2UgaXMgc2VsZi1wb3dlcmVkLAorCQkgKiBidXQgc2luY2Ugd2UgZG9uJ3QgdXNlIHRoYXQgaW5mb3JtYXRpb24gYW55d2hlcmUgYnV0IGhlcmUsCisJCSAqIHRoZSBjYWxsIGhhcyBiZWVuIHJlbW92ZWQuCisJCSAqCisJCSAqIE1heWJlIHRoZSBHRVRfREVWSUNFX1NUQVRVUyBjYWxsIGFuZCB0aGUgdGVzdCBiZWxvdyBjYW4KKwkJICogYmUgcmVpbnN0YXRlZCB3aGVuIGRldmljZSBmaXJtd2FyZXMgYmVjb21lIG1vcmUgcmVsaWFibGUuCisJCSAqIERvbid0IGhvbGQgeW91ciBicmVhdGguCisJCSAqLworI2lmIDAKKwkJLyogUnVsZSBvdXQgc2VsZi1wb3dlcmVkIGNvbmZpZ3MgZm9yIGEgYnVzLXBvd2VyZWQgZGV2aWNlICovCisJCWlmIChidXNfcG93ZXJlZCAmJiAoYy0+ZGVzYy5ibUF0dHJpYnV0ZXMgJgorCQkJCQlVU0JfQ09ORklHX0FUVF9TRUxGUE9XRVIpKQorCQkJY29udGludWU7CisjZW5kaWYKKworCQkvKgorCQkgKiBUaGUgbmV4dCB0ZXN0IG1heSBub3QgYmUgYXMgZWZmZWN0aXZlIGFzIGl0IHNob3VsZCBiZS4KKwkJICogU29tZSBodWJzIGhhdmUgZXJyb3JzIGluIHRoZWlyIGRlc2NyaXB0b3IsIGNsYWltaW5nCisJCSAqIHRvIGJlIHNlbGYtcG93ZXJlZCB3aGVuIHRoZXkgYXJlIHJlYWxseSBidXMtcG93ZXJlZC4KKwkJICogV2Ugd2lsbCBvdmVyZXN0aW1hdGUgdGhlIGFtb3VudCBvZiBjdXJyZW50IHN1Y2ggaHVicworCQkgKiBtYWtlIGF2YWlsYWJsZSBmb3IgZWFjaCBwb3J0LgorCQkgKgorCQkgKiBUaGlzIGlzIGEgZmFpcmx5IGJlbmlnbiBzb3J0IG9mIGZhaWx1cmUuICBJdCB3b24ndAorCQkgKiBjYXVzZSB1cyB0byByZWplY3QgY29uZmlndXJhdGlvbnMgdGhhdCB3ZSBzaG91bGQgaGF2ZQorCQkgKiBhY2NlcHRlZC4KKwkJICovCisKKwkJLyogUnVsZSBvdXQgY29uZmlncyB0aGF0IGRyYXcgdG9vIG11Y2ggYnVzIGN1cnJlbnQgKi8KKwkJaWYgKGMtPmRlc2MuYk1heFBvd2VyICogMiA+IHVkZXYtPmJ1c19tQSkgeworCQkJaW5zdWZmaWNpZW50X3Bvd2VyKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIElmIHRoZSBmaXJzdCBjb25maWcncyBmaXJzdCBpbnRlcmZhY2UgaXMgQ09NTS8yLzB4ZmYKKwkJICogKE1TRlQgUk5ESVMpLCBydWxlIGl0IG91dCB1bmxlc3MgTGludXggaGFzIGhvc3Qtc2lkZQorCQkgKiBSTkRJUyBzdXBwb3J0LiAqLworCQlpZiAoaSA9PSAwICYmIGRlc2MKKwkJCQkmJiBkZXNjLT5iSW50ZXJmYWNlQ2xhc3MgPT0gVVNCX0NMQVNTX0NPTU0KKwkJCQkmJiBkZXNjLT5iSW50ZXJmYWNlU3ViQ2xhc3MgPT0gMgorCQkJCSYmIGRlc2MtPmJJbnRlcmZhY2VQcm90b2NvbCA9PSAweGZmKSB7CisjaWZuZGVmIENPTkZJR19VU0JfTkVUX1JORElTX0hPU1QKKwkJCWNvbnRpbnVlOworI2Vsc2UKKwkJCWJlc3QgPSBjOworI2VuZGlmCisJCX0KKworCQkvKiBGcm9tIHRoZSByZW1haW5pbmcgY29uZmlncywgY2hvb3NlIHRoZSBmaXJzdCBvbmUgd2hvc2UKKwkJICogZmlyc3QgaW50ZXJmYWNlIGlzIGZvciBhIG5vbi12ZW5kb3Itc3BlY2lmaWMgY2xhc3MuCisJCSAqIFJlYXNvbjogTGludXggaXMgbW9yZSBsaWtlbHkgdG8gaGF2ZSBhIGNsYXNzIGRyaXZlcgorCQkgKiB0aGFuIGEgdmVuZG9yLXNwZWNpZmljIGRyaXZlci4gKi8KKwkJZWxzZSBpZiAodWRldi0+ZGVzY3JpcHRvci5iRGV2aWNlQ2xhc3MgIT0KKwkJCQkJCVVTQl9DTEFTU19WRU5ET1JfU1BFQyAmJgorCQkJCSghZGVzYyB8fCBkZXNjLT5iSW50ZXJmYWNlQ2xhc3MgIT0KKwkJCQkJCVVTQl9DTEFTU19WRU5ET1JfU1BFQykpIHsKKwkJCWJlc3QgPSBjOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBJZiBhbGwgdGhlIHJlbWFpbmluZyBjb25maWdzIGFyZSB2ZW5kb3Itc3BlY2lmaWMsCisJCSAqIGNob29zZSB0aGUgZmlyc3Qgb25lLiAqLworCQllbHNlIGlmICghYmVzdCkKKwkJCWJlc3QgPSBjOworCX0KKworCWlmIChpbnN1ZmZpY2llbnRfcG93ZXIgPiAwKQorCQlkZXZfaW5mbygmdWRldi0+ZGV2LCAicmVqZWN0ZWQgJWQgY29uZmlndXJhdGlvbiVzICIKKwkJCSJkdWUgdG8gaW5zdWZmaWNpZW50IGF2YWlsYWJsZSBidXMgcG93ZXJcbiIsCisJCQlpbnN1ZmZpY2llbnRfcG93ZXIsIHBsdXJhbChpbnN1ZmZpY2llbnRfcG93ZXIpKTsKKworCWlmIChiZXN0KSB7CisJCWkgPSBiZXN0LT5kZXNjLmJDb25maWd1cmF0aW9uVmFsdWU7CisJCWRldl9pbmZvKCZ1ZGV2LT5kZXYsCisJCQkiY29uZmlndXJhdGlvbiAjJWQgY2hvc2VuIGZyb20gJWQgY2hvaWNlJXNcbiIsCisJCQlpLCBudW1fY29uZmlncywgcGx1cmFsKG51bV9jb25maWdzKSk7CisJfSBlbHNlIHsKKwkJaSA9IC0xOworCQlkZXZfd2FybigmdWRldi0+ZGV2LAorCQkJIm5vIGNvbmZpZ3VyYXRpb24gY2hvc2VuIGZyb20gJWQgY2hvaWNlJXNcbiIsCisJCQludW1fY29uZmlncywgcGx1cmFsKG51bV9jb25maWdzKSk7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGdlbmVyaWNfcHJvYmUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJaW50IGVyciwgYzsKKworCS8qIHB1dCBkZXZpY2Utc3BlY2lmaWMgZmlsZXMgaW50byBzeXNmcyAqLworCXVzYl9jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzKHVkZXYpOworCisJLyogQ2hvb3NlIGFuZCBzZXQgdGhlIGNvbmZpZ3VyYXRpb24uICBUaGlzIHJlZ2lzdGVycyB0aGUgaW50ZXJmYWNlcworCSAqIHdpdGggdGhlIGRyaXZlciBjb3JlIGFuZCBsZXRzIGludGVyZmFjZSBkcml2ZXJzIGJpbmQgdG8gdGhlbS4KKwkgKi8KKwljID0gY2hvb3NlX2NvbmZpZ3VyYXRpb24odWRldik7CisJaWYgKGMgPj0gMCkgeworCQllcnIgPSB1c2Jfc2V0X2NvbmZpZ3VyYXRpb24odWRldiwgYyk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJnVkZXYtPmRldiwgImNhbid0IHNldCBjb25maWcgIyVkLCBlcnJvciAlZFxuIiwKKwkJCQkJYywgZXJyKTsKKwkJCS8qIFRoaXMgbmVlZCBub3QgYmUgZmF0YWwuICBUaGUgdXNlciBjYW4gdHJ5IHRvCisJCQkgKiBzZXQgb3RoZXIgY29uZmlndXJhdGlvbnMuICovCisJCX0KKwl9CisKKwkvKiBVU0IgZGV2aWNlIHN0YXRlID09IGNvbmZpZ3VyZWQgLi4uIHVzYWJsZSAqLworCXVzYl9ub3RpZnlfYWRkX2RldmljZSh1ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZW5lcmljX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJdXNiX25vdGlmeV9yZW1vdmVfZGV2aWNlKHVkZXYpOworCisJLyogaWYgdGhpcyBpcyBvbmx5IGFuIHVuYmluZCwgbm90IGEgcGh5c2ljYWwgZGlzY29ubmVjdCwgdGhlbgorCSAqIHVuY29uZmlndXJlIHRoZSBkZXZpY2UgKi8KKwlpZiAodWRldi0+YWN0Y29uZmlnKQorCQl1c2Jfc2V0X2NvbmZpZ3VyYXRpb24odWRldiwgMCk7CisKKwl1c2JfcmVtb3ZlX3N5c2ZzX2Rldl9maWxlcyh1ZGV2KTsKK30KKworI2lmZGVmCUNPTkZJR19QTQorCitzdGF0aWMgaW50IGdlbmVyaWNfc3VzcGVuZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgcG1fbWVzc2FnZV90IG1zZykKK3sKKwkvKiBVU0IgZGV2aWNlcyBlbnRlciBTVVNQRU5EIHN0YXRlIHRocm91Z2ggdGhlaXIgaHVicywgYnV0IGNhbiBiZQorCSAqIG1hcmtlZCBmb3IgRlJFRVpFIGFzIHNvb24gYXMgdGhlaXIgY2hpbGRyZW4gYXJlIGFscmVhZHkgaWRsZWQuCisJICogQnV0IHRob3NlIHNlbWFudGljcyBhcmUgdXNlbGVzcywgc28gd2UgZXF1YXRlIHRoZSB0d28gKHNpZ2gpLgorCSAqLworCXJldHVybiB1c2JfcG9ydF9zdXNwZW5kKHVkZXYpOworfQorCitzdGF0aWMgaW50IGdlbmVyaWNfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoreworCXJldHVybiB1c2JfcG9ydF9yZXN1bWUodWRldik7Cit9CisKKyNlbmRpZgkvKiBDT05GSUdfUE0gKi8KKworc3RydWN0IHVzYl9kZXZpY2VfZHJpdmVyIHVzYl9nZW5lcmljX2RyaXZlciA9IHsKKwkubmFtZSA9CSJ1c2IiLAorCS5wcm9iZSA9IGdlbmVyaWNfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBnZW5lcmljX2Rpc2Nvbm5lY3QsCisjaWZkZWYJQ09ORklHX1BNCisJLnN1c3BlbmQgPSBnZW5lcmljX3N1c3BlbmQsCisJLnJlc3VtZSA9IGdlbmVyaWNfcmVzdW1lLAorI2VuZGlmCisJLnN1cHBvcnRzX2F1dG9zdXNwZW5kID0gMSwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2hjZC1wY2kuYyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLXBjaS5jCmluZGV4IDUwNzhmYjMuLmVkZjQzMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLXBjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaGNkLXBjaS5jCkBAIC0yODEsNyArMjgxLDcgQEAKIAkJCSh2b2lkKSB1c2JfaGNkX3BjaV9yZXN1bWUgKGRldik7CiAJCX0KIAotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChoY2QtPnN0YXRlICE9IEhDX1NUQVRFX0hBTFQpIHsKIAkJZGV2X2RiZyAoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJoY2Qgc3RhdGUgJWQ7IG5vdCBzdXNwZW5kZWRcbiIsCiAJCQloY2QtPnN0YXRlKTsKIAkJV0FSTl9PTigxKTsKQEAgLTQxMyw0ICs0MTMsMjAgQEAKIAogI2VuZGlmCS8qIENPTkZJR19QTSAqLwogCisvKioKKyAqIHVzYl9oY2RfcGNpX3NodXRkb3duIC0gc2h1dGRvd24gaG9zdCBjb250cm9sbGVyCisgKiBAZGV2OiBVU0IgSG9zdCBDb250cm9sbGVyIGJlaW5nIHNodXRkb3duCisgKi8KK3ZvaWQgdXNiX2hjZF9wY2lfc2h1dGRvd24gKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHVzYl9oY2QJCSpoY2Q7CisKKwloY2QgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwlpZiAoIWhjZCkKKwkJcmV0dXJuOworCisJaWYgKGhjZC0+ZHJpdmVyLT5zaHV0ZG93bikKKwkJaGNkLT5kcml2ZXItPnNodXRkb3duKGhjZCk7Cit9CitFWFBPUlRfU1lNQk9MICh1c2JfaGNkX3BjaV9zaHV0ZG93bik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5jCmluZGV4IGZiNGQwNTguLmU4NmY2MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9oY2QuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogCkBAIC02MzIsMzEgKzYzMywyMCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKiBBc3luY2hyb25vdXMgdW5saW5rcyBvZiByb290LWh1YiBjb250cm9sIFVSQnMgYXJlIGxlZ2FsLCBidXQgdGhleQotICogZG9uJ3QgZG8gYW55dGhpbmcuICBTdGF0dXMgVVJCIHVubGlua3MgbXVzdCBiZSBtYWRlIGluIHByb2Nlc3MgY29udGV4dAotICogd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuCisvKiBVbmxpbmtzIG9mIHJvb3QtaHViIGNvbnRyb2wgVVJCcyBhcmUgbGVnYWwsIGJ1dCB0aGV5IGRvbid0IGRvIGFueXRoaW5nCisgKiBzaW5jZSB0aGVzZSBVUkJzIGFsd2F5cyBleGVjdXRlIHN5bmNocm9ub3VzbHkuCiAgKi8KIHN0YXRpYyBpbnQgdXNiX3JoX3VyYl9kZXF1ZXVlIChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIpCiB7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwogCWlmICh1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSkgPT0gMCkgewkvKiBDb250cm9sIFVSQiAqLwotCQlpZiAoaW5faW50ZXJydXB0KCkpCi0JCQlyZXR1cm4gMDsJCS8qIG5vdGhpbmcgdG8gZG8gKi8KLQotCQlzcGluX2xvY2tfaXJxKCZ1cmItPmxvY2spOwkvKiBmcm9tIHVzYl9raWxsX3VyYiAqLwotCQkrK3VyYi0+cmVqZWN0OwotCQlzcGluX3VubG9ja19pcnEoJnVyYi0+bG9jayk7Ci0KLQkJd2FpdF9ldmVudCh1c2Jfa2lsbF91cmJfcXVldWUsCi0JCQkJYXRvbWljX3JlYWQoJnVyYi0+dXNlX2NvdW50KSA9PSAwKTsKLQotCQlzcGluX2xvY2tfaXJxKCZ1cmItPmxvY2spOwotCQktLXVyYi0+cmVqZWN0OwotCQlzcGluX3VubG9ja19pcnEoJnVyYi0+bG9jayk7CisJCTsJLyogRG8gbm90aGluZyAqLwogCiAJfSBlbHNlIHsJCQkJLyogU3RhdHVzIFVSQiAqLwogCQlpZiAoIWhjZC0+dXNlc19uZXdfcG9sbGluZykKLQkJCWRlbF90aW1lcl9zeW5jICgmaGNkLT5yaF90aW1lcik7Ci0JCWxvY2FsX2lycV9kaXNhYmxlICgpOworCQkJZGVsX3RpbWVyICgmaGNkLT5yaF90aW1lcik7CisJCWxvY2FsX2lycV9zYXZlIChmbGFncyk7CiAJCXNwaW5fbG9jayAoJmhjZF9yb290X2h1Yl9sb2NrKTsKIAkJaWYgKHVyYiA9PSBoY2QtPnN0YXR1c191cmIpIHsKIAkJCWhjZC0+c3RhdHVzX3VyYiA9IE5VTEw7CkBAIC02NjYsNyArNjU2LDcgQEAKIAkJc3Bpbl91bmxvY2sgKCZoY2Rfcm9vdF9odWJfbG9jayk7CiAJCWlmICh1cmIpCiAJCQl1c2JfaGNkX2dpdmViYWNrX3VyYiAoaGNkLCB1cmIsIE5VTEwpOwotCQlsb2NhbF9pcnFfZW5hYmxlICgpOworCQlsb2NhbF9pcnFfcmVzdG9yZSAoZmxhZ3MpOwogCX0KIAogCXJldHVybiAwOwpAQCAtNjc0LDMxICs2NjQsNiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKiBleHBvcnRlZCBvbmx5IHdpdGhpbiB1c2Jjb3JlICovCi1zdHJ1Y3QgdXNiX2J1cyAqdXNiX2J1c19nZXQoc3RydWN0IHVzYl9idXMgKmJ1cykKLXsKLQlpZiAoYnVzKQotCQlrcmVmX2dldCgmYnVzLT5rcmVmKTsKLQlyZXR1cm4gYnVzOwotfQotCi1zdGF0aWMgdm9pZCB1c2JfaG9zdF9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQotewotCXN0cnVjdCB1c2JfYnVzICpidXMgPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHVzYl9idXMsIGtyZWYpOwotCi0JaWYgKGJ1cy0+cmVsZWFzZSkKLQkJYnVzLT5yZWxlYXNlKGJ1cyk7Ci19Ci0KLS8qIGV4cG9ydGVkIG9ubHkgd2l0aGluIHVzYmNvcmUgKi8KLXZvaWQgdXNiX2J1c19wdXQoc3RydWN0IHVzYl9idXMgKmJ1cykKLXsKLQlpZiAoYnVzKQotCQlrcmVmX3B1dCgmYnVzLT5rcmVmLCB1c2JfaG9zdF9yZWxlYXNlKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogc3RhdGljIHN0cnVjdCBjbGFzcyAqdXNiX2hvc3RfY2xhc3M7CiAKIGludCB1c2JfaG9zdF9pbml0KHZvaWQpCkBAIC03MzAsMzkgKzY5NSwxMiBAQAogCWJ1cy0+ZGV2bnVtX25leHQgPSAxOwogCiAJYnVzLT5yb290X2h1YiA9IE5VTEw7Ci0JYnVzLT5oY3ByaXYgPSBOVUxMOwogCWJ1cy0+YnVzbnVtID0gLTE7CiAJYnVzLT5iYW5kd2lkdGhfYWxsb2NhdGVkID0gMDsKIAlidXMtPmJhbmR3aWR0aF9pbnRfcmVxcyAgPSAwOwogCWJ1cy0+YmFuZHdpZHRoX2lzb2NfcmVxcyA9IDA7CiAKIAlJTklUX0xJU1RfSEVBRCAoJmJ1cy0+YnVzX2xpc3QpOwotCi0Ja3JlZl9pbml0KCZidXMtPmtyZWYpOwotfQotCi0vKioKLSAqIHVzYl9hbGxvY19idXMgLSBjcmVhdGVzIGEgbmV3IFVTQiBob3N0IGNvbnRyb2xsZXIgc3RydWN0dXJlCi0gKiBAb3A6IHBvaW50ZXIgdG8gYSBzdHJ1Y3QgdXNiX29wZXJhdGlvbnMgdGhhdCB0aGlzIGJ1cyBzdHJ1Y3R1cmUgc2hvdWxkIHVzZQotICogQ29udGV4dDogIWluX2ludGVycnVwdCgpCi0gKgotICogQ3JlYXRlcyBhIFVTQiBob3N0IGNvbnRyb2xsZXIgYnVzIHN0cnVjdHVyZSB3aXRoIHRoZSBzcGVjaWZpZWQgCi0gKiB1c2Jfb3BlcmF0aW9ucyBhbmQgaW5pdGlhbGl6ZXMgYWxsIHRoZSBuZWNlc3NhcnkgaW50ZXJuYWwgb2JqZWN0cy4KLSAqCi0gKiBJZiBubyBtZW1vcnkgaXMgYXZhaWxhYmxlLCBOVUxMIGlzIHJldHVybmVkLgotICoKLSAqIFRoZSBjYWxsZXIgc2hvdWxkIGNhbGwgdXNiX3B1dF9idXMoKSB3aGVuIGl0IGlzIGZpbmlzaGVkIHdpdGggdGhlIHN0cnVjdHVyZS4KLSAqLwotc3RydWN0IHVzYl9idXMgKnVzYl9hbGxvY19idXMgKHN0cnVjdCB1c2Jfb3BlcmF0aW9ucyAqb3ApCi17Ci0Jc3RydWN0IHVzYl9idXMgKmJ1czsKLQotCWJ1cyA9IGt6YWxsb2MgKHNpemVvZiAqYnVzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1cykKLQkJcmV0dXJuIE5VTEw7Ci0JdXNiX2J1c19pbml0IChidXMpOwotCWJ1cy0+b3AgPSBvcDsKLQlyZXR1cm4gYnVzOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMTExMiwxMCArMTA1MCwxMCBAQAogICogZXhwZWN0cyB1c2Jfc3VibWl0X3VyYigpIHRvIGhhdmUgc2FuaXR5IGNoZWNrZWQgYW5kIGNvbmRpdGlvbmVkIGFsbAogICogaW5wdXRzIGluIHRoZSB1cmIKICAqLwotc3RhdGljIGludCBoY2Rfc3VibWl0X3VyYiAoc3RydWN0IHVyYiAqdXJiLCBnZnBfdCBtZW1fZmxhZ3MpCitpbnQgdXNiX2hjZF9zdWJtaXRfdXJiIChzdHJ1Y3QgdXJiICp1cmIsIGdmcF90IG1lbV9mbGFncykKIHsKIAlpbnQJCQlzdGF0dXM7Ci0Jc3RydWN0IHVzYl9oY2QJCSpoY2QgPSB1cmItPmRldi0+YnVzLT5oY3ByaXY7CisJc3RydWN0IHVzYl9oY2QJCSpoY2QgPSBidXNfdG9faGNkKHVyYi0+ZGV2LT5idXMpOwogCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXA7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAKQEAgLTExODYsNyArMTEyNCw3IEBACiAJLyogbG93ZXIgbGV2ZWwgaGNkIGNvZGUgc2hvdWxkIHVzZSAqX2RtYSBleGNsdXNpdmVseSwKIAkgKiB1bmxlc3MgaXQgdXNlcyBwaW8gb3IgdGFsa3MgdG8gYW5vdGhlciB0cmFuc3BvcnQuCiAJICovCi0JaWYgKGhjZC0+c2VsZi5jb250cm9sbGVyLT5kbWFfbWFzaykgeworCWlmIChoY2QtPnNlbGYudXNlc19kbWEpIHsKIAkJaWYgKHVzYl9waXBlY29udHJvbCAodXJiLT5waXBlKQogCQkJJiYgISh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX05PX1NFVFVQX0RNQV9NQVApKQogCQkJdXJiLT5zZXR1cF9kbWEgPSBkbWFfbWFwX3NpbmdsZSAoCkBAIC0xMjIxLDkgKzExNTksMTAgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qIGNhbGxlZCBpbiBhbnkgY29udGV4dCAqLwotc3RhdGljIGludCBoY2RfZ2V0X2ZyYW1lX251bWJlciAoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitpbnQgdXNiX2hjZF9nZXRfZnJhbWVfbnVtYmVyIChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKLQlzdHJ1Y3QgdXNiX2hjZAkqaGNkID0gKHN0cnVjdCB1c2JfaGNkICopdWRldi0+YnVzLT5oY3ByaXY7CisJc3RydWN0IHVzYl9oY2QJKmhjZCA9IGJ1c190b19oY2QodWRldi0+YnVzKTsKKwogCWlmICghSENfSVNfUlVOTklORyAoaGNkLT5zdGF0ZSkpCiAJCXJldHVybiAtRVNIVVRET1dOOwogCXJldHVybiBoY2QtPmRyaXZlci0+Z2V0X2ZyYW1lX251bWJlciAoaGNkKTsKQEAgLTEyNjMsNyArMTIwMiw3IEBACiAgKiBjYWxsZXIgZ3VhcmFudGVlcyB1cmIgd29uJ3QgYmUgcmVjeWNsZWQgdGlsbCBib3RoIHVubGluaygpCiAgKiBhbmQgdGhlIHVyYidzIGNvbXBsZXRpb24gZnVuY3Rpb24gcmV0dXJuCiAgKi8KLXN0YXRpYyBpbnQgaGNkX3VubGlua191cmIgKHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKK2ludCB1c2JfaGNkX3VubGlua191cmIgKHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKIHsKIAlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQJKmVwOwogCXN0cnVjdCB1c2JfaGNkCQkJKmhjZCA9IE5VTEw7CkBAIC0xMjk2LDcgKzEyMzUsNyBAQAogCXNwaW5fbG9jayAoJmhjZF9kYXRhX2xvY2spOwogCiAJc3lzID0gJnVyYi0+ZGV2LT5kZXY7Ci0JaGNkID0gdXJiLT5kZXYtPmJ1cy0+aGNwcml2OworCWhjZCA9IGJ1c190b19oY2QodXJiLT5kZXYtPmJ1cyk7CiAJaWYgKGhjZCA9PSBOVUxMKSB7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZG9uZTsKQEAgLTEzNTQsNDEgKzEyOTMsMzMgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qIGRpc2FibGVzIHRoZSBlbmRwb2ludDogY2FuY2VscyBhbnkgcGVuZGluZyB1cmJzLCB0aGVuIHN5bmNocm9uaXplcyB3aXRoCi0gKiB0aGUgaGNkIHRvIG1ha2Ugc3VyZSBhbGwgZW5kcG9pbnQgc3RhdGUgaXMgZ29uZSBmcm9tIGhhcmR3YXJlLiB1c2UgZm9yCisgKiB0aGUgaGNkIHRvIG1ha2Ugc3VyZSBhbGwgZW5kcG9pbnQgc3RhdGUgaXMgZ29uZSBmcm9tIGhhcmR3YXJlLCBhbmQgdGhlbgorICogd2FpdHMgdW50aWwgdGhlIGVuZHBvaW50J3MgcXVldWUgaXMgY29tcGxldGVseSBkcmFpbmVkLiB1c2UgZm9yCiAgKiBzZXRfY29uZmlndXJhdGlvbiwgc2V0X2ludGVyZmFjZSwgZHJpdmVyIHJlbW92YWwsIHBoeXNpY2FsIGRpc2Nvbm5lY3QuCiAgKgogICogZXhhbXBsZTogIGEgcWggc3RvcmVkIGluIGVwLT5oY3ByaXYsIGhvbGRpbmcgc3RhdGUgcmVsYXRlZCB0byBlbmRwb2ludAogICogdHlwZSwgbWF4cGFja2V0IHNpemUsIHRvZ2dsZSwgaGFsdCBzdGF0dXMsIGFuZCBzY2hlZHVsaW5nLgogICovCi1zdGF0aWMgdm9pZAotaGNkX2VuZHBvaW50X2Rpc2FibGUgKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwKQordm9pZCB1c2JfaGNkX2VuZHBvaW50X2Rpc2FibGUgKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAorCQlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwKQogewogCXN0cnVjdCB1c2JfaGNkCQkqaGNkOwogCXN0cnVjdCB1cmIJCSp1cmI7CiAKLQloY2QgPSB1ZGV2LT5idXMtPmhjcHJpdjsKKwloY2QgPSBidXNfdG9faGNkKHVkZXYtPmJ1cyk7CiAKIAlXQVJOX09OICghSENfSVNfUlVOTklORyAoaGNkLT5zdGF0ZSkgJiYgaGNkLT5zdGF0ZSAhPSBIQ19TVEFURV9IQUxUICYmCiAJCQl1ZGV2LT5zdGF0ZSAhPSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpOwogCiAJbG9jYWxfaXJxX2Rpc2FibGUgKCk7CiAKLQkvKiBGSVhNRSBtb3ZlIG1vc3Qgb2YgdGhpcyBpbnRvIG1lc3NhZ2UuYyBhcyBwYXJ0IG9mIGl0cwotCSAqIGVuZHBvaW50IGRpc2FibGUgbG9naWMKLQkgKi8KLQogCS8qIGVwIGlzIGFscmVhZHkgZ29uZSBmcm9tIHVkZXYtPmVwX3tpbixvdXR9W107IG5vIG1vcmUgc3VibWl0cyAqLwogcmVzY2FuOgogCXNwaW5fbG9jayAoJmhjZF9kYXRhX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkgKHVyYiwgJmVwLT51cmJfbGlzdCwgdXJiX2xpc3QpIHsKIAkJaW50CXRtcDsKIAotCQkvKiBhbm90aGVyIGNwdSBtYXkgYmUgaW4gaGNkLCBzcGlubmluZyBvbiBoY2RfZGF0YV9sb2NrCi0JCSAqIHRvIGdpdmViYWNrKCkgdGhpcyB1cmIuICB0aGUgcmFjZXMgaGVyZSBzaG91bGQgYmUKLQkJICogc21hbGwsIGJ1dCBhIGZ1bGwgZml4IG5lZWRzIGEgbmV3ICJjYW4ndCBzdWJtaXQiCi0JCSAqIHVyYiBzdGF0ZS4KLQkJICogRklYTUUgdXJiLT5yZWplY3Qgc2hvdWxkIGFsbG93IHRoYXQuLi4KLQkJICovCisJCS8qIHRoZSB1cmIgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIHVubGlua2VkICovCiAJCWlmICh1cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpCiAJCQljb250aW51ZTsKIAkJdXNiX2dldF91cmIgKHVyYik7CkBAIC0xNDMwLDYgKzEzNjEsMzAgQEAKIAltaWdodF9zbGVlcCAoKTsKIAlpZiAoaGNkLT5kcml2ZXItPmVuZHBvaW50X2Rpc2FibGUpCiAJCWhjZC0+ZHJpdmVyLT5lbmRwb2ludF9kaXNhYmxlIChoY2QsIGVwKTsKKworCS8qIFdhaXQgdW50aWwgdGhlIGVuZHBvaW50IHF1ZXVlIGlzIGNvbXBsZXRlbHkgZW1wdHkuICBNb3N0IEhDRHMKKwkgKiB3aWxsIGhhdmUgZG9uZSB0aGlzIGFscmVhZHkgaW4gdGhlaXIgZW5kcG9pbnRfZGlzYWJsZSBtZXRob2QsCisJICogYnV0IHNvbWUgbWlnaHQgbm90LiAgQW5kIHRoZXJlIGNvdWxkIGJlIHJvb3QtaHViIGNvbnRyb2wgVVJCcworCSAqIHN0aWxsIHBlbmRpbmcgc2luY2UgdGhleSBhcmVuJ3QgYWZmZWN0ZWQgYnkgdGhlIEhDRHMnCisJICogZW5kcG9pbnRfZGlzYWJsZSBtZXRob2RzLgorCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSAoJmVwLT51cmJfbGlzdCkpIHsKKwkJc3Bpbl9sb2NrX2lycSAoJmhjZF9kYXRhX2xvY2spOworCisJCS8qIFRoZSBsaXN0IG1heSBoYXZlIGNoYW5nZWQgd2hpbGUgd2UgYWNxdWlyZWQgdGhlIHNwaW5sb2NrICovCisJCXVyYiA9IE5VTEw7CisJCWlmICghbGlzdF9lbXB0eSAoJmVwLT51cmJfbGlzdCkpIHsKKwkJCXVyYiA9IGxpc3RfZW50cnkgKGVwLT51cmJfbGlzdC5wcmV2LCBzdHJ1Y3QgdXJiLAorCQkJCQl1cmJfbGlzdCk7CisJCQl1c2JfZ2V0X3VyYiAodXJiKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnEgKCZoY2RfZGF0YV9sb2NrKTsKKworCQlpZiAodXJiKSB7CisJCQl1c2Jfa2lsbF91cmIgKHVyYik7CisJCQl1c2JfcHV0X3VyYiAodXJiKTsKKwkJfQorCX0KIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTE0NzYsNTAgKzE0MzEsNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLS8qCi0gKiB1c2JfaGNkX3N1c3BlbmRfcm9vdF9odWIgLSBIQ0QgYXV0b3N1c3BlbmRzIGRvd25zdHJlYW0gcG9ydHMKLSAqIEBoY2Q6IGhvc3QgY29udHJvbGxlciBmb3IgdGhpcyByb290IGh1YgotICoKLSAqIFRoaXMgY2FsbCBhcnJhbmdlcyB0aGF0IHVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKCkgaXMgc2FmZSB0byBjYWxsIGxhdGVyOwotICogdGhhdCB0aGUgSENEJ3Mgcm9vdCBodWIgcG9sbGluZyBpcyBkZWFjdGl2YXRlZDsgYW5kIHRoYXQgdGhlIHJvb3QncyBodWIKLSAqIGRyaXZlciBpcyBzdXNwZW5kZWQuICBIQ0RzIG1heSBjYWxsIHRoaXMgdG8gYXV0b3N1c3BlbmQgd2hlbiB0aGVpciByb290Ci0gKiBodWIncyBkb3duc3RyZWFtIHBvcnRzIGFyZSBhbGwgaW5hY3RpdmU6ICB1bnBvd2VyZWQsIGRpc2Nvbm5lY3RlZCwKLSAqIGRpc2FibGVkLCBvciBzdXNwZW5kZWQuCi0gKgotICogVGhlIEhDRCB3aWxsIGF1dG9yZXN1bWUgb24gZGV2aWNlIGNvbm5lY3QgY2hhbmdlIGRldGVjdGlvbiAodXNpbmcgU1JQCi0gKiBvciBhIEQrL0QtIHB1bGx1cCkuICBUaGUgSENEIGFsc28gYXV0b3Jlc3VtZXMgb24gcmVtb3RlIHdha2V1cCBzaWduYWxpbmcKLSAqIGZyb20gYW55IHBvcnRzIHRoYXQgYXJlIHN1c3BlbmRlZCAoaWYgdGhhdCBpcyBlbmFibGVkKS4gIEluIG1vc3QgY2FzZXMsCi0gKiBvdmVyY3VycmVudCBzaWduYWxpbmcgKG9uIHBvd2VyZWQgcG9ydHMpIHdpbGwgYWxzbyBzdGFydCBhdXRvcmVzdW1lLgotICoKLSAqIEFsd2F5cyBjYWxsZWQgd2l0aCBJUlFzIGJsb2NrZWQuCi0gKi8KLXZvaWQgdXNiX2hjZF9zdXNwZW5kX3Jvb3RfaHViIChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQotewotCXN0cnVjdCB1cmIJKnVyYjsKLQotCXNwaW5fbG9jayAoJmhjZF9yb290X2h1Yl9sb2NrKTsKLQl1c2Jfc3VzcGVuZF9yb290X2h1YiAoaGNkLT5zZWxmLnJvb3RfaHViKTsKLQotCS8qIGZvcmNlIHN0YXR1cyB1cmIgdG8gY29tcGxldGUvdW5saW5rIHdoaWxlIHN1c3BlbmRlZCAqLwotCWlmIChoY2QtPnN0YXR1c191cmIpIHsKLQkJdXJiID0gaGNkLT5zdGF0dXNfdXJiOwotCQl1cmItPnN0YXR1cyA9IC1FQ09OTlJFU0VUOwotCQl1cmItPmhjcHJpdiA9IE5VTEw7Ci0JCXVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7Ci0KLQkJZGVsX3RpbWVyICgmaGNkLT5yaF90aW1lcik7Ci0JCWhjZC0+cG9sbF9wZW5kaW5nID0gMDsKLQkJaGNkLT5zdGF0dXNfdXJiID0gTlVMTDsKLQl9IGVsc2UKLQkJdXJiID0gTlVMTDsKLQlzcGluX3VubG9jayAoJmhjZF9yb290X2h1Yl9sb2NrKTsKLQloY2QtPnN0YXRlID0gSENfU1RBVEVfU1VTUEVOREVEOwotCi0JaWYgKHVyYikKLQkJdXNiX2hjZF9naXZlYmFja191cmIgKGhjZCwgdXJiLCBOVUxMKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHVzYl9oY2Rfc3VzcGVuZF9yb290X2h1Yik7Ci0KIC8qKgogICogdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIgLSBjYWxsZWQgYnkgSENEIHRvIHJlc3VtZSBpdHMgcm9vdCBodWIgCiAgKiBAaGNkOiBob3N0IGNvbnRyb2xsZXIgZm9yIHRoaXMgcm9vdCBodWIKQEAgLTE1ODMsMjAgKzE0OTQsNiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0vKgotICogdXNiX2hjZF9vcGVyYXRpb25zIC0gYWRhcHRzIHVzYl9idXMgZnJhbWV3b3JrIHRvIEhDRCBmcmFtZXdvcmsgKGJ1cyBnbHVlKQotICovCi1zdGF0aWMgc3RydWN0IHVzYl9vcGVyYXRpb25zIHVzYl9oY2Rfb3BlcmF0aW9ucyA9IHsKLQkuZ2V0X2ZyYW1lX251bWJlciA9CWhjZF9nZXRfZnJhbWVfbnVtYmVyLAotCS5zdWJtaXRfdXJiID0JCWhjZF9zdWJtaXRfdXJiLAotCS51bmxpbmtfdXJiID0JCWhjZF91bmxpbmtfdXJiLAotCS5idWZmZXJfYWxsb2MgPQkJaGNkX2J1ZmZlcl9hbGxvYywKLQkuYnVmZmVyX2ZyZWUgPQkJaGNkX2J1ZmZlcl9mcmVlLAotCS5kaXNhYmxlID0JCWhjZF9lbmRwb2ludF9kaXNhYmxlLAotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQogLyoqCiAgKiB1c2JfaGNkX2dpdmViYWNrX3VyYiAtIHJldHVybiBVUkIgZnJvbSBIQ0QgdG8gZGV2aWNlIGRyaXZlcgogICogQGhjZDogaG9zdCBjb250cm9sbGVyIHJldHVybmluZyB0aGUgVVJCCkBAIC0xNjE3LDggKzE1MTQsOSBAQAogCWF0X3Jvb3RfaHViID0gKHVyYi0+ZGV2ID09IGhjZC0+c2VsZi5yb290X2h1Yik7CiAJdXJiX3VubGluayAodXJiKTsKIAotCS8qIGxvd2VyIGxldmVsIGhjZCBjb2RlIHNob3VsZCB1c2UgKl9kbWEgZXhjbHVzaXZlbHkgKi8KLQlpZiAoaGNkLT5zZWxmLmNvbnRyb2xsZXItPmRtYV9tYXNrICYmICFhdF9yb290X2h1YikgeworCS8qIGxvd2VyIGxldmVsIGhjZCBjb2RlIHNob3VsZCB1c2UgKl9kbWEgZXhjbHVzaXZlbHkgaWYgdGhlCisJICogaG9zdCBjb250cm9sbGVyIGRvZXMgRE1BICovCisJaWYgKGhjZC0+c2VsZi51c2VzX2RtYSAmJiAhYXRfcm9vdF9odWIpIHsKIAkJaWYgKHVzYl9waXBlY29udHJvbCAodXJiLT5waXBlKQogCQkJJiYgISh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX05PX1NFVFVQX0RNQV9NQVApKQogCQkJZG1hX3VubWFwX3NpbmdsZSAoaGNkLT5zZWxmLmNvbnRyb2xsZXIsIHVyYi0+c2V0dXBfZG1hLApAQCAtMTcwNCwxNCArMTYwMiw2IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyB2b2lkIGhjZF9yZWxlYXNlIChzdHJ1Y3QgdXNiX2J1cyAqYnVzKQotewotCXN0cnVjdCB1c2JfaGNkICpoY2Q7Ci0KLQloY2QgPSBjb250YWluZXJfb2YoYnVzLCBzdHJ1Y3QgdXNiX2hjZCwgc2VsZik7Ci0Ja2ZyZWUoaGNkKTsKLX0KLQogLyoqCiAgKiB1c2JfY3JlYXRlX2hjZCAtIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBIQ0Qgc3RydWN0dXJlCiAgKiBAZHJpdmVyOiBIQyBkcml2ZXIgdGhhdCB3aWxsIHVzZSB0aGlzIGhjZApAQCAtMTczNiwxMyArMTYyNiwxMiBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAJZGV2X3NldF9kcnZkYXRhKGRldiwgaGNkKTsKKwlrcmVmX2luaXQoJmhjZC0+a3JlZik7CiAKIAl1c2JfYnVzX2luaXQoJmhjZC0+c2VsZik7Ci0JaGNkLT5zZWxmLm9wID0gJnVzYl9oY2Rfb3BlcmF0aW9uczsKLQloY2QtPnNlbGYuaGNwcml2ID0gaGNkOwotCWhjZC0+c2VsZi5yZWxlYXNlID0gJmhjZF9yZWxlYXNlOwogCWhjZC0+c2VsZi5jb250cm9sbGVyID0gZGV2OwogCWhjZC0+c2VsZi5idXNfbmFtZSA9IGJ1c19uYW1lOworCWhjZC0+c2VsZi51c2VzX2RtYSA9IChkZXYtPmRtYV9tYXNrICE9IE5VTEwpOwogCiAJaW5pdF90aW1lcigmaGNkLT5yaF90aW1lcik7CiAJaGNkLT5yaF90aW1lci5mdW5jdGlvbiA9IHJoX3RpbWVyX2Z1bmM7CkBAIC0xNzU2LDEwICsxNjQ1LDI1IEBACiB9CiBFWFBPUlRfU1lNQk9MICh1c2JfY3JlYXRlX2hjZCk7CiAKK3N0YXRpYyB2b2lkIGhjZF9yZWxlYXNlIChzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gY29udGFpbmVyX29mIChrcmVmLCBzdHJ1Y3QgdXNiX2hjZCwga3JlZik7CisKKwlrZnJlZShoY2QpOworfQorCitzdHJ1Y3QgdXNiX2hjZCAqdXNiX2dldF9oY2QgKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisJaWYgKGhjZCkKKwkJa3JlZl9nZXQgKCZoY2QtPmtyZWYpOworCXJldHVybiBoY2Q7Cit9CitFWFBPUlRfU1lNQk9MICh1c2JfZ2V0X2hjZCk7CisKIHZvaWQgdXNiX3B1dF9oY2QgKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7Ci0JZGV2X3NldF9kcnZkYXRhKGhjZC0+c2VsZi5jb250cm9sbGVyLCBOVUxMKTsKLQl1c2JfYnVzX3B1dCgmaGNkLT5zZWxmKTsKKwlpZiAoaGNkKQorCQlrcmVmX3B1dCAoJmhjZC0+a3JlZiwgaGNkX3JlbGVhc2UpOwogfQogRVhQT1JUX1NZTUJPTCAodXNiX3B1dF9oY2QpOwogCkBAIC0xOTE1LDYgKzE4MTksMTYgQEAKIH0KIEVYUE9SVF9TWU1CT0wgKHVzYl9yZW1vdmVfaGNkKTsKIAordm9pZAordXNiX2hjZF9wbGF0Zm9ybV9zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlKiBkZXYpCit7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoaGNkLT5kcml2ZXItPnNodXRkb3duKQorCQloY2QtPmRyaXZlci0+c2h1dGRvd24oaGNkKTsKK30KK0VYUE9SVF9TWU1CT0wgKHVzYl9oY2RfcGxhdGZvcm1fc2h1dGRvd24pOworCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjaWYgZGVmaW5lZChDT05GSUdfVVNCX01PTikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmggYi9kcml2ZXJzL3VzYi9jb3JlL2hjZC5oCmluZGV4IDcwMjJhYWYuLjY3Njg3N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaGNkLmgKKysrIGIvZHJpdmVycy91c2IvY29yZS9oY2QuaApAQCAtNTUsMTIgKzU1LDEzIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0cnVjdCB1c2JfaGNkIHsJLyogdXNiX2J1cy5oY3ByaXYgcG9pbnRzIHRvIHRoaXMgKi8KK3N0cnVjdCB1c2JfaGNkIHsKIAogCS8qCiAJICogaG91c2VrZWVwaW5nCiAJICovCiAJc3RydWN0IHVzYl9idXMJCXNlbGY7CQkvKiBoY2QgaXMtYSBidXMgKi8KKwlzdHJ1Y3Qga3JlZgkJa3JlZjsJCS8qIHJlZmVyZW5jZSBjb3VudGVyICovCiAKIAljb25zdCBjaGFyCQkqcHJvZHVjdF9kZXNjOwkvKiBwcm9kdWN0L3ZlbmRvciBzdHJpbmcgKi8KIAljaGFyCQkJaXJxX2Rlc2NyWzI0XTsJLyogZHJpdmVyICsgYnVzICMgKi8KQEAgLTg1LDYgKzg2LDcgQEAKIAl1bnNpZ25lZAkJdXNlc19uZXdfcG9sbGluZzoxOwogCXVuc2lnbmVkCQlwb2xsX3JoOjE7CS8qIHBvbGwgZm9yIHJoIHN0YXR1cz8gKi8KIAl1bnNpZ25lZAkJcG9sbF9wZW5kaW5nOjE7CS8qIHN0YXR1cyBoYXMgY2hhbmdlZD8gKi8KKwl1bnNpZ25lZAkJd2lyZWxlc3M6MTsJLyogV2lyZWxlc3MgVVNCIEhDRCAqLwogCiAJaW50CQkJaXJxOwkJLyogaXJxIGFsbG9jYXRlZCAqLwogCXZvaWQgX19pb21lbQkJKnJlZ3M7CQkvKiBkZXZpY2UgbWVtb3J5L2lvICovCkBAIC0xMjgsOCArMTMwLDEwIEBACiAJcmV0dXJuICZoY2QtPnNlbGY7CiB9CiAKLQotLy8gdXJiLmhjcHJpdiBpcyByZWFsbHkgaGFyZHdhcmUtc3BlY2lmaWMKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9oY2QgKmJ1c190b19oY2QgKHN0cnVjdCB1c2JfYnVzICpidXMpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihidXMsIHN0cnVjdCB1c2JfaGNkLCBzZWxmKTsKK30KIAogc3RydWN0IGhjZF90aW1lb3V0IHsJLyogdGltZW91dHMgd2UgYWxsb2NhdGUgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCXRpbWVvdXRfbGlzdDsKQEAgLTEzOCwyOCArMTQyLDYgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotLyoKLSAqIEZJWE1FIHVzYl9vcGVyYXRpb25zIHNob3VsZCB2YW5pc2ggb3IgYmVjb21lIGhjX2RyaXZlciwKLSAqIHdoZW4gdXNiX2J1cyBhbmQgdXNiX2hjZCBiZWNvbWUgdGhlIHNhbWUgdGhpbmcuCi0gKi8KLQotc3RydWN0IHVzYl9vcGVyYXRpb25zIHsKLQlpbnQgKCpnZXRfZnJhbWVfbnVtYmVyKSAoc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYpOwotCWludCAoKnN1Ym1pdF91cmIpIChzdHJ1Y3QgdXJiICp1cmIsIGdmcF90IG1lbV9mbGFncyk7Ci0JaW50ICgqdW5saW5rX3VyYikgKHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cyk7Ci0KLQkvKiBhbGxvY2F0ZSBkbWEtY29uc2lzdGVudCBidWZmZXIgZm9yIFVSQl9ETUFfTk9NQVBQSU5HICovCi0Jdm9pZCAqKCpidWZmZXJfYWxsb2MpKHN0cnVjdCB1c2JfYnVzICpidXMsIHNpemVfdCBzaXplLAotCQkJZ2ZwX3QgbWVtX2ZsYWdzLAotCQkJZG1hX2FkZHJfdCAqZG1hKTsKLQl2b2lkICgqYnVmZmVyX2ZyZWUpKHN0cnVjdCB1c2JfYnVzICpidXMsIHNpemVfdCBzaXplLAotCQkJdm9pZCAqYWRkciwgZG1hX2FkZHJfdCBkbWEpOwotCi0Jdm9pZCAoKmRpc2FibGUpKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAotCQkJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCk7Ci19OwotCi0vKiBlYWNoIGRyaXZlciBwcm92aWRlcyBvbmUgb2YgdGhlc2UsIGFuZCBoYXJkd2FyZSBpbml0IHN1cHBvcnQgKi8KIAogc3RydWN0IHB0X3JlZ3M7CiAKQEAgLTE5Miw2ICsxNzQsOSBAQAogCS8qIGNsZWFubHkgbWFrZSBIQ0Qgc3RvcCB3cml0aW5nIG1lbW9yeSBhbmQgZG9pbmcgSS9PICovCiAJdm9pZAkoKnN0b3ApIChzdHJ1Y3QgdXNiX2hjZCAqaGNkKTsKIAorCS8qIHNodXRkb3duIEhDRCAqLworCXZvaWQJKCpzaHV0ZG93bikgKHN0cnVjdCB1c2JfaGNkICpoY2QpOworCiAJLyogcmV0dXJuIGN1cnJlbnQgZnJhbWUgbnVtYmVyICovCiAJaW50CSgqZ2V0X2ZyYW1lX251bWJlcikgKHN0cnVjdCB1c2JfaGNkICpoY2QpOwogCkBAIC0yMTgsMTUgKzIwMywyNSBAQAogCQkvKiBOZWVkZWQgb25seSBpZiBwb3J0LWNoYW5nZSBJUlFzIGFyZSBsZXZlbC10cmlnZ2VyZWQgKi8KIH07CiAKLWV4dGVybiB2b2lkIHVzYl9oY2RfZ2l2ZWJhY2tfdXJiIChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiBpbnQgdXNiX2hjZF9zdWJtaXRfdXJiIChzdHJ1Y3QgdXJiICp1cmIsIGdmcF90IG1lbV9mbGFncyk7CitleHRlcm4gaW50IHVzYl9oY2RfdW5saW5rX3VyYiAoc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKTsKK2V4dGVybiB2b2lkIHVzYl9oY2RfZ2l2ZWJhY2tfdXJiIChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXJiICp1cmIsCisJCXN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiB2b2lkIHVzYl9oY2RfZW5kcG9pbnRfZGlzYWJsZSAoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsCisJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXApOworZXh0ZXJuIGludCB1c2JfaGNkX2dldF9mcmFtZV9udW1iZXIgKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KTsKIAogZXh0ZXJuIHN0cnVjdCB1c2JfaGNkICp1c2JfY3JlYXRlX2hjZCAoY29uc3Qgc3RydWN0IGhjX2RyaXZlciAqZHJpdmVyLAogCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1c19uYW1lKTsKK2V4dGVybiBzdHJ1Y3QgdXNiX2hjZCAqdXNiX2dldF9oY2QgKHN0cnVjdCB1c2JfaGNkICpoY2QpOwogZXh0ZXJuIHZvaWQgdXNiX3B1dF9oY2QgKHN0cnVjdCB1c2JfaGNkICpoY2QpOwogZXh0ZXJuIGludCB1c2JfYWRkX2hjZChzdHJ1Y3QgdXNiX2hjZCAqaGNkLAogCQl1bnNpZ25lZCBpbnQgaXJxbnVtLCB1bnNpZ25lZCBsb25nIGlycWZsYWdzKTsKIGV4dGVybiB2b2lkIHVzYl9yZW1vdmVfaGNkKHN0cnVjdCB1c2JfaGNkICpoY2QpOwogCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOworZXh0ZXJuIHZvaWQgdXNiX2hjZF9wbGF0Zm9ybV9zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlKiBkZXYpOworCiAjaWZkZWYgQ09ORklHX1BDSQogc3RydWN0IHBjaV9kZXY7CiBzdHJ1Y3QgcGNpX2RldmljZV9pZDsKQEAgLTIzOSw2ICsyMzQsOCBAQAogZXh0ZXJuIGludCB1c2JfaGNkX3BjaV9yZXN1bWUgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogI2VuZGlmIC8qIENPTkZJR19QTSAqLwogCitleHRlcm4gdm9pZCB1c2JfaGNkX3BjaV9zaHV0ZG93biAoc3RydWN0IHBjaV9kZXYgKmRldik7CisKICNlbmRpZiAvKiBDT05GSUdfUENJICovCiAKIC8qIHBjaS1pc2ggKHBkZXYgbnVsbCBpcyBvaykgYnVmZmVyIGFsbG9jL21hcHBpbmcgc3VwcG9ydCAqLwpAQCAtMzUyLDggKzM0OSw2IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLWV4dGVybiBzdHJ1Y3QgdXNiX2J1cyAqdXNiX2FsbG9jX2J1cyAoc3RydWN0IHVzYl9vcGVyYXRpb25zICopOwotCiBleHRlcm4gdm9pZCB1c2Jfc2V0X2RldmljZV9zdGF0ZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwKIAkJZW51bSB1c2JfZGV2aWNlX3N0YXRlIG5ld19zdGF0ZSk7CiAKQEAgLTM2NSw5ICszNjAsNiBAQAogZXh0ZXJuIHN0cnVjdCBtdXRleCB1c2JfYnVzX2xpc3RfbG9jazsKIGV4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCB1c2Jfa2lsbF91cmJfcXVldWU7CiAKLWV4dGVybiBzdHJ1Y3QgdXNiX2J1cyAqdXNiX2J1c19nZXQgKHN0cnVjdCB1c2JfYnVzICpidXMpOwotZXh0ZXJuIHZvaWQgdXNiX2J1c19wdXQgKHN0cnVjdCB1c2JfYnVzICpidXMpOwotCiBleHRlcm4gdm9pZCB1c2JfZW5hYmxlX3Jvb3RfaHViX2lycSAoc3RydWN0IHVzYl9idXMgKmJ1cyk7CiAKIGV4dGVybiBpbnQgdXNiX2ZpbmRfaW50ZXJmYWNlX2RyaXZlciAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKQEAgLTM3NiwxNyArMzY4LDExIEBACiAjZGVmaW5lIHVzYl9lbmRwb2ludF9vdXQoZXBfZGlyKQkoISgoZXBfZGlyKSAmIFVTQl9ESVJfSU4pKQogCiAjaWZkZWYgQ09ORklHX1BNCi1leHRlcm4gdm9pZCB1c2JfaGNkX3N1c3BlbmRfcm9vdF9odWIgKHN0cnVjdCB1c2JfaGNkICpoY2QpOwogZXh0ZXJuIHZvaWQgdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIgKHN0cnVjdCB1c2JfaGNkICpoY2QpOwogZXh0ZXJuIHZvaWQgdXNiX3Jvb3RfaHViX2xvc3RfcG93ZXIgKHN0cnVjdCB1c2JfZGV2aWNlICpyaGRldik7CiBleHRlcm4gaW50IGhjZF9idXNfc3VzcGVuZCAoc3RydWN0IHVzYl9idXMgKmJ1cyk7CiBleHRlcm4gaW50IGhjZF9idXNfcmVzdW1lIChzdHJ1Y3QgdXNiX2J1cyAqYnVzKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgdXNiX2hjZF9zdXNwZW5kX3Jvb3RfaHViKHN0cnVjdCB1c2JfaGNkICpoY2QpCi17Ci0JcmV0dXJuOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2hjZF9yZXN1bWVfcm9vdF9odWIoc3RydWN0IHVzYl9oY2QgKmhjZCkKIHsKIAlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwppbmRleCAyNmM4Y2I1Li4yYThjYjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogLyogY29tcGxldGlvbiBmdW5jdGlvbiwgZmlyZXMgb24gcG9ydCBzdGF0dXMgY2hhbmdlcyBhbmQgdmFyaW91cyBmYXVsdHMgKi8KIHN0YXRpYyB2b2lkIGh1Yl9pcnEoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgdXNiX2h1YiAqaHViID0gKHN0cnVjdCB1c2JfaHViICopdXJiLT5jb250ZXh0OworCXN0cnVjdCB1c2JfaHViICpodWIgPSB1cmItPmNvbnRleHQ7CiAJaW50IHN0YXR1czsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGJpdHM7CkBAIC0zMTEsNyArMzExLDcgQEAKIAkJCWdvdG8gcmVzdWJtaXQ7CiAJCWh1Yi0+ZXJyb3IgPSB1cmItPnN0YXR1czsKIAkJLyogRkFMTCBUSFJPVUdIICovCi0JCisKIAkvKiBsZXQga2h1YmQgaGFuZGxlIHRoaW5ncyAqLwogCWNhc2UgMDoJCQkvKiB3ZSBnb3QgZGF0YTogIHBvcnQgc3RhdHVzIGNoYW5nZWQgKi8KIAkJYml0cyA9IDA7CkBAIC00NTIsMTggKzQ1MiwxNCBAQAogCW1zbGVlcChtYXgocGdvb2RfZGVsYXksICh1bnNpZ25lZCkgMTAwKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2h1Yl9xdWllc2NlKHN0cnVjdCB1c2JfaHViICpodWIpCitzdGF0aWMgdm9pZCBodWJfcXVpZXNjZShzdHJ1Y3QgdXNiX2h1YiAqaHViKQogewogCS8qIChub25ibG9ja2luZykga2h1YmQgYW5kIHJlbGF0ZWQgYWN0aXZpdHkgd29uJ3QgcmUtdHJpZ2dlciAqLwogCWh1Yi0+cXVpZXNjaW5nID0gMTsKIAlodWItPmFjdGl2YXRpbmcgPSAwOwogCWh1Yi0+cmVzdW1lX3Jvb3RfaHViID0gMDsKLX0KIAotc3RhdGljIHZvaWQgaHViX3F1aWVzY2Uoc3RydWN0IHVzYl9odWIgKmh1YikKLXsKIAkvKiAoYmxvY2tpbmcpIHN0b3Aga2h1YmQgYW5kIHJlbGF0ZWQgYWN0aXZpdHkgKi8KLQlfX2h1Yl9xdWllc2NlKGh1Yik7CiAJdXNiX2tpbGxfdXJiKGh1Yi0+dXJiKTsKIAlpZiAoaHViLT5oYXNfaW5kaWNhdG9ycykKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaHViLT5sZWRzKTsKQEAgLTg2OCwxMyArODY0LDggQEAKIAogCWVuZHBvaW50ID0gJmRlc2MtPmVuZHBvaW50WzBdLmRlc2M7CiAKLQkvKiBPdXRwdXQgZW5kcG9pbnQ/IEN1cmlvdXNlciBhbmQgY3VyaW91c2VyLi4gKi8KLQlpZiAoIShlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pKQotCQlnb3RvIGRlc2NyaXB0b3JfZXJyb3I7Ci0KLQkvKiBJZiBpdCdzIG5vdCBhbiBpbnRlcnJ1cHQgZW5kcG9pbnQsIHdlJ2QgYmV0dGVyIHB1bnQhICovCi0JaWYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spCi0JCQkhPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpCisJLyogSWYgaXQncyBub3QgYW4gaW50ZXJydXB0IGluIGVuZHBvaW50LCB3ZSdkIGJldHRlciBwdW50ISAqLworCWlmICghdXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpCiAJCWdvdG8gZGVzY3JpcHRvcl9lcnJvcjsKIAogCS8qIFdlIGZvdW5kIGEgaHViICovCkBAIC0xMDIyLDI2ICsxMDEzLDI5IEBACiAJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkKIAkJOwkvKiBkbyBub3RoaW5nICovCiAJZWxzZSBpZiAobmV3X3N0YXRlICE9IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkgewotCQl1ZGV2LT5zdGF0ZSA9IG5ld19zdGF0ZTsKIAogCQkvKiByb290IGh1YiB3YWtldXAgY2FwYWJpbGl0aWVzIGFyZSBtYW5hZ2VkIG91dC1vZi1iYW5kCiAJCSAqIGFuZCBtYXkgaW52b2x2ZSBzaWxpY29uIGVycmF0YSAuLi4gaWdub3JlIHRoZW0gaGVyZS4KIAkJICovCiAJCWlmICh1ZGV2LT5wYXJlbnQpIHsKLQkJCWlmIChuZXdfc3RhdGUgPT0gVVNCX1NUQVRFX0NPTkZJR1VSRUQpCisJCQlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRAorCQkJCQl8fCBuZXdfc3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkKKwkJCQk7CS8qIE5vIGNoYW5nZSB0byB3YWtldXAgc2V0dGluZ3MgKi8KKwkJCWVsc2UgaWYgKG5ld19zdGF0ZSA9PSBVU0JfU1RBVEVfQ09ORklHVVJFRCkKIAkJCQlkZXZpY2VfaW5pdF93YWtldXAoJnVkZXYtPmRldiwKIAkJCQkJKHVkZXYtPmFjdGNvbmZpZy0+ZGVzYy5ibUF0dHJpYnV0ZXMKIAkJCQkJICYgVVNCX0NPTkZJR19BVFRfV0FLRVVQKSk7Ci0JCQllbHNlIGlmIChuZXdfc3RhdGUgIT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkKKwkJCWVsc2UKIAkJCQlkZXZpY2VfaW5pdF93YWtldXAoJnVkZXYtPmRldiwgMCk7CiAJCX0KKwkJdWRldi0+c3RhdGUgPSBuZXdfc3RhdGU7CiAJfSBlbHNlCiAJCXJlY3Vyc2l2ZWx5X21hcmtfTk9UQVRUQUNIRUQodWRldik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX3N0YXRlX2xvY2ssIGZsYWdzKTsKIH0KIAogCi0jaWZkZWYgQ09ORklHX1BNCisjaWZkZWYJQ09ORklHX1BNCiAKIC8qKgogICogdXNiX3Jvb3RfaHViX2xvc3RfcG93ZXIgLSBjYWxsZWQgYnkgSENEIGlmIHRoZSByb290IGh1YiBsb3N0IFZidXMgcG93ZXIKQEAgLTEwNTksNiArMTA1MywxMiBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlkZXZfd2FybigmcmhkZXYtPmRldiwgInJvb3QgaHViIGxvc3QgcG93ZXIgb3Igd2FzIHJlc2V0XG4iKTsKKworCS8qIE1ha2Ugc3VyZSBubyBwb3RlbnRpYWwgd2FrZXVwIGV2ZW50cyBnZXQgbG9zdCwKKwkgKiBieSBmb3JjaW5nIHRoZSByb290IGh1YiB0byBiZSByZXN1bWVkLgorCSAqLworCXJoZGV2LT5kZXYucG93ZXIucHJldl9zdGF0ZS5ldmVudCA9IFBNX0VWRU5UX09OOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZV9zdGF0ZV9sb2NrLCBmbGFncyk7CiAJaHViID0gaGRldl90b19odWIocmhkZXYpOwogCWZvciAocG9ydDEgPSAxOyBwb3J0MSA8PSByaGRldi0+bWF4Y2hpbGQ7ICsrcG9ydDEpIHsKQEAgLTEwNzIsNyArMTA3Miw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1c2Jfcm9vdF9odWJfbG9zdF9wb3dlcik7CiAKLSNlbmRpZgorI2VuZGlmCS8qIENPTkZJR19QTSAqLwogCiBzdGF0aWMgdm9pZCBjaG9vc2VfYWRkcmVzcyhzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKQEAgLTExNDgsMTQ0ICsxMTQ4LDI4IEBACiAJICogY2xlYW5pbmcgdXAgYWxsIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCiAJICogc28gdGhhdCB0aGUgaGFyZHdhcmUgaXMgbm93IGZ1bGx5IHF1aWVzY2VkLgogCSAqLworCWRldl9kYmcgKCZ1ZGV2LT5kZXYsICJ1bnJlZ2lzdGVyaW5nIGRldmljZVxuIik7CiAJdXNiX2Rpc2FibGVfZGV2aWNlKHVkZXYsIDApOwogCi0JdXNiX25vdGlmeV9yZW1vdmVfZGV2aWNlKHVkZXYpOworCXVzYl91bmxvY2tfZGV2aWNlKHVkZXYpOwogCi0JLyogRnJlZSB0aGUgZGV2aWNlIG51bWJlciwgcmVtb3ZlIHRoZSAvcHJvYy9idXMvdXNiIGVudHJ5IGFuZAotCSAqIHRoZSBzeXNmcyBhdHRyaWJ1dGVzLCBhbmQgZGVsZXRlIHRoZSBwYXJlbnQncyBjaGlsZHJlbltdCisJLyogVW5yZWdpc3RlciB0aGUgZGV2aWNlLiAgVGhlIGRldmljZSBkcml2ZXIgaXMgcmVzcG9uc2libGUKKwkgKiBmb3IgcmVtb3ZpbmcgdGhlIGRldmljZSBmaWxlcyBmcm9tIHVzYmZzIGFuZCBzeXNmcyBhbmQgZm9yCisJICogZGUtY29uZmlndXJpbmcgdGhlIGRldmljZS4KKwkgKi8KKwlkZXZpY2VfZGVsKCZ1ZGV2LT5kZXYpOworCisJLyogRnJlZSB0aGUgZGV2aWNlIG51bWJlciBhbmQgZGVsZXRlIHRoZSBwYXJlbnQncyBjaGlsZHJlbltdCiAJICogKG9yIHJvb3RfaHViKSBwb2ludGVyLgogCSAqLwotCWRldl9kYmcgKCZ1ZGV2LT5kZXYsICJ1bnJlZ2lzdGVyaW5nIGRldmljZVxuIik7CiAJcmVsZWFzZV9hZGRyZXNzKHVkZXYpOwotCXVzYl9yZW1vdmVfc3lzZnNfZGV2X2ZpbGVzKHVkZXYpOwogCiAJLyogQXZvaWQgcmFjZXMgd2l0aCByZWN1cnNpdmVseV9tYXJrX05PVEFUVEFDSEVEKCkgKi8KIAlzcGluX2xvY2tfaXJxKCZkZXZpY2Vfc3RhdGVfbG9jayk7CiAJKnBkZXYgPSBOVUxMOwogCXNwaW5fdW5sb2NrX2lycSgmZGV2aWNlX3N0YXRlX2xvY2spOwogCi0JdXNiX3VubG9ja19kZXZpY2UodWRldik7Ci0KLQlkZXZpY2VfdW5yZWdpc3RlcigmdWRldi0+ZGV2KTsKLX0KLQotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpwbHVyYWwoaW50IG4pCi17Ci0JcmV0dXJuIChuID09IDEgPyAiIiA6ICJzIik7Ci19Ci0KLXN0YXRpYyBpbnQgY2hvb3NlX2NvbmZpZ3VyYXRpb24oc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCi17Ci0JaW50IGk7Ci0JaW50IG51bV9jb25maWdzOwotCWludCBpbnN1ZmZpY2llbnRfcG93ZXIgPSAwOwotCXN0cnVjdCB1c2JfaG9zdF9jb25maWcgKmMsICpiZXN0OwotCi0JYmVzdCA9IE5VTEw7Ci0JYyA9IHVkZXYtPmNvbmZpZzsKLQludW1fY29uZmlncyA9IHVkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zOwotCWZvciAoaSA9IDA7IGkgPCBudW1fY29uZmlnczsgKGkrKywgYysrKSkgewotCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yCSpkZXNjID0gTlVMTDsKLQotCQkvKiBJdCdzIHBvc3NpYmxlIHRoYXQgYSBjb25maWcgaGFzIG5vIGludGVyZmFjZXMhICovCi0JCWlmIChjLT5kZXNjLmJOdW1JbnRlcmZhY2VzID4gMCkKLQkJCWRlc2MgPSAmYy0+aW50Zl9jYWNoZVswXS0+YWx0c2V0dGluZy0+ZGVzYzsKLQotCQkvKgotCQkgKiBIUCdzIFVTQiBidXMtcG93ZXJlZCBrZXlib2FyZCBoYXMgb25seSBvbmUgY29uZmlndXJhdGlvbgotCQkgKiBhbmQgaXQgY2xhaW1zIHRvIGJlIHNlbGYtcG93ZXJlZDsgb3RoZXIgZGV2aWNlcyBtYXkgaGF2ZQotCQkgKiBzaW1pbGFyIGVycm9ycyBpbiB0aGVpciBkZXNjcmlwdG9ycy4gIElmIHRoZSBuZXh0IHRlc3QKLQkJICogd2VyZSBhbGxvd2VkIHRvIGV4ZWN1dGUsIHN1Y2ggY29uZmlndXJhdGlvbnMgd291bGQgYWx3YXlzCi0JCSAqIGJlIHJlamVjdGVkIGFuZCB0aGUgZGV2aWNlcyB3b3VsZCBub3Qgd29yayBhcyBleHBlY3RlZC4KLQkJICogSW4gdGhlIG1lYW50aW1lLCB3ZSBydW4gdGhlIHJpc2sgb2Ygc2VsZWN0aW5nIGEgY29uZmlnCi0JCSAqIHRoYXQgcmVxdWlyZXMgZXh0ZXJuYWwgcG93ZXIgYXQgYSB0aW1lIHdoZW4gdGhhdCBwb3dlcgotCQkgKiBpc24ndCBhdmFpbGFibGUuICBJdCBzZWVtcyB0byBiZSB0aGUgbGVzc2VyIG9mIHR3byBldmlscy4KLQkJICoKLQkJICogQnVnemlsbGEgIzY0NDggcmVwb3J0cyBhIGRldmljZSB0aGF0IGFwcGVhcnMgdG8gY3Jhc2gKLQkJICogd2hlbiBpdCByZWNlaXZlcyBhIEdFVF9ERVZJQ0VfU1RBVFVTIHJlcXVlc3QhICBXZSBkb24ndAotCQkgKiBoYXZlIGFueSBvdGhlciB3YXkgdG8gdGVsbCB3aGV0aGVyIGEgZGV2aWNlIGlzIHNlbGYtcG93ZXJlZCwKLQkJICogYnV0IHNpbmNlIHdlIGRvbid0IHVzZSB0aGF0IGluZm9ybWF0aW9uIGFueXdoZXJlIGJ1dCBoZXJlLAotCQkgKiB0aGUgY2FsbCBoYXMgYmVlbiByZW1vdmVkLgotCQkgKgotCQkgKiBNYXliZSB0aGUgR0VUX0RFVklDRV9TVEFUVVMgY2FsbCBhbmQgdGhlIHRlc3QgYmVsb3cgY2FuCi0JCSAqIGJlIHJlaW5zdGF0ZWQgd2hlbiBkZXZpY2UgZmlybXdhcmVzIGJlY29tZSBtb3JlIHJlbGlhYmxlLgotCQkgKiBEb24ndCBob2xkIHlvdXIgYnJlYXRoLgotCQkgKi8KLSNpZiAwCi0JCS8qIFJ1bGUgb3V0IHNlbGYtcG93ZXJlZCBjb25maWdzIGZvciBhIGJ1cy1wb3dlcmVkIGRldmljZSAqLwotCQlpZiAoYnVzX3Bvd2VyZWQgJiYgKGMtPmRlc2MuYm1BdHRyaWJ1dGVzICYKLQkJCQkJVVNCX0NPTkZJR19BVFRfU0VMRlBPV0VSKSkKLQkJCWNvbnRpbnVlOwotI2VuZGlmCi0KLQkJLyoKLQkJICogVGhlIG5leHQgdGVzdCBtYXkgbm90IGJlIGFzIGVmZmVjdGl2ZSBhcyBpdCBzaG91bGQgYmUuCi0JCSAqIFNvbWUgaHVicyBoYXZlIGVycm9ycyBpbiB0aGVpciBkZXNjcmlwdG9yLCBjbGFpbWluZwotCQkgKiB0byBiZSBzZWxmLXBvd2VyZWQgd2hlbiB0aGV5IGFyZSByZWFsbHkgYnVzLXBvd2VyZWQuCi0JCSAqIFdlIHdpbGwgb3ZlcmVzdGltYXRlIHRoZSBhbW91bnQgb2YgY3VycmVudCBzdWNoIGh1YnMKLQkJICogbWFrZSBhdmFpbGFibGUgZm9yIGVhY2ggcG9ydC4KLQkJICoKLQkJICogVGhpcyBpcyBhIGZhaXJseSBiZW5pZ24gc29ydCBvZiBmYWlsdXJlLiAgSXQgd29uJ3QKLQkJICogY2F1c2UgdXMgdG8gcmVqZWN0IGNvbmZpZ3VyYXRpb25zIHRoYXQgd2Ugc2hvdWxkIGhhdmUKLQkJICogYWNjZXB0ZWQuCi0JCSAqLwotCi0JCS8qIFJ1bGUgb3V0IGNvbmZpZ3MgdGhhdCBkcmF3IHRvbyBtdWNoIGJ1cyBjdXJyZW50ICovCi0JCWlmIChjLT5kZXNjLmJNYXhQb3dlciAqIDIgPiB1ZGV2LT5idXNfbUEpIHsKLQkJCWluc3VmZmljaWVudF9wb3dlcisrOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBJZiB0aGUgZmlyc3QgY29uZmlnJ3MgZmlyc3QgaW50ZXJmYWNlIGlzIENPTU0vMi8weGZmCi0JCSAqIChNU0ZUIFJORElTKSwgcnVsZSBpdCBvdXQgdW5sZXNzIExpbnV4IGhhcyBob3N0LXNpZGUKLQkJICogUk5ESVMgc3VwcG9ydC4gKi8KLQkJaWYgKGkgPT0gMCAmJiBkZXNjCi0JCQkJJiYgZGVzYy0+YkludGVyZmFjZUNsYXNzID09IFVTQl9DTEFTU19DT01NCi0JCQkJJiYgZGVzYy0+YkludGVyZmFjZVN1YkNsYXNzID09IDIKLQkJCQkmJiBkZXNjLT5iSW50ZXJmYWNlUHJvdG9jb2wgPT0gMHhmZikgewotI2lmbmRlZiBDT05GSUdfVVNCX05FVF9STkRJU19IT1NUCi0JCQljb250aW51ZTsKLSNlbHNlCi0JCQliZXN0ID0gYzsKLSNlbmRpZgotCQl9Ci0KLQkJLyogRnJvbSB0aGUgcmVtYWluaW5nIGNvbmZpZ3MsIGNob29zZSB0aGUgZmlyc3Qgb25lIHdob3NlCi0JCSAqIGZpcnN0IGludGVyZmFjZSBpcyBmb3IgYSBub24tdmVuZG9yLXNwZWNpZmljIGNsYXNzLgotCQkgKiBSZWFzb246IExpbnV4IGlzIG1vcmUgbGlrZWx5IHRvIGhhdmUgYSBjbGFzcyBkcml2ZXIKLQkJICogdGhhbiBhIHZlbmRvci1zcGVjaWZpYyBkcml2ZXIuICovCi0JCWVsc2UgaWYgKHVkZXYtPmRlc2NyaXB0b3IuYkRldmljZUNsYXNzICE9Ci0JCQkJCQlVU0JfQ0xBU1NfVkVORE9SX1NQRUMgJiYKLQkJCQkoIWRlc2MgfHwgZGVzYy0+YkludGVyZmFjZUNsYXNzICE9Ci0JCQkJCQlVU0JfQ0xBU1NfVkVORE9SX1NQRUMpKSB7Ci0JCQliZXN0ID0gYzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogSWYgYWxsIHRoZSByZW1haW5pbmcgY29uZmlncyBhcmUgdmVuZG9yLXNwZWNpZmljLAotCQkgKiBjaG9vc2UgdGhlIGZpcnN0IG9uZS4gKi8KLQkJZWxzZSBpZiAoIWJlc3QpCi0JCQliZXN0ID0gYzsKLQl9Ci0KLQlpZiAoaW5zdWZmaWNpZW50X3Bvd2VyID4gMCkKLQkJZGV2X2luZm8oJnVkZXYtPmRldiwgInJlamVjdGVkICVkIGNvbmZpZ3VyYXRpb24lcyAiCi0JCQkiZHVlIHRvIGluc3VmZmljaWVudCBhdmFpbGFibGUgYnVzIHBvd2VyXG4iLAotCQkJaW5zdWZmaWNpZW50X3Bvd2VyLCBwbHVyYWwoaW5zdWZmaWNpZW50X3Bvd2VyKSk7Ci0KLQlpZiAoYmVzdCkgewotCQlpID0gYmVzdC0+ZGVzYy5iQ29uZmlndXJhdGlvblZhbHVlOwotCQlkZXZfaW5mbygmdWRldi0+ZGV2LAotCQkJImNvbmZpZ3VyYXRpb24gIyVkIGNob3NlbiBmcm9tICVkIGNob2ljZSVzXG4iLAotCQkJaSwgbnVtX2NvbmZpZ3MsIHBsdXJhbChudW1fY29uZmlncykpOwotCX0gZWxzZSB7Ci0JCWkgPSAtMTsKLQkJZGV2X3dhcm4oJnVkZXYtPmRldiwKLQkJCSJubyBjb25maWd1cmF0aW9uIGNob3NlbiBmcm9tICVkIGNob2ljZSVzXG4iLAotCQkJbnVtX2NvbmZpZ3MsIHBsdXJhbChudW1fY29uZmlncykpOwotCX0KLQlyZXR1cm4gaTsKKwlwdXRfZGV2aWNlKCZ1ZGV2LT5kZXYpOwogfQogCiAjaWZkZWYgREVCVUcKQEAgLTEzMjgsNyArMTIxMiw2IEBACiBpbnQgdXNiX25ld19kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CiAJaW50IGVycjsKLQlpbnQgYzsKIAogCWVyciA9IHVzYl9nZXRfY29uZmlndXJhdGlvbih1ZGV2KTsKIAlpZiAoZXJyIDwgMCkgewpAQCAtMTM3MSw4ICsxMjU0LDcgQEAKIAkJCQkJVVNCX0RUX09URywgKHZvaWQgKiopICZkZXNjKSA9PSAwKSB7CiAJCQlpZiAoZGVzYy0+Ym1BdHRyaWJ1dGVzICYgVVNCX09UR19ITlApIHsKIAkJCQl1bnNpZ25lZAkJcG9ydDEgPSB1ZGV2LT5wb3J0bnVtOwotCQkJCXN0cnVjdCB1c2JfZGV2aWNlCSpyb290ID0gdWRldi0+cGFyZW50OwotCQkJCQorCiAJCQkJZGV2X2luZm8oJnVkZXYtPmRldiwKIAkJCQkJIkR1YWwtUm9sZSBPVEcgZGV2aWNlIG9uICVzSE5QIHBvcnRcbiIsCiAJCQkJCShwb3J0MSA9PSBidXMtPm90Z19wb3J0KQpAQCAtMTQwNyw5ICsxMjg5LDkgQEAKIAkJICogKEluY2x1ZGVzIEhOUCB0ZXN0IGRldmljZS4pCiAJCSAqLwogCQlpZiAodWRldi0+YnVzLT5iX2hucF9lbmFibGUgfHwgdWRldi0+YnVzLT5pc19iX2hvc3QpIHsKLQkJCXN0YXRpYyBpbnQgX191c2Jfc3VzcGVuZF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKiwKKwkJCXN0YXRpYyBpbnQgX191c2JfcG9ydF9zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICosCiAJCQkJCQlpbnQgcG9ydDEpOwotCQkJZXJyID0gX191c2Jfc3VzcGVuZF9kZXZpY2UodWRldiwgdWRldi0+YnVzLT5vdGdfcG9ydCk7CisJCQllcnIgPSBfX3VzYl9wb3J0X3N1c3BlbmQodWRldiwgdWRldi0+YnVzLT5vdGdfcG9ydCk7CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJITlAgZmFpbCwgJWRcbiIsIGVycik7CiAJCX0KQEAgLTE0MTgsMzQgKzEzMDAsMTUgQEAKIAl9CiAjZW5kaWYKIAotCS8qIHB1dCBkZXZpY2Utc3BlY2lmaWMgZmlsZXMgaW50byBzeXNmcyAqLworCS8qIFJlZ2lzdGVyIHRoZSBkZXZpY2UuICBUaGUgZGV2aWNlIGRyaXZlciBpcyByZXNwb25zaWJsZQorCSAqIGZvciBhZGRpbmcgdGhlIGRldmljZSBmaWxlcyB0byB1c2JmcyBhbmQgc3lzZnMgYW5kIGZvcgorCSAqIGNvbmZpZ3VyaW5nIHRoZSBkZXZpY2UuCisJICovCiAJZXJyID0gZGV2aWNlX2FkZCAoJnVkZXYtPmRldik7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJjYW4ndCBkZXZpY2VfYWRkLCBlcnJvciAlZFxuIiwgZXJyKTsKIAkJZ290byBmYWlsOwogCX0KLQl1c2JfY3JlYXRlX3N5c2ZzX2Rldl9maWxlcyAodWRldik7Ci0KLQl1c2JfbG9ja19kZXZpY2UodWRldik7Ci0KLQkvKiBjaG9vc2UgYW5kIHNldCB0aGUgY29uZmlndXJhdGlvbi4gdGhhdCByZWdpc3RlcnMgdGhlIGludGVyZmFjZXMKLQkgKiB3aXRoIHRoZSBkcml2ZXIgY29yZSwgYW5kIGxldHMgdXNiIGRldmljZSBkcml2ZXJzIGJpbmQgdG8gdGhlbS4KLQkgKi8KLQljID0gY2hvb3NlX2NvbmZpZ3VyYXRpb24odWRldik7Ci0JaWYgKGMgPj0gMCkgewotCQllcnIgPSB1c2Jfc2V0X2NvbmZpZ3VyYXRpb24odWRldiwgYyk7Ci0JCWlmIChlcnIpIHsKLQkJCWRldl9lcnIoJnVkZXYtPmRldiwgImNhbid0IHNldCBjb25maWcgIyVkLCBlcnJvciAlZFxuIiwKLQkJCQkJYywgZXJyKTsKLQkJCS8qIFRoaXMgbmVlZCBub3QgYmUgZmF0YWwuICBUaGUgdXNlciBjYW4gdHJ5IHRvCi0JCQkgKiBzZXQgb3RoZXIgY29uZmlndXJhdGlvbnMuICovCi0JCX0KLQl9Ci0KLQkvKiBVU0IgZGV2aWNlIHN0YXRlID09IGNvbmZpZ3VyZWQgLi4uIHVzYWJsZSAqLwotCXVzYl9ub3RpZnlfYWRkX2RldmljZSh1ZGV2KTsKLQotCXVzYl91bmxvY2tfZGV2aWNlKHVkZXYpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTE0NzIsNiArMTMzNSwxOCBAQAogCXJldHVybiByZXQ7CiB9CiAKKworLyogUmV0dXJucyAxIGlmIEBodWIgaXMgYSBXVVNCIHJvb3QgaHViLCAwIG90aGVyd2lzZSAqLworc3RhdGljIHVuc2lnbmVkIGh1Yl9pc193dXNiKHN0cnVjdCB1c2JfaHViICpodWIpCit7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKwlpZiAoaHViLT5oZGV2LT5wYXJlbnQgIT0gTlVMTCkgIC8qIG5vdCBhIHJvb3QgaHViPyAqLworCQlyZXR1cm4gMDsKKwloY2QgPSBjb250YWluZXJfb2YoaHViLT5oZGV2LT5idXMsIHN0cnVjdCB1c2JfaGNkLCBzZWxmKTsKKwlyZXR1cm4gaGNkLT53aXJlbGVzczsKK30KKworCiAjZGVmaW5lIFBPUlRfUkVTRVRfVFJJRVMJNQogI2RlZmluZSBTRVRfQUREUkVTU19UUklFUwkyCiAjZGVmaW5lIEdFVF9ERVNDUklQVE9SX1RSSUVTCTIKQEAgLTE1MTIsNyArMTM4Nyw5IEBACiAJCS8qIGlmIHdlYHZlIGZpbmlzaGVkIHJlc2V0dGluZywgdGhlbiBicmVhayBvdXQgb2YgdGhlIGxvb3AgKi8KIAkJaWYgKCEocG9ydHN0YXR1cyAmIFVTQl9QT1JUX1NUQVRfUkVTRVQpICYmCiAJCSAgICAocG9ydHN0YXR1cyAmIFVTQl9QT1JUX1NUQVRfRU5BQkxFKSkgewotCQkJaWYgKHBvcnRzdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0hJR0hfU1BFRUQpCisJCQlpZiAoaHViX2lzX3d1c2IoaHViKSkKKwkJCQl1ZGV2LT5zcGVlZCA9IFVTQl9TUEVFRF9WQVJJQUJMRTsKKwkJCWVsc2UgaWYgKHBvcnRzdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0hJR0hfU1BFRUQpCiAJCQkJdWRldi0+c3BlZWQgPSBVU0JfU1BFRURfSElHSDsKIAkJCWVsc2UgaWYgKHBvcnRzdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0xPV19TUEVFRCkKIAkJCQl1ZGV2LT5zcGVlZCA9IFVTQl9TUEVFRF9MT1c7CkBAIC0xNjA3LDYgKzE0ODQsNyBAQAogIAlraWNrX2todWJkKGh1Yik7CiB9CiAKKyNpZmRlZglDT05GSUdfUE0KIAogI2lmZGVmCUNPTkZJR19VU0JfU1VTUEVORAogCkBAIC0xNjMzLDcgKzE1MTEsNyBAQAogCSAqIE5PVEU6ICBPVEcgZGV2aWNlcyBtYXkgaXNzdWUgcmVtb3RlIHdha2V1cCAob3IgU1JQKSBldmVuIHdoZW4KIAkgKiB3ZSBkb24ndCBleHBsaWNpdGx5IGVuYWJsZSBpdCBoZXJlLgogCSAqLwotCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmdWRldi0+ZGV2KSkgeworCWlmICh1ZGV2LT5kb19yZW1vdGVfd2FrZXVwKSB7CiAJCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCiAJCQkJVVNCX1JFUV9TRVRfRkVBVFVSRSwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJCQlVU0JfREVWSUNFX1JFTU9URV9XQUtFVVAsIDAsCkBAIC0xNjU5LDcgKzE1MzcsOCBAQAogCQkJCVVTQl9DVFJMX1NFVF9USU1FT1VUKTsKIAl9IGVsc2UgewogCQkvKiBkZXZpY2UgaGFzIHVwIHRvIDEwIG1zZWMgdG8gZnVsbHkgc3VzcGVuZCAqLwotCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJ1c2Igc3VzcGVuZFxuIik7CisJCWRldl9kYmcoJnVkZXYtPmRldiwgInVzYiAlc3N1c3BlbmRcbiIsCisJCQkJdWRldi0+YXV0b19wbSA/ICJhdXRvLSIgOiAiIik7CiAJCXVzYl9zZXRfZGV2aWNlX3N0YXRlKHVkZXYsIFVTQl9TVEFURV9TVVNQRU5ERUQpOwogCQltc2xlZXAoMTApOwogCX0KQEAgLTE2ODQsNyArMTU2Myw3IEBACiAgKiB0aGUgcm9vdCBodWIgZm9yIHRoZWlyIGJ1cyBnb2VzIGludG8gZ2xvYmFsIHN1c3BlbmQgLi4uIHNvIHdlIGRvbid0CiAgKiAoZmFsc2VseSkgdXBkYXRlIHRoZSBkZXZpY2UgcG93ZXIgc3RhdGUgdG8gc2F5IGl0IHN1c3BlbmRlZC4KICAqLwotc3RhdGljIGludCBfX3VzYl9zdXNwZW5kX2RldmljZSAoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIGludCBwb3J0MSkKK3N0YXRpYyBpbnQgX191c2JfcG9ydF9zdXNwZW5kIChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiwgaW50IHBvcnQxKQogewogCWludAlzdGF0dXMgPSAwOwogCkBAIC0xNjkyLDQ5ICsxNTcxLDI5IEBACiAJaWYgKHBvcnQxIDwgMCkKIAkJcmV0dXJuIHBvcnQxOwogCi0JaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQKLQkJCXx8IHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBhbGwgaW50ZXJmYWNlcyBtdXN0IGFscmVhZHkgYmUgc3VzcGVuZGVkICovCi0JaWYgKHVkZXYtPmFjdGNvbmZpZykgewotCQlpbnQJaTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgdWRldi0+YWN0Y29uZmlnLT5kZXNjLmJOdW1JbnRlcmZhY2VzOyBpKyspIHsKLQkJCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRmOwotCi0JCQlpbnRmID0gdWRldi0+YWN0Y29uZmlnLT5pbnRlcmZhY2VbaV07Ci0JCQlpZiAoaXNfYWN0aXZlKGludGYpKSB7Ci0JCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAibnlldCBzdXNwZW5kZWRcbiIpOwotCQkJCXJldHVybiAtRUJVU1k7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiB3ZSBvbmx5IGNoYW5nZSBhIGRldmljZSdzIHVwc3RyZWFtIFVTQiBsaW5rLgotCSAqIHJvb3QgaHVicyBoYXZlIG5vIHVwc3RyZWFtIFVTQiBsaW5rLgorCS8qIHdlIGNoYW5nZSB0aGUgZGV2aWNlJ3MgdXBzdHJlYW0gVVNCIGxpbmssCisJICogYnV0IHJvb3QgaHVicyBoYXZlIG5vIHVwc3RyZWFtIFVTQiBsaW5rLgogCSAqLwogCWlmICh1ZGV2LT5wYXJlbnQpCiAJCXN0YXR1cyA9IGh1Yl9wb3J0X3N1c3BlbmQoaGRldl90b19odWIodWRldi0+cGFyZW50KSwgcG9ydDEsCiAJCQkJdWRldik7Ci0KLQlpZiAoc3RhdHVzID09IDApCi0JCXVkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfU1VTUEVORDsKKwllbHNlIHsKKwkJZGV2X2RiZygmdWRldi0+ZGV2LCAidXNiICVzc3VzcGVuZFxuIiwKKwkJCQl1ZGV2LT5hdXRvX3BtID8gImF1dG8tIiA6ICIiKTsKKwkJdXNiX3NldF9kZXZpY2Vfc3RhdGUodWRldiwgVVNCX1NUQVRFX1NVU1BFTkRFRCk7CisJfQogCXJldHVybiBzdGF0dXM7CiB9CiAKLSNlbmRpZgotCiAvKgotICogdXNiX3N1c3BlbmRfZGV2aWNlIC0gc3VzcGVuZCBhIHVzYiBkZXZpY2UKKyAqIHVzYl9wb3J0X3N1c3BlbmQgLSBzdXNwZW5kIGEgdXNiIGRldmljZSdzIHVwc3RyZWFtIHBvcnQKICAqIEB1ZGV2OiBkZXZpY2UgdGhhdCdzIG5vIGxvbmdlciBpbiBhY3RpdmUgdXNlCiAgKiBDb250ZXh0OiBtdXN0IGJlIGFibGUgdG8gc2xlZXA7IGRldmljZSBub3QgbG9ja2VkOyBwbSBsb2NrcyBoZWxkCiAgKgogICogU3VzcGVuZHMgYSBVU0IgZGV2aWNlIHRoYXQgaXNuJ3QgaW4gYWN0aXZlIHVzZSwgY29uc2VydmluZyBwb3dlci4KICAqIERldmljZXMgbWF5IHdha2Ugb3V0IG9mIGEgc3VzcGVuZCwgaWYgYW55dGhpbmcgaW1wb3J0YW50IGhhcHBlbnMsCiAgKiB1c2luZyB0aGUgcmVtb3RlIHdha2V1cCBtZWNoYW5pc20uICBUaGV5IG1heSBhbHNvIGJlIHRha2VuIG91dCBvZgotICogc3VzcGVuZCBieSB0aGUgaG9zdCwgdXNpbmcgdXNiX3Jlc3VtZV9kZXZpY2UoKS4gIEl0J3MgYWxzbyByb3V0aW5lCisgKiBzdXNwZW5kIGJ5IHRoZSBob3N0LCB1c2luZyB1c2JfcG9ydF9yZXN1bWUoKS4gIEl0J3MgYWxzbyByb3V0aW5lCiAgKiB0byBkaXNjb25uZWN0IGRldmljZXMgd2hpbGUgdGhleSBhcmUgc3VzcGVuZGVkLgogICoKICAqIFRoaXMgb25seSBhZmZlY3RzIHRoZSBVU0IgaGFyZHdhcmUgZm9yIGEgZGV2aWNlOyBpdHMgaW50ZXJmYWNlcwpAQCAtMTc0NiwxNyArMTYwNSw5IEBACiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVsc2UgbmVnYXRpdmUgZXJybm8uCiAgKi8KLWludCB1c2Jfc3VzcGVuZF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitpbnQgdXNiX3BvcnRfc3VzcGVuZChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKLSNpZmRlZglDT05GSUdfVVNCX1NVU1BFTkQKLQlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlyZXR1cm4gX191c2Jfc3VzcGVuZF9kZXZpY2UodWRldiwgdWRldi0+cG9ydG51bSk7Ci0jZWxzZQotCS8qIE5PVEU6ICB1ZGV2LT5zdGF0ZSB1bmNoYW5nZWQsIGl0J3Mgbm90IGx5aW5nIC4uLiAqLwotCXVkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfU1VTUEVORDsKLQlyZXR1cm4gMDsKLSNlbmRpZgorCXJldHVybiBfX3VzYl9wb3J0X3N1c3BlbmQodWRldiwgdWRldi0+cG9ydG51bSk7CiB9CiAKIC8qCkBAIC0xNzY3LDcgKzE2MTgsNyBAQAogICogcmVzdW1lIChieSBob3N0KSBvciByZW1vdGUgd2FrZXVwIChieSBkZXZpY2UpIC4uLiBub3cgc2VlIHdoYXQgY2hhbmdlZAogICogaW4gdGhlIHRyZWUgdGhhdCdzIHJvb3RlZCBhdCB0aGlzIGRldmljZS4KICAqLwotc3RhdGljIGludCBmaW5pc2hfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3N0YXRpYyBpbnQgZmluaXNoX3BvcnRfcmVzdW1lKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewogCWludAlzdGF0dXM7CiAJdTE2CWRldnN0YXR1czsKQEAgLTE3ODMsNyArMTYzNCw2IEBACiAJdXNiX3NldF9kZXZpY2Vfc3RhdGUodWRldiwgdWRldi0+YWN0Y29uZmlnCiAJCQk/IFVTQl9TVEFURV9DT05GSUdVUkVECiAJCQk6IFVTQl9TVEFURV9BRERSRVNTKTsKLQl1ZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOwogCiAgCS8qIDEwLjUuNC41IHNheXMgYmUgc3VyZSBkZXZpY2VzIGluIHRoZSB0cmVlIGFyZSBzdGlsbCB0aGVyZS4KICAJICogRm9yIG5vdyBsZXQncyBhc3N1bWUgdGhlIGRldmljZSBkaWRuJ3QgZ28gY3Jhenkgb24gcmVzdW1lLApAQCAtMTc5OCw5ICsxNjQ4LDYgQEAKIAkJCSJnb25lIGFmdGVyIHVzYiByZXN1bWU/IHN0YXR1cyAlZFxuIiwKIAkJCXN0YXR1cyk7CiAJZWxzZSBpZiAodWRldi0+YWN0Y29uZmlnKSB7Ci0JCXVuc2lnbmVkCWk7Ci0JCWludAkJKCpyZXN1bWUpKHN0cnVjdCBkZXZpY2UgKik7Ci0KIAkJbGUxNl90b19jcHVzKCZkZXZzdGF0dXMpOwogCQlpZiAoKGRldnN0YXR1cyAmICgxIDw8IFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUCkpCiAJCQkJJiYgdWRldi0+cGFyZW50KSB7CkBAIC0xODExLDI0ICsxNjU4LDkgQEAKIAkJCQkJVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQLCAwLAogCQkJCQlOVUxMLCAwLAogCQkJCQlVU0JfQ1RSTF9TRVRfVElNRU9VVCk7Ci0JCQlpZiAoc3RhdHVzKSB7CisJCQlpZiAoc3RhdHVzKQogCQkJCWRldl9kYmcoJnVkZXYtPmRldiwgImRpc2FibGUgcmVtb3RlICIKIAkJCQkJIndha2V1cCwgc3RhdHVzICVkXG4iLCBzdGF0dXMpOwotCQkJCXN0YXR1cyA9IDA7Ci0JCQl9Ci0JCX0KLQotCQkvKiByZXN1bWUgaW50ZXJmYWNlIGRyaXZlcnM7IGlmIHRoaXMgaXMgYSBodWIsIGl0Ci0JCSAqIG1heSBoYXZlIGEgY2hpbGQgcmVzdW1lIGV2ZW50IHRvIGRlYWwgd2l0aCBzb29uCi0JCSAqLwotCQlyZXN1bWUgPSB1ZGV2LT5kZXYuYnVzLT5yZXN1bWU7Ci0JCWZvciAoaSA9IDA7IGkgPCB1ZGV2LT5hY3Rjb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgewotCQkJc3RydWN0IGRldmljZSAqZGV2ID0KLQkJCQkJJnVkZXYtPmFjdGNvbmZpZy0+aW50ZXJmYWNlW2ldLT5kZXY7Ci0KLQkJCWRvd24oJmRldi0+c2VtKTsKLQkJCSh2b2lkKSByZXN1bWUoZGV2KTsKLQkJCXVwKCZkZXYtPnNlbSk7CiAJCX0KIAkJc3RhdHVzID0gMDsKIApAQCAtMTgzOSw4ICsxNjcxLDYgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0jaWZkZWYJQ09ORklHX1VTQl9TVVNQRU5ECi0KIHN0YXRpYyBpbnQKIGh1Yl9wb3J0X3Jlc3VtZShzdHJ1Y3QgdXNiX2h1YiAqaHViLCBpbnQgcG9ydDEsIHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewpAQCAtMTg0OCw2ICsxNjc4LDggQEAKIAogCS8vIGRldl9kYmcoaHViLT5pbnRmZGV2LCAicmVzdW1lIHBvcnQgJWRcbiIsIHBvcnQxKTsKIAorCXNldF9iaXQocG9ydDEsIGh1Yi0+YnVzeV9iaXRzKTsKKwogCS8qIHNlZSA3LjEuNy43OyBhZmZlY3RzIHBvd2VyIHVzYWdlLCBidXQgbm90IGJ1ZGdldGluZyAqLwogCXN0YXR1cyA9IGNsZWFyX3BvcnRfZmVhdHVyZShodWItPmhkZXYsCiAJCQlwb3J0MSwgVVNCX1BPUlRfRkVBVF9TVVNQRU5EKTsKQEAgLTE4NjEsNyArMTY5Myw4IEBACiAKIAkJLyogZHJpdmUgcmVzdW1lIGZvciBhdCBsZWFzdCAyMCBtc2VjICovCiAJCWlmICh1ZGV2KQotCQkJZGV2X2RiZygmdWRldi0+ZGV2LCAiUkVTVU1FXG4iKTsKKwkJCWRldl9kYmcoJnVkZXYtPmRldiwgInVzYiAlc3Jlc3VtZVxuIiwKKwkJCQkJdWRldi0+YXV0b19wbSA/ICJhdXRvLSIgOiAiIik7CiAJCW1zbGVlcCgyNSk7CiAKICNkZWZpbmUgTElWRV9GTEFHUwkoIFVTQl9QT1JUX1NUQVRfUE9XRVIgXApAQCAtMTg5MSwxOSArMTcyNCwyMSBAQAogCQkJLyogVFJTTVJDWSA9IDEwIG1zZWMgKi8KIAkJCW1zbGVlcCgxMCk7CiAJCQlpZiAodWRldikKLQkJCQlzdGF0dXMgPSBmaW5pc2hfZGV2aWNlX3Jlc3VtZSh1ZGV2KTsKKwkJCQlzdGF0dXMgPSBmaW5pc2hfcG9ydF9yZXN1bWUodWRldik7CiAJCX0KIAl9CiAJaWYgKHN0YXR1cyA8IDApCiAJCWh1Yl9wb3J0X2xvZ2ljYWxfZGlzY29ubmVjdChodWIsIHBvcnQxKTsKIAorCWNsZWFyX2JpdChwb3J0MSwgaHViLT5idXN5X2JpdHMpOworCWlmICghaHViLT5oZGV2LT5wYXJlbnQgJiYgIWh1Yi0+YnVzeV9iaXRzWzBdKQorCQl1c2JfZW5hYmxlX3Jvb3RfaHViX2lycShodWItPmhkZXYtPmJ1cyk7CisKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0jZW5kaWYKLQogLyoKLSAqIHVzYl9yZXN1bWVfZGV2aWNlIC0gcmUtYWN0aXZhdGUgYSBzdXNwZW5kZWQgdXNiIGRldmljZQorICogdXNiX3BvcnRfcmVzdW1lIC0gcmUtYWN0aXZhdGUgYSBzdXNwZW5kZWQgdXNiIGRldmljZSdzIHVwc3RyZWFtIHBvcnQKICAqIEB1ZGV2OiBkZXZpY2UgdG8gcmUtYWN0aXZhdGUKICAqIENvbnRleHQ6IG11c3QgYmUgYWJsZSB0byBzbGVlcDsgZGV2aWNlIG5vdCBsb2NrZWQ7IHBtIGxvY2tzIGhlbGQKICAqCkBAIC0xOTE1LDM2ICsxNzUwLDI0IEBACiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVsc2UgbmVnYXRpdmUgZXJybm8uCiAgKi8KLWludCB1c2JfcmVzdW1lX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK2ludCB1c2JfcG9ydF9yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCiB7CiAJaW50CXN0YXR1czsKIAotCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogc2VsZWN0aXZlIHJlc3VtZSBvZiBvbmUgZG93bnN0cmVhbSBodWItdG8tZGV2aWNlIHBvcnQgKi8KKwkvKiB3ZSBjaGFuZ2UgdGhlIGRldmljZSdzIHVwc3RyZWFtIFVTQiBsaW5rLAorCSAqIGJ1dCByb290IGh1YnMgaGF2ZSBubyB1cHN0cmVhbSBVU0IgbGluay4KKwkgKi8KIAlpZiAodWRldi0+cGFyZW50KSB7Ci0jaWZkZWYJQ09ORklHX1VTQl9TVVNQRU5ECi0JCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKSB7Ci0JCQkvLyBOT1RFIHN3c3VzcCBtYXkgYm9yayB1cywgZGV2aWNlIHN0YXRlIGJlaW5nIHdyb25nLi4uCi0JCQkvLyBOT1RFIHRoaXMgZmFpbHMgaWYgcGFyZW50IGlzIGFsc28gc3VzcGVuZGVkLi4uCi0JCQlzdGF0dXMgPSBodWJfcG9ydF9yZXN1bWUoaGRldl90b19odWIodWRldi0+cGFyZW50KSwKLQkJCQkJdWRldi0+cG9ydG51bSwgdWRldik7Ci0JCX0gZWxzZQotI2VuZGlmCi0JCQlzdGF0dXMgPSAwOwotCX0gZWxzZQotCQlzdGF0dXMgPSBmaW5pc2hfZGV2aWNlX3Jlc3VtZSh1ZGV2KTsKLQlpZiAoc3RhdHVzIDwgMCkKLQkJZGV2X2RiZygmdWRldi0+ZGV2LCAiY2FuJ3QgcmVzdW1lLCBzdGF0dXMgJWRcbiIsCi0JCQlzdGF0dXMpOwotCi0JLyogcmViaW5kIGRyaXZlcnMgdGhhdCBoYWQgbm8gc3VzcGVuZCgpICovCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCXVzYl91bmxvY2tfZGV2aWNlKHVkZXYpOwotCQlidXNfcmVzY2FuX2RldmljZXMoJnVzYl9idXNfdHlwZSk7Ci0JCXVzYl9sb2NrX2RldmljZSh1ZGV2KTsKKwkJLy8gTk9URSB0aGlzIGZhaWxzIGlmIHBhcmVudCBpcyBhbHNvIHN1c3BlbmRlZC4uLgorCQlzdGF0dXMgPSBodWJfcG9ydF9yZXN1bWUoaGRldl90b19odWIodWRldi0+cGFyZW50KSwKKwkJCQl1ZGV2LT5wb3J0bnVtLCB1ZGV2KTsKKwl9IGVsc2UgeworCQlkZXZfZGJnKCZ1ZGV2LT5kZXYsICJ1c2IgJXNyZXN1bWVcbiIsCisJCQkJdWRldi0+YXV0b19wbSA/ICJhdXRvLSIgOiAiIik7CisJCXN0YXR1cyA9IGZpbmlzaF9wb3J0X3Jlc3VtZSh1ZGV2KTsKIAl9CisJaWYgKHN0YXR1cyA8IDApCisJCWRldl9kYmcoJnVkZXYtPmRldiwgImNhbid0IHJlc3VtZSwgc3RhdHVzICVkXG4iLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE5NTIsMjMgKzE3NzUsNjAgQEAKIHsKIAlpbnQJc3RhdHVzID0gMDsKIAotI2lmZGVmCUNPTkZJR19VU0JfU1VTUEVORAorCS8qIEFsbCB0aGlzIGp1c3QgdG8gYXZvaWQgc2VuZGluZyBhIHBvcnQtcmVzdW1lIG1lc3NhZ2UKKwkgKiB0byB0aGUgcGFyZW50IGh1YiEgKi8KIAotCS8qIGRvbid0IHJlcGVhdCBSRVNVTUUgc2VxdWVuY2UgaWYgdGhpcyBkZXZpY2UKLQkgKiB3YXMgYWxyZWFkeSB3b2tlbiB1cCBieSBzb21lIG90aGVyIHRhc2sKLQkgKi8KIAl1c2JfbG9ja19kZXZpY2UodWRldik7CisJbXV0ZXhfbG9ja19uZXN0ZWQoJnVkZXYtPnBtX211dGV4LCB1ZGV2LT5sZXZlbCk7CiAJaWYgKHVkZXYtPnN0YXRlID09IFVTQl9TVEFURV9TVVNQRU5ERUQpIHsKLQkJZGV2X2RiZygmdWRldi0+ZGV2LCAiUkVTVU1FICh3YWtldXApXG4iKTsKKwkJZGV2X2RiZygmdWRldi0+ZGV2LCAidXNiICVzcmVzdW1lXG4iLCAid2FrZXVwLSIpOwogCQkvKiBUUlNNUkNZID0gMTAgbXNlYyAqLwogCQltc2xlZXAoMTApOwotCQlzdGF0dXMgPSBmaW5pc2hfZGV2aWNlX3Jlc3VtZSh1ZGV2KTsKKwkJc3RhdHVzID0gZmluaXNoX3BvcnRfcmVzdW1lKHVkZXYpOworCQlpZiAoc3RhdHVzID09IDApCisJCQl1ZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPSBQTV9FVkVOVF9PTjsKIAl9CisJbXV0ZXhfdW5sb2NrKCZ1ZGV2LT5wbV9tdXRleCk7CisKKwlpZiAoc3RhdHVzID09IDApCisJCXVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2LCAwKTsKIAl1c2JfdW5sb2NrX2RldmljZSh1ZGV2KTsKLSNlbmRpZgogCXJldHVybiBzdGF0dXM7CiB9CiAKKyNlbHNlCS8qIENPTkZJR19VU0JfU1VTUEVORCAqLworCisvKiBXaGVuIENPTkZJR19VU0JfU1VTUEVORCBpc24ndCBzZXQsIHdlIG5ldmVyIHN1c3BlbmQgb3IgcmVzdW1lIGFueSBwb3J0cy4gKi8KKworaW50IHVzYl9wb3J0X3N1c3BlbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitmaW5pc2hfcG9ydF9yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitodWJfcG9ydF9yZXN1bWUoc3RydWN0IHVzYl9odWIgKmh1YiwgaW50IHBvcnQxLCBzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHVzYl9wb3J0X3Jlc3VtZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcmVtb3RlX3dha2V1cChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3sKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKIHN0YXRpYyBpbnQgaHViX3N1c3BlbmQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHBtX21lc3NhZ2VfdCBtc2cpCiB7CiAJc3RydWN0IHVzYl9odWIJCSpodWIgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKQEAgLTE5ODAsMTMgKzE4NDAsMTcgQEAKIAkJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7CiAKIAkJdWRldiA9IGhkZXYtPmNoaWxkcmVuIFtwb3J0MS0xXTsKLQkJaWYgKHVkZXYgJiYgKHVkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudAotCQkJCQk9PSBQTV9FVkVOVF9PTgorCQlpZiAodWRldiAmJiBtc2cuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCAmJgogI2lmZGVmCUNPTkZJR19VU0JfU1VTUEVORAotCQkJCXx8IHVkZXYtPnN0YXRlICE9IFVTQl9TVEFURV9TVVNQRU5ERUQKKwkJCQl1ZGV2LT5zdGF0ZSAhPSBVU0JfU1RBVEVfU1VTUEVOREVECisjZWxzZQorCQkJCXVkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudAorCQkJCQk9PSBQTV9FVkVOVF9PTgogI2VuZGlmCi0JCQkJKSkgewotCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAicG9ydCAlZCBueWV0IHN1c3BlbmRlZFxuIiwgcG9ydDEpOworCQkJCSkgeworCQkJaWYgKCFoZGV2LT5hdXRvX3BtKQorCQkJCWRldl9kYmcoJmludGYtPmRldiwgInBvcnQgJWQgbnlldCBzdXNwZW5kZWRcbiIsCisJCQkJCQlwb3J0MSk7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAJfQpAQCAtMjAzNSw2NiArMTg5OSwyMiBAQAogCQl9CiAJfQogCisJLyogdGVsbCBraHViZCB0byBsb29rIGZvciBjaGFuZ2VzIG9uIHRoaXMgaHViICovCiAJaHViX2FjdGl2YXRlKGh1Yik7Ci0KLQkvKiBSRVZJU0lUOiAgdGhpcyByZWN1cnNpb24gcHJvYmFibHkgc2hvdWxkbid0IGV4aXN0LiAgUmVtb3ZlCi0JICogdGhpcyBjb2RlIHNvbWV0aW1lLCBhZnRlciByZXRlc3Rpbmcgd2l0aCBkaWZmZXJlbnQgcm9vdCBhbmQKLQkgKiBleHRlcm5hbCBodWJzLgotCSAqLwotI2lmZGVmCUNPTkZJR19VU0JfU1VTUEVORAotCXsKLQl1bnNpZ25lZAkJcG9ydDE7Ci0KLQlmb3IgKHBvcnQxID0gMTsgcG9ydDEgPD0gaGRldi0+bWF4Y2hpbGQ7IHBvcnQxKyspIHsKLQkJc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7Ci0JCXUxNgkJCXBvcnRzdGF0LCBwb3J0Y2hhbmdlOwotCi0JCXVkZXYgPSBoZGV2LT5jaGlsZHJlbiBbcG9ydDEtMV07Ci0JCXN0YXR1cyA9IGh1Yl9wb3J0X3N0YXR1cyhodWIsIHBvcnQxLCAmcG9ydHN0YXQsICZwb3J0Y2hhbmdlKTsKLQkJaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCQlpZiAocG9ydGNoYW5nZSAmIFVTQl9QT1JUX1NUQVRfQ19TVVNQRU5EKSB7Ci0JCQkJY2xlYXJfcG9ydF9mZWF0dXJlKGhkZXYsIHBvcnQxLAotCQkJCQlVU0JfUE9SVF9GRUFUX0NfU1VTUEVORCk7Ci0JCQkJcG9ydGNoYW5nZSAmPSB+VVNCX1BPUlRfU1RBVF9DX1NVU1BFTkQ7Ci0JCQl9Ci0KLQkJCS8qIGxldCBraHViZCBoYW5kbGUgZGlzY29ubmVjdHMgZXRjICovCi0JCQlpZiAocG9ydGNoYW5nZSkKLQkJCQljb250aW51ZTsKLQkJfQotCi0JCWlmICghdWRldiB8fCBzdGF0dXMgPCAwKQotCQkJY29udGludWU7Ci0JCXVzYl9sb2NrX2RldmljZSh1ZGV2KTsKLQkJaWYgKHBvcnRzdGF0ICYgVVNCX1BPUlRfU1RBVF9TVVNQRU5EKQotCQkJc3RhdHVzID0gaHViX3BvcnRfcmVzdW1lKGh1YiwgcG9ydDEsIHVkZXYpOwotCQllbHNlIHsKLQkJCXN0YXR1cyA9IGZpbmlzaF9kZXZpY2VfcmVzdW1lKHVkZXYpOwotCQkJaWYgKHN0YXR1cyA8IDApIHsKLQkJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJyZXN1bWUgcG9ydCAlZCAtLT4gJWRcbiIsCi0JCQkJCXBvcnQxLCBzdGF0dXMpOwotCQkJCWh1Yl9wb3J0X2xvZ2ljYWxfZGlzY29ubmVjdChodWIsIHBvcnQxKTsKLQkJCX0KLQkJfQotCQl1c2JfdW5sb2NrX2RldmljZSh1ZGV2KTsKLQl9Ci0JfQotI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgdXNiX3N1c3BlbmRfcm9vdF9odWIoc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYpCi17Ci0Jc3RydWN0IHVzYl9odWIgKmh1YiA9IGhkZXZfdG9faHViKGhkZXYpOworI2Vsc2UJLyogQ09ORklHX1BNICovCiAKLQkvKiBUaGlzIGFsc28gbWFrZXMgYW55IGxlZCBibGlua2VyIHN0b3AgcmV0cmlnZ2VyaW5nLiAgV2UncmUgY2FsbGVkCi0JICogZnJvbSBpcnEsIHNvIHRoZSBibGlua2VyIG1pZ2h0IHN0aWxsIGJlIHNjaGVkdWxlZC4gIENhbGxlciBwcm9taXNlcwotCSAqIHRoYXQgdGhlIHJvb3QgaHViIHN0YXR1cyBVUkIgd2lsbCBiZSBjYW5jZWxlZC4KLQkgKi8KLQlfX2h1Yl9xdWllc2NlKGh1Yik7Ci0JbWFya19xdWllc2NlZCh0b191c2JfaW50ZXJmYWNlKGh1Yi0+aW50ZmRldikpOworc3RhdGljIGlubGluZSBpbnQgcmVtb3RlX3dha2V1cChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3sKKwlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBodWJfc3VzcGVuZCBOVUxMCisjZGVmaW5lIGh1Yl9yZXN1bWUgTlVMTAorI2VuZGlmCisKIHZvaWQgdXNiX3Jlc3VtZV9yb290X2h1YihzdHJ1Y3QgdXNiX2RldmljZSAqaGRldikKIHsKIAlzdHJ1Y3QgdXNiX2h1YiAqaHViID0gaGRldl90b19odWIoaGRldik7CkBAIC0yMjE0LDYgKzIwMzQsNyBAQAogCWludAkJCWksIGosIHJldHZhbDsKIAl1bnNpZ25lZAkJZGVsYXkgPSBIVUJfU0hPUlRfUkVTRVRfVElNRTsKIAllbnVtIHVzYl9kZXZpY2Vfc3BlZWQJb2xkc3BlZWQgPSB1ZGV2LT5zcGVlZDsKKwljaGFyIAkJCSpzcGVlZCwgKnR5cGU7CiAKIAkvKiByb290IGh1YiBwb3J0cyBoYXZlIGEgc2xpZ2h0bHkgbG9uZ2VyIHJlc2V0IHBlcmlvZAogCSAqIChmcm9tIFVTQiAyLjAgc3BlYywgc2VjdGlvbiA3LjEuNy41KQpAQCAtMjI0Niw4ICsyMDY3LDEzIEBACiAgIAogCS8qIFVTQiAyLjAgc2VjdGlvbiA1LjUuMyB0YWxrcyBhYm91dCBlcDAgbWF4cGFja2V0IC4uLgogCSAqIGl0J3MgZml4ZWQgc2l6ZSBleGNlcHQgZm9yIGZ1bGwgc3BlZWQgZGV2aWNlcy4KKwkgKiBGb3IgV2lyZWxlc3MgVVNCIGRldmljZXMsIGVwMCBtYXggcGFja2V0IGlzIGFsd2F5cyA1MTIgKHRobworCSAqIHJlcG9ydGVkIGFzIDB4ZmYgaW4gdGhlIGRldmljZSBkZXNjcmlwdG9yKS4gV1VTQjEuMFs0LjguMV0uCiAJICovCiAJc3dpdGNoICh1ZGV2LT5zcGVlZCkgeworCWNhc2UgVVNCX1NQRUVEX1ZBUklBQkxFOgkvKiBmaXhlZCBhdCA1MTIgKi8KKwkJdWRldi0+ZXAwLmRlc2Mud01heFBhY2tldFNpemUgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDUxMik7CisJCWJyZWFrOwogCWNhc2UgVVNCX1NQRUVEX0hJR0g6CQkvKiBmaXhlZCBhdCA2NCAqLwogCQl1ZGV2LT5lcDAuZGVzYy53TWF4UGFja2V0U2l6ZSA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoNjQpOwogCQlicmVhazsKQEAgLTIyNjUsMTcgKzIwOTEsMjEgQEAKIAkJZ290byBmYWlsOwogCX0KICAKKwl0eXBlID0gIiI7CisJc3dpdGNoICh1ZGV2LT5zcGVlZCkgeworCWNhc2UgVVNCX1NQRUVEX0xPVzoJc3BlZWQgPSAibG93IjsJYnJlYWs7CisJY2FzZSBVU0JfU1BFRURfRlVMTDoJc3BlZWQgPSAiZnVsbCI7CWJyZWFrOworCWNhc2UgVVNCX1NQRUVEX0hJR0g6CXNwZWVkID0gImhpZ2giOwlicmVhazsKKwljYXNlIFVTQl9TUEVFRF9WQVJJQUJMRToKKwkJCQlzcGVlZCA9ICJ2YXJpYWJsZSI7CisJCQkJdHlwZSA9ICJXaXJlbGVzcyAiOworCQkJCWJyZWFrOworCWRlZmF1bHQ6IAkJc3BlZWQgPSAiPyI7CWJyZWFrOworCX0KIAlkZXZfaW5mbyAoJnVkZXYtPmRldiwKLQkJCSIlcyAlcyBzcGVlZCBVU0IgZGV2aWNlIHVzaW5nICVzIGFuZCBhZGRyZXNzICVkXG4iLAotCQkJKHVkZXYtPmNvbmZpZykgPyAicmVzZXQiIDogIm5ldyIsCi0JCQkoeyBjaGFyICpzcGVlZDsgc3dpdGNoICh1ZGV2LT5zcGVlZCkgewotCQkJY2FzZSBVU0JfU1BFRURfTE9XOglzcGVlZCA9ICJsb3ciOwlicmVhazsKLQkJCWNhc2UgVVNCX1NQRUVEX0ZVTEw6CXNwZWVkID0gImZ1bGwiOwlicmVhazsKLQkJCWNhc2UgVVNCX1NQRUVEX0hJR0g6CXNwZWVkID0gImhpZ2giOwlicmVhazsKLQkJCWRlZmF1bHQ6IAkJc3BlZWQgPSAiPyI7CWJyZWFrOwotCQkJfTsgc3BlZWQ7fSksCi0JCQl1ZGV2LT5idXMtPmNvbnRyb2xsZXItPmRyaXZlci0+bmFtZSwKLQkJCXVkZXYtPmRldm51bSk7CisJCSAgIiVzICVzIHNwZWVkICVzVVNCIGRldmljZSB1c2luZyAlcyBhbmQgYWRkcmVzcyAlZFxuIiwKKwkJICAodWRldi0+Y29uZmlnKSA/ICJyZXNldCIgOiAibmV3Iiwgc3BlZWQsIHR5cGUsCisJCSAgdWRldi0+YnVzLT5jb250cm9sbGVyLT5kcml2ZXItPm5hbWUsIHVkZXYtPmRldm51bSk7CiAKIAkvKiBTZXQgdXAgVFQgcmVjb3JkcywgaWYgbmVlZGVkICAqLwogCWlmIChoZGV2LT50dCkgewpAQCAtMjMxNyw2ICsyMTQ3LDggQEAKIAkJCSAqIGRvd24gdHJlbWVuZG91c2x5IGJ5IE5BS2luZyB0aGUgdW5leHBlY3RlZGx5CiAJCQkgKiBlYXJseSBzdGF0dXMgc3RhZ2UuICBBbHNvLCByZXRyeSBvbiBhbGwgZXJyb3JzOwogCQkJICogc29tZSBkZXZpY2VzIGFyZSBmbGFrZXkuCisJCQkgKiAyNTUgaXMgZm9yIFdVU0IgZGV2aWNlcywgd2UgYWN0dWFsbHkgbmVlZCB0byB1c2UgNTEyLgorCQkJICogV1VTQjEuMFs0LjguMV0uCiAJCQkgKi8KIAkJCWZvciAoaiA9IDA7IGogPCAzOyArK2opIHsKIAkJCQlidWYtPmJNYXhQYWNrZXRTaXplMCA9IDA7CkBAIC0yMzI2LDcgKzIxNTgsNyBAQAogCQkJCQlidWYsIEdFVF9ERVNDUklQVE9SX0JVRlNJWkUsCiAJCQkJCShpID8gVVNCX0NUUkxfR0VUX1RJTUVPVVQgOiAxMDAwKSk7CiAJCQkJc3dpdGNoIChidWYtPmJNYXhQYWNrZXRTaXplMCkgewotCQkJCWNhc2UgODogY2FzZSAxNjogY2FzZSAzMjogY2FzZSA2NDoKKwkJCQljYXNlIDg6IGNhc2UgMTY6IGNhc2UgMzI6IGNhc2UgNjQ6IGNhc2UgMjU1OgogCQkJCQlpZiAoYnVmLT5iRGVzY3JpcHRvclR5cGUgPT0KIAkJCQkJCQlVU0JfRFRfREVWSUNFKSB7CiAJCQkJCQlyID0gMDsKQEAgLTI0MDAsNyArMjIzMiw4IEBACiAJaWYgKHJldHZhbCkKIAkJZ290byBmYWlsOwogCi0JaSA9IHVkZXYtPmRlc2NyaXB0b3IuYk1heFBhY2tldFNpemUwOworCWkgPSB1ZGV2LT5kZXNjcmlwdG9yLmJNYXhQYWNrZXRTaXplMCA9PSAweGZmPworCSAgICA1MTIgOiB1ZGV2LT5kZXNjcmlwdG9yLmJNYXhQYWNrZXRTaXplMDsKIAlpZiAobGUxNl90b19jcHUodWRldi0+ZXAwLmRlc2Mud01heFBhY2tldFNpemUpICE9IGkpIHsKIAkJaWYgKHVkZXYtPnNwZWVkICE9IFVTQl9TUEVFRF9GVUxMIHx8CiAJCQkJIShpID09IDggfHwgaSA9PSAxNiB8fCBpID09IDMyIHx8IGkgPT0gNjQpKSB7CkBAIC0yNTg1LDYgKzI0MTgsNyBAQAogCQl1c2Jfc2V0X2RldmljZV9zdGF0ZSh1ZGV2LCBVU0JfU1RBVEVfUE9XRVJFRCk7CiAJCXVkZXYtPnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CiAgCQl1ZGV2LT5idXNfbUEgPSBodWItPm1BX3Blcl9wb3J0OworCQl1ZGV2LT5sZXZlbCA9IGhkZXYtPmxldmVsICsgMTsKIAogCQkvKiBzZXQgdGhlIGFkZHJlc3MgKi8KIAkJY2hvb3NlX2FkZHJlc3ModWRldik7CkBAIC0yNzM2LDE3ICsyNTcwLDYgQEAKIAkJdXNiX2dldF9pbnRmKGludGYpOwogCQlzcGluX3VubG9ja19pcnEoJmh1Yl9ldmVudF9sb2NrKTsKIAotCQkvKiBJcyB0aGlzIGlzIGEgcm9vdCBodWIgd2FudGluZyB0byByZWFjdGl2YXRlIHRoZSBkb3duc3RyZWFtCi0JCSAqIHBvcnRzPyAgSWYgc28sIGJlIHN1cmUgdGhlIGludGVyZmFjZSByZXN1bWVzIGV2ZW4gaWYgaXRzCi0JCSAqIHN0dWIgImRldmljZSIgbm9kZSB3YXMgbmV2ZXIgc3VzcGVuZGVkLgotCQkgKi8KLQkJaWYgKGkpIHsKLQkJCWRwbV9ydW50aW1lX3Jlc3VtZSgmaGRldi0+ZGV2KTsKLQkJCWRwbV9ydW50aW1lX3Jlc3VtZSgmaW50Zi0+ZGV2KTsKLQkJCXVzYl9wdXRfaW50ZihpbnRmKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KIAkJLyogTG9jayB0aGUgZGV2aWNlLCB0aGVuIGNoZWNrIHRvIHNlZSBpZiB3ZSB3ZXJlCiAJCSAqIGRpc2Nvbm5lY3RlZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgbG9jayB0byBzdWNjZWVkLiAqLwogCQlpZiAobG9ja3RyZWUoaGRldikgPCAwKSB7CkBAIC0yNzYzLDYgKzI1ODYsMTMgQEAKIAkJCWdvdG8gbG9vcDsKIAkJfQogCisJCS8qIElzIHRoaXMgaXMgYSByb290IGh1YiB3YW50aW5nIHRvIHJlYWN0aXZhdGUgdGhlIGRvd25zdHJlYW0KKwkJICogcG9ydHM/ICBJZiBzbywgYmUgc3VyZSB0aGUgaW50ZXJmYWNlIHJlc3VtZXMgZXZlbiBpZiBpdHMKKwkJICogc3R1YiAiZGV2aWNlIiBub2RlIHdhcyBuZXZlciBzdXNwZW5kZWQuCisJCSAqLworCQlpZiAoaSkKKwkJCXVzYl9hdXRvcmVzdW1lX2RldmljZShoZGV2LCAwKTsKKwogCQkvKiBJZiB0aGlzIGlzIGFuIGluYWN0aXZlIG9yIHN1c3BlbmRlZCBodWIsIGRvIG5vdGhpbmcgKi8KIAkJaWYgKGh1Yi0+cXVpZXNjaW5nKQogCQkJZ290byBsb29wOwpAQCAtMjkwMCw3ICsyNzMwLDcgQEAKIAogCQkvKiBJZiB0aGlzIGlzIGEgcm9vdCBodWIsIHRlbGwgdGhlIEhDRCBpdCdzIG9rYXkgdG8KIAkJICogcmUtZW5hYmxlIHBvcnQtY2hhbmdlIGludGVycnVwdHMgbm93LiAqLwotCQlpZiAoIWhkZXYtPnBhcmVudCkKKwkJaWYgKCFoZGV2LT5wYXJlbnQgJiYgIWh1Yi0+YnVzeV9iaXRzWzBdKQogCQkJdXNiX2VuYWJsZV9yb290X2h1Yl9pcnEoaGRldi0+YnVzKTsKIAogbG9vcDoKQEAgLTMwNzUsNiArMjkwNSw5IEBACiAJCQlicmVhazsKIAl9CiAJY2xlYXJfYml0KHBvcnQxLCBwYXJlbnRfaHViLT5idXN5X2JpdHMpOworCWlmICghcGFyZW50X2hkZXYtPnBhcmVudCAmJiAhcGFyZW50X2h1Yi0+YnVzeV9iaXRzWzBdKQorCQl1c2JfZW5hYmxlX3Jvb3RfaHViX2lycShwYXJlbnRfaGRldi0+YnVzKTsKKwogCWlmIChyZXQgPCAwKQogCQlnb3RvIHJlX2VudW1lcmF0ZTsKICAKQEAgLTMxMjgsNiArMjk2MSw3IEBACiAJaHViX3BvcnRfbG9naWNhbF9kaXNjb25uZWN0KHBhcmVudF9odWIsIHBvcnQxKTsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KK0VYUE9SVF9TWU1CT0wodXNiX3Jlc2V0X2RldmljZSk7CiAKIC8qKgogICogdXNiX3Jlc2V0X2NvbXBvc2l0ZV9kZXZpY2UgLSB3YXJuIGludGVyZmFjZSBkcml2ZXJzIGFuZCBwZXJmb3JtIGEgVVNCIHBvcnQgcmVzZXQKQEAgLTMxNjMsNiArMjk5Nyw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qIFByZXZlbnQgYXV0b3N1c3BlbmQgZHVyaW5nIHRoZSByZXNldCAqLworCXVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2LCAxKTsKKwogCWlmIChpZmFjZSAmJiBpZmFjZS0+Y29uZGl0aW9uICE9IFVTQl9JTlRFUkZBQ0VfQklORElORykKIAkJaWZhY2UgPSBOVUxMOwogCkBAIC0zMjA0LDUgKzMwNDEsNyBAQAogCQl9CiAJfQogCisJdXNiX2F1dG9zdXNwZW5kX2RldmljZSh1ZGV2LCAxKTsKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTCh1c2JfcmVzZXRfY29tcG9zaXRlX2RldmljZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oIGIvZHJpdmVycy91c2IvY29yZS9odWIuaAppbmRleCAyOWQ1ZjQ1Li4wZjhlODJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5oCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaHViLmgKQEAgLTIxMiw3ICsyMTIsOCBAQAogCXVuc2lnbmVkIGxvbmcJCWV2ZW50X2JpdHNbMV07CS8qIHN0YXR1cyBjaGFuZ2UgYml0bWFzayAqLwogCXVuc2lnbmVkIGxvbmcJCWNoYW5nZV9iaXRzWzFdOwkvKiBwb3J0cyB3aXRoIGxvZ2ljYWwgY29ubmVjdAogCQkJCQkJCXN0YXR1cyBjaGFuZ2UgKi8KLQl1bnNpZ25lZCBsb25nCQlidXN5X2JpdHNbMV07CS8qIHBvcnRzIGJlaW5nIHJlc2V0ICovCisJdW5zaWduZWQgbG9uZwkJYnVzeV9iaXRzWzFdOwkvKiBwb3J0cyBiZWluZyByZXNldCBvcgorCQkJCQkJCXJlc3VtZWQgKi8KICNpZiBVU0JfTUFYQ0hJTERSRU4gPiAzMSAvKiA4KnNpemVvZih1bnNpZ25lZCBsb25nKSAtIDEgKi8KICNlcnJvciBldmVudF9iaXRzW10gaXMgdG9vIHNob3J0IQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMKaW5kZXggMzE4MmMyMi4uZGYzZDE1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYwpAQCAtNDQsNyArNDQsNyBAQAogI2luY2x1ZGUgImhjZC5oIgogCiBzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgdXNiZnNfb3BzOwotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVmYXVsdF9maWxlX29wZXJhdGlvbnM7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWZhdWx0X2ZpbGVfb3BlcmF0aW9uczsKIHN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnVzYmZzX21vdW50Owogc3RhdGljIGludCB1c2Jmc19tb3VudF9jb3VudDsJLyogPSAwICovCiBzdGF0aWMgaW50IGlnbm9yZV9tb3VudCA9IDA7CkBAIC0yNDksNyArMjQ5LDYgQEAKIAkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOwogCQlpbm9kZS0+aV9naWQgPSBjdXJyZW50LT5mc2dpZDsKLQkJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKQEAgLTQwMiwxMyArNDAxLDEzIEBACiAKIHN0YXRpYyBpbnQgZGVmYXVsdF9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlpZiAoaW5vZGUtPnUuZ2VuZXJpY19pcCkKLQkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPnUuZ2VuZXJpY19pcDsKKwlpZiAoaW5vZGUtPmlfcHJpdmF0ZSkKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWZhdWx0X2ZpbGVfb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlZmF1bHRfZmlsZV9vcGVyYXRpb25zID0gewogCS5yZWFkID0JCWRlZmF1bHRfcmVhZF9maWxlLAogCS53cml0ZSA9CWRlZmF1bHRfd3JpdGVfZmlsZSwKIAkub3BlbiA9CQlkZWZhdWx0X29wZW4sCkBAIC00OTUsNyArNDk0LDcgQEAKIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmZzX2NyZWF0ZV9maWxlIChjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKIAkJCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHZvaWQgKmRhdGEsCi0JCQkJICAgICAgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcywKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzLAogCQkJCSAgICAgIHVpZF90IHVpZCwgZ2lkX3QgZ2lkKQogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKQEAgLTUwOSw3ICs1MDgsNyBAQAogCX0gZWxzZSB7CiAJCWlmIChkZW50cnktPmRfaW5vZGUpIHsKIAkJCWlmIChkYXRhKQotCQkJCWRlbnRyeS0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwID0gZGF0YTsKKwkJCQlkZW50cnktPmRfaW5vZGUtPmlfcHJpdmF0ZSA9IGRhdGE7CiAJCQlpZiAoZm9wcykKIAkJCQlkZW50cnktPmRfaW5vZGUtPmlfZm9wID0gZm9wczsKIAkJCWRlbnRyeS0+ZF9pbm9kZS0+aV91aWQgPSB1aWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL21lc3NhZ2UuYyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCmluZGV4IDRjYzhkM2UuLjg1YjFjZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvbWVzc2FnZS5jCkBAIC0yMyw1OSArMjMsNDQgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCB0aW1lb3V0X2tpbGwodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCB1cmIJKnVyYiA9IChzdHJ1Y3QgdXJiICopIGRhdGE7Ci0KLQl1c2JfdW5saW5rX3VyYih1cmIpOwotfQotCi0vLyBTdGFydHMgdXJiIGFuZCB3YWl0cyBmb3IgY29tcGxldGlvbiBvciB0aW1lb3V0Ci0vLyBub3RlIHRoYXQgdGhpcyBjYWxsIGlzIE5PVCBpbnRlcnJ1cHRpYmxlLCB3aGlsZQotLy8gbWFueSBkZXZpY2UgZHJpdmVyIGkvbyByZXF1ZXN0cyBzaG91bGQgYmUgaW50ZXJydXB0aWJsZQotc3RhdGljIGludCB1c2Jfc3RhcnRfd2FpdF91cmIoc3RydWN0IHVyYiAqdXJiLCBpbnQgdGltZW91dCwgaW50KiBhY3R1YWxfbGVuZ3RoKQorLyoKKyAqIFN0YXJ0cyB1cmIgYW5kIHdhaXRzIGZvciBjb21wbGV0aW9uIG9yIHRpbWVvdXQuIE5vdGUgdGhhdCB0aGlzIGNhbGwKKyAqIGlzIE5PVCBpbnRlcnJ1cHRpYmxlLiBNYW55IGRldmljZSBkcml2ZXIgaS9vIHJlcXVlc3RzIHNob3VsZCBiZQorICogaW50ZXJydXB0aWJsZSBhbmQgdGhlcmVmb3JlIHRoZXNlIGRyaXZlcnMgc2hvdWxkIGltcGxlbWVudCB0aGVpcgorICogb3duIGludGVycnVwdGlibGUgcm91dGluZXMuCisgKi8KK3N0YXRpYyBpbnQgdXNiX3N0YXJ0X3dhaXRfdXJiKHN0cnVjdCB1cmIgKnVyYiwgaW50IHRpbWVvdXQsIGludCAqYWN0dWFsX2xlbmd0aCkKIHsgCi0Jc3RydWN0IGNvbXBsZXRpb24JZG9uZTsKLQlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKLQlpbnQJCQlzdGF0dXM7CisJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZTsKKwlpbnQgc3RhdHVzOwogCiAJaW5pdF9jb21wbGV0aW9uKCZkb25lKTsgCQogCXVyYi0+Y29udGV4dCA9ICZkb25lOwogCXVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CiAJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfTk9JTyk7CisJaWYgKHVubGlrZWx5KHN0YXR1cykpCisJCWdvdG8gb3V0OwogCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCWlmICh0aW1lb3V0ID4gMCkgewotCQkJaW5pdF90aW1lcigmdGltZXIpOwotCQkJdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpOwotCQkJdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXVyYjsKLQkJCXRpbWVyLmZ1bmN0aW9uID0gdGltZW91dF9raWxsOwotCQkJLyogZ3JyLiAgdGltZW91dCBfc2hvdWxkXyBpbmNsdWRlIHN1Ym1pdCBkZWxheXMuICovCi0JCQlhZGRfdGltZXIoJnRpbWVyKTsKLQkJfQotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkb25lKTsKKwlleHBpcmUgPSB0aW1lb3V0ID8gbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSA6IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkb25lLCBleHBpcmUpKSB7CisKKwkJZGV2X2RiZygmdXJiLT5kZXYtPmRldiwKKwkJCSIlcyB0aW1lZCBvdXQgb24gZXAlZCVzIGxlbj0lZC8lZFxuIiwKKwkJCWN1cnJlbnQtPmNvbW0sCisJCQl1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSksCisJCQl1c2JfcGlwZWluKHVyYi0+cGlwZSkgPyAiaW4iIDogIm91dCIsCisJCQl1cmItPmFjdHVhbF9sZW5ndGgsCisJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpOworCisJCXVzYl9raWxsX3VyYih1cmIpOworCQlzdGF0dXMgPSB1cmItPnN0YXR1cyA9PSAtRU5PRU5UID8gLUVUSU1FRE9VVCA6IHVyYi0+c3RhdHVzOworCX0gZWxzZQogCQlzdGF0dXMgPSB1cmItPnN0YXR1czsKLQkJLyogbm90ZTogIEhDRHMgcmV0dXJuIEVUSU1FRE9VVCBmb3Igb3RoZXIgcmVhc29ucyB0b28gKi8KLQkJaWYgKHN0YXR1cyA9PSAtRUNPTk5SRVNFVCkgewotCQkJZGV2X2RiZygmdXJiLT5kZXYtPmRldiwKLQkJCQkiJXMgdGltZWQgb3V0IG9uIGVwJWQlcyBsZW49JWQvJWRcbiIsCi0JCQkJY3VycmVudC0+Y29tbSwKLQkJCQl1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSksCi0JCQkJdXNiX3BpcGVpbih1cmItPnBpcGUpID8gImluIiA6ICJvdXQiLAotCQkJCXVyYi0+YWN0dWFsX2xlbmd0aCwKLQkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgKLQkJCQkpOwotCQkJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApCi0JCQkJc3RhdHVzID0gMDsKLQkJCWVsc2UKLQkJCQlzdGF0dXMgPSAtRVRJTUVET1VUOwotCQl9Ci0JCWlmICh0aW1lb3V0ID4gMCkKLQkJCWRlbF90aW1lcl9zeW5jKCZ0aW1lcik7Ci0JfQotCitvdXQ6CiAJaWYgKGFjdHVhbF9sZW5ndGgpCiAJCSphY3R1YWxfbGVuZ3RoID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCiAJdXNiX2ZyZWVfdXJiKHVyYik7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTI2Myw3ICsyNDgsNyBAQAogCiBzdGF0aWMgdm9pZCBzZ19jb21wbGV0ZSAoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgdXNiX3NnX3JlcXVlc3QJKmlvID0gKHN0cnVjdCB1c2Jfc2dfcmVxdWVzdCAqKSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHVzYl9zZ19yZXF1ZXN0CSppbyA9IHVyYi0+Y29udGV4dDsKIAogCXNwaW5fbG9jayAoJmlvLT5sb2NrKTsKIApAQCAtOTk5LDggKzk4NCw4IEBACiAJCWVwID0gZGV2LT5lcF9pbltlcG51bV07CiAJCWRldi0+ZXBfaW5bZXBudW1dID0gTlVMTDsKIAl9Ci0JaWYgKGVwICYmIGRldi0+YnVzICYmIGRldi0+YnVzLT5vcCAmJiBkZXYtPmJ1cy0+b3AtPmRpc2FibGUpCi0JCWRldi0+YnVzLT5vcC0+ZGlzYWJsZShkZXYsIGVwKTsKKwlpZiAoZXAgJiYgZGV2LT5idXMpCisJCXVzYl9oY2RfZW5kcG9pbnRfZGlzYWJsZShkZXYsIGVwKTsKIH0KIAogLyoqCkBAIC0xMzgxLDkgKzEzNjYsNiBAQAogCWlmIChjcCAmJiBjb25maWd1cmF0aW9uID09IDApCiAJCWRldl93YXJuKCZkZXYtPmRldiwgImNvbmZpZyAwIGRlc2NyaXB0b3I/P1xuIik7CiAKLQlpZiAoZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKQotCQlyZXR1cm4gLUVIT1NUVU5SRUFDSDsKLQogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IGludGVyZmFjZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UsCiAJICogc28gdGhhdCBpZiB3ZSBydW4gb3V0IHRoZW4gbm90aGluZyB3aWxsIGhhdmUgY2hhbmdlZC4gKi8KIAluID0gbmludGYgPSAwOwpAQCAtMTQxOCw2ICsxNDAwLDExIEBACiAJCQkJCWNvbmZpZ3VyYXRpb24sIC1pKTsKIAl9CiAKKwkvKiBXYWtlIHVwIHRoZSBkZXZpY2Ugc28gd2UgY2FuIHNlbmQgaXQgdGhlIFNldC1Db25maWcgcmVxdWVzdCAqLworCXJldCA9IHVzYl9hdXRvcmVzdW1lX2RldmljZShkZXYsIDEpOworCWlmIChyZXQpCisJCWdvdG8gZnJlZV9pbnRlcmZhY2VzOworCiAJLyogaWYgaXQncyBhbHJlYWR5IGNvbmZpZ3VyZWQsIGNsZWFyIG91dCBvbGQgc3RhdGUgZmlyc3QuCiAJICogZ2V0dGluZyByaWQgb2Ygb2xkIGludGVyZmFjZXMgbWVhbnMgdW5iaW5kaW5nIHRoZWlyIGRyaXZlcnMuCiAJICovCkBAIC0xNDM3LDYgKzE0MjQsNyBAQAogCWRldi0+YWN0Y29uZmlnID0gY3A7CiAJaWYgKCFjcCkgewogCQl1c2Jfc2V0X2RldmljZV9zdGF0ZShkZXYsIFVTQl9TVEFURV9BRERSRVNTKTsKKwkJdXNiX2F1dG9zdXNwZW5kX2RldmljZShkZXYsIDEpOwogCQlnb3RvIGZyZWVfaW50ZXJmYWNlczsKIAl9CiAJdXNiX3NldF9kZXZpY2Vfc3RhdGUoZGV2LCBVU0JfU1RBVEVfQ09ORklHVVJFRCk7CkBAIC0xNTA1LDkgKzE0OTMsNjkgQEAKIAkJdXNiX2NyZWF0ZV9zeXNmc19pbnRmX2ZpbGVzIChpbnRmKTsKIAl9CiAKKwl1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKGRldiwgMSk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBzZXRfY29uZmlnX3JlcXVlc3QgeworCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2OworCWludAkJCWNvbmZpZzsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKK307CisKKy8qIFdvcmtlciByb3V0aW5lIGZvciB1c2JfZHJpdmVyX3NldF9jb25maWd1cmF0aW9uKCkgKi8KK3N0YXRpYyB2b2lkIGRyaXZlcl9zZXRfY29uZmlnX3dvcmsodm9pZCAqX3JlcSkKK3sKKwlzdHJ1Y3Qgc2V0X2NvbmZpZ19yZXF1ZXN0ICpyZXEgPSBfcmVxOworCisJdXNiX2xvY2tfZGV2aWNlKHJlcS0+dWRldik7CisJdXNiX3NldF9jb25maWd1cmF0aW9uKHJlcS0+dWRldiwgcmVxLT5jb25maWcpOworCXVzYl91bmxvY2tfZGV2aWNlKHJlcS0+dWRldik7CisJdXNiX3B1dF9kZXYocmVxLT51ZGV2KTsKKwlrZnJlZShyZXEpOworfQorCisvKioKKyAqIHVzYl9kcml2ZXJfc2V0X2NvbmZpZ3VyYXRpb24gLSBQcm92aWRlIGEgd2F5IGZvciBkcml2ZXJzIHRvIGNoYW5nZSBkZXZpY2UgY29uZmlndXJhdGlvbnMKKyAqIEB1ZGV2OiB0aGUgZGV2aWNlIHdob3NlIGNvbmZpZ3VyYXRpb24gaXMgYmVpbmcgdXBkYXRlZAorICogQGNvbmZpZzogdGhlIGNvbmZpZ3VyYXRpb24gYmVpbmcgY2hvc2VuLgorICogQ29udGV4dDogSW4gcHJvY2VzcyBjb250ZXh0LCBtdXN0IGJlIGFibGUgdG8gc2xlZXAKKyAqCisgKiBEZXZpY2UgaW50ZXJmYWNlIGRyaXZlcnMgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSBkZXZpY2UgY29uZmlndXJhdGlvbnMuCisgKiBUaGlzIGlzIGJlY2F1c2UgY2hhbmdpbmcgY29uZmlndXJhdGlvbnMgd2lsbCBkZXN0cm95IHRoZSBpbnRlcmZhY2UgdGhlCisgKiBkcml2ZXIgaXMgYm91bmQgdG8gYW5kIGNyZWF0ZSBuZXcgb25lczsgaXQgd291bGQgYmUgbGlrZSBhIGZsb3BweS1kaXNrCisgKiBkcml2ZXIgdGVsbGluZyB0aGUgY29tcHV0ZXIgdG8gcmVwbGFjZSB0aGUgZmxvcHB5LWRpc2sgZHJpdmUgd2l0aCBhCisgKiB0YXBlIGRyaXZlIQorICoKKyAqIFN0aWxsLCBpbiBjZXJ0YWluIHNwZWNpYWxpemVkIGNpcmN1bXN0YW5jZXMgdGhlIG5lZWQgbWF5IGFyaXNlLiAgVGhpcworICogcm91dGluZSBnZXRzIGFyb3VuZCB0aGUgbm9ybWFsIHJlc3RyaWN0aW9ucyBieSB1c2luZyBhIHdvcmsgdGhyZWFkIHRvCisgKiBzdWJtaXQgdGhlIGNoYW5nZS1jb25maWcgcmVxdWVzdC4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc2Z1bGx5IHF1ZXVlZCwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKiBUaGUgY2FsbGVyIGhhcyBubyB3YXkgdG8ga25vdyB3aGV0aGVyIHRoZSBxdWV1ZWQgcmVxdWVzdCB3aWxsIGV2ZW50dWFsbHkKKyAqIHN1Y2NlZWQuCisgKi8KK2ludCB1c2JfZHJpdmVyX3NldF9jb25maWd1cmF0aW9uKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBpbnQgY29uZmlnKQoreworCXN0cnVjdCBzZXRfY29uZmlnX3JlcXVlc3QgKnJlcTsKKworCXJlcSA9IGttYWxsb2Moc2l6ZW9mKCpyZXEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmVxLT51ZGV2ID0gdWRldjsKKwlyZXEtPmNvbmZpZyA9IGNvbmZpZzsKKwlJTklUX1dPUksoJnJlcS0+d29yaywgZHJpdmVyX3NldF9jb25maWdfd29yaywgcmVxKTsKKworCXVzYl9nZXRfZGV2KHVkZXYpOworCWlmICghc2NoZWR1bGVfd29yaygmcmVxLT53b3JrKSkgeworCQl1c2JfcHV0X2Rldih1ZGV2KTsKKwkJa2ZyZWUocmVxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2RyaXZlcl9zZXRfY29uZmlndXJhdGlvbik7CisKIC8vIHN5bmNocm9ub3VzIHJlcXVlc3QgY29tcGxldGlvbiBtb2RlbAogRVhQT1JUX1NZTUJPTCh1c2JfY29udHJvbF9tc2cpOwogRVhQT1JUX1NZTUJPTCh1c2JfYnVsa19tc2cpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9ub3RpZnkuYyBiL2RyaXZlcnMvdXNiL2NvcmUvbm90aWZ5LmMKaW5kZXggYjA0MjY3Ni4uNmIzNjg5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9ub3RpZnkuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL25vdGlmeS5jCkBAIC01MCw4ICs1MCwxMSBAQAogCiB2b2lkIHVzYl9ub3RpZnlfcmVtb3ZlX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKIHsKKwkvKiBQcm90ZWN0IGFnYWluc3Qgc2ltdWx0YW5lb3VzIHVzYmZzIG9wZW4gKi8KKwltdXRleF9sb2NrKCZ1c2Jmc19tdXRleCk7CiAJYmxvY2tpbmdfbm90aWZpZXJfY2FsbF9jaGFpbigmdXNiX25vdGlmaWVyX2xpc3QsCiAJCQlVU0JfREVWSUNFX1JFTU9WRSwgdWRldik7CisJbXV0ZXhfdW5sb2NrKCZ1c2Jmc19tdXRleCk7CiB9CiAKIHZvaWQgdXNiX25vdGlmeV9hZGRfYnVzKHN0cnVjdCB1c2JfYnVzICp1YnVzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jIGIvZHJpdmVycy91c2IvY29yZS9zeXNmcy5jCmluZGV4IGRlYzk3M2EuLjU1ZDhmNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvc3lzZnMuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3N5c2ZzLmMKQEAgLTYwLDcgKzYwLDcgQEAKIHNldF9iQ29uZmlndXJhdGlvblZhbHVlIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzdHJ1Y3QgdXNiX2RldmljZQkqdWRldiA9IHVkZXYgPSB0b191c2JfZGV2aWNlIChkZXYpOworCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2ID0gdG9fdXNiX2RldmljZSAoZGV2KTsKIAlpbnQJCQljb25maWcsIHZhbHVlOwogCiAJaWYgKHNzY2FuZiAoYnVmLCAiJXUiLCAmY29uZmlnKSAhPSAxIHx8IGNvbmZpZyA+IDI1NSkKQEAgLTE4Niw2ICsxODYsNyBAQAogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGV2X2F0dHJzW10gPSB7CiAJLyogY3VycmVudCBjb25maWd1cmF0aW9uJ3MgYXR0cmlidXRlcyAqLworCSZkZXZfYXR0cl9jb25maWd1cmF0aW9uLmF0dHIsCiAJJmRldl9hdHRyX2JOdW1JbnRlcmZhY2VzLmF0dHIsCiAJJmRldl9hdHRyX2JDb25maWd1cmF0aW9uVmFsdWUuYXR0ciwKIAkmZGV2X2F0dHJfYm1BdHRyaWJ1dGVzLmF0dHIsCkBAIC0yMDksMjAgKzIxMCw0MCBAQAogCS5hdHRycyA9IGRldl9hdHRycywKIH07CiAKLXZvaWQgdXNiX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXMgKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQoraW50IHVzYl9jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ1ZGV2LT5kZXY7CisJaW50IHJldHZhbDsKIAotCXN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2LT5rb2JqLCAmZGV2X2F0dHJfZ3JwKTsKKwlyZXR2YWwgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmRldl9hdHRyX2dycCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKIAotCWlmICh1ZGV2LT5tYW51ZmFjdHVyZXIpCi0JCWRldmljZV9jcmVhdGVfZmlsZSAoZGV2LCAmZGV2X2F0dHJfbWFudWZhY3R1cmVyKTsKLQlpZiAodWRldi0+cHJvZHVjdCkKLQkJZGV2aWNlX2NyZWF0ZV9maWxlIChkZXYsICZkZXZfYXR0cl9wcm9kdWN0KTsKLQlpZiAodWRldi0+c2VyaWFsKQotCQlkZXZpY2VfY3JlYXRlX2ZpbGUgKGRldiwgJmRldl9hdHRyX3NlcmlhbCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlIChkZXYsICZkZXZfYXR0cl9jb25maWd1cmF0aW9uKTsKLQl1c2JfY3JlYXRlX2VwX2ZpbGVzKGRldiwgJnVkZXYtPmVwMCwgdWRldik7CisJaWYgKHVkZXYtPm1hbnVmYWN0dXJlcikgeworCQlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUgKGRldiwgJmRldl9hdHRyX21hbnVmYWN0dXJlcik7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVycm9yOworCX0KKwlpZiAodWRldi0+cHJvZHVjdCkgeworCQlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUgKGRldiwgJmRldl9hdHRyX3Byb2R1Y3QpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBlcnJvcjsKKwl9CisJaWYgKHVkZXYtPnNlcmlhbCkgeworCQlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUgKGRldiwgJmRldl9hdHRyX3NlcmlhbCk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVycm9yOworCX0KKwlyZXR2YWwgPSB1c2JfY3JlYXRlX2VwX2ZpbGVzKGRldiwgJnVkZXYtPmVwMCwgdWRldik7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcjsKKwlyZXR1cm4gMDsKK2Vycm9yOgorCXVzYl9yZW1vdmVfZXBfZmlsZXMoJnVkZXYtPmVwMCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX21hbnVmYWN0dXJlcik7CisJZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmRldl9hdHRyX3Byb2R1Y3QpOworCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9zZXJpYWwpOworCXJldHVybiByZXR2YWw7CiB9CiAKIHZvaWQgdXNiX3JlbW92ZV9zeXNmc19kZXZfZmlsZXMgKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2KQpAQCAtMjM4LDcgKzI1OSw2IEBACiAJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZkZXZfYXR0cl9wcm9kdWN0KTsKIAlpZiAodWRldi0+c2VyaWFsKQogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc2VyaWFsKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUgKGRldiwgJmRldl9hdHRyX2NvbmZpZ3VyYXRpb24pOwogfQogCiAvKiBJbnRlcmZhY2UgZmllbGRzICovCkBAIC0zNDAsMTggKzM2MCwyOCBAQAogCQl1c2JfcmVtb3ZlX2VwX2ZpbGVzKCZpZmFjZV9kZXNjLT5lbmRwb2ludFtpXSk7CiB9CiAKLXZvaWQgdXNiX2NyZWF0ZV9zeXNmc19pbnRmX2ZpbGVzIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK2ludCB1c2JfY3JlYXRlX3N5c2ZzX2ludGZfZmlsZXMoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwogCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdCA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCWludCByZXR2YWw7CiAKLQlzeXNmc19jcmVhdGVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAmaW50Zl9hdHRyX2dycCk7CisJcmV0dmFsID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJmludGZfYXR0cl9ncnApOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3I7CiAKIAlpZiAoYWx0LT5zdHJpbmcgPT0gTlVMTCkKIAkJYWx0LT5zdHJpbmcgPSB1c2JfY2FjaGVfc3RyaW5nKHVkZXYsIGFsdC0+ZGVzYy5pSW50ZXJmYWNlKTsKIAlpZiAoYWx0LT5zdHJpbmcpCi0JCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfaW50ZXJmYWNlKTsKKwkJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9pbnRlcmZhY2UpOwogCXVzYl9jcmVhdGVfaW50Zl9lcF9maWxlcyhpbnRmLCB1ZGV2KTsKKwlyZXR1cm4gMDsKK2Vycm9yOgorCWlmIChhbHQtPnN0cmluZykKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9pbnRlcmZhY2UpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmaW50Zi0+ZGV2LmtvYmosICZpbnRmX2F0dHJfZ3JwKTsKKwl1c2JfcmVtb3ZlX2ludGZfZXBfZmlsZXMoaW50Zik7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogdm9pZCB1c2JfcmVtb3ZlX3N5c2ZzX2ludGZfZmlsZXMgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91cmIuYyBiL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKaW5kZXggOTg2NDk4OC4uOTgwMWQwOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXJiLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS91cmIuYwpAQCAtNTcsNyArNTcsNyBAQAogewogCXN0cnVjdCB1cmIgKnVyYjsKIAotCXVyYiA9IChzdHJ1Y3QgdXJiICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHVyYikgKyAKKwl1cmIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXJiKSArCiAJCWlzb19wYWNrZXRzICogc2l6ZW9mKHN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yKSwKIAkJbWVtX2ZsYWdzKTsKIAlpZiAoIXVyYikgewpAQCAtMjIxLDcgKzIyMSw2IEBACiB7CiAJaW50CQkJcGlwZSwgdGVtcCwgbWF4OwogCXN0cnVjdCB1c2JfZGV2aWNlCSpkZXY7Ci0Jc3RydWN0IHVzYl9vcGVyYXRpb25zCSpvcDsKIAlpbnQJCQlpc19vdXQ7CiAKIAlpZiAoIXVyYiB8fCB1cmItPmhjcHJpdiB8fCAhdXJiLT5jb21wbGV0ZSkKQEAgLTIzMyw4ICsyMzIsNiBAQAogCWlmIChkZXYtPmJ1cy0+Y29udHJvbGxlci0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgIT0gUE1fRVZFTlRfT04KIAkJCXx8IGRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX1NVU1BFTkRFRCkKIAkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7Ci0JaWYgKCEob3AgPSBkZXYtPmJ1cy0+b3ApIHx8ICFvcC0+c3VibWl0X3VyYikKLQkJcmV0dXJuIC1FTk9ERVY7CiAKIAl1cmItPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKIAl1cmItPmFjdHVhbF9sZW5ndGggPSAwOwpAQCAtMzc2LDcgKzM3Myw3IEBACiAJCXVyYi0+aW50ZXJ2YWwgPSB0ZW1wOwogCX0KIAotCXJldHVybiBvcC0+c3VibWl0X3VyYiAodXJiLCBtZW1fZmxhZ3MpOworCXJldHVybiB1c2JfaGNkX3N1Ym1pdF91cmIgKHVyYiwgbWVtX2ZsYWdzKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTQ0MCw5ICs0MzcsOSBAQAogewogCWlmICghdXJiKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoISh1cmItPmRldiAmJiB1cmItPmRldi0+YnVzICYmIHVyYi0+ZGV2LT5idXMtPm9wKSkKKwlpZiAoISh1cmItPmRldiAmJiB1cmItPmRldi0+YnVzKSkKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JcmV0dXJuIHVyYi0+ZGV2LT5idXMtPm9wLT51bmxpbmtfdXJiKHVyYiwgLUVDT05OUkVTRVQpOworCXJldHVybiB1c2JfaGNkX3VubGlua191cmIodXJiLCAtRUNPTk5SRVNFVCk7CiB9CiAKIC8qKgpAQCAtNDY4LDEzICs0NjUsMTMgQEAKIHZvaWQgdXNiX2tpbGxfdXJiKHN0cnVjdCB1cmIgKnVyYikKIHsKIAltaWdodF9zbGVlcCgpOwotCWlmICghKHVyYiAmJiB1cmItPmRldiAmJiB1cmItPmRldi0+YnVzICYmIHVyYi0+ZGV2LT5idXMtPm9wKSkKKwlpZiAoISh1cmIgJiYgdXJiLT5kZXYgJiYgdXJiLT5kZXYtPmJ1cykpCiAJCXJldHVybjsKIAlzcGluX2xvY2tfaXJxKCZ1cmItPmxvY2spOwogCSsrdXJiLT5yZWplY3Q7CiAJc3Bpbl91bmxvY2tfaXJxKCZ1cmItPmxvY2spOwogCi0JdXJiLT5kZXYtPmJ1cy0+b3AtPnVubGlua191cmIodXJiLCAtRU5PRU5UKTsKKwl1c2JfaGNkX3VubGlua191cmIodXJiLCAtRU5PRU5UKTsKIAl3YWl0X2V2ZW50KHVzYl9raWxsX3VyYl9xdWV1ZSwgYXRvbWljX3JlYWQoJnVyYi0+dXNlX2NvdW50KSA9PSAwKTsKIAogCXNwaW5fbG9ja19pcnEoJnVyYi0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jIGIvZHJpdmVycy91c2IvY29yZS91c2IuYwppbmRleCAxODRjMjQ2Li42MGVmNGVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKQEAgLTY3LDcgKzY3LDggQEAKICAqIERvbid0IGNhbGwgdGhpcyBmdW5jdGlvbiB1bmxlc3MgeW91IGFyZSBib3VuZCB0byBvbmUgb2YgdGhlIGludGVyZmFjZXMKICAqIG9uIHRoaXMgZGV2aWNlIG9yIHlvdSBoYXZlIGxvY2tlZCB0aGUgZGV2aWNlIQogICovCi1zdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdXNiX2lmbnVtX3RvX2lmKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGlmbnVtKQorc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVzYl9pZm51bV90b19pZihjb25zdCBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAorCQkJCSAgICAgIHVuc2lnbmVkIGlmbnVtKQogewogCXN0cnVjdCB1c2JfaG9zdF9jb25maWcgKmNvbmZpZyA9IGRldi0+YWN0Y29uZmlnOwogCWludCBpOwpAQCAtMTAwLDggKzEwMSw4IEBACiAgKiBEb24ndCBjYWxsIHRoaXMgZnVuY3Rpb24gdW5sZXNzIHlvdSBhcmUgYm91bmQgdG8gdGhlIGludGYgaW50ZXJmYWNlCiAgKiBvciB5b3UgaGF2ZSBsb2NrZWQgdGhlIGRldmljZSEKICAqLwotc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAotCQl1bnNpZ25lZCBpbnQgYWx0bnVtKQorc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqdXNiX2FsdG51bV90b19hbHRzZXR0aW5nKGNvbnN0IHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAorCQkJCQkJICAgIHVuc2lnbmVkIGludCBhbHRudW0pCiB7CiAJaW50IGk7CiAKQEAgLTExMiw4NyArMTEzLDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotLyoqCi0gKiB1c2JfZHJpdmVyX2NsYWltX2ludGVyZmFjZSAtIGJpbmQgYSBkcml2ZXIgdG8gYW4gaW50ZXJmYWNlCi0gKiBAZHJpdmVyOiB0aGUgZHJpdmVyIHRvIGJlIGJvdW5kCi0gKiBAaWZhY2U6IHRoZSBpbnRlcmZhY2UgdG8gd2hpY2ggaXQgd2lsbCBiZSBib3VuZDsgbXVzdCBiZSBpbiB0aGUKLSAqCXVzYiBkZXZpY2UncyBhY3RpdmUgY29uZmlndXJhdGlvbgotICogQHByaXY6IGRyaXZlciBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGludGVyZmFjZQotICoKLSAqIFRoaXMgaXMgdXNlZCBieSB1c2IgZGV2aWNlIGRyaXZlcnMgdGhhdCBuZWVkIHRvIGNsYWltIG1vcmUgdGhhbiBvbmUKLSAqIGludGVyZmFjZSBvbiBhIGRldmljZSB3aGVuIHByb2JpbmcgKGF1ZGlvIGFuZCBhY20gYXJlIGN1cnJlbnQgZXhhbXBsZXMpLgotICogTm8gZGV2aWNlIGRyaXZlciBzaG91bGQgZGlyZWN0bHkgbW9kaWZ5IGludGVybmFsIHVzYl9pbnRlcmZhY2Ugb3IKLSAqIHVzYl9kZXZpY2Ugc3RydWN0dXJlIG1lbWJlcnMuCi0gKgotICogRmV3IGRyaXZlcnMgc2hvdWxkIG5lZWQgdG8gdXNlIHRoaXMgcm91dGluZSwgc2luY2UgdGhlIG1vc3QgbmF0dXJhbAotICogd2F5IHRvIGJpbmQgdG8gYW4gaW50ZXJmYWNlIGlzIHRvIHJldHVybiB0aGUgcHJpdmF0ZSBkYXRhIGZyb20KLSAqIHRoZSBkcml2ZXIncyBwcm9iZSgpIG1ldGhvZC4KLSAqCi0gKiBDYWxsZXJzIG11c3Qgb3duIHRoZSBkZXZpY2UgbG9jayBhbmQgdGhlIGRyaXZlciBtb2RlbCdzIHVzYl9idXNfdHlwZS5zdWJzeXMKLSAqIHdyaXRlbG9jay4gIFNvIGRyaXZlciBwcm9iZSgpIGVudHJpZXMgZG9uJ3QgbmVlZCBleHRyYSBsb2NraW5nLAotICogYnV0IG90aGVyIGNhbGwgY29udGV4dHMgbWF5IG5lZWQgdG8gZXhwbGljaXRseSBjbGFpbSB0aG9zZSBsb2Nrcy4KLSAqLwotaW50IHVzYl9kcml2ZXJfY2xhaW1faW50ZXJmYWNlKHN0cnVjdCB1c2JfZHJpdmVyICpkcml2ZXIsCi0JCQkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlLCB2b2lkKiBwcml2KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpZmFjZS0+ZGV2OwotCi0JaWYgKGRldi0+ZHJpdmVyKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JZGV2LT5kcml2ZXIgPSAmZHJpdmVyLT5kcml2ZXI7Ci0JdXNiX3NldF9pbnRmZGF0YShpZmFjZSwgcHJpdik7Ci0JaWZhY2UtPmNvbmRpdGlvbiA9IFVTQl9JTlRFUkZBQ0VfQk9VTkQ7Ci0JbWFya19hY3RpdmUoaWZhY2UpOwotCi0JLyogaWYgaW50ZXJmYWNlIHdhcyBhbHJlYWR5IGFkZGVkLCBiaW5kIG5vdzsgZWxzZSBsZXQKLQkgKiB0aGUgZnV0dXJlIGRldmljZV9hZGQoKSBiaW5kIGl0LCBieXBhc3NpbmcgcHJvYmUoKQotCSAqLwotCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZChkZXYpKQotCQlkZXZpY2VfYmluZF9kcml2ZXIoZGV2KTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIHVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2UgLSB1bmJpbmQgYSBkcml2ZXIgZnJvbSBhbiBpbnRlcmZhY2UKLSAqIEBkcml2ZXI6IHRoZSBkcml2ZXIgdG8gYmUgdW5ib3VuZAotICogQGlmYWNlOiB0aGUgaW50ZXJmYWNlIGZyb20gd2hpY2ggaXQgd2lsbCBiZSB1bmJvdW5kCi0gKgotICogVGhpcyBjYW4gYmUgdXNlZCBieSBkcml2ZXJzIHRvIHJlbGVhc2UgYW4gaW50ZXJmYWNlIHdpdGhvdXQgd2FpdGluZwotICogZm9yIHRoZWlyIGRpc2Nvbm5lY3QoKSBtZXRob2RzIHRvIGJlIGNhbGxlZC4gIEluIHR5cGljYWwgY2FzZXMgdGhpcwotICogYWxzbyBjYXVzZXMgdGhlIGRyaXZlciBkaXNjb25uZWN0KCkgbWV0aG9kIHRvIGJlIGNhbGxlZC4KLSAqCi0gKiBUaGlzIGNhbGwgaXMgc3luY2hyb25vdXMsIGFuZCBtYXkgbm90IGJlIHVzZWQgaW4gYW4gaW50ZXJydXB0IGNvbnRleHQuCi0gKiBDYWxsZXJzIG11c3Qgb3duIHRoZSBkZXZpY2UgbG9jayBhbmQgdGhlIGRyaXZlciBtb2RlbCdzIHVzYl9idXNfdHlwZS5zdWJzeXMKLSAqIHdyaXRlbG9jay4gIFNvIGRyaXZlciBkaXNjb25uZWN0KCkgZW50cmllcyBkb24ndCBuZWVkIGV4dHJhIGxvY2tpbmcsCi0gKiBidXQgb3RoZXIgY2FsbCBjb250ZXh0cyBtYXkgbmVlZCB0byBleHBsaWNpdGx5IGNsYWltIHRob3NlIGxvY2tzLgotICovCi12b2lkIHVzYl9kcml2ZXJfcmVsZWFzZV9pbnRlcmZhY2Uoc3RydWN0IHVzYl9kcml2ZXIgKmRyaXZlciwKLQkJCQkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpZmFjZS0+ZGV2OwotCi0JLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBkb24ndCByZWxlYXNlIHNvbWV0aGluZyB0aGF0J3Mgbm90IG91cnMgKi8KLQlpZiAoIWRldi0+ZHJpdmVyIHx8IGRldi0+ZHJpdmVyICE9ICZkcml2ZXItPmRyaXZlcikKLQkJcmV0dXJuOwotCi0JLyogZG9uJ3QgcmVsZWFzZSBmcm9tIHdpdGhpbiBkaXNjb25uZWN0KCkgKi8KLQlpZiAoaWZhY2UtPmNvbmRpdGlvbiAhPSBVU0JfSU5URVJGQUNFX0JPVU5EKQotCQlyZXR1cm47Ci0KLQkvKiBkb24ndCByZWxlYXNlIGlmIHRoZSBpbnRlcmZhY2UgaGFzbid0IGJlZW4gYWRkZWQgeWV0ICovCi0JaWYgKGRldmljZV9pc19yZWdpc3RlcmVkKGRldikpIHsKLQkJaWZhY2UtPmNvbmRpdGlvbiA9IFVTQl9JTlRFUkZBQ0VfVU5CSU5ESU5HOwotCQlkZXZpY2VfcmVsZWFzZV9kcml2ZXIoZGV2KTsKLQl9Ci0KLQlkZXYtPmRyaXZlciA9IE5VTEw7Ci0JdXNiX3NldF9pbnRmZGF0YShpZmFjZSwgTlVMTCk7Ci0JaWZhY2UtPmNvbmRpdGlvbiA9IFVTQl9JTlRFUkZBQ0VfVU5CT1VORDsKLQltYXJrX3F1aWVzY2VkKGlmYWNlKTsKLX0KLQogc3RydWN0IGZpbmRfaW50ZXJmYWNlX2FyZyB7CiAJaW50IG1pbm9yOwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CkBAIC0yMDQsNyArMTI0LDcgQEAKIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKIAogCS8qIGNhbid0IGxvb2sgYXQgdXNiIGRldmljZXMsIG9ubHkgaW50ZXJmYWNlcyAqLwotCWlmIChkZXYtPmRyaXZlciA9PSAmdXNiX2dlbmVyaWNfZHJpdmVyKQorCWlmIChpc191c2JfZGV2aWNlKGRldikpCiAJCXJldHVybiAwOwogCiAJaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKQEAgLTIyNywxMjcgKzE0NywxNiBAQAogc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVzYl9maW5kX2ludGVyZmFjZShzdHJ1Y3QgdXNiX2RyaXZlciAqZHJ2LCBpbnQgbWlub3IpCiB7CiAJc3RydWN0IGZpbmRfaW50ZXJmYWNlX2FyZyBhcmdiOworCWludCByZXR2YWw7CiAKIAlhcmdiLm1pbm9yID0gbWlub3I7CiAJYXJnYi5pbnRlcmZhY2UgPSBOVUxMOwotCWRyaXZlcl9mb3JfZWFjaF9kZXZpY2UoJmRydi0+ZHJpdmVyLCBOVUxMLCAmYXJnYiwgX19maW5kX2ludGVyZmFjZSk7CisJLyogZWF0IHRoZSBlcnJvciwgaXQgd2lsbCBiZSBpbiBhcmdiLmludGVyZmFjZSAqLworCXJldHZhbCA9IGRyaXZlcl9mb3JfZWFjaF9kZXZpY2UoJmRydi0+ZHJ2d3JhcC5kcml2ZXIsIE5VTEwsICZhcmdiLAorCQkJCQlfX2ZpbmRfaW50ZXJmYWNlKTsKIAlyZXR1cm4gYXJnYi5pbnRlcmZhY2U7CiB9CiAKLSNpZmRlZglDT05GSUdfSE9UUExVRwotCi0vKgotICogVGhpcyBzZW5kcyBhbiB1ZXZlbnQgdG8gdXNlcnNwYWNlLCB0eXBpY2FsbHkgaGVscGluZyB0byBsb2FkIGRyaXZlcgotICogb3Igb3RoZXIgbW9kdWxlcywgY29uZmlndXJlIHRoZSBkZXZpY2UsIGFuZCBtb3JlLiAgRHJpdmVycyBjYW4gcHJvdmlkZQotICogYSBNT0RVTEVfREVWSUNFX1RBQkxFIHRvIGhlbHAgd2l0aCBtb2R1bGUgbG9hZGluZyBzdWJ0YXNrcy4KLSAqCi0gKiBXZSdyZSBjYWxsZWQgZWl0aGVyIGZyb20ga2h1YmQgKHRoZSB0eXBpY2FsIGNhc2UpIG9yIGZyb20gcm9vdCBodWIKLSAqIChpbml0LCBrYXBtZCwgbW9kcHJvYmUsIHJtbW9kLCBldGMpLCBidXQgdGhlIGFnZW50cyBuZWVkIHRvIGhhbmRsZQotICogZGVsYXlzIGluIGV2ZW50IGRlbGl2ZXJ5LiAgVXNlIHN5c2ZzIChhbmQgREVWUEFUSCkgdG8gbWFrZSBzdXJlIHRoZQotICogZGV2aWNlIChhbmQgdGhpcyBjb25maWd1cmF0aW9uISkgYXJlIHN0aWxsIHByZXNlbnQuCi0gKi8KLXN0YXRpYyBpbnQgdXNiX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCi0JCSAgICAgIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQotewotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOwotCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2OwotCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKmFsdDsKLQlpbnQgaSA9IDA7Ci0JaW50IGxlbmd0aCA9IDA7Ci0KLQlpZiAoIWRldikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBkcml2ZXIgaXMgb2Z0ZW4gbnVsbCBoZXJlOyBkZXZfZGJnKCkgd291bGQgb29wcyAqLwotCXByX2RlYnVnICgidXNiICVzOiB1ZXZlbnRcbiIsIGRldi0+YnVzX2lkKTsKLQotCS8qIE11c3QgY2hlY2sgZHJpdmVyX2RhdGEgaGVyZSwgYXMgb24gcmVtb3ZlIGRyaXZlciBpcyBhbHdheXMgTlVMTCAqLwotCWlmICgoZGV2LT5kcml2ZXIgPT0gJnVzYl9nZW5lcmljX2RyaXZlcikgfHwgCi0JICAgIChkZXYtPmRyaXZlcl9kYXRhID09ICZ1c2JfZ2VuZXJpY19kcml2ZXJfZGF0YSkpCi0JCXJldHVybiAwOwotCi0JaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKLQl1c2JfZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldiAoaW50Zik7Ci0JYWx0ID0gaW50Zi0+Y3VyX2FsdHNldHRpbmc7Ci0KLQlpZiAodXNiX2Rldi0+ZGV2bnVtIDwgMCkgewotCQlwcl9kZWJ1ZyAoInVzYiAlczogYWxyZWFkeSBkZWxldGVkP1xuIiwgZGV2LT5idXNfaWQpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JaWYgKCF1c2JfZGV2LT5idXMpIHsKLQkJcHJfZGVidWcgKCJ1c2IgJXM6IGJ1cyByZW1vdmVkP1xuIiwgZGV2LT5idXNfaWQpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLSNpZmRlZglDT05GSUdfVVNCX0RFVklDRUZTCi0JLyogSWYgdGhpcyBpcyBhdmFpbGFibGUsIHVzZXJzcGFjZSBwcm9ncmFtcyBjYW4gZGlyZWN0bHkgcmVhZAotCSAqIGFsbCB0aGUgZGV2aWNlIGRlc2NyaXB0b3JzIHdlIGRvbid0IHRlbGwgdGhlbSBhYm91dC4gIE9yCi0JICogZXZlbiBhY3QgYXMgdXNlcm1vZGUgZHJpdmVycy4KLQkgKgotCSAqIEZJWE1FIHJlZHVjZSBoYXJkd2lyZWQgaW50ZWxsaWdlbmNlIGhlcmUKLQkgKi8KLQlpZiAoYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAotCQkJICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKLQkJCSAgICJERVZJQ0U9L3Byb2MvYnVzL3VzYi8lMDNkLyUwM2QiLAotCQkJICAgdXNiX2Rldi0+YnVzLT5idXNudW0sIHVzYl9kZXYtPmRldm51bSkpCi0JCXJldHVybiAtRU5PTUVNOwotI2VuZGlmCi0KLQkvKiBwZXItZGV2aWNlIGNvbmZpZ3VyYXRpb25zIGFyZSBjb21tb24gKi8KLQlpZiAoYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAotCQkJICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKLQkJCSAgICJQUk9EVUNUPSV4LyV4LyV4IiwKLQkJCSAgIGxlMTZfdG9fY3B1KHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAotCQkJICAgbGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLAotCQkJICAgbGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBjbGFzcy1iYXNlZCBkcml2ZXIgYmluZGluZyBtb2RlbHMgKi8KLQlpZiAoYWRkX3VldmVudF92YXIoZW52cCwgbnVtX2VudnAsICZpLAotCQkJICAgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJmxlbmd0aCwKLQkJCSAgICJUWVBFPSVkLyVkLyVkIiwKLQkJCSAgIHVzYl9kZXYtPmRlc2NyaXB0b3IuYkRldmljZUNsYXNzLAotCQkJICAgdXNiX2Rldi0+ZGVzY3JpcHRvci5iRGV2aWNlU3ViQ2xhc3MsCi0JCQkgICB1c2JfZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VQcm90b2NvbCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKLQkJCSAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCi0JCQkgICAiSU5URVJGQUNFPSVkLyVkLyVkIiwKLQkJCSAgIGFsdC0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MsCi0JCQkgICBhbHQtPmRlc2MuYkludGVyZmFjZVN1YkNsYXNzLAotCQkJICAgYWx0LT5kZXNjLmJJbnRlcmZhY2VQcm90b2NvbCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGFkZF91ZXZlbnRfdmFyKGVudnAsIG51bV9lbnZwLCAmaSwKLQkJCSAgIGJ1ZmZlciwgYnVmZmVyX3NpemUsICZsZW5ndGgsCi0JCQkgICAiTU9EQUxJQVM9dXNiOnYlMDRYcCUwNFhkJTA0WGRjJTAyWGRzYyUwMlhkcCUwMlhpYyUwMlhpc2MlMDJYaXAlMDJYIiwKLQkJCSAgIGxlMTZfdG9fY3B1KHVzYl9kZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAotCQkJICAgbGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpLAotCQkJICAgbGUxNl90b19jcHUodXNiX2Rldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpLAotCQkJICAgdXNiX2Rldi0+ZGVzY3JpcHRvci5iRGV2aWNlQ2xhc3MsCi0JCQkgICB1c2JfZGV2LT5kZXNjcmlwdG9yLmJEZXZpY2VTdWJDbGFzcywKLQkJCSAgIHVzYl9kZXYtPmRlc2NyaXB0b3IuYkRldmljZVByb3RvY29sLAotCQkJICAgYWx0LT5kZXNjLmJJbnRlcmZhY2VDbGFzcywKLQkJCSAgIGFsdC0+ZGVzYy5iSW50ZXJmYWNlU3ViQ2xhc3MsCi0JCQkgICBhbHQtPmRlc2MuYkludGVyZmFjZVByb3RvY29sKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllbnZwW2ldID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi0jZWxzZQotCi1zdGF0aWMgaW50IHVzYl91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICoqZW52cCwKLQkJCWludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCi17Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLSNlbmRpZgkvKiBDT05GSUdfSE9UUExVRyAqLwotCiAvKioKICAqIHVzYl9yZWxlYXNlX2RldiAtIGZyZWUgYSB1c2IgZGV2aWNlIHN0cnVjdHVyZSB3aGVuIGFsbCB1c2VycyBvZiBpdCBhcmUgZmluaXNoZWQuCiAgKiBAZGV2OiBkZXZpY2UgdGhhdCdzIGJlZW4gZGlzY29ubmVjdGVkCkBAIC0zNjEsMTQgKzE3MCwzMyBAQAogCiAJdWRldiA9IHRvX3VzYl9kZXZpY2UoZGV2KTsKIAorI2lmZGVmCUNPTkZJR19QTQorCWNhbmNlbF9kZWxheWVkX3dvcmsoJnVkZXYtPmF1dG9zdXNwZW5kKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworI2VuZGlmCiAJdXNiX2Rlc3Ryb3lfY29uZmlndXJhdGlvbih1ZGV2KTsKLQl1c2JfYnVzX3B1dCh1ZGV2LT5idXMpOworCXVzYl9wdXRfaGNkKGJ1c190b19oY2QodWRldi0+YnVzKSk7CiAJa2ZyZWUodWRldi0+cHJvZHVjdCk7CiAJa2ZyZWUodWRldi0+bWFudWZhY3R1cmVyKTsKIAlrZnJlZSh1ZGV2LT5zZXJpYWwpOwogCWtmcmVlKHVkZXYpOwogfQogCisjaWZkZWYJQ09ORklHX1BNCisKKy8qIHVzYl9hdXRvc3VzcGVuZF93b3JrIC0gY2FsbGJhY2sgcm91dGluZSB0byBhdXRvc3VzcGVuZCBhIFVTQiBkZXZpY2UgKi8KK3N0YXRpYyB2b2lkIHVzYl9hdXRvc3VzcGVuZF93b3JrKHZvaWQgKl91ZGV2KQoreworCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2ID0gX3VkZXY7CisKKwltdXRleF9sb2NrX25lc3RlZCgmdWRldi0+cG1fbXV0ZXgsIHVkZXYtPmxldmVsKTsKKwl1ZGV2LT5hdXRvX3BtID0gMTsKKwl1c2Jfc3VzcGVuZF9ib3RoKHVkZXYsIFBNU0dfU1VTUEVORCk7CisJbXV0ZXhfdW5sb2NrKCZ1ZGV2LT5wbV9tdXRleCk7Cit9CisKKyNlbmRpZgorCiAvKioKICAqIHVzYl9hbGxvY19kZXYgLSB1c2IgZGV2aWNlIGNvbnN0cnVjdG9yICh1c2Jjb3JlLWludGVybmFsKQogICogQHBhcmVudDogaHViIHRvIHdoaWNoIGRldmljZSBpcyBjb25uZWN0ZWQ7IG51bGwgdG8gYWxsb2NhdGUgYSByb290IGh1YgpAQCAtMzkwLDggKzIxOCw3IEBACiAJaWYgKCFkZXYpCiAJCXJldHVybiBOVUxMOwogCi0JYnVzID0gdXNiX2J1c19nZXQoYnVzKTsKLQlpZiAoIWJ1cykgeworCWlmICghdXNiX2dldF9oY2QoYnVzX3RvX2hjZChidXMpKSkgewogCQlrZnJlZShkZXYpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0zOTksMTEgKzIyNiwxMiBAQAogCWRldmljZV9pbml0aWFsaXplKCZkZXYtPmRldik7CiAJZGV2LT5kZXYuYnVzID0gJnVzYl9idXNfdHlwZTsKIAlkZXYtPmRldi5kbWFfbWFzayA9IGJ1cy0+Y29udHJvbGxlci0+ZG1hX21hc2s7Ci0JZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSAmdXNiX2dlbmVyaWNfZHJpdmVyX2RhdGE7Ci0JZGV2LT5kZXYuZHJpdmVyID0gJnVzYl9nZW5lcmljX2RyaXZlcjsKIAlkZXYtPmRldi5yZWxlYXNlID0gdXNiX3JlbGVhc2VfZGV2OwogCWRldi0+c3RhdGUgPSBVU0JfU1RBVEVfQVRUQUNIRUQ7CiAKKwkvKiBUaGlzIG1hZ2ljIGFzc2lnbm1lbnQgZGlzdGluZ3Vpc2hlcyBkZXZpY2VzIGZyb20gaW50ZXJmYWNlcyAqLworCWRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSAmdXNiX2dlbmVyaWNfZHJpdmVyOworCiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZXAwLnVyYl9saXN0KTsKIAlkZXYtPmVwMC5kZXNjLmJMZW5ndGggPSBVU0JfRFRfRU5EUE9JTlRfU0laRTsKIAlkZXYtPmVwMC5kZXNjLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVDsKQEAgLTQ0NCw2ICsyNzIsMTAgQEAKIAlkZXYtPnBhcmVudCA9IHBhcmVudDsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5maWxlbGlzdCk7CiAKKyNpZmRlZglDT05GSUdfUE0KKwltdXRleF9pbml0KCZkZXYtPnBtX211dGV4KTsKKwlJTklUX1dPUksoJmRldi0+YXV0b3N1c3BlbmQsIHVzYl9hdXRvc3VzcGVuZF93b3JrLCBkZXYpOworI2VuZGlmCiAJcmV0dXJuIGRldjsKIH0KIApAQCAtNTQ5LDcgKzM4MSw3IEBACiAgKiBjYXNlIHRoZSBkcml2ZXIgYWxyZWFkeSBvd25zIHRoZSBkZXZpY2UgbG9jay4pCiAgKi8KIGludCB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAotCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCiB7CiAJdW5zaWduZWQgbG9uZyBqaWZmaWVzX2V4cGlyZSA9IGppZmZpZXMgKyBIWjsKIApAQCAtNjcyLDcgKzUwNCwxMzkgQEAKICAqLwogaW50IHVzYl9nZXRfY3VycmVudF9mcmFtZV9udW1iZXIoc3RydWN0IHVzYl9kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gZGV2LT5idXMtPm9wLT5nZXRfZnJhbWVfbnVtYmVyIChkZXYpOworCXJldHVybiB1c2JfaGNkX2dldF9mcmFtZV9udW1iZXIgKGRldik7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2Rpcl9pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgSU4gZGlyZWN0aW9uCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIElOLCBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworaW50IHVzYl9lbmRwb2ludF9kaXJfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX0lOKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfZGlyX291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgT1VUIGRpcmVjdGlvbgorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBPVVQsIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitpbnQgdXNiX2VuZHBvaW50X2Rpcl9vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuICgoZXBkLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X3hmZXJfYnVsayAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgYnVsayB0cmFuc2ZlciB0eXBlCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIGJ1bGssIG90aGVyd2lzZSBpdCByZXR1cm5zIGZhbHNlLgorICovCitpbnQgdXNiX2VuZHBvaW50X3hmZXJfYnVsayhjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQorCQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfeGZlcl9pbnQgLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaGFzIGludGVycnVwdCB0cmFuc2ZlciB0eXBlCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBpcyBvZiB0eXBlIGludGVycnVwdCwgb3RoZXJ3aXNlIGl0IHJldHVybnMKKyAqIGZhbHNlLgorICovCitpbnQgdXNiX2VuZHBvaW50X3hmZXJfaW50KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAoKGVwZC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09CisJCVVTQl9FTkRQT0lOVF9YRkVSX0lOVCk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X3hmZXJfaXNvYyAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBoYXMgaXNvY2hyb25vdXMgdHJhbnNmZXIgdHlwZQorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaXMgb2YgdHlwZSBpc29jaHJvbm91cywgb3RoZXJ3aXNlIGl0IHJldHVybnMKKyAqIGZhbHNlLgorICovCitpbnQgdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gKChlcGQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PQorCQlVU0JfRU5EUE9JTlRfWEZFUl9JU09DKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfaXNfYnVsa19pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBidWxrIElOCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgYnVsayB0cmFuc2ZlciB0eXBlIGFuZCBJTiBkaXJlY3Rpb24sCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworaW50IHVzYl9lbmRwb2ludF9pc19idWxrX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfaW4oZXBkKSk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGJ1bGsgT1VUCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgYnVsayB0cmFuc2ZlciB0eXBlIGFuZCBPVVQgZGlyZWN0aW9uLAorICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KK2ludCB1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCit7CisJcmV0dXJuICh1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKSk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2lzX2ludF9pbiAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpbnRlcnJ1cHQgSU4KKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBpbnRlcnJ1cHQgdHJhbnNmZXIgdHlwZSBhbmQgSU4gZGlyZWN0aW9uLAorICogb3RoZXJ3aXNlIGl0IHJldHVybnMgZmFsc2UuCisgKi8KK2ludCB1c2JfZW5kcG9pbnRfaXNfaW50X2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpKTsKK30KKworLyoqCisgKiB1c2JfZW5kcG9pbnRfaXNfaW50X291dCAtIGNoZWNrIGlmIHRoZSBlbmRwb2ludCBpcyBpbnRlcnJ1cHQgT1VUCisgKiBAZXBkOiBlbmRwb2ludCB0byBiZSBjaGVja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbmRwb2ludCBoYXMgaW50ZXJydXB0IHRyYW5zZmVyIHR5cGUgYW5kIE9VVCBkaXJlY3Rpb24sCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworaW50IHVzYl9lbmRwb2ludF9pc19pbnRfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKSk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2lzX2lzb2NfaW4gLSBjaGVjayBpZiB0aGUgZW5kcG9pbnQgaXMgaXNvY2hyb25vdXMgSU4KKyAqIEBlcGQ6IGVuZHBvaW50IHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVuZHBvaW50IGhhcyBpc29jaHJvbm91cyB0cmFuc2ZlciB0eXBlIGFuZCBJTiBkaXJlY3Rpb24sCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworaW50IHVzYl9lbmRwb2ludF9pc19pc29jX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQoreworCXJldHVybiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlcGQpICYmIHVzYl9lbmRwb2ludF9kaXJfaW4oZXBkKSk7Cit9CisKKy8qKgorICogdXNiX2VuZHBvaW50X2lzX2lzb2Nfb3V0IC0gY2hlY2sgaWYgdGhlIGVuZHBvaW50IGlzIGlzb2Nocm9ub3VzIE9VVAorICogQGVwZDogZW5kcG9pbnQgdG8gYmUgY2hlY2tlZAorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW5kcG9pbnQgaGFzIGlzb2Nocm9ub3VzIHRyYW5zZmVyIHR5cGUgYW5kIE9VVCBkaXJlY3Rpb24sCisgKiBvdGhlcndpc2UgaXQgcmV0dXJucyBmYWxzZS4KKyAqLworaW50IHVzYl9lbmRwb2ludF9pc19pc29jX291dChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCkKK3sKKwlyZXR1cm4gKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXBkKSAmJiB1c2JfZW5kcG9pbnRfZGlyX291dChlcGQpKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTczNyw5ICs3MDEsOSBAQAogCWRtYV9hZGRyX3QgKmRtYQogKQogewotCWlmICghZGV2IHx8ICFkZXYtPmJ1cyB8fCAhZGV2LT5idXMtPm9wIHx8ICFkZXYtPmJ1cy0+b3AtPmJ1ZmZlcl9hbGxvYykKKwlpZiAoIWRldiB8fCAhZGV2LT5idXMpCiAJCXJldHVybiBOVUxMOwotCXJldHVybiBkZXYtPmJ1cy0+b3AtPmJ1ZmZlcl9hbGxvYyAoZGV2LT5idXMsIHNpemUsIG1lbV9mbGFncywgZG1hKTsKKwlyZXR1cm4gaGNkX2J1ZmZlcl9hbGxvYyAoZGV2LT5idXMsIHNpemUsIG1lbV9mbGFncywgZG1hKTsKIH0KIAogLyoqCkBAIC03NjAsOSArNzI0LDExIEBACiAJZG1hX2FkZHJfdCBkbWEKICkKIHsKLQlpZiAoIWRldiB8fCAhZGV2LT5idXMgfHwgIWRldi0+YnVzLT5vcCB8fCAhZGV2LT5idXMtPm9wLT5idWZmZXJfZnJlZSkKLQkgICAgCXJldHVybjsKLQlkZXYtPmJ1cy0+b3AtPmJ1ZmZlcl9mcmVlIChkZXYtPmJ1cywgc2l6ZSwgYWRkciwgZG1hKTsKKwlpZiAoIWRldiB8fCAhZGV2LT5idXMpCisJCXJldHVybjsKKwlpZiAoIWFkZHIpCisJCXJldHVybjsKKwloY2RfYnVmZmVyX2ZyZWUgKGRldi0+YnVzLCBzaXplLCBhZGRyLCBkbWEpOwogfQogCiAvKioKQEAgLTkxMSw4ICs4NzcsOCBAQAogICoKICAqIFJldmVyc2UgdGhlIGVmZmVjdCBvZiB0aGlzIGNhbGwgd2l0aCB1c2JfYnVmZmVyX3VubWFwX3NnKCkuCiAgKi8KLWludCB1c2JfYnVmZmVyX21hcF9zZyAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgcGlwZSwKLQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzKQoraW50IHVzYl9idWZmZXJfbWFwX3NnKGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHBpcGUsCisJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cykKIHsKIAlzdHJ1Y3QgdXNiX2J1cwkJKmJ1czsKIAlzdHJ1Y3QgZGV2aWNlCQkqY29udHJvbGxlcjsKQEAgLTk0Niw4ICs5MTIsOCBAQAogICogVXNlIHRoaXMgd2hlbiB5b3UgYXJlIHJlLXVzaW5nIGEgc2NhdHRlcmxpc3QncyBkYXRhIGJ1ZmZlcnMgZm9yCiAgKiBhbm90aGVyIFVTQiByZXF1ZXN0LgogICovCi12b2lkIHVzYl9idWZmZXJfZG1hc3luY19zZyAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgcGlwZSwKLQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5faHdfZW50cykKK3ZvaWQgdXNiX2J1ZmZlcl9kbWFzeW5jX3NnKGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHBpcGUsCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbl9od19lbnRzKQogewogCXN0cnVjdCB1c2JfYnVzCQkqYnVzOwogCXN0cnVjdCBkZXZpY2UJCSpjb250cm9sbGVyOwpAQCAtOTcyLDggKzkzOCw4IEBACiAgKgogICogUmV2ZXJzZXMgdGhlIGVmZmVjdCBvZiB1c2JfYnVmZmVyX21hcF9zZygpLgogICovCi12b2lkIHVzYl9idWZmZXJfdW5tYXBfc2cgKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHBpcGUsCi0JCXN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuX2h3X2VudHMpCit2b2lkIHVzYl9idWZmZXJfdW5tYXBfc2coY29uc3Qgc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgcGlwZSwKKwkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbl9od19lbnRzKQogewogCXN0cnVjdCB1c2JfYnVzCQkqYnVzOwogCXN0cnVjdCBkZXZpY2UJCSpjb250cm9sbGVyOwpAQCAtOTg4LDExNiArOTU0LDYgQEAKIAkJCXVzYl9waXBlaW4gKHBpcGUpID8gRE1BX0ZST01fREVWSUNFIDogRE1BX1RPX0RFVklDRSk7CiB9CiAKLXN0YXRpYyBpbnQgdmVyaWZ5X3N1c3BlbmRlZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnVudXNlZCkKLXsKLQlpZiAoZGV2LT5kcml2ZXIgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIChkZXYtPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX09OKSA/IC1FQlVTWSA6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgdXNiX2dlbmVyaWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQotewotCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRmOwotCXN0cnVjdCB1c2JfZHJpdmVyCSpkcml2ZXI7Ci0JaW50CQkJc3RhdHVzOwotCi0JLyogVVNCIGRldmljZXMgZW50ZXIgU1VTUEVORCBzdGF0ZSB0aHJvdWdoIHRoZWlyIGh1YnMsIGJ1dCBjYW4gYmUKLQkgKiBtYXJrZWQgZm9yIEZSRUVaRSBhcyBzb29uIGFzIHRoZWlyIGNoaWxkcmVuIGFyZSBhbHJlYWR5IGlkbGVkLgotCSAqIEJ1dCB0aG9zZSBzZW1hbnRpY3MgYXJlIHVzZWxlc3MsIHNvIHdlIGVxdWF0ZSB0aGUgdHdvIChzaWdoKS4KLQkgKi8KLQlpZiAoZGV2LT5kcml2ZXIgPT0gJnVzYl9nZW5lcmljX2RyaXZlcikgewotCQlpZiAoZGV2LT5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9PSBtZXNzYWdlLmV2ZW50KQotCQkJcmV0dXJuIDA7Ci0JCS8qIHdlIG5lZWQgdG8gcnVsZSBvdXQgYm9ndXMgcmVxdWVzdHMgdGhyb3VnaCBzeXNmcyAqLwotCQlzdGF0dXMgPSBkZXZpY2VfZm9yX2VhY2hfY2hpbGQoZGV2LCBOVUxMLCB2ZXJpZnlfc3VzcGVuZGVkKTsKLQkJaWYgKHN0YXR1cykKLQkJCXJldHVybiBzdGF0dXM7Ci0gCQlyZXR1cm4gdXNiX3N1c3BlbmRfZGV2aWNlICh0b191c2JfZGV2aWNlKGRldikpOwotCX0KLQotCWlmICgoZGV2LT5kcml2ZXIgPT0gTlVMTCkgfHwKLQkgICAgKGRldi0+ZHJpdmVyX2RhdGEgPT0gJnVzYl9nZW5lcmljX2RyaXZlcl9kYXRhKSkKLQkJcmV0dXJuIDA7Ci0KLQlpbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwotCWRyaXZlciA9IHRvX3VzYl9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCi0JLyogd2l0aCBubyBoYXJkd2FyZSwgVVNCIGludGVyZmFjZXMgb25seSB1c2UgRlJFRVpFIGFuZCBPTiBzdGF0ZXMgKi8KLQlpZiAoIWlzX2FjdGl2ZShpbnRmKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoZHJpdmVyLT5zdXNwZW5kICYmIGRyaXZlci0+cmVzdW1lKSB7Ci0JCXN0YXR1cyA9IGRyaXZlci0+c3VzcGVuZChpbnRmLCBtZXNzYWdlKTsKLQkJaWYgKHN0YXR1cykKLQkJCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJzdXNwZW5kIiwgc3RhdHVzKTsKLQkJZWxzZQotCQkJbWFya19xdWllc2NlZChpbnRmKTsKLQl9IGVsc2UgewotCQkvLyBGSVhNRSBlbHNlIGlmIHRoZXJlJ3Mgbm8gc3VzcGVuZCBtZXRob2QsIGRpc2Nvbm5lY3QuLi4KLQkJZGV2X3dhcm4oZGV2LCAibm8gc3VzcGVuZCBmb3IgZHJpdmVyICVzP1xuIiwgZHJpdmVyLT5uYW1lKTsKLQkJbWFya19xdWllc2NlZChpbnRmKTsKLQkJc3RhdHVzID0gMDsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdGljIGludCB1c2JfZ2VuZXJpY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRmOwotCXN0cnVjdCB1c2JfZHJpdmVyCSpkcml2ZXI7Ci0Jc3RydWN0IHVzYl9kZXZpY2UJKnVkZXY7Ci0JaW50CQkJc3RhdHVzOwotCi0JaWYgKGRldi0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfT04pCi0JCXJldHVybiAwOwotCi0JLyogbWFyayB0aGluZ3MgYXMgIm9uIiBpbW1lZGlhdGVseSwgbm8gbWF0dGVyIHdoYXQgZXJyb3JzIGNyb3AgdXAgKi8KLQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID0gUE1fRVZFTlRfT047Ci0KLQkvKiBkZXZpY2VzIHJlc3VtZSB0aHJvdWdoIHRoZWlyIGh1YnMgKi8KLQlpZiAoZGV2LT5kcml2ZXIgPT0gJnVzYl9nZW5lcmljX2RyaXZlcikgewotCQl1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOwotCQlpZiAodWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiB1c2JfcmVzdW1lX2RldmljZSAodG9fdXNiX2RldmljZShkZXYpKTsKLQl9Ci0KLQlpZiAoKGRldi0+ZHJpdmVyID09IE5VTEwpIHx8Ci0JICAgIChkZXYtPmRyaXZlcl9kYXRhID09ICZ1c2JfZ2VuZXJpY19kcml2ZXJfZGF0YSkpIHsKLQkJZGV2LT5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9IFBNX0VWRU5UX0ZSRUVaRTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKLQlkcml2ZXIgPSB0b191c2JfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQotCXVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOwotCWlmICh1ZGV2LT5zdGF0ZSA9PSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpCi0JCXJldHVybiAwOwotCi0JLyogaWYgZHJpdmVyIHdhcyBzdXNwZW5kZWQsIGl0IGhhcyBhIHJlc3VtZSBtZXRob2Q7Ci0JICogaG93ZXZlciwgc3lzZnMgY2FuIHdyb25nbHkgbWFyayB0aGluZ3MgYXMgc3VzcGVuZGVkCi0JICogKG9uIHRoZSAibm8gc3VzcGVuZCBtZXRob2QiIEZJWE1FIHBhdGggYWJvdmUpCi0JICovCi0JaWYgKGRyaXZlci0+cmVzdW1lKSB7Ci0JCXN0YXR1cyA9IGRyaXZlci0+cmVzdW1lKGludGYpOwotCQlpZiAoc3RhdHVzKSB7Ci0JCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAicmVzdW1lIiwgc3RhdHVzKTsKLQkJCW1hcmtfcXVpZXNjZWQoaW50Zik7Ci0JCX0KLQl9IGVsc2UKLQkJZGV2X3dhcm4oZGV2LCAibm8gcmVzdW1lIGZvciBkcml2ZXIgJXM/XG4iLCBkcml2ZXItPm5hbWUpOwotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgYnVzX3R5cGUgdXNiX2J1c190eXBlID0gewotCS5uYW1lID0JCSJ1c2IiLAotCS5tYXRjaCA9CXVzYl9kZXZpY2VfbWF0Y2gsCi0JLnVldmVudCA9CXVzYl91ZXZlbnQsCi0JLnN1c3BlbmQgPQl1c2JfZ2VuZXJpY19zdXNwZW5kLAotCS5yZXN1bWUgPQl1c2JfZ2VuZXJpY19yZXN1bWUsCi19OwotCiAvKiBmb3JtYXQgdG8gZGlzYWJsZSBVU0Igb24ga2VybmVsIGNvbW1hbmQgbGluZSBpczogbm91c2IgKi8KIF9fbW9kdWxlX3BhcmFtX2NhbGwoIiIsIG5vdXNiLCBwYXJhbV9zZXRfYm9vbCwgcGFyYW1fZ2V0X2Jvb2wsICZub3VzYiwgMDQ0NCk7CiAKQEAgLTExNDEsNyArOTk3LDcgQEAKIAlyZXR2YWwgPSB1c2JfaHViX2luaXQoKTsKIAlpZiAocmV0dmFsKQogCQlnb3RvIGh1Yl9pbml0X2ZhaWxlZDsKLQlyZXR2YWwgPSBkcml2ZXJfcmVnaXN0ZXIoJnVzYl9nZW5lcmljX2RyaXZlcik7CisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2RldmljZV9kcml2ZXIoJnVzYl9nZW5lcmljX2RyaXZlciwgVEhJU19NT0RVTEUpOwogCWlmICghcmV0dmFsKQogCQlnb3RvIG91dDsKIApAQCAtMTE3MSw3ICsxMDI3LDcgQEAKIAlpZiAobm91c2IpCiAJCXJldHVybjsKIAotCWRyaXZlcl91bnJlZ2lzdGVyKCZ1c2JfZ2VuZXJpY19kcml2ZXIpOworCXVzYl9kZXJlZ2lzdGVyX2RldmljZV9kcml2ZXIoJnVzYl9nZW5lcmljX2RyaXZlcik7CiAJdXNiX21ham9yX2NsZWFudXAoKTsKIAl1c2Jmc19jbGVhbnVwKCk7CiAJdXNiX2RlcmVnaXN0ZXIoJnVzYmZzX2RyaXZlcik7CkBAIC0xMjAxLDIwICsxMDU3LDI3IEBACiAKIEVYUE9SVF9TWU1CT0wodXNiX2xvY2tfZGV2aWNlX2Zvcl9yZXNldCk7CiAKLUVYUE9SVF9TWU1CT0wodXNiX2RyaXZlcl9jbGFpbV9pbnRlcmZhY2UpOwotRVhQT1JUX1NZTUJPTCh1c2JfZHJpdmVyX3JlbGVhc2VfaW50ZXJmYWNlKTsKIEVYUE9SVF9TWU1CT0wodXNiX2ZpbmRfaW50ZXJmYWNlKTsKIEVYUE9SVF9TWU1CT0wodXNiX2lmbnVtX3RvX2lmKTsKIEVYUE9SVF9TWU1CT0wodXNiX2FsdG51bV90b19hbHRzZXR0aW5nKTsKIAotRVhQT1JUX1NZTUJPTCh1c2JfcmVzZXRfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0wodXNiX3Jlc2V0X2NvbXBvc2l0ZV9kZXZpY2UpOwotCiBFWFBPUlRfU1lNQk9MKF9fdXNiX2dldF9leHRyYV9kZXNjcmlwdG9yKTsKIAogRVhQT1JUX1NZTUJPTCh1c2JfZmluZF9kZXZpY2UpOwogRVhQT1JUX1NZTUJPTCh1c2JfZ2V0X2N1cnJlbnRfZnJhbWVfbnVtYmVyKTsKIAorRVhQT1JUX1NZTUJPTF9HUEwodXNiX2VuZHBvaW50X2Rpcl9pbik7CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfZGlyX291dCk7CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfeGZlcl9idWxrKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9lbmRwb2ludF94ZmVyX2ludCk7CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9lbmRwb2ludF9pc19idWxrX2luKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9lbmRwb2ludF9pc19idWxrX291dCk7CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfZW5kcG9pbnRfaXNfaW50X2luKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9lbmRwb2ludF9pc19pbnRfb3V0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9lbmRwb2ludF9pc19pc29jX2luKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9lbmRwb2ludF9pc19pc29jX291dCk7CisKIEVYUE9SVF9TWU1CT0wgKHVzYl9idWZmZXJfYWxsb2MpOwogRVhQT1JUX1NZTUJPTCAodXNiX2J1ZmZlcl9mcmVlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91c2IuaCBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmgKaW5kZXggNDlmNjkyMy4uMGMwOWVjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91c2IuaAorKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5oCkBAIC0xLDEwICsxLDEwIEBACiAvKiBGdW5jdGlvbnMgbG9jYWwgdG8gZHJpdmVycy91c2IvY29yZS8gKi8KIAotZXh0ZXJuIHZvaWQgdXNiX2NyZWF0ZV9zeXNmc19kZXZfZmlsZXMgKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB1c2JfY3JlYXRlX3N5c2ZzX2Rldl9maWxlcyAoc3RydWN0IHVzYl9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCB1c2JfcmVtb3ZlX3N5c2ZzX2Rldl9maWxlcyAoc3RydWN0IHVzYl9kZXZpY2UgKmRldik7Ci1leHRlcm4gdm9pZCB1c2JfY3JlYXRlX3N5c2ZzX2ludGZfZmlsZXMgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKK2V4dGVybiBpbnQgdXNiX2NyZWF0ZV9zeXNmc19pbnRmX2ZpbGVzIChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CiBleHRlcm4gdm9pZCB1c2JfcmVtb3ZlX3N5c2ZzX2ludGZfZmlsZXMgKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKLWV4dGVybiB2b2lkIHVzYl9jcmVhdGVfZXBfZmlsZXMoc3RydWN0IGRldmljZSAqcGFyZW50LCBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVuZHBvaW50LAorZXh0ZXJuIGludCB1c2JfY3JlYXRlX2VwX2ZpbGVzKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplbmRwb2ludCwKIAkJCQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldik7CiBleHRlcm4gdm9pZCB1c2JfcmVtb3ZlX2VwX2ZpbGVzKHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZW5kcG9pbnQpOwogCkBAIC0yMCw3ICsyMCw2IEBACiBleHRlcm4gaW50IHVzYl9zZXRfY29uZmlndXJhdGlvbihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBpbnQgY29uZmlndXJhdGlvbik7CiAKIGV4dGVybiB2b2lkIHVzYl9raWNrX2todWJkKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgdXNiX3N1c3BlbmRfcm9vdF9odWIoc3RydWN0IHVzYl9kZXZpY2UgKmhkZXYpOwogZXh0ZXJuIHZvaWQgdXNiX3Jlc3VtZV9yb290X2h1YihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KTsKIAogZXh0ZXJuIGludCAgdXNiX2h1Yl9pbml0KHZvaWQpOwpAQCAtMzAsMjggKzI5LDc0IEBACiBleHRlcm4gaW50IHVzYl9ob3N0X2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCB1c2JfaG9zdF9jbGVhbnVwKHZvaWQpOwogCi1leHRlcm4gaW50IHVzYl9zdXNwZW5kX2RldmljZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2KTsKLWV4dGVybiBpbnQgdXNiX3Jlc3VtZV9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKmRldik7CisjaWZkZWYJQ09ORklHX1BNCiAKLWV4dGVybiBzdHJ1Y3QgZGV2aWNlX2RyaXZlciB1c2JfZ2VuZXJpY19kcml2ZXI7Ci1leHRlcm4gaW50IHVzYl9nZW5lcmljX2RyaXZlcl9kYXRhOwotZXh0ZXJuIGludCB1c2JfZGV2aWNlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydik7CitleHRlcm4gaW50IHVzYl9zdXNwZW5kX2JvdGgoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHBtX21lc3NhZ2VfdCBtc2cpOworZXh0ZXJuIGludCB1c2JfcmVzdW1lX2JvdGgoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpOworZXh0ZXJuIGludCB1c2JfcG9ydF9zdXNwZW5kKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB1c2JfcG9ydF9yZXN1bWUoc3RydWN0IHVzYl9kZXZpY2UgKmRldik7CisKKyNlbHNlCisKKyNkZWZpbmUgdXNiX3N1c3BlbmRfYm90aCh1ZGV2LCBtc2cpCTAKK3N0YXRpYyBpbmxpbmUgaW50IHVzYl9yZXN1bWVfYm90aChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldikKK3sKKwlyZXR1cm4gMDsKK30KKyNkZWZpbmUgdXNiX3BvcnRfc3VzcGVuZChkZXYpCQkwCisjZGVmaW5lIHVzYl9wb3J0X3Jlc3VtZShkZXYpCQkwCisKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1VTQl9TVVNQRU5ECisKKyNkZWZpbmUgVVNCX0FVVE9TVVNQRU5EX0RFTEFZCShIWioyKQorCitleHRlcm4gdm9pZCB1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBpbnQgZGVjX2J1c3lfY250KTsKK2V4dGVybiBpbnQgdXNiX2F1dG9yZXN1bWVfZGV2aWNlKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBpbnQgaW5jX2J1c3lfY250KTsKKworI2Vsc2UKKworI2RlZmluZSB1c2JfYXV0b3N1c3BlbmRfZGV2aWNlKHVkZXYsIGRlY19idXN5X2NudCkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIHVzYl9hdXRvcmVzdW1lX2RldmljZSh1ZGV2LCBpbmNfYnVzeV9jbnQpCTAKKworI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgdXNiX2J1c190eXBlOworZXh0ZXJuIHN0cnVjdCB1c2JfZGV2aWNlX2RyaXZlciB1c2JfZ2VuZXJpY19kcml2ZXI7CisKKy8qIEhlcmUncyBob3cgd2UgdGVsbCBhcGFydCBkZXZpY2VzIGFuZCBpbnRlcmZhY2VzLiAgTHVja2lseSB0aGVyZSdzCisgKiBubyBzdWNoIHRoaW5nIGFzIGEgcGxhdGZvcm0gVVNCIGRldmljZSwgc28gd2UgY2FuIHN0ZWFsIHRoZSB1c2UKKyAqIG9mIHRoZSBwbGF0Zm9ybV9kYXRhIGZpZWxkLiAqLworCitzdGF0aWMgaW5saW5lIGludCBpc191c2JfZGV2aWNlKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5wbGF0Zm9ybV9kYXRhID09ICZ1c2JfZ2VuZXJpY19kcml2ZXI7Cit9CisKKy8qIERvIHRoZSBzYW1lIGZvciBkZXZpY2UgZHJpdmVycyBhbmQgaW50ZXJmYWNlIGRyaXZlcnMuICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3VzYl9kZXZpY2VfZHJpdmVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkcnYsIHN0cnVjdCB1c2JkcnZfd3JhcCwgZHJpdmVyKS0+CisJCQlmb3JfZGV2aWNlczsKK30KIAogLyogSW50ZXJmYWNlcyBhbmQgdGhlaXIgInBvd2VyIHN0YXRlIiBhcmUgb3duZWQgYnkgdXNiY29yZSAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgbWFya19hY3RpdmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmYpCiB7Ci0JZi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID0gUE1fRVZFTlRfT047CisJZi0+aXNfYWN0aXZlID0gMTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIG1hcmtfcXVpZXNjZWQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmYpCiB7Ci0JZi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID0gUE1fRVZFTlRfRlJFRVpFOworCWYtPmlzX2FjdGl2ZSA9IDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGlzX2FjdGl2ZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqZikKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2FjdGl2ZShjb25zdCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqZikKIHsKLQlyZXR1cm4gZi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX09OOworCXJldHVybiBmLT5pc19hY3RpdmU7CiB9CiAKIApAQCAtNTksOSArMTA0LDEwIEBACiBleHRlcm4gY29uc3QgY2hhciAqdXNiY29yZV9uYW1lOwogCiAvKiB1c2JmcyBzdHVmZiAqLworZXh0ZXJuIHN0cnVjdCBtdXRleCB1c2Jmc19tdXRleDsKIGV4dGVybiBzdHJ1Y3QgdXNiX2RyaXZlciB1c2Jmc19kcml2ZXI7Ci1leHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2Jmc19kZXZpY2VzX2ZvcHM7Ci1leHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1c2Jmc19kZXZpY2VfZmlsZV9vcGVyYXRpb25zOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNiZnNfZGV2aWNlc19mb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNiZnNfZGV2aWNlX2ZpbGVfb3BlcmF0aW9uczsKIGV4dGVybiB2b2lkIHVzYmZzX2Nvbm5fZGlzY19ldmVudCh2b2lkKTsKIAogZXh0ZXJuIGludCB1c2JkZXZfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnIGIvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKaW5kZXggMWEzMmQ5Ni4uOGU1ZGQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKQEAgLTI2LDcgKzI2LDcgQEAKIAkgICB5b3UgbmVlZCBhIGxvdyBsZXZlbCBidXMgY29udHJvbGxlciBkcml2ZXIsIGFuZCBzb21lIHNvZnR3YXJlCiAJICAgdGFsa2luZyB0byBpdC4gIFBlcmlwaGVyYWwgY29udHJvbGxlcnMgYXJlIG9mdGVuIGRpc2NyZXRlIHNpbGljb24sCiAJICAgb3IgYXJlIGludGVncmF0ZWQgd2l0aCB0aGUgQ1BVIGluIGEgbWljcm9jb250cm9sbGVyLiAgVGhlIG1vcmUKLQkgICBmYW1pbGlhciBob3N0IHNpZGUgY29udHJvbGxlcnMgaGF2ZSBuYW1lcyBsaWtlIGxpa2UgIkVIQ0kiLCAiT0hDSSIsCisJICAgZmFtaWxpYXIgaG9zdCBzaWRlIGNvbnRyb2xsZXJzIGhhdmUgbmFtZXMgbGlrZSAiRUhDSSIsICJPSENJIiwKIAkgICBvciAiVUhDSSIsIGFuZCBhcmUgdXN1YWxseSBpbnRlZ3JhdGVkIGludG8gc291dGhicmlkZ2VzIG9uIFBDCiAJICAgbW90aGVyYm9hcmRzLgogCkBAIC00MDQsNiArNDA0LDIwIEBACiAJICB3aGljaCBpbmNsdWRlcyBpbnN0cnVjdGlvbnMgYW5kIGEgImRyaXZlciBpbmZvIGZpbGUiIG5lZWRlZCB0bwogCSAgbWFrZSBNUy1XaW5kb3dzIHdvcmsgd2l0aCB0aGlzIGRyaXZlci4KIAorY29uZmlnIFVTQl9NSURJX0dBREdFVAorCXRyaXN0YXRlICJNSURJIEdhZGdldCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFNORCAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgU05EX1JBV01JREkKKwloZWxwCisJICBUaGUgTUlESSBHYWRnZXQgYWN0cyBhcyBhIFVTQiBBdWRpbyBkZXZpY2UsIHdpdGggb25lIE1JREkKKwkgIGlucHV0IGFuZCBvbmUgTUlESSBvdXRwdXQuIFRoZXNlIE1JREkgamFja3MgYXBwZWFyIGFzCisJICBhIHNvdW5kICJjYXJkIiBpbiB0aGUgQUxTQSBzb3VuZCBzeXN0ZW0uIE90aGVyIE1JREkKKwkgIGNvbm5lY3Rpb25zIGNhbiB0aGVuIGJlIG1hZGUgb24gdGhlIGdhZGdldCBzeXN0ZW0sIHVzaW5nCisJICBBTFNBJ3MgYWNvbm5lY3QgdXRpbGl0eSBldGMuCisKKwkgIFNheSAieSIgdG8gbGluayB0aGUgZHJpdmVyIHN0YXRpY2FsbHksIG9yICJtIiB0byBidWlsZCBhCisJICBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNhbGxlZCAiZ19taWRpIi4KKwogCiAjIHB1dCBkcml2ZXJzIHRoYXQgbmVlZCBpc29jaHJvbm91cyB0cmFuc2ZlciBzdXBwb3J0IChmb3IgYXVkaW8KICMgb3IgdmlkZW8gY2xhc3MgZ2FkZ2V0IGRyaXZlcnMpLCBvciBzcGVjaWZpYyBoYXJkd2FyZSwgaGVyZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2dhZGdldC9NYWtlZmlsZQppbmRleCA1YTI4ZTYxMy4uZTcxZTA4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9NYWtlZmlsZQpAQCAtMTUsNiArMTUsNyBAQAogZ196ZXJvLW9ianMJCQk6PSB6ZXJvLm8gdXNic3RyaW5nLm8gY29uZmlnLm8gZXBhdXRvY29uZi5vCiBnX2V0aGVyLW9ianMJCQk6PSBldGhlci5vIHVzYnN0cmluZy5vIGNvbmZpZy5vIGVwYXV0b2NvbmYubwogZ19zZXJpYWwtb2JqcwkJCTo9IHNlcmlhbC5vIHVzYnN0cmluZy5vIGNvbmZpZy5vIGVwYXV0b2NvbmYubworZ19taWRpLW9ianMJCQk6PSBnbWlkaS5vIHVzYnN0cmluZy5vIGNvbmZpZy5vIGVwYXV0b2NvbmYubwogZ2FkZ2V0ZnMtb2JqcwkJCTo9IGlub2RlLm8KIGdfZmlsZV9zdG9yYWdlLW9ianMJCTo9IGZpbGVfc3RvcmFnZS5vIHVzYnN0cmluZy5vIGNvbmZpZy5vIFwKIAkJCQkJZXBhdXRvY29uZi5vCkBAIC0yOCw0ICsyOSw1IEBACiBvYmotJChDT05GSUdfVVNCX0dBREdFVEZTKQkrPSBnYWRnZXRmcy5vCiBvYmotJChDT05GSUdfVVNCX0ZJTEVfU1RPUkFHRSkJKz0gZ19maWxlX3N0b3JhZ2Uubwogb2JqLSQoQ09ORklHX1VTQl9HX1NFUklBTCkJKz0gZ19zZXJpYWwubworb2JqLSQoQ09ORklHX1VTQl9NSURJX0dBREdFVCkJKz0gZ19taWRpLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2F0OTFfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYwppbmRleCBjZmViY2EwLi5kMDA5NThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYXQ5MV91ZGMuYwpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2NfdWRjX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfb3BzID0gewogCS5vcGVuCQk9IHByb2NfdWRjX29wZW4sCiAJLnJlYWQJCT0gc2VxX3JlYWQsCiAJLmxsc2VlawkJPSBzZXFfbHNlZWssCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZHVtbXlfaGNkLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZHVtbXlfaGNkLmMKaW5kZXggN2QxYzIyYy4uZmRhYjk3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2R1bW15X2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9kdW1teV9oY2QuYwpAQCAtODg5LDExICs4ODksOSBAQAogc3RhdGljIHZvaWQKIGR1bW15X2dhZGdldF9yZWxlYXNlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0jaWYgMAkJLyogdXNiX2J1c19wdXQgaXNuJ3QgRVhQT1JUZWQhICovCiAJc3RydWN0IGR1bW15CSpkdW0gPSBnYWRnZXRfZGV2X3RvX2R1bW15IChkZXYpOwogCi0JdXNiX2J1c19wdXQgKCZkdW1teV90b19oY2QgKGR1bSktPnNlbGYpOwotI2VuZGlmCisJdXNiX3B1dF9oY2QgKGR1bW15X3RvX2hjZCAoZHVtKSk7CiB9CiAKIHN0YXRpYyBpbnQgZHVtbXlfdWRjX3Byb2JlIChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtOTE1LDkgKzkxMyw3IEBACiAJaWYgKHJjIDwgMCkKIAkJcmV0dXJuIHJjOwogCi0jaWYgMAkJLyogdXNiX2J1c19nZXQgaXNuJ3QgRVhQT1JUZWQhICovCi0JdXNiX2J1c19nZXQgKCZkdW1teV90b19oY2QgKGR1bSktPnNlbGYpOwotI2VuZGlmCisJdXNiX2dldF9oY2QgKGR1bW15X3RvX2hjZCAoZHVtKSk7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YSAocGRldiwgZHVtKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUgKCZkdW0tPmdhZGdldC5kZXYsICZkZXZfYXR0cl9mdW5jdGlvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZXRoZXIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCmluZGV4IDMwMjk5YzYuLjM2NmRjMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9ldGhlci5jCkBAIC0yNjIsNyArMjYyLDcgQEAKICNkZWZpbmUgREVWX0NPTkZJR19DREMKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfTVVTQkhEUkMKKyNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9NVVNCX0hEUkMKICNkZWZpbmUgREVWX0NPTkZJR19DREMKICNlbmRpZgogCkBAIC0yMDE0LDcgKzIwMTQsNyBAQAogc3RhdGljIGludCBybmRpc19jb250cm9sX2FjayAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKIHsKIAlzdHJ1Y3QgZXRoX2RldiAgICAgICAgICAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICBsZW5ndGg7CisJaW50ICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwogCXN0cnVjdCB1c2JfcmVxdWVzdCAgICAgICpyZXNwID0gZGV2LT5zdGF0X3JlcTsKIAogCS8qIGluIGNhc2UgUk5ESVMgY2FsbHMgdGhpcyBhZnRlciBkaXNjb25uZWN0ICovCkBAIC0yMjMwLDYgKzIyMzAsOSBAQAogCWlmIChnYWRnZXRfaXNfcHhhIChnYWRnZXQpKSB7CiAJCS8qIHB4YSBkb2Vzbid0IHN1cHBvcnQgYWx0c2V0dGluZ3MgKi8KIAkJY2RjID0gMDsKKwl9IGVsc2UgaWYgKGdhZGdldF9pc19tdXNiaGRyYyhnYWRnZXQpKSB7CisJCS8qIHJlZHVjZSB0eCBkbWEgb3ZlcmhlYWQgYnkgYXZvaWRpbmcgc3BlY2lhbCBjYXNlcyAqLworCQl6bHAgPSAwOwogCX0gZWxzZSBpZiAoZ2FkZ2V0X2lzX3NoKGdhZGdldCkpIHsKIAkJLyogc2ggZG9lc24ndCBzdXBwb3J0IG11bHRpcGxlIGludGVyZmFjZXMgb3IgY29uZmlncyAqLwogCQljZGMgPSAwOwpAQCAtMjU2NCw3ICsyNTY3LDcgQEAKIAogCS5mdW5jdGlvbgk9IChjaGFyICopIGRyaXZlcl9kZXNjLAogCS5iaW5kCQk9IGV0aF9iaW5kLAotCS51bmJpbmQJCT0gX19leGl0X3AoZXRoX3VuYmluZCksCisJLnVuYmluZAkJPSBldGhfdW5iaW5kLAogCiAJLnNldHVwCQk9IGV0aF9zZXR1cCwKIAkuZGlzY29ubmVjdAk9IGV0aF9kaXNjb25uZWN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2dtaWRpLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZ21pZGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjhjZWNkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2dtaWRpLmMKQEAgLTAsMCArMSwxMzM3IEBACisvKgorICogZ21pZGkuYyAtLSBVU0IgTUlESSBHYWRnZXQgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRodW10cm9uaWNzIFB0eSBMdGQuCisgKiBEZXZlbG9wZWQgZm9yIFRodW10cm9uaWNzIGJ5IEdyZXkgSW5ub3ZhdGlvbgorICogQmVuIFdpbGxpYW1zb24gPGJlbi53aWxsaWFtc29uQGdyZXlpbm5vdmF0aW9uLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGNvZGUgaXMgYmFzZWQgaW4gcGFydCBvbjoKKyAqCisgKiBHYWRnZXQgWmVybyBkcml2ZXIsIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IERhdmlkIEJyb3duZWxsLgorICogVVNCIEF1ZGlvIGRyaXZlciwgQ29weXJpZ2h0IChDKSAyMDAyIGJ5IFRha2FzaGkgSXdhaS4KKyAqIFVTQiBNSURJIGRyaXZlciwgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgQ2xlbWVucyBMYWRpc2NoLgorICoKKyAqIFJlZmVyIHRvIHRoZSBVU0IgRGV2aWNlIENsYXNzIERlZmluaXRpb24gZm9yIE1JREkgRGV2aWNlczoKKyAqIGh0dHA6Ly93d3cudXNiLm9yZy9kZXZlbG9wZXJzL2RldmNsYXNzX2RvY3MvbWlkaTEwLnBkZgorICovCisKKyNkZWZpbmUgREVCVUcgMQorLy8gI2RlZmluZSBWRVJCT1NFCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9yYXdtaWRpLmg+CisKKyNpbmNsdWRlIDxsaW51eC91c2JfY2g5Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiX2dhZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9hdWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9taWRpLmg+CisKKyNpbmNsdWRlICJnYWRnZXRfY2hpcHMuaCIKKworTU9EVUxFX0FVVEhPUigiQmVuIFdpbGxpYW1zb24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMjUgSnVsIDIwMDYiCisKK3N0YXRpYyBjb25zdCBjaGFyIHNob3J0bmFtZVtdID0gImdfbWlkaSI7CitzdGF0aWMgY29uc3QgY2hhciBsb25nbmFtZVtdID0gIk1JREkgR2FkZ2V0IjsKKworc3RhdGljIGludCBpbmRleCA9IFNORFJWX0RFRkFVTFRfSURYMTsKK3N0YXRpYyBjaGFyICppZCA9IFNORFJWX0RFRkFVTFRfU1RSMTsKKworbW9kdWxlX3BhcmFtKGluZGV4LCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciB0aGUgVVNCIE1JREkgR2FkZ2V0IGFkYXB0ZXIuIik7Cittb2R1bGVfcGFyYW0oaWQsIGNoYXJwLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaWQsICJJRCBzdHJpbmcgZm9yIHRoZSBVU0IgTUlESSBHYWRnZXQgYWRhcHRlci4iKTsKKworLyogU29tZSBzeXN0ZW1zIHdpbGwgd2FudCBkaWZmZXJlbnQgcHJvZHVjdCBpZGVudGlmZXJzIHB1Ymxpc2hlZCBpbiB0aGUKKyAqIGRldmljZSBkZXNjcmlwdG9yLCBlaXRoZXIgbnVtYmVycyBvciBzdHJpbmdzIG9yIGJvdGguICBUaGVzZSBzdHJpbmcKKyAqIHBhcmFtZXRlcnMgYXJlIGluIFVURi04IChzdXBlcnNldCBvZiBBU0NJSSdzIDcgYml0IGNoYXJhY3RlcnMpLgorICovCisKK3N0YXRpYyB1c2hvcnQgaWRWZW5kb3I7Cittb2R1bGVfcGFyYW0oaWRWZW5kb3IsIHVzaG9ydCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGlkVmVuZG9yLCAiVVNCIFZlbmRvciBJRCIpOworCitzdGF0aWMgdXNob3J0IGlkUHJvZHVjdDsKK21vZHVsZV9wYXJhbShpZFByb2R1Y3QsIHVzaG9ydCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGlkUHJvZHVjdCwgIlVTQiBQcm9kdWN0IElEIik7CisKK3N0YXRpYyB1c2hvcnQgYmNkRGV2aWNlOworbW9kdWxlX3BhcmFtKGJjZERldmljZSwgdXNob3J0LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoYmNkRGV2aWNlLCAiVVNCIERldmljZSB2ZXJzaW9uIChCQ0QpIik7CisKK3N0YXRpYyBjaGFyICppTWFudWZhY3R1cmVyOworbW9kdWxlX3BhcmFtKGlNYW51ZmFjdHVyZXIsIGNoYXJwLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoaU1hbnVmYWN0dXJlciwgIlVTQiBNYW51ZmFjdHVyZXIgc3RyaW5nIik7CisKK3N0YXRpYyBjaGFyICppUHJvZHVjdDsKK21vZHVsZV9wYXJhbShpUHJvZHVjdCwgY2hhcnAsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpUHJvZHVjdCwgIlVTQiBQcm9kdWN0IHN0cmluZyIpOworCitzdGF0aWMgY2hhciAqaVNlcmlhbE51bWJlcjsKK21vZHVsZV9wYXJhbShpU2VyaWFsTnVtYmVyLCBjaGFycCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGlTZXJpYWxOdW1iZXIsICJTZXJpYWxOdW1iZXIiKTsKKworLyoKKyAqIHRoaXMgdmVyc2lvbiBhdXRvY29uZmlndXJlcyBhcyBtdWNoIGFzIHBvc3NpYmxlLAorICogd2hpY2ggaXMgcmVhc29uYWJsZSBmb3IgbW9zdCAiYnVsay1vbmx5IiBkcml2ZXJzLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqRVBfSU5fTkFNRTsKK3N0YXRpYyBjb25zdCBjaGFyICpFUF9PVVRfTkFNRTsKKworCisvKiBiaWcgZW5vdWdoIHRvIGhvbGQgb3VyIGJpZ2dlc3QgZGVzY3JpcHRvciAqLworI2RlZmluZSBVU0JfQlVGU0laIDI1NgorCisKKy8qIFRoaXMgaXMgYSBnYWRnZXQsIGFuZCB0aGUgSU4vT1VUIG5hbWluZyBpcyBmcm9tIHRoZSBob3N0J3MgcGVyc3BlY3RpdmUuCisgICBVU0IgLT4gT1VUIGVuZHBvaW50IC0+IHJhd21pZGkKKyAgIFVTQiA8LSBJTiBlbmRwb2ludCAgPC0gcmF3bWlkaSAqLworc3RydWN0IGdtaWRpX2luX3BvcnQgeworCXN0cnVjdCBnbWlkaV9kZXZpY2UqIGRldjsKKwlpbnQgYWN0aXZlOworCXVpbnQ4X3QgY2FibGU7CQkvKiBjYWJsZSBudW1iZXIgPDwgNCAqLworCXVpbnQ4X3Qgc3RhdGU7CisjZGVmaW5lIFNUQVRFX1VOS05PV04JMAorI2RlZmluZSBTVEFURV8xUEFSQU0JMQorI2RlZmluZSBTVEFURV8yUEFSQU1fMQkyCisjZGVmaW5lIFNUQVRFXzJQQVJBTV8yCTMKKyNkZWZpbmUgU1RBVEVfU1lTRVhfMAk0CisjZGVmaW5lIFNUQVRFX1NZU0VYXzEJNQorI2RlZmluZSBTVEFURV9TWVNFWF8yCTYKKwl1aW50OF90IGRhdGFbMl07Cit9OworCitzdHJ1Y3QgZ21pZGlfZGV2aWNlIHsKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCB1c2JfZ2FkZ2V0CSpnYWRnZXQ7CisJc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXE7CQkvKiBmb3IgY29udHJvbCByZXNwb25zZXMgKi8KKwl1OAkJCWNvbmZpZzsKKwlzdHJ1Y3QgdXNiX2VwCQkqaW5fZXAsICpvdXRfZXA7CisJc3RydWN0IHNuZF9jYXJkIAkqY2FyZDsKKwlzdHJ1Y3Qgc25kX3Jhd21pZGkJKnJtaWRpOworCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKmluX3N1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpvdXRfc3Vic3RyZWFtOworCisJLyogRm9yIHRoZSBtb21lbnQgd2Ugb25seSBzdXBwb3J0IG9uZSBwb3J0IGluCisJICAgZWFjaCBkaXJlY3Rpb24sIGJ1dCBpbl9wb3J0IGlzIGtlcHQgYXMgYQorCSAgIHNlcGFyYXRlIHN0cnVjdCBzbyB3ZSBjYW4gaGF2ZSBtb3JlIGxhdGVyLiAqLworCXN0cnVjdCBnbWlkaV9pbl9wb3J0CWluX3BvcnQ7CisJdW5zaWduZWQgbG9uZwkJb3V0X3RyaWdnZXJlZDsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJdGFza2xldDsKK307CisKK3N0YXRpYyB2b2lkIGdtaWRpX3RyYW5zbWl0KHN0cnVjdCBnbWlkaV9kZXZpY2UqIGRldiwgc3RydWN0IHVzYl9yZXF1ZXN0KiByZXEpOworCisKKyNkZWZpbmUgeHByaW50ayhkLGxldmVsLGZtdCxhcmdzLi4uKSBcCisJZGV2X3ByaW50ayhsZXZlbCAsICYoZCktPmdhZGdldC0+ZGV2ICwgZm10ICwgIyMgYXJncykKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCRyhkZXYsZm10LGFyZ3MuLi4pIFwKKwl4cHJpbnRrKGRldiAsIEtFUk5fREVCVUcgLCBmbXQgLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREJHKGRldixmbXQsYXJncy4uLikgXAorCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBERUJVRyAqLworCisjaWZkZWYgVkVSQk9TRQorI2RlZmluZSBWREJHCURCRworI2Vsc2UKKyNkZWZpbmUgVkRCRyhkZXYsZm10LGFyZ3MuLi4pIFwKKwlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogVkVSQk9TRSAqLworCisjZGVmaW5lIEVSUk9SKGRldixmbXQsYXJncy4uLikgXAorCXhwcmludGsoZGV2ICwgS0VSTl9FUlIgLCBmbXQgLCAjIyBhcmdzKQorI2RlZmluZSBXQVJOKGRldixmbXQsYXJncy4uLikgXAorCXhwcmludGsoZGV2ICwgS0VSTl9XQVJOSU5HICwgZm10ICwgIyMgYXJncykKKyNkZWZpbmUgSU5GTyhkZXYsZm10LGFyZ3MuLi4pIFwKKwl4cHJpbnRrKGRldiAsIEtFUk5fSU5GTyAsIGZtdCAsICMjIGFyZ3MpCisKKworc3RhdGljIHVuc2lnbmVkIGJ1ZmxlbiA9IDI1NjsKK3N0YXRpYyB1bnNpZ25lZCBxbGVuID0gMzI7CisKK21vZHVsZV9wYXJhbShidWZsZW4sIHVpbnQsIFNfSVJVR08pOworbW9kdWxlX3BhcmFtKHFsZW4sIHVpbnQsIFNfSVJVR08pOworCisKKy8qIFRoYW5rcyB0byBHcmV5IElubm92YXRpb24gZm9yIGRvbmF0aW5nIHRoaXMgcHJvZHVjdCBJRC4KKyAqCisgKiBETyBOT1QgUkVVU0UgVEhFU0UgSURzIHdpdGggYSBwcm90b2NvbC1pbmNvbXBhdGlibGUgZHJpdmVyISEgIEV2ZXIhIQorICogSW5zdGVhZDogIGFsbG9jYXRlIHlvdXIgb3duLCB1c2luZyBub3JtYWwgVVNCLUlGIHByb2NlZHVyZXMuCisgKi8KKyNkZWZpbmUgRFJJVkVSX1ZFTkRPUl9OVU0JMHgxN2IzCQkvKiBHcmV5IElubm92YXRpb24gKi8KKyNkZWZpbmUgRFJJVkVSX1BST0RVQ1RfTlVNCTB4MDAwNAkJLyogTGludXgtVVNCICJNSURJIEdhZGdldCIgKi8KKworCisvKgorICogREVTQ1JJUFRPUlMgLi4uIG1vc3QgYXJlIHN0YXRpYywgYnV0IHN0cmluZ3MgYW5kIChmdWxsKQorICogY29uZmlndXJhdGlvbiBkZXNjcmlwdG9ycyBhcmUgYnVpbHQgb24gZGVtYW5kLgorICovCisKKyNkZWZpbmUgU1RSSU5HX01BTlVGQUNUVVJFUgkyNQorI2RlZmluZSBTVFJJTkdfUFJPRFVDVAkJNDIKKyNkZWZpbmUgU1RSSU5HX1NFUklBTAkJMTAxCisjZGVmaW5lIFNUUklOR19NSURJX0dBREdFVAkyNTAKKworLyogV2Ugb25seSBoYXZlIHRoZSBvbmUgY29uZmlndXJhdGlvbiwgaXQncyBudW1iZXIgMS4gKi8KKyNkZWZpbmUJR01JRElfQ09ORklHCQkxCisKKy8qIFdlIGhhdmUgdHdvIGludGVyZmFjZXMtIEF1ZGlvQ29udHJvbCBhbmQgTUlESVN0cmVhbWluZyAqLworI2RlZmluZSBHTUlESV9BQ19JTlRFUkZBQ0UJMAorI2RlZmluZSBHTUlESV9NU19JTlRFUkZBQ0UJMQorI2RlZmluZSBHTUlESV9OVU1fSU5URVJGQUNFUwkyCisKK0RFQ0xBUkVfVVNCX0FDX0hFQURFUl9ERVNDUklQVE9SKDEpOworREVDTEFSRV9VU0JfTUlESV9PVVRfSkFDS19ERVNDUklQVE9SKDEpOworREVDTEFSRV9VU0JfTVNfRU5EUE9JTlRfREVTQ1JJUFRPUigxKTsKKworLyogQi4xICBEZXZpY2UgRGVzY3JpcHRvciAqLworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgZGV2aWNlX2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0RFVklDRV9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfREVWSUNFLAorCS5iY2RVU0IgPQkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAyMDApLAorCS5iRGV2aWNlQ2xhc3MgPQkJVVNCX0NMQVNTX1BFUl9JTlRFUkZBQ0UsCisJLmlkVmVuZG9yID0JCV9fY29uc3RhbnRfY3B1X3RvX2xlMTYoRFJJVkVSX1ZFTkRPUl9OVU0pLAorCS5pZFByb2R1Y3QgPQkJX19jb25zdGFudF9jcHVfdG9fbGUxNihEUklWRVJfUFJPRFVDVF9OVU0pLAorCS5pTWFudWZhY3R1cmVyID0JU1RSSU5HX01BTlVGQUNUVVJFUiwKKwkuaVByb2R1Y3QgPQkJU1RSSU5HX1BST0RVQ1QsCisJLmJOdW1Db25maWd1cmF0aW9ucyA9CTEsCit9OworCisvKiBCLjIgIENvbmZpZ3VyYXRpb24gRGVzY3JpcHRvciAqLworc3RhdGljIHN0cnVjdCB1c2JfY29uZmlnX2Rlc2NyaXB0b3IgY29uZmlnX2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0NPTkZJR19TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfQ09ORklHLAorCS8qIGNvbXB1dGUgd1RvdGFsTGVuZ3RoIG9uIHRoZSBmbHkgKi8KKwkuYk51bUludGVyZmFjZXMgPQlHTUlESV9OVU1fSU5URVJGQUNFUywKKwkuYkNvbmZpZ3VyYXRpb25WYWx1ZSA9CUdNSURJX0NPTkZJRywKKwkuaUNvbmZpZ3VyYXRpb24gPQlTVFJJTkdfTUlESV9HQURHRVQsCisJLyoKKwkgKiBGSVhNRTogV2hlbiBlbWJlZGRpbmcgdGhpcyBkcml2ZXIgaW4gYSBkZXZpY2UsCisJICogdGhlc2UgbmVlZCB0byBiZSBzZXQgdG8gcmVmbGVjdCB0aGUgYWN0dWFsCisJICogcG93ZXIgcHJvcGVydGllcyBvZiB0aGUgZGV2aWNlLiBJcyBpdCBzZWxmcG93ZXJlZD8KKwkgKi8KKwkuYm1BdHRyaWJ1dGVzID0JCVVTQl9DT05GSUdfQVRUX09ORSwKKwkuYk1heFBvd2VyID0JCTEsCit9OworCisvKiBCLjMuMSAgU3RhbmRhcmQgQUMgSW50ZXJmYWNlIERlc2NyaXB0b3IgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yIGFjX2ludGVyZmFjZV9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9JTlRFUkZBQ0VfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0lOVEVSRkFDRSwKKwkuYkludGVyZmFjZU51bWJlciA9CUdNSURJX0FDX0lOVEVSRkFDRSwKKwkuYk51bUVuZHBvaW50cyA9CTAsCisJLmJJbnRlcmZhY2VDbGFzcyA9CVVTQl9DTEFTU19BVURJTywKKwkuYkludGVyZmFjZVN1YkNsYXNzID0JVVNCX1NVQkNMQVNTX0FVRElPQ09OVFJPTCwKKwkuaUludGVyZmFjZSA9CQlTVFJJTkdfTUlESV9HQURHRVQsCit9OworCisvKiBCLjMuMiAgQ2xhc3MtU3BlY2lmaWMgQUMgSW50ZXJmYWNlIERlc2NyaXB0b3IgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2FjX2hlYWRlcl9kZXNjcmlwdG9yXzEgYWNfaGVhZGVyX2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0FDX0hFQURFUl9TSVpFKDEpLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfQ1NfSU5URVJGQUNFLAorCS5iRGVzY3JpcHRvclN1YnR5cGUgPQlVU0JfTVNfSEVBREVSLAorCS5iY2RBREMgPQkJX19jb25zdGFudF9jcHVfdG9fbGUxNigweDAxMDApLAorCS53VG90YWxMZW5ndGggPQkJVVNCX0RUX0FDX0hFQURFUl9TSVpFKDEpLAorCS5iSW5Db2xsZWN0aW9uID0JMSwKKwkuYmFJbnRlcmZhY2VOciA9IHsKKwkJWzBdID0JCUdNSURJX01TX0lOVEVSRkFDRSwKKwl9Cit9OworCisvKiBCLjQuMSAgU3RhbmRhcmQgTVMgSW50ZXJmYWNlIERlc2NyaXB0b3IgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yIG1zX2ludGVyZmFjZV9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9JTlRFUkZBQ0VfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0lOVEVSRkFDRSwKKwkuYkludGVyZmFjZU51bWJlciA9CUdNSURJX01TX0lOVEVSRkFDRSwKKwkuYk51bUVuZHBvaW50cyA9CTIsCisJLmJJbnRlcmZhY2VDbGFzcyA9CVVTQl9DTEFTU19BVURJTywKKwkuYkludGVyZmFjZVN1YkNsYXNzID0JVVNCX1NVQkNMQVNTX01JRElTVFJFQU1JTkcsCisJLmlJbnRlcmZhY2UgPQkJU1RSSU5HX01JRElfR0FER0VULAorfTsKKworLyogQi40LjIgIENsYXNzLVNwZWNpZmljIE1TIEludGVyZmFjZSBEZXNjcmlwdG9yICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9tc19oZWFkZXJfZGVzY3JpcHRvciBtc19oZWFkZXJfZGVzYyA9IHsKKwkuYkxlbmd0aCA9CQlVU0JfRFRfTVNfSEVBREVSX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9DU19JTlRFUkZBQ0UsCisJLmJEZXNjcmlwdG9yU3VidHlwZSA9CVVTQl9NU19IRUFERVIsCisJLmJjZE1TQyA9CQlfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4MDEwMCksCisJLndUb3RhbExlbmd0aCA9CQlVU0JfRFRfTVNfSEVBREVSX1NJWkUKKwkJCQkrIDIqVVNCX0RUX01JRElfSU5fU0laRQorCQkJCSsgMipVU0JfRFRfTUlESV9PVVRfU0laRSgxKSwKK307CisKKyNkZWZpbmUgSkFDS19JTl9FTUIJMQorI2RlZmluZSBKQUNLX0lOX0VYVAkyCisjZGVmaW5lIEpBQ0tfT1VUX0VNQgkzCisjZGVmaW5lIEpBQ0tfT1VUX0VYVAk0CisKKy8qIEIuNC4zICBNSURJIElOIEphY2sgRGVzY3JpcHRvcnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX21pZGlfaW5famFja19kZXNjcmlwdG9yIGphY2tfaW5fZW1iX2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX01JRElfSU5fU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0NTX0lOVEVSRkFDRSwKKwkuYkRlc2NyaXB0b3JTdWJ0eXBlID0JVVNCX01TX01JRElfSU5fSkFDSywKKwkuYkphY2tUeXBlID0JCVVTQl9NU19FTUJFRERFRCwKKwkuYkphY2tJRCA9CQlKQUNLX0lOX0VNQiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX21pZGlfaW5famFja19kZXNjcmlwdG9yIGphY2tfaW5fZXh0X2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX01JRElfSU5fU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0NTX0lOVEVSRkFDRSwKKwkuYkRlc2NyaXB0b3JTdWJ0eXBlID0JVVNCX01TX01JRElfSU5fSkFDSywKKwkuYkphY2tUeXBlID0JCVVTQl9NU19FWFRFUk5BTCwKKwkuYkphY2tJRCA9CQlKQUNLX0lOX0VYVCwKK307CisKKy8qIEIuNC40ICBNSURJIE9VVCBKYWNrIERlc2NyaXB0b3JzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9taWRpX291dF9qYWNrX2Rlc2NyaXB0b3JfMSBqYWNrX291dF9lbWJfZGVzYyA9IHsKKwkuYkxlbmd0aCA9CQlVU0JfRFRfTUlESV9PVVRfU0laRSgxKSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0NTX0lOVEVSRkFDRSwKKwkuYkRlc2NyaXB0b3JTdWJ0eXBlID0JVVNCX01TX01JRElfT1VUX0pBQ0ssCisJLmJKYWNrVHlwZSA9CQlVU0JfTVNfRU1CRURERUQsCisJLmJKYWNrSUQgPQkJSkFDS19PVVRfRU1CLAorCS5iTnJJbnB1dFBpbnMgPQkJMSwKKwkucGlucyA9IHsKKwkJWzBdID0geworCQkJLmJhU291cmNlSUQgPQlKQUNLX0lOX0VYVCwKKwkJCS5iYVNvdXJjZVBpbiA9CTEsCisJCX0KKwl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9taWRpX291dF9qYWNrX2Rlc2NyaXB0b3JfMSBqYWNrX291dF9leHRfZGVzYyA9IHsKKwkuYkxlbmd0aCA9CQlVU0JfRFRfTUlESV9PVVRfU0laRSgxKSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0NTX0lOVEVSRkFDRSwKKwkuYkRlc2NyaXB0b3JTdWJ0eXBlID0JVVNCX01TX01JRElfT1VUX0pBQ0ssCisJLmJKYWNrVHlwZSA9CQlVU0JfTVNfRVhURVJOQUwsCisJLmJKYWNrSUQgPQkJSkFDS19PVVRfRVhULAorCS5iTnJJbnB1dFBpbnMgPQkJMSwKKwkucGlucyA9IHsKKwkJWzBdID0geworCQkJLmJhU291cmNlSUQgPQlKQUNLX0lOX0VNQiwKKwkJCS5iYVNvdXJjZVBpbiA9CTEsCisJCX0KKwl9Cit9OworCisvKiBCLjUuMSAgU3RhbmRhcmQgQnVsayBPVVQgRW5kcG9pbnQgRGVzY3JpcHRvciAqLworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBidWxrX291dF9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9BVURJT19TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisJLmJFbmRwb2ludEFkZHJlc3MgPQlVU0JfRElSX09VVCwKKwkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCit9OworCisvKiBCLjUuMiAgQ2xhc3Mtc3BlY2lmaWMgTVMgQnVsayBPVVQgRW5kcG9pbnQgRGVzY3JpcHRvciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfbXNfZW5kcG9pbnRfZGVzY3JpcHRvcl8xIG1zX291dF9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9NU19FTkRQT0lOVF9TSVpFKDEpLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfQ1NfRU5EUE9JTlQsCisJLmJEZXNjcmlwdG9yU3VidHlwZSA9CVVTQl9NU19HRU5FUkFMLAorCS5iTnVtRW1iTUlESUphY2sgPQkxLAorCS5iYUFzc29jSmFja0lEID0geworCQlbMF0gPQkJSkFDS19JTl9FTUIsCisJfQorfTsKKworLyogQi42LjEgIFN0YW5kYXJkIEJ1bGsgSU4gRW5kcG9pbnQgRGVzY3JpcHRvciAqLworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBidWxrX2luX2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX0FVRElPX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKwkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorfTsKKworLyogQi42LjIgIENsYXNzLXNwZWNpZmljIE1TIEJ1bGsgSU4gRW5kcG9pbnQgRGVzY3JpcHRvciAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfbXNfZW5kcG9pbnRfZGVzY3JpcHRvcl8xIG1zX2luX2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX01TX0VORFBPSU5UX1NJWkUoMSksCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9DU19FTkRQT0lOVCwKKwkuYkRlc2NyaXB0b3JTdWJ0eXBlID0JVVNCX01TX0dFTkVSQUwsCisJLmJOdW1FbWJNSURJSmFjayA9CTEsCisJLmJhQXNzb2NKYWNrSUQgPSB7CisJCVswXSA9CQlKQUNLX09VVF9FTUIsCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKmdtaWRpX2Z1bmN0aW9uIFtdID0geworCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopJmFjX2ludGVyZmFjZV9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopJmFjX2hlYWRlcl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopJm1zX2ludGVyZmFjZV9kZXNjLAorCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikmbXNfaGVhZGVyX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikmamFja19pbl9lbWJfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSZqYWNrX2luX2V4dF9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopJmphY2tfb3V0X2VtYl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopJmphY2tfb3V0X2V4dF9kZXNjLAorCS8qIElmIHlvdSBhZGQgbW9yZSBqYWNrcywgdXBkYXRlIG1zX2hlYWRlcl9kZXNjLndUb3RhbExlbmd0aCAqLworCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikmYnVsa19vdXRfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSZtc19vdXRfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSZidWxrX2luX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikmbXNfaW5fZGVzYywKKwlOVUxMLAorfTsKKworc3RhdGljIGNoYXIgbWFudWZhY3R1cmVyWzUwXTsKK3N0YXRpYyBjaGFyIHByb2R1Y3RfZGVzY1s0MF0gPSAiTUlESSBHYWRnZXQiOworc3RhdGljIGNoYXIgc2VyaWFsX251bWJlclsyMF07CisKKy8qIHN0YXRpYyBzdHJpbmdzLCBpbiBVVEYtOCAqLworc3RhdGljIHN0cnVjdCB1c2Jfc3RyaW5nIHN0cmluZ3MgW10gPSB7CisJeyBTVFJJTkdfTUFOVUZBQ1RVUkVSLCBtYW51ZmFjdHVyZXIsIH0sCisJeyBTVFJJTkdfUFJPRFVDVCwgcHJvZHVjdF9kZXNjLCB9LAorCXsgU1RSSU5HX1NFUklBTCwgc2VyaWFsX251bWJlciwgfSwKKwl7IFNUUklOR19NSURJX0dBREdFVCwgbG9uZ25hbWUsIH0sCisJeyAgfQkJCS8qIGVuZCBvZiBsaXN0ICovCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9nYWRnZXRfc3RyaW5ncyBzdHJpbmd0YWIgPSB7CisJLmxhbmd1YWdlCT0gMHgwNDA5LAkvKiBlbi11cyAqLworCS5zdHJpbmdzCT0gc3RyaW5ncywKK307CisKK3N0YXRpYyBpbnQgY29uZmlnX2J1ZihzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LAorCQl1OCAqYnVmLCB1OCB0eXBlLCB1bnNpZ25lZCBpbmRleCkKK3sKKwlpbnQgbGVuOworCisJLyogb25seSBvbmUgY29uZmlndXJhdGlvbiAqLworCWlmIChpbmRleCAhPSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlsZW4gPSB1c2JfZ2FkZ2V0X2NvbmZpZ19idWYoJmNvbmZpZ19kZXNjLAorCQkJYnVmLCBVU0JfQlVGU0laLCBnbWlkaV9mdW5jdGlvbik7CisJaWYgKGxlbiA8IDApIHsKKwkJcmV0dXJuIGxlbjsKKwl9CisJKChzdHJ1Y3QgdXNiX2NvbmZpZ19kZXNjcmlwdG9yICopYnVmKS0+YkRlc2NyaXB0b3JUeXBlID0gdHlwZTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0KiBhbGxvY19lcF9yZXEoc3RydWN0IHVzYl9lcCAqZXAsIHVuc2lnbmVkIGxlbmd0aCkKK3sKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcTsKKworCXJlcSA9IHVzYl9lcF9hbGxvY19yZXF1ZXN0KGVwLCBHRlBfQVRPTUlDKTsKKwlpZiAocmVxKSB7CisJCXJlcS0+bGVuZ3RoID0gbGVuZ3RoOworCQlyZXEtPmJ1ZiA9IGttYWxsb2MobGVuZ3RoLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFyZXEtPmJ1ZikgeworCQkJdXNiX2VwX2ZyZWVfcmVxdWVzdChlcCwgcmVxKTsKKwkJCXJlcSA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIHJlcTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9lcF9yZXEoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworCWtmcmVlKHJlcS0+YnVmKTsKKwl1c2JfZXBfZnJlZV9yZXF1ZXN0KGVwLCByZXEpOworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCBnbWlkaV9jaW5fbGVuZ3RoW10gPSB7CisJMCwgMCwgMiwgMywgMywgMSwgMiwgMywgMywgMywgMywgMywgMiwgMiwgMywgMQorfTsKKworLyoKKyAqIFJlY2VpdmVzIGEgY2h1bmsgb2YgTUlESSBkYXRhLgorICovCitzdGF0aWMgdm9pZCBnbWlkaV9yZWFkX2RhdGEoc3RydWN0IHVzYl9lcCAqZXAsIGludCBjYWJsZSwKKwkJCQkgICB1aW50OF90KiBkYXRhLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBnbWlkaV9kZXZpY2UgKmRldiA9IGVwLT5kcml2ZXJfZGF0YTsKKwkvKiBjYWJsZSBpcyBpZ25vcmVkLCBiZWNhdXNlIGZvciBub3cgd2Ugb25seSBoYXZlIG9uZS4gKi8KKworCWlmICghZGV2LT5vdXRfc3Vic3RyZWFtKSB7CisJCS8qIE5vYm9keSBpcyBsaXN0ZW5pbmcgLSB0aHJvdyBpdCBvbiB0aGUgZmxvb3IuICovCisJCXJldHVybjsKKwl9CisJaWYgKCF0ZXN0X2JpdChkZXYtPm91dF9zdWJzdHJlYW0tPm51bWJlciwgJmRldi0+b3V0X3RyaWdnZXJlZCkpIHsKKwkJcmV0dXJuOworCX0KKwlzbmRfcmF3bWlkaV9yZWNlaXZlKGRldi0+b3V0X3N1YnN0cmVhbSwgZGF0YSwgbGVuZ3RoKTsKK30KKworc3RhdGljIHZvaWQgZ21pZGlfaGFuZGxlX291dF9kYXRhKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKK3sKKwl1bnNpZ25lZCBpOworCXU4ICpidWYgPSByZXEtPmJ1ZjsKKworCWZvciAoaSA9IDA7IGkgKyAzIDwgcmVxLT5hY3R1YWw7IGkgKz0gNCkgeworCQlpZiAoYnVmW2ldICE9IDApIHsKKwkJCWludCBjYWJsZSA9IGJ1ZltpXSA+PiA0OworCQkJaW50IGxlbmd0aCA9IGdtaWRpX2Npbl9sZW5ndGhbYnVmW2ldICYgMHgwZl07CisJCQlnbWlkaV9yZWFkX2RhdGEoZXAsIGNhYmxlLCAmYnVmW2kgKyAxXSwgbGVuZ3RoKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZ21pZGlfY29tcGxldGUoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBnbWlkaV9kZXZpY2UgKmRldiA9IGVwLT5kcml2ZXJfZGF0YTsKKwlpbnQgc3RhdHVzID0gcmVxLT5zdGF0dXM7CisKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgMDogCQkJLyogbm9ybWFsIGNvbXBsZXRpb24gKi8KKwkJaWYgKGVwID09IGRldi0+b3V0X2VwKSB7CisJCQkvKiB3ZSByZWNlaXZlZCBzdHVmZi4KKwkJCSAgIHJlcSBpcyBxdWV1ZWQgYWdhaW4sIGJlbG93ICovCisJCQlnbWlkaV9oYW5kbGVfb3V0X2RhdGEoZXAsIHJlcSk7CisJCX0gZWxzZSBpZiAoZXAgPT0gZGV2LT5pbl9lcCkgeworCQkJLyogb3VyIHRyYW5zbWl0IGNvbXBsZXRlZC4KKwkJCSAgIHNlZSBpZiB0aGVyZSdzIG1vcmUgdG8gZ28uCisJCQkgICBnbWlkaV90cmFuc21pdCBlYXRzIHJlcSwgZG9uJ3QgcXVldWUgaXQgYWdhaW4uICovCisJCQlnbWlkaV90cmFuc21pdChkZXYsIHJlcSk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisKKwkvKiB0aGlzIGVuZHBvaW50IGlzIG5vcm1hbGx5IGFjdGl2ZSB3aGlsZSB3ZSdyZSBjb25maWd1cmVkICovCisJY2FzZSAtRUNPTk5BQk9SVEVEOiAJCS8qIGhhcmR3YXJlIGZvcmNlZCBlcCByZXNldCAqLworCWNhc2UgLUVDT05OUkVTRVQ6CQkvKiByZXF1ZXN0IGRlcXVldWVkICovCisJY2FzZSAtRVNIVVRET1dOOgkJLyogZGlzY29ubmVjdCBmcm9tIGhvc3QgKi8KKwkJVkRCRyhkZXYsICIlcyBnb25lICglZCksICVkLyVkXG4iLCBlcC0+bmFtZSwgc3RhdHVzLAorCQkJCXJlcS0+YWN0dWFsLCByZXEtPmxlbmd0aCk7CisJCWlmIChlcCA9PSBkZXYtPm91dF9lcCkgeworCQkJZ21pZGlfaGFuZGxlX291dF9kYXRhKGVwLCByZXEpOworCQl9CisJCWZyZWVfZXBfcmVxKGVwLCByZXEpOworCQlyZXR1cm47CisKKwljYXNlIC1FT1ZFUkZMT1c6CQkvKiBidWZmZXIgb3ZlcnJ1biBvbiByZWFkIG1lYW5zIHRoYXQKKwkJCQkJICogd2UgZGlkbid0IHByb3ZpZGUgYSBiaWcgZW5vdWdoCisJCQkJCSAqIGJ1ZmZlci4KKwkJCQkJICovCisJZGVmYXVsdDoKKwkJREJHKGRldiwgIiVzIGNvbXBsZXRlIC0tPiAlZCwgJWQvJWRcbiIsIGVwLT5uYW1lLAorCQkJCXN0YXR1cywgcmVxLT5hY3R1YWwsIHJlcS0+bGVuZ3RoKTsKKwkJYnJlYWs7CisJY2FzZSAtRVJFTU9URUlPOgkJLyogc2hvcnQgcmVhZCAqLworCQlicmVhazsKKwl9CisKKwlzdGF0dXMgPSB1c2JfZXBfcXVldWUoZXAsIHJlcSwgR0ZQX0FUT01JQyk7CisJaWYgKHN0YXR1cykgeworCQlFUlJPUihkZXYsICJraWxsICVzOiAgcmVzdWJtaXQgJWQgYnl0ZXMgLS0+ICVkXG4iLAorCQkJCWVwLT5uYW1lLCByZXEtPmxlbmd0aCwgc3RhdHVzKTsKKwkJdXNiX2VwX3NldF9oYWx0KGVwKTsKKwkJLyogRklYTUUgcmVjb3ZlciBsYXRlciAuLi4gc29tZWhvdyAqLworCX0KK30KKworc3RhdGljIGludCBzZXRfZ21pZGlfY29uZmlnKHN0cnVjdCBnbWlkaV9kZXZpY2UgKmRldiwgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxOworCXN0cnVjdCB1c2JfZXAqIGVwOworCXVuc2lnbmVkIGk7CisKKwllcnIgPSB1c2JfZXBfZW5hYmxlKGRldi0+aW5fZXAsICZidWxrX2luX2Rlc2MpOworCWlmIChlcnIpIHsKKwkJRVJST1IoZGV2LCAiY2FuJ3Qgc3RhcnQgJXM6ICVkXG4iLCBkZXYtPmluX2VwLT5uYW1lLCBlcnIpOworCQlnb3RvIGZhaWw7CisJfQorCWRldi0+aW5fZXAtPmRyaXZlcl9kYXRhID0gZGV2OworCisJZXJyID0gdXNiX2VwX2VuYWJsZShkZXYtPm91dF9lcCwgJmJ1bGtfb3V0X2Rlc2MpOworCWlmIChlcnIpIHsKKwkJRVJST1IoZGV2LCAiY2FuJ3Qgc3RhcnQgJXM6ICVkXG4iLCBkZXYtPm91dF9lcC0+bmFtZSwgZXJyKTsKKwkJZ290byBmYWlsOworCX0KKwlkZXYtPm91dF9lcC0+ZHJpdmVyX2RhdGEgPSBkZXY7CisKKwkvKiBhbGxvY2F0ZSBhIGJ1bmNoIG9mIHJlYWQgYnVmZmVycyBhbmQgcXVldWUgdGhlbSBhbGwgYXQgb25jZS4gKi8KKwllcCA9IGRldi0+b3V0X2VwOworCWZvciAoaSA9IDA7IGkgPCBxbGVuICYmIGVyciA9PSAwOyBpKyspIHsKKwkJcmVxID0gYWxsb2NfZXBfcmVxKGVwLCBidWZsZW4pOworCQlpZiAocmVxKSB7CisJCQlyZXEtPmNvbXBsZXRlID0gZ21pZGlfY29tcGxldGU7CisJCQllcnIgPSB1c2JfZXBfcXVldWUoZXAsIHJlcSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoZXJyKSB7CisJCQkJREJHKGRldiwgIiVzIHF1ZXVlIHJlcTogJWRcbiIsIGVwLT5uYW1lLCBlcnIpOworCQkJfQorCQl9IGVsc2UgeworCQkJZXJyID0gLUVOT01FTTsKKwkJfQorCX0KK2ZhaWw6CisJLyogY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjbGVhbnVwIG9uIGVycm9yICovCisJcmV0dXJuIGVycjsKK30KKworCitzdGF0aWMgdm9pZCBnbWlkaV9yZXNldF9jb25maWcoc3RydWN0IGdtaWRpX2RldmljZSAqZGV2KQoreworCWlmIChkZXYtPmNvbmZpZyA9PSAwKSB7CisJCXJldHVybjsKKwl9CisKKwlEQkcoZGV2LCAicmVzZXQgY29uZmlnXG4iKTsKKworCS8qIGp1c3QgZGlzYWJsZSBlbmRwb2ludHMsIGZvcmNpbmcgY29tcGxldGlvbiBvZiBwZW5kaW5nIGkvby4KKwkgKiBhbGwgb3VyIGNvbXBsZXRpb24gaGFuZGxlcnMgZnJlZSB0aGVpciByZXF1ZXN0cyBpbiB0aGlzIGNhc2UuCisJICovCisJdXNiX2VwX2Rpc2FibGUoZGV2LT5pbl9lcCk7CisJdXNiX2VwX2Rpc2FibGUoZGV2LT5vdXRfZXApOworCWRldi0+Y29uZmlnID0gMDsKK30KKworLyogY2hhbmdlIG91ciBvcGVyYXRpb25hbCBjb25maWcuICB0aGlzIGNvZGUgbXVzdCBhZ3JlZSB3aXRoIHRoZSBjb2RlCisgKiB0aGF0IHJldHVybnMgY29uZmlnIGRlc2NyaXB0b3JzLCBhbmQgYWx0c2V0dGluZyBjb2RlLgorICoKKyAqIGl0J3MgYWxzbyByZXNwb25zaWJsZSBmb3IgcG93ZXIgbWFuYWdlbWVudCBpbnRlcmFjdGlvbnMuIHNvbWUKKyAqIGNvbmZpZ3VyYXRpb25zIG1pZ2h0IG5vdCB3b3JrIHdpdGggb3VyIGN1cnJlbnQgcG93ZXIgc291cmNlcy4KKyAqCisgKiBub3RlIHRoYXQgc29tZSBkZXZpY2UgY29udHJvbGxlciBoYXJkd2FyZSB3aWxsIGNvbnN0cmFpbiB3aGF0IHRoaXMKKyAqIGNvZGUgY2FuIGRvLCBwZXJoYXBzIGJ5IGRpc2FsbG93aW5nIG1vcmUgdGhhbiBvbmUgY29uZmlndXJhdGlvbiBvcgorICogYnkgbGltaXRpbmcgY29uZmlndXJhdGlvbiBjaG9pY2VzIChsaWtlIHRoZSBweGEyeHgpLgorICovCitzdGF0aWMgaW50CitnbWlkaV9zZXRfY29uZmlnKHN0cnVjdCBnbWlkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgbnVtYmVyLCBnZnBfdCBnZnBfZmxhZ3MpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCA9IGRldi0+Z2FkZ2V0OworCisjaWYgMAorCS8qIEZJWE1FICovCisJLyogSGFja2luZyB0aGlzIGJpdCBvdXQgZml4ZXMgYSBidWcgd2hlcmUgb24gcmVjZWlwdCBvZiB0d28KKwkgICBVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OIG1lc3NhZ2VzLCB3ZSBlbmQgdXAgd2l0aCBubworCSAgIGJ1ZmZlcmVkIE9VVCByZXF1ZXN0cyB3YWl0aW5nIGZvciBkYXRhLiBUaGlzIGlzIGNsZWFybHkKKwkgICBoaWRpbmcgYSBidWcgZWxzZXdoZXJlLCBiZWNhdXNlIGlmIHRoZSBjb25maWcgZGlkbid0CisJICAgY2hhbmdlIHRoZW4gd2UgcmVhbGx5IHNob3VsZG4ndCBkbyBhbnl0aGluZy4gKi8KKwkvKiBIYXZpbmcgc2FpZCB0aGF0LCB3aGVuIHdlIGRvICJjaGFuZ2UiIGZyb20gY29uZmlnIDEKKwkgICB0byBjb25maWcgMSwgd2UgYXQgbGVhc3QgZ21pZGlfcmVzZXRfY29uZmlnKCkgd2hpY2gKKwkgICBjbGVhcnMgb3V0IGFueSByZXF1ZXN0cyBvbiBlbmRwb2ludHMsIHNvIGl0J3Mgbm90IGxpa2UKKwkgICB3ZSBsZWFrIG9yIGFueXRoaW5nLiAqLworCWlmIChudW1iZXIgPT0gZGV2LT5jb25maWcpIHsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKwlpZiAoZ2FkZ2V0X2lzX3NhMTEwMChnYWRnZXQpICYmIGRldi0+Y29uZmlnKSB7CisJCS8qIHR4IGZpZm8gaXMgZnVsbCwgYnV0IHdlIGNhbid0IGNsZWFyIGl0Li4uKi8KKwkJSU5GTyhkZXYsICJjYW4ndCBjaGFuZ2UgY29uZmlndXJhdGlvbnNcbiIpOworCQlyZXR1cm4gLUVTUElQRTsKKwl9CisJZ21pZGlfcmVzZXRfY29uZmlnKGRldik7CisKKwlzd2l0Y2ggKG51bWJlcikgeworCWNhc2UgR01JRElfQ09ORklHOgorCQlyZXN1bHQgPSBzZXRfZ21pZGlfY29uZmlnKGRldiwgZ2ZwX2ZsYWdzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJLyogRkFMTCBUSFJPVUdIICovCisJY2FzZSAwOgorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWlmICghcmVzdWx0ICYmICghZGV2LT5pbl9lcCB8fCAhZGV2LT5vdXRfZXApKSB7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJfQorCWlmIChyZXN1bHQpIHsKKwkJZ21pZGlfcmVzZXRfY29uZmlnKGRldik7CisJfSBlbHNlIHsKKwkJY2hhciAqc3BlZWQ7CisKKwkJc3dpdGNoIChnYWRnZXQtPnNwZWVkKSB7CisJCWNhc2UgVVNCX1NQRUVEX0xPVzoJc3BlZWQgPSAibG93IjsgYnJlYWs7CisJCWNhc2UgVVNCX1NQRUVEX0ZVTEw6CXNwZWVkID0gImZ1bGwiOyBicmVhazsKKwkJY2FzZSBVU0JfU1BFRURfSElHSDoJc3BlZWQgPSAiaGlnaCI7IGJyZWFrOworCQlkZWZhdWx0OiAJCXNwZWVkID0gIj8iOyBicmVhazsKKwkJfQorCisJCWRldi0+Y29uZmlnID0gbnVtYmVyOworCQlJTkZPKGRldiwgIiVzIHNwZWVkXG4iLCBzcGVlZCk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHZvaWQgZ21pZGlfc2V0dXBfY29tcGxldGUoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworCWlmIChyZXEtPnN0YXR1cyB8fCByZXEtPmFjdHVhbCAhPSByZXEtPmxlbmd0aCkgeworCQlEQkcoKHN0cnVjdCBnbWlkaV9kZXZpY2UgKikgZXAtPmRyaXZlcl9kYXRhLAorCQkJCSJzZXR1cCBjb21wbGV0ZSAtLT4gJWQsICVkLyVkXG4iLAorCQkJCXJlcS0+c3RhdHVzLCByZXEtPmFjdHVhbCwgcmVxLT5sZW5ndGgpOworCX0KK30KKworLyoKKyAqIFRoZSBzZXR1cCgpIGNhbGxiYWNrIGltcGxlbWVudHMgYWxsIHRoZSBlcDAgZnVuY3Rpb25hbGl0eSB0aGF0J3MKKyAqIG5vdCBoYW5kbGVkIGxvd2VyIGRvd24sIGluIGhhcmR3YXJlIG9yIHRoZSBoYXJkd2FyZSBkcml2ZXIgKGxpa2UKKyAqIGRldmljZSBhbmQgZW5kcG9pbnQgZmVhdHVyZSBmbGFncywgYW5kIHRoZWlyIHN0YXR1cykuICBJdCdzIGFsbAorICogaG91c2VrZWVwaW5nIGZvciB0aGUgZ2FkZ2V0IGZ1bmN0aW9uIHdlJ3JlIGltcGxlbWVudGluZy4gIE1vc3Qgb2YKKyAqIHRoZSB3b3JrIGlzIGluIGNvbmZpZy1zcGVjaWZpYyBzZXR1cC4KKyAqLworc3RhdGljIGludCBnbWlkaV9zZXR1cChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LAorCQkJY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3RybCkKK3sKKwlzdHJ1Y3QgZ21pZGlfZGV2aWNlICpkZXYgPSBnZXRfZ2FkZ2V0X2RhdGEoZ2FkZ2V0KTsKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSA9IGRldi0+cmVxOworCWludCB2YWx1ZSA9IC1FT1BOT1RTVVBQOworCXUxNiB3X2luZGV4ID0gbGUxNl90b19jcHUoY3RybC0+d0luZGV4KTsKKwl1MTYgd192YWx1ZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7CisJdTE2IHdfbGVuZ3RoID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7CisKKwkvKiB1c3VhbGx5IHRoaXMgc3RvcmVzIHJlcGx5IGRhdGEgaW4gdGhlIHByZS1hbGxvY2F0ZWQgZXAwIGJ1ZmZlciwKKwkgKiBidXQgY29uZmlnIGNoYW5nZSBldmVudHMgd2lsbCByZWNvbmZpZ3VyZSBoYXJkd2FyZS4KKwkgKi8KKwlyZXEtPnplcm8gPSAwOworCXN3aXRjaCAoY3RybC0+YlJlcXVlc3QpIHsKKworCWNhc2UgVVNCX1JFUV9HRVRfREVTQ1JJUFRPUjoKKwkJaWYgKGN0cmwtPmJSZXF1ZXN0VHlwZSAhPSBVU0JfRElSX0lOKSB7CisJCQlnb3RvIHVua25vd247CisJCX0KKwkJc3dpdGNoICh3X3ZhbHVlID4+IDgpIHsKKworCQljYXNlIFVTQl9EVF9ERVZJQ0U6CisJCQl2YWx1ZSA9IG1pbih3X2xlbmd0aCwgKHUxNikgc2l6ZW9mKGRldmljZV9kZXNjKSk7CisJCQltZW1jcHkocmVxLT5idWYsICZkZXZpY2VfZGVzYywgdmFsdWUpOworCQkJYnJlYWs7CisJCWNhc2UgVVNCX0RUX0NPTkZJRzoKKwkJCXZhbHVlID0gY29uZmlnX2J1ZihnYWRnZXQsIHJlcS0+YnVmLAorCQkJCQl3X3ZhbHVlID4+IDgsCisJCQkJCXdfdmFsdWUgJiAweGZmKTsKKwkJCWlmICh2YWx1ZSA+PSAwKSB7CisJCQkJdmFsdWUgPSBtaW4od19sZW5ndGgsICh1MTYpdmFsdWUpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBVU0JfRFRfU1RSSU5HOgorCQkJLyogd0luZGV4ID09IGxhbmd1YWdlIGNvZGUuCisJCQkgKiB0aGlzIGRyaXZlciBvbmx5IGhhbmRsZXMgb25lIGxhbmd1YWdlLCB5b3UgY2FuCisJCQkgKiBhZGQgc3RyaW5nIHRhYmxlcyBmb3Igb3RoZXIgbGFuZ3VhZ2VzLCB1c2luZworCQkJICogYW55IFVURi04IGNoYXJhY3RlcnMKKwkJCSAqLworCQkJdmFsdWUgPSB1c2JfZ2FkZ2V0X2dldF9zdHJpbmcoJnN0cmluZ3RhYiwKKwkJCQkJd192YWx1ZSAmIDB4ZmYsIHJlcS0+YnVmKTsKKwkJCWlmICh2YWx1ZSA+PSAwKSB7CisJCQkJdmFsdWUgPSBtaW4od19sZW5ndGgsICh1MTYpdmFsdWUpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwkvKiBjdXJyZW50bHkgdHdvIGNvbmZpZ3MsIHR3byBzcGVlZHMgKi8KKwljYXNlIFVTQl9SRVFfU0VUX0NPTkZJR1VSQVRJT046CisJCWlmIChjdHJsLT5iUmVxdWVzdFR5cGUgIT0gMCkgeworCQkJZ290byB1bmtub3duOworCQl9CisJCWlmIChnYWRnZXQtPmFfaG5wX3N1cHBvcnQpIHsKKwkJCURCRyhkZXYsICJITlAgYXZhaWxhYmxlXG4iKTsKKwkJfSBlbHNlIGlmIChnYWRnZXQtPmFfYWx0X2hucF9zdXBwb3J0KSB7CisJCQlEQkcoZGV2LCAiSE5QIG5lZWRzIGEgZGlmZmVyZW50IHJvb3QgcG9ydFxuIik7CisJCX0gZWxzZSB7CisJCQlWREJHKGRldiwgIkhOUCBpbmFjdGl2ZVxuIik7CisJCX0KKwkJc3Bpbl9sb2NrKCZkZXYtPmxvY2spOworCQl2YWx1ZSA9IGdtaWRpX3NldF9jb25maWcoZGV2LCB3X3ZhbHVlLCBHRlBfQVRPTUlDKTsKKwkJc3Bpbl91bmxvY2soJmRldi0+bG9jayk7CisJCWJyZWFrOworCWNhc2UgVVNCX1JFUV9HRVRfQ09ORklHVVJBVElPTjoKKwkJaWYgKGN0cmwtPmJSZXF1ZXN0VHlwZSAhPSBVU0JfRElSX0lOKSB7CisJCQlnb3RvIHVua25vd247CisJCX0KKwkJKih1OCAqKXJlcS0+YnVmID0gZGV2LT5jb25maWc7CisJCXZhbHVlID0gbWluKHdfbGVuZ3RoLCAodTE2KTEpOworCQlicmVhazsKKworCS8qIHVudGlsIHdlIGFkZCBhbHRzZXR0aW5nIHN1cHBvcnQsIG9yIG90aGVyIGludGVyZmFjZXMsCisJICogb25seSAwLzAgYXJlIHBvc3NpYmxlLiAgcHhhMnh4IG9ubHkgc3VwcG9ydHMgMC8wIChwb29ybHkpCisJICogYW5kIGFscmVhZHkga2lsbGVkIHBlbmRpbmcgZW5kcG9pbnQgSS9PLgorCSAqLworCWNhc2UgVVNCX1JFUV9TRVRfSU5URVJGQUNFOgorCQlpZiAoY3RybC0+YlJlcXVlc3RUeXBlICE9IFVTQl9SRUNJUF9JTlRFUkZBQ0UpIHsKKwkJCWdvdG8gdW5rbm93bjsKKwkJfQorCQlzcGluX2xvY2soJmRldi0+bG9jayk7CisJCWlmIChkZXYtPmNvbmZpZyAmJiB3X2luZGV4IDwgR01JRElfTlVNX0lOVEVSRkFDRVMKKwkJCSYmIHdfdmFsdWUgPT0gMCkKKwkJeworCQkJdTggY29uZmlnID0gZGV2LT5jb25maWc7CisKKwkJCS8qIHJlc2V0cyBpbnRlcmZhY2UgY29uZmlndXJhdGlvbiwgZm9yZ2V0cyBhYm91dAorCQkJICogcHJldmlvdXMgdHJhbnNhY3Rpb24gc3RhdGUgKHF1ZXVlZCBidWZzLCBldGMpCisJCQkgKiBhbmQgcmUtaW5pdHMgZW5kcG9pbnQgc3RhdGUgKHRvZ2dsZSBldGMpCisJCQkgKiBubyByZXNwb25zZSBxdWV1ZWQsIGp1c3QgemVybyBzdGF0dXMgPT0gc3VjY2Vzcy4KKwkJCSAqIGlmIHdlIGhhZCBtb3JlIHRoYW4gb25lIGludGVyZmFjZSB3ZSBjb3VsZG4ndAorCQkJICogdXNlIHRoaXMgInJlc2V0IHRoZSBjb25maWciIHNob3J0Y3V0LgorCQkJICovCisJCQlnbWlkaV9yZXNldF9jb25maWcoZGV2KTsKKwkJCWdtaWRpX3NldF9jb25maWcoZGV2LCBjb25maWcsIEdGUF9BVE9NSUMpOworCQkJdmFsdWUgPSAwOworCQl9CisJCXNwaW5fdW5sb2NrKCZkZXYtPmxvY2spOworCQlicmVhazsKKwljYXNlIFVTQl9SRVFfR0VUX0lOVEVSRkFDRToKKwkJaWYgKGN0cmwtPmJSZXF1ZXN0VHlwZSAhPSAoVVNCX0RJUl9JTnxVU0JfUkVDSVBfSU5URVJGQUNFKSkgeworCQkJZ290byB1bmtub3duOworCQl9CisJCWlmICghZGV2LT5jb25maWcpIHsKKwkJCWJyZWFrOworCQl9CisJCWlmICh3X2luZGV4ID49IEdNSURJX05VTV9JTlRFUkZBQ0VTKSB7CisJCQl2YWx1ZSA9IC1FRE9NOworCQkJYnJlYWs7CisJCX0KKwkJKih1OCAqKXJlcS0+YnVmID0gMDsKKwkJdmFsdWUgPSBtaW4od19sZW5ndGgsICh1MTYpMSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKK3Vua25vd246CisJCVZEQkcoZGV2LCAidW5rbm93biBjb250cm9sIHJlcSUwMnguJTAyeCB2JTA0eCBpJTA0eCBsJWRcbiIsCisJCQljdHJsLT5iUmVxdWVzdFR5cGUsIGN0cmwtPmJSZXF1ZXN0LAorCQkJd192YWx1ZSwgd19pbmRleCwgd19sZW5ndGgpOworCX0KKworCS8qIHJlc3BvbmQgd2l0aCBkYXRhIHRyYW5zZmVyIGJlZm9yZSBzdGF0dXMgcGhhc2U/ICovCisJaWYgKHZhbHVlID49IDApIHsKKwkJcmVxLT5sZW5ndGggPSB2YWx1ZTsKKwkJcmVxLT56ZXJvID0gdmFsdWUgPCB3X2xlbmd0aDsKKwkJdmFsdWUgPSB1c2JfZXBfcXVldWUoZ2FkZ2V0LT5lcDAsIHJlcSwgR0ZQX0FUT01JQyk7CisJCWlmICh2YWx1ZSA8IDApIHsKKwkJCURCRyhkZXYsICJlcF9xdWV1ZSAtLT4gJWRcbiIsIHZhbHVlKTsKKwkJCXJlcS0+c3RhdHVzID0gMDsKKwkJCWdtaWRpX3NldHVwX2NvbXBsZXRlKGdhZGdldC0+ZXAwLCByZXEpOworCQl9CisJfQorCisJLyogZGV2aWNlIGVpdGhlciBzdGFsbHMgKHZhbHVlIDwgMCkgb3IgcmVwb3J0cyBzdWNjZXNzICovCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZCBnbWlkaV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCit7CisJc3RydWN0IGdtaWRpX2RldmljZSAqZGV2ID0gZ2V0X2dhZGdldF9kYXRhKGdhZGdldCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlnbWlkaV9yZXNldF9jb25maWcoZGV2KTsKKworCS8qIGEgbW9yZSBzaWduaWZpY2FudCBhcHBsaWNhdGlvbiBtaWdodCBoYXZlIHNvbWUgbm9uLXVzYgorCSAqIGFjdGl2aXRpZXMgdG8gcXVpZXNjZSBoZXJlLCBzYXZpbmcgcmVzb3VyY2VzIGxpa2UgcG93ZXIKKwkgKiBvciBwdXNoaW5nIHRoZSBub3RpZmljYXRpb24gdXAgYSBuZXR3b3JrIHN0YWNrLgorCSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCisJLyogbmV4dCB3ZSBtYXkgZ2V0IHNldHVwKCkgY2FsbHMgdG8gZW51bWVyYXRlIG5ldyBjb25uZWN0aW9uczsKKwkgKiBvciBhbiB1bmJpbmQoKSBkdXJpbmcgc2h1dGRvd24gKGluY2x1ZGluZyByZW1vdmluZyBtb2R1bGUpLgorCSAqLworfQorCitzdGF0aWMgdm9pZCAvKiBfX2luaXRfb3JfZXhpdCAqLyBnbWlkaV91bmJpbmQoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKK3sKKwlzdHJ1Y3QgZ21pZGlfZGV2aWNlICpkZXYgPSBnZXRfZ2FkZ2V0X2RhdGEoZ2FkZ2V0KTsKKwlzdHJ1Y3Qgc25kX2NhcmQqIGNhcmQ7CisKKwlEQkcoZGV2LCAidW5iaW5kXG4iKTsKKworCWNhcmQgPSBkZXYtPmNhcmQ7CisJZGV2LT5jYXJkID0gTlVMTDsKKwlpZiAoY2FyZCkgeworCQlzbmRfY2FyZF9mcmVlKGNhcmQpOworCX0KKworCS8qIHdlJ3ZlIGFscmVhZHkgYmVlbiBkaXNjb25uZWN0ZWQgLi4uIG5vIGkvbyBpcyBhY3RpdmUgKi8KKwlpZiAoZGV2LT5yZXEpIHsKKwkJZGV2LT5yZXEtPmxlbmd0aCA9IFVTQl9CVUZTSVo7CisJCWZyZWVfZXBfcmVxKGdhZGdldC0+ZXAwLCBkZXYtPnJlcSk7CisJfQorCWtmcmVlKGRldik7CisJc2V0X2dhZGdldF9kYXRhKGdhZGdldCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgZ21pZGlfc25kX2ZyZWUoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ21pZGlfdHJhbnNtaXRfcGFja2V0KHN0cnVjdCB1c2JfcmVxdWVzdCogcmVxLCB1aW50OF90IHAwLAorCQkJCQl1aW50OF90IHAxLCB1aW50OF90IHAyLCB1aW50OF90IHAzKQoreworCXVuc2lnbmVkIGxlbmd0aCA9IHJlcS0+bGVuZ3RoOworCisJdWludDhfdCogYnVmID0gKHVpbnQ4X3QqKXJlcS0+YnVmICsgbGVuZ3RoOworCWJ1ZlswXSA9IHAwOworCWJ1ZlsxXSA9IHAxOworCWJ1ZlsyXSA9IHAyOworCWJ1ZlszXSA9IHAzOworCXJlcS0+bGVuZ3RoID0gbGVuZ3RoICsgNDsKK30KKworLyoKKyAqIENvbnZlcnRzIE1JREkgY29tbWFuZHMgdG8gVVNCIE1JREkgcGFja2V0cy4KKyAqLworc3RhdGljIHZvaWQgZ21pZGlfdHJhbnNtaXRfYnl0ZShzdHJ1Y3QgdXNiX3JlcXVlc3QqIHJlcSwKKwkJCQlzdHJ1Y3QgZ21pZGlfaW5fcG9ydCogcG9ydCwgdWludDhfdCBiKQoreworCXVpbnQ4X3QgcDAgPSBwb3J0LT5jYWJsZTsKKworCWlmIChiID49IDB4ZjgpIHsKKwkJZ21pZGlfdHJhbnNtaXRfcGFja2V0KHJlcSwgcDAgfCAweDBmLCBiLCAwLCAwKTsKKwl9IGVsc2UgaWYgKGIgPj0gMHhmMCkgeworCQlzd2l0Y2ggKGIpIHsKKwkJY2FzZSAweGYwOgorCQkJcG9ydC0+ZGF0YVswXSA9IGI7CisJCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1NZU0VYXzE7CisJCQlicmVhazsKKwkJY2FzZSAweGYxOgorCQljYXNlIDB4ZjM6CisJCQlwb3J0LT5kYXRhWzBdID0gYjsKKwkJCXBvcnQtPnN0YXRlID0gU1RBVEVfMVBBUkFNOworCQkJYnJlYWs7CisJCWNhc2UgMHhmMjoKKwkJCXBvcnQtPmRhdGFbMF0gPSBiOworCQkJcG9ydC0+c3RhdGUgPSBTVEFURV8yUEFSQU1fMTsKKwkJCWJyZWFrOworCQljYXNlIDB4ZjQ6CisJCWNhc2UgMHhmNToKKwkJCXBvcnQtPnN0YXRlID0gU1RBVEVfVU5LTk9XTjsKKwkJCWJyZWFrOworCQljYXNlIDB4ZjY6CisJCQlnbWlkaV90cmFuc21pdF9wYWNrZXQocmVxLCBwMCB8IDB4MDUsIDB4ZjYsIDAsIDApOworCQkJcG9ydC0+c3RhdGUgPSBTVEFURV9VTktOT1dOOworCQkJYnJlYWs7CisJCWNhc2UgMHhmNzoKKwkJCXN3aXRjaCAocG9ydC0+c3RhdGUpIHsKKwkJCWNhc2UgU1RBVEVfU1lTRVhfMDoKKwkJCQlnbWlkaV90cmFuc21pdF9wYWNrZXQocmVxLAorCQkJCQlwMCB8IDB4MDUsIDB4ZjcsIDAsIDApOworCQkJCWJyZWFrOworCQkJY2FzZSBTVEFURV9TWVNFWF8xOgorCQkJCWdtaWRpX3RyYW5zbWl0X3BhY2tldChyZXEsCisJCQkJCXAwIHwgMHgwNiwgcG9ydC0+ZGF0YVswXSwgMHhmNywgMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNUQVRFX1NZU0VYXzI6CisJCQkJZ21pZGlfdHJhbnNtaXRfcGFja2V0KHJlcSwKKwkJCQkJcDAgfCAweDA3LCBwb3J0LT5kYXRhWzBdLAorCQkJCQlwb3J0LT5kYXRhWzFdLCAweGY3KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXBvcnQtPnN0YXRlID0gU1RBVEVfVU5LTk9XTjsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChiID49IDB4ODApIHsKKwkJcG9ydC0+ZGF0YVswXSA9IGI7CisJCWlmIChiID49IDB4YzAgJiYgYiA8PSAweGRmKQorCQkJcG9ydC0+c3RhdGUgPSBTVEFURV8xUEFSQU07CisJCWVsc2UKKwkJCXBvcnQtPnN0YXRlID0gU1RBVEVfMlBBUkFNXzE7CisJfSBlbHNlIHsgLyogYiA8IDB4ODAgKi8KKwkJc3dpdGNoIChwb3J0LT5zdGF0ZSkgeworCQljYXNlIFNUQVRFXzFQQVJBTToKKwkJCWlmIChwb3J0LT5kYXRhWzBdIDwgMHhmMCkgeworCQkJCXAwIHw9IHBvcnQtPmRhdGFbMF0gPj4gNDsKKwkJCX0gZWxzZSB7CisJCQkJcDAgfD0gMHgwMjsKKwkJCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1VOS05PV047CisJCQl9CisJCQlnbWlkaV90cmFuc21pdF9wYWNrZXQocmVxLCBwMCwgcG9ydC0+ZGF0YVswXSwgYiwgMCk7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV8yUEFSQU1fMToKKwkJCXBvcnQtPmRhdGFbMV0gPSBiOworCQkJcG9ydC0+c3RhdGUgPSBTVEFURV8yUEFSQU1fMjsKKwkJCWJyZWFrOworCQljYXNlIFNUQVRFXzJQQVJBTV8yOgorCQkJaWYgKHBvcnQtPmRhdGFbMF0gPCAweGYwKSB7CisJCQkJcDAgfD0gcG9ydC0+ZGF0YVswXSA+PiA0OworCQkJCXBvcnQtPnN0YXRlID0gU1RBVEVfMlBBUkFNXzE7CisJCQl9IGVsc2UgeworCQkJCXAwIHw9IDB4MDM7CisJCQkJcG9ydC0+c3RhdGUgPSBTVEFURV9VTktOT1dOOworCQkJfQorCQkJZ21pZGlfdHJhbnNtaXRfcGFja2V0KHJlcSwKKwkJCQlwMCwgcG9ydC0+ZGF0YVswXSwgcG9ydC0+ZGF0YVsxXSwgYik7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9TWVNFWF8wOgorCQkJcG9ydC0+ZGF0YVswXSA9IGI7CisJCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1NZU0VYXzE7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9TWVNFWF8xOgorCQkJcG9ydC0+ZGF0YVsxXSA9IGI7CisJCQlwb3J0LT5zdGF0ZSA9IFNUQVRFX1NZU0VYXzI7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9TWVNFWF8yOgorCQkJZ21pZGlfdHJhbnNtaXRfcGFja2V0KHJlcSwKKwkJCQlwMCB8IDB4MDQsIHBvcnQtPmRhdGFbMF0sIHBvcnQtPmRhdGFbMV0sIGIpOworCQkJcG9ydC0+c3RhdGUgPSBTVEFURV9TWVNFWF8wOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdtaWRpX3RyYW5zbWl0KHN0cnVjdCBnbWlkaV9kZXZpY2UqIGRldiwgc3RydWN0IHVzYl9yZXF1ZXN0KiByZXEpCit7CisJc3RydWN0IHVzYl9lcCogZXAgPSBkZXYtPmluX2VwOworCXN0cnVjdCBnbWlkaV9pbl9wb3J0KiBwb3J0ID0gJmRldi0+aW5fcG9ydDsKKworCWlmICghZXApIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoIXJlcSkgeworCQlyZXEgPSBhbGxvY19lcF9yZXEoZXAsIGJ1Zmxlbik7CisJfQorCWlmICghcmVxKSB7CisJCUVSUk9SKGRldiwgImdtaWRpX3RyYW5zbWl0OiBhbGxvY19lcF9yZXF1ZXN0IGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisJcmVxLT5sZW5ndGggPSAwOworCXJlcS0+Y29tcGxldGUgPSBnbWlkaV9jb21wbGV0ZTsKKworCWlmIChwb3J0LT5hY3RpdmUpIHsKKwkJd2hpbGUgKHJlcS0+bGVuZ3RoICsgMyA8IGJ1ZmxlbikgeworCQkJdWludDhfdCBiOworCQkJaWYgKHNuZF9yYXdtaWRpX3RyYW5zbWl0KGRldi0+aW5fc3Vic3RyZWFtLCAmYiwgMSkKKwkJCQkhPSAxKQorCQkJeworCQkJCXBvcnQtPmFjdGl2ZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQlnbWlkaV90cmFuc21pdF9ieXRlKHJlcSwgcG9ydCwgYik7CisJCX0KKwl9CisJaWYgKHJlcS0+bGVuZ3RoID4gMCkgeworCQl1c2JfZXBfcXVldWUoZXAsIHJlcSwgR0ZQX0FUT01JQyk7CisJfSBlbHNlIHsKKwkJZnJlZV9lcF9yZXEoZXAsIHJlcSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBnbWlkaV9pbl90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZ21pZGlfZGV2aWNlKiBkZXYgPSAoc3RydWN0IGdtaWRpX2RldmljZSopZGF0YTsKKworCWdtaWRpX3RyYW5zbWl0KGRldiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgZ21pZGlfaW5fb3BlbihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGdtaWRpX2RldmljZSogZGV2ID0gc3Vic3RyZWFtLT5ybWlkaS0+cHJpdmF0ZV9kYXRhOworCisJVkRCRyhkZXYsICJnbWlkaV9pbl9vcGVuXG4iKTsKKwlkZXYtPmluX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlkZXYtPmluX3BvcnQuc3RhdGUgPSBTVEFURV9VTktOT1dOOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdtaWRpX2luX2Nsb3NlKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlWREJHKGRldiwgImdtaWRpX2luX2Nsb3NlXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ21pZGlfaW5fdHJpZ2dlcihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCB1cCkKK3sKKwlzdHJ1Y3QgZ21pZGlfZGV2aWNlKiBkZXYgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisKKwlWREJHKGRldiwgImdtaWRpX2luX3RyaWdnZXIgJWRcbiIsIHVwKTsKKwlkZXYtPmluX3BvcnQuYWN0aXZlID0gdXA7CisJaWYgKHVwKSB7CisJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmRldi0+dGFza2xldCk7CisJfQorfQorCitzdGF0aWMgaW50IGdtaWRpX291dF9vcGVuKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgZ21pZGlfZGV2aWNlKiBkZXYgPSBzdWJzdHJlYW0tPnJtaWRpLT5wcml2YXRlX2RhdGE7CisKKwlWREJHKGRldiwgImdtaWRpX291dF9vcGVuXG4iKTsKKwlkZXYtPm91dF9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ21pZGlfb3V0X2Nsb3NlKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlWREJHKGRldiwgImdtaWRpX291dF9jbG9zZVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdtaWRpX291dF90cmlnZ2VyKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IHVwKQoreworCXN0cnVjdCBnbWlkaV9kZXZpY2UqIGRldiA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKKworCVZEQkcoZGV2LCAiZ21pZGlfb3V0X3RyaWdnZXIgJWRcbiIsIHVwKTsKKwlpZiAodXApIHsKKwkJc2V0X2JpdChzdWJzdHJlYW0tPm51bWJlciwgJmRldi0+b3V0X3RyaWdnZXJlZCk7CisJfSBlbHNlIHsKKwkJY2xlYXJfYml0KHN1YnN0cmVhbS0+bnVtYmVyLCAmZGV2LT5vdXRfdHJpZ2dlcmVkKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3Jhd21pZGlfb3BzIGdtaWRpX2luX29wcyA9IHsKKwkub3BlbiA9IGdtaWRpX2luX29wZW4sCisJLmNsb3NlID0gZ21pZGlfaW5fY2xvc2UsCisJLnRyaWdnZXIgPSBnbWlkaV9pbl90cmlnZ2VyLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcmF3bWlkaV9vcHMgZ21pZGlfb3V0X29wcyA9IHsKKwkub3BlbiA9IGdtaWRpX291dF9vcGVuLAorCS5jbG9zZSA9IGdtaWRpX291dF9jbG9zZSwKKwkudHJpZ2dlciA9IGdtaWRpX291dF90cmlnZ2VyCit9OworCisvKiByZWdpc3RlciBhcyBhIHNvdW5kICJjYXJkIiAqLworc3RhdGljIGludCBnbWlkaV9yZWdpc3Rlcl9jYXJkKHN0cnVjdCBnbWlkaV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CisJc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaTsKKwlpbnQgZXJyOworCWludCBvdXRfcG9ydHMgPSAxOworCWludCBpbl9wb3J0cyA9IDE7CisJc3RhdGljIHN0cnVjdCBzbmRfZGV2aWNlX29wcyBvcHMgPSB7CisJCS5kZXZfZnJlZSA9IGdtaWRpX3NuZF9mcmVlLAorCX07CisKKwljYXJkID0gc25kX2NhcmRfbmV3KGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIDApOworCWlmICghY2FyZCkgeworCQlFUlJPUihkZXYsICJzbmRfY2FyZF9uZXcgZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwlkZXYtPmNhcmQgPSBjYXJkOworCisJZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0xPV0xFVkVMLCBkZXYsICZvcHMpOworCWlmIChlcnIgPCAwKSB7CisJCUVSUk9SKGRldiwgInNuZF9kZXZpY2VfbmV3IGZhaWxlZDogZXJyb3IgJWRcbiIsIGVycik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlzdHJjcHkoY2FyZC0+ZHJpdmVyLCBsb25nbmFtZSk7CisJc3RyY3B5KGNhcmQtPmxvbmduYW1lLCBsb25nbmFtZSk7CisJc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgc2hvcnRuYW1lKTsKKworCS8qIFNldCB1cCByYXdtaWRpICovCisJZGV2LT5pbl9wb3J0LmRldiA9IGRldjsKKwlkZXYtPmluX3BvcnQuYWN0aXZlID0gMDsKKwlzbmRfY29tcG9uZW50X2FkZChjYXJkLCAiTUlESSIpOworCWVyciA9IHNuZF9yYXdtaWRpX25ldyhjYXJkLCAiVVNCIE1JREkgR2FkZ2V0IiwgMCwKKwkJCSAgICAgIG91dF9wb3J0cywgaW5fcG9ydHMsICZybWlkaSk7CisJaWYgKGVyciA8IDApIHsKKwkJRVJST1IoZGV2LCAic25kX3Jhd21pZGlfbmV3IGZhaWxlZDogZXJyb3IgJWRcbiIsIGVycik7CisJCWdvdG8gZmFpbDsKKwl9CisJZGV2LT5ybWlkaSA9IHJtaWRpOworCXN0cmNweShybWlkaS0+bmFtZSwgY2FyZC0+c2hvcnRuYW1lKTsKKwlybWlkaS0+aW5mb19mbGFncyA9IFNORFJWX1JBV01JRElfSU5GT19PVVRQVVQgfAorCQkJICAgIFNORFJWX1JBV01JRElfSU5GT19JTlBVVCB8CisJCQkgICAgU05EUlZfUkFXTUlESV9JTkZPX0RVUExFWDsKKwlybWlkaS0+cHJpdmF0ZV9kYXRhID0gZGV2OworCisJLyogWWVzLCByYXdtaWRpIE9VVFBVVCA9IFVTQiBJTiwgYW5kIHJhd21pZGkgSU5QVVQgPSBVU0IgT1VULgorCSAgIEl0J3MgYW4gdXBzaWRlLWRvd24gd29ybGQgYmVpbmcgYSBnYWRnZXQuICovCisJc25kX3Jhd21pZGlfc2V0X29wcyhybWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVULCAmZ21pZGlfaW5fb3BzKTsKKwlzbmRfcmF3bWlkaV9zZXRfb3BzKHJtaWRpLCBTTkRSVl9SQVdNSURJX1NUUkVBTV9JTlBVVCwgJmdtaWRpX291dF9vcHMpOworCisJc25kX2NhcmRfc2V0X2RldihjYXJkLCAmZGV2LT5nYWRnZXQtPmRldik7CisKKwkvKiByZWdpc3RlciBpdCAtIHdlJ3JlIHJlYWR5IHRvIGdvICovCisJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJaWYgKGVyciA8IDApIHsKKwkJRVJST1IoZGV2LCAic25kX2NhcmRfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCVZEQkcoZGV2LCAiZ21pZGlfcmVnaXN0ZXJfY2FyZCBmaW5pc2hlZCBva1xuIik7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJaWYgKGRldi0+Y2FyZCkgeworCQlzbmRfY2FyZF9mcmVlKGRldi0+Y2FyZCk7CisJCWRldi0+Y2FyZCA9IE5VTEw7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDcmVhdGVzIGFuIG91dHB1dCBlbmRwb2ludCwgYW5kIGluaXRpYWxpemVzIG91dHB1dCBwb3J0cy4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgZ21pZGlfYmluZChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQoreworCXN0cnVjdCBnbWlkaV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgdXNiX2VwICppbl9lcCwgKm91dF9lcDsKKwlpbnQgZ2NudW0sIGVyciA9IDA7CisKKwkvKiBzdXBwb3J0IG9wdGlvbmFsIHZlbmRvci9kaXN0cm8gY3VzdG9taXphdGlvbiAqLworCWlmIChpZFZlbmRvcikgeworCQlpZiAoIWlkUHJvZHVjdCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpZFZlbmRvciBuZWVkcyBpZFByb2R1Y3QhXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWRldmljZV9kZXNjLmlkVmVuZG9yID0gY3B1X3RvX2xlMTYoaWRWZW5kb3IpOworCQlkZXZpY2VfZGVzYy5pZFByb2R1Y3QgPSBjcHVfdG9fbGUxNihpZFByb2R1Y3QpOworCQlpZiAoYmNkRGV2aWNlKSB7CisJCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBjcHVfdG9fbGUxNihiY2REZXZpY2UpOworCQl9CisJfQorCWlmIChpTWFudWZhY3R1cmVyKSB7CisJCXN0cmxjcHkobWFudWZhY3R1cmVyLCBpTWFudWZhY3R1cmVyLCBzaXplb2YobWFudWZhY3R1cmVyKSk7CisJfSBlbHNlIHsKKwkJc25wcmludGYobWFudWZhY3R1cmVyLCBzaXplb2YobWFudWZhY3R1cmVyKSwgIiVzICVzIHdpdGggJXMiLAorCQkJc3lzdGVtX3V0c25hbWUuc3lzbmFtZSwgc3lzdGVtX3V0c25hbWUucmVsZWFzZSwKKwkJCWdhZGdldC0+bmFtZSk7CisJfQorCWlmIChpUHJvZHVjdCkgeworCQlzdHJsY3B5KHByb2R1Y3RfZGVzYywgaVByb2R1Y3QsIHNpemVvZihwcm9kdWN0X2Rlc2MpKTsKKwl9CisJaWYgKGlTZXJpYWxOdW1iZXIpIHsKKwkJZGV2aWNlX2Rlc2MuaVNlcmlhbE51bWJlciA9IFNUUklOR19TRVJJQUwsCisJCXN0cmxjcHkoc2VyaWFsX251bWJlciwgaVNlcmlhbE51bWJlciwgc2l6ZW9mKHNlcmlhbF9udW1iZXIpKTsKKwl9CisKKwkvKiBCdWxrLW9ubHkgZHJpdmVycyBsaWtlIHRoaXMgb25lIFNIT1VMRCBiZSBhYmxlIHRvCisJICogYXV0b2NvbmZpZ3VyZSBvbiBhbnkgc2FuZSB1c2IgY29udHJvbGxlciBkcml2ZXIsCisJICogYnV0IHRoZXJlIG1heSBhbHNvIGJlIGltcG9ydGFudCBxdWlya3MgdG8gYWRkcmVzcy4KKwkgKi8KKwl1c2JfZXBfYXV0b2NvbmZpZ19yZXNldChnYWRnZXQpOworCWluX2VwID0gdXNiX2VwX2F1dG9jb25maWcoZ2FkZ2V0LCAmYnVsa19pbl9kZXNjKTsKKwlpZiAoIWluX2VwKSB7CithdXRvY29uZl9mYWlsOgorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBhdXRvY29uZmlndXJlIG9uICVzXG4iLAorCQkJc2hvcnRuYW1lLCBnYWRnZXQtPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJRVBfSU5fTkFNRSA9IGluX2VwLT5uYW1lOworCWluX2VwLT5kcml2ZXJfZGF0YSA9IGluX2VwOwkvKiBjbGFpbSAqLworCisJb3V0X2VwID0gdXNiX2VwX2F1dG9jb25maWcoZ2FkZ2V0LCAmYnVsa19vdXRfZGVzYyk7CisJaWYgKCFvdXRfZXApIHsKKwkJZ290byBhdXRvY29uZl9mYWlsOworCX0KKwlFUF9PVVRfTkFNRSA9IG91dF9lcC0+bmFtZTsKKwlvdXRfZXAtPmRyaXZlcl9kYXRhID0gb3V0X2VwOwkvKiBjbGFpbSAqLworCisJZ2NudW0gPSB1c2JfZ2FkZ2V0X2NvbnRyb2xsZXJfbnVtYmVyKGdhZGdldCk7CisJaWYgKGdjbnVtID49IDApIHsKKwkJZGV2aWNlX2Rlc2MuYmNkRGV2aWNlID0gY3B1X3RvX2xlMTYoMHgwMjAwICsgZ2NudW0pOworCX0gZWxzZSB7CisJCS8qIGdtaWRpIGlzIHNvIHNpbXBsZSAobm8gYWx0c2V0dGluZ3MpIHRoYXQKKwkJICogaXQgU0hPVUxEIE5PVCBoYXZlIHByb2JsZW1zIHdpdGggYnVsay1jYXBhYmxlIGhhcmR3YXJlLgorCQkgKiBzbyB3YXJuIGFib3V0IHVucmVjb2duaXplZCBjb250cm9sbGVycywgZG9uJ3QgcGFuaWMuCisJCSAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY29udHJvbGxlciAnJXMnIG5vdCByZWNvZ25pemVkXG4iLAorCQkJc2hvcnRuYW1lLCBnYWRnZXQtPm5hbWUpOworCQlkZXZpY2VfZGVzYy5iY2REZXZpY2UgPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4OTk5OSk7CisJfQorCisKKwkvKiBvaywgd2UgbWFkZSBzZW5zZSBvZiB0aGUgaGFyZHdhcmUgLi4uICovCisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWRldikgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJmRldi0+bG9jayk7CisJZGV2LT5nYWRnZXQgPSBnYWRnZXQ7CisJZGV2LT5pbl9lcCA9IGluX2VwOworCWRldi0+b3V0X2VwID0gb3V0X2VwOworCXNldF9nYWRnZXRfZGF0YShnYWRnZXQsIGRldik7CisJdGFza2xldF9pbml0KCZkZXYtPnRhc2tsZXQsIGdtaWRpX2luX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKWRldik7CisKKwkvKiBwcmVhbGxvY2F0ZSBjb250cm9sIHJlc3BvbnNlIGFuZCBidWZmZXIgKi8KKwlkZXYtPnJlcSA9IHVzYl9lcF9hbGxvY19yZXF1ZXN0KGdhZGdldC0+ZXAwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+cmVxKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJZGV2LT5yZXEtPmJ1ZiA9IHVzYl9lcF9hbGxvY19idWZmZXIoZ2FkZ2V0LT5lcDAsIFVTQl9CVUZTSVosCisJCQkJJmRldi0+cmVxLT5kbWEsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5yZXEtPmJ1ZikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJZGV2LT5yZXEtPmNvbXBsZXRlID0gZ21pZGlfc2V0dXBfY29tcGxldGU7CisKKwlkZXZpY2VfZGVzYy5iTWF4UGFja2V0U2l6ZTAgPSBnYWRnZXQtPmVwMC0+bWF4cGFja2V0OworCisJZ2FkZ2V0LT5lcDAtPmRyaXZlcl9kYXRhID0gZGV2OworCisJSU5GTyhkZXYsICIlcywgdmVyc2lvbjogIiBEUklWRVJfVkVSU0lPTiAiXG4iLCBsb25nbmFtZSk7CisJSU5GTyhkZXYsICJ1c2luZyAlcywgT1VUICVzIElOICVzXG4iLCBnYWRnZXQtPm5hbWUsCisJCUVQX09VVF9OQU1FLCBFUF9JTl9OQU1FKTsKKworCS8qIHJlZ2lzdGVyIGFzIGFuIEFMU0Egc291bmQgY2FyZCAqLworCWVyciA9IGdtaWRpX3JlZ2lzdGVyX2NhcmQoZGV2KTsKKwlpZiAoZXJyIDwgMCkgeworCQlnb3RvIGZhaWw7CisJfQorCisJVkRCRyhkZXYsICJnbWlkaV9iaW5kIGZpbmlzaGVkIG9rXG4iKTsKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlnbWlkaV91bmJpbmQoZ2FkZ2V0KTsKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyB2b2lkIGdtaWRpX3N1c3BlbmQoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKK3sKKwlzdHJ1Y3QgZ21pZGlfZGV2aWNlICpkZXYgPSBnZXRfZ2FkZ2V0X2RhdGEoZ2FkZ2V0KTsKKworCWlmIChnYWRnZXQtPnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKSB7CisJCXJldHVybjsKKwl9CisKKwlEQkcoZGV2LCAic3VzcGVuZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGdtaWRpX3Jlc3VtZShzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQoreworCXN0cnVjdCBnbWlkaV9kZXZpY2UgKmRldiA9IGdldF9nYWRnZXRfZGF0YShnYWRnZXQpOworCisJREJHKGRldiwgInJlc3VtZVxuIik7Cit9CisKKworc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciBnbWlkaV9kcml2ZXIgPSB7CisJLnNwZWVkCQk9IFVTQl9TUEVFRF9GVUxMLAorCS5mdW5jdGlvbgk9IChjaGFyICopbG9uZ25hbWUsCisJLmJpbmQJCT0gZ21pZGlfYmluZCwKKwkudW5iaW5kCQk9IF9fZXhpdF9wKGdtaWRpX3VuYmluZCksCisKKwkuc2V0dXAJCT0gZ21pZGlfc2V0dXAsCisJLmRpc2Nvbm5lY3QJPSBnbWlkaV9kaXNjb25uZWN0LAorCisJLnN1c3BlbmQJPSBnbWlkaV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gZ21pZGlfcmVzdW1lLAorCisJLmRyaXZlciAJPSB7CisJCS5uYW1lCQk9IChjaGFyICopc2hvcnRuYW1lLAorCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGdtaWRpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gdXNiX2dhZGdldF9yZWdpc3Rlcl9kcml2ZXIoJmdtaWRpX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChnbWlkaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGdtaWRpX2NsZWFudXAodm9pZCkKK3sKKwl1c2JfZ2FkZ2V0X3VucmVnaXN0ZXJfZHJpdmVyKCZnbWlkaV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoZ21pZGlfY2xlYW51cCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9pbm9kZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKaW5kZXggM2JkYzVlMy4uNDY1NTUyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CkBAIC0yMjIsNyArMjIzLDYgQEAKIAkvKiBuZWVkcyBubyBtb3JlIGNsZWFudXAgKi8KIAlCVUdfT04gKCFsaXN0X2VtcHR5ICgmZGF0YS0+ZXBmaWxlcykpOwogCUJVR19PTiAod2FpdHF1ZXVlX2FjdGl2ZSAoJmRhdGEtPndhaXQpKTsKLQlCVUdfT04gKGRvd25fdHJ5bG9jayAoJmRhdGEtPmxvY2spICE9IDApOwogCWtmcmVlIChkYXRhKTsKIH0KIApAQCAtNDc3LDYgKzQ3NywxMCBAQAogZXBfcmVsZWFzZSAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZkKQogewogCXN0cnVjdCBlcF9kYXRhCQkqZGF0YSA9IGZkLT5wcml2YXRlX2RhdGE7CisJaW50IHZhbHVlOworCisJaWYgKCh2YWx1ZSA9IGRvd25faW50ZXJydXB0aWJsZSgmZGF0YS0+bG9jaykpIDwgMCkKKwkJcmV0dXJuIHZhbHVlOwogCiAJLyogY2xlYW4gdXAgaWYgdGhpcyBjYW4gYmUgcmVvcGVuZWQgKi8KIAlpZiAoZGF0YS0+c3RhdGUgIT0gU1RBVEVfRVBfVU5CT1VORCkgewpAQCAtNDg1LDYgKzQ4OSw3IEBACiAJCWRhdGEtPmhzX2Rlc2MuYkRlc2NyaXB0b3JUeXBlID0gMDsKIAkJdXNiX2VwX2Rpc2FibGUoZGF0YS0+ZXApOwogCX0KKwl1cCAoJmRhdGEtPmxvY2spOwogCXB1dF9lcCAoZGF0YSk7CiAJcmV0dXJuIDA7CiB9CkBAIC03MDksNyArNzE0LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qIHVzZWQgYWZ0ZXIgZW5kcG9pbnQgY29uZmlndXJhdGlvbiAqLwotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXBfaW9fb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVwX2lvX29wZXJhdGlvbnMgPSB7CiAJLm93bmVyID0JVEhJU19NT0RVTEUsCiAJLmxsc2VlayA9CW5vX2xsc2VlaywKIApAQCAtNzQxLDcgKzc0Niw3IEBACiAJc3RydWN0IGVwX2RhdGEJCSpkYXRhID0gZmQtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgdXNiX2VwCQkqZXA7CiAJdTMyCQkJdGFnOwotCWludAkJCXZhbHVlOworCWludAkJCXZhbHVlLCBsZW5ndGggPSBsZW47CiAKIAlpZiAoKHZhbHVlID0gZG93bl9pbnRlcnJ1cHRpYmxlICgmZGF0YS0+bG9jaykpIDwgMCkKIAkJcmV0dXJuIHZhbHVlOwpAQCAtNzkyLDcgKzc5Nyw2IEBACiAJCQlnb3RvIGZhaWwwOwogCQl9CiAJfQotCXZhbHVlID0gbGVuOwogCiAJc3Bpbl9sb2NrX2lycSAoJmRhdGEtPmRldi0+bG9jayk7CiAJaWYgKGRhdGEtPmRldi0+c3RhdGUgPT0gU1RBVEVfREVWX1VOQk9VTkQpIHsKQEAgLTgyMiw4ICs4MjYsMTAgQEAKIAkJCQlkYXRhLT5uYW1lKTsKIAkJZGF0YS0+c3RhdGUgPSBTVEFURV9FUF9ERUZFUl9FTkFCTEU7CiAJfQotCWlmICh2YWx1ZSA9PSAwKQorCWlmICh2YWx1ZSA9PSAwKSB7CiAJCWZkLT5mX29wID0gJmVwX2lvX29wZXJhdGlvbnM7CisJCXZhbHVlID0gbGVuZ3RoOworCX0KIGdvbmU6CiAJc3Bpbl91bmxvY2tfaXJxICgmZGF0YS0+ZGV2LT5sb2NrKTsKIAlpZiAodmFsdWUgPCAwKSB7CkBAIC04NDQsNyArODUwLDcgQEAKIHN0YXRpYyBpbnQKIGVwX29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmZCkKIHsKLQlzdHJ1Y3QgZXBfZGF0YQkJKmRhdGEgPSBpbm9kZS0+dS5nZW5lcmljX2lwOworCXN0cnVjdCBlcF9kYXRhCQkqZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CiAJaW50CQkJdmFsdWUgPSAtRUJVU1k7CiAKIAlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmZGF0YS0+bG9jaykgIT0gMCkKQEAgLTg2Nyw3ICs4NzMsNyBAQAogfQogCiAvKiB1c2VkIGJlZm9yZSBlbmRwb2ludCBjb25maWd1cmF0aW9uICovCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlcF9jb25maWdfb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVwX2NvbmZpZ19vcGVyYXRpb25zID0gewogCS5vd25lciA9CVRISVNfTU9EVUxFLAogCS5sbHNlZWsgPQlub19sbHNlZWssCiAKQEAgLTEwMDksNyArMTAxNSw3IEBACiAJCQllbHNlIHsKIAkJCQlsZW4gPSBtaW4gKGxlbiwgKHNpemVfdClkZXYtPnJlcS0+YWN0dWFsKTsKIC8vIEZJWE1FIGRvbid0IGNhbGwgdGhpcyB3aXRoIHRoZSBzcGlubG9jayBoZWxkIC4uLgotCQkJCWlmIChjb3B5X3RvX3VzZXIgKGJ1ZiwgJmRldi0+cmVxLT5idWYsIGxlbikpCisJCQkJaWYgKGNvcHlfdG9fdXNlciAoYnVmLCBkZXYtPnJlcS0+YnVmLCBsZW4pKQogCQkJCQlyZXR2YWwgPSAtRUZBVUxUOwogCQkJCWNsZWFuX3JlcSAoZGV2LT5nYWRnZXQtPmVwMCwgZGV2LT5yZXEpOwogCQkJCS8qIE5PVEUgdXNlcnNwYWNlIGNhbid0IHlldCBjaG9vc2UgdG8gc3RhbGwgKi8KQEAgLTEyMjksNiArMTIzNSwzNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50CitlcDBfcG9sbCAoc3RydWN0IGZpbGUgKmZkLCBwb2xsX3RhYmxlICp3YWl0KQoreworICAgICAgIHN0cnVjdCBkZXZfZGF0YSAgICAgICAgICpkZXYgPSBmZC0+cHJpdmF0ZV9kYXRhOworICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1hc2sgPSAwOworCisgICAgICAgcG9sbF93YWl0KGZkLCAmZGV2LT53YWl0LCB3YWl0KTsKKworICAgICAgIHNwaW5fbG9ja19pcnEgKCZkZXYtPmxvY2spOworCisgICAgICAgLyogcmVwb3J0IGZkIG1vZGUgY2hhbmdlIGJlZm9yZSBhY3Rpbmcgb24gaXQgKi8KKyAgICAgICBpZiAoZGV2LT5zZXR1cF9hYm9ydCkgeworICAgICAgICAgICAgICAgZGV2LT5zZXR1cF9hYm9ydCA9IDA7CisgICAgICAgICAgICAgICBtYXNrID0gUE9MTEhVUDsKKyAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgIH0KKworICAgICAgIGlmIChkZXYtPnN0YXRlID09IFNUQVRFX1NFVFVQKSB7CisgICAgICAgICAgICAgICBpZiAoZGV2LT5zZXR1cF9pbiB8fCBkZXYtPnNldHVwX2Nhbl9zdGFsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgbWFzayA9IFBPTExPVVQ7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIGlmIChkZXYtPmV2X25leHQgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgbWFzayA9IFBPTExJTjsKKyAgICAgICB9CitvdXQ6CisgICAgICAgc3Bpbl91bmxvY2tfaXJxKCZkZXYtPmxvY2spOworICAgICAgIHJldHVybiBtYXNrOworfQorCiBzdGF0aWMgaW50IGRldl9pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZkLAogCQl1bnNpZ25lZCBjb2RlLCB1bnNpZ25lZCBsb25nIHZhbHVlKQogewpAQCAtMTI0MSwxNCArMTI3NiwxNCBAQAogfQogCiAvKiB1c2VkIGFmdGVyIGRldmljZSBjb25maWd1cmF0aW9uICovCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlcDBfaW9fb3BlcmF0aW9ucyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVwMF9pb19vcGVyYXRpb25zID0gewogCS5vd25lciA9CVRISVNfTU9EVUxFLAogCS5sbHNlZWsgPQlub19sbHNlZWssCiAKIAkucmVhZCA9CQllcDBfcmVhZCwKIAkud3JpdGUgPQllcDBfd3JpdGUsCiAJLmZhc3luYyA9CWVwMF9mYXN5bmMsCi0JLy8gLnBvbGwgPQllcDBfcG9sbCwKKwkucG9sbCA9CQllcDBfcG9sbCwKIAkuaW9jdGwgPQlkZXZfaW9jdGwsCiAJLnJlbGVhc2UgPQlkZXZfcmVsZWFzZSwKIH07CkBAIC0xNjk2LDE2ICsxNzMxLDE3IEBACiB7CiAJc3RydWN0IGRldl9kYXRhCQkqZGV2ID0gZ2V0X2dhZGdldF9kYXRhIChnYWRnZXQpOwogCisJc3Bpbl9sb2NrICgmZGV2LT5sb2NrKTsKIAlpZiAoZGV2LT5zdGF0ZSA9PSBTVEFURV9VTkNPTk5FQ1RFRCkgewogCQlEQkcgKGRldiwgImFscmVhZHkgdW5jb25uZWN0ZWRcbiIpOwotCQlyZXR1cm47CisJCWdvdG8gZXhpdDsKIAl9CiAJZGV2LT5zdGF0ZSA9IFNUQVRFX1VOQ09OTkVDVEVEOwogCiAJSU5GTyAoZGV2LCAiZGlzY29ubmVjdGVkXG4iKTsKLQlzcGluX2xvY2sgKCZkZXYtPmxvY2spOwogCW5leHRfZXZlbnQgKGRldiwgR0FER0VURlNfRElTQ09OTkVDVCk7CiAJZXAwX3JlYWRhYmxlIChkZXYpOworZXhpdDoKIAlzcGluX3VubG9jayAoJmRldi0+bG9jayk7CiB9CiAKQEAgLTE5MDksNyArMTk0NSw3IEBACiBzdGF0aWMgaW50CiBkZXZfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZkKQogewotCXN0cnVjdCBkZXZfZGF0YQkJKmRldiA9IGlub2RlLT51LmdlbmVyaWNfaXA7CisJc3RydWN0IGRldl9kYXRhCQkqZGV2ID0gaW5vZGUtPmlfcHJpdmF0ZTsKIAlpbnQJCQl2YWx1ZSA9IC1FQlVTWTsKIAogCWlmIChkZXYtPnN0YXRlID09IFNUQVRFX0RFVl9ESVNBQkxFRCkgewpAQCAtMTkyMiw3ICsxOTU4LDcgQEAKIAlyZXR1cm4gdmFsdWU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRldl9pbml0X29wZXJhdGlvbnMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZXZfaW5pdF9vcGVyYXRpb25zID0gewogCS5vd25lciA9CVRISVNfTU9EVUxFLAogCS5sbHNlZWsgPQlub19sbHNlZWssCiAKQEAgLTE5NjYsMTEgKzIwMDIsMTAgQEAKIAkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlub2RlLT5pX3VpZCA9IGRlZmF1bHRfdWlkOwogCQlpbm9kZS0+aV9naWQgPSBkZWZhdWx0X2dpZDsKLQkJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lCiAJCQkJPSBDVVJSRU5UX1RJTUU7Ci0JCWlub2RlLT51LmdlbmVyaWNfaXAgPSBkYXRhOworCQlpbm9kZS0+aV9wcml2YXRlID0gZGF0YTsKIAkJaW5vZGUtPmlfZm9wID0gZm9wczsKIAl9CiAJcmV0dXJuIGlub2RlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMKaW5kZXggMDkyNDMyMy4uM2JkYTM3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jCkBAIC0yLDcgKzIsNyBAQAogICogRHJpdmVyIGZvciB0aGUgUExYIE5FVDIyODAgVVNCIGRldmljZSBjb250cm9sbGVyLgogICogU3BlY3MgYW5kIGVycmF0YSBhcmUgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cucGx4dGVjaC5jb20+LgogICoKLSAqIFBMWCBUZWNobm9sb2d5IEluYy4gKGZvcm1lcmx5IE5ldENoaXAgVGVjaG5vbG9neSkgc3VwcG9ydGVkIHRoZSAKKyAqIFBMWCBUZWNobm9sb2d5IEluYy4gKGZvcm1lcmx5IE5ldENoaXAgVGVjaG5vbG9neSkgc3VwcG9ydGVkIHRoZQogICogZGV2ZWxvcG1lbnQgb2YgdGhpcyBkcml2ZXIuCiAgKgogICoKQEAgLTI2LDcgKzI2LDggQEAKICAqIENvcHlyaWdodCAoQykgMjAwMyBEYXZpZCBCcm93bmVsbAogICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDUgUExYIFRlY2hub2xvZ3ksIEluYy4KICAqCi0gKiBNb2RpZmllZCBTZXRoIExldnkgMjAwNSBQTFggVGVjaG5vbG9neSwgSW5jLiB0byBwcm92aWRlIGNvbXBhdGliaWxpdHkgd2l0aCAyMjgyIGNoaXAKKyAqIE1vZGlmaWVkIFNldGggTGV2eSAyMDA1IFBMWCBUZWNobm9sb2d5LCBJbmMuIHRvIHByb3ZpZGUgY29tcGF0aWJpbGl0eQorICoJd2l0aCAyMjgyIGNoaXAKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTg1LDcgKzg2LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9kZXNjIFtdID0gRFJJVkVSX0RFU0M7CiAKIHN0YXRpYyBjb25zdCBjaGFyIGVwMG5hbWUgW10gPSAiZXAwIjsKLXN0YXRpYyBjb25zdCBjaGFyICplcF9uYW1lIFtdID0geworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGVwX25hbWUgW10gPSB7CiAJZXAwbmFtZSwKIAkiZXAtYSIsICJlcC1iIiwgImVwLWMiLCAiZXAtZCIsCiAJImVwLWUiLCAiZXAtZiIsCkBAIC0yMjUsNyArMjI2LDkgQEAKIAlpZiAoIWVwLT5pc19pbikKIAkJd3JpdGVsICgoMSA8PCBTRVRfTkFLX09VVF9QQUNLRVRTKSwgJmVwLT5yZWdzLT5lcF9yc3ApOwogCWVsc2UgaWYgKGRldi0+cGRldi0+ZGV2aWNlICE9IDB4MjI4MCkgewotCQkvKiBBZGRlZCBmb3IgMjI4MiwgRG9uJ3QgdXNlIG5hayBwYWNrZXRzIG9uIGFuIGluIGVuZHBvaW50LCB0aGlzIHdhcyBpZ25vcmVkIG9uIDIyODAgKi8KKwkJLyogQWRkZWQgZm9yIDIyODIsIERvbid0IHVzZSBuYWsgcGFja2V0cyBvbiBhbiBpbiBlbmRwb2ludCwKKwkJICogdGhpcyB3YXMgaWdub3JlZCBvbiAyMjgwCisJCSAqLwogCQl3cml0ZWwgKCgxIDw8IENMRUFSX05BS19PVVRfUEFDS0VUUykKIAkJCXwgKDEgPDwgQ0xFQVJfTkFLX09VVF9QQUNLRVRTX01PREUpLCAmZXAtPnJlZ3MtPmVwX3JzcCk7CiAJfQpAQCAtMjg4LDcgKzI5MSw3IEBACiAJcmV0dXJuIC1FVElNRURPVVQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VwX29wcyBuZXQyMjgwX2VwX29wczsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2VwX29wcyBuZXQyMjgwX2VwX29wczsKIAogc3RhdGljIHZvaWQgZXBfcmVzZXQgKHN0cnVjdCBuZXQyMjgwX3JlZ3MgX19pb21lbSAqcmVncywgc3RydWN0IG5ldDIyODBfZXAgKmVwKQogewpAQCAtNDQ5LDM0ICs0NTIsMTUgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotI3VuZGVmIFVTRV9LTUFMTE9DCi0KLS8qIG1hbnkgY29tbW9uIHBsYXRmb3JtcyBoYXZlIGRtYS1jb2hlcmVudCBjYWNoZXMsIHdoaWNoIG1lYW5zIHRoYXQgaXQncwotICogc2FmZSB0byB1c2Uga21hbGxvYygpIG1lbW9yeSBmb3IgYWxsIGkvbyBidWZmZXJzIHdpdGhvdXQgdXNpbmcgYW55Ci0gKiBjYWNoZSBmbHVzaGluZyBjYWxscy4gICh1bmxlc3MgeW91J3JlIHRyeWluZyB0byBzaGFyZSBjYWNoZSBsaW5lcwotICogYmV0d2VlbiBkbWEgYW5kIG5vbi1kbWEgYWN0aXZpdGllcywgd2hpY2ggaXMgYSBzbG93IGlkZWEgaW4gYW55IGNhc2UuKQorLyoKKyAqIGRtYS1jb2hlcmVudCBtZW1vcnkgYWxsb2NhdGlvbiAoZm9yIGRtYS1jYXBhYmxlIGVuZHBvaW50cykKICAqCi0gKiBvdGhlciBwbGF0Zm9ybXMgbmVlZCBtb3JlIGNhcmUsIHdpdGggMi41IGhhdmluZyBhIG1vZGVyYXRlbHkgZ2VuZXJhbAotICogc29sdXRpb24gKHdoaWNoIGZhbGxzIGRvd24gZm9yIGFsbG9jYXRpb25zIHNtYWxsZXIgdGhhbiBvbmUgcGFnZSkKLSAqIHRoYXQgaW1wcm92ZXMgc2lnbmlmaWNhbnRseSBvbiB0aGUgMi40IFBDSSBhbGxvY2F0b3JzIGJ5IHJlbW92aW5nCi0gKiB0aGUgcmVzdHJpY3Rpb24gdGhhdCBtZW1vcnkgbmV2ZXIgYmUgZnJlZWQgaW5faW50ZXJydXB0KCkuCisgKiBOT1RFOiB0aGUgZG1hXypfY29oZXJlbnQoKSBBUEkgY2FsbHMgc3Vjay4gIE1vc3QgaW1wbGVtZW50YXRpb25zIGFyZQorICogKGEpIHBhZ2Utb3JpZW50ZWQsIHNvIHNtYWxsIGJ1ZmZlcnMgbG9zZSBiaWc7IGFuZCAoYikgYXN5bW1ldHJpYyB3aXRoCisgKiByZXNwZWN0IHRvIGNhbGxzIHdpdGggaXJxcyBkaXNhYmxlZDogIGFsbG9jIGlzIHNhZmUsIGZyZWUgaXMgbm90LgorICogV2UgY3VycmVudGx5IHdvcmsgYXJvdW5kIChiKSwgYnV0IG5vdCAoYSkuCiAgKi8KLSNpZglkZWZpbmVkKENPTkZJR19YODYpCi0jZGVmaW5lIFVTRV9LTUFMTE9DCiAKLSNlbGlmCWRlZmluZWQoQ09ORklHX1BQQykgJiYgIWRlZmluZWQoQ09ORklHX05PVF9DT0hFUkVOVF9DQUNIRSkKLSNkZWZpbmUgVVNFX0tNQUxMT0MKLQotI2VsaWYJZGVmaW5lZChDT05GSUdfTUlQUykgJiYgIWRlZmluZWQoQ09ORklHX0RNQV9OT05DT0hFUkVOVCkKLSNkZWZpbmUgVVNFX0tNQUxMT0MKLQotLyogRklYTUUgdGhlcmUgYXJlIG90aGVyIGNhc2VzLCBpbmNsdWRpbmcgYW4geDg2LTY0IG9uZSAuLi4gICovCi0jZW5kaWYKLQotLyogYWxsb2NhdGluZyBidWZmZXJzIHRoaXMgd2F5IGVsaW1pbmF0ZXMgZG1hIG1hcHBpbmcgb3ZlcmhlYWQsIHdoaWNoCi0gKiBvbiBzb21lIHBsYXRmb3JtcyB3aWxsIG1lYW4gZWxpbWluYXRpbmcgYSBwZXItaW8gYnVmZmVyIGNvcHkuICB3aXRoCi0gKiBzb21lIGtpbmRzIG9mIHN5c3RlbSBjYWNoZXMsIGZ1cnRoZXIgdHdlYWtzIG1heSBzdGlsbCBiZSBuZWVkZWQuCi0gKi8KIHN0YXRpYyB2b2lkICoKIG5ldDIyODBfYWxsb2NfYnVmZmVyICgKIAlzdHJ1Y3QgdXNiX2VwCQkqX2VwLApAQCAtNDkzLDQzICs0NzcsNzEgQEAKIAkJcmV0dXJuIE5VTEw7CiAJKmRtYSA9IERNQV9BRERSX0lOVkFMSUQ7CiAKLSNpZglkZWZpbmVkKFVTRV9LTUFMTE9DKQotCXJldHZhbCA9IGttYWxsb2MoYnl0ZXMsIGdmcF9mbGFncyk7Ci0JaWYgKHJldHZhbCkKLQkJKmRtYSA9IHZpcnRfdG9fcGh5cyhyZXR2YWwpOwotI2Vsc2UKLQlpZiAoZXAtPmRtYSkgewotCQkvKiB0aGUgbWFpbiBwcm9ibGVtIHdpdGggdGhpcyBjYWxsIGlzIHRoYXQgaXQgd2FzdGVzIG1lbW9yeQotCQkgKiBvbiB0eXBpY2FsIDEvTiBwYWdlIGFsbG9jYXRpb25zOiBpdCBhbGxvY2F0ZXMgMS1OIHBhZ2VzLgotCQkgKi8KLSN3YXJuaW5nIFVzaW5nIGRtYV9hbGxvY19jb2hlcmVudCBldmVuIHdpdGggYnVmZmVycyBzbWFsbGVyIHRoYW4gYSBwYWdlLgorCWlmIChlcC0+ZG1hKQogCQlyZXR2YWwgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmVwLT5kZXYtPnBkZXYtPmRldiwKIAkJCQlieXRlcywgZG1hLCBnZnBfZmxhZ3MpOwotCX0gZWxzZQorCWVsc2UKIAkJcmV0dmFsID0ga21hbGxvYyhieXRlcywgZ2ZwX2ZsYWdzKTsKLSNlbmRpZgogCXJldHVybiByZXR2YWw7CiB9CiAKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYnVmbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGJ1ZmZlcnMpOworCitzdHJ1Y3QgZnJlZV9yZWNvcmQgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXVuc2lnbmVkCQlieXRlczsKKwlkbWFfYWRkcl90CQlkbWE7Cit9OworCitzdGF0aWMgdm9pZCBkb19mcmVlKHVuc2lnbmVkIGxvbmcgaWdub3JlZCkKK3sKKwlzcGluX2xvY2tfaXJxKCZidWZsb2NrKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmJ1ZmZlcnMpKSB7CisJCXN0cnVjdCBmcmVlX3JlY29yZAkqYnVmOworCisJCWJ1ZiA9IGxpc3RfZW50cnkoYnVmZmVycy5uZXh0LCBzdHJ1Y3QgZnJlZV9yZWNvcmQsIGxpc3QpOworCQlsaXN0X2RlbCgmYnVmLT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZidWZsb2NrKTsKKworCQlkbWFfZnJlZV9jb2hlcmVudChidWYtPmRldiwgYnVmLT5ieXRlcywgYnVmLCBidWYtPmRtYSk7CisKKwkJc3Bpbl9sb2NrX2lycSgmYnVmbG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmYnVmbG9jayk7Cit9CisKK3N0YXRpYyBERUNMQVJFX1RBU0tMRVQoZGVmZXJyZWRfZnJlZSwgZG9fZnJlZSwgMCk7CisKIHN0YXRpYyB2b2lkCiBuZXQyMjgwX2ZyZWVfYnVmZmVyICgKIAlzdHJ1Y3QgdXNiX2VwICpfZXAsCi0Jdm9pZCAqYnVmLAorCXZvaWQgKmFkZHJlc3MsCiAJZG1hX2FkZHJfdCBkbWEsCiAJdW5zaWduZWQgYnl0ZXMKICkgewogCS8qIGZyZWUgbWVtb3J5IGludG8gdGhlIHJpZ2h0IGFsbG9jYXRvciAqLwotI2lmbmRlZglVU0VfS01BTExPQwogCWlmIChkbWEgIT0gRE1BX0FERFJfSU5WQUxJRCkgewogCQlzdHJ1Y3QgbmV0MjI4MF9lcAkqZXA7CisJCXN0cnVjdCBmcmVlX3JlY29yZAkqYnVmID0gYWRkcmVzczsKKwkJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAKIAkJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbmV0MjI4MF9lcCwgZXApOwogCQlpZiAoIV9lcCkKIAkJCXJldHVybjsKLQkJZG1hX2ZyZWVfY29oZXJlbnQoJmVwLT5kZXYtPnBkZXYtPmRldiwgYnl0ZXMsIGJ1ZiwgZG1hKTsKKworCQllcCA9IGNvbnRhaW5lcl9vZiAoX2VwLCBzdHJ1Y3QgbmV0MjI4MF9lcCwgZXApOworCQlidWYtPmRldiA9ICZlcC0+ZGV2LT5wZGV2LT5kZXY7CisJCWJ1Zi0+Ynl0ZXMgPSBieXRlczsKKwkJYnVmLT5kbWEgPSBkbWE7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJ1ZmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9hZGRfdGFpbCgmYnVmLT5saXN0LCAmYnVmZmVycyk7CisJCXRhc2tsZXRfc2NoZWR1bGUoJmRlZmVycmVkX2ZyZWUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZidWZsb2NrLCBmbGFncyk7CiAJfSBlbHNlCi0jZW5kaWYKLQkJa2ZyZWUgKGJ1Zik7CisJCWtmcmVlIChhZGRyZXNzKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTczNyw3ICs3NDksOCBAQAogCSAqLwogCWlmIChlcC0+aXNfaW4pCiAJCWRtYWNvdW50IHw9ICgxIDw8IERNQV9ESVJFQ1RJT04pOwotCWlmICgoIWVwLT5pc19pbiAmJiAoZG1hY291bnQgJSBlcC0+ZXAubWF4cGFja2V0KSAhPSAwKSB8fCBlcC0+ZGV2LT5wZGV2LT5kZXZpY2UgIT0gMHgyMjgwKQorCWlmICgoIWVwLT5pc19pbiAmJiAoZG1hY291bnQgJSBlcC0+ZXAubWF4cGFja2V0KSAhPSAwKQorCQkJfHwgZXAtPmRldi0+cGRldi0+ZGV2aWNlICE9IDB4MjI4MCkKIAkJZG1hY291bnQgfD0gKDEgPDwgRU5EX09GX0NIQUlOKTsKIAogCXJlcS0+dmFsaWQgPSB2YWxpZDsKQEAgLTgxMiw3ICs4MjUsNyBAQAogCiAJLyogcHJldmlvdXMgT1VUIHBhY2tldCBtaWdodCBoYXZlIGJlZW4gc2hvcnQgKi8KIAlpZiAoIWVwLT5pc19pbiAmJiAoKHRtcCA9IHJlYWRsICgmZXAtPnJlZ3MtPmVwX3N0YXQpKQotCQkgCQkmICgxIDw8IE5BS19PVVRfUEFDS0VUUykpICE9IDApIHsKKwkJCQkmICgxIDw8IE5BS19PVVRfUEFDS0VUUykpICE9IDApIHsKIAkJd3JpdGVsICgoMSA8PCBTSE9SVF9QQUNLRVRfVFJBTlNGRVJSRURfSU5URVJSVVBUKSwKIAkJCSZlcC0+cmVncy0+ZXBfc3RhdCk7CiAKQEAgLTEzNzMsNyArMTM4Niw3IEBACiAJKHZvaWQpIHJlYWRsICgmZXAtPnJlZ3MtPmVwX3JzcCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VwX29wcyBuZXQyMjgwX2VwX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2VwX29wcyBuZXQyMjgwX2VwX29wcyA9IHsKIAkuZW5hYmxlCQk9IG5ldDIyODBfZW5hYmxlLAogCS5kaXNhYmxlCT0gbmV0MjI4MF9kaXNhYmxlLAogCkBAIC0xNjMxLDcgKzE2NDQsNyBAQAogCX0KIAogCS8qIEluZGV4ZWQgUmVnaXN0ZXJzICovCi0JCS8vIG5vbmUgeWV0IAorCQkvLyBub25lIHlldAogCiAJLyogU3RhdGlzdGljcyAqLwogCXQgPSBzY25wcmludGYgKG5leHQsIHNpemUsICJcbmlycXM6ICAiKTsKQEAgLTE2OTEsMTEgKzE3MDQsMTEgQEAKIAkJCQkoeyBjaGFyICp2YWw7CiAJCQkJIHN3aXRjaCAoZC0+Ym1BdHRyaWJ1dGVzICYgMHgwMykgewogCQkJCSBjYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEs6Ci0JCQkJIAl2YWwgPSAiYnVsayI7IGJyZWFrOworCQkJCQl2YWwgPSAiYnVsayI7IGJyZWFrOwogCQkJCSBjYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKLQkJCQkgCXZhbCA9ICJpbnRyIjsgYnJlYWs7CisJCQkJCXZhbCA9ICJpbnRyIjsgYnJlYWs7CiAJCQkJIGRlZmF1bHQ6Ci0JCQkJIAl2YWwgPSAiaXNvIjsgYnJlYWs7CisJCQkJCXZhbCA9ICJpc28iOyBicmVhazsKIAkJCQkgfTsgdmFsOyB9KSwKIAkJCQlsZTE2X3RvX2NwdSAoZC0+d01heFBhY2tldFNpemUpICYgMHgxZmZmLAogCQkJCWVwLT5kbWEgPyAiZG1hIiA6ICJwaW8iLCBlcC0+Zmlmb19zaXplCkBAIC0xODA4LDggKzE4MjEsOCBAQAogICogbmV0MjI4MF9zZXRfZmlmb19tb2RlIC0gY2hhbmdlIGFsbG9jYXRpb24gb2YgZmlmbyBidWZmZXJzCiAgKiBAZ2FkZ2V0OiBhY2Nlc3MgdG8gdGhlIG5ldDIyODAgZGV2aWNlIHRoYXQgd2lsbCBiZSB1cGRhdGVkCiAgKiBAbW9kZTogMCBmb3IgZGVmYXVsdCwgZm91ciAxa0IgYnVmZmVycyAoZXAtYSB0aHJvdWdoIGVwLWQpOwotICogCTEgZm9yIHR3byAya0IgYnVmZmVycyAoZXAtYSBhbmQgZXAtYiBvbmx5KTsKLSAqIAkyIGZvciBvbmUgMmtCIGJ1ZmZlciAoZXAtYSkgYW5kIHR3byAxa0Igb25lcyAoZXAtYiwgZXAtYykuCisgKgkxIGZvciB0d28gMmtCIGJ1ZmZlcnMgKGVwLWEgYW5kIGVwLWIgb25seSk7CisgKgkyIGZvciBvbmUgMmtCIGJ1ZmZlciAoZXAtYSkgYW5kIHR3byAxa0Igb25lcyAoZXAtYiwgZXAtYykuCiAgKgogICogcmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgbmVnYXRpdmUgZXJybm8uICB3aGVuIHRoaXMgc3VjY2VlZHMsCiAgKiB0aGUgY29udGVudHMgb2YgZ2FkZ2V0LT5lcF9saXN0IG1heSBoYXZlIGNoYW5nZWQuCkBAIC0yMjQxLDcgKzIyNTQsOCBAQAogCQkJCXJlcS0+dGQtPmRtYWNvdW50ID0gMDsKIAkJCQl0ID0gcmVhZGwgKCZlcC0+cmVncy0+ZXBfYXZhaWwpOwogCQkJCWRtYV9kb25lIChlcCwgcmVxLCBjb3VudCwKLQkJCQkJKGVwLT5vdXRfb3ZlcmZsb3cgfHwgdCkgPyAtRU9WRVJGTE9XIDogMCk7CisJCQkJCShlcC0+b3V0X292ZXJmbG93IHx8IHQpCisJCQkJCQk/IC1FT1ZFUkZMT1cgOiAwKTsKIAkJCX0KIAogCQkJLyogYWxzbyBmbHVzaCB0byBwcmV2ZW50IGVycmF0dW0gMDEwNiB0cm91YmxlICovCkBAIC0yNDExLDcgKzI0MjUsNyBAQAogCQkJLCAmZXAtPnJlZ3MtPmVwX3N0YXQpOwogCQl1LnJhdyBbMF0gPSByZWFkbCAoJmRldi0+dXNiLT5zZXR1cDAxMjMpOwogCQl1LnJhdyBbMV0gPSByZWFkbCAoJmRldi0+dXNiLT5zZXR1cDQ1NjcpOwotCQkKKwogCQljcHVfdG9fbGUzMnMgKCZ1LnJhdyBbMF0pOwogCQljcHVfdG9fbGUzMnMgKCZ1LnJhdyBbMV0pOwogCkBAIC0yNTc4LDE0ICsyNTkyLDE2IEBACiAKIAkvKiBWQlVTIGRpc2Nvbm5lY3QgaXMgaW5kaWNhdGVkIGJ5IFZCVVNfUElOIGFuZCBWQlVTX0lOVEVSUlVQVCBzZXQuCiAJICogUm9vdCBQb3J0IFJlc2V0IGlzIGluZGljYXRlZCBieSBST09UX1BPUlRfUkVTRVRfSU5URVJSUlVQVCBzZXQgYW5kCi0JICogYm90aCBISUdIX1NQRUVEIGFuZCBGVUxMX1NQRUVEIGNsZWFyIChhcyBST09UX1BPUlRfUkVTRVRfSU5URVJSVVBUIAorCSAqIGJvdGggSElHSF9TUEVFRCBhbmQgRlVMTF9TUEVFRCBjbGVhciAoYXMgUk9PVF9QT1JUX1JFU0VUX0lOVEVSUlVQVAogCSAqIG9ubHkgaW5kaWNhdGVzIGEgY2hhbmdlIGluIHRoZSByZXNldCBzdGF0ZSkuCiAJICovCiAJaWYgKHN0YXQgJiB0bXApIHsKIAkJd3JpdGVsICh0bXAsICZkZXYtPnJlZ3MtPmlycXN0YXQxKTsKLQkJaWYgKCgoKHN0YXQgJiAoMSA8PCBST09UX1BPUlRfUkVTRVRfSU5URVJSVVBUKSkgJiYgCi0JCQkJKChyZWFkbCAoJmRldi0+dXNiLT51c2JzdGF0KSAmIG1hc2spID09IDApKQotCQkJCXx8ICgocmVhZGwgKCZkZXYtPnVzYi0+dXNiY3RsKSAmICgxIDw8IFZCVVNfUElOKSkgPT0gMCkgCisJCWlmICgoKChzdGF0ICYgKDEgPDwgUk9PVF9QT1JUX1JFU0VUX0lOVEVSUlVQVCkpCisJCQkJCSYmICgocmVhZGwgKCZkZXYtPnVzYi0+dXNic3RhdCkgJiBtYXNrKQorCQkJCQkJCT09IDApKQorCQkJCXx8ICgocmVhZGwgKCZkZXYtPnVzYi0+dXNiY3RsKQorCQkJCQkmICgxIDw8IFZCVVNfUElOKSkgPT0gMCkKIAkJCSAgICApICYmICggZGV2LT5nYWRnZXQuc3BlZWQgIT0gVVNCX1NQRUVEX1VOS05PV04pKSB7CiAJCQlERUJVRyAoZGV2LCAiZGlzY29ubmVjdCAlc1xuIiwKIAkJCQkJZGV2LT5kcml2ZXItPmRyaXZlci5uYW1lKTsKQEAgLTI4NTIsNyArMjg2OCw3IEBACiAKIAkvKiBub3cgYWxsIHRoZSBwY2kgZ29vZGllcyAuLi4gKi8KIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UgKHBkZXYpIDwgMCkgewotICAgCSAgICAgICAgcmV0dmFsID0gLUVOT0RFVjsKKwkgICAgICAgIHJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZG9uZTsKIAl9CiAJZGV2LT5lbmFibGVkID0gMTsKQEAgLTI4NzAsNiArMjg4NiwxMCBAQAogCX0KIAlkZXYtPnJlZ2lvbiA9IDE7CiAKKwkvKiBGSVhNRSBwcm92aWRlIGZpcm13YXJlIGRvd25sb2FkIGludGVyZmFjZSB0byBwdXQKKwkgKiA4MDUxIGNvZGUgaW50byB0aGUgY2hpcCwgZS5nLiB0byB0dXJuIG9uIFBDSSBQTS4KKwkgKi8KKwogCWJhc2UgPSBpb3JlbWFwX25vY2FjaGUgKHJlc291cmNlLCBsZW4pOwogCWlmIChiYXNlID09IE5VTEwpIHsKIAkJREVCVUcgKGRldiwgImNhbid0IG1hcCBtZW1vcnlcbiIpOwpAQCAtMjk4NCwxNiArMzAwNCwxNiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpX2lkcyBbXSA9IHsgewotCS5jbGFzcyA9IAkoKFBDSV9DTEFTU19TRVJJQUxfVVNCIDw8IDgpIHwgMHhmZSksCi0JLmNsYXNzX21hc2sgPSAJfjAsCitzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGNpX2lkcyBbXSA9IHsgeworCS5jbGFzcyA9CSgoUENJX0NMQVNTX1NFUklBTF9VU0IgPDwgOCkgfCAweGZlKSwKKwkuY2xhc3NfbWFzayA9CX4wLAogCS52ZW5kb3IgPQkweDE3Y2MsCiAJLmRldmljZSA9CTB4MjI4MCwKIAkuc3VidmVuZG9yID0JUENJX0FOWV9JRCwKIAkuc3ViZGV2aWNlID0JUENJX0FOWV9JRCwKIH0sIHsKLQkuY2xhc3MgPSAJKChQQ0lfQ0xBU1NfU0VSSUFMX1VTQiA8PCA4KSB8IDB4ZmUpLAotCS5jbGFzc19tYXNrID0gCX4wLAorCS5jbGFzcyA9CSgoUENJX0NMQVNTX1NFUklBTF9VU0IgPDwgOCkgfCAweGZlKSwKKwkuY2xhc3NfbWFzayA9CX4wLAogCS52ZW5kb3IgPQkweDE3Y2MsCiAJLmRldmljZSA9CTB4MjI4MiwKIAkuc3VidmVuZG9yID0JUENJX0FOWV9JRCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9vbWFwX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L29tYXBfdWRjLmMKaW5kZXggMmRlOTc0OC4uMGE2NDUwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L29tYXBfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L29tYXBfdWRjLmMKQEAgLTQwLDcgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91c2JfY2g5Lmg+CiAjaW5jbHVkZSA8bGludXgvdXNiX2dhZGdldC5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYl9vdGcuaD4KKyNpbmNsdWRlIDxsaW51eC91c2Ivb3RnLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KIAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KQEAgLTI0MzcsNyArMjQzNyw3IEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2NfdWRjX3Nob3csIE5VTEwpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfb3BzID0gewogCS5vcGVuCQk9IHByb2NfdWRjX29wZW4sCiAJLnJlYWQJCT0gc2VxX3JlYWQsCiAJLmxsc2VlawkJPSBzZXFfbHNlZWssCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuYwppbmRleCBmZmYwMjdkLi5mMWFkY2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmMKQEAgLTE1MCw2ICsxNTAsMzkgQEAKIHN0YXRpYyB2b2lkIHB4YTJ4eF9lcF9maWZvX2ZsdXNoIChzdHJ1Y3QgdXNiX2VwICplcCk7CiBzdGF0aWMgdm9pZCBudWtlIChzdHJ1Y3QgcHhhMnh4X2VwICosIGludCBzdGF0dXMpOwogCisvKiBvbmUgR1BJTyBzaG91bGQgYmUgdXNlZCB0byBkZXRlY3QgVkJVUyBmcm9tIHRoZSBob3N0ICovCitzdGF0aWMgaW50IGlzX3ZidXNfcHJlc2VudCh2b2lkKQoreworCXN0cnVjdCBweGEyeHhfdWRjX21hY2hfaW5mbwkJKm1hY2ggPSB0aGVfY29udHJvbGxlci0+bWFjaDsKKworCWlmIChtYWNoLT5ncGlvX3ZidXMpCisJCXJldHVybiBweGFfZ3Bpb19nZXQobWFjaC0+Z3Bpb192YnVzKTsKKwlpZiAobWFjaC0+dWRjX2lzX2Nvbm5lY3RlZCkKKwkJcmV0dXJuIG1hY2gtPnVkY19pc19jb25uZWN0ZWQoKTsKKwlyZXR1cm4gMTsKK30KKworLyogb25lIEdQSU8gc2hvdWxkIGNvbnRyb2wgYSBEKyBwdWxsdXAsIHNvIGhvc3Qgc2VlcyB0aGlzIGRldmljZSAob3Igbm90KSAqLworc3RhdGljIHZvaWQgcHVsbHVwX29mZih2b2lkKQoreworCXN0cnVjdCBweGEyeHhfdWRjX21hY2hfaW5mbwkJKm1hY2ggPSB0aGVfY29udHJvbGxlci0+bWFjaDsKKworCWlmIChtYWNoLT5ncGlvX3B1bGx1cCkKKwkJcHhhX2dwaW9fc2V0KG1hY2gtPmdwaW9fcHVsbHVwLCAwKTsKKwllbHNlIGlmIChtYWNoLT51ZGNfY29tbWFuZCkKKwkJbWFjaC0+dWRjX2NvbW1hbmQoUFhBMlhYX1VEQ19DTURfRElTQ09OTkVDVCk7Cit9CisKK3N0YXRpYyB2b2lkIHB1bGx1cF9vbih2b2lkKQoreworCXN0cnVjdCBweGEyeHhfdWRjX21hY2hfaW5mbwkJKm1hY2ggPSB0aGVfY29udHJvbGxlci0+bWFjaDsKKworCWlmIChtYWNoLT5ncGlvX3B1bGx1cCkKKwkJcHhhX2dwaW9fc2V0KG1hY2gtPmdwaW9fcHVsbHVwLCAxKTsKKwllbHNlIGlmIChtYWNoLT51ZGNfY29tbWFuZCkKKwkJbWFjaC0+dWRjX2NvbW1hbmQoUFhBMlhYX1VEQ19DTURfQ09OTkVDVCk7Cit9CisKIHN0YXRpYyB2b2lkIHBpb19pcnFfZW5hYmxlKGludCBiRW5kcG9pbnRBZGRyZXNzKQogewogICAgICAgICBiRW5kcG9pbnRBZGRyZXNzICY9IDB4ZjsKQEAgLTE3MjEsNiArMTc1NCwxNiBAQAogCiAjZW5kaWYKIAorc3RhdGljIGlycXJldHVybl90Cit1ZGNfdmJ1c19pcnEoaW50IGlycSwgdm9pZCAqX2Rldiwgc3RydWN0IHB0X3JlZ3MgKnIpCit7CisJc3RydWN0IHB4YTJ4eF91ZGMJKmRldiA9IF9kZXY7CisJaW50CQkJdmJ1cyA9IHB4YV9ncGlvX2dldChkZXYtPm1hY2gtPmdwaW9fdmJ1cyk7CisKKwlweGEyeHhfdWRjX3ZidXNfc2Vzc2lvbigmZGV2LT5nYWRnZXQsIHZidXMpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0yNDM4LDcgKzI0ODEsNyBAQAogc3RhdGljIGludCBfX2luaXQgcHhhMnh4X3VkY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBweGEyeHhfdWRjICpkZXYgPSAmbWVtb3J5OwotCWludCByZXR2YWwsIG91dF9kbWEgPSAxOworCWludCByZXR2YWwsIG91dF9kbWEgPSAxLCB2YnVzX2lycTsKIAl1MzIgY2hpcHJldjsKIAogCS8qIGluc2lzdCBvbiBJbnRlbC9BUk0vWFNjYWxlICovCkBAIC0yNTAyLDYgKzI1NDUsMTYgQEAKIAkvKiBvdGhlciBub24tc3RhdGljIHBhcnRzIG9mIGluaXQgKi8KIAlkZXYtPmRldiA9ICZwZGV2LT5kZXY7CiAJZGV2LT5tYWNoID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKGRldi0+bWFjaC0+Z3Bpb192YnVzKSB7CisJCXZidXNfaXJxID0gSVJRX0dQSU8oZGV2LT5tYWNoLT5ncGlvX3ZidXMgJiBHUElPX01EX01BU0tfTlIpOworCQlweGFfZ3Bpb19tb2RlKChkZXYtPm1hY2gtPmdwaW9fdmJ1cyAmIEdQSU9fTURfTUFTS19OUikKKwkJCQl8IEdQSU9fSU4pOworCQlzZXRfaXJxX3R5cGUodmJ1c19pcnEsIElSUVRfQk9USEVER0UpOworCX0gZWxzZQorCQl2YnVzX2lycSA9IDA7CisJaWYgKGRldi0+bWFjaC0+Z3Bpb19wdWxsdXApCisJCXB4YV9ncGlvX21vZGUoKGRldi0+bWFjaC0+Z3Bpb19wdWxsdXAgJiBHUElPX01EX01BU0tfTlIpCisJCQkJfCBHUElPX09VVCB8IEdQSU9fREZMVF9MT1cpOwogCiAJaW5pdF90aW1lcigmZGV2LT50aW1lcik7CiAJZGV2LT50aW1lci5mdW5jdGlvbiA9IHVkY193YXRjaGRvZzsKQEAgLTI1NTcsOCArMjYxMCwxOSBAQAogCQlIRVhfRElTUExBWShkZXYtPnN0YXRzLmlycXMpOwogCQlMVUJfRElTQ19CTE5LX0xFRCAmPSAweGZmOwogI2VuZGlmCi0JfQorCX0gZWxzZQogI2VuZGlmCisJaWYgKHZidXNfaXJxKSB7CisJCXJldHZhbCA9IHJlcXVlc3RfaXJxKHZidXNfaXJxLCB1ZGNfdmJ1c19pcnEsCisJCQkJU0FfSU5URVJSVVBUIHwgU0FfU0FNUExFX1JBTkRPTSwKKwkJCQlkcml2ZXJfbmFtZSwgZGV2KTsKKwkJaWYgKHJldHZhbCAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBnZXQgaXJxICVpLCBlcnIgJWRcbiIsCisJCQkJZHJpdmVyX25hbWUsIHZidXNfaXJxLCByZXR2YWwpOworCQkJZnJlZV9pcnEoSVJRX1VTQiwgZGV2KTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CiAJY3JlYXRlX3Byb2NfZmlsZXMoKTsKIAogCXJldHVybiAwOwpAQCAtMjU4Nyw2ICsyNjUxLDggQEAKIAkJZnJlZV9pcnEoTFVCQk9DS19VU0JfSVJRLCBkZXYpOwogCX0KICNlbmRpZgorCWlmIChkZXYtPm1hY2gtPmdwaW9fdmJ1cykKKwkJZnJlZV9pcnEoSVJRX0dQSU8oZGV2LT5tYWNoLT5ncGlvX3ZidXMpLCBkZXYpOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCXRoZV9jb250cm9sbGVyID0gTlVMTDsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvcHhhMnh4X3VkYy5oCmluZGV4IDE5YTg4M2YuLjhlNTk4YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9weGEyeHhfdWRjLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3B4YTJ4eF91ZGMuaApAQCAtMTc3LDI3ICsxNzcsMTkgQEAKIAogc3RhdGljIHN0cnVjdCBweGEyeHhfdWRjICp0aGVfY29udHJvbGxlcjsKIAotLyogb25lIEdQSU8gc2hvdWxkIGJlIHVzZWQgdG8gZGV0ZWN0IFZCVVMgZnJvbSB0aGUgaG9zdCAqLwotc3RhdGljIGlubGluZSBpbnQgaXNfdmJ1c19wcmVzZW50KHZvaWQpCitzdGF0aWMgaW5saW5lIGludCBweGFfZ3Bpb19nZXQodW5zaWduZWQgZ3BpbykKIHsKLQlpZiAoIXRoZV9jb250cm9sbGVyLT5tYWNoLT51ZGNfaXNfY29ubmVjdGVkKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gdGhlX2NvbnRyb2xsZXItPm1hY2gtPnVkY19pc19jb25uZWN0ZWQoKTsKKwlyZXR1cm4gKEdQTFIoZ3BpbykgJiBHUElPX2JpdChncGlvKSkgIT0gMDsKIH0KIAotLyogb25lIEdQSU8gc2hvdWxkIGNvbnRyb2wgYSBEKyBwdWxsdXAsIHNvIGhvc3Qgc2VlcyB0aGlzIGRldmljZSAob3Igbm90KSAqLwotc3RhdGljIGlubGluZSB2b2lkIHB1bGx1cF9vZmYodm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBweGFfZ3Bpb19zZXQodW5zaWduZWQgZ3BpbywgaW50IGlzX29uKQogewotCWlmICghdGhlX2NvbnRyb2xsZXItPm1hY2gtPnVkY19jb21tYW5kKQotCQlyZXR1cm47Ci0JdGhlX2NvbnRyb2xsZXItPm1hY2gtPnVkY19jb21tYW5kKFBYQTJYWF9VRENfQ01EX0RJU0NPTk5FQ1QpOwotfQorCWludCBtYXNrID0gR1BJT19iaXQoZ3Bpbyk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdWxsdXBfb24odm9pZCkKLXsKLQlpZiAoIXRoZV9jb250cm9sbGVyLT5tYWNoLT51ZGNfY29tbWFuZCkKLQkJcmV0dXJuOwotCXRoZV9jb250cm9sbGVyLT5tYWNoLT51ZGNfY29tbWFuZChQWEEyWFhfVURDX0NNRF9DT05ORUNUKTsKKwlpZiAoaXNfb24pCisJCUdQU1IoZ3BpbykgPSBtYXNrOworCWVsc2UKKwkJR1BDUihncGlvKSA9IG1hc2s7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvc2VyaWFsLmMKaW5kZXggZTc2MmFhMS4uYjg5M2UzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zZXJpYWwuYwpAQCAtMTEyMCwxMiArMTEyMCwxNSBAQAogZ3NfZGVidWdfbGV2ZWwoMywgImdzX3NlbmQ6IGxlbj0lZCwgMHglMi4yeCAweCUyLjJ4IDB4JTIuMnggLi4uXG4iLCBsZW4sICooKHVuc2lnbmVkIGNoYXIgKilyZXEtPmJ1ZiksICooKHVuc2lnbmVkIGNoYXIgKilyZXEtPmJ1ZisxKSwgKigodW5zaWduZWQgY2hhciAqKXJlcS0+YnVmKzIpKTsKIAkJCWxpc3RfZGVsKCZyZXFfZW50cnktPnJlX2VudHJ5KTsKIAkJCXJlcS0+bGVuZ3RoID0gbGVuOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5kZXZfbG9jaywgZmxhZ3MpOwogCQkJaWYgKChyZXQ9dXNiX2VwX3F1ZXVlKGVwLCByZXEsIEdGUF9BVE9NSUMpKSkgewogCQkJCXByaW50ayhLRVJOX0VSUgogCQkJCSJnc19zZW5kOiBjYW5ub3QgcXVldWUgcmVhZCByZXF1ZXN0LCByZXQ9JWRcbiIsCiAJCQkJCXJldCk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZGV2X2xvY2ssIGZsYWdzKTsKIAkJCQlicmVhazsKIAkJCX0KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmRldl9sb2NrLCBmbGFncyk7CiAJCX0gZWxzZSB7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnIGIvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCmluZGV4IGI5M2Q3MWQuLmNmMTBjYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKQEAgLTgzLDYgKzgzLDcgQEAKIAl0cmlzdGF0ZSAiT0hDSSBIQ0Qgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQiAmJiBVU0JfQVJDSF9IQVNfT0hDSQogCXNlbGVjdCBJU1AxMzAxX09NQVAgaWYgTUFDSF9PTUFQX0gyIHx8IE1BQ0hfT01BUF9IMworCXNlbGVjdCBJMkMgaWYgQVJDSF9QTlg0MDA4CiAJLS0taGVscC0tLQogCSAgVGhlIE9wZW4gSG9zdCBDb250cm9sbGVyIEludGVyZmFjZSAoT0hDSSkgaXMgYSBzdGFuZGFyZCBmb3IgYWNjZXNzaW5nCiAJICBVU0IgMS4xIGhvc3QgY29udHJvbGxlciBoYXJkd2FyZS4gIEl0IGRvZXMgbW9yZSBpbiBoYXJkd2FyZSB0aGFuIEludGVsJ3MKQEAgLTE0MSw2ICsxNDIsMzQgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHVoY2ktaGNkLgogCitjb25maWcgVVNCX1UxMzJfSENECisJdHJpc3RhdGUgIkVsYW4gVTEzMiBBZGFwdGVyIEhvc3QgQ29udHJvbGxlciIKKwlkZXBlbmRzIG9uIFVTQiAmJiBVU0JfRlRESV9FTEFOCisJZGVmYXVsdCBNCisJaGVscAorCSAgVGhlIFUxMzIgYWRhcHRlciBpcyBhIFVTQiB0byBDYXJkQnVzIGFkYXB0ZXIgc3BlY2lmaWNhbGx5IGRlc2lnbmVkCisJICBmb3IgUEMgY2FyZHMgdGhhdCBjb250YWluIGFuIE9IQ0kgaG9zdCBjb250cm9sbGVyLiBUeXBpY2FsIFBDIGNhcmRzCisJICBhcmUgdGhlIE9yYW5nZSBNb2JpbGUgM0cgT3B0aW9uIEdsb2JlVHJvdHRlciBGdXNpb24gY2FyZC4gVGhlIFUxMzIKKwkgIGFkYXB0ZXIgd2lsbCAqTk9UKiB3b3JrIHdpdGggUEMgY2FyZHMgdGhhdCBkbyBub3QgY29udGFpbiBhbiBPSENJCisJICBjb250cm9sbGVyLgorCisJICBGb3IgdGhvc2UgUEMgY2FyZHMgdGhhdCBjb250YWluIG11bHRpcGxlIE9IQ0kgY29udHJvbGxlcnMgb25seSB0aGVyCisJICBmaXJzdCBvbmUgaXMgdXNlZC4KKworCSAgVGhlIGRyaXZlciBjb25zaXN0cyBvZiB0d28gbW9kdWxlcywgdGhlICJmdGRpLWVsYW4iIG1vZHVsZSBpcyBhCisJICBVU0IgY2xpZW50IGRyaXZlciB0aGF0IGludGVyZmFjZXMgdG8gdGhlIEZUREkgY2hpcCB3aXRoaW4gRUxBTidzCisJICBVU0ItdG8tUENNQ0lBIGFkYXB0ZXIsIGFuZCB0aGlzICJ1MTMyLWhjZCIgbW9kdWxlIGlzIGEgVVNCIGhvc3QKKwkgIGNvbnRyb2xsZXIgZHJpdmVyIHRoYXQgdGFsa3MgdG8gdGhlIE9IQ0kgY29udHJvbGxlciB3aXRoaW4gdGhlCisJICBDYXJkQnVzIGNhcmRzIHRoYXQgYXJlIGluc2VydGVkIGluIHRoZSBVMTMyIGFkYXB0ZXIuCisKKwkgIFRoaXMgZHJpdmVyIGhhcyBiZWVuIHRlc3RlZCB3aXRoIGEgQ2FyZEJ1cyBPSENJIFVTQiBhZGFwdGVyLCBhbmQKKwkgIHdvcmtlZCB3aXRoIGEgVVNCIFBFTiBEcml2ZSBpbnNlcnRlZCBpbnRvIHRoZSBmaXJzdCBVU0IgcG9ydCBvZgorCSAgdGhlIFBDQ0FSRC4gQSByYXRoZXIgcG9pbnRsZXNzIHRoaW5nIHRvIGRvLCBidXQgdXNlZnVsIGZvciB0ZXN0aW5nLgorCisJICBJdCBpcyBzYWZlIHRvIHNheSBNIGhlcmUuCisKKwkgIFNlZSBhbHNvIDxodHRwOi8vd3d3LmVsYW5kaWdpdGFsc3lzdGVtcy5jb20vc3VwcG9ydC91ZmFxL3UxMzJsaW51eC5waHA+CisKIGNvbmZpZyBVU0JfU0w4MTFfSENECiAJdHJpc3RhdGUgIlNMODExSFMgSENEIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxlCmluZGV4IGUzMDIwZjRiLi5hMmU1OGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvTWFrZWZpbGUKQEAgLTE0LDQgKzE0LDUgQEAKIG9iai0kKENPTkZJR19VU0JfVUhDSV9IQ0QpCSs9IHVoY2ktaGNkLm8KIG9iai0kKENPTkZJR19VU0JfU0w4MTFfSENEKQkrPSBzbDgxMS1oY2Qubwogb2JqLSQoQ09ORklHX1VTQl9TTDgxMV9DUykJKz0gc2w4MTFfY3Mubworb2JqLSQoQ09ORklHX1VTQl9VMTMyX0hDRCkJKz0gdTEzMi1oY2Qubwogb2JqLSQoQ09ORklHX0VUUkFYX0FSQ0hfVjEwKQkrPSBoY19jcmlzdjEwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1hdTF4eHguYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1hdTF4eHguYwppbmRleCAyNmVkNzU3Li41ZDFiMTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktYXUxeHh4LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWF1MXh4eC5jCkBAIC0yMDAsNiArMjAwLDcgQEAKIAkucmVzZXQgPSBlaGNpX2luaXQsCiAJLnN0YXJ0ID0gZWhjaV9ydW4sCiAJLnN0b3AgPSBlaGNpX3N0b3AsCisJLnNodXRkb3duID0gZWhjaV9zaHV0ZG93biwKIAogCS8qCiAJICogbWFuYWdpbmcgaS9vIHJlcXVlc3RzIGFuZCBhc3NvY2lhdGVkIGRldmljZSByZXNvdXJjZXMKQEAgLTI2OCw2ICsyNjksNyBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZWhjaV9oY2RfYXUxeHh4X2RyaXZlciA9IHsKIAkucHJvYmUgPSBlaGNpX2hjZF9hdTF4eHhfZHJ2X3Byb2JlLAogCS5yZW1vdmUgPSBlaGNpX2hjZF9hdTF4eHhfZHJ2X3JlbW92ZSwKKwkuc2h1dGRvd24gPSB1c2JfaGNkX3BsYXRmb3JtX3NodXRkb3duLAogCS8qLnN1c3BlbmQgICAgICA9IGVoY2lfaGNkX2F1MXh4eF9kcnZfc3VzcGVuZCwgKi8KIAkvKi5yZXN1bWUgICAgICAgPSBlaGNpX2hjZF9hdTF4eHhfZHJ2X3Jlc3VtZSwgKi8KIAkuZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWRiZy5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWRiZy5jCmluZGV4IDY1YWM5ZmUuLjIzYjk1YjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1kYmcuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZGJnLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIgYnkgRGF2aWQgQnJvd25lbGwKLSAqIAorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKICAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKQEAgLTY1LDcgKzY1LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IEhDU19OX1BPUlRTIChwYXJhbXMpOyBpKyspIHsKIAkJCS8vIEZJWE1FIE1JUFMgd29uJ3QgcmVhZGIoKSAuLi4KIAkJCWJ5dGUgPSByZWFkYiAoJmVoY2ktPmNhcHMtPnBvcnRyb3V0ZVsoaT4+MSldKTsKLQkJCXNwcmludGYodG1wLCAiJWQgIiwgCisJCQlzcHJpbnRmKHRtcCwgIiVkICIsCiAJCQkJKChpICYgMHgxKSA/ICgoYnl0ZSkmMHhmKSA6ICgoYnl0ZT4+NCkmMHhmKSkpOwogCQkJc3RyY2F0KGJ1ZiwgdG1wKTsKIAkJfQpAQCAtMTQxLDEyICsxNDEsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCi1kYmdfaXRkIChjb25zdCBjaGFyICpsYWJlbCwgc3RydWN0IGVoY2lfaGNkICplaGNpLCBzdHJ1Y3QgZWhjaV9pdGQgKml0ZCkgCitkYmdfaXRkIChjb25zdCBjaGFyICpsYWJlbCwgc3RydWN0IGVoY2lfaGNkICplaGNpLCBzdHJ1Y3QgZWhjaV9pdGQgKml0ZCkKIHsKIAllaGNpX2RiZyAoZWhjaSwgIiVzIFslZF0gaXRkICVwLCBuZXh0ICUwOHgsIHVyYiAlcFxuIiwKIAkJbGFiZWwsIGl0ZC0+ZnJhbWUsIGl0ZCwgbGUzMl90b19jcHUoaXRkLT5od19uZXh0KSwgaXRkLT51cmIpOwogCWVoY2lfZGJnIChlaGNpLAotCQkiICB0cmFuczogJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCAKKwkJIiAgdHJhbnM6ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKIAkJbGUzMl90b19jcHUoaXRkLT5od190cmFuc2FjdGlvblswXSksCiAJCWxlMzJfdG9fY3B1KGl0ZC0+aHdfdHJhbnNhY3Rpb25bMV0pLAogCQlsZTMyX3RvX2NwdShpdGQtPmh3X3RyYW5zYWN0aW9uWzJdKSwKQEAgLTE1Niw3ICsxNTYsNyBAQAogCQlsZTMyX3RvX2NwdShpdGQtPmh3X3RyYW5zYWN0aW9uWzZdKSwKIAkJbGUzMl90b19jcHUoaXRkLT5od190cmFuc2FjdGlvbls3XSkpOwogCWVoY2lfZGJnIChlaGNpLAotCQkiICBidWY6ICAgJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwgCisJCSIgIGJ1ZjogICAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLAogCQlsZTMyX3RvX2NwdShpdGQtPmh3X2J1ZnBbMF0pLAogCQlsZTMyX3RvX2NwdShpdGQtPmh3X2J1ZnBbMV0pLAogCQlsZTMyX3RvX2NwdShpdGQtPmh3X2J1ZnBbMl0pLApAQCAtMTcxLDEyICsxNzEsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQgX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpCi1kYmdfc2l0ZCAoY29uc3QgY2hhciAqbGFiZWwsIHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgc3RydWN0IGVoY2lfc2l0ZCAqc2l0ZCkgCitkYmdfc2l0ZCAoY29uc3QgY2hhciAqbGFiZWwsIHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgc3RydWN0IGVoY2lfc2l0ZCAqc2l0ZCkKIHsKIAllaGNpX2RiZyAoZWhjaSwgIiVzIFslZF0gc2l0ZCAlcCwgbmV4dCAlMDh4LCB1cmIgJXBcbiIsCiAJCWxhYmVsLCBzaXRkLT5mcmFtZSwgc2l0ZCwgbGUzMl90b19jcHUoc2l0ZC0+aHdfbmV4dCksIHNpdGQtPnVyYik7CiAJZWhjaV9kYmcgKGVoY2ksCi0JCSIgIGFkZHIgJTA4eCBzY2hlZCAlMDR4IHJlc3VsdCAlMDh4IGJ1ZiAlMDh4ICUwOHhcbiIsIAorCQkiICBhZGRyICUwOHggc2NoZWQgJTA0eCByZXN1bHQgJTA4eCBidWYgJTA4eCAlMDh4XG4iLAogCQlsZTMyX3RvX2NwdShzaXRkLT5od19mdWxsc3BlZWRfZXApLAogCQlsZTMyX3RvX2NwdShzaXRkLT5od191ZnJhbWUpLAogCQlsZTMyX3RvX2NwdShzaXRkLT5od19yZXN1bHRzKSwKQEAgLTQ1MSw3ICs0NTEsNyBAQAogCSpidWYgPSAwOwogCiAJYnVzID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKLQloY2QgPSBidXMtPmhjcHJpdjsKKwloY2QgPSBidXNfdG9faGNkKGJ1cyk7CiAJZWhjaSA9IGhjZF90b19laGNpIChoY2QpOwogCW5leHQgPSBidWY7CiAJc2l6ZSA9IFBBR0VfU0laRTsKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCXNlZW5fY291bnQgPSAwOwogCiAJYnVzID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKLQloY2QgPSBidXMtPmhjcHJpdjsKKwloY2QgPSBidXNfdG9faGNkKGJ1cyk7CiAJZWhjaSA9IGhjZF90b19laGNpIChoY2QpOwogCW5leHQgPSBidWY7CiAJc2l6ZSA9IFBBR0VfU0laRTsKQEAgLTYzNCw3ICs2MzQsNyBAQAogCXN0YXRpYyBjaGFyCQlsYWJlbCBbXSA9ICIiOwogCiAJYnVzID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKLQloY2QgPSBidXMtPmhjcHJpdjsKKwloY2QgPSBidXNfdG9faGNkKGJ1cyk7CiAJZWhjaSA9IGhjZF90b19laGNpIChoY2QpOwogCW5leHQgPSBidWY7CiAJc2l6ZSA9IFBBR0VfU0laRTsKQEAgLTc1NCw5ICs3NTQsNyBAQAogCX0KIAogCWlmIChlaGNpLT5yZWNsYWltKSB7Ci0JCXRlbXAgPSBzY25wcmludGYgKG5leHQsIHNpemUsICJyZWNsYWltIHFoICVwJXNcbiIsCi0JCQkJZWhjaS0+cmVjbGFpbSwKLQkJCQllaGNpLT5yZWNsYWltX3JlYWR5ID8gIiByZWFkeSIgOiAiIik7CisJCXRlbXAgPSBzY25wcmludGYgKG5leHQsIHNpemUsICJyZWNsYWltIHFoICVwXG4iLCBlaGNpLT5yZWNsYWltKTsKIAkJc2l6ZSAtPSB0ZW1wOwogCQluZXh0ICs9IHRlbXA7CiAJfQpAQCAtNzg1LDEwICs3ODMsMTEgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjcmVhdGVfZGVidWdfZmlsZXMgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSkKIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGRldiA9IGVoY2lfdG9faGNkKGVoY2kpLT5zZWxmLmNsYXNzX2RldjsKKwlpbnQgcmV0dmFsOwogCi0JY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfYXN5bmMpOwotCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjbGRldiwgJmNsYXNzX2RldmljZV9hdHRyX3BlcmlvZGljKTsKLQljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoY2xkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9yZWdpc3RlcnMpOworCXJldHZhbCA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjbGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2FzeW5jKTsKKwlyZXR2YWwgPSBjbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoY2xkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9wZXJpb2RpYyk7CisJcmV0dmFsID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcmVnaXN0ZXJzKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV9kZWJ1Z19maWxlcyAoc3RydWN0IGVoY2lfaGNkICplaGNpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWZzbC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWZzbC5jCmluZGV4IGQwMzA1MTYuLjFhOTE1ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1mc2wuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktZnNsLmMKQEAgLTI4NSw2ICsyODUsNyBAQAogCS5yZXN1bWUgPSBlaGNpX2J1c19yZXN1bWUsCiAjZW5kaWYKIAkuc3RvcCA9IGVoY2lfc3RvcCwKKwkuc2h1dGRvd24gPSBlaGNpX3NodXRkb3duLAogCiAJLyoKIAkgKiBtYW5hZ2luZyBpL28gcmVxdWVzdHMgYW5kIGFzc29jaWF0ZWQgZGV2aWNlIHJlc291cmNlcwpAQCAtMzI5LDYgKzMzMCw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBlaGNpX2ZzbF9kcml2ZXIgPSB7CiAJLnByb2JlID0gZWhjaV9mc2xfZHJ2X3Byb2JlLAogCS5yZW1vdmUgPSBlaGNpX2ZzbF9kcnZfcmVtb3ZlLAorCS5zaHV0ZG93biA9IHVzYl9oY2RfcGxhdGZvcm1fc2h1dGRvd24sCiAJLmRyaXZlciA9IHsKIAkJICAgLm5hbWUgPSAiZnNsLWVoY2kiLAogCQkgICB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCmluZGV4IGQ2MzE3N2EuLjVhYzkxODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgYnkgRGF2aWQgQnJvd25lbGwKLSAqIAorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKICAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKQEAgLTcwLDcgKzcwLDcgQEAKICAqIDIwMDItMDgtMDYJSGFuZGxpbmcgZm9yIGJ1bGsgYW5kIGludGVycnVwdCB0cmFuc2ZlcnMgaXMgbW9zdGx5IHNoYXJlZDsKICAqCW9ubHkgc2NoZWR1bGluZyBpcyBkaWZmZXJlbnQsIG5vIGFyYml0cmFyeSBsaW1pdGF0aW9ucy4KICAqIDIwMDItMDctMjUJU2FuaXR5IGNoZWNrIFBDSSByZWFkcywgbW9zdGx5IGZvciBiZXR0ZXIgY2FyZGJ1cyBzdXBwb3J0LAotICogCWNsZWFuIHVwIEhDIHJ1biBzdGF0ZSBoYW5kc2hha2luZy4KKyAqCWNsZWFuIHVwIEhDIHJ1biBzdGF0ZSBoYW5kc2hha2luZy4KICAqIDIwMDItMDUtMjQJUHJlbGltaW5hcnkgRlMvTFMgaW50ZXJydXB0cywgdXNpbmcgc2NoZWR1bGluZyBzaG9ydGN1dHMKICAqIDIwMDItMDUtMTEJQ2xlYXIgVFQgZXJyb3JzIGZvciBGUy9MUyBjdHJsL2J1bGsuICBGaWxsIGluIHNvbWUgb3RoZXIKICAqCW1pc3NpbmcgcGllY2VzOiAgZW5hYmxpbmcgNjRiaXQgZG1hLCBoYW5kb2ZmIGZyb20gQklPUy9TTU0uCkBAIC0xMTEsNyArMTExLDcgQEAKICNkZWZpbmUJRUhDSV9UVU5FX01VTFRfVFQJMQogI2RlZmluZQlFSENJX1RVTkVfRkxTCQkyCS8qIChzbWFsbCkgMjU2IGZyYW1lIHNjaGVkdWxlICovCiAKLSNkZWZpbmUgRUhDSV9JQUFfSklGRklFUwkoSFovMTAwKQkvKiBhcmJpdHJhcnk7IH4xMCBtc2VjICovCisjZGVmaW5lIEVIQ0lfSUFBX01TRUNTCQkxMAkJLyogYXJiaXRyYXJ5ICovCiAjZGVmaW5lIEVIQ0lfSU9fSklGRklFUwkJKEhaLzEwKQkJLyogaW8gd2F0Y2hkb2cgPiBpcnFfdGhyZXNoICovCiAjZGVmaW5lIEVIQ0lfQVNZTkNfSklGRklFUwkoSFovMjApCQkvKiBhc3luYyBpZGxlIHRpbWVvdXQgKi8KICNkZWZpbmUgRUhDSV9TSFJJTktfSklGRklFUwkoSFovMjAwKQkvKiBhc3luYyBxaCB1bmxpbmsgZGVsYXkgKi8KQEAgLTI1NCw2ICsyNTQsNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCitzdGF0aWMgdm9pZCBlbmRfdW5saW5rX2FzeW5jIChzdHJ1Y3QgZWhjaV9oY2QgKmVoY2ksIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHN0YXRpYyB2b2lkIGVoY2lfd29yayhzdHJ1Y3QgZWhjaV9oY2QgKmVoY2ksIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogI2luY2x1ZGUgImVoY2ktaHViLmMiCkBAIC0yNjMsNiArMjY0LDI5IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKK3N0YXRpYyB2b2lkIGVoY2lfaWFhX3dhdGNoZG9nICh1bnNpZ25lZCBsb25nIHBhcmFtKQoreworCXN0cnVjdCBlaGNpX2hjZAkJKmVoY2kgPSAoc3RydWN0IGVoY2lfaGNkICopIHBhcmFtOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCXUzMgkJCXN0YXR1czsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmZWhjaS0+bG9jaywgZmxhZ3MpOworCVdBUk5fT04oIWVoY2ktPnJlY2xhaW0pOworCisJLyogbG9zdCBJQUEgaXJxcyB3ZWRnZSB0aGluZ3MgYmFkbHk7IHNlZW4gZmlyc3Qgd2l0aCBhIHZ0ODIzNSAqLworCWlmIChlaGNpLT5yZWNsYWltKSB7CisJCXN0YXR1cyA9IHJlYWRsICgmZWhjaS0+cmVncy0+c3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAmIFNUU19JQUEpIHsKKwkJCWVoY2lfdmRiZyAoZWhjaSwgImxvc3QgSUFBXG4iKTsKKwkJCUNPVU5UIChlaGNpLT5zdGF0cy5sb3N0X2lhYSk7CisJCQl3cml0ZWwgKFNUU19JQUEsICZlaGNpLT5yZWdzLT5zdGF0dXMpOworCQkJZW5kX3VubGlua19hc3luYyAoZWhjaSwgTlVMTCk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZWhjaS0+bG9jaywgZmxhZ3MpOworfQorCiBzdGF0aWMgdm9pZCBlaGNpX3dhdGNoZG9nICh1bnNpZ25lZCBsb25nIHBhcmFtKQogewogCXN0cnVjdCBlaGNpX2hjZAkJKmVoY2kgPSAoc3RydWN0IGVoY2lfaGNkICopIHBhcmFtOwpAQCAtMjcwLDIxICsyOTQsOSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUgKCZlaGNpLT5sb2NrLCBmbGFncyk7CiAKLQkvKiBsb3N0IElBQSBpcnFzIHdlZGdlIHRoaW5ncyBiYWRseTsgc2VlbiB3aXRoIGEgdnQ4MjM1ICovCi0JaWYgKGVoY2ktPnJlY2xhaW0pIHsKLQkJdTMyCQlzdGF0dXMgPSByZWFkbCAoJmVoY2ktPnJlZ3MtPnN0YXR1cyk7Ci0KLQkJaWYgKHN0YXR1cyAmIFNUU19JQUEpIHsKLQkJCWVoY2lfdmRiZyAoZWhjaSwgImxvc3QgSUFBXG4iKTsKLQkJCUNPVU5UIChlaGNpLT5zdGF0cy5sb3N0X2lhYSk7Ci0JCQl3cml0ZWwgKFNUU19JQUEsICZlaGNpLT5yZWdzLT5zdGF0dXMpOwotCQkJZWhjaS0+cmVjbGFpbV9yZWFkeSA9IDE7Ci0JCX0KLQl9Ci0KLSAJLyogc3RvcCBhc3luYyBwcm9jZXNzaW5nIGFmdGVyIGl0J3MgaWRsZWQgYSBiaXQgKi8KKwkvKiBzdG9wIGFzeW5jIHByb2Nlc3NpbmcgYWZ0ZXIgaXQncyBpZGxlZCBhIGJpdCAqLwogCWlmICh0ZXN0X2JpdCAoVElNRVJfQVNZTkNfT0ZGLCAmZWhjaS0+YWN0aW9ucykpCi0gCQlzdGFydF91bmxpbmtfYXN5bmMgKGVoY2ksIGVoY2ktPmFzeW5jKTsKKwkJc3RhcnRfdW5saW5rX2FzeW5jIChlaGNpLCBlaGNpLT5hc3luYyk7CiAKIAkvKiBlaGNpIGNvdWxkIHJ1biBieSB0aW1lciwgd2l0aG91dCBJUlFzIC4uLiAqLwogCWVoY2lfd29yayAoZWhjaSwgTlVMTCk7CkBAIC0yOTIsMjEgKzMwNCwyMCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZlaGNpLT5sb2NrLCBmbGFncyk7CiB9CiAKLS8qIFJlYm9vdCBub3RpZmllcnMga2ljayBpbiBmb3Igc2lsaWNvbiBvbiBhbnkgYnVzIChub3QganVzdCBwY2ksIGV0YykuCisvKiBlaGNpX3NodXRkb3duIGtpY2sgaW4gZm9yIHNpbGljb24gb24gYW55IGJ1cyAobm90IGp1c3QgcGNpLCBldGMpLgogICogVGhpcyBmb3JjaWJseSBkaXNhYmxlcyBkbWEgYW5kIElSUXMsIGhlbHBpbmcga2V4ZWMgYW5kIG90aGVyIGNhc2VzCiAgKiB3aGVyZSB0aGUgbmV4dCBzeXN0ZW0gc29mdHdhcmUgbWF5IGV4cGVjdCBjbGVhbiBzdGF0ZS4KICAqLwotc3RhdGljIGludAotZWhjaV9yZWJvb3QgKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBjb2RlLCB2b2lkICpudWxsKQorc3RhdGljIHZvaWQKK2VoY2lfc2h1dGRvd24gKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7Ci0Jc3RydWN0IGVoY2lfaGNkCQkqZWhjaTsKKwlzdHJ1Y3QgZWhjaV9oY2QJKmVoY2k7CiAKLQllaGNpID0gY29udGFpbmVyX29mIChzZWxmLCBzdHJ1Y3QgZWhjaV9oY2QsIHJlYm9vdF9ub3RpZmllcik7CisJZWhjaSA9IGhjZF90b19laGNpIChoY2QpOwogCSh2b2lkKSBlaGNpX2hhbHQgKGVoY2kpOwogCiAJLyogbWFrZSBCSU9TL2V0YyB1c2UgY29tcGFuaW9uIGNvbnRyb2xsZXIgZHVyaW5nIHJlYm9vdCAqLwogCXdyaXRlbCAoMCwgJmVoY2ktPnJlZ3MtPmNvbmZpZ3VyZWRfZmxhZyk7Ci0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGVoY2lfcG9ydF9wb3dlciAoc3RydWN0IGVoY2lfaGNkICplaGNpLCBpbnQgaXNfb24pCkBAIC0zMzQsOCArMzQ1LDYgQEAKIHN0YXRpYyB2b2lkIGVoY2lfd29yayAoc3RydWN0IGVoY2lfaGNkICplaGNpLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl0aW1lcl9hY3Rpb25fZG9uZSAoZWhjaSwgVElNRVJfSU9fV0FUQ0hET0cpOwotCWlmIChlaGNpLT5yZWNsYWltX3JlYWR5KQotCQllbmRfdW5saW5rX2FzeW5jIChlaGNpLCByZWdzKTsKIAogCS8qIGFub3RoZXIgQ1BVIG1heSBkcm9wIGVoY2ktPmxvY2sgZHVyaW5nIGEgc2NoZWR1bGUgc2NhbiB3aGlsZQogCSAqIGl0IHJlcG9ydHMgdXJiIGNvbXBsZXRpb25zLiAgdGhpcyBmbGFnIGd1YXJkcyBhZ2FpbnN0IGJvZ3VzCkBAIC0zNzAsNiArMzc5LDcgQEAKIAogCS8qIG5vIG1vcmUgaW50ZXJydXB0cyAuLi4gKi8KIAlkZWxfdGltZXJfc3luYyAoJmVoY2ktPndhdGNoZG9nKTsKKwlkZWxfdGltZXJfc3luYyAoJmVoY2ktPmlhYV93YXRjaGRvZyk7CiAKIAlzcGluX2xvY2tfaXJxKCZlaGNpLT5sb2NrKTsKIAlpZiAoSENfSVNfUlVOTklORyAoaGNkLT5zdGF0ZSkpCkBAIC0zODEsNyArMzkxLDYgQEAKIAogCS8qIGxldCBjb21wYW5pb24gY29udHJvbGxlcnMgd29yayB3aGVuIHdlIGFyZW4ndCAqLwogCXdyaXRlbCAoMCwgJmVoY2ktPnJlZ3MtPmNvbmZpZ3VyZWRfZmxhZyk7Ci0JdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIgKCZlaGNpLT5yZWJvb3Rfbm90aWZpZXIpOwogCiAJcmVtb3ZlX2RlYnVnX2ZpbGVzIChlaGNpKTsKIApAQCAtNDE3LDYgKzQyNiwxMCBAQAogCWVoY2ktPndhdGNoZG9nLmZ1bmN0aW9uID0gZWhjaV93YXRjaGRvZzsKIAllaGNpLT53YXRjaGRvZy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGVoY2k7CiAKKwlpbml0X3RpbWVyKCZlaGNpLT5pYWFfd2F0Y2hkb2cpOworCWVoY2ktPmlhYV93YXRjaGRvZy5mdW5jdGlvbiA9IGVoY2lfaWFhX3dhdGNoZG9nOworCWVoY2ktPmlhYV93YXRjaGRvZy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGVoY2k7CisKIAkvKgogCSAqIGh3IGRlZmF1bHQ6IDFLIHBlcmlvZGljIGxpc3QgaGVhZHMsIG9uZSBwZXIgZnJhbWUuCiAJICogcGVyaW9kaWNfc2l6ZSBjYW4gc2hyaW5rIGJ5IFVTQkNNRCB1cGRhdGUgaWYgaGNjX3BhcmFtcyBhbGxvd3MuCkBAIC00MjcsMTMgKzQ0MCwxMiBAQAogCiAJLyogY29udHJvbGxlcnMgbWF5IGNhY2hlIHNvbWUgb2YgdGhlIHBlcmlvZGljIHNjaGVkdWxlIC4uLiAqLwogCWhjY19wYXJhbXMgPSByZWFkbCgmZWhjaS0+Y2Fwcy0+aGNjX3BhcmFtcyk7Ci0JaWYgKEhDQ19JU09DX0NBQ0hFKGhjY19wYXJhbXMpKSAJLy8gZnVsbCBmcmFtZSBjYWNoZQorCWlmIChIQ0NfSVNPQ19DQUNIRShoY2NfcGFyYW1zKSkJCS8vIGZ1bGwgZnJhbWUgY2FjaGUKIAkJZWhjaS0+aV90aHJlc2ggPSA4OwogCWVsc2UJCQkJCS8vIE4gbWljcm9mcmFtZXMgY2FjaGVkCiAJCWVoY2ktPmlfdGhyZXNoID0gMiArIEhDQ19JU09DX1RIUkVTKGhjY19wYXJhbXMpOwogCiAJZWhjaS0+cmVjbGFpbSA9IE5VTEw7Ci0JZWhjaS0+cmVjbGFpbV9yZWFkeSA9IDA7CiAJZWhjaS0+bmV4dF91ZnJhbWUgPSAtMTsKIAogCS8qCkBAIC00ODMsOSArNDk1LDYgQEAKIAl9CiAJZWhjaS0+Y29tbWFuZCA9IHRlbXA7CiAKLQllaGNpLT5yZWJvb3Rfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IGVoY2lfcmVib290OwotCXJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmZWhjaS0+cmVib290X25vdGlmaWVyKTsKLQogCXJldHVybiAwOwogfQogCkBAIC00OTksNyArNTA4LDYgQEAKIAogCS8qIEVIQ0kgc3BlYyBzZWN0aW9uIDQuMSAqLwogCWlmICgocmV0dmFsID0gZWhjaV9yZXNldChlaGNpKSkgIT0gMCkgewotCQl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmZWhjaS0+cmVib290X25vdGlmaWVyKTsKIAkJZWhjaV9tZW1fY2xlYW51cChlaGNpKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CkBAIC02MTEsNyArNjE5LDcgQEAKIAkvKiBjb21wbGV0ZSB0aGUgdW5saW5raW5nIG9mIHNvbWUgcWggWzQuMTUuMi4zXSAqLwogCWlmIChzdGF0dXMgJiBTVFNfSUFBKSB7CiAJCUNPVU5UIChlaGNpLT5zdGF0cy5yZWNsYWltKTsKLQkJZWhjaS0+cmVjbGFpbV9yZWFkeSA9IDE7CisJCWVuZF91bmxpbmtfYXN5bmMgKGVoY2ksIHJlZ3MpOwogCQliaCA9IDE7CiAJfQogCkBAIC03MTUsMTAgKzcyMywxNCBAQAogCiBzdGF0aWMgdm9pZCB1bmxpbmtfYXN5bmMgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgc3RydWN0IGVoY2lfcWggKnFoKQogewotCS8qIGlmIHdlIG5lZWQgdG8gdXNlIElBQSBhbmQgaXQncyBidXN5LCBkZWZlciAqLwotCWlmIChxaC0+cWhfc3RhdGUgPT0gUUhfU1RBVEVfTElOS0VECi0JCQkmJiBlaGNpLT5yZWNsYWltCi0JCQkmJiBIQ19JU19SVU5OSU5HIChlaGNpX3RvX2hjZChlaGNpKS0+c3RhdGUpKSB7CisJLy8gQlVHX09OKHFoLT5xaF9zdGF0ZSAhPSBRSF9TVEFURV9MSU5LRUQpOworCisJLyogZmFpbGZhc3QgKi8KKwlpZiAoIUhDX0lTX1JVTk5JTkcgKGVoY2lfdG9faGNkKGVoY2kpLT5zdGF0ZSkpCisJCWVuZF91bmxpbmtfYXN5bmMgKGVoY2ksIE5VTEwpOworCisJLyogZGVmZXIgdGlsbCBsYXRlciBpZiBidXN5ICovCisJZWxzZSBpZiAoZWhjaS0+cmVjbGFpbSkgewogCQlzdHJ1Y3QgZWhjaV9xaAkJKmxhc3Q7CiAKIAkJZm9yIChsYXN0ID0gZWhjaS0+cmVjbGFpbTsKQEAgLTcyOCwxMiArNzQwLDggQEAKIAkJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfVU5MSU5LX1dBSVQ7CiAJCWxhc3QtPnJlY2xhaW0gPSBxaDsKIAotCS8qIGJ5cGFzcyBJQUEgaWYgdGhlIGhjIGNhbid0IGNhcmUgKi8KLQl9IGVsc2UgaWYgKCFIQ19JU19SVU5OSU5HIChlaGNpX3RvX2hjZChlaGNpKS0+c3RhdGUpICYmIGVoY2ktPnJlY2xhaW0pCi0JCWVuZF91bmxpbmtfYXN5bmMgKGVoY2ksIE5VTEwpOwotCi0JLyogc29tZXRoaW5nIGVsc2UgbWlnaHQgaGF2ZSB1bmxpbmtlZCB0aGUgcWggYnkgbm93ICovCi0JaWYgKHFoLT5xaF9zdGF0ZSA9PSBRSF9TVEFURV9MSU5LRUQpCisJLyogc3RhcnQgSUFBIGN5Y2xlICovCisJfSBlbHNlCiAJCXN0YXJ0X3VubGlua19hc3luYyAoZWhjaSwgcWgpOwogfQogCkBAIC03NTUsNyArNzYzLDE5IEBACiAJCXFoID0gKHN0cnVjdCBlaGNpX3FoICopIHVyYi0+aGNwcml2OwogCQlpZiAoIXFoKQogCQkJYnJlYWs7Ci0JCXVubGlua19hc3luYyAoZWhjaSwgcWgpOworCQlzd2l0Y2ggKHFoLT5xaF9zdGF0ZSkgeworCQljYXNlIFFIX1NUQVRFX0xJTktFRDoKKwkJY2FzZSBRSF9TVEFURV9DT01QTEVUSU5HOgorCQkJdW5saW5rX2FzeW5jIChlaGNpLCBxaCk7CisJCQlicmVhazsKKwkJY2FzZSBRSF9TVEFURV9VTkxJTks6CisJCWNhc2UgUUhfU1RBVEVfVU5MSU5LX1dBSVQ6CisJCQkvKiBhbHJlYWR5IHN0YXJ0ZWQgKi8KKwkJCWJyZWFrOworCQljYXNlIFFIX1NUQVRFX0lETEU6CisJCQlXQVJOX09OKDEpOworCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIFBJUEVfSU5URVJSVVBUOgpAQCAtODQ3LDYgKzg2Nyw3IEBACiAJCXVubGlua19hc3luYyAoZWhjaSwgcWgpOwogCQkvKiBGQUxMIFRIUk9VR0ggKi8KIAljYXNlIFFIX1NUQVRFX1VOTElOSzoJCS8qIHdhaXQgZm9yIGh3IHRvIGZpbmlzaD8gKi8KKwljYXNlIFFIX1NUQVRFX1VOTElOS19XQUlUOgogaWRsZV90aW1lb3V0OgogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZWhjaS0+bG9jaywgZmxhZ3MpOwogCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYwppbmRleCBkMDNlM2NhLi5iMmVlMTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IGJ5IERhdmlkIEJyb3duZWxsCi0gKiAKKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCiAgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCkBAIC00OCw3ICs0OCw3IEBACiAJfQogCWVoY2ktPmNvbW1hbmQgPSByZWFkbCAoJmVoY2ktPnJlZ3MtPmNvbW1hbmQpOwogCWlmIChlaGNpLT5yZWNsYWltKQotCQllaGNpLT5yZWNsYWltX3JlYWR5ID0gMTsKKwkJZW5kX3VubGlua19hc3luYyAoZWhjaSwgTlVMTCk7CiAJZWhjaV93b3JrKGVoY2ksIE5VTEwpOwogCiAJLyogc3VzcGVuZCBhbnkgYWN0aXZlL3Vuc3VzcGVuZGVkIHBvcnRzLCBtYXliZSBhbGxvdyB3YWtldXAgKi8KQEAgLTEwMywxMCArMTAzLDEwIEBACiAKIAkvKiByZS1pbml0IG9wZXJhdGlvbmFsIHJlZ2lzdGVycyBpbiBjYXNlIHdlIGxvc3QgcG93ZXIgKi8KIAlpZiAocmVhZGwgKCZlaGNpLT5yZWdzLT5pbnRyX2VuYWJsZSkgPT0gMCkgewotIAkJLyogYXQgbGVhc3Qgc29tZSBBUE0gaW1wbGVtZW50YXRpb25zIHdpbGwgdHJ5IHRvIGRlbGl2ZXIKKwkJLyogYXQgbGVhc3Qgc29tZSBBUE0gaW1wbGVtZW50YXRpb25zIHdpbGwgdHJ5IHRvIGRlbGl2ZXIKIAkJICogSVJRcyByaWdodCBhd2F5LCBzbyBkZWxheSB0aGVtIHVudGlsIHdlJ3JlIHJlYWR5LgotIAkJICovCi0gCQlpbnRyX2VuYWJsZSA9IDE7CisJCSAqLworCQlpbnRyX2VuYWJsZSA9IDE7CiAJCXdyaXRlbCAoMCwgJmVoY2ktPnJlZ3MtPnNlZ21lbnQpOwogCQl3cml0ZWwgKGVoY2ktPnBlcmlvZGljX2RtYSwgJmVoY2ktPnJlZ3MtPmZyYW1lX2xpc3QpOwogCQl3cml0ZWwgKCh1MzIpZWhjaS0+YXN5bmMtPnFoX2RtYSwgJmVoY2ktPnJlZ3MtPmFzeW5jX25leHQpOwpAQCAtMjMyLDcgKzIzMiw3IEBACiAJCWJ1ZiBbMV0gPSAwOwogCQlyZXR2YWwrKzsKIAl9Ci0JCisKIAkvKiBubyBodWIgY2hhbmdlIHJlcG9ydHMgKGJpdCAwKSBmb3Igbm93IChwb3dlciwgLi4uKSAqLwogCiAJLyogcG9ydCBOIGNoYW5nZXMgKGJpdCBOKT8gKi8KQEAgLTMwNCw3ICszMDQsNyBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0jZGVmaW5lCVBPUlRfV0FLRV9CSVRTIAkoUE9SVF9XS09DX0V8UE9SVF9XS0RJU0NfRXxQT1JUX1dLQ09OTl9FKQorI2RlZmluZQlQT1JUX1dBS0VfQklUUwkoUE9SVF9XS09DX0V8UE9SVF9XS0RJU0NfRXxQT1JUX1dLQ09OTl9FKQogCiBzdGF0aWMgaW50IGVoY2lfaHViX2NvbnRyb2wgKAogCXN0cnVjdCB1c2JfaGNkCSpoY2QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktbWVtLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktbWVtLmMKaW5kZXggNzY2MDYxZS4uYThiYTJlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLW1lbS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1tZW0uYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEgYnkgRGF2aWQgQnJvd25lbGwKLSAqIAorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKICAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKQEAgLTI1LDcgKzI1LDcgQEAKICAqCS0gZGF0YSB1c2VkIG9ubHkgYnkgdGhlIEhDRCAuLi4ga21hbGxvYyBpcyBmaW5lCiAgKgktIGFzeW5jIGFuZCBwZXJpb2RpYyBzY2hlZHVsZXMsIHNoYXJlZCBieSBIQyBhbmQgSENEIC4uLiB0aGVzZQogICoJICBuZWVkIHRvIHVzZSBkbWFfcG9vbCBvciBkbWFfYWxsb2NfY29oZXJlbnQKLSAqCS0gZHJpdmVyIGJ1ZmZlcnMsIHJlYWQvd3JpdHRlbiBieSBIQyAuLi4gc2luZ2xlIHNob3QgRE1BIG1hcHBlZCAKKyAqCS0gZHJpdmVyIGJ1ZmZlcnMsIHJlYWQvd3JpdHRlbiBieSBIQyAuLi4gc2luZ2xlIHNob3QgRE1BIG1hcHBlZAogICoKICAqIFRoZXJlJ3MgYWxzbyBQQ0kgInJlZ2lzdGVyIiBkYXRhLCB3aGljaCBpcyBtZW1vcnkgbWFwcGVkLgogICogTm8gbWVtb3J5IHNlZW4gYnkgdGhpcyBkcml2ZXIgaXMgcGFnZWFibGUuCkBAIC0xMTksNyArMTE5LDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotLyogVGhlIHF1ZXVlIGhlYWRzIGFuZCB0cmFuc2ZlciBkZXNjcmlwdG9ycyBhcmUgbWFuYWdlZCBmcm9tIHBvb2xzIHRpZWQgCisvKiBUaGUgcXVldWUgaGVhZHMgYW5kIHRyYW5zZmVyIGRlc2NyaXB0b3JzIGFyZSBtYW5hZ2VkIGZyb20gcG9vbHMgdGllZAogICogdG8gZWFjaCBvZiB0aGUgInBlciBkZXZpY2UiIHN0cnVjdHVyZXMuCiAgKiBUaGlzIGlzIHRoZSBpbml0aWFsaXNhdGlvbiBhbmQgY2xlYW51cCBjb2RlLgogICovCkBAIC0xNjUsNyArMTY1LDcgQEAKIAlpbnQgaTsKIAogCS8qIFFURHMgZm9yIGNvbnRyb2wvYnVsay9pbnRyIHRyYW5zZmVycyAqLwotCWVoY2ktPnF0ZF9wb29sID0gZG1hX3Bvb2xfY3JlYXRlICgiZWhjaV9xdGQiLCAKKwllaGNpLT5xdGRfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZSAoImVoY2lfcXRkIiwKIAkJCWVoY2lfdG9faGNkKGVoY2kpLT5zZWxmLmNvbnRyb2xsZXIsCiAJCQlzaXplb2YgKHN0cnVjdCBlaGNpX3F0ZCksCiAJCQkzMiAvKiBieXRlIGFsaWdubWVudCAoZm9yIGh3IHBhcnRzKSAqLywKQEAgLTE3NSw3ICsxNzUsNyBAQAogCX0KIAogCS8qIFFIcyBmb3IgY29udHJvbC9idWxrL2ludHIgdHJhbnNmZXJzICovCi0JZWhjaS0+cWhfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZSAoImVoY2lfcWgiLCAKKwllaGNpLT5xaF9wb29sID0gZG1hX3Bvb2xfY3JlYXRlICgiZWhjaV9xaCIsCiAJCQllaGNpX3RvX2hjZChlaGNpKS0+c2VsZi5jb250cm9sbGVyLAogCQkJc2l6ZW9mIChzdHJ1Y3QgZWhjaV9xaCksCiAJCQkzMiAvKiBieXRlIGFsaWdubWVudCAoZm9yIGh3IHBhcnRzKSAqLywKQEAgLTE4OSw3ICsxODksNyBAQAogCX0KIAogCS8qIElURCBmb3IgaGlnaCBzcGVlZCBJU08gdHJhbnNmZXJzICovCi0JZWhjaS0+aXRkX3Bvb2wgPSBkbWFfcG9vbF9jcmVhdGUgKCJlaGNpX2l0ZCIsIAorCWVoY2ktPml0ZF9wb29sID0gZG1hX3Bvb2xfY3JlYXRlICgiZWhjaV9pdGQiLAogCQkJZWhjaV90b19oY2QoZWhjaSktPnNlbGYuY29udHJvbGxlciwKIAkJCXNpemVvZiAoc3RydWN0IGVoY2lfaXRkKSwKIAkJCTMyIC8qIGJ5dGUgYWxpZ25tZW50IChmb3IgaHcgcGFydHMpICovLApAQCAtMTk5LDcgKzE5OSw3IEBACiAJfQogCiAJLyogU0lURCBmb3IgZnVsbC9sb3cgc3BlZWQgc3BsaXQgSVNPIHRyYW5zZmVycyAqLwotCWVoY2ktPnNpdGRfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZSAoImVoY2lfc2l0ZCIsIAorCWVoY2ktPnNpdGRfcG9vbCA9IGRtYV9wb29sX2NyZWF0ZSAoImVoY2lfc2l0ZCIsCiAJCQllaGNpX3RvX2hjZChlaGNpKS0+c2VsZi5jb250cm9sbGVyLAogCQkJc2l6ZW9mIChzdHJ1Y3QgZWhjaV9zaXRkKSwKIAkJCTMyIC8qIGJ5dGUgYWxpZ25tZW50IChmb3IgaHcgcGFydHMpICovLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXBjaS5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXBjaS5jCmluZGV4IGNhZGZmYWMuLjA4ZDA0NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcGNpLmMKQEAgLTIzOCw2ICsyMzgsMTIgQEAKIAl3cml0ZWwgKDAsICZlaGNpLT5yZWdzLT5pbnRyX2VuYWJsZSk7CiAJKHZvaWQpcmVhZGwoJmVoY2ktPnJlZ3MtPmludHJfZW5hYmxlKTsKIAorCS8qIG1ha2Ugc3VyZSBzbmFwc2hvdCBiZWluZyByZXN1bWVkIHJlLWVudW1lcmF0ZXMgZXZlcnl0aGluZyAqLworCWlmIChtZXNzYWdlLmV2ZW50ID09IFBNX0VWRU5UX1BSRVRIQVcpIHsKKwkJZWhjaV9oYWx0KGVoY2kpOworCQllaGNpX3Jlc2V0KGVoY2kpOworCX0KKwogCWNsZWFyX2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncyk7CiAgYmFpbDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZWhjaS0+bG9jaywgZmxhZ3MpOwpAQCAtMjk3LDcgKzMwMyw3IEBACiAJLyogZW1wdHlpbmcgdGhlIHNjaGVkdWxlIGFib3J0cyBhbnkgdXJicyAqLwogCXNwaW5fbG9ja19pcnEoJmVoY2ktPmxvY2spOwogCWlmIChlaGNpLT5yZWNsYWltKQotCQllaGNpLT5yZWNsYWltX3JlYWR5ID0gMTsKKwkJZW5kX3VubGlua19hc3luYyAoZWhjaSwgTlVMTCk7CiAJZWhjaV93b3JrKGVoY2ksIE5VTEwpOwogCXNwaW5fdW5sb2NrX2lycSgmZWhjaS0+bG9jayk7CiAKQEAgLTMzMiw2ICszMzgsNyBAQAogCS5yZXN1bWUgPQkJZWhjaV9wY2lfcmVzdW1lLAogI2VuZGlmCiAJLnN0b3AgPQkJCWVoY2lfc3RvcCwKKwkuc2h1dGRvd24gPQkJZWhjaV9zaHV0ZG93biwKIAogCS8qCiAJICogbWFuYWdpbmcgaS9vIHJlcXVlc3RzIGFuZCBhc3NvY2lhdGVkIGRldmljZSByZXNvdXJjZXMKQEAgLTM3OCw0ICszODUsNSBAQAogCS5zdXNwZW5kID0JdXNiX2hjZF9wY2lfc3VzcGVuZCwKIAkucmVzdW1lID0JdXNiX2hjZF9wY2lfcmVzdW1lLAogI2VuZGlmCisJLnNodXRkb3duID0gCXVzYl9oY2RfcGNpX3NodXRkb3duLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktcS5jCmluZGV4IGU0NjkyMjEuLjdmYzI1YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1xLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXEuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBieSBEYXZpZCBCcm93bmVsbAotICogCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQogICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgpAQCAtMzEsNyArMzEsNyBAQAogICogSVNPIHRyYWZmaWMgdXNlcyAiSVNPIFREIiAoaXRkLCBhbmQgc2l0ZCkgcmVjb3JkcywgYW5kIChhbG9uZyB3aXRoCiAgKiBpbnRlcnJ1cHRzKSBuZWVkcyBjYXJlZnVsIHNjaGVkdWxpbmcuICBQZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgY2FuIGJlCiAgKiBhbiBvbmdvaW5nIGNoYWxsZW5nZS4gIFRoYXQncyBpbiAiZWhjaS1zY2hlZC5jIi4KLSAqIAorICoKICAqIFVTQiAxLjEgZGV2aWNlcyBhcmUgaGFuZGxlZCAoYSkgYnkgImNvbXBhbmlvbiIgT0hDSSBvciBVSENJIHJvb3QgaHVicywKICAqIG9yIG90aGVyd2lzZSB0aHJvdWdoIHRyYW5zYWN0aW9uIHRyYW5zbGF0b3JzIChUVHMpIGluIFVTQiAyLjAgaHVicyB1c2luZwogICogKGIpIHNwZWNpYWwgZmllbGRzIGluIHFoIGVudHJpZXMgb3IgKGMpIHNwbGl0IGlzbyBlbnRyaWVzLiAgVFRzIHdpbGwKQEAgLTE5OSw3ICsxOTksNyBAQAogCQkJCSYmICgodG9rZW4gJiBRVERfU1RTX01NRikgIT0gMAogCQkJCQl8fCBRVERfQ0VSUih0b2tlbikgPT0gMCkKIAkJCQkmJiAoIWVoY2lfaXNfVERJKGVoY2kpCi0gICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICB8fCB1cmItPmRldi0+dHQtPmh1YiAhPQorCQkJICAgICAgICAgICAgICAgIHx8IHVyYi0+ZGV2LT50dC0+aHViICE9CiAJCQkJCSAgIGVoY2lfdG9faGNkKGVoY2kpLT5zZWxmLnJvb3RfaHViKSkgewogI2lmZGVmIERFQlVHCiAJCQlzdHJ1Y3QgdXNiX2RldmljZSAqdHQgPSB1cmItPmRldi0+dHQtPmh1YjsKQEAgLTM2NCw3ICszNjQsNyBAQAogCQkJICovCiAJCQlpZiAobGlrZWx5ICh1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpKQogCQkJCWNvbnRpbnVlOwotCQkJCisKIAkJCS8qIGlzc3VlIHN0YXR1cyBhZnRlciBzaG9ydCBjb250cm9sIHJlYWRzICovCiAJCQlpZiAodW5saWtlbHkgKGRvX3N0YXR1cyAhPSAwKQogCQkJCQkmJiBRVERfUElEICh0b2tlbikgPT0gMCAvKiBPVVQgKi8pIHsKQEAgLTM4OCw3ICszODgsNyBAQAogCQkJCXdtYiAoKTsKIAkJCX0KIAkJfQotIAorCiAJCS8qIHJlbW92ZSBpdCBmcm9tIHRoZSBxdWV1ZSAqLwogCQlzcGluX2xvY2sgKCZ1cmItPmxvY2spOwogCQlxdGRfY29weV9zdGF0dXMgKGVoY2ksIHVyYiwgcXRkLT5sZW5ndGgsIHRva2VuKTsKQEAgLTUxOCw3ICs1MTgsNyBAQAogCQkvKiBmb3IgemVybyBsZW5ndGggREFUQSBzdGFnZXMsIFNUQVRVUyBpcyBhbHdheXMgSU4gKi8KIAkJaWYgKGxlbiA9PSAwKQogCQkJdG9rZW4gfD0gKDEgLyogImluIiAqLyA8PCA4KTsKLQl9IAorCX0KIAogCS8qCiAJICogZGF0YSB0cmFuc2ZlciBzdGFnZTogIGJ1ZmZlciBzZXR1cApAQCAtNzU5LDcgKzc1OSw3IEBACiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKLSAJCWRiZyAoImJvZ3VzIGRldiAlcCBzcGVlZCAlZCIsIHVyYi0+ZGV2LCB1cmItPmRldi0+c3BlZWQpOworCQlkYmcgKCJib2d1cyBkZXYgJXAgc3BlZWQgJWQiLCB1cmItPmRldiwgdXJiLT5kZXYtPnNwZWVkKTsKIGRvbmU6CiAJCXFoX3B1dCAocWgpOwogCQlyZXR1cm4gTlVMTDsKQEAgLTk2NywxNyArOTY3LDE2IEBACiAJc3RydWN0IGVoY2lfcWgJCSpxaCA9IGVoY2ktPnJlY2xhaW07CiAJc3RydWN0IGVoY2lfcWgJCSpuZXh0OwogCi0JdGltZXJfYWN0aW9uX2RvbmUgKGVoY2ksIFRJTUVSX0lBQV9XQVRDSERPRyk7CisJaWFhX3dhdGNoZG9nX2RvbmUgKGVoY2kpOwogCiAJLy8gcWgtPmh3X25leHQgPSBjcHVfdG9fbGUzMiAocWgtPnFoX2RtYSk7CiAJcWgtPnFoX3N0YXRlID0gUUhfU1RBVEVfSURMRTsKIAlxaC0+cWhfbmV4dC5xaCA9IE5VTEw7Ci0JcWhfcHV0IChxaCk7CQkJLy8gcmVmY291bnQgZnJvbSByZWNsYWltIAorCXFoX3B1dCAocWgpOwkJCS8vIHJlZmNvdW50IGZyb20gcmVjbGFpbQogCiAJLyogb3RoZXIgdW5saW5rKHMpIG1heSBiZSBwZW5kaW5nIChpbiBRSF9TVEFURV9VTkxJTktfV0FJVCkgKi8KIAluZXh0ID0gcWgtPnJlY2xhaW07CiAJZWhjaS0+cmVjbGFpbSA9IG5leHQ7Ci0JZWhjaS0+cmVjbGFpbV9yZWFkeSA9IDA7CiAJcWgtPnJlY2xhaW0gPSBOVUxMOwogCiAJcWhfY29tcGxldGlvbnMgKGVoY2ksIHFoLCByZWdzKTsKQEAgLTEwMzEsNyArMTAzMCw3IEBACiAJCQl0aW1lcl9hY3Rpb25fZG9uZSAoZWhjaSwgVElNRVJfQVNZTkNfT0ZGKTsKIAkJfQogCQlyZXR1cm47Ci0JfSAKKwl9CiAKIAlxaC0+cWhfc3RhdGUgPSBRSF9TVEFURV9VTkxJTks7CiAJZWhjaS0+cmVjbGFpbSA9IHFoID0gcWhfZ2V0IChxaCk7CkBAIC0xMDQ2LDE3ICsxMDQ1LDE2IEBACiAKIAlpZiAodW5saWtlbHkgKGVoY2lfdG9faGNkKGVoY2kpLT5zdGF0ZSA9PSBIQ19TVEFURV9IQUxUKSkgewogCQkvKiBpZiAodW5saWtlbHkgKHFoLT5yZWNsYWltICE9IDApKQotCQkgKiAJdGhpcyB3aWxsIHJlY3Vyc2UsIHByb2JhYmx5IG5vdCBtdWNoCisJCSAqCXRoaXMgd2lsbCByZWN1cnNlLCBwcm9iYWJseSBub3QgbXVjaAogCQkgKi8KIAkJZW5kX3VubGlua19hc3luYyAoZWhjaSwgTlVMTCk7CiAJCXJldHVybjsKIAl9CiAKLQllaGNpLT5yZWNsYWltX3JlYWR5ID0gMDsKIAljbWQgfD0gQ01EX0lBQUQ7CiAJd3JpdGVsIChjbWQsICZlaGNpLT5yZWdzLT5jb21tYW5kKTsKIAkodm9pZCkgcmVhZGwgKCZlaGNpLT5yZWdzLT5jb21tYW5kKTsKLQl0aW1lcl9hY3Rpb24gKGVoY2ksIFRJTUVSX0lBQV9XQVRDSERPRyk7CisJaWFhX3dhdGNoZG9nX3N0YXJ0IChlaGNpKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKaW5kZXggNDg1OTkwMC4uZTVlOWM2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLXNjaGVkLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgYnkgRGF2aWQgQnJvd25lbGwKICAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWwgU29qa2EsIGZvciBoaWdoLXNwZWVkIGlzbyB0cmFuc2ZlcnMKLSAqIAorICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKICAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKQEAgLTYxMyw3ICs2MTMsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIGludCBjaGVja19wZXJpb2QgKAotCXN0cnVjdCBlaGNpX2hjZCAqZWhjaSwgCisJc3RydWN0IGVoY2lfaGNkICplaGNpLAogCXVuc2lnbmVkCWZyYW1lLAogCXVuc2lnbmVkCXVmcmFtZSwKIAl1bnNpZ25lZAlwZXJpb2QsCkBAIC02MjksNyArNjI5LDcgQEAKIAogCS8qCiAJICogODAlIHBlcmlvZGljID09IDEwMCB1c2VjL3VmcmFtZSBhdmFpbGFibGUKLQkgKiBjb252ZXJ0ICJ1c2VjcyB3ZSBuZWVkIiB0byAibWF4IGFscmVhZHkgY2xhaW1lZCIgCisJICogY29udmVydCAidXNlY3Mgd2UgbmVlZCIgdG8gIm1heCBhbHJlYWR5IGNsYWltZWQiCiAJICovCiAJdXNlY3MgPSAxMDAgLSB1c2VjczsKIApAQCAtNjU5LDE0ICs2NTksMTQgQEAKIH0KIAogc3RhdGljIGludCBjaGVja19pbnRyX3NjaGVkdWxlICgKLQlzdHJ1Y3QgZWhjaV9oY2QJCSplaGNpLCAKKwlzdHJ1Y3QgZWhjaV9oY2QJCSplaGNpLAogCXVuc2lnbmVkCQlmcmFtZSwKIAl1bnNpZ25lZAkJdWZyYW1lLAogCWNvbnN0IHN0cnVjdCBlaGNpX3FoCSpxaCwKIAlfX2xlMzIJCQkqY19tYXNrcAogKQogewotICAgIAlpbnQJCXJldHZhbCA9IC1FTk9TUEM7CisJaW50CQlyZXR2YWwgPSAtRU5PU1BDOwogCXU4CQltYXNrID0gMDsKIAogCWlmIChxaC0+Y191c2VjcyAmJiB1ZnJhbWUgPj0gNikJCS8qIEZTVE4gdGVycml0b3J5PyAqLwpAQCAtNzAxLDcgKzcwMSw3IEBACiAJLyogTWFrZSBzdXJlIHRoaXMgdHQncyBidWZmZXIgaXMgYWxzbyBhdmFpbGFibGUgZm9yIENTUExJVHMuCiAJICogV2UgcGVzc2ltaXplIGEgYml0OyBwcm9iYWJseSB0aGUgdHlwaWNhbCBmdWxsIHNwZWVkIGNhc2UKIAkgKiBkb2Vzbid0IG5lZWQgdGhlIHNlY29uZCBDU1BMSVQuCi0JICogCisJICoKIAkgKiBOT1RFOiAgYm90aCBTUExJVCBhbmQgQ1NQTElUIGNvdWxkIGJlIGNoZWNrZWQgaW4ganVzdAogCSAqIG9uZSBzbWFydCBwYXNzLi4uCiAJICovCkBAIC03MjgsNyArNzI4LDcgQEAKICAqLwogc3RhdGljIGludCBxaF9zY2hlZHVsZSAoc3RydWN0IGVoY2lfaGNkICplaGNpLCBzdHJ1Y3QgZWhjaV9xaCAqcWgpCiB7Ci0JaW50IAkJc3RhdHVzOworCWludAkJc3RhdHVzOwogCXVuc2lnbmVkCXVmcmFtZTsKIAlfX2xlMzIJCWNfbWFzazsKIAl1bnNpZ25lZAlmcmFtZTsJCS8qIDAuLihxaC0+cGVyaW9kIC0gMSksIG9yIE5PX0ZSQU1FICovCkBAIC03ODQsNyArNzg0LDcgQEAKIAkJZWhjaV9kYmcgKGVoY2ksICJyZXVzZWQgcWggJXAgc2NoZWR1bGVcbiIsIHFoKTsKIAogCS8qIHN0dWZmIGludG8gdGhlIHBlcmlvZGljIHNjaGVkdWxlICovCi0gCXN0YXR1cyA9IHFoX2xpbmtfcGVyaW9kaWMgKGVoY2ksIHFoKTsKKwlzdGF0dXMgPSBxaF9saW5rX3BlcmlvZGljIChlaGNpLCBxaCk7CiBkb25lOgogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xNjgxLDcgKzE2ODEsNyBAQAogCQlzdGF0dXMgPSAtRVNIVVRET1dOOwogCWVsc2UKIAkJc3RhdHVzID0gaXNvX3N0cmVhbV9zY2hlZHVsZSAoZWhjaSwgdXJiLCBzdHJlYW0pOwotIAlpZiAobGlrZWx5IChzdGF0dXMgPT0gMCkpCisJaWYgKGxpa2VseSAoc3RhdHVzID09IDApKQogCQlpdGRfbGlua191cmIgKGVoY2ksIHVyYiwgZWhjaS0+cGVyaW9kaWNfc2l6ZSA8PCAzLCBzdHJlYW0pOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZlaGNpLT5sb2NrLCBmbGFncyk7CiAKQEAgLTE3MzgsNyArMTczOCw3IEBACiAJCWlmIChwYWNrZXQtPmJ1ZjEgIT0gKGJ1ZiAmIH4odTY0KTB4MGZmZikpCiAJCQlwYWNrZXQtPmNyb3NzID0gMTsKIAotCQkvKiBPVVQgdXNlcyBtdWx0aXBsZSBzdGFydC1zcGxpdHMgKi8gCisJCS8qIE9VVCB1c2VzIG11bHRpcGxlIHN0YXJ0LXNwbGl0cyAqLwogCQlpZiAoc3RyZWFtLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikKIAkJCWNvbnRpbnVlOwogCQlsZW5ndGggPSAobGVuZ3RoICsgMTg3KSAvIDE4ODsKQEAgLTE5MjUsNyArMTkyNSw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCiAjZGVmaW5lCVNJVERfRVJSUyAoU0lURF9TVFNfRVJSIHwgU0lURF9TVFNfREJFIHwgU0lURF9TVFNfQkFCQkxFIFwKLQkgICAgICAgCQkJfCBTSVREX1NUU19YQUNUIHwgU0lURF9TVFNfTU1GKQorCQkJCXwgU0lURF9TVFNfWEFDVCB8IFNJVERfU1RTX01NRikKIAogc3RhdGljIHVuc2lnbmVkCiBzaXRkX2NvbXBsZXRlICgKQEAgLTIwNDMsNyArMjA0Myw3IEBACiAJCXN0YXR1cyA9IC1FU0hVVERPV047CiAJZWxzZQogCQlzdGF0dXMgPSBpc29fc3RyZWFtX3NjaGVkdWxlIChlaGNpLCB1cmIsIHN0cmVhbSk7Ci0gCWlmIChzdGF0dXMgPT0gMCkKKwlpZiAoc3RhdHVzID09IDApCiAJCXNpdGRfbGlua191cmIgKGVoY2ksIHVyYiwgZWhjaS0+cGVyaW9kaWNfc2l6ZSA8PCAzLCBzdHJlYW0pOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZlaGNpLT5sb2NrLCBmbGFncyk7CiAKQEAgLTIyMjYsNSArMjIyNiw1IEBACiAJCQlub3dfdWZyYW1lKys7CiAJCQlub3dfdWZyYW1lICU9IG1vZDsKIAkJfQotCX0gCisJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLmggYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaAppbmRleCA2NzljMWNkLi42YWFjMzlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2kuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBieSBEYXZpZCBCcm93bmVsbAotICogCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQogICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgpAQCAtNTgsNyArNTgsNiBAQAogCS8qIGFzeW5jIHNjaGVkdWxlIHN1cHBvcnQgKi8KIAlzdHJ1Y3QgZWhjaV9xaAkJKmFzeW5jOwogCXN0cnVjdCBlaGNpX3FoCQkqcmVjbGFpbTsKLQl1bnNpZ25lZAkJcmVjbGFpbV9yZWFkeSA6IDE7CiAJdW5zaWduZWQJCXNjYW5uaW5nIDogMTsKIAogCS8qIHBlcmlvZGljIHNjaGVkdWxlIHN1cHBvcnQgKi8KQEAgLTgxLDggKzgwLDggQEAKIAlzdHJ1Y3QgZG1hX3Bvb2wJCSppdGRfcG9vbDsJLyogaXRkIHBlciBpc28gdXJiICovCiAJc3RydWN0IGRtYV9wb29sCQkqc2l0ZF9wb29sOwkvKiBzaXRkIHBlciBzcGxpdCBpc28gdXJiICovCiAKKwlzdHJ1Y3QgdGltZXJfbGlzdAlpYWFfd2F0Y2hkb2c7CiAJc3RydWN0IHRpbWVyX2xpc3QJd2F0Y2hkb2c7Ci0Jc3RydWN0IG5vdGlmaWVyX2Jsb2NrCXJlYm9vdF9ub3RpZmllcjsKIAl1bnNpZ25lZCBsb25nCQlhY3Rpb25zOwogCXVuc2lnbmVkCQlzdGFtcDsKIAl1bnNpZ25lZCBsb25nCQluZXh0X3N0YXRlY2hhbmdlOwpAQCAtMTA0LDcgKzEwMyw3IEBACiAjZW5kaWYKIH07CiAKLS8qIGNvbnZlcnQgYmV0d2VlbiBhbiBIQ0QgcG9pbnRlciBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgRUhDSV9IQ0QgKi8gCisvKiBjb252ZXJ0IGJldHdlZW4gYW4gSENEIHBvaW50ZXIgYW5kIHRoZSBjb3JyZXNwb25kaW5nIEVIQ0lfSENEICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBlaGNpX2hjZCAqaGNkX3RvX2VoY2kgKHN0cnVjdCB1c2JfaGNkICpoY2QpCiB7CiAJcmV0dXJuIChzdHJ1Y3QgZWhjaV9oY2QgKikgKGhjZC0+aGNkX3ByaXYpOwpAQCAtMTE1LDkgKzExNCwyMSBAQAogfQogCiAKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWFhX3dhdGNoZG9nX3N0YXJ0IChzdHJ1Y3QgZWhjaV9oY2QgKmVoY2kpCit7CisJV0FSTl9PTih0aW1lcl9wZW5kaW5nKCZlaGNpLT5pYWFfd2F0Y2hkb2cpKTsKKwltb2RfdGltZXIgKCZlaGNpLT5pYWFfd2F0Y2hkb2csCisJCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhFSENJX0lBQV9NU0VDUykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWFhX3dhdGNoZG9nX2RvbmUgKHN0cnVjdCBlaGNpX2hjZCAqZWhjaSkKK3sKKwlkZWxfdGltZXIgKCZlaGNpLT5pYWFfd2F0Y2hkb2cpOworfQorCiBlbnVtIGVoY2lfdGltZXJfYWN0aW9uIHsKIAlUSU1FUl9JT19XQVRDSERPRywKLQlUSU1FUl9JQUFfV0FUQ0hET0csCiAJVElNRVJfQVNZTkNfU0hSSU5LLAogCVRJTUVSX0FTWU5DX09GRiwKIH07CkBAIC0xMzUsOSArMTQ2LDYgQEAKIAkJdW5zaWduZWQgbG9uZyB0OwogCiAJCXN3aXRjaCAoYWN0aW9uKSB7Ci0JCWNhc2UgVElNRVJfSUFBX1dBVENIRE9HOgotCQkJdCA9IEVIQ0lfSUFBX0pJRkZJRVM7Ci0JCQlicmVhazsKIAkJY2FzZSBUSU1FUl9JT19XQVRDSERPRzoKIAkJCXQgPSBFSENJX0lPX0pJRkZJRVM7CiAJCQlicmVhazsKQEAgLTE1NCw4ICsxNjIsNyBAQAogCQkvLyBhc3luYyBxdWV1ZSBTSFJJTksgb2Z0ZW4gcHJlY2VkZXMgSUFBLiAgd2hpbGUgaXQncyByZWFkeQogCQkvLyB0byBnbyBPRkYgbmVpdGhlciBjYW4gbWF0dGVyLCBhbmQgYWZ0ZXJ3YXJkcyB0aGUgSU8KIAkJLy8gd2F0Y2hkb2cgc3RvcHMgdW5sZXNzIHRoZXJlJ3Mgc3RpbGwgcGVyaW9kaWMgdHJhZmZpYy4KLQkJaWYgKGFjdGlvbiAhPSBUSU1FUl9JQUFfV0FUQ0hET0cKLQkJCQkmJiB0ID4gZWhjaS0+d2F0Y2hkb2cuZXhwaXJlcworCQlpZiAodGltZV9iZWZvcmVfZXEodCwgZWhjaS0+d2F0Y2hkb2cuZXhwaXJlcykKIAkJCQkmJiB0aW1lcl9wZW5kaW5nICgmZWhjaS0+d2F0Y2hkb2cpKQogCQkJcmV0dXJuOwogCQltb2RfdGltZXIgKCZlaGNpLT53YXRjaGRvZywgdCk7CkBAIC0xNzksOCArMTg2LDggQEAKICNkZWZpbmUgSENTX0lORElDQVRPUihwKQkoKHApJigxIDw8IDE2KSkJLyogdHJ1ZTogaGFzIHBvcnQgaW5kaWNhdG9ycyAqLwogI2RlZmluZSBIQ1NfTl9DQyhwKQkJKCgocCk+PjEyKSYweGYpCS8qIGJpdHMgMTU6MTIsICNjb21wYW5pb24gSENzICovCiAjZGVmaW5lIEhDU19OX1BDQyhwKQkJKCgocCk+PjgpJjB4ZikJLyogYml0cyAxMTo4LCBwb3J0cyBwZXIgQ0MgKi8KLSNkZWZpbmUgSENTX1BPUlRST1VURUQocCkJKChwKSYoMSA8PCA3KSkJLyogdHJ1ZTogcG9ydCByb3V0aW5nICovIAotI2RlZmluZSBIQ1NfUFBDKHApCQkoKHApJigxIDw8IDQpKQkvKiB0cnVlOiBwb3J0IHBvd2VyIGNvbnRyb2wgKi8gCisjZGVmaW5lIEhDU19QT1JUUk9VVEVEKHApCSgocCkmKDEgPDwgNykpCS8qIHRydWU6IHBvcnQgcm91dGluZyAqLworI2RlZmluZSBIQ1NfUFBDKHApCQkoKHApJigxIDw8IDQpKQkvKiB0cnVlOiBwb3J0IHBvd2VyIGNvbnRyb2wgKi8KICNkZWZpbmUgSENTX05fUE9SVFMocCkJCSgoKHApPj4wKSYweGYpCS8qIGJpdHMgMzowLCBwb3J0cyBvbiBIQyAqLwogCiAJdTMyCQloY2NfcGFyYW1zOyAgICAgIC8qIEhDQ1BBUkFNUyAtIG9mZnNldCAweDggKi8KQEAgLTIwNSw3ICsyMTIsNyBAQAogI2RlZmluZSBDTURfTFJFU0VUCSgxPDw3KQkJLyogcGFydGlhbCByZXNldCAobm8gcG9ydHMsIGV0YykgKi8KICNkZWZpbmUgQ01EX0lBQUQJKDE8PDYpCQkvKiAiZG9vcmJlbGwiIGludGVycnVwdCBhc3luYyBhZHZhbmNlICovCiAjZGVmaW5lIENNRF9BU0UJCSgxPDw1KQkJLyogYXN5bmMgc2NoZWR1bGUgZW5hYmxlICovCi0jZGVmaW5lIENNRF9QU0UgIAkoMTw8NCkJCS8qIHBlcmlvZGljIHNjaGVkdWxlIGVuYWJsZSAqLworI2RlZmluZSBDTURfUFNFCQkoMTw8NCkJCS8qIHBlcmlvZGljIHNjaGVkdWxlIGVuYWJsZSAqLwogLyogMzoyIGlzIHBlcmlvZGljIGZyYW1lIGxpc3Qgc2l6ZSAqLwogI2RlZmluZSBDTURfUkVTRVQJKDE8PDEpCQkvKiByZXNldCBIQyBub3QgYnVzICovCiAjZGVmaW5lIENNRF9SVU4JCSgxPDwwKQkJLyogc3RhcnQvc3RvcCBIQyAqLwpAQCAtMjMxLDkgKzIzOCw5IEBACiAJLyogRlJJTkRFWDogb2Zmc2V0IDB4MEMgKi8KIAl1MzIJCWZyYW1lX2luZGV4OwkvKiBjdXJyZW50IG1pY3JvZnJhbWUgbnVtYmVyICovCiAJLyogQ1RSTERTU0VHTUVOVDogb2Zmc2V0IDB4MTAgKi8KLQl1MzIJCXNlZ21lbnQ7IAkvKiBhZGRyZXNzIGJpdHMgNjM6MzIgaWYgbmVlZGVkICovCisJdTMyCQlzZWdtZW50OwkvKiBhZGRyZXNzIGJpdHMgNjM6MzIgaWYgbmVlZGVkICovCiAJLyogUEVSSU9ESUNMSVNUQkFTRTogb2Zmc2V0IDB4MTQgKi8KLQl1MzIJCWZyYW1lX2xpc3Q7IAkvKiBwb2ludHMgdG8gcGVyaW9kaWMgbGlzdCAqLworCXUzMgkJZnJhbWVfbGlzdDsJLyogcG9pbnRzIHRvIHBlcmlvZGljIGxpc3QgKi8KIAkvKiBBU1lOQ0xJU1RBRERSOiBvZmZzZXQgMHgxOCAqLwogCXUzMgkJYXN5bmNfbmV4dDsJLyogYWRkcmVzcyBvZiBuZXh0IGFzeW5jIHF1ZXVlIGhlYWQgKi8KIApAQCAtMzAyLDcgKzMwOSw3IEBACiAKIC8qCiAgKiBFSENJIFNwZWNpZmljYXRpb24gMC45NSBTZWN0aW9uIDMuNQotICogUVREOiBkZXNjcmliZSBkYXRhIHRyYW5zZmVyIGNvbXBvbmVudHMgKGJ1ZmZlciwgZGlyZWN0aW9uLCAuLi4pIAorICogUVREOiBkZXNjcmliZSBkYXRhIHRyYW5zZmVyIGNvbXBvbmVudHMgKGJ1ZmZlciwgZGlyZWN0aW9uLCAuLi4pCiAgKiBTZWUgRmlnIDMtNiAiUXVldWUgRWxlbWVudCBUcmFuc2ZlciBEZXNjcmlwdG9yIEJsb2NrIERpYWdyYW0iLgogICoKICAqIFRoZXNlIGFyZSBhc3NvY2lhdGVkIG9ubHkgd2l0aCAiUUgiIChRdWV1ZSBIZWFkKSBzdHJ1Y3R1cmVzLApAQCAtMzEyLDcgKzMxOSw3IEBACiAJLyogZmlyc3QgcGFydCBkZWZpbmVkIGJ5IEVIQ0kgc3BlYyAqLwogCV9fbGUzMgkJCWh3X25leHQ7CSAgLyogc2VlIEVIQ0kgMy41LjEgKi8KIAlfX2xlMzIJCQlod19hbHRfbmV4dDsgICAgICAvKiBzZWUgRUhDSSAzLjUuMiAqLwotCV9fbGUzMgkJCWh3X3Rva2VuOyAgICAgICAgIC8qIHNlZSBFSENJIDMuNS4zICovICAgICAgIAorCV9fbGUzMgkJCWh3X3Rva2VuOyAgICAgICAgIC8qIHNlZSBFSENJIDMuNS4zICovCiAjZGVmaW5lCVFURF9UT0dHTEUJKDEgPDwgMzEpCS8qIGRhdGEgdG9nZ2xlICovCiAjZGVmaW5lCVFURF9MRU5HVEgodG9rKQkoKCh0b2spPj4xNikgJiAweDdmZmYpCiAjZGVmaW5lCVFURF9JT0MJCSgxIDw8IDE1KQkvKiBpbnRlcnJ1cHQgb24gY29tcGxldGUgKi8KQEAgLTM0OSw4ICszNTYsOCBAQAogLyogdmFsdWVzIGZvciB0aGF0IHR5cGUgdGFnICovCiAjZGVmaW5lIFFfVFlQRV9JVEQJX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMCA8PCAxKQogI2RlZmluZSBRX1RZUEVfUUgJX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMSA8PCAxKQotI2RlZmluZSBRX1RZUEVfU0lURCAJX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMiA8PCAxKQotI2RlZmluZSBRX1RZUEVfRlNUTiAJX19jb25zdGFudF9jcHVfdG9fbGUzMiAoMyA8PCAxKQorI2RlZmluZSBRX1RZUEVfU0lURAlfX2NvbnN0YW50X2NwdV90b19sZTMyICgyIDw8IDEpCisjZGVmaW5lIFFfVFlQRV9GU1ROCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIgKDMgPDwgMSkKIAogLyogbmV4dCBhc3luYyBxdWV1ZSBlbnRyeSwgb3IgcG9pbnRlciB0byBpbnRlcnJ1cHQvcGVyaW9kaWMgUUggKi8KICNkZWZpbmUJUUhfTkVYVChkbWEpCShjcHVfdG9fbGUzMigoKHUzMilkbWEpJn4weDAxZil8UV9UWVBFX1FIKQpAQCAtMzY3LDcgKzM3NCw3IEBACiAgKiBGb3IgZW50cmllcyBpbiB0aGUgYXN5bmMgc2NoZWR1bGUsIHRoZSB0eXBlIHRhZyBhbHdheXMgc2F5cyAicWgiLgogICovCiB1bmlvbiBlaGNpX3NoYWRvdyB7Ci0Jc3RydWN0IGVoY2lfcWggCQkqcWg7CQkvKiBRX1RZUEVfUUggKi8KKwlzdHJ1Y3QgZWhjaV9xaAkJKnFoOwkJLyogUV9UWVBFX1FIICovCiAJc3RydWN0IGVoY2lfaXRkCQkqaXRkOwkJLyogUV9UWVBFX0lURCAqLwogCXN0cnVjdCBlaGNpX3NpdGQJKnNpdGQ7CQkvKiBRX1RZUEVfU0lURCAqLwogCXN0cnVjdCBlaGNpX2ZzdG4JKmZzdG47CQkvKiBRX1RZUEVfRlNUTiAqLwpAQCAtMzk3LDcgKzQwNCw3IEBACiAjZGVmaW5lCVFIX0hVQlBPUlQJMHgzZjgwMDAwMAogI2RlZmluZQlRSF9NVUxUCQkweGMwMDAwMDAwCiAJX19sZTMyCQkJaHdfY3VycmVudDsJIC8qIHF0ZCBsaXN0IC0gc2VlIEVIQ0kgMy42LjQgKi8KLQkKKwogCS8qIHF0ZCBvdmVybGF5IChoYXJkd2FyZSBwYXJ0cyBvZiBhIHN0cnVjdCBlaGNpX3F0ZCkgKi8KIAlfX2xlMzIJCQlod19xdGRfbmV4dDsKIAlfX2xlMzIJCQlod19hbHRfbmV4dDsKQEAgLTQ3Miw3ICs0NzksNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJdGRfbGlzdDsJLyogcXVldWVkIGl0ZHMvc2l0ZHMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWZyZWVfbGlzdDsJLyogbGlzdCBvZiB1bnVzZWQgaXRkcy9zaXRkcyAqLwogCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2OwotIAlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwOworCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqZXA7CiAKIAkvKiBvdXRwdXQgb2YgKHJlKXNjaGVkdWxpbmcgKi8KIAl1bnNpZ25lZCBsb25nCQlzdGFydDsJCS8qIGppZmZpZXMgKi8KQEAgLTQ5Miw4ICs0OTksOCBAQAogCXVuc2lnbmVkCQliYW5kd2lkdGg7CiAKIAkvKiBUaGlzIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBpVEQncyBod19idWZwIGZpZWxkcyAqLwotCV9fbGUzMgkJCWJ1ZjA7CQkKLQlfX2xlMzIJCQlidWYxOwkJCisJX19sZTMyCQkJYnVmMDsKKwlfX2xlMzIJCQlidWYxOwogCV9fbGUzMgkJCWJ1ZjI7CiAKIAkvKiB0aGlzIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBzSVREJ3MgdHQgaW5mbyAqLwpAQCAtNTIxLDcgKzUyOCw3IEBACiAKICNkZWZpbmUgSVREX0FDVElWRQlfX2NvbnN0YW50X2NwdV90b19sZTMyKEVIQ0lfSVNPQ19BQ1RJVkUpCiAKLQlfX2xlMzIJCQlod19idWZwIFs3XTsJLyogc2VlIEVIQ0kgMy4zLjMgKi8gCisJX19sZTMyCQkJaHdfYnVmcCBbN107CS8qIHNlZSBFSENJIDMuMy4zICovCiAJX19sZTMyCQkJaHdfYnVmcF9oaSBbN107CS8qIEFwcGVuZGl4IEIgKi8KIAogCS8qIHRoZSByZXN0IGlzIEhDRC1wcml2YXRlICovCkBAIC01NDIsNyArNTQ5LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qCi0gKiBFSENJIFNwZWNpZmljYXRpb24gMC45NSBTZWN0aW9uIDMuNCAKKyAqIEVIQ0kgU3BlY2lmaWNhdGlvbiAwLjk1IFNlY3Rpb24gMy40CiAgKiBzaVRELCBha2Egc3BsaXQtdHJhbnNhY3Rpb24gaXNvY2hyb25vdXMgVHJhbnNmZXIgRGVzY3JpcHRvcgogICogICAgICAgLi4uIGRlc2NyaWJlIGZ1bGwgc3BlZWQgaXNvIHhmZXJzIHRocm91Z2ggVFQgaW4gaHVicwogICogc2VlIEZpZ3VyZSAzLTUgIlNwbGl0LXRyYW5zYWN0aW9uIElzb2Nocm9ub3VzIFRyYW5zYWN0aW9uIERlc2NyaXB0b3IgKHNpVEQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2lzcDExNngtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDExNngtaGNkLmMKaW5kZXggNTE0N2VkNC4uYTcyZTA0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC1oY2QuYwpAQCAtMTIwNCwxMCArMTIwNCwxMCBAQAogCiBzdGF0aWMgaW50IGlzcDExNnhfb3Blbl9zZXEoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGlzcDExNnhfc2hvd19kYmcsIGlub2RlLT51LmdlbmVyaWNfaXApOworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpc3AxMTZ4X3Nob3dfZGJnLCBpbm9kZS0+aV9wcml2YXRlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXNwMTE2eF9kZWJ1Z19mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXNwMTE2eF9kZWJ1Z19mb3BzID0gewogCS5vcGVuID0gaXNwMTE2eF9vcGVuX3NlcSwKIAkucmVhZCA9IHNlcV9yZWFkLAogCS5sbHNlZWsgPSBzZXFfbHNlZWssCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2lzcDExNnguaCBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC5oCmluZGV4IGExYjdjMzguLmI5MWUyZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC5oCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC5oCkBAIC0yMzMsNyArMjMzLDcgQEAKIAkvKiBCaXQgU3R1ZmYgICovIC1FUFJPVE8sCiAJLyogRGF0YSBUb2dnICAqLyAtRUlMU0VRLAogCS8qIFN0YWxsICAgICAgKi8gLUVQSVBFLAotCS8qIERldk5vdFJlc3AgKi8gLUVUSU1FRE9VVCwKKwkvKiBEZXZOb3RSZXNwICovIC1FVElNRSwKIAkvKiBQSURDaGVjayAgICovIC1FUFJPVE8sCiAJLyogVW5FeHBQSUQgICAqLyAtRVBST1RPLAogCS8qIERhdGFPdmVyICAgKi8gLUVPVkVSRkxPVywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXQ5MS5jCmluZGV4IDg1Y2MwNTkuLmI0NjY1ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYwpAQCAtMTkzLDcgKzE5Myw3IEBACiAJaWYgKChyZXQgPSBvaGNpX2luaXQob2hjaSkpIDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJvb3QtPm1heGNoaWxkID0gYm9hcmQtPnBvcnRzOworCW9oY2ktPm51bV9wb3J0cyA9IGJvYXJkLT5wb3J0czsKIAogCWlmICgocmV0ID0gb2hjaV9ydW4ob2hjaSkpIDwgMCkgewogCQllcnIoImNhbid0IHN0YXJ0ICVzIiwgaGNkLT5zZWxmLmJ1c19uYW1lKTsKQEAgLTIyMSw2ICsyMjEsNyBAQAogCSAqLwogCS5zdGFydCA9CQlvaGNpX2F0OTFfc3RhcnQsCiAJLnN0b3AgPQkJCW9oY2lfc3RvcCwKKwkuc2h1dGRvd24gPSAJCW9oY2lfc2h1dGRvd24sCiAKIAkvKgogCSAqIG1hbmFnaW5nIGkvbyByZXF1ZXN0cyBhbmQgYXNzb2NpYXRlZCBkZXZpY2UgcmVzb3VyY2VzCkBAIC0yMzksNyArMjQwLDcgQEAKIAkgKi8KIAkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9odWJfc3RhdHVzX2RhdGEsCiAJLmh1Yl9jb250cm9sID0JCW9oY2lfaHViX2NvbnRyb2wsCi0KKwkuaHViX2lycV9lbmFibGUgPQlvaGNpX3Joc2NfZW5hYmxlLAogI2lmZGVmIENPTkZJR19QTQogCS5idXNfc3VzcGVuZCA9CQlvaGNpX2J1c19zdXNwZW5kLAogCS5idXNfcmVzdW1lID0JCW9oY2lfYnVzX3Jlc3VtZSwKQEAgLTI5Niw2ICsyOTcsNyBAQAogCWlmICghY2xvY2tlZCkgewogCQljbGtfZW5hYmxlKGljbGspOwogCQljbGtfZW5hYmxlKGZjbGspOworCQljbG9ja2VkID0gMTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTMxMCw2ICszMTIsNyBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb2hjaV9oY2RfYXQ5MV9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IG9oY2lfaGNkX2F0OTFfZHJ2X3Byb2JlLAogCS5yZW1vdmUJCT0gb2hjaV9oY2RfYXQ5MV9kcnZfcmVtb3ZlLAorCS5zaHV0ZG93bgk9IHVzYl9oY2RfcGxhdGZvcm1fc2h1dGRvd24sCiAJLnN1c3BlbmQJPSBvaGNpX2hjZF9hdDkxX2Rydl9zdXNwZW5kLAogCS5yZXN1bWUJCT0gb2hjaV9oY2RfYXQ5MV9kcnZfcmVzdW1lLAogCS5kcml2ZXIJCT0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF1MXh4eC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF1MXh4eC5jCmluZGV4IGY3YTk3NWQuLjI0ZTIzYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdTF4eHguYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXUxeHh4LmMKQEAgLTI2OCwxMSArMjY4LDggQEAKIAkgKiBiYXNpYyBsaWZlY3ljbGUgb3BlcmF0aW9ucwogCSAqLwogCS5zdGFydCA9CQlvaGNpX2F1MXh4eF9zdGFydCwKLSNpZmRlZglDT05GSUdfUE0KLQkvKiBzdXNwZW5kOgkJb2hjaV9hdTF4eHhfc3VzcGVuZCwgIC0tIHRiZCAqLwotCS8qIHJlc3VtZToJCW9oY2lfYXUxeHh4X3Jlc3VtZSwgICAtLSB0YmQgKi8KLSNlbmRpZiAvKkNPTkZJR19QTSovCiAJLnN0b3AgPQkJCW9oY2lfc3RvcCwKKwkuc2h1dGRvd24gPSAJCW9oY2lfc2h1dGRvd24sCiAKIAkvKgogCSAqIG1hbmFnaW5nIGkvbyByZXF1ZXN0cyBhbmQgYXNzb2NpYXRlZCBkZXZpY2UgcmVzb3VyY2VzCkBAIC0yOTEsNiArMjg4LDcgQEAKIAkgKi8KIAkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9odWJfc3RhdHVzX2RhdGEsCiAJLmh1Yl9jb250cm9sID0JCW9oY2lfaHViX2NvbnRyb2wsCisJLmh1Yl9pcnFfZW5hYmxlID0Jb2hjaV9yaHNjX2VuYWJsZSwKICNpZmRlZglDT05GSUdfUE0KIAkuYnVzX3N1c3BlbmQgPQkJb2hjaV9idXNfc3VzcGVuZCwKIAkuYnVzX3Jlc3VtZSA9CQlvaGNpX2J1c19yZXN1bWUsCkBAIC0zMzgsNiArMzM2LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9oY2lfaGNkX2F1MXh4eF9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IG9oY2lfaGNkX2F1MXh4eF9kcnZfcHJvYmUsCiAJLnJlbW92ZQkJPSBvaGNpX2hjZF9hdTF4eHhfZHJ2X3JlbW92ZSwKKwkuc2h1dGRvd24gCT0gdXNiX2hjZF9wbGF0Zm9ybV9zaHV0ZG93biwKIAkvKi5zdXNwZW5kCT0gb2hjaV9oY2RfYXUxeHh4X2Rydl9zdXNwZW5kLCAqLwogCS8qLnJlc3VtZQk9IG9oY2lfaGNkX2F1MXh4eF9kcnZfcmVzdW1lLCAqLwogCS5kcml2ZXIJCT0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWRiZy5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWRiZy5jCmluZGV4IDdiZmZmY2IuLjgyOTNjMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1kYmcuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktZGJnLmMKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCiAJYnVzID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKLQloY2QgPSBidXMtPmhjcHJpdjsKKwloY2QgPSBidXNfdG9faGNkKGJ1cyk7CiAJb2hjaSA9IGhjZF90b19vaGNpKGhjZCk7CiAKIAkvKiBkaXNwbGF5IGNvbnRyb2wgYW5kIGJ1bGsgbGlzdHMgdG9nZXRoZXIsIGZvciBzaW1wbGljaXR5ICovCkBAIC01MTAsNyArNTEwLDcgQEAKIAlzZWVuX2NvdW50ID0gMDsKIAogCWJ1cyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2Rldik7Ci0JaGNkID0gYnVzLT5oY3ByaXY7CisJaGNkID0gYnVzX3RvX2hjZChidXMpOwogCW9oY2kgPSBoY2RfdG9fb2hjaShoY2QpOwogCW5leHQgPSBidWY7CiAJc2l6ZSA9IFBBR0VfU0laRTsKQEAgLTYwNyw3ICs2MDcsNyBAQAogCXUzMgkJCXJkYXRhOwogCiAJYnVzID0gY2xhc3NfZ2V0X2RldmRhdGEoY2xhc3NfZGV2KTsKLQloY2QgPSBidXMtPmhjcHJpdjsKKwloY2QgPSBidXNfdG9faGNkKGJ1cyk7CiAJb2hjaSA9IGhjZF90b19vaGNpKGhjZCk7CiAJcmVncyA9IG9oY2ktPnJlZ3M7CiAJbmV4dCA9IGJ1ZjsKQEAgLTY2Nyw2ICs2NjcsMTEgQEAKIAlzaXplIC09IHRlbXA7CiAJbmV4dCArPSB0ZW1wOwogCisJdGVtcCA9IHNjbnByaW50ZiAobmV4dCwgc2l6ZSwgImh1YiBwb2xsIHRpbWVyICVzXG4iLAorCQkJb2hjaV90b19oY2Qob2hjaSktPnBvbGxfcmggPyAiT04iIDogIm9mZiIpOworCXNpemUgLT0gdGVtcDsKKwluZXh0ICs9IHRlbXA7CisKIAkvKiByb290aHViICovCiAJb2hjaV9kdW1wX3Jvb3RodWIgKG9oY2ksIDEsICZuZXh0LCAmc2l6ZSk7CiAKQEAgLTY4MCwxMCArNjg1LDExIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgY3JlYXRlX2RlYnVnX2ZpbGVzIChzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2kpCiB7CiAJc3RydWN0IGNsYXNzX2RldmljZSAqY2xkZXYgPSBvaGNpX3RvX2hjZChvaGNpKS0+c2VsZi5jbGFzc19kZXY7CisJaW50IHJldHZhbDsKIAotCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjbGRldiwgJmNsYXNzX2RldmljZV9hdHRyX2FzeW5jKTsKLQljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoY2xkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9wZXJpb2RpYyk7Ci0JY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcmVnaXN0ZXJzKTsKKwlyZXR2YWwgPSBjbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoY2xkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9hc3luYyk7CisJcmV0dmFsID0gY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKGNsZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcGVyaW9kaWMpOworCXJldHZhbCA9IGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjbGRldiwgJmNsYXNzX2RldmljZV9hdHRyX3JlZ2lzdGVycyk7CiAJb2hjaV9kYmcgKG9oY2ksICJjcmVhdGVkIGRlYnVnIGZpbGVzXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWVwOTN4eC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWVwOTN4eC5jCmluZGV4IDY1MzFjNGQuLjFiZjVlN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1lcDkzeHguYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktZXA5M3h4LmMKQEAgLTEyOCwxMiArMTI4LDE0IEBACiAJLmZsYWdzCQkJPSBIQ0RfVVNCMTEgfCBIQ0RfTUVNT1JZLAogCS5zdGFydAkJCT0gb2hjaV9lcDkzeHhfc3RhcnQsCiAJLnN0b3AJCQk9IG9oY2lfc3RvcCwKKwkuc2h1dGRvd24JCT0gb2hjaV9zaHV0ZG93biwKIAkudXJiX2VucXVldWUJCT0gb2hjaV91cmJfZW5xdWV1ZSwKIAkudXJiX2RlcXVldWUJCT0gb2hjaV91cmJfZGVxdWV1ZSwKIAkuZW5kcG9pbnRfZGlzYWJsZQk9IG9oY2lfZW5kcG9pbnRfZGlzYWJsZSwKIAkuZ2V0X2ZyYW1lX251bWJlcgk9IG9oY2lfZ2V0X2ZyYW1lLAogCS5odWJfc3RhdHVzX2RhdGEJPSBvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wJCT0gb2hjaV9odWJfY29udHJvbCwKKwkuaHViX2lycV9lbmFibGUJCT0gb2hjaV9yaHNjX2VuYWJsZSwKICNpZmRlZiBDT05GSUdfUE0KIAkuYnVzX3N1c3BlbmQJCT0gb2hjaV9idXNfc3VzcGVuZCwKIAkuYnVzX3Jlc3VtZQkJPSBvaGNpX2J1c19yZXN1bWUsCkBAIC0yMDIsNiArMjA0LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9oY2lfaGNkX2VwOTN4eF9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IG9oY2lfaGNkX2VwOTN4eF9kcnZfcHJvYmUsCiAJLnJlbW92ZQkJPSBvaGNpX2hjZF9lcDkzeHhfZHJ2X3JlbW92ZSwKKwkuc2h1dGRvd24gCT0gdXNiX2hjZF9wbGF0Zm9ybV9zaHV0ZG93biwKICNpZmRlZiBDT05GSUdfUE0KIAkuc3VzcGVuZAk9IG9oY2lfaGNkX2VwOTN4eF9kcnZfc3VzcGVuZCwKIAkucmVzdW1lCQk9IG9oY2lfaGNkX2VwOTN4eF9kcnZfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWhjZC5jCmluZGV4IDk0ZDhjZjQuLjEwMjdhYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaGNkLmMKQEAgLTg4LDcgKzg4LDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxsaW51eC91c2Jfb3RnLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL290Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+IAogI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KQEAgLTEwMSw3ICsxMDEsNyBAQAogCiAjaW5jbHVkZSAiLi4vY29yZS9oY2QuaCIKIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMjAwNSBBcHJpbCAyMiIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjIwMDYgQXVndXN0IDA0IgogI2RlZmluZSBEUklWRVJfQVVUSE9SICJSb21hbiBXZWlzc2dhZXJiZXIsIERhdmlkIEJyb3duZWxsIgogI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIDEuMSAnT3BlbicgSG9zdCBDb250cm9sbGVyIChPSENJKSBEcml2ZXIiCiAKQEAgLTExMCw5ICsxMTAsMTAgQEAKICN1bmRlZiBPSENJX1ZFUkJPU0VfREVCVUcJLyogbm90IGFsd2F5cyBoZWxwZnVsICovCiAKIC8qIEZvciBpbml0aWFsaXppbmcgY29udHJvbGxlciAobWFzayBpbiBhbiBIQ0ZTIG1vZGUgdG9vKSAqLwotI2RlZmluZQlPSENJX0NPTlRST0xfSU5JVCAJT0hDSV9DVFJMX0NCU1IKKyNkZWZpbmUJT0hDSV9DT05UUk9MX0lOSVQJT0hDSV9DVFJMX0NCU1IKICNkZWZpbmUJT0hDSV9JTlRSX0lOSVQgXAotCShPSENJX0lOVFJfTUlFIHwgT0hDSV9JTlRSX1VFIHwgT0hDSV9JTlRSX1JEIHwgT0hDSV9JTlRSX1dESCkKKwkJKE9IQ0lfSU5UUl9NSUUgfCBPSENJX0lOVFJfUkhTQyB8IE9IQ0lfSU5UUl9VRSBcCisJCXwgT0hDSV9JTlRSX1JEIHwgT0hDSV9JTlRSX1dESCkKIAogI2lmZGVmIF9faHBwYV9fCiAvKiBPbiBQQS1SSVNDLCBQREMgY2FuIGxlYXZlIElSIHNldCBpbmNvcnJlY3RseTsgaWdub3JlIGl0IHRoZXJlLiAqLwpAQCAtMTI4LDEyICsxMjksMTMgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIJaGNkX25hbWUgW10gPSAib2hjaV9oY2QiOwogCisjZGVmaW5lCVNUQVRFQ0hBTkdFX0RFTEFZCW1zZWNzX3RvX2ppZmZpZXMoMzAwKQorCiAjaW5jbHVkZSAib2hjaS5oIgogCiBzdGF0aWMgdm9pZCBvaGNpX2R1bXAgKHN0cnVjdCBvaGNpX2hjZCAqb2hjaSwgaW50IHZlcmJvc2UpOwogc3RhdGljIGludCBvaGNpX2luaXQgKHN0cnVjdCBvaGNpX2hjZCAqb2hjaSk7CiBzdGF0aWMgdm9pZCBvaGNpX3N0b3AgKHN0cnVjdCB1c2JfaGNkICpoY2QpOwotc3RhdGljIGludCBvaGNpX3JlYm9vdCAoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcgLCB2b2lkICopOwogCiAjaW5jbHVkZSAib2hjaS1odWIuYyIKICNpbmNsdWRlICJvaGNpLWRiZy5jIgpAQCAtNDE2LDIxICs0MTgsMjAgQEAKIAlvaGNpX3dyaXRlbCAob2hjaSwgb2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOwogfQogCi0vKiByZWJvb3Qgbm90aWZpZXIgZm9yY2libHkgZGlzYWJsZXMgSVJRcyBhbmQgRE1BLCBoZWxwaW5nIGtleGVjIGFuZAorLyogb2hjaV9zaHV0ZG93biBmb3JjaWJseSBkaXNhYmxlcyBJUlFzIGFuZCBETUEsIGhlbHBpbmcga2V4ZWMgYW5kCiAgKiBvdGhlciBjYXNlcyB3aGVyZSB0aGUgbmV4dCBzb2Z0d2FyZSBtYXkgZXhwZWN0IGNsZWFuIHN0YXRlIGZyb20gdGhlCiAgKiAiZmlybXdhcmUiLiAgdGhpcyBpcyBidXMtbmV1dHJhbCwgdW5saWtlIHNodXRkb3duKCkgbWV0aG9kcy4KICAqLwotc3RhdGljIGludAotb2hjaV9yZWJvb3QgKHN0cnVjdCBub3RpZmllcl9ibG9jayAqYmxvY2ssIHVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqbnVsbCkKK3N0YXRpYyB2b2lkCitvaGNpX3NodXRkb3duIChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCBvaGNpX2hjZCAqb2hjaTsKIAotCW9oY2kgPSBjb250YWluZXJfb2YgKGJsb2NrLCBzdHJ1Y3Qgb2hjaV9oY2QsIHJlYm9vdF9ub3RpZmllcik7CisJb2hjaSA9IGhjZF90b19vaGNpIChoY2QpOwogCW9oY2lfd3JpdGVsIChvaGNpLCBPSENJX0lOVFJfTUlFLCAmb2hjaS0+cmVncy0+aW50cmRpc2FibGUpOwogCW9oY2lfdXNiX3Jlc2V0IChvaGNpKTsKIAkvKiBmbHVzaCB0aGUgd3JpdGVzICovCiAJKHZvaWQpIG9oY2lfcmVhZGwgKG9oY2ksICZvaGNpLT5yZWdzLT5jb250cm9sKTsKLQlyZXR1cm4gMDsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgpAQCAtNDQ2LDcgKzQ0Nyw2IEBACiAKIAlkaXNhYmxlIChvaGNpKTsKIAlvaGNpLT5yZWdzID0gaGNkLT5yZWdzOwotCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzOwogCiAJLyogUkVWSVNJVCB0aGlzIEJJT1MgaGFuZHNoYWtlIGlzIG5vdyBtb3ZlZCBpbnRvIFBDSSAicXVpcmtzIiwgYW5kCiAJICogd2FzIG5ldmVyIG5lZWRlZCBmb3IgbW9zdCBub24tUENJIHN5c3RlbXMgLi4uIHJlbW92ZSB0aGUgY29kZT8KQEAgLTUwMiw3ICs1MDIsNiBAQAogCWlmICgocmV0ID0gb2hjaV9tZW1faW5pdCAob2hjaSkpIDwgMCkKIAkJb2hjaV9zdG9wIChoY2QpOwogCWVsc2UgewotCQlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIgKCZvaGNpLT5yZWJvb3Rfbm90aWZpZXIpOwogCQljcmVhdGVfZGVidWdfZmlsZXMgKG9oY2kpOwogCX0KIApAQCAtNjM3LDEwICs2MzYsMTQgQEAKIAkJcmV0dXJuIC1FT1ZFUkZMT1c7CiAJfQogCi0gCS8qIHN0YXJ0IGNvbnRyb2xsZXIgb3BlcmF0aW9ucyAqLworCS8qIHVzZSByaHNjIGlycXMgYWZ0ZXIga2h1YmQgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgKi8KKwloY2QtPnBvbGxfcmggPSAxOworCWhjZC0+dXNlc19uZXdfcG9sbGluZyA9IDE7CisKKwkvKiBzdGFydCBjb250cm9sbGVyIG9wZXJhdGlvbnMgKi8KIAlvaGNpLT5oY19jb250cm9sICY9IE9IQ0lfQ1RSTF9SV0M7Ci0gCW9oY2ktPmhjX2NvbnRyb2wgfD0gT0hDSV9DT05UUk9MX0lOSVQgfCBPSENJX1VTQl9PUEVSOwotIAlvaGNpX3dyaXRlbCAob2hjaSwgb2hjaS0+aGNfY29udHJvbCwgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCW9oY2ktPmhjX2NvbnRyb2wgfD0gT0hDSV9DT05UUk9MX0lOSVQgfCBPSENJX1VTQl9PUEVSOworCW9oY2lfd3JpdGVsIChvaGNpLCBvaGNpLT5oY19jb250cm9sLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7CiAJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CiAKIAkvKiB3YWtlIG9uIENvbm5lY3RTdGF0dXNDaGFuZ2UsIG1hdGNoaW5nIGV4dGVybmFsIGh1YnMgKi8KQEAgLTY0OCw3ICs2NTEsNyBAQAogCiAJLyogQ2hvb3NlIHRoZSBpbnRlcnJ1cHRzIHdlIGNhcmUgYWJvdXQgbm93LCBvdGhlcnMgbGF0ZXIgb24gZGVtYW5kICovCiAJbWFzayA9IE9IQ0lfSU5UUl9JTklUOwotCW9oY2lfd3JpdGVsIChvaGNpLCBtYXNrLCAmb2hjaS0+cmVncy0+aW50cnN0YXR1cyk7CisJb2hjaV93cml0ZWwgKG9oY2ksIH4wLCAmb2hjaS0+cmVncy0+aW50cnN0YXR1cyk7CiAJb2hjaV93cml0ZWwgKG9oY2ksIG1hc2ssICZvaGNpLT5yZWdzLT5pbnRyZW5hYmxlKTsKIAogCS8qIGhhbmRsZSByb290IGh1YiBpbml0IHF1aXJrcyAuLi4gKi8KQEAgLTY3Miw2ICs2NzUsNyBAQAogCS8vIGZsdXNoIHRob3NlIHdyaXRlcwogCSh2b2lkKSBvaGNpX3JlYWRsIChvaGNpLCAmb2hjaS0+cmVncy0+Y29udHJvbCk7CiAKKwlvaGNpLT5uZXh0X3N0YXRlY2hhbmdlID0gamlmZmllcyArIFNUQVRFQ0hBTkdFX0RFTEFZOwogCXNwaW5fdW5sb2NrX2lycSAoJm9oY2ktPmxvY2spOwogCiAJLy8gUE9UUEdUIGRlbGF5IGlzIGJpdHMgMjQtMzEsIGluIDIgbXMgdW5pdHMuCkBAIC03MDksNyArNzEzLDIzIEBACiAJLyogaW50ZXJydXB0IGZvciBzb21lIG90aGVyIGRldmljZT8gKi8KIAl9IGVsc2UgaWYgKChpbnRzICY9IG9oY2lfcmVhZGwgKG9oY2ksICZyZWdzLT5pbnRyZW5hYmxlKSkgPT0gMCkgewogCQlyZXR1cm4gSVJRX05PVE1JTkU7Ci0JfSAKKwl9CisKKwkvKiBOT1RFOiAgdmVuZG9ycyBkaWRuJ3QgYWx3YXlzIG1ha2UgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24KKwkgKiBjaG9pY2VzIGZvciBSSFNDLiAgU29tZXRpbWVzIGl0IHRyaWdnZXJzIG9uIGFuIGVkZ2UgKGxpa2UKKwkgKiBzZXR0aW5nIGFuZCBtYXliZSBjbGVhcmluZyBhIHBvcnQgc3RhdHVzIGNoYW5nZSBiaXQpOyBhbmQKKwkgKiBpdCdzIGxldmVsLXRyaWdnZXJlZCBvbiBvdGhlciBzaWxpY29uLCBhY3RpdmUgdW50aWwga2h1YmQKKwkgKiBjbGVhcnMgYWxsIGFjdGl2ZSBwb3J0IHN0YXR1cyBjaGFuZ2UgYml0cy4gIFBvbGwgYnkgdGltZXIKKwkgKiB0aWwgaXQncyBmdWxseSBkZWJvdW5jZWQgYW5kIHRoZSBkaWZmZXJlbmNlIHdvbid0IG1hdHRlci4KKwkgKi8KKwlpZiAoaW50cyAmIE9IQ0lfSU5UUl9SSFNDKSB7CisJCW9oY2lfdmRiZyAob2hjaSwgInJoc2NcbiIpOworCQlvaGNpX3dyaXRlbCAob2hjaSwgT0hDSV9JTlRSX1JIU0MsICZyZWdzLT5pbnRyZGlzYWJsZSk7CisJCWhjZC0+cG9sbF9yaCA9IDE7CisJCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzICsgU1RBVEVDSEFOR0VfREVMQVk7CisJCW9oY2lfd3JpdGVsIChvaGNpLCBPSENJX0lOVFJfUkhTQywgJnJlZ3MtPmludHJzdGF0dXMpOworCQl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKGhjZCk7CisJfQogCiAJaWYgKGludHMgJiBPSENJX0lOVFJfVUUpIHsKIAkJZGlzYWJsZSAob2hjaSk7CkBAIC03NzUsOSArNzk1LDEwIEBACiAKIAlvaGNpX3VzYl9yZXNldCAob2hjaSk7CiAJb2hjaV93cml0ZWwgKG9oY2ksIE9IQ0lfSU5UUl9NSUUsICZvaGNpLT5yZWdzLT5pbnRyZGlzYWJsZSk7Ci0JCisJZnJlZV9pcnEoaGNkLT5pcnEsIGhjZCk7CisJaGNkLT5pcnEgPSAtMTsKKwogCXJlbW92ZV9kZWJ1Z19maWxlcyAob2hjaSk7Ci0JdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIgKCZvaGNpLT5yZWJvb3Rfbm90aWZpZXIpOwogCW9oY2lfbWVtX2NsZWFudXAgKG9oY2kpOwogCWlmIChvaGNpLT5oY2NhKSB7CiAJCWRtYV9mcmVlX2NvaGVyZW50IChoY2QtPnNlbGYuY29udHJvbGxlciwgCkBAIC05MTcsNiArOTM4LDEwIEBACiAjaW5jbHVkZSAib2hjaS1hdDkxLmMiCiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19BUkNIX1BOWDQwMDgKKyNpbmNsdWRlICJvaGNpLXBueDQwMDguYyIKKyNlbmRpZgorCiAjaWYgIShkZWZpbmVkKENPTkZJR19QQ0kpIFwKICAgICAgIHx8IGRlZmluZWQoQ09ORklHX1NBMTExMSkgXAogICAgICAgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9TM0MyNDEwKSBcCkBAIC05MjgsNiArOTUzLDcgQEAKICAgICAgIHx8IGRlZmluZWQgKENPTkZJR19VU0JfT0hDSV9IQ0RfUFBDX1NPQykgXAogICAgICAgfHwgZGVmaW5lZCAoQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMCkgXAogICAgICAgfHwgZGVmaW5lZCAoQ09ORklHX0FSQ0hfQVQ5MVNBTTkyNjEpIFwKKyAgICAgIHx8IGRlZmluZWQgKENPTkZJR19BUkNIX1BOWDQwMDgpIFwKIAkpCiAjZXJyb3IgIm1pc3NpbmcgYnVzIGdsdWUgZm9yIG9oY2ktaGNkIgogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaHViLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaHViLmMKaW5kZXggNWIwYTIzZi4uMGI4OTkzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWh1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1odWIuYwpAQCAtMzYsNiArMzYsMTQgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorLyogaGNkLT5odWJfaXJxX2VuYWJsZSgpICovCitzdGF0aWMgdm9pZCBvaGNpX3Joc2NfZW5hYmxlIChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBvaGNpX2hjZAkJKm9oY2kgPSBoY2RfdG9fb2hjaSAoaGNkKTsKKworCW9oY2lfd3JpdGVsIChvaGNpLCBPSENJX0lOVFJfUkhTQywgJm9oY2ktPnJlZ3MtPmludHJlbmFibGUpOworfQorCiAjaWZkZWYJQ09ORklHX1BNCiAKICNkZWZpbmUgT0hDSV9TQ0hFRF9FTkFCTEVTIFwKQEAgLTEyMywxMCArMTMxLDEwIEBACiAJLyogbm8gcmVzdW1lcyB1bnRpbCBkZXZpY2VzIGZpbmlzaCBzdXNwZW5kaW5nICovCiAJb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzICg1KTsKIAorCS8qIG5vIHRpbWVyIHBvbGxpbmcgKi8KKwloY2QtPnBvbGxfcmggPSAwOworCiBkb25lOgotCS8qIGV4dGVybmFsIHN1c3BlbmQgdnMgc2VsZiBhdXRvc3VzcGVuZCAuLi4gc2FtZSBlZmZlY3QgKi8KLQlpZiAoc3RhdHVzID09IDApCi0JCXVzYl9oY2Rfc3VzcGVuZF9yb290X2h1YihoY2QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZvaGNpLT5sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTI1Niw4ICsyNjQsOCBAQAogCS8qIFRSU01SQ1kgKi8KIAltc2xlZXAgKDEwKTsKIAotCS8qIGtlZXAgaXQgYWxpdmUgZm9yIH41eCBzdXNwZW5kICsgcmVzdW1lIGNvc3RzICovCi0Jb2hjaS0+bmV4dF9zdGF0ZWNoYW5nZSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzICgyNTApOworCS8qIGtlZXAgaXQgYWxpdmUgZm9yIG1vcmUgdGhhbiB+NXggc3VzcGVuZCArIHJlc3VtZSBjb3N0cyAqLworCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzICsgU1RBVEVDSEFOR0VfREVMQVk7CiAKIAkvKiBtYXliZSB0dXJuIHNjaGVkdWxlcyBiYWNrIG9uICovCiAJZW5hYmxlcyA9IDA7CkBAIC0zMDIsOSArMzEwLDEwIEBACiB7CiAJc3RydWN0IG9oY2lfaGNkCSpvaGNpID0gaGNkX3RvX29oY2kgKGhjZCk7CiAJaW50CQlpLCBjaGFuZ2VkID0gMCwgbGVuZ3RoID0gMTsKLQlpbnQJCWNhbl9zdXNwZW5kID0gZGV2aWNlX21heV93YWtldXAoJmhjZC0+c2VsZi5yb290X2h1Yi0+ZGV2KTsKKwlpbnQJCWNhbl9zdXNwZW5kOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CiAKKwljYW5fc3VzcGVuZCA9IGRldmljZV9tYXlfd2FrZXVwKCZoY2QtPnNlbGYucm9vdF9odWItPmRldik7CiAJc3Bpbl9sb2NrX2lycXNhdmUgKCZvaGNpLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBoYW5kbGUgYXV0b3N1c3BlbmRlZCByb290OiAgZmluaXNoIHJlc3VtaW5nIGJlZm9yZQpAQCAtMzM5LDYgKzM0OCwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCBvaGNpLT5udW1fcG9ydHM7IGkrKykgewogCQl1MzIJc3RhdHVzID0gcm9vdGh1Yl9wb3J0c3RhdHVzIChvaGNpLCBpKTsKIAorCQkvKiBjYW4ndCBhdXRvc3VzcGVuZCB3aXRoIGFjdGl2ZSBwb3J0cyAqLworCQlpZiAoKHN0YXR1cyAmIFJIX1BTX1BFUykgJiYgIShzdGF0dXMgJiBSSF9QU19QU1MpKQorCQkJY2FuX3N1c3BlbmQgPSAwOworCiAJCWlmIChzdGF0dXMgJiAoUkhfUFNfQ1NDIHwgUkhfUFNfUEVTQyB8IFJIX1BTX1BTU0MKIAkJCQl8IFJIX1BTX09DSUMgfCBSSF9QU19QUlNDKSkgewogCQkJY2hhbmdlZCA9IDE7CkBAIC0zNDgsMzIgKzM2MSw0MSBAQAogCQkJICAgIGJ1ZiBbMV0gfD0gMSA8PCAoaSAtIDcpOwogCQkJY29udGludWU7CiAJCX0KLQotCQkvKiBjYW4gc3VzcGVuZCBpZiBubyBwb3J0cyBhcmUgZW5hYmxlZDsgb3IgaWYgYWxsIGFsbAotCQkgKiBlbmFibGVkIHBvcnRzIGFyZSBzdXNwZW5kZWQgQU5EIHJlbW90ZSB3YWtldXAgaXMgb24uCi0JCSAqLwotCQlpZiAoIShzdGF0dXMgJiBSSF9QU19DQ1MpKQotCQkJY29udGludWU7Ci0JCWlmICgoc3RhdHVzICYgUkhfUFNfUFNTKSAmJiBjYW5fc3VzcGVuZCkKLQkJCWNvbnRpbnVlOwotCQljYW5fc3VzcGVuZCA9IDA7CiAJfQotZG9uZToKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmb2hjaS0+bG9jaywgZmxhZ3MpOwogCi0jaWZkZWYgQ09ORklHX1BNCi0JLyogc2F2ZSBwb3dlciBieSBzdXNwZW5kaW5nIGlkbGUgcm9vdCBodWJzOwotCSAqIElOVFJfUkQgd2FrZXMgdXMgd2hlbiB0aGVyZSdzIHdvcmsKKwkvKiBhZnRlciByb290IGh1YiBjaGFuZ2VzLCBzdG9wIHBvbGxpbmcgYWZ0ZXIgZGVib3VuY2luZworCSAqIGZvciBhIHdoaWxlIGFuZCBtYXliZSBraWNraW5nIGluIGF1dG9zdXNwZW5kCiAJICovCi0JaWYgKGNhbl9zdXNwZW5kCi0JCQkmJiAhY2hhbmdlZAorCWlmIChjaGFuZ2VkKSB7CisJCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzICsgU1RBVEVDSEFOR0VfREVMQVk7CisJCWNhbl9zdXNwZW5kID0gMDsKKwl9IGVsc2UgaWYgKHRpbWVfYmVmb3JlIChqaWZmaWVzLCBvaGNpLT5uZXh0X3N0YXRlY2hhbmdlKSkgeworCQljYW5fc3VzcGVuZCA9IDA7CisJfSBlbHNlIHsKKyNpZmRlZglDT05GSUdfUE0KKwkJY2FuX3N1c3BlbmQgPSBjYW5fc3VzcGVuZAogCQkJJiYgIW9oY2ktPmVkX3JtX2xpc3QKIAkJCSYmICgoT0hDSV9DVFJMX0hDRlMgfCBPSENJX1NDSEVEX0VOQUJMRVMpCiAJCQkJCSYgb2hjaS0+aGNfY29udHJvbCkKLQkJCQk9PSBPSENJX1VTQl9PUEVSCi0JCQkmJiB0aW1lX2FmdGVyIChqaWZmaWVzLCBvaGNpLT5uZXh0X3N0YXRlY2hhbmdlKQotCQkJJiYgdXNiX3RyeWxvY2tfZGV2aWNlIChoY2QtPnNlbGYucm9vdF9odWIpID09IDAKLQkJCSkgeworCQkJCT09IE9IQ0lfVVNCX09QRVI7CisjZW5kaWYKKwkJaWYgKGhjZC0+dXNlc19uZXdfcG9sbGluZykgeworCQkJaGNkLT5wb2xsX3JoID0gMDsKKwkJCS8qIHVzZSBJTlRSX1JIU0MgaWZmIElOVFJfUkQgd29uJ3QgYXBwbHkgKi8KKwkJCWlmICghY2FuX3N1c3BlbmQpCisJCQkJb2hjaV93cml0ZWwgKG9oY2ksIE9IQ0lfSU5UUl9SSFNDLAorCQkJCQkJJm9oY2ktPnJlZ3MtPmludHJlbmFibGUpOworCQl9CisJfQorCitkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZvaGNpLT5sb2NrLCBmbGFncyk7CisKKyNpZmRlZglDT05GSUdfUE0KKwkvKiBzYXZlIHBvd2VyIGJ5IGF1dG9zdXNwZW5kaW5nIGlkbGUgcm9vdCBodWJzOworCSAqIElOVFJfUkQgd2FrZXMgdXMgd2hlbiB0aGVyZSdzIHdvcmsKKwkgKi8KKwlpZiAoY2FuX3N1c3BlbmQgJiYgdXNiX3RyeWxvY2tfZGV2aWNlIChoY2QtPnNlbGYucm9vdF9odWIpID09IDApIHsKIAkJb2hjaV92ZGJnIChvaGNpLCAiYXV0b3N1c3BlbmRcbiIpOwogCQkodm9pZCkgb2hjaV9idXNfc3VzcGVuZCAoaGNkKTsKIAkJdXNiX3VubG9ja19kZXZpY2UgKGhjZC0+c2VsZi5yb290X2h1Yik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktbGg3YTQwNC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWxoN2E0MDQuYwppbmRleCA1NjAyZGE5Li5lMTIxZDk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktbGg3YTQwNC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1saDdhNDA0LmMKQEAgLTE3MywxMSArMTczLDggQEAKIAkgKiBiYXNpYyBsaWZlY3ljbGUgb3BlcmF0aW9ucwogCSAqLwogCS5zdGFydCA9CQlvaGNpX2xoN2E0MDRfc3RhcnQsCi0jaWZkZWYJQ09ORklHX1BNCi0JLyogc3VzcGVuZDoJCW9oY2lfbGg3YTQwNF9zdXNwZW5kLCAgLS0gdGJkICovCi0JLyogcmVzdW1lOgkJb2hjaV9saDdhNDA0X3Jlc3VtZSwgICAtLSB0YmQgKi8KLSNlbmRpZiAvKkNPTkZJR19QTSovCiAJLnN0b3AgPQkJCW9oY2lfc3RvcCwKKwkuc2h1dGRvd24gPSAJCW9oY2lfc2h1dGRvd24sCiAKIAkvKgogCSAqIG1hbmFnaW5nIGkvbyByZXF1ZXN0cyBhbmQgYXNzb2NpYXRlZCBkZXZpY2UgcmVzb3VyY2VzCkBAIC0xOTYsNiArMTkzLDcgQEAKIAkgKi8KIAkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9odWJfc3RhdHVzX2RhdGEsCiAJLmh1Yl9jb250cm9sID0JCW9oY2lfaHViX2NvbnRyb2wsCisJLmh1Yl9pcnFfZW5hYmxlID0Jb2hjaV9yaHNjX2VuYWJsZSwKICNpZmRlZglDT05GSUdfUE0KIAkuYnVzX3N1c3BlbmQgPQkJb2hjaV9idXNfc3VzcGVuZCwKIAkuYnVzX3Jlc3VtZSA9CQlvaGNpX2J1c19yZXN1bWUsCkBAIC0yNDQsNiArMjQyLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9oY2lfaGNkX2xoN2E0MDRfZHJpdmVyID0gewogCS5wcm9iZQkJPSBvaGNpX2hjZF9saDdhNDA0X2Rydl9wcm9iZSwKIAkucmVtb3ZlCQk9IG9oY2lfaGNkX2xoN2E0MDRfZHJ2X3JlbW92ZSwKKwkuc2h1dGRvd24gCT0gdXNiX2hjZF9wbGF0Zm9ybV9zaHV0ZG93biwKIAkvKi5zdXNwZW5kCT0gb2hjaV9oY2RfbGg3YTQwNF9kcnZfc3VzcGVuZCwgKi8KIAkvKi5yZXN1bWUJPSBvaGNpX2hjZF9saDdhNDA0X2Rydl9yZXN1bWUsICovCiAJLmRyaXZlcgkJPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktbWVtLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktbWVtLmMKaW5kZXggYmZiZTMyOC4uZDk3NjYxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLW1lbS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1tZW0uYwpAQCAtMjgsNyArMjgsNiBAQAogCW9oY2ktPm5leHRfc3RhdGVjaGFuZ2UgPSBqaWZmaWVzOwogCXNwaW5fbG9ja19pbml0ICgmb2hjaS0+bG9jayk7CiAJSU5JVF9MSVNUX0hFQUQgKCZvaGNpLT5wZW5kaW5nKTsKLQlvaGNpLT5yZWJvb3Rfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IG9oY2lfcmVib290OwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1vbWFwLmMKaW5kZXggYzRjNGJhYi4uOWMwMjE3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLW9tYXAuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktb21hcC5jCkBAIC00LDcgKzQsNyBAQAogICogKEMpIENvcHlyaWdodCAxOTk5IFJvbWFuIFdlaXNzZ2FlcmJlciA8d2Vpc3NnQHZpZW5uYS5hdD4KICAqIChDKSBDb3B5cmlnaHQgMjAwMC0yMDA1IERhdmlkIEJyb3duZWxsCiAgKiAoQykgQ29weXJpZ2h0IDIwMDIgSGV3bGV0dC1QYWNrYXJkIENvbXBhbnkKLSAqIAorICoKICAqIE9NQVAgQnVzIEdsdWUKICAqCiAgKiBNb2RpZmllZCBmb3IgT01BUCBieSBUb255IExpbmRncmVuIDx0b255QGF0b21pZGUuY29tPgpAQCAtNjYsMTUgKzY2LDIwIEBACiBleHRlcm4gaW50IG9jcGlfZW5hYmxlKHZvaWQpOwogCiBzdGF0aWMgc3RydWN0IGNsayAqdXNiX2hvc3RfY2s7CitzdGF0aWMgc3RydWN0IGNsayAqdXNiX2RjX2NrOworc3RhdGljIGludCBob3N0X2VuYWJsZWQ7CitzdGF0aWMgaW50IGhvc3RfaW5pdGlhbGl6ZWQ7CiAKIHN0YXRpYyB2b2lkIG9tYXBfb2hjaV9jbG9ja19wb3dlcihpbnQgb24pCiB7CiAJaWYgKG9uKSB7CisJCWNsa19lbmFibGUodXNiX2RjX2NrKTsKIAkJY2xrX2VuYWJsZSh1c2JfaG9zdF9jayk7CiAJCS8qIGd1ZXNzdGltYXRlIGZvciBUNSA9PSAxeCAzMksgY2xvY2sgKyBBUExMIGxvY2sgdGltZSAqLwogCQl1ZGVsYXkoMTAwKTsKIAl9IGVsc2UgewogCQljbGtfZGlzYWJsZSh1c2JfaG9zdF9jayk7CisJCWNsa19kaXNhYmxlKHVzYl9kY19jayk7CiAJfQogfQogCkBAIC04NywxNCArOTIsMTQgQEAKIAlpZiAob24pIHsKIAkJaWYgKG1hY2hpbmVfaXNfb21hcF9pbm5vdmF0b3IoKSAmJiBjcHVfaXNfb21hcDE1MTAoKSkKIAkJCWZwZ2Ffd3JpdGUoZnBnYV9yZWFkKElOTk9WQVRPUl9GUEdBX0NBTV9VU0JfQ09OVFJPTCkKLQkJCQl8ICgoMSA8PCA1Lyp1c2IxKi8pIHwgKDEgPDwgMy8qdXNiMiovKSksIAorCQkJCXwgKCgxIDw8IDUvKnVzYjEqLykgfCAoMSA8PCAzLyp1c2IyKi8pKSwKIAkJCSAgICAgICBJTk5PVkFUT1JfRlBHQV9DQU1fVVNCX0NPTlRST0wpOwogCQllbHNlIGlmIChtYWNoaW5lX2lzX29tYXBfb3NrKCkpCiAJCQl0cHM2NTAxMF9zZXRfZ3Bpb19vdXRfdmFsdWUoR1BJTzEsIExPVyk7CiAJfSBlbHNlIHsKIAkJaWYgKG1hY2hpbmVfaXNfb21hcF9pbm5vdmF0b3IoKSAmJiBjcHVfaXNfb21hcDE1MTAoKSkKIAkJCWZwZ2Ffd3JpdGUoZnBnYV9yZWFkKElOTk9WQVRPUl9GUEdBX0NBTV9VU0JfQ09OVFJPTCkKLQkJCQkmIH4oKDEgPDwgNS8qdXNiMSovKSB8ICgxIDw8IDMvKnVzYjIqLykpLCAKKwkJCQkmIH4oKDEgPDwgNS8qdXNiMSovKSB8ICgxIDw8IDMvKnVzYjIqLykpLAogCQkJICAgICAgIElOTk9WQVRPUl9GUEdBX0NBTV9VU0JfQ09OVFJPTCk7CiAJCWVsc2UgaWYgKG1hY2hpbmVfaXNfb21hcF9vc2soKSkKIAkJCXRwczY1MDEwX3NldF9ncGlvX291dF92YWx1ZShHUElPMSwgSElHSCk7CkBAIC0xMDMsNiArMTA4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19BUkNIX09NQVAxNVhYCiAvKgogICogT01BUC0xNTEwIHNwZWNpZmljIExvY2FsIEJ1cyBjbG9jayBvbi9vZmYKICAqLwpAQCAtMTIxLDggKzEyNyw4IEBACiAvKgogICogT01BUC0xNTEwIHNwZWNpZmljIExvY2FsIEJ1cyBpbml0aWFsaXphdGlvbgogICogTk9URTogVGhpcyBhc3N1bWVzIDMyTUIgbWVtb3J5IHNpemUgaW4gT01BUDE1MTBMQl9NRU1TSVpFLgotICogICAgICAgU2VlIGFsc28gYXJjaC9tYWNoLW9tYXAvbWVtb3J5LmggZm9yIF9fdmlydF90b19kbWEoKSBhbmQgCi0gKiAgICAgICBfX2RtYV90b192aXJ0KCkgd2hpY2ggbmVlZCB0byBtYXRjaCB3aXRoIHRoZSBwaHlzaWNhbCAKKyAqICAgICAgIFNlZSBhbHNvIGFyY2gvbWFjaC1vbWFwL21lbW9yeS5oIGZvciBfX3ZpcnRfdG9fZG1hKCkgYW5kCisgKiAgICAgICBfX2RtYV90b192aXJ0KCkgd2hpY2ggbmVlZCB0byBtYXRjaCB3aXRoIHRoZSBwaHlzaWNhbAogICogICAgICAgTG9jYWwgQnVzIGFkZHJlc3MgYmVsb3cuCiAgKi8KIHN0YXRpYyBpbnQgb21hcF8xNTEwX2xvY2FsX2J1c19pbml0KHZvaWQpCkBAIC0xMzAsNyArMTM2LDcgQEAKIAl1bnNpZ25lZCBpbnQgdGxiOwogCXVuc2lnbmVkIGxvbmcgbGJhZGRyLCBwaHlzYWRkcjsKIAotCW9tYXBfd3JpdGVsKChvbWFwX3JlYWRsKE9NQVAxNTEwX0xCX0NMT0NLX0RJVikgJiAweGZmZmZmZmY4KSB8IDB4NCwgCisJb21hcF93cml0ZWwoKG9tYXBfcmVhZGwoT01BUDE1MTBfTEJfQ0xPQ0tfRElWKSAmIDB4ZmZmZmZmZjgpIHwgMHg0LAogCSAgICAgICBPTUFQMTUxMF9MQl9DTE9DS19ESVYpOwogCiAJLyogQ29uZmlndXJlIHRoZSBMb2NhbCBCdXMgTU1VIHRhYmxlICovCkBAIC0xMzgsNyArMTQ0LDcgQEAKIAkJbGJhZGRyID0gdGxiICogMHgwMDEwMDAwMCArIE9NQVAxNTEwX0xCX09GRlNFVDsKIAkJcGh5c2FkZHIgPSB0bGIgKiAweDAwMTAwMDAwICsgUEhZU19PRkZTRVQ7CiAJCW9tYXBfd3JpdGVsKChsYmFkZHIgJiAweDBmZmZmZmZmKSA+PiAyMiwgT01BUDE1MTBfTEJfTU1VX0NBTV9IKTsKLQkJb21hcF93cml0ZWwoKChsYmFkZHIgJiAweDAwM2ZmYzAwKSA+PiA2KSB8IDB4YywgCisJCW9tYXBfd3JpdGVsKCgobGJhZGRyICYgMHgwMDNmZmMwMCkgPj4gNikgfCAweGMsCiAJCSAgICAgICBPTUFQMTUxMF9MQl9NTVVfQ0FNX0wpOwogCQlvbWFwX3dyaXRlbChwaHlzYWRkciA+PiAxNiwgT01BUDE1MTBfTEJfTU1VX1JBTV9IKTsKIAkJb21hcF93cml0ZWwoKHBoeXNhZGRyICYgMHgwMDAwZmMwMCkgfCAweDMwMCwgT01BUDE1MTBfTEJfTU1VX1JBTV9MKTsKQEAgLTE1Miw2ICsxNTgsMTAgQEAKIAogCXJldHVybiAwOwogfQorI2Vsc2UKKyNkZWZpbmUgb21hcF8xNTEwX2xvY2FsX2J1c19wb3dlcih4KQl7fQorI2RlZmluZSBvbWFwXzE1MTBfbG9jYWxfYnVzX2luaXQoKQl7fQorI2VuZGlmCiAKICNpZmRlZglDT05GSUdfVVNCX09URwogCkBAIC0xNzMsMTMgKzE4MywxNCBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgaW50IG9tYXBfc3RhcnRfaGMoc3RydWN0IG9oY2lfaGNkICpvaGNpLCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBvaGNpX29tYXBfaW5pdChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewotCXN0cnVjdCBvbWFwX3VzYl9jb25maWcJKmNvbmZpZyA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBvaGNpX2hjZAkJKm9oY2kgPSBoY2RfdG9fb2hjaShoY2QpOworCXN0cnVjdCBvbWFwX3VzYl9jb25maWcJKmNvbmZpZyA9IGhjZC0+c2VsZi5jb250cm9sbGVyLT5wbGF0Zm9ybV9kYXRhOwogCWludAkJCW5lZWRfdHJhbnNjZWl2ZXIgPSAoY29uZmlnLT5vdGcgIT0gMCk7CiAJaW50CQkJcmV0OwogCi0JZGV2X2RiZygmcGRldi0+ZGV2LCAic3RhcnRpbmcgVVNCIENvbnRyb2xsZXJcbiIpOworCWRldl9kYmcoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJzdGFydGluZyBVU0IgQ29udHJvbGxlclxuIik7CiAKIAlpZiAoY29uZmlnLT5vdGcpIHsKIAkJb2hjaV90b19oY2Qob2hjaSktPnNlbGYub3RnX3BvcnQgPSBjb25maWctPm90ZzsKQEAgLTIwMCw3ICsyMTEsNyBAQAogCQlpZiAob2hjaS0+dHJhbnNjZWl2ZXIpIHsKIAkJCWludAlzdGF0dXMgPSBvdGdfc2V0X2hvc3Qob2hjaS0+dHJhbnNjZWl2ZXIsCiAJCQkJCQkmb2hjaV90b19oY2Qob2hjaSktPnNlbGYpOwotCQkJZGV2X2RiZygmcGRldi0+ZGV2LCAiaW5pdCAlcyB0cmFuc2NlaXZlciwgc3RhdHVzICVkXG4iLAorCQkJZGV2X2RiZyhoY2QtPnNlbGYuY29udHJvbGxlciwgImluaXQgJXMgdHJhbnNjZWl2ZXIsIHN0YXR1cyAlZFxuIiwKIAkJCQkJb2hjaS0+dHJhbnNjZWl2ZXItPmxhYmVsLCBzdGF0dXMpOwogCQkJaWYgKHN0YXR1cykgewogCQkJCWlmIChvaGNpLT50cmFuc2NlaXZlcikKQEAgLTIwOCw3ICsyMTksNyBAQAogCQkJCXJldHVybiBzdGF0dXM7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW4ndCBmaW5kIHRyYW5zY2VpdmVyXG4iKTsKKwkJCWRldl9lcnIoaGNkLT5zZWxmLmNvbnRyb2xsZXIsICJjYW4ndCBmaW5kIHRyYW5zY2VpdmVyXG4iKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQpAQCAtMjQ3LDYgKzI1OCwxMCBAQAogCQl9CiAJCW9oY2lfd3JpdGVsKG9oY2ksIHJoLCAmb2hjaS0+cmVncy0+cm9vdGh1Yi5hKTsKIAkJZGlzdHJ1c3RfZmlybXdhcmUgPSAwOworCX0gZWxzZSBpZiAobWFjaGluZV9pc19ub2tpYTc3MCgpKSB7CisJCS8qIFdlIHJlcXVpcmUgYSBzZWxmLXBvd2VyZWQgaHViLCB3aGljaCBzaG91bGQgaGF2ZQorCQkgKiBwbGVudHkgb2YgcG93ZXIuICovCisJCW9oY2lfdG9faGNkKG9oY2kpLT5wb3dlcl9idWRnZXQgPSAwOwogCX0KIAogCS8qIEZJWE1FIGtodWJkIGh1YiByZXF1ZXN0cyBzaG91bGQgbWFuYWdlIHBvd2VyIHN3aXRjaGluZyAqLwpAQCAtMjYwLDIxICsyNzUsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgb21hcF9zdG9wX2hjKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgdm9pZCBvaGNpX29tYXBfc3RvcChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewotCWRldl9kYmcoJnBkZXYtPmRldiwgInN0b3BwaW5nIFVTQiBDb250cm9sbGVyXG4iKTsKKwlkZXZfZGJnKGhjZC0+c2VsZi5jb250cm9sbGVyLCAic3RvcHBpbmcgVVNCIENvbnRyb2xsZXJcbiIpOwogCW9tYXBfb2hjaV9jbG9ja19wb3dlcigwKTsKIH0KIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi12b2lkIHVzYl9oY2Rfb21hcF9yZW1vdmUgKHN0cnVjdCB1c2JfaGNkICosIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKik7Ci0KLS8qIGNvbmZpZ3VyZSBzbyBhbiBIQyBkZXZpY2UgYW5kIGlkIGFyZSBhbHdheXMgcHJvdmlkZWQgKi8KLS8qIGFsd2F5cyBjYWxsZWQgd2l0aCBwcm9jZXNzIGNvbnRleHQ7IHNsZWVwaW5nIGlzIE9LICovCi0KLQogLyoqCiAgKiB1c2JfaGNkX29tYXBfcHJvYmUgLSBpbml0aWFsaXplIE9NQVAtYmFzZWQgSENEcwogICogQ29udGV4dDogIWluX2ludGVycnVwdCgpCkBAIC0yODMsNyArMjkyLDcgQEAKICAqIHRoZW4gaW52b2tlcyB0aGUgc3RhcnQoKSBtZXRob2QgZm9yIHRoZSBIQ0QgYXNzb2NpYXRlZCB3aXRoIGl0CiAgKiB0aHJvdWdoIHRoZSBob3RwbHVnIGVudHJ5J3MgZHJpdmVyX2RhdGEuCiAgKi8KLWludCB1c2JfaGNkX29tYXBfcHJvYmUgKGNvbnN0IHN0cnVjdCBoY19kcml2ZXIgKmRyaXZlciwKK3N0YXRpYyBpbnQgdXNiX2hjZF9vbWFwX3Byb2JlIChjb25zdCBzdHJ1Y3QgaGNfZHJpdmVyICpkcml2ZXIsCiAJCQkgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IHJldHZhbCwgaXJxOwpAQCAtMjkxLDEyICszMDAsMTIgQEAKIAlzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2k7CiAKIAlpZiAocGRldi0+bnVtX3Jlc291cmNlcyAhPSAyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGNkIHByb2JlOiBpbnZhbGlkIG51bV9yZXNvdXJjZXM6ICVpXG4iLCAKKwkJcHJpbnRrKEtFUk5fRVJSICJoY2QgcHJvYmU6IGludmFsaWQgbnVtX3Jlc291cmNlczogJWlcbiIsCiAJCSAgICAgICBwZGV2LT5udW1fcmVzb3VyY2VzKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKHBkZXYtPnJlc291cmNlWzBdLmZsYWdzICE9IElPUkVTT1VSQ0VfTUVNIAorCWlmIChwZGV2LT5yZXNvdXJjZVswXS5mbGFncyAhPSBJT1JFU09VUkNFX01FTQogCQkJfHwgcGRldi0+cmVzb3VyY2VbMV0uZmxhZ3MgIT0gSU9SRVNPVVJDRV9JUlEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJoY2QgcHJvYmU6IGludmFsaWQgcmVzb3VyY2UgdHlwZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtMzA2LDYgKzMxNSwxNyBAQAogCWlmIChJU19FUlIodXNiX2hvc3RfY2spKQogCQlyZXR1cm4gUFRSX0VSUih1c2JfaG9zdF9jayk7CiAKKwlpZiAoIWNwdV9pc19vbWFwMTUxMCgpKQorCQl1c2JfZGNfY2sgPSBjbGtfZ2V0KDAsICJ1c2JfZGNfY2siKTsKKwllbHNlCisJCXVzYl9kY19jayA9IGNsa19nZXQoMCwgImxiX2NrIik7CisKKwlpZiAoSVNfRVJSKHVzYl9kY19jaykpIHsKKwkJY2xrX3B1dCh1c2JfaG9zdF9jayk7CisJCXJldHVybiBQVFJfRVJSKHVzYl9kY19jayk7CisJfQorCisKIAloY2QgPSB1c2JfY3JlYXRlX2hjZCAoZHJpdmVyLCAmcGRldi0+ZGV2LCBwZGV2LT5kZXYuYnVzX2lkKTsKIAlpZiAoIWhjZCkgewogCQlyZXR2YWwgPSAtRU5PTUVNOwpAQCAtMzI1LDkgKzM0NSw4IEBACiAJb2hjaSA9IGhjZF90b19vaGNpKGhjZCk7CiAJb2hjaV9oY2RfaW5pdChvaGNpKTsKIAotCXJldHZhbCA9IG9tYXBfc3RhcnRfaGMob2hjaSwgcGRldik7Ci0JaWYgKHJldHZhbCA8IDApCi0JCWdvdG8gZXJyMjsKKwlob3N0X2luaXRpYWxpemVkID0gMDsKKwlob3N0X2VuYWJsZWQgPSAxOwogCiAJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAoaXJxIDwgMCkgewpAQCAtMzM1LDE1ICszNTQsMjEgQEAKIAkJZ290byBlcnIyOwogCX0KIAlyZXR2YWwgPSB1c2JfYWRkX2hjZChoY2QsIGlycSwgSVJRRl9ESVNBQkxFRCk7Ci0JaWYgKHJldHZhbCA9PSAwKQotCQlyZXR1cm4gcmV0dmFsOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyMjsKIAotCW9tYXBfc3RvcF9oYyhwZGV2KTsKKwlob3N0X2luaXRpYWxpemVkID0gMTsKKworCWlmICghaG9zdF9lbmFibGVkKQorCQlvbWFwX29oY2lfY2xvY2tfcG93ZXIoMCk7CisKKwlyZXR1cm4gMDsKIGVycjI6CiAJcmVsZWFzZV9tZW1fcmVnaW9uKGhjZC0+cnNyY19zdGFydCwgaGNkLT5yc3JjX2xlbik7CiBlcnIxOgogCXVzYl9wdXRfaGNkKGhjZCk7CiBlcnIwOgorCWNsa19wdXQodXNiX2RjX2NrKTsKIAljbGtfcHV0KHVzYl9ob3N0X2NrKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMzU5LDMxICszODQsNDEgQEAKICAqIFJldmVyc2VzIHRoZSBlZmZlY3Qgb2YgdXNiX2hjZF9vbWFwX3Byb2JlKCksIGZpcnN0IGludm9raW5nCiAgKiB0aGUgSENEJ3Mgc3RvcCgpIG1ldGhvZC4gIEl0IGlzIGFsd2F5cyBjYWxsZWQgZnJvbSBhIHRocmVhZAogICogY29udGV4dCwgbm9ybWFsbHkgInJtbW9kIiwgImFwbWQiLCBvciBzb21ldGhpbmcgc2ltaWxhci4KLSAqCiAgKi8KLXZvaWQgdXNiX2hjZF9vbWFwX3JlbW92ZSAoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbmxpbmUgdm9pZAordXNiX2hjZF9vbWFwX3JlbW92ZSAoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3Qgb2hjaV9oY2QJCSpvaGNpID0gaGNkX3RvX29oY2kgKGhjZCk7CisKIAl1c2JfcmVtb3ZlX2hjZChoY2QpOworCWlmIChvaGNpLT50cmFuc2NlaXZlcikgeworCQkodm9pZCkgb3RnX3NldF9ob3N0KG9oY2ktPnRyYW5zY2VpdmVyLCAwKTsKKwkJcHV0X2RldmljZShvaGNpLT50cmFuc2NlaXZlci0+ZGV2KTsKKwl9CiAJaWYgKG1hY2hpbmVfaXNfb21hcF9vc2soKSkKIAkJb21hcF9mcmVlX2dwaW8oOSk7Ci0Jb21hcF9zdG9wX2hjKHBkZXYpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4pOwogCXVzYl9wdXRfaGNkKGhjZCk7CisJY2xrX3B1dCh1c2JfZGNfY2spOwogCWNsa19wdXQodXNiX2hvc3RfY2spOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgaW50IF9fZGV2aW5pdAorc3RhdGljIGludAogb2hjaV9vbWFwX3N0YXJ0IChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQogewogCXN0cnVjdCBvbWFwX3VzYl9jb25maWcgKmNvbmZpZzsKIAlzdHJ1Y3Qgb2hjaV9oY2QJKm9oY2kgPSBoY2RfdG9fb2hjaSAoaGNkKTsKIAlpbnQJCXJldDsKIAorCWlmICghaG9zdF9lbmFibGVkKQorCQlyZXR1cm4gMDsKIAljb25maWcgPSBoY2QtPnNlbGYuY29udHJvbGxlci0+cGxhdGZvcm1fZGF0YTsKLQlpZiAoY29uZmlnLT5vdGcgfHwgY29uZmlnLT5yd2MpCisJaWYgKGNvbmZpZy0+b3RnIHx8IGNvbmZpZy0+cndjKSB7CisJCW9oY2ktPmhjX2NvbnRyb2wgPSBPSENJX0NUUkxfUldDOwogCQl3cml0ZWwoT0hDSV9DVFJMX1JXQywgJm9oY2ktPnJlZ3MtPmNvbnRyb2wpOworCX0KIAogCWlmICgocmV0ID0gb2hjaV9ydW4gKG9oY2kpKSA8IDApIHsKIAkJZGV2X2VycihoY2QtPnNlbGYuY29udHJvbGxlciwgImNhbid0IHN0YXJ0XG4iKTsKQEAgLTQwOSw4ICs0NDQsMTAgQEAKIAkvKgogCSAqIGJhc2ljIGxpZmVjeWNsZSBvcGVyYXRpb25zCiAJICovCisJLnJlc2V0ID0JCW9oY2lfb21hcF9pbml0LAogCS5zdGFydCA9CQlvaGNpX29tYXBfc3RhcnQsCi0JLnN0b3AgPQkJCW9oY2lfc3RvcCwKKwkuc3RvcCA9CQkJb2hjaV9vbWFwX3N0b3AsCisJLnNodXRkb3duID0gCQlvaGNpX3NodXRkb3duLAogCiAJLyoKIAkgKiBtYW5hZ2luZyBpL28gcmVxdWVzdHMgYW5kIGFzc29jaWF0ZWQgZGV2aWNlIHJlc291cmNlcwpAQCAtNDI5LDYgKzQ2Niw3IEBACiAJICovCiAJLmh1Yl9zdGF0dXNfZGF0YSA9CW9oY2lfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbCA9CQlvaGNpX2h1Yl9jb250cm9sLAorCS5odWJfaXJxX2VuYWJsZSA9CW9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYJQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLApAQCAtNDQ2LDEzICs0ODQsOCBAQAogc3RhdGljIGludCBvaGNpX2hjZF9vbWFwX2Rydl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCB1c2JfaGNkCQkqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3Qgb2hjaV9oY2QJCSpvaGNpID0gaGNkX3RvX29oY2kgKGhjZCk7CiAKIAl1c2JfaGNkX29tYXBfcmVtb3ZlKGhjZCwgZGV2KTsKLQlpZiAob2hjaS0+dHJhbnNjZWl2ZXIpIHsKLQkJKHZvaWQpIG90Z19zZXRfaG9zdChvaGNpLT50cmFuc2NlaXZlciwgMCk7Ci0JCXB1dF9kZXZpY2Uob2hjaS0+dHJhbnNjZWl2ZXItPmRldik7Ci0JfQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CiAKIAlyZXR1cm4gMDsKQEAgLTQ3Miw3ICs1MDUsNyBAQAogCiAJb21hcF9vaGNpX2Nsb2NrX3Bvd2VyKDApOwogCW9oY2lfdG9faGNkKG9oY2kpLT5zdGF0ZSA9IEhDX1NUQVRFX1NVU1BFTkRFRDsKLQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19TVVNQRU5EOworCWRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19TVVNQRU5EOwogCXJldHVybiAwOwogfQogCkBAIC00ODUsOCArNTE4LDggQEAKIAlvaGNpLT5uZXh0X3N0YXRlY2hhbmdlID0gamlmZmllczsKIAogCW9tYXBfb2hjaV9jbG9ja19wb3dlcigxKTsKLQlkZXYtPnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKLQl1c2JfaGNkX3Jlc3VtZV9yb290X2h1YihkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOworCXVzYl9oY2RfcmVzdW1lX3Jvb3RfaHViKHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldikpOwogCXJldHVybiAwOwogfQogCkBAIC01MDAsNiArNTMzLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG9oY2lfaGNkX29tYXBfZHJpdmVyID0gewogCS5wcm9iZQkJPSBvaGNpX2hjZF9vbWFwX2Rydl9wcm9iZSwKIAkucmVtb3ZlCQk9IG9oY2lfaGNkX29tYXBfZHJ2X3JlbW92ZSwKKwkuc2h1dGRvd24gCT0gdXNiX2hjZF9wbGF0Zm9ybV9zaHV0ZG93biwKICNpZmRlZglDT05GSUdfUE0KIAkuc3VzcGVuZAk9IG9oY2lfb21hcF9zdXNwZW5kLAogCS5yZXN1bWUJCT0gb2hjaV9vbWFwX3Jlc3VtZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wY2kuYwppbmRleCBiMjY4NTM3Li4zNzMyZGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcGNpLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBjaS5jCkBAIC0xMzUsNiArMTM1LDExIEBACiAJfQogCW9oY2lfd3JpdGVsKG9oY2ksIE9IQ0lfSU5UUl9NSUUsICZvaGNpLT5yZWdzLT5pbnRyZGlzYWJsZSk7CiAJKHZvaWQpb2hjaV9yZWFkbChvaGNpLCAmb2hjaS0+cmVncy0+aW50cmRpc2FibGUpOworCisJLyogbWFrZSBzdXJlIHNuYXBzaG90IGJlaW5nIHJlc3VtZWQgcmUtZW51bWVyYXRlcyBldmVyeXRoaW5nICovCisJaWYgKG1lc3NhZ2UuZXZlbnQgPT0gUE1fRVZFTlRfUFJFVEhBVykKKwkJb2hjaV91c2JfcmVzZXQob2hjaSk7CisKIAljbGVhcl9iaXQoSENEX0ZMQUdfSFdfQUNDRVNTSUJMRSwgJmhjZC0+ZmxhZ3MpOwogIGJhaWw6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJm9oY2ktPmxvY2ssIGZsYWdzKTsKQEAgLTE3MSwxMSArMTc2LDE0IEBACiAJICovCiAJLnJlc2V0ID0JCW9oY2lfcGNpX3Jlc2V0LAogCS5zdGFydCA9CQlvaGNpX3BjaV9zdGFydCwKKwkuc3RvcCA9CQkJb2hjaV9zdG9wLAorCS5zaHV0ZG93biA9CQlvaGNpX3NodXRkb3duLAorCiAjaWZkZWYJQ09ORklHX1BNCisJLyogdGhlc2Ugc3VzcGVuZC9yZXN1bWUgZW50cmllcyBhcmUgZm9yIHVwc3RyZWFtIFBDSSBnbHVlIE9OTFkgKi8KIAkuc3VzcGVuZCA9CQlvaGNpX3BjaV9zdXNwZW5kLAogCS5yZXN1bWUgPQkJb2hjaV9wY2lfcmVzdW1lLAogI2VuZGlmCi0JLnN0b3AgPQkJCW9oY2lfc3RvcCwKIAogCS8qCiAJICogbWFuYWdpbmcgaS9vIHJlcXVlc3RzIGFuZCBhc3NvY2lhdGVkIGRldmljZSByZXNvdXJjZXMKQEAgLTE5NCw2ICsyMDIsNyBAQAogCSAqLwogCS5odWJfc3RhdHVzX2RhdGEgPQlvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wgPQkJb2hjaV9odWJfY29udHJvbCwKKwkuaHViX2lycV9lbmFibGUgPQlvaGNpX3Joc2NfZW5hYmxlLAogI2lmZGVmCUNPTkZJR19QTQogCS5idXNfc3VzcGVuZCA9CQlvaGNpX2J1c19zdXNwZW5kLAogCS5idXNfcmVzdW1lID0JCW9oY2lfYnVzX3Jlc3VtZSwKQEAgLTIyNCw2ICsyMzMsOCBAQAogCS5zdXNwZW5kID0JdXNiX2hjZF9wY2lfc3VzcGVuZCwKIAkucmVzdW1lID0JdXNiX2hjZF9wY2lfcmVzdW1lLAogI2VuZGlmCisKKwkuc2h1dGRvd24gPQl1c2JfaGNkX3BjaV9zaHV0ZG93biwKIH07CiAKICAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wbng0MDA4LmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyY2IyMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcG54NDAwOC5jCkBAIC0wLDAgKzEsNDc2IEBACisvKgorICogZHJpdmVycy91c2IvaG9zdC9vaGNpLXBueDQwMDguYworICoKKyAqIGRyaXZlciBmb3IgUGhpbGlwcyBQTlg0MDA4IFVTQiBIb3N0CisgKgorICogQXV0aG9yczogRG1pdHJ5IENoaWdpcmV2IDxzb3VyY2VAbXZpc3RhLmNvbT4KKyAqIAkgICAgVml0YWx5IFdvb2wgPHZpdGFseXdvb2xAZ21haWwuY29tPgorICoKKyAqIHJlZ2lzdGVyIGluaXRpYWxpemF0aW9uIGlzIGJhc2VkIG9uIGNvZGUgZXhhbXBsZXMgcHJvdmlkZWQgYnkgUGhpbGlwcworICogQ29weXJpZ2h0IChjKSAyMDA1IEtvbmlua2xpamtlIFBoaWxpcHMgRWxlY3Ryb25pY3MgTi5WLgorICoKKyAqIE5PVEU6IFRoaXMgZHJpdmVyIGRvZXMgbm90IGhhdmUgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb25hbGl0eQorICogVGhpcyBkcml2ZXIgaXMgaW50ZW5kZWQgZm9yIGVuZ2luZWVyaW5nIGRldmVsb3BtZW50IHB1cnBvc2VzIG9ubHkKKyAqCisgKiAyMDA1LTIwMDYgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2lycXMuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9ncGlvLmg+CisKKyNkZWZpbmUgVVNCX0NUUkwgCUlPX0FERFJFU1MoUE5YNDAwOF9QV1JNQU5fQkFTRSArIDB4NjQpCisKKy8qIFVTQl9DVFJMIGJpdCBkZWZpbmVzICovCisjZGVmaW5lIFVTQl9TTEFWRV9IQ0xLX0VOCSgxIDw8IDI0KQorI2RlZmluZSBVU0JfSE9TVF9ORUVEX0NMS19FTgkoMSA8PCAyMSkKKworI2RlZmluZSBVU0JfT1RHX0NMS19DVFJMCUlPX0FERFJFU1MoUE5YNDAwOF9VU0JfQ09ORklHX0JBU0UgKyAweEZGNCkKKyNkZWZpbmUgVVNCX09UR19DTEtfU1RBVAlJT19BRERSRVNTKFBOWDQwMDhfVVNCX0NPTkZJR19CQVNFICsgMHhGRjgpCisKKy8qIFVTQl9PVEdfQ0xLX0NUUkwgYml0IGRlZmluZXMgKi8KKyNkZWZpbmUgQUhCX01fQ0xPQ0tfT04JCSgxIDw8IDQpCisjZGVmaW5lIE9UR19DTE9DS19PTgkJKDEgPDwgMykKKyNkZWZpbmUgSTJDX0NMT0NLX09OCQkoMSA8PCAyKQorI2RlZmluZSBERVZfQ0xPQ0tfT04JCSgxIDw8IDEpCisjZGVmaW5lIEhPU1RfQ0xPQ0tfT04JCSgxIDw8IDApCisKKyNkZWZpbmUgVVNCX09UR19TVEFUX0NPTlRST0wJSU9fQUREUkVTUyhQTlg0MDA4X1VTQl9DT05GSUdfQkFTRSArIDB4MTEwKQorCisvKiBVU0JfT1RHX1NUQVRfQ09OVFJPTCBiaXQgZGVmaW5lcyAqLworI2RlZmluZSBUUkFOU1BBUkVOVF9JMkNfRU4JKDEgPDwgNykKKyNkZWZpbmUgSE9TVF9FTgkJCSgxIDw8IDApCisKKy8qIElTUDEzMDEgVVNCIHRyYW5zY2VpdmVyIEkyQyByZWdpc3RlcnMgKi8KKyNkZWZpbmUJSVNQMTMwMV9NT0RFX0NPTlRST0xfMQkJMHgwNAkvKiB1OCByZWFkLCBzZXQsICsxIGNsZWFyICovCisKKyNkZWZpbmUJTUMxX1NQRUVEX1JFRwkJKDEgPDwgMCkKKyNkZWZpbmUJTUMxX1NVU1BFTkRfUkVHCQkoMSA8PCAxKQorI2RlZmluZQlNQzFfREFUX1NFMAkJKDEgPDwgMikKKyNkZWZpbmUJTUMxX1RSQU5TUEFSRU5UCQkoMSA8PCAzKQorI2RlZmluZQlNQzFfQkRJU19BQ09OX0VOCSgxIDw8IDQpCisjZGVmaW5lCU1DMV9PRV9JTlRfRU4JCSgxIDw8IDUpCisjZGVmaW5lCU1DMV9VQVJUX0VOCQkoMSA8PCA2KQorI2RlZmluZQlNQzFfTUFTSwkJMHg3ZgorCisjZGVmaW5lCUlTUDEzMDFfTU9ERV9DT05UUk9MXzIJCTB4MTIJLyogdTggcmVhZCwgc2V0LCArMSBjbGVhciAqLworCisjZGVmaW5lCU1DMl9HTE9CQUxfUFdSX0ROCSgxIDw8IDApCisjZGVmaW5lCU1DMl9TUERfU1VTUF9DVFJMCSgxIDw8IDEpCisjZGVmaW5lCU1DMl9CSV9ESQkJKDEgPDwgMikKKyNkZWZpbmUJTUMyX1RSQU5TUF9CRElSMAkoMSA8PCAzKQorI2RlZmluZQlNQzJfVFJBTlNQX0JESVIxCSgxIDw8IDQpCisjZGVmaW5lCU1DMl9BVURJT19FTgkJKDEgPDwgNSkKKyNkZWZpbmUJTUMyX1BTV19FTgkJKDEgPDwgNikKKyNkZWZpbmUJTUMyX0VOMlY3CQkoMSA8PCA3KQorCisjZGVmaW5lCUlTUDEzMDFfT1RHX0NPTlRST0xfMQkJMHgwNgkvKiB1OCByZWFkLCBzZXQsICsxIGNsZWFyICovCisjCWRlZmluZQlPVEcxX0RQX1BVTExVUAkJKDEgPDwgMCkKKyMJZGVmaW5lCU9URzFfRE1fUFVMTFVQCQkoMSA8PCAxKQorIwlkZWZpbmUJT1RHMV9EUF9QVUxMRE9XTgkoMSA8PCAyKQorIwlkZWZpbmUJT1RHMV9ETV9QVUxMRE9XTgkoMSA8PCAzKQorIwlkZWZpbmUJT1RHMV9JRF9QVUxMRE9XTgkoMSA8PCA0KQorIwlkZWZpbmUJT1RHMV9WQlVTX0RSVgkJKDEgPDwgNSkKKyMJZGVmaW5lCU9URzFfVkJVU19ESVNDSFJHCSgxIDw8IDYpCisjCWRlZmluZQlPVEcxX1ZCVVNfQ0hSRwkJKDEgPDwgNykKKyNkZWZpbmUJSVNQMTMwMV9PVEdfU1RBVFVTCQkweDEwCS8qIHU4IHJlYWRvbmx5ICovCisjCWRlZmluZQlPVEdfQl9TRVNTX0VORAkJKDEgPDwgNikKKyMJZGVmaW5lCU9UR19CX1NFU1NfVkxECQkoMSA8PCA3KQorCisjZGVmaW5lIElTUDEzMDFfSTJDX0FERFIgMHgyQworCisjZGVmaW5lIElTUDEzMDFfSTJDX01PREVfQ09OVFJPTF8xIDB4NAorI2RlZmluZSBJU1AxMzAxX0kyQ19NT0RFX0NPTlRST0xfMiAweDEyCisjZGVmaW5lIElTUDEzMDFfSTJDX09UR19DT05UUk9MXzEgMHg2CisjZGVmaW5lIElTUDEzMDFfSTJDX09UR19DT05UUk9MXzIgMHgxMAorI2RlZmluZSBJU1AxMzAxX0kyQ19JTlRFUlJVUFRfU09VUkNFIDB4OAorI2RlZmluZSBJU1AxMzAxX0kyQ19JTlRFUlJVUFRfTEFUQ0ggMHhBCisjZGVmaW5lIElTUDEzMDFfSTJDX0lOVEVSUlVQVF9GQUxMSU5HIDB4QworI2RlZmluZSBJU1AxMzAxX0kyQ19JTlRFUlJVUFRfUklTSU5HIDB4RQorI2RlZmluZSBJU1AxMzAxX0kyQ19SRUdfQ0xFQVJfQUREUiAxCisKK3N0cnVjdCBpMmNfZHJpdmVyIGlzcDEzMDFfZHJpdmVyOworc3RydWN0IGkyY19jbGllbnQgKmlzcDEzMDFfaTJjX2NsaWVudDsKKworZXh0ZXJuIGludCB1c2JfZGlzYWJsZWQodm9pZCk7CitleHRlcm4gaW50IG9jcGlfZW5hYmxlKHZvaWQpOworCitzdGF0aWMgc3RydWN0IGNsayAqdXNiX2NsazsKKworc3RhdGljIGludCBpc3AxMzAxX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCk7CitzdGF0aWMgaW50IGlzcDEzMDFfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBpc3AxMzAxX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgIHZvaWQgKmFyZyk7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPQorICAgIHsgSVNQMTMwMV9JMkNfQUREUiwgSVNQMTMwMV9JMkNfQUREUiArIDEsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZHVtbXlfaTJjX2FkZHJsaXN0W10gPSB7IEkyQ19DTElFTlRfRU5EIH07CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudF9hZGRyZXNzX2RhdGEgYWRkcl9kYXRhID0geworCS5ub3JtYWxfaTJjID0gbm9ybWFsX2kyYywKKwkucHJvYmUgPSBkdW1teV9pMmNfYWRkcmxpc3QsCisJLmlnbm9yZSA9IGR1bW15X2kyY19hZGRybGlzdCwKK307CisKK3N0cnVjdCBpMmNfZHJpdmVyIGlzcDEzMDFfZHJpdmVyID0geworCS5pZCA9IEkyQ19EUklWRVJJRF9JMkNERVYsCS8qIEZha2UgSWQgKi8KKwkuY2xhc3MgPSBJMkNfQ0xBU1NfSFdNT04sCisJLmF0dGFjaF9hZGFwdGVyID0gaXNwMTMwMV9wcm9iZSwKKwkuZGV0YWNoX2NsaWVudCA9IGlzcDEzMDFfZGV0YWNoLAorCS5jb21tYW5kID0gaXNwMTMwMV9jb21tYW5kCit9OworCitzdGF0aWMgaW50IGlzcDEzMDFfYXR0YWNoKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjOworCisJYyA9IChzdHJ1Y3QgaTJjX2NsaWVudCAqKWt6YWxsb2Moc2l6ZW9mKCpjKSwgU0xBQl9LRVJORUwpOworCisJaWYgKCFjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0cmNweShjLT5uYW1lLCAiaXNwMTMwMSIpOworCWMtPmZsYWdzID0gMDsKKwljLT5hZGRyID0gYWRkcjsKKwljLT5hZGFwdGVyID0gYWRhcDsKKwljLT5kcml2ZXIgPSAmaXNwMTMwMV9kcml2ZXI7CisKKwlpc3AxMzAxX2kyY19jbGllbnQgPSBjOworCisJcmV0dXJuIGkyY19hdHRhY2hfY2xpZW50KGMpOworfQorCitzdGF0aWMgaW50IGlzcDEzMDFfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBpMmNfcHJvYmUoYWRhcCwgJmFkZHJfZGF0YSwgaXNwMTMwMV9hdHRhY2gpOworfQorCitzdGF0aWMgaW50IGlzcDEzMDFfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlrZnJlZShpc3AxMzAxX2kyY19jbGllbnQpOworCXJldHVybiAwOworfQorCisvKiBObyBjb21tYW5kcyBkZWZpbmVkICovCitzdGF0aWMgaW50IGlzcDEzMDFfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgdm9pZCAqYXJnKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpMmNfd3JpdGUodTggYnVmLCB1OCBzdWJhZGRyKQoreworCWNoYXIgdG1wYnVmWzJdOworCisJdG1wYnVmWzBdID0gc3ViYWRkcjsJLypyZWdpc3RlciBudW1iZXIgKi8KKwl0bXBidWZbMV0gPSBidWY7CS8qcmVnaXN0ZXIgZGF0YSAqLworCWkyY19tYXN0ZXJfc2VuZChpc3AxMzAxX2kyY19jbGllbnQsICZ0bXBidWZbMF0sIDIpOworfQorCitzdGF0aWMgdm9pZCBpc3AxMzAxX2NvbmZpZ3VyZSh2b2lkKQoreworCS8qIFBOWDQwMDggb25seSBzdXBwb3J0cyBEQVRfU0UwIFVTQiBtb2RlICovCisJLyogUE5YNDAwOCBSMkEgcmVxdWlyZXMgc2V0dGluZyB0aGUgTUFYNjAzIHRvIG91dHB1dCAzLjZWICovCisJLyogUG93ZXIgdXAgZXh0ZXJuZWwgY2hhcmdlLXB1bXAgKi8KKworCWkyY193cml0ZShNQzFfREFUX1NFMCB8IE1DMV9TUEVFRF9SRUcsIElTUDEzMDFfSTJDX01PREVfQ09OVFJPTF8xKTsKKwlpMmNfd3JpdGUofihNQzFfREFUX1NFMCB8IE1DMV9TUEVFRF9SRUcpLAorCQkgIElTUDEzMDFfSTJDX01PREVfQ09OVFJPTF8xIHwgSVNQMTMwMV9JMkNfUkVHX0NMRUFSX0FERFIpOworCWkyY193cml0ZShNQzJfQklfREkgfCBNQzJfUFNXX0VOIHwgTUMyX1NQRF9TVVNQX0NUUkwsCisJCSAgSVNQMTMwMV9JMkNfTU9ERV9DT05UUk9MXzIpOworCWkyY193cml0ZSh+KE1DMl9CSV9ESSB8IE1DMl9QU1dfRU4gfCBNQzJfU1BEX1NVU1BfQ1RSTCksCisJCSAgSVNQMTMwMV9JMkNfTU9ERV9DT05UUk9MXzIgfCBJU1AxMzAxX0kyQ19SRUdfQ0xFQVJfQUREUik7CisJaTJjX3dyaXRlKE9URzFfRE1fUFVMTERPV04gfCBPVEcxX0RQX1BVTExET1dOLAorCQkgIElTUDEzMDFfSTJDX09UR19DT05UUk9MXzEpOworCWkyY193cml0ZSh+KE9URzFfRE1fUFVMTERPV04gfCBPVEcxX0RQX1BVTExET1dOKSwKKwkJICBJU1AxMzAxX0kyQ19PVEdfQ09OVFJPTF8xIHwgSVNQMTMwMV9JMkNfUkVHX0NMRUFSX0FERFIpOworCWkyY193cml0ZSgweEZGLAorCQkgIElTUDEzMDFfSTJDX0lOVEVSUlVQVF9MQVRDSCB8IElTUDEzMDFfSTJDX1JFR19DTEVBUl9BRERSKTsKKwlpMmNfd3JpdGUoMHhGRiwKKwkJICBJU1AxMzAxX0kyQ19JTlRFUlJVUFRfRkFMTElORyB8IElTUDEzMDFfSTJDX1JFR19DTEVBUl9BRERSKTsKKwlpMmNfd3JpdGUoMHhGRiwKKwkJICBJU1AxMzAxX0kyQ19JTlRFUlJVUFRfUklTSU5HIHwgSVNQMTMwMV9JMkNfUkVHX0NMRUFSX0FERFIpOworCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc3AxMzAxX3ZidXNfb24odm9pZCkKK3sKKwlpMmNfd3JpdGUoT1RHMV9WQlVTX0RSViwgSVNQMTMwMV9JMkNfT1RHX0NPTlRST0xfMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpc3AxMzAxX3ZidXNfb2ZmKHZvaWQpCit7CisJaTJjX3dyaXRlKE9URzFfVkJVU19EUlYsCisJCSAgSVNQMTMwMV9JMkNfT1RHX0NPTlRST0xfMSB8IElTUDEzMDFfSTJDX1JFR19DTEVBUl9BRERSKTsKK30KKworc3RhdGljIHZvaWQgcG54NDAwOF9zdGFydF9oYyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdG1wID0gX19yYXdfcmVhZGwoVVNCX09UR19TVEFUX0NPTlRST0wpIHwgSE9TVF9FTjsKKwlfX3Jhd193cml0ZWwodG1wLCBVU0JfT1RHX1NUQVRfQ09OVFJPTCk7CisJaXNwMTMwMV92YnVzX29uKCk7Cit9CisKK3N0YXRpYyB2b2lkIHBueDQwMDhfc3RvcF9oYyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCWlzcDEzMDFfdmJ1c19vZmYoKTsKKwl0bXAgPSBfX3Jhd19yZWFkbChVU0JfT1RHX1NUQVRfQ09OVFJPTCkgJiB+SE9TVF9FTjsKKwlfX3Jhd193cml0ZWwodG1wLCBVU0JfT1RHX1NUQVRfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG9oY2lfcG54NDAwOF9zdGFydChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVjdCBvaGNpX2hjZCAqb2hjaSA9IGhjZF90b19vaGNpKGhjZCk7CisJaW50IHJldDsKKworCWlmICgocmV0ID0gb2hjaV9pbml0KG9oY2kpKSA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoKHJldCA9IG9oY2lfcnVuKG9oY2kpKSA8IDApIHsKKwkJZGV2X2VycihoY2QtPnNlbGYuY29udHJvbGxlciwgImNhbid0IHN0YXJ0XG4iKTsKKwkJb2hjaV9zdG9wKGhjZCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhjX2RyaXZlciBvaGNpX3BueDQwMDhfaGNfZHJpdmVyID0geworCS5kZXNjcmlwdGlvbiA9IGhjZF9uYW1lLAorCS5wcm9kdWN0X2Rlc2MgPQkJInBueDQwMDggT0hDSSIsCisKKwkvKgorCSAqIGdlbmVyaWMgaGFyZHdhcmUgbGlua2FnZQorCSAqLworCS5pcnEgPSBvaGNpX2lycSwKKwkuZmxhZ3MgPSBIQ0RfVVNCMTEgfCBIQ0RfTUVNT1JZLAorCisJLmhjZF9wcml2X3NpemUgPQlzaXplb2Yoc3RydWN0IG9oY2lfaGNkKSwKKwkvKgorCSAqIGJhc2ljIGxpZmVjeWNsZSBvcGVyYXRpb25zCisJICovCisJLnN0YXJ0ID0gb2hjaV9wbng0MDA4X3N0YXJ0LAorCS5zdG9wID0gb2hjaV9zdG9wLAorCisJLyoKKwkgKiBtYW5hZ2luZyBpL28gcmVxdWVzdHMgYW5kIGFzc29jaWF0ZWQgZGV2aWNlIHJlc291cmNlcworCSAqLworCS51cmJfZW5xdWV1ZSA9IG9oY2lfdXJiX2VucXVldWUsCisJLnVyYl9kZXF1ZXVlID0gb2hjaV91cmJfZGVxdWV1ZSwKKwkuZW5kcG9pbnRfZGlzYWJsZSA9IG9oY2lfZW5kcG9pbnRfZGlzYWJsZSwKKworCS8qCisJICogc2NoZWR1bGluZyBzdXBwb3J0CisJICovCisJLmdldF9mcmFtZV9udW1iZXIgPSBvaGNpX2dldF9mcmFtZSwKKworCS8qCisJICogcm9vdCBodWIgc3VwcG9ydAorCSAqLworCS5odWJfc3RhdHVzX2RhdGEgPSBvaGNpX2h1Yl9zdGF0dXNfZGF0YSwKKwkuaHViX2NvbnRyb2wgPSBvaGNpX2h1Yl9jb250cm9sLAorCisJLnN0YXJ0X3BvcnRfcmVzZXQgPSBvaGNpX3N0YXJ0X3BvcnRfcmVzZXQsCit9OworCisjZGVmaW5lIFVTQl9DTE9DS19NQVNLIChBSEJfTV9DTE9DS19PTnwgT1RHX0NMT0NLX09OIHwgSE9TVF9DTE9DS19PTiB8IEkyQ19DTE9DS19PTikKKworc3RhdGljIHZvaWQgcG54NDAwOF9zZXRfdXNiX2JpdHModm9pZCkKK3sKKwlzdGFydF9pbnRfc2V0X2ZhbGxpbmdfZWRnZShTRV9VU0JfT1RHX0FUWF9JTlRfTik7CisJc3RhcnRfaW50X2FjayhTRV9VU0JfT1RHX0FUWF9JTlRfTik7CisJc3RhcnRfaW50X3VtYXNrKFNFX1VTQl9PVEdfQVRYX0lOVF9OKTsKKworCXN0YXJ0X2ludF9zZXRfcmlzaW5nX2VkZ2UoU0VfVVNCX09UR19USU1FUl9JTlQpOworCXN0YXJ0X2ludF9hY2soU0VfVVNCX09UR19USU1FUl9JTlQpOworCXN0YXJ0X2ludF91bWFzayhTRV9VU0JfT1RHX1RJTUVSX0lOVCk7CisKKwlzdGFydF9pbnRfc2V0X3Jpc2luZ19lZGdlKFNFX1VTQl9JMkNfSU5UKTsKKwlzdGFydF9pbnRfYWNrKFNFX1VTQl9JMkNfSU5UKTsKKwlzdGFydF9pbnRfdW1hc2soU0VfVVNCX0kyQ19JTlQpOworCisJc3RhcnRfaW50X3NldF9yaXNpbmdfZWRnZShTRV9VU0JfSU5UKTsKKwlzdGFydF9pbnRfYWNrKFNFX1VTQl9JTlQpOworCXN0YXJ0X2ludF91bWFzayhTRV9VU0JfSU5UKTsKKworCXN0YXJ0X2ludF9zZXRfcmlzaW5nX2VkZ2UoU0VfVVNCX05FRURfQ0xLX0lOVCk7CisJc3RhcnRfaW50X2FjayhTRV9VU0JfTkVFRF9DTEtfSU5UKTsKKwlzdGFydF9pbnRfdW1hc2soU0VfVVNCX05FRURfQ0xLX0lOVCk7CisKKwlzdGFydF9pbnRfc2V0X3Jpc2luZ19lZGdlKFNFX1VTQl9BSEJfTkVFRF9DTEtfSU5UKTsKKwlzdGFydF9pbnRfYWNrKFNFX1VTQl9BSEJfTkVFRF9DTEtfSU5UKTsKKwlzdGFydF9pbnRfdW1hc2soU0VfVVNCX0FIQl9ORUVEX0NMS19JTlQpOworfQorCitzdGF0aWMgdm9pZCBwbng0MDA4X3Vuc2V0X3VzYl9iaXRzKHZvaWQpCit7CisJc3RhcnRfaW50X21hc2soU0VfVVNCX09UR19BVFhfSU5UX04pOworCXN0YXJ0X2ludF9tYXNrKFNFX1VTQl9PVEdfVElNRVJfSU5UKTsKKwlzdGFydF9pbnRfbWFzayhTRV9VU0JfSTJDX0lOVCk7CisJc3RhcnRfaW50X21hc2soU0VfVVNCX0lOVCk7CisJc3RhcnRfaW50X21hc2soU0VfVVNCX05FRURfQ0xLX0lOVCk7CisJc3RhcnRfaW50X21hc2soU0VfVVNCX0FIQl9ORUVEX0NMS19JTlQpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCB1c2JfaGNkX3BueDQwMDhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gMDsKKwlzdHJ1Y3Qgb2hjaV9oY2QgKm9oY2k7CisJY29uc3Qgc3RydWN0IGhjX2RyaXZlciAqZHJpdmVyID0gJm9oY2lfcG54NDAwOF9oY19kcml2ZXI7CisKKwlpbnQgcmV0ID0gMCwgaXJxOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXM6ICIgRFJJVkVSX0lORk8gIiAocG54NDAwOClcbiIsIGhjZF9uYW1lKTsKKwlpZiAodXNiX2Rpc2FibGVkKCkpIHsKKwkJZXJyKCJVU0IgaXMgZGlzYWJsZWQiKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHBkZXYtPm51bV9yZXNvdXJjZXMgIT0gMgorCSAgICB8fCBwZGV2LT5yZXNvdXJjZVswXS5mbGFncyAhPSBJT1JFU09VUkNFX01FTQorCSAgICB8fCBwZGV2LT5yZXNvdXJjZVsxXS5mbGFncyAhPSBJT1JFU09VUkNFX0lSUSkgeworCQllcnIoIkludmFsaWQgcmVzb3VyY2UgY29uZmlndXJhdGlvbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBFbmFibGUgQUhCIHNsYXZlIFVTQiBjbG9jaywgbmVlZGVkIGZvciBmdXJ0aGVyIFVTQiBjbG9jayBjb250cm9sICovCisJX19yYXdfd3JpdGVsKFVTQl9TTEFWRV9IQ0xLX0VOIHwgKDEgPDwgMTkpLCBVU0JfQ1RSTCk7CisKKwlyZXQgPSBpMmNfYWRkX2RyaXZlcigmaXNwMTMwMV9kcml2ZXIpOworCWlmIChyZXQgPCAwKSB7CisJCWVycigiZmFpbGVkIHRvIGNvbm5lY3QgSTJDIHRvIElTUDEzMDEgVVNCIFRyYW5zY2VpdmVyIik7CisJCWdvdG8gb3V0OworCX0KKworCWlzcDEzMDFfY29uZmlndXJlKCk7CisKKwkvKiBFbmFibGUgVVNCIFBMTCAqLworCXVzYl9jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJja19wbGw1Iik7CisJaWYgKElTX0VSUih1c2JfY2xrKSkgeworCQllcnIoImZhaWxlZCB0byBhY3F1aXJlIFVTQiBQTEwiKTsKKwkJcmV0ID0gUFRSX0VSUih1c2JfY2xrKTsKKwkJZ290byBvdXQxOworCX0KKworCXJldCA9IGNsa19lbmFibGUodXNiX2Nsayk7CisJaWYgKHJldCA8IDApIHsKKwkJZXJyKCJmYWlsZWQgdG8gc3RhcnQgVVNCIFBMTCIpOworCQlnb3RvIG91dDI7CisJfQorCisJcmV0ID0gY2xrX3NldF9yYXRlKHVzYl9jbGssIDQ4MDAwKTsKKwlpZiAocmV0IDwgMCkgeworCQllcnIoImZhaWxlZCB0byBzZXQgVVNCIGNsb2NrIHJhdGUiKTsKKwkJZ290byBvdXQzOworCX0KKworCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChVU0JfQ1RSTCkgfCBVU0JfSE9TVF9ORUVEX0NMS19FTiwgVVNCX0NUUkwpOworCisJLyogU2V0IHRvIGVuYWJsZSBhbGwgbmVlZGVkIFVTQiBjbG9ja3MgKi8KKwlfX3Jhd193cml0ZWwoVVNCX0NMT0NLX01BU0ssIFVTQl9PVEdfQ0xLX0NUUkwpOworCisJd2hpbGUgKChfX3Jhd19yZWFkbChVU0JfT1RHX0NMS19TVEFUKSAmIFVTQl9DTE9DS19NQVNLKSAhPQorCSAgICAgICBVU0JfQ0xPQ0tfTUFTSykgOworCisJaGNkID0gdXNiX2NyZWF0ZV9oY2QgKGRyaXZlciwgJnBkZXYtPmRldiwgcGRldi0+ZGV2LmJ1c19pZCk7CisJaWYgKCFoY2QpIHsKKwkJZXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgSEMgYnVmZmVyIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0MzsKKwl9CisKKwkvKiBTZXQgYWxsIFVTQiBiaXRzIGluIHRoZSBTdGFydCBFbmFibGUgcmVnaXN0ZXIgKi8KKwlwbng0MDA4X3NldF91c2JfYml0cygpOworCisJaGNkLT5yc3JjX3N0YXJ0ID0gcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQ7CisJaGNkLT5yc3JjX2xlbiA9IHBkZXYtPnJlc291cmNlWzBdLmVuZCAtIHBkZXYtPnJlc291cmNlWzBdLnN0YXJ0ICsgMTsKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4sIGhjZF9uYW1lKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJyZXF1ZXN0X21lbV9yZWdpb24gZmFpbGVkXG4iKTsKKwkJcmV0ID0gIC1FTk9NRU07CisJCWdvdG8gb3V0NDsKKwl9CisJaGNkLT5yZWdzID0gKHZvaWQgX19pb21lbSAqKXBkZXYtPnJlc291cmNlWzBdLnN0YXJ0OworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gb3V0NDsKKwl9CisKKwloY2QtPnNlbGYuaGNwcml2ID0gKHZvaWQgKiloY2Q7CisKKwlwbng0MDA4X3N0YXJ0X2hjKCk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaGNkKTsKKwlvaGNpID0gaGNkX3RvX29oY2koaGNkKTsKKwlvaGNpX2hjZF9pbml0KG9oY2kpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgImF0IDB4JXAsIGlycSAlZFxuIiwgaGNkLT5yZWdzLCBoY2QtPmlycSk7CisJcmV0ID0gdXNiX2FkZF9oY2QoaGNkLCBpcnEsIFNBX0lOVEVSUlVQVCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gcmV0OworCisJcG54NDAwOF9zdG9wX2hjKCk7CitvdXQ0OgorCXBueDQwMDhfdW5zZXRfdXNiX2JpdHMoKTsKKwl1c2JfcHV0X2hjZChoY2QpOworb3V0MzoKKwljbGtfZGlzYWJsZSh1c2JfY2xrKTsKK291dDI6CisJY2xrX3B1dCh1c2JfY2xrKTsKK291dDE6CisJaTJjX2RlbF9kcml2ZXIoJmlzcDEzMDFfZHJpdmVyKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHVzYl9oY2RfcG54NDAwOF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwl1c2JfcmVtb3ZlX2hjZChoY2QpOworCXBueDQwMDhfc3RvcF9oYygpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihoY2QtPnJzcmNfc3RhcnQsIGhjZC0+cnNyY19sZW4pOworCXVzYl9wdXRfaGNkKGhjZCk7CisJcG54NDAwOF91bnNldF91c2JfYml0cygpOworCWNsa19kaXNhYmxlKHVzYl9jbGspOworCWNsa19wdXQodXNiX2Nsayk7CisJaTJjX2RlbF9kcml2ZXIoJmlzcDEzMDFfZHJpdmVyKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHVzYl9oY2RfcG54NDAwOF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidXNiLW9oY2kiLAorCX0sCisJLnByb2JlID0gdXNiX2hjZF9wbng0MDA4X3Byb2JlLAorCS5yZW1vdmUgPSB1c2JfaGNkX3BueDQwMDhfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdXNiX2hjZF9wbng0MDA4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ1c2JfaGNkX3BueDQwMDhfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVzYl9oY2RfcG54NDAwOF9jbGVhbnVwKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ1c2JfaGNkX3BueDQwMDhfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodXNiX2hjZF9wbng0MDA4X2luaXQpOworbW9kdWxlX2V4aXQodXNiX2hjZF9wbng0MDA4X2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1zb2MuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1wcGMtc29jLmMKaW5kZXggOWZlNTZmZi4uZDlkMWFlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXBwYy1zb2MuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHBjLXNvYy5jCkBAIC0xNDgsNiArMTQ4LDcgQEAKIAkgKi8KIAkuc3RhcnQgPQkJb2hjaV9wcGNfc29jX3N0YXJ0LAogCS5zdG9wID0JCQlvaGNpX3N0b3AsCisJLnNodXRkb3duID0gCQlvaGNpX3NodXRkb3duLAogCiAJLyoKIAkgKiBtYW5hZ2luZyBpL28gcmVxdWVzdHMgYW5kIGFzc29jaWF0ZWQgZGV2aWNlIHJlc291cmNlcwpAQCAtMTY2LDYgKzE2Nyw3IEBACiAJICovCiAJLmh1Yl9zdGF0dXNfZGF0YSA9CW9oY2lfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbCA9CQlvaGNpX2h1Yl9jb250cm9sLAorCS5odWJfaXJxX2VuYWJsZSA9CW9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYJQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLApAQCAtMTk1LDYgKzE5Nyw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvaGNpX2hjZF9wcGNfc29jX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gb2hjaV9oY2RfcHBjX3NvY19kcnZfcHJvYmUsCiAJLnJlbW92ZQkJPSBvaGNpX2hjZF9wcGNfc29jX2Rydl9yZW1vdmUsCisJLnNodXRkb3duIAk9IHVzYl9oY2RfcGxhdGZvcm1fc2h1dGRvd24sCiAjaWZkZWYJQ09ORklHX1BNCiAJLyouc3VzcGVuZAk9IG9oY2lfaGNkX3BwY19zb2NfZHJ2X3N1c3BlbmQsKi8KIAkvKi5yZXN1bWUJPSBvaGNpX2hjZF9wcGNfc29jX2Rydl9yZXN1bWUsKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1weGEyN3guYyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1weGEyN3guYwppbmRleCA2ZjU1OWUxLi5lMTc2YjA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktcHhhMjd4LmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXB4YTI3eC5jCkBAIC0yNzAsNiArMjcwLDcgQEAKIAkgKi8KIAkuc3RhcnQgPQkJb2hjaV9weGEyN3hfc3RhcnQsCiAJLnN0b3AgPQkJCW9oY2lfc3RvcCwKKwkuc2h1dGRvd24gPSAJCW9oY2lfc2h1dGRvd24sCiAKIAkvKgogCSAqIG1hbmFnaW5nIGkvbyByZXF1ZXN0cyBhbmQgYXNzb2NpYXRlZCBkZXZpY2UgcmVzb3VyY2VzCkBAIC0yODgsNiArMjg5LDcgQEAKIAkgKi8KIAkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9odWJfc3RhdHVzX2RhdGEsCiAJLmh1Yl9jb250cm9sID0JCW9oY2lfaHViX2NvbnRyb2wsCisJLmh1Yl9pcnFfZW5hYmxlID0Jb2hjaV9yaHNjX2VuYWJsZSwKICNpZmRlZiAgQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLApAQCAtMzU3LDYgKzM1OSw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvaGNpX2hjZF9weGEyN3hfZHJpdmVyID0gewogCS5wcm9iZQkJPSBvaGNpX2hjZF9weGEyN3hfZHJ2X3Byb2JlLAogCS5yZW1vdmUJCT0gb2hjaV9oY2RfcHhhMjd4X2Rydl9yZW1vdmUsCisJLnNodXRkb3duIAk9IHVzYl9oY2RfcGxhdGZvcm1fc2h1dGRvd24sCiAjaWZkZWYgQ09ORklHX1BNCiAJLnN1c3BlbmQJPSBvaGNpX2hjZF9weGEyN3hfZHJ2X3N1c3BlbmQsIAogCS5yZXN1bWUJCT0gb2hjaV9oY2RfcHhhMjd4X2Rydl9yZXN1bWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktczNjMjQxMC5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXMzYzI0MTAuYwppbmRleCBkMmZjNjk2Li41OWU0MzY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktczNjMjQxMC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zM2MyNDEwLmMKQEAgLTM3MCw3ICszNzAsNyBAQAogCQlnb3RvIGVycl9tZW07CiAJfQogCi0JdXNiX2NsayA9IGNsa19nZXQoJmRldi0+ZGV2LCAidXBsbCIpOworCXVzYl9jbGsgPSBjbGtfZ2V0KCZkZXYtPmRldiwgInVzYi1idXMtaG9zdCIpOwogCWlmIChJU19FUlIodXNiX2NsaykpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJjYW5ub3QgZ2V0IHVzYi1ob3N0IGNsb2NrXG4iKTsKIAkJcmV0dmFsID0gLUVOT0VOVDsKQEAgLTQ0Nyw2ICs0NDcsNyBAQAogCSAqLwogCS5zdGFydCA9CQlvaGNpX3MzYzI0MTBfc3RhcnQsCiAJLnN0b3AgPQkJCW9oY2lfc3RvcCwKKwkuc2h1dGRvd24gPSAJCW9oY2lfc2h1dGRvd24sCiAKIAkvKgogCSAqIG1hbmFnaW5nIGkvbyByZXF1ZXN0cyBhbmQgYXNzb2NpYXRlZCBkZXZpY2UgcmVzb3VyY2VzCkBAIC00NjUsNiArNDY2LDcgQEAKIAkgKi8KIAkuaHViX3N0YXR1c19kYXRhID0Jb2hjaV9zM2MyNDEwX2h1Yl9zdGF0dXNfZGF0YSwKIAkuaHViX2NvbnRyb2wgPQkJb2hjaV9zM2MyNDEwX2h1Yl9jb250cm9sLAorCS5odWJfaXJxX2VuYWJsZSA9CW9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYJQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLApAQCAtNDkwLDYgKzQ5Miw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvaGNpX2hjZF9zM2MyNDEwX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gb2hjaV9oY2RfczNjMjQxMF9kcnZfcHJvYmUsCiAJLnJlbW92ZQkJPSBvaGNpX2hjZF9zM2MyNDEwX2Rydl9yZW1vdmUsCisJLnNodXRkb3duIAk9IHVzYl9oY2RfcGxhdGZvcm1fc2h1dGRvd24sCiAJLyouc3VzcGVuZAk9IG9oY2lfaGNkX3MzYzI0MTBfZHJ2X3N1c3BlbmQsICovCiAJLyoucmVzdW1lCT0gb2hjaV9oY2RfczNjMjQxMF9kcnZfcmVzdW1lLCAqLwogCS5kcml2ZXIJCT0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNhMTExMS5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLXNhMTExMS5jCmluZGV4IGNlM2RlMTAuLjcxMzcxZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1zYTExMTEuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktc2ExMTExLmMKQEAgLTIxMiwxMCArMjEyLDYgQEAKIAkgKiBiYXNpYyBsaWZlY3ljbGUgb3BlcmF0aW9ucwogCSAqLwogCS5zdGFydCA9CQlvaGNpX3NhMTExMV9zdGFydCwKLSNpZmRlZglDT05GSUdfUE0KLQkvKiBzdXNwZW5kOgkJb2hjaV9zYTExMTFfc3VzcGVuZCwgIC0tIHRiZCAqLwotCS8qIHJlc3VtZToJCW9oY2lfc2ExMTExX3Jlc3VtZSwgICAtLSB0YmQgKi8KLSNlbmRpZgogCS5zdG9wID0JCQlvaGNpX3N0b3AsCiAKIAkvKgpAQCAtMjM1LDYgKzIzMSw3IEBACiAJICovCiAJLmh1Yl9zdGF0dXNfZGF0YSA9CW9oY2lfaHViX3N0YXR1c19kYXRhLAogCS5odWJfY29udHJvbCA9CQlvaGNpX2h1Yl9jb250cm9sLAorCS5odWJfaXJxX2VuYWJsZSA9CW9oY2lfcmhzY19lbmFibGUsCiAjaWZkZWYJQ09ORklHX1BNCiAJLmJ1c19zdXNwZW5kID0JCW9oY2lfYnVzX3N1c3BlbmQsCiAJLmJ1c19yZXN1bWUgPQkJb2hjaV9idXNfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLmggYi9kcml2ZXJzL3VzYi9ob3N0L29oY2kuaAppbmRleCBjYWFjZjE0Li45M2ZkYzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2kuaAorKysgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2kuaApAQCAtMTU5LDcgKzE1OSw3IEBACiAJLyogQml0IFN0dWZmICAqLyAgICAgICAgICAgICAgIC1FUFJPVE8sCiAJLyogRGF0YSBUb2dnICAqLyAgICAgICAgICAgICAgIC1FSUxTRVEsCiAJLyogU3RhbGwgICAgICAqLyAgICAgICAgICAgICAgIC1FUElQRSwKLQkvKiBEZXZOb3RSZXNwICovICAgICAgICAgICAgICAgLUVUSU1FRE9VVCwKKwkvKiBEZXZOb3RSZXNwICovICAgICAgICAgICAgICAgLUVUSU1FLAogCS8qIFBJRENoZWNrICAgKi8gICAgICAgICAgICAgICAtRVBST1RPLAogCS8qIFVuRXhwUElEICAgKi8gICAgICAgICAgICAgICAtRVBST1RPLAogCS8qIERhdGFPdmVyICAgKi8gICAgICAgICAgICAgICAtRU9WRVJGTE9XLApAQCAtMzg5LDggKzM4OSw2IEBACiAJdW5zaWduZWQgbG9uZwkJbmV4dF9zdGF0ZWNoYW5nZTsJLyogc3VzcGVuZC9yZXN1bWUgKi8KIAl1MzIJCQlmbWludGVydmFsOwkJLyogc2F2ZWQgcmVnaXN0ZXIgKi8KIAotCXN0cnVjdCBub3RpZmllcl9ibG9jawlyZWJvb3Rfbm90aWZpZXI7Ci0KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIGZvciBIQyBidWdzICovCiAjZGVmaW5lCU9IQ0lfUVVJUktfQU1ENzU2CTB4MDEJCQkvKiBlcnJhdHVtICM0ICovCiAjZGVmaW5lCU9IQ0lfUVVJUktfU1VQRVJJTwkweDAyCQkJLyogbmF0c2VtaSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9zbDgxMS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTEtaGNkLmMKaW5kZXggZmEzNDA5Mi4uM2E1ODZhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9zbDgxMS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3NsODExLWhjZC5jCkBAIC01OTcsNyArNTk3LDcgQEAKIAkvKiBlcnJvcj8gcmV0cnksIHVudGlsICIzIHN0cmlrZXMiICovCiAJfSBlbHNlIGlmICgrK2VwLT5lcnJvcl9jb3VudCA+PSAzKSB7CiAJCWlmIChzdGF0dXMgJiBTTDExSF9TVEFUTUFTS19UTU9VVCkKLQkJCXVyYnN0YXQgPSAtRVRJTUVET1VUOworCQkJdXJic3RhdCA9IC1FVElNRTsKIAkJZWxzZSBpZiAoc3RhdHVzICYgU0wxMUhfU1RBVE1BU0tfT1ZGKQogCQkJdXJic3RhdCA9IC1FT1ZFUkZMT1c7CiAJCWVsc2UKQEAgLTE1MTcsNyArMTUxNyw3IEBACiAJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHByb2Nfc2w4MTFoX3Nob3csIFBERShpbm9kZSktPmRhdGEpOwogfQogCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfb3BzID0gewogCS5vcGVuCQk9IHByb2Nfc2w4MTFoX29wZW4sCiAJLnJlYWQJCT0gc2VxX3JlYWQsCiAJLmxsc2VlawkJPSBzZXFfbHNlZWssCkBAIC0xNzgzLDEwICsxNzgzLDE1IEBACiAJc3RydWN0IHNsODExCSpzbDgxMSA9IGhjZF90b19zbDgxMShoY2QpOwogCWludAkJcmV0dmFsID0gMDsKIAotCWlmIChzdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9GUkVFWkUpCisJc3dpdGNoIChzdGF0ZS5ldmVudCkgeworCWNhc2UgUE1fRVZFTlRfRlJFRVpFOgogCQlyZXR2YWwgPSBzbDgxMWhfYnVzX3N1c3BlbmQoaGNkKTsKLQllbHNlIGlmIChzdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9TVVNQRU5EKQorCQlicmVhazsKKwljYXNlIFBNX0VWRU5UX1NVU1BFTkQ6CisJY2FzZSBQTV9FVkVOVF9QUkVUSEFXOgkJLyogZXhwbGljaXRseSBkaXNjYXJkIGh3IHN0YXRlICovCiAJCXBvcnRfcG93ZXIoc2w4MTEsIDApOworCQlicmVhazsKKwl9CiAJaWYgKHJldHZhbCA9PSAwKQogCQlkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOwogCXJldHVybiByZXR2YWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3UxMzItaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3UxMzItaGNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyZTJhNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvdTEzMi1oY2QuYwpAQCAtMCwwICsxLDMyOTUgQEAKKy8qCisqIEhvc3QgQ29udHJvbGxlciBEcml2ZXIgZm9yIHRoZSBFbGFuIERpZ2l0YWwgU3lzdGVtcyBVMTMyIGFkYXB0ZXIKKyoKKyogQ29weXJpZ2h0KEMpIDIwMDYgRWxhbiBEaWdpdGFsIFN5c3RlbXMgTGltaXRlZAorKiBodHRwOi8vd3d3LmVsYW5kaWdpdGFsc3lzdGVtcy5jb20KKyoKKyogQXV0aG9yIGFuZCBNYWludGFpbmVyIC0gVG9ueSBPbGVjaCAtIEVsYW4gRGlnaXRhbCBTeXN0ZW1zCisqIHRvbnkub2xlY2hAZWxhbmRpZ2l0YWxzeXN0ZW1zLmNvbQorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTt5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHZlcnNpb24gMi4KKyoKKyoKKyogVGhpcyBkcml2ZXIgd2FzIHdyaXR0ZW4gYnkgVG9ueSBPbGVjaCh0b255Lm9sZWNoQGVsYW5kaWdpdGFsc3lzdGVtcy5jb20pCisqIGJhc2VkIG9uIHZhcmlvdXMgVVNCIGhvc3QgZHJpdmVycyBpbiB0aGUgMi42LjE1IGxpbnV4IGtlcm5lbAorKiB3aXRoIGNvbnN0YW50IHJlZmVyZW5jZSB0byB0aGUgM3JkIEVkaXRpb24gb2YgTGludXggRGV2aWNlIERyaXZlcnMKKyogcHVibGlzaGVkIGJ5IE8nUmVpbGx5CisqCisqIFRoZSBVMTMyIGFkYXB0ZXIgaXMgYSBVU0IgdG8gQ2FyZEJ1cyBhZGFwdGVyIHNwZWNpZmljYWxseSBkZXNpZ25lZAorKiBmb3IgUEMgY2FyZHMgdGhhdCBjb250YWluIGFuIE9IQ0kgaG9zdCBjb250cm9sbGVyLiBUeXBpY2FsIFBDIGNhcmRzCisqIGFyZSB0aGUgT3JhbmdlIE1vYmlsZSAzRyBPcHRpb24gR2xvYmVUcm90dGVyIEZ1c2lvbiBjYXJkLgorKgorKiBUaGUgVTEzMiBhZGFwdGVyIHdpbGwgKk5PVCAqd29yayB3aXRoIFBDIGNhcmRzIHRoYXQgZG8gbm90IGNvbnRhaW4KKyogYW4gT0hDSSBjb250cm9sbGVyLiBBIHNpbXBsZSB3YXkgdG8gdGVzdCB3aGV0aGVyIGEgUEMgY2FyZCBoYXMgYW4KKyogT0hDSSBjb250cm9sbGVyIGFzIGFuIGludGVyZmFjZSBpcyB0byBpbnNlcnQgdGhlIFBDIGNhcmQgZGlyZWN0bHkKKyogaW50byBhIGxhcHRvcChvciBkZXNrdG9wKSB3aXRoIGEgQ2FyZEJ1cyBzbG90IGFuZCBpZiAibHNwY2kiIHNob3dzCisqIGEgbmV3IFVTQiBjb250cm9sbGVyIGFuZCAibHN1c2IgLXYiIHNob3dzIGEgbmV3IE9IQ0kgSG9zdCBDb250cm9sbGVyCisqIHRoZW4gdGhlcmUgaXMgYSBnb29kIGNoYW5jZSB0aGF0IHRoZSBVMTMyIGFkYXB0ZXIgd2lsbCBzdXBwb3J0IHRoZQorKiBQQyBjYXJkLih5b3UgYWxzbyBuZWVkIHRoZSBzcGVjaWZpYyBjbGllbnQgZHJpdmVyIGZvciB0aGUgUEMgY2FyZCkKKyoKKyogUGxlYXNlIGluZm9ybSB0aGUgQXV0aG9yIGFuZCBNYWludGFpbmVyIGFib3V0IGFueSBQQyBjYXJkcyB0aGF0CisqIGNvbnRhaW4gT0hDSSBIb3N0IENvbnRyb2xsZXIgYW5kIHdvcmsgd2hlbiBkaXJlY3RseSBjb25uZWN0ZWQgdG8KKyogYW4gZW1iZWRkZWQgQ2FyZEJ1cyBzbG90IGJ1dCBkbyBub3Qgd29yayB3aGVuIHRoZXkgYXJlIGNvbm5lY3RlZAorKiB2aWEgYW4gRUxBTiBVMTMyIGFkYXB0ZXIuCisqCisqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlICIuLi9jb3JlL2hjZC5oIgorI2luY2x1ZGUgIm9oY2kuaCIKKyNkZWZpbmUgT0hDSV9DT05UUk9MX0lOSVQgT0hDSV9DVFJMX0NCU1IKKyNkZWZpbmUgT0hDSV9JTlRSX0lOSVQgKE9IQ0lfSU5UUl9NSUUgfCBPSENJX0lOVFJfVUUgfCBPSENJX0lOVFJfUkQgfCBcCisgICAgICAgIE9IQ0lfSU5UUl9XREgpCitNT0RVTEVfQVVUSE9SKCJUb255IE9sZWNoIC0gRWxhbiBEaWdpdGFsIFN5c3RlbXMgTGltaXRlZCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJVMTMyIFVTQiBIb3N0IENvbnRyb2xsZXIgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjZGVmaW5lIElOVF9NT0RVTEVfUEFSTShuLCB2KSBzdGF0aWMgaW50IG4gPSB2O21vZHVsZV9wYXJhbShuLCBpbnQsIDA0NDQpCitJTlRfTU9EVUxFX1BBUk0odGVzdGluZywgMCk7CisvKiBTb21lIGJvYXJkcyBtaXNyZXBvcnQgcG93ZXIgc3dpdGNoaW5nL292ZXJjdXJyZW50Ki8KK3N0YXRpYyBpbnQgZGlzdHJ1c3RfZmlybXdhcmUgPSAxOworbW9kdWxlX3BhcmFtKGRpc3RydXN0X2Zpcm13YXJlLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGlzdHJ1c3RfZmlybXdhcmUsICJ0cnVlIHRvIGRpc3RydXN0IGZpcm13YXJlIHBvd2VyL292ZXJjdXJyZW4iCisgICAgICAgICJ0IHNldHVwIik7CitERUNMQVJFX1dBSVRfUVVFVUVfSEVBRCh1MTMyX2hjZF93YWl0KTsKKy8qCisqIHUxMzJfbW9kdWxlX2xvY2sgZXhpc3RzIHRvIHByb3RlY3QgYWNjZXNzIHRvIGdsb2JhbCB2YXJpYWJsZXMKKyoKKyovCitzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSB1MTMyX21vZHVsZV9sb2NrOworc3RhdGljIGludCB1MTMyX2V4aXRpbmcgPSAwOworc3RhdGljIGludCB1MTMyX2luc3RhbmNlcyA9IDA7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCB1MTMyX3N0YXRpY19saXN0OworLyoKKyogZW5kIG9mIHRoZSBnbG9iYWwgdmFyaWFibGVzIHByb3RlY3RlZCBieSB1MTMyX21vZHVsZV9sb2NrCisqLworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3b3JrcXVldWU7CisjZGVmaW5lIE1BWF9VMTMyX1BPUlRTIDcKKyNkZWZpbmUgTUFYX1UxMzJfQUREUlMgMTI4CisjZGVmaW5lIE1BWF9VMTMyX1VERVZTIDQKKyNkZWZpbmUgTUFYX1UxMzJfRU5EUFMgMTAwCisjZGVmaW5lIE1BWF9VMTMyX1JJTkdTIDQKK3N0YXRpYyBjb25zdCBjaGFyICpjY190b190ZXh0WzE2XSA9IHsKKyAgICAgICAgIk5vIEVycm9yICIsCisgICAgICAgICJDUkMgRXJyb3IgIiwKKyAgICAgICAgIkJpdCBTdHVmZiAiLAorICAgICAgICAiRGF0YSBUb2dnICIsCisgICAgICAgICJTdGFsbCAiLAorICAgICAgICAiRGV2Tm90UmVzcCAiLAorICAgICAgICAiUElEQ2hlY2sgIiwKKyAgICAgICAgIlVuRXhwUElEICIsCisgICAgICAgICJEYXRhT3ZlciAiLAorICAgICAgICAiRGF0YVVuZGVyICIsCisgICAgICAgICIoZm9yIGh3KSAiLAorICAgICAgICAiKGZvciBodykgIiwKKyAgICAgICAgIkJ1ZmZlck92ZXIgIiwKKyAgICAgICAgIkJ1ZmZVbmRlciAiLAorICAgICAgICAiKGZvciBIQ0QpICIsCisgICAgICAgICIoZm9yIEhDRCkgIgorfTsKK3N0cnVjdCB1MTMyX3BvcnQgeworICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMjsKKyAgICAgICAgaW50IHJlc2V0OworICAgICAgICBpbnQgZW5hYmxlOworICAgICAgICBpbnQgcG93ZXI7CisgICAgICAgIGludCBTdGF0dXM7Cit9Oworc3RydWN0IHUxMzJfYWRkciB7CisgICAgICAgIHU4IGFkZHJlc3M7Cit9Oworc3RydWN0IHUxMzJfdWRldiB7CisgICAgICAgIHN0cnVjdCBrcmVmIGtyZWY7CisgICAgICAgIHN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2aWNlOworICAgICAgICB1OCBlbnVtZXJhdGlvbjsKKyAgICAgICAgdTggdWRldl9udW1iZXI7CisgICAgICAgIHU4IHVzYl9hZGRyOworICAgICAgICB1OCBwb3J0bnVtYmVyOworICAgICAgICB1OCBlbmRwX251bWJlcl9pblsxNl07CisgICAgICAgIHU4IGVuZHBfbnVtYmVyX291dFsxNl07Cit9OworI2RlZmluZSBFTkRQX1FVRVVFX1NISUZUIDMKKyNkZWZpbmUgRU5EUF9RVUVVRV9TSVpFICgxPDxFTkRQX1FVRVVFX1NISUZUKQorI2RlZmluZSBFTkRQX1FVRVVFX01BU0sgKEVORFBfUVVFVUVfU0laRS0xKQorc3RydWN0IHUxMzJfdXJicSB7CisgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgdXJiX21vcmU7CisgICAgICAgIHN0cnVjdCB1cmIgKnVyYjsKK307CitzdHJ1Y3QgdTEzMl9zcGluIHsKKyAgICAgICAgc3BpbmxvY2tfdCBzbG9jazsKK307CitzdHJ1Y3QgdTEzMl9lbmRwIHsKKyAgICAgICAgc3RydWN0IGtyZWYga3JlZjsKKyAgICAgICAgdTggdWRldl9udW1iZXI7CisgICAgICAgIHU4IGVuZHBfbnVtYmVyOworICAgICAgICB1OCB1c2JfYWRkcjsKKyAgICAgICAgdTggdXNiX2VuZHA7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyOworICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGVuZHBfcmluZzsKKyAgICAgICAgc3RydWN0IHUxMzJfcmluZyAqcmluZzsKKyAgICAgICAgdW5zaWduZWQgdG9nZ2xlX2JpdHM6MjsKKyAgICAgICAgdW5zaWduZWQgYWN0aXZlOjE7CisgICAgICAgIHVuc2lnbmVkIGRlbGF5ZWQ6MTsKKyAgICAgICAgdW5zaWduZWQgaW5wdXQ6MTsKKyAgICAgICAgdW5zaWduZWQgb3V0cHV0OjE7CisgICAgICAgIHVuc2lnbmVkIHBpcGV0eXBlOjI7CisgICAgICAgIHVuc2lnbmVkIGRlcXVldWVpbmc6MTsKKyAgICAgICAgdW5zaWduZWQgZWRzZXRfZmx1c2g6MTsKKyAgICAgICAgdW5zaWduZWQgc3BhcmVfYml0czoxNDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBqaWZmaWVzOworICAgICAgICBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmhlcDsKKyAgICAgICAgc3RydWN0IHUxMzJfc3BpbiBxdWV1ZV9sb2NrOworICAgICAgICB1MTYgcXVldWVfc2l6ZTsKKyAgICAgICAgdTE2IHF1ZXVlX2xhc3Q7CisgICAgICAgIHUxNiBxdWV1ZV9uZXh0OworICAgICAgICBzdHJ1Y3QgdXJiICp1cmJfbGlzdFtFTkRQX1FVRVVFX1NJWkVdOworICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIHVyYl9tb3JlOworICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgc2NoZWR1bGVyOworfTsKK3N0cnVjdCB1MTMyX3JpbmcgeworICAgICAgICB1bnNpZ25lZCBpbl91c2U6MTsKKyAgICAgICAgdW5zaWduZWQgbGVuZ3RoOjc7CisgICAgICAgIHU4IG51bWJlcjsKKyAgICAgICAgc3RydWN0IHUxMzIgKnUxMzI7CisgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmN1cnJfZW5kcDsKKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IHNjaGVkdWxlcjsKK307CisjZGVmaW5lIE9IQ0lfUVVJUktfQU1ENzU2IDB4MDEKKyNkZWZpbmUgT0hDSV9RVUlSS19TVVBFUklPIDB4MDIKKyNkZWZpbmUgT0hDSV9RVUlSS19JTklUUkVTRVQgMHgwNAorI2RlZmluZSBPSENJX0JJR19FTkRJQU4gMHgwOAorI2RlZmluZSBPSENJX1FVSVJLX1pGTUlDUk8gMHgxMAorc3RydWN0IHUxMzIgeworICAgICAgICBzdHJ1Y3Qga3JlZiBrcmVmOworICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIHUxMzJfbGlzdDsKKyAgICAgICAgc3RydWN0IHNlbWFwaG9yZSBzd19sb2NrOworICAgICAgICBzdHJ1Y3Qgc2VtYXBob3JlIHNjaGVkdWxlcl9sb2NrOworICAgICAgICBzdHJ1Y3QgdTEzMl9wbGF0Zm9ybV9kYXRhICpib2FyZDsKKyAgICAgICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdGZvcm1fZGV2OworICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nIHJpbmdbTUFYX1UxMzJfUklOR1NdOworICAgICAgICBpbnQgc2VxdWVuY2VfbnVtOworICAgICAgICBpbnQgZ29pbmc7CisgICAgICAgIGludCBwb3dlcjsKKyAgICAgICAgaW50IHJlc2V0OworICAgICAgICBpbnQgbnVtX3BvcnRzOworICAgICAgICB1MzIgaGNfY29udHJvbDsKKyAgICAgICAgdTMyIGhjX2ZtaW50ZXJ2YWw7CisgICAgICAgIHUzMiBoY19yb290aHViX3N0YXR1czsKKyAgICAgICAgdTMyIGhjX3Jvb3RodWJfYTsKKyAgICAgICAgdTMyIGhjX3Jvb3RodWJfcG9ydHN0YXR1c1tNQVhfUk9PVF9QT1JUU107CisgICAgICAgIGludCBmbGFnczsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBuZXh0X3N0YXRlY2hhbmdlOworICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3QgbW9uaXRvcjsKKyAgICAgICAgaW50IG51bV9lbmRwb2ludHM7CisgICAgICAgIHN0cnVjdCB1MTMyX2FkZHIgYWRkcltNQVhfVTEzMl9BRERSU107CisgICAgICAgIHN0cnVjdCB1MTMyX3VkZXYgdWRldltNQVhfVTEzMl9VREVWU107CisgICAgICAgIHN0cnVjdCB1MTMyX3BvcnQgcG9ydFtNQVhfVTEzMl9QT1JUU107CisgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHBbTUFYX1UxMzJfRU5EUFNdOworfTsKK2ludCB1c2JfZnRkaV9lbGFuX3JlYWRfcmVnKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHUzMiAqZGF0YSk7CitpbnQgdXNiX2Z0ZGlfZWxhbl9yZWFkX3BjaW1lbShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB1OCBhZGRyZXNzb2ZzLAorICAgICAgICB1OCB3aWR0aCwgdTMyICpkYXRhKTsKK2ludCB1c2JfZnRkaV9lbGFuX3dyaXRlX3BjaW1lbShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB1OCBhZGRyZXNzb2ZzLAorICAgICAgICB1OCB3aWR0aCwgdTMyIGRhdGEpOworLyoKKyogdGhlc2UgY2FuIG5vdCBiZSBpbmxpbmVzIGJlY2F1c2Ugd2UgbmVlZCB0aGUgc3RydWN0dXJlIG9mZnNldCEhCisqIERvZXMgYW55b25lIGhhdmUgYSBiZXR0ZXIgd2F5Pz8/Pz8KKyovCisjZGVmaW5lIHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgbWVtYmVyLCBkYXRhKSBcCisgICAgICAgIHVzYl9mdGRpX2VsYW5fcmVhZF9wY2ltZW0odTEzMi0+cGxhdGZvcm1fZGV2LCBvZmZzZXRvZihzdHJ1Y3QgXAorICAgICAgICBvaGNpX3JlZ3MsIG1lbWJlciksIDAsIGRhdGEpOworI2RlZmluZSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBtZW1iZXIsIGRhdGEpIFwKKyAgICAgICAgdXNiX2Z0ZGlfZWxhbl93cml0ZV9wY2ltZW0odTEzMi0+cGxhdGZvcm1fZGV2LCBvZmZzZXRvZihzdHJ1Y3QgXAorICAgICAgICBvaGNpX3JlZ3MsIG1lbWJlciksIDAsIGRhdGEpOworI2RlZmluZSB1MTMyX3dyaXRlX3BjaW1lbV9ieXRlKHUxMzIsIG1lbWJlciwgZGF0YSkgXAorICAgICAgICB1c2JfZnRkaV9lbGFuX3dyaXRlX3BjaW1lbSh1MTMyLT5wbGF0Zm9ybV9kZXYsIG9mZnNldG9mKHN0cnVjdCBcCisgICAgICAgIG9oY2lfcmVncywgbWVtYmVyKSwgMHgwZSwgZGF0YSk7CitzdGF0aWMgaW5saW5lIHN0cnVjdCB1MTMyICp1ZGV2X3RvX3UxMzIoc3RydWN0IHUxMzJfdWRldiAqdWRldikKK3sKKyAgICAgICAgdTggdWRldl9udW1iZXIgPSB1ZGV2LT51ZGV2X251bWJlcjsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lcl9vZih1ZGV2LCBzdHJ1Y3QgdTEzMiwgdWRldlt1ZGV2X251bWJlcl0pOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1MTMyICpoY2RfdG9fdTEzMihzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworICAgICAgICByZXR1cm4gKHN0cnVjdCB1MTMyICopKGhjZC0+aGNkX3ByaXYpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JfaGNkICp1MTMyX3RvX2hjZChzdHJ1Y3QgdTEzMiAqdTEzMikKK3sKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lcl9vZigodm9pZCAqKXUxMzIsIHN0cnVjdCB1c2JfaGNkLCBoY2RfcHJpdik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1MTMyX2Rpc2FibGUoc3RydWN0IHUxMzIgKnUxMzIpCit7CisgICAgICAgIHUxMzJfdG9faGNkKHUxMzIpLT5zdGF0ZSA9IEhDX1NUQVRFX0hBTFQ7Cit9CisKKworI2RlZmluZSBrcmVmX3RvX3UxMzIoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCB1MTMyLCBrcmVmKQorI2RlZmluZSBrcmVmX3RvX3UxMzJfZW5kcChkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHUxMzJfZW5kcCwga3JlZikKKyNkZWZpbmUga3JlZl90b191MTMyX3VkZXYoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCB1MTMyX3VkZXYsIGtyZWYpCisjaW5jbHVkZSAiLi4vbWlzYy91c2JfdTEzMi5oIgorc3RhdGljIGNvbnN0IGNoYXIgaGNkX25hbWVbXSA9ICJ1MTMyX2hjZCI7CisjZGVmaW5lIFBPUlRfQ19NQVNLICgoVVNCX1BPUlRfU1RBVF9DX0NPTk5FQ1RJT04gfCBVU0JfUE9SVF9TVEFUX0NfRU5BQkxFIHwgXAorICAgICAgICBVU0JfUE9SVF9TVEFUX0NfU1VTUEVORCB8IFVTQl9QT1JUX1NUQVRfQ19PVkVSQ1VSUkVOVCB8IFwKKyAgICAgICAgVVNCX1BPUlRfU1RBVF9DX1JFU0VUKSA8PCAxNikKK3N0YXRpYyB2b2lkIHUxMzJfaGNkX2RlbGV0ZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKyAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBrcmVmX3RvX3UxMzIoa3JlZik7CisgICAgICAgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB1MTMyLT5wbGF0Zm9ybV9kZXY7CisgICAgICAgIHN0cnVjdCB1c2JfaGNkICpoY2QgPSB1MTMyX3RvX2hjZCh1MTMyKTsKKyAgICAgICAgdTEzMi0+Z29pbmcgKz0gMTsKKyAgICAgICAgZG93bigmdTEzMl9tb2R1bGVfbG9jayk7CisgICAgICAgIGxpc3RfZGVsX2luaXQoJnUxMzItPnUxMzJfbGlzdCk7CisgICAgICAgIHUxMzJfaW5zdGFuY2VzIC09IDE7CisgICAgICAgIHVwKCZ1MTMyX21vZHVsZV9sb2NrKTsKKyAgICAgICAgZGV2X3dhcm4oJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiRlJFRUlORyB0aGUgaGNkPSVwIGFuZCB0aHVzIHRoZSB1MTMiCisgICAgICAgICAgICAgICAgIjI9JXAgZ29pbmc9JWQgcGRldj0lcFxuIiwgaGNkLCB1MTMyLCB1MTMyLT5nb2luZywgcGRldik7CisgICAgICAgIHVzYl9wdXRfaGNkKGhjZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1MTMyX3UxMzJfcHV0X2tyZWYoc3RydWN0IHUxMzIgKnUxMzIpCit7CisgICAgICAgIGtyZWZfcHV0KCZ1MTMyLT5rcmVmLCB1MTMyX2hjZF9kZWxldGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdTEzMl91MTMyX2luaXRfa3JlZihzdHJ1Y3QgdTEzMiAqdTEzMikKK3sKKyAgICAgICAga3JlZl9pbml0KCZ1MTMyLT5rcmVmKTsKK30KKworc3RhdGljIHZvaWQgdTEzMl91ZGV2X2RlbGV0ZShzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKyAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9IGtyZWZfdG9fdTEzMl91ZGV2KGtyZWYpOworICAgICAgICB1ZGV2LT51ZGV2X251bWJlciA9IDA7CisgICAgICAgIHVkZXYtPnVzYl9kZXZpY2UgPSBOVUxMOworICAgICAgICB1ZGV2LT51c2JfYWRkciA9IDA7CisgICAgICAgIHVkZXYtPmVudW1lcmF0aW9uID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHUxMzJfdWRldl9wdXRfa3JlZihzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfdWRldiAqdWRldikKK3sKKyAgICAgICAga3JlZl9wdXQoJnVkZXYtPmtyZWYsIHUxMzJfdWRldl9kZWxldGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdTEzMl91ZGV2X2dldF9rcmVmKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2KQoreworICAgICAgICBrcmVmX2dldCgmdWRldi0+a3JlZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1MTMyX3VkZXZfaW5pdF9rcmVmKHN0cnVjdCB1MTMyICp1MTMyLAorICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2KQoreworICAgICAgICBrcmVmX2luaXQoJnVkZXYtPmtyZWYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdTEzMl9yaW5nX3B1dF9rcmVmKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nKQoreworICAgICAgICBrcmVmX3B1dCgmdTEzMi0+a3JlZiwgdTEzMl9oY2RfZGVsZXRlKTsKK30KKworc3RhdGljIHZvaWQgdTEzMl9yaW5nX3JlcXVldWVfd29yayhzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfcmluZyAqcmluZywKKyAgICAgICAgdW5zaWduZWQgaW50IGRlbHRhKQoreworICAgICAgICBpZiAoZGVsdGEgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayh3b3JrcXVldWUsICZyaW5nLT5zY2hlZHVsZXIsIGRlbHRhKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChxdWV1ZV93b3JrKHdvcmtxdWV1ZSwgJnJpbmctPnNjaGVkdWxlcikpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBrcmVmX3B1dCgmdTEzMi0+a3JlZiwgdTEzMl9oY2RfZGVsZXRlKTsKKyAgICAgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB1MTMyX3JpbmdfcXVldWVfd29yayhzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfcmluZyAqcmluZywKKyAgICAgICAgdW5zaWduZWQgaW50IGRlbHRhKQoreworICAgICAgICBrcmVmX2dldCgmdTEzMi0+a3JlZik7CisgICAgICAgIHUxMzJfcmluZ19yZXF1ZXVlX3dvcmsodTEzMiwgcmluZywgZGVsdGEpOworICAgICAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHUxMzJfcmluZ19jYW5jZWxfd29yayhzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfcmluZyAqcmluZykKK3sKKyAgICAgICAgaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJnJpbmctPnNjaGVkdWxlcikpIHsKKyAgICAgICAgICAgICAgICBrcmVmX3B1dCgmdTEzMi0+a3JlZiwgdTEzMl9oY2RfZGVsZXRlKTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCB1MTMyX2VuZHBfZGVsZXRlKHN0cnVjdCBrcmVmICprcmVmKQoreworICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0ga3JlZl90b191MTMyX2VuZHAoa3JlZik7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKKyAgICAgICAgdTggdXNiX2FkZHIgPSBlbmRwLT51c2JfYWRkcjsKKyAgICAgICAgdTggdXNiX2VuZHAgPSBlbmRwLT51c2JfZW5kcDsKKyAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbdXNiX2FkZHJdLmFkZHJlc3M7CisgICAgICAgIHN0cnVjdCB1MTMyX3VkZXYgKnVkZXYgPSAmdTEzMi0+dWRldlthZGRyZXNzXTsKKyAgICAgICAgdTggZW5kcF9udW1iZXIgPSBlbmRwLT5lbmRwX251bWJlcjsKKyAgICAgICAgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICpoZXAgPSBlbmRwLT5oZXA7CisgICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBlbmRwLT5yaW5nOworICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmVuZHAtPmVuZHBfcmluZzsKKyAgICAgICAgcmluZy0+bGVuZ3RoIC09IDE7CisgICAgICAgIGlmIChlbmRwID09IHJpbmctPmN1cnJfZW5kcCkgeworICAgICAgICAgICAgICAgIGlmIChsaXN0X2VtcHR5KGhlYWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5jdXJyX2VuZHAgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9kZWwoaGVhZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKm5leHRfZW5kcCA9IGxpc3RfZW50cnkoaGVhZC0+bmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCwgZW5kcF9yaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmN1cnJfZW5kcCA9IG5leHRfZW5kcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfZGVsKGhlYWQpOworICAgICAgICB9fSBlbHNlCisgICAgICAgICAgICAgICAgbGlzdF9kZWwoaGVhZCk7CisgICAgICAgIGlmIChlbmRwLT5pbnB1dCkgeworICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXSA9IDA7CisgICAgICAgICAgICAgICAgdTEzMl91ZGV2X3B1dF9rcmVmKHUxMzIsIHVkZXYpOworICAgICAgICB9CisgICAgICAgIGlmIChlbmRwLT5vdXRwdXQpIHsKKyAgICAgICAgICAgICAgICB1ZGV2LT5lbmRwX251bWJlcl9vdXRbdXNiX2VuZHBdID0gMDsKKyAgICAgICAgICAgICAgICB1MTMyX3VkZXZfcHV0X2tyZWYodTEzMiwgdWRldik7CisgICAgICAgIH0KKyAgICAgICAgdTEzMi0+ZW5kcFtlbmRwX251bWJlciAtIDFdID0gTlVMTDsKKyAgICAgICAgaGVwLT5oY3ByaXYgPSBOVUxMOworICAgICAgICBrZnJlZShlbmRwKTsKKyAgICAgICAgdTEzMl91MTMyX3B1dF9rcmVmKHUxMzIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdTEzMl9lbmRwX3B1dF9rcmVmKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwKQoreworICAgICAgICBrcmVmX3B1dCgmZW5kcC0+a3JlZiwgdTEzMl9lbmRwX2RlbGV0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1MTMyX2VuZHBfZ2V0X2tyZWYoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHApCit7CisgICAgICAgIGtyZWZfZ2V0KCZlbmRwLT5rcmVmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHUxMzJfZW5kcF9pbml0X2tyZWYoc3RydWN0IHUxMzIgKnUxMzIsCisgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHApCit7CisgICAgICAgIGtyZWZfaW5pdCgmZW5kcC0+a3JlZik7CisgICAgICAgIGtyZWZfZ2V0KCZ1MTMyLT5rcmVmKTsKK30KKworc3RhdGljIHZvaWQgdTEzMl9lbmRwX3F1ZXVlX3dvcmsoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsCisgICAgICAgIHVuc2lnbmVkIGludCBkZWx0YSkKK3sKKyAgICAgICAgaWYgKGRlbHRhID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChxdWV1ZV9kZWxheWVkX3dvcmsod29ya3F1ZXVlLCAmZW5kcC0+c2NoZWR1bGVyLCBkZWx0YSkpCisgICAgICAgICAgICAgICAgICAgICAgICBrcmVmX2dldCgmZW5kcC0+a3JlZik7CisgICAgICAgIH0gZWxzZSBpZiAocXVldWVfd29yayh3b3JrcXVldWUsICZlbmRwLT5zY2hlZHVsZXIpKQorICAgICAgICAgICAgICAgIGtyZWZfZ2V0KCZlbmRwLT5rcmVmKTsKKyAgICAgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB1MTMyX2VuZHBfY2FuY2VsX3dvcmsoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHApCit7CisgICAgICAgIGlmIChjYW5jZWxfZGVsYXllZF93b3JrKCZlbmRwLT5zY2hlZHVsZXIpKQorICAgICAgICAgICAgICAgIGtyZWZfcHV0KCZlbmRwLT5rcmVmLCB1MTMyX2VuZHBfZGVsZXRlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHUxMzJfbW9uaXRvcl9wdXRfa3JlZihzdHJ1Y3QgdTEzMiAqdTEzMikKK3sKKyAgICAgICAga3JlZl9wdXQoJnUxMzItPmtyZWYsIHUxMzJfaGNkX2RlbGV0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHUxMzJfbW9uaXRvcl9xdWV1ZV93b3JrKHN0cnVjdCB1MTMyICp1MTMyLCB1bnNpZ25lZCBpbnQgZGVsdGEpCit7CisgICAgICAgIGlmIChkZWx0YSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocXVldWVfZGVsYXllZF93b3JrKHdvcmtxdWV1ZSwgJnUxMzItPm1vbml0b3IsIGRlbHRhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAga3JlZl9nZXQoJnUxMzItPmtyZWYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChxdWV1ZV93b3JrKHdvcmtxdWV1ZSwgJnUxMzItPm1vbml0b3IpKQorICAgICAgICAgICAgICAgIGtyZWZfZ2V0KCZ1MTMyLT5rcmVmKTsKKyAgICAgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCB1MTMyX21vbml0b3JfcmVxdWV1ZV93b3JrKHN0cnVjdCB1MTMyICp1MTMyLCB1bnNpZ25lZCBpbnQgZGVsdGEpCit7CisgICAgICAgIGlmIChkZWx0YSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocXVldWVfZGVsYXllZF93b3JrKHdvcmtxdWV1ZSwgJnUxMzItPm1vbml0b3IsIGRlbHRhKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChxdWV1ZV93b3JrKHdvcmtxdWV1ZSwgJnUxMzItPm1vbml0b3IpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAga3JlZl9wdXQoJnUxMzItPmtyZWYsIHUxMzJfaGNkX2RlbGV0ZSk7CisgICAgICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgdTEzMl9tb25pdG9yX2NhbmNlbF93b3JrKHN0cnVjdCB1MTMyICp1MTMyKQoreworICAgICAgICBpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmdTEzMi0+bW9uaXRvcikpCisgICAgICAgICAgICAgICAga3JlZl9wdXQoJnUxMzItPmtyZWYsIHUxMzJfaGNkX2RlbGV0ZSk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9yb290aHViX2luZm8oc3RydWN0IHUxMzIgKnUxMzIpCit7CisgICAgICAgIHUzMiByZXZpc2lvbjsKKyAgICAgICAgaW50IHJldHZhbDsKKyAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByZXZpc2lvbiwgJnJldmlzaW9uKTsKKyAgICAgICAgaWYgKHJldHZhbCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZXJyb3IgJWQgYWNjZXNzaW5nIGRldmljZSBjbyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJudHJvbFxuIiwgcmV0dmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9IGVsc2UgaWYgKChyZXZpc2lvbiAmIDB4RkYpID09IDB4MTApIHsKKyAgICAgICAgfSBlbHNlIGlmICgocmV2aXNpb24gJiAweEZGKSA9PSAweDExKSB7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgcmV2aXNpb24gaXMgbm90IHZhbGlkIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAlMDhYXG4iLCByZXZpc2lvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmdTEzMi0+aGNfY29udHJvbCk7CisgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImVycm9yICVkIGFjY2Vzc2luZyBkZXZpY2UgY28iCisgICAgICAgICAgICAgICAgICAgICAgICAibnRyb2xcbiIsIHJldHZhbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuc3RhdHVzLAorICAgICAgICAgICAgICAgICZ1MTMyLT5oY19yb290aHViX3N0YXR1cyk7CisgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImVycm9yICVkIGFjY2Vzc2luZyBkZXZpY2UgcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAiZyByb290aHViLnN0YXR1c1xuIiwgcmV0dmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgcm9vdGh1Yi5hLCAmdTEzMi0+aGNfcm9vdGh1Yl9hKTsKKyAgICAgICAgaWYgKHJldHZhbCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZXJyb3IgJWQgYWNjZXNzaW5nIGRldmljZSByZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJnIHJvb3RodWIuYVxuIiwgcmV0dmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgSSA9IHUxMzItPm51bV9wb3J0czsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKEktLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgcm9vdGh1Yi5wb3J0c3RhdHVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdTEzMi0+aGNfcm9vdGh1Yl9wb3J0c3RhdHVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJlcnJvciAlZCBhY2MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVzc2luZyBkZXZpY2Ugcm9vdGh1Yi5wb3J0c3RhdHVzWyVkXVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgcmV0dmFsLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1MTMyX2hjZF9tb25pdG9yX3dvcmsodm9pZCAqZGF0YSkKK3sKKyAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBkYXRhOworICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7CisgICAgICAgICAgICAgICAgdTEzMl9tb25pdG9yX3B1dF9rcmVmKHUxMzIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKKyAgICAgICAgICAgICAgICB1MTMyX21vbml0b3JfcHV0X2tyZWYodTEzMik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCByZXR2YWw7CisgICAgICAgICAgICAgICAgZG93bigmdTEzMi0+c3dfbG9jayk7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcmVhZF9yb290aHViX2luZm8odTEzMik7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHVzYl9oY2QgKmhjZCA9IHUxMzJfdG9faGNkKHUxMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9kaXNhYmxlKHUxMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgdTEzMi0+Z29pbmcgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnN3X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2hjX2RpZWQoaGNkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9nb25lX2F3YXkodTEzMi0+cGxhdGZvcm1fZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfbW9uaXRvcl9wdXRfa3JlZih1MTMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9tb25pdG9yX3JlcXVldWVfd29yayh1MTMyLCA1MDApOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnN3X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCB1MTMyX2hjZF9naXZlYmFja191cmIoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsCisgICAgICAgIHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKK3sKKyAgICAgICAgc3RydWN0IHUxMzJfcmluZyAqcmluZzsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBpcnFzOworICAgICAgICBzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gdTEzMl90b19oY2QodTEzMik7CisgICAgICAgIHVyYi0+ZXJyb3JfY291bnQgPSAwOworICAgICAgICB1cmItPnN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgdXJiLT5oY3ByaXYgPSBOVUxMOworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisgICAgICAgIGVuZHAtPnF1ZXVlX25leHQgKz0gMTsKKyAgICAgICAgaWYgKEVORFBfUVVFVUVfU0laRSA+IC0tZW5kcC0+cXVldWVfc2l6ZSkgeworICAgICAgICAgICAgICAgIGVuZHAtPmFjdGl2ZSA9IDA7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbmV4dCA9IGVuZHAtPnVyYl9tb3JlLm5leHQ7CisgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdXJicSAqdXJicSA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IHUxMzJfdXJicSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyYl9tb3JlKTsKKyAgICAgICAgICAgICAgICBsaXN0X2RlbChuZXh0KTsKKyAgICAgICAgICAgICAgICBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9sYXN0KytdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVyYnEtPnVyYjsKKyAgICAgICAgICAgICAgICBlbmRwLT5hY3RpdmUgPSAwOworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworICAgICAgICAgICAgICAgIGtmcmVlKHVyYnEpOworICAgICAgICB9IGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgcmluZyA9IGVuZHAtPnJpbmc7CisgICAgICAgIHJpbmctPmluX3VzZSA9IDA7CisgICAgICAgIHUxMzJfcmluZ19jYW5jZWxfd29yayh1MTMyLCByaW5nKTsKKyAgICAgICAgdTEzMl9yaW5nX3F1ZXVlX3dvcmsodTEzMiwgcmluZywgMCk7CisgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgIHUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKKyAgICAgICAgdXNiX2hjZF9naXZlYmFja191cmIoaGNkLCB1cmIsIE5VTEwpOworICAgICAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHUxMzJfaGNkX2ZvcmdldF91cmIoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsCisgICAgICAgIHN0cnVjdCB1cmIgKnVyYiwgaW50IHN0YXR1cykKK3sKKyAgICAgICAgdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOworfQorCitzdGF0aWMgdm9pZCB1MTMyX2hjZF9hYmFuZG9uX3VyYihzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwKKyAgICAgICAgc3RydWN0IHVyYiAqdXJiLCBpbnQgc3RhdHVzKQoreworICAgICAgICB1bnNpZ25lZCBsb25nIGlycXM7CisgICAgICAgIHN0cnVjdCB1c2JfaGNkICpoY2QgPSB1MTMyX3RvX2hjZCh1MTMyKTsKKyAgICAgICAgdXJiLT5lcnJvcl9jb3VudCA9IDA7CisgICAgICAgIHVyYi0+c3RhdHVzID0gc3RhdHVzOworICAgICAgICB1cmItPmhjcHJpdiA9IE5VTEw7CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKKyAgICAgICAgZW5kcC0+cXVldWVfbmV4dCArPSAxOworICAgICAgICBpZiAoRU5EUF9RVUVVRV9TSVpFID4gLS1lbmRwLT5xdWV1ZV9zaXplKSB7CisgICAgICAgICAgICAgICAgZW5kcC0+YWN0aXZlID0gMDsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0ID0gZW5kcC0+dXJiX21vcmUubmV4dDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgdTEzMl91cmJxLAorICAgICAgICAgICAgICAgICAgICAgICAgdXJiX21vcmUpOworICAgICAgICAgICAgICAgIGxpc3RfZGVsKG5leHQpOworICAgICAgICAgICAgICAgIGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPQorICAgICAgICAgICAgICAgICAgICAgICAgdXJicS0+dXJiOworICAgICAgICAgICAgICAgIGVuZHAtPmFjdGl2ZSA9IDA7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisgICAgICAgICAgICAgICAga2ZyZWUodXJicSk7CisgICAgICAgIH0gdXNiX2hjZF9naXZlYmFja191cmIoaGNkLCB1cmIsIE5VTEwpOworICAgICAgICByZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGVkc2V0X2lucHV0KHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nLAorICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4IGFkZHJlc3MsIHU4IHRvZ2dsZV9iaXRzLAorICAgICAgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsIGludCBsZW4sCisgICAgICAgIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsIGludCByZXBlYXRfbnVtYmVyLAorICAgICAgICAgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkpCit7CisgICAgICAgIHJldHVybiB1c2JfZnRkaV9lbGFuX2Vkc2V0X2lucHV0KHUxMzItPnBsYXRmb3JtX2RldiwgcmluZy0+bnVtYmVyLCBlbmRwLAorICAgICAgICAgICAgICAgICB1cmIsIGFkZHJlc3MsIGVuZHAtPnVzYl9lbmRwLCB0b2dnbGVfYml0cywgY2FsbGJhY2spOworfQorCitzdGF0aWMgaW5saW5lIGludCBlZHNldF9zZXR1cChzdHJ1Y3QgdTEzMiAqdTEzMiwgc3RydWN0IHUxMzJfcmluZyAqcmluZywKKyAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCBhZGRyZXNzLCB1OCB0b2dnbGVfYml0cywKKyAgICAgICAgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLCBpbnQgbGVuLAorICAgICAgICBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLCBpbnQgcmVwZWF0X251bWJlciwKKyAgICAgICAgIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpKQoreworICAgICAgICByZXR1cm4gdXNiX2Z0ZGlfZWxhbl9lZHNldF9zZXR1cCh1MTMyLT5wbGF0Zm9ybV9kZXYsIHJpbmctPm51bWJlciwgZW5kcCwKKyAgICAgICAgICAgICAgICAgdXJiLCBhZGRyZXNzLCBlbmRwLT51c2JfZW5kcCwgdG9nZ2xlX2JpdHMsIGNhbGxiYWNrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZWRzZXRfc2luZ2xlKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nLAorICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4IGFkZHJlc3MsIHU4IHRvZ2dsZV9iaXRzLAorICAgICAgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsIGludCBsZW4sCisgICAgICAgIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsIGludCByZXBlYXRfbnVtYmVyLAorICAgICAgICAgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkpCit7CisgICAgICAgIHJldHVybiB1c2JfZnRkaV9lbGFuX2Vkc2V0X3NpbmdsZSh1MTMyLT5wbGF0Zm9ybV9kZXYsIHJpbmctPm51bWJlciwKKyAgICAgICAgICAgICAgICBlbmRwLCB1cmIsIGFkZHJlc3MsIGVuZHAtPnVzYl9lbmRwLCB0b2dnbGVfYml0cywgY2FsbGJhY2spOworfQorCitzdGF0aWMgaW5saW5lIGludCBlZHNldF9vdXRwdXQoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcsCisgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggYWRkcmVzcywgdTggdG9nZ2xlX2JpdHMsCisgICAgICAgIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggKmJ1ZiwgaW50IGxlbiwKKyAgICAgICAgaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwgaW50IHJlcGVhdF9udW1iZXIsCisgICAgICAgICBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKSkKK3sKKyAgICAgICAgcmV0dXJuIHVzYl9mdGRpX2VsYW5fZWRzZXRfb3V0cHV0KHUxMzItPnBsYXRmb3JtX2RldiwgcmluZy0+bnVtYmVyLAorICAgICAgICAgICAgICAgIGVuZHAsIHVyYiwgYWRkcmVzcywgZW5kcC0+dXNiX2VuZHAsIHRvZ2dsZV9iaXRzLCBjYWxsYmFjayk7Cit9CisKKworLyoKKyogbXVzdCBub3QgTE9DSyBzd19sb2NrCisqCisqLworc3RhdGljIHZvaWQgdTEzMl9oY2RfaW50ZXJydXB0X3JlY3Yodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAorICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKK3sKKyAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKKyAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisgICAgICAgIHN0cnVjdCB1MTMyX3VkZXYgKnVkZXYgPSAmdTEzMi0+dWRldlthZGRyZXNzXTsKKyAgICAgICAgZG93bigmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICB1MTMyX2hjZF9mb3JnZXRfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPmRlcXVldWVpbmcpIHsKKyAgICAgICAgICAgICAgICBlbmRwLT5kZXF1ZXVlaW5nID0gMDsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgdXJiPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcCBzdGF0dXM9JWRcbiIsIHVyYiwgdXJiLT5zdGF0dXMpOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgeworICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBlbmRwLT5yaW5nOworICAgICAgICAgICAgICAgIHU4ICp1ID0gdXJiLT50cmFuc2Zlcl9idWZmZXIgKyB1cmItPmFjdHVhbF9sZW5ndGg7CisgICAgICAgICAgICAgICAgdTggKmIgPSBidWY7CisgICAgICAgICAgICAgICAgaW50IEwgPSBsZW47CisgICAgICAgICAgICAgICAgd2hpbGUgKEwtLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICp1KysgPSAqYisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1cmItPmFjdHVhbF9sZW5ndGggKz0gbGVuOworICAgICAgICAgICAgICAgIGlmICgoY29uZGl0aW9uX2NvZGUgPT0gVERfQ0NfTk9FUlJPUikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICh1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPiB1cmItPmFjdHVhbF9sZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cyA9IHRvZ2dsZV9iaXRzOworICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAmIHRvZ2dsZV9iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGVkc2V0X3NpbmdsZSh1MTMyLCByaW5nLCBlbmRwLCB1cmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgZW5kcC0+dG9nZ2xlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfaW50ZXJydXB0X3JlY3YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5pbl91c2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5hY3RpdmUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5qaWZmaWVzID0gamlmZmllcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNlY3NfdG9famlmZmllcyh1cmItPmludGVydmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9yaW5nX2NhbmNlbF93b3JrKHUxMzIsIHJpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3JpbmdfcXVldWVfd29yayh1MTMyLCByaW5nLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGNvbmRpdGlvbl9jb2RlID09IFREX0RBVEFVTkRFUlJVTikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgodXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9TSE9SVF9OT1RfT0spID09IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cyA9IHRvZ2dsZV9iaXRzOworICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAmIHRvZ2dsZV9iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dG9nZ2xlX2JpdHMgPSB0b2dnbGVfYml0czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxICYgdG9nZ2xlX2JpdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25kaXRpb25fY29kZSA9PSBURF9DQ19TVEFMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cyA9IDB4MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInVyYj0lcCBnaXZpbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZyBiYWNrIElOVEVSUlVQVCAlc1xuIiwgdXJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjX3RvX3RleHRbY29uZGl0aW9uX2NvZGVdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY190b19lcnJvcltjb25kaXRpb25fY29kZV0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgIkNBTExCQUNLIGNhbGxlZCB1cmI9JXAgc3RhdHUiCisgICAgICAgICAgICAgICAgICAgICAgICAicz0lZFxuIiwgdXJiLCB1cmItPnN0YXR1cyk7CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCB1cmItPnN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHUxMzJfaGNkX2J1bGtfb3V0cHV0X3NlbnQodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAorICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKK3sKKyAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKKyAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisgICAgICAgIGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisgICAgICAgICAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRUlOVFIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkIHVyYj0iCisgICAgICAgICAgICAgICAgICAgICAgICAiJXAgc3RhdHVzPSVkXG4iLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKKyAgICAgICAgICAgICAgICB1cmItPmFjdHVhbF9sZW5ndGggKz0gbGVuOworICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7CisgICAgICAgICAgICAgICAgaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA+IHVyYi0+YWN0dWFsX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBlZHNldF9vdXRwdXQodTEzMiwgcmluZywgZW5kcCwgdXJiLCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cywgdTEzMl9oY2RfYnVsa19vdXRwdXRfc2VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCBzdGF0dSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzPSVkXG4iLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgdTEzMl9oY2RfYnVsa19pbnB1dF9yZWN2KHZvaWQgKmRhdGEsIHN0cnVjdCB1cmIgKnVyYiwgdTggKmJ1ZiwKKyAgICAgICAgaW50IGxlbiwgaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwKKyAgICAgICAgaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCit7CisgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOworICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7CisgICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOworICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107CisgICAgICAgIGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisgICAgICAgICAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRUlOVFIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkIHVyYj0iCisgICAgICAgICAgICAgICAgICAgICAgICAiJXAgc3RhdHVzPSVkXG4iLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKKyAgICAgICAgICAgICAgICB1OCAqdSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgdXJiLT5hY3R1YWxfbGVuZ3RoOworICAgICAgICAgICAgICAgIHU4ICpiID0gYnVmOworICAgICAgICAgICAgICAgIGludCBMID0gbGVuOworICAgICAgICAgICAgICAgIHdoaWxlIChMLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqdSsrID0gKmIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoICs9IGxlbjsKKyAgICAgICAgICAgICAgICBpZiAoKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAodXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID4gdXJiLT5hY3R1YWxfbGVuZ3RoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICYgdG9nZ2xlX2JpdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfaW5wdXQodTEzMi0+cGxhdGZvcm1fZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dXNiX2VuZHAsIGVuZHAtPnRvZ2dsZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9idWxrX2lucHV0X3JlY3YpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX05PRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICYgdG9nZ2xlX2JpdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjX3RvX2Vycm9yW2NvbmRpdGlvbl9jb2RlXSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoY29uZGl0aW9uX2NvZGUgPT0gVERfREFUQVVOREVSUlVOKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKCh1cmItPnRyYW5zZmVyX2ZsYWdzICYgVVJCX1NIT1JUX05PVF9PSykgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gdG9nZ2xlX2JpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICYgdG9nZ2xlX2JpdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZGl0aW9uX2NvZGUgPT0gVERfREFUQVVOREVSUlVOKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cyA9IHRvZ2dsZV9iaXRzOworICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAmIHRvZ2dsZV9iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl93YXJuKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInVyYj0lcChTSE9SVCBOT1QgT0siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpIGdpdmluZyBiYWNrIEJVTEsgSU4gJXNcbiIsIHVyYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfdG9fdGV4dFtjb25kaXRpb25fY29kZV0pOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZGl0aW9uX2NvZGUgPT0gVERfQ0NfU1RBTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOworICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCBlbmRwLT51c2JfZW5kcCwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dG9nZ2xlX2JpdHMgPSAweDI7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIGVuZHAtPnVzYl9lbmRwLCAwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAidXJiPSVwIGdpdmluZyBiYWNrIEIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTEsgSU4gY29kZT0lZCAlc1xuIiwgdXJiLCBjb25kaXRpb25fY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfdG9fdGV4dFtjb25kaXRpb25fY29kZV0pOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjX3RvX2Vycm9yW2NvbmRpdGlvbl9jb2RlXSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCBzdGF0dSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzPSVkXG4iLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgdTEzMl9oY2RfY29uZmlndXJlX2VtcHR5X3NlbnQodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAorICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKK3sKKyAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKKyAgICAgICAgZG93bigmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICB1MTMyX2hjZF9mb3JnZXRfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPmRlcXVldWVpbmcpIHsKKyAgICAgICAgICAgICAgICBlbmRwLT5kZXF1ZXVlaW5nID0gMDsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgdXJiPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcCBzdGF0dXM9JWRcbiIsIHVyYiwgdXJiLT5zdGF0dXMpOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgeworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCBzdGF0dSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzPSVkXG4iLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgdTEzMl9oY2RfY29uZmlndXJlX2lucHV0X3JlY3Yodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAorICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKK3sKKyAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKKyAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisgICAgICAgIGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisgICAgICAgICAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRUlOVFIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkIHVyYj0iCisgICAgICAgICAgICAgICAgICAgICAgICAiJXAgc3RhdHVzPSVkXG4iLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gZW5kcC0+cmluZzsKKyAgICAgICAgICAgICAgICB1OCAqdSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworICAgICAgICAgICAgICAgIHU4ICpiID0gYnVmOworICAgICAgICAgICAgICAgIGludCBMID0gbGVuOworICAgICAgICAgICAgICAgIHdoaWxlIChMLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqdSsrID0gKmIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoID0gbGVuOworICAgICAgICAgICAgICAgIGlmICgoY29uZGl0aW9uX2NvZGUgPT0gVERfQ0NfTk9FUlJPUikgfHwgKChjb25kaXRpb25fY29kZSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgVERfREFUQVVOREVSUlVOKSAmJiAoKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgVVJCX1NIT1JUX05PVF9PSykgPT0gMCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfZW1wdHkodTEzMi0+cGxhdGZvcm1fZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dXNiX2VuZHAsIDB4MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfY29uZmlndXJlX2VtcHR5X3NlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmRpdGlvbl9jb2RlID09IFREX0NDX1NUQUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgZGV2X3dhcm4oJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZ2l2aW5nIGJhY2sgU0VUVVAgSSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5QVVQgU1RBTEwgdXJiICVwXG4iLCB1cmIpOworICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2NfdG9fZXJyb3JbY29uZGl0aW9uX2NvZGVdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZ2l2aW5nIGJhY2sgU0VUVVAgSU4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQVVQgJXMgdXJiICVwXG4iLCBjY190b190ZXh0W2NvbmRpdGlvbl9jb2RlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjX3RvX2Vycm9yW2NvbmRpdGlvbl9jb2RlXSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCBzdGF0dSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzPSVkXG4iLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgdTEzMl9oY2RfY29uZmlndXJlX2VtcHR5X3JlY3Yodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAorICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKK3sKKyAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKKyAgICAgICAgZG93bigmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICB1MTMyX2hjZF9mb3JnZXRfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPmRlcXVldWVpbmcpIHsKKyAgICAgICAgICAgICAgICBlbmRwLT5kZXF1ZXVlaW5nID0gMDsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgdXJiPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcCBzdGF0dXM9JWRcbiIsIHVyYiwgdXJiLT5zdGF0dXMpOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgeworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCBzdGF0dSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzPSVkXG4iLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgdTEzMl9oY2RfY29uZmlndXJlX3NldHVwX3NlbnQodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAorICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKK3sKKyAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKKyAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisgICAgICAgIGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisgICAgICAgICAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRUlOVFIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkIHVyYj0iCisgICAgICAgICAgICAgICAgICAgICAgICAiJXAgc3RhdHVzPSVkXG4iLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfcmluZyAqcmluZyA9IGVuZHAtPnJpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdXNiX2Z0ZGlfZWxhbl9lZHNldF9pbnB1dCh1MTMyLT5wbGF0Zm9ybV9kZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPm51bWJlciwgZW5kcCwgdXJiLCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT51c2JfZW5kcCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfY29uZmlndXJlX2lucHV0X3JlY3YpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBlbmRwLT5yaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfaW5wdXQodTEzMi0+cGxhdGZvcm1fZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dXNiX2VuZHAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2NvbmZpZ3VyZV9lbXB0eV9yZWN2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHJldHZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCBzdGF0dSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzPSVkXG4iLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgdTEzMl9oY2RfZW51bWVyYXRpb25fZW1wdHlfcmVjdih2b2lkICpkYXRhLCBzdHJ1Y3QgdXJiICp1cmIsCisgICAgICAgIHU4ICpidWYsIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCisgICAgICAgIGludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQoreworICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKKyAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOworICAgICAgICB1OCBhZGRyZXNzID0gdTEzMi0+YWRkcltlbmRwLT51c2JfYWRkcl0uYWRkcmVzczsKKyAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOworICAgICAgICBkb3duKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2ZvcmdldF91cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+ZGVxdWV1ZWluZykgeworICAgICAgICAgICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVJTlRSKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZCB1cmI9IgorICAgICAgICAgICAgICAgICAgICAgICAgIiVwIHN0YXR1cz0lZFxuIiwgdXJiLCB1cmItPnN0YXR1cyk7CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRU5PREVWKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAodXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSB7CisgICAgICAgICAgICAgICAgdTEzMi0+YWRkclswXS5hZGRyZXNzID0gMDsKKyAgICAgICAgICAgICAgICBlbmRwLT51c2JfYWRkciA9IHVkZXYtPnVzYl9hZGRyOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCBzdGF0dSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzPSVkXG4iLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgdTEzMl9oY2RfZW51bWVyYXRpb25fYWRkcmVzc19zZW50KHZvaWQgKmRhdGEsIHN0cnVjdCB1cmIgKnVyYiwKKyAgICAgICAgdTggKmJ1ZiwgaW50IGxlbiwgaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwKKyAgICAgICAgaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCit7CisgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOworICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7CisgICAgICAgIGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisgICAgICAgICAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRUlOVFIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkIHVyYj0iCisgICAgICAgICAgICAgICAgICAgICAgICAiJXAgc3RhdHVzPSVkXG4iLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOworICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBlbmRwLT5yaW5nOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gdXNiX2Z0ZGlfZWxhbl9lZHNldF9pbnB1dCh1MTMyLT5wbGF0Zm9ybV9kZXYsCisgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgMCwgZW5kcC0+dXNiX2VuZHAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9lbnVtZXJhdGlvbl9lbXB0eV9yZWN2KTsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHJldHZhbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiQ0FMTEJBQ0sgY2FsbGVkIHVyYj0lcCBzdGF0dSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzPSVkXG4iLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgdTEzMl9oY2RfaW5pdGlhbF9lbXB0eV9zZW50KHZvaWQgKmRhdGEsIHN0cnVjdCB1cmIgKnVyYiwgdTggKmJ1ZiwKKyAgICAgICAgaW50IGxlbiwgaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwKKyAgICAgICAgaW50IHJlcGVhdF9udW1iZXIsIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpCit7CisgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOworICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7CisgICAgICAgIGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisgICAgICAgICAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRUlOVFIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkIHVyYj0iCisgICAgICAgICAgICAgICAgICAgICAgICAiJXAgc3RhdHVzPSVkXG4iLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIDApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgIkNBTExCQUNLIGNhbGxlZCB1cmI9JXAgc3RhdHUiCisgICAgICAgICAgICAgICAgICAgICAgICAicz0lZFxuIiwgdXJiLCB1cmItPnN0YXR1cyk7CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCB1cmItPnN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHUxMzJfaGNkX2luaXRpYWxfaW5wdXRfcmVjdih2b2lkICpkYXRhLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsCisgICAgICAgIGludCBsZW4sIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsCisgICAgICAgIGludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKQoreworICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gZGF0YTsKKyAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBlbmRwLT51MTMyOworICAgICAgICB1OCBhZGRyZXNzID0gdTEzMi0+YWRkcltlbmRwLT51c2JfYWRkcl0uYWRkcmVzczsKKyAgICAgICAgZG93bigmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICB1MTMyX2hjZF9mb3JnZXRfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPmRlcXVldWVpbmcpIHsKKyAgICAgICAgICAgICAgICBlbmRwLT5kZXF1ZXVlaW5nID0gMDsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FSU5UUik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgdXJiPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcCBzdGF0dXM9JWRcbiIsIHVyYiwgdXJiLT5zdGF0dXMpOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgLUVOT0RFVik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgeworICAgICAgICAgICAgICAgIGludCByZXR2YWw7CisgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfcmluZyAqcmluZyA9IGVuZHAtPnJpbmc7CisgICAgICAgICAgICAgICAgdTggKnUgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKyAgICAgICAgICAgICAgICB1OCAqYiA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBpbnQgTCA9IGxlbjsKKyAgICAgICAgICAgICAgICB3aGlsZSAoTC0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnUrKyA9ICpiKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCA9IGxlbjsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9mdGRpX2VsYW5fZWRzZXRfZW1wdHkodTEzMi0+cGxhdGZvcm1fZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+bnVtYmVyLCBlbmRwLCB1cmIsIGFkZHJlc3MsIGVuZHAtPnVzYl9lbmRwLCAweDMsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9pbml0aWFsX2VtcHR5X3NlbnQpOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gMCkgeworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJDQUxMQkFDSyBjYWxsZWQgdXJiPSVwIHN0YXR1IgorICAgICAgICAgICAgICAgICAgICAgICAgInM9JWRcbiIsIHVyYiwgdXJiLT5zdGF0dXMpOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgdXJiLT5zdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCB1MTMyX2hjZF9pbml0aWFsX3NldHVwX3NlbnQodm9pZCAqZGF0YSwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLAorICAgICAgICBpbnQgbGVuLCBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorICAgICAgICBpbnQgcmVwZWF0X251bWJlciwgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkKK3sKKyAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGRhdGE7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gZW5kcC0+dTEzMjsKKyAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisgICAgICAgIGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZm9yZ2V0X3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5kZXF1ZXVlaW5nKSB7CisgICAgICAgICAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCAtRUlOVFIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkIHVyYj0iCisgICAgICAgICAgICAgICAgICAgICAgICAiJXAgc3RhdHVzPSVkXG4iLCB1cmIsIHVyYi0+c3RhdHVzKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIC1FTk9ERVYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmICh1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOworICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBlbmRwLT5yaW5nOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gdXNiX2Z0ZGlfZWxhbl9lZHNldF9pbnB1dCh1MTMyLT5wbGF0Zm9ybV9kZXYsCisgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIsIGVuZHAsIHVyYiwgYWRkcmVzcywgZW5kcC0+dXNiX2VuZHAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9pbml0aWFsX2lucHV0X3JlY3YpOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gMCkgeworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJDQUxMQkFDSyBjYWxsZWQgdXJiPSVwIHN0YXR1IgorICAgICAgICAgICAgICAgICAgICAgICAgInM9JWRcbiIsIHVyYiwgdXJiLT5zdGF0dXMpOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgdXJiLT5zdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCB1MTMyX2hjZF9yaW5nX3dvcmtfc2NoZWR1bGVyKHZvaWQgKmRhdGEpOworc3RhdGljIHZvaWQgdTEzMl9oY2RfZW5kcF93b3JrX3NjaGVkdWxlcih2b2lkICpkYXRhKTsKKy8qCisqIHRoaXMgd29yayBmdW5jdGlvbiBpcyBvbmx5IGV4ZWN1dGVkIGZyb20gdGhlIHdvcmsgcXVldWUKKyoKKyovCitzdGF0aWMgdm9pZCB1MTMyX2hjZF9yaW5nX3dvcmtfc2NoZWR1bGVyKHZvaWQgKmRhdGEpCit7CisgICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSBkYXRhOworICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IHJpbmctPnUxMzI7CisgICAgICAgIGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgaWYgKHJpbmctPmluX3VzZSkgeworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9yaW5nX3B1dF9rcmVmKHUxMzIsIHJpbmcpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChyaW5nLT5jdXJyX2VuZHApIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICpsYXN0X2VuZHAgPSByaW5nLT5jdXJyX2VuZHA7CisgICAgICAgICAgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqc2NhbjsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmxhc3RfZW5kcC0+ZW5kcF9yaW5nOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgd2FrZXVwID0gMDsKKyAgICAgICAgICAgICAgICBsaXN0X2Zvcl9lYWNoKHNjYW4sIGhlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBsaXN0X2VudHJ5KHNjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAsIGVuZHBfcmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kcC0+cXVldWVfbmV4dCA9PSBlbmRwLT5xdWV1ZV9sYXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChlbmRwLT5kZWxheWVkID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZW5kcC0+amlmZmllcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9lbmRwX2NhbmNlbF93b3JrKHUxMzIsIGxhc3RfZW5kcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGxhc3RfZW5kcCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfcmluZ19wdXRfa3JlZih1MTMyLCByaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBkZWx0YSA9IGVuZHAtPmppZmZpZXMgLSBqaWZmaWVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPiB3YWtldXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FrZXVwID0gZGVsdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsYXN0X2VuZHAtPnF1ZXVlX25leHQgPT0gbGFzdF9lbmRwLT5xdWV1ZV9sYXN0KSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgobGFzdF9lbmRwLT5kZWxheWVkID09IDApIHx8IHRpbWVfYWZ0ZXJfZXEoamlmZmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfZW5kcC0+amlmZmllcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9jYW5jZWxfd29yayh1MTMyLCBsYXN0X2VuZHApOworICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgbGFzdF9lbmRwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3JpbmdfcHV0X2tyZWYodTEzMiwgcmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZGVsdGEgPSBsYXN0X2VuZHAtPmppZmZpZXMgLSBqaWZmaWVzOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhID4gd2FrZXVwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWtldXAgPSBkZWx0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHdha2V1cCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfcmluZ19yZXF1ZXVlX3dvcmsodTEzMiwgcmluZywgd2FrZXVwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3JpbmdfcHV0X2tyZWYodTEzMiwgcmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9yaW5nX3B1dF9rcmVmKHUxMzIsIHJpbmcpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCB1MTMyX2hjZF9lbmRwX3dvcmtfc2NoZWR1bGVyKHZvaWQgKmRhdGEpCit7CisgICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmc7CisgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBkYXRhOworICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGVuZHAtPnUxMzI7CisgICAgICAgIGRvd24oJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgcmluZyA9IGVuZHAtPnJpbmc7CisgICAgICAgIGlmIChlbmRwLT5lZHNldF9mbHVzaCkgeworICAgICAgICAgICAgICAgIGVuZHAtPmVkc2V0X2ZsdXNoID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoZW5kcC0+ZGVxdWV1ZWluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9mdGRpX2VsYW5fZWRzZXRfZmx1c2godTEzMi0+cGxhdGZvcm1fZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5udW1iZXIsIGVuZHApOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5hY3RpdmUpIHsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAocmluZy0+aW5fdXNlKSB7CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPnF1ZXVlX25leHQgPT0gZW5kcC0+cXVldWVfbGFzdCkgeworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChlbmRwLT5waXBldHlwZSA9PSBQSVBFX0lOVEVSUlVQVCkgeworICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOworICAgICAgICAgICAgICAgIGlmIChyaW5nLT5pbl91c2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXJiICp1cmIgPSBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5xdWV1ZV9uZXh0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPmFjdGl2ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5jdXJyX2VuZHAgPSBlbmRwOworICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+aW5fdXNlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBlZHNldF9zaW5nbGUodTEzMiwgcmluZywgZW5kcCwgdXJiLCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cywgdTEzMl9oY2RfaW50ZXJydXB0X3JlY3YpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZW5kcC0+cGlwZXR5cGUgPT0gUElQRV9DT05UUk9MKSB7CisgICAgICAgICAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbZW5kcC0+dXNiX2FkZHJdLmFkZHJlc3M7CisgICAgICAgICAgICAgICAgaWYgKHJpbmctPmluX3VzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9wdXRfa3JlZih1MTMyLCBlbmRwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFkZHJlc3MgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1cmIgKnVyYiA9IGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX25leHRdOworICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+YWN0aXZlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmN1cnJfZW5kcCA9IGVuZHA7CisgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5pbl91c2UgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGVkc2V0X3NldHVwKHUxMzIsIHJpbmcsIGVuZHAsIHVyYiwgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyLCB1MTMyX2hjZF9pbml0aWFsX3NldHVwX3NlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZ2l2ZWJhY2tfdXJiKHUxMzIsIGVuZHAsIHVyYiwgcmV0dmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVuZHAtPnVzYl9hZGRyID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXJiICp1cmIgPSBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5xdWV1ZV9uZXh0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPmFjdGl2ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5jdXJyX2VuZHAgPSBlbmRwOworICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+aW5fdXNlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBlZHNldF9zZXR1cCh1MTMyLCByaW5nLCBlbmRwLCB1cmIsIDAsIDB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfZW51bWVyYXRpb25fYWRkcmVzc19zZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsIHJldHZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICB1OCBhZGRyZXNzID0gdTEzMi0+YWRkcltlbmRwLT51c2JfYWRkcl0uYWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1cmIgKnVyYiA9IGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX25leHRdOworICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+YWN0aXZlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJpbmctPmN1cnJfZW5kcCA9IGVuZHA7CisgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5pbl91c2UgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGVkc2V0X3NldHVwKHUxMzIsIHJpbmcsIGVuZHAsIHVyYiwgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyLCB1MTMyX2hjZF9jb25maWd1cmVfc2V0dXBfc2VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9naXZlYmFja191cmIodTEzMiwgZW5kcCwgdXJiLCByZXR2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZW5kcC0+aW5wdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4IGFkZHJlc3MgPSB1MTMyLT5hZGRyW2VuZHAtPnVzYl9hZGRyXS5hZGRyZXNzOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJpbmctPmluX3VzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1cmIgKnVyYiA9IGVuZHAtPnVyYl9saXN0WworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX25leHRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5hY3RpdmUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5jdXJyX2VuZHAgPSBlbmRwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nLT5pbl91c2UgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c2NoZWR1bGVyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBlZHNldF9pbnB1dCh1MTMyLCByaW5nLCBlbmRwLCB1cmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgZW5kcC0+dG9nZ2xlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9oY2RfYnVsa19pbnB1dF9yZWN2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgIC8qIG91dHB1dCBwaXBlICovCisgICAgICAgICAgICAgICAgICAgICAgICB1OCBhZGRyZXNzID0gdTEzMi0+YWRkcltlbmRwLT51c2JfYWRkcl0uYWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyaW5nLT5pbl91c2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3B1dF9rcmVmKHUxMzIsIGVuZHApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdXJiICp1cmIgPSBlbmRwLT51cmJfbGlzdFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9uZXh0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+YWN0aXZlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+Y3Vycl9lbmRwID0gZW5kcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmluZy0+aW5fdXNlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAoJnUxMzItPnNjaGVkdWxlcl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gZWRzZXRfb3V0cHV0KHUxMzIsIHJpbmcsIGVuZHAsIHVyYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBlbmRwLT50b2dnbGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2hjZF9idWxrX291dHB1dF9zZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2dpdmViYWNrX3VyYih1MTMyLCBlbmRwLCB1cmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBvcnRfcG93ZXIoc3RydWN0IHUxMzIgKnUxMzIsIGludCBwbiwgaW50IGlzX29uKQoreworICAgICAgICB1MTMyLT5wb3J0W3BuXS5wb3dlciA9IGlzX29uOworfQorCitzdGF0aWMgdm9pZCB1MTMyX3Bvd2VyKHN0cnVjdCB1MTMyICp1MTMyLCBpbnQgaXNfb24pCit7CisgICAgICAgIHN0cnVjdCB1c2JfaGNkICpoY2QgPSB1MTMyX3RvX2hjZCh1MTMyKQorICAgICAgICAgICAgICAgIDsgICAgICAgIC8qIGh1YiBpcyBpbmFjdGl2ZSB1bmxlc3MgdGhlIHBvcnQgaXMgcG93ZXJlZCAqLworICAgICAgICBpZiAoaXNfb24pIHsKKyAgICAgICAgICAgICAgICBpZiAodTEzMi0+cG93ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgdTEzMi0+cG93ZXIgPSAxOworICAgICAgICAgICAgICAgIGhjZC0+c2VsZi5jb250cm9sbGVyLT5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdTEzMi0+cG93ZXIgPSAwOworICAgICAgICAgICAgICAgIGhjZC0+c3RhdGUgPSBIQ19TVEFURV9IQUxUOworICAgICAgICAgICAgICAgIGhjZC0+c2VsZi5jb250cm9sbGVyLT5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfU1VTUEVORDsKKyAgICAgICAgfQorfQorCitzdGF0aWMgaW50IHUxMzJfcGVyaW9kaWNfcmVpbml0KHN0cnVjdCB1MTMyICp1MTMyKQoreworICAgICAgICBpbnQgcmV0dmFsOworICAgICAgICB1MzIgZmkgPSB1MTMyLT5oY19mbWludGVydmFsICYgMHgwM2ZmZjsKKyAgICAgICAgdTMyIGZpdDsKKyAgICAgICAgdTMyIGZtaW50ZXJ2YWw7CisgICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgZm1pbnRlcnZhbCwgJmZtaW50ZXJ2YWwpOworICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIGZpdCA9IGZtaW50ZXJ2YWwgJiBGSVQ7CisgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGZtaW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgKGZpdCBeIEZJVCkgfCB1MTMyLT5oY19mbWludGVydmFsKTsKKyAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBwZXJpb2RpY3N0YXJ0LAorICAgICAgICAgICAgICAgICgoOSAqZmkpIC8gMTApICYgMHgzZmZmKTsKKyAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKmhjZnMyc3RyaW5nKGludCBzdGF0ZSkKK3sKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICBjYXNlIE9IQ0lfVVNCX1JFU0VUOgorICAgICAgICAgICAgICAgIHJldHVybiAicmVzZXQiOworICAgICAgICBjYXNlIE9IQ0lfVVNCX1JFU1VNRToKKyAgICAgICAgICAgICAgICByZXR1cm4gInJlc3VtZSI7CisgICAgICAgIGNhc2UgT0hDSV9VU0JfT1BFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIm9wZXJhdGlvbmFsIjsKKyAgICAgICAgY2FzZSBPSENJX1VTQl9TVVNQRU5EOgorICAgICAgICAgICAgICAgIHJldHVybiAic3VzcGVuZCI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICI/IjsKK30KKworc3RhdGljIGludCB1MTMyX3VzYl9yZXNldChzdHJ1Y3QgdTEzMiAqdTEzMikKK3sKKyAgICAgICAgaW50IHJldHZhbDsKKyAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmdTEzMi0+aGNfY29udHJvbCk7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgdTEzMi0+aGNfY29udHJvbCAmPSBPSENJX0NUUkxfUldDOworICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBjb250cm9sLCB1MTMyLT5oY19jb250cm9sKTsKKyAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1MTMyX2luaXQoc3RydWN0IHUxMzIgKnUxMzIpCit7CisgICAgICAgIGludCByZXR2YWw7CisgICAgICAgIHUzMiBjb250cm9sOworICAgICAgICB1MTMyX2Rpc2FibGUodTEzMik7CisgICAgICAgIHUxMzItPm5leHRfc3RhdGVjaGFuZ2UgPQorICAgICAgICAgICAgICAgIGppZmZpZXM7IC8qIFNNTSBvd25zIHRoZSBIQz8gbm90IGZvciBsb25nISAqLyAgeworICAgICAgICAgICAgICAgIHUzMiBjb250cm9sOworICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY29udHJvbCwgJmNvbnRyb2wpOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgICAgIGlmIChjb250cm9sICYgT0hDSV9DVFJMX0lSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1MzIgdGVtcCA9IDUwOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgaW50cmVuYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0hDSV9JTlRSX09DKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbV9ieXRlKHUxMzIsIGNtZHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0hDSV9PQ1IpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICBjaGVjazp7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udHJvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sICYgT0hDSV9DVFJMX0lSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zbGVlcCgxMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgtLXRlbXAgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiVVNCICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIQyB0YWtlb3ZlciBmYWlsZWQhKEJJT1MvU01NIGIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidWcpIGNvbnRyb2w9JTA4WFxuIiwgY29udHJvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNoZWNrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl91c2JfcmVzZXQodTEzMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGludHJkaXNhYmxlLCBPSENJX0lOVFJfTUlFKTsKKyAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNvbnRyb2wsICZjb250cm9sKTsKKyAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICBpZiAodTEzMi0+bnVtX3BvcnRzID09IDApIHsKKyAgICAgICAgICAgICAgICB1MzIgcmhfYSA9IC0xOworICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgcm9vdGh1Yi5hLCAmcmhfYSk7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAgICAgdTEzMi0+bnVtX3BvcnRzID0gcmhfYSAmIFJIX0FfTkRQOworICAgICAgICAgICAgICAgIHJldHZhbCA9IHJlYWRfcm9vdGh1Yl9pbmZvKHUxMzIpOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisgICAgICAgIGlmICh1MTMyLT5udW1fcG9ydHMgPiBNQVhfVTEzMl9QT1JUUykgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworfQorCisKKy8qIFN0YXJ0IGFuIE9IQ0kgY29udHJvbGxlciwgc2V0IHRoZSBCVVMgb3BlcmF0aW9uYWwKKyogcmVzZXRzIFVTQiBhbmQgY29udHJvbGxlcgorKiBlbmFibGUgaW50ZXJydXB0cworKi8KK3N0YXRpYyBpbnQgdTEzMl9ydW4oc3RydWN0IHUxMzIgKnUxMzIpCit7CisgICAgICAgIGludCByZXR2YWw7CisgICAgICAgIHUzMiBjb250cm9sOworICAgICAgICB1MzIgc3RhdHVzOworICAgICAgICB1MzIgZm1pbnRlcnZhbDsKKyAgICAgICAgdTMyIHBlcmlvZGljc3RhcnQ7CisgICAgICAgIHUzMiBjbWRzdGF0dXM7CisgICAgICAgIHUzMiByb290aHViX2E7CisgICAgICAgIGludCBtYXNrID0gT0hDSV9JTlRSX0lOSVQ7CisgICAgICAgIGludCBmaXJzdCA9IHUxMzItPmhjX2ZtaW50ZXJ2YWwgPT0gMDsKKyAgICAgICAgaW50IHNsZWVwX3RpbWUgPSAwOworICAgICAgICBpbnQgcmVzZXRfdGltZW91dCA9IDMwOyAgICAgICAgLyogLi4uIGFsbG93IGV4dHJhIHRpbWUgKi8KKyAgICAgICAgdTEzMl9kaXNhYmxlKHUxMzIpOworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICB1MzIgdGVtcDsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGZtaW50ZXJ2YWwsICZ0ZW1wKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgICAgICB1MTMyLT5oY19mbWludGVydmFsID0gdGVtcCAmIDB4M2ZmZjsKKyAgICAgICAgICAgICAgICBpZiAodTEzMi0+aGNfZm1pbnRlcnZhbCAhPSBGSSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1MTMyLT5oY19mbWludGVydmFsIHw9IEZTTVAodTEzMi0+aGNfZm1pbnRlcnZhbCkgPDwgMTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmdTEzMi0+aGNfY29udHJvbCk7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgZGV2X2luZm8oJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAicmVzZXR0aW5nIGZyb20gc3RhdGUgJyVzJywgY29udHJvbCAiCisgICAgICAgICAgICAgICAgIj0gJTA4WFxuIiwgaGNmczJzdHJpbmcodTEzMi0+aGNfY29udHJvbCAmIE9IQ0lfQ1RSTF9IQ0ZTKSwKKyAgICAgICAgICAgICAgICB1MTMyLT5oY19jb250cm9sKTsKKyAgICAgICAgc3dpdGNoICh1MTMyLT5oY19jb250cm9sICYgT0hDSV9DVFJMX0hDRlMpIHsKKyAgICAgICAgY2FzZSBPSENJX1VTQl9PUEVSOgorICAgICAgICAgICAgICAgIHNsZWVwX3RpbWUgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9IQ0lfVVNCX1NVU1BFTkQ6CisgICAgICAgIGNhc2UgT0hDSV9VU0JfUkVTVU1FOgorICAgICAgICAgICAgICAgIHUxMzItPmhjX2NvbnRyb2wgJj0gT0hDSV9DVFJMX1JXQzsKKyAgICAgICAgICAgICAgICB1MTMyLT5oY19jb250cm9sIHw9IE9IQ0lfVVNCX1JFU1VNRTsKKyAgICAgICAgICAgICAgICBzbGVlcF90aW1lID0gMTA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdTEzMi0+aGNfY29udHJvbCAmPSBPSENJX0NUUkxfUldDOworICAgICAgICAgICAgICAgIHUxMzItPmhjX2NvbnRyb2wgfD0gT0hDSV9VU0JfUkVTRVQ7CisgICAgICAgICAgICAgICAgc2xlZXBfdGltZSA9IDUwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGNvbnRyb2wsIHUxMzItPmhjX2NvbnRyb2wpOworICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY29udHJvbCwgJmNvbnRyb2wpOworICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIG1zbGVlcChzbGVlcF90aW1lKTsKKyAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLmEsICZyb290aHViX2EpOworICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIGlmICghKHJvb3RodWJfYSAmIFJIX0FfTlBTKSkgeworICAgICAgICAgICAgICAgIGludCB0ZW1wOyAgICAgICAgLyogcG93ZXIgZG93biBlYWNoIHBvcnQgKi8KKyAgICAgICAgICAgICAgICBmb3IgKHRlbXAgPSAwOyB0ZW1wIDwgdTEzMi0+bnVtX3BvcnRzOyB0ZW1wKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RodWIucG9ydHN0YXR1c1t0ZW1wXSwgUkhfUFNfTFNEQSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNvbnRyb2wsICZjb250cm9sKTsKKyAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgcmV0cnk6cmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjbWRzdGF0dXMsICZzdGF0dXMpOworICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtX2J5dGUodTEzMiwgY21kc3RhdHVzLCBPSENJX0hDUik7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgIGV4dHJhOnsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNtZHN0YXR1cywgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAgICAgaWYgKDAgIT0gKHN0YXR1cyAmIE9IQ0lfSENSKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tcmVzZXRfdGltZW91dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiVVNCIEhDIHJlc2V0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdGltZWQgb3V0IVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNsZWVwKDUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4dHJhOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodTEzMi0+ZmxhZ3MgJiBPSENJX1FVSVJLX0lOSVRSRVNFVCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGNvbnRyb2wsIHUxMzItPmhjX2NvbnRyb2wpOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgY29udHJvbCwgJmNvbnRyb2wpOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGVkX2NvbnRyb2xoZWFkLCAweDAwMDAwMDAwKTsKKyAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCBlZF9idWxraGVhZCwgMHgxMTAwMDAwMCk7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgaGNjYSwgMHgwMDAwMDAwMCk7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgcmV0dmFsID0gdTEzMl9wZXJpb2RpY19yZWluaXQodTEzMik7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBmbWludGVydmFsLCAmZm1pbnRlcnZhbCk7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBwZXJpb2RpY3N0YXJ0LCAmcGVyaW9kaWNzdGFydCk7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgaWYgKDAgPT0gKGZtaW50ZXJ2YWwgJiAweDNmZmYwMDAwKSB8fCAwID09IHBlcmlvZGljc3RhcnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoISh1MTMyLT5mbGFncyAmIE9IQ0lfUVVJUktfSU5JVFJFU0VUKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdTEzMi0+ZmxhZ3MgfD0gT0hDSV9RVUlSS19JTklUUkVTRVQ7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJpbml0IGVyciglMDh4ICUwNHgpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iLCBmbWludGVydmFsLCBwZXJpb2RpY3N0YXJ0KTsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGNvbnRyb2xsZXIgb3BlcmF0aW9ucyAqLworICAgICAgICB1MTMyLT5oY19jb250cm9sICY9IE9IQ0lfQ1RSTF9SV0M7CisgICAgICAgIHUxMzItPmhjX2NvbnRyb2wgfD0gT0hDSV9DT05UUk9MX0lOSVQgfCBPSENJX0NUUkxfQkxFIHwgT0hDSV9VU0JfT1BFUjsKKyAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgY29udHJvbCwgdTEzMi0+aGNfY29udHJvbCk7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW1fYnl0ZSh1MTMyLCBjbWRzdGF0dXMsIE9IQ0lfQkxGKTsKKyAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNtZHN0YXR1cywgJmNtZHN0YXR1cyk7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBjb250cm9sLCAmY29udHJvbCk7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgdTEzMl90b19oY2QodTEzMiktPnN0YXRlID0gSENfU1RBVEVfUlVOTklORzsKKyAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgcm9vdGh1Yi5zdGF0dXMsIFJIX0hTX0RSV0UpOworICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGludHJzdGF0dXMsIG1hc2spOworICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIGludHJkaXNhYmxlLAorICAgICAgICAgICAgICAgIE9IQ0lfSU5UUl9NSUUgfCBPSENJX0lOVFJfT0MgfCBPSENJX0lOVFJfUkhTQyB8IE9IQ0lfSU5UUl9GTk8gfAorICAgICAgICAgICAgICAgIE9IQ0lfSU5UUl9VRSB8IE9IQ0lfSU5UUl9SRCB8IE9IQ0lfSU5UUl9TRiB8IE9IQ0lfSU5UUl9XREggfAorICAgICAgICAgICAgICAgIE9IQ0lfSU5UUl9TTyk7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsgICAgICAgIC8qIGhhbmRsZSByb290IGh1YiBpbml0IHF1aXJrcyAuLi4gKi8KKyAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLmEsICZyb290aHViX2EpOworICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIHJvb3RodWJfYSAmPSB+KFJIX0FfUFNNIHwgUkhfQV9PQ1BNKTsKKyAgICAgICAgaWYgKHUxMzItPmZsYWdzICYgT0hDSV9RVUlSS19TVVBFUklPKSB7CisgICAgICAgICAgICAgICAgcm9vdGh1Yl9hIHw9IFJIX0FfTk9DUDsKKyAgICAgICAgICAgICAgICByb290aHViX2EgJj0gfihSSF9BX1BPVFBHVCB8IFJIX0FfTlBTKTsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCByb290aHViLmEsIHJvb3RodWJfYSk7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0gZWxzZSBpZiAoKHUxMzItPmZsYWdzICYgT0hDSV9RVUlSS19BTUQ3NTYpIHx8IGRpc3RydXN0X2Zpcm13YXJlKSB7CisgICAgICAgICAgICAgICAgcm9vdGh1Yl9hIHw9IFJIX0FfTlBTOworICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHJvb3RodWIuYSwgcm9vdGh1Yl9hKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCByb290aHViLnN0YXR1cywgUkhfSFNfTFBTQyk7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwgcm9vdGh1Yi5iLAorICAgICAgICAgICAgICAgIChyb290aHViX2EgJiBSSF9BX05QUykgPyAwIDogUkhfQl9QUENNKTsKKyAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIGNvbnRyb2wsICZjb250cm9sKTsKKyAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICBtZGVsYXkoKHJvb3RodWJfYSA+PiAyMykgJiAweDFmZSk7CisgICAgICAgIHUxMzJfdG9faGNkKHUxMzIpLT5zdGF0ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1MTMyX2hjZF9zdG9wKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhjZD0lcCBpcyBiZWluZyByZW1vdiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJlZFxuIiwgaGNkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkb3duKCZ1MTMyLT5zd19sb2NrKTsKKyAgICAgICAgICAgICAgICBtc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICB1MTMyX3Bvd2VyKHUxMzIsIDApOworICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zd19sb2NrKTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgaW50IHUxMzJfaGNkX3N0YXJ0KHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOworICAgICAgICB9IGVsc2UgaWYgKGhjZC0+c2VsZi5jb250cm9sbGVyKSB7CisgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRvX3BsYXRmb3JtX2RldmljZShoY2QtPnNlbGYuY29udHJvbGxlcik7CisgICAgICAgICAgICAgICAgdTE2IHZlbmRvciA9ICgoc3RydWN0IHUxMzJfcGxhdGZvcm1fZGF0YSAqKQorICAgICAgICAgICAgICAgICAgICAgICAgKHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKSktPnZlbmRvcjsKKyAgICAgICAgICAgICAgICB1MTYgZGV2aWNlID0gKChzdHJ1Y3QgdTEzMl9wbGF0Zm9ybV9kYXRhICopCisgICAgICAgICAgICAgICAgICAgICAgICAocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpKS0+ZGV2aWNlOworICAgICAgICAgICAgICAgIGRvd24oJnUxMzItPnN3X2xvY2spOworICAgICAgICAgICAgICAgIG1zbGVlcCgxMCk7CisgICAgICAgICAgICAgICAgaWYgKHZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FNRCAmJiBkZXZpY2UgPT0gMHg3NDBjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1MTMyLT5mbGFncyA9IE9IQ0lfUVVJUktfQU1ENzU2OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVuZG9yID09IFBDSV9WRU5ET1JfSURfT1BUSSAmJiBkZXZpY2UgPT0gMHhjODYxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgIldBUk5JTkc6IE9QVGkgd29ya2FyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3VuZHMgdW5hdmFpbGFibGVcbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmVuZG9yID09IFBDSV9WRU5ET1JfSURfQ09NUEFRICYmIGRldmljZSA9PSAweGEwZjgpCisgICAgICAgICAgICAgICAgICAgICAgICB1MTMyLT5mbGFncyB8PSBPSENJX1FVSVJLX1pGTUlDUk87CisgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9ydW4odTEzMik7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9kaXNhYmxlKHUxMzIpOworICAgICAgICAgICAgICAgICAgICAgICAgdTEzMi0+Z29pbmcgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICB1cCgmdTEzMi0+c3dfbG9jayk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgInBsYXRmb3JtX2RldmljZSBtaXNzaW5nXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfQorfQorCitzdGF0aWMgaW50IHUxMzJfaGNkX3Jlc2V0KHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCByZXR2YWw7CisgICAgICAgICAgICAgICAgZG93bigmdTEzMi0+c3dfbG9jayk7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9pbml0KHUxMzIpOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZGlzYWJsZSh1MTMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxMzItPmdvaW5nID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnN3X2xvY2spOworICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KK30KKworc3RhdGljIGludCBjcmVhdGVfZW5kcG9pbnRfYW5kX3F1ZXVlX2ludChzdHJ1Y3QgdTEzMiAqdTEzMiwKKyAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiwgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICpoZXAsIHN0cnVjdCB1cmIgKnVyYiwKKyAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHU4IHVzYl9hZGRyLCB1OCB1c2JfZW5kcCwgdTggYWRkcmVzcywKKyAgICAgICAgZ2ZwX3QgbWVtX2ZsYWdzKQoreworICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nOworICAgICAgICB1bnNpZ25lZCBsb25nIGlycXM7CisgICAgICAgIHU4IGVuZHBfbnVtYmVyID0gKyt1MTMyLT5udW1fZW5kcG9pbnRzOworICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gaGVwLT5oY3ByaXYgPSB1MTMyLT5lbmRwW2VuZHBfbnVtYmVyIC0gMV0gPQorICAgICAgICAgICAgICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1MTMyX2VuZHApLCBtZW1fZmxhZ3MpOworICAgICAgICBpZiAoIWVuZHApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgfQorICAgICAgICBJTklUX1dPUksoJmVuZHAtPnNjaGVkdWxlciwgdTEzMl9oY2RfZW5kcF93b3JrX3NjaGVkdWxlciwgKHZvaWQgKillbmRwKTsKKyAgICAgICAgc3Bpbl9sb2NrX2luaXQoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2spOworICAgICAgICBJTklUX0xJU1RfSEVBRCgmZW5kcC0+dXJiX21vcmUpOworICAgICAgICByaW5nID0gZW5kcC0+cmluZyA9ICZ1MTMyLT5yaW5nWzBdOworICAgICAgICBpZiAocmluZy0+Y3Vycl9lbmRwKSB7CisgICAgICAgICAgICAgICAgbGlzdF9hZGRfdGFpbCgmZW5kcC0+ZW5kcF9yaW5nLCAmcmluZy0+Y3Vycl9lbmRwLT5lbmRwX3JpbmcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIElOSVRfTElTVF9IRUFEKCZlbmRwLT5lbmRwX3JpbmcpOworICAgICAgICAgICAgICAgIHJpbmctPmN1cnJfZW5kcCA9IGVuZHA7CisgICAgICAgIH0KKyAgICAgICAgcmluZy0+bGVuZ3RoICs9IDE7CisgICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAwOworICAgICAgICBlbmRwLT5lZHNldF9mbHVzaCA9IDA7CisgICAgICAgIGVuZHAtPmFjdGl2ZSA9IDA7CisgICAgICAgIGVuZHAtPmRlbGF5ZWQgPSAwOworICAgICAgICBlbmRwLT5lbmRwX251bWJlciA9IGVuZHBfbnVtYmVyOworICAgICAgICBlbmRwLT51MTMyID0gdTEzMjsKKyAgICAgICAgZW5kcC0+aGVwID0gaGVwOworICAgICAgICBlbmRwLT5waXBldHlwZSA9IHVzYl9waXBldHlwZSh1cmItPnBpcGUpOworICAgICAgICB1MTMyX2VuZHBfaW5pdF9rcmVmKHUxMzIsIGVuZHApOworICAgICAgICBpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7CisgICAgICAgICAgICAgICAgZW5kcC0+dG9nZ2xlX2JpdHMgPSAweDI7CisgICAgICAgICAgICAgICAgdXNiX3NldHRvZ2dsZSh1ZGV2LT51c2JfZGV2aWNlLCB1c2JfZW5kcCwgMCwgMCk7CisgICAgICAgICAgICAgICAgZW5kcC0+aW5wdXQgPSAxOworICAgICAgICAgICAgICAgIGVuZHAtPm91dHB1dCA9IDA7CisgICAgICAgICAgICAgICAgdWRldi0+ZW5kcF9udW1iZXJfaW5bdXNiX2VuZHBdID0gZW5kcF9udW1iZXI7CisgICAgICAgICAgICAgICAgdTEzMl91ZGV2X2dldF9rcmVmKHUxMzIsIHVkZXYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOworICAgICAgICAgICAgICAgIHVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgdXNiX2VuZHAsIDEsIDApOworICAgICAgICAgICAgICAgIGVuZHAtPmlucHV0ID0gMDsKKyAgICAgICAgICAgICAgICBlbmRwLT5vdXRwdXQgPSAxOworICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX291dFt1c2JfZW5kcF0gPSBlbmRwX251bWJlcjsKKyAgICAgICAgICAgICAgICB1MTMyX3VkZXZfZ2V0X2tyZWYodTEzMiwgdWRldik7CisgICAgICAgIH0KKyAgICAgICAgdXJiLT5oY3ByaXYgPSB1MTMyOworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisgICAgICAgIGVuZHAtPmRlbGF5ZWQgPSAxOworICAgICAgICBlbmRwLT5qaWZmaWVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModXJiLT5pbnRlcnZhbCk7CisgICAgICAgIGVuZHAtPnVkZXZfbnVtYmVyID0gYWRkcmVzczsKKyAgICAgICAgZW5kcC0+dXNiX2FkZHIgPSB1c2JfYWRkcjsKKyAgICAgICAgZW5kcC0+dXNiX2VuZHAgPSB1c2JfZW5kcDsKKyAgICAgICAgZW5kcC0+cXVldWVfc2l6ZSA9IDE7CisgICAgICAgIGVuZHAtPnF1ZXVlX2xhc3QgPSAwOworICAgICAgICBlbmRwLT5xdWV1ZV9uZXh0ID0gMDsKKyAgICAgICAgZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYgZW5kcC0+cXVldWVfbGFzdCsrXSA9IHVyYjsKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisgICAgICAgIHUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGVuZHAsIG1zZWNzX3RvX2ppZmZpZXModXJiLT5pbnRlcnZhbCkpOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWV1ZV9pbnRfb25fb2xkX2VuZHBvaW50KHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2LAorICAgICAgICBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmhlcCwgc3RydWN0IHVyYiAqdXJiLAorICAgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2Rldiwgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCwgdTggdXNiX2FkZHIsCisgICAgICAgIHU4IHVzYl9lbmRwLCB1OCBhZGRyZXNzKQoreworICAgICAgICB1cmItPmhjcHJpdiA9IHUxMzI7CisgICAgICAgIGVuZHAtPmRlbGF5ZWQgPSAxOworICAgICAgICBlbmRwLT5qaWZmaWVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModXJiLT5pbnRlcnZhbCk7CisgICAgICAgIGlmIChlbmRwLT5xdWV1ZV9zaXplKysgPCBFTkRQX1FVRVVFX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl91cmJxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9BVE9NSUMpOworICAgICAgICAgICAgICAgIGlmICh1cmJxID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgLT0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZ1cmJxLT51cmJfbW9yZSwgJmVuZHAtPnVyYl9tb3JlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyYnEtPnVyYiA9IHVyYjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX2VuZHBvaW50X2FuZF9xdWV1ZV9idWxrKHN0cnVjdCB1MTMyICp1MTMyLAorICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2LCBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmhlcCwgc3RydWN0IHVyYiAqdXJiLAorICAgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiwgdTggdXNiX2FkZHIsIHU4IHVzYl9lbmRwLCB1OCBhZGRyZXNzLAorICAgICAgICBnZnBfdCBtZW1fZmxhZ3MpCit7CisgICAgICAgIGludCByaW5nX251bWJlcjsKKyAgICAgICAgc3RydWN0IHUxMzJfcmluZyAqcmluZzsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBpcnFzOworICAgICAgICB1OCBlbmRwX251bWJlciA9ICsrdTEzMi0+bnVtX2VuZHBvaW50czsKKyAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGhlcC0+aGNwcml2ID0gdTEzMi0+ZW5kcFtlbmRwX251bWJlciAtIDFdID0KKyAgICAgICAgICAgICAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl9lbmRwKSwgbWVtX2ZsYWdzKTsKKyAgICAgICAgaWYgKCFlbmRwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKyAgICAgICAgSU5JVF9XT1JLKCZlbmRwLT5zY2hlZHVsZXIsIHUxMzJfaGNkX2VuZHBfd29ya19zY2hlZHVsZXIsICh2b2lkICopZW5kcCk7CisgICAgICAgIHNwaW5fbG9ja19pbml0KCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrKTsKKyAgICAgICAgSU5JVF9MSVNUX0hFQUQoJmVuZHAtPnVyYl9tb3JlKTsKKyAgICAgICAgZW5kcC0+ZGVxdWV1ZWluZyA9IDA7CisgICAgICAgIGVuZHAtPmVkc2V0X2ZsdXNoID0gMDsKKyAgICAgICAgZW5kcC0+YWN0aXZlID0gMDsKKyAgICAgICAgZW5kcC0+ZGVsYXllZCA9IDA7CisgICAgICAgIGVuZHAtPmVuZHBfbnVtYmVyID0gZW5kcF9udW1iZXI7CisgICAgICAgIGVuZHAtPnUxMzIgPSB1MTMyOworICAgICAgICBlbmRwLT5oZXAgPSBoZXA7CisgICAgICAgIGVuZHAtPnBpcGV0eXBlID0gdXNiX3BpcGV0eXBlKHVyYi0+cGlwZSk7CisgICAgICAgIHUxMzJfZW5kcF9pbml0X2tyZWYodTEzMiwgZW5kcCk7CisgICAgICAgIGlmICh1c2JfcGlwZWluKHVyYi0+cGlwZSkpIHsKKyAgICAgICAgICAgICAgICBlbmRwLT50b2dnbGVfYml0cyA9IDB4MjsKKyAgICAgICAgICAgICAgICB1c2Jfc2V0dG9nZ2xlKHVkZXYtPnVzYl9kZXZpY2UsIHVzYl9lbmRwLCAwLCAwKTsKKyAgICAgICAgICAgICAgICByaW5nX251bWJlciA9IDM7CisgICAgICAgICAgICAgICAgZW5kcC0+aW5wdXQgPSAxOworICAgICAgICAgICAgICAgIGVuZHAtPm91dHB1dCA9IDA7CisgICAgICAgICAgICAgICAgdWRldi0+ZW5kcF9udW1iZXJfaW5bdXNiX2VuZHBdID0gZW5kcF9udW1iZXI7CisgICAgICAgICAgICAgICAgdTEzMl91ZGV2X2dldF9rcmVmKHUxMzIsIHVkZXYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVuZHAtPnRvZ2dsZV9iaXRzID0gMHgyOworICAgICAgICAgICAgICAgIHVzYl9zZXR0b2dnbGUodWRldi0+dXNiX2RldmljZSwgdXNiX2VuZHAsIDEsIDApOworICAgICAgICAgICAgICAgIHJpbmdfbnVtYmVyID0gMjsKKyAgICAgICAgICAgICAgICBlbmRwLT5pbnB1dCA9IDA7CisgICAgICAgICAgICAgICAgZW5kcC0+b3V0cHV0ID0gMTsKKyAgICAgICAgICAgICAgICB1ZGV2LT5lbmRwX251bWJlcl9vdXRbdXNiX2VuZHBdID0gZW5kcF9udW1iZXI7CisgICAgICAgICAgICAgICAgdTEzMl91ZGV2X2dldF9rcmVmKHUxMzIsIHVkZXYpOworICAgICAgICB9CisgICAgICAgIHJpbmcgPSBlbmRwLT5yaW5nID0gJnUxMzItPnJpbmdbcmluZ19udW1iZXIgLSAxXTsKKyAgICAgICAgaWYgKHJpbmctPmN1cnJfZW5kcCkgeworICAgICAgICAgICAgICAgIGxpc3RfYWRkX3RhaWwoJmVuZHAtPmVuZHBfcmluZywgJnJpbmctPmN1cnJfZW5kcC0+ZW5kcF9yaW5nKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBJTklUX0xJU1RfSEVBRCgmZW5kcC0+ZW5kcF9yaW5nKTsKKyAgICAgICAgICAgICAgICByaW5nLT5jdXJyX2VuZHAgPSBlbmRwOworICAgICAgICB9CisgICAgICAgIHJpbmctPmxlbmd0aCArPSAxOworICAgICAgICB1cmItPmhjcHJpdiA9IHUxMzI7CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKKyAgICAgICAgZW5kcC0+dWRldl9udW1iZXIgPSBhZGRyZXNzOworICAgICAgICBlbmRwLT51c2JfYWRkciA9IHVzYl9hZGRyOworICAgICAgICBlbmRwLT51c2JfZW5kcCA9IHVzYl9lbmRwOworICAgICAgICBlbmRwLT5xdWV1ZV9zaXplID0gMTsKKyAgICAgICAgZW5kcC0+cXVldWVfbGFzdCA9IDA7CisgICAgICAgIGVuZHAtPnF1ZXVlX25leHQgPSAwOworICAgICAgICBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9sYXN0KytdID0gdXJiOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKKyAgICAgICAgdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgMCk7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF1ZXVlX2J1bGtfb25fb2xkX2VuZHBvaW50KHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2LAorICAgICAgICAgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICpoZXAsIHN0cnVjdCB1cmIgKnVyYiwKKyAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsIHU4IHVzYl9hZGRyLAorICAgICAgICB1OCB1c2JfZW5kcCwgdTggYWRkcmVzcykKK3sKKyAgICAgICAgdXJiLT5oY3ByaXYgPSB1MTMyOworICAgICAgICBpZiAoZW5kcC0+cXVldWVfc2l6ZSsrIDwgRU5EUF9RVUVVRV9TSVpFKSB7CisgICAgICAgICAgICAgICAgZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYgZW5kcC0+cXVldWVfbGFzdCsrXSA9IHVyYjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHUxMzJfdXJicSksCisgICAgICAgICAgICAgICAgICAgICAgICBHRlBfQVRPTUlDKTsKKyAgICAgICAgICAgICAgICBpZiAodXJicSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5xdWV1ZV9zaXplIC09IDE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9hZGRfdGFpbCgmdXJicS0+dXJiX21vcmUsICZlbmRwLT51cmJfbW9yZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cmJxLT51cmIgPSB1cmI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9lbmRwb2ludF9hbmRfcXVldWVfY29udHJvbChzdHJ1Y3QgdTEzMiAqdTEzMiwKKyAgICAgICAgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICpoZXAsIHN0cnVjdCB1cmIgKnVyYiwKKyAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHU4IHVzYl9hZGRyLCB1OCB1c2JfZW5kcCwKKyAgICAgICAgZ2ZwX3QgbWVtX2ZsYWdzKQoreworICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nOworICAgICAgICB1OCBlbmRwX251bWJlciA9ICsrdTEzMi0+bnVtX2VuZHBvaW50czsKKyAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGhlcC0+aGNwcml2ID0gdTEzMi0+ZW5kcFtlbmRwX251bWJlciAtIDFdID0KKyAgICAgICAgICAgICAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl9lbmRwKSwgbWVtX2ZsYWdzKTsKKyAgICAgICAgaWYgKCFlbmRwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKyAgICAgICAgSU5JVF9XT1JLKCZlbmRwLT5zY2hlZHVsZXIsIHUxMzJfaGNkX2VuZHBfd29ya19zY2hlZHVsZXIsICh2b2lkICopZW5kcCk7CisgICAgICAgIHNwaW5fbG9ja19pbml0KCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrKTsKKyAgICAgICAgSU5JVF9MSVNUX0hFQUQoJmVuZHAtPnVyYl9tb3JlKTsKKyAgICAgICAgcmluZyA9IGVuZHAtPnJpbmcgPSAmdTEzMi0+cmluZ1swXTsKKyAgICAgICAgaWYgKHJpbmctPmN1cnJfZW5kcCkgeworICAgICAgICAgICAgICAgIGxpc3RfYWRkX3RhaWwoJmVuZHAtPmVuZHBfcmluZywgJnJpbmctPmN1cnJfZW5kcC0+ZW5kcF9yaW5nKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBJTklUX0xJU1RfSEVBRCgmZW5kcC0+ZW5kcF9yaW5nKTsKKyAgICAgICAgICAgICAgICByaW5nLT5jdXJyX2VuZHAgPSBlbmRwOworICAgICAgICB9CisgICAgICAgIHJpbmctPmxlbmd0aCArPSAxOworICAgICAgICBlbmRwLT5kZXF1ZXVlaW5nID0gMDsKKyAgICAgICAgZW5kcC0+ZWRzZXRfZmx1c2ggPSAwOworICAgICAgICBlbmRwLT5hY3RpdmUgPSAwOworICAgICAgICBlbmRwLT5kZWxheWVkID0gMDsKKyAgICAgICAgZW5kcC0+ZW5kcF9udW1iZXIgPSBlbmRwX251bWJlcjsKKyAgICAgICAgZW5kcC0+dTEzMiA9IHUxMzI7CisgICAgICAgIGVuZHAtPmhlcCA9IGhlcDsKKyAgICAgICAgdTEzMl9lbmRwX2luaXRfa3JlZih1MTMyLCBlbmRwKTsKKyAgICAgICAgdTEzMl9lbmRwX2dldF9rcmVmKHUxMzIsIGVuZHApOworICAgICAgICBpZiAodXNiX2FkZHIgPT0gMCkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgaXJxczsKKyAgICAgICAgICAgICAgICB1OCBhZGRyZXNzID0gdTEzMi0+YWRkclt1c2JfYWRkcl0uYWRkcmVzczsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107CisgICAgICAgICAgICAgICAgZW5kcC0+dWRldl9udW1iZXIgPSBhZGRyZXNzOworICAgICAgICAgICAgICAgIGVuZHAtPnVzYl9hZGRyID0gdXNiX2FkZHI7CisgICAgICAgICAgICAgICAgZW5kcC0+dXNiX2VuZHAgPSB1c2JfZW5kcDsKKyAgICAgICAgICAgICAgICBlbmRwLT5pbnB1dCA9IDE7CisgICAgICAgICAgICAgICAgZW5kcC0+b3V0cHV0ID0gMTsKKyAgICAgICAgICAgICAgICBlbmRwLT5waXBldHlwZSA9IHVzYl9waXBldHlwZSh1cmItPnBpcGUpOworICAgICAgICAgICAgICAgIHUxMzJfdWRldl9pbml0X2tyZWYodTEzMiwgdWRldik7CisgICAgICAgICAgICAgICAgdTEzMl91ZGV2X2dldF9rcmVmKHUxMzIsIHVkZXYpOworICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOworICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX291dFt1c2JfZW5kcF0gPSBlbmRwX251bWJlcjsKKyAgICAgICAgICAgICAgICB1cmItPmhjcHJpdiA9IHUxMzI7CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgPSAxOworICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX2xhc3QgPSAwOworICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX25leHQgPSAwOworICAgICAgICAgICAgICAgIGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qKHVzYl9hZGRyID4gMCkgKi8KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGlycXM7CisgICAgICAgICAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbdXNiX2FkZHJdLmFkZHJlc3M7CisgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOworICAgICAgICAgICAgICAgIGVuZHAtPnVkZXZfbnVtYmVyID0gYWRkcmVzczsKKyAgICAgICAgICAgICAgICBlbmRwLT51c2JfYWRkciA9IHVzYl9hZGRyOworICAgICAgICAgICAgICAgIGVuZHAtPnVzYl9lbmRwID0gdXNiX2VuZHA7CisgICAgICAgICAgICAgICAgZW5kcC0+aW5wdXQgPSAxOworICAgICAgICAgICAgICAgIGVuZHAtPm91dHB1dCA9IDE7CisgICAgICAgICAgICAgICAgZW5kcC0+cGlwZXR5cGUgPSB1c2JfcGlwZXR5cGUodXJiLT5waXBlKTsKKyAgICAgICAgICAgICAgICB1MTMyX3VkZXZfZ2V0X2tyZWYodTEzMiwgdWRldik7CisgICAgICAgICAgICAgICAgdWRldi0+ZW51bWVyYXRpb24gPSAyOworICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX2luW3VzYl9lbmRwXSA9IGVuZHBfbnVtYmVyOworICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX291dFt1c2JfZW5kcF0gPSBlbmRwX251bWJlcjsKKyAgICAgICAgICAgICAgICB1cmItPmhjcHJpdiA9IHUxMzI7CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgPSAxOworICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX2xhc3QgPSAwOworICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX25leHQgPSAwOworICAgICAgICAgICAgICAgIGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KK30KKworc3RhdGljIGludCBxdWV1ZV9jb250cm9sX29uX29sZF9lbmRwb2ludChzdHJ1Y3QgdTEzMiAqdTEzMiwKKyAgICAgICAgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICpoZXAsIHN0cnVjdCB1cmIgKnVyYiwKKyAgICAgICAgc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYsIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAsIHU4IHVzYl9hZGRyLAorICAgICAgICB1OCB1c2JfZW5kcCkKK3sKKyAgICAgICAgaWYgKHVzYl9hZGRyID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAodXNiX3BpcGVpbih1cmItPnBpcGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cmItPmhjcHJpdiA9IHUxMzI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kcC0+cXVldWVfc2l6ZSsrIDwgRU5EUF9RVUVVRV9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+cXVldWVfbGFzdCsrXSA9IHVyYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1MTMyX3VyYnEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9BVE9NSUMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJicSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+cXVldWVfc2l6ZSAtPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfYWRkX3RhaWwoJnVyYnEtPnVyYl9tb3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuZHAtPnVyYl9tb3JlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmJxLT51cmIgPSB1cmI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAvKiB1c2JfcGlwZW91dCh1cmItPnBpcGUpICovCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9hZGRyICphZGRyID0gJnUxMzItPmFkZHJbdXNiX2Rldi0+ZGV2bnVtXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBJID0gTUFYX1UxMzJfVURFVlM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLS1JID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbKytpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVkZXYtPnVzYl9kZXZpY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZGV2LT5lbnVtZXJhdGlvbiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMi0+YWRkclswXS5hZGRyZXNzID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT51ZGV2X251bWJlciA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRldi0+dWRldl9udW1iZXIgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkZXYtPnVzYl9hZGRyID0gdXNiX2Rldi0+ZGV2bnVtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfdWRldl9pbml0X2tyZWYodTEzMiwgdWRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWRldi0+ZW5kcF9udW1iZXJfaW5bdXNiX2VuZHBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPmVuZHBfbnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfdWRldl9nZXRfa3JlZih1MTMyLCB1ZGV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZGV2LT5lbmRwX251bWJlcl9vdXRbdXNiX2VuZHBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPmVuZHBfbnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkZXYtPnVzYl9kZXZpY2UgPSB1c2JfZGV2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodTggKikgKHVyYi0+c2V0dXBfcGFja2V0KSlbMl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkci0+YWRkcmVzcyA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl91ZGV2X2dldF9rcmVmKHUxMzIsIHVkZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAicnVuIG91dCBvZiBkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJldmljZSBzcGFjZVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdXJiLT5oY3ByaXYgPSB1MTMyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHAtPnF1ZXVlX3NpemUrKyA8IEVORFBfUVVFVUVfU0laRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX2xhc3QrK10gPSB1cmI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdTEzMl91cmJxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfQVRPTUlDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVyYnEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgLT0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2FkZF90YWlsKCZ1cmJxLT51cmJfbW9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmRwLT51cmJfbW9yZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJicS0+dXJiID0gdXJiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qKHVzYl9hZGRyID4gMCkgKi8KKyAgICAgICAgICAgICAgICB1OCBhZGRyZXNzID0gdTEzMi0+YWRkclt1c2JfYWRkcl0uYWRkcmVzczsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107CisgICAgICAgICAgICAgICAgdXJiLT5oY3ByaXYgPSB1MTMyOworICAgICAgICAgICAgICAgIGlmICh1ZGV2LT5lbnVtZXJhdGlvbiA9PSAyKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB1ZGV2LT5lbnVtZXJhdGlvbiA9IDI7CisgICAgICAgICAgICAgICAgaWYgKGVuZHAtPnF1ZXVlX3NpemUrKyA8IEVORFBfUVVFVUVfU0laRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYgZW5kcC0+cXVldWVfbGFzdCsrXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyYjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdXJicSAqdXJicSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1MTMyX3VyYnEpLCBHRlBfQVRPTUlDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmJxID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+cXVldWVfc2l6ZSAtPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfYWRkX3RhaWwoJnVyYnEtPnVyYl9tb3JlLCAmZW5kcC0+dXJiX21vcmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmJxLT51cmIgPSB1cmI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9Cit9CisKK3N0YXRpYyBpbnQgdTEzMl91cmJfZW5xdWV1ZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmhlcCwKKyAgICAgICAgc3RydWN0IHVyYiAqdXJiLCBnZnBfdCBtZW1fZmxhZ3MpCit7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKyAgICAgICAgaWYgKGlycXNfZGlzYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChfX0dGUF9XQUlUICYgbWVtX2ZsYWdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImludmFsaWQgY29udGV4dCBmb3IgZnVuY3Rpb24gdGhhdCBtaWdoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidCBzbGVlcFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWQgdXJiPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcCBzdGF0dXM9JWRcbiIsIHVyYiwgdXJiLT5zdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHU4IHVzYl9hZGRyID0gdXNiX3BpcGVkZXZpY2UodXJiLT5waXBlKTsKKyAgICAgICAgICAgICAgICB1OCB1c2JfZW5kcCA9IHVzYl9waXBlZW5kcG9pbnQodXJiLT5waXBlKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IHVyYi0+ZGV2OworICAgICAgICAgICAgICAgIGlmICh1c2JfcGlwZXR5cGUodXJiLT5waXBlKSA9PSBQSVBFX0lOVEVSUlVQVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbdXNiX2FkZHJdLmFkZHJlc3M7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl91ZGV2ICp1ZGV2ID0gJnUxMzItPnVkZXZbYWRkcmVzc107CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gaGVwLT5oY3ByaXY7CisgICAgICAgICAgICAgICAgICAgICAgICB1cmItPmFjdHVhbF9sZW5ndGggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpcnFzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcXVldWVfaW50X29uX29sZF9lbmRwb2ludCh1MTMyLCB1ZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcCwgdXJiLCB1c2JfZGV2LCBlbmRwLCB1c2JfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfZW5kcCwgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJxcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGVuZHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2Vjc190b19qaWZmaWVzKHVyYi0+aW50ZXJ2YWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHUxMzItPm51bV9lbmRwb2ludHMgPT0gTUFYX1UxMzJfRU5EUFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgLyooZW5kcCA9PSBOVUxMKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlX2VuZHBvaW50X2FuZF9xdWV1ZV9pbnQodTEzMiwgdWRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVwLCB1cmIsIHVzYl9kZXYsIHVzYl9hZGRyLCB1c2JfZW5kcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBtZW1fZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkgPT0gUElQRV9JU09DSFJPTk9VUykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJ0aGUgaGFyZHdhcmUgZG9lcyBubyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInQgc3VwcG9ydCBQSVBFX0lTT0NIUk9OT1VTXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXNiX3BpcGV0eXBlKHVyYi0+cGlwZSkgPT0gUElQRV9CVUxLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1OCBhZGRyZXNzID0gdTEzMi0+YWRkclt1c2JfYWRkcl0uYWRkcmVzczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VkZXYgKnVkZXYgPSAmdTEzMi0+dWRldlthZGRyZXNzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2VuZHAgKmVuZHAgPSBoZXAtPmhjcHJpdjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGlycXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBxdWV1ZV9idWxrX29uX29sZF9lbmRwb2ludCh1MTMyLCB1ZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcCwgdXJiLCB1c2JfZGV2LCBlbmRwLCB1c2JfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfZW5kcCwgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXJxcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9xdWV1ZV93b3JrKHUxMzIsIGVuZHAsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHUxMzItPm51bV9lbmRwb2ludHMgPT0gTUFYX1UxMzJfRU5EUFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZV9lbmRwb2ludF9hbmRfcXVldWVfYnVsayh1MTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkZXYsIGhlcCwgdXJiLCB1c2JfZGV2LCB1c2JfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfZW5kcCwgYWRkcmVzcywgbWVtX2ZsYWdzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IGhlcC0+aGNwcml2OworICAgICAgICAgICAgICAgICAgICAgICAgdTE2IHVyYl9zaXplID0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpiID0gdXJiLT5zZXR1cF9wYWNrZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRhdGFbMzAgKjMgKyA0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmQgPSBkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG0gPSAoc2l6ZW9mKGRhdGEpIC0gMSkgLyAzOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGwgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodXJiX3NpemUtLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSsrIDwgbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ID0gc3ByaW50ZihkLCAiICUwMlgiLCAqYisrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICs9IHc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSB3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICs9IHNwcmludGYoZCwgIiAuLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZHApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBpcnFzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcXVldWVfY29udHJvbF9vbl9vbGRfZW5kcG9pbnQodTEzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXAsIHVyYiwgdXNiX2RldiwgZW5kcCwgdXNiX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2VuZHApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2VuZHBfcXVldWVfd29yayh1MTMyLCBlbmRwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5udW1fZW5kcG9pbnRzID09IE1BWF9VMTMyX0VORFBTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVfZW5kcG9pbnRfYW5kX3F1ZXVlX2NvbnRyb2wodTEzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXAsIHVyYiwgdXNiX2RldiwgdXNiX2FkZHIsIHVzYl9lbmRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbV9mbGFncyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGVxdWV1ZV9mcm9tX292ZXJmbG93X2NoYWluKHN0cnVjdCB1MTMyICp1MTMyLAorICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIpCit7CisgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKnNjYW47CisgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmZW5kcC0+dXJiX21vcmU7CisgICAgICAgIGxpc3RfZm9yX2VhY2goc2NhbiwgaGVhZCkgeworICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEgKnVyYnEgPSBsaXN0X2VudHJ5KHNjYW4sIHN0cnVjdCB1MTMyX3VyYnEsCisgICAgICAgICAgICAgICAgICAgICAgICB1cmJfbW9yZSk7CisgICAgICAgICAgICAgICAgaWYgKHVyYnEtPnVyYiA9PSB1cmIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfaGNkICpoY2QgPSB1MTMyX3RvX2hjZCh1MTMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RfZGVsKHNjYW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+cXVldWVfc2l6ZSAtPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgdXJiLT5lcnJvcl9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB1cmItPmhjcHJpdiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB1c2JfaGNkX2dpdmViYWNrX3VyYihoY2QsIHVyYiwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAidXJiPSVwIG5vdCBmb3VuZCBpbiBlbmRwWyVkXT0lcCByaW5nIgorICAgICAgICAgICAgICAgICJbJWRdICVjJWMgdXNiX2VuZHA9JWQgdXNiX2FkZHI9JWQgc2l6ZT0lZCBuZXh0PSUwNFggbGFzdD0lMDRYIgorICAgICAgICAgICAgICAgICJcbiIsIHVyYiwgZW5kcC0+ZW5kcF9udW1iZXIsIGVuZHAsIGVuZHAtPnJpbmctPm51bWJlciwKKyAgICAgICAgICAgICAgICBlbmRwLT5pbnB1dCA/ICdJJyA6ICcgJywgZW5kcC0+b3V0cHV0ID8gJ08nIDogJyAnLAorICAgICAgICAgICAgICAgIGVuZHAtPnVzYl9lbmRwLCBlbmRwLT51c2JfYWRkciwgZW5kcC0+cXVldWVfc2l6ZSwKKyAgICAgICAgICAgICAgICBlbmRwLT5xdWV1ZV9uZXh0LCBlbmRwLT5xdWV1ZV9sYXN0KTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdTEzMl9lbmRwX3VyYl9kZXF1ZXVlKHN0cnVjdCB1MTMyICp1MTMyLCBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwLAorICAgICAgICBzdHJ1Y3QgdXJiICp1cmIpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgaXJxczsKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmVuZHAtPnF1ZXVlX2xvY2suc2xvY2ssIGlycXMpOworICAgICAgICBpZiAoZW5kcC0+cXVldWVfc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJ1cmI9JXAgbm90IGZvdW5kIGluIGVuZHBbJWRdIgorICAgICAgICAgICAgICAgICAgICAgICAgIj0lcCByaW5nWyVkXSAlYyVjIHVzYl9lbmRwPSVkIHVzYl9hZGRyPSVkXG4iLCB1cmIsCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5lbmRwX251bWJlciwgZW5kcCwgZW5kcC0+cmluZy0+bnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+aW5wdXQgPyAnSScgOiAnICcsIGVuZHAtPm91dHB1dCA/ICdPJyA6ICcgJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnVzYl9lbmRwLCBlbmRwLT51c2JfYWRkcik7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVyYiA9PSBlbmRwLT51cmJfbGlzdFtFTkRQX1FVRVVFX01BU0sgJiBlbmRwLT5xdWV1ZV9uZXh0XSkgeworICAgICAgICAgICAgICAgIGlmIChlbmRwLT5hY3RpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPmRlcXVldWVpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+ZWRzZXRfZmx1c2ggPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgdTEzMl9lbmRwX3F1ZXVlX3dvcmsodTEzMiwgZW5kcCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyYi0+aGNwcml2ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbmRwLT5xdWV1ZV9sb2NrLnNsb2NrLCBpcnFzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfaGNkX2FiYW5kb25fdXJiKHUxMzIsIGVuZHAsIHVyYiwgdXJiLT5zdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHUxNiBxdWV1ZV9saXN0ID0gMDsKKyAgICAgICAgICAgICAgICB1MTYgcXVldWVfc2l6ZSA9IGVuZHAtPnF1ZXVlX3NpemU7CisgICAgICAgICAgICAgICAgdTE2IHF1ZXVlX3NjYW4gPSBlbmRwLT5xdWV1ZV9uZXh0OworICAgICAgICAgICAgICAgIHN0cnVjdCB1cmIgKip1cmJfc2xvdCA9IE5VTEw7CisgICAgICAgICAgICAgICAgd2hpbGUgKCsrcXVldWVfbGlzdCA8IEVORFBfUVVFVUVfU0laRSAmJiAtLXF1ZXVlX3NpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJiID09IGVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcXVldWVfc2Nhbl0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJiX3Nsb3QgPSAmZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZV9zY2FuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlICgrK3F1ZXVlX2xpc3QgPCBFTkRQX1FVRVVFX1NJWkUgJiYgLS1xdWV1ZV9zaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnVyYl9zbG90ID0gZW5kcC0+dXJiX2xpc3RbRU5EUF9RVUVVRV9NQVNLICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytxdWV1ZV9zY2FuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyYl9zbG90ID0gJmVuZHAtPnVyYl9saXN0W0VORFBfUVVFVUVfTUFTSyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlX3NjYW5dOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodXJiX3Nsb3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1c2JfaGNkICpoY2QgPSB1MTMyX3RvX2hjZCh1MTMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX3NpemUgLT0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0X2VtcHR5KCZlbmRwLT51cmJfbW9yZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBlbmRwLT51cmJfbW9yZS5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl91cmJxICp1cmJxID0gbGlzdF9lbnRyeShuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3VyYnEsIHVyYl9tb3JlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9kZWwobmV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp1cmJfc2xvdCA9IHVyYnEtPnVyYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnFzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUodXJicSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHVyYi0+ZXJyb3JfY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdXJiLT5oY3ByaXYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgdXNiX2hjZF9naXZlYmFja191cmIoaGNkLCB1cmIsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaXN0X2VtcHR5KCZlbmRwLT51cmJfbW9yZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAidXJiPSVwIG5vdCBmb3VuZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmRwWyVkXT0lcCByaW5nWyVkXSAlYyVjIHVzYl9lbmRwPSVkIHVzYl9hZGRyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPSVkIHNpemU9JWQgbmV4dD0lMDRYIGxhc3Q9JTA0WFxuIiwgdXJiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5lbmRwX251bWJlciwgZW5kcCwgZW5kcC0+cmluZy0+bnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwLT5pbnB1dCA/ICdJJyA6ICcgJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+b3V0cHV0ID8gJ08nIDogJyAnLCBlbmRwLT51c2JfZW5kcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcC0+dXNiX2FkZHIsIGVuZHAtPnF1ZXVlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHAtPnF1ZXVlX25leHQsIGVuZHAtPnF1ZXVlX2xhc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldHZhbCA9IGRlcXVldWVfZnJvbV9vdmVyZmxvd19jaGFpbih1MTMyLCBlbmRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmIpOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW5kcC0+cXVldWVfbG9jay5zbG9jaywgaXJxcyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorCitzdGF0aWMgaW50IHUxMzJfdXJiX2RlcXVldWUoc3RydWN0IHVzYl9oY2QgKmhjZCwgc3RydWN0IHVyYiAqdXJiKQoreworICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisgICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDIpIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1OCB1c2JfYWRkciA9IHVzYl9waXBlZGV2aWNlKHVyYi0+cGlwZSk7CisgICAgICAgICAgICAgICAgdTggdXNiX2VuZHAgPSB1c2JfcGlwZWVuZHBvaW50KHVyYi0+cGlwZSk7CisgICAgICAgICAgICAgICAgdTggYWRkcmVzcyA9IHUxMzItPmFkZHJbdXNiX2FkZHJdLmFkZHJlc3M7CisgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W2FkZHJlc3NdOworICAgICAgICAgICAgICAgIGlmICh1c2JfcGlwZWluKHVyYi0+cGlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHU4IGVuZHBfbnVtYmVyID0gdWRldi0+ZW5kcF9udW1iZXJfaW5bdXNiX2VuZHBdOworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHUxMzItPmVuZHBbZW5kcF9udW1iZXIgLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1MTMyX2VuZHBfdXJiX2RlcXVldWUodTEzMiwgZW5kcCwgdXJiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdTggZW5kcF9udW1iZXIgPSB1ZGV2LT5lbmRwX251bWJlcl9vdXRbdXNiX2VuZHBdOworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfZW5kcCAqZW5kcCA9IHUxMzItPmVuZHBbZW5kcF9udW1iZXIgLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1MTMyX2VuZHBfdXJiX2RlcXVldWUodTEzMiwgZW5kcCwgdXJiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgdTEzMl9lbmRwb2ludF9kaXNhYmxlKHN0cnVjdCB1c2JfaGNkICpoY2QsCisgICAgICAgIHN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludCAqaGVwKQoreworICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisgICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDIpIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gaGVwLT5oY3ByaXY7CisgICAgICAgICAgICAgICAgaWYgKGVuZHApCisgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX2VuZHBfcHV0X2tyZWYodTEzMiwgZW5kcCk7CisgICAgICAgIH0KK30KKworc3RhdGljIGludCB1MTMyX2dldF9mcmFtZShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisgICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVTSFVURE9XTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgZnJhbWUgPSAwOworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiVE9ETzogdTEzMl9nZXRfZnJhbWVcbiIpOworICAgICAgICAgICAgICAgIG1zbGVlcCgxMDApOworICAgICAgICAgICAgICAgIHJldHVybiBmcmFtZTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgaW50IHUxMzJfcm9vdGh1Yl9kZXNjcmlwdG9yKHN0cnVjdCB1MTMyICp1MTMyLAorICAgICAgICBzdHJ1Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yICpkZXNjKQoreworICAgICAgICBpbnQgcmV0dmFsOworICAgICAgICB1MTYgdGVtcDsKKyAgICAgICAgdTMyIHJoX2EgPSAtMTsKKyAgICAgICAgdTMyIHJoX2IgPSAtMTsKKyAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLmEsICZyaF9hKTsKKyAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICBkZXNjLT5iRGVzY3JpcHRvclR5cGUgPSAweDI5OworICAgICAgICBkZXNjLT5iUHdyT24yUHdyR29vZCA9IChyaF9hICYgUkhfQV9QT1RQR1QpID4+IDI0OworICAgICAgICBkZXNjLT5iSHViQ29udHJDdXJyZW50ID0gMDsKKyAgICAgICAgZGVzYy0+Yk5iclBvcnRzID0gdTEzMi0+bnVtX3BvcnRzOworICAgICAgICB0ZW1wID0gMSArICh1MTMyLT5udW1fcG9ydHMgLyA4KTsKKyAgICAgICAgZGVzYy0+YkRlc2NMZW5ndGggPSA3ICsgMiAqdGVtcDsKKyAgICAgICAgdGVtcCA9IDA7CisgICAgICAgIGlmIChyaF9hICYgUkhfQV9OUFMpCisgICAgICAgICAgICAgICAgdGVtcCB8PSAweDAwMDI7CisgICAgICAgIGlmIChyaF9hICYgUkhfQV9QU00pCisgICAgICAgICAgICAgICAgdGVtcCB8PSAweDAwMDE7CisgICAgICAgIGlmIChyaF9hICYgUkhfQV9OT0NQKSB7CisgICAgICAgICAgICAgICAgdGVtcCB8PSAweDAwMTA7CisgICAgICAgIH0gZWxzZSBpZiAocmhfYSAmIFJIX0FfT0NQTSkKKyAgICAgICAgICAgICAgICB0ZW1wIHw9IDB4MDAwODsKKyAgICAgICAgZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyA9IGNwdV90b19sZTE2KHRlbXApOworICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsIHJvb3RodWIuYiwgJnJoX2IpOworICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIG1lbXNldChkZXNjLT5iaXRtYXAsIDB4ZmYsIHNpemVvZihkZXNjLT5iaXRtYXApKTsKKyAgICAgICAgZGVzYy0+Yml0bWFwWzBdID0gcmhfYiAmIFJIX0JfRFI7CisgICAgICAgIGlmICh1MTMyLT5udW1fcG9ydHMgPiA3KSB7CisgICAgICAgICAgICAgICAgZGVzYy0+Yml0bWFwWzFdID0gKHJoX2IgJiBSSF9CX0RSKSA+PiA4OworICAgICAgICAgICAgICAgIGRlc2MtPmJpdG1hcFsyXSA9IDB4ZmY7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGRlc2MtPmJpdG1hcFsxXSA9IDB4ZmY7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHUxMzJfcm9vdGh1Yl9zdGF0dXMoc3RydWN0IHUxMzIgKnUxMzIsIF9fbGUzMiAqZGVzYykKK3sKKyAgICAgICAgdTMyIHJoX3N0YXR1cyA9IC0xOworICAgICAgICBpbnQgcmV0X3N0YXR1cyA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgcm9vdGh1Yi5zdGF0dXMsICZyaF9zdGF0dXMpOworICAgICAgICAqZGVzYyA9IGNwdV90b19sZTMyKHJoX3N0YXR1cyk7CisgICAgICAgIHJldHVybiByZXRfc3RhdHVzOworfQorCitzdGF0aWMgaW50IHUxMzJfcm9vdGh1Yl9wb3J0c3RhdHVzKHN0cnVjdCB1MTMyICp1MTMyLCBfX2xlMzIgKmRlc2MsIHUxNiB3SW5kZXgpCit7CisgICAgICAgIGlmICh3SW5kZXggPT0gMCB8fCB3SW5kZXggPiB1MTMyLT5udW1fcG9ydHMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcG9ydCA9IHdJbmRleCAtIDE7CisgICAgICAgICAgICAgICAgdTMyIHJoX3BvcnRzdGF0dXMgPSAtMTsKKyAgICAgICAgICAgICAgICBpbnQgcmV0X3BvcnRzdGF0dXMgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsCisgICAgICAgICAgICAgICAgICAgICAgICByb290aHViLnBvcnRzdGF0dXNbcG9ydF0sICZyaF9wb3J0c3RhdHVzKTsKKyAgICAgICAgICAgICAgICAqZGVzYyA9IGNwdV90b19sZTMyKHJoX3BvcnRzdGF0dXMpOworICAgICAgICAgICAgICAgIGlmICgqKHUxNiAqKSAoZGVzYyArIDIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfaW5mbygmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJQb3J0ICVkIFN0YXR1cyBDaGFuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2UgPSAlMDhYXG4iLCBwb3J0LCAqZGVzYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXRfcG9ydHN0YXR1czsKKyAgICAgICAgfQorfQorCisKKy8qIHRoaXMgdGltZXIgdmFsdWUgbWlnaHQgYmUgdmVuZG9yLXNwZWNpZmljIC4uLiAqLworI2RlZmluZSBQT1JUX1JFU0VUX0hXX01TRUMgMTAKKyNkZWZpbmUgUE9SVF9SRVNFVF9NU0VDIDEwCisvKiB3cmFwLWF3YXJlIGxvZ2ljIG1vcnBoZWQgZnJvbSA8bGludXgvamlmZmllcy5oPiAqLworI2RlZmluZSB0aWNrX2JlZm9yZSh0MSwgdDIpICgoczE2KSgoKHMxNikodDEpKS0oKHMxNikodDIpKSkgPCAwKQorc3RhdGljIGludCB1MTMyX3Jvb3RodWJfcG9ydHJlc2V0KHN0cnVjdCB1MTMyICp1MTMyLCBpbnQgcG9ydF9pbmRleCkKK3sKKyAgICAgICAgaW50IHJldHZhbDsKKyAgICAgICAgdTMyIGZtbnVtYmVyOworICAgICAgICB1MTYgbm93OworICAgICAgICB1MTYgcmVzZXRfZG9uZTsKKyAgICAgICAgcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCBmbW51bWJlciwgJmZtbnVtYmVyKTsKKyAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICBub3cgPSBmbW51bWJlcjsKKyAgICAgICAgcmVzZXRfZG9uZSA9IG5vdyArIFBPUlRfUkVTRVRfTVNFQzsKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHUzMiBwb3J0c3RhdDsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3JlYWRfcGNpbWVtKHUxMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RodWIucG9ydHN0YXR1c1twb3J0X2luZGV4XSwgJnBvcnRzdGF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkhfUFNfUFJTICYgcG9ydHN0YXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAodGlja19iZWZvcmUobm93LCByZXNldF9kb25lKSk7CisgICAgICAgICAgICAgICAgaWYgKFJIX1BTX1BSUyAmIHBvcnRzdGF0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgICAgICAgICAgICAgaWYgKFJIX1BTX0NDUyAmIHBvcnRzdGF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUkhfUFNfUFJTQyAmIHBvcnRzdGF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdGh1Yi5wb3J0c3RhdHVzW3BvcnRfaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIX1BTX1BSU0MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgIC8qIHN0YXJ0IHRoZSBuZXh0IHJlc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcCB0aWxsIGl0J3MgcHJvYmFibHkgZG9uZSAqLworICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfd3JpdGVfcGNpbWVtKHUxMzIsIHJvb3RodWIucG9ydHN0YXR1c1twb3J0X2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSSF9QU19QUlMpOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgICAgIG1zbGVlcChQT1JUX1JFU0VUX0hXX01TRUMpOworICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfcmVhZF9wY2ltZW0odTEzMiwgZm1udW1iZXIsICZmbW51bWJlcik7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAgICAgbm93ID0gZm1udW1iZXI7CisgICAgICAgIH0gd2hpbGUgKHRpY2tfYmVmb3JlKG5vdywgcmVzZXRfZG9uZSkpOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1MTMyX3Jvb3RodWJfc2V0cG9ydGZlYXR1cmUoc3RydWN0IHUxMzIgKnUxMzIsIHUxNiB3VmFsdWUsCisgICAgICAgIHUxNiB3SW5kZXgpCit7CisgICAgICAgIGlmICh3SW5kZXggPT0gMCB8fCB3SW5kZXggPiB1MTMyLT5udW1fcG9ydHMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0dmFsOworICAgICAgICAgICAgICAgIGludCBwb3J0X2luZGV4ID0gd0luZGV4IC0gMTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9wb3J0ICpwb3J0ID0gJnUxMzItPnBvcnRbcG9ydF9pbmRleF07CisgICAgICAgICAgICAgICAgcG9ydC0+U3RhdHVzICY9IH4oMSA8PCB3VmFsdWUpOworICAgICAgICAgICAgICAgIHN3aXRjaCAod1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBVU0JfUE9SVF9GRUFUX1NVU1BFTkQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sIFJIX1BTX1BTUyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl93cml0ZV9wY2ltZW0odTEzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdGh1Yi5wb3J0c3RhdHVzW3BvcnRfaW5kZXhdLCBSSF9QU19QUFMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGNhc2UgVVNCX1BPUlRfRkVBVF9SRVNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfcm9vdGh1Yl9wb3J0cmVzZXQodTEzMiwgcG9ydF9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVBJUEU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKK3N0YXRpYyBpbnQgdTEzMl9yb290aHViX2NsZWFycG9ydGZlYXR1cmUoc3RydWN0IHUxMzIgKnUxMzIsIHUxNiB3VmFsdWUsCisgICAgICAgIHUxNiB3SW5kZXgpCit7CisgICAgICAgIGlmICh3SW5kZXggPT0gMCB8fCB3SW5kZXggPiB1MTMyLT5udW1fcG9ydHMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcG9ydF9pbmRleCA9IHdJbmRleCAtIDE7CisgICAgICAgICAgICAgICAgdTMyIHRlbXA7CisgICAgICAgICAgICAgICAgaW50IHJldHZhbDsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9wb3J0ICpwb3J0ID0gJnUxMzItPnBvcnRbcG9ydF9pbmRleF07CisgICAgICAgICAgICAgICAgcG9ydC0+U3RhdHVzICY9IH4oMSA8PCB3VmFsdWUpOworICAgICAgICAgICAgICAgIHN3aXRjaCAod1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBVU0JfUE9SVF9GRUFUX0VOQUJMRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBSSF9QU19DQ1M7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFVTQl9QT1JUX0ZFQVRfQ19FTkFCTEU6CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gUkhfUFNfUEVTQzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IFJIX1BTX1BPQ0k7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHUxMzItPmhjX2NvbnRyb2wgJiBPSENJX0NUUkxfSENGUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gT0hDSV9VU0JfT1BFUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgIlRPRE8gcmVzdW1lXyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm9vdF9odWJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBVU0JfUE9SVF9GRUFUX0NfU1VTUEVORDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBSSF9QU19QU1NDOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IFJIX1BTX0xTREE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OOgorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IFJIX1BTX0NTQzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVVNCX1BPUlRfRkVBVF9DX09WRVJfQ1VSUkVOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBSSF9QU19PQ0lDOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBVU0JfUE9SVF9GRUFUX0NfUkVTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gUkhfUFNfUFJTQzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVQSVBFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3dyaXRlX3BjaW1lbSh1MTMyLCByb290aHViLnBvcnRzdGF0dXNbcG9ydF9pbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCk7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KK30KKworCisvKiB0aGUgdmlydHVhbCByb290IGh1YiB0aW1lciBJUlEgY2hlY2tzIGZvciBodWIgc3RhdHVzKi8KK3N0YXRpYyBpbnQgdTEzMl9odWJfc3RhdHVzX2RhdGEoc3RydWN0IHVzYl9oY2QgKmhjZCwgY2hhciAqYnVmKQoreworICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisgICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoY2Q9JXAgaGFzIGJlZW4gcmVtb3YiCisgICAgICAgICAgICAgICAgICAgICAgICAiZWQgJWRcbiIsIGhjZCwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhjZD0lcCBpcyBiZWluZyByZW1vdiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJlZFxuIiwgaGNkKTsKKyAgICAgICAgICAgICAgICBkdW1wX3N0YWNrKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FU0hVVERPV047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGksIGNoYW5nZWQgPSAwLCBsZW5ndGggPSAxOworICAgICAgICAgICAgICAgIGlmICh1MTMyLT5mbGFncyAmIE9IQ0lfUVVJUktfQU1ENzU2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHUxMzItPmhjX3Jvb3RodWJfYSAmIFJIX0FfTkRQKSA+IE1BWF9ST09UX1BPUlRTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiYm9ndXMgTkRQLCByIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcmVhZHMgYXMgTkRQPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzItPmhjX3Jvb3RodWJfYSAmIFJIX0FfTkRQKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodTEzMi0+aGNfcm9vdGh1Yl9zdGF0dXMgJiAoUkhfSFNfTFBTQyB8IFJIX0hTX09DSUMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZbMF0gPSBjaGFuZ2VkID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlswXSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHUxMzItPm51bV9wb3J0cyA+IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlsxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHUxMzItPm51bV9wb3J0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodTEzMi0+aGNfcm9vdGh1Yl9wb3J0c3RhdHVzW2ldICYgKFJIX1BTX0NTQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIX1BTX1BFU0MgfCBSSF9QU19QU1NDIHwgUkhfUFNfT0NJQyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIX1BTX1BSU0MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbMF0gfD0gMSA8PCAoaSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbMV0gfD0gMSA8PCAoaSAtIDcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHUxMzItPmhjX3Jvb3RodWJfcG9ydHN0YXR1c1tpXSAmIFJIX1BTX0NDUykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHUxMzItPmhjX3Jvb3RodWJfcG9ydHN0YXR1c1tpXSAmIFJIX1BTX1BTUykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBkb25lOnJldHVybiBjaGFuZ2VkID8gbGVuZ3RoIDogMDsKKyAgICAgICAgfQorfQorCitzdGF0aWMgaW50IHUxMzJfaHViX2NvbnRyb2woc3RydWN0IHVzYl9oY2QgKmhjZCwgdTE2IHR5cGVSZXEsIHUxNiB3VmFsdWUsCisgICAgICAgIHUxNiB3SW5kZXgsIGNoYXIgKmJ1ZiwgdTE2IHdMZW5ndGgpCit7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCByZXR2YWwgPSAwOworICAgICAgICAgICAgICAgIGRvd24oJnUxMzItPnN3X2xvY2spOworICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZVJlcSkgeworICAgICAgICAgICAgICAgIGNhc2UgQ2xlYXJIdWJGZWF0dXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ19IVUJfT1ZFUl9DVVJSRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDX0hVQl9MT0NBTF9QT1dFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHN0YWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTZXRIdWJGZWF0dXJlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ19IVUJfT1ZFUl9DVVJSRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDX0hVQl9MT0NBTF9QT1dFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHN0YWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGVhclBvcnRGZWF0dXJlOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9yb290aHViX2NsZWFycG9ydGZlYXR1cmUodTEzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3VmFsdWUsIHdJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBHZXRIdWJEZXNjcmlwdG9yOnsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9yb290aHViX2Rlc2NyaXB0b3IodTEzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqKWJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBHZXRIdWJTdGF0dXM6eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1MTMyX3Jvb3RodWJfc3RhdHVzKHUxMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbGUzMiAqKSBidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgR2V0UG9ydFN0YXR1czp7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfcm9vdGh1Yl9wb3J0c3RhdHVzKHUxMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fbGUzMiAqKSBidWYsIHdJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBTZXRQb3J0RmVhdHVyZTp7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHUxMzJfcm9vdGh1Yl9zZXRwb3J0ZmVhdHVyZSh1MTMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdWYWx1ZSwgd0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzdGFsbDsKKyAgICAgICAgICAgICAgICAgICAgICBlcnJvcjp1MTMyX2Rpc2FibGUodTEzMik7CisgICAgICAgICAgICAgICAgICAgICAgICB1MTMyLT5nb2luZyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICBzdGFsbDpyZXR2YWwgPSAtRVBJUEU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXAoJnUxMzItPnN3X2xvY2spOworICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KK30KKworc3RhdGljIGludCB1MTMyX3N0YXJ0X3BvcnRfcmVzZXQoc3RydWN0IHVzYl9oY2QgKmhjZCwgdW5zaWduZWQgcG9ydF9udW0pCit7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdTEzMl9odWJfaXJxX2VuYWJsZShzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisgICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKKyAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApCisgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7Cit9CisKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCB1MTMyX2hjZF9zdXNwZW5kKHN0cnVjdCB1c2JfaGNkICpoY2QsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKQoreworICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMiA9IGhjZF90b191MTMyKGhjZCk7CisgICAgICAgIGlmICh1MTMyLT5nb2luZyA+IDEpIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBoYXMgYmVlbiByZW1vdmVkICVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAsIHUxMzItPmdvaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfSBlbHNlIGlmICh1MTMyLT5nb2luZyA+IDApIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImRldmljZSBpcyBiZWluZyByZW1vdmVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVTSFVURE9XTjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdTEzMl9oY2RfcmVzdW1lKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1MTMyX2J1c19zdXNwZW5kKHN0cnVjdCB1c2JfaGNkICpoY2QpCit7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1MTMyX2J1c19yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKyAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOworICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FU0hVVERPV047CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSB1MTMyX2hjZF9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgdTEzMl9oY2RfcmVzdW1lIE5VTEwKKyNkZWZpbmUgdTEzMl9idXNfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHUxMzJfYnVzX3Jlc3VtZSBOVUxMCisjZW5kaWYKK3N0YXRpYyBzdHJ1Y3QgaGNfZHJpdmVyIHUxMzJfaGNfZHJpdmVyID0geworICAgICAgICAuZGVzY3JpcHRpb24gPSBoY2RfbmFtZSwKKyAgICAgICAgLmhjZF9wcml2X3NpemUgPSBzaXplb2Yoc3RydWN0IHUxMzIpLAorICAgICAgICAuaXJxID0gTlVMTCwKKyAgICAgICAgLmZsYWdzID0gSENEX1VTQjExIHwgSENEX01FTU9SWSwKKyAgICAgICAgLnJlc2V0ID0gdTEzMl9oY2RfcmVzZXQsCisgICAgICAgIC5zdGFydCA9IHUxMzJfaGNkX3N0YXJ0LAorICAgICAgICAuc3VzcGVuZCA9IHUxMzJfaGNkX3N1c3BlbmQsCisgICAgICAgIC5yZXN1bWUgPSB1MTMyX2hjZF9yZXN1bWUsCisgICAgICAgIC5zdG9wID0gdTEzMl9oY2Rfc3RvcCwKKyAgICAgICAgLnVyYl9lbnF1ZXVlID0gdTEzMl91cmJfZW5xdWV1ZSwKKyAgICAgICAgLnVyYl9kZXF1ZXVlID0gdTEzMl91cmJfZGVxdWV1ZSwKKyAgICAgICAgLmVuZHBvaW50X2Rpc2FibGUgPSB1MTMyX2VuZHBvaW50X2Rpc2FibGUsCisgICAgICAgIC5nZXRfZnJhbWVfbnVtYmVyID0gdTEzMl9nZXRfZnJhbWUsCisgICAgICAgIC5odWJfc3RhdHVzX2RhdGEgPSB1MTMyX2h1Yl9zdGF0dXNfZGF0YSwKKyAgICAgICAgLmh1Yl9jb250cm9sID0gdTEzMl9odWJfY29udHJvbCwKKyAgICAgICAgLmJ1c19zdXNwZW5kID0gdTEzMl9idXNfc3VzcGVuZCwKKyAgICAgICAgLmJ1c19yZXN1bWUgPSB1MTMyX2J1c19yZXN1bWUsCisgICAgICAgIC5zdGFydF9wb3J0X3Jlc2V0ID0gdTEzMl9zdGFydF9wb3J0X3Jlc2V0LAorICAgICAgICAuaHViX2lycV9lbmFibGUgPSB1MTMyX2h1Yl9pcnFfZW5hYmxlLAorfTsKKworLyoKKyogVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGJ5IHRoZSBVU0IgY29yZSB3aGlsc3QgdGhlICJ1c2JfYWxsX2RldmljZXNfcndzZW0iCisqIGlzIGhlbGQgZm9yIHdyaXRpbmcsIHRodXMgdGhpcyBtb2R1bGUgbXVzdCBub3QgY2FsbCB1c2JfcmVtb3ZlX2hjZCgpCisqIHN5bmNocm9ub3VzbHkgLSBidXQgaW5zdGVhZCBzaG91bGQgaW1tZWRpYXRlbHkgc3RvcCBhY3Rpdml0eSB0byB0aGUKKyogZGV2aWNlIGFuZCBhbnN5bmNocm9ub3VzbHkgY2FsbCB1c2JfcmVtb3ZlX2hjZCgpCisqLworc3RhdGljIGludCBfX2RldmV4aXQgdTEzMl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKyAgICAgICAgc3RydWN0IHVzYl9oY2QgKmhjZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworICAgICAgICBpZiAoaGNkKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOworICAgICAgICAgICAgICAgIGR1bXBfc3RhY2soKTsKKyAgICAgICAgICAgICAgICBpZiAodTEzMi0+Z29pbmcrKyA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmluZ3MgPSBNQVhfVTEzMl9SSU5HUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmRwcyA9IE1BWF9VMTMyX0VORFBTOworICAgICAgICAgICAgICAgICAgICAgICAgbXNsZWVwKDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3duKCZ1MTMyLT5zd19sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfbW9uaXRvcl9jYW5jZWxfd29yayh1MTMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyaW5ncy0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yaW5nICpyaW5nID0gJnUxMzItPnJpbmdbcmluZ3NdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3JpbmdfY2FuY2VsX3dvcmsodTEzMiwgcmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChlbmRwcy0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9lbmRwICplbmRwID0gdTEzMi0+ZW5kcFtlbmRwc107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxMzJfZW5kcF9jYW5jZWxfd29yayh1MTMyLCBlbmRwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHUxMzItPmdvaW5nICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJyZW1vdmluZyBkZXZpY2UgdTEzMi4lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEzMi0+c2VxdWVuY2VfbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZ1MTMyLT5zd19sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9yZW1vdmVfaGNkKGhjZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3UxMzJfcHV0X2tyZWYodTEzMik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1MTMyX2luaXRpYWxpc2Uoc3RydWN0IHUxMzIgKnUxMzIsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisgICAgICAgIGludCByaW5ncyA9IE1BWF9VMTMyX1JJTkdTOworICAgICAgICBpbnQgcG9ydHMgPSBNQVhfVTEzMl9QT1JUUzsKKyAgICAgICAgaW50IGFkZHJzID0gTUFYX1UxMzJfQUREUlM7CisgICAgICAgIGludCB1ZGV2cyA9IE1BWF9VMTMyX1VERVZTOworICAgICAgICBpbnQgZW5kcHMgPSBNQVhfVTEzMl9FTkRQUzsKKyAgICAgICAgdTEzMi0+Ym9hcmQgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKyAgICAgICAgdTEzMi0+cGxhdGZvcm1fZGV2ID0gcGRldjsKKyAgICAgICAgdTEzMi0+cG93ZXIgPSAwOworICAgICAgICB1MTMyLT5yZXNldCA9IDA7CisgICAgICAgIGluaXRfTVVURVgoJnUxMzItPnN3X2xvY2spOworICAgICAgICBpbml0X01VVEVYKCZ1MTMyLT5zY2hlZHVsZXJfbG9jayk7CisgICAgICAgIHdoaWxlIChyaW5ncy0tID4gMCkgeworICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3JpbmcgKnJpbmcgPSAmdTEzMi0+cmluZ1tyaW5nc107CisgICAgICAgICAgICAgICAgcmluZy0+dTEzMiA9IHUxMzI7CisgICAgICAgICAgICAgICAgcmluZy0+bnVtYmVyID0gcmluZ3MgKyAxOworICAgICAgICAgICAgICAgIHJpbmctPmxlbmd0aCA9IDA7CisgICAgICAgICAgICAgICAgcmluZy0+Y3Vycl9lbmRwID0gTlVMTDsKKyAgICAgICAgICAgICAgICBJTklUX1dPUksoJnJpbmctPnNjaGVkdWxlciwgdTEzMl9oY2RfcmluZ193b3JrX3NjaGVkdWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcmluZyk7CisgICAgICAgIH0gZG93bigmdTEzMi0+c3dfbG9jayk7CisgICAgICAgIElOSVRfV09SSygmdTEzMi0+bW9uaXRvciwgdTEzMl9oY2RfbW9uaXRvcl93b3JrLCAodm9pZCAqKXUxMzIpOworICAgICAgICB3aGlsZSAocG9ydHMtLSA+IDApIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9wb3J0ICpwb3J0ID0gJnUxMzItPnBvcnRbcG9ydHNdOworICAgICAgICAgICAgICAgIHBvcnQtPnUxMzIgPSB1MTMyOworICAgICAgICAgICAgICAgIHBvcnQtPnJlc2V0ID0gMDsKKyAgICAgICAgICAgICAgICBwb3J0LT5lbmFibGUgPSAwOworICAgICAgICAgICAgICAgIHBvcnQtPnBvd2VyID0gMDsKKyAgICAgICAgICAgICAgICBwb3J0LT5TdGF0dXMgPSAwOworICAgICAgICB9IHdoaWxlIChhZGRycy0tID4gMCkgeworICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2FkZHIgKmFkZHIgPSAmdTEzMi0+YWRkclthZGRyc107CisgICAgICAgICAgICAgICAgYWRkci0+YWRkcmVzcyA9IDA7CisgICAgICAgIH0gd2hpbGUgKHVkZXZzLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdWRldiAqdWRldiA9ICZ1MTMyLT51ZGV2W3VkZXZzXTsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IEFSUkFZX1NJWkUodWRldi0+ZW5kcF9udW1iZXJfaW4pOworICAgICAgICAgICAgICAgIGludCBvID0gQVJSQVlfU0laRSh1ZGV2LT5lbmRwX251bWJlcl9vdXQpOworICAgICAgICAgICAgICAgIHVkZXYtPnVzYl9kZXZpY2UgPSBOVUxMOworICAgICAgICAgICAgICAgIHVkZXYtPnVkZXZfbnVtYmVyID0gMDsKKyAgICAgICAgICAgICAgICB1ZGV2LT51c2JfYWRkciA9IDA7CisgICAgICAgICAgICAgICAgdWRldi0+cG9ydG51bWJlciA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKGktLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX2luW2ldID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKG8tLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVkZXYtPmVuZHBfbnVtYmVyX291dFtvXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlIChlbmRwcy0tID4gMCkgeworICAgICAgICAgICAgICAgIHUxMzItPmVuZHBbZW5kcHNdID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB1cCgmdTEzMi0+c3dfbG9jayk7CisgICAgICAgIHJldHVybjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgdTEzMl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworICAgICAgICBzdHJ1Y3QgdXNiX2hjZCAqaGNkOworICAgICAgICBtc2xlZXAoMTAwKTsKKyAgICAgICAgaWYgKHUxMzJfZXhpdGluZyA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlZnVzZSB0byBjb25mdXNlIHVzYmNvcmUgKi8KKyAgICAgICAgaWYgKHBkZXYtPmRldi5kbWFfbWFzaykgeworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGhjZCA9IHVzYl9jcmVhdGVfaGNkKCZ1MTMyX2hjX2RyaXZlciwgJnBkZXYtPmRldiwgcGRldi0+ZGV2LmJ1c19pZCk7CisgICAgICAgIGlmICghaGNkKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gY3JlYXRlIHRoZSB1c2IgaGNkIHN0cnVjdCBmb3IgVTEzMlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBmdGRpX2VsYW5fZ29uZV9hd2F5KHBkZXYpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCByZXR2YWwgPSAwOworICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKyAgICAgICAgICAgICAgICBoY2QtPnJzcmNfc3RhcnQgPSAwOworICAgICAgICAgICAgICAgIGRvd24oJnUxMzJfbW9kdWxlX2xvY2spOworICAgICAgICAgICAgICAgIGxpc3RfYWRkX3RhaWwoJnUxMzItPnUxMzJfbGlzdCwgJnUxMzJfc3RhdGljX2xpc3QpOworICAgICAgICAgICAgICAgIHUxMzItPnNlcXVlbmNlX251bSA9ICsrdTEzMl9pbnN0YW5jZXM7CisgICAgICAgICAgICAgICAgdXAoJnUxMzJfbW9kdWxlX2xvY2spOworICAgICAgICAgICAgICAgIHUxMzJfdTEzMl9pbml0X2tyZWYodTEzMik7CisgICAgICAgICAgICAgICAgdTEzMl9pbml0aWFsaXNlKHUxMzIsIHBkZXYpOworICAgICAgICAgICAgICAgIGhjZC0+cHJvZHVjdF9kZXNjID0gIkVMQU4gVTEzMiBIb3N0IENvbnRyb2xsZXIiOworICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9hZGRfaGNkKGhjZCwgMCwgMCk7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZ1MTMyLT5wbGF0Zm9ybV9kZXYtPmRldiwgImluaXQgZXJyb3IgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX3UxMzJfcHV0X2tyZWYodTEzMik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1MTMyX21vbml0b3JfcXVldWVfd29yayh1MTMyLCAxMDApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKKworI2lmZGVmIENPTkZJR19QTQorLyogZm9yIHRoaXMgZGV2aWNlIHRoZXJlJ3Mgbm8gdXNlZnVsIGRpc3RpbmN0aW9uIGJldHdlZW4gdGhlIGNvbnRyb2xsZXIKKyogYW5kIGl0cyByb290IGh1YiwgZXhjZXB0IHRoYXQgdGhlIHJvb3QgaHViIG9ubHkgZ2V0cyBkaXJlY3QgUE0gY2FsbHMKKyogd2hlbiBDT05GSUdfVVNCX1NVU1BFTkQgaXMgZW5hYmxlZC4KKyovCitzdGF0aWMgaW50IHUxMzJfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisgICAgICAgIHN0cnVjdCB1c2JfaGNkICpoY2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKyAgICAgICAgc3RydWN0IHUxMzIgKnUxMzIgPSBoY2RfdG9fdTEzMihoY2QpOworICAgICAgICBpZiAodTEzMi0+Z29pbmcgPiAxKSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZCAlZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgLCB1MTMyLT5nb2luZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgICAgIH0gZWxzZSBpZiAodTEzMi0+Z29pbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmdTEzMi0+cGxhdGZvcm1fZGV2LT5kZXYsICJkZXZpY2UgaXMgYmVpbmcgcmVtb3ZlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FU0hVVERPV047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHJldHZhbCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmV2ZW50ID09IFBNX0VWRU5UX0ZSRUVaRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9idXNfc3VzcGVuZChoY2QpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnRzID0gTUFYX1UxMzJfUE9SVFM7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocG9ydHMtLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9wb3dlcih1MTMyLCBwb3J0cywgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KK30KKworc3RhdGljIGludCB1MTMyX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworICAgICAgICBzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisgICAgICAgIHN0cnVjdCB1MTMyICp1MTMyID0gaGNkX3RvX3UxMzIoaGNkKTsKKyAgICAgICAgaWYgKHUxMzItPmdvaW5nID4gMSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgdTEzMi0+Z29pbmcpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgaWYgKHUxMzItPmdvaW5nID4gMCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJnUxMzItPnBsYXRmb3JtX2Rldi0+ZGV2LCAiZGV2aWNlIGlzIGJlaW5nIHJlbW92ZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRVNIVVRET1dOOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCByZXR2YWwgPSAwOworICAgICAgICAgICAgICAgIGlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnRzID0gTUFYX1UxMzJfUE9SVFM7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocG9ydHMtLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9wb3dlcih1MTMyLCBwb3J0cywgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBQTVNHX09OOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gdTEzMl9idXNfcmVzdW1lKGhjZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KK30KKworI2Vsc2UKKyNkZWZpbmUgdTEzMl9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgdTEzMl9yZXN1bWUgTlVMTAorI2VuZGlmCisvKgorKiB0aGlzIGRyaXZlciBpcyBsb2FkZWQgZXhwbGljaXRlbHkgYnkgZnRkaV91MTMyCisqCisqIHRoZSBwbGF0Zm9ybV9kcml2ZXIgc3RydWN0IGlzIHN0YXRpYyBiZWNhdXNlIGl0IGlzIHBlciB0eXBlIG9mIG1vZHVsZQorKi8KK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHUxMzJfcGxhdGZvcm1fZHJpdmVyID0geworICAgICAgICAucHJvYmUgPSB1MTMyX3Byb2JlLAorICAgICAgICAucmVtb3ZlID0gX19kZXZleGl0X3AodTEzMl9yZW1vdmUpLAorICAgICAgICAuc3VzcGVuZCA9IHUxMzJfc3VzcGVuZCwKKyAgICAgICAgLnJlc3VtZSA9IHUxMzJfcmVzdW1lLAorICAgICAgICAuZHJpdmVyID0geworICAgICAgICAgICAgICAgICAgIC5uYW1lID0gKGNoYXIgKiloY2RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAub3duZXIgPSBUSElTX01PRFVMRSwKKyAgICAgICAgICAgICAgICAgICB9LAorfTsKK3N0YXRpYyBpbnQgX19pbml0IHUxMzJfaGNkX2luaXQodm9pZCkKK3sKKyAgICAgICAgaW50IHJldHZhbDsKKyAgICAgICAgSU5JVF9MSVNUX0hFQUQoJnUxMzJfc3RhdGljX2xpc3QpOworICAgICAgICB1MTMyX2luc3RhbmNlcyA9IDA7CisgICAgICAgIHUxMzJfZXhpdGluZyA9IDA7CisgICAgICAgIGluaXRfTVVURVgoJnUxMzJfbW9kdWxlX2xvY2spOworICAgICAgICBpZiAodXNiX2Rpc2FibGVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gImRyaXZlciAlcyBidWlsdCBhdCAlcyBvbiAlc1xuIiwgaGNkX25hbWUsIF9fVElNRV9fLAorICAgICAgICAgICAgICAgIF9fREFURV9fKTsKKyAgICAgICAgd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInUxMzIiKTsKKyAgICAgICAgcmV0dmFsID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ1MTMyX3BsYXRmb3JtX2RyaXZlcik7CisgICAgICAgIHJldHVybiByZXR2YWw7Cit9CisKKworbW9kdWxlX2luaXQodTEzMl9oY2RfaW5pdCk7CitzdGF0aWMgdm9pZCBfX2V4aXQgdTEzMl9oY2RfZXhpdCh2b2lkKQoreworICAgICAgICBzdHJ1Y3QgdTEzMiAqdTEzMjsKKyAgICAgICAgc3RydWN0IHUxMzIgKnRlbXA7CisgICAgICAgIGRvd24oJnUxMzJfbW9kdWxlX2xvY2spOworICAgICAgICB1MTMyX2V4aXRpbmcgKz0gMTsKKyAgICAgICAgdXAoJnUxMzJfbW9kdWxlX2xvY2spOworICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodTEzMiwgdGVtcCwgJnUxMzJfc3RhdGljX2xpc3QsIHUxMzJfbGlzdCkgeworICAgICAgICAgICAgICAgIHBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHUxMzItPnBsYXRmb3JtX2Rldik7CisgICAgICAgIH0gcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnUxMzJfcGxhdGZvcm1fZHJpdmVyKTsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAidTEzMi1oY2QgZHJpdmVyIGRlcmVnaXN0ZXJlZFxuIik7CisgICAgICAgIHdhaXRfZXZlbnQodTEzMl9oY2Rfd2FpdCwgdTEzMl9pbnN0YW5jZXMgPT0gMCk7CisgICAgICAgIGZsdXNoX3dvcmtxdWV1ZSh3b3JrcXVldWUpOworICAgICAgICBkZXN0cm95X3dvcmtxdWV1ZSh3b3JrcXVldWUpOworfQorCisKK21vZHVsZV9leGl0KHUxMzJfaGNkX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWRlYnVnLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktZGVidWcuYwppbmRleCBkYzI4NmE0Li5lMzQ1ZjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktZGVidWcuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktZGVidWcuYwpAQCAtMTYsNyArMTYsNyBAQAogCiAjaW5jbHVkZSAidWhjaS1oY2QuaCIKIAotI2RlZmluZSB1aGNpX2RlYnVnX29wZXJhdGlvbnMgKCogKHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKikgTlVMTCkKKyNkZWZpbmUgdWhjaV9kZWJ1Z19vcGVyYXRpb25zICgqIChjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICopIE5VTEwpCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqdWhjaV9kZWJ1Z2ZzX3Jvb3Q7CiAKICNpZmRlZiBERUJVRwpAQCAtNDI4LDcgKzQyOCw3IEBACiAKIHN0YXRpYyBpbnQgdWhjaV9kZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCB1aGNpX2hjZCAqdWhjaSA9IGlub2RlLT51LmdlbmVyaWNfaXA7CisJc3RydWN0IHVoY2lfaGNkICp1aGNpID0gaW5vZGUtPmlfcHJpdmF0ZTsKIAlzdHJ1Y3QgdWhjaV9kZWJ1ZyAqdXA7CiAJaW50IHJldCA9IC1FTk9NRU07CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTUwMCw3ICs1MDAsNyBAQAogfQogCiAjdW5kZWYgdWhjaV9kZWJ1Z19vcGVyYXRpb25zCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1aGNpX2RlYnVnX29wZXJhdGlvbnMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1aGNpX2RlYnVnX29wZXJhdGlvbnMgPSB7CiAJLm93bmVyID0JVEhJU19NT0RVTEUsCiAJLm9wZW4gPQkJdWhjaV9kZWJ1Z19vcGVuLAogCS5sbHNlZWsgPQl1aGNpX2RlYnVnX2xzZWVrLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLWhjZC5jCmluZGV4IDQxNTFmNjEuLmViNGVhYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaGNkLmMKQEAgLTczNCw2ICs3MzQsMTAgQEAKIAogCS8qIEZJWE1FOiBFbmFibGUgbm9uLVBNRSMgcmVtb3RlIHdha2V1cD8gKi8KIAorCS8qIG1ha2Ugc3VyZSBzbmFwc2hvdCBiZWluZyByZXN1bWVkIHJlLWVudW1lcmF0ZXMgZXZlcnl0aGluZyAqLworCWlmIChtZXNzYWdlLmV2ZW50ID09IFBNX0VWRU5UX1BSRVRIQVcpCisJCXVoY2lfaGNfZGllZCh1aGNpKTsKKwogZG9uZV9va2F5OgogCWNsZWFyX2JpdChIQ0RfRkxBR19IV19BQ0NFU1NJQkxFLCAmaGNkLT5mbGFncyk7CiBkb25lOgpAQCAtOTA5LDggKzkxMyw3IEBACiAJcmV0dXJuIDA7CiAKIGluaXRfZmFpbGVkOgotCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kodWhjaV91cF9jYWNoZXApKQotCQl3YXJuKCJub3QgYWxsIHVyYl9wcml2cyB3ZXJlIGZyZWVkISIpOworCWttZW1fY2FjaGVfZGVzdHJveSh1aGNpX3VwX2NhY2hlcCk7CiAKIHVwX2ZhaWxlZDoKIAlkZWJ1Z2ZzX3JlbW92ZSh1aGNpX2RlYnVnZnNfcm9vdCk7CkBAIC05MjYsMTAgKzkyOSw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgdWhjaV9oY2RfY2xlYW51cCh2b2lkKSAKIHsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnVoY2lfcGNpX2RyaXZlcik7Ci0JCi0JaWYgKGttZW1fY2FjaGVfZGVzdHJveSh1aGNpX3VwX2NhY2hlcCkpCi0JCXdhcm4oIm5vdCBhbGwgdXJiX3ByaXZzIHdlcmUgZnJlZWQhIik7Ci0KKwlrbWVtX2NhY2hlX2Rlc3Ryb3kodWhjaV91cF9jYWNoZXApOwogCWRlYnVnZnNfcmVtb3ZlKHVoY2lfZGVidWdmc19yb290KTsKIAlrZnJlZShlcnJidWYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC91aGNpLWh1Yi5jIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLWh1Yi5jCmluZGV4IGM1NDVlZjkuLjE2ZmI3MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1odWIuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaHViLmMKQEAgLTg0LDYgKzg0LDcgQEAKIAkJdW5zaWduZWQgbG9uZyBwb3J0X2FkZHIpCiB7CiAJaW50IHN0YXR1czsKKwlpbnQgaTsKIAogCWlmIChpbncocG9ydF9hZGRyKSAmIChVU0JQT1JUU0NfU1VTUCB8IFVTQlBPUlRTQ19SRCkpIHsKIAkJQ0xSX1JIX1BPUlRTVEFUKFVTQlBPUlRTQ19TVVNQIHwgVVNCUE9SVFNDX1JEKTsKQEAgLTkyLDkgKzkzLDE0IEBACiAKIAkJLyogVGhlIGNvbnRyb2xsZXIgd29uJ3QgYWN0dWFsbHkgdHVybiBvZmYgdGhlIFJEIGJpdCB1bnRpbAogCQkgKiBpdCBoYXMgaGFkIGEgY2hhbmNlIHRvIHNlbmQgYSBsb3ctc3BlZWQgRU9QIHNlcXVlbmNlLAotCQkgKiB3aGljaCB0YWtlcyAzIGJpdCB0aW1lcyAoPSAyIG1pY3Jvc2Vjb25kcykuICBXZSdsbCBkZWxheQotCQkgKiBzbGlnaHRseSBsb25nZXIgZm9yIGdvb2QgbHVjay4gKi8KLQkJdWRlbGF5KDQpOworCQkgKiB3aGljaCBpcyBzdXBwb3NlZCB0byB0YWtlIDMgYml0IHRpbWVzICg9IDIgbWljcm9zZWNvbmRzKS4KKwkJICogRXhwZXJpbWVudHMgc2hvdyB0aGF0IHNvbWUgY29udHJvbGxlcnMgdGFrZSBsb25nZXIsIHNvCisJCSAqIHdlJ2xsIHBvbGwgZm9yIGNvbXBsZXRpb24uICovCisJCWZvciAoaSA9IDA7IGkgPCAxMDsgKytpKSB7CisJCQlpZiAoIShpbncocG9ydF9hZGRyKSAmIFVTQlBPUlRTQ19SRCkpCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMSk7CisJCX0KIAl9CiAJY2xlYXJfYml0KHBvcnQsICZ1aGNpLT5yZXN1bWluZ19wb3J0cyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbWFnZS9tZGM4MDAuYyBiL2RyaXZlcnMvdXNiL2ltYWdlL21kYzgwMC5jCmluZGV4IDA4ZGFmNDAuLmNhNjMwNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2ltYWdlL21kYzgwMC5jCisrKyBiL2RyaXZlcnMvdXNiL2ltYWdlL21kYzgwMC5jCkBAIC00MjQsNyArNDI0LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBtZGM4MDBfdXNiX2RyaXZlcjsKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1kYzgwMF9kZXZpY2Vfb3BzOworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWRjODAwX2RldmljZV9vcHM7CiBzdGF0aWMgc3RydWN0IHVzYl9jbGFzc19kcml2ZXIgbWRjODAwX2NsYXNzID0gewogCS5uYW1lID0JCSJtZGM4MDAlZCIsCiAJLmZvcHMgPQkJJm1kYzgwMF9kZXZpY2Vfb3BzLApAQCAtOTQxLDcgKzk0MSw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBGaWxlIE9wZXJhdGlvbnMgb2YgdGhpcyBkcml2ZXJzICovCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtZGM4MDBfZGV2aWNlX29wcyA9CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtZGM4MDBfZGV2aWNlX29wcyA9CiB7CiAJLm93bmVyID0JVEhJU19NT0RVTEUsCiAJLnJlYWQgPQkJbWRjODAwX2RldmljZV9yZWFkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2lucHV0L0tjb25maWcKaW5kZXggNjUwMTAzYi4uYTEwMmE1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9LY29uZmlnCkBAIC0yMDUsMTAgKzIwNSwxMiBAQAogCWRlcGVuZHMgb24gVVNCICYmIElOUFVUCiAJLS0taGVscC0tLQogCSAgVVNCIFRvdWNoc2NyZWVuIGRyaXZlciBmb3I6Ci0JICAtIGVHYWxheCBUb3VjaGtpdCBVU0IKKwkgIC0gZUdhbGF4IFRvdWNoa2l0IFVTQiAoYWxzbyBpbmNsdWRlcyBlVHVyYm9Ub3VjaCBDVC00MTAvNTEwLzcwMCkKIAkgIC0gUGFuSml0IFRvdWNoU2V0IFVTQgotCSAgLSAzTSBNaWNyb1RvdWNoIFVTQgorCSAgLSAzTSBNaWNyb1RvdWNoIFVTQiAoRVggSUkgc2VyaWVzKQogCSAgLSBJVE0KKwkgIC0gc29tZSBvdGhlciBlVHVyYm9Ub3VjaAorCSAgLSBHdW56ZSBBSEw2MQogCiAJICBIYXZlIGEgbG9vayBhdCA8aHR0cDovL2xpbnV4LmNoYXB0ZXI3LmNoL3RvdWNoa2l0Lz4gZm9yCiAJICBhIHVzYWdlIGRlc2NyaXB0aW9uIGFuZCB0aGUgcmVxdWlyZWQgdXNlci1zcGFjZSBzdHVmZi4KQEAgLTIxOCw3ICsyMjAsNyBAQAogCiBjb25maWcgVVNCX1RPVUNIU0NSRUVOX0VHQUxBWAogCWRlZmF1bHQgeQotCWJvb2wgImVHYWxheCBkZXZpY2Ugc3VwcG9ydCIgaWYgRU1CRURERUQKKwlib29sICJlR2FsYXgsIGVUdXJib1RvdWNoIENULTQxMC81MTAvNzAwIGRldmljZSBzdXBwb3J0IiBpZiBFTUJFRERFRAogCWRlcGVuZHMgb24gVVNCX1RPVUNIU0NSRUVOCiAKIGNvbmZpZyBVU0JfVE9VQ0hTQ1JFRU5fUEFOSklUCkBAIC0yMjgsNyArMjMwLDcgQEAKIAogY29uZmlnIFVTQl9UT1VDSFNDUkVFTl8zTQogCWRlZmF1bHQgeQotCWJvb2wgIjNNL01pY3JvdG91Y2ggZGV2aWNlIHN1cHBvcnQiIGlmIEVNQkVEREVECisJYm9vbCAiM00vTWljcm90b3VjaCBFWCBJSSBzZXJpZXMgZGV2aWNlIHN1cHBvcnQiIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfVE9VQ0hTQ1JFRU4KIAogY29uZmlnIFVTQl9UT1VDSFNDUkVFTl9JVE0KQEAgLTIzNiw2ICsyMzgsMTYgQEAKIAlib29sICJJVE0gZGV2aWNlIHN1cHBvcnQiIGlmIEVNQkVEREVECiAJZGVwZW5kcyBvbiBVU0JfVE9VQ0hTQ1JFRU4KIAorY29uZmlnIFVTQl9UT1VDSFNDUkVFTl9FVFVSQk8KKwlkZWZhdWx0IHkKKwlib29sICJlVHVyYm9Ub3VjaCAobm9uLWVHYWxheCBjb21wYXRpYmxlKSBkZXZpY2Ugc3VwcG9ydCIgaWYgRU1CRURERUQKKwlkZXBlbmRzIG9uIFVTQl9UT1VDSFNDUkVFTgorCitjb25maWcgVVNCX1RPVUNIU0NSRUVOX0dVTlpFCisJZGVmYXVsdCB5CisJYm9vbCAiR3VuemUgQUhMNjEgZGV2aWNlIHN1cHBvcnQiIGlmIEVNQkVEREVECisJZGVwZW5kcyBvbiBVU0JfVE9VQ0hTQ1JFRU4KKwogY29uZmlnIFVTQl9ZRUFMSU5LCiAJdHJpc3RhdGUgIlllYWxpbmsgdXNiLXAxayB2b2lwIHBob25lIgogCWRlcGVuZHMgb24gVVNCICYmIElOUFVUICYmIEVYUEVSSU1FTlRBTApAQCAtMzI2LDMgKzMzOCwxMyBAQAogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhcHBsZXRvdWNoLgorCitjb25maWcgVVNCX1RSQU5DRVZJQlJBVE9SCisJdHJpc3RhdGUgIlBsYXlTdGF0aW9uIDIgVHJhbmNlIFZpYnJhdG9yIGRyaXZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IGEgUGxheVN0YXRpb24gMiBUcmFuY2UgVmlicmF0b3IKKwkgIGRldmljZSB0byB5b3VyIGNvbXB1dGVyJ3MgVVNCIHBvcnQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHRyYW5jZXZpYnJhdG9yLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZQppbmRleCA3NjQxMTQ1Li40ODU1MWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9NYWtlZmlsZQpAQCAtMyw2ICszLDcgQEAKICMKIAogIyBNdWx0aXBhcnQgb2JqZWN0cy4KK3dhY29tLW9ianMJOj0gd2Fjb21fc3lzLm8gd2Fjb21fd2FjLm8KIHVzYmhpZC1vYmpzCTo9IGhpZC1jb3JlLm8KIAogIyBPcHRpb25hbCBwYXJ0cyBvZiBtdWx0aXBhcnQgb2JqZWN0cy4KQEAgLTQ0LDYgKzQ1LDcgQEAKIG9iai0kKENPTkZJR19VU0JfWUVBTElOSykJKz0geWVhbGluay5vCiBvYmotJChDT05GSUdfVVNCX1hQQUQpCQkrPSB4cGFkLm8KIG9iai0kKENPTkZJR19VU0JfQVBQTEVUT1VDSCkJKz0gYXBwbGV0b3VjaC5vCitvYmotJChDT05GSUdfVVNCX1RSQU5DRVZJQlJBVE9SKQkrPSB0cmFuY2V2aWJyYXRvci5vCiAKIGlmZXEgKCQoQ09ORklHX1VTQl9ERUJVRykseSkKIEVYVFJBX0NGTEFHUyArPSAtRERFQlVHCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9hY2VjYWQuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2FjZWNhZC5jCmluZGV4IDE4YzEwZTEuLmQ4MzYwM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2FjZWNhZC5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2FjZWNhZC5jCkBAIC0xNDEsMTAgKzE0MSw3IEBACiAKIAllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7CiAKLQlpZiAoIShlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpICE9IDMpCisJaWYgKCF1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50KSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlwaXBlID0gdXNiX3JjdmludHBpcGUoZGV2LCBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9hcHBsZXRvdWNoLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9hcHBsZXRvdWNoLmMKaW5kZXggMDQ0ZmFhMC4uMGFhOWNjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvYXBwbGV0b3VjaC5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2FwcGxldG91Y2guYwpAQCAtNDM2LDEwICs0MzYsNyBAQAogCWlmYWNlX2Rlc2MgPSBpZmFjZS0+Y3VyX2FsdHNldHRpbmc7CiAJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgaSsrKSB7CiAJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7Ci0JCWlmICghaW50X2luX2VuZHBvaW50QWRkciAmJgotCQkgICAgKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgJiYKLQkJICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKQotCQkJCQk9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpKSB7CisJCWlmICghaW50X2luX2VuZHBvaW50QWRkciAmJiB1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50KSkgewogCQkJLyogd2UgZm91bmQgYW4gaW50ZXJydXB0IGluIGVuZHBvaW50ICovCiAJCQlpbnRfaW5fZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2F0aV9yZW1vdGUuYyBiL2RyaXZlcnMvdXNiL2lucHV0L2F0aV9yZW1vdGUuYwppbmRleCAzNzE5ZmNiLi4zNTU4ZDdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9hdGlfcmVtb3RlLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvYXRpX3JlbW90ZS5jCkBAIC03MzIsMTIgKzczMiw4IEBACiAJZW5kcG9pbnRfaW4gPSAmaWZhY2VfaG9zdC0+ZW5kcG9pbnRbMF0uZGVzYzsKIAllbmRwb2ludF9vdXQgPSAmaWZhY2VfaG9zdC0+ZW5kcG9pbnRbMV0uZGVzYzsKIAotCWlmICghKGVuZHBvaW50X2luLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikpIHsKLQkJZXJyKCIlczogVW5leHBlY3RlZCBlbmRwb2ludF9pbi0+YkVuZHBvaW50QWRkcmVzc1xuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWlmICgoZW5kcG9pbnRfaW4tPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSAhPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpIHsKLQkJZXJyKCIlczogVW5leHBlY3RlZCBlbmRwb2ludF9pbi0+Ym1BdHRyaWJ1dGVzXG4iLCBfX0ZVTkNUSU9OX18pOworCWlmICghdXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludF9pbikpIHsKKwkJZXJyKCIlczogVW5leHBlY3RlZCBlbmRwb2ludF9pblxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWlmIChsZTE2X3RvX2NwdShlbmRwb2ludF9pbi0+d01heFBhY2tldFNpemUpID09IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jCmluZGV4IDMzMDVmYjYuLjJhM2U5ZTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWQtY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L2hpZC1jb3JlLmMKQEAgLTEwMjMsNyArMTAyMyw4IEBACiAJCQlyZXR1cm47CiAJCWNhc2UgLUVJTFNFUToJCS8qIHByb3RvY29sIGVycm9yIG9yIHVucGx1ZyAqLwogCQljYXNlIC1FUFJPVE86CQkvKiBwcm90b2NvbCBlcnJvciBvciB1bnBsdWcgKi8KLQkJY2FzZSAtRVRJTUVET1VUOgkvKiBOQUsgKi8KKwkJY2FzZSAtRVRJTUU6CQkvKiBwcm90b2NvbCBlcnJvciBvciB1bnBsdWcgKi8KKwkJY2FzZSAtRVRJTUVET1VUOgkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQuLi4gKi8KIAkJCWNsZWFyX2JpdChISURfSU5fUlVOTklORywgJmhpZC0+aW9mbCk7CiAJCQloaWRfaW9fZXJyb3IoaGlkKTsKIAkJCXJldHVybjsKQEAgLTE1MzUsMTMgKzE1MzYsMTcgQEAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9HTEFCCQkweDA2YzIKICNkZWZpbmUgVVNCX0RFVklDRV9JRF80X1BISURHRVRTRVJWT18zMAkweDAwMzgKICNkZWZpbmUgVVNCX0RFVklDRV9JRF8xX1BISURHRVRTRVJWT18zMAkweDAwMzkKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF84XzhfOF9JRl9LSVQJMHgwMDQ1CiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfMF8wXzRfSUZfS0lUCTB4MDA0MAorI2RlZmluZSBVU0JfREVWSUNFX0lEXzBfMTZfMTZfSUZfS0lUCTB4MDA0NAorI2RlZmluZSBVU0JfREVWSUNFX0lEXzhfOF84X0lGX0tJVAkweDAwNDUKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF8wXzhfN19JRl9LSVQJMHgwMDUxCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfMF84XzhfSUZfS0lUCTB4MDA1MworI2RlZmluZSBVU0JfREVWSUNFX0lEX1BISURHRVRfTU9UT1JDT05UUk9MCTB4MDA1OAogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfV0lTRUdST1VQCQkweDA5MjUKICNkZWZpbmUgVVNCX0RFVklDRV9JRF8xX1BISURHRVRTRVJWT18yMAkweDgxMDEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF80X1BISURHRVRTRVJWT18yMAkweDgxMDQKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF84XzhfNF9JRl9LSVQJMHg4MjAxCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfRFVBTF9VU0JfSk9ZUEFEICAgMHg4ODY2CiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVBfTFRECTB4NjY3NwpAQCAtMTU5MSw2ICsxNTk2LDEwIEBACiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9ZRUFMSU5LCQkweDY5OTMKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9ZRUFMSU5LX1AxS19QNEtfQjJLCTB4YjAwMQorCisjZGVmaW5lIFVTQl9WRU5ET1JfSURfQUxDT1IJCTB4MDU4ZgorI2RlZmluZSBVU0JfREVWSUNFX0lEX0FMQ09SX1VTQlJTMjMyCTB4OTcyMAorCiAvKgogICogQWxwaGFiZXRpY2FsbHkgc29ydGVkIGJsYWNrbGlzdCBieSBxdWlyayB0eXBlLgogICovCkBAIC0xNjA4LDYgKzE2MTcsNyBAQAogCXsgVVNCX1ZFTkRPUl9JRF9BSVBURUssIFVTQl9ERVZJQ0VfSURfQUlQVEVLXzIyLCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX0FJUFRFSywgVVNCX0RFVklDRV9JRF9BSVBURUtfMjMsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfQUlQVEVLLCBVU0JfREVWSUNFX0lEX0FJUFRFS18yNCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9BTENPUiwgVVNCX0RFVklDRV9JRF9BTENPUl9VU0JSUzIzMiwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9CRVJLU0hJUkUsIFVTQl9ERVZJQ0VfSURfQkVSS1NISVJFX1BDV0QsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfQ09ERU1FUkNTLCBVU0JfREVWSUNFX0lEX0NPREVNRVJDU19JT1c0MCwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9DT0RFTUVSQ1MsIFVTQl9ERVZJQ0VfSURfQ09ERU1FUkNTX0lPVzI0LCBISURfUVVJUktfSUdOT1JFIH0sCkBAIC0xNjIwLDkgKzE2MzAsMTIgQEAKIAl7IFVTQl9WRU5ET1JfSURfRVNTRU5USUFMX1JFQUxJVFksIFVTQl9ERVZJQ0VfSURfRVNTRU5USUFMX1JFQUxJVFlfUDUsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfR0xBQiwgVVNCX0RFVklDRV9JRF80X1BISURHRVRTRVJWT18zMCwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzMwLCBISURfUVVJUktfSUdOT1JFIH0sCi0JeyBVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfOF84XzhfSUZfS0lULCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfMF8wXzRfSUZfS0lULCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfMF8xNl8xNl9JRl9LSVQsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR0xBQiwgVVNCX0RFVklDRV9JRF84XzhfOF9JRl9LSVQsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR0xBQiwgVVNCX0RFVklDRV9JRF8wXzhfN19JRl9LSVQsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfR0xBQiwgVVNCX0RFVklDRV9JRF8wXzhfOF9JRl9LSVQsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfR0xBQiwgVVNCX0RFVklDRV9JRF9QSElER0VUX01PVE9SQ09OVFJPTCwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9HUklGRklOLCBVU0JfREVWSUNFX0lEX1BPV0VSTUFURSwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9HUklGRklOLCBVU0JfREVWSUNFX0lEX1NPVU5ES05PQiwgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9HVENPLCBVU0JfREVWSUNFX0lEX0dUQ09fOTAsIEhJRF9RVUlSS19JR05PUkUgfSwKQEAgLTE2OTAsNyArMTcwMywxMSBAQAogCXsgVVNCX1ZFTkRPUl9JRF9NR0UsIFVTQl9ERVZJQ0VfSURfTUdFX1VQUywgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9NR0UsIFVTQl9ERVZJQ0VfSURfTUdFX1VQUzEsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAsIEhJRF9RVUlSS19JR05PUkUgfSwKKwl7IFVTQl9WRU5ET1JfSURfT05UUkFLLCBVU0JfREVWSUNFX0lEX09OVFJBS19BRFUxMDAgKyAyMCwgSElEX1FVSVJLX0lHTk9SRSB9LAorCXsgVVNCX1ZFTkRPUl9JRF9PTlRSQUssIFVTQl9ERVZJQ0VfSURfT05UUkFLX0FEVTEwMCArIDMwLCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTAwLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTA4LCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMTE4LCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMjAwLCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgMzAwLCBISURfUVVJUktfSUdOT1JFIH0sCiAJeyBVU0JfVkVORE9SX0lEX09OVFJBSywgVVNCX0RFVklDRV9JRF9PTlRSQUtfQURVMTAwICsgNDAwLCBISURfUVVJUktfSUdOT1JFIH0sCkBAIC0xNzAxLDYgKzE3MTgsNyBAQAogCXsgVVNCX1ZFTkRPUl9JRF9WRVJOSUVSLCBVU0JfREVWSUNFX0lEX1ZFUk5JRVJfQ1lDTE9QUywgSElEX1FVSVJLX0lHTk9SRSB9LAogCXsgVVNCX1ZFTkRPUl9JRF9XSVNFR1JPVVAsIFVTQl9ERVZJQ0VfSURfNF9QSElER0VUU0VSVk9fMjAsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfV0lTRUdST1VQLCBVU0JfREVWSUNFX0lEXzFfUEhJREdFVFNFUlZPXzIwLCBISURfUVVJUktfSUdOT1JFIH0sCisJeyBVU0JfVkVORE9SX0lEX1dJU0VHUk9VUCwgVVNCX0RFVklDRV9JRF84XzhfNF9JRl9LSVQsIEhJRF9RVUlSS19JR05PUkUgfSwKIAl7IFVTQl9WRU5ET1JfSURfWUVBTElOSywgVVNCX0RFVklDRV9JRF9ZRUFMSU5LX1AxS19QNEtfQjJLLCBISURfUVVJUktfSUdOT1JFIH0sCiAKIAl7IFVTQl9WRU5ET1JfSURfQUNFQ0FELCBVU0JfREVWSUNFX0lEX0FDRUNBRF9GTEFJUiwgSElEX1FVSVJLX0lHTk9SRSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvaGlkZGV2LmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWRkZXYuYwppbmRleCBmNmI4MzljLi5hMmI0MTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9oaWRkZXYuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9oaWRkZXYuYwpAQCAtNzIyLDcgKzcyMiw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhpZGRldl9mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaGlkZGV2X2ZvcHMgPSB7CiAJLm93bmVyID0JVEhJU19NT0RVTEUsCiAJLnJlYWQgPQkJaGlkZGV2X3JlYWQsCiAJLndyaXRlID0JaGlkZGV2X3dyaXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvaXRtdG91Y2guYyBiL2RyaXZlcnMvdXNiL2lucHV0L2l0bXRvdWNoLmMKaW5kZXggODZhY2I1Zi4uNjE5NjZkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaW5wdXQvaXRtdG91Y2guYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9pdG10b3VjaC5jCkBAIC04Nyw3ICs4Nyw3IEBACiAJY2FzZSAwOgogCQkvKiBzdWNjZXNzICovCiAJCWJyZWFrOwotCWNhc2UgLUVUSU1FRE9VVDoKKwljYXNlIC1FVElNRToKIAkJLyogdGhpcyB1cmIgaXMgdGltaW5nIG91dCAqLwogCQlkYmcoIiVzIC0gdXJiIHRpbWVkIG91dCAtIHdhcyB0aGUgZGV2aWNlIHVucGx1Z2dlZD8iLAogCQkgICAgX19GVU5DVElPTl9fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L2tleXNwYW5fcmVtb3RlLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9rZXlzcGFuX3JlbW90ZS5jCmluZGV4IDQ3MjNiMzEuLmE5MDM1OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L2tleXNwYW5fcmVtb3RlLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQva2V5c3Bhbl9yZW1vdGUuYwpAQCAtNDIwLDggKzQyMCw3IEBACiAJZm9yIChpID0gMDsgaSA8IGlmYWNlLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkgewogCQllbmRwb2ludCA9ICZpZmFjZS0+ZW5kcG9pbnRbaV0uZGVzYzsKIAotCQlpZiAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgJiYKLQkJICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpKSB7CisJCWlmICh1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50KSkgewogCQkJLyogd2UgZm91bmQgb3VyIGludGVycnVwdCBpbiBlbmRwb2ludCAqLwogCQkJcmV0dXJuIGVuZHBvaW50OwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC9tdG91Y2h1c2IuYyBiL2RyaXZlcnMvdXNiL2lucHV0L210b3VjaHVzYi5jCmluZGV4IGE5Y2NkYTguLjVkY2U5NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L210b3VjaHVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L210b3VjaHVzYi5jCkBAIC0xMDcsNyArMTA3LDcgQEAKIAljYXNlIDA6CiAJCS8qIHN1Y2Nlc3MgKi8KIAkJYnJlYWs7Ci0JY2FzZSAtRVRJTUVET1VUOgorCWNhc2UgLUVUSU1FOgogCQkvKiB0aGlzIHVyYiBpcyB0aW1pbmcgb3V0ICovCiAJCWRiZygiJXMgLSB1cmIgdGltZWQgb3V0IC0gd2FzIHRoZSBkZXZpY2UgdW5wbHVnZ2VkPyIsCiAJCSAgICBfX0ZVTkNUSU9OX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvcG93ZXJtYXRlLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC9wb3dlcm1hdGUuYwppbmRleCBiM2MwZDBjLi5mMGY4ZGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC9wb3dlcm1hdGUuYworKysgYi9kcml2ZXJzL3VzYi9pbnB1dC9wb3dlcm1hdGUuYwpAQCAtMzEzLDkgKzMxMyw3IEBACiAKIAlpbnRlcmZhY2UgPSBpbnRmLT5jdXJfYWx0c2V0dGluZzsKIAllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmVuZHBvaW50WzBdLmRlc2M7Ci0JaWYgKCEoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSkKLQkJcmV0dXJuIC1FSU87Ci0JaWYgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMykgIT0gMykKKwlpZiAoIXVzYl9lbmRwb2ludF9pc19pbnRfaW4oZW5kcG9pbnQpKQogCQlyZXR1cm4gLUVJTzsKIAogCXVzYl9jb250cm9sX21zZyh1ZGV2LCB1c2Jfc25kY3RybHBpcGUodWRldiwgMCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC90b3VjaGtpdHVzYi5jIGIvZHJpdmVycy91c2IvaW5wdXQvdG91Y2hraXR1c2IuYwppbmRleCAwMTQ5MDQzLi4zMGI5ZjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC90b3VjaGtpdHVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3RvdWNoa2l0dXNiLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCWNhc2UgMDoKIAkJLyogc3VjY2VzcyAqLwogCQlicmVhazsKLQljYXNlIC1FVElNRURPVVQ6CisJY2FzZSAtRVRJTUU6CiAJCS8qIHRoaXMgdXJiIGlzIHRpbWluZyBvdXQgKi8KIAkJZGJnKCIlcyAtIHVyYiB0aW1lZCBvdXQgLSB3YXMgdGhlIGRldmljZSB1bnBsdWdnZWQ/IiwKIAkJICAgIF9fRlVOQ1RJT05fXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC90cmFuY2V2aWJyYXRvci5jIGIvZHJpdmVycy91c2IvaW5wdXQvdHJhbmNldmlicmF0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2NkOTFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvdHJhbmNldmlicmF0b3IuYwpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIFBsYXlTdGF0aW9uIDIgVHJhbmNlIFZpYnJhdG9yIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBTYW0gSG9jZXZhciA8c2FtQHpveS5vcmc+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBTdGFuZGFyZCBpbmNsdWRlIGZpbGVzICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisKKy8qIFZlcnNpb24gSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYxLjEiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIlNhbSBIb2NldmFyLCBzYW1Aem95Lm9yZyIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIlBsYXlTdGF0aW9uIDIgVHJhbmNlIFZpYnJhdG9yIGRyaXZlciIKKworI2RlZmluZSBUUkFOQ0VWSUJSQVRPUl9WRU5ET1JfSUQJMHgwYjQ5CS8qIEFTQ0lJIENvcnBvcmF0aW9uICovCisjZGVmaW5lIFRSQU5DRVZJQlJBVE9SX1BST0RVQ1RfSUQJMHgwNjRmCS8qIFRyYW5jZSBWaWJyYXRvciAqLworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGUgW10gPSB7CisJeyBVU0JfREVWSUNFKFRSQU5DRVZJQlJBVE9SX1ZFTkRPUl9JRCwgVFJBTkNFVklCUkFUT1JfUFJPRFVDVF9JRCkgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSAodXNiLCBpZF90YWJsZSk7CisKKy8qIERyaXZlci1sb2NhbCBzcGVjaWZpYyBzdHVmZiAqLworc3RydWN0IHRyYW5jZXZpYnJhdG9yIHsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwl1bnNpZ25lZCBpbnQgc3BlZWQ7Cit9OworCitzdGF0aWMgc3NpemVfdCBzaG93X3NwZWVkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKKwlzdHJ1Y3QgdHJhbmNldmlicmF0b3IgKnR2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0di0+c3BlZWQpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfc3BlZWQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKKwlzdHJ1Y3QgdHJhbmNldmlicmF0b3IgKnR2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlpbnQgdGVtcCwgcmV0dmFsOworCisJdGVtcCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCWlmICh0ZW1wID4gMjU1KQorCQl0ZW1wID0gMjU1OworCWVsc2UgaWYgKHRlbXAgPCAwKQorCQl0ZW1wID0gMDsKKwl0di0+c3BlZWQgPSB0ZW1wOworCisJZGV2X2RiZygmdHYtPnVkZXYtPmRldiwgInNwZWVkID0gJWRcbiIsIHR2LT5zcGVlZCk7CisKKwkvKiBTZXQgc3BlZWQgKi8KKwlyZXR2YWwgPSB1c2JfY29udHJvbF9tc2codHYtPnVkZXYsIHVzYl9zbmRjdHJscGlwZSh0di0+dWRldiwgMCksCisJCQkJIDB4MDEsIC8qIHZlbmRvciByZXF1ZXN0OiBzZXQgc3BlZWQgKi8KKwkJCQkgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9PVEhFUiwKKwkJCQkgdHYtPnNwZWVkLCAvKiBzcGVlZCB2YWx1ZSAqLworCQkJCSAwLCBOVUxMLCAwLCBVU0JfQ1RSTF9HRVRfVElNRU9VVCk7CisJaWYgKHJldHZhbCkgeworCQlkZXZfZGJnKCZ0di0+dWRldi0+ZGV2LCAicmV0dmFsID0gJWRcbiIsIHJldHZhbCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHNwZWVkLCBTX0lXVUdPIHwgU19JUlVHTywgc2hvd19zcGVlZCwgc2V0X3NwZWVkKTsKKworc3RhdGljIGludCB0dl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlLAorCQkgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpOworCXN0cnVjdCB0cmFuY2V2aWJyYXRvciAqZGV2OworCWludCByZXR2YWw7CisKKwlkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHJhbmNldmlicmF0b3IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkZXYtPnVkZXYgPSB1c2JfZ2V0X2Rldih1ZGV2KTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgZGV2KTsKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfc3BlZWQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3JfY3JlYXRlX2ZpbGU7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfY3JlYXRlX2ZpbGU6CisJdXNiX3B1dF9kZXYodWRldik7CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworZXJyb3I6CisJa2ZyZWUoZGV2KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCB0dl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IHRyYW5jZXZpYnJhdG9yICpkZXY7CisKKwlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRlcmZhY2UpOworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfc3BlZWQpOworCXVzYl9wdXRfZGV2KGRldi0+dWRldik7CisJa2ZyZWUoZGV2KTsKK30KKworLyogVVNCIHN1YnN5c3RlbSBvYmplY3QgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB0dl9kcml2ZXIgPSB7CisJLm5hbWUgPQkJInRyYW5jZXZpYnJhdG9yIiwKKwkucHJvYmUgPQl0dl9wcm9iZSwKKwkuZGlzY29ubmVjdCA9CXR2X2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0JaWRfdGFibGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0dl9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbCA9IHVzYl9yZWdpc3RlcigmdHZfZHJpdmVyKTsKKwlpZiAocmV0dmFsKSB7CisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkIiwgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlpbmZvKERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0dl9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnR2X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0ICh0dl9pbml0KTsKK21vZHVsZV9leGl0ICh0dl9leGl0KTsKKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pbnB1dC91c2Jtb3VzZS5jIGIvZHJpdmVycy91c2IvaW5wdXQvdXNibW91c2UuYwppbmRleCA0NDY5MzViLi4wZmI3OTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC91c2Jtb3VzZS5jCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3VzYm1vdXNlLmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogCiBzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgdXNiX21vdXNlX2lkX3RhYmxlIFtdID0gewogCXsgVVNCX0lOVEVSRkFDRV9JTkZPKDMsIDEsIDIpIH0sCi0gICAgeyB9CQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KKwl7IH0JLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgdXNiX21vdXNlX2lkX3RhYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3VzYnRvdWNoc2NyZWVuLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC91c2J0b3VjaHNjcmVlbi5jCmluZGV4IGEzMzhiZjQuLjQ2NDBkMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3VzYnRvdWNoc2NyZWVuLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvdXNidG91Y2hzY3JlZW4uYwpAQCAtMiw5ICsyLDEyIEBACiAgKiB1c2J0b3VjaHNjcmVlbi5jCiAgKiBEcml2ZXIgZm9yIFVTQiBUb3VjaHNjcmVlbnMsIHN1cHBvcnRpbmcgdGhvc2UgZGV2aWNlczoKICAqICAtIGVHYWxheCBUb3VjaGtpdAotICogIC0gM00vTWljcm90b3VjaAorICogICAgaW5jbHVkZXMgZVR1cmJvVG91Y2ggQ1QtNDEwLzUxMC83MDAKKyAqICAtIDNNL01pY3JvdG91Y2ggIEVYIElJIHNlcmllcwogICogIC0gSVRNCiAgKiAgLSBQYW5KaXQgVG91Y2hTZXQKKyAqICAtIGVUdXJib1RvdWNoCisgKiAgLSBHdW56ZSBBSEw2MQogICoKICAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IGJ5IERhbmllbCBSaXR6IDxkYW5pZWwucml0ekBnbXguY2g+CiAgKiBDb3B5cmlnaHQgKEMpIGJ5IFRvZGQgRS4gSm9obnNvbiAobXRvdWNodXNiLmMpCkBAIC00Miw3ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiL2lucHV0Lmg+CiAKIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJInYwLjMiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkidjAuNCIKICNkZWZpbmUgRFJJVkVSX0FVVEhPUgkJIkRhbmllbCBSaXR6IDxkYW5pZWwucml0ekBnbXguY2g+IgogI2RlZmluZSBEUklWRVJfREVTQwkJIlVTQiBUb3VjaHNjcmVlbiBEcml2ZXIiCiAKQEAgLTYwLDYgKzYzLDcgQEAKIAlpbnQgZmxhZ3M7CiAKIAl2b2lkICgqcHJvY2Vzc19wa3QpIChzdHJ1Y3QgdXNidG91Y2hfdXNiICp1c2J0b3VjaCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGNoYXIgKnBrdCwgaW50IGxlbik7CisJaW50ICAoKmdldF9wa3RfbGVuKSAodW5zaWduZWQgY2hhciAqcGt0LCBpbnQgbGVuKTsKIAlpbnQgICgqcmVhZF9kYXRhKSAgICh1bnNpZ25lZCBjaGFyICpwa3QsIGludCAqeCwgaW50ICp5LCBpbnQgKnRvdWNoLCBpbnQgKnByZXNzKTsKIAlpbnQgICgqaW5pdCkgICAgICAgIChzdHJ1Y3QgdXNidG91Y2hfdXNiICp1c2J0b3VjaCk7CiB9OwpAQCAtODEsOCArODUsMTYgQEAKIAljaGFyIHBoeXNbNjRdOwogfTsKIAotc3RhdGljIHZvaWQgdXNidG91Y2hfcHJvY2Vzc19wa3Qoc3RydWN0IHVzYnRvdWNoX3VzYiAqdXNidG91Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgY2hhciAqcGt0LCBpbnQgbGVuKTsKKworI2lmIGRlZmluZWQoQ09ORklHX1VTQl9UT1VDSFNDUkVFTl9FR0FMQVgpIHx8IGRlZmluZWQoQ09ORklHX1VTQl9UT1VDSFNDUkVFTl9FVFVSQk8pCisjZGVmaW5lIE1VTFRJX1BBQ0tFVAorI2VuZGlmCisKKyNpZmRlZiBNVUxUSV9QQUNLRVQKK3N0YXRpYyB2b2lkIHVzYnRvdWNoX3Byb2Nlc3NfbXVsdGkoc3RydWN0IHVzYnRvdWNoX3VzYiAqdXNidG91Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpwa3QsIGludCBsZW4pOworI2VuZGlmCiAKIC8qIGRldmljZSB0eXBlcyAqLwogZW51bSB7CkBAIC05MSwxNCArMTAzLDE5IEBACiAJREVWVFlQRV9QQU5KSVQsCiAJREVWVFlQRV8zTSwKIAlERVZUWVBFX0lUTSwKKwlERVZUWVBFX0VUVVJCTywKKwlERVZUWVBFX0dVTlpFLAogfTsKIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYnRvdWNoX2RldmljZXNbXSA9IHsKICNpZmRlZiBDT05GSUdfVVNCX1RPVUNIU0NSRUVOX0VHQUxBWAogCXtVU0JfREVWSUNFKDB4MzgyMywgMHgwMDAxKSwgLmRyaXZlcl9pbmZvID0gREVWVFlQRV9FR0FMQVh9LAorCXtVU0JfREVWSUNFKDB4MzgyMywgMHgwMDAyKSwgLmRyaXZlcl9pbmZvID0gREVWVFlQRV9FR0FMQVh9LAogCXtVU0JfREVWSUNFKDB4MDEyMywgMHgwMDAxKSwgLmRyaXZlcl9pbmZvID0gREVWVFlQRV9FR0FMQVh9LAogCXtVU0JfREVWSUNFKDB4MGVlZiwgMHgwMDAxKSwgLmRyaXZlcl9pbmZvID0gREVWVFlQRV9FR0FMQVh9LAogCXtVU0JfREVWSUNFKDB4MGVlZiwgMHgwMDAyKSwgLmRyaXZlcl9pbmZvID0gREVWVFlQRV9FR0FMQVh9LAorCXtVU0JfREVWSUNFKDB4MTIzNCwgMHgwMDAxKSwgLmRyaXZlcl9pbmZvID0gREVWVFlQRV9FR0FMQVh9LAorCXtVU0JfREVWSUNFKDB4MTIzNCwgMHgwMDAyKSwgLmRyaXZlcl9pbmZvID0gREVWVFlQRV9FR0FMQVh9LAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfVVNCX1RPVUNIU0NSRUVOX1BBTkpJVApAQCAtMTE2LDYgKzEzMywxNCBAQAogCXtVU0JfREVWSUNFKDB4MDQwMywgMHhmOWU5KSwgLmRyaXZlcl9pbmZvID0gREVWVFlQRV9JVE19LAogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfVVNCX1RPVUNIU0NSRUVOX0VUVVJCTworCXtVU0JfREVWSUNFKDB4MTIzNCwgMHg1Njc4KSwgLmRyaXZlcl9pbmZvID0gREVWVFlQRV9FVFVSQk99LAorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVVNCX1RPVUNIU0NSRUVOX0dVTlpFCisJe1VTQl9ERVZJQ0UoMHgwNjM3LCAweDAwMDEpLCAuZHJpdmVyX2luZm8gPSBERVZUWVBFX0dVTlpFfSwKKyNlbmRpZgorCiAJe30KIH07CiAKQEAgLTE0MCw4MiArMTY1LDIzIEBACiAJKnRvdWNoID0gcGt0WzBdICYgMHgwMTsKIAogCXJldHVybiAxOwotCiB9CiAKLXN0YXRpYyBpbnQgZWdhbGF4X2dldF9wa3RfbGVuKHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgZWdhbGF4X2dldF9wa3RfbGVuKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKIHsKIAlzd2l0Y2ggKGJ1ZlswXSAmIEVHQUxBWF9QS1RfVFlQRV9NQVNLKSB7CiAJY2FzZSBFR0FMQVhfUEtUX1RZUEVfUkVQVDoKIAkJcmV0dXJuIDU7CiAKIAljYXNlIEVHQUxBWF9QS1RfVFlQRV9ESUFHOgorCQlpZiAobGVuIDwgMikKKwkJCXJldHVybiAtMTsKKwogCQlyZXR1cm4gYnVmWzFdICsgMjsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KLQotc3RhdGljIHZvaWQgZWdhbGF4X3Byb2Nlc3Moc3RydWN0IHVzYnRvdWNoX3VzYiAqdXNidG91Y2gsIHN0cnVjdCBwdF9yZWdzICpyZWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcGt0LCBpbnQgbGVuKQotewotCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLQlpbnQgcGt0X2xlbiwgYnVmX2xlbiwgcG9zOwotCi0JLyogaWYgdGhlIGJ1ZmZlciBjb250YWlucyBkYXRhLCBhcHBlbmQgKi8KLQlpZiAodW5saWtlbHkodXNidG91Y2gtPmJ1Zl9sZW4pKSB7Ci0JCWludCB0bXA7Ci0KLQkJLyogaWYgb25seSAxIGJ5dGUgaW4gYnVmZmVyLCBhZGQgYW5vdGhlciBvbmUgdG8gZ2V0IGxlbmd0aCAqLwotCQlpZiAodXNidG91Y2gtPmJ1Zl9sZW4gPT0gMSkKLQkJCXVzYnRvdWNoLT5idWZmZXJbMV0gPSBwa3RbMF07Ci0KLQkJcGt0X2xlbiA9IGVnYWxheF9nZXRfcGt0X2xlbih1c2J0b3VjaC0+YnVmZmVyKTsKLQotCQkvKiB1bmtub3duIHBhY2tldDogZHJvcCBldmVyeXRoaW5nICovCi0JCWlmICghcGt0X2xlbikKLQkJCXJldHVybjsKLQotCQkvKiBhcHBlbmQsIHByb2Nlc3MgKi8KLQkJdG1wID0gcGt0X2xlbiAtIHVzYnRvdWNoLT5idWZfbGVuOwotCQltZW1jcHkodXNidG91Y2gtPmJ1ZmZlciArIHVzYnRvdWNoLT5idWZfbGVuLCBwa3QsIHRtcCk7Ci0JCXVzYnRvdWNoX3Byb2Nlc3NfcGt0KHVzYnRvdWNoLCByZWdzLCB1c2J0b3VjaC0+YnVmZmVyLCBwa3RfbGVuKTsKLQotCQlidWZmZXIgPSBwa3QgKyB0bXA7Ci0JCWJ1Zl9sZW4gPSBsZW4gLSB0bXA7Ci0JfSBlbHNlIHsKLQkJYnVmZmVyID0gcGt0OwotCQlidWZfbGVuID0gbGVuOwotCX0KLQotCS8qIG9ubHkgb25lIGJ5dGUgbGVmdCBpbiBidWZmZXIgKi8KLQlpZiAodW5saWtlbHkoYnVmX2xlbiA9PSAxKSkgewotCQl1c2J0b3VjaC0+YnVmZmVyWzBdID0gYnVmZmVyWzBdOwotCQl1c2J0b3VjaC0+YnVmX2xlbiA9IDE7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBsb29wIG92ZXIgdGhlIGJ1ZmZlciAqLwotCXBvcyA9IDA7Ci0Jd2hpbGUgKHBvcyA8IGJ1Zl9sZW4pIHsKLQkJLyogZ2V0IHBhY2tldCBsZW4gKi8KLQkJcGt0X2xlbiA9IGVnYWxheF9nZXRfcGt0X2xlbihidWZmZXIgKyBwb3MpOwotCi0JCS8qIHVua25vd24gcGFja2V0OiBkcm9wIGV2ZXJ5dGhpbmcgKi8KLQkJaWYgKHVubGlrZWx5KCFwa3RfbGVuKSkKLQkJCXJldHVybjsKLQotCQkvKiBmdWxsIHBhY2tldDogcHJvY2VzcyAqLwotCQlpZiAobGlrZWx5KHBrdF9sZW4gPD0gYnVmX2xlbikpIHsKLQkJCXVzYnRvdWNoX3Byb2Nlc3NfcGt0KHVzYnRvdWNoLCByZWdzLCBidWZmZXIgKyBwb3MsIHBrdF9sZW4pOwotCQl9IGVsc2UgewotCQkJLyogaW5jb21wbGV0ZSBwYWNrZXQ6IHNhdmUgaW4gYnVmZmVyICovCi0JCQltZW1jcHkodXNidG91Y2gtPmJ1ZmZlciwgYnVmZmVyICsgcG9zLCBidWZfbGVuIC0gcG9zKTsKLQkJCXVzYnRvdWNoLT5idWZfbGVuID0gYnVmX2xlbiAtIHBvczsKLQkJfQotCQlwb3MgKz0gcGt0X2xlbjsKLQl9Ci19CiAjZW5kaWYKIAogCkBAIC0yNTQsNyArMjIwLDcgQEAKIAogc3RhdGljIGludCBtdG91Y2hfaW5pdChzdHJ1Y3QgdXNidG91Y2hfdXNiICp1c2J0b3VjaCkKIHsKLQlpbnQgcmV0OworCWludCByZXQsIGk7CiAKIAlyZXQgPSB1c2JfY29udHJvbF9tc2codXNidG91Y2gtPnVkZXYsIHVzYl9yY3ZjdHJscGlwZSh1c2J0b3VjaC0+dWRldiwgMCksCiAJICAgICAgICAgICAgICAgICAgICAgIE1UT1VDSFVTQl9SRVNFVCwKQEAgLTI2NCwxNSArMjMwLDIwIEBACiAJICAgIF9fRlVOQ1RJT05fXywgcmV0KTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKKwltc2xlZXAoMTUwKTsKIAotCXJldCA9IHVzYl9jb250cm9sX21zZyh1c2J0b3VjaC0+dWRldiwgdXNiX3JjdmN0cmxwaXBlKHVzYnRvdWNoLT51ZGV2LCAwKSwKLQkgICAgICAgICAgICAgICAgICAgICAgTVRPVUNIVVNCX0FTWU5DX1JFUE9SVCwKLQkgICAgICAgICAgICAgICAgICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAotCSAgICAgICAgICAgICAgICAgICAgICAxLCAxLCBOVUxMLCAwLCBVU0JfQ1RSTF9TRVRfVElNRU9VVCk7Ci0JZGJnKCIlcyAtIHVzYl9jb250cm9sX21zZyAtIE1UT1VDSFVTQl9BU1lOQ19SRVBPUlQgLSBieXRlc3xlcnI6ICVkIiwKLQkgICAgX19GVU5DVElPTl9fLCByZXQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVzYnRvdWNoLT51ZGV2LCB1c2JfcmN2Y3RybHBpcGUodXNidG91Y2gtPnVkZXYsIDApLAorCQkJCSAgICAgIE1UT1VDSFVTQl9BU1lOQ19SRVBPUlQsCisJCQkJICAgICAgVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJCSAgICAgIDEsIDEsIE5VTEwsIDAsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKwkJZGJnKCIlcyAtIHVzYl9jb250cm9sX21zZyAtIE1UT1VDSFVTQl9BU1lOQ19SRVBPUlQgLSBieXRlc3xlcnI6ICVkIiwKKwkJICAgIF9fRlVOQ1RJT05fXywgcmV0KTsKKwkJaWYgKHJldCA+PSAwKQorCQkJYnJlYWs7CisJCWlmIChyZXQgIT0gLUVQSVBFKQorCQkJcmV0dXJuIHJldDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI5Niw2ICsyNjcsNTQgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGVUdXJib1RvdWNoIHBhcnQKKyAqLworI2lmZGVmIENPTkZJR19VU0JfVE9VQ0hTQ1JFRU5fRVRVUkJPCitzdGF0aWMgaW50IGV0dXJib19yZWFkX2RhdGEodW5zaWduZWQgY2hhciAqcGt0LCBpbnQgKngsIGludCAqeSwgaW50ICp0b3VjaCwgaW50ICpwcmVzcykKK3sKKwl1bnNpZ25lZCBpbnQgc2hpZnQ7CisKKwkvKiBwYWNrZXRzIHNob3VsZCBzdGFydCB3aXRoIHN5bmMgKi8KKwlpZiAoIShwa3RbMF0gJiAweDgwKSkKKwkJcmV0dXJuIDA7CisKKwlzaGlmdCA9ICg2IC0gKHBrdFswXSAmIDB4MDMpKTsKKwkqeCA9ICgocGt0WzNdIDw8IDcpIHwgcGt0WzRdKSA+PiBzaGlmdDsKKwkqeSA9ICgocGt0WzFdIDw8IDcpIHwgcGt0WzJdKSA+PiBzaGlmdDsKKwkqdG91Y2ggPSAocGt0WzBdICYgMHgxMCkgPyAxIDogMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGV0dXJib19nZXRfcGt0X2xlbih1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaWYgKGJ1ZlswXSAmIDB4ODApCisJCXJldHVybiA1OworCWlmIChidWZbMF0gPT0gMHgwMSkKKwkJcmV0dXJuIDM7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEd1bnplIHBhcnQKKyAqLworI2lmZGVmIENPTkZJR19VU0JfVE9VQ0hTQ1JFRU5fR1VOWkUKK3N0YXRpYyBpbnQgZ3VuemVfcmVhZF9kYXRhKHVuc2lnbmVkIGNoYXIgKnBrdCwgaW50ICp4LCBpbnQgKnksIGludCAqdG91Y2gsIGludCAqcHJlc3MpCit7CisJaWYgKCEocGt0WzBdICYgMHg4MCkgfHwgKChwa3RbMV0gfCBwa3RbMl0gfCBwa3RbM10pICYgMHg4MCkpCisJCXJldHVybiAwOworCisJKnggPSAoKHBrdFswXSAmIDB4MUYpIDw8IDcpIHwgKHBrdFsyXSAmIDB4N0YpOworCSp5ID0gKChwa3RbMV0gJiAweDFGKSA8PCA3KSB8IChwa3RbM10gJiAweDdGKTsKKwkqdG91Y2ggPSBwa3RbMF0gJiAweDIwOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiB0aGUgZGlmZmVyZW50IGRldmljZSBkZXNjcmlwdG9ycwogICovCiBzdGF0aWMgc3RydWN0IHVzYnRvdWNoX2RldmljZV9pbmZvIHVzYnRvdWNoX2Rldl9pbmZvW10gPSB7CkBAIC0zMDcsNyArMzI2LDggQEAKIAkJLm1heF95YwkJPSAweDA3ZmYsCiAJCS5yZXB0X3NpemUJPSAxNiwKIAkJLmZsYWdzCQk9IFVTQlRPVUNIX0ZMR19CVUZGRVIsCi0JCS5wcm9jZXNzX3BrdAk9IGVnYWxheF9wcm9jZXNzLAorCQkucHJvY2Vzc19wa3QJPSB1c2J0b3VjaF9wcm9jZXNzX211bHRpLAorCQkuZ2V0X3BrdF9sZW4JPSBlZ2FsYXhfZ2V0X3BrdF9sZW4sCiAJCS5yZWFkX2RhdGEJPSBlZ2FsYXhfcmVhZF9kYXRhLAogCX0sCiAjZW5kaWYKQEAgLTM0Niw2ICszNjYsMzEgQEAKIAkJLnJlYWRfZGF0YQk9IGl0bV9yZWFkX2RhdGEsCiAJfSwKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX1VTQl9UT1VDSFNDUkVFTl9FVFVSQk8KKwlbREVWVFlQRV9FVFVSQk9dID0geworCQkubWluX3hjCQk9IDB4MCwKKwkJLm1heF94YwkJPSAweDA3ZmYsCisJCS5taW5feWMJCT0gMHgwLAorCQkubWF4X3ljCQk9IDB4MDdmZiwKKwkJLnJlcHRfc2l6ZQk9IDgsCisJCS5mbGFncwkJPSBVU0JUT1VDSF9GTEdfQlVGRkVSLAorCQkucHJvY2Vzc19wa3QJPSB1c2J0b3VjaF9wcm9jZXNzX211bHRpLAorCQkuZ2V0X3BrdF9sZW4JPSBldHVyYm9fZ2V0X3BrdF9sZW4sCisJCS5yZWFkX2RhdGEJPSBldHVyYm9fcmVhZF9kYXRhLAorCX0sCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19VU0JfVE9VQ0hTQ1JFRU5fR1VOWkUKKwlbREVWVFlQRV9HVU5aRV0gPSB7CisJCS5taW5feGMJCT0gMHgwLAorCQkubWF4X3hjCQk9IDB4MGZmZiwKKwkJLm1pbl95YwkJPSAweDAsCisJCS5tYXhfeWMJCT0gMHgwZmZmLAorCQkucmVwdF9zaXplCT0gNCwKKwkJLnJlYWRfZGF0YQk9IGd1bnplX3JlYWRfZGF0YSwKKwl9LAorI2VuZGlmCiB9OwogCiAKQEAgLTM3Nyw2ICs0MjIsODMgQEAKIH0KIAogCisjaWZkZWYgTVVMVElfUEFDS0VUCitzdGF0aWMgdm9pZCB1c2J0b3VjaF9wcm9jZXNzX211bHRpKHN0cnVjdCB1c2J0b3VjaF91c2IgKnVzYnRvdWNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcGt0LCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKKwlpbnQgcGt0X2xlbiwgcG9zLCBidWZfbGVuLCB0bXA7CisKKwkvKiBwcm9jZXNzIGJ1ZmZlciAqLworCWlmICh1bmxpa2VseSh1c2J0b3VjaC0+YnVmX2xlbikpIHsKKwkJLyogdHJ5IHRvIGdldCBzaXplICovCisJCXBrdF9sZW4gPSB1c2J0b3VjaC0+dHlwZS0+Z2V0X3BrdF9sZW4oCisJCQkJdXNidG91Y2gtPmJ1ZmZlciwgdXNidG91Y2gtPmJ1Zl9sZW4pOworCisJCS8qIGRyb3A/ICovCisJCWlmICh1bmxpa2VseSghcGt0X2xlbikpCisJCQlnb3RvIG91dF9mbHVzaF9idWY7CisKKwkJLyogbmVlZCB0byBhcHBlbmQgLXBrdF9sZW4gYnl0ZXMgYmVmb3JlIGFibGUgdG8gZ2V0IHNpemUgKi8KKwkJaWYgKHVubGlrZWx5KHBrdF9sZW4gPCAwKSkgeworCQkJaW50IGFwcGVuZCA9IC1wa3RfbGVuOworCQkJaWYgKHVubGlrZWx5KGFwcGVuZCA+IGxlbikpCisJCQkgICAgICAgYXBwZW5kID0gbGVuOworCQkJaWYgKHVzYnRvdWNoLT5idWZfbGVuICsgYXBwZW5kID49IHVzYnRvdWNoLT50eXBlLT5yZXB0X3NpemUpCisJCQkJZ290byBvdXRfZmx1c2hfYnVmOworCQkJbWVtY3B5KHVzYnRvdWNoLT5idWZmZXIgKyB1c2J0b3VjaC0+YnVmX2xlbiwgcGt0LCBhcHBlbmQpOworCQkJdXNidG91Y2gtPmJ1Zl9sZW4gKz0gYXBwZW5kOworCisJCQlwa3RfbGVuID0gdXNidG91Y2gtPnR5cGUtPmdldF9wa3RfbGVuKAorCQkJCQl1c2J0b3VjaC0+YnVmZmVyLCB1c2J0b3VjaC0+YnVmX2xlbik7CisJCQlpZiAocGt0X2xlbiA8IDApCisJCQkJcmV0dXJuOworCQl9CisKKwkJLyogYXBwZW5kICovCisJCXRtcCA9IHBrdF9sZW4gLSB1c2J0b3VjaC0+YnVmX2xlbjsKKwkJaWYgKHVzYnRvdWNoLT5idWZfbGVuICsgdG1wID49IHVzYnRvdWNoLT50eXBlLT5yZXB0X3NpemUpCisJCQlnb3RvIG91dF9mbHVzaF9idWY7CisJCW1lbWNweSh1c2J0b3VjaC0+YnVmZmVyICsgdXNidG91Y2gtPmJ1Zl9sZW4sIHBrdCwgdG1wKTsKKwkJdXNidG91Y2hfcHJvY2Vzc19wa3QodXNidG91Y2gsIHJlZ3MsIHVzYnRvdWNoLT5idWZmZXIsIHBrdF9sZW4pOworCisJCWJ1ZmZlciA9IHBrdCArIHRtcDsKKwkJYnVmX2xlbiA9IGxlbiAtIHRtcDsKKwl9IGVsc2UgeworCQlidWZmZXIgPSBwa3Q7CisJCWJ1Zl9sZW4gPSBsZW47CisJfQorCisJLyogbG9vcCBvdmVyIHRoZSByZWNlaXZlZCBwYWNrZXQsIHByb2Nlc3MgKi8KKwlwb3MgPSAwOworCXdoaWxlIChwb3MgPCBidWZfbGVuKSB7CisJCS8qIGdldCBwYWNrZXQgbGVuICovCisJCXBrdF9sZW4gPSB1c2J0b3VjaC0+dHlwZS0+Z2V0X3BrdF9sZW4oYnVmZmVyICsgcG9zLCBsZW4pOworCisJCS8qIHVua25vd24gcGFja2V0OiBkcm9wIGV2ZXJ5dGhpbmcgKi8KKwkJaWYgKHVubGlrZWx5KCFwa3RfbGVuKSkKKwkJCWdvdG8gb3V0X2ZsdXNoX2J1ZjsKKworCQkvKiBmdWxsIHBhY2tldDogcHJvY2VzcyAqLworCQlpZiAobGlrZWx5KChwa3RfbGVuID4gMCkgJiYgKHBrdF9sZW4gPD0gYnVmX2xlbiAtIHBvcykpKSB7CisJCQl1c2J0b3VjaF9wcm9jZXNzX3BrdCh1c2J0b3VjaCwgcmVncywgYnVmZmVyICsgcG9zLCBwa3RfbGVuKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGluY29tcGxldGUgcGFja2V0OiBzYXZlIGluIGJ1ZmZlciAqLworCQkJbWVtY3B5KHVzYnRvdWNoLT5idWZmZXIsIGJ1ZmZlciArIHBvcywgYnVmX2xlbiAtIHBvcyk7CisJCQl1c2J0b3VjaC0+YnVmX2xlbiA9IGJ1Zl9sZW4gLSBwb3M7CisJCQlyZXR1cm47CisJCX0KKwkJcG9zICs9IHBrdF9sZW47CisJfQorCitvdXRfZmx1c2hfYnVmOgorCXVzYnRvdWNoLT5idWZfbGVuID0gMDsKKwlyZXR1cm47Cit9CisjZW5kaWYKKworCiBzdGF0aWMgdm9pZCB1c2J0b3VjaF9pcnEoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgdXNidG91Y2hfdXNiICp1c2J0b3VjaCA9IHVyYi0+Y29udGV4dDsKQEAgLTM4Niw3ICs1MDgsNyBAQAogCWNhc2UgMDoKIAkJLyogc3VjY2VzcyAqLwogCQlicmVhazsKLQljYXNlIC1FVElNRURPVVQ6CisJY2FzZSAtRVRJTUU6CiAJCS8qIHRoaXMgdXJiIGlzIHRpbWluZyBvdXQgKi8KIAkJZGJnKCIlcyAtIHVyYiB0aW1lZCBvdXQgLSB3YXMgdGhlIGRldmljZSB1bnBsdWdnZWQ/IiwKIAkJICAgIF9fRlVOQ1RJT05fXyk7CkBAIC00NTIsNyArNTc0LDcgQEAKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAlzdHJ1Y3QgdXNidG91Y2hfZGV2aWNlX2luZm8gKnR5cGU7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gLUVOT01FTTsKIAogCWludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOwogCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKQEAgLTUyNiw2ICs2NDgsNyBAQAogCQkJIHVzYnRvdWNoLT5kYXRhLCB0eXBlLT5yZXB0X3NpemUsCiAJCQkgdXNidG91Y2hfaXJxLCB1c2J0b3VjaCwgZW5kcG9pbnQtPmJJbnRlcnZhbCk7CiAKKwl1c2J0b3VjaC0+aXJxLT5kZXYgPSB1c2J0b3VjaC0+dWRldjsKIAl1c2J0b3VjaC0+aXJxLT50cmFuc2Zlcl9kbWEgPSB1c2J0b3VjaC0+ZGF0YV9kbWE7CiAJdXNidG91Y2gtPmlycS0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CiAKQEAgLTU1Myw3ICs2NzYsNyBAQAogb3V0X2ZyZWU6CiAJaW5wdXRfZnJlZV9kZXZpY2UoaW5wdXRfZGV2KTsKIAlrZnJlZSh1c2J0b3VjaCk7Ci0JcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgdXNidG91Y2hfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjk0NjFhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAzICswLDAgQEAKLS8qCi0gKiAgVVNCIFdhY29tIEdyYXBoaXJlIGFuZCBXYWNvbSBJbnR1b3MgdGFibGV0IHN1cHBvcnQKLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgVm9qdGVjaCBQYXZsaWsJPHZvanRlY2hAdWN3LmN6PgotICogIENvcHlyaWdodCAoYykgMjAwMCBBbmRyZWFzIEJhY2ggQWFlbgk8YWJhY2hAc3RvZmFuZXQuZGs+Ci0gKiAgQ29weXJpZ2h0IChjKSAyMDAwIENsaWZmb3JkIFdvbGYJCTxjbGlmZm9yZEBjbGlmZm9yZC5hdD4KLSAqICBDb3B5cmlnaHQgKGMpIDIwMDAgU2FtIE1vc2VsCQk8c2FtLm1vc2VsQGNvbXB1dGVyLm9yZz4KLSAqICBDb3B5cmlnaHQgKGMpIDIwMDAgSmFtZXMgRS4gQmxhaXIJCTxjb3J2dXNAZ251Lm9yZz4KLSAqICBDb3B5cmlnaHQgKGMpIDIwMDAgRGFuaWVsIEVnZ2VyCQk8ZWdnZXJAc3VzZS5kZT4KLSAqICBDb3B5cmlnaHQgKGMpIDIwMDEgRnJlZGVyaWMgTGVwaWVkCQk8ZmxlcGllZEBtYW5kcmFrZXNvZnQuY29tPgotICogIENvcHlyaWdodCAoYykgMjAwNCBQYW5hZ2lvdGlzIElzc2FyaXMJPHBhbmFnaW90aXMuaXNzYXJpc0BtZWNoLmt1bGV1dmVuLmFjLmJlPgotICogIENvcHlyaWdodCAoYykgMjAwMi0yMDA2IFBpbmcgQ2hlbmcJCTxwaW5nY0B3YWNvbS5jb20+Ci0gKgotICogIENoYW5nZUxvZzoKLSAqICAgICAgdjAuMSAodnApICAtIEluaXRpYWwgcmVsZWFzZQotICogICAgICB2MC4yIChhYmEpIC0gU3VwcG9ydCBmb3IgYWxsIGJ1dHRvbnMgLyBjb21iaW5hdGlvbnMKLSAqICAgICAgdjAuMyAodnApICAtIFN1cHBvcnQgZm9yIEludHVvcyBhZGRlZAotICoJdjAuNCAoc20pICAtIFN1cHBvcnQgZm9yIG1vcmUgSW50dW9zIG1vZGVscywgbWVudXN0cmlwCi0gKgkJCXJlbGF0aXZlIG1vZGUsIHByb3hpbWl0eS4KLSAqCXYwLjUgKHZwKSAgLSBCaWcgY2xlYW51cCwgbmlmdHkgZmVhdHVyZXMgcmVtb3ZlZCwKLSAqCQkJdGhleSBiZWxvbmcgaW4gdXNlcnNwYWNlCi0gKgl2MS44ICh2cCkgIC0gU3VibWl0IFVSQiBvbmx5IHdoZW4gb3BlcmF0aW5nLCBtb3ZlZCB0byBDVlMsCi0gKgkJCXVzZSBpbnB1dF9yZXBvcnRfa2V5IGluc3RlYWQgb2YgcmVwb3J0X2J0biBhbmQKLSAqCQkJb3RoZXIgY2xlYW51cHMKLSAqCXYxLjExICh2cCkgLSBBZGQgVVJCIC0+ZGV2IHNldHRpbmcgZm9yIG5ldyBrZXJuZWxzCi0gKgl2MS4xMSAoamIpIC0gQWRkIHN1cHBvcnQgZm9yIHRoZSA0RCBNb3VzZSAmIExlbnMKLSAqCXYxLjEyIChkZSkgLSBBZGQgc3VwcG9ydCBmb3IgdHdvIG1vcmUgaW5raW5nIHBlbiBJRHMKLSAqCXYxLjE0ICh2cCkgLSBVc2UgbmV3IFVTQiBkZXZpY2UgaWQgcHJvYmluZyBzY2hlbWUuCi0gKgkJICAgICBGaXggV2Fjb20gR3JhcGhpcmUgbW91c2Ugd2hlZWwKLSAqCXYxLjE4ICh2cCkgLSBGaXggbW91c2Ugd2hlZWwgZGlyZWN0aW9uCi0gKgkJICAgICBNYWtlIG1vdXNlIHJlbGF0aXZlCi0gKiAgICAgIHYxLjIwIChmbCkgLSBSZXBvcnQgdG9vbCBpZCBmb3IgSW50dW9zIGRldmljZXMKLSAqICAgICAgICAgICAgICAgICAtIE11bHRpIHRvb2xzIHN1cHBvcnQKLSAqICAgICAgICAgICAgICAgICAtIENvcnJlY3RlZCBJbnR1b3MgcHJvdG9jb2wgZGVjb2RpbmcgKGFpcmJydXNoLCA0RCBtb3VzZSwgbGVucyBjdXJzb3IuLi4pCi0gKiAgICAgICAgICAgICAgICAgLSBBZGQgUEwgbW9kZWxzIHN1cHBvcnQKLSAqCQkgICAtIEZpeCBXYWNvbSBHcmFwaGlyZSBtb3VzZSB3aGVlbCBhZ2FpbgotICoJdjEuMjEgKHZwKSAtIFJlbW92ZWQgcHJvdG9jb2wgZGVzY3JpcHRpb25zCi0gKgkJICAgLSBBZGRlZCBNSVNDX1NFUklBTCBmb3IgdG9vbCBzZXJpYWwgbnVtYmVycwotICoJICAgICAgKGdiKSAtIElkZW50aWZ5IHZlcnNpb24gb24gbW9kdWxlIGxvYWQuCi0gKiAgICB2MS4yMS4xIChmbCkgLSBhZGRlZCBHcmFwaGlyZTIgc3VwcG9ydAotICogICAgdjEuMjEuMiAoZmwpIC0gYWRkZWQgSW50dW9zMiBzdXBwb3J0Ci0gKiAgICAgICAgICAgICAgICAgLSBhZGRlZCBhbGwgdGhlIFBMIGlkcwotICogICAgdjEuMjEuMyAoZmwpIC0gYWRkZWQgYW5vdGhlciBlcmFzZXIgaWQgZnJvbSBOZWlsIE9rYW1vdG8KLSAqICAgICAgICAgICAgICAgICAtIGFkZGVkIHNtb290aCBmaWx0ZXIgZm9yIEdyYXBoaXJlIGZyb20gUGVyaSBIYW5rZXkKLSAqICAgICAgICAgICAgICAgICAtIGFkZGVkIFBlblBhcnRuZXIgc3VwcG9ydCBmcm9tIE9sYWYgdmFuIEVzCi0gKiAgICAgICAgICAgICAgICAgLSBuZXcgdG9vbCBpZHMgZnJvbSBPbGUgTWFydGluIEJqb2VybmRhbGVuCi0gKgl2MS4yOSAocGMpIC0gQWRkIHN1cHBvcnQgZm9yIG1vcmUgdGFibGV0cwotICoJCSAgIC0gRml4IHByZXNzdXJlIHJlcG9ydGluZwotICoJdjEuMzAgKHZwKSAtIE1lcmdlIDIuNCBhbmQgMi41IGRyaXZlcnMKLSAqCQkgICAtIFNpbmNlIDIuNSBub3cgaGFzIGlucHV0X3N5bmMoKSwgcmVtb3ZlIE1TQ19TRVJJQUwgYWJ1c2UKLSAqCQkgICAtIENsZWFudXBzIGhlcmUgYW5kIHRoZXJlCi0gKiAgICB2MS4zMC4xIChwaSkgLSBBZGRlZCBHcmFwaGlyZTMgc3VwcG9ydAotICoJdjEuNDAgKHBjKSAtIEFkZCBzdXBwb3J0IGZvciBzZXZlcmFsIG5ldyBkZXZpY2VzLCBmaXggZXJhc2VyIHJlcG9ydGluZywgLi4uCi0gKgl2MS40MyAocGMpIC0gQWRkZWQgc3VwcG9ydCBmb3IgQ2ludGlxIDIxVVgKLSAqCQkgICAtIEZpeGVkIGEgR3JhcGhpcmUgYnVnCi0gKgkJICAgLSBNZXJnZWQgd2Fjb21faW50dW9zM19pcnEgaW50byB3YWNvbV9pbnR1b3NfaXJxCi0gKgl2MS40NCAocGMpIC0gQWRkZWQgc3VwcG9ydCBmb3IgR3JhcGhpcmU0LCBDaW50aXEgNzEwLCBJbnR1b3MzIDZ4MTEsIGV0Yy4KLSAqCQkgICAtIFJlcG9ydCBEZXZpY2UgSURzCi0gKgl2MS40NSAocGMpIC0gQWRkZWQgc3VwcG9ydCBmb3IgRFRGIDUyMSwgSW50dW9zMyAxMngxMiBhbmQgMTJ4MTkKLSAqCQkgICAtIE1pbm9yIGRhdGEgcmVwb3J0IGZpeAotICovCi0KLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9pbnB1dC5oPgotI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KLQotLyoKLSAqIFZlcnNpb24gSW5mb3JtYXRpb24KLSAqLwotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjEuNDUiCi0jZGVmaW5lIERSSVZFUl9BVVRIT1IgIlZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHVjdy5jej4iCi0jZGVmaW5lIERSSVZFUl9ERVNDICJVU0IgV2Fjb20gR3JhcGhpcmUgYW5kIFdhY29tIEludHVvcyB0YWJsZXQgZHJpdmVyIgotI2RlZmluZSBEUklWRVJfTElDRU5TRSAiR1BMIgotCi1NT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwotTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKLU1PRFVMRV9MSUNFTlNFKERSSVZFUl9MSUNFTlNFKTsKLQotI2RlZmluZSBVU0JfVkVORE9SX0lEX1dBQ09NCTB4MDU2YQotI2RlZmluZSBTVFlMVVNfREVWSUNFX0lECTB4MDIKLSNkZWZpbmUgQ1VSU09SX0RFVklDRV9JRAkweDA2Ci0jZGVmaW5lIEVSQVNFUl9ERVZJQ0VfSUQJMHgwQQotCi1lbnVtIHsKLQlQRU5QQVJUTkVSID0gMCwKLQlHUkFQSElSRSwKLQlXQUNPTV9HNCwKLQlQTCwKLQlJTlRVT1MsCi0JSU5UVU9TMywKLQlJTlRVT1MzMTIsCi0JSU5UVU9TMzE5LAotCUNJTlRJUSwKLQlNQVhfVFlQRQotfTsKLQotc3RydWN0IHdhY29tX2ZlYXR1cmVzIHsKLQljaGFyICpuYW1lOwotCWludCBwa3RsZW47Ci0JaW50IHhfbWF4OwotCWludCB5X21heDsKLQlpbnQgcHJlc3N1cmVfbWF4OwotCWludCBkaXN0YW5jZV9tYXg7Ci0JaW50IHR5cGU7Ci0JdXNiX2NvbXBsZXRlX3QgaXJxOwotfTsKLQotc3RydWN0IHdhY29tIHsKLQlzaWduZWQgY2hhciAqZGF0YTsKLQlkbWFfYWRkcl90IGRhdGFfZG1hOwotCXN0cnVjdCBpbnB1dF9kZXYgKmRldjsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2OwotCXN0cnVjdCB1cmIgKmlycTsKLQlzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgKmZlYXR1cmVzOwotCWludCB0b29sWzJdOwotCWludCBpZFsyXTsKLQlfX3UzMiBzZXJpYWxbMl07Ci0JY2hhciBwaHlzWzMyXTsKLX07Ci0KLSNkZWZpbmUgVVNCX1JFUV9HRVRfUkVQT1JUCTB4MDEKLSNkZWZpbmUgVVNCX1JFUV9TRVRfUkVQT1JUCTB4MDkKLQotc3RhdGljIGludCB1c2JfZ2V0X3JlcG9ydChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgdW5zaWduZWQgY2hhciB0eXBlLAotCQkJCXVuc2lnbmVkIGNoYXIgaWQsIHZvaWQgKmJ1ZiwgaW50IHNpemUpCi17Ci0JcmV0dXJuIHVzYl9jb250cm9sX21zZyhpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLAotCQl1c2JfcmN2Y3RybHBpcGUoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSwgMCksCi0JCVVTQl9SRVFfR0VUX1JFUE9SVCwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAotCQkodHlwZSA8PCA4KSArIGlkLCBpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlciwKLQkJYnVmLCBzaXplLCAxMDApOwotfQotCi1zdGF0aWMgaW50IHVzYl9zZXRfcmVwb3J0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCB1bnNpZ25lZCBjaGFyIHR5cGUsCi0JCQkJdW5zaWduZWQgY2hhciBpZCwgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKLXsKLQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksCi0JCXVzYl9zbmRjdHJscGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCAwKSwKLSAgICAgICAgICAgICAgICBVU0JfUkVRX1NFVF9SRVBPUlQsIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKLSAgICAgICAgICAgICAgICAodHlwZSA8PCA4KSArIGlkLCBpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlciwKLQkJYnVmLCBzaXplLCAxMDAwKTsKLX0KLQotc3RhdGljIHZvaWQgd2Fjb21fcGxfaXJxKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHdhY29tICp3YWNvbSA9IHVyYi0+Y29udGV4dDsKLQl1bnNpZ25lZCBjaGFyICpkYXRhID0gd2Fjb20tPmRhdGE7Ci0Jc3RydWN0IGlucHV0X2RldiAqZGV2ID0gd2Fjb20tPmRldjsKLQlpbnQgcHJveCwgcHJlc3N1cmUsIGlkOwotCWludCByZXR2YWw7Ci0KLQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7Ci0JY2FzZSAwOgotCQkvKiBzdWNjZXNzICovCi0JCWJyZWFrOwotCWNhc2UgLUVDT05OUkVTRVQ6Ci0JY2FzZSAtRU5PRU5UOgotCWNhc2UgLUVTSFVURE9XTjoKLQkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KLQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwotCQlyZXR1cm47Ci0JZGVmYXVsdDoKLQkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChkYXRhWzBdICE9IDIpIHsKLQkJZGJnKCJ3YWNvbV9wbF9pcnE6IHJlY2VpdmVkIHVua25vd24gcmVwb3J0ICMlZCIsIGRhdGFbMF0pOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JcHJveCA9IGRhdGFbMV0gJiAweDQwOwotCi0JaW5wdXRfcmVncyhkZXYsIHJlZ3MpOwotCi0JaWQgPSBFUkFTRVJfREVWSUNFX0lEOwotCWlmIChwcm94KSB7Ci0KLQkJcHJlc3N1cmUgPSAoc2lnbmVkIGNoYXIpKChkYXRhWzddIDw8IDEpIHwgKChkYXRhWzRdID4+IDIpICYgMSkpOwotCQlpZiAod2Fjb20tPmZlYXR1cmVzLT5wcmVzc3VyZV9tYXggPiAyNTUpCi0JCQlwcmVzc3VyZSA9IChwcmVzc3VyZSA8PCAxKSB8ICgoZGF0YVs0XSA+PiA2KSAmIDEpOwotCQlwcmVzc3VyZSArPSAod2Fjb20tPmZlYXR1cmVzLT5wcmVzc3VyZV9tYXggKyAxKSAvIDI7Ci0KLQkJLyoKLQkJICogaWYgZ29pbmcgZnJvbSBvdXQgb2YgcHJveGltaXR5IGludG8gcHJveGltaXR5IHNlbGVjdCBiZXR3ZWVuIHRoZSBlcmFzZXIKLQkJICogYW5kIHRoZSBwZW4gYmFzZWQgb24gdGhlIHN0YXRlIG9mIHRoZSBzdHlsdXMyIGJ1dHRvbiwgY2hvb3NlIGVyYXNlciBpZgotCQkgKiBwcmVzc2VkIGVsc2UgY2hvb3NlIHBlbi4gaWYgbm90IGEgcHJveGltaXR5IGNoYW5nZSBmcm9tIG91dCB0byBpbiwgc2VuZAotCQkgKiBhbiBvdXQgb2YgcHJveGltaXR5IGZvciBwcmV2aW91cyB0b29sIHRoZW4gYSBpbiBmb3IgbmV3IHRvb2wuCi0JCSAqLwotCQlpZiAoIXdhY29tLT50b29sWzBdKSB7Ci0JCQkvKiBFcmFzZXIgYml0IHNldCBmb3IgRFRGICovCi0JCQlpZiAoZGF0YVsxXSAmIDB4MTApCi0JCQkJd2Fjb20tPnRvb2xbMV0gPSBCVE5fVE9PTF9SVUJCRVI7Ci0JCQllbHNlCi0JCQkJLyogR29pbmcgaW50byBwcm94aW1pdHkgc2VsZWN0IHRvb2wgKi8KLQkJCQl3YWNvbS0+dG9vbFsxXSA9IChkYXRhWzRdICYgMHgyMCkgPyBCVE5fVE9PTF9SVUJCRVIgOiBCVE5fVE9PTF9QRU47Ci0JCX0gZWxzZSB7Ci0JCQkvKiB3YXMgZW50ZXJlZCB3aXRoIHN0eWx1czIgcHJlc3NlZCAqLwotCQkJaWYgKHdhY29tLT50b29sWzFdID09IEJUTl9UT09MX1JVQkJFUiAmJiAhKGRhdGFbNF0gJiAweDIwKSkgewotCQkJCS8qIHJlcG9ydCBvdXQgcHJveGltaXR5IGZvciBwcmV2aW91cyB0b29sICovCi0JCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIHdhY29tLT50b29sWzFdLCAwKTsKLQkJCQlpbnB1dF9zeW5jKGRldik7Ci0JCQkJd2Fjb20tPnRvb2xbMV0gPSBCVE5fVE9PTF9QRU47Ci0JCQkJZ290byBleGl0OwotCQkJfQotCQl9Ci0JCWlmICh3YWNvbS0+dG9vbFsxXSAhPSBCVE5fVE9PTF9SVUJCRVIpIHsKLQkJCS8qIFVua25vd24gdG9vbCBzZWxlY3RlZCBkZWZhdWx0IHRvIHBlbiB0b29sICovCi0JCQl3YWNvbS0+dG9vbFsxXSA9IEJUTl9UT09MX1BFTjsKLQkJCWlkID0gU1RZTFVTX0RFVklDRV9JRDsKLQkJfQotCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgd2Fjb20tPnRvb2xbMV0sIHByb3gpOyAvKiByZXBvcnQgaW4gcHJveGltaXR5IGZvciB0b29sICovCi0JCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTUlTQywgaWQpOyAvKiByZXBvcnQgdG9vbCBpZCAqLwotCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsIGRhdGFbM10gfCAoZGF0YVsyXSA8PCA3KSB8ICgoZGF0YVsxXSAmIDB4MDMpIDw8IDE0KSk7Ci0JCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgZGF0YVs2XSB8IChkYXRhWzVdIDw8IDcpIHwgKChkYXRhWzRdICYgMHgwMykgPDwgMTQpKTsKLQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19QUkVTU1VSRSwgcHJlc3N1cmUpOwotCi0JCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIGRhdGFbNF0gJiAweDA4KTsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9TVFlMVVMsIGRhdGFbNF0gJiAweDEwKTsKLQkJLyogT25seSBhbGxvdyB0aGUgc3R5bHVzMiBidXR0b24gdG8gYmUgcmVwb3J0ZWQgZm9yIHRoZSBwZW4gdG9vbC4gKi8KLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9TVFlMVVMyLCAod2Fjb20tPnRvb2xbMV0gPT0gQlROX1RPT0xfUEVOKSAmJiAoZGF0YVs0XSAmIDB4MjApKTsKLQl9IGVsc2UgewotCQkvKiByZXBvcnQgcHJveGltaXR5LW91dCBvZiBhICh2YWxpZCkgdG9vbCAqLwotCQlpZiAod2Fjb20tPnRvb2xbMV0gIT0gQlROX1RPT0xfUlVCQkVSKSB7Ci0JCQkvKiBVbmtub3duIHRvb2wgc2VsZWN0ZWQgZGVmYXVsdCB0byBwZW4gdG9vbCAqLwotCQkJd2Fjb20tPnRvb2xbMV0gPSBCVE5fVE9PTF9QRU47Ci0JCX0KLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIHdhY29tLT50b29sWzFdLCBwcm94KTsKLQl9Ci0KLQl3YWNvbS0+dG9vbFswXSA9IHByb3g7IC8qIFNhdmUgcHJveGltaXR5IHN0YXRlICovCi0JaW5wdXRfc3luYyhkZXYpOwotCi0gZXhpdDoKLQlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAocmV0dmFsKQotCQllcnIgKCIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZCIsCi0JCSAgICAgX19GVU5DVElPTl9fLCByZXR2YWwpOwotfQotCi1zdGF0aWMgdm9pZCB3YWNvbV9wdHVfaXJxKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHdhY29tICp3YWNvbSA9IHVyYi0+Y29udGV4dDsKLQl1bnNpZ25lZCBjaGFyICpkYXRhID0gd2Fjb20tPmRhdGE7Ci0Jc3RydWN0IGlucHV0X2RldiAqZGV2ID0gd2Fjb20tPmRldjsKLQlpbnQgcmV0dmFsLCBpZDsKLQotCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQljYXNlIDA6Ci0JCS8qIHN1Y2Nlc3MgKi8KLQkJYnJlYWs7Ci0JY2FzZSAtRUNPTk5SRVNFVDoKLQljYXNlIC1FTk9FTlQ6Ci0JY2FzZSAtRVNIVVRET1dOOgotCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwotCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7Ci0JCXJldHVybjsKLQlkZWZhdWx0OgotCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKGRhdGFbMF0gIT0gMikgewotCQlwcmludGsoS0VSTl9JTkZPICJ3YWNvbV9wdHVfaXJxOiByZWNlaXZlZCB1bmtub3duIHJlcG9ydCAjJWRcbiIsIGRhdGFbMF0pOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaW5wdXRfcmVncyhkZXYsIHJlZ3MpOwotCWlmIChkYXRhWzFdICYgMHgwNCkgewotCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfUlVCQkVSLCBkYXRhWzFdICYgMHgyMCk7Ci0JCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIGRhdGFbMV0gJiAweDA4KTsKLQkJaWQgPSBFUkFTRVJfREVWSUNFX0lEOwotCX0gZWxzZSB7Ci0JCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9PTF9QRU4sIGRhdGFbMV0gJiAweDIwKTsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgZGF0YVsxXSAmIDB4MDEpOwotCQlpZCA9IFNUWUxVU19ERVZJQ0VfSUQ7Ci0JfQotCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTUlTQywgaWQpOyAvKiByZXBvcnQgdG9vbCBpZCAqLwotCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgbGUxNl90b19jcHUoKihfX2xlMTYgKikgJmRhdGFbMl0pKTsKLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIGxlMTZfdG9fY3B1KCooX19sZTE2ICopICZkYXRhWzRdKSk7Ci0JaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19QUkVTU1VSRSwgbGUxNl90b19jcHUoKihfX2xlMTYgKikgJmRhdGFbNl0pKTsKLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUWUxVUywgZGF0YVsxXSAmIDB4MDIpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU1RZTFVTMiwgZGF0YVsxXSAmIDB4MTApOwotCi0JaW5wdXRfc3luYyhkZXYpOwotCi0gZXhpdDoKLQlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYiAodXJiLCBHRlBfQVRPTUlDKTsKLQlpZiAocmV0dmFsKQotCQllcnIgKCIlcyAtIHVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZCIsCi0JCSAgICAgX19GVU5DVElPTl9fLCByZXR2YWwpOwotfQotCi1zdGF0aWMgdm9pZCB3YWNvbV9wZW5wYXJ0bmVyX2lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSB1cmItPmNvbnRleHQ7Ci0JdW5zaWduZWQgY2hhciAqZGF0YSA9IHdhY29tLT5kYXRhOwotCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHdhY29tLT5kZXY7Ci0JaW50IHJldHZhbDsKLQotCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKLQljYXNlIDA6Ci0JCS8qIHN1Y2Nlc3MgKi8KLQkJYnJlYWs7Ci0JY2FzZSAtRUNPTk5SRVNFVDoKLQljYXNlIC1FTk9FTlQ6Ci0JY2FzZSAtRVNIVVRET1dOOgotCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLwotCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7Ci0JCXJldHVybjsKLQlkZWZhdWx0OgotCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKGRhdGFbMF0gIT0gMikgewotCQlwcmludGsoS0VSTl9JTkZPICJ3YWNvbV9wZW5wYXJ0bmVyX2lycTogcmVjZWl2ZWQgdW5rbm93biByZXBvcnQgIyVkXG4iLCBkYXRhWzBdKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlucHV0X3JlZ3MoZGV2LCByZWdzKTsKLQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfUEVOLCAxKTsKLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX01JU0MsIFNUWUxVU19ERVZJQ0VfSUQpOyAvKiByZXBvcnQgdG9vbCBpZCAqLwotCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgbGUxNl90b19jcHUoKihfX2xlMTYgKikgJmRhdGFbMV0pKTsKLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIGxlMTZfdG9fY3B1KCooX19sZTE2ICopICZkYXRhWzNdKSk7Ci0JaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19QUkVTU1VSRSwgKHNpZ25lZCBjaGFyKWRhdGFbNl0gKyAxMjcpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsICgoc2lnbmVkIGNoYXIpZGF0YVs2XSA+IC04MCkgJiYgIShkYXRhWzVdICYgMHgyMCkpOwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU1RZTFVTLCAoZGF0YVs1XSAmIDB4NDApKTsKLQlpbnB1dF9zeW5jKGRldik7Ci0KLSBleGl0OgotCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOwotCWlmIChyZXR2YWwpCi0JCWVyciAoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKLQkJICAgICBfX0ZVTkNUSU9OX18sIHJldHZhbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdhY29tX2dyYXBoaXJlX2lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSB1cmItPmNvbnRleHQ7Ci0JdW5zaWduZWQgY2hhciAqZGF0YSA9IHdhY29tLT5kYXRhOwotCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHdhY29tLT5kZXY7Ci0JaW50IHgsIHksIGlkLCBydzsKLQlpbnQgcmV0dmFsOwotCi0Jc3dpdGNoICh1cmItPnN0YXR1cykgewotCWNhc2UgMDoKLQkJLyogc3VjY2VzcyAqLwotCQlicmVhazsKLQljYXNlIC1FQ09OTlJFU0VUOgotCWNhc2UgLUVOT0VOVDoKLQljYXNlIC1FU0hVVERPV046Ci0JCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCi0JCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKLQkJcmV0dXJuOwotCWRlZmF1bHQ6Ci0JCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpZiAoZGF0YVswXSA9PSA5OSkgcmV0dXJuOyAvKiBmb3IgVm9saXRvIHRhYmxldHMgKi8KLQotCWlmIChkYXRhWzBdICE9IDIpIHsKLQkJZGJnKCJ3YWNvbV9ncmFwaGlyZV9pcnE6IHJlY2VpdmVkIHVua25vd24gcmVwb3J0ICMlZCIsIGRhdGFbMF0pOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaW5wdXRfcmVncyhkZXYsIHJlZ3MpOwotCi0JaWQgPSBTVFlMVVNfREVWSUNFX0lEOwotCWlmIChkYXRhWzFdICYgMHgxMCkgeyAvKiBpbiBwcm94ICovCi0KLQkJc3dpdGNoICgoZGF0YVsxXSA+PiA1KSAmIDMpIHsKLQotCQkJY2FzZSAwOgkvKiBQZW4gKi8KLQkJCQl3YWNvbS0+dG9vbFswXSA9IEJUTl9UT09MX1BFTjsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAxOiAvKiBSdWJiZXIgKi8KLQkJCQl3YWNvbS0+dG9vbFswXSA9IEJUTl9UT09MX1JVQkJFUjsKLQkJCQlpZCA9IEVSQVNFUl9ERVZJQ0VfSUQ7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgMjogLyogTW91c2Ugd2l0aCB3aGVlbCAqLwotCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTUlERExFLCBkYXRhWzFdICYgMHgwNCk7Ci0JCQkJaWYgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBXQUNPTV9HNCkgewotCQkJCQlydyA9IGRhdGFbN10gJiAweDA0ID8gKGRhdGFbN10gJiAweDAzKS00IDogKGRhdGFbN10gJiAweDAzKTsKLQkJCQkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9XSEVFTCwgLXJ3KTsKLQkJCQl9IGVsc2UKLQkJCQkJaW5wdXRfcmVwb3J0X3JlbChkZXYsIFJFTF9XSEVFTCwgLShzaWduZWQgY2hhcikgZGF0YVs2XSk7Ci0JCQkJLyogZmFsbCB0aHJvdWdoICovCi0KLQkJCWNhc2UgMzogLyogTW91c2Ugd2l0aG91dCB3aGVlbCAqLwotCQkJCXdhY29tLT50b29sWzBdID0gQlROX1RPT0xfTU9VU0U7Ci0JCQkJaWQgPSBDVVJTT1JfREVWSUNFX0lEOwotCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgZGF0YVsxXSAmIDB4MDEpOwotCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIGRhdGFbMV0gJiAweDAyKTsKLQkJCQlpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IFdBQ09NX0c0KQotCQkJCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0RJU1RBTkNFLCBkYXRhWzZdKTsKLQkJCQllbHNlCi0JCQkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfRElTVEFOQ0UsIGRhdGFbN10pOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGRhdGFbMV0gJiAweDkwKSB7Ci0JCXggPSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSAmZGF0YVsyXSk7Ci0JCXkgPSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSAmZGF0YVs0XSk7Ci0JCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgeCk7Ci0JCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWSwgeSk7Ci0JCWlmICh3YWNvbS0+dG9vbFswXSAhPSBCVE5fVE9PTF9NT1VTRSkgewotCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19QUkVTU1VSRSwgZGF0YVs2XSB8ICgoZGF0YVs3XSAmIDB4MDEpIDw8IDgpKTsKLQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fVE9VQ0gsIGRhdGFbMV0gJiAweDAxKTsKLQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fU1RZTFVTLCBkYXRhWzFdICYgMHgwMik7Ci0JCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUWUxVUzIsIGRhdGFbMV0gJiAweDA0KTsKLQkJfQotCX0KLQotCWlmIChkYXRhWzFdICYgMHgxMCkKLQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19NSVNDLCBpZCk7IC8qIHJlcG9ydCB0b29sIGlkICovCi0JZWxzZQotCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX01JU0MsIDApOyAvKiByZXNldCB0b29sIGlkICovCi0JaW5wdXRfcmVwb3J0X2tleShkZXYsIHdhY29tLT50b29sWzBdLCBkYXRhWzFdICYgMHgxMCk7Ci0JaW5wdXRfc3luYyhkZXYpOwotCi0JLyogc2VuZCBwYWQgZGF0YSAqLwotCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gV0FDT01fRzQpIHsKLQkJaWYgKCh3YWNvbS0+c2VyaWFsWzFdICYgMHhjMCkgIT0gKGRhdGFbN10gJiAweGY4KSkgewotCQkJd2Fjb20tPmlkWzFdID0gMTsKLQkJCXdhY29tLT5zZXJpYWxbMV0gPSAoZGF0YVs3XSAmIDB4ZjgpOwotCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl8wLCAoZGF0YVs3XSAmIDB4NDApKTsKLQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fNCwgKGRhdGFbN10gJiAweDgwKSk7Ci0JCQlydyA9ICgoZGF0YVs3XSAmIDB4MTgpID4+IDMpIC0gKChkYXRhWzddICYgMHgyMCkgPj4gMyk7Ci0JCQlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1dIRUVMLCBydyk7Ci0JCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCAweGYwKTsKLQkJCWlucHV0X2V2ZW50KGRldiwgRVZfTVNDLCBNU0NfU0VSSUFMLCAweGYwKTsKLQkJfSBlbHNlIGlmICh3YWNvbS0+aWRbMV0pIHsKLQkJCXdhY29tLT5pZFsxXSA9IDA7Ci0JCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1RPT0xfRklOR0VSLCAwKTsKLQkJCWlucHV0X2V2ZW50KGRldiwgRVZfTVNDLCBNU0NfU0VSSUFMLCAweGYwKTsKLQkJfQotCQlpbnB1dF9zeW5jKGRldik7Ci0JfQotIGV4aXQ6Ci0JcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHJldHZhbCkKLQkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLAotCQkgICAgIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKLX0KLQotc3RhdGljIGludCB3YWNvbV9pbnR1b3NfaW5vdXQoc3RydWN0IHVyYiAqdXJiKQotewotCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSB1cmItPmNvbnRleHQ7Ci0JdW5zaWduZWQgY2hhciAqZGF0YSA9IHdhY29tLT5kYXRhOwotCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHdhY29tLT5kZXY7Ci0JaW50IGlkeDsKLQotCS8qIHRvb2wgbnVtYmVyICovCi0JaWR4ID0gZGF0YVsxXSAmIDB4MDE7Ci0KLQkvKiBFbnRlciByZXBvcnQgKi8KLQlpZiAoKGRhdGFbMV0gJiAweGZjKSA9PSAweGMwKSB7Ci0JCS8qIHNlcmlhbCBudW1iZXIgb2YgdGhlIHRvb2wgKi8KLQkJd2Fjb20tPnNlcmlhbFtpZHhdID0gKChkYXRhWzNdICYgMHgwZikgPDwgMjgpICsKLQkJCShkYXRhWzRdIDw8IDIwKSArIChkYXRhWzVdIDw8IDEyKSArCi0JCQkoZGF0YVs2XSA8PCA0KSArIChkYXRhWzddID4+IDQpOwotCi0JCXdhY29tLT5pZFtpZHhdID0gKGRhdGFbMl0gPDwgNCkgfCAoZGF0YVszXSA+PiA0KTsKLQkJc3dpdGNoICh3YWNvbS0+aWRbaWR4XSkgewotCQkJY2FzZSAweDgxMjogLyogSW5raW5nIHBlbiAqLwotCQkJY2FzZSAweDgwMTogLyogSW50dW9zMyBJbmtpbmcgcGVuICovCi0JCQljYXNlIDB4MDEyOgotCQkJCXdhY29tLT50b29sW2lkeF0gPSBCVE5fVE9PTF9QRU5DSUw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4ODIyOiAvKiBQZW4gKi8KLQkJCWNhc2UgMHg4NDI6Ci0JCQljYXNlIDB4ODUyOgotCQkJY2FzZSAweDgyMzogLyogSW50dW9zMyBHcmlwIFBlbiAqLwotCQkJY2FzZSAweDgxMzogLyogSW50dW9zMyBDbGFzc2ljIFBlbiAqLwotCQkJY2FzZSAweDg4NTogLyogSW50dW9zMyBNYXJrZXIgUGVuICovCi0JCQljYXNlIDB4MDIyOgotCQkJCXdhY29tLT50b29sW2lkeF0gPSBCVE5fVE9PTF9QRU47Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4ODMyOiAvKiBTdHJva2UgcGVuICovCi0JCQljYXNlIDB4MDMyOgotCQkJCXdhY29tLT50b29sW2lkeF0gPSBCVE5fVE9PTF9CUlVTSDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMHgwMDc6IC8qIE1vdXNlIDREIGFuZCAyRCAqLwotCQkgICAgICAgIGNhc2UgMHgwOWM6Ci0JCQljYXNlIDB4MDk0OgotCQkJY2FzZSAweDAxNzogLyogSW50dW9zMyAyRCBNb3VzZSAqLwotCQkJCXdhY29tLT50b29sW2lkeF0gPSBCVE5fVE9PTF9NT1VTRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMHgwOTY6IC8qIExlbnMgY3Vyc29yICovCi0JCQljYXNlIDB4MDk3OiAvKiBJbnR1b3MzIExlbnMgY3Vyc29yICovCi0JCQkJd2Fjb20tPnRvb2xbaWR4XSA9IEJUTl9UT09MX0xFTlM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4ODJhOiAvKiBFcmFzZXIgKi8KLQkJCWNhc2UgMHg4NWE6Ci0JCSAgICAgICAgY2FzZSAweDkxYToKLQkJCWNhc2UgMHhkMWE6Ci0JCQljYXNlIDB4MGZhOgotCQkJY2FzZSAweDgyYjogLyogSW50dW9zMyBHcmlwIFBlbiBFcmFzZXIgKi8KLQkJCWNhc2UgMHg4MWI6IC8qIEludHVvczMgQ2xhc3NpYyBQZW4gRXJhc2VyICovCi0JCQljYXNlIDB4OTFiOiAvKiBJbnR1b3MzIEFpcmJydXNoIEVyYXNlciAqLwotCQkJCXdhY29tLT50b29sW2lkeF0gPSBCVE5fVE9PTF9SVUJCRVI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDB4ZDEyOgotCQkJY2FzZSAweDkxMjoKLQkJCWNhc2UgMHgxMTI6Ci0JCQljYXNlIDB4OTEzOiAvKiBJbnR1b3MzIEFpcmJydXNoICovCi0JCQkJd2Fjb20tPnRvb2xbaWR4XSA9IEJUTl9UT09MX0FJUkJSVVNIOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDogLyogVW5rbm93biB0b29sICovCi0JCQkJd2Fjb20tPnRvb2xbaWR4XSA9IEJUTl9UT09MX1BFTjsKLQkJfQotCQlpZighKCh3YWNvbS0+dG9vbFtpZHhdID09IEJUTl9UT09MX0xFTlMpICYmCi0JCQkJKCh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gSU5UVU9TMzEyKQotCQkJCQl8fCAod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IElOVFVPUzMxOSkpKSkgewotCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19NSVNDLCB3YWNvbS0+aWRbaWR4XSk7IC8qIHJlcG9ydCB0b29sIGlkICovCi0JCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgd2Fjb20tPnRvb2xbaWR4XSwgMSk7Ci0JCQlpbnB1dF9ldmVudChkZXYsIEVWX01TQywgTVNDX1NFUklBTCwgd2Fjb20tPnNlcmlhbFtpZHhdKTsKLQkJCWlucHV0X3N5bmMoZGV2KTsKLQkJfQotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKiBFeGl0IHJlcG9ydCAqLwotCWlmICgoZGF0YVsxXSAmIDB4ZmUpID09IDB4ODApIHsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIHdhY29tLT50b29sW2lkeF0sIDApOwotCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX01JU0MsIDApOyAvKiByZXNldCB0b29sIGlkICovCi0JCWlucHV0X2V2ZW50KGRldiwgRVZfTVNDLCBNU0NfU0VSSUFMLCB3YWNvbS0+c2VyaWFsW2lkeF0pOwotCQlpbnB1dF9zeW5jKGRldik7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmKCh3YWNvbS0+dG9vbFtpZHhdID09IEJUTl9UT09MX0xFTlMpICYmICgod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IElOVFVPUzMxMikKLQkJCXx8ICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gSU5UVU9TMzE5KSkpCi0JCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHdhY29tX2ludHVvc19nZW5lcmFsKHN0cnVjdCB1cmIgKnVyYikKLXsKLQlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gdXJiLT5jb250ZXh0OwotCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB3YWNvbS0+ZGF0YTsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSB3YWNvbS0+ZGV2OwotCXVuc2lnbmVkIGludCB0OwotCi0JLyogZ2VuZXJhbCBwZW4gcGFja2V0ICovCi0JaWYgKChkYXRhWzFdICYgMHhiOCkgPT0gMHhhMCkgewotCQl0ID0gKGRhdGFbNl0gPDwgMikgfCAoKGRhdGFbN10gPj4gNikgJiAzKTsKLQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19QUkVTU1VSRSwgdCk7Ci0JCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfVElMVF9YLAotCQkJCSgoZGF0YVs3XSA8PCAxKSAmIDB4N2UpIHwgKGRhdGFbOF0gPj4gNykpOwotCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1RJTFRfWSwgZGF0YVs4XSAmIDB4N2YpOwotCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUWUxVUywgZGF0YVsxXSAmIDIpOwotCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NUWUxVUzIsIGRhdGFbMV0gJiA0KTsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9UT1VDSCwgdCA+IDEwKTsKLQl9Ci0KLQkvKiBhaXJicnVzaCBzZWNvbmQgcGFja2V0ICovCi0JaWYgKChkYXRhWzFdICYgMHhiYykgPT0gMHhiNCkgewotCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1dIRUVMLAotCQkJCShkYXRhWzZdIDw8IDIpIHwgKChkYXRhWzddID4+IDYpICYgMykpOwotCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1RJTFRfWCwKLQkJCQkoKGRhdGFbN10gPDwgMSkgJiAweDdlKSB8IChkYXRhWzhdID4+IDcpKTsKLQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19USUxUX1ksIGRhdGFbOF0gJiAweDdmKTsKLQl9Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCB3YWNvbV9pbnR1b3NfaXJxKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHdhY29tICp3YWNvbSA9IHVyYi0+Y29udGV4dDsKLQl1bnNpZ25lZCBjaGFyICpkYXRhID0gd2Fjb20tPmRhdGE7Ci0Jc3RydWN0IGlucHV0X2RldiAqZGV2ID0gd2Fjb20tPmRldjsKLQl1bnNpZ25lZCBpbnQgdDsKLQlpbnQgaWR4OwotCWludCByZXR2YWw7Ci0KLQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7Ci0JY2FzZSAwOgotCQkvKiBzdWNjZXNzICovCi0JCWJyZWFrOwotCWNhc2UgLUVDT05OUkVTRVQ6Ci0JY2FzZSAtRU5PRU5UOgotCWNhc2UgLUVTSFVURE9XTjoKLQkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KLQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwotCQlyZXR1cm47Ci0JZGVmYXVsdDoKLQkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKLQkJZ290byBleGl0OwotCX0KLQotCWlmIChkYXRhWzBdICE9IDIgJiYgZGF0YVswXSAhPSA1ICYmIGRhdGFbMF0gIT0gNiAmJiBkYXRhWzBdICE9IDEyKSB7Ci0JCWRiZygid2Fjb21faW50dW9zX2lycTogcmVjZWl2ZWQgdW5rbm93biByZXBvcnQgIyVkIiwgZGF0YVswXSk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlpbnB1dF9yZWdzKGRldiwgcmVncyk7Ci0KLQkvKiB0b29sIG51bWJlciAqLwotCWlkeCA9IGRhdGFbMV0gJiAweDAxOwotCi0JLyogcGFkIHBhY2tldHMuIFdvcmtzIGFzIGEgc2Vjb25kIHRvb2wgYW5kIGlzIGFsd2F5cyBpbiBwcm94ICovCi0JaWYgKGRhdGFbMF0gPT0gMTIpIHsKLQkJLyogaW5pdGlhdGUgdGhlIHBhZCBhcyBhIGRldmljZSAqLwotCQlpZiAod2Fjb20tPnRvb2xbMV0gIT0gQlROX1RPT0xfRklOR0VSKQotCQkJd2Fjb20tPnRvb2xbMV0gPSBCVE5fVE9PTF9GSU5HRVI7Ci0KLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl8wLCAoZGF0YVs1XSAmIDB4MDEpKTsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl8xLCAoZGF0YVs1XSAmIDB4MDIpKTsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl8yLCAoZGF0YVs1XSAmIDB4MDQpKTsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl8zLCAoZGF0YVs1XSAmIDB4MDgpKTsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl80LCAoZGF0YVs2XSAmIDB4MDEpKTsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl81LCAoZGF0YVs2XSAmIDB4MDIpKTsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl82LCAoZGF0YVs2XSAmIDB4MDQpKTsKLQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl83LCAoZGF0YVs2XSAmIDB4MDgpKTsKLQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19SWCwgKChkYXRhWzFdICYgMHgxZikgPDwgOCkgfCBkYXRhWzJdKTsKLQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19SWSwgKChkYXRhWzNdICYgMHgxZikgPDwgOCkgfCBkYXRhWzRdKTsKLQotCQlpZigoZGF0YVs1XSAmIDB4MGYpIHwgKGRhdGFbNl0gJiAweDBmKSB8IChkYXRhWzFdICYgMHgxZikgfCBkYXRhWzJdKQotCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIHdhY29tLT50b29sWzFdLCAxKTsKLQkJZWxzZQotCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIHdhY29tLT50b29sWzFdLCAwKTsKLQkJaW5wdXRfZXZlbnQoZGV2LCBFVl9NU0MsIE1TQ19TRVJJQUwsIDB4ZmZmZmZmZmYpOwotCQlpbnB1dF9zeW5jKGRldik7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBwcm9jZXNzIGluL291dCBwcm94IGV2ZW50cyAqLwotCWlmICh3YWNvbV9pbnR1b3NfaW5vdXQodXJiKSkKLQkJZ290byBleGl0OwotCi0JLyogQ2ludGlxIGRvZXNuJ3Qgc2VuZCBkYXRhIHdoZW4gUkRZIGJpdCBpc24ndCBzZXQgKi8KLQlpZiAoKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBDSU5USVEpICYmICEoZGF0YVsxXSAmIDB4NDApKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlID49IElOVFVPUzMpIHsKLQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19YLCAoZGF0YVsyXSA8PCA5KSB8IChkYXRhWzNdIDw8IDEpIHwgKChkYXRhWzldID4+IDEpICYgMSkpOwotCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIChkYXRhWzRdIDw8IDkpIHwgKGRhdGFbNV0gPDwgMSkgfCAoZGF0YVs5XSAmIDEpKTsKLQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ESVNUQU5DRSwgKChkYXRhWzldID4+IDIpICYgMHgzZikpOwotCX0gZWxzZSB7Ci0JCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfWCwgYmUxNl90b19jcHUoKihfX2JlMTYgKikgJmRhdGFbMl0pKTsKLQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLCBiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKSAmZGF0YVs0XSkpOwotCQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX0RJU1RBTkNFLCAoKGRhdGFbOV0gPj4gMykgJiAweDFmKSk7Ci0JfQotCi0JLyogcHJvY2VzcyBnZW5lcmFsIHBhY2tldHMgKi8KLQl3YWNvbV9pbnR1b3NfZ2VuZXJhbCh1cmIpOwotCi0JLyogNEQgbW91c2UsIDJEIG1vdXNlLCBtYXJrZXIgcGVuIHJvdGF0aW9uLCBvciBMZW5zIGN1cnNvciBwYWNrZXRzICovCi0JaWYgKChkYXRhWzFdICYgMHhiYykgPT0gMHhhOCB8fCAoZGF0YVsxXSAmIDB4YmUpID09IDB4YjApIHsKLQotCQlpZiAoZGF0YVsxXSAmIDB4MDIpIHsKLQkJCS8qIFJvdGF0aW9uIHBhY2tldCAqLwotCQkJaWYgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA+PSBJTlRVT1MzKSB7Ci0JCQkJLyogSTMgbWFya2VyIHBlbiByb3RhdGlvbiByZXBvcnRlZCBhcyB3aGVlbAotCQkJCSAqIGR1ZSB0byB2YWx1YXRvciBsaW1pdGF0aW9uCi0JCQkJICovCi0JCQkJdCA9IChkYXRhWzZdIDw8IDMpIHwgKChkYXRhWzddID4+IDUpICYgNyk7Ci0JCQkJdCA9IChkYXRhWzddICYgMHgyMCkgPyAoKHQgPiA5MDApID8gKCh0LTEpIC8gMiAtIDEzNTApIDoKLQkJCQkJKCh0LTEpIC8gMiArIDQ1MCkpIDogKDQ1MCAtIHQgLyAyKSA7Ci0JCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19XSEVFTCwgdCk7Ci0JCQl9IGVsc2UgewotCQkJCS8qIDREIG1vdXNlIHJvdGF0aW9uIHBhY2tldCAqLwotCQkJCXQgPSAoZGF0YVs2XSA8PCAzKSB8ICgoZGF0YVs3XSA+PiA1KSAmIDcpOwotCQkJCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUlosIChkYXRhWzddICYgMHgyMCkgPwotCQkJCQkoKHQgLSAxKSAvIDIpIDogLXQgLyAyKTsKLQkJCX0KLQotCQl9IGVsc2UgaWYgKCEoZGF0YVsxXSAmIDB4MTApICYmIHdhY29tLT5mZWF0dXJlcy0+dHlwZSA8IElOVFVPUzMpIHsKLQkJCS8qIDREIG1vdXNlIHBhY2tldCAqLwotCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9MRUZULCAgIGRhdGFbOF0gJiAweDAxKTsKLQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTUlERExFLCBkYXRhWzhdICYgMHgwMik7Ci0JCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCAgZGF0YVs4XSAmIDB4MDQpOwotCi0JCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NJREUsICAgZGF0YVs4XSAmIDB4MjApOwotCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9FWFRSQSwgIGRhdGFbOF0gJiAweDEwKTsKLQkJCXQgPSAoZGF0YVs2XSA8PCAyKSB8ICgoZGF0YVs3XSA+PiA2KSAmIDMpOwotCQkJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19USFJPVFRMRSwgKGRhdGFbOF0gJiAweDA4KSA/IC10IDogdCk7Ci0KLQkJfSBlbHNlIGlmICh3YWNvbS0+dG9vbFtpZHhdID09IEJUTl9UT09MX01PVVNFKSB7Ci0JCQkvKiAyRCBtb3VzZSBwYWNrZXQgKi8KLQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fTEVGVCwgICBkYXRhWzhdICYgMHgwNCk7Ci0JCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX01JRERMRSwgZGF0YVs4XSAmIDB4MDgpOwotCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9SSUdIVCwgIGRhdGFbOF0gJiAweDEwKTsKLQkJCWlucHV0X3JlcG9ydF9yZWwoZGV2LCBSRUxfV0hFRUwsIChkYXRhWzhdICYgMHgwMSkKLQkJCQkJCSAtICgoZGF0YVs4XSAmIDB4MDIpID4+IDEpKTsKLQotCQkJLyogSTMgMkQgbW91c2Ugc2lkZSBidXR0b25zICovCi0JCQlpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IElOVFVPUzMpIHsKLQkJCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NJREUsICAgZGF0YVs4XSAmIDB4NDApOwotCQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fRVhUUkEsICBkYXRhWzhdICYgMHgyMCk7Ci0JCQl9Ci0KLQkJfSBlbHNlIGlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPCBJTlRVT1MzKSB7Ci0JCQkvKiBMZW5zIGN1cnNvciBwYWNrZXRzICovCi0JCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsICAgZGF0YVs4XSAmIDB4MDEpOwotCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NSURETEUsIGRhdGFbOF0gJiAweDAyKTsKLQkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsICBkYXRhWzhdICYgMHgwNCk7Ci0JCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1NJREUsICAgZGF0YVs4XSAmIDB4MTApOwotCQkJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9FWFRSQSwgIGRhdGFbOF0gJiAweDA4KTsKLQkJfQotCX0KLQotCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfTUlTQywgd2Fjb20tPmlkW2lkeF0pOyAvKiByZXBvcnQgdG9vbCBpZCAqLwotCWlucHV0X3JlcG9ydF9rZXkoZGV2LCB3YWNvbS0+dG9vbFtpZHhdLCAxKTsKLQlpbnB1dF9ldmVudChkZXYsIEVWX01TQywgTVNDX1NFUklBTCwgd2Fjb20tPnNlcmlhbFtpZHhdKTsKLQlpbnB1dF9zeW5jKGRldik7Ci0KLWV4aXQ6Ci0JcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHJldHZhbCkKLQkJZXJyICgiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWQiLAotCQkgICAgX19GVU5DVElPTl9fLCByZXR2YWwpOwotfQotCi1zdGF0aWMgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzW10gPSB7Ci0JeyAiV2Fjb20gUGVucGFydG5lciIsICAgIDcsICAgNTA0MCwgIDM3ODAsICAyNTUsIDMyLCBQRU5QQVJUTkVSLCB3YWNvbV9wZW5wYXJ0bmVyX2lycSB9LAotICAgICAgICB7ICJXYWNvbSBHcmFwaGlyZSIsICAgICAgOCwgIDEwMjA2LCAgNzQyMiwgIDUxMSwgMzIsIEdSQVBISVJFLCAgIHdhY29tX2dyYXBoaXJlX2lycSB9LAotCXsgIldhY29tIEdyYXBoaXJlMiA0eDUiLCA4LCAgMTAyMDYsICA3NDIyLCAgNTExLCAzMiwgR1JBUEhJUkUsICAgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCi0JeyAiV2Fjb20gR3JhcGhpcmUyIDV4NyIsIDgsICAxMzkxOCwgMTAyMDYsICA1MTEsIDMyLCBHUkFQSElSRSwgICB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKLQl7ICJXYWNvbSBHcmFwaGlyZTMiLCAgICAgOCwgIDEwMjA4LCAgNzQyNCwgIDUxMSwgMzIsIEdSQVBISVJFLCAgIHdhY29tX2dyYXBoaXJlX2lycSB9LAotCXsgIldhY29tIEdyYXBoaXJlMyA2eDgiLCA4LCAgMTY3MDQsIDEyMDY0LCAgNTExLCAzMiwgR1JBUEhJUkUsICAgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCi0JeyAiV2Fjb20gR3JhcGhpcmU0IDR4NSIsIDgsICAxMDIwOCwgIDc0MjQsICA1MTEsIDMyLCBXQUNPTV9HNCwJIHdhY29tX2dyYXBoaXJlX2lycSB9LAotCXsgIldhY29tIEdyYXBoaXJlNCA2eDgiLCA4LCAgMTY3MDQsIDEyMDY0LCAgNTExLCAzMiwgV0FDT01fRzQsCSB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKLQl7ICJXYWNvbSBWb2xpdG8iLCAgICAgICAgOCwgICA1MTA0LCAgMzcxMiwgIDUxMSwgMzIsIEdSQVBISVJFLCAgIHdhY29tX2dyYXBoaXJlX2lycSB9LAotCXsgIldhY29tIFBlblN0YXRpb24yIiwgICA4LCAgIDMyNTAsICAyMzIwLCAgMjU1LCAzMiwgR1JBUEhJUkUsICAgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCi0JeyAiV2Fjb20gVm9saXRvMiA0eDUiLCAgIDgsICAgNTEwNCwgIDM3MTIsICA1MTEsIDMyLCBHUkFQSElSRSwgICB3YWNvbV9ncmFwaGlyZV9pcnEgfSwKLQl7ICJXYWNvbSBWb2xpdG8yIDJ4MyIsICAgOCwgICAzMjQ4LCAgMjMyMCwgIDUxMSwgMzIsIEdSQVBISVJFLCAgIHdhY29tX2dyYXBoaXJlX2lycSB9LAotCXsgIldhY29tIFBlblBhcnRuZXIyIiwgICA4LCAgIDMyNTAsICAyMzIwLCAgMjU1LCAzMiwgR1JBUEhJUkUsICAgd2Fjb21fZ3JhcGhpcmVfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zIDR4NSIsICAgMTAsICAxMjcwMCwgMTA2MDAsIDEwMjMsIDE1LCBJTlRVT1MsICAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zIDZ4OCIsICAgMTAsICAyMDMyMCwgMTYyNDAsIDEwMjMsIDE1LCBJTlRVT1MsICAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zIDl4MTIiLCAgMTAsICAzMDQ4MCwgMjQwNjAsIDEwMjMsIDE1LCBJTlRVT1MsICAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zIDEyeDEyIiwgMTAsICAzMDQ4MCwgMzE2ODAsIDEwMjMsIDE1LCBJTlRVT1MsICAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zIDEyeDE4IiwgMTAsICA0NTcyMCwgMzE2ODAsIDEwMjMsIDE1LCBJTlRVT1MsICAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gUEw0MDAiLCAgICAgICAgIDgsICAgNTQwOCwgIDQwNTYsICAyNTUsIDMyLCBQTCwgICAgICAgICB3YWNvbV9wbF9pcnEgfSwKLQl7ICJXYWNvbSBQTDUwMCIsICAgICAgICAgOCwgICA2MTQ0LCAgNDYwOCwgIDI1NSwgMzIsIFBMLCAgICAgICAgIHdhY29tX3BsX2lycSB9LAotCXsgIldhY29tIFBMNjAwIiwgICAgICAgICA4LCAgIDYxMjYsICA0NjA0LCAgMjU1LCAzMiwgUEwsICAgICAgICAgd2Fjb21fcGxfaXJxIH0sCi0JeyAiV2Fjb20gUEw2MDBTWCIsICAgICAgIDgsICAgNjI2MCwgIDUwMTYsICAyNTUsIDMyLCBQTCwgICAgICAgICB3YWNvbV9wbF9pcnEgfSwKLQl7ICJXYWNvbSBQTDU1MCIsICAgICAgICAgOCwgICA2MTQ0LCAgNDYwOCwgIDUxMSwgMzIsIFBMLCAgICAgICAgIHdhY29tX3BsX2lycSB9LAotCXsgIldhY29tIFBMODAwIiwgICAgICAgICA4LCAgIDcyMjAsICA1NzgwLCAgNTExLCAzMiwgUEwsICAgICAgICAgd2Fjb21fcGxfaXJxIH0sCi0JeyAiV2Fjb20gUEw3MDAiLCAgICAgICAgIDgsICAgNjc1OCwgIDU0MDYsICA1MTEsIDMyLCBQTCwJIHdhY29tX3BsX2lycSB9LAotCXsgIldhY29tIFBMNTEwIiwgICAgICAgICA4LCAgIDYyODIsICA0NzYyLCAgNTExLCAzMiwgUEwsCSB3YWNvbV9wbF9pcnEgfSwKLQl7ICJXYWNvbSBEVFU3MTAiLCAgICAgICAgOCwgIDM0MDgwLCAyNzY2MCwgIDUxMSwgMzIsIFBMLAkgd2Fjb21fcGxfaXJxIH0sCi0JeyAiV2Fjb20gRFRGNTIxIiwgICAgICAgIDgsICAgNjI4MiwgIDQ3NjIsICA1MTEsIDMyLCBQTCwgICAgICAgICB3YWNvbV9wbF9pcnEgfSwKLQl7ICJXYWNvbSBEVEY3MjAiLCAgICAgICAgOCwgICA2ODU4LCAgNTUwNiwgIDUxMSwgMzIsIFBMLAkgd2Fjb21fcGxfaXJxIH0sCi0JeyAiV2Fjb20gQ2ludGlxIFBhcnRuZXIiLDgsICAyMDQ4MCwgMTUzNjAsICA1MTEsIDMyLCBQTCwgICAgICAgICB3YWNvbV9wdHVfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMiA0eDUiLCAgIDEwLCAxMjcwMCwgMTA2MDAsIDEwMjMsIDE1LCBJTlRVT1MsICAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMiA2eDgiLCAgIDEwLCAyMDMyMCwgMTYyNDAsIDEwMjMsIDE1LCBJTlRVT1MsICAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMiA5eDEyIiwgIDEwLCAzMDQ4MCwgMjQwNjAsIDEwMjMsIDE1LCBJTlRVT1MsICAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMiAxMngxMiIsIDEwLCAzMDQ4MCwgMzE2ODAsIDEwMjMsIDE1LCBJTlRVT1MsICAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMiAxMngxOCIsIDEwLCA0NTcyMCwgMzE2ODAsIDEwMjMsIDE1LCBJTlRVT1MsICAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMyA0eDUiLCAgIDEwLCAyNTQwMCwgMjAzMjAsIDEwMjMsIDE1LCBJTlRVT1MzLCAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMyA2eDgiLCAgIDEwLCA0MDY0MCwgMzA0ODAsIDEwMjMsIDE1LCBJTlRVT1MzLCAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMyA5eDEyIiwgIDEwLCA2MDk2MCwgNDU3MjAsIDEwMjMsIDE1LCBJTlRVT1MzLCAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMyAxMngxMiIsIDEwLCA2MDk2MCwgNjA5NjAsIDEwMjMsIDE1LCBJTlRVT1MzMTIsICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMyAxMngxOSIsIDEwLCA5NzUzNiwgNjA5NjAsIDEwMjMsIDE1LCBJTlRVT1MzMTksICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMyA2eDExIiwgIDEwLCA1NDIwNCwgMzE3NTAsIDEwMjMsIDE1LCBJTlRVT1MzLCAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gQ2ludGlxIDIxVVgiLCAgIDEwLCA4NzIwMCwgNjU2MDAsIDEwMjMsIDE1LCBDSU5USVEsICAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyAiV2Fjb20gSW50dW9zMiA2eDgiLCAgIDEwLCAyMDMyMCwgMTYyNDAsIDEwMjMsIDE1LCBJTlRVT1MsICAgICB3YWNvbV9pbnR1b3NfaXJxIH0sCi0JeyB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgd2Fjb21faWRzW10gPSB7Ci0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MDApIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MTApIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MTEpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MTIpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MTMpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MTQpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MTUpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MTYpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4NjApIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4NjEpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4NjIpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4NjMpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4NjQpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MjApIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MjEpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MjIpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MjMpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MjQpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MzApIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MzEpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MzIpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MzMpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MzQpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MzUpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MzcpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MzgpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MzkpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4QzApIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4QzMpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4MDMpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4NDEpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4NDIpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4NDMpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4NDQpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4NDUpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4QjApIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4QjEpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4QjIpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4QjMpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4QjQpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4QjUpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4M0YpIH0sCi0JeyBVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfV0FDT00sIDB4NDcpIH0sCi0JeyB9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgd2Fjb21faWRzKTsKLQotc3RhdGljIGludCB3YWNvbV9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKLXsKLQlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gZGV2LT5wcml2YXRlOwotCi0Jd2Fjb20tPmlycS0+ZGV2ID0gd2Fjb20tPnVzYmRldjsKLQlpZiAodXNiX3N1Ym1pdF91cmIod2Fjb20tPmlycSwgR0ZQX0tFUk5FTCkpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHdhY29tX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKLXsKLQlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gZGV2LT5wcml2YXRlOwotCi0JdXNiX2tpbGxfdXJiKHdhY29tLT5pcnEpOwotfQotCi1zdGF0aWMgaW50IHdhY29tX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCi17Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7Ci0Jc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKLQlzdHJ1Y3Qgd2Fjb20gKndhY29tOwotCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKLQljaGFyIHJlcF9kYXRhWzJdLCBsaW1pdCA9IDA7Ci0KLQl3YWNvbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3YWNvbSksIEdGUF9LRVJORUwpOwotCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOwotCWlmICghd2Fjb20gfHwgIWlucHV0X2RldikKLQkJZ290byBmYWlsMTsKLQotCXdhY29tLT5kYXRhID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIDEwLCBHRlBfS0VSTkVMLCAmd2Fjb20tPmRhdGFfZG1hKTsKLQlpZiAoIXdhY29tLT5kYXRhKQotCQlnb3RvIGZhaWwxOwotCi0Jd2Fjb20tPmlycSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3YWNvbS0+aXJxKQotCQlnb3RvIGZhaWwyOwotCi0Jd2Fjb20tPnVzYmRldiA9IGRldjsKLQl3YWNvbS0+ZGV2ID0gaW5wdXRfZGV2OwotCXVzYl9tYWtlX3BhdGgoZGV2LCB3YWNvbS0+cGh5cywgc2l6ZW9mKHdhY29tLT5waHlzKSk7Ci0Jc3RybGNhdCh3YWNvbS0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2Yod2Fjb20tPnBoeXMpKTsKLQotCXdhY29tLT5mZWF0dXJlcyA9IHdhY29tX2ZlYXR1cmVzICsgKGlkIC0gd2Fjb21faWRzKTsKLQlpZiAod2Fjb20tPmZlYXR1cmVzLT5wa3RsZW4gPiAxMCkKLQkJQlVHKCk7Ci0KLQlpbnB1dF9kZXYtPm5hbWUgPSB3YWNvbS0+ZmVhdHVyZXMtPm5hbWU7Ci0JdXNiX3RvX2lucHV0X2lkKGRldiwgJmlucHV0X2Rldi0+aWQpOwotCi0JaW5wdXRfZGV2LT5jZGV2LmRldiA9ICZpbnRmLT5kZXY7Ci0JaW5wdXRfZGV2LT5wcml2YXRlID0gd2Fjb207Ci0JaW5wdXRfZGV2LT5vcGVuID0gd2Fjb21fb3BlbjsKLQlpbnB1dF9kZXYtPmNsb3NlID0gd2Fjb21fY2xvc2U7Ci0KLQlpbnB1dF9kZXYtPmV2Yml0WzBdIHw9IEJJVChFVl9LRVkpIHwgQklUKEVWX0FCUyk7Ci0JaW5wdXRfZGV2LT5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fVE9PTF9QRU4pIHwgQklUKEJUTl9UT1VDSCkgfCBCSVQoQlROX1NUWUxVUyk7Ci0JaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWCwgMCwgd2Fjb20tPmZlYXR1cmVzLT54X21heCwgNCwgMCk7Ci0JaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWSwgMCwgd2Fjb20tPmZlYXR1cmVzLT55X21heCwgNCwgMCk7Ci0JaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfUFJFU1NVUkUsIDAsIHdhY29tLT5mZWF0dXJlcy0+cHJlc3N1cmVfbWF4LCAwLCAwKTsKLQlpbnB1dF9kZXYtPmFic2JpdFtMT05HKEFCU19NSVNDKV0gfD0gQklUKEFCU19NSVNDKTsKLQotCXN3aXRjaCAod2Fjb20tPmZlYXR1cmVzLT50eXBlKSB7Ci0JCWNhc2UgV0FDT01fRzQ6Ci0JCQlpbnB1dF9kZXYtPmV2Yml0WzBdIHw9IEJJVChFVl9NU0MpOwotCQkJaW5wdXRfZGV2LT5tc2NiaXRbMF0gfD0gQklUKE1TQ19TRVJJQUwpOwotCQkJaW5wdXRfZGV2LT5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fVE9PTF9GSU5HRVIpOwotCQkJaW5wdXRfZGV2LT5rZXliaXRbTE9ORyhCVE5fTEVGVCldIHw9IEJJVChCVE5fMCkgfCBCSVQoQlROXzEpIHwgQklUKEJUTl8yKSB8IEJJVChCVE5fMykgfCBCSVQoQlROXzQpIHwgQklUKEJUTl81KSB8IEJJVChCVE5fNikgfCBCSVQoQlROXzcpOwotCQkJLyogZmFsbCB0aHJvdWdoICovCi0KLQkJY2FzZSBHUkFQSElSRToKLQkJCWlucHV0X2Rldi0+ZXZiaXRbMF0gfD0gQklUKEVWX1JFTCk7Ci0JCQlpbnB1dF9kZXYtPnJlbGJpdFswXSB8PSBCSVQoUkVMX1dIRUVMKTsKLQkJCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX0xFRlQpXSB8PSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9SSUdIVCkgfCBCSVQoQlROX01JRERMRSk7Ci0JCQlpbnB1dF9kZXYtPmtleWJpdFtMT05HKEJUTl9ESUdJKV0gfD0gQklUKEJUTl9UT09MX1JVQkJFUikgfCBCSVQoQlROX1RPT0xfTU9VU0UpIHwgQklUKEJUTl9TVFlMVVMyKTsKLQkJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX0RJU1RBTkNFLCAwLCB3YWNvbS0+ZmVhdHVyZXMtPmRpc3RhbmNlX21heCwgMCwgMCk7Ci0JCQlicmVhazsKLQotCQljYXNlIElOVFVPUzM6Ci0JCWNhc2UgSU5UVU9TMzEyOgotCQljYXNlIElOVFVPUzMxOToKLQkJY2FzZSBDSU5USVE6Ci0JCQlpbnB1dF9kZXYtPmtleWJpdFtMT05HKEJUTl9ESUdJKV0gfD0gQklUKEJUTl9UT09MX0ZJTkdFUik7Ci0JCQlpbnB1dF9kZXYtPmtleWJpdFtMT05HKEJUTl9MRUZUKV0gfD0gQklUKEJUTl8wKSB8IEJJVChCVE5fMSkgfCBCSVQoQlROXzIpIHwgQklUKEJUTl8zKSB8IEJJVChCVE5fNCkgfCBCSVQoQlROXzUpIHwgQklUKEJUTl82KSB8IEJJVChCVE5fNyk7Ci0JCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19SWCwgMCwgNDA5NywgMCwgMCk7Ci0JCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19SWSwgMCwgNDA5NywgMCwgMCk7Ci0JCQkvKiBmYWxsIHRocm91Z2ggKi8KLQotCQljYXNlIElOVFVPUzoKLQkJCWlucHV0X2Rldi0+ZXZiaXRbMF0gfD0gQklUKEVWX01TQykgfCBCSVQoRVZfUkVMKTsKLQkJCWlucHV0X2Rldi0+bXNjYml0WzBdIHw9IEJJVChNU0NfU0VSSUFMKTsKLQkJCWlucHV0X2Rldi0+cmVsYml0WzBdIHw9IEJJVChSRUxfV0hFRUwpOwotCQkJaW5wdXRfZGV2LT5rZXliaXRbTE9ORyhCVE5fTEVGVCldIHw9IEJJVChCVE5fTEVGVCkgfCBCSVQoQlROX1JJR0hUKSB8IEJJVChCVE5fTUlERExFKSB8IEJJVChCVE5fU0lERSkgfCBCSVQoQlROX0VYVFJBKTsKLQkJCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX0RJR0kpXSB8PSBCSVQoQlROX1RPT0xfUlVCQkVSKSB8IEJJVChCVE5fVE9PTF9NT1VTRSkJfCBCSVQoQlROX1RPT0xfQlJVU0gpCi0JCQkJCQkJICB8IEJJVChCVE5fVE9PTF9QRU5DSUwpIHwgQklUKEJUTl9UT09MX0FJUkJSVVNIKSB8IEJJVChCVE5fVE9PTF9MRU5TKSB8IEJJVChCVE5fU1RZTFVTMik7Ci0JCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ESVNUQU5DRSwgMCwgd2Fjb20tPmZlYXR1cmVzLT5kaXN0YW5jZV9tYXgsIDAsIDApOwotCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfV0hFRUwsIDAsIDEwMjMsIDAsIDApOwotCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfVElMVF9YLCAwLCAxMjcsIDAsIDApOwotCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfVElMVF9ZLCAwLCAxMjcsIDAsIDApOwotCQkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfUlosIC05MDAsIDg5OSwgMCwgMCk7Ci0JCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19USFJPVFRMRSwgLTEwMjMsIDEwMjMsIDAsIDApOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQTDoKLQkJCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX0RJR0kpXSB8PSBCSVQoQlROX1NUWUxVUzIpIHwgQklUKEJUTl9UT09MX1JVQkJFUik7Ci0JCQlicmVhazsKLQl9Ci0KLQllbmRwb2ludCA9ICZpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnRbMF0uZGVzYzsKLQotCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnBrdGxlbiA+IDEwKQotCQlCVUcoKTsKLQotCXVzYl9maWxsX2ludF91cmIod2Fjb20tPmlycSwgZGV2LAotCQkJIHVzYl9yY3ZpbnRwaXBlKGRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAotCQkJIHdhY29tLT5kYXRhLCB3YWNvbS0+ZmVhdHVyZXMtPnBrdGxlbiwKLQkJCSB3YWNvbS0+ZmVhdHVyZXMtPmlycSwgd2Fjb20sIGVuZHBvaW50LT5iSW50ZXJ2YWwpOwotCXdhY29tLT5pcnEtPnRyYW5zZmVyX2RtYSA9IHdhY29tLT5kYXRhX2RtYTsKLQl3YWNvbS0+aXJxLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKLQotCWlucHV0X3JlZ2lzdGVyX2RldmljZSh3YWNvbS0+ZGV2KTsKLQotCS8qIEFzayB0aGUgdGFibGV0IHRvIHJlcG9ydCB0YWJsZXQgZGF0YS4gUmVwZWF0IHVudGlsIGl0IHN1Y2NlZWRzICovCi0JZG8gewotCQlyZXBfZGF0YVswXSA9IDI7Ci0JCXJlcF9kYXRhWzFdID0gMjsKLQkJdXNiX3NldF9yZXBvcnQoaW50ZiwgMywgMiwgcmVwX2RhdGEsIDIpOwotCQl1c2JfZ2V0X3JlcG9ydChpbnRmLCAzLCAyLCByZXBfZGF0YSwgMik7Ci0JfSB3aGlsZSAocmVwX2RhdGFbMV0gIT0gMiAmJiBsaW1pdCsrIDwgNSk7Ci0KLQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIHdhY29tKTsKLQlyZXR1cm4gMDsKLQotZmFpbDI6CXVzYl9idWZmZXJfZnJlZShkZXYsIDEwLCB3YWNvbS0+ZGF0YSwgd2Fjb20tPmRhdGFfZG1hKTsKLWZhaWwxOglpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOwotCWtmcmVlKHdhY29tKTsKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIHZvaWQgd2Fjb21fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKLXsKLQlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7Ci0KLQl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOwotCWlmICh3YWNvbSkgewotCQl1c2Jfa2lsbF91cmIod2Fjb20tPmlycSk7Ci0JCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKHdhY29tLT5kZXYpOwotCQl1c2JfZnJlZV91cmIod2Fjb20tPmlycSk7Ci0JCXVzYl9idWZmZXJfZnJlZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCAxMCwgd2Fjb20tPmRhdGEsIHdhY29tLT5kYXRhX2RtYSk7Ci0JCWtmcmVlKHdhY29tKTsKLQl9Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB3YWNvbV9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJIndhY29tIiwKLQkucHJvYmUgPQl3YWNvbV9wcm9iZSwKLQkuZGlzY29ubmVjdCA9CXdhY29tX2Rpc2Nvbm5lY3QsCi0JLmlkX3RhYmxlID0Jd2Fjb21faWRzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgd2Fjb21faW5pdCh2b2lkKQotewotCWludCByZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJndhY29tX2RyaXZlcik7Ci0JaWYgKHJlc3VsdCA9PSAwKQotCQlpbmZvKERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHdhY29tX2V4aXQodm9pZCkKLXsKLQl1c2JfZGVyZWdpc3Rlcigmd2Fjb21fZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQod2Fjb21faW5pdCk7Ci1tb2R1bGVfZXhpdCh3YWNvbV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tLmggYi9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjczN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbS5oCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogZHJpdmVycy91c2IvaW5wdXQvd2Fjb20uaAorICoKKyAqICBVU0IgV2Fjb20gR3JhcGhpcmUgYW5kIFdhY29tIEludHVvcyB0YWJsZXQgc3VwcG9ydAorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBWb2p0ZWNoIFBhdmxpawk8dm9qdGVjaEB1Y3cuY3o+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAwIEFuZHJlYXMgQmFjaCBBYWVuCTxhYmFjaEBzdG9mYW5ldC5kaz4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDAgQ2xpZmZvcmQgV29sZgkJPGNsaWZmb3JkQGNsaWZmb3JkLmF0PgorICogIENvcHlyaWdodCAoYykgMjAwMCBTYW0gTW9zZWwJCTxzYW0ubW9zZWxAY29tcHV0ZXIub3JnPgorICogIENvcHlyaWdodCAoYykgMjAwMCBKYW1lcyBFLiBCbGFpcgkJPGNvcnZ1c0BnbnUub3JnPgorICogIENvcHlyaWdodCAoYykgMjAwMCBEYW5pZWwgRWdnZXIJCTxlZ2dlckBzdXNlLmRlPgorICogIENvcHlyaWdodCAoYykgMjAwMSBGcmVkZXJpYyBMZXBpZWQJCTxmbGVwaWVkQG1hbmRyYWtlc29mdC5jb20+CisgKiAgQ29weXJpZ2h0IChjKSAyMDA0IFBhbmFnaW90aXMgSXNzYXJpcwk8cGFuYWdpb3Rpcy5pc3NhcmlzQG1lY2gua3VsZXV2ZW4uYWMuYmU+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDYgUGluZyBDaGVuZwkJPHBpbmdjQHdhY29tLmNvbT4KKyAqCisgKiAgQ2hhbmdlTG9nOgorICogICAgICB2MC4xICh2cCkgIC0gSW5pdGlhbCByZWxlYXNlCisgKiAgICAgIHYwLjIgKGFiYSkgLSBTdXBwb3J0IGZvciBhbGwgYnV0dG9ucyAvIGNvbWJpbmF0aW9ucworICogICAgICB2MC4zICh2cCkgIC0gU3VwcG9ydCBmb3IgSW50dW9zIGFkZGVkCisgKgl2MC40IChzbSkgIC0gU3VwcG9ydCBmb3IgbW9yZSBJbnR1b3MgbW9kZWxzLCBtZW51c3RyaXAKKyAqCQkJcmVsYXRpdmUgbW9kZSwgcHJveGltaXR5LgorICoJdjAuNSAodnApICAtIEJpZyBjbGVhbnVwLCBuaWZ0eSBmZWF0dXJlcyByZW1vdmVkLAorICoJCQl0aGV5IGJlbG9uZyBpbiB1c2Vyc3BhY2UKKyAqCXYxLjggKHZwKSAgLSBTdWJtaXQgVVJCIG9ubHkgd2hlbiBvcGVyYXRpbmcsIG1vdmVkIHRvIENWUywKKyAqCQkJdXNlIGlucHV0X3JlcG9ydF9rZXkgaW5zdGVhZCBvZiByZXBvcnRfYnRuIGFuZAorICoJCQlvdGhlciBjbGVhbnVwcworICoJdjEuMTEgKHZwKSAtIEFkZCBVUkIgLT5kZXYgc2V0dGluZyBmb3IgbmV3IGtlcm5lbHMKKyAqCXYxLjExIChqYikgLSBBZGQgc3VwcG9ydCBmb3IgdGhlIDREIE1vdXNlICYgTGVucworICoJdjEuMTIgKGRlKSAtIEFkZCBzdXBwb3J0IGZvciB0d28gbW9yZSBpbmtpbmcgcGVuIElEcworICoJdjEuMTQgKHZwKSAtIFVzZSBuZXcgVVNCIGRldmljZSBpZCBwcm9iaW5nIHNjaGVtZS4KKyAqCQkgICAgIEZpeCBXYWNvbSBHcmFwaGlyZSBtb3VzZSB3aGVlbAorICoJdjEuMTggKHZwKSAtIEZpeCBtb3VzZSB3aGVlbCBkaXJlY3Rpb24KKyAqCQkgICAgIE1ha2UgbW91c2UgcmVsYXRpdmUKKyAqICAgICAgdjEuMjAgKGZsKSAtIFJlcG9ydCB0b29sIGlkIGZvciBJbnR1b3MgZGV2aWNlcworICogICAgICAgICAgICAgICAgIC0gTXVsdGkgdG9vbHMgc3VwcG9ydAorICogICAgICAgICAgICAgICAgIC0gQ29ycmVjdGVkIEludHVvcyBwcm90b2NvbCBkZWNvZGluZyAoYWlyYnJ1c2gsIDREIG1vdXNlLCBsZW5zIGN1cnNvci4uLikKKyAqICAgICAgICAgICAgICAgICAtIEFkZCBQTCBtb2RlbHMgc3VwcG9ydAorICoJCSAgIC0gRml4IFdhY29tIEdyYXBoaXJlIG1vdXNlIHdoZWVsIGFnYWluCisgKgl2MS4yMSAodnApIC0gUmVtb3ZlZCBwcm90b2NvbCBkZXNjcmlwdGlvbnMKKyAqCQkgICAtIEFkZGVkIE1JU0NfU0VSSUFMIGZvciB0b29sIHNlcmlhbCBudW1iZXJzCisgKgkgICAgICAoZ2IpIC0gSWRlbnRpZnkgdmVyc2lvbiBvbiBtb2R1bGUgbG9hZC4KKyAqICAgIHYxLjIxLjEgKGZsKSAtIGFkZGVkIEdyYXBoaXJlMiBzdXBwb3J0CisgKiAgICB2MS4yMS4yIChmbCkgLSBhZGRlZCBJbnR1b3MyIHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAtIGFkZGVkIGFsbCB0aGUgUEwgaWRzCisgKiAgICB2MS4yMS4zIChmbCkgLSBhZGRlZCBhbm90aGVyIGVyYXNlciBpZCBmcm9tIE5laWwgT2thbW90bworICogICAgICAgICAgICAgICAgIC0gYWRkZWQgc21vb3RoIGZpbHRlciBmb3IgR3JhcGhpcmUgZnJvbSBQZXJpIEhhbmtleQorICogICAgICAgICAgICAgICAgIC0gYWRkZWQgUGVuUGFydG5lciBzdXBwb3J0IGZyb20gT2xhZiB2YW4gRXMKKyAqICAgICAgICAgICAgICAgICAtIG5ldyB0b29sIGlkcyBmcm9tIE9sZSBNYXJ0aW4gQmpvZXJuZGFsZW4KKyAqCXYxLjI5IChwYykgLSBBZGQgc3VwcG9ydCBmb3IgbW9yZSB0YWJsZXRzCisgKgkJICAgLSBGaXggcHJlc3N1cmUgcmVwb3J0aW5nCisgKgl2MS4zMCAodnApIC0gTWVyZ2UgMi40IGFuZCAyLjUgZHJpdmVycworICoJCSAgIC0gU2luY2UgMi41IG5vdyBoYXMgaW5wdXRfc3luYygpLCByZW1vdmUgTVNDX1NFUklBTCBhYnVzZQorICoJCSAgIC0gQ2xlYW51cHMgaGVyZSBhbmQgdGhlcmUKKyAqICAgIHYxLjMwLjEgKHBpKSAtIEFkZGVkIEdyYXBoaXJlMyBzdXBwb3J0CisgKgl2MS40MCAocGMpIC0gQWRkIHN1cHBvcnQgZm9yIHNldmVyYWwgbmV3IGRldmljZXMsIGZpeCBlcmFzZXIgcmVwb3J0aW5nLCAuLi4KKyAqCXYxLjQzIChwYykgLSBBZGRlZCBzdXBwb3J0IGZvciBDaW50aXEgMjFVWAorICoJCSAgIC0gRml4ZWQgYSBHcmFwaGlyZSBidWcKKyAqCQkgICAtIE1lcmdlZCB3YWNvbV9pbnR1b3MzX2lycSBpbnRvIHdhY29tX2ludHVvc19pcnEKKyAqCXYxLjQ0IChwYykgLSBBZGRlZCBzdXBwb3J0IGZvciBHcmFwaGlyZTQsIENpbnRpcSA3MTAsIEludHVvczMgNngxMSwgZXRjLgorICoJCSAgIC0gUmVwb3J0IERldmljZSBJRHMKKyAqICAgICAgdjEuNDUgKHBjKSAtIEFkZGVkIHN1cHBvcnQgZm9yIERURiA1MjEsIEludHVvczMgMTJ4MTIgYW5kIDEyeDE5CisgKiAgICAgICAgICAgICAgICAgLSBNaW5vciBkYXRhIHJlcG9ydCBmaXgKKyAqICAgICAgdjEuNDYgKHBjKSAtIFNwbGl0IHdhY29tLmMgaW50byB3YWNvbV9zeXMuYyBhbmQgd2Fjb21fd2FjLmMsCisgKgkJICAgLSB3aGVyZSB3YWNvbV9zeXMuYyBkZWFscyB3aXRoIHN5c3RlbSBzcGVjaWZpYyBjb2RlLAorICogCQkgICAtIGFuZCB3YWNvbV93YWMuYyBkZWFscyB3aXRoIFdhY29tIHNwZWNpZmljIGNvZGUKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2lmbmRlZiBXQUNPTV9ICisjZGVmaW5lIFdBQ09NX0gKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9pbnB1dC5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworLyoKKyAqIFZlcnNpb24gSW5mb3JtYXRpb24KKyAqLworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjEuNDYiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIlZvanRlY2ggUGF2bGlrIDx2b2p0ZWNoQHVjdy5jej4iCisjZGVmaW5lIERSSVZFUl9ERVNDICJVU0IgV2Fjb20gR3JhcGhpcmUgYW5kIFdhY29tIEludHVvcyB0YWJsZXQgZHJpdmVyIgorI2RlZmluZSBEUklWRVJfTElDRU5TRSAiR1BMIgorCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKERSSVZFUl9MSUNFTlNFKTsKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX1dBQ09NCTB4MDU2YQorCitzdHJ1Y3Qgd2Fjb20geworCWRtYV9hZGRyX3QgZGF0YV9kbWE7CisJc3RydWN0IGlucHV0X2RldiAqZGV2OworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JkZXY7CisJc3RydWN0IHVyYiAqaXJxOworCXN0cnVjdCB3YWNvbV93YWMgKiB3YWNvbV93YWM7CisJY2hhciBwaHlzWzMyXTsKK307CisKK3N0cnVjdCB3YWNvbV9jb21ibyB7CisJc3RydWN0IHdhY29tICogd2Fjb207CisJc3RydWN0IHVyYiAqIHVyYjsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKK307CisKK2V4dGVybiBpbnQgd2Fjb21fd2FjX2lycShzdHJ1Y3Qgd2Fjb21fd2FjICogd2Fjb21fd2FjLCB2b2lkICogd2NvbWJvKTsKK2V4dGVybiB2b2lkIHdhY29tX3N5c19pcnEoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gdm9pZCB3YWNvbV9yZXBvcnRfYWJzKHZvaWQgKndjb21ibywgdW5zaWduZWQgaW50IGFic190eXBlLCBpbnQgYWJzX2RhdGEpOworZXh0ZXJuIHZvaWQgd2Fjb21fcmVwb3J0X3JlbCh2b2lkICp3Y29tYm8sIHVuc2lnbmVkIGludCByZWxfdHlwZSwgaW50IHJlbF9kYXRhKTsKK2V4dGVybiB2b2lkIHdhY29tX3JlcG9ydF9rZXkodm9pZCAqd2NvbWJvLCB1bnNpZ25lZCBpbnQga2V5X3R5cGUsIGludCBrZXlfZGF0YSk7CitleHRlcm4gdm9pZCB3YWNvbV9pbnB1dF9ldmVudCh2b2lkICp3Y29tYm8sIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKTsKK2V4dGVybiB2b2lkIHdhY29tX2lucHV0X3JlZ3Modm9pZCAqd2NvbWJvKTsKK2V4dGVybiB2b2lkIHdhY29tX2lucHV0X3N5bmModm9pZCAqd2NvbWJvKTsKK2V4dGVybiB2b2lkIHdhY29tX2luaXRfaW5wdXRfZGV2KHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldiwgc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjKTsKK2V4dGVybiB2b2lkIGlucHV0X2Rldl9nNChzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYyk7CitleHRlcm4gdm9pZCBpbnB1dF9kZXZfZyhzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYyk7CitleHRlcm4gdm9pZCBpbnB1dF9kZXZfaTMoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpOworZXh0ZXJuIHZvaWQgaW5wdXRfZGV2X2koc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpOworZXh0ZXJuIHZvaWQgaW5wdXRfZGV2X3BsKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldiwgc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjKTsKK2V4dGVybiB2b2lkIGlucHV0X2Rldl9wdChzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYyk7CitleHRlcm4gX191MTYgd2Fjb21fbGUxNl90b19jcHUodW5zaWduZWQgY2hhciAqZGF0YSk7CitleHRlcm4gX191MTYgd2Fjb21fYmUxNl90b19jcHUodW5zaWduZWQgY2hhciAqZGF0YSk7CitleHRlcm4gc3RydWN0IHdhY29tX2ZlYXR1cmVzICogZ2V0X3dhY29tX2ZlYXR1cmUoY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqIGdldF9kZXZpY2VfdGFibGUodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW5wdXQvd2Fjb21fc3lzLmMgYi9kcml2ZXJzL3VzYi9pbnB1dC93YWNvbV9zeXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzNiNTJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvaW5wdXQvd2Fjb21fc3lzLmMKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBkcml2ZXJzL3VzYi9pbnB1dC93YWNvbV9zeXMuYworICoKKyAqICBVU0IgV2Fjb20gR3JhcGhpcmUgYW5kIFdhY29tIEludHVvcyB0YWJsZXQgc3VwcG9ydCAtIHN5c3RlbSBzcGVjaWZpYyBjb2RlCisgKi8KKworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgIndhY29tLmgiCisjaW5jbHVkZSAid2Fjb21fd2FjLmgiCisKKyNkZWZpbmUgVVNCX1JFUV9HRVRfUkVQT1JUCTB4MDEKKyNkZWZpbmUgVVNCX1JFUV9TRVRfUkVQT1JUCTB4MDkKKworc3RhdGljIGludCB1c2JfZ2V0X3JlcG9ydChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgdW5zaWduZWQgY2hhciB0eXBlLAorCQkJCXVuc2lnbmVkIGNoYXIgaWQsIHZvaWQgKmJ1ZiwgaW50IHNpemUpCit7CisJcmV0dXJuIHVzYl9jb250cm9sX21zZyhpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLAorCQl1c2JfcmN2Y3RybHBpcGUoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKSwgMCksCisJCVVTQl9SRVFfR0VUX1JFUE9SVCwgVVNCX1RZUEVfQ0xBU1MgfCBVU0JfUkVDSVBfSU5URVJGQUNFLAorCQkodHlwZSA8PCA4KSArIGlkLCBpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlciwKKwkJYnVmLCBzaXplLCAxMDApOworfQorCitzdGF0aWMgaW50IHVzYl9zZXRfcmVwb3J0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCB1bnNpZ25lZCBjaGFyIHR5cGUsCisJCQkJdW5zaWduZWQgY2hhciBpZCwgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksCisJCXVzYl9zbmRjdHJscGlwZShpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpLCAwKSwKKyAgICAgICAgICAgICAgICBVU0JfUkVRX1NFVF9SRVBPUlQsIFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSwKKyAgICAgICAgICAgICAgICAodHlwZSA8PCA4KSArIGlkLCBpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlciwKKwkJYnVmLCBzaXplLCAxMDAwKTsKK30KKworc3RhdGljIHN0cnVjdCBpbnB1dF9kZXYgKiBnZXRfaW5wdXRfZGV2KHN0cnVjdCB3YWNvbV9jb21ibyAqd2NvbWJvKQoreworCXJldHVybiB3Y29tYm8tPndhY29tLT5kZXY7Cit9CisKK3ZvaWQgd2Fjb21fc3lzX2lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHdhY29tX2NvbWJvIHdjb21ibzsKKwlpbnQgcmV0dmFsOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJLyogc3VjY2VzcyAqLworCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwl3Y29tYm8ud2Fjb20gPSB3YWNvbTsKKwl3Y29tYm8udXJiID0gdXJiOworCXdjb21iby5yZWdzID0gcmVnczsKKworCWlmICh3YWNvbV93YWNfaXJxKHdhY29tLT53YWNvbV93YWMsICh2b2lkICopJndjb21ibykpCisJCWlucHV0X3N5bmMoZ2V0X2lucHV0X2Rldigmd2NvbWJvKSk7CisKKyBleGl0OgorCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiICh1cmIsIEdGUF9BVE9NSUMpOworCWlmIChyZXR2YWwpCisJCWVyciAoIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwKKwkJICAgICBfX0ZVTkNUSU9OX18sIHJldHZhbCk7Cit9CisKK3ZvaWQgd2Fjb21fcmVwb3J0X2tleSh2b2lkICp3Y29tYm8sIHVuc2lnbmVkIGludCBrZXlfdHlwZSwgaW50IGtleV9kYXRhKQoreworCWlucHV0X3JlcG9ydF9rZXkoZ2V0X2lucHV0X2Rldigoc3RydWN0IHdhY29tX2NvbWJvICopd2NvbWJvKSwga2V5X3R5cGUsIGtleV9kYXRhKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgd2Fjb21fcmVwb3J0X2Ficyh2b2lkICp3Y29tYm8sIHVuc2lnbmVkIGludCBhYnNfdHlwZSwgaW50IGFic19kYXRhKQoreworCWlucHV0X3JlcG9ydF9hYnMoZ2V0X2lucHV0X2Rldigoc3RydWN0IHdhY29tX2NvbWJvICopd2NvbWJvKSwgYWJzX3R5cGUsIGFic19kYXRhKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgd2Fjb21fcmVwb3J0X3JlbCh2b2lkICp3Y29tYm8sIHVuc2lnbmVkIGludCByZWxfdHlwZSwgaW50IHJlbF9kYXRhKQoreworCWlucHV0X3JlcG9ydF9yZWwoZ2V0X2lucHV0X2Rldigoc3RydWN0IHdhY29tX2NvbWJvICopd2NvbWJvKSwgcmVsX3R5cGUsIHJlbF9kYXRhKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgd2Fjb21faW5wdXRfZXZlbnQodm9pZCAqd2NvbWJvLCB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSkKK3sKKwlpbnB1dF9ldmVudChnZXRfaW5wdXRfZGV2KChzdHJ1Y3Qgd2Fjb21fY29tYm8gKil3Y29tYm8pLCB0eXBlLCBjb2RlLCB2YWx1ZSk7CisJcmV0dXJuOworfQorCitfX3UxNiB3YWNvbV9iZTE2X3RvX2NwdSh1bnNpZ25lZCBjaGFyICpkYXRhKQoreworCV9fdTE2IHZhbHVlOworCXZhbHVlID0gYmUxNl90b19jcHUoKihfX2JlMTYgKikgZGF0YSk7CisJcmV0dXJuIHZhbHVlOworfQorCitfX3UxNiB3YWNvbV9sZTE2X3RvX2NwdSh1bnNpZ25lZCBjaGFyICpkYXRhKQoreworCV9fdTE2IHZhbHVlOworCXZhbHVlID0gYmUxNl90b19jcHUoKihfX2JlMTYgKikgZGF0YSk7CisJcmV0dXJuIHZhbHVlOworfQorCit2b2lkIHdhY29tX2lucHV0X3JlZ3Modm9pZCAqd2NvbWJvKQoreworCWlucHV0X3JlZ3MoZ2V0X2lucHV0X2Rldigoc3RydWN0IHdhY29tX2NvbWJvICopd2NvbWJvKSwgKChzdHJ1Y3Qgd2Fjb21fY29tYm8gKil3Y29tYm8pLT5yZWdzKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgd2Fjb21faW5wdXRfc3luYyh2b2lkICp3Y29tYm8pCit7CisJaW5wdXRfc3luYyhnZXRfaW5wdXRfZGV2KChzdHJ1Y3Qgd2Fjb21fY29tYm8gKil3Y29tYm8pKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgd2Fjb21fb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHdhY29tICp3YWNvbSA9IGRldi0+cHJpdmF0ZTsKKworCXdhY29tLT5pcnEtPmRldiA9IHdhY29tLT51c2JkZXY7CisJaWYgKHVzYl9zdWJtaXRfdXJiKHdhY29tLT5pcnEsIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3YWNvbV9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHdhY29tICp3YWNvbSA9IGRldi0+cHJpdmF0ZTsKKworCXVzYl9raWxsX3VyYih3YWNvbS0+aXJxKTsKK30KKwordm9pZCBpbnB1dF9kZXZfZzQoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LCBzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpCit7CisJaW5wdXRfZGV2LT5ldmJpdFswXSB8PSBCSVQoRVZfTVNDKTsKKwlpbnB1dF9kZXYtPm1zY2JpdFswXSB8PSBCSVQoTVNDX1NFUklBTCk7CisJaW5wdXRfZGV2LT5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fVE9PTF9GSU5HRVIpOworCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX0xFRlQpXSB8PSBCSVQoQlROXzApIHwgQklUKEJUTl8xKSB8IEJJVChCVE5fMikgfCBCSVQoQlROXzMpIHwgQklUKEJUTl80KSB8IEJJVChCVE5fNSkgfCBCSVQoQlROXzYpIHwgQklUKEJUTl83KTsKK30KKwordm9pZCBpbnB1dF9kZXZfZyhzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYykKK3sKKwlpbnB1dF9kZXYtPmV2Yml0WzBdIHw9IEJJVChFVl9SRUwpOworCWlucHV0X2Rldi0+cmVsYml0WzBdIHw9IEJJVChSRUxfV0hFRUwpOworCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX0xFRlQpXSB8PSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9SSUdIVCkgfCBCSVQoQlROX01JRERMRSk7CisJaW5wdXRfZGV2LT5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fVE9PTF9SVUJCRVIpIHwgQklUKEJUTl9UT09MX01PVVNFKSB8IEJJVChCVE5fU1RZTFVTMik7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfRElTVEFOQ0UsIDAsIHdhY29tX3dhYy0+ZmVhdHVyZXMtPmRpc3RhbmNlX21heCwgMCwgMCk7Cit9CisKK3ZvaWQgaW5wdXRfZGV2X2kzKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldiwgc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjKQoreworCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX0RJR0kpXSB8PSBCSVQoQlROX1RPT0xfRklOR0VSKTsKKwlpbnB1dF9kZXYtPmtleWJpdFtMT05HKEJUTl9MRUZUKV0gfD0gQklUKEJUTl8wKSB8IEJJVChCVE5fMSkgfCBCSVQoQlROXzIpIHwgQklUKEJUTl8zKSB8IEJJVChCVE5fNCkgfCBCSVQoQlROXzUpIHwgQklUKEJUTl82KSB8IEJJVChCVE5fNyk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfUlgsIDAsIDQwOTcsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1JZLCAwLCA0MDk3LCAwLCAwKTsKK30KKwordm9pZCBpbnB1dF9kZXZfaShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYykKK3sKKwlpbnB1dF9kZXYtPmV2Yml0WzBdIHw9IEJJVChFVl9NU0MpIHwgQklUKEVWX1JFTCk7CisJaW5wdXRfZGV2LT5tc2NiaXRbMF0gfD0gQklUKE1TQ19TRVJJQUwpOworCWlucHV0X2Rldi0+cmVsYml0WzBdIHw9IEJJVChSRUxfV0hFRUwpOworCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX0xFRlQpXSB8PSBCSVQoQlROX0xFRlQpIHwgQklUKEJUTl9SSUdIVCkgfCBCSVQoQlROX01JRERMRSkgfCBCSVQoQlROX1NJREUpIHwgQklUKEJUTl9FWFRSQSk7CisJaW5wdXRfZGV2LT5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fVE9PTF9SVUJCRVIpIHwgQklUKEJUTl9UT09MX01PVVNFKQl8IEJJVChCVE5fVE9PTF9CUlVTSCkKKwkJfCBCSVQoQlROX1RPT0xfUEVOQ0lMKSB8IEJJVChCVE5fVE9PTF9BSVJCUlVTSCkgfCBCSVQoQlROX1RPT0xfTEVOUykgfCBCSVQoQlROX1NUWUxVUzIpOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX0RJU1RBTkNFLCAwLCB3YWNvbV93YWMtPmZlYXR1cmVzLT5kaXN0YW5jZV9tYXgsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1dIRUVMLCAwLCAxMDIzLCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19USUxUX1gsIDAsIDEyNywgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfVElMVF9ZLCAwLCAxMjcsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1JaLCAtOTAwLCA4OTksIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1RIUk9UVExFLCAtMTAyMywgMTAyMywgMCwgMCk7Cit9CisKK3ZvaWQgaW5wdXRfZGV2X3BsKHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldiwgc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjKQoreworCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX0RJR0kpXSB8PSBCSVQoQlROX1NUWUxVUzIpIHwgQklUKEJUTl9UT09MX1JVQkJFUik7Cit9CisKK3ZvaWQgaW5wdXRfZGV2X3B0KHN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2Rldiwgc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjKQoreworCWlucHV0X2Rldi0+a2V5Yml0W0xPTkcoQlROX0RJR0kpXSB8PSBCSVQoQlROX1RPT0xfUlVCQkVSKTsKK30KKworc3RhdGljIGludCB3YWNvbV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJc3RydWN0IHdhY29tICp3YWNvbTsKKwlzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWM7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCWNoYXIgcmVwX2RhdGFbMl0sIGxpbWl0ID0gMDsKKworCXdhY29tID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdhY29tKSwgR0ZQX0tFUk5FTCk7CisJd2Fjb21fd2FjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdhY29tX3dhYyksIEdGUF9LRVJORUwpOworCWlucHV0X2RldiA9IGlucHV0X2FsbG9jYXRlX2RldmljZSgpOworCWlmICghd2Fjb20gfHwgIWlucHV0X2RldiB8fCAhd2Fjb21fd2FjKQorCQlnb3RvIGZhaWwxOworCisJd2Fjb21fd2FjLT5kYXRhID0gdXNiX2J1ZmZlcl9hbGxvYyhkZXYsIDEwLCBHRlBfS0VSTkVMLCAmd2Fjb20tPmRhdGFfZG1hKTsKKwlpZiAoIXdhY29tX3dhYy0+ZGF0YSkKKwkJZ290byBmYWlsMTsKKworCXdhY29tLT5pcnEgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghd2Fjb20tPmlycSkKKwkJZ290byBmYWlsMjsKKworCXdhY29tLT51c2JkZXYgPSBkZXY7CisJd2Fjb20tPmRldiA9IGlucHV0X2RldjsKKwl1c2JfbWFrZV9wYXRoKGRldiwgd2Fjb20tPnBoeXMsIHNpemVvZih3YWNvbS0+cGh5cykpOworCXN0cmxjYXQod2Fjb20tPnBoeXMsICIvaW5wdXQwIiwgc2l6ZW9mKHdhY29tLT5waHlzKSk7CisKKwl3YWNvbV93YWMtPmZlYXR1cmVzID0gZ2V0X3dhY29tX2ZlYXR1cmUoaWQpOworCWlmICh3YWNvbV93YWMtPmZlYXR1cmVzLT5wa3RsZW4gPiAxMCkKKwkJQlVHKCk7CisKKwlpbnB1dF9kZXYtPm5hbWUgPSB3YWNvbV93YWMtPmZlYXR1cmVzLT5uYW1lOworCXdhY29tLT53YWNvbV93YWMgPSB3YWNvbV93YWM7CisJdXNiX3RvX2lucHV0X2lkKGRldiwgJmlucHV0X2Rldi0+aWQpOworCisJaW5wdXRfZGV2LT5jZGV2LmRldiA9ICZpbnRmLT5kZXY7CisJaW5wdXRfZGV2LT5wcml2YXRlID0gd2Fjb207CisJaW5wdXRfZGV2LT5vcGVuID0gd2Fjb21fb3BlbjsKKwlpbnB1dF9kZXYtPmNsb3NlID0gd2Fjb21fY2xvc2U7CisKKwlpbnB1dF9kZXYtPmV2Yml0WzBdIHw9IEJJVChFVl9LRVkpIHwgQklUKEVWX0FCUyk7CisJaW5wdXRfZGV2LT5rZXliaXRbTE9ORyhCVE5fRElHSSldIHw9IEJJVChCVE5fVE9PTF9QRU4pIHwgQklUKEJUTl9UT1VDSCkgfCBCSVQoQlROX1NUWUxVUyk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWCwgMCwgd2Fjb21fd2FjLT5mZWF0dXJlcy0+eF9tYXgsIDQsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1ksIDAsIHdhY29tX3dhYy0+ZmVhdHVyZXMtPnlfbWF4LCA0LCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19QUkVTU1VSRSwgMCwgd2Fjb21fd2FjLT5mZWF0dXJlcy0+cHJlc3N1cmVfbWF4LCAwLCAwKTsKKwlpbnB1dF9kZXYtPmFic2JpdFtMT05HKEFCU19NSVNDKV0gfD0gQklUKEFCU19NSVNDKTsKKworCXdhY29tX2luaXRfaW5wdXRfZGV2KGlucHV0X2Rldiwgd2Fjb21fd2FjKTsKKworCWVuZHBvaW50ID0gJmludGYtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludFswXS5kZXNjOworCisJdXNiX2ZpbGxfaW50X3VyYih3YWNvbS0+aXJxLCBkZXYsCisJCQkgdXNiX3JjdmludHBpcGUoZGV2LCBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkgd2Fjb21fd2FjLT5kYXRhLCB3YWNvbV93YWMtPmZlYXR1cmVzLT5wa3RsZW4sCisJCQkgd2Fjb21fd2FjLT5mZWF0dXJlcy0+aXJxLCB3YWNvbSwgZW5kcG9pbnQtPmJJbnRlcnZhbCk7CisJd2Fjb20tPmlycS0+dHJhbnNmZXJfZG1hID0gd2Fjb20tPmRhdGFfZG1hOworCXdhY29tLT5pcnEtPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCisJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHdhY29tLT5kZXYpOworCisJLyogQXNrIHRoZSB0YWJsZXQgdG8gcmVwb3J0IHRhYmxldCBkYXRhLiBSZXBlYXQgdW50aWwgaXQgc3VjY2VlZHMgKi8KKwlkbyB7CisJCXJlcF9kYXRhWzBdID0gMjsKKwkJcmVwX2RhdGFbMV0gPSAyOworCQl1c2Jfc2V0X3JlcG9ydChpbnRmLCAzLCAyLCByZXBfZGF0YSwgMik7CisJCXVzYl9nZXRfcmVwb3J0KGludGYsIDMsIDIsIHJlcF9kYXRhLCAyKTsKKwl9IHdoaWxlIChyZXBfZGF0YVsxXSAhPSAyICYmIGxpbWl0KysgPCA1KTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50Ziwgd2Fjb20pOworCXJldHVybiAwOworCitmYWlsMjoJdXNiX2J1ZmZlcl9mcmVlKGRldiwgMTAsIHdhY29tX3dhYy0+ZGF0YSwgd2Fjb20tPmRhdGFfZG1hKTsKK2ZhaWwxOglpbnB1dF9mcmVlX2RldmljZShpbnB1dF9kZXYpOworCWtmcmVlKHdhY29tKTsKKwlrZnJlZSh3YWNvbV93YWMpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCB3YWNvbV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQoreworCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSB1c2JfZ2V0X2ludGZkYXRhIChpbnRmKTsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJaWYgKHdhY29tKSB7CisJCXVzYl9raWxsX3VyYih3YWNvbS0+aXJxKTsKKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uod2Fjb20tPmRldik7CisJCXVzYl9mcmVlX3VyYih3YWNvbS0+aXJxKTsKKwkJdXNiX2J1ZmZlcl9mcmVlKGludGVyZmFjZV90b191c2JkZXYoaW50ZiksIDEwLCB3YWNvbS0+d2Fjb21fd2FjLT5kYXRhLCB3YWNvbS0+ZGF0YV9kbWEpOworCQlrZnJlZSh3YWNvbSk7CisJCWtmcmVlKHdhY29tLT53YWNvbV93YWMpOworCX0KK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHdhY29tX2RyaXZlciA9IHsKKwkubmFtZSA9CQkid2Fjb20iLAorCS5wcm9iZSA9CXdhY29tX3Byb2JlLAorCS5kaXNjb25uZWN0ID0Jd2Fjb21fZGlzY29ubmVjdCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHdhY29tX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCXdhY29tX2RyaXZlci5pZF90YWJsZSA9IGdldF9kZXZpY2VfdGFibGUoKTsKKwlyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJndhY29tX2RyaXZlcik7CisJaWYgKHJlc3VsdCA9PSAwKQorCQlpbmZvKERSSVZFUl9WRVJTSU9OICI6IiBEUklWRVJfREVTQyk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHdhY29tX2V4aXQodm9pZCkKK3sKKwl1c2JfZGVyZWdpc3Rlcigmd2Fjb21fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQod2Fjb21faW5pdCk7Cittb2R1bGVfZXhpdCh3YWNvbV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3dhYy5jIGIvZHJpdmVycy91c2IvaW5wdXQvd2Fjb21fd2FjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkNDU4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3dhYy5jCkBAIC0wLDAgKzEsNjQ2IEBACisvKgorICogZHJpdmVycy91c2IvaW5wdXQvd2Fjb21fd2FjLmMKKyAqCisgKiAgVVNCIFdhY29tIEdyYXBoaXJlIGFuZCBXYWNvbSBJbnR1b3MgdGFibGV0IHN1cHBvcnQgLSBXYWNvbSBzcGVjaWZpYyBjb2RlCisgKgorICovCisKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSAid2Fjb20uaCIKKyNpbmNsdWRlICJ3YWNvbV93YWMuaCIKKworc3RhdGljIGludCB3YWNvbV9wZW5wYXJ0bmVyX2lycShzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbSwgdm9pZCAqd2NvbWJvKQoreworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB3YWNvbS0+ZGF0YTsKKworCXN3aXRjaCAoZGF0YVswXSkgeworCQljYXNlIDE6CisJCQl3YWNvbV9pbnB1dF9yZWdzKHdjb21ibyk7CisJCQlpZiAoZGF0YVs1XSAmIDB4ODApIHsKKwkJCQl3YWNvbS0+dG9vbFswXSA9IChkYXRhWzVdICYgMHgyMCkgPyBCVE5fVE9PTF9SVUJCRVIgOiBCVE5fVE9PTF9QRU47CisJCQkJd2Fjb20tPmlkWzBdID0gKGRhdGFbNV0gJiAweDIwKSA/IEVSQVNFUl9ERVZJQ0VfSUQgOiBTVFlMVVNfREVWSUNFX0lEOworCQkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCB3YWNvbS0+dG9vbFswXSwgMSk7CisJCQkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19NSVNDLCB3YWNvbS0+aWRbMF0pOyAvKiByZXBvcnQgdG9vbCBpZCAqLworCQkJCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfWCwgd2Fjb21fbGUxNl90b19jcHUoJmRhdGFbMV0pKTsKKwkJCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX1ksIHdhY29tX2xlMTZfdG9fY3B1KCZkYXRhWzNdKSk7CisJCQkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19QUkVTU1VSRSwgKHNpZ25lZCBjaGFyKWRhdGFbNl0gKyAxMjcpOworCQkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fVE9VQ0gsICgoc2lnbmVkIGNoYXIpZGF0YVs2XSA+IC0xMjcpKTsKKwkJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX1NUWUxVUywgKGRhdGFbNV0gJiAweDQwKSk7CisJCQl9IGVsc2UgeworCQkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCB3YWNvbS0+dG9vbFswXSwgMCk7CisJCQkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19NSVNDLCAwKTsgLyogcmVwb3J0IHRvb2wgaWQgKi8KKwkJCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX1BSRVNTVVJFLCAtMSk7CisJCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9UT1VDSCwgMCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJd2Fjb21faW5wdXRfcmVncyh3Y29tYm8pOworCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9UT09MX1BFTiwgMSk7CisJCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX01JU0MsIFNUWUxVU19ERVZJQ0VfSUQpOyAvKiByZXBvcnQgdG9vbCBpZCAqLworCQkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19YLCB3YWNvbV9sZTE2X3RvX2NwdSgmZGF0YVsxXSkpOworCQkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19ZLCB3YWNvbV9sZTE2X3RvX2NwdSgmZGF0YVszXSkpOworCQkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19QUkVTU1VSRSwgKHNpZ25lZCBjaGFyKWRhdGFbNl0gKyAxMjcpOworCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9UT1VDSCwgKChzaWduZWQgY2hhcilkYXRhWzZdID4gLTgwKSAmJiAhKGRhdGFbNV0gJiAweDIwKSk7CisJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX1NUWUxVUywgKGRhdGFbNV0gJiAweDQwKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gIndhY29tX3BlbnBhcnRuZXJfaXJxOiByZWNlaXZlZCB1bmtub3duIHJlcG9ydCAjJWRcbiIsIGRhdGFbMF0pOworCQkJcmV0dXJuIDA7CisgICAgICAgIH0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCB3YWNvbV9wbF9pcnEoc3RydWN0IHdhY29tX3dhYyAqd2Fjb20sIHZvaWQgKndjb21ibykKK3sKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gd2Fjb20tPmRhdGE7CisJaW50IHByb3gsIGlkLCBwcmVzc3VyZTsKKworCWlmIChkYXRhWzBdICE9IDIpIHsKKwkJZGJnKCJ3YWNvbV9wbF9pcnE6IHJlY2VpdmVkIHVua25vd24gcmVwb3J0ICMlZCIsIGRhdGFbMF0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcm94ID0gZGF0YVsxXSAmIDB4NDA7CisKKwl3YWNvbV9pbnB1dF9yZWdzKHdjb21ibyk7CisKKwlpZCA9IEVSQVNFUl9ERVZJQ0VfSUQ7CisJaWYgKHByb3gpIHsKKworCQlwcmVzc3VyZSA9IChzaWduZWQgY2hhcikoKGRhdGFbN10gPDwgMSkgfCAoKGRhdGFbNF0gPj4gMikgJiAxKSk7CisJCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnByZXNzdXJlX21heCA+IDI1NSkKKwkJCXByZXNzdXJlID0gKHByZXNzdXJlIDw8IDEpIHwgKChkYXRhWzRdID4+IDYpICYgMSk7CisJCXByZXNzdXJlICs9ICh3YWNvbS0+ZmVhdHVyZXMtPnByZXNzdXJlX21heCArIDEpIC8gMjsKKworCQkvKgorCQkgKiBpZiBnb2luZyBmcm9tIG91dCBvZiBwcm94aW1pdHkgaW50byBwcm94aW1pdHkgc2VsZWN0IGJldHdlZW4gdGhlIGVyYXNlcgorCQkgKiBhbmQgdGhlIHBlbiBiYXNlZCBvbiB0aGUgc3RhdGUgb2YgdGhlIHN0eWx1czIgYnV0dG9uLCBjaG9vc2UgZXJhc2VyIGlmCisJCSAqIHByZXNzZWQgZWxzZSBjaG9vc2UgcGVuLiBpZiBub3QgYSBwcm94aW1pdHkgY2hhbmdlIGZyb20gb3V0IHRvIGluLCBzZW5kCisJCSAqIGFuIG91dCBvZiBwcm94aW1pdHkgZm9yIHByZXZpb3VzIHRvb2wgdGhlbiBhIGluIGZvciBuZXcgdG9vbC4KKwkJICovCisJCWlmICghd2Fjb20tPnRvb2xbMF0pIHsKKwkJCS8qIEVyYXNlciBiaXQgc2V0IGZvciBEVEYgKi8KKwkJCWlmIChkYXRhWzFdICYgMHgxMCkKKwkJCQl3YWNvbS0+dG9vbFsxXSA9IEJUTl9UT09MX1JVQkJFUjsKKwkJCWVsc2UKKwkJCQkvKiBHb2luZyBpbnRvIHByb3hpbWl0eSBzZWxlY3QgdG9vbCAqLworCQkJCXdhY29tLT50b29sWzFdID0gKGRhdGFbNF0gJiAweDIwKSA/IEJUTl9UT09MX1JVQkJFUiA6IEJUTl9UT09MX1BFTjsKKwkJfSBlbHNlIHsKKwkJCS8qIHdhcyBlbnRlcmVkIHdpdGggc3R5bHVzMiBwcmVzc2VkICovCisJCQlpZiAod2Fjb20tPnRvb2xbMV0gPT0gQlROX1RPT0xfUlVCQkVSICYmICEoZGF0YVs0XSAmIDB4MjApKSB7CisJCQkJLyogcmVwb3J0IG91dCBwcm94aW1pdHkgZm9yIHByZXZpb3VzIHRvb2wgKi8KKwkJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgd2Fjb20tPnRvb2xbMV0sIDApOworCQkJCXdhY29tX2lucHV0X3N5bmMod2NvbWJvKTsKKwkJCQl3YWNvbS0+dG9vbFsxXSA9IEJUTl9UT09MX1BFTjsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlpZiAod2Fjb20tPnRvb2xbMV0gIT0gQlROX1RPT0xfUlVCQkVSKSB7CisJCQkvKiBVbmtub3duIHRvb2wgc2VsZWN0ZWQgZGVmYXVsdCB0byBwZW4gdG9vbCAqLworCQkJd2Fjb20tPnRvb2xbMV0gPSBCVE5fVE9PTF9QRU47CisJCQlpZCA9IFNUWUxVU19ERVZJQ0VfSUQ7CisJCX0KKwkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIHdhY29tLT50b29sWzFdLCBwcm94KTsgLyogcmVwb3J0IGluIHByb3hpbWl0eSBmb3IgdG9vbCAqLworCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX01JU0MsIGlkKTsgLyogcmVwb3J0IHRvb2wgaWQgKi8KKwkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19YLCBkYXRhWzNdIHwgKGRhdGFbMl0gPDwgNykgfCAoKGRhdGFbMV0gJiAweDAzKSA8PCAxNCkpOworCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX1ksIGRhdGFbNl0gfCAoZGF0YVs1XSA8PCA3KSB8ICgoZGF0YVs0XSAmIDB4MDMpIDw8IDE0KSk7CisJCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfUFJFU1NVUkUsIHByZXNzdXJlKTsKKworCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX1RPVUNILCBkYXRhWzRdICYgMHgwOCk7CisJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fU1RZTFVTLCBkYXRhWzRdICYgMHgxMCk7CisJCS8qIE9ubHkgYWxsb3cgdGhlIHN0eWx1czIgYnV0dG9uIHRvIGJlIHJlcG9ydGVkIGZvciB0aGUgcGVuIHRvb2wuICovCisJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fU1RZTFVTMiwgKHdhY29tLT50b29sWzFdID09IEJUTl9UT09MX1BFTikgJiYgKGRhdGFbNF0gJiAweDIwKSk7CisJfSBlbHNlIHsKKwkJLyogcmVwb3J0IHByb3hpbWl0eS1vdXQgb2YgYSAodmFsaWQpIHRvb2wgKi8KKwkJaWYgKHdhY29tLT50b29sWzFdICE9IEJUTl9UT09MX1JVQkJFUikgeworCQkJLyogVW5rbm93biB0b29sIHNlbGVjdGVkIGRlZmF1bHQgdG8gcGVuIHRvb2wgKi8KKwkJCXdhY29tLT50b29sWzFdID0gQlROX1RPT0xfUEVOOworCQl9CisJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCB3YWNvbS0+dG9vbFsxXSwgcHJveCk7CisJfQorCisJd2Fjb20tPnRvb2xbMF0gPSBwcm94OyAvKiBTYXZlIHByb3hpbWl0eSBzdGF0ZSAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHdhY29tX3B0dV9pcnEoc3RydWN0IHdhY29tX3dhYyAqd2Fjb20sIHZvaWQgKndjb21ibykKK3sKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gd2Fjb20tPmRhdGE7CisJaW50IGlkOworCisJaWYgKGRhdGFbMF0gIT0gMikgeworCQlwcmludGsoS0VSTl9JTkZPICJ3YWNvbV9wdHVfaXJxOiByZWNlaXZlZCB1bmtub3duIHJlcG9ydCAjJWRcbiIsIGRhdGFbMF0pOworCQlyZXR1cm4gMDsKKwl9CisKKwl3YWNvbV9pbnB1dF9yZWdzKHdjb21ibyk7CisJaWYgKGRhdGFbMV0gJiAweDA0KSB7CisJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fVE9PTF9SVUJCRVIsIGRhdGFbMV0gJiAweDIwKTsKKwkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9UT1VDSCwgZGF0YVsxXSAmIDB4MDgpOworCQlpZCA9IEVSQVNFUl9ERVZJQ0VfSUQ7CisJfSBlbHNlIHsKKwkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9UT09MX1BFTiwgZGF0YVsxXSAmIDB4MjApOworCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX1RPVUNILCBkYXRhWzFdICYgMHgwMSk7CisJCWlkID0gU1RZTFVTX0RFVklDRV9JRDsKKwl9CisJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19NSVNDLCBpZCk7IC8qIHJlcG9ydCB0b29sIGlkICovCisJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19YLCB3YWNvbV9sZTE2X3RvX2NwdSgmZGF0YVsyXSkpOworCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfWSwgd2Fjb21fbGUxNl90b19jcHUoJmRhdGFbNF0pKTsKKwl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX1BSRVNTVVJFLCB3YWNvbV9sZTE2X3RvX2NwdSgmZGF0YVs2XSkpOworCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fU1RZTFVTLCBkYXRhWzFdICYgMHgwMik7CisJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9TVFlMVVMyLCBkYXRhWzFdICYgMHgxMCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgd2Fjb21fZ3JhcGhpcmVfaXJxKHN0cnVjdCB3YWNvbV93YWMgKndhY29tLCB2b2lkICp3Y29tYm8pCit7CisJdW5zaWduZWQgY2hhciAqZGF0YSA9IHdhY29tLT5kYXRhOworCWludCB4LCB5LCBpZCwgcnc7CisKKwlpZiAoZGF0YVswXSAhPSAyKSB7CisJCWRiZygid2Fjb21fZ3JhcGhpcmVfaXJxOiByZWNlaXZlZCB1bmtub3duIHJlcG9ydCAjJWQiLCBkYXRhWzBdKTsKKwkJcmV0dXJuIDA7CisJfQorCisJd2Fjb21faW5wdXRfcmVncyh3Y29tYm8pOworCisJaWQgPSBTVFlMVVNfREVWSUNFX0lEOworCWlmIChkYXRhWzFdICYgMHgxMCkgeyAvKiBpbiBwcm94ICovCisKKwkJc3dpdGNoICgoZGF0YVsxXSA+PiA1KSAmIDMpIHsKKworCQkJY2FzZSAwOgkvKiBQZW4gKi8KKwkJCQl3YWNvbS0+dG9vbFswXSA9IEJUTl9UT09MX1BFTjsKKwkJCQlicmVhazsKKworCQkJY2FzZSAxOiAvKiBSdWJiZXIgKi8KKwkJCQl3YWNvbS0+dG9vbFswXSA9IEJUTl9UT09MX1JVQkJFUjsKKwkJCQlpZCA9IEVSQVNFUl9ERVZJQ0VfSUQ7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjogLyogTW91c2Ugd2l0aCB3aGVlbCAqLworCQkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fTUlERExFLCBkYXRhWzFdICYgMHgwNCk7CisJCQkJaWYgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBXQUNPTV9HNCkgeworCQkJCQlydyA9IGRhdGFbN10gJiAweDA0ID8gKGRhdGFbN10gJiAweDAzKS00IDogKGRhdGFbN10gJiAweDAzKTsKKwkJCQkJd2Fjb21fcmVwb3J0X3JlbCh3Y29tYm8sIFJFTF9XSEVFTCwgLXJ3KTsKKwkJCQl9IGVsc2UKKwkJCQkJd2Fjb21fcmVwb3J0X3JlbCh3Y29tYm8sIFJFTF9XSEVFTCwgLShzaWduZWQgY2hhcikgZGF0YVs2XSk7CisJCQkJLyogZmFsbCB0aHJvdWdoICovCisKKwkJCWNhc2UgMzogLyogTW91c2Ugd2l0aG91dCB3aGVlbCAqLworCQkJCXdhY29tLT50b29sWzBdID0gQlROX1RPT0xfTU9VU0U7CisJCQkJaWQgPSBDVVJTT1JfREVWSUNFX0lEOworCQkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fTEVGVCwgZGF0YVsxXSAmIDB4MDEpOworCQkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fUklHSFQsIGRhdGFbMV0gJiAweDAyKTsKKwkJCQlpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IFdBQ09NX0c0KQorCQkJCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX0RJU1RBTkNFLCBkYXRhWzZdKTsKKwkJCQllbHNlCisJCQkJCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfRElTVEFOQ0UsIGRhdGFbN10pOworCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGRhdGFbMV0gJiAweDkwKSB7CisJCXggPSB3YWNvbV9sZTE2X3RvX2NwdSgmZGF0YVsyXSk7CisJCXkgPSB3YWNvbV9sZTE2X3RvX2NwdSgmZGF0YVs0XSk7CisJCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfWCwgeCk7CisJCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfWSwgeSk7CisJCWlmICh3YWNvbS0+dG9vbFswXSAhPSBCVE5fVE9PTF9NT1VTRSkgeworCQkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19QUkVTU1VSRSwgZGF0YVs2XSB8ICgoZGF0YVs3XSAmIDB4MDEpIDw8IDgpKTsKKwkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fVE9VQ0gsIGRhdGFbMV0gJiAweDAxKTsKKwkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fU1RZTFVTLCBkYXRhWzFdICYgMHgwMik7CisJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX1NUWUxVUzIsIGRhdGFbMV0gJiAweDA0KTsKKwkJfQorCX0KKworCWlmIChkYXRhWzFdICYgMHgxMCkKKwkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19NSVNDLCBpZCk7IC8qIHJlcG9ydCB0b29sIGlkICovCisJZWxzZQorCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX01JU0MsIDApOyAvKiByZXNldCB0b29sIGlkICovCisJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIHdhY29tLT50b29sWzBdLCBkYXRhWzFdICYgMHgxMCk7CisJd2Fjb21faW5wdXRfc3luYyh3Y29tYm8pOworCisJLyogc2VuZCBwYWQgZGF0YSAqLworCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPT0gV0FDT01fRzQpIHsKKwkJaWYgKCAod2Fjb20tPnNlcmlhbFsxXSAmIDB4YzApICE9IChkYXRhWzddICYgMHhmOCkgKSB7CisJCQl3YWNvbS0+aWRbMV0gPSAxOworCQkJd2Fjb20tPnNlcmlhbFsxXSA9IChkYXRhWzddICYgMHhmOCk7CisJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROXzAsIChkYXRhWzddICYgMHg0MCkpOworCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl80LCAoZGF0YVs3XSAmIDB4ODApKTsKKwkJCXJ3ID0gKChkYXRhWzddICYgMHgxOCkgPj4gMykgLSAoKGRhdGFbN10gJiAweDIwKSA+PiAzKTsKKwkJCXdhY29tX3JlcG9ydF9yZWwod2NvbWJvLCBSRUxfV0hFRUwsIHJ3KTsKKwkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fVE9PTF9GSU5HRVIsIDB4ZjApOworCQkJd2Fjb21faW5wdXRfZXZlbnQod2NvbWJvLCBFVl9NU0MsIE1TQ19TRVJJQUwsIDB4ZjApOworCQl9IGVsc2UgaWYgKHdhY29tLT5pZFsxXSkgeworCQkJd2Fjb20tPmlkWzFdID0gMDsKKwkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fVE9PTF9GSU5HRVIsIDApOworCQkJd2Fjb21faW5wdXRfZXZlbnQod2NvbWJvLCBFVl9NU0MsIE1TQ19TRVJJQUwsIDB4ZjApOworCQl9CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHdhY29tX2ludHVvc19pbm91dChzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbSwgdm9pZCAqd2NvbWJvKQoreworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB3YWNvbS0+ZGF0YTsKKwlpbnQgaWR4OworCisJLyogdG9vbCBudW1iZXIgKi8KKwlpZHggPSBkYXRhWzFdICYgMHgwMTsKKworCS8qIEVudGVyIHJlcG9ydCAqLworCWlmICgoZGF0YVsxXSAmIDB4ZmMpID09IDB4YzApIHsKKwkJLyogc2VyaWFsIG51bWJlciBvZiB0aGUgdG9vbCAqLworCQl3YWNvbS0+c2VyaWFsW2lkeF0gPSAoKGRhdGFbM10gJiAweDBmKSA8PCAyOCkgKworCQkJKGRhdGFbNF0gPDwgMjApICsgKGRhdGFbNV0gPDwgMTIpICsKKwkJCShkYXRhWzZdIDw8IDQpICsgKGRhdGFbN10gPj4gNCk7CisKKwkJd2Fjb20tPmlkW2lkeF0gPSAoZGF0YVsyXSA8PCA0KSB8IChkYXRhWzNdID4+IDQpOworCQlzd2l0Y2ggKHdhY29tLT5pZFtpZHhdKSB7CisJCQljYXNlIDB4ODEyOiAvKiBJbmtpbmcgcGVuICovCisJCQljYXNlIDB4ODAxOiAvKiBJbnR1b3MzIElua2luZyBwZW4gKi8KKwkJCWNhc2UgMHgwMTI6CisJCQkJd2Fjb20tPnRvb2xbaWR4XSA9IEJUTl9UT09MX1BFTkNJTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHg4MjI6IC8qIFBlbiAqLworCQkJY2FzZSAweDg0MjoKKwkJCWNhc2UgMHg4NTI6CisJCQljYXNlIDB4ODIzOiAvKiBJbnR1b3MzIEdyaXAgUGVuICovCisJCQljYXNlIDB4ODEzOiAvKiBJbnR1b3MzIENsYXNzaWMgUGVuICovCisJCQljYXNlIDB4ODg1OiAvKiBJbnR1b3MzIE1hcmtlciBQZW4gKi8KKwkJCWNhc2UgMHgwMjI6CisJCQkJd2Fjb20tPnRvb2xbaWR4XSA9IEJUTl9UT09MX1BFTjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHg4MzI6IC8qIFN0cm9rZSBwZW4gKi8KKwkJCWNhc2UgMHgwMzI6CisJCQkJd2Fjb20tPnRvb2xbaWR4XSA9IEJUTl9UT09MX0JSVVNIOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAwNzogLyogTW91c2UgNEQgYW5kIDJEICovCisJCSAgICAgICAgY2FzZSAweDA5YzoKKwkJCWNhc2UgMHgwOTQ6CisJCQljYXNlIDB4MDE3OiAvKiBJbnR1b3MzIDJEIE1vdXNlICovCisJCQkJd2Fjb20tPnRvb2xbaWR4XSA9IEJUTl9UT09MX01PVVNFOworCQkJCWJyZWFrOworCQkJY2FzZSAweDA5NjogLyogTGVucyBjdXJzb3IgKi8KKwkJCWNhc2UgMHgwOTc6IC8qIEludHVvczMgTGVucyBjdXJzb3IgKi8KKwkJCQl3YWNvbS0+dG9vbFtpZHhdID0gQlROX1RPT0xfTEVOUzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHg4MmE6IC8qIEVyYXNlciAqLworCQkJY2FzZSAweDg1YToKKwkJICAgICAgICBjYXNlIDB4OTFhOgorCQkJY2FzZSAweGQxYToKKwkJCWNhc2UgMHgwZmE6CisJCQljYXNlIDB4ODJiOiAvKiBJbnR1b3MzIEdyaXAgUGVuIEVyYXNlciAqLworCQkJY2FzZSAweDgxYjogLyogSW50dW9zMyBDbGFzc2ljIFBlbiBFcmFzZXIgKi8KKwkJCWNhc2UgMHg5MWI6IC8qIEludHVvczMgQWlyYnJ1c2ggRXJhc2VyICovCisJCQkJd2Fjb20tPnRvb2xbaWR4XSA9IEJUTl9UT09MX1JVQkJFUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHhkMTI6CisJCQljYXNlIDB4OTEyOgorCQkJY2FzZSAweDExMjoKKwkJCWNhc2UgMHg5MTM6IC8qIEludHVvczMgQWlyYnJ1c2ggKi8KKwkJCQl3YWNvbS0+dG9vbFtpZHhdID0gQlROX1RPT0xfQUlSQlJVU0g7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OiAvKiBVbmtub3duIHRvb2wgKi8KKwkJCQl3YWNvbS0+dG9vbFtpZHhdID0gQlROX1RPT0xfUEVOOworCQl9CisJCS8qIG9ubHkgbGFyZ2UgSTMgc3VwcG9ydCBMZW5zIEN1cnNvciAqLworCQlpZighKCh3YWNvbS0+dG9vbFtpZHhdID09IEJUTl9UT09MX0xFTlMpICYmCisJCQkJKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBJTlRVT1MzKSkpIHsKKwkJCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfTUlTQywgd2Fjb20tPmlkW2lkeF0pOyAvKiByZXBvcnQgdG9vbCBpZCAqLworCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIHdhY29tLT50b29sW2lkeF0sIDEpOworCQkJd2Fjb21faW5wdXRfZXZlbnQod2NvbWJvLCBFVl9NU0MsIE1TQ19TRVJJQUwsIHdhY29tLT5zZXJpYWxbaWR4XSk7CisJCQlyZXR1cm4gMjsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBFeGl0IHJlcG9ydCAqLworCWlmICgoZGF0YVsxXSAmIDB4ZmUpID09IDB4ODApIHsKKwkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIHdhY29tLT50b29sW2lkeF0sIDApOworCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX01JU0MsIDApOyAvKiByZXNldCB0b29sIGlkICovCisJCXdhY29tX2lucHV0X2V2ZW50KHdjb21ibywgRVZfTVNDLCBNU0NfU0VSSUFMLCB3YWNvbS0+c2VyaWFsW2lkeF0pOworCQlyZXR1cm4gMjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHdhY29tX2ludHVvc19nZW5lcmFsKHN0cnVjdCB3YWNvbV93YWMgKndhY29tLCB2b2lkICp3Y29tYm8pCit7CisJdW5zaWduZWQgY2hhciAqZGF0YSA9IHdhY29tLT5kYXRhOworCXVuc2lnbmVkIGludCB0OworCisJLyogZ2VuZXJhbCBwZW4gcGFja2V0ICovCisJaWYgKChkYXRhWzFdICYgMHhiOCkgPT0gMHhhMCkgeworCQl0ID0gKGRhdGFbNl0gPDwgMikgfCAoKGRhdGFbN10gPj4gNikgJiAzKTsKKwkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19QUkVTU1VSRSwgdCk7CisJCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfVElMVF9YLAorCQkJCSgoZGF0YVs3XSA8PCAxKSAmIDB4N2UpIHwgKGRhdGFbOF0gPj4gNykpOworCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX1RJTFRfWSwgZGF0YVs4XSAmIDB4N2YpOworCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX1NUWUxVUywgZGF0YVsxXSAmIDIpOworCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX1NUWUxVUzIsIGRhdGFbMV0gJiA0KTsKKwkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9UT1VDSCwgdCA+IDEwKTsKKwl9CisKKwkvKiBhaXJicnVzaCBzZWNvbmQgcGFja2V0ICovCisJaWYgKChkYXRhWzFdICYgMHhiYykgPT0gMHhiNCkgeworCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX1dIRUVMLAorCQkJCShkYXRhWzZdIDw8IDIpIHwgKChkYXRhWzddID4+IDYpICYgMykpOworCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX1RJTFRfWCwKKwkJCQkoKGRhdGFbN10gPDwgMSkgJiAweDdlKSB8IChkYXRhWzhdID4+IDcpKTsKKwkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19USUxUX1ksIGRhdGFbOF0gJiAweDdmKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHdhY29tX2ludHVvc19pcnEoc3RydWN0IHdhY29tX3dhYyAqd2Fjb20sIHZvaWQgKndjb21ibykKK3sKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gd2Fjb20tPmRhdGE7CisJdW5zaWduZWQgaW50IHQ7CisJaW50IGlkeCwgcmVzdWx0OworCisJaWYgKGRhdGFbMF0gIT0gMiAmJiBkYXRhWzBdICE9IDUgJiYgZGF0YVswXSAhPSA2ICYmIGRhdGFbMF0gIT0gMTIpIHsKKwkJZGJnKCJ3YWNvbV9pbnR1b3NfaXJxOiByZWNlaXZlZCB1bmtub3duIHJlcG9ydCAjJWQiLCBkYXRhWzBdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwl9CisKKwl3YWNvbV9pbnB1dF9yZWdzKHdjb21ibyk7CisKKwkvKiB0b29sIG51bWJlciAqLworCWlkeCA9IGRhdGFbMV0gJiAweDAxOworCisJLyogcGFkIHBhY2tldHMuIFdvcmtzIGFzIGEgc2Vjb25kIHRvb2wgYW5kIGlzIGFsd2F5cyBpbiBwcm94ICovCisJaWYgKGRhdGFbMF0gPT0gMTIpIHsKKwkJLyogaW5pdGlhdGUgdGhlIHBhZCBhcyBhIGRldmljZSAqLworCQlpZiAod2Fjb20tPnRvb2xbMV0gIT0gQlROX1RPT0xfRklOR0VSKQorCQkJd2Fjb20tPnRvb2xbMV0gPSBCVE5fVE9PTF9GSU5HRVI7CisKKwkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl8wLCAoZGF0YVs1XSAmIDB4MDEpKTsKKwkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl8xLCAoZGF0YVs1XSAmIDB4MDIpKTsKKwkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl8yLCAoZGF0YVs1XSAmIDB4MDQpKTsKKwkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl8zLCAoZGF0YVs1XSAmIDB4MDgpKTsKKwkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl80LCAoZGF0YVs2XSAmIDB4MDEpKTsKKwkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl81LCAoZGF0YVs2XSAmIDB4MDIpKTsKKwkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl82LCAoZGF0YVs2XSAmIDB4MDQpKTsKKwkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl83LCAoZGF0YVs2XSAmIDB4MDgpKTsKKwkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19SWCwgKChkYXRhWzFdICYgMHgxZikgPDwgOCkgfCBkYXRhWzJdKTsKKwkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19SWSwgKChkYXRhWzNdICYgMHgxZikgPDwgOCkgfCBkYXRhWzRdKTsKKworCQlpZigoZGF0YVs1XSAmIDB4MGYpIHwgKGRhdGFbNl0gJiAweDBmKSB8IChkYXRhWzFdICYgMHgxZikgfCBkYXRhWzJdKQorCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIHdhY29tLT50b29sWzFdLCAxKTsKKwkJZWxzZQorCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIHdhY29tLT50b29sWzFdLCAwKTsKKwkJd2Fjb21faW5wdXRfZXZlbnQod2NvbWJvLCBFVl9NU0MsIE1TQ19TRVJJQUwsIDB4ZmZmZmZmZmYpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworCX0KKworCS8qIHByb2Nlc3MgaW4vb3V0IHByb3ggZXZlbnRzICovCisJcmVzdWx0ID0gd2Fjb21faW50dW9zX2lub3V0KHdhY29tLCB3Y29tYm8pOworCWlmIChyZXN1bHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC0xOworCisJLyogQ2ludGlxIGRvZXNuJ3Qgc2VuZCBkYXRhIHdoZW4gUkRZIGJpdCBpc24ndCBzZXQgKi8KKwlpZiAoKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA9PSBDSU5USVEpICYmICEoZGF0YVsxXSAmIDB4NDApKQorICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworCWlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPj0gSU5UVU9TMykgeworCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX1gsIChkYXRhWzJdIDw8IDkpIHwgKGRhdGFbM10gPDwgMSkgfCAoKGRhdGFbOV0gPj4gMSkgJiAxKSk7CisJCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfWSwgKGRhdGFbNF0gPDwgOSkgfCAoZGF0YVs1XSA8PCAxKSB8IChkYXRhWzldICYgMSkpOworCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX0RJU1RBTkNFLCAoKGRhdGFbOV0gPj4gMikgJiAweDNmKSk7CisJfSBlbHNlIHsKKwkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19YLCB3YWNvbV9iZTE2X3RvX2NwdSgmZGF0YVsyXSkpOworCQl3YWNvbV9yZXBvcnRfYWJzKHdjb21ibywgQUJTX1ksIHdhY29tX2JlMTZfdG9fY3B1KCZkYXRhWzRdKSk7CisJCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfRElTVEFOQ0UsICgoZGF0YVs5XSA+PiAzKSAmIDB4MWYpKTsKKwl9CisKKwkvKiBwcm9jZXNzIGdlbmVyYWwgcGFja2V0cyAqLworCXdhY29tX2ludHVvc19nZW5lcmFsKHdhY29tLCB3Y29tYm8pOworCisJLyogNEQgbW91c2UsIDJEIG1vdXNlLCBtYXJrZXIgcGVuIHJvdGF0aW9uLCBvciBMZW5zIGN1cnNvciBwYWNrZXRzICovCisJaWYgKChkYXRhWzFdICYgMHhiYykgPT0gMHhhOCB8fCAoZGF0YVsxXSAmIDB4YmUpID09IDB4YjApIHsKKworCQlpZiAoZGF0YVsxXSAmIDB4MDIpIHsKKwkJCS8qIFJvdGF0aW9uIHBhY2tldCAqLworCQkJaWYgKHdhY29tLT5mZWF0dXJlcy0+dHlwZSA+PSBJTlRVT1MzKSB7CisJCQkJLyogSTMgbWFya2VyIHBlbiByb3RhdGlvbiByZXBvcnRlZCBhcyB3aGVlbAorCQkJCSAqIGR1ZSB0byB2YWx1YXRvciBsaW1pdGF0aW9uCisJCQkJICovCisJCQkJdCA9IChkYXRhWzZdIDw8IDMpIHwgKChkYXRhWzddID4+IDUpICYgNyk7CisJCQkJdCA9IChkYXRhWzddICYgMHgyMCkgPyAoKHQgPiA5MDApID8gKCh0LTEpIC8gMiAtIDEzNTApIDoKKwkJCQkJKCh0LTEpIC8gMiArIDQ1MCkpIDogKDQ1MCAtIHQgLyAyKSA7CisJCQkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19XSEVFTCwgdCk7CisJCQl9IGVsc2UgeworCQkJCS8qIDREIG1vdXNlIHJvdGF0aW9uIHBhY2tldCAqLworCQkJCXQgPSAoZGF0YVs2XSA8PCAzKSB8ICgoZGF0YVs3XSA+PiA1KSAmIDcpOworCQkJCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfUlosIChkYXRhWzddICYgMHgyMCkgPworCQkJCQkoKHQgLSAxKSAvIDIpIDogLXQgLyAyKTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKCEoZGF0YVsxXSAmIDB4MTApICYmIHdhY29tLT5mZWF0dXJlcy0+dHlwZSA8IElOVFVPUzMpIHsKKwkJCS8qIDREIG1vdXNlIHBhY2tldCAqLworCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9MRUZULCAgIGRhdGFbOF0gJiAweDAxKTsKKwkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fTUlERExFLCBkYXRhWzhdICYgMHgwMik7CisJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX1JJR0hULCAgZGF0YVs4XSAmIDB4MDQpOworCisJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX1NJREUsICAgZGF0YVs4XSAmIDB4MjApOworCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9FWFRSQSwgIGRhdGFbOF0gJiAweDEwKTsKKwkJCXQgPSAoZGF0YVs2XSA8PCAyKSB8ICgoZGF0YVs3XSA+PiA2KSAmIDMpOworCQkJd2Fjb21fcmVwb3J0X2Ficyh3Y29tYm8sIEFCU19USFJPVFRMRSwgKGRhdGFbOF0gJiAweDA4KSA/IC10IDogdCk7CisKKwkJfSBlbHNlIGlmICh3YWNvbS0+dG9vbFtpZHhdID09IEJUTl9UT09MX01PVVNFKSB7CisJCQkvKiAyRCBtb3VzZSBwYWNrZXQgKi8KKwkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fTEVGVCwgICBkYXRhWzhdICYgMHgwNCk7CisJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX01JRERMRSwgZGF0YVs4XSAmIDB4MDgpOworCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9SSUdIVCwgIGRhdGFbOF0gJiAweDEwKTsKKwkJCXdhY29tX3JlcG9ydF9yZWwod2NvbWJvLCBSRUxfV0hFRUwsIChkYXRhWzhdICYgMHgwMSkKKwkJCQkJCSAtICgoZGF0YVs4XSAmIDB4MDIpID4+IDEpKTsKKworCQkJLyogSTMgMkQgbW91c2Ugc2lkZSBidXR0b25zICovCisJCQlpZiAod2Fjb20tPmZlYXR1cmVzLT50eXBlID09IElOVFVPUzMpIHsKKwkJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX1NJREUsICAgZGF0YVs4XSAmIDB4NDApOworCQkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fRVhUUkEsICBkYXRhWzhdICYgMHgyMCk7CisJCQl9CisKKwkJfSBlbHNlIGlmICh3YWNvbS0+ZmVhdHVyZXMtPnR5cGUgPCBJTlRVT1MzKSB7CisJCQkvKiBMZW5zIGN1cnNvciBwYWNrZXRzICovCisJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX0xFRlQsICAgZGF0YVs4XSAmIDB4MDEpOworCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9NSURETEUsIGRhdGFbOF0gJiAweDAyKTsKKwkJCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCBCVE5fUklHSFQsICBkYXRhWzhdICYgMHgwNCk7CisJCQl3YWNvbV9yZXBvcnRfa2V5KHdjb21ibywgQlROX1NJREUsICAgZGF0YVs4XSAmIDB4MTApOworCQkJd2Fjb21fcmVwb3J0X2tleSh3Y29tYm8sIEJUTl9FWFRSQSwgIGRhdGFbOF0gJiAweDA4KTsKKwkJfQorCX0KKworCXdhY29tX3JlcG9ydF9hYnMod2NvbWJvLCBBQlNfTUlTQywgd2Fjb20tPmlkW2lkeF0pOyAvKiByZXBvcnQgdG9vbCBpZCAqLworCXdhY29tX3JlcG9ydF9rZXkod2NvbWJvLCB3YWNvbS0+dG9vbFtpZHhdLCAxKTsKKwl3YWNvbV9pbnB1dF9ldmVudCh3Y29tYm8sIEVWX01TQywgTVNDX1NFUklBTCwgd2Fjb20tPnNlcmlhbFtpZHhdKTsKKwlyZXR1cm4gMTsKK30KKworaW50IHdhY29tX3dhY19pcnEoc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjLCB2b2lkICp3Y29tYm8pCit7CisJc3dpdGNoICh3YWNvbV93YWMtPmZlYXR1cmVzLT50eXBlKSB7CisJCWNhc2UgUEVOUEFSVE5FUjoKKwkJCXJldHVybiAod2Fjb21fcGVucGFydG5lcl9pcnEod2Fjb21fd2FjLCB3Y29tYm8pKTsKKwkJCWJyZWFrOworCQljYXNlIFBMOgorCQkJcmV0dXJuICh3YWNvbV9wbF9pcnEod2Fjb21fd2FjLCB3Y29tYm8pKTsKKwkJCWJyZWFrOworCQljYXNlIFdBQ09NX0c0OgorCQljYXNlIEdSQVBISVJFOgorCQkJcmV0dXJuICh3YWNvbV9ncmFwaGlyZV9pcnEod2Fjb21fd2FjLCB3Y29tYm8pKTsKKwkJCWJyZWFrOworCQljYXNlIFBUVToKKwkJCXJldHVybiAod2Fjb21fcHR1X2lycSh3YWNvbV93YWMsIHdjb21ibykpOworCQkJYnJlYWs7CisJCWNhc2UgSU5UVU9TOgorCQljYXNlIElOVFVPUzM6CisJCWNhc2UgSU5UVU9TM0w6CisJCWNhc2UgQ0lOVElROgorCQkJcmV0dXJuICh3YWNvbV9pbnR1b3NfaXJxKHdhY29tX3dhYywgd2NvbWJvKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCB3YWNvbV9pbml0X2lucHV0X2RldihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYsIHN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYykKK3sKKwlzd2l0Y2ggKHdhY29tX3dhYy0+ZmVhdHVyZXMtPnR5cGUpIHsKKwkJY2FzZSBXQUNPTV9HNDoKKwkJCWlucHV0X2Rldl9nNChpbnB1dF9kZXYsIHdhY29tX3dhYyk7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJY2FzZSBHUkFQSElSRToKKwkJCWlucHV0X2Rldl9nKGlucHV0X2Rldiwgd2Fjb21fd2FjKTsKKwkJCWJyZWFrOworCQljYXNlIElOVFVPUzM6CisJCWNhc2UgSU5UVU9TM0w6CisJCWNhc2UgQ0lOVElROgorCQkJaW5wdXRfZGV2X2kzKGlucHV0X2Rldiwgd2Fjb21fd2FjKTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIElOVFVPUzoKKwkJCWlucHV0X2Rldl9pKGlucHV0X2Rldiwgd2Fjb21fd2FjKTsKKwkJCWJyZWFrOworCQljYXNlIFBMOgorCQljYXNlIFBUVToKKwkJCWlucHV0X2Rldl9wbChpbnB1dF9kZXYsIHdhY29tX3dhYyk7CisJCQlicmVhazsKKwkJY2FzZSBQRU5QQVJUTkVSOgorCQkJaW5wdXRfZGV2X3B0KGlucHV0X2Rldiwgd2Fjb21fd2FjKTsKKwkJCWJyZWFrOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgd2Fjb21fZmVhdHVyZXNbXSA9IHsKKwl7ICJXYWNvbSBQZW5wYXJ0bmVyIiwgICAgNywgICA1MDQwLCAgMzc4MCwgIDI1NSwgMzIsIFBFTlBBUlRORVIsCXdhY29tX3N5c19pcnEgfSwKKyAgICAgICAgeyAiV2Fjb20gR3JhcGhpcmUiLCAgICAgIDgsICAxMDIwNiwgIDc0MjIsICA1MTEsIDMyLCBHUkFQSElSRSwJd2Fjb21fc3lzX2lycSB9LAorCXsgIldhY29tIEdyYXBoaXJlMiA0eDUiLCA4LCAgMTAyMDYsICA3NDIyLCAgNTExLCAzMiwgR1JBUEhJUkUsCXdhY29tX3N5c19pcnEgfSwKKwl7ICJXYWNvbSBHcmFwaGlyZTIgNXg3IiwgOCwgIDEzOTE4LCAxMDIwNiwgIDUxMSwgMzIsIEdSQVBISVJFLAl3YWNvbV9zeXNfaXJxIH0sCisJeyAiV2Fjb20gR3JhcGhpcmUzIiwgICAgIDgsICAxMDIwOCwgIDc0MjQsICA1MTEsIDMyLCBHUkFQSElSRSwJd2Fjb21fc3lzX2lycSB9LAorCXsgIldhY29tIEdyYXBoaXJlMyA2eDgiLCA4LCAgMTY3MDQsIDEyMDY0LCAgNTExLCAzMiwgR1JBUEhJUkUsCXdhY29tX3N5c19pcnEgfSwKKwl7ICJXYWNvbSBHcmFwaGlyZTQgNHg1IiwgOCwgIDEwMjA4LCAgNzQyNCwgIDUxMSwgMzIsIFdBQ09NX0c0LAl3YWNvbV9zeXNfaXJxIH0sCisJeyAiV2Fjb20gR3JhcGhpcmU0IDZ4OCIsIDgsICAxNjcwNCwgMTIwNjQsICA1MTEsIDMyLCBXQUNPTV9HNCwJd2Fjb21fc3lzX2lycSB9LAorCXsgIldhY29tIFZvbGl0byIsICAgICAgICA4LCAgIDUxMDQsICAzNzEyLCAgNTExLCAzMiwgR1JBUEhJUkUsCXdhY29tX3N5c19pcnEgfSwKKwl7ICJXYWNvbSBQZW5TdGF0aW9uMiIsICAgOCwgICAzMjUwLCAgMjMyMCwgIDI1NSwgMzIsIEdSQVBISVJFLAl3YWNvbV9zeXNfaXJxIH0sCisJeyAiV2Fjb20gVm9saXRvMiA0eDUiLCAgIDgsICAgNTEwNCwgIDM3MTIsICA1MTEsIDMyLCBHUkFQSElSRSwJd2Fjb21fc3lzX2lycSB9LAorCXsgIldhY29tIFZvbGl0bzIgMngzIiwgICA4LCAgIDMyNDgsICAyMzIwLCAgNTExLCAzMiwgR1JBUEhJUkUsCXdhY29tX3N5c19pcnEgfSwKKwl7ICJXYWNvbSBQZW5QYXJ0bmVyMiIsICAgOCwgICAzMjUwLCAgMjMyMCwgIDI1NSwgMzIsIEdSQVBISVJFLAl3YWNvbV9zeXNfaXJxIH0sCisJeyAiV2Fjb20gSW50dW9zIDR4NSIsICAgMTAsICAxMjcwMCwgMTA2MDAsIDEwMjMsIDE1LCBJTlRVT1MsCXdhY29tX3N5c19pcnF9LAorCXsgIldhY29tIEludHVvcyA2eDgiLCAgIDEwLCAgMjAzMjAsIDE2MjQwLCAxMDIzLCAxNSwgSU5UVU9TLAl3YWNvbV9zeXNfaXJxIH0sCisJeyAiV2Fjb20gSW50dW9zIDl4MTIiLCAgMTAsICAzMDQ4MCwgMjQwNjAsIDEwMjMsIDE1LCBJTlRVT1MsCXdhY29tX3N5c19pcnEgfSwKKwl7ICJXYWNvbSBJbnR1b3MgMTJ4MTIiLCAxMCwgIDMwNDgwLCAzMTY4MCwgMTAyMywgMTUsIElOVFVPUywJd2Fjb21fc3lzX2lycSB9LAorCXsgIldhY29tIEludHVvcyAxMngxOCIsIDEwLCAgNDU3MjAsIDMxNjgwLCAxMDIzLCAxNSwgSU5UVU9TLAl3YWNvbV9zeXNfaXJxfSwKKwl7ICJXYWNvbSBQTDQwMCIsICAgICAgICAgOCwgICA1NDA4LCAgNDA1NiwgIDI1NSwgMzIsIFBMLAl3YWNvbV9zeXNfaXJxIH0sCisJeyAiV2Fjb20gUEw1MDAiLCAgICAgICAgIDgsICAgNjE0NCwgIDQ2MDgsICAyNTUsIDMyLCBQTCwJd2Fjb21fc3lzX2lycSB9LAorCXsgIldhY29tIFBMNjAwIiwgICAgICAgICA4LCAgIDYxMjYsICA0NjA0LCAgMjU1LCAzMiwgUEwsCXdhY29tX3N5c19pcnEgfSwKKwl7ICJXYWNvbSBQTDYwMFNYIiwgICAgICAgOCwgICA2MjYwLCAgNTAxNiwgIDI1NSwgMzIsIFBMLAl3YWNvbV9zeXNfaXJxIH0sCisJeyAiV2Fjb20gUEw1NTAiLCAgICAgICAgIDgsICAgNjE0NCwgIDQ2MDgsICA1MTEsIDMyLCBQTCwJd2Fjb21fc3lzX2lycSB9LAorCXsgIldhY29tIFBMODAwIiwgICAgICAgICA4LCAgIDcyMjAsICA1NzgwLCAgNTExLCAzMiwgUEwsCXdhY29tX3N5c19pcnEgfSwKKwl7ICJXYWNvbSBQTDcwMCIsICAgICAgICAgOCwgICA2NzU4LCAgNTQwNiwgIDUxMSwgMzIsIFBMLAl3YWNvbV9zeXNfaXJxIH0sCisJeyAiV2Fjb20gUEw1MTAiLCAgICAgICAgIDgsICAgNjI4MiwgIDQ3NjIsICA1MTEsIDMyLCBQTCwJd2Fjb21fc3lzX2lycSB9LAorCXsgIldhY29tIERUVTcxMCIsICAgICAgICA4LCAgMzQwODAsIDI3NjYwLCAgNTExLCAzMiwgUEwsCXdhY29tX3N5c19pcnEgfSwKKwl7ICJXYWNvbSBEVEY1MjEiLCAgICAgICAgOCwgICA2MjgyLCAgNDc2MiwgIDUxMSwgMzIsIFBMLAl3YWNvbV9zeXNfaXJxIH0sCisJeyAiV2Fjb20gRFRGNzIwIiwgICAgICAgIDgsICAgNjg1OCwgIDU1MDYsICA1MTEsIDMyLCBQTCwJd2Fjb21fc3lzX2lycSB9LAorCXsgIldhY29tIENpbnRpcSBQYXJ0bmVyIiw4LCAgMjA0ODAsIDE1MzYwLCAgNTExLCAzMiwgUFRVLAl3YWNvbV9zeXNfaXJxIH0sCisJeyAiV2Fjb20gSW50dW9zMiA0eDUiLCAgIDEwLCAxMjcwMCwgMTA2MDAsIDEwMjMsIDE1LCBJTlRVT1MsCXdhY29tX3N5c19pcnEgfSwKKwl7ICJXYWNvbSBJbnR1b3MyIDZ4OCIsICAgMTAsIDIwMzIwLCAxNjI0MCwgMTAyMywgMTUsIElOVFVPUywJd2Fjb21fc3lzX2lycSB9LAorCXsgIldhY29tIEludHVvczIgOXgxMiIsICAxMCwgMzA0ODAsIDI0MDYwLCAxMDIzLCAxNSwgSU5UVU9TLAl3YWNvbV9zeXNfaXJxIH0sCisJeyAiV2Fjb20gSW50dW9zMiAxMngxMiIsIDEwLCAzMDQ4MCwgMzE2ODAsIDEwMjMsIDE1LCBJTlRVT1MsCXdhY29tX3N5c19pcnEgfSwKKwl7ICJXYWNvbSBJbnR1b3MyIDEyeDE4IiwgMTAsIDQ1NzIwLCAzMTY4MCwgMTAyMywgMTUsIElOVFVPUywJd2Fjb21fc3lzX2lycSB9LAorCXsgIldhY29tIEludHVvczMgNHg1IiwgICAxMCwgMjU0MDAsIDIwMzIwLCAxMDIzLCAxNSwgSU5UVU9TMywJd2Fjb21fc3lzX2lycSB9LAorCXsgIldhY29tIEludHVvczMgNng4IiwgICAxMCwgNDA2NDAsIDMwNDgwLCAxMDIzLCAxNSwgSU5UVU9TMywJd2Fjb21fc3lzX2lycSB9LAorCXsgIldhY29tIEludHVvczMgOXgxMiIsICAxMCwgNjA5NjAsIDQ1NzIwLCAxMDIzLCAxNSwgSU5UVU9TMywJd2Fjb21fc3lzX2lycSB9LAorCXsgIldhY29tIEludHVvczMgMTJ4MTIiLCAxMCwgNjA5NjAsIDYwOTYwLCAxMDIzLCAxNSwgSU5UVU9TM0wsCXdhY29tX3N5c19pcnEgfSwKKwl7ICJXYWNvbSBJbnR1b3MzIDEyeDE5IiwgMTAsIDk3NTM2LCA2MDk2MCwgMTAyMywgMTUsIElOVFVPUzNMLAl3YWNvbV9zeXNfaXJxIH0sCisJeyAiV2Fjb20gSW50dW9zMyA2eDExIiwgIDEwLCA1NDIwNCwgMzE3NTAsIDEwMjMsIDE1LCBJTlRVT1MzLAl3YWNvbV9zeXNfaXJxIH0sCisJeyAiV2Fjb20gQ2ludGlxIDIxVVgiLCAgIDEwLCA4NzIwMCwgNjU2MDAsIDEwMjMsIDE1LCBDSU5USVEsCXdhY29tX3N5c19pcnEgfSwKKwl7ICJXYWNvbSBJbnR1b3MyIDZ4OCIsICAgMTAsIDIwMzIwLCAxNjI0MCwgMTAyMywgMTUsIElOVFVPUywJd2Fjb21fc3lzX2lycSB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHdhY29tX2lkc1tdID0geworCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDAwKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDEwKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDExKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDEyKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDEzKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDE0KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDE1KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDE2KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDYwKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDYxKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDYyKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDYzKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDY0KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDIwKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDIxKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDIyKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDIzKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDI0KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDMwKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDMxKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDMyKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDMzKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDM0KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDM1KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDM3KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDM4KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDM5KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweEMwKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweEM0KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDAzKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDQxKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDQyKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDQzKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDQ0KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDQ1KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweEIwKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweEIxKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweEIyKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweEIzKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweEI0KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweEI1KSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDNGKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1dBQ09NLCAweDQ3KSB9LAorCXsgfQorfTsKKworY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKiBnZXRfZGV2aWNlX3RhYmxlKHZvaWQpIHsKKyAgICAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKiBpZF90YWJsZSA9IHdhY29tX2lkczsKKyAgICAgICAgcmV0dXJuIGlkX3RhYmxlOworfQorCitzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgKiBnZXRfd2Fjb21fZmVhdHVyZShjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqIGlkKSB7CisgICAgICAgIGludCBpbmRleCA9IGlkIC0gd2Fjb21faWRzOworICAgICAgICBzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgKndmID0gJndhY29tX2ZlYXR1cmVzW2luZGV4XTsKKyAgICAgICAgcmV0dXJuIHdmOworfQorCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgd2Fjb21faWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3dhYy5oIGIvZHJpdmVycy91c2IvaW5wdXQvd2Fjb21fd2FjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhZTdiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2lucHV0L3dhY29tX3dhYy5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBkcml2ZXJzL3VzYi9pbnB1dC93YWNvbV93YWMuaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpZm5kZWYgV0FDT01fV0FDX0gKKyNkZWZpbmUgV0FDT01fV0FDX0gKKworI2RlZmluZSBTVFlMVVNfREVWSUNFX0lECTB4MDIKKyNkZWZpbmUgQ1VSU09SX0RFVklDRV9JRAkweDA2CisjZGVmaW5lIEVSQVNFUl9ERVZJQ0VfSUQJMHgwQQorCitlbnVtIHsKKwlQRU5QQVJUTkVSID0gMCwKKwlHUkFQSElSRSwKKwlXQUNPTV9HNCwKKwlQVFUsCisJUEwsCisJSU5UVU9TLAorCUlOVFVPUzMsCisJSU5UVU9TM0wsCisJQ0lOVElRLAorCU1BWF9UWVBFCit9OworCitzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgeworCWNoYXIgKm5hbWU7CisJaW50IHBrdGxlbjsKKwlpbnQgeF9tYXg7CisJaW50IHlfbWF4OworCWludCBwcmVzc3VyZV9tYXg7CisJaW50IGRpc3RhbmNlX21heDsKKwlpbnQgdHlwZTsKKwl1c2JfY29tcGxldGVfdCBpcnE7Cit9OworCitzdHJ1Y3Qgd2Fjb21fd2FjIHsKKwlzaWduZWQgY2hhciAqZGF0YTsKKyAgICAgICAgaW50IHRvb2xbMl07CisgICAgICAgIGludCBpZFsyXTsKKyAgICAgICAgX191MzIgc2VyaWFsWzJdOworCXN0cnVjdCB3YWNvbV9mZWF0dXJlcyAqZmVhdHVyZXM7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lucHV0L3llYWxpbmsuYyBiL2RyaXZlcnMvdXNiL2lucHV0L3llYWxpbmsuYwppbmRleCA3YjQ1ZmQzLi43MjkxZTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbnB1dC95ZWFsaW5rLmMKKysrIGIvZHJpdmVycy91c2IvaW5wdXQveWVhbGluay5jCkBAIC05NzEsNyArOTcxLDcgQEAKIAkJCURSSVZFUl9WRVJTSU9OLCBzaXplb2YoRFJJVkVSX1ZFUlNJT04pKTsKIAogCS8qIFJlZ2lzdGVyIHN5c2ZzIGhvb2tzIChkb24ndCBjYXJlIGFib3V0IGZhaWx1cmUpICovCi0Jc3lzZnNfY3JlYXRlX2dyb3VwKCZpbnRmLT5kZXYua29iaiwgJnlsZF9hdHRyX2dyb3VwKTsKKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmludGYtPmRldi5rb2JqLCAmeWxkX2F0dHJfZ3JvdXApOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcgYi9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcKaW5kZXggODg5MjhhNC4uYzI5NjU4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZwpAQCAtMzIsNiArMzIsMTYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGVtaTI2LgogCitjb25maWcgVVNCX0FEVVRVWAorCXRyaXN0YXRlICJBRFUgZGV2aWNlcyBmcm9tIE9udHJhayBDb250cm9sIFN5c3RlbXMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBVU0IgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gdXNlIGFuIEFEVSBkZXZpY2UgZnJvbSBPbnRyYWsgQ29udHJvbAorCSAgU3lzdGVtcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIFRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGFkdXR1eC4KKwogY29uZmlnIFVTQl9BVUVSU1dBTEQKIAl0cmlzdGF0ZSAiVVNCIEF1ZXJzd2FsZCBJU0ROIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBVU0IgJiYgRVhQRVJJTUVOVEFMCkBAIC0xMTUsMTkgKzEyNSwzNiBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY3l0aGVybS4KIAotY29uZmlnIFVTQl9QSElER0VUS0lUCi0JdHJpc3RhdGUgIlVTQiBQaGlkZ2V0S2l0IHN1cHBvcnQiCitjb25maWcgVVNCX1BISURHRVQKKwl0cmlzdGF0ZSAiVVNCIFBoaWRnZXRzIGRyaXZlcnMiCiAJZGVwZW5kcyBvbiBVU0IKIAloZWxwCi0JICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgYSBQaGlkZ2V0S2l0IFVTQiBkZXZpY2UgZnJvbQotCSAgUGhpZGdldHMgSW5jLgorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIHZhcmlvdXMgZHJpdmVycyBmb3IgZGV2aWNlcyBmcm9tCisJICBQaGlkZ2V0cyBpbmMuCisKK2NvbmZpZyBVU0JfUEhJREdFVEtJVAorCXRyaXN0YXRlICJVU0IgUGhpZGdldEludGVyZmFjZUtpdCBzdXBwb3J0IgorCWRlcGVuZHMgb24gVVNCX1BISURHRVQKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgYSBQaGlkZ2V0SW50ZXJmYWNlS2l0IFVTQiBkZXZpY2UKKwkgIGZyb20gUGhpZGdldHMgSW5jLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwaGlkZ2V0a2l0LgogCitjb25maWcgVVNCX1BISURHRVRNT1RPUkNPTlRST0wKKwl0cmlzdGF0ZSAiVVNCIFBoaWRnZXRNb3RvckNvbnRyb2wgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQl9QSElER0VUCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb25uZWN0IGEgUGhpZGdldE1vdG9yQ29udHJvbCBVU0IgZGV2aWNlCisJICBmcm9tIFBoaWRnZXRzIEluYy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGhpZGdldG1vdG9yY29udHJvbC4KKwogY29uZmlnIFVTQl9QSElER0VUU0VSVk8KIAl0cmlzdGF0ZSAiVVNCIFBoaWRnZXRTZXJ2byBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCCisJZGVwZW5kcyBvbiBVU0JfUEhJREdFVAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29ubmVjdCBhbiAxIG9yIDQgTW90b3IgUGhpZGdldFNlcnZvIAogCSAgc2Vydm8gY29udHJvbGxlciB2ZXJzaW9uIDIuMCBvciAzLjAuCkBAIC0xNTEsNiArMTc4LDMwIEBACiAKIAkgIFNlZSBhbHNvIDxodHRwOi8vd3d3LmZzLnR1bS5kZS9+ZWNodGxlci9pZG1vdXNlLz4uCiAKK2NvbmZpZyBVU0JfRlRESV9FTEFOCisJdHJpc3RhdGUgIkVsYW4gUENNQ0lBIENhcmRCdXMgQWRhcHRlciBVU0IgQ2xpZW50IgorCWRlcGVuZHMgb24gVVNCCisJZGVmYXVsdCBNCisJaGVscAorCSAgRUxBTidzIFV4eHggc2VyaWVzIG9mIGFkYXB0ZXJzIGFyZSBVU0IgdG8gUENNQ0lBIENhcmRCdXMgYWRhcHRlcnMuCisJICBDdXJyZW50bHkgb25seSB0aGUgVTEzMiBhZGFwdGVyIGlzIGF2YWlsYWJsZS4KKworCSAgVGhlIFUxMzIgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIGZvciBDYXJkQnVzIFBDIGNhcmRzIHRoYXQgY29udGFpbgorCSAgYW4gT0hDSSBob3N0IGNvbnRyb2xsZXIuIFR5cGljYWwgUEMgY2FyZHMgYXJlIHRoZSBPcmFuZ2UgTW9iaWxlIDNHCisJICBPcHRpb24gR2xvYmVUcm90dGVyIEZ1c2lvbiBjYXJkLiBUaGUgVTEzMiBhZGFwdGVyIHdpbGwgKk5PVCogd29yaworCSAgd2l0aCBQQyBjYXJkcyB0aGF0IGRvIG5vdCBjb250YWluIGFuIE9IQ0kgY29udHJvbGxlci4gVG8gdXNlIGEgVTEzMgorCSAgYWRhcHRlciB5b3Ugd2lsbCBuZWVkIHRoaXMgImZ0ZGktZWxhbiIgbW9kdWxlIGFzIHdlbGwgYXMgdGhlICJ1MTMyLWhjZCIKKwkgIG1vZHVsZSB3aGljaCBpcyBhIFVTQiBob3N0IGNvbnRyb2xsZXIgZHJpdmVyIHRoYXQgdGFsa3MgdG8gdGhlIE9IQ0kKKwkgIGNvbnRyb2xsZXIgd2l0aGluIENhcmRCdXMgY2FyZCB0aGF0IGFyZSBpbnNlcnRlZCBpbiB0aGUgVTEzMiBhZGFwdGVyLgorCisJICBUaGlzIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBhIENhcmRCdXMgT0hDSSBVU0IgYWRhcHRlciwgYW5kCisJICB3b3JrZWQgd2l0aCBhIFVTQiBQRU4gRHJpdmUgaW5zZXJ0ZWQgaW50byB0aGUgZmlyc3QgVVNCIHBvcnQgb2YKKwkgIHRoZSBQQ0NBUkQuIEEgcmF0aGVyIHBvaW50bGVzcyB0aGluZyB0byBkbywgYnV0IHVzZWZ1bCBmb3IgdGVzdGluZy4KKworCSAgU2VlIGFsc28gdGhlIFVTQl9VMTMyX0hDRCBlbnRyeSAiRWxhbiBVMTMyIEFkYXB0ZXIgSG9zdCBDb250cm9sbGVyIgorCisJICBJdCBpcyBzYWZlIHRvIHNheSBNIGhlcmUuCisKIGNvbmZpZyBVU0JfQVBQTEVESVNQTEFZCiAJdHJpc3RhdGUgIkFwcGxlIENpbmVtYSBEaXNwbGF5IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0IKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9taXNjL01ha2VmaWxlCmluZGV4IDI5MjcyNjAuLjJiZTcwZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvbWlzYy9NYWtlZmlsZQpAQCAtMywyMiArMywyNSBAQAogIyAodGhlIG9uZXMgdGhhdCBkb24ndCBmaXQgaW50byBhbnkgb3RoZXIgY2F0ZWdvcmllcykKICMKIAorb2JqLSQoQ09ORklHX1VTQl9BRFVUVVgpCSs9IGFkdXR1eC5vCiBvYmotJChDT05GSUdfVVNCX0FVRVJTV0FMRCkJKz0gYXVlcnN3YWxkLm8KIG9iai0kKENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMpKz0gY3lwcmVzc19jeTdjNjMubwogb2JqLSQoQ09ORklHX1VTQl9DWVRIRVJNKQkrPSBjeXRoZXJtLm8KIG9iai0kKENPTkZJR19VU0JfRU1JMjYpCQkrPSBlbWkyNi5vCiBvYmotJChDT05GSUdfVVNCX0VNSTYyKQkJKz0gZW1pNjIubworb2JqLSQoQ09ORklHX1VTQl9GVERJX0VMQU4pCSs9IGZ0ZGktZWxhbi5vCiBvYmotJChDT05GSUdfVVNCX0lETU9VU0UpCSs9IGlkbW91c2Uubwogb2JqLSQoQ09ORklHX1VTQl9MQ0QpCQkrPSB1c2JsY2Qubwogb2JqLSQoQ09ORklHX1VTQl9MRCkJCSs9IGxkdXNiLm8KIG9iai0kKENPTkZJR19VU0JfTEVEKQkJKz0gdXNibGVkLm8KIG9iai0kKENPTkZJR19VU0JfTEVHT1RPV0VSKQkrPSBsZWdvdXNidG93ZXIubworb2JqLSQoQ09ORklHX1VTQl9QSElER0VUKQkrPSBwaGlkZ2V0Lm8KIG9iai0kKENPTkZJR19VU0JfUEhJREdFVEtJVCkJKz0gcGhpZGdldGtpdC5vCitvYmotJChDT05GSUdfVVNCX1BISURHRVRNT1RPUkNPTlRST0wpCSs9IHBoaWRnZXRtb3RvcmNvbnRyb2wubwogb2JqLSQoQ09ORklHX1VTQl9QSElER0VUU0VSVk8pCSs9IHBoaWRnZXRzZXJ2by5vCiBvYmotJChDT05GSUdfVVNCX1JJTzUwMCkJKz0gcmlvNTAwLm8KIG9iai0kKENPTkZJR19VU0JfVEVTVCkJCSs9IHVzYnRlc3Qubwogb2JqLSQoQ09ORklHX1VTQl9VU1M3MjApCSs9IHVzczcyMC5vCi1vYmotJChDT05GSUdfVVNCX0FQUExFRElTUExBWSkJKz0gYXBwbGVkaXNwbGF5Lm8KIAogb2JqLSQoQ09ORklHX1VTQl9TSVNVU0JWR0EpCSs9IHNpc3VzYnZnYS8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9hZHV0dXguYyBiL2RyaXZlcnMvdXNiL21pc2MvYWR1dHV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5NjMxOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvYWR1dHV4LmMKQEAgLTAsMCArMSw5MDAgQEAKKy8qCisgKiBhZHV0dXggLSBkcml2ZXIgZm9yIEFEVSBkZXZpY2VzIGZyb20gT250cmFrIENvbnRyb2wgU3lzdGVtcworICogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZHJpdmVyLiBVc2UgYXQgeW91ciBvd24gcmlzay4KKyAqIFRoaXMgZHJpdmVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgT250cmFrIENvbnRyb2wgU3lzdGVtcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSm9obiBIb21wcGkgKFNDTywgbGVhdmUgdGhpcyBub3RpY2UgaGVyZSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIGRlcml2ZWQgZnJvbSB0aGUgTGVnbyBVU0IgVG93ZXIgZHJpdmVyIDAuNTY6CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRGF2aWQgR2xhbmNlIDxkYXZpZGdzZkBzb3VyY2Vmb3JnZS5uZXQ+CisgKiAgICAgICAgICAgICAgIDIwMDEgSnVlcmdlbiBTdHViZXIgPHN0dWJlckBsb3JpYS5mcj4KKyAqIHRoYXQgd2FzIGRlcml2ZWQgZnJvbSBVU0IgU2tlbGV0b24gZHJpdmVyIC0gMC41CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVnQGtyb2FoLmNvbSkKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZkZWYgQ09ORklHX1VTQl9ERUJVRworc3RhdGljIGludCBkZWJ1ZyA9IDU7CisjZWxzZQorc3RhdGljIGludCBkZWJ1ZyA9IDE7CisjZW5kaWYKKworLyogVXNlIG91ciBvd24gZGJnIG1hY3JvICovCisjdW5kZWYgZGJnCisjZGVmaW5lIGRiZyhsdmwsIGZvcm1hdCwgYXJnLi4uKSAJCQkJCVwKK2RvIHsgCQkJCQkJCQkJXAorCWlmIChkZWJ1ZyA+PSBsdmwpCQkJCQkJXAorCQlwcmludGsoS0VSTl9ERUJVRyBfX0ZJTEVfXyAiIDogIiBmb3JtYXQgIiBcbiIsICMjIGFyZyk7CVwKK30gd2hpbGUgKDApCisKKworLyogVmVyc2lvbiBJbmZvcm1hdGlvbiAqLworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuMC4xMyIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiSm9obiBIb21wcGkiCisjZGVmaW5lIERSSVZFUl9ERVNDICJhZHV0dXggKHNlZSB3d3cub250cmFrLm5ldCkiCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CisKKy8qIERlZmluZSB0aGVzZSB2YWx1ZXMgdG8gbWF0Y2ggeW91ciBkZXZpY2UgKi8KKyNkZWZpbmUgQURVX1ZFTkRPUl9JRCAweDBhMDcKKyNkZWZpbmUgQURVX1BST0RVQ1RfSUQgMHgwMDY0CisKKy8qIHRhYmxlIG9mIGRldmljZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBkcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkZXZpY2VfdGFibGUgW10gPSB7CisJeyBVU0JfREVWSUNFKEFEVV9WRU5ET1JfSUQsIEFEVV9QUk9EVUNUX0lEKSB9LAkJLyogQURVMTAwICovCisJeyBVU0JfREVWSUNFKEFEVV9WRU5ET1JfSUQsIEFEVV9QUk9EVUNUX0lEKzIwKSB9LCAJLyogQURVMTIwICovCisJeyBVU0JfREVWSUNFKEFEVV9WRU5ET1JfSUQsIEFEVV9QUk9EVUNUX0lEKzMwKSB9LCAJLyogQURVMTMwICovCisJeyBVU0JfREVWSUNFKEFEVV9WRU5ET1JfSUQsIEFEVV9QUk9EVUNUX0lEKzEwMCkgfSwJLyogQURVMjAwICovCisJeyBVU0JfREVWSUNFKEFEVV9WRU5ET1JfSUQsIEFEVV9QUk9EVUNUX0lEKzEwOCkgfSwJLyogQURVMjA4ICovCisJeyBVU0JfREVWSUNFKEFEVV9WRU5ET1JfSUQsIEFEVV9QUk9EVUNUX0lEKzExOCkgfSwJLyogQURVMjE4ICovCisJeyB9LyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBkZXZpY2VfdGFibGUpOworCisjaWZkZWYgQ09ORklHX1VTQl9EWU5BTUlDX01JTk9SUworI2RlZmluZSBBRFVfTUlOT1JfQkFTRQkwCisjZWxzZQorI2RlZmluZSBBRFVfTUlOT1JfQkFTRQk2NworI2VuZGlmCisKKy8qIHdlIGNhbiBoYXZlIHVwIHRvIHRoaXMgbnVtYmVyIG9mIGRldmljZSBwbHVnZ2VkIGluIGF0IG9uY2UgKi8KKyNkZWZpbmUgTUFYX0RFVklDRVMJMTYKKworI2RlZmluZSBDT01NQU5EX1RJTUVPVVQJKDIqSFopCS8qIDYwIHNlY29uZCB0aW1lb3V0IGZvciBhIGNvbW1hbmQgKi8KKworLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIG91ciBkZXZpY2Ugc3BlY2lmaWMgc3R1ZmYgKi8KK3N0cnVjdCBhZHVfZGV2aWNlIHsKKwlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsgLyogbG9ja3MgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSoJdWRldjsgLyogc2F2ZSBvZmYgdGhlIHVzYiBkZXZpY2UgcG9pbnRlciAqLworCXN0cnVjdCB1c2JfaW50ZXJmYWNlKglpbnRlcmZhY2U7CisJdW5zaWduZWQgY2hhcgkJbWlub3I7IC8qIHRoZSBzdGFydGluZyBtaW5vciBudW1iZXIgZm9yIHRoaXMgZGV2aWNlICovCisJY2hhcgkJCXNlcmlhbF9udW1iZXJbOF07CisKKwlpbnQJCQlvcGVuX2NvdW50OyAvKiBudW1iZXIgb2YgdGltZXMgdGhpcyBwb3J0IGhhcyBiZWVuIG9wZW5lZCAqLworCisJY2hhcioJCQlyZWFkX2J1ZmZlcl9wcmltYXJ5OworCWludAkJCXJlYWRfYnVmZmVyX2xlbmd0aDsKKwljaGFyKgkJCXJlYWRfYnVmZmVyX3NlY29uZGFyeTsKKwlpbnQJCQlzZWNvbmRhcnlfaGVhZDsKKwlpbnQJCQlzZWNvbmRhcnlfdGFpbDsKKwlzcGlubG9ja190CQlidWZsb2NrOworCisJd2FpdF9xdWV1ZV9oZWFkX3QJcmVhZF93YWl0OworCXdhaXRfcXVldWVfaGVhZF90CXdyaXRlX3dhaXQ7CisKKwljaGFyKgkJCWludGVycnVwdF9pbl9idWZmZXI7CisJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yKiBpbnRlcnJ1cHRfaW5fZW5kcG9pbnQ7CisJc3RydWN0IHVyYioJCWludGVycnVwdF9pbl91cmI7CisJaW50CQkJcmVhZF91cmJfZmluaXNoZWQ7CisKKwljaGFyKgkJCWludGVycnVwdF9vdXRfYnVmZmVyOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciogaW50ZXJydXB0X291dF9lbmRwb2ludDsKKwlzdHJ1Y3QgdXJiKgkJaW50ZXJydXB0X291dF91cmI7Cit9OworCisvKiBwcmV2ZW50IHJhY2VzIGJldHdlZW4gb3BlbigpIGFuZCBkaXNjb25uZWN0ICovCitzdGF0aWMgREVGSU5FX01VVEVYKGRpc2Nvbm5lY3RfbXV0ZXgpOworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGFkdV9kcml2ZXI7CisKK3N0YXRpYyB2b2lkIGFkdV9kZWJ1Z19kYXRhKGludCBsZXZlbCwgY29uc3QgY2hhciAqZnVuY3Rpb24sIGludCBzaXplLAorCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKwlpbnQgaTsKKworCWlmIChkZWJ1ZyA8IGxldmVsKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9ERUJVRyBfX0ZJTEVfXyI6ICVzIC0gbGVuZ3RoID0gJWQsIGRhdGEgPSAiLAorCSAgICAgICBmdW5jdGlvbiwgc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkKKwkJcHJpbnRrKCIlLjJ4ICIsIGRhdGFbaV0pOworCXByaW50aygiXG4iKTsKK30KKworLyoqCisgKiBhZHVfYWJvcnRfdHJhbnNmZXJzCisgKiAgICAgIGFib3J0cyB0cmFuc2ZlcnMgYW5kIGZyZWVzIGFzc29jaWF0ZWQgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3N0YXRpYyB2b2lkIGFkdV9hYm9ydF90cmFuc2ZlcnMoc3RydWN0IGFkdV9kZXZpY2UgKmRldikKK3sKKwlkYmcoMiwiICVzIDogZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisJCWRiZygxLCIgJXMgOiBkZXYgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoZGV2LT51ZGV2ID09IE5VTEwpIHsKKwkJZGJnKDEsIiAlcyA6IHVkZXYgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlkYmcoMiwiICVzIDogdWRldiBzdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgZGV2LT51ZGV2LT5zdGF0ZSk7CisJaWYgKGRldi0+dWRldi0+c3RhdGUgPT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKSB7CisJCWRiZygxLCIgJXMgOiB1ZGV2IGlzIG5vdCBhdHRhY2hlZCIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBzaHV0ZG93biB0cmFuc2ZlciAqLworCXVzYl91bmxpbmtfdXJiKGRldi0+aW50ZXJydXB0X2luX3VyYik7CisJdXNiX3VubGlua191cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYik7CisKK2V4aXQ6CisJZGJnKDIsIiAlcyA6IGxlYXZlIiwgX19GVU5DVElPTl9fKTsKK30KKworc3RhdGljIHZvaWQgYWR1X2RlbGV0ZShzdHJ1Y3QgYWR1X2RldmljZSAqZGV2KQoreworCWRiZygyLCAiJXMgZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCisJYWR1X2Fib3J0X3RyYW5zZmVycyhkZXYpOworCisJLyogZnJlZSBkYXRhIHN0cnVjdHVyZXMgKi8KKwl1c2JfZnJlZV91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiKTsKKwl1c2JfZnJlZV91cmIoZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYik7CisJa2ZyZWUoZGV2LT5yZWFkX2J1ZmZlcl9wcmltYXJ5KTsKKwlrZnJlZShkZXYtPnJlYWRfYnVmZmVyX3NlY29uZGFyeSk7CisJa2ZyZWUoZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyKTsKKwlrZnJlZShkZXYtPmludGVycnVwdF9vdXRfYnVmZmVyKTsKKwlrZnJlZShkZXYpOworCisJZGJnKDIsICIlcyA6IGxlYXZlIiwgX19GVU5DVElPTl9fKTsKK30KKworc3RhdGljIHZvaWQgYWR1X2ludGVycnVwdF9pbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBhZHVfZGV2aWNlICpkZXYgPSB1cmItPmNvbnRleHQ7CisKKwlkYmcoNCwiICVzIDogZW50ZXIsIHN0YXR1cyAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCWFkdV9kZWJ1Z19kYXRhKDUsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLAorCQkgICAgICAgdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCisJc3Bpbl9sb2NrKCZkZXYtPmJ1ZmxvY2spOworCisJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKKwkJaWYgKCh1cmItPnN0YXR1cyAhPSAtRU5PRU5UKSAmJiAodXJiLT5zdGF0dXMgIT0gLUVDT05OUkVTRVQpKSB7CisJCQlkYmcoMSwiICVzIDogbm9uemVybyBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJCSAgICBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJfQorCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDAgJiYgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyWzBdICE9IDB4MDApIHsKKwkJaWYgKGRldi0+cmVhZF9idWZmZXJfbGVuZ3RoIDwKKwkJICAgICg0ICogbGUxNl90b19jcHUoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSkgLQorCQkgICAgICh1cmItPmFjdHVhbF9sZW5ndGgpKSB7CisJCQltZW1jcHkgKGRldi0+cmVhZF9idWZmZXJfcHJpbWFyeSArCisJCQkJZGV2LT5yZWFkX2J1ZmZlcl9sZW5ndGgsCisJCQkJZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLCB1cmItPmFjdHVhbF9sZW5ndGgpOworCisJCQlkZXYtPnJlYWRfYnVmZmVyX2xlbmd0aCArPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJCQlkYmcoMiwiICVzIHJlYWRpbmcgICVkICIsIF9fRlVOQ1RJT05fXywKKwkJCSAgICB1cmItPmFjdHVhbF9sZW5ndGgpOworCQl9IGVsc2UgeworCQkJZGJnKDEsIiAlcyA6IHJlYWRfYnVmZmVyIG92ZXJmbG93IiwgX19GVU5DVElPTl9fKTsKKwkJfQorCX0KKworZXhpdDoKKwlkZXYtPnJlYWRfdXJiX2ZpbmlzaGVkID0gMTsKKwlzcGluX3VubG9jaygmZGV2LT5idWZsb2NrKTsKKwkvKiBhbHdheXMgd2FrZSB1cCBzbyB3ZSByZWNvdmVyIGZyb20gZXJyb3JzICovCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnJlYWRfd2FpdCk7CisJYWR1X2RlYnVnX2RhdGEoNSwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsCisJCSAgICAgICB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJZGJnKDQsIiAlcyA6IGxlYXZlLCBzdGF0dXMgJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgYWR1X2ludGVycnVwdF9vdXRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYWR1X2RldmljZSAqZGV2ID0gdXJiLT5jb250ZXh0OworCisJZGJnKDQsIiAlcyA6IGVudGVyLCBzdGF0dXMgJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwlhZHVfZGVidWdfZGF0YSg1LF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisKKwlpZiAodXJiLT5zdGF0dXMgIT0gMCkgeworCQlpZiAoKHVyYi0+c3RhdHVzICE9IC1FTk9FTlQpICYmCisJCSAgICAodXJiLT5zdGF0dXMgIT0gLUVDT05OUkVTRVQpKSB7CisJCQlkYmcoMSwgIiAlcyA6bm9uemVybyBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJCSAgICBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJfQorCQlnb3RvIGV4aXQ7CisJfQorCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPndyaXRlX3dhaXQpOworZXhpdDoKKworCWFkdV9kZWJ1Z19kYXRhKDUsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLAorCQkgICAgICAgdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCWRiZyg0LCIgJXMgOiBsZWF2ZSwgc3RhdHVzICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbnQgYWR1X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGFkdV9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlpbnQgc3VibWlub3I7CisJaW50IHJldHZhbCA9IDA7CisKKwlkYmcoMiwiJXMgOiBlbnRlciIsIF9fRlVOQ1RJT05fXyk7CisKKwlzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7CisKKwltdXRleF9sb2NrKCZkaXNjb25uZWN0X211dGV4KTsKKworCWludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmYWR1X2RyaXZlciwgc3VibWlub3IpOworCWlmICghaW50ZXJmYWNlKSB7CisJCWVycigiJXMgLSBlcnJvciwgY2FuJ3QgZmluZCBkZXZpY2UgZm9yIG1pbm9yICVkIiwKKwkJICAgIF9fRlVOQ1RJT05fXywgc3VibWlub3IpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXRfbm9fZGV2aWNlOworCX0KKworCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKwlpZiAoIWRldikgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXRfbm9fZGV2aWNlOworCX0KKworCS8qIGxvY2sgdGhpcyBkZXZpY2UgKi8KKwlpZiAoKHJldHZhbCA9IGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pKSkgeworCQlkYmcoMiwgIiVzIDogc2VtIGRvd24gZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBleGl0X25vX2RldmljZTsKKwl9CisKKwkvKiBpbmNyZW1lbnQgb3VyIHVzYWdlIGNvdW50IGZvciB0aGUgZGV2aWNlICovCisJKytkZXYtPm9wZW5fY291bnQ7CisJZGJnKDIsIiVzIDogb3BlbiBjb3VudCAlZCIsIF9fRlVOQ1RJT05fXywgZGV2LT5vcGVuX2NvdW50KTsKKworCS8qIHNhdmUgZGV2aWNlIGluIHRoZSBmaWxlJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXY7CisKKwkvKiBpbml0aWFsaXplIGluIGRpcmVjdGlvbiAqLworCWRldi0+cmVhZF9idWZmZXJfbGVuZ3RoID0gMDsKKworCS8qIGZpeHVwIGZpcnN0IHJlYWQgYnkgaGF2aW5nIHVyYiB3YWl0aW5nIGZvciBpdCAqLworCXVzYl9maWxsX2ludF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLGRldi0+dWRldiwKKwkJCSB1c2JfcmN2aW50cGlwZShkZXYtPnVkZXYsCisJCQkgCQlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLAorCQkJIGxlMTZfdG9fY3B1KGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT53TWF4UGFja2V0U2l6ZSksCisJCQkgYWR1X2ludGVycnVwdF9pbl9jYWxsYmFjaywgZGV2LAorCQkJIGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iSW50ZXJ2YWwpOworCS8qIGRldi0+aW50ZXJydXB0X2luX3VyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX0FTWU5DX1VOTElOSzsgKi8KKwlkZXYtPnJlYWRfdXJiX2ZpbmlzaGVkID0gMDsKKwl1c2Jfc3VibWl0X3VyYihkZXYtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOworCS8qIHdlIGlnbm9yZSBmYWlsdXJlICovCisJLyogZW5kIG9mIGZpeHVwIGZvciBmaXJzdCByZWFkICovCisKKwl1cCgmZGV2LT5zZW0pOworCitleGl0X25vX2RldmljZToKKwltdXRleF91bmxvY2soJmRpc2Nvbm5lY3RfbXV0ZXgpOworCWRiZygyLCIlcyA6IGxlYXZlLCByZXR1cm4gdmFsdWUgJWQgIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBhZHVfcmVsZWFzZV9pbnRlcm5hbChzdHJ1Y3QgYWR1X2RldmljZSAqZGV2KQoreworCWludCByZXR2YWwgPSAwOworCisJZGJnKDIsIiAlcyA6IGVudGVyIiwgX19GVU5DVElPTl9fKTsKKworCWlmIChkZXYtPnVkZXYgPT0gTlVMTCkgeworCQkvKiB0aGUgZGV2aWNlIHdhcyB1bnBsdWdnZWQgYmVmb3JlIHRoZSBmaWxlIHdhcyByZWxlYXNlZCAqLworCQlhZHVfZGVsZXRlKGRldik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBkZWNyZW1lbnQgb3VyIHVzYWdlIGNvdW50IGZvciB0aGUgZGV2aWNlICovCisJLS1kZXYtPm9wZW5fY291bnQ7CisJZGJnKDIsIiAlcyA6IG9wZW4gY291bnQgJWQiLCBfX0ZVTkNUSU9OX18sIGRldi0+b3Blbl9jb3VudCk7CisJaWYgKGRldi0+b3Blbl9jb3VudCA8PSAwKSB7CisJCWFkdV9hYm9ydF90cmFuc2ZlcnMoZGV2KTsKKwkJZGV2LT5vcGVuX2NvdW50ID0gMDsKKwl9CisKK2V4aXQ6CisJZGJnKDIsIiAlcyA6IGxlYXZlIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGFkdV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBhZHVfZGV2aWNlICpkZXYgPSBOVUxMOworCWludCByZXR2YWwgPSAwOworCisJZGJnKDIsIiAlcyA6IGVudGVyIiwgX19GVU5DVElPTl9fKTsKKworCWlmIChmaWxlID09IE5VTEwpIHsKKyAJCWRiZygxLCIgJXMgOiBmaWxlIGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGRldiA9PSBOVUxMKSB7CisgCQlkYmcoMSwiICVzIDogb2JqZWN0IGlzIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogbG9jayBvdXIgZGV2aWNlICovCisJZG93bigmZGV2LT5zZW0pOyAvKiBub3QgaW50ZXJydXB0aWJsZSAqLworCisJaWYgKGRldi0+b3Blbl9jb3VudCA8PSAwKSB7CisJCWRiZygxLCIgJXMgOiBkZXZpY2Ugbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHZhbCA9IC1FTk9ERVY7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBkbyB0aGUgd29yayAqLworCXJldHZhbCA9IGFkdV9yZWxlYXNlX2ludGVybmFsKGRldik7CisKK2V4aXQ6CisJdXAoJmRldi0+c2VtKTsKKwlkYmcoMiwiICVzIDogbGVhdmUsIHJldHVybiB2YWx1ZSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3NpemVfdCBhZHVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgX191c2VyIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAorCQkJbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhZHVfZGV2aWNlICpkZXY7CisJc2l6ZV90IGJ5dGVzX3JlYWQgPSAwOworCXNpemVfdCBieXRlc190b19yZWFkID0gY291bnQ7CisJaW50IGk7CisJaW50IHJldHZhbCA9IDA7CisJaW50IHRpbWVvdXQgPSAwOworCWludCBzaG91bGRfc3VibWl0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJZGJnKDIsIiAlcyA6IGVudGVyLCBjb3VudCA9ICVaZCwgZmlsZT0lcCIsIF9fRlVOQ1RJT05fXywgY291bnQsIGZpbGUpOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWRiZygyLCIgJXMgOiBkZXY9JXAiLCBfX0ZVTkNUSU9OX18sIGRldik7CisJLyogbG9jayB0aGlzIG9iamVjdCAqLworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmRldi0+c2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCS8qIHZlcmlmeSB0aGF0IHRoZSBkZXZpY2Ugd2Fzbid0IHVucGx1Z2dlZCAqLworCWlmIChkZXYtPnVkZXYgPT0gTlVMTCB8fCBkZXYtPm1pbm9yID09IDApIHsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZXJyKCJObyBkZXZpY2Ugb3IgZGV2aWNlIHVucGx1Z2dlZCAlZCIsIHJldHZhbCk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiB2ZXJpZnkgdGhhdCBzb21lIGRhdGEgd2FzIHJlcXVlc3RlZCAqLworCWlmIChjb3VudCA9PSAwKSB7CisJCWRiZygxLCIgJXMgOiByZWFkIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwl0aW1lb3V0ID0gQ09NTUFORF9USU1FT1VUOworCWRiZygyLCIgJXMgOiBhYm91dCB0byBzdGFydCBsb29waW5nIiwgX19GVU5DVElPTl9fKTsKKwl3aGlsZSAoYnl0ZXNfdG9fcmVhZCkgeworCQlpbnQgZGF0YV9pbl9zZWNvbmRhcnkgPSBkZXYtPnNlY29uZGFyeV90YWlsIC0gZGV2LT5zZWNvbmRhcnlfaGVhZDsKKwkJZGJnKDIsIiAlcyA6IHdoaWxlLCBkYXRhX2luX3NlY29uZGFyeT0lZCwgc3RhdHVzPSVkIiwKKwkJICAgIF9fRlVOQ1RJT05fXywgZGF0YV9pbl9zZWNvbmRhcnksCisJCSAgICBkZXYtPmludGVycnVwdF9pbl91cmItPnN0YXR1cyk7CisKKwkJaWYgKGRhdGFfaW5fc2Vjb25kYXJ5KSB7CisJCQkvKiBkcmFpbiBzZWNvbmRhcnkgYnVmZmVyICovCisJCQlpbnQgYW1vdW50ID0gYnl0ZXNfdG9fcmVhZCA8IGRhdGFfaW5fc2Vjb25kYXJ5ID8gYnl0ZXNfdG9fcmVhZCA6IGRhdGFfaW5fc2Vjb25kYXJ5OworCQkJaSA9IGNvcHlfdG9fdXNlcihidWZmZXIsIGRldi0+cmVhZF9idWZmZXJfc2Vjb25kYXJ5K2Rldi0+c2Vjb25kYXJ5X2hlYWQsIGFtb3VudCk7CisJCQlpZiAoaSA8IDApIHsKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJCWRldi0+c2Vjb25kYXJ5X2hlYWQgKz0gKGFtb3VudCAtIGkpOworCQkJYnl0ZXNfcmVhZCArPSAoYW1vdW50IC0gaSk7CisJCQlieXRlc190b19yZWFkIC09IChhbW91bnQgLSBpKTsKKwkJCWlmIChpKSB7CisJCQkJcmV0dmFsID0gYnl0ZXNfcmVhZCA/IGJ5dGVzX3JlYWQgOiAtRUZBVUxUOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIHdlIGNoZWNrIHRoZSBwcmltYXJ5IGJ1ZmZlciAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUgKCZkZXYtPmJ1ZmxvY2ssIGZsYWdzKTsKKwkJCWlmIChkZXYtPnJlYWRfYnVmZmVyX2xlbmd0aCkgeworCQkJCS8qIHdlIHNlY3VyZSBhY2Nlc3MgdG8gdGhlIHByaW1hcnkgKi8KKwkJCQljaGFyICp0bXA7CisJCQkJZGJnKDIsIiAlcyA6IHN3YXAsIHJlYWRfYnVmZmVyX2xlbmd0aCA9ICVkIiwKKwkJCQkgICAgX19GVU5DVElPTl9fLCBkZXYtPnJlYWRfYnVmZmVyX2xlbmd0aCk7CisJCQkJdG1wID0gZGV2LT5yZWFkX2J1ZmZlcl9zZWNvbmRhcnk7CisJCQkJZGV2LT5yZWFkX2J1ZmZlcl9zZWNvbmRhcnkgPSBkZXYtPnJlYWRfYnVmZmVyX3ByaW1hcnk7CisJCQkJZGV2LT5yZWFkX2J1ZmZlcl9wcmltYXJ5ID0gdG1wOworCQkJCWRldi0+c2Vjb25kYXJ5X2hlYWQgPSAwOworCQkJCWRldi0+c2Vjb25kYXJ5X3RhaWwgPSBkZXYtPnJlYWRfYnVmZmVyX2xlbmd0aDsKKwkJCQlkZXYtPnJlYWRfYnVmZmVyX2xlbmd0aCA9IDA7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5idWZsb2NrLCBmbGFncyk7CisJCQkJLyogd2UgaGF2ZSBhIGZyZWUgYnVmZmVyIHNvIHVzZSBpdCAqLworCQkJCXNob3VsZF9zdWJtaXQgPSAxOworCQkJfSBlbHNlIHsKKwkJCQkvKiBldmVuIHRoZSBwcmltYXJ5IHdhcyBlbXB0eSAtIHdlIG1heSBuZWVkIHRvIGRvIElPICovCisJCQkJaWYgKGRldi0+aW50ZXJydXB0X2luX3VyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykgeworCQkJCQkvKiBzb21lYm9keSBpcyBkb2luZyBJTyAqLworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmJ1ZmxvY2ssIGZsYWdzKTsKKwkJCQkJZGJnKDIsIiAlcyA6IHN1Ym1pdHRlZCBhbHJlYWR5IiwgX19GVU5DVElPTl9fKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiB3ZSBtdXN0IGluaXRpYXRlIGlucHV0ICovCisJCQkJCWRiZygyLCIgJXMgOiBpbml0aWF0ZSBpbnB1dCIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCWRldi0+cmVhZF91cmJfZmluaXNoZWQgPSAwOworCisJCQkJCXVzYl9maWxsX2ludF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLGRldi0+dWRldiwKKwkJCQkJCQkgdXNiX3JjdmludHBpcGUoZGV2LT51ZGV2LAorCQkJCQkJCSAJCWRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCQkJCQkgZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLAorCQkJCQkJCSBsZTE2X3RvX2NwdShkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+d01heFBhY2tldFNpemUpLAorCQkJCQkJCSBhZHVfaW50ZXJydXB0X2luX2NhbGxiYWNrLAorCQkJCQkJCSBkZXYsCisJCQkJCQkJIGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT5iSW50ZXJ2YWwpOworCQkJCQlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOworCQkJCQlpZiAoIXJldHZhbCkgeworCQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5idWZsb2NrLCBmbGFncyk7CisJCQkJCQlkYmcoMiwiICVzIDogc3VibWl0dGVkIE9LIiwgX19GVU5DVElPTl9fKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChyZXR2YWwgPT0gLUVOT01FTSkgeworCQkJCQkJCXJldHZhbCA9IGJ5dGVzX3JlYWQgPyBieXRlc19yZWFkIDogLUVOT01FTTsKKwkJCQkJCX0KKwkJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+YnVmbG9jaywgZmxhZ3MpOworCQkJCQkJZGJnKDIsIiAlcyA6IHN1Ym1pdCBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworCQkJCQkJZ290byBleGl0OworCQkJCQl9CisJCQkJfQorCisJCQkJLyogd2Ugd2FpdCBmb3IgSS9PIHRvIGNvbXBsZXRlICovCisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCQlhZGRfd2FpdF9xdWV1ZSgmZGV2LT5yZWFkX3dhaXQsICZ3YWl0KTsKKwkJCQlpZiAoIWRldi0+cmVhZF91cmJfZmluaXNoZWQpCisJCQkJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KENPTU1BTkRfVElNRU9VVCk7CisJCQkJZWxzZQorCQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZkZXYtPnJlYWRfd2FpdCwgJndhaXQpOworCisJCQkJaWYgKHRpbWVvdXQgPD0gMCkgeworCQkJCQlkYmcoMiwiICVzIDogdGltZW91dCIsIF9fRlVOQ1RJT05fXyk7CisJCQkJCXJldHZhbCA9IGJ5dGVzX3JlYWQgPyBieXRlc19yZWFkIDogLUVUSU1FRE9VVDsKKwkJCQkJZ290byBleGl0OworCQkJCX0KKworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlkYmcoMiwiICVzIDogc2lnbmFsIHBlbmRpbmciLCBfX0ZVTkNUSU9OX18pOworCQkJCQlyZXR2YWwgPSBieXRlc19yZWFkID8gYnl0ZXNfcmVhZCA6IC1FSU5UUjsKKwkJCQkJZ290byBleGl0OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHZhbCA9IGJ5dGVzX3JlYWQ7CisJLyogaWYgdGhlIHByaW1hcnkgYnVmZmVyIGlzIGVtcHR5IHRoZW4gdXNlIGl0ICovCisJaWYgKHNob3VsZF9zdWJtaXQgJiYgIWRldi0+aW50ZXJydXB0X2luX3VyYi0+c3RhdHVzPT0tRUlOUFJPR1JFU1MpIHsKKwkJdXNiX2ZpbGxfaW50X3VyYihkZXYtPmludGVycnVwdF9pbl91cmIsZGV2LT51ZGV2LAorCQkJCSB1c2JfcmN2aW50cGlwZShkZXYtPnVkZXYsCisJCQkJIAkJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJCQkJZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLAorCQkJCQkJbGUxNl90b19jcHUoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKSwKKwkJCQkJCWFkdV9pbnRlcnJ1cHRfaW5fY2FsbGJhY2ssCisJCQkJCQlkZXYsCisJCQkJCQlkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludC0+YkludGVydmFsKTsKKwkJLyogZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfQVNZTkNfVU5MSU5LOyAqLworCQlkZXYtPnJlYWRfdXJiX2ZpbmlzaGVkID0gMDsKKwkJdXNiX3N1Ym1pdF91cmIoZGV2LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfS0VSTkVMKTsKKwkJLyogd2UgaWdub3JlIGZhaWx1cmUgKi8KKwl9CisKK2V4aXQ6CisJLyogdW5sb2NrIHRoZSBkZXZpY2UgKi8KKwl1cCgmZGV2LT5zZW0pOworCisJZGJnKDIsIiAlcyA6IGxlYXZlLCByZXR1cm4gdmFsdWUgJWQiLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHNzaXplX3QgYWR1X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBfX3VzZXIgY2hhciAqYnVmZmVyLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhZHVfZGV2aWNlICpkZXY7CisJc2l6ZV90IGJ5dGVzX3dyaXR0ZW4gPSAwOworCXNpemVfdCBieXRlc190b193cml0ZTsKKwlzaXplX3QgYnVmZmVyX3NpemU7CisJaW50IHJldHZhbCA9IDA7CisJaW50IHRpbWVvdXQgPSAwOworCisJZGJnKDIsIiAlcyA6IGVudGVyLCBjb3VudCA9ICVaZCIsIF9fRlVOQ1RJT05fXywgY291bnQpOworCisJZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJLyogbG9jayB0aGlzIG9iamVjdCAqLworCWRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5zZW0pOworCisJLyogdmVyaWZ5IHRoYXQgdGhlIGRldmljZSB3YXNuJ3QgdW5wbHVnZ2VkICovCisJaWYgKGRldi0+dWRldiA9PSBOVUxMIHx8IGRldi0+bWlub3IgPT0gMCkgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQllcnIoIk5vIGRldmljZSBvciBkZXZpY2UgdW5wbHVnZ2VkICVkIiwgcmV0dmFsKTsKKwkJZ290byBleGl0OworCX0KKworCS8qIHZlcmlmeSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgc29tZSBkYXRhIHRvIHdyaXRlICovCisJaWYgKGNvdW50ID09IDApIHsKKwkJZGJnKDEsIiAlcyA6IHdyaXRlIHJlcXVlc3Qgb2YgMCBieXRlcyIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJaWYgKGRldi0+aW50ZXJydXB0X291dF91cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKwkJCXRpbWVvdXQgPSBDT01NQU5EX1RJTUVPVVQ7CisKKwkJCXdoaWxlICh0aW1lb3V0ID4gMCkgeworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWRiZygxLCIgJXMgOiBpbnRlcnJ1cHRlZCIsIF9fRlVOQ1RJT05fXyk7CisJCQkJcmV0dmFsID0gLUVJTlRSOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKwkJCXVwKCZkZXYtPnNlbSk7CisJCQl0aW1lb3V0ID0gaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZkZXYtPndyaXRlX3dhaXQsIHRpbWVvdXQpOworCQkJZG93bl9pbnRlcnJ1cHRpYmxlKCZkZXYtPnNlbSk7CisJCQlpZiAodGltZW91dCA+IDApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRiZygxLCIgJXMgOiBpbnRlcnJ1cHRlZCB0aW1lb3V0OiAlZCIsIF9fRlVOQ1RJT05fXywgdGltZW91dCk7CisJCX0KKworCisJCWRiZygxLCIgJXMgOiBmaW5hbCB0aW1lb3V0OiAlZCIsIF9fRlVOQ1RJT05fXywgdGltZW91dCk7CisKKwkJaWYgKHRpbWVvdXQgPT0gMCkgeworCQkJZGJnKDEsICIlcyAtIGNvbW1hbmQgdGltZWQgb3V0LiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR2YWwgPSAtRVRJTUVET1VUOworCQkJZ290byBleGl0OworCQl9CisKKwkJZGJnKDQsIiAlcyA6IGluIHByb2dyZXNzLCBjb3VudCA9ICVaZCIsIF9fRlVOQ1RJT05fXywgY291bnQpOworCisJCX0gZWxzZSB7CisJCQlkYmcoNCwiICVzIDogc2VuZGluZywgY291bnQgPSAlWmQiLCBfX0ZVTkNUSU9OX18sIGNvdW50KTsKKworCQkJLyogd3JpdGUgdGhlIGRhdGEgaW50byBpbnRlcnJ1cHRfb3V0X2J1ZmZlciBmcm9tIHVzZXJzcGFjZSAqLworCQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQtPndNYXhQYWNrZXRTaXplKTsKKwkJCWJ5dGVzX3RvX3dyaXRlID0gY291bnQgPiBidWZmZXJfc2l6ZSA/IGJ1ZmZlcl9zaXplIDogY291bnQ7CisJCQlkYmcoNCwiICVzIDogYnVmZmVyX3NpemUgPSAlWmQsIGNvdW50ID0gJVpkLCBieXRlc190b193cml0ZSA9ICVaZCIsCisJCQkgICAgX19GVU5DVElPTl9fLCBidWZmZXJfc2l6ZSwgY291bnQsIGJ5dGVzX3RvX3dyaXRlKTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRldi0+aW50ZXJydXB0X291dF9idWZmZXIsIGJ1ZmZlciwgYnl0ZXNfdG9fd3JpdGUpICE9IDApIHsKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKworCQkJLyogc2VuZCBvZmYgdGhlIHVyYiAqLworCQkJdXNiX2ZpbGxfaW50X3VyYigKKwkJCQlkZXYtPmludGVycnVwdF9vdXRfdXJiLAorCQkJCWRldi0+dWRldiwKKwkJCQl1c2Jfc25kaW50cGlwZShkZXYtPnVkZXYsIGRldi0+aW50ZXJydXB0X291dF9lbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwKKwkJCQlieXRlc190b193cml0ZSwKKwkJCQlhZHVfaW50ZXJydXB0X291dF9jYWxsYmFjaywKKwkJCQlkZXYsCisJCQkJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQtPmJJbnRlcnZhbCk7CisJCQkvKiBkZXYtPmludGVycnVwdF9pbl91cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9BU1lOQ19VTkxJTks7ICovCisJCQlkZXYtPmludGVycnVwdF9vdXRfdXJiLT5hY3R1YWxfbGVuZ3RoID0gYnl0ZXNfdG9fd3JpdGU7CisJCQlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihkZXYtPmludGVycnVwdF9vdXRfdXJiLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChyZXR2YWwgPCAwKSB7CisJCQkJZXJyKCJDb3VsZG4ndCBzdWJtaXQgaW50ZXJydXB0X291dF91cmIgJWQiLCByZXR2YWwpOworCQkJCWdvdG8gZXhpdDsKKwkJCX0KKworCQkJYnVmZmVyICs9IGJ5dGVzX3RvX3dyaXRlOworCQkJY291bnQgLT0gYnl0ZXNfdG9fd3JpdGU7CisKKwkJCWJ5dGVzX3dyaXR0ZW4gKz0gYnl0ZXNfdG9fd3JpdGU7CisJCX0KKwl9CisKKwlyZXR2YWwgPSBieXRlc193cml0dGVuOworCitleGl0OgorCS8qIHVubG9jayB0aGUgZGV2aWNlICovCisJdXAoJmRldi0+c2VtKTsKKworCWRiZygyLCIgJXMgOiBsZWF2ZSwgcmV0dXJuIHZhbHVlICVkIiwgX19GVU5DVElPTl9fLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogZmlsZSBvcGVyYXRpb25zIG5lZWRlZCB3aGVuIHdlIHJlZ2lzdGVyIHRoaXMgZHJpdmVyICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZHVfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucmVhZCAgPSBhZHVfcmVhZCwKKwkud3JpdGUgPSBhZHVfd3JpdGUsCisJLm9wZW4gPSBhZHVfb3BlbiwKKwkucmVsZWFzZSA9IGFkdV9yZWxlYXNlLAorfTsKKworLyoKKyAqIHVzYiBjbGFzcyBkcml2ZXIgaW5mbyBpbiBvcmRlciB0byBnZXQgYSBtaW5vciBudW1iZXIgZnJvbSB0aGUgdXNiIGNvcmUsCisgKiBhbmQgdG8gaGF2ZSB0aGUgZGV2aWNlIHJlZ2lzdGVyZWQgd2l0aCBkZXZmcyBhbmQgdGhlIGRyaXZlciBjb3JlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciBhZHVfY2xhc3MgPSB7CisJLm5hbWUgPSAidXNiL2FkdXR1eCVkIiwKKwkuZm9wcyA9ICZhZHVfZm9wcywKKwkubWlub3JfYmFzZSA9IEFEVV9NSU5PUl9CQVNFLAorfTsKKworLyoqCisgKiBhZHVfcHJvYmUKKyAqCisgKiBDYWxsZWQgYnkgdGhlIHVzYiBjb3JlIHdoZW4gYSBuZXcgZGV2aWNlIGlzIGNvbm5lY3RlZCB0aGF0IGl0IHRoaW5rcworICogdGhpcyBkcml2ZXIgbWlnaHQgYmUgaW50ZXJlc3RlZCBpbi4KKyAqLworc3RhdGljIGludCBhZHVfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSwKKwkJICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSk7CisJc3RydWN0IGFkdV9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OworCWludCByZXR2YWwgPSAtRU5PREVWOworCWludCBpbl9lbmRfc2l6ZTsKKwlpbnQgb3V0X2VuZF9zaXplOworCWludCBpOworCisJZGJnKDIsIiAlcyA6IGVudGVyIiwgX19GVU5DVElPTl9fKTsKKworCWlmICh1ZGV2ID09IE5VTEwpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJ1ZGV2IGlzIE5VTEwuXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3VyIGRldmljZSBzdGF0ZSBhbmQgaW50aWFsaXplIGl0ICovCisJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFkdV9kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCWluaXRfTVVURVgoJmRldi0+c2VtKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LT5idWZsb2NrKTsKKwlkZXYtPnVkZXYgPSB1ZGV2OworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+cmVhZF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPndyaXRlX3dhaXQpOworCisJaWZhY2VfZGVzYyA9ICZpbnRlcmZhY2UtPmFsdHNldHRpbmdbMF07CisKKwkvKiBzZXQgdXAgdGhlIGVuZHBvaW50IGluZm9ybWF0aW9uICovCisJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgKytpKSB7CisJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CisKKwkJaWYgKHVzYl9lbmRwb2ludF9pc19pbnRfaW4oZW5kcG9pbnQpKQorCQkJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQgPSBlbmRwb2ludDsKKworCQlpZiAodXNiX2VuZHBvaW50X2lzX2ludF9vdXQoZW5kcG9pbnQpKQorCQkJZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50ID0gZW5kcG9pbnQ7CisJfQorCWlmIChkZXYtPmludGVycnVwdF9pbl9lbmRwb2ludCA9PSBOVUxMKSB7CisJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiaW50ZXJydXB0IGluIGVuZHBvaW50IG5vdCBmb3VuZFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgImludGVycnVwdCBvdXQgZW5kcG9pbnQgbm90IGZvdW5kXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpbl9lbmRfc2l6ZSA9IGxlMTZfdG9fY3B1KGRldi0+aW50ZXJydXB0X2luX2VuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJb3V0X2VuZF9zaXplID0gbGUxNl90b19jcHUoZGV2LT5pbnRlcnJ1cHRfb3V0X2VuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisKKwlkZXYtPnJlYWRfYnVmZmVyX3ByaW1hcnkgPSBrbWFsbG9jKCg0ICogaW5fZW5kX3NpemUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+cmVhZF9idWZmZXJfcHJpbWFyeSkgeworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIHJlYWRfYnVmZmVyX3ByaW1hcnlcbiIpOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KKworCS8qIGRlYnVnIGNvZGUgcHJpbWUgdGhlIGJ1ZmZlciAqLworCW1lbXNldChkZXYtPnJlYWRfYnVmZmVyX3ByaW1hcnksICdhJywgaW5fZW5kX3NpemUpOworCW1lbXNldChkZXYtPnJlYWRfYnVmZmVyX3ByaW1hcnkgKyBpbl9lbmRfc2l6ZSwgJ2InLCBpbl9lbmRfc2l6ZSk7CisJbWVtc2V0KGRldi0+cmVhZF9idWZmZXJfcHJpbWFyeSArICgyICogaW5fZW5kX3NpemUpLCAnYycsIGluX2VuZF9zaXplKTsKKwltZW1zZXQoZGV2LT5yZWFkX2J1ZmZlcl9wcmltYXJ5ICsgKDMgKiBpbl9lbmRfc2l6ZSksICdkJywgaW5fZW5kX3NpemUpOworCisJZGV2LT5yZWFkX2J1ZmZlcl9zZWNvbmRhcnkgPSBrbWFsbG9jKCg0ICogaW5fZW5kX3NpemUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+cmVhZF9idWZmZXJfc2Vjb25kYXJ5KSB7CisJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgcmVhZF9idWZmZXJfc2Vjb25kYXJ5XG4iKTsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBkZWJ1ZyBjb2RlIHByaW1lIHRoZSBidWZmZXIgKi8KKwltZW1zZXQoZGV2LT5yZWFkX2J1ZmZlcl9zZWNvbmRhcnksICdlJywgaW5fZW5kX3NpemUpOworCW1lbXNldChkZXYtPnJlYWRfYnVmZmVyX3NlY29uZGFyeSArIGluX2VuZF9zaXplLCAnZicsIGluX2VuZF9zaXplKTsKKwltZW1zZXQoZGV2LT5yZWFkX2J1ZmZlcl9zZWNvbmRhcnkgKyAoMiAqIGluX2VuZF9zaXplKSwgJ2cnLCBpbl9lbmRfc2l6ZSk7CisJbWVtc2V0KGRldi0+cmVhZF9idWZmZXJfc2Vjb25kYXJ5ICsgKDMgKiBpbl9lbmRfc2l6ZSksICdoJywgaW5fZW5kX3NpemUpOworCisJZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyID0ga21hbGxvYyhpbl9lbmRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl9idWZmZXIpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fYnVmZmVyXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBkZWJ1ZyBjb2RlIHByaW1lIHRoZSBidWZmZXIgKi8KKwltZW1zZXQoZGV2LT5pbnRlcnJ1cHRfaW5fYnVmZmVyLCAnaScsIGluX2VuZF9zaXplKTsKKworCWRldi0+aW50ZXJydXB0X2luX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYtPmludGVycnVwdF9pbl91cmIpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfaW5fdXJiXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisJZGV2LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciA9IGttYWxsb2Mob3V0X2VuZF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldi0+aW50ZXJydXB0X291dF9idWZmZXIpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X2J1ZmZlclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRldi0+aW50ZXJydXB0X291dF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghZGV2LT5pbnRlcnJ1cHRfb3V0X3VyYikgeworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIkNvdWxkbid0IGFsbG9jYXRlIGludGVycnVwdF9vdXRfdXJiXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoIXVzYl9zdHJpbmcodWRldiwgdWRldi0+ZGVzY3JpcHRvci5pU2VyaWFsTnVtYmVyLCBkZXYtPnNlcmlhbF9udW1iZXIsCisJCQlzaXplb2YoZGV2LT5zZXJpYWxfbnVtYmVyKSkpIHsKKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJDb3VsZCBub3QgcmV0cmlldmUgc2VyaWFsIG51bWJlclxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCWRiZygyLCIgJXMgOiBzZXJpYWxfbnVtYmVyPSVzIiwgX19GVU5DVElPTl9fLCBkZXYtPnNlcmlhbF9udW1iZXIpOworCisJLyogd2UgY2FuIHJlZ2lzdGVyIHRoZSBkZXZpY2Ugbm93LCBhcyBpdCBpcyByZWFkeSAqLworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBkZXYpOworCisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2RldihpbnRlcmZhY2UsICZhZHVfY2xhc3MpOworCisJaWYgKHJldHZhbCkgeworCQkvKiBzb21ldGhpbmcgcHJldmVudGVkIHVzIGZyb20gcmVnaXN0ZXJpbmcgdGhpcyBkcml2ZXIgKi8KKwkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuXG4iKTsKKwkJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCQlnb3RvIGVycm9yOworCX0KKworCWRldi0+bWlub3IgPSBpbnRlcmZhY2UtPm1pbm9yOworCisJLyogbGV0IHRoZSB1c2VyIGtub3cgd2hhdCBub2RlIHRoaXMgZGV2aWNlIGlzIG5vdyBhdHRhY2hlZCB0byAqLworCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIkFEVSVkICVzIG5vdyBhdHRhY2hlZCB0byAvZGV2L3VzYi9hZHV0dXglZCIsCisJCSB1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCwgZGV2LT5zZXJpYWxfbnVtYmVyLAorCQkgKGRldi0+bWlub3IgLSBBRFVfTUlOT1JfQkFTRSkpOworZXhpdDoKKwlkYmcoMiwiICVzIDogbGVhdmUsIHJldHVybiB2YWx1ZSAlcCAoZGV2KSIsIF9fRlVOQ1RJT05fXywgZGV2KTsKKworCXJldHVybiByZXR2YWw7CisKK2Vycm9yOgorCWFkdV9kZWxldGUoZGV2KTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGFkdV9kaXNjb25uZWN0CisgKgorICogQ2FsbGVkIGJ5IHRoZSB1c2IgY29yZSB3aGVuIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0uCisgKi8KK3N0YXRpYyB2b2lkIGFkdV9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJc3RydWN0IGFkdV9kZXZpY2UgKmRldjsKKwlpbnQgbWlub3I7CisKKwlkYmcoMiwiICVzIDogZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCisJbXV0ZXhfbG9jaygmZGlzY29ubmVjdF9tdXRleCk7IC8qIG5vdCBpbnRlcnJ1cHRpYmxlICovCisKKwlkZXYgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCisJZG93bigmZGV2LT5zZW0pOyAvKiBub3QgaW50ZXJydXB0aWJsZSAqLworCisJbWlub3IgPSBkZXYtPm1pbm9yOworCisJLyogZ2l2ZSBiYWNrIG91ciBtaW5vciAqLworCXVzYl9kZXJlZ2lzdGVyX2RldihpbnRlcmZhY2UsICZhZHVfY2xhc3MpOworCWRldi0+bWlub3IgPSAwOworCisJLyogaWYgdGhlIGRldmljZSBpcyBub3Qgb3BlbmVkLCB0aGVuIHdlIGNsZWFuIHVwIHJpZ2h0IG5vdyAqLworCWRiZygyLCIgJXMgOiBvcGVuIGNvdW50ICVkIiwgX19GVU5DVElPTl9fLCBkZXYtPm9wZW5fY291bnQpOworCWlmICghZGV2LT5vcGVuX2NvdW50KSB7CisJCXVwKCZkZXYtPnNlbSk7CisJCWFkdV9kZWxldGUoZGV2KTsKKwl9IGVsc2UgeworCQlkZXYtPnVkZXYgPSBOVUxMOworCQl1cCgmZGV2LT5zZW0pOworCX0KKworCW11dGV4X3VubG9jaygmZGlzY29ubmVjdF9tdXRleCk7CisKKwlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJBRFUgZGV2aWNlIGFkdXR1eCVkIG5vdyBkaXNjb25uZWN0ZWQiLAorCQkgKG1pbm9yIC0gQURVX01JTk9SX0JBU0UpKTsKKworCWRiZygyLCIgJXMgOiBsZWF2ZSIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKy8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBhZHVfZHJpdmVyID0geworCS5uYW1lID0gImFkdXR1eCIsCisJLnByb2JlID0gYWR1X3Byb2JlLAorCS5kaXNjb25uZWN0ID0gYWR1X2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0gZGV2aWNlX3RhYmxlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWR1X2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJZGJnKDIsIiAlcyA6IGVudGVyIiwgX19GVU5DVElPTl9fKTsKKworCS8qIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwlyZXN1bHQgPSB1c2JfcmVnaXN0ZXIoJmFkdV9kcml2ZXIpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZCBmb3IgdGhlICJfX0ZJTEVfXyIgZHJpdmVyLiAiCisJCSAgICAiRXJyb3IgbnVtYmVyICVkIiwgcmVzdWx0KTsKKwkJZ290byBleGl0OworCX0KKworCWluZm8oImFkdXR1eCAiIERSSVZFUl9ERVNDICIgIiBEUklWRVJfVkVSU0lPTik7CisJaW5mbygiYWR1dHV4IGlzIGFuIGV4cGVyaW1lbnRhbCBkcml2ZXIuIFVzZSBhdCB5b3VyIG93biByaXNrIik7CisKK2V4aXQ6CisJZGJnKDIsIiAlcyA6IGxlYXZlLCByZXR1cm4gdmFsdWUgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWR1X2V4aXQodm9pZCkKK3sKKwlkYmcoMiwiICVzIDogZW50ZXIiLCBfX0ZVTkNUSU9OX18pOworCS8qIGRlcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgVVNCIHN1YnN5c3RlbSAqLworCXVzYl9kZXJlZ2lzdGVyKCZhZHVfZHJpdmVyKTsKKwlkYmcoMiwiICVzIDogbGVhdmUiLCBfX0ZVTkNUSU9OX18pOworfQorCittb2R1bGVfaW5pdChhZHVfaW5pdCk7Cittb2R1bGVfZXhpdChhZHVfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9hdWVyc3dhbGQuYyBiL2RyaXZlcnMvdXNiL21pc2MvYXVlcnN3YWxkLmMKaW5kZXggMWZlZjM2ZS4uNGZkMjExMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9hdWVyc3dhbGQuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2F1ZXJzd2FsZC5jCkBAIC04MDYsNyArODA2LDcgQEAKIDAJCUluaXRpYWwsIE9LCiAtRUlOUFJPR1JFU1MJZHVyaW5nIHN1Ym1pc3Npb24gdW50aWwgZW5kCiAtRU5PRU5UCQlpZiB1cmIgaXMgdW5saW5rZWQKLS1FVElNRURPVVQJVHJhbnNmZXIgdGltZWQgb3V0LCBOQUsKKy1FVElNRQkJRGV2aWNlIGRpZCBub3QgcmVzcG9uZAogLUVOT01FTQkJTWVtb3J5IE92ZXJmbG93CiAtRU5PREVWCQlTcGVjaWZpZWQgVVNCLWRldmljZSBvciBidXMgZG9lc24ndCBleGlzdAogLUVOWElPCQlVUkIgYWxyZWFkeSBxdWV1ZWQKQEAgLTgzMiw3ICs4MzIsNyBAQAogewogCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSAwOgotCWNhc2UgLUVUSU1FRE9VVDoKKwljYXNlIC1FVElNRToKIAljYXNlIC1FT1ZFUkZMT1c6CiAJY2FzZSAtRUFHQUlOOgogCWNhc2UgLUVQSVBFOgpAQCAtMTg1OCw3ICsxODU4LDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qIEZpbGUgb3BlcmF0aW9uIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWVyc3dhbGRfZm9wcyA9CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdWVyc3dhbGRfZm9wcyA9CiB7CiAJLm93bmVyID0JVEhJU19NT0RVTEUsCiAJLmxsc2VlayA9CW5vX2xsc2VlaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvY3lwcmVzc19jeTdjNjMuYyBiL2RyaXZlcnMvdXNiL21pc2MvY3lwcmVzc19jeTdjNjMuYwppbmRleCA5YzQ2NzQ2Li5iNjNiNWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2N5cHJlc3NfY3k3YzYzLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9jeXByZXNzX2N5N2M2My5jCkBAIC0yMDksNyArMjA5LDcgQEAKIAlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRldiA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeSFcbiIpOwotCQlnb3RvIGVycm9yOworCQlnb3RvIGVycm9yX21lbTsKIAl9CiAKIAlkZXYtPnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOwpAQCAtMjE4LDE1ICsyMTgsMjYgQEAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgZGV2KTsKIAogCS8qIGNyZWF0ZSBkZXZpY2UgYXR0cmlidXRlIGZpbGVzICovCi0JZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3BvcnQwKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfcG9ydDEpOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9wb3J0MCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcjsKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfcG9ydDEpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3I7CiAKIAkvKiBsZXQgdGhlIHVzZXIga25vdyB0aGF0IHRoZSBkZXZpY2UgaXMgbm93IGF0dGFjaGVkICovCiAJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LAogCQkgIkN5cHJlc3MgQ1k3QzYzeHh4IGRldmljZSBub3cgYXR0YWNoZWRcbiIpOworCXJldHVybiAwOwogCi0JcmV0dmFsID0gMDsKIGVycm9yOgorCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9wb3J0MCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3BvcnQxKTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisJdXNiX3B1dF9kZXYoZGV2LT51ZGV2KTsKKwlrZnJlZShkZXYpOworCitlcnJvcl9tZW06CiAJcmV0dXJuIHJldHZhbDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9jeXRoZXJtLmMgYi9kcml2ZXJzL3VzYi9taXNjL2N5dGhlcm0uYwppbmRleCBiMjBiZWM0Li4wNGU4N2FjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2N5dGhlcm0uYworKysgYi9kcml2ZXJzL3VzYi9taXNjL2N5dGhlcm0uYwpAQCAtMzUzLDcgKzM1Myw3IEBACiAJZGV2ID0ga3phbGxvYyAoc2l6ZW9mKHN0cnVjdCB1c2JfY3l0aGVybSksIEdGUF9LRVJORUwpOwogCWlmIChkZXYgPT0gTlVMTCkgewogCQlkZXZfZXJyICgmaW50ZXJmYWNlLT5kZXYsICJPdXQgb2YgbWVtb3J5XG4iKTsKLQkJZ290byBlcnJvcjsKKwkJZ290byBlcnJvcl9tZW07CiAJfQogCiAJZGV2LT51ZGV2ID0gdXNiX2dldF9kZXYodWRldik7CkBAIC0zNjIsMTggKzM2MiwzNSBAQAogCiAJZGV2LT5icmlnaHRuZXNzID0gMHhGRjsKIAotCWRldmljZV9jcmVhdGVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9icmlnaHRuZXNzKTsgICAKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfdGVtcCk7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2J1dHRvbik7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3BvcnQwKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfcG9ydDEpOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9icmlnaHRuZXNzKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm9yOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl90ZW1wKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm9yOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9idXR0b24pOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3I7CisJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3BvcnQwKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycm9yOworCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9wb3J0MSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcjsKIAotCWRldl9pbmZvICgmaW50ZXJmYWNlLT5kZXYsIAorCWRldl9pbmZvICgmaW50ZXJmYWNlLT5kZXYsCiAJCSAgIkN5cHJlc3MgdGhlcm1vbWV0ZXIgZGV2aWNlIG5vdyBhdHRhY2hlZFxuIik7CiAJcmV0dXJuIDA7Ci0KLSBlcnJvcjoKK2Vycm9yOgorCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9icmlnaHRuZXNzKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfdGVtcCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2J1dHRvbik7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3BvcnQwKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfcG9ydDEpOworCXVzYl9zZXRfaW50ZmRhdGEgKGludGVyZmFjZSwgTlVMTCk7CisJdXNiX3B1dF9kZXYoZGV2LT51ZGV2KTsKIAlrZnJlZShkZXYpOworZXJyb3JfbWVtOgogCXJldHVybiByZXR2YWw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvZnRkaS1lbGFuLmMgYi9kcml2ZXJzL3VzYi9taXNjL2Z0ZGktZWxhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OGEwOTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9taXNjL2Z0ZGktZWxhbi5jCkBAIC0wLDAgKzEsMjgwOSBAQAorLyoKKyogVVNCIEZUREkgY2xpZW50IGRyaXZlciBmb3IgRWxhbiBEaWdpdGFsIFN5c3RlbXMncyBVeHh4IGFkYXB0ZXJzCisqCisqIENvcHlyaWdodChDKSAyMDA2IEVsYW4gRGlnaXRhbCBTeXN0ZW1zIExpbWl0ZWQKKyogaHR0cDovL3d3dy5lbGFuZGlnaXRhbHN5c3RlbXMuY29tCisqCisqIEF1dGhvciBhbmQgTWFpbnRhaW5lciAtIFRvbnkgT2xlY2ggLSBFbGFuIERpZ2l0YWwgU3lzdGVtcworKiB0b255Lm9sZWNoQGVsYW5kaWdpdGFsc3lzdGVtcy5jb20KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisqCisqCisqIFRoaXMgZHJpdmVyIHdhcyB3cml0dGVuIGJ5IFRvbnkgT2xlY2godG9ueS5vbGVjaEBlbGFuZGlnaXRhbHN5c3RlbXMuY29tKQorKiBiYXNlZCBvbiB2YXJpb3VzIFVTQiBjbGllbnQgZHJpdmVycyBpbiB0aGUgMi42LjE1IGxpbnV4IGtlcm5lbAorKiB3aXRoIGNvbnN0YW50IHJlZmVyZW5jZSB0byB0aGUgM3JkIEVkaXRpb24gb2YgTGludXggRGV2aWNlIERyaXZlcnMKKyogcHVibGlzaGVkIGJ5IE8nUmVpbGx5CisqCisqIFRoZSBVMTMyIGFkYXB0ZXIgaXMgYSBVU0IgdG8gQ2FyZEJ1cyBhZGFwdGVyIHNwZWNpZmljYWxseSBkZXNpZ25lZAorKiBmb3IgUEMgY2FyZHMgdGhhdCBjb250YWluIGFuIE9IQ0kgaG9zdCBjb250cm9sbGVyLiBUeXBpY2FsIFBDIGNhcmRzCisqIGFyZSB0aGUgT3JhbmdlIE1vYmlsZSAzRyBPcHRpb24gR2xvYmVUcm90dGVyIEZ1c2lvbiBjYXJkLgorKgorKiBUaGUgVTEzMiBhZGFwdGVyIHdpbGwgKk5PVCAqd29yayB3aXRoIFBDIGNhcmRzIHRoYXQgZG8gbm90IGNvbnRhaW4KKyogYW4gT0hDSSBjb250cm9sbGVyLiBBIHNpbXBsZSB3YXkgdG8gdGVzdCB3aGV0aGVyIGEgUEMgY2FyZCBoYXMgYW4KKyogT0hDSSBjb250cm9sbGVyIGFzIGFuIGludGVyZmFjZSBpcyB0byBpbnNlcnQgdGhlIFBDIGNhcmQgZGlyZWN0bHkKKyogaW50byBhIGxhcHRvcChvciBkZXNrdG9wKSB3aXRoIGEgQ2FyZEJ1cyBzbG90IGFuZCBpZiAibHNwY2kiIHNob3dzCisqIGEgbmV3IFVTQiBjb250cm9sbGVyIGFuZCAibHN1c2IgLXYiIHNob3dzIGEgbmV3IE9IQ0kgSG9zdCBDb250cm9sbGVyCisqIHRoZW4gdGhlcmUgaXMgYSBnb29kIGNoYW5jZSB0aGF0IHRoZSBVMTMyIGFkYXB0ZXIgd2lsbCBzdXBwb3J0IHRoZQorKiBQQyBjYXJkLih5b3UgYWxzbyBuZWVkIHRoZSBzcGVjaWZpYyBjbGllbnQgZHJpdmVyIGZvciB0aGUgUEMgY2FyZCkKKyoKKyogUGxlYXNlIGluZm9ybSB0aGUgQXV0aG9yIGFuZCBNYWludGFpbmVyIGFib3V0IGFueSBQQyBjYXJkcyB0aGF0CisqIGNvbnRhaW4gT0hDSSBIb3N0IENvbnRyb2xsZXIgYW5kIHdvcmsgd2hlbiBkaXJlY3RseSBjb25uZWN0ZWQgdG8KKyogYW4gZW1iZWRkZWQgQ2FyZEJ1cyBzbG90IGJ1dCBkbyBub3Qgd29yayB3aGVuIHRoZXkgYXJlIGNvbm5lY3RlZAorKiB2aWEgYW4gRUxBTiBVMTMyIGFkYXB0ZXIuCisqCisqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KK01PRFVMRV9BVVRIT1IoIlRvbnkgT2xlY2giKTsKK01PRFVMRV9ERVNDUklQVElPTigiRlRESSBFTEFOIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworI2RlZmluZSBJTlRfTU9EVUxFX1BBUk0obiwgdikgc3RhdGljIGludCBuID0gdjttb2R1bGVfcGFyYW0obiwgaW50LCAwNDQ0KQorZXh0ZXJuIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdTEzMl9wbGF0Zm9ybV9kcml2ZXI7CitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnN0YXR1c19xdWV1ZTsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqY29tbWFuZF9xdWV1ZTsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcmVzcG9uZF9xdWV1ZTsKKy8qCisqIGZ0ZGlfbW9kdWxlX2xvY2sgZXhpc3RzIHRvIHByb3RlY3QgYWNjZXNzIHRvIGdsb2JhbCB2YXJpYWJsZXMKKyoKKyovCitzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBmdGRpX21vZHVsZV9sb2NrOworc3RhdGljIGludCBmdGRpX2luc3RhbmNlcyA9IDA7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBmdGRpX3N0YXRpY19saXN0OworLyoKKyogZW5kIG9mIHRoZSBnbG9iYWwgdmFyaWFibGVzIHByb3RlY3RlZCBieSBmdGRpX21vZHVsZV9sb2NrCisqLworI2luY2x1ZGUgInVzYl91MTMyLmgiCisjZGVmaW5lIFREX0RFVk5PVFJFU1AgNQorLyogRGVmaW5lIHRoZXNlIHZhbHVlcyB0byBtYXRjaCB5b3VyIGRldmljZXMqLworI2RlZmluZSBVU0JfRlRESV9FTEFOX1ZFTkRPUl9JRCAweDA0MDMKKyNkZWZpbmUgVVNCX0ZURElfRUxBTl9QUk9EVUNUX0lEIDB4ZDZlYQorLyogdGFibGUgb2YgZGV2aWNlcyB0aGF0IHdvcmsgd2l0aCB0aGlzIGRyaXZlciovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZnRkaV9lbGFuX3RhYmxlW10gPSB7CisgICAgICAgIHtVU0JfREVWSUNFKFVTQl9GVERJX0VMQU5fVkVORE9SX0lELCBVU0JfRlRESV9FTEFOX1BST0RVQ1RfSUQpfSwKKyAgICAgICAgeyAvKiBUZXJtaW5hdGluZyBlbnRyeSAqLyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZnRkaV9lbGFuX3RhYmxlKTsKKy8qIG9ubHkgdGhlIGp0YWcoZmlybXdhcmUgdXBncmFkZSBkZXZpY2UpIGludGVyZmFjZSByZXF1aXJlcworKiBhIGRldmljZSBmaWxlIGFuZCBjb3JyZXNwb25kaW5nIG1pbm9yIG51bWJlciwgYnV0IHRoZQorKiBpbnRlcmZhY2UgaXMgY3JlYXRlZCB1bmNvbmRpdGlvbmFsbHkgLSBJIHN1cHBvc2UgaXQgY291bGQKKyogYmUgY29uZmlndXJlZCBvciBub3QgYWNjb3JkaW5nIHRvIGEgbW9kdWxlIHBhcmFtZXRlci4KKyogQnV0IHNpbmNlIHdlKG5vdykgcmVxdWlyZSBvbmUgaW50ZXJmYWNlIHBlciBkZXZpY2UsCisqIGFuZCBzaW5jZSBpdCB1bmxpa2VseSB0aGF0IGEgbm9ybWFsIGluc3RhbGxhdGlvbiB3b3VsZAorKiByZXF1aXJlIG1vcmUgdGhhbiBhIGNvdXBsZSBvZiBlbGFuLWZ0ZGkgZGV2aWNlcywgOCBzZWVtcworKiBsaWtlIGEgcmVhc29uYWJsZSBsaW1pdCB0byBoYXZlIGhlcmUsIGFuZCBpZiBzb21lb25lCisqIHJlYWxseSByZXF1aXJlcyBtb3JlIHRoYW4gOCBkZXZpY2VzLCB0aGVuIHRoZXkgY2FuIGZyaWcgdGhlCisqIGNvZGUgYW5kIHJlY29tcGlsZQorKi8KKyNkZWZpbmUgVVNCX0ZURElfRUxBTl9NSU5PUl9CQVNFIDE5MgorI2RlZmluZSBDT01NQU5EX0JJVFMgNQorI2RlZmluZSBDT01NQU5EX1NJWkUgKDE8PENPTU1BTkRfQklUUykKKyNkZWZpbmUgQ09NTUFORF9NQVNLIChDT01NQU5EX1NJWkUtMSkKK3N0cnVjdCB1MTMyX2NvbW1hbmQgeworICAgICAgICB1OCBoZWFkZXI7CisgICAgICAgIHUxNiBsZW5ndGg7CisgICAgICAgIHU4IGFkZHJlc3M7CisgICAgICAgIHU4IHdpZHRoOworICAgICAgICB1MzIgdmFsdWU7CisgICAgICAgIGludCBmb2xsb3dzOworICAgICAgICB2b2lkICpidWZmZXI7Cit9OworI2RlZmluZSBSRVNQT05EX0JJVFMgNQorI2RlZmluZSBSRVNQT05EX1NJWkUgKDE8PFJFU1BPTkRfQklUUykKKyNkZWZpbmUgUkVTUE9ORF9NQVNLIChSRVNQT05EX1NJWkUtMSkKK3N0cnVjdCB1MTMyX3Jlc3BvbmQgeworICAgICAgICB1OCBoZWFkZXI7CisgICAgICAgIHU4IGFkZHJlc3M7CisgICAgICAgIHUzMiAqdmFsdWU7CisgICAgICAgIGludCAqcmVzdWx0OworICAgICAgICBzdHJ1Y3QgY29tcGxldGlvbiB3YWl0X2NvbXBsZXRpb247Cit9Oworc3RydWN0IHUxMzJfdGFyZ2V0IHsKKyAgICAgICAgdm9pZCAqZW5kcDsKKyAgICAgICAgc3RydWN0IHVyYiAqdXJiOworICAgICAgICBpbnQgdG9nZ2xlX2JpdHM7CisgICAgICAgIGludCBlcnJvcl9jb3VudDsKKyAgICAgICAgaW50IGNvbmRpdGlvbl9jb2RlOworICAgICAgICBpbnQgcmVwZWF0X251bWJlcjsKKyAgICAgICAgaW50IGhhbHRlZDsKKyAgICAgICAgaW50IHNraXBwZWQ7CisgICAgICAgIGludCBhY3R1YWw7CisgICAgICAgIGludCBub25fbnVsbDsKKyAgICAgICAgaW50IGFjdGl2ZTsKKyAgICAgICAgaW50IGFiYW5kb25pbmc7CisgICAgICAgIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggKmJ1ZiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLAorICAgICAgICAgICAgICAgIGludCByZXBlYXRfbnVtYmVyLCBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwKKyAgICAgICAgICAgICAgICBpbnQgbm9uX251bGwpOworfTsKKy8qIFN0cnVjdHVyZSB0byBob2xkIGFsbCBvZiBvdXIgZGV2aWNlIHNwZWNpZmljIHN0dWZmKi8KK3N0cnVjdCB1c2JfZnRkaSB7CisgICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgZnRkaV9saXN0OworICAgICAgICBzdHJ1Y3Qgc2VtYXBob3JlIHUxMzJfbG9jazsKKyAgICAgICAgaW50IGNvbW1hbmRfbmV4dDsKKyAgICAgICAgaW50IGNvbW1hbmRfaGVhZDsKKyAgICAgICAgc3RydWN0IHUxMzJfY29tbWFuZCBjb21tYW5kW0NPTU1BTkRfU0laRV07CisgICAgICAgIGludCByZXNwb25kX25leHQ7CisgICAgICAgIGludCByZXNwb25kX2hlYWQ7CisgICAgICAgIHN0cnVjdCB1MTMyX3Jlc3BvbmQgcmVzcG9uZFtSRVNQT05EX1NJWkVdOworICAgICAgICBzdHJ1Y3QgdTEzMl90YXJnZXQgdGFyZ2V0WzRdOworICAgICAgICBjaGFyIGRldmljZV9uYW1lWzE2XTsKKyAgICAgICAgdW5zaWduZWQgc3luY2hyb25pemVkOjE7CisgICAgICAgIHVuc2lnbmVkIGVudW1lcmF0ZWQ6MTsKKyAgICAgICAgdW5zaWduZWQgcmVnaXN0ZXJlZDoxOworICAgICAgICB1bnNpZ25lZCBpbml0aWFsaXplZDoxOworICAgICAgICB1bnNpZ25lZCBjYXJkX2VqZWN0ZWQ6MTsKKyAgICAgICAgaW50IGZ1bmN0aW9uOworICAgICAgICBpbnQgc2VxdWVuY2VfbnVtOworICAgICAgICBpbnQgZGlzY29ubmVjdGVkOworICAgICAgICBpbnQgZ29uZV9hd2F5OworICAgICAgICBpbnQgc3R1Y2tfc3RhdHVzOworICAgICAgICBpbnQgc3RhdHVzX3F1ZXVlX2RlbGF5OworICAgICAgICBzdHJ1Y3Qgc2VtYXBob3JlIHN3X2xvY2s7CisgICAgICAgIHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OworICAgICAgICBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworICAgICAgICBzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciAqY2xhc3M7CisgICAgICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBzdGF0dXNfd29yazsKKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IGNvbW1hbmRfd29yazsKKyAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IHJlc3BvbmRfd29yazsKKyAgICAgICAgc3RydWN0IHUxMzJfcGxhdGZvcm1fZGF0YSBwbGF0Zm9ybV9kYXRhOworICAgICAgICBzdHJ1Y3QgcmVzb3VyY2UgcmVzb3VyY2VzWzBdOworICAgICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBsYXRmb3JtX2RldjsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqYnVsa19pbl9idWZmZXI7CisgICAgICAgIHNpemVfdCBidWxrX2luX3NpemU7CisgICAgICAgIHNpemVfdCBidWxrX2luX2xhc3Q7CisgICAgICAgIHNpemVfdCBidWxrX2luX2xlZnQ7CisgICAgICAgIF9fdTggYnVsa19pbl9lbmRwb2ludEFkZHI7CisgICAgICAgIF9fdTggYnVsa19vdXRfZW5kcG9pbnRBZGRyOworICAgICAgICBzdHJ1Y3Qga3JlZiBrcmVmOworICAgICAgICB1MzIgY29udHJvbHJlZzsKKyAgICAgICAgdTggcmVzcG9uc2VbNCArIDEwMjRdOworICAgICAgICBpbnQgZXhwZWN0ZWQ7CisgICAgICAgIGludCByZWNpZXZlZDsKKyAgICAgICAgaW50IGVkX2ZvdW5kOworfTsKKyNkZWZpbmUga3JlZl90b191c2JfZnRkaShkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHVzYl9mdGRpLCBrcmVmKQorI2RlZmluZSBwbGF0Zm9ybV9kZXZpY2VfdG9fdXNiX2Z0ZGkoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCB1c2JfZnRkaSwgXAorICAgICAgICBwbGF0Zm9ybV9kZXYpCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZnRkaV9lbGFuX2RyaXZlcjsKK3N0YXRpYyB2b2lkIGZ0ZGlfZWxhbl9kZWxldGUoc3RydWN0IGtyZWYgKmtyZWYpCit7CisgICAgICAgIHN0cnVjdCB1c2JfZnRkaSAqZnRkaSA9IGtyZWZfdG9fdXNiX2Z0ZGkoa3JlZik7CisgICAgICAgIGRldl93YXJuKCZmdGRpLT51ZGV2LT5kZXYsICJGUkVFSU5HIGZ0ZGk9JXBcbiIsIGZ0ZGkpOworICAgICAgICB1c2JfcHV0X2RldihmdGRpLT51ZGV2KTsKKyAgICAgICAgZnRkaS0+ZGlzY29ubmVjdGVkICs9IDE7CisgICAgICAgIGRvd24oJmZ0ZGlfbW9kdWxlX2xvY2spOworICAgICAgICBsaXN0X2RlbF9pbml0KCZmdGRpLT5mdGRpX2xpc3QpOworICAgICAgICBmdGRpX2luc3RhbmNlcyAtPSAxOworICAgICAgICB1cCgmZnRkaV9tb2R1bGVfbG9jayk7CisgICAgICAgIGtmcmVlKGZ0ZGktPmJ1bGtfaW5fYnVmZmVyKTsKKyAgICAgICAgZnRkaS0+YnVsa19pbl9idWZmZXIgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBmdGRpX2VsYW5fcHV0X2tyZWYoc3RydWN0IHVzYl9mdGRpICpmdGRpKQoreworICAgICAgICBrcmVmX3B1dCgmZnRkaS0+a3JlZiwgZnRkaV9lbGFuX2RlbGV0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGZ0ZGlfZWxhbl9nZXRfa3JlZihzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpCit7CisgICAgICAgIGtyZWZfZ2V0KCZmdGRpLT5rcmVmKTsKK30KKworc3RhdGljIHZvaWQgZnRkaV9lbGFuX2luaXRfa3JlZihzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpCit7CisgICAgICAgIGtyZWZfaW5pdCgmZnRkaS0+a3JlZik7Cit9CisKK3N0YXRpYyB2b2lkIGZ0ZGlfc3RhdHVzX3JlcXVldWVfd29yayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksIHVuc2lnbmVkIGludCBkZWx0YSkKK3sKKyAgICAgICAgaWYgKGRlbHRhID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChxdWV1ZV9kZWxheWVkX3dvcmsoc3RhdHVzX3F1ZXVlLCAmZnRkaS0+c3RhdHVzX3dvcmssIGRlbHRhKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChxdWV1ZV93b3JrKHN0YXR1c19xdWV1ZSwgJmZ0ZGktPnN0YXR1c193b3JrKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGtyZWZfcHV0KCZmdGRpLT5rcmVmLCBmdGRpX2VsYW5fZGVsZXRlKTsKKyAgICAgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBmdGRpX3N0YXR1c19xdWV1ZV93b3JrKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwgdW5zaWduZWQgaW50IGRlbHRhKQoreworICAgICAgICBpZiAoZGVsdGEgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayhzdGF0dXNfcXVldWUsICZmdGRpLT5zdGF0dXNfd29yaywgZGVsdGEpKQorICAgICAgICAgICAgICAgICAgICAgICAga3JlZl9nZXQoJmZ0ZGktPmtyZWYpOworICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlX3dvcmsoc3RhdHVzX3F1ZXVlLCAmZnRkaS0+c3RhdHVzX3dvcmspKQorICAgICAgICAgICAgICAgIGtyZWZfZ2V0KCZmdGRpLT5rcmVmKTsKKyAgICAgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBmdGRpX3N0YXR1c19jYW5jZWxfd29yayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpCit7CisgICAgICAgIGlmIChjYW5jZWxfZGVsYXllZF93b3JrKCZmdGRpLT5zdGF0dXNfd29yaykpCisgICAgICAgICAgICAgICAga3JlZl9wdXQoJmZ0ZGktPmtyZWYsIGZ0ZGlfZWxhbl9kZWxldGUpOworfQorCitzdGF0aWMgdm9pZCBmdGRpX2NvbW1hbmRfcmVxdWV1ZV93b3JrKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwgdW5zaWduZWQgaW50IGRlbHRhKQoreworICAgICAgICBpZiAoZGVsdGEgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayhjb21tYW5kX3F1ZXVlLCAmZnRkaS0+Y29tbWFuZF93b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlX3dvcmsoY29tbWFuZF9xdWV1ZSwgJmZ0ZGktPmNvbW1hbmRfd29yaykpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBrcmVmX3B1dCgmZnRkaS0+a3JlZiwgZnRkaV9lbGFuX2RlbGV0ZSk7CisgICAgICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgZnRkaV9jb21tYW5kX3F1ZXVlX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpLCB1bnNpZ25lZCBpbnQgZGVsdGEpCit7CisgICAgICAgIGlmIChkZWx0YSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocXVldWVfZGVsYXllZF93b3JrKGNvbW1hbmRfcXVldWUsICZmdGRpLT5jb21tYW5kX3dvcmssCisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSkpCisgICAgICAgICAgICAgICAgICAgICAgICBrcmVmX2dldCgmZnRkaS0+a3JlZik7CisgICAgICAgIH0gZWxzZSBpZiAocXVldWVfd29yayhjb21tYW5kX3F1ZXVlLCAmZnRkaS0+Y29tbWFuZF93b3JrKSkKKyAgICAgICAgICAgICAgICBrcmVmX2dldCgmZnRkaS0+a3JlZik7CisgICAgICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgZnRkaV9jb21tYW5kX2NhbmNlbF93b3JrKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSkKK3sKKyAgICAgICAgaWYgKGNhbmNlbF9kZWxheWVkX3dvcmsoJmZ0ZGktPmNvbW1hbmRfd29yaykpCisgICAgICAgICAgICAgICAga3JlZl9wdXQoJmZ0ZGktPmtyZWYsIGZ0ZGlfZWxhbl9kZWxldGUpOworfQorCitzdGF0aWMgdm9pZCBmdGRpX3Jlc3BvbnNlX3JlcXVldWVfd29yayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksCisgICAgICAgIHVuc2lnbmVkIGludCBkZWx0YSkKK3sKKyAgICAgICAgaWYgKGRlbHRhID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChxdWV1ZV9kZWxheWVkX3dvcmsocmVzcG9uZF9xdWV1ZSwgJmZ0ZGktPnJlc3BvbmRfd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChxdWV1ZV93b3JrKHJlc3BvbmRfcXVldWUsICZmdGRpLT5yZXNwb25kX3dvcmspKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAga3JlZl9wdXQoJmZ0ZGktPmtyZWYsIGZ0ZGlfZWxhbl9kZWxldGUpOworICAgICAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGZ0ZGlfcmVzcG9uZF9xdWV1ZV93b3JrKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwgdW5zaWduZWQgaW50IGRlbHRhKQoreworICAgICAgICBpZiAoZGVsdGEgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayhyZXNwb25kX3F1ZXVlLCAmZnRkaS0+cmVzcG9uZF93b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEpKQorICAgICAgICAgICAgICAgICAgICAgICAga3JlZl9nZXQoJmZ0ZGktPmtyZWYpOworICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlX3dvcmsocmVzcG9uZF9xdWV1ZSwgJmZ0ZGktPnJlc3BvbmRfd29yaykpCisgICAgICAgICAgICAgICAga3JlZl9nZXQoJmZ0ZGktPmtyZWYpOworICAgICAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGZ0ZGlfcmVzcG9uc2VfY2FuY2VsX3dvcmsoc3RydWN0IHVzYl9mdGRpICpmdGRpKQoreworICAgICAgICBpZiAoY2FuY2VsX2RlbGF5ZWRfd29yaygmZnRkaS0+cmVzcG9uZF93b3JrKSkKKyAgICAgICAgICAgICAgICBrcmVmX3B1dCgmZnRkaS0+a3JlZiwgZnRkaV9lbGFuX2RlbGV0ZSk7Cit9CisKK3ZvaWQgZnRkaV9lbGFuX2dvbmVfYXdheShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworICAgICAgICBzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkgPSBwbGF0Zm9ybV9kZXZpY2VfdG9fdXNiX2Z0ZGkocGRldik7CisgICAgICAgIGZ0ZGktPmdvbmVfYXdheSArPSAxOworICAgICAgICBmdGRpX2VsYW5fcHV0X2tyZWYoZnRkaSk7Cit9CisKKworRVhQT1JUX1NZTUJPTF9HUEwoZnRkaV9lbGFuX2dvbmVfYXdheSk7Cit2b2lkIGZ0ZGlfcmVsZWFzZV9wbGF0Zm9ybV9kZXYoc3RydWN0IGRldmljZSAqZGV2KQoreworICAgICAgICBkZXYtPnBhcmVudCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGZ0ZGlfZWxhbl9kb19jYWxsYmFjayhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksCisgICAgICAgIHN0cnVjdCB1MTMyX3RhcmdldCAqdGFyZ2V0LCB1OCAqYnVmZmVyLCBpbnQgbGVuZ3RoKTsKK3N0YXRpYyB2b2lkIGZ0ZGlfZWxhbl9raWNrX2NvbW1hbmRfcXVldWUoc3RydWN0IHVzYl9mdGRpICpmdGRpKTsKK3N0YXRpYyB2b2lkIGZ0ZGlfZWxhbl9raWNrX3Jlc3BvbmRfcXVldWUoc3RydWN0IHVzYl9mdGRpICpmdGRpKTsKK3N0YXRpYyBpbnQgZnRkaV9lbGFuX3NldHVwT0hDSShzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpOworc3RhdGljIGludCBmdGRpX2VsYW5fY2hlY2tpbmdQQ0koc3RydWN0IHVzYl9mdGRpICpmdGRpKTsKK3N0YXRpYyBpbnQgZnRkaV9lbGFuX2VudW1lcmF0ZVBDSShzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpOworc3RhdGljIGludCBmdGRpX2VsYW5fc3luY2hyb25pemUoc3RydWN0IHVzYl9mdGRpICpmdGRpKTsKK3N0YXRpYyBpbnQgZnRkaV9lbGFuX3N0dWNrX3dhaXRpbmcoc3RydWN0IHVzYl9mdGRpICpmdGRpKTsKK3N0YXRpYyBpbnQgZnRkaV9lbGFuX2NvbW1hbmRfZW5naW5lKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSk7CitzdGF0aWMgaW50IGZ0ZGlfZWxhbl9yZXNwb25kX2VuZ2luZShzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpOworc3RhdGljIGludCBmdGRpX2VsYW5faGNkX2luaXQoc3RydWN0IHVzYl9mdGRpICpmdGRpKQoreworICAgICAgICBpbnQgcmVzdWx0OworICAgICAgICBpZiAoZnRkaS0+cGxhdGZvcm1fZGV2LmRldi5wYXJlbnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgZnRkaV9lbGFuX2dldF9rcmVmKGZ0ZGkpOworICAgICAgICBmdGRpLT5wbGF0Zm9ybV9kYXRhLnBvdHBnID0gMTAwOworICAgICAgICBmdGRpLT5wbGF0Zm9ybV9kYXRhLnJlc2V0ID0gTlVMTDsKKyAgICAgICAgZnRkaS0+cGxhdGZvcm1fZGV2LmlkID0gZnRkaS0+c2VxdWVuY2VfbnVtOworICAgICAgICBmdGRpLT5wbGF0Zm9ybV9kZXYucmVzb3VyY2UgPSBmdGRpLT5yZXNvdXJjZXM7CisgICAgICAgIGZ0ZGktPnBsYXRmb3JtX2Rldi5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShmdGRpLT5yZXNvdXJjZXMpOworICAgICAgICBmdGRpLT5wbGF0Zm9ybV9kZXYuZGV2LnBsYXRmb3JtX2RhdGEgPSAmZnRkaS0+cGxhdGZvcm1fZGF0YTsKKyAgICAgICAgZnRkaS0+cGxhdGZvcm1fZGV2LmRldi5wYXJlbnQgPSBOVUxMOworICAgICAgICBmdGRpLT5wbGF0Zm9ybV9kZXYuZGV2LnJlbGVhc2UgPSBmdGRpX3JlbGVhc2VfcGxhdGZvcm1fZGV2OworICAgICAgICBmdGRpLT5wbGF0Zm9ybV9kZXYuZGV2LmRtYV9tYXNrID0gTlVMTDsKKyAgICAgICAgc25wcmludGYoZnRkaS0+ZGV2aWNlX25hbWUsIHNpemVvZihmdGRpLT5kZXZpY2VfbmFtZSksICJ1MTMyX2hjZCIpOworICAgICAgICBmdGRpLT5wbGF0Zm9ybV9kZXYubmFtZSA9IGZ0ZGktPmRldmljZV9uYW1lOworICAgICAgICBkZXZfaW5mbygmZnRkaS0+dWRldi0+ZGV2LCAicmVxdWVzdGluZyBtb2R1bGUgJyVzJ1xuIiwgInUxMzJfaGNkIik7CisgICAgICAgIHJlcXVlc3RfbW9kdWxlKCJ1MTMyX2hjZCIpOworICAgICAgICBkZXZfaW5mbygmZnRkaS0+dWRldi0+ZGV2LCAicmVnaXN0ZXJpbmcgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICBmdGRpLT5wbGF0Zm9ybV9kZXYubmFtZSk7CisgICAgICAgIHJlc3VsdCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmZnRkaS0+cGxhdGZvcm1fZGV2KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgZnRkaV9lbGFuX2FiYW5kb25fY29tcGxldGlvbnMoc3RydWN0IHVzYl9mdGRpICpmdGRpKQoreworICAgICAgICBkb3duKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICB3aGlsZSAoZnRkaS0+cmVzcG9uZF9uZXh0ID4gZnRkaS0+cmVzcG9uZF9oZWFkKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfcmVzcG9uZCAqcmVzcG9uZCA9ICZmdGRpLT5yZXNwb25kW1JFU1BPTkRfTUFTSyAmCisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5yZXNwb25kX2hlYWQrK107CisgICAgICAgICAgICAgICAgKnJlc3BvbmQtPnJlc3VsdCA9IC1FU0hVVERPV047CisgICAgICAgICAgICAgICAgKnJlc3BvbmQtPnZhbHVlID0gMDsKKyAgICAgICAgICAgICAgICBjb21wbGV0ZSgmcmVzcG9uZC0+d2FpdF9jb21wbGV0aW9uKTsKKyAgICAgICAgfSB1cCgmZnRkaS0+dTEzMl9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZnRkaV9lbGFuX2FiYW5kb25fdGFyZ2V0cyhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpCit7CisgICAgICAgIGludCBlZF9udW1iZXIgPSA0OworICAgICAgICBkb3duKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICB3aGlsZSAoZWRfbnVtYmVyLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdGFyZ2V0ICp0YXJnZXQgPSAmZnRkaS0+dGFyZ2V0W2VkX251bWJlcl07CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldC0+YWN0aXZlID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+Y29uZGl0aW9uX2NvZGUgPSBURF9ERVZOT1RSRVNQOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpX2VsYW5fZG9fY2FsbGJhY2soZnRkaSwgdGFyZ2V0LCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvd24oJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZ0ZGktPnJlY2lldmVkID0gMDsKKyAgICAgICAgZnRkaS0+ZXhwZWN0ZWQgPSA0OworICAgICAgICBmdGRpLT5lZF9mb3VuZCA9IDA7CisgICAgICAgIHVwKCZmdGRpLT51MTMyX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBmdGRpX2VsYW5fZmx1c2hfdGFyZ2V0cyhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpCit7CisgICAgICAgIGludCBlZF9udW1iZXIgPSA0OworICAgICAgICBkb3duKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICB3aGlsZSAoZWRfbnVtYmVyLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdGFyZ2V0ICp0YXJnZXQgPSAmZnRkaS0+dGFyZ2V0W2VkX251bWJlcl07CisgICAgICAgICAgICAgICAgdGFyZ2V0LT5hYmFuZG9uaW5nID0gMTsKKyAgICAgICAgICAgICAgd2FpdF8xOmlmICh0YXJnZXQtPmFjdGl2ZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tbWFuZF9zaXplID0gZnRkaS0+Y29tbWFuZF9uZXh0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+Y29tbWFuZF9oZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRfc2l6ZSA8IENPTU1BTkRfU0laRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9jb21tYW5kICpjb21tYW5kID0gJmZ0ZGktPmNvbW1hbmRbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORF9NQVNLICYgZnRkaS0+Y29tbWFuZF9uZXh0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+aGVhZGVyID0gMHg4MCB8IChlZF9udW1iZXIgPDwgNSkgfCAweDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmxlbmd0aCA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmFkZHJlc3MgPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT53aWR0aCA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmZvbGxvd3MgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT52YWx1ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmJ1ZmZlciA9ICZjb21tYW5kLT52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+Y29tbWFuZF9uZXh0ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9raWNrX2NvbW1hbmRfcXVldWUoZnRkaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCgmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNsZWVwKDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd24oJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gd2FpdF8xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgd2FpdF8yOmlmICh0YXJnZXQtPmFjdGl2ZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tbWFuZF9zaXplID0gZnRkaS0+Y29tbWFuZF9uZXh0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+Y29tbWFuZF9oZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRfc2l6ZSA8IENPTU1BTkRfU0laRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9jb21tYW5kICpjb21tYW5kID0gJmZ0ZGktPmNvbW1hbmRbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORF9NQVNLICYgZnRkaS0+Y29tbWFuZF9uZXh0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+aGVhZGVyID0gMHg5MCB8IChlZF9udW1iZXIgPDwgNSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmxlbmd0aCA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmFkZHJlc3MgPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT53aWR0aCA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmZvbGxvd3MgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT52YWx1ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmJ1ZmZlciA9ICZjb21tYW5kLT52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+Y29tbWFuZF9uZXh0ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9raWNrX2NvbW1hbmRfcXVldWUoZnRkaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCgmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNsZWVwKDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd24oJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gd2FpdF8yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmdGRpLT5yZWNpZXZlZCA9IDA7CisgICAgICAgIGZ0ZGktPmV4cGVjdGVkID0gNDsKKyAgICAgICAgZnRkaS0+ZWRfZm91bmQgPSAwOworICAgICAgICB1cCgmZnRkaS0+dTEzMl9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZnRkaV9lbGFuX2NhbmNlbF90YXJnZXRzKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSkKK3sKKyAgICAgICAgaW50IGVkX251bWJlciA9IDQ7CisgICAgICAgIGRvd24oJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgIHdoaWxlIChlZF9udW1iZXItLSA+IDApIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl90YXJnZXQgKnRhcmdldCA9ICZmdGRpLT50YXJnZXRbZWRfbnVtYmVyXTsKKyAgICAgICAgICAgICAgICB0YXJnZXQtPmFiYW5kb25pbmcgPSAxOworICAgICAgICAgICAgICB3YWl0OmlmICh0YXJnZXQtPmFjdGl2ZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tbWFuZF9zaXplID0gZnRkaS0+Y29tbWFuZF9uZXh0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+Y29tbWFuZF9oZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRfc2l6ZSA8IENPTU1BTkRfU0laRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9jb21tYW5kICpjb21tYW5kID0gJmZ0ZGktPmNvbW1hbmRbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORF9NQVNLICYgZnRkaS0+Y29tbWFuZF9uZXh0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+aGVhZGVyID0gMHg4MCB8IChlZF9udW1iZXIgPDwgNSkgfCAweDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmxlbmd0aCA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmFkZHJlc3MgPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT53aWR0aCA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmZvbGxvd3MgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT52YWx1ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmJ1ZmZlciA9ICZjb21tYW5kLT52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+Y29tbWFuZF9uZXh0ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9raWNrX2NvbW1hbmRfcXVldWUoZnRkaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCgmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNsZWVwKDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd24oJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gd2FpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnRkaS0+cmVjaWV2ZWQgPSAwOworICAgICAgICBmdGRpLT5leHBlY3RlZCA9IDQ7CisgICAgICAgIGZ0ZGktPmVkX2ZvdW5kID0gMDsKKyAgICAgICAgdXAoJmZ0ZGktPnUxMzJfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGZ0ZGlfZWxhbl9raWNrX2NvbW1hbmRfcXVldWUoc3RydWN0IHVzYl9mdGRpICpmdGRpKQoreworICAgICAgICBmdGRpX2NvbW1hbmRfcXVldWVfd29yayhmdGRpLCAwKTsKKyAgICAgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBmdGRpX2VsYW5fY29tbWFuZF93b3JrKHZvaWQgKmRhdGEpCit7CisgICAgICAgIHN0cnVjdCB1c2JfZnRkaSAqZnRkaSA9IGRhdGE7CisgICAgICAgIGlmIChmdGRpLT5kaXNjb25uZWN0ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgZnRkaV9lbGFuX3B1dF9rcmVmKGZ0ZGkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0dmFsID0gZnRkaV9lbGFuX2NvbW1hbmRfZW5naW5lKGZ0ZGkpOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gLUVTSFVURE9XTikgeworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+ZGlzY29ubmVjdGVkICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXR2YWwgPT0gLUVOT0RFVikgeworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+ZGlzY29ubmVjdGVkICs9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJjb21tYW5kIGVycm9yICVkXG4iLCByZXR2YWwpOworICAgICAgICAgICAgICAgIGZ0ZGlfY29tbWFuZF9yZXF1ZXVlX3dvcmsoZnRkaSwgbXNlY3NfdG9famlmZmllcygxMCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCBmdGRpX2VsYW5fa2lja19yZXNwb25kX3F1ZXVlKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSkKK3sKKyAgICAgICAgZnRkaV9yZXNwb25kX3F1ZXVlX3dvcmsoZnRkaSwgMCk7CisgICAgICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgZnRkaV9lbGFuX3Jlc3BvbmRfd29yayh2b2lkICpkYXRhKQoreworICAgICAgICBzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkgPSBkYXRhOworICAgICAgICBpZiAoZnRkaS0+ZGlzY29ubmVjdGVkID4gMCkgeworICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9wdXRfa3JlZihmdGRpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHJldHZhbCA9IGZ0ZGlfZWxhbl9yZXNwb25kX2VuZ2luZShmdGRpKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IDApIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldHZhbCA9PSAtRVNIVVRET1dOKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5kaXNjb25uZWN0ZWQgKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldHZhbCA9PSAtRU5PREVWKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5kaXNjb25uZWN0ZWQgKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldHZhbCA9PSAtRU5PREVWKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5kaXNjb25uZWN0ZWQgKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldHZhbCA9PSAtRUlMU0VRKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5kaXNjb25uZWN0ZWQgKz0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+ZGlzY29ubmVjdGVkICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJyZXNwb25kIGVycm9yICVkXG4iLCByZXR2YWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZnRkaS0+ZGlzY29ubmVjdGVkID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaV9lbGFuX2FiYW5kb25fY29tcGxldGlvbnMoZnRkaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpX2VsYW5fYWJhbmRvbl90YXJnZXRzKGZ0ZGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmdGRpX3Jlc3BvbnNlX3JlcXVldWVfd29yayhmdGRpLCBtc2Vjc190b19qaWZmaWVzKDEwKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cit9CisKKworLyoKKyogdGhlIHN3X2xvY2sgaXMgaW5pdGlhbGx5IGhlbGQgYW5kIHdpbGwgYmUgZnJlZWQKKyogYWZ0ZXIgdGhlIEZUREkgaGFzIGJlZW4gc3luY2hyb25pemVkCisqCisqLworc3RhdGljIHZvaWQgZnRkaV9lbGFuX3N0YXR1c193b3JrKHZvaWQgKmRhdGEpCit7CisgICAgICAgIHN0cnVjdCB1c2JfZnRkaSAqZnRkaSA9IGRhdGE7CisgICAgICAgIGludCB3b3JrX2RlbGF5X2luX21zZWMgPSAwOworICAgICAgICBpZiAoZnRkaS0+ZGlzY29ubmVjdGVkID4gMCkgeworICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9wdXRfa3JlZihmdGRpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoZnRkaS0+c3luY2hyb25pemVkID09IDApIHsKKyAgICAgICAgICAgICAgICBkb3duKCZmdGRpLT5zd19sb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAoZnRkaV9lbGFuX3N5bmNocm9uaXplKGZ0ZGkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPnN5bmNocm9uaXplZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpX2NvbW1hbmRfcXVldWVfd29yayhmdGRpLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGlfcmVzcG9uZF9xdWV1ZV93b3JrKGZ0ZGksIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJmZ0ZGktPnN3X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgd29ya19kZWxheV9pbl9tc2VjID0gMTAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJzeW5jaHJvbml6ZSBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJmZ0ZGktPnN3X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgd29ya19kZWxheV9pbl9tc2VjID0gMTAgKjEwMDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGZ0ZGktPnN0dWNrX3N0YXR1cyA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZnRkaV9lbGFuX3N0dWNrX3dhaXRpbmcoZnRkaSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+c3R1Y2tfc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPnN5bmNocm9uaXplZCA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZnRkaS0+c3R1Y2tfc3RhdHVzKysgJSA2MCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiV1JPTkcgdHlwZSBvZiBjYXJkIGluc2VydGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0gcGxlYXNlIHJlbW92ZVxuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJXUk9ORyB0eXBlIG9mIGNhcmQgaW5zZXJ0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLSBjaGVja2VkICVkIHRpbWVzXG4iLCBmdGRpLT5zdHVja19zdGF0dXMpOworICAgICAgICAgICAgICAgIHdvcmtfZGVsYXlfaW5fbXNlYyA9IDEwMDsKKyAgICAgICAgfSBlbHNlIGlmIChmdGRpLT5lbnVtZXJhdGVkID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZnRkaV9lbGFuX2VudW1lcmF0ZVBDSShmdGRpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5lbnVtZXJhdGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtfZGVsYXlfaW5fbXNlYyA9IDI1MDsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtfZGVsYXlfaW5fbXNlYyA9IDEwMDA7CisgICAgICAgIH0gZWxzZSBpZiAoZnRkaS0+aW5pdGlhbGl6ZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChmdGRpX2VsYW5fc2V0dXBPSENJKGZ0ZGkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmluaXRpYWxpemVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtfZGVsYXlfaW5fbXNlYyA9IDUwMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiaW5pdGlhbGl6ZWQgZmFpbGVkIC0gdHJ5aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFnYWluIGluIDEwIHNlY29uZHNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgd29ya19kZWxheV9pbl9tc2VjID0gMTAgKjEwMDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGZ0ZGktPnJlZ2lzdGVyZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHdvcmtfZGVsYXlfaW5fbXNlYyA9IDEwOworICAgICAgICAgICAgICAgIGlmIChmdGRpX2VsYW5faGNkX2luaXQoZnRkaSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+cmVnaXN0ZXJlZCA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJyZWdpc3RlciBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIHdvcmtfZGVsYXlfaW5fbXNlYyA9IDI1MDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoZnRkaV9lbGFuX2NoZWNraW5nUENJKGZ0ZGkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtfZGVsYXlfaW5fbXNlYyA9IDI1MDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZ0ZGktPmNvbnRyb2xyZWcgJiAweDAwNDAwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnRkaS0+Z29uZV9hd2F5ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJQQ0kgZGV2aWNlIGVqZWN0IGNvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlybWVkIHBsYXRmb3JtX2Rldi5kZXYucGFyZW50PSVwIHBsYXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1fZGV2LmRldj0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5wbGF0Zm9ybV9kZXYuZGV2LnBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnRkaS0+cGxhdGZvcm1fZGV2LmRldik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKCZmdGRpLT5wbGF0Zm9ybV9kZXYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5wbGF0Zm9ybV9kZXYuZGV2LnBhcmVudCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPnJlZ2lzdGVyZWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5lbnVtZXJhdGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+Y2FyZF9lamVjdGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+aW5pdGlhbGl6ZWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5nb25lX2F3YXkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9mbHVzaF90YXJnZXRzKGZ0ZGkpOworICAgICAgICAgICAgICAgICAgICAgICAgd29ya19kZWxheV9pbl9tc2VjID0gMjUwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJQQ0kgZGV2aWNlIGhhcyBkaXNhcHBlYXJlZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaV9lbGFuX2NhbmNlbF90YXJnZXRzKGZ0ZGkpOworICAgICAgICAgICAgICAgICAgICAgICAgd29ya19kZWxheV9pbl9tc2VjID0gNTAwOworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+ZW51bWVyYXRlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5pbml0aWFsaXplZCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmdGRpLT5kaXNjb25uZWN0ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgZnRkaV9lbGFuX3B1dF9rcmVmKGZ0ZGkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmdGRpX3N0YXR1c19yZXF1ZXVlX3dvcmsoZnRkaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZWNzX3RvX2ppZmZpZXMod29ya19kZWxheV9pbl9tc2VjKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cit9CisKKworLyoKKyogZmlsZV9vcGVyYXRpb25zIGZvciB0aGUganRhZyBpbnRlcmZhY2UKKyoKKyogdGhlIHVzYWdlIGNvdW50IGZvciB0aGUgZGV2aWNlIGlzIGluY3JlbWVudGVkIG9uIG9wZW4oKQorKiBhbmQgZGVjcmVtZW50ZWQgb24gcmVsZWFzZSgpCisqLworc3RhdGljIGludCBmdGRpX2VsYW5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICAgICAgaW50IHN1Ym1pbm9yID0gaW1pbm9yKGlub2RlKTsKKyAgICAgICAgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSA9IHVzYl9maW5kX2ludGVyZmFjZSgmZnRkaV9lbGFuX2RyaXZlciwKKyAgICAgICAgICAgICAgICBzdWJtaW5vcik7CisgICAgICAgIGlmICghaW50ZXJmYWNlKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWRcbiIsIHN1Ym1pbm9yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisgICAgICAgICAgICAgICAgaWYgKCFmdGRpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZnRkaS0+c3dfbG9jaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5UUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9nZXRfa3JlZihmdGRpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS0+cHJpdmF0ZV9kYXRhID0gZnRkaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKK3N0YXRpYyBpbnQgZnRkaV9lbGFuX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgICAgIHN0cnVjdCB1c2JfZnRkaSAqZnRkaSA9IChzdHJ1Y3QgdXNiX2Z0ZGkgKilmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIGlmIChmdGRpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgICAgIHVwKCZmdGRpLT5zd19sb2NrKTsgICAgICAgIC8qIGRlY3JlbWVudCB0aGUgY291bnQgb24gb3VyIGRldmljZSAqLworICAgICAgICBmdGRpX2VsYW5fcHV0X2tyZWYoZnRkaSk7CisgICAgICAgIHJldHVybiAwOworfQorCisKKyNkZWZpbmUgRlRESV9FTEFOX0lPQ19NQUdJQyAweEExCisjZGVmaW5lIEZURElfRUxBTl9JT0NERUJVRyBfSU9DKF9JT0NfV1JJVEUsIEZURElfRUxBTl9JT0NfTUFHSUMsIDEsIDEzMikKK3N0YXRpYyBpbnQgZnRkaV9lbGFuX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICAgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgICAgY2FzZSBGVERJX0VMQU5fSU9DREVCVUc6eworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBsaW5lWzEzMl07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IHN0cm5jcHlfZnJvbV91c2VyKGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyIF9fdXNlciAqKWFyZywgc2l6ZW9mKGxpbmUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiVE9ETzogaW9jdGwgJXNcbiIsIGxpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgIH0KK30KKworCisvKgorKgorKiBibG9ja2luZyBidWxrIHJlYWRzIGFyZSB1c2VkIHRvIGdldCBkYXRhIGZyb20gdGhlIGRldmljZQorKgorKi8KK3N0YXRpYyBzc2l6ZV90IGZ0ZGlfZWxhbl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisgICAgICAgIGNoYXIgZGF0YVszMCAqMyArIDRdOworICAgICAgICBjaGFyICpkID0gZGF0YTsKKyAgICAgICAgaW50IG0gPSAoc2l6ZW9mKGRhdGEpIC0gMSkgLyAzOworICAgICAgICBpbnQgYnl0ZXNfcmVhZCA9IDA7CisgICAgICAgIGludCByZXRyeV9vbl9lbXB0eSA9IDEwOworICAgICAgICBpbnQgcmV0cnlfb25fdGltZW91dCA9IDU7CisgICAgICAgIHN0cnVjdCB1c2JfZnRkaSAqZnRkaSA9IChzdHJ1Y3QgdXNiX2Z0ZGkgKilmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIGlmIChmdGRpLT5kaXNjb25uZWN0ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgICAgIH0KKyAgICAgICAgZGF0YVswXSA9IDA7CisgICAgICBoYXZlOmlmIChmdGRpLT5idWxrX2luX2xlZnQgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50LS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwID0gKytmdGRpLT5idWxrX2luX2xhc3QgKyBmdGRpLT5idWxrX2luX2J1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmJ1bGtfaW5fbGVmdCAtPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPCBtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gc3ByaW50ZihkLCAiICUwMlgiLCAweDAwMDAwMEZGICYgKnApOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChieXRlc19yZWFkID4gbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gc3ByaW50ZihkLCAiIC4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGJ1ZmZlcisrLCBwLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3JlYWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBoYXZlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7CisgICAgICAgIH0KKyAgICAgIG1vcmU6aWYgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGludCBwYWNrZXRfYnl0ZXMgPSAwOworICAgICAgICAgICAgICAgIGludCByZXR2YWwgPSB1c2JfYnVsa19tc2coZnRkaS0+dWRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9yY3ZidWxrcGlwZShmdGRpLT51ZGV2LCBmdGRpLT5idWxrX2luX2VuZHBvaW50QWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+YnVsa19pbl9idWZmZXIsIGZ0ZGktPmJ1bGtfaW5fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwYWNrZXRfYnl0ZXMsIG1zZWNzX3RvX2ppZmZpZXMoNTApKTsKKyAgICAgICAgICAgICAgICBpZiAocGFja2V0X2J5dGVzID4gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+YnVsa19pbl9sZWZ0ID0gcGFja2V0X2J5dGVzIC0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmJ1bGtfaW5fbGFzdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGhhdmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXR2YWwgPT0gLUVUSU1FRE9VVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5X29uX3RpbWVvdXQtLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBtb3JlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChieXRlc19yZWFkID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXNfcmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0dmFsID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXRyeV9vbl9lbXB0eS0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG1vcmU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVzX3JlYWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXNfcmVhZDsKK30KKworc3RhdGljIHZvaWQgZnRkaV9lbGFuX3dyaXRlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgc3RydWN0IHVzYl9mdGRpICpmdGRpID0gKHN0cnVjdCB1c2JfZnRkaSAqKXVyYi0+Y29udGV4dDsKKyAgICAgICAgaWYgKHVyYi0+c3RhdHVzICYmICEodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fCB1cmItPnN0YXR1cyA9PQorICAgICAgICAgICAgICAgIC1FQ09OTlJFU0VUIHx8IHVyYi0+c3RhdHVzID09IC1FU0hVVERPV04pKSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAidXJiPSVwIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlIgorICAgICAgICAgICAgICAgICAgICAgICAgImRcbiIsIHVyYiwgdXJiLT5zdGF0dXMpOworICAgICAgICB9CisgICAgICAgIHVzYl9idWZmZXJfZnJlZSh1cmItPmRldiwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAorICAgICAgICAgICAgICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPnRyYW5zZmVyX2RtYSk7Cit9CisKK3N0YXRpYyBpbnQgZmlsbF9idWZmZXJfd2l0aF9hbGxfcXVldWVkX2NvbW1hbmRzKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwKKyAgICAgICAgY2hhciAqYnVmLCBpbnQgY29tbWFuZF9zaXplLCBpbnQgdG90YWxfc2l6ZSkKK3sKKyAgICAgICAgaW50IGVkX2NvbW1hbmRzID0gMDsKKyAgICAgICAgaW50IGIgPSAwOworICAgICAgICBpbnQgSSA9IGNvbW1hbmRfc2l6ZTsKKyAgICAgICAgaW50IGkgPSBmdGRpLT5jb21tYW5kX2hlYWQ7CisgICAgICAgIHdoaWxlIChJLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfY29tbWFuZCAqY29tbWFuZCA9ICZmdGRpLT5jb21tYW5kW0NPTU1BTkRfTUFTSyAmCisgICAgICAgICAgICAgICAgICAgICAgICBpKytdOworICAgICAgICAgICAgICAgIGludCBGID0gY29tbWFuZC0+Zm9sbG93czsKKyAgICAgICAgICAgICAgICB1OCAqZiA9IGNvbW1hbmQtPmJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBpZiAoY29tbWFuZC0+aGVhZGVyICYgMHg4MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZWRfY29tbWFuZHMgfD0gMSA8PCAoMHgzICYgKGNvbW1hbmQtPmhlYWRlciA+PiA1KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZltiKytdID0gY29tbWFuZC0+aGVhZGVyOworICAgICAgICAgICAgICAgIGJ1ZltiKytdID0gKGNvbW1hbmQtPmxlbmd0aCA+PiAwKSAmIDB4MDBGRjsKKyAgICAgICAgICAgICAgICBidWZbYisrXSA9IChjb21tYW5kLT5sZW5ndGggPj4gOCkgJiAweDAwRkY7CisgICAgICAgICAgICAgICAgYnVmW2IrK10gPSBjb21tYW5kLT5hZGRyZXNzOworICAgICAgICAgICAgICAgIGJ1ZltiKytdID0gY29tbWFuZC0+d2lkdGg7CisgICAgICAgICAgICAgICAgd2hpbGUgKEYtLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltiKytdID0gKmYrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVkX2NvbW1hbmRzOworfQorCitzdGF0aWMgaW50IGZ0ZGlfZWxhbl90b3RhbF9jb21tYW5kX3NpemUoc3RydWN0IHVzYl9mdGRpICpmdGRpLCBpbnQgY29tbWFuZF9zaXplKQoreworICAgICAgICBpbnQgdG90YWxfc2l6ZSA9IDA7CisgICAgICAgIGludCBJID0gY29tbWFuZF9zaXplOworICAgICAgICBpbnQgaSA9IGZ0ZGktPmNvbW1hbmRfaGVhZDsKKyAgICAgICAgd2hpbGUgKEktLSA+IDApIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9jb21tYW5kICpjb21tYW5kID0gJmZ0ZGktPmNvbW1hbmRbQ09NTUFORF9NQVNLICYKKyAgICAgICAgICAgICAgICAgICAgICAgIGkrK107CisgICAgICAgICAgICAgICAgdG90YWxfc2l6ZSArPSA1ICsgY29tbWFuZC0+Zm9sbG93czsKKyAgICAgICAgfSByZXR1cm4gdG90YWxfc2l6ZTsKK30KKworc3RhdGljIGludCBmdGRpX2VsYW5fY29tbWFuZF9lbmdpbmUoc3RydWN0IHVzYl9mdGRpICpmdGRpKQoreworICAgICAgICBpbnQgcmV0dmFsOworICAgICAgICBjaGFyICpidWY7CisgICAgICAgIGludCBlZF9jb21tYW5kczsKKyAgICAgICAgaW50IHRvdGFsX3NpemU7CisgICAgICAgIHN0cnVjdCB1cmIgKnVyYjsKKyAgICAgICAgaW50IGNvbW1hbmRfc2l6ZSA9IGZ0ZGktPmNvbW1hbmRfbmV4dCAtIGZ0ZGktPmNvbW1hbmRfaGVhZDsKKyAgICAgICAgaWYgKGNvbW1hbmRfc2l6ZSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB0b3RhbF9zaXplID0gZnRkaV9lbGFuX3RvdGFsX2NvbW1hbmRfc2l6ZShmdGRpLCBjb21tYW5kX3NpemUpOworICAgICAgICB1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoIXVyYikgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgYSB1cmIgdG8gd3JpdGUgJWQgY29tbSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbmRzIHRvdGFsaW5nICVkIGJ5dGVzIHRvIHRoZSBVeHh4XG4iLCBjb21tYW5kX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbF9zaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgfQorICAgICAgICBidWYgPSB1c2JfYnVmZmVyX2FsbG9jKGZ0ZGktPnVkZXYsIHRvdGFsX3NpemUsIEdGUF9LRVJORUwsCisgICAgICAgICAgICAgICAgJnVyYi0+dHJhbnNmZXJfZG1hKTsKKyAgICAgICAgaWYgKCFidWYpIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGEgYnVmZmVyIHRvIHdyaXRlICVkIGMiCisgICAgICAgICAgICAgICAgICAgICAgICAib21tYW5kcyB0b3RhbGluZyAlZCBieXRlcyB0byB0aGUgVXh4eFxuIiwgY29tbWFuZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX3NpemUpOworICAgICAgICAgICAgICAgIHVzYl9mcmVlX3VyYih1cmIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICB9CisgICAgICAgIGVkX2NvbW1hbmRzID0gZmlsbF9idWZmZXJfd2l0aF9hbGxfcXVldWVkX2NvbW1hbmRzKGZ0ZGksIGJ1ZiwKKyAgICAgICAgICAgICAgICBjb21tYW5kX3NpemUsIHRvdGFsX3NpemUpOworICAgICAgICB1c2JfZmlsbF9idWxrX3VyYih1cmIsIGZ0ZGktPnVkZXYsIHVzYl9zbmRidWxrcGlwZShmdGRpLT51ZGV2LAorICAgICAgICAgICAgICAgIGZ0ZGktPmJ1bGtfb3V0X2VuZHBvaW50QWRkciksIGJ1ZiwgdG90YWxfc2l6ZSwKKyAgICAgICAgICAgICAgICBmdGRpX2VsYW5fd3JpdGVfYnVsa19jYWxsYmFjaywgZnRkaSk7CisgICAgICAgIHVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisgICAgICAgIGlmIChlZF9jb21tYW5kcykgeworICAgICAgICAgICAgICAgIGNoYXIgZGlhZ1s0MCAqMyArIDRdOworICAgICAgICAgICAgICAgIGNoYXIgKmQgPSBkaWFnOworICAgICAgICAgICAgICAgIGludCBtID0gdG90YWxfc2l6ZTsKKyAgICAgICAgICAgICAgICB1OCAqYyA9IGJ1ZjsKKyAgICAgICAgICAgICAgICBpbnQgcyA9IChzaXplb2YoZGlhZykgLSAxKSAvIDM7CisgICAgICAgICAgICAgICAgZGlhZ1swXSA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKHMtLSA+IDAgJiYgbS0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgPiAwIHx8IG0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICs9IHNwcmludGYoZCwgIiAlMDJYIiwgKmMrKyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCArPSBzcHJpbnRmKGQsICIgLi4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgaWYgKHJldHZhbCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgImZhaWxlZCAlZCB0byBzdWJtaXQgdXJiICVwIHRvIHdyaXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlZCBjb21tYW5kcyB0b3RhbGluZyAlZCBieXRlcyB0byB0aGUgVXh4eFxuIiwgcmV0dmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgdXJiLCBjb21tYW5kX3NpemUsIHRvdGFsX3NpemUpOworICAgICAgICAgICAgICAgIHVzYl9idWZmZXJfZnJlZShmdGRpLT51ZGV2LCB0b3RhbF9zaXplLCBidWYsIHVyYi0+dHJhbnNmZXJfZG1hKTsKKyAgICAgICAgICAgICAgICB1c2JfZnJlZV91cmIodXJiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisgICAgICAgIHVzYl9mcmVlX3VyYih1cmIpOyAgICAgICAgLyogcmVsZWFzZSBvdXIgcmVmZXJlbmNlIHRvIHRoaXMgdXJiLAorICAgICAgICAgICAgICAgIHRoZSBVU0IgY29yZSB3aWxsIGV2ZW50dWFsbHkgZnJlZSBpdCBlbnRpcmVseSAqLworICAgICAgICBmdGRpLT5jb21tYW5kX2hlYWQgKz0gY29tbWFuZF9zaXplOworICAgICAgICBmdGRpX2VsYW5fa2lja19yZXNwb25kX3F1ZXVlKGZ0ZGkpOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnRkaV9lbGFuX2RvX2NhbGxiYWNrKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwKKyAgICAgICAgc3RydWN0IHUxMzJfdGFyZ2V0ICp0YXJnZXQsIHU4ICpidWZmZXIsIGludCBsZW5ndGgpCit7CisgICAgICAgIHN0cnVjdCB1cmIgKnVyYiA9IHRhcmdldC0+dXJiOworICAgICAgICBpbnQgaGFsdGVkID0gdGFyZ2V0LT5oYWx0ZWQ7CisgICAgICAgIGludCBza2lwcGVkID0gdGFyZ2V0LT5za2lwcGVkOworICAgICAgICBpbnQgYWN0dWFsID0gdGFyZ2V0LT5hY3R1YWw7CisgICAgICAgIGludCBub25fbnVsbCA9IHRhcmdldC0+bm9uX251bGw7CisgICAgICAgIGludCB0b2dnbGVfYml0cyA9IHRhcmdldC0+dG9nZ2xlX2JpdHM7CisgICAgICAgIGludCBlcnJvcl9jb3VudCA9IHRhcmdldC0+ZXJyb3JfY291bnQ7CisgICAgICAgIGludCBjb25kaXRpb25fY29kZSA9IHRhcmdldC0+Y29uZGl0aW9uX2NvZGU7CisgICAgICAgIGludCByZXBlYXRfbnVtYmVyID0gdGFyZ2V0LT5yZXBlYXRfbnVtYmVyOworICAgICAgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICosIHN0cnVjdCB1cmIgKiwgdTggKiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsCisgICAgICAgICAgICAgICAgaW50LCBpbnQsIGludCwgaW50KSA9IHRhcmdldC0+Y2FsbGJhY2s7CisgICAgICAgIHRhcmdldC0+YWN0aXZlIC09IDE7CisgICAgICAgIHRhcmdldC0+Y2FsbGJhY2sgPSBOVUxMOworICAgICAgICAoKmNhbGxiYWNrKSAodGFyZ2V0LT5lbmRwLCB1cmIsIGJ1ZmZlciwgbGVuZ3RoLCB0b2dnbGVfYml0cywKKyAgICAgICAgICAgICAgICBlcnJvcl9jb3VudCwgY29uZGl0aW9uX2NvZGUsIHJlcGVhdF9udW1iZXIsIGhhbHRlZCwgc2tpcHBlZCwKKyAgICAgICAgICAgICAgICBhY3R1YWwsIG5vbl9udWxsKTsKK30KKworc3RhdGljIGNoYXIgKmhhdmVfZWRfc2V0X3Jlc3BvbnNlKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwKKyAgICAgICAgc3RydWN0IHUxMzJfdGFyZ2V0ICp0YXJnZXQsIHUxNiBlZF9sZW5ndGgsIGludCBlZF9udW1iZXIsIGludCBlZF90eXBlLAorICAgICAgICBjaGFyICpiKQoreworICAgICAgICBpbnQgcGF5bG9hZCA9IChlZF9sZW5ndGggPj4gMCkgJiAweDA3RkY7CisgICAgICAgIGRvd24oJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgIHRhcmdldC0+YWN0dWFsID0gMDsKKyAgICAgICAgdGFyZ2V0LT5ub25fbnVsbCA9IChlZF9sZW5ndGggPj4gMTUpICYgMHgwMDAxOworICAgICAgICB0YXJnZXQtPnJlcGVhdF9udW1iZXIgPSAoZWRfbGVuZ3RoID4+IDExKSAmIDB4MDAwRjsKKyAgICAgICAgaWYgKGVkX3R5cGUgPT0gMHgwMikgeworICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkID09IDAgfHwgdGFyZ2V0LT5hYmFuZG9uaW5nID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT5hYmFuZG9uaW5nID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaV9lbGFuX2RvX2NhbGxiYWNrKGZ0ZGksIHRhcmdldCwgNCArIGZ0ZGktPnJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPnJlY2lldmVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmV4cGVjdGVkID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmVkX2ZvdW5kID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdGRpLT5yZXNwb25zZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+ZXhwZWN0ZWQgPSA0ICsgcGF5bG9hZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmVkX2ZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGVkX3R5cGUgPT0gMHgwMykgeworICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkID09IDAgfHwgdGFyZ2V0LT5hYmFuZG9uaW5nID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT5hYmFuZG9uaW5nID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaV9lbGFuX2RvX2NhbGxiYWNrKGZ0ZGksIHRhcmdldCwgNCArIGZ0ZGktPnJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPnJlY2lldmVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmV4cGVjdGVkID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmVkX2ZvdW5kID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdGRpLT5yZXNwb25zZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+ZXhwZWN0ZWQgPSA0ICsgcGF5bG9hZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmVkX2ZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGVkX3R5cGUgPT0gMHgwMSkgeworICAgICAgICAgICAgICAgIHRhcmdldC0+YWJhbmRvbmluZyA9IDA7CisgICAgICAgICAgICAgICAgdXAoJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgZnRkaV9lbGFuX2RvX2NhbGxiYWNrKGZ0ZGksIHRhcmdldCwgNCArIGZ0ZGktPnJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCk7CisgICAgICAgICAgICAgICAgZnRkaS0+cmVjaWV2ZWQgPSAwOworICAgICAgICAgICAgICAgIGZ0ZGktPmV4cGVjdGVkID0gNDsKKyAgICAgICAgICAgICAgICBmdGRpLT5lZF9mb3VuZCA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ0ZGktPnJlc3BvbnNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRhcmdldC0+YWJhbmRvbmluZyA9IDA7CisgICAgICAgICAgICAgICAgdXAoJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgZnRkaV9lbGFuX2RvX2NhbGxiYWNrKGZ0ZGksIHRhcmdldCwgNCArIGZ0ZGktPnJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCk7CisgICAgICAgICAgICAgICAgZnRkaS0+cmVjaWV2ZWQgPSAwOworICAgICAgICAgICAgICAgIGZ0ZGktPmV4cGVjdGVkID0gNDsKKyAgICAgICAgICAgICAgICBmdGRpLT5lZF9mb3VuZCA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ0ZGktPnJlc3BvbnNlOworICAgICAgICB9Cit9CisKK3N0YXRpYyBjaGFyICpoYXZlX2VkX2dldF9yZXNwb25zZShzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksCisgICAgICAgIHN0cnVjdCB1MTMyX3RhcmdldCAqdGFyZ2V0LCB1MTYgZWRfbGVuZ3RoLCBpbnQgZWRfbnVtYmVyLCBpbnQgZWRfdHlwZSwKKyAgICAgICAgY2hhciAqYikKK3sKKyAgICAgICAgZG93bigmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgdGFyZ2V0LT5jb25kaXRpb25fY29kZSA9IFREX0RFVk5PVFJFU1A7CisgICAgICAgIHRhcmdldC0+YWN0dWFsID0gKGVkX2xlbmd0aCA+PiAwKSAmIDB4MDFGRjsKKyAgICAgICAgdGFyZ2V0LT5ub25fbnVsbCA9IChlZF9sZW5ndGggPj4gMTUpICYgMHgwMDAxOworICAgICAgICB0YXJnZXQtPnJlcGVhdF9udW1iZXIgPSAoZWRfbGVuZ3RoID4+IDExKSAmIDB4MDAwRjsKKyAgICAgICAgdXAoJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgIGlmICh0YXJnZXQtPmFjdGl2ZSkKKyAgICAgICAgICAgICAgICBmdGRpX2VsYW5fZG9fY2FsbGJhY2soZnRkaSwgdGFyZ2V0LCBOVUxMLCAwKTsKKyAgICAgICAgdGFyZ2V0LT5hYmFuZG9uaW5nID0gMDsKKyAgICAgICAgZnRkaS0+cmVjaWV2ZWQgPSAwOworICAgICAgICBmdGRpLT5leHBlY3RlZCA9IDQ7CisgICAgICAgIGZ0ZGktPmVkX2ZvdW5kID0gMDsKKyAgICAgICAgcmV0dXJuIGZ0ZGktPnJlc3BvbnNlOworfQorCisKKy8qCisqIFRoZSBlbmdpbmUgdHJpZXMgdG8gZW1wdHkgdGhlIEZUREkgZmlmbworKgorKiBhbGwgcmVzcG9uc2VzIGZvdW5kIGluIHRoZSBmaWZvIGRhdGEgYXJlIGRpc3BhdGNoZWQgdGh1cworKiB0aGUgcmVzcG9uc2UgYnVmZmVyIGNhbiBvbmx5IGV2ZXIgaG9sZCBhIG1heGltdW0gc2l6ZWQKKyogcmVzcG9uc2UgZnJvbSB0aGUgVXh4eC4KKyoKKyovCitzdGF0aWMgaW50IGZ0ZGlfZWxhbl9yZXNwb25kX2VuZ2luZShzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpCit7CisgICAgICAgIHU4ICpiID0gZnRkaS0+cmVzcG9uc2UgKyBmdGRpLT5yZWNpZXZlZDsKKyAgICAgICAgaW50IGJ5dGVzX3JlYWQgPSAwOworICAgICAgICBpbnQgcmV0cnlfb25fZW1wdHkgPSAxOworICAgICAgICBpbnQgcmV0cnlfb25fdGltZW91dCA9IDM7CisgICAgICAgIGludCBlbXB0eV9wYWNrZXRzID0gMDsKKyAgICAgIHJlYWQ6eworICAgICAgICAgICAgICAgIGludCBwYWNrZXRfYnl0ZXMgPSAwOworICAgICAgICAgICAgICAgIGludCByZXR2YWwgPSB1c2JfYnVsa19tc2coZnRkaS0+dWRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9yY3ZidWxrcGlwZShmdGRpLT51ZGV2LCBmdGRpLT5idWxrX2luX2VuZHBvaW50QWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+YnVsa19pbl9idWZmZXIsIGZ0ZGktPmJ1bGtfaW5fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwYWNrZXRfYnl0ZXMsIG1zZWNzX3RvX2ppZmZpZXMoNTAwKSk7CisgICAgICAgICAgICAgICAgY2hhciBkaWFnWzMwICozICsgNF07CisgICAgICAgICAgICAgICAgY2hhciAqZCA9IGRpYWc7CisgICAgICAgICAgICAgICAgaW50IG0gPSBwYWNrZXRfYnl0ZXM7CisgICAgICAgICAgICAgICAgdTggKmMgPSBmdGRpLT5idWxrX2luX2J1ZmZlcjsKKyAgICAgICAgICAgICAgICBpbnQgcyA9IChzaXplb2YoZGlhZykgLSAxKSAvIDM7CisgICAgICAgICAgICAgICAgZGlhZ1swXSA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKHMtLSA+IDAgJiYgbS0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgPiAwIHx8IG0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICs9IHNwcmludGYoZCwgIiAlMDJYIiwgKmMrKyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCArPSBzcHJpbnRmKGQsICIgLi4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBhY2tldF9ieXRlcyA+IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmJ1bGtfaW5fbGVmdCA9IHBhY2tldF9ieXRlcyAtIDI7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5idWxrX2luX2xhc3QgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBoYXZlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0dmFsID09IC1FVElNRURPVVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXRyeV9vbl90aW1lb3V0LS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgIlRJTUVEIE9VVCB3aXRoIHBhY2tlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0X2J5dGVzID0gJWQgd2l0aCB0b3RhbCAlZCBieXRlcyVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldF9ieXRlcywgYnl0ZXNfcmVhZCwgZGlhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbW9yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnl0ZXNfcmVhZCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiT05MWSAlZCBieXRlcyVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3JlYWQsIGRpYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgIlRJTUVEIE9VVCB3aXRoIHBhY2tlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0X2J5dGVzID0gJWQgd2l0aCB0b3RhbCAlZCBieXRlcyVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldF9ieXRlcywgYnl0ZXNfcmVhZCwgZGlhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0dmFsID09IC1FSUxTRVEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgImVycm9yID0gJWQgd2l0aCBwYWNrZXRfYnl0ZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPSAlZCB3aXRoIHRvdGFsICVkIGJ5dGVzJXNcbiIsIHJldHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X2J5dGVzLCBieXRlc19yZWFkLCBkaWFnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgImVycm9yID0gJWQgd2l0aCBwYWNrZXRfYnl0ZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgPSAlZCB3aXRoIHRvdGFsICVkIGJ5dGVzJXNcbiIsIHJldHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X2J5dGVzLCBieXRlc19yZWFkLCBkaWFnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYWNrZXRfYnl0ZXMgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBzMCA9IGZ0ZGktPmJ1bGtfaW5fYnVmZmVyWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBzMSA9IGZ0ZGktPmJ1bGtfaW5fYnVmZmVyWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgZW1wdHlfcGFja2V0cyArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMwID09IDB4MzEgJiYgczEgPT0gMHg2MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0cnlfb25fZW1wdHktLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG1vcmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzMCA9PSAweDMxICYmIHMxID09IDB4MDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5X29uX2VtcHR5LS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBtb3JlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXRyeV9vbl9lbXB0eS0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbW9yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYWNrZXRfYnl0ZXMgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5X29uX2VtcHR5LS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbW9yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5X29uX2VtcHR5LS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbW9yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIG1vcmU6eworICAgICAgICAgICAgICAgIGdvdG8gcmVhZDsKKyAgICAgICAgfQorICAgICAgaGF2ZTppZiAoZnRkaS0+YnVsa19pbl9sZWZ0ID4gMCkgeworICAgICAgICAgICAgICAgIHU4IGMgPSBmdGRpLT5idWxrX2luX2J1ZmZlclsrK2Z0ZGktPmJ1bGtfaW5fbGFzdF07CisgICAgICAgICAgICAgICAgYnl0ZXNfcmVhZCArPSAxOworICAgICAgICAgICAgICAgIGZ0ZGktPmJ1bGtfaW5fbGVmdCAtPSAxOworICAgICAgICAgICAgICAgIGlmIChmdGRpLT5yZWNpZXZlZCA9PSAwICYmIGMgPT0gMHhGRikgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBoYXZlOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgKmIrKyA9IGM7CisgICAgICAgICAgICAgICAgaWYgKCsrZnRkaS0+cmVjaWV2ZWQgPCBmdGRpLT5leHBlY3RlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBoYXZlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZnRkaS0+ZWRfZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBlZF9udW1iZXIgPSAoZnRkaS0+cmVzcG9uc2VbMF0gPj4gNSkgJiAweDAzOworICAgICAgICAgICAgICAgICAgICAgICAgdTE2IGVkX2xlbmd0aCA9IChmdGRpLT5yZXNwb25zZVsyXSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPnJlc3BvbnNlWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdGFyZ2V0ICp0YXJnZXQgPSAmZnRkaS0+dGFyZ2V0W2VkX251bWJlcl07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGF5bG9hZCA9IChlZF9sZW5ndGggPj4gMCkgJiAweDA3RkY7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpYWdbMzAgKjMgKyA0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmQgPSBkaWFnOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG0gPSBwYXlsb2FkOworICAgICAgICAgICAgICAgICAgICAgICAgdTggKmMgPSA0ICsgZnRkaS0+cmVzcG9uc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcyA9IChzaXplb2YoZGlhZykgLSAxKSAvIDM7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWFnWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzLS0gPiAwICYmIG0tLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgPiAwIHx8IG0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gc3ByaW50ZihkLCAiICUwMlgiLCAqYysrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCArPSBzcHJpbnRmKGQsICIgLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9kb19jYWxsYmFjayhmdGRpLCB0YXJnZXQsIDQgKyBmdGRpLT5yZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5yZWNpZXZlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5leHBlY3RlZCA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5lZF9mb3VuZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBiID0gZnRkaS0+cmVzcG9uc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGhhdmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmdGRpLT5leHBlY3RlZCA9PSA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1OCBidXNjbWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzcG9uZF9oZWFkID0gZnRkaS0+cmVzcG9uZF9oZWFkKys7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yZXNwb25kICpyZXNwb25kID0gJmZ0ZGktPnJlc3BvbmRbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU1BPTkRfTUFTSyAmIHJlc3BvbmRfaGVhZF07CisgICAgICAgICAgICAgICAgICAgICAgICB1MzIgZGF0YSA9IGZ0ZGktPnJlc3BvbnNlWzddOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA8PD0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgfD0gZnRkaS0+cmVzcG9uc2VbNl07CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIDw8PSA4OworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSB8PSBmdGRpLT5yZXNwb25zZVs1XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPDw9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHw9IGZ0ZGktPnJlc3BvbnNlWzRdOworICAgICAgICAgICAgICAgICAgICAgICAgKnJlc3BvbmQtPnZhbHVlID0gZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpyZXNwb25kLT5yZXN1bHQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUoJnJlc3BvbmQtPndhaXRfY29tcGxldGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5yZWNpZXZlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5leHBlY3RlZCA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5lZF9mb3VuZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBiID0gZnRkaS0+cmVzcG9uc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBidXNjbWQgPSAoZnRkaS0+cmVzcG9uc2VbMF0gPj4gMCkgJiAweDBGOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1c2NtZCA9PSAweDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1c2NtZCA9PSAweDAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1c2NtZCA9PSAweDA2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1c2NtZCA9PSAweDBBKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiVXh4eCB1bmtub3duKCUwWCkgdmEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImx1ZSA9ICUwOFhcbiIsIGJ1c2NtZCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGhhdmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZnRkaS0+cmVzcG9uc2VbMF0gJiAweDgwKSA9PSAweDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmV4cGVjdGVkID0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBoYXZlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVkX251bWJlciA9IChmdGRpLT5yZXNwb25zZVswXSA+PiA1KSAmIDB4MDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlZF90eXBlID0gKGZ0ZGktPnJlc3BvbnNlWzBdID4+IDApICYgMHgwMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTE2IGVkX2xlbmd0aCA9IChmdGRpLT5yZXNwb25zZVsyXSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+cmVzcG9uc2VbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3RhcmdldCAqdGFyZ2V0ID0gJmZ0ZGktPnRhcmdldFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZF9udW1iZXJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPmhhbHRlZCA9IChmdGRpLT5yZXNwb25zZVswXSA+PiAzKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT5za2lwcGVkID0gKGZ0ZGktPnJlc3BvbnNlWzBdID4+IDIpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPnRvZ2dsZV9iaXRzID0gKGZ0ZGktPnJlc3BvbnNlWzNdID4+IDYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAweDAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPmVycm9yX2NvdW50ID0gKGZ0ZGktPnJlc3BvbnNlWzNdID4+IDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAweDAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPmNvbmRpdGlvbl9jb2RlID0gKGZ0ZGktPnJlc3BvbnNlWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDNdID4+IDApICYgMHgwRjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmdGRpLT5yZXNwb25zZVswXSAmIDB4MTApID09IDB4MDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gaGF2ZV9lZF9zZXRfcmVzcG9uc2UoZnRkaSwgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRfbGVuZ3RoLCBlZF9udW1iZXIsIGVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGhhdmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGhhdmVfZWRfZ2V0X3Jlc3BvbnNlKGZ0ZGksIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkX2xlbmd0aCwgZWRfbnVtYmVyLCBlZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBoYXZlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBnb3RvIG1vcmU7Cit9CisKKworLyoKKyogY3JlYXRlIGEgdXJiLCBhbmQgYSBidWZmZXIgZm9yIGl0LCBhbmQgY29weSB0aGUgZGF0YSB0byB0aGUgdXJiCisqCisqLworc3RhdGljIHNzaXplX3QgZnRkaV9lbGFuX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZmZlciwgc2l6ZV90IGNvdW50LAorCQkJICAgICAgIGxvZmZfdCAqcHBvcykKK3sKKyAgICAgICAgaW50IHJldHZhbCA9IDA7CisgICAgICAgIHN0cnVjdCB1cmIgKnVyYjsKKyAgICAgICAgY2hhciAqYnVmOworICAgICAgICBjaGFyIGRhdGFbMzAgKjMgKyA0XTsKKyAgICAgICAgY2hhciAqZCA9IGRhdGE7CisgICAgICAgIGNvbnN0IGNoYXIgX191c2VyICpzID0gdXNlcl9idWZmZXI7CisgICAgICAgIGludCBtID0gKHNpemVvZihkYXRhKSAtIDEpIC8gMzsKKyAgICAgICAgc3RydWN0IHVzYl9mdGRpICpmdGRpID0gKHN0cnVjdCB1c2JfZnRkaSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKyAgICAgICAgaWYgKGZ0ZGktPmRpc2Nvbm5lY3RlZCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICB1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoIXVyYikgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl8xOworICAgICAgICB9CisgICAgICAgIGJ1ZiA9IHVzYl9idWZmZXJfYWxsb2MoZnRkaS0+dWRldiwgY291bnQsIEdGUF9LRVJORUwsCisgICAgICAgICAgICAgICAgJnVyYi0+dHJhbnNmZXJfZG1hKTsKKyAgICAgICAgaWYgKCFidWYpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSAtRU5PTUVNOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZmZlciwgY291bnQpKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yXzM7CisgICAgICAgIH0KKyAgICAgICAgdXNiX2ZpbGxfYnVsa191cmIodXJiLCBmdGRpLT51ZGV2LCB1c2Jfc25kYnVsa3BpcGUoZnRkaS0+dWRldiwKKyAgICAgICAgICAgICAgICBmdGRpLT5idWxrX291dF9lbmRwb2ludEFkZHIpLCBidWYsIGNvdW50LAorICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl93cml0ZV9idWxrX2NhbGxiYWNrLCBmdGRpKTsKKyAgICAgICAgdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKyAgICAgICAgcmV0dmFsID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgaWYgKHJldHZhbCkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgImZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJkXG4iLCByZXR2YWwpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfNDsKKyAgICAgICAgfQorICAgICAgICB1c2JfZnJlZV91cmIodXJiKTsKKyAgICAgIGV4aXQ6OworICAgICAgICBpZiAoY291bnQgPiBtKSB7CisgICAgICAgICAgICAgICAgaW50IEkgPSBtIC0gMTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoSS0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZCArPSBzcHJpbnRmKGQsICIgJTAyWCIsIDB4MDAwMDAwRkYgJiAqcysrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZCArPSBzcHJpbnRmKGQsICIgLi4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgSSA9IGNvdW50OworICAgICAgICAgICAgICAgIHdoaWxlIChJLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkICs9IHNwcmludGYoZCwgIiAlMDJYIiwgMHgwMDAwMDBGRiAmICpzKyspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICBlcnJvcl80OiBlcnJvcl8zOnVzYl9idWZmZXJfZnJlZShmdGRpLT51ZGV2LCBjb3VudCwgYnVmLAorICAgICAgICAgICAgICB1cmItPnRyYW5zZmVyX2RtYSk7CisgICAgICBlcnJvcl8yOnVzYl9mcmVlX3VyYih1cmIpOworICAgICAgZXJyb3JfMTpyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmdGRpX2VsYW5fZm9wcyA9IHsKKyAgICAgICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisgICAgICAgIC5sbHNlZWsgPSBub19sbHNlZWssCisgICAgICAgIC5pb2N0bCA9IGZ0ZGlfZWxhbl9pb2N0bCwKKyAgICAgICAgLnJlYWQgPSBmdGRpX2VsYW5fcmVhZCwKKyAgICAgICAgLndyaXRlID0gZnRkaV9lbGFuX3dyaXRlLAorICAgICAgICAub3BlbiA9IGZ0ZGlfZWxhbl9vcGVuLAorICAgICAgICAucmVsZWFzZSA9IGZ0ZGlfZWxhbl9yZWxlYXNlLAorfTsKKworLyoKKyogdXNiIGNsYXNzIGRyaXZlciBpbmZvIGluIG9yZGVyIHRvIGdldCBhIG1pbm9yIG51bWJlciBmcm9tIHRoZSB1c2IgY29yZSwKKyogYW5kIHRvIGhhdmUgdGhlIGRldmljZSByZWdpc3RlcmVkIHdpdGggdGhlIGRyaXZlciBjb3JlCisqLworc3RhdGljIHN0cnVjdCB1c2JfY2xhc3NfZHJpdmVyIGZ0ZGlfZWxhbl9qdGFnX2NsYXNzID0geworICAgICAgICAubmFtZSA9ICJmdGRpLSVkLWp0YWciLAorICAgICAgICAuZm9wcyA9ICZmdGRpX2VsYW5fZm9wcywKKyAgICAgICAgLm1pbm9yX2Jhc2UgPSBVU0JfRlRESV9FTEFOX01JTk9SX0JBU0UsCit9OworCisvKgorKiB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSBmb3IgdGhlCisqIEVMQU4gRlBHQSBzdGF0ZSBtYWNoZ2luZSBwcm9jZXNzb3IgdGhhdAorKiBsaWVzIG9uIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBGVERJIGNoaXAKKyovCisjZGVmaW5lIGNQQ0l1MTMycmQgMHgwCisjZGVmaW5lIGNQQ0l1MTMyd3IgMHgxCisjZGVmaW5lIGNQQ0lpb3JkIDB4MgorI2RlZmluZSBjUENJaW93ciAweDMKKyNkZWZpbmUgY1BDSW1lbXJkIDB4NgorI2RlZmluZSBjUENJbWVtd3IgMHg3CisjZGVmaW5lIGNQQ0ljZmdyZCAweEEKKyNkZWZpbmUgY1BDSWNmZ3dyIDB4QgorI2RlZmluZSBjUENJbnVsbCAweEYKKyNkZWZpbmUgY1UxMzJjbWRfc3RhdHVzIDB4MAorI2RlZmluZSBjVTEzMmZsYXNoIDB4MQorI2RlZmluZSBjUElEc2V0dXAgMHgwCisjZGVmaW5lIGNQSURvdXQgMHgxCisjZGVmaW5lIGNQSURpbiAweDIKKyNkZWZpbmUgY1BJRGlub25jZSAweDMKKyNkZWZpbmUgY0NDbm9lcnJvciAweDAKKyNkZWZpbmUgY0NDY3JjIDB4MQorI2RlZmluZSBjQ0NiaXRzdHVmZiAweDIKKyNkZWZpbmUgY0NDdG9nZ2xlIDB4MworI2RlZmluZSBjQ0NzdGFsbCAweDQKKyNkZWZpbmUgY0NDbm9yZXNwIDB4NQorI2RlZmluZSBjQ0NiYWRwaWQxIDB4NgorI2RlZmluZSBjQ0NiYWRwaWQyIDB4NworI2RlZmluZSBjQ0NkYXRhb3ZlcnJ1biAweDgKKyNkZWZpbmUgY0NDZGF0YXVuZGVycnVuIDB4OQorI2RlZmluZSBjQ0NidWZmb3ZlcnJ1biAweEMKKyNkZWZpbmUgY0NDYnVmZnVuZGVycnVuIDB4RAorI2RlZmluZSBjQ0Nub3RhY2Nlc3NlZCAweEYKK3N0YXRpYyBpbnQgZnRkaV9lbGFuX3dyaXRlX3JlZyhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksIHUzMiBkYXRhKQoreworICAgICAgd2FpdDppZiAoZnRkaS0+ZGlzY29ubmVjdGVkID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBjb21tYW5kX3NpemU7CisgICAgICAgICAgICAgICAgZG93bigmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICBjb21tYW5kX3NpemUgPSBmdGRpLT5jb21tYW5kX25leHQgLSBmdGRpLT5jb21tYW5kX2hlYWQ7CisgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRfc2l6ZSA8IENPTU1BTkRfU0laRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfY29tbWFuZCAqY29tbWFuZCA9ICZmdGRpLT5jb21tYW5kWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EX01BU0sgJiBmdGRpLT5jb21tYW5kX25leHRdOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+aGVhZGVyID0gMHgwMCB8IGNQQ0l1MTMyd3I7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5sZW5ndGggPSAweDA0OworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+YWRkcmVzcyA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT53aWR0aCA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5mb2xsb3dzID0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPnZhbHVlID0gZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmJ1ZmZlciA9ICZjb21tYW5kLT52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmNvbW1hbmRfbmV4dCArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaV9lbGFuX2tpY2tfY29tbWFuZF9xdWV1ZShmdGRpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgbXNsZWVwKDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHdhaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKK3N0YXRpYyBpbnQgZnRkaV9lbGFuX3dyaXRlX2NvbmZpZyhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksIGludCBjb25maWdfb2Zmc2V0LAorICAgICAgICB1OCB3aWR0aCwgdTMyIGRhdGEpCit7CisgICAgICAgIHU4IGFkZHJlc3NvZnMgPSBjb25maWdfb2Zmc2V0IC8gNDsKKyAgICAgIHdhaXQ6aWYgKGZ0ZGktPmRpc2Nvbm5lY3RlZCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgY29tbWFuZF9zaXplOworICAgICAgICAgICAgICAgIGRvd24oJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgY29tbWFuZF9zaXplID0gZnRkaS0+Y29tbWFuZF9uZXh0IC0gZnRkaS0+Y29tbWFuZF9oZWFkOworICAgICAgICAgICAgICAgIGlmIChjb21tYW5kX3NpemUgPCBDT01NQU5EX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2NvbW1hbmQgKmNvbW1hbmQgPSAmZnRkaS0+Y29tbWFuZFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORF9NQVNLICYgZnRkaS0+Y29tbWFuZF9uZXh0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmhlYWRlciA9IDB4MDAgfCAoY1BDSWNmZ3dyICYgMHgwRik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5sZW5ndGggPSAweDA0OworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+YWRkcmVzcyA9IGFkZHJlc3NvZnM7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT53aWR0aCA9IDB4MDAgfCAod2lkdGggJiAweDBGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmZvbGxvd3MgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+dmFsdWUgPSBkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+YnVmZmVyID0gJmNvbW1hbmQtPnZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+Y29tbWFuZF9uZXh0ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpX2VsYW5fa2lja19jb21tYW5kX3F1ZXVlKGZ0ZGkpOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBtc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gd2FpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKworc3RhdGljIGludCBmdGRpX2VsYW5fd3JpdGVfcGNpbWVtKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwgaW50IG1lbV9vZmZzZXQsCisgICAgICAgIHU4IHdpZHRoLCB1MzIgZGF0YSkKK3sKKyAgICAgICAgdTggYWRkcmVzc29mcyA9IG1lbV9vZmZzZXQgLyA0OworICAgICAgd2FpdDppZiAoZnRkaS0+ZGlzY29ubmVjdGVkID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBjb21tYW5kX3NpemU7CisgICAgICAgICAgICAgICAgZG93bigmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICBjb21tYW5kX3NpemUgPSBmdGRpLT5jb21tYW5kX25leHQgLSBmdGRpLT5jb21tYW5kX2hlYWQ7CisgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRfc2l6ZSA8IENPTU1BTkRfU0laRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfY29tbWFuZCAqY29tbWFuZCA9ICZmdGRpLT5jb21tYW5kWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EX01BU0sgJiBmdGRpLT5jb21tYW5kX25leHRdOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+aGVhZGVyID0gMHgwMCB8IChjUENJbWVtd3IgJiAweDBGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmxlbmd0aCA9IDB4MDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5hZGRyZXNzID0gYWRkcmVzc29mczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPndpZHRoID0gMHgwMCB8ICh3aWR0aCAmIDB4MEYpOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+Zm9sbG93cyA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT52YWx1ZSA9IGRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5idWZmZXIgPSAmY29tbWFuZC0+dmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5jb21tYW5kX25leHQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9raWNrX2NvbW1hbmRfcXVldWUoZnRkaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zbGVlcCgxMDApOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byB3YWl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorCitpbnQgdXNiX2Z0ZGlfZWxhbl93cml0ZV9wY2ltZW0oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IG1lbV9vZmZzZXQsCisgICAgICAgIHU4IHdpZHRoLCB1MzIgZGF0YSkKK3sKKyAgICAgICAgc3RydWN0IHVzYl9mdGRpICpmdGRpID0gcGxhdGZvcm1fZGV2aWNlX3RvX3VzYl9mdGRpKHBkZXYpOworICAgICAgICByZXR1cm4gZnRkaV9lbGFuX3dyaXRlX3BjaW1lbShmdGRpLCBtZW1fb2Zmc2V0LCB3aWR0aCwgZGF0YSk7Cit9CisKKworRVhQT1JUX1NZTUJPTF9HUEwodXNiX2Z0ZGlfZWxhbl93cml0ZV9wY2ltZW0pOworc3RhdGljIGludCBmdGRpX2VsYW5fcmVhZF9yZWcoc3RydWN0IHVzYl9mdGRpICpmdGRpLCB1MzIgKmRhdGEpCit7CisgICAgICB3YWl0OmlmIChmdGRpLT5kaXNjb25uZWN0ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGNvbW1hbmRfc2l6ZTsKKyAgICAgICAgICAgICAgICBpbnQgcmVzcG9uZF9zaXplOworICAgICAgICAgICAgICAgIGRvd24oJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgY29tbWFuZF9zaXplID0gZnRkaS0+Y29tbWFuZF9uZXh0IC0gZnRkaS0+Y29tbWFuZF9oZWFkOworICAgICAgICAgICAgICAgIHJlc3BvbmRfc2l6ZSA9IGZ0ZGktPnJlc3BvbmRfbmV4dCAtIGZ0ZGktPnJlc3BvbmRfaGVhZDsKKyAgICAgICAgICAgICAgICBpZiAoY29tbWFuZF9zaXplIDwgQ09NTUFORF9TSVpFICYmIHJlc3BvbmRfc2l6ZSA8IFJFU1BPTkRfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2NvbW1hbmQgKmNvbW1hbmQgPSAmZnRkaS0+Y29tbWFuZFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORF9NQVNLICYgZnRkaS0+Y29tbWFuZF9uZXh0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3Jlc3BvbmQgKnJlc3BvbmQgPSAmZnRkaS0+cmVzcG9uZFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTUE9ORF9NQVNLICYgZnRkaS0+cmVzcG9uZF9uZXh0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXN1bHQgPSAtRU5PREVWOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uZC0+cmVzdWx0ID0gJnJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmQtPmhlYWRlciA9IGNvbW1hbmQtPmhlYWRlciA9IDB4MDAgfCBjUENJdTEzMnJkOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bGVuZ3RoID0gMHgwNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmQtPmFkZHJlc3MgPSBjb21tYW5kLT5hZGRyZXNzID0gY1UxMzJjbWRfc3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+d2lkdGggPSAweDAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+Zm9sbG93cyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT52YWx1ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5idWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uZC0+dmFsdWUgPSBkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9jb21wbGV0aW9uKCZyZXNwb25kLT53YWl0X2NvbXBsZXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+Y29tbWFuZF9uZXh0ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5yZXNwb25kX25leHQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9raWNrX2NvbW1hbmRfcXVldWUoZnRkaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRfZm9yX2NvbXBsZXRpb24oJnJlc3BvbmQtPndhaXRfY29tcGxldGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zbGVlcCgxMDApOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byB3YWl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorCitpbnQgdXNiX2Z0ZGlfZWxhbl9yZWFkX3JlZyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB1MzIgKmRhdGEpCit7CisgICAgICAgIHN0cnVjdCB1c2JfZnRkaSAqZnRkaSA9IHBsYXRmb3JtX2RldmljZV90b191c2JfZnRkaShwZGV2KTsKKyAgICAgICAgcmV0dXJuIGZ0ZGlfZWxhbl9yZWFkX3JlZyhmdGRpLCBkYXRhKTsKK30KKworCitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfZnRkaV9lbGFuX3JlYWRfcmVnKTsKK3N0YXRpYyBpbnQgZnRkaV9lbGFuX3JlYWRfY29uZmlnKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwgaW50IGNvbmZpZ19vZmZzZXQsCisgICAgICAgIHU4IHdpZHRoLCB1MzIgKmRhdGEpCit7CisgICAgICAgIHU4IGFkZHJlc3NvZnMgPSBjb25maWdfb2Zmc2V0IC8gNDsKKyAgICAgIHdhaXQ6aWYgKGZ0ZGktPmRpc2Nvbm5lY3RlZCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgY29tbWFuZF9zaXplOworICAgICAgICAgICAgICAgIGludCByZXNwb25kX3NpemU7CisgICAgICAgICAgICAgICAgZG93bigmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICBjb21tYW5kX3NpemUgPSBmdGRpLT5jb21tYW5kX25leHQgLSBmdGRpLT5jb21tYW5kX2hlYWQ7CisgICAgICAgICAgICAgICAgcmVzcG9uZF9zaXplID0gZnRkaS0+cmVzcG9uZF9uZXh0IC0gZnRkaS0+cmVzcG9uZF9oZWFkOworICAgICAgICAgICAgICAgIGlmIChjb21tYW5kX3NpemUgPCBDT01NQU5EX1NJWkUgJiYgcmVzcG9uZF9zaXplIDwgUkVTUE9ORF9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfY29tbWFuZCAqY29tbWFuZCA9ICZmdGRpLT5jb21tYW5kWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EX01BU0sgJiBmdGRpLT5jb21tYW5kX25leHRdOworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfcmVzcG9uZCAqcmVzcG9uZCA9ICZmdGRpLT5yZXNwb25kWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNQT05EX01BU0sgJiBmdGRpLT5yZXNwb25kX25leHRdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IC1FTk9ERVY7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25kLT5yZXN1bHQgPSAmcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uZC0+aGVhZGVyID0gY29tbWFuZC0+aGVhZGVyID0gMHgwMCB8IChjUENJY2ZncmQgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmxlbmd0aCA9IDB4MDQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25kLT5hZGRyZXNzID0gY29tbWFuZC0+YWRkcmVzcyA9IGFkZHJlc3NvZnM7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT53aWR0aCA9IDB4MDAgfCAod2lkdGggJiAweDBGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmZvbGxvd3MgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+dmFsdWUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+YnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmQtPnZhbHVlID0gZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfY29tcGxldGlvbigmcmVzcG9uZC0+d2FpdF9jb21wbGV0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmNvbW1hbmRfbmV4dCArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+cmVzcG9uZF9uZXh0ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpX2VsYW5fa2lja19jb21tYW5kX3F1ZXVlKGZ0ZGkpOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICB3YWl0X2Zvcl9jb21wbGV0aW9uKCZyZXNwb25kLT53YWl0X2NvbXBsZXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBtc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gd2FpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKworc3RhdGljIGludCBmdGRpX2VsYW5fcmVhZF9wY2ltZW0oc3RydWN0IHVzYl9mdGRpICpmdGRpLCBpbnQgbWVtX29mZnNldCwKKyAgICAgICAgdTggd2lkdGgsIHUzMiAqZGF0YSkKK3sKKyAgICAgICAgdTggYWRkcmVzc29mcyA9IG1lbV9vZmZzZXQgLyA0OworICAgICAgd2FpdDppZiAoZnRkaS0+ZGlzY29ubmVjdGVkID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBjb21tYW5kX3NpemU7CisgICAgICAgICAgICAgICAgaW50IHJlc3BvbmRfc2l6ZTsKKyAgICAgICAgICAgICAgICBkb3duKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICAgICAgICAgIGNvbW1hbmRfc2l6ZSA9IGZ0ZGktPmNvbW1hbmRfbmV4dCAtIGZ0ZGktPmNvbW1hbmRfaGVhZDsKKyAgICAgICAgICAgICAgICByZXNwb25kX3NpemUgPSBmdGRpLT5yZXNwb25kX25leHQgLSBmdGRpLT5yZXNwb25kX2hlYWQ7CisgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRfc2l6ZSA8IENPTU1BTkRfU0laRSAmJiByZXNwb25kX3NpemUgPCBSRVNQT05EX1NJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9jb21tYW5kICpjb21tYW5kID0gJmZ0ZGktPmNvbW1hbmRbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkRfTUFTSyAmIGZ0ZGktPmNvbW1hbmRfbmV4dF07CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9yZXNwb25kICpyZXNwb25kID0gJmZ0ZGktPnJlc3BvbmRbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU1BPTkRfTUFTSyAmIGZ0ZGktPnJlc3BvbmRfbmV4dF07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gLUVOT0RFVjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmQtPnJlc3VsdCA9ICZyZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25kLT5oZWFkZXIgPSBjb21tYW5kLT5oZWFkZXIgPSAweDAwIHwgKGNQQ0ltZW1yZCAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEYpOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bGVuZ3RoID0gMHgwNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmQtPmFkZHJlc3MgPSBjb21tYW5kLT5hZGRyZXNzID0gYWRkcmVzc29mczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPndpZHRoID0gMHgwMCB8ICh3aWR0aCAmIDB4MEYpOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+Zm9sbG93cyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT52YWx1ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5idWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uZC0+dmFsdWUgPSBkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9jb21wbGV0aW9uKCZyZXNwb25kLT53YWl0X2NvbXBsZXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+Y29tbWFuZF9uZXh0ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5yZXNwb25kX25leHQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9raWNrX2NvbW1hbmRfcXVldWUoZnRkaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRfZm9yX2NvbXBsZXRpb24oJnJlc3BvbmQtPndhaXRfY29tcGxldGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zbGVlcCgxMDApOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byB3YWl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorCitpbnQgdXNiX2Z0ZGlfZWxhbl9yZWFkX3BjaW1lbShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgbWVtX29mZnNldCwKKyAgICAgICAgdTggd2lkdGgsIHUzMiAqZGF0YSkKK3sKKyAgICAgICAgc3RydWN0IHVzYl9mdGRpICpmdGRpID0gcGxhdGZvcm1fZGV2aWNlX3RvX3VzYl9mdGRpKHBkZXYpOworICAgICAgICBpZiAoZnRkaS0+aW5pdGlhbGl6ZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZnRkaV9lbGFuX3JlYWRfcGNpbWVtKGZ0ZGksIG1lbV9vZmZzZXQsIHdpZHRoLCBkYXRhKTsKK30KKworCitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfZnRkaV9lbGFuX3JlYWRfcGNpbWVtKTsKK3N0YXRpYyBpbnQgZnRkaV9lbGFuX2Vkc2V0X3NldHVwKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSwgdTggZWRfbnVtYmVyLAorICAgICAgICB2b2lkICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4IGFkZHJlc3MsIHU4IGVwX251bWJlciwgdTggdG9nZ2xlX2JpdHMsCisgICAgICAgIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggKmJ1ZiwgaW50IGxlbiwKKyAgICAgICAgaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwgaW50IHJlcGVhdF9udW1iZXIsCisgICAgICAgICBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKSkKK3sKKyAgICAgICAgdTggZWQgPSBlZF9udW1iZXIgLSAxOworICAgICAgd2FpdDppZiAoZnRkaS0+ZGlzY29ubmVjdGVkID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgaWYgKGZ0ZGktPmluaXRpYWxpemVkID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgY29tbWFuZF9zaXplOworICAgICAgICAgICAgICAgIGRvd24oJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgY29tbWFuZF9zaXplID0gZnRkaS0+Y29tbWFuZF9uZXh0IC0gZnRkaS0+Y29tbWFuZF9oZWFkOworICAgICAgICAgICAgICAgIGlmIChjb21tYW5kX3NpemUgPCBDT01NQU5EX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3RhcmdldCAqdGFyZ2V0ID0gJmZ0ZGktPnRhcmdldFtlZF07CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9jb21tYW5kICpjb21tYW5kID0gJmZ0ZGktPmNvbW1hbmRbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkRfTUFTSyAmIGZ0ZGktPmNvbW1hbmRfbmV4dF07CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5oZWFkZXIgPSAweDgwIHwgKGVkIDw8IDUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bGVuZ3RoID0gMHg4MDA3OworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+YWRkcmVzcyA9ICh0b2dnbGVfYml0cyA8PCA2KSB8IChlcF9udW1iZXIgPDwgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoYWRkcmVzcyA8PCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPndpZHRoID0gdXNiX21heHBhY2tldCh1cmItPmRldiwgdXJiLT5waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfcGlwZW91dCh1cmItPnBpcGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmZvbGxvd3MgPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+dmFsdWUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+YnVmZmVyID0gdXJiLT5zZXR1cF9wYWNrZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPmVuZHAgPSBlbmRwOworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT51cmIgPSB1cmI7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPmFjdGl2ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5jb21tYW5kX25leHQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9raWNrX2NvbW1hbmRfcXVldWUoZnRkaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zbGVlcCgxMDApOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byB3YWl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorCitpbnQgdXNiX2Z0ZGlfZWxhbl9lZHNldF9zZXR1cChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB1OCBlZF9udW1iZXIsCisgICAgICAgIHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggYWRkcmVzcywgdTggZXBfbnVtYmVyLCB1OCB0b2dnbGVfYml0cywKKyAgICAgICAgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLCBpbnQgbGVuLAorICAgICAgICBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLCBpbnQgcmVwZWF0X251bWJlciwKKyAgICAgICAgIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpKQoreworICAgICAgICBzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkgPSBwbGF0Zm9ybV9kZXZpY2VfdG9fdXNiX2Z0ZGkocGRldik7CisgICAgICAgIHJldHVybiBmdGRpX2VsYW5fZWRzZXRfc2V0dXAoZnRkaSwgZWRfbnVtYmVyLCBlbmRwLCB1cmIsIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgZXBfbnVtYmVyLCB0b2dnbGVfYml0cywgY2FsbGJhY2spOworfQorCisKK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9mdGRpX2VsYW5fZWRzZXRfc2V0dXApOworc3RhdGljIGludCBmdGRpX2VsYW5fZWRzZXRfaW5wdXQoc3RydWN0IHVzYl9mdGRpICpmdGRpLCB1OCBlZF9udW1iZXIsCisgICAgICAgIHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggYWRkcmVzcywgdTggZXBfbnVtYmVyLCB1OCB0b2dnbGVfYml0cywKKyAgICAgICAgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLCBpbnQgbGVuLAorICAgICAgICBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLCBpbnQgcmVwZWF0X251bWJlciwKKyAgICAgICAgIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpKQoreworICAgICAgICB1OCBlZCA9IGVkX251bWJlciAtIDE7CisgICAgICB3YWl0OmlmIChmdGRpLT5kaXNjb25uZWN0ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgICAgIH0gZWxzZSBpZiAoZnRkaS0+aW5pdGlhbGl6ZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBjb21tYW5kX3NpemU7CisgICAgICAgICAgICAgICAgZG93bigmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICBjb21tYW5kX3NpemUgPSBmdGRpLT5jb21tYW5kX25leHQgLSBmdGRpLT5jb21tYW5kX2hlYWQ7CisgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRfc2l6ZSA8IENPTU1BTkRfU0laRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdGFyZ2V0ICp0YXJnZXQgPSAmZnRkaS0+dGFyZ2V0W2VkXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2NvbW1hbmQgKmNvbW1hbmQgPSAmZnRkaS0+Y29tbWFuZFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORF9NQVNLICYgZnRkaS0+Y29tbWFuZF9uZXh0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdfbGVuZ3RoID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+aGVhZGVyID0gMHg4MiB8IChlZCA8PCA1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmdfbGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bGVuZ3RoID0gMHgwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmdfbGVuZ3RoID4gMTAyNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5sZW5ndGggPSAweDgwMDAgfCAxMDIzOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmxlbmd0aCA9IDB4ODAwMCB8IChyZW1haW5pbmdfbGVuZ3RoIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmFkZHJlc3MgPSAodG9nZ2xlX2JpdHMgPDwgNikgfCAoZXBfbnVtYmVyIDw8IDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKGFkZHJlc3MgPDwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT53aWR0aCA9IHVzYl9tYXhwYWNrZXQodXJiLT5kZXYsIHVyYi0+cGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3BpcGVvdXQodXJiLT5waXBlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5mb2xsb3dzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPnZhbHVlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPmNhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPmVuZHAgPSBlbmRwOworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT51cmIgPSB1cmI7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPmFjdGl2ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5jb21tYW5kX25leHQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGlfZWxhbl9raWNrX2NvbW1hbmRfcXVldWUoZnRkaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1cCgmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zbGVlcCgxMDApOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byB3YWl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorfQorCitpbnQgdXNiX2Z0ZGlfZWxhbl9lZHNldF9pbnB1dChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB1OCBlZF9udW1iZXIsCisgICAgICAgIHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggYWRkcmVzcywgdTggZXBfbnVtYmVyLCB1OCB0b2dnbGVfYml0cywKKyAgICAgICAgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLCBpbnQgbGVuLAorICAgICAgICBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLCBpbnQgcmVwZWF0X251bWJlciwKKyAgICAgICAgIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpKQoreworICAgICAgICBzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkgPSBwbGF0Zm9ybV9kZXZpY2VfdG9fdXNiX2Z0ZGkocGRldik7CisgICAgICAgIHJldHVybiBmdGRpX2VsYW5fZWRzZXRfaW5wdXQoZnRkaSwgZWRfbnVtYmVyLCBlbmRwLCB1cmIsIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgZXBfbnVtYmVyLCB0b2dnbGVfYml0cywgY2FsbGJhY2spOworfQorCisKK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9mdGRpX2VsYW5fZWRzZXRfaW5wdXQpOworc3RhdGljIGludCBmdGRpX2VsYW5fZWRzZXRfZW1wdHkoc3RydWN0IHVzYl9mdGRpICpmdGRpLCB1OCBlZF9udW1iZXIsCisgICAgICAgIHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggYWRkcmVzcywgdTggZXBfbnVtYmVyLCB1OCB0b2dnbGVfYml0cywKKyAgICAgICAgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLCBpbnQgbGVuLAorICAgICAgICBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLCBpbnQgcmVwZWF0X251bWJlciwKKyAgICAgICAgIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpKQoreworICAgICAgICB1OCBlZCA9IGVkX251bWJlciAtIDE7CisgICAgICB3YWl0OmlmIChmdGRpLT5kaXNjb25uZWN0ZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgICAgIH0gZWxzZSBpZiAoZnRkaS0+aW5pdGlhbGl6ZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBjb21tYW5kX3NpemU7CisgICAgICAgICAgICAgICAgZG93bigmZnRkaS0+dTEzMl9sb2NrKTsKKyAgICAgICAgICAgICAgICBjb21tYW5kX3NpemUgPSBmdGRpLT5jb21tYW5kX25leHQgLSBmdGRpLT5jb21tYW5kX2hlYWQ7CisgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRfc2l6ZSA8IENPTU1BTkRfU0laRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfdGFyZ2V0ICp0YXJnZXQgPSAmZnRkaS0+dGFyZ2V0W2VkXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2NvbW1hbmQgKmNvbW1hbmQgPSAmZnRkaS0+Y29tbWFuZFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUFORF9NQVNLICYgZnRkaS0+Y29tbWFuZF9uZXh0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmhlYWRlciA9IDB4ODEgfCAoZWQgPDwgNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5sZW5ndGggPSAweDAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5hZGRyZXNzID0gKHRvZ2dsZV9iaXRzIDw8IDYpIHwgKGVwX251bWJlciA8PCAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChhZGRyZXNzIDw8IDApOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+d2lkdGggPSB1c2JfbWF4cGFja2V0KHVyYi0+ZGV2LCB1cmItPnBpcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9waXBlb3V0KHVyYi0+cGlwZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+Zm9sbG93cyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT52YWx1ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5idWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT5jYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT5lbmRwID0gZW5kcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+dXJiID0gdXJiOworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT5hY3RpdmUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+Y29tbWFuZF9uZXh0ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpX2VsYW5fa2lja19jb21tYW5kX3F1ZXVlKGZ0ZGkpOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBtc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gd2FpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKworaW50IHVzYl9mdGRpX2VsYW5fZWRzZXRfZW1wdHkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgdTggZWRfbnVtYmVyLAorICAgICAgICB2b2lkICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4IGFkZHJlc3MsIHU4IGVwX251bWJlciwgdTggdG9nZ2xlX2JpdHMsCisgICAgICAgIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggKmJ1ZiwgaW50IGxlbiwKKyAgICAgICAgaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwgaW50IHJlcGVhdF9udW1iZXIsCisgICAgICAgICBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKSkKK3sKKyAgICAgICAgc3RydWN0IHVzYl9mdGRpICpmdGRpID0gcGxhdGZvcm1fZGV2aWNlX3RvX3VzYl9mdGRpKHBkZXYpOworICAgICAgICByZXR1cm4gZnRkaV9lbGFuX2Vkc2V0X2VtcHR5KGZ0ZGksIGVkX251bWJlciwgZW5kcCwgdXJiLCBhZGRyZXNzLAorICAgICAgICAgICAgICAgIGVwX251bWJlciwgdG9nZ2xlX2JpdHMsIGNhbGxiYWNrKTsKK30KKworCitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfZnRkaV9lbGFuX2Vkc2V0X2VtcHR5KTsKK3N0YXRpYyBpbnQgZnRkaV9lbGFuX2Vkc2V0X291dHB1dChzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksIHU4IGVkX251bWJlciwKKyAgICAgICAgdm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCBhZGRyZXNzLCB1OCBlcF9udW1iZXIsIHU4IHRvZ2dsZV9iaXRzLAorICAgICAgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsIGludCBsZW4sCisgICAgICAgIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsIGludCByZXBlYXRfbnVtYmVyLAorICAgICAgICAgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkpCit7CisgICAgICAgIHU4IGVkID0gZWRfbnVtYmVyIC0gMTsKKyAgICAgIHdhaXQ6aWYgKGZ0ZGktPmRpc2Nvbm5lY3RlZCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfSBlbHNlIGlmIChmdGRpLT5pbml0aWFsaXplZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGNvbW1hbmRfc2l6ZTsKKyAgICAgICAgICAgICAgICBkb3duKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICAgICAgICAgIGNvbW1hbmRfc2l6ZSA9IGZ0ZGktPmNvbW1hbmRfbmV4dCAtIGZ0ZGktPmNvbW1hbmRfaGVhZDsKKyAgICAgICAgICAgICAgICBpZiAoY29tbWFuZF9zaXplIDwgQ09NTUFORF9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1OCAqYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUxNiB1cmJfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGF0YVszMCAqMyArIDRdOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZCA9IGRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbSA9IChzaXplb2YoZGF0YSkgLSAxKSAvIDM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl90YXJnZXQgKnRhcmdldCA9ICZmdGRpLT50YXJnZXRbZWRdOworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHUxMzJfY29tbWFuZCAqY29tbWFuZCA9ICZmdGRpLT5jb21tYW5kWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NQU5EX01BU0sgJiBmdGRpLT5jb21tYW5kX25leHRdOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+aGVhZGVyID0gMHg4MSB8IChlZCA8PCA1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmFkZHJlc3MgPSAodG9nZ2xlX2JpdHMgPDwgNikgfCAoZXBfbnVtYmVyIDw8IDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKGFkZHJlc3MgPDwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT53aWR0aCA9IHVzYl9tYXhwYWNrZXQodXJiLT5kZXYsIHVyYi0+cGlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3BpcGVvdXQodXJiLT5waXBlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5mb2xsb3dzID0gbWluKDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT52YWx1ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5idWZmZXIgPSB1cmItPnRyYW5zZmVyX2J1ZmZlciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmxlbmd0aCA9IDB4ODAwMCB8IChjb21tYW5kLT5mb2xsb3dzIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBiID0gY29tbWFuZC0+YnVmZmVyOworICAgICAgICAgICAgICAgICAgICAgICAgdXJiX3NpemUgPSBjb21tYW5kLT5mb2xsb3dzOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodXJiX3NpemUtLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiBtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSsrIDwgbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ID0gc3ByaW50ZihkLCAiICUwMlgiLCAqYisrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICs9IHc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCArPSB3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICs9IHNwcmludGYoZCwgIiAuLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT5jYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT5lbmRwID0gZW5kcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+dXJiID0gdXJiOworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LT5hY3RpdmUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+Y29tbWFuZF9uZXh0ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpX2VsYW5fa2lja19jb21tYW5kX3F1ZXVlKGZ0ZGkpOworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBtc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gd2FpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKworaW50IHVzYl9mdGRpX2VsYW5fZWRzZXRfb3V0cHV0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHU4IGVkX251bWJlciwKKyAgICAgICAgdm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCBhZGRyZXNzLCB1OCBlcF9udW1iZXIsIHU4IHRvZ2dsZV9iaXRzLAorICAgICAgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsIGludCBsZW4sCisgICAgICAgIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsIGludCByZXBlYXRfbnVtYmVyLAorICAgICAgICAgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkpCit7CisgICAgICAgIHN0cnVjdCB1c2JfZnRkaSAqZnRkaSA9IHBsYXRmb3JtX2RldmljZV90b191c2JfZnRkaShwZGV2KTsKKyAgICAgICAgcmV0dXJuIGZ0ZGlfZWxhbl9lZHNldF9vdXRwdXQoZnRkaSwgZWRfbnVtYmVyLCBlbmRwLCB1cmIsIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgZXBfbnVtYmVyLCB0b2dnbGVfYml0cywgY2FsbGJhY2spOworfQorCisKK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9mdGRpX2VsYW5fZWRzZXRfb3V0cHV0KTsKK3N0YXRpYyBpbnQgZnRkaV9lbGFuX2Vkc2V0X3NpbmdsZShzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksIHU4IGVkX251bWJlciwKKyAgICAgICAgdm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCBhZGRyZXNzLCB1OCBlcF9udW1iZXIsIHU4IHRvZ2dsZV9iaXRzLAorICAgICAgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsIGludCBsZW4sCisgICAgICAgIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsIGludCByZXBlYXRfbnVtYmVyLAorICAgICAgICAgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkpCit7CisgICAgICAgIHU4IGVkID0gZWRfbnVtYmVyIC0gMTsKKyAgICAgIHdhaXQ6aWYgKGZ0ZGktPmRpc2Nvbm5lY3RlZCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfSBlbHNlIGlmIChmdGRpLT5pbml0aWFsaXplZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGNvbW1hbmRfc2l6ZTsKKyAgICAgICAgICAgICAgICBkb3duKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICAgICAgICAgIGNvbW1hbmRfc2l6ZSA9IGZ0ZGktPmNvbW1hbmRfbmV4dCAtIGZ0ZGktPmNvbW1hbmRfaGVhZDsKKyAgICAgICAgICAgICAgICBpZiAoY29tbWFuZF9zaXplIDwgQ09NTUFORF9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nX2xlbmd0aCA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX3RhcmdldCAqdGFyZ2V0ID0gJmZ0ZGktPnRhcmdldFtlZF07CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl9jb21tYW5kICpjb21tYW5kID0gJmZ0ZGktPmNvbW1hbmRbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1BTkRfTUFTSyAmIGZ0ZGktPmNvbW1hbmRfbmV4dF07CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5oZWFkZXIgPSAweDgzIHwgKGVkIDw8IDUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ19sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5sZW5ndGggPSAweDAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlbWFpbmluZ19sZW5ndGggPiAxMDI0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmxlbmd0aCA9IDB4ODAwMCB8IDEwMjM7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bGVuZ3RoID0gMHg4MDAwIHwgKHJlbWFpbmluZ19sZW5ndGggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+YWRkcmVzcyA9ICh0b2dnbGVfYml0cyA8PCA2KSB8IChlcF9udW1iZXIgPDwgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoYWRkcmVzcyA8PCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPndpZHRoID0gdXNiX21heHBhY2tldCh1cmItPmRldiwgdXJiLT5waXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2JfcGlwZW91dCh1cmItPnBpcGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmZvbGxvd3MgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+dmFsdWUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+YnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+Y2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+ZW5kcCA9IGVuZHA7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPnVyYiA9IHVyYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+YWN0aXZlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmNvbW1hbmRfbmV4dCArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaV9lbGFuX2tpY2tfY29tbWFuZF9xdWV1ZShmdGRpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgbXNsZWVwKDEwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHdhaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKK2ludCB1c2JfZnRkaV9lbGFuX2Vkc2V0X3NpbmdsZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB1OCBlZF9udW1iZXIsCisgICAgICAgIHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggYWRkcmVzcywgdTggZXBfbnVtYmVyLCB1OCB0b2dnbGVfYml0cywKKyAgICAgICAgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLCBpbnQgbGVuLAorICAgICAgICBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLCBpbnQgcmVwZWF0X251bWJlciwKKyAgICAgICAgIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpKQoreworICAgICAgICBzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkgPSBwbGF0Zm9ybV9kZXZpY2VfdG9fdXNiX2Z0ZGkocGRldik7CisgICAgICAgIHJldHVybiBmdGRpX2VsYW5fZWRzZXRfc2luZ2xlKGZ0ZGksIGVkX251bWJlciwgZW5kcCwgdXJiLCBhZGRyZXNzLAorICAgICAgICAgICAgICAgIGVwX251bWJlciwgdG9nZ2xlX2JpdHMsIGNhbGxiYWNrKTsKK30KKworCitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfZnRkaV9lbGFuX2Vkc2V0X3NpbmdsZSk7CitzdGF0aWMgaW50IGZ0ZGlfZWxhbl9lZHNldF9mbHVzaChzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGksIHU4IGVkX251bWJlciwKKyAgICAgICAgdm9pZCAqZW5kcCkKK3sKKyAgICAgICAgdTggZWQgPSBlZF9udW1iZXIgLSAxOworICAgICAgICBpZiAoZnRkaS0+ZGlzY29ubmVjdGVkID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgICAgICB9IGVsc2UgaWYgKGZ0ZGktPmluaXRpYWxpemVkID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdTEzMl90YXJnZXQgKnRhcmdldCA9ICZmdGRpLT50YXJnZXRbZWRdOworICAgICAgICAgICAgICAgIGRvd24oJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldC0+YWJhbmRvbmluZyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+YWJhbmRvbmluZyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgd2FpdF8xOmlmICh0YXJnZXQtPmFjdGl2ZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21tYW5kX3NpemUgPSBmdGRpLT5jb21tYW5kX25leHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmNvbW1hbmRfaGVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1hbmRfc2l6ZSA8IENPTU1BTkRfU0laRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB1MTMyX2NvbW1hbmQgKmNvbW1hbmQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ0ZGktPmNvbW1hbmRbQ09NTUFORF9NQVNLICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmNvbW1hbmRfbmV4dF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+aGVhZGVyID0gMHg4MCB8IChlZCA8PCA1KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bGVuZ3RoID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5hZGRyZXNzID0gMHgwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT53aWR0aCA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+Zm9sbG93cyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+dmFsdWUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPmJ1ZmZlciA9ICZjb21tYW5kLT52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5jb21tYW5kX25leHQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpX2VsYW5fa2lja19jb21tYW5kX3F1ZXVlKGZ0ZGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zbGVlcCgxMDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd24oJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byB3YWl0XzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVwKCZmdGRpLT51MTMyX2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKK2ludCB1c2JfZnRkaV9lbGFuX2Vkc2V0X2ZsdXNoKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHU4IGVkX251bWJlciwKKyAgICAgICAgdm9pZCAqZW5kcCkKK3sKKyAgICAgICAgc3RydWN0IHVzYl9mdGRpICpmdGRpID0gcGxhdGZvcm1fZGV2aWNlX3RvX3VzYl9mdGRpKHBkZXYpOworICAgICAgICByZXR1cm4gZnRkaV9lbGFuX2Vkc2V0X2ZsdXNoKGZ0ZGksIGVkX251bWJlciwgZW5kcCk7Cit9CisKKworRVhQT1JUX1NZTUJPTF9HUEwodXNiX2Z0ZGlfZWxhbl9lZHNldF9mbHVzaCk7CitzdGF0aWMgaW50IGZ0ZGlfZWxhbl9mbHVzaF9pbnB1dF9maWZvKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSkKK3sKKyAgICAgICAgaW50IHJldHJ5X29uX2VtcHR5ID0gMTA7CisgICAgICAgIGludCByZXRyeV9vbl90aW1lb3V0ID0gNTsKKyAgICAgICAgaW50IHJldHJ5X29uX3N0YXR1cyA9IDIwOworICAgICAgbW9yZTp7CisgICAgICAgICAgICAgICAgaW50IHBhY2tldF9ieXRlcyA9IDA7CisgICAgICAgICAgICAgICAgaW50IHJldHZhbCA9IHVzYl9idWxrX21zZyhmdGRpLT51ZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3JjdmJ1bGtwaXBlKGZ0ZGktPnVkZXYsIGZ0ZGktPmJ1bGtfaW5fZW5kcG9pbnRBZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5idWxrX2luX2J1ZmZlciwgZnRkaS0+YnVsa19pbl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBhY2tldF9ieXRlcywgbXNlY3NfdG9famlmZmllcygxMDApKTsKKyAgICAgICAgICAgICAgICBpZiAocGFja2V0X2J5dGVzID4gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkaWFnWzMwICozICsgNF07CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkID0gZGlhZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtID0gKHNpemVvZihkaWFnKSAtIDEpIC8gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmIgPSBmdGRpLT5idWxrX2luX2J1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlc19yZWFkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpYWdbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhY2tldF9ieXRlcy0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSAqYisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCA8IG0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICs9IHNwcmludGYoZCwgIiAlMDJYIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYgJiBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChieXRlc19yZWFkID4gbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICs9IHNwcmludGYoZCwgIiAuLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc19yZWFkICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBtb3JlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFja2V0X2J5dGVzID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzMSA9IGZ0ZGktPmJ1bGtfaW5fYnVmZmVyWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzMiA9IGZ0ZGktPmJ1bGtfaW5fYnVmZmVyWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMxID09IDB4MzEgJiYgczIgPT0gMHg2MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0cnlfb25fc3RhdHVzLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbW9yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgIlNUQVRVUyBFUlJPUiByZXRyeSBsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWl0IHJlYWNoZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhY2tldF9ieXRlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYjEgPSBmdGRpLT5idWxrX2luX2J1ZmZlclswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgIm9ubHkgb25lIGJ5dGUgZmx1c2hlZCBmcm9tIEYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUREkgPSAlMDJYXG4iLCBiMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0cnlfb25fc3RhdHVzLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbW9yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgIlNUQVRVUyBFUlJPUiByZXRyeSBsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWl0IHJlYWNoZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldHZhbCA9PSAtRVRJTUVET1VUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0cnlfb25fdGltZW91dC0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG1vcmU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJUSU1FRCBPVVQgcmV0cnkgbGltaSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidCByZWFjaGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXR2YWwgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5X29uX2VtcHR5LS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbW9yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgImVtcHR5IHBhY2tldCByZXRyeSBsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWl0IHJlYWNoZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiZXJyb3IgPSAlZFxuIiwgcmV0dmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKK30KKworCisvKgorKiBzZW5kIHRoZSBsb25nIGZsdXNoIHNlcXVlbmNlCisqCisqLworc3RhdGljIGludCBmdGRpX2VsYW5fc3luY2hyb25pemVfZmx1c2goc3RydWN0IHVzYl9mdGRpICpmdGRpKQoreworICAgICAgICBpbnQgcmV0dmFsOworICAgICAgICBzdHJ1Y3QgdXJiICp1cmI7CisgICAgICAgIGNoYXIgKmJ1ZjsKKyAgICAgICAgaW50IEkgPSAyNTc7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgaWYgKCF1cmIpIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJjb3VsZCBub3QgYWxsb2MgYSB1cmIgZm9yIGZsdXNoIHNlcXUiCisgICAgICAgICAgICAgICAgICAgICAgICAiZW5jZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKyAgICAgICAgYnVmID0gdXNiX2J1ZmZlcl9hbGxvYyhmdGRpLT51ZGV2LCBJLCBHRlBfS0VSTkVMLCAmdXJiLT50cmFuc2Zlcl9kbWEpOworICAgICAgICBpZiAoIWJ1ZikgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgImNvdWxkIG5vdCBnZXQgYSBidWZmZXIgZm9yIGZsdXNoIHNlcSIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1ZW5jZVxuIik7CisgICAgICAgICAgICAgICAgdXNiX2ZyZWVfdXJiKHVyYik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKEktLSA+IDApCisgICAgICAgICAgICAgICAgYnVmW2krK10gPSAweDU1OworICAgICAgICB1c2JfZmlsbF9idWxrX3VyYih1cmIsIGZ0ZGktPnVkZXYsIHVzYl9zbmRidWxrcGlwZShmdGRpLT51ZGV2LAorICAgICAgICAgICAgICAgIGZ0ZGktPmJ1bGtfb3V0X2VuZHBvaW50QWRkciksIGJ1ZiwgaSwKKyAgICAgICAgICAgICAgICBmdGRpX2VsYW5fd3JpdGVfYnVsa19jYWxsYmFjaywgZnRkaSk7CisgICAgICAgIHVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisgICAgICAgIHJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0tFUk5FTCk7CisgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJmYWlsZWQgdG8gc3VibWl0IHVyYiBjb250YWluaW5nIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZmx1c2ggc2VxdWVuY2VcbiIpOworICAgICAgICAgICAgICAgIHVzYl9idWZmZXJfZnJlZShmdGRpLT51ZGV2LCBpLCBidWYsIHVyYi0+dHJhbnNmZXJfZG1hKTsKKyAgICAgICAgICAgICAgICB1c2JfZnJlZV91cmIodXJiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgfQorICAgICAgICB1c2JfZnJlZV91cmIodXJiKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyogc2VuZCB0aGUgcmVzZXQgc2VxdWVuY2UKKyoKKyovCitzdGF0aWMgaW50IGZ0ZGlfZWxhbl9zeW5jaHJvbml6ZV9yZXNldChzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpCit7CisgICAgICAgIGludCByZXR2YWw7CisgICAgICAgIHN0cnVjdCB1cmIgKnVyYjsKKyAgICAgICAgY2hhciAqYnVmOworICAgICAgICBpbnQgSSA9IDQ7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKyAgICAgICAgaWYgKCF1cmIpIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJjb3VsZCBub3QgZ2V0IGEgdXJiIGZvciB0aGUgcmVzZXQgc2UiCisgICAgICAgICAgICAgICAgICAgICAgICAicXVlbmNlXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgfQorICAgICAgICBidWYgPSB1c2JfYnVmZmVyX2FsbG9jKGZ0ZGktPnVkZXYsIEksIEdGUF9LRVJORUwsICZ1cmItPnRyYW5zZmVyX2RtYSk7CisgICAgICAgIGlmICghYnVmKSB7CisgICAgICAgICAgICAgICAgZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiY291bGQgbm90IGdldCBhIGJ1ZmZlciBmb3IgdGhlIHJlc2V0IgorICAgICAgICAgICAgICAgICAgICAgICAgIiBzZXF1ZW5jZVxuIik7CisgICAgICAgICAgICAgICAgdXNiX2ZyZWVfdXJiKHVyYik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKyAgICAgICAgYnVmW2krK10gPSAweDU1OworICAgICAgICBidWZbaSsrXSA9IDB4QUE7CisgICAgICAgIGJ1ZltpKytdID0gMHg1QTsKKyAgICAgICAgYnVmW2krK10gPSAweEE1OworICAgICAgICB1c2JfZmlsbF9idWxrX3VyYih1cmIsIGZ0ZGktPnVkZXYsIHVzYl9zbmRidWxrcGlwZShmdGRpLT51ZGV2LAorICAgICAgICAgICAgICAgIGZ0ZGktPmJ1bGtfb3V0X2VuZHBvaW50QWRkciksIGJ1ZiwgaSwKKyAgICAgICAgICAgICAgICBmdGRpX2VsYW5fd3JpdGVfYnVsa19jYWxsYmFjaywgZnRkaSk7CisgICAgICAgIHVyYi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisgICAgICAgIHJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0tFUk5FTCk7CisgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJmYWlsZWQgdG8gc3VibWl0IHVyYiBjb250YWluaW5nIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAicmVzZXQgc2VxdWVuY2VcbiIpOworICAgICAgICAgICAgICAgIHVzYl9idWZmZXJfZnJlZShmdGRpLT51ZGV2LCBpLCBidWYsIHVyYi0+dHJhbnNmZXJfZG1hKTsKKyAgICAgICAgICAgICAgICB1c2JfZnJlZV91cmIodXJiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgfQorICAgICAgICB1c2JfZnJlZV91cmIodXJiKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnRkaV9lbGFuX3N5bmNocm9uaXplKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSkKK3sKKyAgICAgICAgaW50IHJldHZhbDsKKyAgICAgICAgaW50IGxvbmdfc3RvcCA9IDEwOworICAgICAgICBpbnQgcmV0cnlfb25fdGltZW91dCA9IDU7CisgICAgICAgIGludCByZXRyeV9vbl9lbXB0eSA9IDEwOworICAgICAgICBpbnQgZXJyX2NvdW50ID0gMDsKKyAgICAgICAgcmV0dmFsID0gZnRkaV9lbGFuX2ZsdXNoX2lucHV0X2ZpZm8oZnRkaSk7CisgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgZnRkaS0+YnVsa19pbl9sZWZ0ID0gMDsKKyAgICAgICAgZnRkaS0+YnVsa19pbl9sYXN0ID0gLTE7CisgICAgICAgIHdoaWxlIChsb25nX3N0b3AtLSA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVhZF9zdG9wOworICAgICAgICAgICAgICAgIGludCByZWFkX3N0dWNrOworICAgICAgICAgICAgICAgIHJldHZhbCA9IGZ0ZGlfZWxhbl9zeW5jaHJvbml6ZV9mbHVzaChmdGRpKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBmdGRpX2VsYW5fZmx1c2hfaW5wdXRfZmlmbyhmdGRpKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgICAgcmVzZXQ6cmV0dmFsID0gZnRkaV9lbGFuX3N5bmNocm9uaXplX3Jlc2V0KGZ0ZGkpOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICAgICAgICAgIHJlYWRfc3RvcCA9IDEwMDsKKyAgICAgICAgICAgICAgICByZWFkX3N0dWNrID0gMTA7CisgICAgICAgICAgICAgIHJlYWQ6eworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhY2tldF9ieXRlcyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSB1c2JfYnVsa19tc2coZnRkaS0+dWRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3JjdmJ1bGtwaXBlKGZ0ZGktPnVkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmJ1bGtfaW5fZW5kcG9pbnRBZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+YnVsa19pbl9idWZmZXIsIGZ0ZGktPmJ1bGtfaW5fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhY2tldF9ieXRlcywgbXNlY3NfdG9famlmZmllcyg1MDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWNrZXRfYnl0ZXMgPiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGlhZ1szMCAqMyArIDRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkID0gZGlhZzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG0gPSAoc2l6ZW9mKGRpYWcpIC0gMSkgLyAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpiID0gZnRkaS0+YnVsa19pbl9idWZmZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlc19yZWFkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZ1swXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYWNrZXRfYnl0ZXMtLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gKmIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCA8IG0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gc3ByaW50ZihkLCAiICUwMlgiLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGVzX3JlYWQgPiBtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICs9IHNwcmludGYoZCwgIiAuLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3JlYWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAweDdFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gMHg1NSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVhZF9zdG9wLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgInJldHIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5IGxpbWl0IHJlYWNoZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhY2tldF9ieXRlcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBzMSA9IGZ0ZGktPmJ1bGtfaW5fYnVmZmVyWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHMyID0gZnRkaS0+YnVsa19pbl9idWZmZXJbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzMSA9PSAweDMxICYmIHMyID09IDB4MDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZF9zdHVjay0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzMSA9PSAweDMxICYmIHMyID09IDB4NjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZF9zdG9wLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgInJldHIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5IGxpbWl0IHJlYWNoZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkX3N0b3AtLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAicmV0ciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInkgbGltaXQgcmVhY2hlZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFja2V0X2J5dGVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZF9zdG9wLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgInJldHJ5IGxpbWl0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFjaGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXR2YWwgPT0gLUVUSU1FRE9VVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0cnlfb25fdGltZW91dC0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJUSU1FRCBPVVQgcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJ5IGxpbWl0IHJlYWNoZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldHZhbCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXRyeV9vbl9lbXB0eS0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJlbXB0eSBwYWNrZXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHJ5IGxpbWl0IHJlYWNoZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfY291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiZXJyb3IgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVhZF9zdG9wLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZWFkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgInJldHJ5IGxpbWl0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFjaGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJmYWlsZWQgdG8gc3luY2hyb25pemVcbiIpOworICAgICAgICByZXR1cm4gLUVGQVVMVDsKK30KKworc3RhdGljIGludCBmdGRpX2VsYW5fc3R1Y2tfd2FpdGluZyhzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpCit7CisgICAgICAgIGludCByZXRyeV9vbl9lbXB0eSA9IDEwOworICAgICAgICBpbnQgcmV0cnlfb25fdGltZW91dCA9IDU7CisgICAgICAgIGludCByZXRyeV9vbl9zdGF0dXMgPSA1MDsKKyAgICAgIG1vcmU6eworICAgICAgICAgICAgICAgIGludCBwYWNrZXRfYnl0ZXMgPSAwOworICAgICAgICAgICAgICAgIGludCByZXR2YWwgPSB1c2JfYnVsa19tc2coZnRkaS0+dWRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYl9yY3ZidWxrcGlwZShmdGRpLT51ZGV2LCBmdGRpLT5idWxrX2luX2VuZHBvaW50QWRkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+YnVsa19pbl9idWZmZXIsIGZ0ZGktPmJ1bGtfaW5fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwYWNrZXRfYnl0ZXMsIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworICAgICAgICAgICAgICAgIGlmIChwYWNrZXRfYnl0ZXMgPiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGRpYWdbMzAgKjMgKyA0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmQgPSBkaWFnOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG0gPSAoc2l6ZW9mKGRpYWcpIC0gMSkgLyAzOworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYiA9IGZ0ZGktPmJ1bGtfaW5fYnVmZmVyOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzX3JlYWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZGlhZ1swXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFja2V0X2J5dGVzLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYyA9ICpiKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc19yZWFkIDwgbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gc3ByaW50ZihkLCAiICUwMlgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRiAmIGMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGVzX3JlYWQgPiBtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gc3ByaW50ZihkLCAiIC4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3JlYWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG1vcmU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYWNrZXRfYnl0ZXMgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHMxID0gZnRkaS0+YnVsa19pbl9idWZmZXJbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHMyID0gZnRkaS0+YnVsa19pbl9idWZmZXJbMV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoczEgPT0gMHgzMSAmJiBzMiA9PSAweDYwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXRyeV9vbl9zdGF0dXMtLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNsZWVwKDUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG1vcmU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYWNrZXRfYnl0ZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGIxID0gZnRkaS0+YnVsa19pbl9idWZmZXJbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJvbmx5IG9uZSBieXRlIGZsdXNoZWQgZnJvbSBGIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVERJID0gJTAyWFxuIiwgYjEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5X29uX3N0YXR1cy0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2xlZXAoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbW9yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgIlNUQVRVUyBFUlJPUiByZXRyeSBsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWl0IHJlYWNoZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldHZhbCA9PSAtRVRJTUVET1VUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0cnlfb25fdGltZW91dC0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG1vcmU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJUSU1FRCBPVVQgcmV0cnkgbGltaSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidCByZWFjaGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXR2YWwgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldHJ5X29uX2VtcHR5LS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbW9yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgImVtcHR5IHBhY2tldCByZXRyeSBsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWl0IHJlYWNoZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiZXJyb3IgPSAlZFxuIiwgcmV0dmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZnRkaV9lbGFuX2NoZWNraW5nUENJKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSkKK3sKKyAgICAgICAgaW50IFV4eHhTdGF0dXMgPSBmdGRpX2VsYW5fcmVhZF9yZWcoZnRkaSwgJmZ0ZGktPmNvbnRyb2xyZWcpOworICAgICAgICBpZiAoVXh4eFN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVXh4eFN0YXR1czsKKyAgICAgICAgaWYgKGZ0ZGktPmNvbnRyb2xyZWcgJiAweDAwNDAwMDAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGZ0ZGktPmNhcmRfZWplY3RlZCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5jYXJkX2VqZWN0ZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAiQ0FSRCBFSkVDVEVEIC0gY29udHJvbHJlZyA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFhcbiIsIGZ0ZGktPmNvbnRyb2xyZWcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1OCBmbiA9IGZ0ZGktPmZ1bmN0aW9uIC0gMTsKKyAgICAgICAgICAgICAgICBpbnQgYWN0aXZlUENJZm4gPSBmbiA8PCA4OworICAgICAgICAgICAgICAgIHUzMiBwY2lkYXRhOworICAgICAgICAgICAgICAgIHUzMiBwY2lWSUQ7CisgICAgICAgICAgICAgICAgdTMyIHBjaVBJRDsKKyAgICAgICAgICAgICAgICBpbnQgcmVnID0gMDsKKyAgICAgICAgICAgICAgICBVeHh4U3RhdHVzID0gZnRkaV9lbGFuX3JlYWRfY29uZmlnKGZ0ZGksIGFjdGl2ZVBDSWZuIHwgcmVnLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBjaWRhdGEpOworICAgICAgICAgICAgICAgIGlmIChVeHh4U3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFV4eHhTdGF0dXM7CisgICAgICAgICAgICAgICAgcGNpVklEID0gcGNpZGF0YSAmIDB4RkZGRjsKKyAgICAgICAgICAgICAgICBwY2lQSUQgPSAocGNpZGF0YSA+PiAxNikgJiAweEZGRkY7CisgICAgICAgICAgICAgICAgaWYgKHBjaVZJRCA9PSBmdGRpLT5wbGF0Zm9ybV9kYXRhLnZlbmRvciAmJiBwY2lQSUQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPnBsYXRmb3JtX2RhdGEuZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmZnRkaS0+dWRldi0+ZGV2LCAidmVuZG9yPSUwNFggcGNpVklEPSUwNFggZGV2aSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNlPSUwNFggcGNpUElEPSUwNFhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPnBsYXRmb3JtX2RhdGEudmVuZG9yLCBwY2lWSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPnBsYXRmb3JtX2RhdGEuZGV2aWNlLCBwY2lQSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKK3N0YXRpYyBpbnQgZnRkaV9lbGFuX2VudW1lcmF0ZVBDSShzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGkpCit7CisgICAgICAgIHUzMiBsYXRlbmNlX3RpbWVyOworICAgICAgICB1MzIgY29udHJvbHJlZzsKKyAgICAgICAgaW50IFV4eHhTdGF0dXM7CisgICAgICAgIHUzMiBwY2lkYXRhOworICAgICAgICBpbnQgcmVnID0gMDsKKyAgICAgICAgaW50IGZvdW5kT0hDSSA9IDA7CisgICAgICAgIHU4IGZuOworICAgICAgICBpbnQgYWN0aXZlUENJZm4gPSAwOworICAgICAgICB1MzIgcGNpVklEID0gMDsKKyAgICAgICAgdTMyIHBjaVBJRCA9IDA7CisgICAgICAgIFV4eHhTdGF0dXMgPSBmdGRpX2VsYW5fcmVhZF9yZWcoZnRkaSwgJmNvbnRyb2xyZWcpOworICAgICAgICBpZiAoVXh4eFN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVXh4eFN0YXR1czsKKyAgICAgICAgVXh4eFN0YXR1cyA9IGZ0ZGlfZWxhbl93cml0ZV9yZWcoZnRkaSwgMHgwMDAwMDAwMEwpOworICAgICAgICBpZiAoVXh4eFN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVXh4eFN0YXR1czsKKyAgICAgICAgbXNsZWVwKDc1MCk7CisgICAgICAgIFV4eHhTdGF0dXMgPSBmdGRpX2VsYW5fd3JpdGVfcmVnKGZ0ZGksIDB4MDAwMDAyMDBMIHwgMHgxMDApOworICAgICAgICBpZiAoVXh4eFN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVXh4eFN0YXR1czsKKyAgICAgICAgVXh4eFN0YXR1cyA9IGZ0ZGlfZWxhbl93cml0ZV9yZWcoZnRkaSwgMHgwMDAwMDIwMEwgfCAweDUwMCk7CisgICAgICAgIGlmIChVeHh4U3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVeHh4U3RhdHVzOworICAgICAgICBVeHh4U3RhdHVzID0gZnRkaV9lbGFuX3JlYWRfcmVnKGZ0ZGksICZjb250cm9scmVnKTsKKyAgICAgICAgaWYgKFV4eHhTdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFV4eHhTdGF0dXM7CisgICAgICAgIFV4eHhTdGF0dXMgPSBmdGRpX2VsYW5fd3JpdGVfcmVnKGZ0ZGksIDB4MDAwMDAyMENMIHwgMHgwMDApOworICAgICAgICBpZiAoVXh4eFN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVXh4eFN0YXR1czsKKyAgICAgICAgVXh4eFN0YXR1cyA9IGZ0ZGlfZWxhbl93cml0ZV9yZWcoZnRkaSwgMHgwMDAwMDIwREwgfCAweDAwMCk7CisgICAgICAgIGlmIChVeHh4U3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVeHh4U3RhdHVzOworICAgICAgICBtc2xlZXAoMjUwKTsKKyAgICAgICAgVXh4eFN0YXR1cyA9IGZ0ZGlfZWxhbl93cml0ZV9yZWcoZnRkaSwgMHgwMDAwMDIwRkwgfCAweDAwMCk7CisgICAgICAgIGlmIChVeHh4U3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVeHh4U3RhdHVzOworICAgICAgICBVeHh4U3RhdHVzID0gZnRkaV9lbGFuX3JlYWRfcmVnKGZ0ZGksICZjb250cm9scmVnKTsKKyAgICAgICAgaWYgKFV4eHhTdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFV4eHhTdGF0dXM7CisgICAgICAgIFV4eHhTdGF0dXMgPSBmdGRpX2VsYW5fd3JpdGVfcmVnKGZ0ZGksIDB4MDAwMDAyNUZMIHwgMHg4MDApOworICAgICAgICBpZiAoVXh4eFN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVXh4eFN0YXR1czsKKyAgICAgICAgVXh4eFN0YXR1cyA9IGZ0ZGlfZWxhbl9yZWFkX3JlZyhmdGRpLCAmY29udHJvbHJlZyk7CisgICAgICAgIGlmIChVeHh4U3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVeHh4U3RhdHVzOworICAgICAgICBVeHh4U3RhdHVzID0gZnRkaV9lbGFuX3JlYWRfcmVnKGZ0ZGksICZjb250cm9scmVnKTsKKyAgICAgICAgaWYgKFV4eHhTdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFV4eHhTdGF0dXM7CisgICAgICAgIG1zbGVlcCgxMDAwKTsKKyAgICAgICAgZm9yIChmbiA9IDA7IChmbiA8IDQpICYmICghZm91bmRPSENJKTsgZm4rKykgeworICAgICAgICAgICAgICAgIGFjdGl2ZVBDSWZuID0gZm4gPDwgODsKKyAgICAgICAgICAgICAgICBmdGRpLT5mdW5jdGlvbiA9IGZuICsgMTsKKyAgICAgICAgICAgICAgICBVeHh4U3RhdHVzID0gZnRkaV9lbGFuX3JlYWRfY29uZmlnKGZ0ZGksIGFjdGl2ZVBDSWZuIHwgcmVnLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBjaWRhdGEpOworICAgICAgICAgICAgICAgIGlmIChVeHh4U3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFV4eHhTdGF0dXM7CisgICAgICAgICAgICAgICAgcGNpVklEID0gcGNpZGF0YSAmIDB4RkZGRjsKKyAgICAgICAgICAgICAgICBwY2lQSUQgPSAocGNpZGF0YSA+PiAxNikgJiAweEZGRkY7CisgICAgICAgICAgICAgICAgaWYgKChwY2lWSUQgPT0gMHgxMDQ1KSAmJiAocGNpUElEID09IDB4Yzg2MSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kT0hDSSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocGNpVklEID09IDB4MTAzMykgJiYgKHBjaVBJRCA9PSAweDAwMzUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE9IQ0kgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHBjaVZJRCA9PSAweDEwYjkpICYmIChwY2lQSUQgPT0gMHg1MjM3KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRPSENJID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChwY2lWSUQgPT0gMHgxMWMxKSAmJiAocGNpUElEID09IDB4NTgwMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kT0hDSSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocGNpVklEID09IDB4MTFBQikgJiYgKHBjaVBJRCA9PSAweDFGQTYpKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmb3VuZE9IQ0kgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtRU5YSU87CisgICAgICAgIH0KKyAgICAgICAgZnRkaS0+cGxhdGZvcm1fZGF0YS52ZW5kb3IgPSBwY2lWSUQ7CisgICAgICAgIGZ0ZGktPnBsYXRmb3JtX2RhdGEuZGV2aWNlID0gcGNpUElEOworICAgICAgICBVeHh4U3RhdHVzID0gZnRkaV9lbGFuX3dyaXRlX3JlZyhmdGRpLCAweDAwMDAwMjVGTCB8IDB4MjgwMCk7CisgICAgICAgIGlmIChVeHh4U3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVeHh4U3RhdHVzOworICAgICAgICByZWcgPSAxNjsKKyAgICAgICAgVXh4eFN0YXR1cyA9IGZ0ZGlfZWxhbl93cml0ZV9jb25maWcoZnRkaSwgYWN0aXZlUENJZm4gfCByZWcsIDAsCisgICAgICAgICAgICAgICAgMHhGRkZGRkZGRik7CisgICAgICAgIGlmIChVeHh4U3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVeHh4U3RhdHVzOworICAgICAgICBVeHh4U3RhdHVzID0gZnRkaV9lbGFuX3JlYWRfY29uZmlnKGZ0ZGksIGFjdGl2ZVBDSWZuIHwgcmVnLCAwLAorICAgICAgICAgICAgICAgICZwY2lkYXRhKTsKKyAgICAgICAgaWYgKFV4eHhTdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFV4eHhTdGF0dXM7CisgICAgICAgIFV4eHhTdGF0dXMgPSBmdGRpX2VsYW5fd3JpdGVfY29uZmlnKGZ0ZGksIGFjdGl2ZVBDSWZuIHwgcmVnLCAwLAorICAgICAgICAgICAgICAgIDB4RjAwMDAwMDApOworICAgICAgICBpZiAoVXh4eFN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVXh4eFN0YXR1czsKKyAgICAgICAgVXh4eFN0YXR1cyA9IGZ0ZGlfZWxhbl9yZWFkX2NvbmZpZyhmdGRpLCBhY3RpdmVQQ0lmbiB8IHJlZywgMCwKKyAgICAgICAgICAgICAgICAmcGNpZGF0YSk7CisgICAgICAgIGlmIChVeHh4U3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVeHh4U3RhdHVzOworICAgICAgICByZWcgPSAxMjsKKyAgICAgICAgVXh4eFN0YXR1cyA9IGZ0ZGlfZWxhbl9yZWFkX2NvbmZpZyhmdGRpLCBhY3RpdmVQQ0lmbiB8IHJlZywgMCwKKyAgICAgICAgICAgICAgICAmbGF0ZW5jZV90aW1lcik7CisgICAgICAgIGlmIChVeHh4U3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVeHh4U3RhdHVzOworICAgICAgICBsYXRlbmNlX3RpbWVyICY9IDB4RkZGRjAwRkY7CisgICAgICAgIGxhdGVuY2VfdGltZXIgfD0gMHgwMDAwMTYwMDsKKyAgICAgICAgVXh4eFN0YXR1cyA9IGZ0ZGlfZWxhbl93cml0ZV9jb25maWcoZnRkaSwgYWN0aXZlUENJZm4gfCByZWcsIDB4MDAsCisgICAgICAgICAgICAgICAgbGF0ZW5jZV90aW1lcik7CisgICAgICAgIGlmIChVeHh4U3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVeHh4U3RhdHVzOworICAgICAgICBVeHh4U3RhdHVzID0gZnRkaV9lbGFuX3JlYWRfY29uZmlnKGZ0ZGksIGFjdGl2ZVBDSWZuIHwgcmVnLCAwLAorICAgICAgICAgICAgICAgICZwY2lkYXRhKTsKKyAgICAgICAgaWYgKFV4eHhTdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFV4eHhTdGF0dXM7CisgICAgICAgIHJlZyA9IDQ7CisgICAgICAgIFV4eHhTdGF0dXMgPSBmdGRpX2VsYW5fd3JpdGVfY29uZmlnKGZ0ZGksIGFjdGl2ZVBDSWZuIHwgcmVnLCAweDAwLAorICAgICAgICAgICAgICAgIDB4MDYpOworICAgICAgICBpZiAoVXh4eFN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVXh4eFN0YXR1czsKKyAgICAgICAgVXh4eFN0YXR1cyA9IGZ0ZGlfZWxhbl9yZWFkX2NvbmZpZyhmdGRpLCBhY3RpdmVQQ0lmbiB8IHJlZywgMCwKKyAgICAgICAgICAgICAgICAmcGNpZGF0YSk7CisgICAgICAgIGlmIChVeHh4U3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVeHh4U3RhdHVzOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmdGRpX2VsYW5fc2V0dXBPSENJKHN0cnVjdCB1c2JfZnRkaSAqZnRkaSkKK3sKKyAgICAgICAgdTMyIHBjaWRhdGE7CisgICAgICAgIGludCBVMTMyU3RhdHVzOworICAgICAgICBpbnQgcmVnOworICAgICAgICBpbnQgcmVzZXRfcmVwZWF0ID0gMDsKKyAgICAgIGRvX3Jlc2V0OnJlZyA9IDg7CisgICAgICAgIFUxMzJTdGF0dXMgPSBmdGRpX2VsYW5fd3JpdGVfcGNpbWVtKGZ0ZGksIHJlZywgMHgwZSwgMHgwMSk7CisgICAgICAgIGlmIChVMTMyU3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVMTMyU3RhdHVzOworICAgICAgcmVzZXRfY2hlY2s6eworICAgICAgICAgICAgICAgIFUxMzJTdGF0dXMgPSBmdGRpX2VsYW5fcmVhZF9wY2ltZW0oZnRkaSwgcmVnLCAwLCAmcGNpZGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKFUxMzJTdGF0dXMpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVTEzMlN0YXR1czsKKyAgICAgICAgICAgICAgICBpZiAocGNpZGF0YSAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zbGVlcCg1MDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2V0X3JlcGVhdCsrID4gMTAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0X3JlcGVhdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9fcmVzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXNldF9jaGVjazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZ290byBkdW1wX3JlZ3M7CisgICAgICAgIG1zbGVlcCg1MDApOworICAgICAgICByZWcgPSAweDI4OworICAgICAgICBVMTMyU3RhdHVzID0gZnRkaV9lbGFuX3dyaXRlX3BjaW1lbShmdGRpLCByZWcsIDB4MDAsIDB4MTEwMDAwMDApOworICAgICAgICBpZiAoVTEzMlN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVTEzMlN0YXR1czsKKyAgICAgICAgVTEzMlN0YXR1cyA9IGZ0ZGlfZWxhbl9yZWFkX3BjaW1lbShmdGRpLCByZWcsIDAsICZwY2lkYXRhKTsKKyAgICAgICAgaWYgKFUxMzJTdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFUxMzJTdGF0dXM7CisgICAgICAgIHJlZyA9IDB4NDA7CisgICAgICAgIFUxMzJTdGF0dXMgPSBmdGRpX2VsYW5fd3JpdGVfcGNpbWVtKGZ0ZGksIHJlZywgMHgwMCwgMHgyZWRmKTsKKyAgICAgICAgaWYgKFUxMzJTdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFUxMzJTdGF0dXM7CisgICAgICAgIFUxMzJTdGF0dXMgPSBmdGRpX2VsYW5fcmVhZF9wY2ltZW0oZnRkaSwgcmVnLCAwLCAmcGNpZGF0YSk7CisgICAgICAgIGlmIChVMTMyU3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVMTMyU3RhdHVzOworICAgICAgICByZWcgPSAweDM0OworICAgICAgICBVMTMyU3RhdHVzID0gZnRkaV9lbGFuX3dyaXRlX3BjaW1lbShmdGRpLCByZWcsIDB4MDAsIDB4MmVkZjJlZGYpOworICAgICAgICBpZiAoVTEzMlN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVTEzMlN0YXR1czsKKyAgICAgICAgVTEzMlN0YXR1cyA9IGZ0ZGlfZWxhbl9yZWFkX3BjaW1lbShmdGRpLCByZWcsIDAsICZwY2lkYXRhKTsKKyAgICAgICAgaWYgKFUxMzJTdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFUxMzJTdGF0dXM7CisgICAgICAgIHJlZyA9IDQ7CisgICAgICAgIFUxMzJTdGF0dXMgPSBmdGRpX2VsYW5fd3JpdGVfcGNpbWVtKGZ0ZGksIHJlZywgMHgwMCwgMHhBMCk7CisgICAgICAgIGlmIChVMTMyU3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVMTMyU3RhdHVzOworICAgICAgICBVMTMyU3RhdHVzID0gZnRkaV9lbGFuX3JlYWRfcGNpbWVtKGZ0ZGksIHJlZywgMCwgJnBjaWRhdGEpOworICAgICAgICBpZiAoVTEzMlN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVTEzMlN0YXR1czsKKyAgICAgICAgbXNsZWVwKDI1MCk7CisgICAgICAgIHJlZyA9IDg7CisgICAgICAgIFUxMzJTdGF0dXMgPSBmdGRpX2VsYW5fd3JpdGVfcGNpbWVtKGZ0ZGksIHJlZywgMHgwZSwgMHgwNCk7CisgICAgICAgIGlmIChVMTMyU3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVMTMyU3RhdHVzOworICAgICAgICBVMTMyU3RhdHVzID0gZnRkaV9lbGFuX3JlYWRfcGNpbWVtKGZ0ZGksIHJlZywgMCwgJnBjaWRhdGEpOworICAgICAgICBpZiAoVTEzMlN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVTEzMlN0YXR1czsKKyAgICAgICAgcmVnID0gMHgyODsKKyAgICAgICAgVTEzMlN0YXR1cyA9IGZ0ZGlfZWxhbl9yZWFkX3BjaW1lbShmdGRpLCByZWcsIDAsICZwY2lkYXRhKTsKKyAgICAgICAgaWYgKFUxMzJTdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFUxMzJTdGF0dXM7CisgICAgICAgIHJlZyA9IDg7CisgICAgICAgIFUxMzJTdGF0dXMgPSBmdGRpX2VsYW5fcmVhZF9wY2ltZW0oZnRkaSwgcmVnLCAwLCAmcGNpZGF0YSk7CisgICAgICAgIGlmIChVMTMyU3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVMTMyU3RhdHVzOworICAgICAgICByZWcgPSAweDQ4OworICAgICAgICBVMTMyU3RhdHVzID0gZnRkaV9lbGFuX3dyaXRlX3BjaW1lbShmdGRpLCByZWcsIDB4MDAsIDB4MDAwMDEyMDApOworICAgICAgICBpZiAoVTEzMlN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVTEzMlN0YXR1czsKKyAgICAgICAgVTEzMlN0YXR1cyA9IGZ0ZGlfZWxhbl9yZWFkX3BjaW1lbShmdGRpLCByZWcsIDAsICZwY2lkYXRhKTsKKyAgICAgICAgaWYgKFUxMzJTdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFUxMzJTdGF0dXM7CisgICAgICAgIHJlZyA9IDB4NTQ7CisgICAgICAgIFUxMzJTdGF0dXMgPSBmdGRpX2VsYW5fcmVhZF9wY2ltZW0oZnRkaSwgcmVnLCAwLCAmcGNpZGF0YSk7CisgICAgICAgIGlmIChVMTMyU3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVMTMyU3RhdHVzOworICAgICAgICByZWcgPSAweDU4OworICAgICAgICBVMTMyU3RhdHVzID0gZnRkaV9lbGFuX3JlYWRfcGNpbWVtKGZ0ZGksIHJlZywgMCwgJnBjaWRhdGEpOworICAgICAgICBpZiAoVTEzMlN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVTEzMlN0YXR1czsKKyAgICAgICAgcmVnID0gMHgzNDsKKyAgICAgICAgVTEzMlN0YXR1cyA9IGZ0ZGlfZWxhbl93cml0ZV9wY2ltZW0oZnRkaSwgcmVnLCAweDAwLCAweDI4MDAyZWRmKTsKKyAgICAgICAgaWYgKFUxMzJTdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFUxMzJTdGF0dXM7CisgICAgICAgIFUxMzJTdGF0dXMgPSBmdGRpX2VsYW5fcmVhZF9wY2ltZW0oZnRkaSwgcmVnLCAwLCAmcGNpZGF0YSk7CisgICAgICAgIGlmIChVMTMyU3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVMTMyU3RhdHVzOworICAgICAgICBtc2xlZXAoMTAwKTsKKyAgICAgICAgcmVnID0gMHg1MDsKKyAgICAgICAgVTEzMlN0YXR1cyA9IGZ0ZGlfZWxhbl93cml0ZV9wY2ltZW0oZnRkaSwgcmVnLCAweDAwLCAweDEwMDAwKTsKKyAgICAgICAgaWYgKFUxMzJTdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFUxMzJTdGF0dXM7CisgICAgICAgIHJlZyA9IDB4NTQ7CisgICAgICBwb3dlcl9jaGVjazpVMTMyU3RhdHVzID0gZnRkaV9lbGFuX3JlYWRfcGNpbWVtKGZ0ZGksIHJlZywgMCwgJnBjaWRhdGEpOworICAgICAgICBpZiAoVTEzMlN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVTEzMlN0YXR1czsKKyAgICAgICAgaWYgKCEocGNpZGF0YSAmIDEpKSB7CisgICAgICAgICAgICAgICAgbXNsZWVwKDUwMCk7CisgICAgICAgICAgICAgICAgZ290byBwb3dlcl9jaGVjazsKKyAgICAgICAgfQorICAgICAgICBtc2xlZXAoMzAwMCk7CisgICAgICAgIHJlZyA9IDB4NTQ7CisgICAgICAgIFUxMzJTdGF0dXMgPSBmdGRpX2VsYW5fcmVhZF9wY2ltZW0oZnRkaSwgcmVnLCAwLCAmcGNpZGF0YSk7CisgICAgICAgIGlmIChVMTMyU3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVMTMyU3RhdHVzOworICAgICAgICByZWcgPSAweDU4OworICAgICAgICBVMTMyU3RhdHVzID0gZnRkaV9lbGFuX3JlYWRfcGNpbWVtKGZ0ZGksIHJlZywgMCwgJnBjaWRhdGEpOworICAgICAgICBpZiAoVTEzMlN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVTEzMlN0YXR1czsKKyAgICAgICAgcmVnID0gMHg1NDsKKyAgICAgICAgVTEzMlN0YXR1cyA9IGZ0ZGlfZWxhbl93cml0ZV9wY2ltZW0oZnRkaSwgcmVnLCAweDAwLCAweDAyKTsKKyAgICAgICAgaWYgKFUxMzJTdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFUxMzJTdGF0dXM7CisgICAgICAgIFUxMzJTdGF0dXMgPSBmdGRpX2VsYW5fcmVhZF9wY2ltZW0oZnRkaSwgcmVnLCAwLCAmcGNpZGF0YSk7CisgICAgICAgIGlmIChVMTMyU3RhdHVzKQorICAgICAgICAgICAgICAgIHJldHVybiBVMTMyU3RhdHVzOworICAgICAgICByZWcgPSAweDU0OworICAgICAgICBVMTMyU3RhdHVzID0gZnRkaV9lbGFuX3dyaXRlX3BjaW1lbShmdGRpLCByZWcsIDB4MDAsIDB4MTApOworICAgICAgICBpZiAoVTEzMlN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVTEzMlN0YXR1czsKKyAgICAgICAgVTEzMlN0YXR1cyA9IGZ0ZGlfZWxhbl9yZWFkX3BjaW1lbShmdGRpLCByZWcsIDAsICZwY2lkYXRhKTsKKyAgICAgICAgaWYgKFUxMzJTdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFUxMzJTdGF0dXM7CisgICAgICAgIG1zbGVlcCg3NTApOworICAgICAgICByZWcgPSAweDU0OworICAgICAgICBpZiAoMCkgeworICAgICAgICAgICAgICAgIFUxMzJTdGF0dXMgPSBmdGRpX2VsYW5fd3JpdGVfcGNpbWVtKGZ0ZGksIHJlZywgMHgwMCwgMHgwMik7CisgICAgICAgICAgICAgICAgaWYgKFUxMzJTdGF0dXMpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVTEzMlN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCkgeworICAgICAgICAgICAgICAgIFUxMzJTdGF0dXMgPSBmdGRpX2VsYW5fcmVhZF9wY2ltZW0oZnRkaSwgcmVnLCAwLCAmcGNpZGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKFUxMzJTdGF0dXMpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVTEzMlN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZWcgPSAweDU0OworICAgICAgICBVMTMyU3RhdHVzID0gZnRkaV9lbGFuX3JlYWRfcGNpbWVtKGZ0ZGksIHJlZywgMCwgJnBjaWRhdGEpOworICAgICAgICBpZiAoVTEzMlN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gVTEzMlN0YXR1czsKKyAgICAgICAgcmVnID0gMHg1ODsKKyAgICAgICAgVTEzMlN0YXR1cyA9IGZ0ZGlfZWxhbl9yZWFkX3BjaW1lbShmdGRpLCByZWcsIDAsICZwY2lkYXRhKTsKKyAgICAgICAgaWYgKFUxMzJTdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIFUxMzJTdGF0dXM7CisgICAgICBkdW1wX3JlZ3M6Zm9yIChyZWcgPSAwOyByZWcgPD0gMHg1NDsgcmVnICs9IDQpIHsKKyAgICAgICAgICAgICAgICBVMTMyU3RhdHVzID0gZnRkaV9lbGFuX3JlYWRfcGNpbWVtKGZ0ZGksIHJlZywgMCwgJnBjaWRhdGEpOworICAgICAgICAgICAgICAgIGlmIChVMTMyU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFUxMzJTdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyogd2UgdXNlIG9ubHkgdGhlIGZpcnN0IGJ1bGstaW4gYW5kIGJ1bGstb3V0IGVuZHBvaW50cworKi8KK3N0YXRpYyBpbnQgZnRkaV9lbGFuX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisgICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKyAgICAgICAgc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKKyAgICAgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKKyAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IHJldHZhbCA9IC1FTk9NRU07CisgICAgICAgIHN0cnVjdCB1c2JfZnRkaSAqZnRkaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfZnRkaSksIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoZnRkaSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJPdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQoZnRkaSwgMHgwMCwgc2l6ZW9mKHN0cnVjdCB1c2JfZnRkaSkpOworICAgICAgICBkb3duKCZmdGRpX21vZHVsZV9sb2NrKTsKKyAgICAgICAgbGlzdF9hZGRfdGFpbCgmZnRkaS0+ZnRkaV9saXN0LCAmZnRkaV9zdGF0aWNfbGlzdCk7CisgICAgICAgIGZ0ZGktPnNlcXVlbmNlX251bSA9ICsrZnRkaV9pbnN0YW5jZXM7CisgICAgICAgIHVwKCZmdGRpX21vZHVsZV9sb2NrKTsKKyAgICAgICAgZnRkaV9lbGFuX2luaXRfa3JlZihmdGRpKTsKKyAgICAgICAgaW5pdF9NVVRFWCgmZnRkaS0+c3dfbG9jayk7CisgICAgICAgIGZ0ZGktPnVkZXYgPSB1c2JfZ2V0X2RldihpbnRlcmZhY2VfdG9fdXNiZGV2KGludGVyZmFjZSkpOworICAgICAgICBmdGRpLT5pbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgICAgIGluaXRfTVVURVgoJmZ0ZGktPnUxMzJfbG9jayk7CisgICAgICAgIGZ0ZGktPmV4cGVjdGVkID0gNDsKKyAgICAgICAgaWZhY2VfZGVzYyA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmc7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkgeworICAgICAgICAgICAgICAgIGVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CisgICAgICAgICAgICAgICAgaWYgKCFmdGRpLT5idWxrX2luX2VuZHBvaW50QWRkciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9FTkRQT0lOVF9ESVJfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgID09IFVTQl9ESVJfSU4pICYmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmCisgICAgICAgICAgICAgICAgICAgICAgICBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5idWxrX2luX3NpemUgPSBidWZmZXJfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmJ1bGtfaW5fZW5kcG9pbnRBZGRyID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5idWxrX2luX2J1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmdGRpLT5idWxrX2luX2J1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZXJyKCZmdGRpLT51ZGV2LT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgYiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidWxrX2luX2J1ZmZlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IC1FTk9NRU07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZnRkaS0+YnVsa19vdXRfZW5kcG9pbnRBZGRyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gVVNCX0RJUl9PVVQpICYmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmCisgICAgICAgICAgICAgICAgICAgICAgICBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykgPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5idWxrX291dF9lbmRwb2ludEFkZHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEoZnRkaS0+YnVsa19pbl9lbmRwb2ludEFkZHIgJiYgZnRkaS0+YnVsa19vdXRfZW5kcG9pbnRBZGRyKSkgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgIkNvdWxkIG5vdCBmaW5kIGJvdGggYnVsay1pbiBhbmQgYnVsayIKKyAgICAgICAgICAgICAgICAgICAgICAgICItb3V0IGVuZHBvaW50c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gLUVOT0RFVjsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGRldl9pbmZvKCZmdGRpLT51ZGV2LT5kZXYsICJpbnRlcmZhY2UgJWQgaGFzIEk9JTAyWCBPPSUwMlhcbiIsCisgICAgICAgICAgICAgICAgaWZhY2VfZGVzYy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCBmdGRpLT5idWxrX2luX2VuZHBvaW50QWRkciwKKyAgICAgICAgICAgICAgICBmdGRpLT5idWxrX291dF9lbmRwb2ludEFkZHIpOworICAgICAgICB1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgZnRkaSk7CisgICAgICAgIGlmIChpZmFjZV9kZXNjLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIgPT0gMCAmJgorICAgICAgICAgICAgICAgIGZ0ZGktPmJ1bGtfaW5fZW5kcG9pbnRBZGRyID09IDB4ODEgJiYKKyAgICAgICAgICAgICAgICBmdGRpLT5idWxrX291dF9lbmRwb2ludEFkZHIgPT0gMHgwMikgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHVzYl9yZWdpc3Rlcl9kZXYoaW50ZXJmYWNlLCAmZnRkaV9lbGFuX2p0YWdfY2xhc3MpOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwgIk5vdCBhYmxlIHRvIGdldCBhIG1pbm9yIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIGRldmljZS5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0ZGktPmNsYXNzID0gJmZ0ZGlfZWxhbl9qdGFnX2NsYXNzOworICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2luZm8oJmZ0ZGktPnVkZXYtPmRldiwgIlVTQiBGRFRJPSVwIEpUQUcgaW50ZXJmYWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIG5vdyBhdHRhY2hlZCB0byBmdGRpJWRcbiIsIGZ0ZGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmYWNlX2Rlc2MtPmRlc2MuYkludGVyZmFjZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLT5taW5vcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoaWZhY2VfZGVzYy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyID09IDEgJiYKKyAgICAgICAgICAgICAgICBmdGRpLT5idWxrX2luX2VuZHBvaW50QWRkciA9PSAweDgzICYmCisgICAgICAgICAgICAgICAgZnRkaS0+YnVsa19vdXRfZW5kcG9pbnRBZGRyID09IDB4MDQpIHsKKyAgICAgICAgICAgICAgICBmdGRpLT5jbGFzcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgZGV2X2luZm8oJmZ0ZGktPnVkZXYtPmRldiwgIlVTQiBGRFRJPSVwIEVMQU4gaW50ZXJmYWNlICVkIG5vdyBhIgorICAgICAgICAgICAgICAgICAgICAgICAgImN0aXZhdGVkXG4iLCBmdGRpLCBpZmFjZV9kZXNjLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOworICAgICAgICAgICAgICAgIElOSVRfV09SSygmZnRkaS0+c3RhdHVzX3dvcmssIGZ0ZGlfZWxhbl9zdGF0dXNfd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopZnRkaSk7CisgICAgICAgICAgICAgICAgSU5JVF9XT1JLKCZmdGRpLT5jb21tYW5kX3dvcmssIGZ0ZGlfZWxhbl9jb21tYW5kX3dvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWZ0ZGkpOworICAgICAgICAgICAgICAgIElOSVRfV09SSygmZnRkaS0+cmVzcG9uZF93b3JrLCBmdGRpX2VsYW5fcmVzcG9uZF93b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilmdGRpKTsKKyAgICAgICAgICAgICAgICBmdGRpX3N0YXR1c19xdWV1ZV93b3JrKGZ0ZGksIG1zZWNzX3RvX2ppZmZpZXMoMyAqMTAwMCkpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldl9lcnIoJmZ0ZGktPnVkZXYtPmRldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBFTEFOJ3MgVTEzMiBkZXZpY2VcbiIpOworICAgICAgICAgICAgICAgIHJldHZhbCA9IC1FTk9ERVY7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgZXJyb3I6aWYgKGZ0ZGkpIHsKKyAgICAgICAgICAgICAgICBmdGRpX2VsYW5fcHV0X2tyZWYoZnRkaSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgZnRkaV9lbGFuX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKyAgICAgICAgc3RydWN0IHVzYl9mdGRpICpmdGRpID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworICAgICAgICBmdGRpLT5kaXNjb25uZWN0ZWQgKz0gMTsKKyAgICAgICAgaWYgKGZ0ZGktPmNsYXNzKSB7CisgICAgICAgICAgICAgICAgaW50IG1pbm9yID0gaW50ZXJmYWNlLT5taW5vcjsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciAqY2xhc3MgPSBmdGRpLT5jbGFzczsKKyAgICAgICAgICAgICAgICB1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgdXNiX2RlcmVnaXN0ZXJfZGV2KGludGVyZmFjZSwgY2xhc3MpOworICAgICAgICAgICAgICAgIGRldl9pbmZvKCZmdGRpLT51ZGV2LT5kZXYsICJVU0IgRlRESSBVMTMyIGp0YWcgaW50ZXJmYWNlIG9uIG1pbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvciAlZCBub3cgZGlzY29ubmVjdGVkXG4iLCBtaW5vcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZnRkaV9zdGF0dXNfY2FuY2VsX3dvcmsoZnRkaSk7CisgICAgICAgICAgICAgICAgZnRkaV9jb21tYW5kX2NhbmNlbF93b3JrKGZ0ZGkpOworICAgICAgICAgICAgICAgIGZ0ZGlfcmVzcG9uc2VfY2FuY2VsX3dvcmsoZnRkaSk7CisgICAgICAgICAgICAgICAgZnRkaV9lbGFuX2FiYW5kb25fY29tcGxldGlvbnMoZnRkaSk7CisgICAgICAgICAgICAgICAgZnRkaV9lbGFuX2FiYW5kb25fdGFyZ2V0cyhmdGRpKTsKKyAgICAgICAgICAgICAgICBpZiAoZnRkaS0+cmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmZ0ZGktPnBsYXRmb3JtX2Rldik7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5zeW5jaHJvbml6ZWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZnRkaS0+ZW51bWVyYXRlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmdGRpLT5yZWdpc3RlcmVkID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmx1c2hfd29ya3F1ZXVlKHN0YXR1c19xdWV1ZSk7CisgICAgICAgICAgICAgICAgZmx1c2hfd29ya3F1ZXVlKGNvbW1hbmRfcXVldWUpOworICAgICAgICAgICAgICAgIGZsdXNoX3dvcmtxdWV1ZShyZXNwb25kX3F1ZXVlKTsKKyAgICAgICAgICAgICAgICBmdGRpLT5kaXNjb25uZWN0ZWQgKz0gMTsKKyAgICAgICAgICAgICAgICB1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisgICAgICAgICAgICAgICAgZGV2X2luZm8oJmZ0ZGktPnVkZXYtPmRldiwgIlVTQiBGVERJIFUxMzIgaG9zdCBjb250cm9sbGVyIGludGVyIgorICAgICAgICAgICAgICAgICAgICAgICAgImZhY2Ugbm93IGRpc2Nvbm5lY3RlZFxuIik7CisgICAgICAgIH0KKyAgICAgICAgZnRkaV9lbGFuX3B1dF9rcmVmKGZ0ZGkpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgZnRkaV9lbGFuX2RyaXZlciA9IHsKKyAgICAgICAgLm5hbWUgPSAiZnRkaS1lbGFuIiwKKyAgICAgICAgLnByb2JlID0gZnRkaV9lbGFuX3Byb2JlLAorICAgICAgICAuZGlzY29ubmVjdCA9IGZ0ZGlfZWxhbl9kaXNjb25uZWN0LAorICAgICAgICAuaWRfdGFibGUgPSBmdGRpX2VsYW5fdGFibGUsCit9Oworc3RhdGljIGludCBfX2luaXQgZnRkaV9lbGFuX2luaXQodm9pZCkKK3sKKyAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiZHJpdmVyICVzIGJ1aWx0IGF0ICVzIG9uICVzXG4iLCBmdGRpX2VsYW5fZHJpdmVyLm5hbWUsCisgICAgICAgICAgICAgICAgIF9fVElNRV9fLCBfX0RBVEVfXyk7CisgICAgICAgIGluaXRfTVVURVgoJmZ0ZGlfbW9kdWxlX2xvY2spOworICAgICAgICBJTklUX0xJU1RfSEVBRCgmZnRkaV9zdGF0aWNfbGlzdCk7CisgICAgICAgIHN0YXR1c19xdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJmdGRpLXN0YXR1cy1jb250cm9sIik7CisgICAgICAgIGNvbW1hbmRfcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiZnRkaS1jb21tYW5kLWVuZ2luZSIpOworICAgICAgICByZXNwb25kX3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImZ0ZGktcmVzcG9uZC1lbmdpbmUiKTsKKyAgICAgICAgcmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZmdGRpX2VsYW5fZHJpdmVyKTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgInVzYl9yZWdpc3RlciBmYWlsZWQuIEVycm9yIG51bWJlciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmdGRpX2VsYW5fZXhpdCh2b2lkKQoreworICAgICAgICBzdHJ1Y3QgdXNiX2Z0ZGkgKmZ0ZGk7CisgICAgICAgIHN0cnVjdCB1c2JfZnRkaSAqdGVtcDsKKyAgICAgICAgdXNiX2RlcmVnaXN0ZXIoJmZ0ZGlfZWxhbl9kcml2ZXIpOworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJmdGRpX3UxMzIgZHJpdmVyIGRlcmVnaXN0ZXJlZFxuIik7CisgICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmdGRpLCB0ZW1wLCAmZnRkaV9zdGF0aWNfbGlzdCwgZnRkaV9saXN0KSB7CisgICAgICAgICAgICAgICAgZnRkaV9zdGF0dXNfY2FuY2VsX3dvcmsoZnRkaSk7CisgICAgICAgICAgICAgICAgZnRkaV9jb21tYW5kX2NhbmNlbF93b3JrKGZ0ZGkpOworICAgICAgICAgICAgICAgIGZ0ZGlfcmVzcG9uc2VfY2FuY2VsX3dvcmsoZnRkaSk7CisgICAgICAgIH0gZmx1c2hfd29ya3F1ZXVlKHN0YXR1c19xdWV1ZSk7CisgICAgICAgIGRlc3Ryb3lfd29ya3F1ZXVlKHN0YXR1c19xdWV1ZSk7CisgICAgICAgIHN0YXR1c19xdWV1ZSA9IE5VTEw7CisgICAgICAgIGZsdXNoX3dvcmtxdWV1ZShjb21tYW5kX3F1ZXVlKTsKKyAgICAgICAgZGVzdHJveV93b3JrcXVldWUoY29tbWFuZF9xdWV1ZSk7CisgICAgICAgIGNvbW1hbmRfcXVldWUgPSBOVUxMOworICAgICAgICBmbHVzaF93b3JrcXVldWUocmVzcG9uZF9xdWV1ZSk7CisgICAgICAgIGRlc3Ryb3lfd29ya3F1ZXVlKHJlc3BvbmRfcXVldWUpOworICAgICAgICByZXNwb25kX3F1ZXVlID0gTlVMTDsKK30KKworCittb2R1bGVfaW5pdChmdGRpX2VsYW5faW5pdCk7Cittb2R1bGVfZXhpdChmdGRpX2VsYW5fZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2lkbW91c2UuYyBiL2RyaXZlcnMvdXNiL21pc2MvaWRtb3VzZS5jCmluZGV4IGZjZDY5YzUuLjhlNmUxOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvaWRtb3VzZS5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvaWRtb3VzZS5jCkBAIC05OCw3ICs5OCw3IEBACiBzdGF0aWMgdm9pZCBpZG1vdXNlX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSk7CiAKIC8qIGZpbGUgb3BlcmF0aW9uIHBvaW50ZXJzICovCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpZG1vdXNlX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpZG1vdXNlX2ZvcHMgPSB7CiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLnJlYWQgPSBpZG1vdXNlX3JlYWQsCiAJLm9wZW4gPSBpZG1vdXNlX29wZW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMgYi9kcml2ZXJzL3VzYi9taXNjL2xkdXNiLmMKaW5kZXggZjMwYWIxZi4uMTBiNjQwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9sZHVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvbGR1c2IuYwpAQCAtNTg5LDcgKzU4OSw3IEBACiB9CiAKIC8qIGZpbGUgb3BlcmF0aW9ucyBuZWVkZWQgd2hlbiB3ZSByZWdpc3RlciB0aGlzIGRyaXZlciAqLwotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGRfdXNiX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsZF91c2JfZm9wcyA9IHsKIAkub3duZXIgPQlUSElTX01PRFVMRSwKIAkucmVhZCAgPQlsZF91c2JfcmVhZCwKIAkud3JpdGUgPQlsZF91c2Jfd3JpdGUsCkBAIC02NTcsMTUgKzY1NywxMSBAQAogCWZvciAoaSA9IDA7IGkgPCBpZmFjZV9kZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7ICsraSkgewogCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjOwogCi0JCWlmICgoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX0lOKSAmJgotCQkgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCkpIHsKKwkJaWYgKHVzYl9lbmRwb2ludF9pc19pbnRfaW4oZW5kcG9pbnQpKQogCQkJZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQgPSBlbmRwb2ludDsKLQkJfQogCi0JCWlmICgoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKSA9PSBVU0JfRElSX09VVCkgJiYKLQkJICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQpKSB7CisJCWlmICh1c2JfZW5kcG9pbnRfaXNfaW50X291dChlbmRwb2ludCkpCiAJCQlkZXYtPmludGVycnVwdF9vdXRfZW5kcG9pbnQgPSBlbmRwb2ludDsKLQkJfQogCX0KIAlpZiAoZGV2LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnQgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJJbnRlcnJ1cHQgaW4gZW5kcG9pbnQgbm90IGZvdW5kXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvbGVnb3VzYnRvd2VyLmMgYi9kcml2ZXJzL3VzYi9taXNjL2xlZ291c2J0b3dlci5jCmluZGV4IDc2OTlkOTcuLjc3YzM2ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvbGVnb3VzYnRvd2VyLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9sZWdvdXNidG93ZXIuYwpAQCAtMjU5LDcgKzI1OSw3IEBACiBzdGF0aWMgREVGSU5FX01VVEVYIChkaXNjb25uZWN0X211dGV4KTsKIAogLyogZmlsZSBvcGVyYXRpb25zIG5lZWRlZCB3aGVuIHdlIHJlZ2lzdGVyIHRoaXMgZHJpdmVyICovCi1zdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0b3dlcl9mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdG93ZXJfZm9wcyA9IHsKIAkub3duZXIgPQlUSElTX01PRFVMRSwKIAkucmVhZCAgPQl0b3dlcl9yZWFkLAogCS53cml0ZSA9CXRvd2VyX3dyaXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0LmMgYi9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzVlZDMzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0LmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIFVTQiBQaGlkZ2V0cyBjbGFzcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgU2VhbiBZb3VuZyA8c2VhbkBtZXNzLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKK3N0cnVjdCBjbGFzcyAqcGhpZGdldF9jbGFzczsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9waGlkZ2V0KHZvaWQpCit7CisJcGhpZGdldF9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInBoaWRnZXQiKTsKKworCWlmIChJU19FUlIocGhpZGdldF9jbGFzcykpCisJCXJldHVybiBQVFJfRVJSKHBoaWRnZXRfY2xhc3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3BoaWRnZXQodm9pZCkKK3sKKwljbGFzc19kZXN0cm95KHBoaWRnZXRfY2xhc3MpOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChwaGlkZ2V0X2NsYXNzKTsKKworbW9kdWxlX2luaXQoaW5pdF9waGlkZ2V0KTsKK21vZHVsZV9leGl0KGNsZWFudXBfcGhpZGdldCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlNlYW4gWW91bmcgPHNlYW5AbWVzcy5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbnRhaW5lciBtb2R1bGUgZm9yIHBoaWRnZXQgY2xhc3MiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0LmggYi9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDAxMTkwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0LmgKQEAgLTAsMCArMSwxMiBAQAorLyoKKyAqIFVTQiBQaGlkZ2V0cyBjbGFzcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgU2VhbiBZb3VuZyA8c2VhbkBtZXNzLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKK2V4dGVybiBzdHJ1Y3QgY2xhc3MgKnBoaWRnZXRfY2xhc3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRraXQuYyBiL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldGtpdC5jCmluZGV4IGJmYmJiZmIuLjlhOGQxMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldGtpdC5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldGtpdC5jCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAKKyNpbmNsdWRlICJwaGlkZ2V0LmgiCisKICNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiU2VhbiBZb3VuZyA8c2VhbkBtZXNzLm9yZz4iCiAjZGVmaW5lIERSSVZFUl9ERVNDICJVU0IgUGhpZGdldEludGVyZmFjZUtpdCBEcml2ZXIiCiAKQEAgLTU3LDExICs1OSwxNSBAQAogaWZraXQoMCwgOCwgOCwgMSk7CiBpZmtpdCgwLCAxNiwgMTYsIDApOwogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZXZpY2Vfbm87CisKIHN0cnVjdCBpbnRlcmZhY2VraXQgewogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmOwogCXN0cnVjdCBkcml2ZXJfaW50ZXJmYWNla2l0ICppZmtpdDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJdW5zaWduZWQgbG9uZyBvdXRwdXRzOworCWludCBkZXZfbm87CiAJdTggaW5wdXRzW01BWF9JTlRFUkZBQ0VTXTsKIAl1MTYgc2Vuc29yc1tNQVhfSU5URVJGQUNFU107CiAJdTggbGNkX2ZpbGVzX29uOwpAQCAtMTgwLDIxICsxODYsMjQgQEAKIH0KIAogI2RlZmluZSBzZXRfbGNkX2xpbmUobnVtYmVyKQlcCi1zdGF0aWMgc3NpemVfdCBsY2RfbGluZV8jI251bWJlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAotewkJCQkJCQkJCQkJXAotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwkJCQlcCi0Jc3RydWN0IGludGVyZmFjZWtpdCAqa2l0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsJCQkJXAotCWNoYW5nZV9zdHJpbmcoa2l0LCBidWYsIG51bWJlciAtIDEpOwkJCQkJCVwKLQlyZXR1cm4gY291bnQ7CQkJCQkJCQkJXAotfQkJCQkJCQkJCQkJXAotc3RhdGljIERFVklDRV9BVFRSKGxjZF9saW5lXyMjbnVtYmVyLCBTX0lXVUdPLCBOVUxMLCBsY2RfbGluZV8jI251bWJlcik7CitzdGF0aWMgc3NpemVfdCBsY2RfbGluZV8jI251bWJlcihzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgaW50ZXJmYWNla2l0ICpraXQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKKwljaGFuZ2Vfc3RyaW5nKGtpdCwgYnVmLCBudW1iZXIgLSAxKTsJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJXAorfQorCisjZGVmaW5lIGxjZF9saW5lX2F0dHIobnVtYmVyKQkJCQkJCVwKKwlfX0FUVFIobGNkX2xpbmVfIyNudW1iZXIsIFNfSVdVR08sIE5VTEwsIGxjZF9saW5lXyMjbnVtYmVyKQorCiBzZXRfbGNkX2xpbmUoMSk7CiBzZXRfbGNkX2xpbmUoMik7CiAKIHN0YXRpYyBzc2l6ZV90IHNldF9iYWNrbGlnaHQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGRldik7Ci0Jc3RydWN0IGludGVyZmFjZWtpdCAqa2l0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgaW50ZXJmYWNla2l0ICpraXQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgZW5hYmxlZDsKIAl1bnNpZ25lZCBjaGFyICpidWZmZXI7CiAJaW50IHJldHZhbCA9IC1FTk9NRU07CkBAIC0yMjYsMjMgKzIzNSwzMCBAQAogCWtmcmVlKGJ1ZmZlcik7CiAJcmV0dXJuIHJldHZhbDsKIH0KLXN0YXRpYyBERVZJQ0VfQVRUUihiYWNrbGlnaHQsIFNfSVdVR08sIE5VTEwsIHNldF9iYWNrbGlnaHQpOworCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2xjZF9saW5lX2F0dHJzW10gPSB7CisJbGNkX2xpbmVfYXR0cigxKSwKKwlsY2RfbGluZV9hdHRyKDIpLAorCV9fQVRUUihiYWNrbGlnaHQsIFNfSVdVR08sIE5VTEwsIHNldF9iYWNrbGlnaHQpCit9OwogCiBzdGF0aWMgdm9pZCByZW1vdmVfbGNkX2ZpbGVzKHN0cnVjdCBpbnRlcmZhY2VraXQgKmtpdCkKIHsKKwlpbnQgaTsKKwogCWlmIChraXQtPmxjZF9maWxlc19vbikgewogCQlkZXZfZGJnKCZraXQtPnVkZXYtPmRldiwgIlJlbW92aW5nIGxjZCBmaWxlc1xuIik7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgma2l0LT5pbnRmLT5kZXYsICZkZXZfYXR0cl9sY2RfbGluZV8xKTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZraXQtPmludGYtPmRldiwgJmRldl9hdHRyX2xjZF9saW5lXzIpOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmtpdC0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfYmFja2xpZ2h0KTsKKworCQlmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKGRldl9sY2RfbGluZV9hdHRycyk7IGkrKykKKwkJCWRldmljZV9yZW1vdmVfZmlsZShraXQtPmRldiwgJmRldl9sY2RfbGluZV9hdHRyc1tpXSk7CiAJfQogfQogCiBzdGF0aWMgc3NpemVfdCBlbmFibGVfbGNkX2ZpbGVzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYpOwotCXN0cnVjdCBpbnRlcmZhY2VraXQgKmtpdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IGludGVyZmFjZWtpdCAqa2l0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJaW50IGVuYWJsZTsKKwlpbnQgaSwgcmM7CiAJCiAJaWYgKGtpdC0+aWZraXQtPmhhc19sY2QgPT0gMCkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0yNTMsOSArMjY5LDEyIEBACiAJaWYgKGVuYWJsZSkgewogCQlpZiAoIWtpdC0+bGNkX2ZpbGVzX29uKSB7CiAJCQlkZXZfZGJnKCZraXQtPnVkZXYtPmRldiwgIkFkZGluZyBsY2QgZmlsZXNcbiIpOwotCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZraXQtPmludGYtPmRldiwgJmRldl9hdHRyX2xjZF9saW5lXzEpOwotCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZraXQtPmludGYtPmRldiwgJmRldl9hdHRyX2xjZF9saW5lXzIpOwotCQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZraXQtPmludGYtPmRldiwgJmRldl9hdHRyX2JhY2tsaWdodCk7CisJCQlmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKGRldl9sY2RfbGluZV9hdHRycyk7IGkrKykgeworCQkJCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKGtpdC0+ZGV2LAorCQkJCQkmZGV2X2xjZF9saW5lX2F0dHJzW2ldKTsKKwkJCQlpZiAocmMpCisJCQkJCWdvdG8gb3V0OworCQkJfQogCQkJa2l0LT5sY2RfZmlsZXNfb24gPSAxOwogCQl9CiAJfSBlbHNlIHsKQEAgLTI2Niw3ICsyODUsMTMgQEAKIAl9CiAJCiAJcmV0dXJuIGNvdW50Oworb3V0OgorCXdoaWxlIChpLS0gPiAwKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoa2l0LT5kZXYsICZkZXZfbGNkX2xpbmVfYXR0cnNbaV0pOworCisJcmV0dXJuIHJjOwogfQorCiBzdGF0aWMgREVWSUNFX0FUVFIobGNkLCBTX0lXVUdPLCBOVUxMLCBlbmFibGVfbGNkX2ZpbGVzKTsKIAogc3RhdGljIHZvaWQgaW50ZXJmYWNla2l0X2lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMzYyLDI0ICszODcsMjQgQEAKIAlmb3IgKGk9MDsgaTxraXQtPmlma2l0LT5pbnB1dHM7IGkrKykgewogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KGksICZraXQtPmlucHV0X2V2ZW50cykpIHsKIAkJCXNwcmludGYoc3lzZnNfZmlsZSwgImlucHV0JWQiLCBpICsgMSk7Ci0JCQlzeXNmc19ub3RpZnkoJmtpdC0+aW50Zi0+ZGV2LmtvYmosIE5VTEwsIHN5c2ZzX2ZpbGUpOworCQkJc3lzZnNfbm90aWZ5KCZraXQtPmRldi0+a29iaiwgTlVMTCwgc3lzZnNfZmlsZSk7CiAJCX0KIAl9CiAKIAlmb3IgKGk9MDsgaTxraXQtPmlma2l0LT5zZW5zb3JzOyBpKyspIHsKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChpLCAma2l0LT5zZW5zb3JfZXZlbnRzKSkgewogCQkJc3ByaW50ZihzeXNmc19maWxlLCAic2Vuc29yJWQiLCBpICsgMSk7Ci0JCQlzeXNmc19ub3RpZnkoJmtpdC0+aW50Zi0+ZGV2LmtvYmosIE5VTEwsIHN5c2ZzX2ZpbGUpOworCQkJc3lzZnNfbm90aWZ5KCZraXQtPmRldi0+a29iaiwgTlVMTCwgc3lzZnNfZmlsZSk7CiAJCX0KIAl9CiB9CiAKICNkZWZpbmUgc2hvd19zZXRfb3V0cHV0KHZhbHVlKQkJXAotc3RhdGljIHNzaXplX3Qgc2V0X291dHB1dCMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAlcCi0JCQkJCQkJc2l6ZV90IGNvdW50KQlcCitzdGF0aWMgc3NpemVfdCBzZXRfb3V0cHV0IyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkJXAogewkJCQkJCQkJCVwKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKLQlzdHJ1Y3QgaW50ZXJmYWNla2l0ICpraXQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJXAorCXN0cnVjdCBpbnRlcmZhY2VraXQgKmtpdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAogCWludCBlbmFibGVkOwkJCQkJCQlcCiAJaW50IHJldHZhbDsJCQkJCQkJXAogCQkJCQkJCQkJXApAQCAtMzkxLDE1ICs0MTYsMTkgQEAKIAlyZXR1cm4gcmV0dmFsID8gcmV0dmFsIDogY291bnQ7CQkJCQlcCiB9CQkJCQkJCQkJXAogCQkJCQkJCQkJXAotc3RhdGljIHNzaXplX3Qgc2hvd19vdXRwdXQjI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAorc3RhdGljIHNzaXplX3Qgc2hvd19vdXRwdXQjI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgCQkJXAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJCQljaGFyICpidWYpCQkJXAogewkJCQkJCQkJCVwKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKLQlzdHJ1Y3QgaW50ZXJmYWNla2l0ICpraXQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJXAorCXN0cnVjdCBpbnRlcmZhY2VraXQgKmtpdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAogCQkJCQkJCQkJXAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIXRlc3RfYml0KHZhbHVlIC0gMSwgJmtpdC0+b3V0cHV0cykpO1wKLX0JCQkJCQkJCQlcCi1zdGF0aWMgREVWSUNFX0FUVFIob3V0cHV0IyN2YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sCQkJXAotCQlzaG93X291dHB1dCMjdmFsdWUsIHNldF9vdXRwdXQjI3ZhbHVlKTsKK30KKworI2RlZmluZSBvdXRwdXRfYXR0cih2YWx1ZSkJCQkJCQlcCisJX19BVFRSKG91dHB1dCMjdmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLAkJCVwKKwkJc2hvd19vdXRwdXQjI3ZhbHVlLCBzZXRfb3V0cHV0IyN2YWx1ZSkKKwogc2hvd19zZXRfb3V0cHV0KDEpOwogc2hvd19zZXRfb3V0cHV0KDIpOwogc2hvd19zZXRfb3V0cHV0KDMpOwpAQCAtNDE3LDE1ICs0NDYsMjQgQEAKIHNob3dfc2V0X291dHB1dCgxNSk7CiBzaG93X3NldF9vdXRwdXQoMTYpOwogCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X291dHB1dF9hdHRyc1tdID0geworCW91dHB1dF9hdHRyKDEpLCBvdXRwdXRfYXR0cigyKSwgb3V0cHV0X2F0dHIoMyksIG91dHB1dF9hdHRyKDQpLAorCW91dHB1dF9hdHRyKDUpLCBvdXRwdXRfYXR0cig2KSwgb3V0cHV0X2F0dHIoNyksIG91dHB1dF9hdHRyKDgpLAorCW91dHB1dF9hdHRyKDkpLCBvdXRwdXRfYXR0cigxMCksIG91dHB1dF9hdHRyKDExKSwgb3V0cHV0X2F0dHIoMTIpLAorCW91dHB1dF9hdHRyKDEzKSwgb3V0cHV0X2F0dHIoMTQpLCBvdXRwdXRfYXR0cigxNSksIG91dHB1dF9hdHRyKDE2KQorfTsKKwogI2RlZmluZSBzaG93X2lucHV0KHZhbHVlKQlcCi1zdGF0aWMgc3NpemVfdCBzaG93X2lucHV0IyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5wdXQjI3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwgCQkJXAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAogewkJCQkJCQkJCVwKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKLQlzdHJ1Y3QgaW50ZXJmYWNla2l0ICpraXQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJXAorCXN0cnVjdCBpbnRlcmZhY2VraXQgKmtpdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAogCQkJCQkJCQkJXAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoaW50KWtpdC0+aW5wdXRzW3ZhbHVlIC0gMV0pOwlcCi19CQkJCQkJCQkJXAotc3RhdGljIERFVklDRV9BVFRSKGlucHV0IyN2YWx1ZSwgU19JUlVHTywgc2hvd19pbnB1dCMjdmFsdWUsIE5VTEwpOworfQorCisjZGVmaW5lIGlucHV0X2F0dHIodmFsdWUpCQkJCQkJXAorCV9fQVRUUihpbnB1dCMjdmFsdWUsIFNfSVJVR08sIHNob3dfaW5wdXQjI3ZhbHVlLCBOVUxMKQogCiBzaG93X2lucHV0KDEpOwogc2hvd19pbnB1dCgyKTsKQEAgLTQ0NCwxNSArNDgyLDI1IEBACiBzaG93X2lucHV0KDE1KTsKIHNob3dfaW5wdXQoMTYpOwogCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2lucHV0X2F0dHJzW10gPSB7CisJaW5wdXRfYXR0cigxKSwgaW5wdXRfYXR0cigyKSwgaW5wdXRfYXR0cigzKSwgaW5wdXRfYXR0cig0KSwKKwlpbnB1dF9hdHRyKDUpLCBpbnB1dF9hdHRyKDYpLCBpbnB1dF9hdHRyKDcpLCBpbnB1dF9hdHRyKDgpLAorCWlucHV0X2F0dHIoOSksIGlucHV0X2F0dHIoMTApLCBpbnB1dF9hdHRyKDExKSwgaW5wdXRfYXR0cigxMiksCisJaW5wdXRfYXR0cigxMyksIGlucHV0X2F0dHIoMTQpLCBpbnB1dF9hdHRyKDE1KSwgaW5wdXRfYXR0cigxNikKK307CisKICNkZWZpbmUgc2hvd19zZW5zb3IodmFsdWUpCVwKLXN0YXRpYyBzc2l6ZV90IHNob3dfc2Vuc29yIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfc2Vuc29yIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJCQljaGFyICpidWYpCQkJXAogewkJCQkJCQkJCVwKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsJCVwKLQlzdHJ1Y3QgaW50ZXJmYWNla2l0ICpraXQgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwkJXAorCXN0cnVjdCBpbnRlcmZhY2VraXQgKmtpdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAogCQkJCQkJCQkJXAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoaW50KWtpdC0+c2Vuc29yc1t2YWx1ZSAtIDFdKTsJXAotfQkJCQkJCQkJCVwKLXN0YXRpYyBERVZJQ0VfQVRUUihzZW5zb3IjI3ZhbHVlLCBTX0lSVUdPLCBzaG93X3NlbnNvciMjdmFsdWUsIE5VTEwpOworfQorCisjZGVmaW5lIHNlbnNvcl9hdHRyKHZhbHVlKQkJCQkJCVwKKwlfX0FUVFIoc2Vuc29yIyN2YWx1ZSwgU19JUlVHTywgc2hvd19zZW5zb3IjI3ZhbHVlLCBOVUxMKQogCiBzaG93X3NlbnNvcigxKTsKIHNob3dfc2Vuc29yKDIpOwpAQCAtNDYzLDYgKzUxMSwxMSBAQAogc2hvd19zZW5zb3IoNyk7CiBzaG93X3NlbnNvcig4KTsKIAorc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9zZW5zb3JfYXR0cnNbXSA9IHsKKwlzZW5zb3JfYXR0cigxKSwgc2Vuc29yX2F0dHIoMiksIHNlbnNvcl9hdHRyKDMpLCBzZW5zb3JfYXR0cig0KSwKKwlzZW5zb3JfYXR0cig1KSwgc2Vuc29yX2F0dHIoNiksIHNlbnNvcl9hdHRyKDcpLCBzZW5zb3JfYXR0cig4KQorfTsKKwogc3RhdGljIGludCBpbnRlcmZhY2VraXRfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKQEAgLTQ3MSw2ICs1MjQsNyBAQAogCXN0cnVjdCBpbnRlcmZhY2VraXQgKmtpdDsKIAlzdHJ1Y3QgZHJpdmVyX2ludGVyZmFjZWtpdCAqaWZraXQ7CiAJaW50IHBpcGUsIG1heHAsIHJjID0gLUVOT01FTTsKKwlpbnQgYml0LCB2YWx1ZSwgaTsKIAogCWlma2l0ID0gKHN0cnVjdCBkcml2ZXJfaW50ZXJmYWNla2l0ICopaWQtPmRyaXZlcl9pbmZvOwogCWlmICghaWZraXQpCkBAIC00OTMsNiArNTQ3LDcgQEAKIAlpZiAoIWtpdCkKIAkJZ290byBvdXQ7CiAKKwlraXQtPmRldl9ubyA9IC0xOwogCWtpdC0+aWZraXQgPSBpZmtpdDsKIAlraXQtPmRhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKGRldiwgVVJCX0lOVF9TSVpFLCBTTEFCX0FUT01JQywgJmtpdC0+ZGF0YV9kbWEpOwogCWlmICgha2l0LT5kYXRhKQpAQCAtNTEzLDg1ICs1NjgsODAgQEAKIAogCXVzYl9zZXRfaW50ZmRhdGEoaW50Ziwga2l0KTsKIAorICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgYml0ID0gZmluZF9maXJzdF96ZXJvX2JpdCgmZGV2aWNlX25vLCBzaXplb2YoZGV2aWNlX25vKSk7CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0ZXN0X2FuZF9zZXRfYml0KGJpdCwgJmRldmljZV9ubyk7CisgICAgICAgIH0gd2hpbGUodmFsdWUpOworICAgICAgICBraXQtPmRldl9ubyA9IGJpdDsKKworICAgICAgICBraXQtPmRldiA9IGRldmljZV9jcmVhdGUocGhpZGdldF9jbGFzcywgJmtpdC0+dWRldi0+ZGV2LCAwLAorICAgICAgICAgICAgICAgCQkiaW50ZXJmYWNla2l0JWQiLCBraXQtPmRldl9ubyk7CisgICAgICAgIGlmIChJU19FUlIoa2l0LT5kZXYpKSB7CisgICAgICAgICAgICAgICAgcmMgPSBQVFJfRVJSKGtpdC0+ZGV2KTsKKyAgICAgICAgICAgICAgICBraXQtPmRldiA9IE5VTEw7CisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKwlkZXZfc2V0X2RydmRhdGEoa2l0LT5kZXYsIGtpdCk7CisKIAlpZiAodXNiX3N1Ym1pdF91cmIoa2l0LT5pcnEsIEdGUF9LRVJORUwpKSB7CiAJCXJjID0gLUVJTzsKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGlma2l0LT5vdXRwdXRzID49IDQpIHsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQxKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQyKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQzKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQ0KTsKLQl9Ci0JaWYgKGlma2l0LT5vdXRwdXRzID49IDgpIHsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQ1KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQ2KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQ3KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQ4KTsKLQl9IAotCWlmIChpZmtpdC0+b3V0cHV0cyA9PSAxNikgewotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX291dHB1dDkpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX291dHB1dDEwKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQxMSk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfb3V0cHV0MTIpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX291dHB1dDEzKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQxNCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfb3V0cHV0MTUpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX291dHB1dDE2KTsKKwlmb3IgKGk9MDsgaTxpZmtpdC0+b3V0cHV0czsgaSsrICkgeworCQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZShraXQtPmRldiwgJmRldl9vdXRwdXRfYXR0cnNbaV0pOworCQlpZiAocmMpCisJCQlnb3RvIG91dDI7CiAJfQogCi0JaWYgKGlma2l0LT5pbnB1dHMgPj0gNCkgewotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2lucHV0MSk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfaW5wdXQyKTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9pbnB1dDMpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2lucHV0NCk7Ci0JfQotCWlmIChpZmtpdC0+aW5wdXRzID49IDgpIHsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9pbnB1dDUpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2lucHV0Nik7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfaW5wdXQ3KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9pbnB1dDgpOwotCX0KLQlpZiAoaWZraXQtPmlucHV0cyA9PSAxNikgewotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX2lucHV0OSk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfaW5wdXQxMCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfaW5wdXQxMSk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfaW5wdXQxMik7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfaW5wdXQxMyk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfaW5wdXQxNCk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfaW5wdXQxNSk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfaW5wdXQxNik7CisJZm9yIChpPTA7IGk8aWZraXQtPmlucHV0czsgaSsrICkgeworCQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZShraXQtPmRldiwgJmRldl9pbnB1dF9hdHRyc1tpXSk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0MzsKIAl9CiAKLQlpZiAoaWZraXQtPnNlbnNvcnMgPj0gNCkgewotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3NlbnNvcjEpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3NlbnNvcjIpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3NlbnNvcjMpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGYtPmRldiwgJmRldl9hdHRyX3NlbnNvcjQpOworCWZvciAoaT0wOyBpPGlma2l0LT5zZW5zb3JzOyBpKysgKSB7CisJCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKGtpdC0+ZGV2LCAmZGV2X3NlbnNvcl9hdHRyc1tpXSk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0NDsKIAl9Ci0JaWYgKGlma2l0LT5zZW5zb3JzID49IDcpIHsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9zZW5zb3I1KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9zZW5zb3I2KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRmLT5kZXYsICZkZXZfYXR0cl9zZW5zb3I3KTsKLQl9Ci0JaWYgKGlma2l0LT5zZW5zb3JzID09IDgpCi0JCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfc2Vuc29yOCk7CiAKLQlpZiAoaWZraXQtPmhhc19sY2QpCi0JCWRldmljZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfbGNkKTsKKwlpZiAoaWZraXQtPmhhc19sY2QpIHsKKwkJcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoa2l0LT5kZXYsICZkZXZfYXR0cl9sY2QpOworCQlpZiAocmMpCisJCQlnb3RvIG91dDQ7CisKKwl9CiAKIAlkZXZfaW5mbygmaW50Zi0+ZGV2LCAiVVNCIFBoaWRnZXRJbnRlcmZhY2VLaXQgJWQvJWQvJWQgYXR0YWNoZWRcbiIsCiAJCQlpZmtpdC0+c2Vuc29ycywgaWZraXQtPmlucHV0cywgaWZraXQtPm91dHB1dHMpOwogCiAJcmV0dXJuIDA7CiAKK291dDQ6CisJd2hpbGUgKGktLSA+IDApCisJCWRldmljZV9yZW1vdmVfZmlsZShraXQtPmRldiwgJmRldl9zZW5zb3JfYXR0cnNbaV0pOworCisJaSA9IGlma2l0LT5pbnB1dHM7CitvdXQzOgorCXdoaWxlIChpLS0gPiAwKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoa2l0LT5kZXYsICZkZXZfaW5wdXRfYXR0cnNbaV0pOworCisJaSA9IGlma2l0LT5vdXRwdXRzOworb3V0MjoKKwl3aGlsZSAoaS0tID4gMCkKKwkJZGV2aWNlX3JlbW92ZV9maWxlKGtpdC0+ZGV2LCAmZGV2X291dHB1dF9hdHRyc1tpXSk7CiBvdXQ6CiAJaWYgKGtpdCkgewogCQlpZiAoa2l0LT5pcnEpCiAJCQl1c2JfZnJlZV91cmIoa2l0LT5pcnEpOwogCQlpZiAoa2l0LT5kYXRhKQogCQkJdXNiX2J1ZmZlcl9mcmVlKGRldiwgVVJCX0lOVF9TSVpFLCBraXQtPmRhdGEsIGtpdC0+ZGF0YV9kbWEpOworCQlpZiAoa2l0LT5kZXYpCisJCQlkZXZpY2VfdW5yZWdpc3RlcihraXQtPmRldik7CisJCWlmIChraXQtPmRldl9ubyA+PSAwKQorCQkJY2xlYXJfYml0KGtpdC0+ZGV2X25vLCAmZGV2aWNlX25vKTsKKwogCQlrZnJlZShraXQpOwogCX0KIApAQCAtNjAxLDYgKzY1MSw3IEBACiBzdGF0aWMgdm9pZCBpbnRlcmZhY2VraXRfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQogewogCXN0cnVjdCBpbnRlcmZhY2VraXQgKmtpdDsKKwlpbnQgaTsKIAogCWtpdCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKIAl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CkBAIC02MTMsNzMgKzY2NCwyOCBAQAogCiAJY2FuY2VsX2RlbGF5ZWRfd29yaygma2l0LT5kb19ub3RpZnkpOwogCi0JaWYgKGtpdC0+aWZraXQtPm91dHB1dHMgPj0gNCkgewotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfb3V0cHV0MSk7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQyKTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX291dHB1dDMpOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfb3V0cHV0NCk7Ci0JfQotCWlmIChraXQtPmlma2l0LT5vdXRwdXRzID49IDgpIHsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX291dHB1dDUpOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfb3V0cHV0Nik7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQ3KTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX291dHB1dDgpOwotCX0KLQlpZiAoa2l0LT5pZmtpdC0+b3V0cHV0cyA9PSAxNikgewotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfb3V0cHV0OSk7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQxMCk7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQxMSk7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQxMik7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQxMyk7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQxNCk7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQxNSk7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9vdXRwdXQxNik7CisJZm9yIChpPTA7IGk8a2l0LT5pZmtpdC0+b3V0cHV0czsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoa2l0LT5kZXYsICZkZXZfb3V0cHV0X2F0dHJzW2ldKTsKKworCWZvciAoaT0wOyBpPGtpdC0+aWZraXQtPmlucHV0czsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoa2l0LT5kZXYsICZkZXZfaW5wdXRfYXR0cnNbaV0pOworCisJZm9yIChpPTA7IGk8a2l0LT5pZmtpdC0+c2Vuc29yczsgaSsrKQorCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoa2l0LT5kZXYsICZkZXZfc2Vuc29yX2F0dHJzW2ldKTsKKworCWlmIChraXQtPmlma2l0LT5oYXNfbGNkKSB7CisJCWRldmljZV9yZW1vdmVfZmlsZShraXQtPmRldiwgJmRldl9hdHRyX2xjZCk7CisJCXJlbW92ZV9sY2RfZmlsZXMoa2l0KTsKIAl9CiAKLQlpZiAoa2l0LT5pZmtpdC0+aW5wdXRzID49IDQpIHsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2lucHV0MSk7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9pbnB1dDIpOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfaW5wdXQzKTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2lucHV0NCk7Ci0JfQotCWlmIChraXQtPmlma2l0LT5pbnB1dHMgPj0gOCkgewotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfaW5wdXQ1KTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2lucHV0Nik7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9pbnB1dDcpOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfaW5wdXQ4KTsKLQl9Ci0JaWYgKGtpdC0+aWZraXQtPmlucHV0cyA9PSAxNikgewotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfaW5wdXQ5KTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2lucHV0MTApOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfaW5wdXQxMSk7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9pbnB1dDEyKTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2lucHV0MTMpOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfaW5wdXQxNCk7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9pbnB1dDE1KTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2lucHV0MTYpOwotCX0KLQotCWlmIChraXQtPmlma2l0LT5zZW5zb3JzID49IDQpIHsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3NlbnNvcjEpOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfc2Vuc29yMik7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9zZW5zb3IzKTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3NlbnNvcjQpOwotCX0KLQlpZiAoa2l0LT5pZmtpdC0+c2Vuc29ycyA+PSA3KSB7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9zZW5zb3I1KTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3NlbnNvcjYpOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfc2Vuc29yNyk7Ci0JfQotCWlmIChraXQtPmlma2l0LT5zZW5zb3JzID09IDgpCi0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9zZW5zb3I4KTsKLQotCWlmIChraXQtPmlma2l0LT5oYXNfbGNkKQotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfbGNkKTsKKwlkZXZpY2VfdW5yZWdpc3RlcihraXQtPmRldik7CiAKIAlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJVU0IgUGhpZGdldEludGVyZmFjZUtpdCAlZC8lZC8lZCBkZXRhY2hlZFxuIiwKIAkJa2l0LT5pZmtpdC0+c2Vuc29ycywga2l0LT5pZmtpdC0+aW5wdXRzLCBraXQtPmlma2l0LT5vdXRwdXRzKTsKIAogCXVzYl9wdXRfZGV2KGtpdC0+dWRldik7CisJY2xlYXJfYml0KGtpdC0+ZGV2X25vLCAmZGV2aWNlX25vKTsKKwogCWtmcmVlKGtpdCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldG1vdG9yY29udHJvbC5jIGIvZHJpdmVycy91c2IvbWlzYy9waGlkZ2V0bW90b3Jjb250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI1OWI2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldG1vdG9yY29udHJvbC5jCkBAIC0wLDAgKzEsNDY2IEBACisvKgorICogVVNCIFBoaWRnZXQgTW90b3JDb250cm9sIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAgU2VhbiBZb3VuZyA8c2VhbkBtZXNzLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgInBoaWRnZXQuaCIKKworI2RlZmluZSBEUklWRVJfQVVUSE9SICJTZWFuIFlvdW5nIDxzZWFuQG1lc3Mub3JnPiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgIlVTQiBQaGlkZ2V0TW90b3JDb250cm9sIERyaXZlciIKKworI2RlZmluZSBVU0JfVkVORE9SX0lEX0dMQUIJCTB4MDZjMgorI2RlZmluZSBVU0JfREVWSUNFX0lEX01PVE9SQ09OVFJPTAkweDAwNTgKKworI2RlZmluZSBVUkJfSU5UX1NJWkUJCQk4CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRldmljZV9ubzsKKworc3RydWN0IG1vdG9yY29udHJvbCB7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBkZXZfbm87CisJdTggaW5wdXRzWzRdOworCXM4IGRlc2lyZWRfc3BlZWRbMl07CisJczggc3BlZWRbMl07CisJczE2IF9jdXJyZW50WzJdOworCXM4IGFjY2VsZXJhdGlvblsyXTsKKwlzdHJ1Y3QgdXJiICppcnE7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlkbWFfYWRkcl90IGRhdGFfZG1hOworCisJc3RydWN0IHdvcmtfc3RydWN0IGRvX25vdGlmeTsKKwl1bnNpZ25lZCBsb25nIGlucHV0X2V2ZW50czsKKwl1bnNpZ25lZCBsb25nIHNwZWVkX2V2ZW50czsKKwl1bnNpZ25lZCBsb25nIGV4Y2VlZF9ldmVudHM7Cit9OworCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HTEFCLCBVU0JfREVWSUNFX0lEX01PVE9SQ09OVFJPTCkgfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBpZF90YWJsZSk7CisKK3N0YXRpYyBpbnQgc2V0X21vdG9yKHN0cnVjdCBtb3RvcmNvbnRyb2wgKm1jLCBpbnQgbW90b3IpCit7CisJdTggKmJ1ZmZlcjsKKwlpbnQgc3BlZWQsIHNwZWVkMiwgYWNjZWxlcmF0aW9uOworCWludCByZXR2YWw7CisKKwlidWZmZXIgPSBremFsbG9jKDgsIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKSB7CisJCWRldl9lcnIoJm1jLT5pbnRmLT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWFjY2VsZXJhdGlvbiA9IG1jLT5hY2NlbGVyYXRpb25bbW90b3JdICogMTA7CisJLyogLTEyNyA8PSBzcGVlZCA8PSAxMjcgKi8KKwlzcGVlZCA9IChtYy0+ZGVzaXJlZF9zcGVlZFttb3Rvcl0gKiAxMjcpIC8gMTAwOworCS8qIC0weDczMDAgPD0gc3BlZWQyIDw9IDB4NzMwMCAqLworCXNwZWVkMiA9IChtYy0+ZGVzaXJlZF9zcGVlZFttb3Rvcl0gKiAyMzAgKiAxMjgpIC8gMTAwOworCisJYnVmZmVyWzBdID0gbW90b3I7CisJYnVmZmVyWzFdID0gc3BlZWQ7CisJYnVmZmVyWzJdID0gYWNjZWxlcmF0aW9uID4+IDg7CisJYnVmZmVyWzNdID0gYWNjZWxlcmF0aW9uOworCWJ1ZmZlcls0XSA9IHNwZWVkMiA+PiA4OworCWJ1ZmZlcls1XSA9IHNwZWVkMjsKKworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhtYy0+dWRldiwKKwkJCSB1c2Jfc25kY3RybHBpcGUobWMtPnVkZXYsIDApLAorCQkJIDB4MDksIDB4MjEsIDB4MDIwMCwgMHgwMDAwLCBidWZmZXIsIDgsIDIwMDApOworCisJaWYgKHJldHZhbCAhPSA4KQorCQlkZXZfZXJyKCZtYy0+aW50Zi0+ZGV2LCAidXNiX2NvbnRyb2xfbXNnIHJldHVybmVkICVkXG4iLAorCQkJCXJldHZhbCk7CisJa2ZyZWUoYnVmZmVyKTsKKworCXJldHVybiByZXR2YWwgPCAwID8gcmV0dmFsIDogMDsKK30KKworc3RhdGljIHZvaWQgbW90b3Jjb250cm9sX2lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBtb3RvcmNvbnRyb2wgKm1jID0gdXJiLT5jb250ZXh0OworCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlciA9IG1jLT5kYXRhOworCWludCBpLCBsZXZlbDsKKwlpbnQgc3RhdHVzOworCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoJCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCWNhc2UgLUVDT05OUkVTRVQ6CS8qIHVubGluayAqLworCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCXJldHVybjsKKwkvKiAtRVBJUEU6ICBzaG91bGQgY2xlYXIgdGhlIGhhbHQgKi8KKwlkZWZhdWx0OgkJLyogZXJyb3IgKi8KKwkJZ290byByZXN1Ym1pdDsKKwl9CisKKwkvKiBkaWdpdGFsIGlucHV0cyAqLworCWZvciAoaT0wOyBpPDQ7IGkrKykgeworCQlsZXZlbCA9IChidWZmZXJbMF0gPj4gaSkgJiAxOworCQlpZiAobWMtPmlucHV0c1tpXSAhPSBsZXZlbCkgeworCQkJbWMtPmlucHV0c1tpXSA9IGxldmVsOworCQkJc2V0X2JpdChpLCAmbWMtPmlucHV0X2V2ZW50cyk7CisJCX0KKwl9CisKKwkvKiBtb3RvciBzcGVlZCAqLworCWlmIChidWZmZXJbMl0gPT0gMCkgeworCQlmb3IgKGk9MDsgaTwyOyBpKyspIHsKKwkJbGV2ZWwgPSAoKHM4KWJ1ZmZlcls0K2ldKSAqIDEwMCAvIDEyNzsKKwkJCWlmIChtYy0+c3BlZWRbaV0gIT0gbGV2ZWwpIHsKKwkJCQltYy0+c3BlZWRbaV0gPSBsZXZlbDsKKwkJCQlzZXRfYml0KGksICZtYy0+c3BlZWRfZXZlbnRzKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWludCBpbmRleCA9IGJ1ZmZlclszXSAmIDE7CisKKwkJbGV2ZWwgPSAoKHM4KWJ1ZmZlcls0XSA8PCA4KSB8IGJ1ZmZlcls1XTsKKwkJbGV2ZWwgPSBsZXZlbCAqIDEwMCAvIDI5NDQwOworCQlpZiAobWMtPnNwZWVkW2luZGV4XSAhPSBsZXZlbCkgeworCQkJbWMtPnNwZWVkW2luZGV4XSA9IGxldmVsOworCQkJc2V0X2JpdChpbmRleCwgJm1jLT5zcGVlZF9ldmVudHMpOworCQl9CisKKwkJbGV2ZWwgPSAoKHM4KWJ1ZmZlcls2XSA8PCA4KSB8IGJ1ZmZlcls3XTsKKwkJbWMtPl9jdXJyZW50W2luZGV4XSA9IGxldmVsICogMTAwIC8gMTU3MjsKKwl9CisKKwlpZiAoYnVmZmVyWzFdICYgMSkKKwkJc2V0X2JpdCgwLCAmbWMtPmV4Y2VlZF9ldmVudHMpOworCisJaWYgKGJ1ZmZlclsxXSAmIDIpCisJCXNldF9iaXQoMSwgJm1jLT5leGNlZWRfZXZlbnRzKTsKKworCWlmIChtYy0+aW5wdXRfZXZlbnRzIHx8IG1jLT5leGNlZWRfZXZlbnRzIHx8IG1jLT5zcGVlZF9ldmVudHMpCisJCXNjaGVkdWxlX3dvcmsoJm1jLT5kb19ub3RpZnkpOworCityZXN1Ym1pdDoKKwlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIFNMQUJfQVRPTUlDKTsKKwlpZiAoc3RhdHVzKQorCQlkZXZfZXJyKCZtYy0+aW50Zi0+ZGV2LAorCQkJImNhbid0IHJlc3VibWl0IGludHIsICVzLSVzL21vdG9yY29udHJvbDAsIHN0YXR1cyAlZCIsCisJCQltYy0+dWRldi0+YnVzLT5idXNfbmFtZSwKKwkJCW1jLT51ZGV2LT5kZXZwYXRoLCBzdGF0dXMpOworfQorCitzdGF0aWMgdm9pZCBkb19ub3RpZnkodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbW90b3Jjb250cm9sICptYyA9IGRhdGE7CisJaW50IGk7CisJY2hhciBzeXNmc19maWxlWzhdOworCisJZm9yIChpPTA7IGk8NDsgaSsrKSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoaSwgJm1jLT5pbnB1dF9ldmVudHMpKSB7CisJCQlzcHJpbnRmKHN5c2ZzX2ZpbGUsICJpbnB1dCVkIiwgaSk7CisJCQlzeXNmc19ub3RpZnkoJm1jLT5kZXYtPmtvYmosIE5VTEwsIHN5c2ZzX2ZpbGUpOworCQl9CisJfQorCisJZm9yIChpPTA7IGk8MjsgaSsrKSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoaSwgJm1jLT5zcGVlZF9ldmVudHMpKSB7CisJCQlzcHJpbnRmKHN5c2ZzX2ZpbGUsICJzcGVlZCVkIiwgaSk7CisJCQlzeXNmc19ub3RpZnkoJm1jLT5kZXYtPmtvYmosIE5VTEwsIHN5c2ZzX2ZpbGUpOworCQl9CisJfQorCisJZm9yIChpPTA7IGk8MjsgaSsrKSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoaSwgJm1jLT5leGNlZWRfZXZlbnRzKSkKKwkJCWRldl93YXJuKCZtYy0+aW50Zi0+ZGV2LAorCQkJCSJtb3RvciAjJWQgZXhjZWVkcyAxLjUgQW1wIGN1cnJlbnQgbGltaXRcbiIsIGkpOworCX0KK30KKworI2RlZmluZSBzaG93X3NldF9zcGVlZCh2YWx1ZSkJCVwKK3N0YXRpYyBzc2l6ZV90IHNldF9zcGVlZCMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IG1vdG9yY29udHJvbCAqbWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJaW50IHNwZWVkOwkJCQkJCQlcCisJaW50IHJldHZhbDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmc3BlZWQpIDwgMSkJCQkJXAorCQlyZXR1cm4gLUVJTlZBTDsJCQkJCQlcCisJCQkJCQkJCQlcCisJaWYgKHNwZWVkIDwgLTEwMCB8fCBzcGVlZCA+IDEwMCkJCQkJXAorCQlyZXR1cm4gLUVJTlZBTDsJCQkJCQlcCisJCQkJCQkJCQlcCisJbWMtPmRlc2lyZWRfc3BlZWRbdmFsdWVdID0gc3BlZWQ7CQkJCVwKKwkJCQkJCQkJCVwKKwlyZXR2YWwgPSBzZXRfbW90b3IobWMsIHZhbHVlKTsJCQkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gcmV0dmFsID8gcmV0dmFsIDogY291bnQ7CQkJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19zcGVlZCMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKwkJCQkJY2hhciAqYnVmKQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IG1vdG9yY29udHJvbCAqbWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJCQkJCQkJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIG1jLT5zcGVlZFt2YWx1ZV0pOwkJCVwKK30KKworI2RlZmluZSBzcGVlZF9hdHRyKHZhbHVlKSAJCQkJCQlcCisJX19BVFRSKHNwZWVkIyN2YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sIAkJCVwKKwkJc2hvd19zcGVlZCMjdmFsdWUsIHNldF9zcGVlZCMjdmFsdWUpCisKK3Nob3dfc2V0X3NwZWVkKDApOworc2hvd19zZXRfc3BlZWQoMSk7CisKKyNkZWZpbmUgc2hvd19zZXRfYWNjZWxlcmF0aW9uKHZhbHVlKQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X2FjY2VsZXJhdGlvbiMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCAJCVwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IG1vdG9yY29udHJvbCAqbWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJaW50IGFjY2VsZXJhdGlvbjsJCQkJCQlcCisJaW50IHJldHZhbDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmYWNjZWxlcmF0aW9uKSA8IDEpCQkJXAorCQlyZXR1cm4gLUVJTlZBTDsJCQkJCQlcCisJCQkJCQkJCQlcCisJaWYgKGFjY2VsZXJhdGlvbiA8IDAgfHwgYWNjZWxlcmF0aW9uID4gMTAwKQkJCVwKKwkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJXAorCQkJCQkJCQkJXAorCW1jLT5hY2NlbGVyYXRpb25bdmFsdWVdID0gYWNjZWxlcmF0aW9uOwkJCQlcCisJCQkJCQkJCQlcCisJcmV0dmFsID0gc2V0X21vdG9yKG1jLCB2YWx1ZSk7CQkJCQlcCisJCQkJCQkJCQlcCisJcmV0dXJuIHJldHZhbCA/IHJldHZhbCA6IGNvdW50OwkJCQkJXAorfQkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWNjZWxlcmF0aW9uIyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCSAJXAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJCQkJCWNoYXIgKmJ1ZikJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgbW90b3Jjb250cm9sICptYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgbWMtPmFjY2VsZXJhdGlvblt2YWx1ZV0pOwkJXAorfQorCisjZGVmaW5lIGFjY2VsZXJhdGlvbl9hdHRyKHZhbHVlKQlcCisJX19BVFRSKGFjY2VsZXJhdGlvbiMjdmFsdWUsIFNfSVdVR08gfCBTX0lSVUdPLAkJCVwKKwkJc2hvd19hY2NlbGVyYXRpb24jI3ZhbHVlLCBzZXRfYWNjZWxlcmF0aW9uIyN2YWx1ZSkKKworc2hvd19zZXRfYWNjZWxlcmF0aW9uKDApOworc2hvd19zZXRfYWNjZWxlcmF0aW9uKDEpOworCisjZGVmaW5lIHNob3dfY3VycmVudCh2YWx1ZSkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19jdXJyZW50IyN2YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJCQljaGFyICpidWYpCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgbW90b3Jjb250cm9sICptYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZG1BXG4iLCAoaW50KW1jLT5fY3VycmVudFt2YWx1ZV0pOwlcCit9CisKKyNkZWZpbmUgY3VycmVudF9hdHRyKHZhbHVlKQlcCisJX19BVFRSKGN1cnJlbnQjI3ZhbHVlLCBTX0lSVUdPLCBzaG93X2N1cnJlbnQjI3ZhbHVlLCBOVUxMKQorCitzaG93X2N1cnJlbnQoMCk7CitzaG93X2N1cnJlbnQoMSk7CisKKyNkZWZpbmUgc2hvd19pbnB1dCh2YWx1ZSkJXAorc3RhdGljIHNzaXplX3Qgc2hvd19pbnB1dCMjdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKwkJCQkJY2hhciAqYnVmKQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IG1vdG9yY29udHJvbCAqbWMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCQlcCisJCQkJCQkJCQlcCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChpbnQpbWMtPmlucHV0c1t2YWx1ZV0pOwkJXAorfQorCisjZGVmaW5lIGlucHV0X2F0dHIodmFsdWUpCVwKKwlfX0FUVFIoaW5wdXQjI3ZhbHVlLCBTX0lSVUdPLCBzaG93X2lucHV0IyN2YWx1ZSwgTlVMTCkKKworc2hvd19pbnB1dCgwKTsKK3Nob3dfaW5wdXQoMSk7CitzaG93X2lucHV0KDIpOworc2hvd19pbnB1dCgzKTsKKworc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyc1tdID0geworCWlucHV0X2F0dHIoMCksCisJaW5wdXRfYXR0cigxKSwKKwlpbnB1dF9hdHRyKDIpLAorCWlucHV0X2F0dHIoMyksCisJc3BlZWRfYXR0cigwKSwKKwlzcGVlZF9hdHRyKDEpLAorCWFjY2VsZXJhdGlvbl9hdHRyKDApLAorCWFjY2VsZXJhdGlvbl9hdHRyKDEpLAorCWN1cnJlbnRfYXR0cigwKSwKKwljdXJyZW50X2F0dHIoMSkKK307CisKK3N0YXRpYyBpbnQgbW90b3Jjb250cm9sX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJc3RydWN0IG1vdG9yY29udHJvbCAqbWM7CisJaW50IHBpcGUsIG1heHAsIHJjID0gLUVOT01FTTsKKwlpbnQgYml0LCB2YWx1ZSwgaTsKKworCWludGVyZmFjZSA9IGludGYtPmN1cl9hbHRzZXR0aW5nOworCWlmIChpbnRlcmZhY2UtPmRlc2MuYk51bUVuZHBvaW50cyAhPSAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbMF0uZGVzYzsKKwlpZiAoIShlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qCisJICogYm1BdHRyaWJ1dGVzCisJICovCisJcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGRldiwgZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MpOworCW1heHAgPSB1c2JfbWF4cGFja2V0KGRldiwgcGlwZSwgdXNiX3BpcGVvdXQocGlwZSkpOworCisJbWMgPSBremFsbG9jKHNpemVvZigqbWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1jKQorCQlnb3RvIG91dDsKKworCW1jLT5kZXZfbm8gPSAtMTsKKwltYy0+ZGF0YSA9IHVzYl9idWZmZXJfYWxsb2MoZGV2LCBVUkJfSU5UX1NJWkUsIFNMQUJfQVRPTUlDLCAmbWMtPmRhdGFfZG1hKTsKKwlpZiAoIW1jLT5kYXRhKQorCQlnb3RvIG91dDsKKworCW1jLT5pcnEgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghbWMtPmlycSkKKwkJZ290byBvdXQ7CisKKwltYy0+dWRldiA9IHVzYl9nZXRfZGV2KGRldik7CisJbWMtPmludGYgPSBpbnRmOworCW1jLT5hY2NlbGVyYXRpb25bMF0gPSBtYy0+YWNjZWxlcmF0aW9uWzFdID0gMTA7CisJSU5JVF9XT1JLKCZtYy0+ZG9fbm90aWZ5LCBkb19ub3RpZnksIG1jKTsKKwl1c2JfZmlsbF9pbnRfdXJiKG1jLT5pcnEsIG1jLT51ZGV2LCBwaXBlLCBtYy0+ZGF0YSwKKwkJCW1heHAgPiBVUkJfSU5UX1NJWkUgPyBVUkJfSU5UX1NJWkUgOiBtYXhwLAorCQkJbW90b3Jjb250cm9sX2lycSwgbWMsIGVuZHBvaW50LT5iSW50ZXJ2YWwpOworCW1jLT5pcnEtPnRyYW5zZmVyX2RtYSA9IG1jLT5kYXRhX2RtYTsKKwltYy0+aXJxLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgbWMpOworCisJZG8geworCQliaXQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KCZkZXZpY2Vfbm8sIHNpemVvZihkZXZpY2Vfbm8pKTsKKwkJdmFsdWUgPSB0ZXN0X2FuZF9zZXRfYml0KGJpdCwgJmRldmljZV9ubyk7CisJfSB3aGlsZSh2YWx1ZSk7CisJbWMtPmRldl9ubyA9IGJpdDsKKworCW1jLT5kZXYgPSBkZXZpY2VfY3JlYXRlKHBoaWRnZXRfY2xhc3MsICZtYy0+dWRldi0+ZGV2LCAwLAorCQkJCSJtb3RvcmNvbnRyb2wlZCIsIG1jLT5kZXZfbm8pOworCWlmIChJU19FUlIobWMtPmRldikpIHsKKwkJcmMgPSBQVFJfRVJSKG1jLT5kZXYpOworCQltYy0+ZGV2ID0gTlVMTDsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2X3NldF9kcnZkYXRhKG1jLT5kZXYsIG1jKTsKKworCWlmICh1c2Jfc3VibWl0X3VyYihtYy0+aXJxLCBHRlBfS0VSTkVMKSkgeworCQlyYyA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoaT0wOyBpPEFSUkFZX1NJWkUoZGV2X2F0dHJzKTsgaSsrKSB7CisJCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKG1jLT5kZXYsICZkZXZfYXR0cnNbaV0pOworCQlpZiAocmMpCisJCQlnb3RvIG91dDI7CisJfQorCisJZGV2X2luZm8oJmludGYtPmRldiwgIlVTQiBQaGlkZ2V0TW90b3JDb250cm9sIGF0dGFjaGVkXG4iKTsKKworCXJldHVybiAwOworb3V0MjoKKwl3aGlsZSAoaS0tID4gMCkKKwkJZGV2aWNlX3JlbW92ZV9maWxlKG1jLT5kZXYsICZkZXZfYXR0cnNbaV0pOworb3V0OgorCWlmIChtYykgeworCQlpZiAobWMtPmlycSkKKwkJCXVzYl9mcmVlX3VyYihtYy0+aXJxKTsKKwkJaWYgKG1jLT5kYXRhKQorCQkJdXNiX2J1ZmZlcl9mcmVlKGRldiwgVVJCX0lOVF9TSVpFLCBtYy0+ZGF0YSwgbWMtPmRhdGFfZG1hKTsKKwkJaWYgKG1jLT5kZXYpCisJCQlkZXZpY2VfdW5yZWdpc3RlcihtYy0+ZGV2KTsKKwkJaWYgKG1jLT5kZXZfbm8gPj0gMCkKKwkJCWNsZWFyX2JpdChtYy0+ZGV2X25vLCAmZGV2aWNlX25vKTsKKworCQlrZnJlZShtYyk7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBtb3RvcmNvbnRyb2xfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQoreworCXN0cnVjdCBtb3RvcmNvbnRyb2wgKm1jOworCWludCBpOworCisJbWMgPSB1c2JfZ2V0X2ludGZkYXRhKGludGVyZmFjZSk7CisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCWlmICghbWMpCisJCXJldHVybjsKKworCXVzYl9raWxsX3VyYihtYy0+aXJxKTsKKwl1c2JfZnJlZV91cmIobWMtPmlycSk7CisJdXNiX2J1ZmZlcl9mcmVlKG1jLT51ZGV2LCBVUkJfSU5UX1NJWkUsIG1jLT5kYXRhLCBtYy0+ZGF0YV9kbWEpOworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmbWMtPmRvX25vdGlmeSk7CisKKwlmb3IgKGk9MDsgaTxBUlJBWV9TSVpFKGRldl9hdHRycyk7IGkrKykKKwkJZGV2aWNlX3JlbW92ZV9maWxlKG1jLT5kZXYsICZkZXZfYXR0cnNbaV0pOworCisJZGV2aWNlX3VucmVnaXN0ZXIobWMtPmRldik7CisKKwl1c2JfcHV0X2RldihtYy0+dWRldik7CisJY2xlYXJfYml0KG1jLT5kZXZfbm8sICZkZXZpY2Vfbm8pOworCWtmcmVlKG1jKTsKKworCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIlVTQiBQaGlkZ2V0TW90b3JDb250cm9sIGRldGFjaGVkXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIG1vdG9yY29udHJvbF9kcml2ZXIgPSB7CisJLm5hbWUgPSAicGhpZGdldG1vdG9yY29udHJvbCIsCisJLnByb2JlID0gbW90b3Jjb250cm9sX3Byb2JlLAorCS5kaXNjb25uZWN0ID0gbW90b3Jjb250cm9sX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0gaWRfdGFibGUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1vdG9yY29udHJvbF9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlyZXR2YWwgPSB1c2JfcmVnaXN0ZXIoJm1vdG9yY29udHJvbF9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gRXJyb3IgbnVtYmVyICVkIiwgcmV0dmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtb3RvcmNvbnRyb2xfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZtb3RvcmNvbnRyb2xfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobW90b3Jjb250cm9sX2luaXQpOworbW9kdWxlX2V4aXQobW90b3Jjb250cm9sX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldHNlcnZvLmMgYi9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRzZXJ2by5jCmluZGV4IGMwZGY3OWM5Li43MTYzZjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3BoaWRnZXRzZXJ2by5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvcGhpZGdldHNlcnZvLmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogVVNCIFBoaWRnZXRTZXJ2byBkcml2ZXIgMS4wCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA0IFNlYW4gWW91bmcgPHNlYW5AbWVzcy5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDYgU2VhbiBZb3VuZyA8c2VhbkBtZXNzLm9yZz4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTE1LDE0ICsxNSw2IEBACiAgKgogICogQ0FVVElPTjogR2VuZXJhbGx5IHlvdSBzaG91bGQgdXNlIDAgPCBkZWdyZWVzIDwgMTgwIGFzIGFueXRoaW5nIGVsc2UKICAqIGlzIHByb2JhYmx5IGJleW9uZCB0aGUgcmFuZ2Ugb2YgeW91ciBzZXJ2byBhbmQgbWF5IGRhbWFnZSBpdC4KLSAqCi0gKiBKdW4gMTYsIDIwMDQ6IFNlYW4gWW91bmcgPHNlYW5AbWVzcy5vcmc+Ci0gKiAgLSBjbGVhbnVwcwotICogIC0gd2FzIHVzaW5nIG1lbW9yeSBhZnRlciBrZnJlZSgpCi0gKiBBdWcgOCwgMjAwNDogU2VhbiBZb3VuZyA8c2VhbkBtZXNzLm9yZz4KLSAqICAtIHNldCB0aGUgaGlnaGVzdCBhbmdsZSBhcyBoaWdoIGFzIHRoZSBoYXJkd2FyZSBhbGxvd3MsIHRoZXJlIGFyZSAKLSAqICAgIHNvbWUgb2RkIHNlcnZvcyBvdXQgdGhlcmUKLSAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMzIsNiArMjQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogCisjaW5jbHVkZSAicGhpZGdldC5oIgorCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIlNlYW4gWW91bmcgPHNlYW5AbWVzcy5vcmc+IgogI2RlZmluZSBEUklWRVJfREVTQyAiVVNCIFBoaWRnZXRTZXJ2byBEcml2ZXIiCiAKQEAgLTcwLDggKzY0LDEyIEBACiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBpZF90YWJsZSk7CiAKK3N0YXRpYyBpbnQgdW5zaWduZWQgbG9uZyBkZXZpY2Vfbm87CisKIHN0cnVjdCBwaGlkZ2V0X3NlcnZvIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IGRldl9ubzsKIAl1bG9uZyB0eXBlOwogCWludCBwdWxzZVs0XTsKIAlpbnQgZGVncmVlc1s0XTsKQEAgLTIwMywxNiArMjAxLDE2IEBACiB9CiAKICNkZWZpbmUgc2hvd19zZXQodmFsdWUpCVwKLXN0YXRpYyBzc2l6ZV90IHNldF9zZXJ2byMjdmFsdWUgKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCQkJXAorc3RhdGljIHNzaXplX3Qgc2V0X3NlcnZvIyN2YWx1ZSAoc3RydWN0IGRldmljZSAqZGV2LCAJCQlcCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCiAJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCiB7CQkJCQkJCQkJXAogCWludCBkZWdyZWVzLCBtaW51dGVzLCByZXR2YWw7CQkJCQlcCi0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlIChkZXYpOwkJXAotCXN0cnVjdCBwaGlkZ2V0X3NlcnZvICpzZXJ2byA9IHVzYl9nZXRfaW50ZmRhdGEgKGludGYpOwkJXAorCXN0cnVjdCBwaGlkZ2V0X3NlcnZvICpzZXJ2byA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAogCQkJCQkJCQkJXAogCW1pbnV0ZXMgPSAwOwkJCQkJCQlcCiAJLyogbXVzdCBhdCBsZWFzdCBjb252ZXJ0IGRlZ3JlZXMgKi8JCQkJXAotCWlmIChzc2NhbmYgKGJ1ZiwgIiVkLiVkIiwgJmRlZ3JlZXMsICZtaW51dGVzKSA8IDEpIHsJCVwKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkLiVkIiwgJmRlZ3JlZXMsICZtaW51dGVzKSA8IDEpIHsJCVwKIAkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJXAogCX0JCQkJCQkJCVwKIAkJCQkJCQkJCVwKQEAgLTIyMCw4NiArMjE4LDEyNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsJCQkJCQlcCiAJCQkJCQkJCQlcCiAJaWYgKHNlcnZvLT50eXBlICYgU0VSVk9fVkVSU0lPTl8zMCkJCQkJXAotCQlyZXR2YWwgPSBjaGFuZ2VfcG9zaXRpb25fdjMwIChzZXJ2bywgdmFsdWUsIGRlZ3JlZXMsIAlcCisJCXJldHZhbCA9IGNoYW5nZV9wb3NpdGlvbl92MzAoc2Vydm8sIHZhbHVlLCBkZWdyZWVzLCAJXAogCQkJCQkJCW1pbnV0ZXMpOwlcCiAJZWxzZSAJCQkJCQkJCVwKLQkJcmV0dmFsID0gY2hhbmdlX3Bvc2l0aW9uX3YyMCAoc2Vydm8sIHZhbHVlLCBkZWdyZWVzLCAJXAorCQlyZXR2YWwgPSBjaGFuZ2VfcG9zaXRpb25fdjIwKHNlcnZvLCB2YWx1ZSwgZGVncmVlcywgCVwKIAkJCQkJCQltaW51dGVzKTsJXAogCQkJCQkJCQkJXAogCXJldHVybiByZXR2YWwgPCAwID8gcmV0dmFsIDogY291bnQ7CQkJCVwKIH0JCQkJCQkJCQlcCiAJCQkJCQkJCQlcCi1zdGF0aWMgc3NpemVfdCBzaG93X3NlcnZvIyN2YWx1ZSAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKSAJXAorc3RhdGljIHNzaXplX3Qgc2hvd19zZXJ2byMjdmFsdWUgKHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCisJCQkJCWNoYXIgKmJ1ZikgCQkJXAogewkJCQkJCQkJCVwKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UgKGRldik7CQlcCi0Jc3RydWN0IHBoaWRnZXRfc2Vydm8gKnNlcnZvID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CQlcCisJc3RydWN0IHBoaWRnZXRfc2Vydm8gKnNlcnZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7CQlcCiAJCQkJCQkJCQlcCi0JcmV0dXJuIHNwcmludGYgKGJ1ZiwgIiVkLiUwMmRcbiIsIHNlcnZvLT5kZWdyZWVzW3ZhbHVlXSwJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkLiUwMmRcbiIsIHNlcnZvLT5kZWdyZWVzW3ZhbHVlXSwJCVwKIAkJCQlzZXJ2by0+bWludXRlc1t2YWx1ZV0pOwkJCVwKLX0JCQkJCQkJCQlcCi1zdGF0aWMgREVWSUNFX0FUVFIoc2Vydm8jI3ZhbHVlLCBTX0lXVUdPIHwgU19JUlVHTywJCQlcCi0JICBzaG93X3NlcnZvIyN2YWx1ZSwgc2V0X3NlcnZvIyN2YWx1ZSk7Cit9CiAKKyNkZWZpbmUgc2Vydm9fYXR0cih2YWx1ZSkJCQkJCQlcCisJX19BVFRSKHNlcnZvIyN2YWx1ZSwgU19JV1VHTyB8IFNfSVJVR08sCQkJCVwKKwkJc2hvd19zZXJ2byMjdmFsdWUsIHNldF9zZXJ2byMjdmFsdWUpCiBzaG93X3NldCgwKTsKIHNob3dfc2V0KDEpOwogc2hvd19zZXQoMik7CiBzaG93X3NldCgzKTsKIAorc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyc1tdID0geworCXNlcnZvX2F0dHIoMCksIHNlcnZvX2F0dHIoMSksIHNlcnZvX2F0dHIoMiksIHNlcnZvX2F0dHIoMykKK307CisKIHN0YXRpYyBpbnQKIHNlcnZvX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKIAlzdHJ1Y3QgcGhpZGdldF9zZXJ2byAqZGV2OworCWludCBiaXQsIHZhbHVlLCByYzsKKwlpbnQgc2Vydm9fY291bnQsIGk7CiAKIAlkZXYgPSBremFsbG9jKHNpemVvZiAoc3RydWN0IHBoaWRnZXRfc2Vydm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoZGV2ID09IE5VTEwpIHsKIAkJZGV2X2VycigmaW50ZXJmYWNlLT5kZXYsICIlcyAtIG91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OwogCX0KIAogCWRldi0+dWRldiA9IHVzYl9nZXRfZGV2KHVkZXYpOwogCWRldi0+dHlwZSA9IGlkLT5kcml2ZXJfaW5mbzsKKwlkZXYtPmRldl9ubyA9IC0xOwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBkZXYpOwogCi0JZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3NlcnZvMCk7Ci0JaWYgKGRldi0+dHlwZSAmIFNFUlZPX0NPVU5UX1FVQUQpIHsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3NlcnZvMSk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9zZXJ2bzIpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfc2Vydm8zKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGJpdCA9IGZpbmRfZmlyc3RfemVyb19iaXQoJmRldmljZV9ubywgc2l6ZW9mKGRldmljZV9ubykpOworICAgICAgICAgICAgICAgIHZhbHVlID0gdGVzdF9hbmRfc2V0X2JpdChiaXQsICZkZXZpY2Vfbm8pOworICAgICAgICB9IHdoaWxlICh2YWx1ZSk7CisJZGV2LT5kZXZfbm8gPSBiaXQ7CisKKwlkZXYtPmRldiA9IGRldmljZV9jcmVhdGUocGhpZGdldF9jbGFzcywgJmRldi0+dWRldi0+ZGV2LCAwLAorCQkJCSAic2Vydm8lZCIsIGRldi0+ZGV2X25vKTsKKwlpZiAoSVNfRVJSKGRldi0+ZGV2KSkgeworCQlyYyA9IFBUUl9FUlIoZGV2LT5kZXYpOworCQlkZXYtPmRldiA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KKworCXNlcnZvX2NvdW50ID0gZGV2LT50eXBlICYgU0VSVk9fQ09VTlRfUVVBRCA/IDQgOiAxOworCisJZm9yIChpPTA7IGk8c2Vydm9fY291bnQ7IGkrKykgeworCQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYtPmRldiwgJmRldl9hdHRyc1tpXSk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0MjsKIAl9CiAKIAlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJVU0IgJWQtTW90b3IgUGhpZGdldFNlcnZvIHYlZC4wIGF0dGFjaGVkXG4iLAotCQlkZXYtPnR5cGUgJiBTRVJWT19DT1VOVF9RVUFEID8gNCA6IDEsCi0JCWRldi0+dHlwZSAmIFNFUlZPX1ZFUlNJT05fMzAgPyAzIDogMik7CisJCXNlcnZvX2NvdW50LCBkZXYtPnR5cGUgJiBTRVJWT19WRVJTSU9OXzMwID8gMyA6IDIpOwogCi0JaWYoIShkZXYtPnR5cGUgJiBTRVJWT19WRVJTSU9OXzMwKSkKKwlpZiAoIShkZXYtPnR5cGUgJiBTRVJWT19WRVJTSU9OXzMwKSkKIAkJZGV2X2luZm8oJmludGVyZmFjZS0+ZGV2LAogCQkJICJXQVJOSU5HOiB2Mi4wIG5vdCB0ZXN0ZWQhIFBsZWFzZSByZXBvcnQgaWYgaXQgd29ya3MuXG4iKTsKIAogCXJldHVybiAwOworb3V0MjoKKwl3aGlsZSAoaS0tID4gMCkKKwkJZGV2aWNlX3JlbW92ZV9maWxlKGRldi0+ZGV2LCAmZGV2X2F0dHJzW2ldKTsKK291dDoKKwlpZiAoZGV2KSB7CisJCWlmIChkZXYtPmRldikKKwkJCWRldmljZV91bnJlZ2lzdGVyKGRldi0+ZGV2KTsKKwkJaWYgKGRldi0+ZGV2X25vID49IDApCisJCQljbGVhcl9iaXQoZGV2LT5kZXZfbm8sICZkZXZpY2Vfbm8pOworCisJCWtmcmVlKGRldik7CisJfQorCisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgdm9pZAogc2Vydm9fZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQogewogCXN0cnVjdCBwaGlkZ2V0X3NlcnZvICpkZXY7CisJaW50IHNlcnZvX2NvdW50LCBpOwogCiAJZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBOVUxMKTsKIAotCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9zZXJ2bzApOwotCWlmIChkZXYtPnR5cGUgJiBTRVJWT19DT1VOVF9RVUFEKSB7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9zZXJ2bzEpOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfc2Vydm8yKTsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3NlcnZvMyk7Ci0JfQorCWlmICghZGV2KQorCQlyZXR1cm47CiAKKwlzZXJ2b19jb3VudCA9IGRldi0+dHlwZSAmIFNFUlZPX0NPVU5UX1FVQUQgPyA0IDogMTsKKworCWZvciAoaT0wOyBpPHNlcnZvX2NvdW50OyBpKyspCisJCWRldmljZV9yZW1vdmVfZmlsZShkZXYtPmRldiwgJmRldl9hdHRyc1tpXSk7CisKKwlkZXZpY2VfdW5yZWdpc3RlcihkZXYtPmRldik7CiAJdXNiX3B1dF9kZXYoZGV2LT51ZGV2KTsKIAogCWRldl9pbmZvKCZpbnRlcmZhY2UtPmRldiwgIlVTQiAlZC1Nb3RvciBQaGlkZ2V0U2Vydm8gdiVkLjAgZGV0YWNoZWRcbiIsCi0JCWRldi0+dHlwZSAmIFNFUlZPX0NPVU5UX1FVQUQgPyA0IDogMSwKLQkJZGV2LT50eXBlICYgU0VSVk9fVkVSU0lPTl8zMCA/IDMgOiAyKTsKKwkJc2Vydm9fY291bnQsIGRldi0+dHlwZSAmIFNFUlZPX1ZFUlNJT05fMzAgPyAzIDogMik7CiAKKwljbGVhcl9iaXQoZGV2LT5kZXZfbm8sICZkZXZpY2Vfbm8pOwogCWtmcmVlKGRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2Mvc2lzdXNidmdhL3Npc3VzYi5jIGIvZHJpdmVycy91c2IvbWlzYy9zaXN1c2J2Z2Evc2lzdXNiLmMKaW5kZXggZTE2NTgyZi4uYTQ0MTI0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy9zaXN1c2J2Z2Evc2lzdXNiLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9zaXN1c2J2Z2Evc2lzdXNiLmMKQEAgLTMxNzksNyArMzE3OSw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNiX3Npc3VzYl9mb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdXNiX3Npc3VzYl9mb3BzID0gewogCS5vd25lciA9CVRISVNfTU9EVUxFLAogCS5vcGVuID0JCXNpc3VzYl9vcGVuLAogCS5yZWxlYXNlID0Jc2lzdXNiX3JlbGVhc2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL3VzYl91MTMyLmggYi9kcml2ZXJzL3VzYi9taXNjL3VzYl91MTMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxYmE4OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvdXNiX3UxMzIuaApAQCAtMCwwICsxLDk3IEBACisvKgorKiBDb21tb24gSGVhZGVyIEZpbGUgZm9yIHRoZSBFbGFuIERpZ2l0YWwgU3lzdGVtcyBVMTMyIGFkYXB0ZXIKKyogdGhpcyBmaWxlIHNob3VsZCBiZSBpbmNsdWRlZCBieSBib3RoIHRoZSAiZnRkaS11MTMyIiBhbmQKKyogdGhlICJ1MTMyLWhjZCIgbW9kdWxlcy4KKyoKKyogQ29weXJpZ2h0KEMpIDIwMDYgRWxhbiBEaWdpdGFsIFN5c3RlbXMgTGltaXRlZAorKihodHRwOi8vd3d3LmVsYW5kaWdpdGFsc3lzdGVtcy5jb20pCisqCisqIEF1dGhvciBhbmQgTWFpbnRhaW5lciAtIFRvbnkgT2xlY2ggLSBFbGFuIERpZ2l0YWwgU3lzdGVtcworKih0b255Lm9sZWNoQGVsYW5kaWdpdGFsc3lzdGVtcy5jb20pCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlO3lvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorKgorKgorKiBUaGUgZHJpdmVyIHdhcyB3cml0dGVuIGJ5IFRvbnkgT2xlY2godG9ueS5vbGVjaEBlbGFuZGlnaXRhbHN5c3RlbXMuY29tKQorKiBiYXNlZCBvbiB2YXJpb3VzIFVTQiBjbGllbnQgZHJpdmVycyBpbiB0aGUgMi42LjE1IGxpbnV4IGtlcm5lbAorKiB3aXRoIGNvbnN0YW50IHJlZmVyZW5jZSB0byB0aGUgM3JkIEVkaXRpb24gb2YgTGludXggRGV2aWNlIERyaXZlcnMKKyogcHVibGlzaGVkIGJ5IE8nUmVpbGx5CisqCisqIFRoZSBVMTMyIGFkYXB0ZXIgaXMgYSBVU0IgdG8gQ2FyZEJ1cyBhZGFwdGVyIHNwZWNpZmljYWxseSBkZXNpZ25lZAorKiBmb3IgUEMgY2FyZHMgdGhhdCBjb250YWluIGFuIE9IQ0kgaG9zdCBjb250cm9sbGVyLiBUeXBpY2FsIFBDIGNhcmRzCisqIGFyZSB0aGUgT3JhbmdlIE1vYmlsZSAzRyBPcHRpb24gR2xvYmVUcm90dGVyIEZ1c2lvbiBjYXJkLgorKgorKiBUaGUgVTEzMiBhZGFwdGVyIHdpbGwgKk5PVCAqd29yayB3aXRoIFBDIGNhcmRzIHRoYXQgZG8gbm90IGNvbnRhaW4KKyogYW4gT0hDSSBjb250cm9sbGVyLiBBIHNpbXBsZSB3YXkgdG8gdGVzdCB3aGV0aGVyIGEgUEMgY2FyZCBoYXMgYW4KKyogT0hDSSBjb250cm9sbGVyIGFzIGFuIGludGVyZmFjZSBpcyB0byBpbnNlcnQgdGhlIFBDIGNhcmQgZGlyZWN0bHkKKyogaW50byBhIGxhcHRvcChvciBkZXNrdG9wKSB3aXRoIGEgQ2FyZEJ1cyBzbG90IGFuZCBpZiAibHNwY2kiIHNob3dzCisqIGEgbmV3IFVTQiBjb250cm9sbGVyIGFuZCAibHN1c2IgLXYiIHNob3dzIGEgbmV3IE9IQ0kgSG9zdCBDb250cm9sbGVyCisqIHRoZW4gdGhlcmUgaXMgYSBnb29kIGNoYW5jZSB0aGF0IHRoZSBVMTMyIGFkYXB0ZXIgd2lsbCBzdXBwb3J0IHRoZQorKiBQQyBjYXJkLih5b3UgYWxzbyBuZWVkIHRoZSBzcGVjaWZpYyBjbGllbnQgZHJpdmVyIGZvciB0aGUgUEMgY2FyZCkKKyoKKyogUGxlYXNlIGluZm9ybSB0aGUgQXV0aG9yIGFuZCBNYWludGFpbmVyIGFib3V0IGFueSBQQyBjYXJkcyB0aGF0CisqIGNvbnRhaW4gT0hDSSBIb3N0IENvbnRyb2xsZXIgYW5kIHdvcmsgd2hlbiBkaXJlY3RseSBjb25uZWN0ZWQgdG8KKyogYW4gZW1iZWRkZWQgQ2FyZEJ1cyBzbG90IGJ1dCBkbyBub3Qgd29yayB3aGVuIHRoZXkgYXJlIGNvbm5lY3RlZAorKiB2aWEgYW4gRUxBTiBVMTMyIGFkYXB0ZXIuCisqCisqIFRoZSBkcml2ZXIgY29uc2lzdHMgb2YgdHdvIG1vZHVsZXMsIHRoZSAiZnRkaS11MTMyIiBtb2R1bGUgaXMKKyogYSBVU0IgY2xpZW50IGRyaXZlciB0aGF0IGludGVyZmFjZXMgdG8gdGhlIEZUREkgY2hpcCB3aXRoaW4KKyogdGhlIFUxMzIgYWRhcHRlciBtYW51ZmFjdHVyZWQgYnkgRWxhbiBEaWdpdGFsIFN5c3RlbXMsIGFuZCB0aGUKKyogInUxMzItaGNkIiBtb2R1bGUgaXMgYSBVU0IgaG9zdCBjb250cm9sbGVyIGRyaXZlciB0aGF0IHRhbGtzCisqIHRvIHRoZSBPSENJIGNvbnRyb2xsZXIgd2l0aGluIENhcmRCdXMgY2FyZCB0aGF0IGFyZSBpbnNlcnRlZAorKiBpbiB0aGUgVTEzMiBhZGFwdGVyLgorKgorKiBUaGUgImZ0ZGktdTEzMiIgbW9kdWxlIHNob3VsZCBiZSBsb2FkZWQgYXV0b21hdGljYWxseSBieSB0aGUKKyogaG90IHBsdWcgc3lzdGVtIHdoZW4gdGhlIFUxMzIgYWRhcHRlciBpcyBwbHVnZ2VkIGluLiBUaGUgbW9kdWxlCisqIGluaXRpYWxpc2VzIHRoZSBhZGFwdGVyIHdoaWNoIG1vc3RseSBjb25zaXN0cyBvZiBzeW5jaHJvbmlzaW5nCisqIHRoZSBGVERJIGNoaXAsIGJlZm9yZSBjb250aW51b3VzbHkgcG9sbGluZyB0aGUgYWRhcHRlciB0byBkZXRlY3QKKyogUEMgY2FyZCBpbnNlcnRpb25zLiBBcyBzb29uIGFzIGEgUEMgY2FyZCBjb250YWluaW5nIGEgcmVjb2duaXNlZAorKiBPSENJIGNvbnRyb2xsZXIgaXMgc2VlbiB0aGUgImZ0ZGktdTEzMiIgbW9kdWxlIGV4cGxpY2l0bHkgcmVxdWVzdHMKKyogdGhlIGtlcm5lbCB0byBsb2FkIHRoZSAidTEzMi1oY2QiIG1vZHVsZS4KKyoKKyogVGhlICJmdGRpLXUxMzIiIG1vZHVsZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBpbnNlcnRlZAorKiBQQyBjYXJkIGFuZCB0aGUgInUxMzItaGNkIiBtb2R1bGUgdXNlcyB0aGUgQVBJIHRvIHNlbmQgYW5kIHJlY2lldmUKKyogZGF0YS4gVGhlIEFQSSBmZWF0dXJlcyBjYWxsLWJhY2tzLCBzbyB0aGF0IHBhcnQgb2YgdGhlICJ1MTMyLWhjZCIKKyogbW9kdWxlIGNvZGUgd2lsbCBydW4gaW4gdGhlIGNvbnRleHQgb2Ygb25lIG9mIHRoZSBrZXJuZWwgdGhyZWFkcworKiBvZiB0aGUgImZ0ZGktdTEzMiIgbW9kdWxlLgorKgorKi8KK2ludCBmdGRpX2VsYW5fc3dpdGNoX29uX2RpYWdub3N0aWNzKGludCBudW1iZXIpOwordm9pZCBmdGRpX2VsYW5fZ29uZV9hd2F5KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwordm9pZCBzdGFydF91c2JfbG9ja19kZXZpY2VfdHJhY2luZyh2b2lkKTsKK3N0cnVjdCB1MTMyX3BsYXRmb3JtX2RhdGEgeworICAgICAgICB1MTYgdmVuZG9yOworICAgICAgICB1MTYgZGV2aWNlOworICAgICAgICB1OCBwb3RwZzsKKyAgICAgICAgdm9pZCAoKnBvcnRfcG93ZXIpIChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpc19vbik7CisgICAgICAgIHZvaWQgKCpyZXNldCkgKHN0cnVjdCBkZXZpY2UgKmRldik7Cit9OworaW50IHVzYl9mdGRpX2VsYW5fZWRzZXRfc2luZ2xlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHU4IGVkX251bWJlciwKKyAgICAgICAgdm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCBhZGRyZXNzLCB1OCBlcF9udW1iZXIsIHU4IHRvZ2dsZV9iaXRzLAorICAgICAgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsIGludCBsZW4sCisgICAgICAgIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsIGludCByZXBlYXRfbnVtYmVyLAorICAgICAgICAgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkpOworaW50IHVzYl9mdGRpX2VsYW5fZWRzZXRfb3V0cHV0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHU4IGVkX251bWJlciwKKyAgICAgICAgdm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCBhZGRyZXNzLCB1OCBlcF9udW1iZXIsIHU4IHRvZ2dsZV9iaXRzLAorICAgICAgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsIGludCBsZW4sCisgICAgICAgIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsIGludCByZXBlYXRfbnVtYmVyLAorICAgICAgICAgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkpOworaW50IHVzYl9mdGRpX2VsYW5fZWRzZXRfZW1wdHkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgdTggZWRfbnVtYmVyLAorICAgICAgICB2b2lkICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4IGFkZHJlc3MsIHU4IGVwX251bWJlciwgdTggdG9nZ2xlX2JpdHMsCisgICAgICAgIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggKmJ1ZiwgaW50IGxlbiwKKyAgICAgICAgaW50IHRvZ2dsZV9iaXRzLCBpbnQgZXJyb3JfY291bnQsIGludCBjb25kaXRpb25fY29kZSwgaW50IHJlcGVhdF9udW1iZXIsCisgICAgICAgICBpbnQgaGFsdGVkLCBpbnQgc2tpcHBlZCwgaW50IGFjdHVhbCwgaW50IG5vbl9udWxsKSk7CitpbnQgdXNiX2Z0ZGlfZWxhbl9lZHNldF9pbnB1dChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCB1OCBlZF9udW1iZXIsCisgICAgICAgIHZvaWQgKmVuZHAsIHN0cnVjdCB1cmIgKnVyYiwgdTggYWRkcmVzcywgdTggZXBfbnVtYmVyLCB1OCB0b2dnbGVfYml0cywKKyAgICAgICAgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCAqYnVmLCBpbnQgbGVuLAorICAgICAgICBpbnQgdG9nZ2xlX2JpdHMsIGludCBlcnJvcl9jb3VudCwgaW50IGNvbmRpdGlvbl9jb2RlLCBpbnQgcmVwZWF0X251bWJlciwKKyAgICAgICAgIGludCBoYWx0ZWQsIGludCBza2lwcGVkLCBpbnQgYWN0dWFsLCBpbnQgbm9uX251bGwpKTsKK2ludCB1c2JfZnRkaV9lbGFuX2Vkc2V0X3NldHVwKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHU4IGVkX251bWJlciwKKyAgICAgICAgdm9pZCAqZW5kcCwgc3RydWN0IHVyYiAqdXJiLCB1OCBhZGRyZXNzLCB1OCBlcF9udW1iZXIsIHU4IHRvZ2dsZV9iaXRzLAorICAgICAgICB2b2lkICgqY2FsbGJhY2spICh2b2lkICplbmRwLCBzdHJ1Y3QgdXJiICp1cmIsIHU4ICpidWYsIGludCBsZW4sCisgICAgICAgIGludCB0b2dnbGVfYml0cywgaW50IGVycm9yX2NvdW50LCBpbnQgY29uZGl0aW9uX2NvZGUsIGludCByZXBlYXRfbnVtYmVyLAorICAgICAgICAgaW50IGhhbHRlZCwgaW50IHNraXBwZWQsIGludCBhY3R1YWwsIGludCBub25fbnVsbCkpOworaW50IHVzYl9mdGRpX2VsYW5fZWRzZXRfZmx1c2goc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgdTggZWRfbnVtYmVyLAorICAgICAgICB2b2lkICplbmRwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvdXNibGNkLmMgYi9kcml2ZXJzL3VzYi9taXNjL3VzYmxjZC5jCmluZGV4IGUwOTU3NzIuLmRiYWNhOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvdXNibGNkLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy91c2JsY2QuYwpAQCAtMjM5LDcgKzIzOSw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGNkX2ZvcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsY2RfZm9wcyA9IHsKICAgICAgICAgLm93bmVyID0gICAgICAgIFRISVNfTU9EVUxFLAogICAgICAgICAucmVhZCA9ICAgICAgICAgbGNkX3JlYWQsCiAgICAgICAgIC53cml0ZSA9ICAgICAgICBsY2Rfd3JpdGUsCkBAIC0yOTAsOSArMjkwLDcgQEAKIAkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKIAogCQlpZiAoIWRldi0+YnVsa19pbl9lbmRwb2ludEFkZHIgJiYKLQkJICAgIChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIFVTQl9ESVJfSU4pICYmCi0JCSAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSykKLQkJCQkJPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykpIHsKKwkJICAgIHVzYl9lbmRwb2ludF9pc19idWxrX2luKGVuZHBvaW50KSkgewogCQkJLyogd2UgZm91bmQgYSBidWxrIGluIGVuZHBvaW50ICovCiAJCQlidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CiAJCQlkZXYtPmJ1bGtfaW5fc2l6ZSA9IGJ1ZmZlcl9zaXplOwpAQCAtMzA1LDkgKzMwMyw3IEBACiAJCX0KIAogCQlpZiAoIWRldi0+YnVsa19vdXRfZW5kcG9pbnRBZGRyICYmCi0JCSAgICAhKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikgJiYKLQkJICAgICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQRV9NQVNLKQotCQkJCQk9PSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLKSkgeworCQkgICAgdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkgewogCQkJLyogd2UgZm91bmQgYSBidWxrIG91dCBlbmRwb2ludCAqLwogCQkJZGV2LT5idWxrX291dF9lbmRwb2ludEFkZHIgPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy91c2JsZWQuYyBiL2RyaXZlcnMvdXNiL21pc2MvdXNibGVkLmMKaW5kZXggMGM1ZWUwYS4uNDljNWM1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbWlzYy91c2JsZWQuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3VzYmxlZC5jCkBAIC0xMDgsMjIgKzEwOCwzNCBAQAogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2JfbGVkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGRldiA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAiT3V0IG9mIG1lbW9yeVxuIik7Ci0JCWdvdG8gZXJyb3I7CisJCWdvdG8gZXJyb3JfbWVtOwogCX0KIAogCWRldi0+dWRldiA9IHVzYl9nZXRfZGV2KHVkZXYpOwogCiAJdXNiX3NldF9pbnRmZGF0YSAoaW50ZXJmYWNlLCBkZXYpOwogCi0JZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2JsdWUpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9yZWQpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmaW50ZXJmYWNlLT5kZXYsICZkZXZfYXR0cl9ncmVlbik7CisJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2JsdWUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3I7CisJcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3JlZCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcjsKKwlyZXR2YWwgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfZ3JlZW4pOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyb3I7CiAKIAlkZXZfaW5mbygmaW50ZXJmYWNlLT5kZXYsICJVU0IgTEVEIGRldmljZSBub3cgYXR0YWNoZWRcbiIpOwogCXJldHVybiAwOwogCiBlcnJvcjoKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmludGVyZmFjZS0+ZGV2LCAmZGV2X2F0dHJfYmx1ZSk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX3JlZCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZpbnRlcmZhY2UtPmRldiwgJmRldl9hdHRyX2dyZWVuKTsKKwl1c2Jfc2V0X2ludGZkYXRhIChpbnRlcmZhY2UsIE5VTEwpOworCXVzYl9wdXRfZGV2KGRldi0+dWRldik7CiAJa2ZyZWUoZGV2KTsKK2Vycm9yX21lbToKIAlyZXR1cm4gcmV0dmFsOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tb24vbW9uX21haW4uYyBiL2RyaXZlcnMvdXNiL21vbi9tb25fbWFpbi5jCmluZGV4IDI3NWE2NmYuLjM5NGJiZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21vbi9tb25fbWFpbi5jCisrKyBiL2RyaXZlcnMvdXNiL21vbi9tb25fbWFpbi5jCkBAIC0yNjUsNyArMjY1LDYgQEAKIAl1YnVzLT5tb25fYnVzID0gTlVMTDsKIAltYnVzLT51X2J1cyA9IE5VTEw7CiAJbWIoKTsKLQkvLyB1c2JfYnVzX3B1dCh1YnVzKTsKIH0KIAogLyoKQEAgLTI5NywxMiArMjk2LDEyIEBACiAJSU5JVF9MSVNUX0hFQUQoJm1idXMtPnJfbGlzdCk7CiAKIAkvKgotCSAqIFRoaXMgdXNiX2J1c19nZXQgaGVyZSBpcyBzdXBlcmZsdW91cywgYmVjYXVzZSB3ZSByZWNlaXZlCi0JICogYSBub3RpZmljYXRpb24gaWYgdXNiX2J1cyBpcyBhYm91dCB0byBiZSByZW1vdmVkLgorCSAqIFdlIGRvbid0IG5lZWQgdG8gdGFrZSBhIHJlZmVyZW5jZSB0byB1YnVzLCBiZWNhdXNlIHdlIHJlY2VpdmUKKwkgKiBhIG5vdGlmaWNhdGlvbiBpZiB0aGUgYnVzIGlzIGFib3V0IHRvIGJlIHJlbW92ZWQuCiAJICovCi0JLy8gdXNiX2J1c19nZXQodWJ1cyk7CiAJbWJ1cy0+dV9idXMgPSB1YnVzOwogCXVidXMtPm1vbl9idXMgPSBtYnVzOworCW1idXMtPnVzZXNfZG1hID0gdWJ1cy0+dXNlc19kbWE7CiAKIAlyYyA9IHNucHJpbnRmKG5hbWUsIE5BTUVTWiwgIiVkdCIsIHVidXMtPmJ1c251bSk7CiAJaWYgKHJjIDw9IDAgfHwgcmMgPj0gTkFNRVNaKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbW9uL21vbl9zdGF0LmMgYi9kcml2ZXJzL3VzYi9tb24vbW9uX3N0YXQuYwppbmRleCAxZmUwMWQ5Li5mNmQxNDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tb24vbW9uX3N0YXQuYworKysgYi9kcml2ZXJzL3VzYi9tb24vbW9uX3N0YXQuYwpAQCAtMjgsNyArMjgsNyBAQAogCWlmICgoc3AgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25hcCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1idXMgPSBpbm9kZS0+dS5nZW5lcmljX2lwOworCW1idXMgPSBpbm9kZS0+aV9wcml2YXRlOwogCiAJc3AtPnNsZW4gPSBzbnByaW50ZihzcC0+c3RyLCBTVEFUX0JVRl9TSVpFLAogCSAgICAibnJlYWRlcnMgJWQgZXZlbnRzICV1IHRleHRfbG9zdCAldVxuIiwKQEAgLTYyLDcgKzYyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtb25fZm9wc19zdGF0ID0geworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtb25fZm9wc19zdGF0ID0gewogCS5vd25lciA9CVRISVNfTU9EVUxFLAogCS5vcGVuID0JCW1vbl9zdGF0X29wZW4sCiAJLmxsc2VlayA9CW5vX2xsc2VlaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21vbi9tb25fdGV4dC5jIGIvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKaW5kZXggZjk2MWE3Ny4uN2EyMzQ2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKKysrIGIvZHJpdmVycy91c2IvbW9uL21vbl90ZXh0LmMKQEAgLTc1LDEzICs3NSwxMyBAQAogICovCiAKIHN0YXRpYyBpbmxpbmUgY2hhciBtb25fdGV4dF9nZXRfc2V0dXAoc3RydWN0IG1vbl9ldmVudF90ZXh0ICplcCwKLSAgICBzdHJ1Y3QgdXJiICp1cmIsIGNoYXIgZXZfdHlwZSkKKyAgICBzdHJ1Y3QgdXJiICp1cmIsIGNoYXIgZXZfdHlwZSwgc3RydWN0IG1vbl9idXMgKm1idXMpCiB7CiAKIAlpZiAoIXVzYl9waXBlY29udHJvbCh1cmItPnBpcGUpIHx8IGV2X3R5cGUgIT0gJ1MnKQogCQlyZXR1cm4gJy0nOwogCi0JaWYgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfTk9fU0VUVVBfRE1BX01BUCkKKwlpZiAobWJ1cy0+dXNlc19kbWEgJiYgKHVyYi0+dHJhbnNmZXJfZmxhZ3MgJiBVUkJfTk9fU0VUVVBfRE1BX01BUCkpCiAJCXJldHVybiBtb25fZG1hcGVlayhlcC0+c2V0dXAsIHVyYi0+c2V0dXBfZG1hLCBTRVRVUF9NQVgpOwogCWlmICh1cmItPnNldHVwX3BhY2tldCA9PSBOVUxMKQogCQlyZXR1cm4gJ1onOwkvKiAnMCcgd291bGQgYmUgbm90IGFzIHByZXR0eS4gKi8KQEAgLTkxLDcgKzkxLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBjaGFyIG1vbl90ZXh0X2dldF9kYXRhKHN0cnVjdCBtb25fZXZlbnRfdGV4dCAqZXAsIHN0cnVjdCB1cmIgKnVyYiwKLSAgICBpbnQgbGVuLCBjaGFyIGV2X3R5cGUpCisgICAgaW50IGxlbiwgY2hhciBldl90eXBlLCBzdHJ1Y3QgbW9uX2J1cyAqbWJ1cykKIHsKIAlpbnQgcGlwZSA9IHVyYi0+cGlwZTsKIApAQCAtMTE3LDcgKzExNyw3IEBACiAJICogY29udGFpbiBub24tTlVMTCBnYXJiYWdlIGluIGNhc2UgdGhlIHVwcGVyIGxldmVsIHByb21pc2VkIHRvCiAJICogc2V0IERNQSBmb3IgdGhlIEhDRC4KIAkgKi8KLQlpZiAodXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQKQorCWlmIChtYnVzLT51c2VzX2RtYSAmJiAodXJiLT50cmFuc2Zlcl9mbGFncyAmIFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQKSkKIAkJcmV0dXJuIG1vbl9kbWFwZWVrKGVwLT5kYXRhLCB1cmItPnRyYW5zZmVyX2RtYSwgbGVuKTsKIAogCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKQpAQCAtMTYxLDggKzE2MSw5IEBACiAJLyogQ29sbGVjdGluZyBzdGF0dXMgbWFrZXMgZGVidWdnaW5nIHNlbnNlIGZvciBzdWJtaXRzLCB0b28gKi8KIAllcC0+c3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKLQllcC0+c2V0dXBfZmxhZyA9IG1vbl90ZXh0X2dldF9zZXR1cChlcCwgdXJiLCBldl90eXBlKTsKLQllcC0+ZGF0YV9mbGFnID0gbW9uX3RleHRfZ2V0X2RhdGEoZXAsIHVyYiwgZXAtPmxlbmd0aCwgZXZfdHlwZSk7CisJZXAtPnNldHVwX2ZsYWcgPSBtb25fdGV4dF9nZXRfc2V0dXAoZXAsIHVyYiwgZXZfdHlwZSwgcnAtPnIubV9idXMpOworCWVwLT5kYXRhX2ZsYWcgPSBtb25fdGV4dF9nZXRfZGF0YShlcCwgdXJiLCBlcC0+bGVuZ3RoLCBldl90eXBlLAorCQkJcnAtPnIubV9idXMpOwogCiAJcnAtPm5ldmVudHMrKzsKIAlsaXN0X2FkZF90YWlsKCZlcC0+ZV9saW5rLCAmcnAtPmVfbGlzdCk7CkBAIC0yMzgsNyArMjM5LDcgQEAKIAlpbnQgcmM7CiAKIAltdXRleF9sb2NrKCZtb25fbG9jayk7Ci0JbWJ1cyA9IGlub2RlLT51LmdlbmVyaWNfaXA7CisJbWJ1cyA9IGlub2RlLT5pX3ByaXZhdGU7CiAJdWJ1cyA9IG1idXMtPnVfYnVzOwogCiAJcnAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbW9uX3JlYWRlcl90ZXh0KSwgR0ZQX0tFUk5FTCk7CkBAIC00MDEsNyArNDAyLDcgQEAKIAlzdHJ1Y3QgbW9uX2V2ZW50X3RleHQgKmVwOwogCiAJbXV0ZXhfbG9jaygmbW9uX2xvY2spOwotCW1idXMgPSBpbm9kZS0+dS5nZW5lcmljX2lwOworCW1idXMgPSBpbm9kZS0+aV9wcml2YXRlOwogCiAJaWYgKG1idXMtPm5yZWFkZXJzIDw9IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFRBRyAiOiBjb25zaXN0ZW5jeSBlcnJvciBvbiBjbG9zZVxuIik7CkBAIC00MzUsNyArNDM2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtb25fZm9wc190ZXh0ID0geworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtb25fZm9wc190ZXh0ID0gewogCS5vd25lciA9CVRISVNfTU9EVUxFLAogCS5vcGVuID0JCW1vbl90ZXh0X29wZW4sCiAJLmxsc2VlayA9CW5vX2xsc2VlaywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21vbi91c2JfbW9uLmggYi9kcml2ZXJzL3VzYi9tb24vdXNiX21vbi5oCmluZGV4IDMzNjc4YzIuLmFiOWQwMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21vbi91c2JfbW9uLmgKKysrIGIvZHJpdmVycy91c2IvbW9uL3VzYl9tb24uaApAQCAtMjAsNiArMjAsNyBAQAogCXN0cnVjdCBkZW50cnkgKmRlbnRfczsJCS8qIERlYnVnZ2luZyBmaWxlICovCiAJc3RydWN0IGRlbnRyeSAqZGVudF90OwkJLyogVGV4dCBpbnRlcmZhY2UgZmlsZSAqLwogCXN0cnVjdCB1c2JfYnVzICp1X2J1czsKKwlpbnQgdXNlc19kbWE7CiAKIAkvKiBSZWYgKi8KIAlpbnQgbnJlYWRlcnM7CQkJLyogVW5kZXIgbW9uX2xvY2sgQU5EIG1idXMtPmxvY2sgKi8KQEAgLTUzLDcgKzU0LDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBtdXRleCBtb25fbG9jazsKIAotZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbW9uX2ZvcHNfdGV4dDsKLWV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1vbl9mb3BzX3N0YXQ7CitleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtb25fZm9wc190ZXh0OworZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbW9uX2ZvcHNfc3RhdDsKIAogI2VuZGlmIC8qIF9fVVNCX01PTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvYXNpeC5jIGIvZHJpdmVycy91c2IvbmV0L2FzaXguYwppbmRleCAyZTJiYmMwMC4uOWI5N2FhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L2FzaXguYworKysgYi9kcml2ZXJzL3VzYi9uZXQvYXNpeC5jCkBAIC0xLDcgKzEsOCBAQAogLyoKICAqIEFTSVggQVg4ODE3WCBiYXNlZCBVU0IgMi4wIEV0aGVybmV0IERldmljZXMKLSAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IERhdmlkIEhvbGxpcyA8ZGhvbGxpc0BkYXZlaG9sbGlzLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA2IERhdmlkIEhvbGxpcyA8ZGhvbGxpc0BkYXZlaG9sbGlzLmNvbT4KICAqIENvcHlyaWdodCAoQykgMjAwNSBQaGlsIENoYW5nIDxwY2hhbmcyM0BzYmNnbG9iYWwubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA2IEphbWVzIFBhaW50ZXIgPGphbWllLnBhaW50ZXJAaW5hbWUuY29tPgogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgVGlWbyBJbmMuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTM2LDYgKzM3LDkgQEAKIAogI2luY2x1ZGUgInVzYm5ldC5oIgogCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIxNC1KdW4tMjAwNiIKK3N0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lIFtdID0gImFzaXgiOworCiAvKiBBU0lYIEFYODgxN1ggYmFzZWQgVVNCIDIuMCBFdGhlcm5ldCBEZXZpY2VzICovCiAKICNkZWZpbmUgQVhfQ01EX1NFVF9TV19NSUkJCTB4MDYKQEAgLTQ2LDIzICs1MCwyNSBAQAogI2RlZmluZSBBWF9DTURfV1JJVEVfRUVQUk9NCQkweDBjCiAjZGVmaW5lIEFYX0NNRF9XUklURV9FTkFCTEUJCTB4MGQKICNkZWZpbmUgQVhfQ01EX1dSSVRFX0RJU0FCTEUJCTB4MGUKKyNkZWZpbmUgQVhfQ01EX1JFQURfUlhfQ1RMCQkweDBmCiAjZGVmaW5lIEFYX0NNRF9XUklURV9SWF9DVEwJCTB4MTAKICNkZWZpbmUgQVhfQ01EX1JFQURfSVBHMDEyCQkweDExCiAjZGVmaW5lIEFYX0NNRF9XUklURV9JUEcwCQkweDEyCiAjZGVmaW5lIEFYX0NNRF9XUklURV9JUEcxCQkweDEzCisjZGVmaW5lIEFYX0NNRF9SRUFEX05PREVfSUQJCTB4MTMKICNkZWZpbmUgQVhfQ01EX1dSSVRFX0lQRzIJCTB4MTQKICNkZWZpbmUgQVhfQ01EX1dSSVRFX01VTFRJX0ZJTFRFUgkweDE2Ci0jZGVmaW5lIEFYX0NNRF9SRUFEX05PREVfSUQJCTB4MTcKKyNkZWZpbmUgQVg4ODE3Ml9DTURfUkVBRF9OT0RFX0lECTB4MTcKICNkZWZpbmUgQVhfQ01EX1JFQURfUEhZX0lECQkweDE5CiAjZGVmaW5lIEFYX0NNRF9SRUFEX01FRElVTV9TVEFUVVMJMHgxYQogI2RlZmluZSBBWF9DTURfV1JJVEVfTUVESVVNX01PREUJMHgxYgogI2RlZmluZSBBWF9DTURfUkVBRF9NT05JVE9SX01PREUJMHgxYwogI2RlZmluZSBBWF9DTURfV1JJVEVfTU9OSVRPUl9NT0RFCTB4MWQKKyNkZWZpbmUgQVhfQ01EX1JFQURfR1BJT1MJCTB4MWUKICNkZWZpbmUgQVhfQ01EX1dSSVRFX0dQSU9TCQkweDFmCiAjZGVmaW5lIEFYX0NNRF9TV19SRVNFVAkJCTB4MjAKICNkZWZpbmUgQVhfQ01EX1NXX1BIWV9TVEFUVVMJCTB4MjEKICNkZWZpbmUgQVhfQ01EX1NXX1BIWV9TRUxFQ1QJCTB4MjIKLSNkZWZpbmUgQVg4ODc3Ml9DTURfUkVBRF9OT0RFX0lECTB4MTMKIAogI2RlZmluZSBBWF9NT05JVE9SX01PREUJCQkweDAxCiAjZGVmaW5lIEFYX01PTklUT1JfTElOSwkJCTB4MDIKQEAgLTcwLDE1ICs3NiwxNSBAQAogI2RlZmluZSBBWF9NT05JVE9SX0hTRlMJCQkweDEwCiAKIC8qIEFYODgxNzIgTWVkaXVtIFN0YXR1cyBSZWdpc3RlciB2YWx1ZXMgKi8KLSNkZWZpbmUgQVhfTUVESVVNX0ZVTExfRFVQTEVYCQkweDAyCi0jZGVmaW5lIEFYX01FRElVTV9UWF9BQk9SVF9BTExPVwkweDA0Ci0jZGVmaW5lIEFYX01FRElVTV9GTE9XX0NPTlRST0xfRU4JMHgxMAorI2RlZmluZSBBWDg4MTcyX01FRElVTV9GRAkJMHgwMgorI2RlZmluZSBBWDg4MTcyX01FRElVTV9UWAkJMHgwNAorI2RlZmluZSBBWDg4MTcyX01FRElVTV9GQwkJMHgxMAorI2RlZmluZSBBWDg4MTcyX01FRElVTV9ERUZBVUxUIFwKKwkJKCBBWDg4MTcyX01FRElVTV9GRCB8IEFYODgxNzJfTUVESVVNX1RYIHwgQVg4ODE3Ml9NRURJVU1fRkMgKQogCiAjZGVmaW5lIEFYX01DQVNUX0ZJTFRFUl9TSVpFCQk4CiAjZGVmaW5lIEFYX01BWF9NQ0FTVAkJCTY0CiAKLSNkZWZpbmUgQVhfRUVQUk9NX0xFTgkJCTB4NDAKLQogI2RlZmluZSBBWF9TV1JFU0VUX0NMRUFSCQkweDAwCiAjZGVmaW5lIEFYX1NXUkVTRVRfUlIJCQkweDAxCiAjZGVmaW5lIEFYX1NXUkVTRVRfUlQJCQkweDAyCkBAIC05MiwyMyArOTgsNzggQEAKICNkZWZpbmUgQVg4ODc3Ml9JUEcxX0RFRkFVTFQJCTB4MGMKICNkZWZpbmUgQVg4ODc3Ml9JUEcyX0RFRkFVTFQJCTB4MTIKIAotI2RlZmluZSBBWDg4NzcyX01FRElVTV9GVUxMX0RVUExFWAkweDAwMDIKLSNkZWZpbmUgQVg4ODc3Ml9NRURJVU1fUkVTRVJWRUQJCTB4MDAwNAotI2RlZmluZSBBWDg4NzcyX01FRElVTV9SWF9GQ19FTkFCTEUJMHgwMDEwCi0jZGVmaW5lIEFYODg3NzJfTUVESVVNX1RYX0ZDX0VOQUJMRQkweDAwMjAKLSNkZWZpbmUgQVg4ODc3Ml9NRURJVU1fUEFVU0VfRk9STUFUCTB4MDA4MAotI2RlZmluZSBBWDg4NzcyX01FRElVTV9SWF9FTkFCTEUJMHgwMTAwCi0jZGVmaW5lIEFYODg3NzJfTUVESVVNXzEwME1CCQkweDAyMDAKLSNkZWZpbmUgQVg4ODc3Ml9NRURJVU1fREVGQVVMVAlcCi0JKEFYODg3NzJfTUVESVVNX0ZVTExfRFVQTEVYIHwgQVg4ODc3Ml9NRURJVU1fUlhfRkNfRU5BQkxFIHwgXAotCSBBWDg4NzcyX01FRElVTV9UWF9GQ19FTkFCTEUgfCBBWDg4NzcyX01FRElVTV8xMDBNQiB8IFwKLQkgQVg4ODc3Ml9NRURJVU1fUkVTRVJWRUQgfCBBWDg4NzcyX01FRElVTV9SWF9FTkFCTEUgKQorLyogQVg4ODc3MiAmIEFYODgxNzggTWVkaXVtIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVhfTUVESVVNX1BGCQkweDAwODAKKyNkZWZpbmUgQVhfTUVESVVNX0pGRQkJMHgwMDQwCisjZGVmaW5lIEFYX01FRElVTV9URkMJCTB4MDAyMAorI2RlZmluZSBBWF9NRURJVU1fUkZDCQkweDAwMTAKKyNkZWZpbmUgQVhfTUVESVVNX0VOQ0sJCTB4MDAwOAorI2RlZmluZSBBWF9NRURJVU1fQUMJCTB4MDAwNAorI2RlZmluZSBBWF9NRURJVU1fRkQJCTB4MDAwMgorI2RlZmluZSBBWF9NRURJVU1fR00JCTB4MDAwMQorI2RlZmluZSBBWF9NRURJVU1fU00JCTB4MTAwMAorI2RlZmluZSBBWF9NRURJVU1fU0JQCQkweDA4MDAKKyNkZWZpbmUgQVhfTUVESVVNX1BTCQkweDAyMDAKKyNkZWZpbmUgQVhfTUVESVVNX1JFCQkweDAxMDAKIAotI2RlZmluZSBBWF9FRVBST01fTUFHSUMJCQkweGRlYWRiZWVmCisjZGVmaW5lIEFYODgxNzhfTUVESVVNX0RFRkFVTFQJXAorCShBWF9NRURJVU1fUFMgfCBBWF9NRURJVU1fRkQgfCBBWF9NRURJVU1fQUMgfCBcCisJIEFYX01FRElVTV9SRkMgfCBBWF9NRURJVU1fVEZDIHwgQVhfTUVESVVNX0pGRSB8IFwKKwkgQVhfTUVESVVNX1JFICkKKworI2RlZmluZSBBWDg4NzcyX01FRElVTV9ERUZBVUxUCVwKKwkoQVhfTUVESVVNX0ZEIHwgQVhfTUVESVVNX1JGQyB8IFwKKwkgQVhfTUVESVVNX1RGQyB8IEFYX01FRElVTV9QUyB8IFwKKwkgQVhfTUVESVVNX0FDIHwgQVhfTUVESVVNX1JFICkKKworLyogQVg4ODc3MiAmIEFYODgxNzggUlhfQ1RMIHZhbHVlcyAqLworI2RlZmluZSBBWF9SWF9DVExfU08JCQkweDAwODAKKyNkZWZpbmUgQVhfUlhfQ1RMX0FQCQkJMHgwMDIwCisjZGVmaW5lIEFYX1JYX0NUTF9BTQkJCTB4MDAxMAorI2RlZmluZSBBWF9SWF9DVExfQUIJCQkweDAwMDgKKyNkZWZpbmUgQVhfUlhfQ1RMX1NFUAkJCTB4MDAwNAorI2RlZmluZSBBWF9SWF9DVExfQU1BTEwJCQkweDAwMDIKKyNkZWZpbmUgQVhfUlhfQ1RMX1BSTwkJCTB4MDAwMQorI2RlZmluZSBBWF9SWF9DVExfTUZCXzIwNDgJCTB4MDAwMAorI2RlZmluZSBBWF9SWF9DVExfTUZCXzQwOTYJCTB4MDEwMAorI2RlZmluZSBBWF9SWF9DVExfTUZCXzgxOTIJCTB4MDIwMAorI2RlZmluZSBBWF9SWF9DVExfTUZCXzE2Mzg0CQkweDAzMDAKKworI2RlZmluZSBBWF9ERUZBVUxUX1JYX0NUTAlcCisJKEFYX1JYX0NUTF9TTyB8IEFYX1JYX0NUTF9BQiApCisKKy8qIEdQSU8gMCAuLiAyIHRvZ2dsZXMgKi8KKyNkZWZpbmUgQVhfR1BJT19HUE8wRU4JCTB4MDEJLyogR1BJTzAgT3V0cHV0IGVuYWJsZSAqLworI2RlZmluZSBBWF9HUElPX0dQT18wCQkweDAyCS8qIEdQSU8wIE91dHB1dCB2YWx1ZSAqLworI2RlZmluZSBBWF9HUElPX0dQTzFFTgkJMHgwNAkvKiBHUElPMSBPdXRwdXQgZW5hYmxlICovCisjZGVmaW5lIEFYX0dQSU9fR1BPXzEJCTB4MDgJLyogR1BJTzEgT3V0cHV0IHZhbHVlICovCisjZGVmaW5lIEFYX0dQSU9fR1BPMkVOCQkweDEwCS8qIEdQSU8yIE91dHB1dCBlbmFibGUgKi8KKyNkZWZpbmUgQVhfR1BJT19HUE9fMgkJMHgyMAkvKiBHUElPMiBPdXRwdXQgdmFsdWUgKi8KKyNkZWZpbmUgQVhfR1BJT19SRVNFUlZFRAkweDQwCS8qIFJlc2VydmVkICovCisjZGVmaW5lIEFYX0dQSU9fUlNFCQkweDgwCS8qIFJlbG9hZCBzZXJpYWwgRUVQUk9NICovCisKKyNkZWZpbmUgQVhfRUVQUk9NX01BR0lDCQkweGRlYWRiZWVmCisjZGVmaW5lIEFYODgxNzJfRUVQUk9NX0xFTgkweDQwCisjZGVmaW5lIEFYODg3NzJfRUVQUk9NX0xFTgkweGZmCisKKyNkZWZpbmUgUEhZX01PREVfTUFSVkVMTAkweDAwMDAKKyNkZWZpbmUgTUlJX01BUlZFTExfTEVEX0NUUkwJMHgwMDE4CisjZGVmaW5lIE1JSV9NQVJWRUxMX1NUQVRVUwkweDAwMWIKKyNkZWZpbmUgTUlJX01BUlZFTExfQ1RSTAkweDAwMTQKKworI2RlZmluZSBNQVJWRUxMX0xFRF9NQU5VQUwJMHgwMDE5CisKKyNkZWZpbmUgTUFSVkVMTF9TVEFUVVNfSFdDRkcJMHgwMDA0CisKKyNkZWZpbmUgTUFSVkVMTF9DVFJMX1RYREVMQVkJMHgwMDAyCisjZGVmaW5lIE1BUlZFTExfQ1RSTF9SWERFTEFZCTB4MDA4MAogCiAvKiBUaGlzIHN0cnVjdHVyZSBjYW5ub3QgZXhjZWVkIHNpemVvZih1bnNpZ25lZCBsb25nIFs1XSkgQUtBIDIwIGJ5dGVzICovCiBzdHJ1Y3QgYXNpeF9kYXRhIHsKIAl1OCBtdWx0aV9maWx0ZXJbQVhfTUNBU1RfRklMVEVSX1NJWkVdOworCXU4IHBoeW1vZGU7CisJdTggbGVkbW9kZTsKKwl1OCBlZXByb21fbGVuOwogfTsKIAogc3RydWN0IGF4ODgxNzJfaW50X2RhdGEgewpAQCAtMTIyLDYgKzE4Myw4IEBACiBzdGF0aWMgaW50IGFzaXhfcmVhZF9jbWQoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBjbWQsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LAogCQkJICAgIHUxNiBzaXplLCB2b2lkICpkYXRhKQogeworCWRldmRiZyhkZXYsImFzaXhfcmVhZF9jbWQoKSBjbWQ9MHglMDJ4IHZhbHVlPTB4JTA0eCBpbmRleD0weCUwNHggc2l6ZT0lZCIsCisJCWNtZCwgdmFsdWUsIGluZGV4LCBzaXplKTsKIAlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKAogCQlkZXYtPnVkZXYsCiAJCXVzYl9yY3ZjdHJscGlwZShkZXYtPnVkZXYsIDApLApAQCAtMTM3LDYgKzIwMCw4IEBACiBzdGF0aWMgaW50IGFzaXhfd3JpdGVfY21kKHN0cnVjdCB1c2JuZXQgKmRldiwgdTggY21kLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwKIAkJCSAgICAgdTE2IHNpemUsIHZvaWQgKmRhdGEpCiB7CisJZGV2ZGJnKGRldiwiYXNpeF93cml0ZV9jbWQoKSBjbWQ9MHglMDJ4IHZhbHVlPTB4JTA0eCBpbmRleD0weCUwNHggc2l6ZT0lZCIsCisJCWNtZCwgdmFsdWUsIGluZGV4LCBzaXplKTsKIAlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKAogCQlkZXYtPnVkZXYsCiAJCXVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIDApLApAQCAtMTYxLDY1ICsyMjYsMTM5IEBACiAJdXNiX2ZyZWVfdXJiKHVyYik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGFzaXhfc2V0X3N3X21paShzdHJ1Y3QgdXNibmV0ICpkZXYpCitzdGF0aWMgdm9pZAorYXNpeF93cml0ZV9jbWRfYXN5bmMoc3RydWN0IHVzYm5ldCAqZGV2LCB1OCBjbWQsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LAorCQkJCSAgICB1MTYgc2l6ZSwgdm9pZCAqZGF0YSkKIHsKLQlpbnQgcmV0OwotCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NFVF9TV19NSUksIDB4MDAwMCwgMCwgMCwgTlVMTCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldmRiZyhkZXYsICJGYWlsZWQgdG8gZW5hYmxlIHNvZnR3YXJlIE1JSSBhY2Nlc3MiKTsKLQlyZXR1cm4gcmV0OwotfQorCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKnJlcTsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCB1cmIgKnVyYjsKIAotc3RhdGljIGlubGluZSBpbnQgYXNpeF9zZXRfaHdfbWlpKHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQlpbnQgcmV0OwotCXJldCA9IGFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1NFVF9IV19NSUksIDB4MDAwMCwgMCwgMCwgTlVMTCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldmRiZyhkZXYsICJGYWlsZWQgdG8gZW5hYmxlIGhhcmR3YXJlIE1JSSBhY2Nlc3MiKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBhc2l4X2dldF9waHlpZChzdHJ1Y3QgdXNibmV0ICpkZXYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jdm9pZCAqYnVmOwotCi0JYnVmID0ga21hbGxvYygyLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJZ290byBvdXQxOwotCi0JaWYgKChyZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfUEhZX0lELAotCQkJCSAgICAwLCAwLCAyLCBidWYpKSA8IDIpIHsKLQkJZGV2ZGJnKGRldiwgIkVycm9yIHJlYWRpbmcgUEhZSUQgcmVnaXN0ZXI6ICUwMngiLCByZXQpOwotCQlnb3RvIG91dDI7CisJZGV2ZGJnKGRldiwiYXNpeF93cml0ZV9jbWRfYXN5bmMoKSBjbWQ9MHglMDJ4IHZhbHVlPTB4JTA0eCBpbmRleD0weCUwNHggc2l6ZT0lZCIsCisJCWNtZCwgdmFsdWUsIGluZGV4LCBzaXplKTsKKwlpZiAoKHVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJZGV2ZXJyKGRldiwgIkVycm9yIGFsbG9jYXRpbmcgVVJCIGluIHdyaXRlX2NtZF9hc3luYyEiKTsKKwkJcmV0dXJuOwogCX0KLQlyZXQgPSAqKCh1OCAqKWJ1ZiArIDEpOwotb3V0MjoKLQlrZnJlZShidWYpOwotb3V0MToKLQlyZXR1cm4gcmV0OworCisJaWYgKChyZXEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0KSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJZGV2ZXJyKGRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbnRyb2wgcmVxdWVzdCIpOworCQl1c2JfZnJlZV91cmIodXJiKTsKKwkJcmV0dXJuOworCX0KKworCXJlcS0+YlJlcXVlc3RUeXBlID0gVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFOworCXJlcS0+YlJlcXVlc3QgPSBjbWQ7CisJcmVxLT53VmFsdWUgPSB2YWx1ZTsKKwlyZXEtPndJbmRleCA9IGluZGV4OworCXJlcS0+d0xlbmd0aCA9IHNpemU7CisKKwl1c2JfZmlsbF9jb250cm9sX3VyYih1cmIsIGRldi0+dWRldiwKKwkJCSAgICAgdXNiX3NuZGN0cmxwaXBlKGRldi0+dWRldiwgMCksCisJCQkgICAgICh2b2lkICopcmVxLCBkYXRhLCBzaXplLAorCQkJICAgICBhc2l4X2FzeW5jX2NtZF9jYWxsYmFjaywgcmVxKTsKKworCWlmKChzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpKSA8IDApIHsKKwkJZGV2ZXJyKGRldiwgIkVycm9yIHN1Ym1pdHRpbmcgdGhlIGNvbnRyb2wgbWVzc2FnZTogc3RhdHVzPSVkIiwKKwkJCQlzdGF0dXMpOworCQlrZnJlZShyZXEpOworCQl1c2JfZnJlZV91cmIodXJiKTsKKwl9CiB9CiAKLXN0YXRpYyBpbnQgYXNpeF9zd19yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGZsYWdzKQorc3RhdGljIGludCBhc2l4X3J4X2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpbnQgcmV0OworCXU4ICAqaGVhZDsKKwl1MzIgIGhlYWRlcjsKKwljaGFyICpwYWNrZXQ7CisJc3RydWN0IHNrX2J1ZmYgKmF4X3NrYjsKKwl1MTYgc2l6ZTsKIAotICAgICAgICByZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TV19SRVNFVCwgZmxhZ3MsIDAsIDAsIE5VTEwpOwotCWlmIChyZXQgPCAwKQotCQlkZXZkYmcoZGV2LCJGYWlsZWQgdG8gc2VuZCBzb2Z0d2FyZSByZXNldDogJTAyeCIsIHJldCk7CisJaGVhZCA9ICh1OCAqKSBza2ItPmRhdGE7CisJbWVtY3B5KCZoZWFkZXIsIGhlYWQsIHNpemVvZihoZWFkZXIpKTsKKwlsZTMyX3RvX2NwdXMoJmhlYWRlcik7CisJcGFja2V0ID0gaGVhZCArIHNpemVvZihoZWFkZXIpOwogCi0JcmV0dXJuIHJldDsKKwlza2JfcHVsbChza2IsIDQpOworCisJd2hpbGUgKHNrYi0+bGVuID4gMCkgeworCQlpZiAoKHNob3J0KShoZWFkZXIgJiAweDAwMDBmZmZmKSAhPQorCQkgICAgfigoc2hvcnQpKChoZWFkZXIgJiAweGZmZmYwMDAwKSA+PiAxNikpKSB7CisJCQlkZXZlcnIoZGV2LCJhc2l4X3J4X2ZpeHVwKCkgQmFkIEhlYWRlciBMZW5ndGgiKTsKKwkJfQorCQkvKiBnZXQgdGhlIHBhY2tldCBsZW5ndGggKi8KKwkJc2l6ZSA9ICh1MTYpIChoZWFkZXIgJiAweDAwMDBmZmZmKTsKKworCQlpZiAoKHNrYi0+bGVuKSAtICgoc2l6ZSArIDEpICYgMHhmZmZlKSA9PSAwKQorCQkJcmV0dXJuIDI7CisJCWlmIChzaXplID4gRVRIX0ZSQU1FX0xFTikgeworCQkJZGV2ZXJyKGRldiwiYXNpeF9yeF9maXh1cCgpIEJhZCBSWCBMZW5ndGggJWQiLCBzaXplKTsKKwkJCXJldHVybiAwOworCQl9CisJCWF4X3NrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOworCQlpZiAoYXhfc2tiKSB7CisJCQlheF9za2ItPmxlbiA9IHNpemU7CisJCQlheF9za2ItPmRhdGEgPSBwYWNrZXQ7CisJCQlheF9za2ItPnRhaWwgPSBwYWNrZXQgKyBzaXplOworCQkJdXNibmV0X3NrYl9yZXR1cm4oZGV2LCBheF9za2IpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIDA7CisJCX0KKworCQlza2JfcHVsbChza2IsIChzaXplICsgMSkgJiAweGZmZmUpOworCisJCWlmIChza2ItPmxlbiA9PSAwKQorCQkJYnJlYWs7CisKKwkJaGVhZCA9ICh1OCAqKSBza2ItPmRhdGE7CisJCW1lbWNweSgmaGVhZGVyLCBoZWFkLCBzaXplb2YoaGVhZGVyKSk7CisJCWxlMzJfdG9fY3B1cygmaGVhZGVyKTsKKwkJcGFja2V0ID0gaGVhZCArIHNpemVvZihoZWFkZXIpOworCQlza2JfcHVsbChza2IsIDQpOworCX0KKworCWlmIChza2ItPmxlbiA8IDApIHsKKwkJZGV2ZXJyKGRldiwiYXNpeF9yeF9maXh1cCgpIEJhZCBTS0IgTGVuZ3RoICVkIiwgc2tiLT5sZW4pOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgYXNpeF93cml0ZV9yeF9jdGwoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgbW9kZSkKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqYXNpeF90eF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCWdmcF90IGZsYWdzKQogewotCWludCByZXQ7CisJaW50IHBhZGxlbjsKKwlpbnQgaGVhZHJvb20gPSBza2JfaGVhZHJvb20oc2tiKTsKKwlpbnQgdGFpbHJvb20gPSBza2JfdGFpbHJvb20oc2tiKTsKKwl1MzIgcGFja2V0X2xlbjsKKwl1MzIgcGFkYnl0ZXMgPSAweGZmZmYwMDAwOwogCi0JcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfUlhfQ1RMLCBtb2RlLCAwLCAwLCBOVUxMKTsKLQlpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICBkZXZkYmcoZGV2LCAiRmFpbGVkIHRvIHdyaXRlIFJYX0NUTCBtb2RlOiAlMDJ4IiwgcmV0KTsKKwlwYWRsZW4gPSAoKHNrYi0+bGVuICsgNCkgJSA1MTIpID8gMCA6IDQ7CiAKLQlyZXR1cm4gcmV0OworCWlmICgoIXNrYl9jbG9uZWQoc2tiKSkKKwkgICAgJiYgKChoZWFkcm9vbSArIHRhaWxyb29tKSA+PSAoNCArIHBhZGxlbikpKSB7CisJCWlmICgoaGVhZHJvb20gPCA0KSB8fCAodGFpbHJvb20gPCBwYWRsZW4pKSB7CisJCQlza2ItPmRhdGEgPSBtZW1tb3ZlKHNrYi0+aGVhZCArIDQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkJc2tiLT50YWlsID0gc2tiLT5kYXRhICsgc2tiLT5sZW47CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKKwkJc2tiMiA9IHNrYl9jb3B5X2V4cGFuZChza2IsIDQsIHBhZGxlbiwgZmxhZ3MpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlza2IgPSBza2IyOworCQlpZiAoIXNrYikKKwkJCXJldHVybiBOVUxMOworCX0KKworCXNrYl9wdXNoKHNrYiwgNCk7CisJcGFja2V0X2xlbiA9ICgoKHNrYi0+bGVuIC0gNCkgXiAweDAwMDBmZmZmKSA8PCAxNikgKyAoc2tiLT5sZW4gLSA0KTsKKwltZW1jcHkoc2tiLT5kYXRhLCAmcGFja2V0X2xlbiwgc2l6ZW9mKHBhY2tldF9sZW4pKTsKKworCWlmICgoc2tiLT5sZW4gJSA1MTIpID09IDApIHsKKwkJbWVtY3B5KCBza2ItPnRhaWwsICZwYWRieXRlcywgc2l6ZW9mKHBhZGJ5dGVzKSk7CisJCXNrYl9wdXQoc2tiLCBzaXplb2YocGFkYnl0ZXMpKTsKKwl9CisJcmV0dXJuIHNrYjsKIH0KIAogc3RhdGljIHZvaWQgYXNpeF9zdGF0dXMoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXJiICp1cmIpCkBAIC0yNDIsNTUgKzM4MSwxNTcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCi1hc2l4X3dyaXRlX2NtZF9hc3luYyhzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGNtZCwgdTE2IHZhbHVlLCB1MTYgaW5kZXgsCi0JCQkJICAgIHUxNiBzaXplLCB2b2lkICpkYXRhKQorc3RhdGljIGlubGluZSBpbnQgYXNpeF9zZXRfc3dfbWlpKHN0cnVjdCB1c2JuZXQgKmRldikKIHsKLQlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpyZXE7Ci0JaW50IHN0YXR1czsKLQlzdHJ1Y3QgdXJiICp1cmI7Ci0KLQlpZiAoKHVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKLQkJZGV2ZGJnKGRldiwgIkVycm9yIGFsbG9jYXRpbmcgVVJCIGluIHdyaXRlX2NtZF9hc3luYyEiKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICgocmVxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVzYl9jdHJscmVxdWVzdCksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7Ci0JCWRldmVycihkZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBjb250cm9sIHJlcXVlc3QiKTsKLQkJdXNiX2ZyZWVfdXJiKHVyYik7Ci0JCXJldHVybjsKLQl9Ci0KLQlyZXEtPmJSZXF1ZXN0VHlwZSA9IFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRTsKLQlyZXEtPmJSZXF1ZXN0ID0gY21kOwotCXJlcS0+d1ZhbHVlID0gY3B1X3RvX2xlMTYodmFsdWUpOwotCXJlcS0+d0luZGV4ID0gY3B1X3RvX2xlMTYoaW5kZXgpOwotCXJlcS0+d0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUpOwotCi0JdXNiX2ZpbGxfY29udHJvbF91cmIodXJiLCBkZXYtPnVkZXYsCi0JCQkgICAgIHVzYl9zbmRjdHJscGlwZShkZXYtPnVkZXYsIDApLAotCQkJICAgICAodm9pZCAqKXJlcSwgZGF0YSwgc2l6ZSwKLQkJCSAgICAgYXNpeF9hc3luY19jbWRfY2FsbGJhY2ssIHJlcSk7Ci0KLQlpZigoc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKSkgPCAwKSB7Ci0JCWRldmVycihkZXYsICJFcnJvciBzdWJtaXR0aW5nIHRoZSBjb250cm9sIG1lc3NhZ2U6IHN0YXR1cz0lZCIsCi0JCQkJc3RhdHVzKTsKLQkJa2ZyZWUocmVxKTsKLQkJdXNiX2ZyZWVfdXJiKHVyYik7Ci0JfQorCWludCByZXQ7CisJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU0VUX1NXX01JSSwgMHgwMDAwLCAwLCAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2ZXJyKGRldiwgIkZhaWxlZCB0byBlbmFibGUgc29mdHdhcmUgTUlJIGFjY2VzcyIpOworCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGFzaXhfc2V0X2h3X21paShzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJaW50IHJldDsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TRVRfSFdfTUlJLCAweDAwMDAsIDAsIDAsIE5VTEwpOworCWlmIChyZXQgPCAwKQorCQlkZXZlcnIoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBoYXJkd2FyZSBNSUkgYWNjZXNzIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXNpeF9nZXRfcGh5X2FkZHIoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCWludCByZXQgPSAwOworCXZvaWQgKmJ1ZjsKKworCWRldmRiZyhkZXYsICJhc2l4X2dldF9waHlfYWRkcigpIik7CisKKwlidWYgPSBrbWFsbG9jKDIsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlnb3RvIG91dDE7CisKKwlpZiAoKHJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9QSFlfSUQsCisJCQkJICAgIDAsIDAsIDIsIGJ1ZikpIDwgMikgeworCQlkZXZlcnIoZGV2LCAiRXJyb3IgcmVhZGluZyBQSFlJRCByZWdpc3RlcjogJTAyeCIsIHJldCk7CisJCWdvdG8gb3V0MjsKKwl9CisJZGV2ZGJnKGRldiwgImFzaXhfZ2V0X3BoeV9hZGRyKCkgcmV0dXJuaW5nIDB4JTA0eCIsICooKHUxNiAqKWJ1ZikpOworCXJldCA9ICooKHU4ICopYnVmICsgMSk7CitvdXQyOgorCWtmcmVlKGJ1Zik7CitvdXQxOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXNpeF9zd19yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYsIHU4IGZsYWdzKQoreworCWludCByZXQ7CisKKyAgICAgICAgcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfU1dfUkVTRVQsIGZsYWdzLCAwLCAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2ZXJyKGRldiwiRmFpbGVkIHRvIHNlbmQgc29mdHdhcmUgcmVzZXQ6ICUwMngiLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUxNiBhc2l4X3JlYWRfcnhfY3RsKHN0cnVjdCB1c2JuZXQgKmRldikKK3sKKwl1MTYgcmV0ID0gMDsKKwl2b2lkICpidWY7CisKKwlidWYgPSBrbWFsbG9jKDIsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlnb3RvIG91dDE7CisKKwlpZiAoKHJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9SWF9DVEwsCisJCQkJICAgIDAsIDAsIDIsIGJ1ZikpIDwgMikgeworCQlkZXZlcnIoZGV2LCAiRXJyb3IgcmVhZGluZyBSWF9DVEwgcmVnaXN0ZXI6ICUwMngiLCByZXQpOworCQlnb3RvIG91dDI7CisJfQorCXJldCA9IGxlMTZfdG9fY3B1KCooKHUxNiAqKWJ1ZikpOworb3V0MjoKKwlrZnJlZShidWYpOworb3V0MToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFzaXhfd3JpdGVfcnhfY3RsKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IG1vZGUpCit7CisJaW50IHJldDsKKworCWRldmRiZyhkZXYsImFzaXhfd3JpdGVfcnhfY3RsKCkgLSBtb2RlID0gMHglMDR4IiwgbW9kZSk7CisJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfUlhfQ1RMLCBtb2RlLCAwLCAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2ZXJyKGRldiwgIkZhaWxlZCB0byB3cml0ZSBSWF9DVEwgbW9kZSB0byAweCUwNHg6ICUwMngiLAorCQkgICAgICAgbW9kZSwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1MTYgYXNpeF9yZWFkX21lZGl1bV9zdGF0dXMoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXUxNiByZXQgPSAwOworCXZvaWQgKmJ1ZjsKKworCWJ1ZiA9IGttYWxsb2MoMiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCWdvdG8gb3V0MTsKKworCWlmICgocmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX01FRElVTV9TVEFUVVMsCisJCQkJICAgIDAsIDAsIDIsIGJ1ZikpIDwgMikgeworCQlkZXZlcnIoZGV2LCAiRXJyb3IgcmVhZGluZyBNZWRpdW0gU3RhdHVzIHJlZ2lzdGVyOiAlMDJ4IiwgcmV0KTsKKwkJZ290byBvdXQyOworCX0KKwlyZXQgPSBsZTE2X3RvX2NwdSgqKCh1MTYgKilidWYpKTsKK291dDI6CisJa2ZyZWUoYnVmKTsKK291dDE6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhc2l4X3dyaXRlX21lZGl1bV9tb2RlKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IG1vZGUpCit7CisJaW50IHJldDsKKworCWRldmRiZyhkZXYsImFzaXhfd3JpdGVfbWVkaXVtX21vZGUoKSAtIG1vZGUgPSAweCUwNHgiLCBtb2RlKTsKKwlyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9NRURJVU1fTU9ERSwgbW9kZSwgMCwgMCwgTlVMTCk7CisJaWYgKHJldCA8IDApCisJCWRldmVycihkZXYsICJGYWlsZWQgdG8gd3JpdGUgTWVkaXVtIE1vZGUgbW9kZSB0byAweCUwNHg6ICUwMngiLAorCQkJbW9kZSwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXNpeF93cml0ZV9ncGlvKHN0cnVjdCB1c2JuZXQgKmRldiwgdTE2IHZhbHVlLCBpbnQgc2xlZXApCit7CisJaW50IHJldDsKKworCWRldmRiZyhkZXYsImFzaXhfd3JpdGVfZ3BpbygpIC0gdmFsdWUgPSAweCUwNHgiLCB2YWx1ZSk7CisJcmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfR1BJT1MsIHZhbHVlLCAwLCAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2ZXJyKGRldiwgIkZhaWxlZCB0byB3cml0ZSBHUElPIHZhbHVlIDB4JTA0eDogJTAyeCIsCisJCQl2YWx1ZSwgcmV0KTsKKworCWlmIChzbGVlcCkKKwkJbXNsZWVwKHNsZWVwKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBBWDg4NzcyICYgQVg4ODE3OCBoYXZlIGEgMTYtYml0IFJYX0NUTCB2YWx1ZQorICovCiBzdGF0aWMgdm9pZCBhc2l4X3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKIHsKIAlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOwogCXN0cnVjdCBhc2l4X2RhdGEgKmRhdGEgPSAoc3RydWN0IGFzaXhfZGF0YSAqKSZkZXYtPmRhdGE7Ci0JdTggcnhfY3RsID0gMHg4YzsKKwl1MTYgcnhfY3RsID0gQVhfREVGQVVMVF9SWF9DVEw7CiAKIAlpZiAobmV0LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7Ci0JCXJ4X2N0bCB8PSAweDAxOworCQlyeF9jdGwgfD0gQVhfUlhfQ1RMX1BSTzsKIAl9IGVsc2UgaWYgKG5ldC0+ZmxhZ3MgJiBJRkZfQUxMTVVMVEkKIAkJICAgfHwgbmV0LT5tY19jb3VudCA+IEFYX01BWF9NQ0FTVCkgewotCQlyeF9jdGwgfD0gMHgwMjsKKwkJcnhfY3RsIHw9IEFYX1JYX0NUTF9BTUFMTDsKIAl9IGVsc2UgaWYgKG5ldC0+bWNfY291bnQgPT0gMCkgewogCQkvKiBqdXN0IGJyb2FkY2FzdCBhbmQgZGlyZWN0ZWQgKi8KIAl9IGVsc2UgewpAQCAtMzE3LDcgKzU1OCw3IEBACiAJCWFzaXhfd3JpdGVfY21kX2FzeW5jKGRldiwgQVhfQ01EX1dSSVRFX01VTFRJX0ZJTFRFUiwgMCwgMCwKIAkJCQkgICBBWF9NQ0FTVF9GSUxURVJfU0laRSwgZGF0YS0+bXVsdGlfZmlsdGVyKTsKIAotCQlyeF9jdGwgfD0gMHgxMDsKKwkJcnhfY3RsIHw9IEFYX1JYX0NUTF9BTTsKIAl9CiAKIAlhc2l4X3dyaXRlX2NtZF9hc3luYyhkZXYsIEFYX0NNRF9XUklURV9SWF9DVEwsIHJ4X2N0bCwgMCwgMCwgTlVMTCk7CkBAIC0zMzMsNTAgKzU3NCw0MyBAQAogCQkJCShfX3UxNilsb2MsIDIsICh1MTYgKikmcmVzKTsKIAlhc2l4X3NldF9od19taWkoZGV2KTsKIAotCXJldHVybiByZXMgJiAweGZmZmY7Ci19CisJZGV2ZGJnKGRldiwgImFzaXhfbWRpb19yZWFkKCkgcGh5X2lkPTB4JTAyeCwgbG9jPTB4JTAyeCwgcmV0dXJucz0weCUwNHgiLCBwaHlfaWQsIGxvYywgbGUxNl90b19jcHUocmVzICYgMHhmZmZmKSk7CiAKLS8qIHNhbWUgYXMgYWJvdmUsIGJ1dCBjb252ZXJ0cyByZXN1bHRpbmcgdmFsdWUgdG8gY3B1IGJ5dGUgb3JkZXIgKi8KLXN0YXRpYyBpbnQgYXNpeF9tZGlvX3JlYWRfbGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IGxvYykKLXsKLQlyZXR1cm4gbGUxNl90b19jcHUoYXNpeF9tZGlvX3JlYWQobmV0ZGV2LHBoeV9pZCwgbG9jKSk7CisJcmV0dXJuIGxlMTZfdG9fY3B1KHJlcyAmIDB4ZmZmZik7CiB9CiAKIHN0YXRpYyB2b2lkCiBhc2l4X21kaW9fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHBoeV9pZCwgaW50IGxvYywgaW50IHZhbCkKIHsKIAlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXUxNiByZXMgPSB2YWw7CisJdTE2IHJlcyA9IGNwdV90b19sZTE2KHZhbCk7CiAKKwlkZXZkYmcoZGV2LCAiYXNpeF9tZGlvX3dyaXRlKCkgcGh5X2lkPTB4JTAyeCwgbG9jPTB4JTAyeCwgdmFsPTB4JTA0eCIsIHBoeV9pZCwgbG9jLCB2YWwpOwogCWFzaXhfc2V0X3N3X21paShkZXYpOwogCWFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX01JSV9SRUcsIHBoeV9pZCwKIAkJCQkoX191MTYpbG9jLCAyLCAodTE2ICopJnJlcyk7CiAJYXNpeF9zZXRfaHdfbWlpKGRldik7CiB9CiAKLS8qIHNhbWUgYXMgYWJvdmUsIGJ1dCBjb252ZXJ0cyBuZXcgdmFsdWUgdG8gbGUxNiBieXRlIG9yZGVyIGJlZm9yZSB3cml0aW5nICovCi1zdGF0aWMgdm9pZAotYXNpeF9tZGlvX3dyaXRlX2xlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBwaHlfaWQsIGludCBsb2MsIGludCB2YWwpCisvKiBHZXQgdGhlIFBIWSBJZGVudGlmaWVyIGZyb20gdGhlIFBIWVNJRDEgJiBQSFlTSUQyIE1JSSByZWdpc3RlcnMgKi8KK3N0YXRpYyB1MzIgYXNpeF9nZXRfcGh5aWQoc3RydWN0IHVzYm5ldCAqZGV2KQogewotCWFzaXhfbWRpb193cml0ZSggbmV0ZGV2LCBwaHlfaWQsIGxvYywgY3B1X3RvX2xlMTYodmFsKSApOwotfQorCWludCBwaHlfcmVnOworCXUzMiBwaHlfaWQ7CiAKLXN0YXRpYyBpbnQgYXg4ODE3Ml9saW5rX3Jlc2V0KHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQl1MTYgbHBhOwotCXUxNiBhZHY7Ci0JdTE2IHJlczsKLQl1OCBtb2RlOworCXBoeV9yZWcgPSBhc2l4X21kaW9fcmVhZChkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfUEhZU0lEMSk7CisJaWYgKHBoeV9yZWcgPCAwKQorCQlyZXR1cm4gMDsKIAotCW1vZGUgPSBBWF9NRURJVU1fVFhfQUJPUlRfQUxMT1cgfCBBWF9NRURJVU1fRkxPV19DT05UUk9MX0VOOwotCWxwYSA9IGFzaXhfbWRpb19yZWFkX2xlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9MUEEpOwotCWFkdiA9IGFzaXhfbWRpb19yZWFkX2xlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9BRFZFUlRJU0UpOwotCXJlcyA9IG1paV9ud2F5X3Jlc3VsdChscGF8YWR2KTsKLQlpZiAocmVzICYgTFBBX0RVUExFWCkKLQkJbW9kZSB8PSBBWF9NRURJVU1fRlVMTF9EVVBMRVg7Ci0JYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTUVESVVNX01PREUsIG1vZGUsIDAsIDAsIE5VTEwpOworCXBoeV9pZCA9IChwaHlfcmVnICYgMHhmZmZmKSA8PCAxNjsKIAotCXJldHVybiAwOworCXBoeV9yZWcgPSBhc2l4X21kaW9fcmVhZChkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfUEhZU0lEMik7CisJaWYgKHBoeV9yZWcgPCAwKQorCQlyZXR1cm4gMDsKKworCXBoeV9pZCB8PSAocGh5X3JlZyAmIDB4ZmZmZik7CisKKwlyZXR1cm4gcGh5X2lkOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNDIzLDcgKzY1NywxMCBAQAogCiBzdGF0aWMgaW50IGFzaXhfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKIHsKLQlyZXR1cm4gQVhfRUVQUk9NX0xFTjsKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCXN0cnVjdCBhc2l4X2RhdGEgKmRhdGEgPSAoc3RydWN0IGFzaXhfZGF0YSAqKSZkZXYtPmRhdGE7CisKKwlyZXR1cm4gZGF0YS0+ZWVwcm9tX2xlbjsKIH0KIAogc3RhdGljIGludCBhc2l4X2dldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwKQEAgLTQ1Myw5ICs2OTAsMTQgQEAKIHN0YXRpYyB2b2lkIGFzaXhfZ2V0X2RydmluZm8gKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsCiAJCQkJIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwlzdHJ1Y3QgYXNpeF9kYXRhICpkYXRhID0gKHN0cnVjdCBhc2l4X2RhdGEgKikmZGV2LT5kYXRhOworCiAJLyogSW5oZXJpdCBzdGFuZGFyZCBkZXZpY2UgaW5mbyAqLwogCXVzYm5ldF9nZXRfZHJ2aW5mbyhuZXQsIGluZm8pOwotCWluZm8tPmVlZHVtcF9sZW4gPSAweDNlOworCXN0cm5jcHkgKGluZm8tPmRyaXZlciwgZHJpdmVyX25hbWUsIHNpemVvZiBpbmZvLT5kcml2ZXIpOworCXN0cm5jcHkgKGluZm8tPnZlcnNpb24sIERSSVZFUl9WRVJTSU9OLCBzaXplb2YgaW5mby0+dmVyc2lvbik7CisJaW5mby0+ZWVkdW1wX2xlbiA9IGRhdGEtPmVlcHJvbV9sZW47CiB9CiAKIHN0YXRpYyBpbnQgYXNpeF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCkBAIC00NjgsOCArNzEwLDM0IEBACiBzdGF0aWMgaW50IGFzaXhfc2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisJaW50IHJlcyA9IG1paV9ldGh0b29sX3NzZXQoJmRldi0+bWlpLGNtZCk7CiAKLQlyZXR1cm4gbWlpX2V0aHRvb2xfc3NldCgmZGV2LT5taWksY21kKTsKKwkvKiBsaW5rIHNwZWVkL2R1cGxleCBtaWdodCBoYXZlIGNoYW5nZWQgKi8KKwlpZiAoZGV2LT5kcml2ZXJfaW5mby0+bGlua19yZXNldCkKKwkJZGV2LT5kcml2ZXJfaW5mby0+bGlua19yZXNldChkZXYpOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBhc2l4X253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKK3sKKwlzdHJ1Y3QgdXNibmV0ICpkZXYgPSBuZXRkZXZfcHJpdihuZXQpOworCisJcmV0dXJuIG1paV9ud2F5X3Jlc3RhcnQoJmRldi0+bWlpKTsKK30KKworc3RhdGljIHUzMiBhc2l4X2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKworCXJldHVybiBtaWlfbGlua19vaygmZGV2LT5taWkpOworfQorCitzdGF0aWMgaW50IGFzaXhfaW9jdGwgKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHVzYm5ldCAqZGV2ID0gbmV0ZGV2X3ByaXYobmV0KTsKKworCXJldHVybiBnZW5lcmljX21paV9pb2N0bCgmZGV2LT5taWksIGlmX21paShycSksIGNtZCwgTlVMTCk7CiB9CiAKIC8qIFdlIG5lZWQgdG8gb3ZlcnJpZGUgc29tZSBldGh0b29sX29wcyBzbyB3ZSByZXF1aXJlIG91cgpAQCAtNDc3LDcgKzc0NSw4IEBACiAgICBkZXZpY2VzIHRoYXQgbWF5IGJlIGNvbm5lY3RlZCBhdCB0aGUgc2FtZSB0aW1lLiAqLwogc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBheDg4MTcyX2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbwkJPSBhc2l4X2dldF9kcnZpbmZvLAotCS5nZXRfbGluawkJPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfbGluawkJPSBhc2l4X2dldF9saW5rLAorCS5ud2F5X3Jlc2V0CQk9IGFzaXhfbndheV9yZXNldCwKIAkuZ2V0X21zZ2xldmVsCQk9IHVzYm5ldF9nZXRfbXNnbGV2ZWwsCiAJLnNldF9tc2dsZXZlbAkJPSB1c2JuZXRfc2V0X21zZ2xldmVsLAogCS5nZXRfd29sCQk9IGFzaXhfZ2V0X3dvbCwKQEAgLTQ4OCwxMSArNzU3LDY2IEBACiAJLnNldF9zZXR0aW5ncwkJPSBhc2l4X3NldF9zZXR0aW5ncywKIH07CiAKLXN0YXRpYyBpbnQgYXNpeF9pb2N0bCAoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3N0YXRpYyB2b2lkIGF4ODgxNzJfc2V0X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisJc3RydWN0IGFzaXhfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgYXNpeF9kYXRhICopJmRldi0+ZGF0YTsKKwl1OCByeF9jdGwgPSAweDhjOwogCi0JcmV0dXJuIGdlbmVyaWNfbWlpX2lvY3RsKCZkZXYtPm1paSwgaWZfbWlpKHJxKSwgY21kLCBOVUxMKTsKKwlpZiAobmV0LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CisJCXJ4X2N0bCB8PSAweDAxOworCX0gZWxzZSBpZiAobmV0LT5mbGFncyAmIElGRl9BTExNVUxUSQorCQkgICB8fCBuZXQtPm1jX2NvdW50ID4gQVhfTUFYX01DQVNUKSB7CisJCXJ4X2N0bCB8PSAweDAyOworCX0gZWxzZSBpZiAobmV0LT5tY19jb3VudCA9PSAwKSB7CisJCS8qIGp1c3QgYnJvYWRjYXN0IGFuZCBkaXJlY3RlZCAqLworCX0gZWxzZSB7CisJCS8qIFdlIHVzZSB0aGUgMjAgYnl0ZSBkZXYtPmRhdGEKKwkJICogZm9yIG91ciA4IGJ5dGUgZmlsdGVyIGJ1ZmZlcgorCQkgKiB0byBhdm9pZCBhbGxvY2F0aW5nIG1lbW9yeSB0aGF0CisJCSAqIGlzIHRyaWNreSB0byBmcmVlIGxhdGVyICovCisJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWNfbGlzdCA9IG5ldC0+bWNfbGlzdDsKKwkJdTMyIGNyY19iaXRzOworCQlpbnQgaTsKKworCQltZW1zZXQoZGF0YS0+bXVsdGlfZmlsdGVyLCAwLCBBWF9NQ0FTVF9GSUxURVJfU0laRSk7CisKKwkJLyogQnVpbGQgdGhlIG11bHRpY2FzdCBoYXNoIGZpbHRlci4gKi8KKwkJZm9yIChpID0gMDsgaSA8IG5ldC0+bWNfY291bnQ7IGkrKykgeworCQkJY3JjX2JpdHMgPQorCQkJICAgIGV0aGVyX2NyYyhFVEhfQUxFTiwKKwkJCQkgICAgICBtY19saXN0LT5kbWlfYWRkcikgPj4gMjY7CisJCQlkYXRhLT5tdWx0aV9maWx0ZXJbY3JjX2JpdHMgPj4gM10gfD0KKwkJCSAgICAxIDw8IChjcmNfYml0cyAmIDcpOworCQkJbWNfbGlzdCA9IG1jX2xpc3QtPm5leHQ7CisJCX0KKworCQlhc2l4X3dyaXRlX2NtZF9hc3luYyhkZXYsIEFYX0NNRF9XUklURV9NVUxUSV9GSUxURVIsIDAsIDAsCisJCQkJICAgQVhfTUNBU1RfRklMVEVSX1NJWkUsIGRhdGEtPm11bHRpX2ZpbHRlcik7CisKKwkJcnhfY3RsIHw9IDB4MTA7CisJfQorCisJYXNpeF93cml0ZV9jbWRfYXN5bmMoZGV2LCBBWF9DTURfV1JJVEVfUlhfQ1RMLCByeF9jdGwsIDAsIDAsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGF4ODgxNzJfbGlua19yZXNldChzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJdTggbW9kZTsKKwlzdHJ1Y3QgZXRodG9vbF9jbWQgZWNtZDsKKworCW1paV9jaGVja19tZWRpYSgmZGV2LT5taWksIDEsIDEpOworCW1paV9ldGh0b29sX2dzZXQoJmRldi0+bWlpLCAmZWNtZCk7CisJbW9kZSA9IEFYODgxNzJfTUVESVVNX0RFRkFVTFQ7CisKKwlpZiAoZWNtZC5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpCisJCW1vZGUgfD0gfkFYODgxNzJfTUVESVVNX0ZEOworCisJZGV2ZGJnKGRldiwgImF4ODgxNzJfbGlua19yZXNldCgpIHNwZWVkOiAlZCBkdXBsZXg6ICVkIHNldHRpbmcgbW9kZSB0byAweCUwNHgiLCBlY21kLnNwZWVkLCBlY21kLmR1cGxleCwgbW9kZSk7CisKKwlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgbW9kZSk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBheDg4MTcyX2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKQEAgLTUwMSw2ICs4MjUsOSBAQAogCXZvaWQgKmJ1ZjsKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGdwaW9fYml0cyA9IGRldi0+ZHJpdmVyX2luZm8tPmRhdGE7CisJc3RydWN0IGFzaXhfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgYXNpeF9kYXRhICopJmRldi0+ZGF0YTsKKworCWRhdGEtPmVlcHJvbV9sZW4gPSBBWDg4MTcyX0VFUFJPTV9MRU47CiAKIAl1c2JuZXRfZ2V0X2VuZHBvaW50cyhkZXYsaW50Zik7CiAKQEAgLTUxOSwxMiArODQ2LDEyIEBACiAJCW1zbGVlcCg1KTsKIAl9CiAKLQlpZiAoKHJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwweDgwKSkgPCAwKQorCWlmICgocmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCAweDgwKSkgPCAwKQogCQlnb3RvIG91dDI7CiAKIAkvKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCiAJbWVtc2V0KGJ1ZiwgMCwgRVRIX0FMRU4pOwotCWlmICgocmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX05PREVfSUQsCisJaWYgKChyZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVg4ODE3Ml9DTURfUkVBRF9OT0RFX0lELAogCQkJCTAsIDAsIDYsIGJ1ZikpIDwgMCkgewogCQlkYmcoInJlYWQgQVhfQ01EX1JFQURfTk9ERV9JRCBmYWlsZWQ6ICVkIiwgcmV0KTsKIAkJZ290byBvdXQyOwpAQCAtNTM3LDE0ICs4NjQsMTQgQEAKIAlkZXYtPm1paS5tZGlvX3dyaXRlID0gYXNpeF9tZGlvX3dyaXRlOwogCWRldi0+bWlpLnBoeV9pZF9tYXNrID0gMHgzZjsKIAlkZXYtPm1paS5yZWdfbnVtX21hc2sgPSAweDFmOwotCWRldi0+bWlpLnBoeV9pZCA9IGFzaXhfZ2V0X3BoeWlkKGRldik7CisJZGV2LT5taWkucGh5X2lkID0gYXNpeF9nZXRfcGh5X2FkZHIoZGV2KTsKIAlkZXYtPm5ldC0+ZG9faW9jdGwgPSBhc2l4X2lvY3RsOwogCi0JZGV2LT5uZXQtPnNldF9tdWx0aWNhc3RfbGlzdCA9IGFzaXhfc2V0X211bHRpY2FzdDsKKwlkZXYtPm5ldC0+c2V0X211bHRpY2FzdF9saXN0ID0gYXg4ODE3Ml9zZXRfbXVsdGljYXN0OwogCWRldi0+bmV0LT5ldGh0b29sX29wcyA9ICZheDg4MTcyX2V0aHRvb2xfb3BzOwogCi0JYXNpeF9tZGlvX3dyaXRlX2xlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9CTUNSLCBCTUNSX1JFU0VUKTsKLQlhc2l4X21kaW9fd3JpdGVfbGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0FEVkVSVElTRSwKKwlhc2l4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOworCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQURWRVJUSVNFLAogCQlBRFZFUlRJU0VfQUxMIHwgQURWRVJUSVNFX0NTTUEgfCBBRFZFUlRJU0VfUEFVU0VfQ0FQKTsKIAltaWlfbndheV9yZXN0YXJ0KCZkZXYtPm1paSk7CiAKQEAgLTU1Nyw3ICs4ODQsOCBAQAogCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGF4ODg3NzJfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvCQk9IGFzaXhfZ2V0X2RydmluZm8sCi0JLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9saW5rCQk9IGFzaXhfZ2V0X2xpbmssCisJLm53YXlfcmVzZXQJCT0gYXNpeF9ud2F5X3Jlc2V0LAogCS5nZXRfbXNnbGV2ZWwJCT0gdXNibmV0X2dldF9tc2dsZXZlbCwKIAkuc2V0X21zZ2xldmVsCQk9IHVzYm5ldF9zZXRfbXNnbGV2ZWwsCiAJLmdldF93b2wJCT0gYXNpeF9nZXRfd29sLApAQCAtNTY4LDEwICs4OTYsMzcgQEAKIAkuc2V0X3NldHRpbmdzCQk9IGFzaXhfc2V0X3NldHRpbmdzLAogfTsKIAorc3RhdGljIGludCBheDg4NzcyX2xpbmtfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXUxNiBtb2RlOworCXN0cnVjdCBldGh0b29sX2NtZCBlY21kOworCisJbWlpX2NoZWNrX21lZGlhKCZkZXYtPm1paSwgMSwgMSk7CisJbWlpX2V0aHRvb2xfZ3NldCgmZGV2LT5taWksICZlY21kKTsKKwltb2RlID0gQVg4ODc3Ml9NRURJVU1fREVGQVVMVDsKKworCWlmIChlY21kLnNwZWVkICE9IFNQRUVEXzEwMCkKKwkJbW9kZSAmPSB+QVhfTUVESVVNX1BTOworCisJaWYgKGVjbWQuZHVwbGV4ICE9IERVUExFWF9GVUxMKQorCQltb2RlICY9IH5BWF9NRURJVU1fRkQ7CisKKwlkZXZkYmcoZGV2LCAiYXg4ODc3Ml9saW5rX3Jlc2V0KCkgc3BlZWQ6ICVkIGR1cGxleDogJWQgc2V0dGluZyBtb2RlIHRvIDB4JTA0eCIsIGVjbWQuc3BlZWQsIGVjbWQuZHVwbGV4LCBtb2RlKTsKKworCWFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBtb2RlKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGF4ODg3NzJfYmluZChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCWludCByZXQ7CiAJdm9pZCAqYnVmOworCXUxNiByeF9jdGw7CisJc3RydWN0IGFzaXhfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgYXNpeF9kYXRhICopJmRldi0+ZGF0YTsKKwl1MzIgcGh5aWQ7CisKKwlkYXRhLT5lZXByb21fbGVuID0gQVg4ODc3Ml9FRVBST01fTEVOOwogCiAJdXNibmV0X2dldF9lbmRwb2ludHMoZGV2LGludGYpOwogCkBAIC01ODIsMTMgKzkzNywxMiBAQAogCQlnb3RvIG91dDE7CiAJfQogCi0JaWYgKChyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9HUElPUywKLQkJCQkgICAgIDB4MDBCMCwgMCwgMCwgYnVmKSkgPCAwKQorCWlmICgocmV0ID0gYXNpeF93cml0ZV9ncGlvKGRldiwKKwkJCUFYX0dQSU9fUlNFIHwgQVhfR1BJT19HUE9fMiB8IEFYX0dQSU9fR1BPMkVOLCA1KSkgPCAwKQogCQlnb3RvIG91dDI7CiAKLQltc2xlZXAoNSk7CiAJaWYgKChyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9TV19QSFlfU0VMRUNULAotCQkJCTB4MDAwMSwgMCwgMCwgYnVmKSkgPCAwKSB7CisJCQkJMHgwMDAwLCAwLCAwLCBidWYpKSA8IDApIHsKIAkJZGJnKCJTZWxlY3QgUEhZICMxIGZhaWxlZDogJWQiLCByZXQpOwogCQlnb3RvIG91dDI7CiAJfQpAQCAtNjA1LDM2ICs5NTksMzQgQEAKIAkJZ290byBvdXQyOwogCiAJbXNsZWVwKDE1MCk7Ci0JaWYgKChyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIDB4MDApKSA8IDApCisJcnhfY3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYpOworCWRiZygiUlhfQ1RMIGlzIDB4JTA0eCBhZnRlciBzb2Z0d2FyZSByZXNldCIsIHJ4X2N0bCk7CisJaWYgKChyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIDB4MDAwMCkpIDwgMCkKIAkJZ290byBvdXQyOwogCisJcnhfY3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYpOworCWRiZygiUlhfQ1RMIGlzIDB4JTA0eCBzZXR0aW5nIHRvIDB4MDAwMCIsIHJ4X2N0bCk7CisKIAkvKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCiAJbWVtc2V0KGJ1ZiwgMCwgRVRIX0FMRU4pOwotCWlmICgocmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYODg3NzJfQ01EX1JFQURfTk9ERV9JRCwKKwlpZiAoKHJldCA9IGFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9OT0RFX0lELAogCQkJCTAsIDAsIEVUSF9BTEVOLCBidWYpKSA8IDApIHsKIAkJZGJnKCJGYWlsZWQgdG8gcmVhZCBNQUMgYWRkcmVzczogJWQiLCByZXQpOwogCQlnb3RvIG91dDI7CiAJfQogCW1lbWNweShkZXYtPm5ldC0+ZGV2X2FkZHIsIGJ1ZiwgRVRIX0FMRU4pOwogCi0JaWYgKChyZXQgPSBhc2l4X3NldF9zd19taWkoZGV2KSkgPCAwKQotCQlnb3RvIG91dDI7Ci0KLQlpZiAoKChyZXQgPSBhc2l4X3JlYWRfY21kKGRldiwgQVhfQ01EX1JFQURfTUlJX1JFRywKLQkgICAgICAJCQkweDAwMTAsIDIsIDIsIGJ1ZikpIDwgMCkKLQkJCXx8ICgqKCh1MTYgKilidWYpICE9IDB4MDAzYikpIHsKLQkJZGJnKCJSZWFkIFBIWSByZWdpc3RlciAyIG11c3QgYmUgMHgzYjAwOiAlZCIsIHJldCk7Ci0JCWdvdG8gb3V0MjsKLQl9Ci0KIAkvKiBJbml0aWFsaXplIE1JSSBzdHJ1Y3R1cmUgKi8KIAlkZXYtPm1paS5kZXYgPSBkZXYtPm5ldDsKIAlkZXYtPm1paS5tZGlvX3JlYWQgPSBhc2l4X21kaW9fcmVhZDsKIAlkZXYtPm1paS5tZGlvX3dyaXRlID0gYXNpeF9tZGlvX3dyaXRlOwotCWRldi0+bWlpLnBoeV9pZF9tYXNrID0gMHhmZjsKLQlkZXYtPm1paS5yZWdfbnVtX21hc2sgPSAweGZmOworCWRldi0+bWlpLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlkZXYtPm1paS5yZWdfbnVtX21hc2sgPSAweDFmOwogCWRldi0+bmV0LT5kb19pb2N0bCA9IGFzaXhfaW9jdGw7Ci0JZGV2LT5taWkucGh5X2lkID0gYXNpeF9nZXRfcGh5aWQoZGV2KTsKKwlkZXYtPm1paS5waHlfaWQgPSBhc2l4X2dldF9waHlfYWRkcihkZXYpOworCisJcGh5aWQgPSBhc2l4X2dldF9waHlpZChkZXYpOworCWRiZygiUEhZSUQ9MHglMDh4IiwgcGh5aWQpOwogCiAJaWYgKChyZXQgPSBhc2l4X3N3X3Jlc2V0KGRldiwgQVhfU1dSRVNFVF9QUkwpKSA8IDApCiAJCWdvdG8gb3V0MjsKQEAgLTY0OSwxNiArMTAwMSwxMyBAQAogCWRldi0+bmV0LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBhc2l4X3NldF9tdWx0aWNhc3Q7CiAJZGV2LT5uZXQtPmV0aHRvb2xfb3BzID0gJmF4ODg3NzJfZXRodG9vbF9vcHM7CiAKLQlhc2l4X21kaW9fd3JpdGVfbGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0JNQ1IsIEJNQ1JfUkVTRVQpOwotCWFzaXhfbWRpb193cml0ZV9sZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQURWRVJUSVNFLAorCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisJYXNpeF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9BRFZFUlRJU0UsCiAJCQlBRFZFUlRJU0VfQUxMIHwgQURWRVJUSVNFX0NTTUEpOwogCW1paV9ud2F5X3Jlc3RhcnQoJmRldi0+bWlpKTsKIAotCWlmICgocmV0ID0gYXNpeF93cml0ZV9jbWQoZGV2LCBBWF9DTURfV1JJVEVfTUVESVVNX01PREUsCi0JCQkJQVg4ODc3Ml9NRURJVU1fREVGQVVMVCwgMCwgMCwgYnVmKSkgPCAwKSB7Ci0JCWRiZygiV3JpdGUgbWVkaXVtIG1vZGUgcmVnaXN0ZXI6ICVkIiwgcmV0KTsKKwlpZiAoKHJldCA9IGFzaXhfd3JpdGVfbWVkaXVtX21vZGUoZGV2LCBBWDg4NzcyX01FRElVTV9ERUZBVUxUKSkgPCAwKQogCQlnb3RvIG91dDI7Ci0JfQogCiAJaWYgKChyZXQgPSBhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9JUEcwLAogCQkJCUFYODg3NzJfSVBHMF9ERUZBVUxUIHwgQVg4ODc3Ml9JUEcxX0RFRkFVTFQsCkBAIC02NjYsMTMgKzEwMTUsMTcgQEAKIAkJZGJnKCJXcml0ZSBJUEcsSVBHMSxJUEcyIGZhaWxlZDogJWQiLCByZXQpOwogCQlnb3RvIG91dDI7CiAJfQotCWlmICgocmV0ID0gYXNpeF9zZXRfaHdfbWlpKGRldikpIDwgMCkKLQkJZ290byBvdXQyOwogCiAJLyogU2V0IFJYX0NUTCB0byBkZWZhdWx0IHZhbHVlcyB3aXRoIDJrIGJ1ZmZlciwgYW5kIGVuYWJsZSBjYWN0dXMgKi8KLQlpZiAoKHJldCA9IGFzaXhfd3JpdGVfcnhfY3RsKGRldiwgMHgwMDg4KSkgPCAwKQorCWlmICgocmV0ID0gYXNpeF93cml0ZV9yeF9jdGwoZGV2LCBBWF9ERUZBVUxUX1JYX0NUTCkpIDwgMCkKIAkJZ290byBvdXQyOwogCisJcnhfY3RsID0gYXNpeF9yZWFkX3J4X2N0bChkZXYpOworCWRiZygiUlhfQ1RMIGlzIDB4JTA0eCBhZnRlciBhbGwgaW5pdGlhbGl6YXRpb25zIiwgcnhfY3RsKTsKKworCXJ4X2N0bCA9IGFzaXhfcmVhZF9tZWRpdW1fc3RhdHVzKGRldik7CisJZGJnKCJNZWRpdW0gU3RhdHVzIGlzIDB4JTA0eCBhZnRlciBhbGwgaW5pdGlhbGl6YXRpb25zIiwgcnhfY3RsKTsKKwogCWtmcmVlKGJ1Zik7CiAKIAkvKiBBc2l4IGZyYW1pbmcgcGFja3MgbXVsdGlwbGUgZXRoIGZyYW1lcyBpbnRvIGEgMksgdXNiIGJ1bGsgdHJhbnNmZXIgKi8KQEAgLTY5MCwxMjIgKzEwNDMsMjg3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBheDg4NzcyX3J4X2ZpeHVwKHN0cnVjdCB1c2JuZXQgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgYXg4ODE3OF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8JCT0gYXNpeF9nZXRfZHJ2aW5mbywKKwkuZ2V0X2xpbmsJCT0gYXNpeF9nZXRfbGluaywKKwkubndheV9yZXNldAkJPSBhc2l4X253YXlfcmVzZXQsCisJLmdldF9tc2dsZXZlbAkJPSB1c2JuZXRfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gdXNibmV0X3NldF9tc2dsZXZlbCwKKwkuZ2V0X3dvbAkJPSBhc2l4X2dldF93b2wsCisJLnNldF93b2wJCT0gYXNpeF9zZXRfd29sLAorCS5nZXRfZWVwcm9tX2xlbgkJPSBhc2l4X2dldF9lZXByb21fbGVuLAorCS5nZXRfZWVwcm9tCQk9IGFzaXhfZ2V0X2VlcHJvbSwKKwkuZ2V0X3NldHRpbmdzCQk9IGFzaXhfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJCT0gYXNpeF9zZXRfc2V0dGluZ3MsCit9OworCitzdGF0aWMgaW50IG1hcnZlbGxfcGh5X2luaXQoc3RydWN0IHVzYm5ldCAqZGV2KQogewotCXU4ICAqaGVhZDsKLQl1MzIgIGhlYWRlcjsKLQljaGFyICpwYWNrZXQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKmF4X3NrYjsKLQl1MTYgc2l6ZTsKKwlzdHJ1Y3QgYXNpeF9kYXRhICpkYXRhID0gKHN0cnVjdCBhc2l4X2RhdGEgKikmZGV2LT5kYXRhOworCXUxNiByZWc7CiAKLQloZWFkID0gKHU4ICopIHNrYi0+ZGF0YTsKLQltZW1jcHkoJmhlYWRlciwgaGVhZCwgc2l6ZW9mKGhlYWRlcikpOwotCWxlMzJfdG9fY3B1cygmaGVhZGVyKTsKLQlwYWNrZXQgPSBoZWFkICsgc2l6ZW9mKGhlYWRlcik7CisJZGV2ZGJnKGRldiwibWFydmVsbF9waHlfaW5pdCgpIik7CiAKLQlza2JfcHVsbChza2IsIDQpOworCXJlZyA9IGFzaXhfbWRpb19yZWFkKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9NQVJWRUxMX1NUQVRVUyk7CisJZGV2ZGJnKGRldiwiTUlJX01BUlZFTExfU1RBVFVTID0gMHglMDR4IiwgcmVnKTsKIAotCXdoaWxlIChza2ItPmxlbiA+IDApIHsKLQkJaWYgKChzaG9ydCkoaGVhZGVyICYgMHgwMDAwZmZmZikgIT0KLQkJICAgIH4oKHNob3J0KSgoaGVhZGVyICYgMHhmZmZmMDAwMCkgPj4gMTYpKSkgewotCQkJZGV2ZGJnKGRldiwiaGVhZGVyIGxlbmd0aCBkYXRhIGlzIGVycm9yIik7Ci0JCX0KLQkJLyogZ2V0IHRoZSBwYWNrZXQgbGVuZ3RoICovCi0JCXNpemUgPSAodTE2KSAoaGVhZGVyICYgMHgwMDAwZmZmZik7CisJYXNpeF9tZGlvX3dyaXRlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9NQVJWRUxMX0NUUkwsCisJCQlNQVJWRUxMX0NUUkxfUlhERUxBWSB8IE1BUlZFTExfQ1RSTF9UWERFTEFZKTsKIAotCQlpZiAoKHNrYi0+bGVuKSAtICgoc2l6ZSArIDEpICYgMHhmZmZlKSA9PSAwKQotCQkJcmV0dXJuIDI7Ci0JCWlmIChzaXplID4gRVRIX0ZSQU1FX0xFTikgewotCQkJZGV2ZGJnKGRldiwiaW52YWxpZCByeCBsZW5ndGggJWQiLCBzaXplKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWF4X3NrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwotCQlpZiAoYXhfc2tiKSB7Ci0JCQlheF9za2ItPmxlbiA9IHNpemU7Ci0JCQlheF9za2ItPmRhdGEgPSBwYWNrZXQ7Ci0JCQlheF9za2ItPnRhaWwgPSBwYWNrZXQgKyBzaXplOwotCQkJdXNibmV0X3NrYl9yZXR1cm4oZGV2LCBheF9za2IpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIDA7Ci0JCX0KKwlpZiAoZGF0YS0+bGVkbW9kZSkgeworCQlyZWcgPSBhc2l4X21kaW9fcmVhZChkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJTUlJX01BUlZFTExfTEVEX0NUUkwpOworCQlkZXZkYmcoZGV2LCJNSUlfTUFSVkVMTF9MRURfQ1RSTCAoMSkgPSAweCUwNHgiLCByZWcpOwogCi0JCXNrYl9wdWxsKHNrYiwgKHNpemUgKyAxKSAmIDB4ZmZmZSk7CisJCXJlZyAmPSAweGY4ZmY7CisJCXJlZyB8PSAoMSArIDB4MDEwMCk7CisJCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLAorCQkJTUlJX01BUlZFTExfTEVEX0NUUkwsIHJlZyk7CiAKLQkJaWYgKHNrYi0+bGVuID09IDApCi0JCQlicmVhazsKLQotCQloZWFkID0gKHU4ICopIHNrYi0+ZGF0YTsKLQkJbWVtY3B5KCZoZWFkZXIsIGhlYWQsIHNpemVvZihoZWFkZXIpKTsKLQkJbGUzMl90b19jcHVzKCZoZWFkZXIpOwotCQlwYWNrZXQgPSBoZWFkICsgc2l6ZW9mKGhlYWRlcik7Ci0JCXNrYl9wdWxsKHNrYiwgNCk7CisJCXJlZyA9IGFzaXhfbWRpb19yZWFkKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsCisJCQlNSUlfTUFSVkVMTF9MRURfQ1RSTCk7CisJCWRldmRiZyhkZXYsIk1JSV9NQVJWRUxMX0xFRF9DVFJMICgyKSA9IDB4JTA0eCIsIHJlZyk7CisJCXJlZyAmPSAweGZjMGY7CiAJfQogCi0JaWYgKHNrYi0+bGVuIDwgMCkgewotCQlkZXZkYmcoZGV2LCJpbnZhbGlkIHJ4IGxlbmd0aCAlZCIsIHNrYi0+bGVuKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmF4ODg3NzJfdHhfZml4dXAoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQlnZnBfdCBmbGFncykKLXsKLQlpbnQgcGFkbGVuOwotCWludCBoZWFkcm9vbSA9IHNrYl9oZWFkcm9vbShza2IpOwotCWludCB0YWlscm9vbSA9IHNrYl90YWlscm9vbShza2IpOwotCXUzMiBwYWNrZXRfbGVuOwotCXUzMiBwYWRieXRlcyA9IDB4ZmZmZjAwMDA7Ci0KLQlwYWRsZW4gPSAoKHNrYi0+bGVuICsgNCkgJSA1MTIpID8gMCA6IDQ7Ci0KLQlpZiAoKCFza2JfY2xvbmVkKHNrYikpCi0JICAgICYmICgoaGVhZHJvb20gKyB0YWlscm9vbSkgPj0gKDQgKyBwYWRsZW4pKSkgewotCQlpZiAoKGhlYWRyb29tIDwgNCkgfHwgKHRhaWxyb29tIDwgcGFkbGVuKSkgewotCQkJc2tiLT5kYXRhID0gbWVtbW92ZShza2ItPmhlYWQgKyA0LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQkJCXNrYi0+dGFpbCA9IHNrYi0+ZGF0YSArIHNrYi0+bGVuOwotCQl9Ci0JfSBlbHNlIHsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYjI7Ci0JCXNrYjIgPSBza2JfY29weV9leHBhbmQoc2tiLCA0LCBwYWRsZW4sIGZsYWdzKTsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJc2tiID0gc2tiMjsKLQkJaWYgKCFza2IpCi0JCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlza2JfcHVzaChza2IsIDQpOwotCXBhY2tldF9sZW4gPSAoKChza2ItPmxlbiAtIDQpIF4gMHgwMDAwZmZmZikgPDwgMTYpICsgKHNrYi0+bGVuIC0gNCk7Ci0JbWVtY3B5KHNrYi0+ZGF0YSwgJnBhY2tldF9sZW4sIHNpemVvZihwYWNrZXRfbGVuKSk7Ci0KLQlpZiAoKHNrYi0+bGVuICUgNTEyKSA9PSAwKSB7Ci0JCW1lbWNweSggc2tiLT50YWlsLCAmcGFkYnl0ZXMsIHNpemVvZihwYWRieXRlcykpOwotCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHBhZGJ5dGVzKSk7Ci0JfQotCXJldHVybiBza2I7Ci19Ci0KLXN0YXRpYyBpbnQgYXg4ODc3Ml9saW5rX3Jlc2V0KHN0cnVjdCB1c2JuZXQgKmRldikKLXsKLQl1MTYgbHBhOwotCXUxNiBhZHY7Ci0JdTE2IHJlczsKLQl1MTYgbW9kZTsKLQotCW1vZGUgPSBBWDg4NzcyX01FRElVTV9ERUZBVUxUOwotCWxwYSA9IGFzaXhfbWRpb19yZWFkX2xlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9MUEEpOwotCWFkdiA9IGFzaXhfbWRpb19yZWFkX2xlKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1JSV9BRFZFUlRJU0UpOwotCXJlcyA9IG1paV9ud2F5X3Jlc3VsdChscGF8YWR2KTsKLQotCWlmICgocmVzICYgTFBBX0RVUExFWCkgPT0gMCkKLQkJbW9kZSAmPSB+QVg4ODc3Ml9NRURJVU1fRlVMTF9EVVBMRVg7Ci0JaWYgKChyZXMgJiBMUEFfMTAwKSA9PSAwKQotCQltb2RlICY9IH5BWDg4NzcyX01FRElVTV8xMDBNQjsKLQlhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9NRURJVU1fTU9ERSwgbW9kZSwgMCwgMCwgTlVMTCk7Ci0KIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBtYXJ2ZWxsX2xlZF9zdGF0dXMoc3RydWN0IHVzYm5ldCAqZGV2LCB1MTYgc3BlZWQpCit7CisJdTE2IHJlZyA9IGFzaXhfbWRpb19yZWFkKGRldi0+bmV0LCBkZXYtPm1paS5waHlfaWQsIE1BUlZFTExfTEVEX01BTlVBTCk7CisKKwlkZXZkYmcoZGV2LCAibWFydmVsbF9sZWRfc3RhdHVzKCkgcmVhZCAweCUwNHgiLCByZWcpOworCisJLyogQ2xlYXIgb3V0IHRoZSBjZW50ZXIgTEVEIGJpdHMgLSAweDAzRjAgKi8KKwlyZWcgJj0gMHhmYzBmOworCisJc3dpdGNoIChzcGVlZCkgeworCQljYXNlIFNQRUVEXzEwMDA6CisJCQlyZWcgfD0gMHgwM2UwOworCQkJYnJlYWs7CisJCWNhc2UgU1BFRURfMTAwOgorCQkJcmVnIHw9IDB4MDNiMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmVnIHw9IDB4MDJmMDsKKwl9CisKKwlkZXZkYmcoZGV2LCAibWFydmVsbF9sZWRfc3RhdHVzKCkgd3JpdGluZyAweCUwNHgiLCByZWcpOworCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNQVJWRUxMX0xFRF9NQU5VQUwsIHJlZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBheDg4MTc4X2xpbmtfcmVzZXQoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCXUxNiBtb2RlOworCXN0cnVjdCBldGh0b29sX2NtZCBlY21kOworCXN0cnVjdCBhc2l4X2RhdGEgKmRhdGEgPSAoc3RydWN0IGFzaXhfZGF0YSAqKSZkZXYtPmRhdGE7CisKKwlkZXZkYmcoZGV2LCJheDg4MTc4X2xpbmtfcmVzZXQoKSIpOworCisJbWlpX2NoZWNrX21lZGlhKCZkZXYtPm1paSwgMSwgMSk7CisJbWlpX2V0aHRvb2xfZ3NldCgmZGV2LT5taWksICZlY21kKTsKKwltb2RlID0gQVg4ODE3OF9NRURJVU1fREVGQVVMVDsKKworCWlmIChlY21kLnNwZWVkID09IFNQRUVEXzEwMDApCisJCW1vZGUgfD0gQVhfTUVESVVNX0dNIHwgQVhfTUVESVVNX0VOQ0s7CisJZWxzZSBpZiAoZWNtZC5zcGVlZCA9PSBTUEVFRF8xMDApCisJCW1vZGUgfD0gQVhfTUVESVVNX1BTOworCWVsc2UKKwkJbW9kZSAmPSB+KEFYX01FRElVTV9QUyB8IEFYX01FRElVTV9HTSk7CisKKwlpZiAoZWNtZC5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCW1vZGUgfD0gQVhfTUVESVVNX0ZEOworCWVsc2UKKwkJbW9kZSAmPSB+QVhfTUVESVVNX0ZEOworCisJZGV2ZGJnKGRldiwgImF4ODgxNzhfbGlua19yZXNldCgpIHNwZWVkOiAlZCBkdXBsZXg6ICVkIHNldHRpbmcgbW9kZSB0byAweCUwNHgiLCBlY21kLnNwZWVkLCBlY21kLmR1cGxleCwgbW9kZSk7CisKKwlhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgbW9kZSk7CisKKwlpZiAoZGF0YS0+cGh5bW9kZSA9PSBQSFlfTU9ERV9NQVJWRUxMICYmIGRhdGEtPmxlZG1vZGUpCisJCW1hcnZlbGxfbGVkX3N0YXR1cyhkZXYsIGVjbWQuc3BlZWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF4ODgxNzhfc2V0X21mYihzdHJ1Y3QgdXNibmV0ICpkZXYpCit7CisJdTE2IG1mYiA9IEFYX1JYX0NUTF9NRkJfMTYzODQ7CisJdTE2IHJ4Y3RsOworCXUxNiBtZWRpdW07CisJaW50IG9sZF9yeF91cmJfc2l6ZSA9IGRldi0+cnhfdXJiX3NpemU7CisKKwlpZiAoZGV2LT5oYXJkX210dSA8IDIwNDgpIHsKKwkJZGV2LT5yeF91cmJfc2l6ZSA9IDIwNDg7CisJCW1mYiA9IEFYX1JYX0NUTF9NRkJfMjA0ODsKKwl9IGVsc2UgaWYgKGRldi0+aGFyZF9tdHUgPCA0MDk2KSB7CisJCWRldi0+cnhfdXJiX3NpemUgPSA0MDk2OworCQltZmIgPSBBWF9SWF9DVExfTUZCXzQwOTY7CisJfSBlbHNlIGlmIChkZXYtPmhhcmRfbXR1IDwgODE5MikgeworCQlkZXYtPnJ4X3VyYl9zaXplID0gODE5MjsKKwkJbWZiID0gQVhfUlhfQ1RMX01GQl84MTkyOworCX0gZWxzZSBpZiAoZGV2LT5oYXJkX210dSA8IDE2Mzg0KSB7CisJCWRldi0+cnhfdXJiX3NpemUgPSAxNjM4NDsKKwkJbWZiID0gQVhfUlhfQ1RMX01GQl8xNjM4NDsKKwl9CisKKwlyeGN0bCA9IGFzaXhfcmVhZF9yeF9jdGwoZGV2KTsKKwlhc2l4X3dyaXRlX3J4X2N0bChkZXYsIChyeGN0bCAmIH5BWF9SWF9DVExfTUZCXzE2Mzg0KSB8IG1mYik7CisKKwltZWRpdW0gPSBhc2l4X3JlYWRfbWVkaXVtX3N0YXR1cyhkZXYpOworCWlmIChkZXYtPm5ldC0+bXR1ID4gMTUwMCkKKwkJbWVkaXVtIHw9IEFYX01FRElVTV9KRkU7CisJZWxzZQorCQltZWRpdW0gJj0gfkFYX01FRElVTV9KRkU7CisJYXNpeF93cml0ZV9tZWRpdW1fbW9kZShkZXYsIG1lZGl1bSk7CisKKwlpZiAoZGV2LT5yeF91cmJfc2l6ZSA+IG9sZF9yeF91cmJfc2l6ZSkKKwkJdXNibmV0X3VubGlua19yeF91cmJzKGRldik7Cit9CisKK3N0YXRpYyBpbnQgYXg4ODE3OF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CisJaW50IGxsX210dSA9IG5ld19tdHUgKyBuZXQtPmhhcmRfaGVhZGVyX2xlbiArIDQ7CisKKwlkZXZkYmcoZGV2LCAiYXg4ODE3OF9jaGFuZ2VfbXR1KCkgbmV3X210dT0lZCIsIG5ld19tdHUpOworCisJaWYgKG5ld19tdHUgPD0gMCB8fCBsbF9tdHUgPiAxNjM4NCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGxsX210dSAlIGRldi0+bWF4cGFja2V0KSA9PSAwKQorCQlyZXR1cm4gLUVET007CisKKwluZXQtPm10dSA9IG5ld19tdHU7CisJZGV2LT5oYXJkX210dSA9IG5ldC0+bXR1ICsgbmV0LT5oYXJkX2hlYWRlcl9sZW47CisJYXg4ODE3OF9zZXRfbWZiKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBheDg4MTc4X2JpbmQoc3RydWN0IHVzYm5ldCAqZGV2LCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgYXNpeF9kYXRhICpkYXRhID0gKHN0cnVjdCBhc2l4X2RhdGEgKikmZGV2LT5kYXRhOworCWludCByZXQ7CisJdm9pZCAqYnVmOworCXUxNiBlZXByb207CisJaW50IGdwaW8wID0gMDsKKwl1MzIgcGh5aWQ7CisKKwl1c2JuZXRfZ2V0X2VuZHBvaW50cyhkZXYsaW50Zik7CisKKwlidWYgPSBrbWFsbG9jKDYsIEdGUF9LRVJORUwpOworCWlmKCFidWYpIHsKKwkJZGJnICgiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYnVmZmVyIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0MTsKKwl9CisKKwllZXByb20gPSAwOworCWFzaXhfcmVhZF9jbWQoZGV2LCBBWF9DTURfUkVBRF9HUElPUywgMCwgMCwgMSwgJmVlcHJvbSk7CisJZGJnKCJHUElPIFN0YXR1czogMHglMDR4IiwgZWVwcm9tKTsKKworCWFzaXhfd3JpdGVfY21kKGRldiwgQVhfQ01EX1dSSVRFX0VOQUJMRSwgMCwgMCwgMCwgTlVMTCk7CisJYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX0VFUFJPTSwgMHgwMDE3LCAwLCAyLCAmZWVwcm9tKTsKKwlhc2l4X3dyaXRlX2NtZChkZXYsIEFYX0NNRF9XUklURV9ESVNBQkxFLCAwLCAwLCAwLCBOVUxMKTsKKworCWRiZygiRUVQUk9NIGluZGV4IDB4MTcgaXMgMHglMDR4IiwgZWVwcm9tKTsKKworCWlmIChlZXByb20gPT0gMHhmZmZmKSB7CisJCWRhdGEtPnBoeW1vZGUgPSBQSFlfTU9ERV9NQVJWRUxMOworCQlkYXRhLT5sZWRtb2RlID0gMDsKKwkJZ3BpbzAgPSAxOworCX0gZWxzZSB7CisJCWRhdGEtPnBoeW1vZGUgPSBlZXByb20gJiA3OworCQlkYXRhLT5sZWRtb2RlID0gZWVwcm9tID4+IDg7CisJCWdwaW8wID0gKGVlcHJvbSAmIDB4ODApID8gMCA6IDE7CisJfQorCWRiZygiR1BJTzA6ICVkLCBQaHlNb2RlOiAlZCIsIGdwaW8wLCBkYXRhLT5waHltb2RlKTsKKworCWFzaXhfd3JpdGVfZ3BpbyhkZXYsIEFYX0dQSU9fUlNFIHwgQVhfR1BJT19HUE9fMSB8IEFYX0dQSU9fR1BPMUVOLCA0MCk7CisJaWYgKChlZXByb20gPj4gOCkgIT0gMSkgeworCQlhc2l4X3dyaXRlX2dwaW8oZGV2LCAweDAwM2MsIDMwKTsKKwkJYXNpeF93cml0ZV9ncGlvKGRldiwgMHgwMDFjLCAzMDApOworCQlhc2l4X3dyaXRlX2dwaW8oZGV2LCAweDAwM2MsIDMwKTsKKwl9IGVsc2UgeworCQlkYmcoImdwaW8gcGh5bW9kZSA9PSAxIHBhdGgiKTsKKwkJYXNpeF93cml0ZV9ncGlvKGRldiwgQVhfR1BJT19HUE8xRU4sIDMwKTsKKwkJYXNpeF93cml0ZV9ncGlvKGRldiwgQVhfR1BJT19HUE8xRU4gfCBBWF9HUElPX0dQT18xLCAzMCk7CisJfQorCisJYXNpeF9zd19yZXNldChkZXYsIDApOworCW1zbGVlcCgxNTApOworCisJYXNpeF9zd19yZXNldChkZXYsIEFYX1NXUkVTRVRfUFJMIHwgQVhfU1dSRVNFVF9JUFBEKTsKKwltc2xlZXAoMTUwKTsKKworCWFzaXhfd3JpdGVfcnhfY3RsKGRldiwgMCk7CisKKwkvKiBHZXQgdGhlIE1BQyBhZGRyZXNzICovCisJbWVtc2V0KGJ1ZiwgMCwgRVRIX0FMRU4pOworCWlmICgocmV0ID0gYXNpeF9yZWFkX2NtZChkZXYsIEFYX0NNRF9SRUFEX05PREVfSUQsCisJCQkJMCwgMCwgRVRIX0FMRU4sIGJ1ZikpIDwgMCkgeworCQlkYmcoIkZhaWxlZCB0byByZWFkIE1BQyBhZGRyZXNzOiAlZCIsIHJldCk7CisJCWdvdG8gb3V0MjsKKwl9CisJbWVtY3B5KGRldi0+bmV0LT5kZXZfYWRkciwgYnVmLCBFVEhfQUxFTik7CisKKwkvKiBJbml0aWFsaXplIE1JSSBzdHJ1Y3R1cmUgKi8KKwlkZXYtPm1paS5kZXYgPSBkZXYtPm5ldDsKKwlkZXYtPm1paS5tZGlvX3JlYWQgPSBhc2l4X21kaW9fcmVhZDsKKwlkZXYtPm1paS5tZGlvX3dyaXRlID0gYXNpeF9tZGlvX3dyaXRlOworCWRldi0+bWlpLnBoeV9pZF9tYXNrID0gMHgxZjsKKwlkZXYtPm1paS5yZWdfbnVtX21hc2sgPSAweGZmOworCWRldi0+bWlpLnN1cHBvcnRzX2dtaWkgPSAxOworCWRldi0+bmV0LT5kb19pb2N0bCA9IGFzaXhfaW9jdGw7CisJZGV2LT5taWkucGh5X2lkID0gYXNpeF9nZXRfcGh5X2FkZHIoZGV2KTsKKwlkZXYtPm5ldC0+c2V0X211bHRpY2FzdF9saXN0ID0gYXNpeF9zZXRfbXVsdGljYXN0OworCWRldi0+bmV0LT5ldGh0b29sX29wcyA9ICZheDg4MTc4X2V0aHRvb2xfb3BzOworCWRldi0+bmV0LT5jaGFuZ2VfbXR1ID0gJmF4ODgxNzhfY2hhbmdlX210dTsKKworCXBoeWlkID0gYXNpeF9nZXRfcGh5aWQoZGV2KTsKKwlkYmcoIlBIWUlEPTB4JTA4eCIsIHBoeWlkKTsKKworCWlmIChkYXRhLT5waHltb2RlID09IFBIWV9NT0RFX01BUlZFTEwpIHsKKwkJbWFydmVsbF9waHlfaW5pdChkZXYpOworCQltc2xlZXAoNjApOworCX0KKworCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQk1DUiwKKwkJCUJNQ1JfUkVTRVQgfCBCTUNSX0FORU5BQkxFKTsKKwlhc2l4X21kaW9fd3JpdGUoZGV2LT5uZXQsIGRldi0+bWlpLnBoeV9pZCwgTUlJX0FEVkVSVElTRSwKKwkJCUFEVkVSVElTRV9BTEwgfCBBRFZFUlRJU0VfQ1NNQSB8IEFEVkVSVElTRV9QQVVTRV9DQVApOworCWFzaXhfbWRpb193cml0ZShkZXYtPm5ldCwgZGV2LT5taWkucGh5X2lkLCBNSUlfQ1RSTDEwMDAsCisJCQlBRFZFUlRJU0VfMTAwMEZVTEwpOworCisJbWlpX253YXlfcmVzdGFydCgmZGV2LT5taWkpOworCisJaWYgKChyZXQgPSBhc2l4X3dyaXRlX21lZGl1bV9tb2RlKGRldiwgQVg4ODE3OF9NRURJVU1fREVGQVVMVCkpIDwgMCkKKwkJZ290byBvdXQyOworCisJaWYgKChyZXQgPSBhc2l4X3dyaXRlX3J4X2N0bChkZXYsIEFYX0RFRkFVTFRfUlhfQ1RMKSkgPCAwKQorCQlnb3RvIG91dDI7CisKKwlrZnJlZShidWYpOworCisJLyogQXNpeCBmcmFtaW5nIHBhY2tzIG11bHRpcGxlIGV0aCBmcmFtZXMgaW50byBhIDJLIHVzYiBidWxrIHRyYW5zZmVyICovCisJaWYgKGRldi0+ZHJpdmVyX2luZm8tPmZsYWdzICYgRkxBR19GUkFNSU5HX0FYKSB7CisJCS8qIGhhcmRfbXR1ICBpcyBzdGlsbCB0aGUgZGVmYXVsdCAtIHRoZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydAorCQkgICBqdW1ibyBldGggZnJhbWVzICovCisJCWRldi0+cnhfdXJiX3NpemUgPSAyMDQ4OworCX0KKworCXJldHVybiAwOworCitvdXQyOgorCWtmcmVlKGJ1Zik7CitvdXQxOgorCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJpdmVyX2luZm8gYXg4ODE3eF9pbmZvID0gewogCS5kZXNjcmlwdGlvbiA9ICJBU0lYIEFYODgxN3ggVVNCIDIuMCBFdGhlcm5ldCIsCiAJLmJpbmQgPSBheDg4MTcyX2JpbmQsCkBAIC04NTMsOCArMTM3MSwxOSBAQAogCS5saW5rX3Jlc2V0ID0gYXg4ODc3Ml9saW5rX3Jlc2V0LAogCS5yZXNldCA9IGF4ODg3NzJfbGlua19yZXNldCwKIAkuZmxhZ3MgPSBGTEFHX0VUSEVSIHwgRkxBR19GUkFNSU5HX0FYLAotCS5yeF9maXh1cCA9IGF4ODg3NzJfcnhfZml4dXAsCi0JLnR4X2ZpeHVwID0gYXg4ODc3Ml90eF9maXh1cCwKKwkucnhfZml4dXAgPSBhc2l4X3J4X2ZpeHVwLAorCS50eF9maXh1cCA9IGFzaXhfdHhfZml4dXAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl9pbmZvIGF4ODgxNzhfaW5mbyA9IHsKKwkuZGVzY3JpcHRpb24gPSAiQVNJWCBBWDg4MTc4IFVTQiAyLjAgRXRoZXJuZXQiLAorCS5iaW5kID0gYXg4ODE3OF9iaW5kLAorCS5zdGF0dXMgPSBhc2l4X3N0YXR1cywKKwkubGlua19yZXNldCA9IGF4ODgxNzhfbGlua19yZXNldCwKKwkucmVzZXQgPSBheDg4MTc4X2xpbmtfcmVzZXQsCisJLmZsYWdzID0gRkxBR19FVEhFUiB8IEZMQUdfRlJBTUlOR19BWCwKKwkucnhfZml4dXAgPSBhc2l4X3J4X2ZpeHVwLAorCS50eF9maXh1cCA9IGFzaXhfdHhfZml4dXAsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQJcHJvZHVjdHMgW10gPSB7CkBAIC05MTMsNyArMTQ0Miw3IEBACiB9LCB7CiAJLy8gQVNJWCBBWDg4MTc4IDEwLzEwMC8xMDAwCiAJVVNCX0RFVklDRSAoMHgwYjk1LCAweDE3ODApLAotCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYXg4ODc3Ml9pbmZvLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYXg4ODE3OF9pbmZvLAogfSwgewogCS8vIExpbmtzeXMgVVNCMjAwTSBSZXYgMgogCVVTQl9ERVZJQ0UgKDB4MTNiMSwgMHgwMDE4KSwKQEAgLTkyMiw2ICsxNDUxLDE0IEBACiAJLy8gMFEwIGNhYmxlIGV0aGVybmV0CiAJVVNCX0RFVklDRSAoMHgxNTU3LCAweDc3MjApLAogCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYXg4ODc3Ml9pbmZvLAorfSwgeworCS8vIERMaW5rIERVQi1FMTAwIEgvVyBWZXIgQjEKKwlVU0JfREVWSUNFICgweDA3ZDEsIDB4M2MwNSksCisJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZheDg4NzcyX2luZm8sCit9LCB7CisJLy8gTGlua3N5cyBVU0IxMDAwCisJVVNCX0RFVklDRSAoMHgxNzM3LCAweDAwMzkpLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYXg4ODE3OF9pbmZvLAogfSwKIAl7IH0sCQkvLyBFTkQKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9uZXQvbmV0MTA4MC5jIGIvZHJpdmVycy91c2IvbmV0L25ldDEwODAuYwppbmRleCBhOWI2ZWVhLi4zMDFiYWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9uZXQvbmV0MTA4MC5jCisrKyBiL2RyaXZlcnMvdXNiL25ldC9uZXQxMDgwLmMKQEAgLTQ5OCwyNSArNDk4LDI0IEBACiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgogbmV0MTA4MF90eF9maXh1cChzdHJ1Y3QgdXNibmV0ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsIGdmcF90IGZsYWdzKQogewotCWludAkJCXBhZGxlbjsKIAlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjI7CiAJc3RydWN0IG5jX2hlYWRlcgkqaGVhZGVyID0gTlVMTDsKIAlzdHJ1Y3QgbmNfdHJhaWxlcgkqdHJhaWxlciA9IE5VTEw7CisJaW50CQkJcGFkbGVuID0gc2l6ZW9mIChzdHJ1Y3QgbmNfdHJhaWxlcik7CiAJaW50CQkJbGVuID0gc2tiLT5sZW47CiAKLQlwYWRsZW4gPSAoKGxlbiArIHNpemVvZiAoc3RydWN0IG5jX2hlYWRlcikKLQkJCSsgc2l6ZW9mIChzdHJ1Y3QgbmNfdHJhaWxlcikpICYgMHgwMSkgPyAwIDogMTsKKwlpZiAoISgobGVuICsgcGFkbGVuICsgc2l6ZW9mIChzdHJ1Y3QgbmNfaGVhZGVyKSkgJiAweDAxKSkKKwkJcGFkbGVuKys7CiAJaWYgKCFza2JfY2xvbmVkKHNrYikpIHsKIAkJaW50CWhlYWRyb29tID0gc2tiX2hlYWRyb29tKHNrYik7CiAJCWludAl0YWlscm9vbSA9IHNrYl90YWlscm9vbShza2IpOwogCi0JCWlmICgocGFkbGVuICsgc2l6ZW9mIChzdHJ1Y3QgbmNfdHJhaWxlcikpIDw9IHRhaWxyb29tCi0JCQkgICAgJiYgc2l6ZW9mIChzdHJ1Y3QgbmNfaGVhZGVyKSA8PSBoZWFkcm9vbSkKKwkJaWYgKHBhZGxlbiA8PSB0YWlscm9vbSAmJgorCQkgICAgc2l6ZW9mKHN0cnVjdCBuY19oZWFkZXIpIDw9IGhlYWRyb29tKQogCQkJLyogVGhlcmUncyBlbm91Z2ggaGVhZCBhbmQgdGFpbCByb29tICovCiAJCQlnb3RvIGVuY2Fwc3VsYXRlOwogCi0JCWlmICgoc2l6ZW9mIChzdHJ1Y3QgbmNfaGVhZGVyKSArIHBhZGxlbgotCQkJCQkrIHNpemVvZiAoc3RydWN0IG5jX3RyYWlsZXIpKSA8CisJCWlmICgoc2l6ZW9mIChzdHJ1Y3QgbmNfaGVhZGVyKSArIHBhZGxlbikgPAogCQkJCShoZWFkcm9vbSArIHRhaWxyb29tKSkgewogCQkJLyogVGhlcmUncyBlbm91Z2ggdG90YWwgcm9vbSwgc28ganVzdCByZWFkanVzdCAqLwogCQkJc2tiLT5kYXRhID0gbWVtbW92ZShza2ItPmhlYWQKQEAgLTUzMCw3ICs1MjksNyBAQAogCS8qIENyZWF0ZSBhIG5ldyBza2IgdG8gdXNlIHdpdGggdGhlIGNvcnJlY3Qgc2l6ZSAqLwogCXNrYjIgPSBza2JfY29weV9leHBhbmQoc2tiLAogCQkJCXNpemVvZiAoc3RydWN0IG5jX2hlYWRlciksCi0JCQkJc2l6ZW9mIChzdHJ1Y3QgbmNfdHJhaWxlcikgKyBwYWRsZW4sCisJCQkJcGFkbGVuLAogCQkJCWZsYWdzKTsKIAlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCWlmICghc2tiMikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmMgYi9kcml2ZXJzL3VzYi9uZXQvcGVnYXN1cy5jCmluZGV4IGFiMjFmOTYuLmI4ZTI1YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC9wZWdhc3VzLmMKKysrIGIvZHJpdmVycy91c2IvbmV0L3BlZ2FzdXMuYwpAQCAtNjE5LDcgKzYxOSw3IEBACiAJc3dpdGNoICh1cmItPnN0YXR1cykgewogCWNhc2UgMDoKIAkJYnJlYWs7Ci0JY2FzZSAtRVRJTUVET1VUOgorCWNhc2UgLUVUSU1FOgogCQlpZiAobmV0aWZfbXNnX3J4X2VycihwZWdhc3VzKSkKIAkJCXByX2RlYnVnKCIlczogcmVzZXQgTUFDXG4iLCBuZXQtPm5hbWUpOwogCQlwZWdhc3VzLT5mbGFncyAmPSB+UEVHQVNVU19SWF9CVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3J0bDgxNTAuYyBiL2RyaXZlcnMvdXNiL25ldC9ydGw4MTUwLmMKaW5kZXggYTcyNjg1Yi4uMjM2NGMyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbmV0L3J0bDgxNTAuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvcnRsODE1MC5jCkBAIC00MzgsNyArNDM4LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSAtRU5PRU5UOgogCQlyZXR1cm47CS8qIHRoZSB1cmIgaXMgaW4gdW5saW5rIHN0YXRlICovCi0JY2FzZSAtRVRJTUVET1VUOgorCWNhc2UgLUVUSU1FOgogCQl3YXJuKCJtYXkgYmUgcmVzZXQgaXMgbmVlZGVkPy4uIik7CiAJCWdvdG8gZ29vbjsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jIGIvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5jCmluZGV4IDU0MTgzZTEuLjk4YTUyMmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuYworKysgYi9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmMKQEAgLTYxLDggKzYxLDExIEBACiAgKiBsZXQgdGhlIFVTQiBob3N0IGNvbnRyb2xsZXIgYmUgYnVzeSBmb3IgNW1zZWMgb3IgbW9yZSBiZWZvcmUgYW4gaXJxCiAgKiBpcyByZXF1aXJlZCwgdW5kZXIgbG9hZC4gIEp1bWJvZ3JhbXMgY2hhbmdlIHRoZSBlcXVhdGlvbi4KICAqLwotI2RlZmluZQlSWF9RTEVOKGRldikgKCgoZGV2KS0+dWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpID8gNjAgOiA0KQotI2RlZmluZQlUWF9RTEVOKGRldikgKCgoZGV2KS0+dWRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpID8gNjAgOiA0KQorI2RlZmluZSBSWF9NQVhfUVVFVUVfTUVNT1JZICg2MCAqIDE1MTgpCisjZGVmaW5lCVJYX1FMRU4oZGV2KSAoKChkZXYpLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgPyBcCisJCQkoUlhfTUFYX1FVRVVFX01FTU9SWS8oZGV2KS0+cnhfdXJiX3NpemUpIDogNCkKKyNkZWZpbmUJVFhfUUxFTihkZXYpICgoKGRldiktPnVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKSA/IFwKKwkJCShSWF9NQVhfUVVFVUVfTUVNT1JZLyhkZXYpLT5oYXJkX210dSkgOiA0KQogCiAvLyByZWF3YWtlbiBuZXR3b3JrIHF1ZXVlIHRoaXMgc29vbiBhZnRlciBzdG9wcGluZzsgZWxzZSB3YXRjaGRvZyBiYXJrcwogI2RlZmluZSBUWF9USU1FT1VUX0pJRkZJRVMJKDUqSFopCkBAIC0yMjcsMTMgKzIzMCwyMyBAQAogewogCXN0cnVjdCB1c2JuZXQJKmRldiA9IG5ldGRldl9wcml2KG5ldCk7CiAJaW50CQlsbF9tdHUgPSBuZXdfbXR1ICsgbmV0LT5oYXJkX2hlYWRlcl9sZW47CisJaW50CQlvbGRfaGFyZF9tdHUgPSBkZXYtPmhhcmRfbXR1OworCWludAkJb2xkX3J4X3VyYl9zaXplID0gZGV2LT5yeF91cmJfc2l6ZTsKIAotCWlmIChuZXdfbXR1IDw9IDAgfHwgbGxfbXR1ID4gZGV2LT5oYXJkX210dSkKKwlpZiAobmV3X210dSA8PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAkvLyBubyBzZWNvbmQgemVyby1sZW5ndGggcGFja2V0IHJlYWQgd2FudGVkIGFmdGVyIG10dS1zaXplZCBwYWNrZXRzCiAJaWYgKChsbF9tdHUgJSBkZXYtPm1heHBhY2tldCkgPT0gMCkKIAkJcmV0dXJuIC1FRE9NOwogCW5ldC0+bXR1ID0gbmV3X210dTsKKworCWRldi0+aGFyZF9tdHUgPSBuZXQtPm10dSArIG5ldC0+aGFyZF9oZWFkZXJfbGVuOworCWlmIChkZXYtPnJ4X3VyYl9zaXplID09IG9sZF9oYXJkX210dSkgeworCQlkZXYtPnJ4X3VyYl9zaXplID0gZGV2LT5oYXJkX210dTsKKwkJaWYgKGRldi0+cnhfdXJiX3NpemUgPiBvbGRfcnhfdXJiX3NpemUpCisJCQl1c2JuZXRfdW5saW5rX3J4X3VyYnMoZGV2KTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDEyLDkgKzQyNSw5IEBACiAJICAgIC8vIHdlIGdldCBjb250cm9sbGVyIGkvbyBmYXVsdHMgZHVyaW5nIGtodWJkIGRpc2Nvbm5lY3QoKSBkZWxheXMuCiAJICAgIC8vIHRocm90dGxlIGRvd24gcmVzdWJtaXRzLCB0byBhdm9pZCBsb2cgZmxvb2RzOyBqdXN0IHRlbXBvcmFyaWx5LAogCSAgICAvLyBzbyB3ZSBzdGlsbCByZWNvdmVyIHdoZW4gdGhlIGZhdWx0IGlzbid0IGEga2h1YmQgZGVsYXkuCi0JICAgIGNhc2UgLUVQUk9UTzoJCS8vIGVoY2kKLQkgICAgY2FzZSAtRVRJTUVET1VUOgkJLy8gb2hjaQotCSAgICBjYXNlIC1FSUxTRVE6CQkvLyB1aGNpCisJICAgIGNhc2UgLUVQUk9UTzoKKwkgICAgY2FzZSAtRVRJTUU6CisJICAgIGNhc2UgLUVJTFNFUToKIAkJZGV2LT5zdGF0cy5yeF9lcnJvcnMrKzsKIAkJaWYgKCF0aW1lcl9wZW5kaW5nICgmZGV2LT5kZWxheSkpIHsKIAkJCW1vZF90aW1lciAoJmRldi0+ZGVsYXksIGppZmZpZXMgKyBUSFJPVFRMRV9KSUZGSUVTKTsKQEAgLTUyMSw2ICs1MzQsMTcgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKKy8vIEZsdXNoIGFsbCBwZW5kaW5nIHJ4IHVyYnMKKy8vIG1pbmlkcml2ZXJzIG1heSBuZWVkIHRvIGRvIHRoaXMgd2hlbiB0aGUgTVRVIGNoYW5nZXMKKwordm9pZCB1c2JuZXRfdW5saW5rX3J4X3VyYnMoc3RydWN0IHVzYm5ldCAqZGV2KQoreworCWlmIChuZXRpZl9ydW5uaW5nKGRldi0+bmV0KSkgeworCQkodm9pZCkgdW5saW5rX3VyYnMgKGRldiwgJmRldi0+cnhxKTsKKwkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT5iaCk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwodXNibmV0X3VubGlua19yeF91cmJzKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIApAQCAtNjI5LDcgKzY1Myw3IEBACiAKIAkJZGV2aW5mbyAoZGV2LCAib3BlbjogZW5hYmxlIHF1ZXVlaW5nICIKIAkJCQkiKHJ4ICVkLCB0eCAlZCkgbXR1ICVkICVzIGZyYW1pbmciLAotCQkJUlhfUUxFTiAoZGV2KSwgVFhfUUxFTiAoZGV2KSwgZGV2LT5uZXQtPm10dSwKKwkJCShpbnQpUlhfUUxFTiAoZGV2KSwgKGludClUWF9RTEVOIChkZXYpLCBkZXYtPm5ldC0+bXR1LAogCQkJZnJhbWluZyk7CiAJfQogCkBAIC03OTcsOSArODIxLDkgQEAKIAogCQkvLyBsaWtlIHJ4LCB0eCBnZXRzIGNvbnRyb2xsZXIgaS9vIGZhdWx0cyBkdXJpbmcga2h1YmQgZGVsYXlzCiAJCS8vIGFuZCBzbyBpdCB1c2VzIHRoZSBzYW1lIHRocm90dGxpbmcgbWVjaGFuaXNtLgotCQljYXNlIC1FUFJPVE86CQkvLyBlaGNpCi0JCWNhc2UgLUVUSU1FRE9VVDoJLy8gb2hjaQotCQljYXNlIC1FSUxTRVE6CQkvLyB1aGNpCisJCWNhc2UgLUVQUk9UTzoKKwkJY2FzZSAtRVRJTUU6CisJCWNhc2UgLUVJTFNFUToKIAkJCWlmICghdGltZXJfcGVuZGluZyAoJmRldi0+ZGVsYXkpKSB7CiAJCQkJbW9kX3RpbWVyICgmZGV2LT5kZWxheSwKIAkJCQkJamlmZmllcyArIFRIUk9UVExFX0pJRkZJRVMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5oIGIvZHJpdmVycy91c2IvbmV0L3VzYm5ldC5oCmluZGV4IDg5ZmM0OTUuLmMwNzQ2ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL25ldC91c2JuZXQuaAorKysgYi9kcml2ZXJzL3VzYi9uZXQvdXNibmV0LmgKQEAgLTE2Niw2ICsxNjYsNyBAQAogZXh0ZXJuIGludCB1c2JuZXRfZ2V0X2VuZHBvaW50cyhzdHJ1Y3QgdXNibmV0ICosIHN0cnVjdCB1c2JfaW50ZXJmYWNlICopOwogZXh0ZXJuIHZvaWQgdXNibmV0X2RlZmVyX2tldmVudCAoc3RydWN0IHVzYm5ldCAqLCBpbnQpOwogZXh0ZXJuIHZvaWQgdXNibmV0X3NrYl9yZXR1cm4gKHN0cnVjdCB1c2JuZXQgKiwgc3RydWN0IHNrX2J1ZmYgKik7CitleHRlcm4gdm9pZCB1c2JuZXRfdW5saW5rX3J4X3VyYnMoc3RydWN0IHVzYm5ldCAqKTsKIAogZXh0ZXJuIHUzMiB1c2JuZXRfZ2V0X21zZ2xldmVsIChzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIGV4dGVybiB2b2lkIHVzYm5ldF9zZXRfbXNnbGV2ZWwgKHN0cnVjdCBuZXRfZGV2aWNlICosIHUzMik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnCmluZGV4IGY1Yjk0MzguLjUwNzZiOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9LY29uZmlnCkBAIC01Myw2ICs1MywxNSBAQAogCSAgc3VwcG9ydCIgYmUgY29tcGlsZWQgYXMgYSBtb2R1bGUgZm9yIHRoaXMgZHJpdmVyIHRvIGJlIHVzZWQKIAkgIHByb3Blcmx5LgogCitjb25maWcgVVNCX1NFUklBTF9BSVJDQUJMRQorCXRyaXN0YXRlICJBSVJjYWJsZSBVU0IgQmx1ZXRvb3RoIERvbmdsZSBEcml2ZXIgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBVU0JfU0VSSUFMICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgICAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgQUlSY2FibGUgVVNCIEJsdWV0b290IERvbmdsZS4KKworCSAgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICAgIHdpbGwgYmUgY2FsbGVkIGFpcmNhYmxlLgorCiBjb25maWcgVVNCX1NFUklBTF9BSVJQUklNRQogCXRyaXN0YXRlICJVU0IgQWlyUHJpbWUgQ0RNQSBXaXJlbGVzcyBEcml2ZXIiCiAJZGVwZW5kcyBvbiBVU0JfU0VSSUFMCkBAIC00MTMsNiArNDIyLDIxIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtY3RfdTIzMi4KIAorY29uZmlnIFVTQl9TRVJJQUxfTU9TNzg0MAorCXRyaXN0YXRlICJVU0IgTW9zY2hpcCA3ODQwLzc4MjAgVVNCIFNlcmlhbCBEcml2ZXIiCisJZGVwZW5kcyBvbiBVU0JfU0VSSUFMCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgYSBNQ1M3ODQwIFF1YWQtU2VyaWFsIG9yIE1DUzc4MjAKKwkgIER1YWwtU2VyaWFsIHBvcnQgZGV2aWNlIGZyb20gTW9zQ2hpcCBTZW1pY29uZHVjdG9yLgorCisJICBUaGUgTUNTNzg0MCBhbmQgTUNTNzgyMCBoYXZlIGJlZW4gZGV2ZWxvcGVkIHRvIGNvbm5lY3QgYSB3aWRlIHJhbmdlCisJICBvZiBzdGFuZGFyZCBzZXJpYWwgZGV2aWNlcyB0byBhIFVTQiBob3N0LiAgVGhlIE1DUzc4NDAgaGFzIGEgVVNCCisJICBkZXZpY2UgY29udHJvbGxlciBjb25uZWN0ZWQgdG8gZm91ciAoNCkgaW5kaXZpZHVhbCBVQVJUcyB3aGlsZSB0aGUKKwkgIE1DUzc4MjAgY29udHJvbGxlciBjb25uZWN0cyB0byB0d28gKDIpIGluZGl2aWR1YWwgVUFSVHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG1vczc4NDAuICBJZiB1bnN1cmUsIGNob29zZSBOLgorCiBjb25maWcgVVNCX1NFUklBTF9OQVZNQU4KIAl0cmlzdGF0ZSAiVVNCIE5hdm1hbiBHUFMgZGV2aWNlIgogCWRlcGVuZHMgb24gVVNCX1NFUklBTApAQCAtNTI2LDUgKzU1MCw2IEBACiAJZGVwZW5kcyBvbiBVU0JfU0VSSUFMX0tFWVNQQU5fUERBIHx8IFVTQl9TRVJJQUxfWElSQ09NIHx8IFVTQl9TRVJJQUxfS0VZU1BBTiB8fCBVU0JfU0VSSUFMX1dISVRFSEVBVAogCWRlZmF1bHQgeQogCisKIGVuZG1lbnUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy91c2Ivc2VyaWFsL01ha2VmaWxlCmluZGV4IDhlZmVkMmMuLjhkY2U4MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvTWFrZWZpbGUKQEAgLTExLDYgKzExLDcgQEAKIAogdXNic2VyaWFsLW9ianMJOj0gdXNiLXNlcmlhbC5vIGdlbmVyaWMubyBidXMubyAkKHVzYnNlcmlhbC1vYmoteSkKIAorb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfQUlSQ0FCTEUpCQkrPSBhaXJjYWJsZS5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9BSVJQUklNRSkJCSs9IGFpcnByaW1lLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX0FSSzMxMTYpCQkrPSBhcmszMTE2Lm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX0JFTEtJTikJCQkrPSBiZWxraW5fc2EubwpAQCAtMzMsNiArMzQsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfS0xTSSkJCQkrPSBrbDVrdXNiMTA1Lm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX0tPQklMX1NDVCkJCSs9IGtvYmlsX3NjdC5vCiBvYmotJChDT05GSUdfVVNCX1NFUklBTF9NQ1RfVTIzMikJCSs9IG1jdF91MjMyLm8KK29iai0kKENPTkZJR19VU0JfU0VSSUFMX01PUzc4NDApCQkrPSBtb3M3ODQwLm8KIG9iai0kKENPTkZJR19VU0JfU0VSSUFMX05BVk1BTikJCQkrPSBuYXZtYW4ubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfT01OSU5FVCkJCSs9IG9tbmluZXQubwogb2JqLSQoQ09ORklHX1VTQl9TRVJJQUxfT1BUSU9OKQkJCSs9IG9wdGlvbi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9haXJjYWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjY2Q5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvYWlyY2FibGUuYwpAQCAtMCwwICsxLDYyNSBAQAorLyoKKyAqIEFJUmNhYmxlIFVTQiBCbHVldG9vdGggRG9uZ2xlIERyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTWFudWVsIEZyYW5jaXNjbyBOYXJhbmpvIChuYXJhbmpvLm1hbnVlbEBnbWFpbC5jb20pCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoZSBkZXZpY2Ugd29ya3MgYXMgYW4gc3RhbmRhcmQgQ0RDIGRldmljZSwgaXQgaGFzIDIgaW50ZXJmYWNlcywgdGhlIGZpcnN0CisgKiBvbmUgaXMgZm9yIGZpcm13YXJlIGFjY2VzcyBhbmQgdGhlIHNlY29uZCBpcyB0aGUgc2VyaWFsIG9uZS4KKyAqIFRoZSBwcm90b2NvbCBpcyB2ZXJ5IHNpbXBseSwgdGhlcmUgYXJlIHR3byBwb3NpYmlsaXRpZXMgcmVhZGluZyBvciB3cml0aW5nLgorICogV2hlbiB3cml0dGluZyB0aGUgZmlyc3QgdXJiIG11c3QgaGF2ZSBhIEhlYWRlciB0aGF0IHN0YXJ0cyB3aXRoIDB4MjAgMHgyOSB0aGUKKyAqIG5leHQgdHdvIGJ5dGVzIG11c3Qgc2F5IGhvdyBtdWNoIGRhdGEgd2lsbCBiZSBzZW5kZWQuCisgKiBXaGVuIHJlYWRpbmcgdGhlIHByb2Nlc3MgaXMgYWxtb3N0IGVxdWFsIGV4Y2VwdCB0aGF0IHRoZSBoZWFkZXIgc3RhcnRzIHdpdGgKKyAqIDB4MDAgMHgyMC4KKyAqCisgKiBUaGUgZGV2aWNlIHNpbXBseSBuZWVkIHNvbWUgc3R1ZmYgdG8gdW5kZXJzdGFuZCBkYXRhIGNvbW1pbmcgZnJvbSB0aGUgdXNiCisgKiBidWZmZXI6IFRoZSBGaXJzdCBhbmQgU2Vjb25kIGJ5dGUgaXMgdXNlZCBmb3IgYSBIZWFkZXIsIHRoZSBUaGlyZCBhbmQgRm91cnRoCisgKiB0ZWxscyB0aGUgIGRldmljZSB0aGUgYW1vdW50IG9mIGluZm9ybWF0aW9uIHRoZSBwYWNrYWdlIGhvbGRzLgorICogUGFja2FnZXMgYXJlIDYwIGJ5dGVzIGxvbmcgSGVhZGVyIFN0dWZmLgorICogV2hlbiB3cml0dGluZyB0byB0aGUgZGV2aWNlIHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgdGhlIGhlYWRlciBhcmUgMHgyMCAweDI5CisgKiBXaGVuIHJlYWRpbmcgdGhlIGJ5dGVzIGFyZSAweDAwIDB4MjAsIG9yIDB4MDAgMHgxMCwgdGhlcmUgaXMgYW4gc3RyYW5nZQorICogc2l0dWF0aW9uLCB3aGVuIHRvbyBtdWNoIGRhdGEgYXJyaXZlcyB0byB0aGUgZGV2aWNlIGJlY2F1c2UgaXQgc2VuZHMgdGhlIGRhdGEKKyAqIGJ1dCB3aXRoIG91dCB0aGUgaGVhZGVyLiBJIHdpbGwgdXNlIGEgc2ltcGx5IGhhY2sgdG8gb3ZlcnJpZGUgdGhpcyBzaXR1YXRpb24sCisgKiBpZiB0aGVyZSBpcyBkYXRhIGNvbWluZyB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYW55IGhlYWRlciwgdGhlbiB0aGF0IGlzIGRhdGEKKyAqIHRoYXQgbXVzdCBnbyBkaXJlY3RseSB0byB0aGUgdHR5LCBhcyB0aGVyZSBpcyBubyBkb2N1bWVudGF0aW9uIGFib3V0IGlmIHRoZXJlCisgKiBpcyBhbnkgb3RoZXIgY29udHJvbCBjb2RlLCBJIHdpbGwgc2ltcGx5IGNoZWNrIGZvciB0aGUgZmlyc3QKKyAqIG9uZS4KKyAqCisgKiBUaGUgZHJpdmVyIHJlZ2lzdGVycyBoaW1zZWxmIHdpdGggdGhlIFVTQi1zZXJpYWwgY29yZSBhbmQgdGhlIFVTQiBDb3JlLiBJIGhhZAorICogdG8gaW1wbGVtZW50IGEgcHJvYmUgZnVuY3Rpb24gYWdhaW5zIFVTQi1zZXJpYWwsIGJlY2F1c2Ugb3RoZXIgd2F5LCB0aGUKKyAqIGRyaXZlciB3YXMgYXR0YWNoaW5nIGhpbXNlbGYgdG8gYm90aCBpbnRlcmZhY2VzLiBJIGhhdmUgdHJ5ZWQgd2l0aCBkaWZmZXJlbnQKKyAqIGNvbmZpZ3VyYXRpb25zIG9mIHVzYl9zZXJpYWxfZHJpdmVyIHdpdGggb3V0IGV4aXQsIG9ubHkgdGhlIHByb2JlIGZ1bmN0aW9uCisgKiBjb3VsZCBoYW5kbGUgdGhpcyBjb3JyZWN0bHkuCisgKgorICogSSBoYXZlIHRha2VuIHNvbWUgaW5mbyBmcm9tIGEgR3JlZyBLcm9haC1IYXJ0bWFuIGFydGljbGU6CisgKiBodHRwOi8vd3d3LmxpbnV4am91cm5hbC5jb20vYXJ0aWNsZS82NTczCisgKiBBbmQgZnJvbSBMaW51eCBEZXZpY2UgRHJpdmVyIEtpdCBDRCwgd2hpY2ggaXMgYSBncmVhdCB3b3JrLCB0aGUgYXV0aG9ycyB0YWtlbgorICogdGhlIHdvcmsgdG8gcmVjb21waWxlIGxvdHMgb2YgaW5mb3JtYXRpb24gYW4ga25vd2xhZGdlIGluIGRyaXZlcnMgZGV2ZWxvcG1lbnQKKyAqIGFuZCBtYWRlIGl0IGFsbCBhdmFpYmxlIGluc2lkZSBhIGNkLgorICogVVJMOiBodHRwOi8va2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL3Blb3BsZS9ncmVna2gvZGRrLworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9zZXJpYWwuaD4KKworc3RhdGljIGludCBkZWJ1ZzsKKworLyogVmVuZG9yIGFuZCBQcm9kdWN0IElEICovCisjZGVmaW5lIEFJUkNBQkxFX1ZJRAkJMHgxNkNBCisjZGVmaW5lIEFJUkNBQkxFX1VTQl9QSUQJMHgxNTAyCisKKy8qIHdyaXRlIGJ1ZmZlciBzaXplIGRlZmluZXMgKi8KKyNkZWZpbmUgQUlSQ0FCTEVfQlVGX1NJWkUJMjA0OAorCisvKiBQcm90b2NvbCBTdHVmZiAqLworI2RlZmluZSBIQ0lfSEVBREVSX0xFTkdUSAkweDQKKyNkZWZpbmUgVFhfSEVBREVSXzAJCTB4MjAKKyNkZWZpbmUgVFhfSEVBREVSXzEJCTB4MjkKKyNkZWZpbmUgUlhfSEVBREVSXzAJCTB4MDAKKyNkZWZpbmUgUlhfSEVBREVSXzEJCTB4MjAKKyNkZWZpbmUgTUFYX0hDSV9GUkFNRVNJWkUJNjAKKyNkZWZpbmUgSENJX0NPTVBMRVRFX0ZSQU1FCTY0CisKKy8qIHJ4X2ZsYWdzICovCisjZGVmaW5lIFRIUk9UVExFRAkJMHgwMQorI2RlZmluZSBBQ1RVQUxMWV9USFJPVFRMRUQJMHgwMgorCisvKgorICogVmVyc2lvbiBJbmZvcm1hdGlvbgorICovCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2MS4wYjIiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgIk5hcmFuam8sIE1hbnVlbCBGcmFuY2lzY28gPG5hcmFuam8ubWFudWVsQGdtYWlsLmNvbT4iCisjZGVmaW5lIERSSVZFUl9ERVNDICJBSVJjYWJsZSBVU0IgRHJpdmVyIgorCisvKiBJRCB0YWJsZSB0aGF0IHdpbGwgYmUgcmVnaXN0ZXJlZCB3aXRoIFVTQiBjb3JlICovCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGUgW10gPSB7CisJeyBVU0JfREVWSUNFKEFJUkNBQkxFX1ZJRCwgQUlSQ0FCTEVfVVNCX1BJRCkgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKKworCisvKiBJbnRlcm5hbCBTdHJ1Y3R1cmUgKi8KK3N0cnVjdCBhaXJjYWJsZV9wcml2YXRlIHsKKwlzcGlubG9ja190IHJ4X2xvY2s7CQkvKiBzcGlubG9jayBmb3IgdGhlIHJlY2VpdmUgbGluZXMgKi8KKwlzdHJ1Y3QgY2lyY19idWYgKnR4X2J1ZjsJLyogd3JpdGUgYnVmZmVyICovCisJc3RydWN0IGNpcmNfYnVmICpyeF9idWY7CS8qIHJlYWQgYnVmZmVyICovCisJaW50IHJ4X2ZsYWdzOwkJCS8qIGZvciB0aHJvdHRpbG5nICovCisJc3RydWN0IHdvcmtfc3RydWN0IHJ4X3dvcms7CS8qIHdvcmsgY3VlIGZvciB0aGUgcmVjZWl2aW5nIGxpbmUgKi8KK307CisKKy8qIFByaXZhdGUgbWV0aG9kcyAqLworCisvKiBDaXJjdWxhciBCdWZmZXIgTWV0aG9kcywgY29kZSBmcm9tIHRpX3VzYl8zNDEwXzUwNTIgdXNlZCAqLworLyoKKyAqIHNlcmlhbF9idWZfY2xlYXIKKyAqCisgKiBDbGVhciBvdXQgYWxsIGRhdGEgaW4gdGhlIGNpcmN1bGFyIGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgc2VyaWFsX2J1Zl9jbGVhcihzdHJ1Y3QgY2lyY19idWYgKmNiKQoreworCWNiLT5oZWFkID0gY2ItPnRhaWwgPSAwOworfQorCisvKgorICogc2VyaWFsX2J1Zl9hbGxvYworICoKKyAqIEFsbG9jYXRlIGEgY2lyY3VsYXIgYnVmZmVyIGFuZCBhbGwgYXNzb2NpYXRlZCBtZW1vcnkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2lyY19idWYgKnNlcmlhbF9idWZfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgY2lyY19idWYgKmNiOworCWNiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNpcmNfYnVmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNiID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWNiLT5idWYgPSBrbWFsbG9jKEFJUkNBQkxFX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2ItPmJ1ZiA9PSBOVUxMKSB7CisJCWtmcmVlKGNiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNlcmlhbF9idWZfY2xlYXIoY2IpOworCXJldHVybiBjYjsKK30KKworLyoKKyAqIHNlcmlhbF9idWZfZnJlZQorICoKKyAqIEZyZWUgdGhlIGJ1ZmZlciBhbmQgYWxsIGFzc29jaWF0ZWQgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCBzZXJpYWxfYnVmX2ZyZWUoc3RydWN0IGNpcmNfYnVmICpjYikKK3sKKwlrZnJlZShjYi0+YnVmKTsKKwlrZnJlZShjYik7Cit9CisKKy8qCisgKiBzZXJpYWxfYnVmX2RhdGFfYXZhaWwKKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIGF2YWlsYWJsZSBpbiB0aGUgY2lyY3VsYXIKKyAqIGJ1ZmZlci4KKyAqLworc3RhdGljIGludCBzZXJpYWxfYnVmX2RhdGFfYXZhaWwoc3RydWN0IGNpcmNfYnVmICpjYikKK3sKKwlyZXR1cm4gQ0lSQ19DTlQoY2ItPmhlYWQsY2ItPnRhaWwsQUlSQ0FCTEVfQlVGX1NJWkUpOworfQorCisvKgorICogc2VyaWFsX2J1Zl9wdXQKKyAqCisgKiBDb3B5IGRhdGEgZGF0YSBmcm9tIGEgdXNlciBidWZmZXIgYW5kIHB1dCBpdCBpbnRvIHRoZSBjaXJjdWxhciBidWZmZXIuCisgKiBSZXN0cmljdCB0byB0aGUgYW1vdW50IG9mIHNwYWNlIGF2YWlsYWJsZS4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCisgKi8KK3N0YXRpYyBpbnQgc2VyaWFsX2J1Zl9wdXQoc3RydWN0IGNpcmNfYnVmICpjYiwgY29uc3QgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50IGMsIHJldCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJYyA9IENJUkNfU1BBQ0VfVE9fRU5EKGNiLT5oZWFkLCBjYi0+dGFpbCwgQUlSQ0FCTEVfQlVGX1NJWkUpOworCQlpZiAoY291bnQgPCBjKQorCQkJYyA9IGNvdW50OworCQlpZiAoYyA8PSAwKQorCQkJYnJlYWs7CisJCW1lbWNweShjYi0+YnVmICsgY2ItPmhlYWQsIGJ1ZiwgYyk7CisJCWNiLT5oZWFkID0gKGNiLT5oZWFkICsgYykgJiAoQUlSQ0FCTEVfQlVGX1NJWkUtMSk7CisJCWJ1ZiArPSBjOworCQljb3VudCAtPSBjOworCQlyZXQ9IGM7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBzZXJpYWxfYnVmX2dldAorICoKKyAqIEdldCBkYXRhIGZyb20gdGhlIGNpcmN1bGFyIGJ1ZmZlciBhbmQgY29weSB0byB0aGUgZ2l2ZW4gYnVmZmVyLgorICogUmVzdHJpY3QgdG8gdGhlIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZS4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCisgKi8KK3N0YXRpYyBpbnQgc2VyaWFsX2J1Zl9nZXQoc3RydWN0IGNpcmNfYnVmICpjYiwgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50IGMsIHJldCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJYyA9IENJUkNfQ05UX1RPX0VORChjYi0+aGVhZCwgY2ItPnRhaWwsIEFJUkNBQkxFX0JVRl9TSVpFKTsKKwkJaWYgKGNvdW50IDwgYykKKwkJCWMgPSBjb3VudDsKKwkJaWYgKGMgPD0gMCkKKwkJCWJyZWFrOworCQltZW1jcHkoYnVmLCBjYi0+YnVmICsgY2ItPnRhaWwsIGMpOworCQljYi0+dGFpbCA9IChjYi0+dGFpbCArIGMpICYgKEFJUkNBQkxFX0JVRl9TSVpFLTEpOworCQlidWYgKz0gYzsKKwkJY291bnQgLT0gYzsKKwkJcmV0PSBjOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBFbmQgb2YgY2lyY3VsYSBidWZmZXIgbWV0aG9kcyAqLworCitzdGF0aWMgdm9pZCBhaXJjYWJsZV9zZW5kKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJaW50IGNvdW50LCByZXN1bHQ7CisJc3RydWN0IGFpcmNhYmxlX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJdW5zaWduZWQgY2hhciogYnVmOworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCWlmIChwb3J0LT53cml0ZV91cmJfYnVzeSkKKwkJcmV0dXJuOworCisJY291bnQgPSBtaW4oc2VyaWFsX2J1Zl9kYXRhX2F2YWlsKHByaXYtPnR4X2J1ZiksIE1BWF9IQ0lfRlJBTUVTSVpFKTsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuOworCisJYnVmID0ga3phbGxvYyhjb3VudCArIEhDSV9IRUFERVJfTEVOR1RILCBHRlBfQVRPTUlDKTsKKwlpZiAoIWJ1ZikgeworCQllcnIoIiVzLSBremFsbG9jKCVkKSBmYWlsZWQuIiwgX19GVU5DVElPTl9fLAorCQkgICAgY291bnQgKyBIQ0lfSEVBREVSX0xFTkdUSCk7CisJCXJldHVybjsKKwl9CisKKwlidWZbMF0gPSBUWF9IRUFERVJfMDsKKwlidWZbMV0gPSBUWF9IRUFERVJfMTsKKwlidWZbMl0gPSAodW5zaWduZWQgY2hhciljb3VudDsKKwlidWZbM10gPSAodW5zaWduZWQgY2hhcikoY291bnQgPj4gOCk7CisJc2VyaWFsX2J1Zl9nZXQocHJpdi0+dHhfYnVmLGJ1ZiArIEhDSV9IRUFERVJfTEVOR1RILCBNQVhfSENJX0ZSQU1FU0laRSk7CisKKwltZW1jcHkocG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIsIGJ1ZiwKKwkgICAgICAgY291bnQgKyBIQ0lfSEVBREVSX0xFTkdUSCk7CisKKwlrZnJlZShidWYpOworCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMTsKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIGNvdW50ICsgSENJX0hFQURFUl9MRU5HVEgsCisJCQkgICAgICBwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gY291bnQgKyBIQ0lfSEVBREVSX0xFTkdUSDsKKwlwb3J0LT53cml0ZV91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OworCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CisKKwlpZiAocmVzdWx0KSB7CisJCWRldl9lcnIoJnBvcnQtPmRldiwKKwkJCSIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKKwl9CisKKwlzY2hlZHVsZV93b3JrKCZwb3J0LT53b3JrKTsKK30KKworc3RhdGljIHZvaWQgYWlyY2FibGVfcmVhZCh2b2lkICpwYXJhbXMpCit7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHBhcmFtczsKKwlzdHJ1Y3QgYWlyY2FibGVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJaW50IGNvdW50OworCWlmIChwcml2LT5yeF9mbGFncyAmIFRIUk9UVExFRCl7CisJCWlmIChwcml2LT5yeF9mbGFncyAmIEFDVFVBTExZX1RIUk9UVExFRCkKKwkJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJ4X3dvcmspOworCQlyZXR1cm47CisJfQorCisJLyogQnkgbm93IEkgd2lsbCBmbHVzaCBkYXRhIHRvIHRoZSB0dHkgaW4gcGFja2FnZXMgb2Ygbm8gbW9yZSB0aGFuCisJICogNjQgYnl0ZXMsIHRvIGVuc3VyZSBJIGRvIG5vdCBnZXQgdGhyb3R0bGVkLgorCSAqIEFzayBVU0IgbWFpbGluZyBsaXN0IGZvciBiZXR0ZXIgYXByb2FjaC4KKwkgKi8KKwl0dHkgPSBwb3J0LT50dHk7CisKKwlpZiAoIXR0eSkKKwkJc2NoZWR1bGVfd29yaygmcHJpdi0+cnhfd29yayk7CisKKwljb3VudCA9IG1pbig2NCwgc2VyaWFsX2J1Zl9kYXRhX2F2YWlsKHByaXYtPnJ4X2J1ZikpOworCisJaWYgKGNvdW50IDw9IDApCisJCXJldHVybjsgLy9XZSBoYXZlIGZpbmlzaGVkIHNlbmRpbmcgZXZlcnl0aGluZy4KKworCXR0eV9wcmVwYXJlX2ZsaXBfc3RyaW5nKHR0eSwgJmRhdGEsIGNvdW50KTsKKwlpZiAoIWRhdGEpeworCQllcnIoIiVzLSBremFsbG9jKCVkKSBmYWlsZWQuIiwgX19GVU5DVElPTl9fLCBjb3VudCk7CisJCXJldHVybjsKKwl9CisKKwlzZXJpYWxfYnVmX2dldChwcml2LT5yeF9idWYsIGRhdGEsIGNvdW50KTsKKworCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CisKKwlpZiAoc2VyaWFsX2J1Zl9kYXRhX2F2YWlsKHByaXYtPnJ4X2J1ZikpCisJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJ4X3dvcmspOworCisJcmV0dXJuOworfQorLyogRW5kIG9mIHByaXZhdGUgbWV0aG9kcyAqLworCitzdGF0aWMgaW50IGFpcmNhYmxlX3Byb2JlKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsCisJCQkgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjID0gc2VyaWFsLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJaW50IG51bV9idWxrX291dD0wOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50czsgaSsrKSB7CisJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CisJCWlmICgoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgMHg4MCkgPT0gMHgwMCkgJiYKKwkJCSgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmIDMpID09IDB4MDIpKSB7CisJCQkvKiB3ZSBmb3VuZCBvdXIgYnVsayBvdXQgZW5kcG9pbnQgKi8KKwkJCWRiZygiZm91bmQgYnVsayBvdXQgb24gZW5kcG9pbnQgJWQiLCBpKTsKKwkJCSsrbnVtX2J1bGtfb3V0OworCQl9CisJfQorCisJaWYgKG51bV9idWxrX291dCA9PSAwKSB7CisJCWRiZygiSW52YWxpZCBpbnRlcmZhY2UsIGRpc2NhcmRpbmciKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWlyY2FibGVfYXR0YWNoIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQoreworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSBzZXJpYWwtPnBvcnRbMF07CisJc3RydWN0IGFpcmNhYmxlX3ByaXZhdGUgKnByaXY7CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFpcmNhYmxlX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpeworCQllcnIoIiVzLSBrbWFsbG9jKCVaZCkgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXywKKwkJCXNpemVvZihzdHJ1Y3QgYWlyY2FibGVfcHJpdmF0ZSkpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBBbGxvY2F0aW9uIG9mIENpcmN1bGFyIEJ1ZmZlcnMgKi8KKwlwcml2LT50eF9idWYgPSBzZXJpYWxfYnVmX2FsbG9jKCk7CisJaWYgKHByaXYtPnR4X2J1ZiA9PSBOVUxMKSB7CisJCWtmcmVlKHByaXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwcml2LT5yeF9idWYgPSBzZXJpYWxfYnVmX2FsbG9jKCk7CisJaWYgKHByaXYtPnJ4X2J1ZiA9PSBOVUxMKSB7CisJCWtmcmVlKHByaXYtPnR4X2J1Zik7CisJCWtmcmVlKHByaXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwcml2LT5yeF9mbGFncyAmPSB+KFRIUk9UVExFRCB8IEFDVFVBTExZX1RIUk9UVExFRCk7CisJSU5JVF9XT1JLKCZwcml2LT5yeF93b3JrLCBhaXJjYWJsZV9yZWFkLCBwb3J0KTsKKworCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0sIHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFpcmNhYmxlX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gc2VyaWFsLT5wb3J0WzBdOworCXN0cnVjdCBhaXJjYWJsZV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKwlpZiAocHJpdikgeworCQlzZXJpYWxfYnVmX2ZyZWUocHJpdi0+dHhfYnVmKTsKKwkJc2VyaWFsX2J1Zl9mcmVlKHByaXYtPnJ4X2J1Zik7CisJCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0LCBOVUxMKTsKKwkJa2ZyZWUocHJpdik7CisJfQorfQorCitzdGF0aWMgaW50IGFpcmNhYmxlX3dyaXRlX3Jvb20oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgYWlyY2FibGVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwlyZXR1cm4gc2VyaWFsX2J1Zl9kYXRhX2F2YWlsKHByaXYtPnR4X2J1Zik7Cit9CisKK3N0YXRpYyBpbnQgYWlyY2FibGVfd3JpdGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqc291cmNlLCBpbnQgY291bnQpCit7CisJc3RydWN0IGFpcmNhYmxlX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJaW50IHRlbXA7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCwgJWQgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwgY291bnQpOworCisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGNvdW50LCBzb3VyY2UpOworCisJaWYgKCFjb3VudCl7CisJCWRiZygiJXMgLSB3cml0ZSByZXF1ZXN0IG9mIDAgYnl0ZXMiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gY291bnQ7CisJfQorCisJdGVtcCA9IHNlcmlhbF9idWZfcHV0KHByaXYtPnR4X2J1Ziwgc291cmNlLCBjb3VudCk7CisKKwlhaXJjYWJsZV9zZW5kKHBvcnQpOworCisJaWYgKGNvdW50ID4gQUlSQ0FCTEVfQlVGX1NJWkUpCisJCWNvdW50ID0gQUlSQ0FCTEVfQlVGX1NJWkU7CisKKwlyZXR1cm4gY291bnQ7CisKK30KKworc3RhdGljIHZvaWQgYWlyY2FibGVfd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CisJaW50IHJlc3VsdDsKKworCWRiZygiJXMgLSB1cmItPnN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18gLCB1cmItPnN0YXR1cyk7CisKKwkvKiBUaGlzIGhhcyBiZWVuIHRha2VuIGZyb20gY3lwcmVzc19tOC5jIGN5cHJlc3Nfd3JpdGVfaW50X2NhbGxiYWNrICovCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCQljYXNlIDA6CisJCQkvKiBzdWNjZXNzICovCisJCQlicmVhazsKKwkJY2FzZSAtRUNPTk5SRVNFVDoKKwkJY2FzZSAtRU5PRU5UOgorCQljYXNlIC1FU0hVVERPV046CisJCQkvKiB0aGlzIHVyYiBpcyB0ZXJtaW5hdGVkLCBjbGVhbiB1cCAqLworCQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsCisJCQkgICAgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCQlwb3J0LT53cml0ZV91cmJfYnVzeSA9IDA7CisJCQlyZXR1cm47CisJCWRlZmF1bHQ6CisJCQkvKiBlcnJvciBpbiB0aGUgdXJiLCBzbyB3ZSBoYXZlIHRvIHJlc3VibWl0IGl0ICovCisJCQlkYmcoIiVzIC0gT3ZlcmZsb3cgaW4gd3JpdGUiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJCSAgICBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJCXBvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDE7CisJCQlwb3J0LT53cml0ZV91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OworCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+d3JpdGVfdXJiLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChyZXN1bHQpCisJCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKKwkJCQkJIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQllbHNlCisJCQkJcmV0dXJuOworCX0KKworCXBvcnQtPndyaXRlX3VyYl9idXN5ID0gMDsKKworCWFpcmNhYmxlX3NlbmQocG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGFpcmNhYmxlX3JlYWRfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IGFpcmNhYmxlX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwl1bnNpZ25lZCBsb25nIG5vX3BhY2thZ2VzLCByZW1haW5pbmcsIHBhY2thZ2VfbGVuZ3RoLCBpOworCWludCByZXN1bHQsIHNoaWZ0ID0gMDsKKwl1bnNpZ25lZCBjaGFyICp0ZW1wOworCisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJZGJnKCIlcyAtIHVyYi0+c3RhdHVzID0gJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJaWYgKCFwb3J0LT5vcGVuX2NvdW50KSB7CisJCQlkYmcoIiVzIC0gcG9ydCBpcyBjbG9zZWQsIGV4aXRpbmcuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVQUk9UTykgeworCQkJZGJnKCIlcyAtIGNhdWdodCAtRVBST1RPLCByZXN1Ym1pdHRpbmcgdGhlIHVyYiIsCisJCQkgICAgX19GVU5DVElPTl9fKTsKKwkJCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKKwkJCQkJICB1c2JfcmN2YnVsa3BpcGUocG9ydC0+c2VyaWFsLT5kZXYsCisJCQkJCSAgCQkgIHBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKSwKKwkJCQkJICBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCQkgIHBvcnQtPnJlYWRfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAorCQkJCQkgIGFpcmNhYmxlX3JlYWRfYnVsa19jYWxsYmFjaywgcG9ydCk7CisKKwkJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJCQlpZiAocmVzdWx0KQorCQkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkJCSIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQlyZXR1cm47CisJCX0KKwkJZGJnKCIlcyAtIHVuYWJsZSB0byBoYW5kbGUgdGhlIGVycm9yLCBleGl0aW5nLiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywKKwkJCQl1cmItPmFjdHVhbF9sZW5ndGgsdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCisJdHR5ID0gcG9ydC0+dHR5OworCWlmICh0dHkgJiYgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CisJCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPD0gMikgeworCQkJLyogVGhpcyBpcyBhbiBpbmNvbXBsZXRlIHBhY2thZ2UgKi8KKwkJCXNlcmlhbF9idWZfcHV0KHByaXYtPnJ4X2J1ZiwgdXJiLT50cmFuc2Zlcl9idWZmZXIsCisJCQkJICAgICAgIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCX0gZWxzZSB7CisJCQl0ZW1wID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJCQlpZiAodGVtcFswXSA9PSBSWF9IRUFERVJfMCkKKwkJCQlzaGlmdCA9IEhDSV9IRUFERVJfTEVOR1RIOworCisJCQlyZW1haW5pbmcgPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJCQlub19wYWNrYWdlcyA9IHVyYi0+YWN0dWFsX2xlbmd0aCAvIChIQ0lfQ09NUExFVEVfRlJBTUUpOworCisJCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoICUgSENJX0NPTVBMRVRFX0ZSQU1FICE9IDApCisJCQkJbm9fcGFja2FnZXMrPTE7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBub19wYWNrYWdlcyA7aSsrKSB7CisJCQkJaWYgKHJlbWFpbmluZyA+IChIQ0lfQ09NUExFVEVfRlJBTUUpKQorCQkJCQlwYWNrYWdlX2xlbmd0aCA9IEhDSV9DT01QTEVURV9GUkFNRTsKKwkJCQllbHNlCisJCQkJCXBhY2thZ2VfbGVuZ3RoID0gcmVtYWluaW5nOworCQkJCXJlbWFpbmluZyAtPSBwYWNrYWdlX2xlbmd0aDsKKworCQkJCXNlcmlhbF9idWZfcHV0KHByaXYtPnJ4X2J1ZiwKKwkJCQkJdXJiLT50cmFuc2Zlcl9idWZmZXIgKyBzaGlmdCArCisJCQkJCShIQ0lfQ09NUExFVEVfRlJBTUUpICogKGkpLAorCQkJCQlwYWNrYWdlX2xlbmd0aCAtIHNoaWZ0KTsKKwkJCX0KKwkJfQorCQlhaXJjYWJsZV9yZWFkKHBvcnQpOworCX0KKworCS8qIFNjaGVkdWxlIHRoZSBuZXh0IHJlYWQgX2lmXyB3ZSBhcmUgc3RpbGwgb3BlbiAqLworCWlmIChwb3J0LT5vcGVuX2NvdW50KSB7CisJCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBwb3J0LT5zZXJpYWwtPmRldiwKKwkJCQkgIHVzYl9yY3ZidWxrcGlwZShwb3J0LT5zZXJpYWwtPmRldiwKKwkJCQkgIAkJICBwb3J0LT5idWxrX2luX2VuZHBvaW50QWRkcmVzcyksCisJCQkJICBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCSAgcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQkJICBhaXJjYWJsZV9yZWFkX2J1bGtfY2FsbGJhY2ssIHBvcnQpOworCisJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXN1bHQpCisJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJCSIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qIEJhc2VkIG9uIGZ0ZGlfc2lvLmMgdGhyb3R0bGUgKi8KK3N0YXRpYyB2b2lkIGFpcmNhYmxlX3Rocm90dGxlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGFpcmNhYmxlX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKKwlwcml2LT5yeF9mbGFncyB8PSBUSFJPVFRMRUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfbG9jaywgZmxhZ3MpOworfQorCisvKiBCYXNlZCBvbiBmdGRpX3Npby5jIHVudGhyb3R0bGUgKi8KK3N0YXRpYyB2b2lkIGFpcmNhYmxlX3VudGhyb3R0bGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgYWlyY2FibGVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwlpbnQgYWN0dWFsbHlfdGhyb3R0bGVkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yeF9sb2NrLCBmbGFncyk7CisJYWN0dWFsbHlfdGhyb3R0bGVkID0gcHJpdi0+cnhfZmxhZ3MgJiBBQ1RVQUxMWV9USFJPVFRMRUQ7CisJcHJpdi0+cnhfZmxhZ3MgJj0gfihUSFJPVFRMRUQgfCBBQ1RVQUxMWV9USFJPVFRMRUQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ4X2xvY2ssIGZsYWdzKTsKKworCWlmIChhY3R1YWxseV90aHJvdHRsZWQpCisJCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJ4X3dvcmspOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyIGFpcmNhYmxlX2RldmljZSA9IHsKKwkuZGVzY3JpcHRpb24gPQkJImFpcmNhYmxlIiwKKwkuaWRfdGFibGUgPSAJCWlkX3RhYmxlLAorCS5udW1fcG9ydHMgPQkJMSwKKwkuYXR0YWNoID0JCWFpcmNhYmxlX2F0dGFjaCwKKwkucHJvYmUgPQkJYWlyY2FibGVfcHJvYmUsCisJLnNodXRkb3duID0JCWFpcmNhYmxlX3NodXRkb3duLAorCS53cml0ZSA9CQlhaXJjYWJsZV93cml0ZSwKKwkud3JpdGVfcm9vbSA9CQlhaXJjYWJsZV93cml0ZV9yb29tLAorCS53cml0ZV9idWxrX2NhbGxiYWNrID0JYWlyY2FibGVfd3JpdGVfYnVsa19jYWxsYmFjaywKKwkucmVhZF9idWxrX2NhbGxiYWNrID0JYWlyY2FibGVfcmVhZF9idWxrX2NhbGxiYWNrLAorCS50aHJvdHRsZSA9CQlhaXJjYWJsZV90aHJvdHRsZSwKKwkudW50aHJvdHRsZSA9CQlhaXJjYWJsZV91bnRocm90dGxlLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGFpcmNhYmxlX2RyaXZlciA9IHsKKwkubmFtZSA9CQkiYWlyY2FibGUiLAorCS5wcm9iZSA9CXVzYl9zZXJpYWxfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPQl1c2Jfc2VyaWFsX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0JaWRfdGFibGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhaXJjYWJsZV9pbml0ICh2b2lkKQoreworCWludCByZXR2YWw7CisJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmYWlyY2FibGVfZGV2aWNlKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGZhaWxlZF9zZXJpYWxfcmVnaXN0ZXI7CisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZhaXJjYWJsZV9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZmFpbGVkX3VzYl9yZWdpc3RlcjsKKwlyZXR1cm4gMDsKKworZmFpbGVkX3NlcmlhbF9yZWdpc3RlcjoKKwl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmFpcmNhYmxlX2RldmljZSk7CitmYWlsZWRfdXNiX3JlZ2lzdGVyOgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhaXJjYWJsZV9leGl0ICh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZhaXJjYWJsZV9kcml2ZXIpOworCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmYWlyY2FibGVfZGV2aWNlKTsKK30KKworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGFpcmNhYmxlX2luaXQpOworbW9kdWxlX2V4aXQoYWlyY2FibGVfZXhpdCk7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQgb3Igbm90Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvYWlycHJpbWUuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9haXJwcmltZS5jCmluZGV4IDYyMDgyNTMuLjZlMWE4NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9haXJwcmltZS5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9haXJwcmltZS5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIEFpclByaW1lIENETUEgV2lyZWxlc3MgU2VyaWFsIFVTQiBkcml2ZXIKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+CiAgKgogICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgpAQCAtMTEsMjYgKzExLDI2NCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9zZXJpYWwuaD4KIAogc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIGlkX3RhYmxlIFtdID0gewogCXsgVVNCX0RFVklDRSgweDBjODgsIDB4MTdkYSkgfSwgLyogS3lvY2VyYSBXaXJlbGVzcyBLUEM2NTAvUGFzc3BvcnQgKi8KLQl7IFVTQl9ERVZJQ0UoMHhmM2QsIDB4MDExMikgfSwgIC8qIEFpclByaW1lIENETUEgV2lyZWxlc3MgUEMgQ2FyZCAqLwotCXsgVVNCX0RFVklDRSgweDE0MTAsIDB4MTExMCkgfSwgLyogTm92YXRlbCBXaXJlbGVzcyBNZXJsaW4gQ0RNQSAqLworCXsgVVNCX0RFVklDRSgweDBmM2QsIDB4MDExMikgfSwgLyogQWlyUHJpbWUgQ0RNQSBXaXJlbGVzcyBQQyBDYXJkICovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHgwMDE3KSB9LCAvKiBTaWVycmEgV2lyZWxlc3MgRU01NjI1ICovCisJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHgwMDE4KSB9LCAvKiBTaWVycmEgV2lyZWxlc3MgTUM1NzIwICovCiAJeyBVU0JfREVWSUNFKDB4MTE5OSwgMHgwMTEyKSB9LCAvKiBTaWVycmEgV2lyZWxlc3MgQWlyY2FyZCA1ODAgKi8KIAl7IFVTQl9ERVZJQ0UoMHgxMTk5LCAweDAyMTgpIH0sIC8qIFNpZXJyYSBXaXJlbGVzcyBNQzU3MjAgKi8KKwl7IFVTQl9ERVZJQ0UoMHgxNDEwLCAweDExMTApIH0sIC8qIE5vdmF0ZWwgV2lyZWxlc3MgTWVybGluIENETUEgKi8KIAl7IH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGlkX3RhYmxlKTsKIAorI2RlZmluZSBVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkUJNDA5NgorI2RlZmluZSBOVU1fUkVBRF9VUkJTCQkJNAorI2RlZmluZSBOVU1fV1JJVEVfVVJCUwkJCTQKKyNkZWZpbmUgTlVNX0JVTEtfRVBTCQkJMworI2RlZmluZSBNQVhfQlVMS19FUFMJCQk2CisKKy8qIGlmIG92ZXJyaWRkZW4gYnkgdGhlIHVzZXIsIHRoZW4gdXNlIHRoZWlyIHZhbHVlIGZvciB0aGUgc2l6ZSBvZiB0aGUKKyAqIHJlYWQgYW5kIHdyaXRlIHVyYnMsIGFuZCB0aGUgbnVtYmVyIG9mIGVuZHBvaW50cyAqLworc3RhdGljIGludCBidWZmZXJfc2l6ZSA9IFVSQl9UUkFOU0ZFUl9CVUZGRVJfU0laRTsKK3N0YXRpYyBpbnQgZW5kcG9pbnRzID0gTlVNX0JVTEtfRVBTOworc3RhdGljIGludCBkZWJ1ZzsKK3N0cnVjdCBhaXJwcmltZV9wcml2YXRlIHsKKwlzcGlubG9ja190IGxvY2s7CisJaW50IG91dHN0YW5kaW5nX3VyYnM7CisJaW50IHRocm90dGxlZDsKKwlzdHJ1Y3QgdXJiICpyZWFkX3VyYnBbTlVNX1JFQURfVVJCU107Cit9OworCitzdGF0aWMgdm9pZCBhaXJwcmltZV9yZWFkX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWludCByZXN1bHQ7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKworCWlmICh1cmItPnN0YXR1cykgeworCQlkYmcoIiVzIC0gbm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCisJCSAgICBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJLyogc29tZXRoaW5nIGhhcHBlbmVkLCBzbyBmcmVlIHVwIHRoZSBtZW1vcnkgZm9yIHRoaXMgdXJiICovCisJCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlcikgeworCQkJa2ZyZWUgKHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gTlVMTDsKKwkJfQorCQlyZXR1cm47CisJfQorCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOworCisJdHR5ID0gcG9ydC0+dHR5OworCWlmICh0dHkgJiYgdXJiLT5hY3R1YWxfbGVuZ3RoKSB7CisJCXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcgKHR0eSwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2ggKHR0eSk7CisJfQorCisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJlc3VsdCkKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGFpcnByaW1lX3dyaXRlX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCBhaXJwcmltZV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKworCS8qIGZyZWUgdXAgdGhlIHRyYW5zZmVyIGJ1ZmZlciwgYXMgdXNiX2ZyZWVfdXJiKCkgZG9lcyBub3QgZG8gdGhpcyAqLworCWtmcmVlICh1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisKKwlpZiAodXJiLT5zdGF0dXMpCisJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsCisJCSAgICBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCS0tcHJpdi0+b3V0c3RhbmRpbmdfdXJiczsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwl1c2Jfc2VyaWFsX3BvcnRfc29mdGludChwb3J0KTsKK30KKworc3RhdGljIGludCBhaXJwcmltZV9vcGVuKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBhaXJwcmltZV9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisJc3RydWN0IHVyYiAqdXJiOworCWNoYXIgKmJ1ZmZlciA9IE5VTEw7CisJaW50IGk7CisJaW50IHJlc3VsdCA9IDA7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKworCS8qIGluaXRpYWxpemUgb3VyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUgaWYgaXQgaXNuJ3QgYWxyZWFkeSBjcmVhdGVkICovCisJaWYgKCFwcml2KSB7CisJCXByaXYgPSBremFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCQlpZiAoIXByaXYpIHsKKwkJCXJlc3VsdCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bG9jayk7CisJCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0LCBwcml2KTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1JFQURfVVJCUzsgKytpKSB7CisJCWJ1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWJ1ZmZlcikgeworCQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwKKwkJCQlfX0ZVTkNUSU9OX18pOworCQkJcmVzdWx0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICghdXJiKSB7CisJCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIG5vIG1vcmUgdXJicz9cbiIsCisJCQkJX19GVU5DVElPTl9fKTsKKwkJCXJlc3VsdCA9IC1FTk9NRU07CisJCQlnb3RvIGVycm91dDsKKwkJfQorCQl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHNlcmlhbC0+ZGV2LAorCQkJCSAgdXNiX3JjdmJ1bGtwaXBlKHNlcmlhbC0+ZGV2LAorCQkJCQkJICBwb3J0LT5idWxrX291dF9lbmRwb2ludEFkZHJlc3MpLAorCQkJCSAgYnVmZmVyLCBidWZmZXJfc2l6ZSwKKwkJCQkgIGFpcnByaW1lX3JlYWRfYnVsa19jYWxsYmFjaywgcG9ydCk7CisJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0tFUk5FTCk7CisJCWlmIChyZXN1bHQpIHsKKwkJCWRldl9lcnIoJnBvcnQtPmRldiwKKwkJCQkiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiAlZCBmb3IgcG9ydCAlZCwgZXJyb3IgJWRcbiIsCisJCQkJX19GVU5DVElPTl9fLCBpLCBwb3J0LT5udW1iZXIsIHJlc3VsdCk7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCQkvKiByZW1lbWJlciB0aGlzIHVyYiBzbyB3ZSBjYW4ga2lsbCBpdCB3aGVuIHRoZSBwb3J0IGlzIGNsb3NlZCAqLworCQlwcml2LT5yZWFkX3VyYnBbaV0gPSB1cmI7CisJfQorCWdvdG8gb3V0OworCisgZXJyb3V0OgorCS8qIHNvbWUgZXJyb3IgaGFwcGVuZWQsIGNhbmNlbCBhbnkgc3VibWl0dGVkIHVyYnMgYW5kIGNsZWFuIHVwIGFueXRoaW5nIHRoYXQKKwkgICBnb3QgYWxsb2NhdGVkIHN1Y2Nlc3NmdWxseSAqLworCisJZm9yICggOyBpID49IDA7IC0taSkgeworCQl1cmIgPSBwcml2LT5yZWFkX3VyYnBbaV07CisJCWlmICh1cmIpIHsKKwkJCS8qIFRoaXMgdXJiIHdhcyBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5LiBTbyB3ZSBoYXZlIHRvCisJCQkgICBjYW5jZWwgaXQuCisJCQkgICBVbmxpbmtpbmcgdGhlIHVyYiB3aWxsIGludm9rZSByZWFkX2J1bGtfY2FsbGJhY2soKQorCQkJICAgd2l0aCBhbiBlcnJvciBzdGF0dXMsIHNvIGl0cyB0cmFuc2ZlciBidWZmZXIgd2lsbAorCQkJICAgYmUgZnJlZWQgdGhlcmUgKi8KKwkJCWlmICh1c2JfdW5saW5rX3VyYiAodXJiKSAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJCQkvKiBjb21tZW50cyBpbiBkcml2ZXJzL3VzYi9jb3JlL3VyYi5jIHNheSB0aGlzCisJCQkJICAgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSB1cmIgd2FzIG5ldmVyIHN1Ym1pdHRlZCwKKwkJCQkgICBvciBoYXMgY29tcGxldGVkIGFscmVhZHkuCisJCQkJICAgRWl0aGVyIHdheSB3ZSBtYXkgaGF2ZSB0byBmcmVlIHRoZSB0cmFuc2ZlcgorCQkJCSAgIGJ1ZmZlciBoZXJlLiAqLworCQkJCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlcikgeworCQkJCQlrZnJlZSAodXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQkJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJCQkJfQorCQkJfQorCQkJdXNiX2ZyZWVfdXJiICh1cmIpOworCQl9CisJfQorCisgb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIGFpcnByaW1lX2Nsb3NlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgYWlycHJpbWVfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKwlpbnQgaTsKKworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCisJLyoga2lsbGluZyB0aGUgdXJiIHdpbGwgaW52b2tlIHJlYWRfYnVsa19jYWxsYmFjaygpIHdpdGggYW4gZXJyb3Igc3RhdHVzLAorCSAgIHNvIHRoZSB0cmFuc2ZlciBidWZmZXIgd2lsbCBiZSBmcmVlZCB0aGVyZSAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1fUkVBRF9VUkJTOyArK2kpIHsKKwkJdXNiX2tpbGxfdXJiIChwcml2LT5yZWFkX3VyYnBbaV0pOworCQl1c2JfZnJlZV91cmIgKHByaXYtPnJlYWRfdXJicFtpXSk7CisJfQorCisJLyogZnJlZSB1cCBwcml2YXRlIHN0cnVjdHVyZSAqLworCWtmcmVlIChwcml2KTsKKwl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYWlycHJpbWVfd3JpdGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJc3RydWN0IGFpcnByaW1lX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YXR1czsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJaWYgKHByaXYtPm91dHN0YW5kaW5nX3VyYnMgPiBOVU1fV1JJVEVfVVJCUykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCWRiZygiJXMgLSB3cml0ZSBsaW1pdCBoaXRcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJYnVmZmVyID0ga21hbGxvYyhjb3VudCwgR0ZQX0FUT01JQyk7CisJaWYgKCFidWZmZXIpIHsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOworCWlmICghdXJiKSB7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIm5vIG1vcmUgZnJlZSB1cmJzXG4iKTsKKwkJa2ZyZWUgKGJ1ZmZlcik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1jcHkgKGJ1ZmZlciwgYnVmLCBjb3VudCk7CisKKwl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgY291bnQsIGJ1ZmZlcik7CisKKwl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHNlcmlhbC0+ZGV2LAorCQkJICB1c2Jfc25kYnVsa3BpcGUoc2VyaWFsLT5kZXYsCisJCQkJCSAgcG9ydC0+YnVsa19vdXRfZW5kcG9pbnRBZGRyZXNzKSwKKwkJCSAgYnVmZmVyLCBjb3VudCwKKwkJCSAgYWlycHJpbWVfd3JpdGVfYnVsa19jYWxsYmFjaywgcG9ydCk7CisKKwkvKiBzZW5kIGl0IGRvd24gdGhlIHBpcGUgKi8KKwlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmIChzdGF0dXMpIHsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LAorCQkJIiVzIC0gdXNiX3N1Ym1pdF91cmIod3JpdGUgYnVsaykgZmFpbGVkIHdpdGggc3RhdHVzID0gJWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWNvdW50ID0gc3RhdHVzOworCQlrZnJlZSAoYnVmZmVyKTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkrK3ByaXYtPm91dHN0YW5kaW5nX3VyYnM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwl9CisJLyogd2UgYXJlIGRvbmUgd2l0aCB0aGlzIHVyYiwgc28gbGV0IHRoZSBob3N0IGRyaXZlcgorCSAqIHJlYWxseSBmcmVlIGl0IHdoZW4gaXQgaXMgZmluaXNoZWQgd2l0aCBpdCAqLworCXVzYl9mcmVlX3VyYiAodXJiKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBhaXJwcmltZV9kcml2ZXIgPSB7CiAJLm5hbWUgPQkJImFpcnByaW1lIiwKIAkucHJvYmUgPQl1c2Jfc2VyaWFsX3Byb2JlLAogCS5kaXNjb25uZWN0ID0JdXNiX3NlcmlhbF9kaXNjb25uZWN0LAogCS5pZF90YWJsZSA9CWlkX3RhYmxlLAotCS5ub19keW5hbWljX2lkID0gCTEsCisJLm5vX2R5bmFtaWNfaWQgPQkxLAogfTsKIAogc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciBhaXJwcmltZV9kZXZpY2UgPSB7CkBAIC00MiwxMyArMjgwLDE3IEBACiAJLm51bV9pbnRlcnJ1cHRfaW4gPQlOVU1fRE9OVF9DQVJFLAogCS5udW1fYnVsa19pbiA9CQlOVU1fRE9OVF9DQVJFLAogCS5udW1fYnVsa19vdXQgPQkJTlVNX0RPTlRfQ0FSRSwKLQkubnVtX3BvcnRzID0JCTEsCisJLm9wZW4gPQkJCWFpcnByaW1lX29wZW4sCisJLmNsb3NlID0JCWFpcnByaW1lX2Nsb3NlLAorCS53cml0ZSA9CQlhaXJwcmltZV93cml0ZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGFpcnByaW1lX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsOwogCisJYWlycHJpbWVfZGV2aWNlLm51bV9wb3J0cyA9CisJCShlbmRwb2ludHMgPiAwICYmIGVuZHBvaW50cyA8PSBNQVhfQlVMS19FUFMpID8gZW5kcG9pbnRzIDogTlVNX0JVTEtfRVBTOwogCXJldHZhbCA9IHVzYl9zZXJpYWxfcmVnaXN0ZXIoJmFpcnByaW1lX2RldmljZSk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTYwLDYgKzMwMiw4IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhaXJwcmltZV9leGl0KHZvaWQpCiB7CisJZGJnKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKIAl1c2JfZGVyZWdpc3RlcigmYWlycHJpbWVfZHJpdmVyKTsKIAl1c2Jfc2VyaWFsX2RlcmVnaXN0ZXIoJmFpcnByaW1lX2RldmljZSk7CiB9CkBAIC02NywzICszMTEsMTAgQEAKIG1vZHVsZV9pbml0KGFpcnByaW1lX2luaXQpOwogbW9kdWxlX2V4aXQoYWlycHJpbWVfZXhpdCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGVuYWJsZWQiKTsKK21vZHVsZV9wYXJhbShidWZmZXJfc2l6ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYnVmZmVyX3NpemUsICJTaXplIG9mIHRoZSB0cmFuc2ZlciBidWZmZXJzIGluIGJ5dGVzIChkZWZhdWx0IDQwOTYpIik7Cittb2R1bGVfcGFyYW0oZW5kcG9pbnRzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhlbmRwb2ludHMsICJOdW1iZXIgb2YgYnVsayBFUHMgdG8gY29uZmlndXJlIChkZWZhdWx0IDMpIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvYXJrMzExNi5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2FyazMxMTYuYwppbmRleCA5NzBkOWVmLi5jYTUyZjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvYXJrMzExNi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9hcmszMTE2LmMKQEAgLTEsNCArMSw3IEBACiAvKgorICogQ29weXJpZ2h0IChDKSAyMDA2CisgKiAgIFNpbW9uIFNjaHVseiAoYXJrMzExNl9kcml2ZXIgPGF0PiBhdWN0aW9uYW50LmRlKQorICoKICAqIGFyazMxMTYKICAqIC0gaW1wbGVtZW50cyBhIGRyaXZlciBmb3IgdGhlIGFya21pY3JvIGFyazMxMTYgY2hpcHNldCAodmVuZG9yPTB4NjU0NywKICAqICAgcHJvZHVjdGlkPTB4MDIzMikgKHVzZWQgaW4gYSBkYXRhY2FibGUgY2FsbGVkIEtRLVU4QSkKQEAgLTgsOCArMTEsNiBAQAogICoKICAqICAtIGJhc2VkIG9uIGxvZ3MgY3JlYXRlZCBieSB1c2Jzbm9vcHkKICAqCi0gKiAgQXV0aG9yICAgOiBTaW1vbiBTY2h1bHogW2FyazMxMTZfZHJpdmVyPEFUPmF1Y3Rpb25hbnQuZGVdCi0gKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQogICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgpAQCAtMjIsNiArMjMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAKIHN0YXRpYyBpbnQgZGVidWc7CkBAIC00MywxMCArNDYsMTAgQEAKIHsKIAlpbnQgcmVzdWx0OwogCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyhzZXJpYWwtPmRldiwKLQkJCQkgdXNiX3NuZGN0cmxwaXBlKHNlcmlhbC0+ZGV2LDApLAorCQkJCSB1c2Jfc25kY3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLAogCQkJCSByZXF1ZXN0LCByZXF1ZXN0dHlwZSwgdmFsdWUsIGluZGV4LAotCQkJCSBOVUxMLDB4MDAsIDEwMDApOwotCWRiZygiJTAzZCA+IG9rIixzZXEpOworCQkJCSBOVUxMLCAweDAwLCAxMDAwKTsKKwlkYmcoIiUwM2QgPiBvayIsIHNlcSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBBUkszMTE2X1JDVihzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLCBpbnQgc2VxLApAQCAtNTYsMjcgKzU5LDI1IEBACiB7CiAJaW50IHJlc3VsdDsKIAlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsCi0JCQkgICAgICB1c2JfcmN2Y3RybHBpcGUoc2VyaWFsLT5kZXYsMCksCi0JCQkgICAgICByZXF1ZXN0LCByZXF1ZXN0dHlwZSwgdmFsdWUsIGluZGV4LAotCQkJICAgICAgYnVmLCAweDAwMDAwMDEsIDEwMDApOworCQkJCSB1c2JfcmN2Y3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLAorCQkJCSByZXF1ZXN0LCByZXF1ZXN0dHlwZSwgdmFsdWUsIGluZGV4LAorCQkJCSBidWYsIDB4MDAwMDAwMSwgMTAwMCk7CiAJaWYgKHJlc3VsdCkKLQkJZGJnKCIlMDNkIDwgJWQgYnl0ZXMgWzB4JTAyWF0iLHNlcSwgcmVzdWx0LCBidWZbMF0pOworCQlkYmcoIiUwM2QgPCAlZCBieXRlcyBbMHglMDJYXSIsIHNlcSwgcmVzdWx0LCBidWZbMF0pOwogCWVsc2UKIAkJZGJnKCIlMDNkIDwgMCBieXRlcyIsIHNlcSk7CiB9CiAKLQogc3RhdGljIGlubGluZSB2b2lkIEFSSzMxMTZfUkNWX1FVSUVUKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwsCiAJCQkJICAgICBfX3U4IHJlcXVlc3QsIF9fdTggcmVxdWVzdHR5cGUsCiAJCQkJICAgICBfX3UxNiB2YWx1ZSwgX191MTYgaW5kZXgsIGNoYXIgKmJ1ZikKIHsKIAl1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsCi0JCQl1c2JfcmN2Y3RybHBpcGUoc2VyaWFsLT5kZXYsMCksCisJCQl1c2JfcmN2Y3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLAogCQkJcmVxdWVzdCwgcmVxdWVzdHR5cGUsIHZhbHVlLCBpbmRleCwKIAkJCWJ1ZiwgMHgwMDAwMDAxLCAxMDAwKTsKIH0KIAotCiBzdGF0aWMgaW50IGFyazMxMTZfYXR0YWNoKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7CiAJY2hhciAqYnVmOwpAQCAtODQsMTAgKzg1LDEwIEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgewotCQlwcml2ID0ga21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgYXJrMzExNl9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisJCXByaXYgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGFyazMxMTZfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwogCQlpZiAoIXByaXYpCiAJCQlnb3RvIGNsZWFudXA7Ci0JCW1lbXNldCAocHJpdiwgMHgwMCwgc2l6ZW9mIChzdHJ1Y3QgYXJrMzExNl9wcml2YXRlKSk7CisJCW1lbXNldChwcml2LCAweDAwLCBzaXplb2YgKHN0cnVjdCBhcmszMTE2X3ByaXZhdGUpKTsKIAkJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwogCiAJCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbaV0sIHByaXYpOwpAQCAtOTUsNjMgKzk2LDYyIEBACiAKIAlidWYgPSBrbWFsbG9jKDEsIEdGUF9LRVJORUwpOwogCWlmICghYnVmKSB7Ci0JCWRiZygiZXJyb3Iga21hbGxvYyAtPiBvdXQgb2YgbWVtID8iKTsKKwkJZGJnKCJlcnJvciBrbWFsbG9jIC0+IG91dCBvZiBtZW0/Iik7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiAzICovCi0JQVJLMzExNl9TTkQoc2VyaWFsLCAzLDB4RkUsMHg0MCwweDAwMDgsMHgwMDAyKTsKLQlBUkszMTE2X1NORChzZXJpYWwsIDQsMHhGRSwweDQwLDB4MDAwOCwweDAwMDEpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgNSwweEZFLDB4NDAsMHgwMDAwLDB4MDAwOCk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCA2LDB4RkUsMHg0MCwweDAwMDAsMHgwMDBCKTsKKwlBUkszMTE2X1NORChzZXJpYWwsIDMsIDB4RkUsIDB4NDAsIDB4MDAwOCwgMHgwMDAyKTsKKwlBUkszMTE2X1NORChzZXJpYWwsIDQsIDB4RkUsIDB4NDAsIDB4MDAwOCwgMHgwMDAxKTsKKwlBUkszMTE2X1NORChzZXJpYWwsIDUsIDB4RkUsIDB4NDAsIDB4MDAwMCwgMHgwMDA4KTsKKwlBUkszMTE2X1NORChzZXJpYWwsIDYsIDB4RkUsIDB4NDAsIDB4MDAwMCwgMHgwMDBCKTsKIAogCS8qIDwtLSBzZXE3ICovCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLCA3LDB4RkUsMHhDMCwweDAwMDAsMHgwMDAzLCAweDAwLCBidWYpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwgOCwweEZFLDB4NDAsMHgwMDgwLDB4MDAwMyk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLCA5LDB4RkUsMHg0MCwweDAwMUEsMHgwMDAwKTsKLQlBUkszMTE2X1NORChzZXJpYWwsMTAsMHhGRSwweDQwLDB4MDAwMCwweDAwMDEpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwxMSwweEZFLDB4NDAsMHgwMDAwLDB4MDAwMyk7CisJQVJLMzExNl9SQ1Yoc2VyaWFsLCAgNywgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDMsIDB4MDAsIGJ1Zik7CisJQVJLMzExNl9TTkQoc2VyaWFsLCAgOCwgMHhGRSwgMHg0MCwgMHgwMDgwLCAweDAwMDMpOworCUFSSzMxMTZfU05EKHNlcmlhbCwgIDksIDB4RkUsIDB4NDAsIDB4MDAxQSwgMHgwMDAwKTsKKwlBUkszMTE2X1NORChzZXJpYWwsIDEwLCAweEZFLCAweDQwLCAweDAwMDAsIDB4MDAwMSk7CisJQVJLMzExNl9TTkQoc2VyaWFsLCAxMSwgMHhGRSwgMHg0MCwgMHgwMDAwLCAweDAwMDMpOwogCiAJLyogPC0tIHNlcTEyICovCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLDEyLDB4RkUsMHhDMCwweDAwMDAsMHgwMDA0LCAweDAwLCBidWYpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwxMywweEZFLDB4NDAsMHgwMDAwLDB4MDAwNCk7CisJQVJLMzExNl9SQ1Yoc2VyaWFsLCAxMiwgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDQsIDB4MDAsIGJ1Zik7CisJQVJLMzExNl9TTkQoc2VyaWFsLCAxMywgMHhGRSwgMHg0MCwgMHgwMDAwLCAweDAwMDQpOwogCiAJLyogMTQgKi8KLQlBUkszMTE2X1JDVihzZXJpYWwsMTQsMHhGRSwweEMwLDB4MDAwMCwweDAwMDQsIDB4MDAsIGJ1Zik7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLDE1LDB4RkUsMHg0MCwweDAwMDAsMHgwMDA0KTsKKwlBUkszMTE2X1JDVihzZXJpYWwsIDE0LCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwNCwgMHgwMCwgYnVmKTsKKwlBUkszMTE2X1NORChzZXJpYWwsIDE1LCAweEZFLCAweDQwLCAweDAwMDAsIDB4MDAwNCk7CiAKIAkvKiAxNiAqLwotCUFSSzMxMTZfUkNWKHNlcmlhbCwxNiwweEZFLDB4QzAsMHgwMDAwLDB4MDAwNCwgMHgwMCwgYnVmKTsKKwlBUkszMTE2X1JDVihzZXJpYWwsIDE2LCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwNCwgMHgwMCwgYnVmKTsKIAkvKiAtLT4gc2VxMTcgKi8KLQlBUkszMTE2X1NORChzZXJpYWwsMTcsMHhGRSwweDQwLDB4MDAwMSwweDAwMDQpOworCUFSSzMxMTZfU05EKHNlcmlhbCwgMTcsIDB4RkUsIDB4NDAsIDB4MDAwMSwgMHgwMDA0KTsKIAogCS8qIDwtLSBzZXExOCAqLwotCUFSSzMxMTZfUkNWKHNlcmlhbCwxOCwweEZFLDB4QzAsMHgwMDAwLDB4MDAwNCwgMHgwMSwgYnVmKTsKKwlBUkszMTE2X1JDVihzZXJpYWwsIDE4LCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwNCwgMHgwMSwgYnVmKTsKIAogCS8qIC0tPiBzZXExOSAqLwotCUFSSzMxMTZfU05EKHNlcmlhbCwxOSwweEZFLDB4NDAsMHgwMDAzLDB4MDAwNCk7Ci0KKwlBUkszMTE2X1NORChzZXJpYWwsIDE5LCAweEZFLCAweDQwLCAweDAwMDMsIDB4MDAwNCk7CiAKIAkvKiA8LS0gc2VxMjAgKi8KLQkvKiBzZWVtcyBsaWtlIHNlcmlhbCBwb3J0IHN0YXR1cyBpbmZvIChSVFMsIENUUywuLi4pICovCi0JLyogcmV0dXJucyBtb2RlbSBjb250cm9sIGxpbmUgc3RhdHVzID8hICovCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLDIwLDB4RkUsMHhDMCwweDAwMDAsMHgwMDA2LCAweEZGLCBidWYpOworCS8qIHNlZW1zIGxpa2Ugc2VyaWFsIHBvcnQgc3RhdHVzIGluZm8gKFJUUywgQ1RTLCAuLi4pICovCisJLyogcmV0dXJucyBtb2RlbSBjb250cm9sIGxpbmUgc3RhdHVzPyEgKi8KKwlBUkszMTE2X1JDVihzZXJpYWwsIDIwLCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwNiwgMHhGRiwgYnVmKTsKIAotCS8qIHNldCA5NjAwIGJhdWQgJiBkbyBzb21lIGluaXQgPyEgKi8KLQlBUkszMTE2X1NORChzZXJpYWwsMTQ3LDB4RkUsMHg0MCwweDAwODMsMHgwMDAzKTsKLQlBUkszMTE2X1NORChzZXJpYWwsMTQ4LDB4RkUsMHg0MCwweDAwMzgsMHgwMDAwKTsKLQlBUkszMTE2X1NORChzZXJpYWwsMTQ5LDB4RkUsMHg0MCwweDAwMDEsMHgwMDAxKTsKLQlBUkszMTE2X1NORChzZXJpYWwsMTUwLDB4RkUsMHg0MCwweDAwMDMsMHgwMDAzKTsKLQlBUkszMTE2X1JDVihzZXJpYWwsMTUxLDB4RkUsMHhDMCwweDAwMDAsMHgwMDA0LDB4MDMsIGJ1Zik7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLDE1MiwweEZFLDB4NDAsMHgwMDAwLDB4MDAwMyk7Ci0JQVJLMzExNl9SQ1Yoc2VyaWFsLDE1MywweEZFLDB4QzAsMHgwMDAwLDB4MDAwMywweDAwLCBidWYpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwxNTQsMHhGRSwweDQwLDB4MDAwMywweDAwMDMpOworCS8qIHNldCA5NjAwIGJhdWQgJiBkbyBzb21lIGluaXQ/ISAqLworCUFSSzMxMTZfU05EKHNlcmlhbCwgMTQ3LCAweEZFLCAweDQwLCAweDAwODMsIDB4MDAwMyk7CisJQVJLMzExNl9TTkQoc2VyaWFsLCAxNDgsIDB4RkUsIDB4NDAsIDB4MDAzOCwgMHgwMDAwKTsKKwlBUkszMTE2X1NORChzZXJpYWwsIDE0OSwgMHhGRSwgMHg0MCwgMHgwMDAxLCAweDAwMDEpOworCUFSSzMxMTZfU05EKHNlcmlhbCwgMTUwLCAweEZFLCAweDQwLCAweDAwMDMsIDB4MDAwMyk7CisJQVJLMzExNl9SQ1Yoc2VyaWFsLCAxNTEsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDA0LCAweDAzLCBidWYpOworCUFSSzMxMTZfU05EKHNlcmlhbCwgMTUyLCAweEZFLCAweDQwLCAweDAwMDAsIDB4MDAwMyk7CisJQVJLMzExNl9SQ1Yoc2VyaWFsLCAxNTMsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDAzLCAweDAwLCBidWYpOworCUFSSzMxMTZfU05EKHNlcmlhbCwgMTU0LCAweEZFLCAweDQwLCAweDAwMDMsIDB4MDAwMyk7CiAKIAlrZnJlZShidWYpOwotCXJldHVybigwKTsKKwlyZXR1cm4gMDsKIAogY2xlYW51cDoKLQlmb3IgKC0taTsgaT49MDsgLS1pKQorCWZvciAoLS1pOyBpID49IDA7IC0taSkKIAkJdXNiX3NldF9zZXJpYWxfcG9ydF9kYXRhKHNlcmlhbC0+cG9ydFtpXSwgTlVMTCk7CiAJcmV0dXJuIC1FTk9NRU07CiB9CkBAIC0xODAsNyArMTgwLDggQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWlmICghcHJpdi0+dGVybWlvc19pbml0aWFsaXplZCkgewogCQkqKHBvcnQtPnR0eS0+dGVybWlvcykgPSB0dHlfc3RkX3Rlcm1pb3M7Ci0JCXBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnID0gQjk2MDAgfCBDUzgKKwkJCQkJICAgICAgfCBDUkVBRCB8IEhVUENMIHwgQ0xPQ0FMOwogCQlwcml2LT50ZXJtaW9zX2luaXRpYWxpemVkID0gMTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtMjA0LDggKzIwNSw4IEBACiAJfQogCiAJLyogc2V0IGRhdGEgYml0IGNvdW50ICg4LzcvNi81KSAqLwotCWlmIChjZmxhZyAmIENTSVpFKXsKLQkJc3dpdGNoIChjZmxhZyAmIENTSVpFKXsKKwlpZiAoY2ZsYWcgJiBDU0laRSkgeworCQlzd2l0Y2ggKGNmbGFnICYgQ1NJWkUpIHsKIAkJY2FzZSBDUzU6CiAJCQljb25maWcgfD0gMHgwMDsKIAkJCWRiZygic2V0dGluZyBDUzUiKTsKQEAgLTIxOSw3ICsyMjAsOCBAQAogCQkJZGJnKCJzZXR0aW5nIENTNyIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQllcnIgKCJDU0laRSB3YXMgc2V0IGJ1dCBub3QgQ1M1LUNTOCwgdXNpbmcgQ1M4ISIpOworCQkJZXJyKCJDU0laRSB3YXMgc2V0IGJ1dCBub3QgQ1M1LUNTOCwgdXNpbmcgQ1M4ISIpOworCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCWNhc2UgQ1M4OgogCQkJY29uZmlnIHw9IDB4MDM7CiAJCQlkYmcoInNldHRpbmcgQ1M4Iik7CkBAIC0yMjcsOCArMjI5LDggQEAKIAkJfQogCX0KIAotCS8qIHNldCBwYXJpdHkgKE5PTkUsRVZFTixPREQpICovCi0JaWYgKGNmbGFnICYgUEFSRU5CKXsKKwkvKiBzZXQgcGFyaXR5IChOT05FL0VWRU4vT0REKSAqLworCWlmIChjZmxhZyAmIFBBUkVOQikgewogCQlpZiAoY2ZsYWcgJiBQQVJPREQpIHsKIAkJCWNvbmZpZyB8PSAweDA4OwogCQkJZGJnKCJzZXR0aW5nIHBhcml0eSB0byBPREQiKTsKQEAgLTI0MCwyMCArMjQyLDE5IEBACiAJCWRiZygic2V0dGluZyBwYXJpdHkgdG8gTk9ORSIpOwogCX0KIAotCS8qIFNFVCBTVE9QQklUICgxLzIpICovCisJLyogc2V0IHN0b3AgYml0ICgxLzIpICovCiAJaWYgKGNmbGFnICYgQ1NUT1BCKSB7CiAJCWNvbmZpZyB8PSAweDA0OwotCQlkYmcgKCJzZXR0aW5nIDIgc3RvcCBiaXRzIik7CisJCWRiZygic2V0dGluZyAyIHN0b3AgYml0cyIpOwogCX0gZWxzZSB7Ci0JCWRiZyAoInNldHRpbmcgMSBzdG9wIGJpdCIpOworCQlkYmcoInNldHRpbmcgMSBzdG9wIGJpdCIpOwogCX0KIAotCi0JLyogc2V0IGJhdWRyYXRlOiAqLworCS8qIHNldCBiYXVkcmF0ZSAqLwogCWJhdWQgPSAwOwotCXN3aXRjaCAoY2ZsYWcgJiBDQkFVRCl7CisJc3dpdGNoIChjZmxhZyAmIENCQVVEKSB7CiAJCWNhc2UgQjA6Ci0JCQllcnIoImNhbid0IHNldCAwYmF1ZCwgdXNpbmcgOTYwMCBpbnN0ZWFkIik7CisJCQllcnIoImNhbid0IHNldCAwIGJhdWQsIHVzaW5nIDk2MDAgaW5zdGVhZCIpOwogCQkJYnJlYWs7CiAJCWNhc2UgQjc1OgliYXVkID0gNzU7CWJyZWFrOwogCQljYXNlIEIxNTA6CWJhdWQgPSAxNTA7CWJyZWFrOwpAQCAtMjg1LDM4ICsyODYsNDAgQEAKIAkgKi8KIAlpZiAoYmF1ZCA9PSA0NjA4MDApCiAJCS8qIHN0cmFuZ2UsIGZvciA0NjA4MDAgdGhlIGZvcm11bGEgaXMgd3JvbmcKLQkJICogKGRvbnQgdXNlIHJvdW5kKCksIHRoZW4gOTYwMGJhdWQgaXMgd3JvbmcpICovCisJCSAqIGlmIHVzaW5nIHJvdW5kKCkgdGhlbiA5NjAwYmF1ZCBpcyB3cm9uZykgKi8KIAkJYXJrMzExNl9iYXVkID0gNzsKIAllbHNlCiAJCWFyazMxMTZfYmF1ZCA9IDMwMDAwMDAgLyBiYXVkOwogCiAJLyogPyAqLwotCUFSSzMxMTZfUkNWKHNlcmlhbCwwLDB4RkUsMHhDMCwweDAwMDAsMHgwMDAzLCAweDAzLCBidWYpOworCUFSSzMxMTZfUkNWKHNlcmlhbCwgMCwgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDMsIDB4MDMsIGJ1Zik7CisKIAkvKiBvZmZzZXQgPSBidWZbMF07ICovCiAJLyogb2Zmc2V0ID0gMHgwMzsgKi8KLQkvKiBkYmcoInVzaW5nIDB4JTA0WCBhcyB0YXJnZXQgZm9yIDB4MDAwMzoiLDB4MDA4MCtvZmZzZXQpOyAqLwotCisJLyogZGJnKCJ1c2luZyAweCUwNFggYXMgdGFyZ2V0IGZvciAweDAwMDM6IiwgMHgwMDgwICsgb2Zmc2V0KTsgKi8KIAogCS8qIHNldCBiYXVkcmF0ZSAqLwotCWRiZygic2V0dGluZyBiYXVkcmF0ZSB0byAlZCAoLT5yZWc9JWQpIixiYXVkLGFyazMxMTZfYmF1ZCk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLDE0NywweEZFLDB4NDAsMHgwMDgzLDB4MDAwMyk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLDE0OCwweEZFLDB4NDAsKGFyazMxMTZfYmF1ZCAmIDB4MDBGRikgICAsMHgwMDAwKTsKLQlBUkszMTE2X1NORChzZXJpYWwsMTQ5LDB4RkUsMHg0MCwoYXJrMzExNl9iYXVkICYgMHhGRjAwKT4+OCwweDAwMDEpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwxNTAsMHhGRSwweDQwLDB4MDAwMywweDAwMDMpOworCWRiZygic2V0dGluZyBiYXVkcmF0ZSB0byAlZCAoLT5yZWc9JWQpIiwgYmF1ZCwgYXJrMzExNl9iYXVkKTsKKwlBUkszMTE2X1NORChzZXJpYWwsIDE0NywgMHhGRSwgMHg0MCwgMHgwMDgzLCAweDAwMDMpOworCUFSSzMxMTZfU05EKHNlcmlhbCwgMTQ4LCAweEZFLCAweDQwLAorCQkJICAgIChhcmszMTE2X2JhdWQgJiAweDAwRkYpLCAweDAwMDApOworCUFSSzMxMTZfU05EKHNlcmlhbCwgMTQ5LCAweEZFLCAweDQwLAorCQkJICAgIChhcmszMTE2X2JhdWQgJiAweEZGMDApID4+IDgsIDB4MDAwMSk7CisJQVJLMzExNl9TTkQoc2VyaWFsLCAxNTAsIDB4RkUsIDB4NDAsIDB4MDAwMywgMHgwMDAzKTsKIAogCS8qID8gKi8KLQlBUkszMTE2X1JDVihzZXJpYWwsMTUxLDB4RkUsMHhDMCwweDAwMDAsMHgwMDA0LDB4MDMsIGJ1Zik7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLDE1MiwweEZFLDB4NDAsMHgwMDAwLDB4MDAwMyk7CisJQVJLMzExNl9SQ1Yoc2VyaWFsLCAxNTEsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDA0LCAweDAzLCBidWYpOworCUFSSzMxMTZfU05EKHNlcmlhbCwgMTUyLCAweEZFLCAweDQwLCAweDAwMDAsIDB4MDAwMyk7CiAKIAkvKiBzZXQgZGF0YSBiaXQgY291bnQsIHN0b3AgYml0IGNvdW50ICYgcGFyaXR5OiAqLwogCWRiZygidXBkYXRpbmcgYml0IGNvdW50LCBzdG9wIGJpdCBvciBwYXJpdHkgKGNmZz0weCUwMlgpIiwgY29uZmlnKTsKLQlBUkszMTE2X1JDVihzZXJpYWwsMTUzLDB4RkUsMHhDMCwweDAwMDAsMHgwMDAzLDB4MDAsIGJ1Zik7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLDE1NCwweEZFLDB4NDAsY29uZmlnLDB4MDAwMyk7CisJQVJLMzExNl9SQ1Yoc2VyaWFsLCAxNTMsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDAzLCAweDAwLCBidWYpOworCUFSSzMxMTZfU05EKHNlcmlhbCwgMTU0LCAweEZFLCAweDQwLCBjb25maWcsIDB4MDAwMyk7CiAKIAlpZiAoY2ZsYWcgJiBDUlRTQ1RTKQotCQlkYmcoIkNSVFNDVFMgbm90IHN1cHBvcnRlZCBieSBjaGlwc2V0ID8hIik7CisJCWRiZygiQ1JUU0NUUyBub3Qgc3VwcG9ydGVkIGJ5IGNoaXBzZXQ/ISIpOwogCi0JLyogVEVTVCBBUkszMTE2X1NORCgxNTQsMHhGRSwweDQwLDB4RkZGRiwgMHgwMDA2KTsgKi8KKwkvKiBURVNUIEFSSzMxMTZfU05EKDE1NCwgMHhGRSwgMHg0MCwgMHhGRkZGLCAweDAwMDYpOyAqLwogCiAJa2ZyZWUoYnVmKTsKIAlyZXR1cm47CkBAIC0zMjksMTEgKzMzMiwxMSBAQAogCWNoYXIgKmJ1ZjsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCWRiZygiJXMgLSAgcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKIAogCWJ1ZiA9IGttYWxsb2MoMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpIHsKLQkJZGJnKCJlcnJvciBrbWFsbG9jIC0+IG91dCBvZiBtZW0gPyIpOworCQlkYmcoImVycm9yIGttYWxsb2MgLT4gb3V0IG9mIG1lbT8iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0zNDIsNDQgKzM0NSw2OCBAQAogCQlyZXR1cm4gcmVzdWx0OwogCiAJLyogb3BlbiAqLwotCUFSSzMxMTZfUkNWKHNlcmlhbCwxMTEsMHhGRSwweEMwLDB4MDAwMCwweDAwMDMsIDB4MDIsIGJ1Zik7CisJQVJLMzExNl9SQ1Yoc2VyaWFsLCAxMTEsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDAzLCAweDAyLCBidWYpOwogCi0JQVJLMzExNl9TTkQoc2VyaWFsLDExMiwweEZFLDB4NDAsMHgwMDgyLDB4MDAwMyk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLDExMywweEZFLDB4NDAsMHgwMDFBLDB4MDAwMCk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLDExNCwweEZFLDB4NDAsMHgwMDAwLDB4MDAwMSk7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLDExNSwweEZFLDB4NDAsMHgwMDAyLDB4MDAwMyk7CisJQVJLMzExNl9TTkQoc2VyaWFsLCAxMTIsIDB4RkUsIDB4NDAsIDB4MDA4MiwgMHgwMDAzKTsKKwlBUkszMTE2X1NORChzZXJpYWwsIDExMywgMHhGRSwgMHg0MCwgMHgwMDFBLCAweDAwMDApOworCUFSSzMxMTZfU05EKHNlcmlhbCwgMTE0LCAweEZFLCAweDQwLCAweDAwMDAsIDB4MDAwMSk7CisJQVJLMzExNl9TTkQoc2VyaWFsLCAxMTUsIDB4RkUsIDB4NDAsIDB4MDAwMiwgMHgwMDAzKTsKIAotCUFSSzMxMTZfUkNWKHNlcmlhbCwxMTYsMHhGRSwweEMwLDB4MDAwMCwweDAwMDQsIDB4MDMsIGJ1Zik7Ci0JQVJLMzExNl9TTkQoc2VyaWFsLDExNywweEZFLDB4NDAsMHgwMDAyLDB4MDAwNCk7CisJQVJLMzExNl9SQ1Yoc2VyaWFsLCAxMTYsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDA0LCAweDAzLCBidWYpOworCUFSSzMxMTZfU05EKHNlcmlhbCwgMTE3LCAweEZFLCAweDQwLCAweDAwMDIsIDB4MDAwNCk7CiAKLQlBUkszMTE2X1JDVihzZXJpYWwsMTE4LDB4RkUsMHhDMCwweDAwMDAsMHgwMDA0LCAweDAyLCBidWYpOwotCUFSSzMxMTZfU05EKHNlcmlhbCwxMTksMHhGRSwweDQwLDB4MDAwMCwweDAwMDQpOworCUFSSzMxMTZfUkNWKHNlcmlhbCwgMTE4LCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwNCwgMHgwMiwgYnVmKTsKKwlBUkszMTE2X1NORChzZXJpYWwsIDExOSwgMHhGRSwgMHg0MCwgMHgwMDAwLCAweDAwMDQpOwogCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLDEyMCwweEZFLDB4QzAsMHgwMDAwLDB4MDAwNCwgMHgwMCwgYnVmKTsKKwlBUkszMTE2X1JDVihzZXJpYWwsIDEyMCwgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDQsIDB4MDAsIGJ1Zik7CiAKLQlBUkszMTE2X1NORChzZXJpYWwsMTIxLDB4RkUsMHg0MCwweDAwMDEsMHgwMDA0KTsKKwlBUkszMTE2X1NORChzZXJpYWwsIDEyMSwgMHhGRSwgMHg0MCwgMHgwMDAxLCAweDAwMDQpOwogCi0JQVJLMzExNl9SQ1Yoc2VyaWFsLDEyMiwweEZFLDB4QzAsMHgwMDAwLDB4MDAwNCwgMHgwMSwgYnVmKTsKKwlBUkszMTE2X1JDVihzZXJpYWwsIDEyMiwgMHhGRSwgMHhDMCwgMHgwMDAwLCAweDAwMDQsIDB4MDEsIGJ1Zik7CiAKLQlBUkszMTE2X1NORChzZXJpYWwsMTIzLDB4RkUsMHg0MCwweDAwMDMsMHgwMDA0KTsKKwlBUkszMTE2X1NORChzZXJpYWwsIDEyMywgMHhGRSwgMHg0MCwgMHgwMDAzLCAweDAwMDQpOwogCi0JLyogcmV0dXJucyBkaWZmZXJlbnQgdmFsdWVzIChjb250cm9sIGxpbmVzID8hKSAqLwotCUFSSzMxMTZfUkNWKHNlcmlhbCwxMjQsMHhGRSwweEMwLDB4MDAwMCwweDAwMDYsIDB4RkYsIGJ1Zik7CisJLyogcmV0dXJucyBkaWZmZXJlbnQgdmFsdWVzIChjb250cm9sIGxpbmVzPyEpICovCisJQVJLMzExNl9SQ1Yoc2VyaWFsLCAxMjQsIDB4RkUsIDB4QzAsIDB4MDAwMCwgMHgwMDA2LCAweEZGLCBidWYpOwogCi0JLyogaW5pdGlhbGlzZSB0ZXJtaW9zOiAqLworCS8qIGluaXRpYWxpc2UgdGVybWlvcyAqLwogCWlmIChwb3J0LT50dHkpCiAJCWFyazMxMTZfc2V0X3Rlcm1pb3MocG9ydCwgJnRtcF90ZXJtaW9zKTsKIAogCWtmcmVlKGJ1Zik7CiAKIAlyZXR1cm4gcmVzdWx0OwotCiB9CiAKIHN0YXRpYyBpbnQgYXJrMzExNl9pb2N0bChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCSB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKLQlkYmcoImlvY3RsIG5vdCBzdXBwb3J0ZWQgeWV0Li4uIik7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3Qgc2Vyc3RydWN0OworCXZvaWQgX191c2VyICp1c2VyX2FyZyA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSU9DR1NFUklBTDoKKwkJLyogWFhYOiBTb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgcHJvYmFibHkgd3JvbmcuICovCisJCW1lbXNldCgmc2Vyc3RydWN0LCAwLCBzaXplb2YgKHNlcnN0cnVjdCkpOworCQlzZXJzdHJ1Y3QudHlwZSA9IFBPUlRfMTY2NTQ7CisJCXNlcnN0cnVjdC5saW5lID0gcG9ydC0+c2VyaWFsLT5taW5vcjsKKwkJc2Vyc3RydWN0LnBvcnQgPSBwb3J0LT5udW1iZXI7CisJCXNlcnN0cnVjdC5jdXN0b21fZGl2aXNvciA9IDA7CisJCXNlcnN0cnVjdC5iYXVkX2Jhc2UgPSA0NjA4MDA7CisKKwkJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2FyZywgJnNlcnN0cnVjdCwgc2l6ZW9mIChzZXJzdHJ1Y3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCWNhc2UgVElPQ1NTRVJJQUw6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc2Vyc3RydWN0LCB1c2VyX2FyZywgc2l6ZW9mIChzZXJzdHJ1Y3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlkYmcoIiVzIGNtZCAweCUwNHggbm90IHN1cHBvcnRlZCIsIF9fRlVOQ1RJT05fXywgY21kKTsKKwkJYnJlYWs7CisJfQorCiAJcmV0dXJuIC1FTk9JT0NUTENNRDsKIH0KIApAQCAtMzg5LDcgKzQxNiw3IEBACiAJY2hhciAqYnVmOwogCWNoYXIgdGVtcDsKIAotCS8qIHNlZW1zIGxpa2Ugc2VyaWFsIHBvcnQgc3RhdHVzIGluZm8gKFJUUywgQ1RTLC4uLikgaXMgc3RvcmVkCisJLyogc2VlbXMgbGlrZSBzZXJpYWwgcG9ydCBzdGF0dXMgaW5mbyAoUlRTLCBDVFMsIC4uLikgaXMgc3RvcmVkCiAJICogaW4gcmVnKD8pIDB4MDAwNgogCSAqIHBjYiBjb25uZWN0aW9uIHBvaW50IDExID0gR05EIC0+IHNldHMgYml0NCBvZiByZXNwb25zZQogCSAqIHBjYiBjb25uZWN0aW9uIHBvaW50ICA3ID0gR05EIC0+IHNldHMgYml0NiBvZiByZXNwb25zZQpAQCAtNDAxLDE2ICs0MjgsMTYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JLyogcmVhZCByZWdpc3RlcjogKi8KLQlBUkszMTE2X1JDVl9RVUlFVChzZXJpYWwsMHhGRSwweEMwLDB4MDAwMCwweDAwMDYsYnVmKTsKKwkvKiByZWFkIHJlZ2lzdGVyICovCisJQVJLMzExNl9SQ1ZfUVVJRVQoc2VyaWFsLCAweEZFLCAweEMwLCAweDAwMDAsIDB4MDAwNiwgYnVmKTsKIAl0ZW1wID0gYnVmWzBdOwogCWtmcmVlKGJ1Zik7CiAKLQkvKiBpIGRvIG5vdCByZWFsbHkga25vdyBpZiBiaXQ0PUNUUyBhbmQgYml0Nj1EU1IuLi4gd2FzIGp1c3QgYQotCSAqIHF1aWNrIGd1ZXNzICEhCisJLyogaSBkbyBub3QgcmVhbGx5IGtub3cgaWYgYml0ND1DVFMgYW5kIGJpdDY9RFNSLi4uIGp1c3QgYQorCSAqIHF1aWNrIGd1ZXNzIQogCSAqLwotCXJldHVybiAgKHRlbXAgJiAoMTw8NCkgPyBUSU9DTV9DVFMgOiAwKSB8Ci0JICAgICAgICAodGVtcCAmICgxPDw2KSA/IFRJT0NNX0RTUiA6IDApOworCXJldHVybiAodGVtcCAmICgxPDw0KSA/IFRJT0NNX0NUUyA6IDApCisJICAgICAgIHwgKHRlbXAgJiAoMTw8NikgPyBUSU9DTV9EU1IgOiAwKTsKIH0KIAogc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGFyazMxMTZfZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9jeXByZXNzX204LmMKaW5kZXggZWU3MGZkZC4uZTExNzNjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2N5cHJlc3NfbTguYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY3lwcmVzc19tOC5jCkBAIC0xMjksNiArMTI5LDkgQEAKIAlpbnQgY21kX2N0cmw7CQkJICAgLyogYWx3YXlzIHNldCB0aGlzIHRvIDEgYmVmb3JlIGlzc3VpbmcgYSBjb21tYW5kICovCiAJc3RydWN0IGN5cHJlc3NfYnVmICpidWY7CSAgIC8qIHdyaXRlIGJ1ZmZlciAqLwogCWludCB3cml0ZV91cmJfaW5fdXNlOwkJICAgLyogd3JpdGUgdXJiIGluIHVzZSBpbmRpY2F0b3IgKi8KKwlpbnQgd3JpdGVfdXJiX2ludGVydmFsOyAgICAgICAgICAgIC8qIGludGVydmFsIHRvIHVzZSBmb3Igd3JpdGUgdXJiICovCisJaW50IHJlYWRfdXJiX2ludGVydmFsOyAgICAgICAgICAgICAvKiBpbnRlcnZhbCB0byB1c2UgZm9yIHJlYWQgdXJiICovCisJaW50IGNvbW1faXNfb2s7ICAgICAgICAgICAgICAgICAgICAvKiB0cnVlIGlmIGNvbW11bmljYXRpb24gaXMgKHN0aWxsKSBvayAqLwogCWludCB0ZXJtaW9zX2luaXRpYWxpemVkOwogCV9fdTggbGluZV9jb250cm9sOwkgICAJICAgLyogaG9sZHMgZHRyIC8gcnRzIHZhbHVlICovCiAJX191OCBjdXJyZW50X3N0YXR1czsJICAgCSAgIC8qIHJlY2VpdmVkIGZyb20gbGFzdCByZWFkIC0gaW5mbyBvbiBkc3IsY3RzLGNkLHJpLGV0YyAqLwpAQCAtMTY4LDYgKzE3MSw3IEBACiBzdGF0aWMgaW50ICBjeXByZXNzX2NoYXJzX2luX2J1ZmZlcgkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CiBzdGF0aWMgdm9pZCBjeXByZXNzX3Rocm90dGxlCQkoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7CiBzdGF0aWMgdm9pZCBjeXByZXNzX3VudGhyb3R0bGUJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKK3N0YXRpYyB2b2lkIGN5cHJlc3Nfc2V0X2RlYWQJCShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKIHN0YXRpYyB2b2lkIGN5cHJlc3NfcmVhZF9pbnRfY2FsbGJhY2sJKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogc3RhdGljIHZvaWQgY3lwcmVzc193cml0ZV9pbnRfY2FsbGJhY2sJKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogLyogYmF1ZCBoZWxwZXIgZnVuY3Rpb25zICovCkBAIC0yODgsNiArMjkyLDkgQEAKIAkKIAlwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCisJaWYgKCFwcml2LT5jb21tX2lzX29rKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXN3aXRjaChjeXByZXNzX3JlcXVlc3RfdHlwZSkgewogCQljYXNlIENZUFJFU1NfU0VUX0NPTkZJRzoKIApAQCAtMzY1LDEzICszNzIsMTIgQEAKIAkJCQlpZiAodHJpZXMrKyA+PSAzKQogCQkJCQlicmVhazsKIAotCQkJCWlmIChyZXR2YWwgPT0gRVBJUEUpCi0JCQkJCXVzYl9jbGVhcl9oYWx0KHBvcnQtPnNlcmlhbC0+ZGV2LCAweDAwKTsKLQkJCX0gd2hpbGUgKHJldHZhbCAhPSA4ICYmIHJldHZhbCAhPSBFTk9ERVYpOworCQkJfSB3aGlsZSAocmV0dmFsICE9IDggJiYgcmV0dmFsICE9IC1FTk9ERVYpOwogCi0JCQlpZiAocmV0dmFsICE9IDgpCisJCQlpZiAocmV0dmFsICE9IDgpIHsKIAkJCQllcnIoIiVzIC0gZmFpbGVkIHNlbmRpbmcgc2VyaWFsIGxpbmUgc2V0dGluZ3MgLSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0dmFsKTsKLQkJCWVsc2UgeworCQkJCWN5cHJlc3Nfc2V0X2RlYWQocG9ydCk7CisJCQl9IGVsc2UgewogCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJCQkJcHJpdi0+YmF1ZF9yYXRlID0gbmV3X2JhdWRyYXRlOwogCQkJCXByaXYtPmNicl9tYXNrID0gYmF1ZF9tYXNrOwpAQCAtMzkyLDEyICszOTgsMTEgQEAKIAkJCQlpZiAodHJpZXMrKyA+PSAzKQogCQkJCQlicmVhazsKIAotCQkJCWlmIChyZXR2YWwgPT0gRVBJUEUpCi0JCQkJCXVzYl9jbGVhcl9oYWx0KHBvcnQtPnNlcmlhbC0+ZGV2LCAweDAwKTsKLQkJCX0gd2hpbGUgKHJldHZhbCAhPSA1ICYmIHJldHZhbCAhPSBFTk9ERVYpOworCQkJfSB3aGlsZSAocmV0dmFsICE9IDUgJiYgcmV0dmFsICE9IC1FTk9ERVYpOwogCiAJCQlpZiAocmV0dmFsICE9IDUpIHsKIAkJCQllcnIoIiVzIC0gZmFpbGVkIHRvIHJldHJpZXZlIHNlcmlhbCBsaW5lIHNldHRpbmdzIC0gJWQiLCBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisJCQkJY3lwcmVzc19zZXRfZGVhZChwb3J0KTsKIAkJCQlyZXR1cm4gcmV0dmFsOwogCQkJfSBlbHNlIHsKIAkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtNDE5LDYgKzQyNCwyNCBAQAogfSAvKiBjeXByZXNzX3NlcmlhbF9jb250cm9sICovCiAKIAorc3RhdGljIHZvaWQgY3lwcmVzc19zZXRfZGVhZChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBjeXByZXNzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJaWYgKCFwcml2LT5jb21tX2lzX29rKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlwcml2LT5jb21tX2lzX29rID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwllcnIoImN5cHJlc3NfbTggc3VzcGVuZGluZyBmYWlsaW5nIHBvcnQgJWQgLSBpbnRlcnZhbCBtaWdodCBiZSB0b28gc2hvcnQiLAorCSAgICBwb3J0LT5udW1iZXIpOworfQorCisKIC8qIGdpdmVuIGEgYmF1ZCBtYXNrLCBpdCB3aWxsIHJldHVybiBpbnRlZ2VyIGJhdWQgb24gc3VjY2VzcyAqLwogc3RhdGljIGludCBtYXNrX3RvX3JhdGUgKHVuc2lnbmVkIG1hc2spCiB7CkBAIC00NzIsMTMgKzQ5NSwxNSBAQAogc3RhdGljIGludCBnZW5lcmljX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7CiAJc3RydWN0IGN5cHJlc3NfcHJpdmF0ZSAqcHJpdjsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gc2VyaWFsLT5wb3J0WzBdOwogCi0JZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHNlcmlhbC0+cG9ydFswXS0+bnVtYmVyKTsKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKIAogCXByaXYgPSBremFsbG9jKHNpemVvZiAoc3RydWN0IGN5cHJlc3NfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwogCWlmICghcHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlwcml2LT5jb21tX2lzX29rID0gITA7CiAJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwogCXByaXYtPmJ1ZiA9IGN5cHJlc3NfYnVmX2FsbG9jKENZUFJFU1NfQlVGX1NJWkUpOwogCWlmIChwcml2LT5idWYgPT0gTlVMTCkgewpAQCAtNDg5LDEzICs1MTQsMjQgQEAKIAkKIAl1c2JfcmVzZXRfY29uZmlndXJhdGlvbiAoc2VyaWFsLT5kZXYpOwogCQotCWludGVydmFsID0gMTsKIAlwcml2LT5jbWRfY3RybCA9IDA7CiAJcHJpdi0+bGluZV9jb250cm9sID0gMDsKIAlwcml2LT50ZXJtaW9zX2luaXRpYWxpemVkID0gMDsKIAlwcml2LT5yeF9mbGFncyA9IDA7CiAJcHJpdi0+Y2JyX21hc2sgPSBCMzAwOwotCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0sIHByaXYpOworCWlmIChpbnRlcnZhbCA+IDApIHsKKwkJcHJpdi0+d3JpdGVfdXJiX2ludGVydmFsID0gaW50ZXJ2YWw7CisJCXByaXYtPnJlYWRfdXJiX2ludGVydmFsID0gaW50ZXJ2YWw7CisJCWRiZygiJXMgLSBwb3J0ICVkIHJlYWQgJiB3cml0ZSBpbnRlcnZhbHMgZm9yY2VkIHRvICVkIiwKKwkJICAgIF9fRlVOQ1RJT05fXyxwb3J0LT5udW1iZXIsaW50ZXJ2YWwpOworCX0gZWxzZSB7CisJCXByaXYtPndyaXRlX3VyYl9pbnRlcnZhbCA9IHBvcnQtPmludGVycnVwdF9vdXRfdXJiLT5pbnRlcnZhbDsKKwkJcHJpdi0+cmVhZF91cmJfaW50ZXJ2YWwgPSBwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5pbnRlcnZhbDsKKwkJZGJnKCIlcyAtIHBvcnQgJWQgaW50ZXJ2YWxzOiByZWFkPSVkIHdyaXRlPSVkIiwKKwkJICAgIF9fRlVOQ1RJT05fXyxwb3J0LT5udW1iZXIsCisJCSAgICBwcml2LT5yZWFkX3VyYl9pbnRlcnZhbCxwcml2LT53cml0ZV91cmJfaW50ZXJ2YWwpOworCX0KKwl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCwgcHJpdik7CiAJCiAJcmV0dXJuIDA7CiB9CkBAIC01ODUsNiArNjIxLDkgQEAKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCisJaWYgKCFwcml2LT5jb21tX2lzX29rKQorCQlyZXR1cm4gLUVJTzsKKwogCS8qIGNsZWFyIGhhbHRzIGJlZm9yZSBvcGVuICovCiAJdXNiX2NsZWFyX2hhbHQoc2VyaWFsLT5kZXYsIDB4ODEpOwogCXVzYl9jbGVhcl9oYWx0KHNlcmlhbC0+ZGV2LCAweDAyKTsKQEAgLTYyNCwxMSArNjYzLDEyIEBACiAJdXNiX2ZpbGxfaW50X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBzZXJpYWwtPmRldiwKIAkJdXNiX3JjdmludHBpcGUoc2VyaWFsLT5kZXYsIHBvcnQtPmludGVycnVwdF9pbl9lbmRwb2ludEFkZHJlc3MpLAogCQlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXIsIHBvcnQtPmludGVycnVwdF9pbl91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCi0JCWN5cHJlc3NfcmVhZF9pbnRfY2FsbGJhY2ssIHBvcnQsIGludGVydmFsKTsKKwkJY3lwcmVzc19yZWFkX2ludF9jYWxsYmFjaywgcG9ydCwgcHJpdi0+cmVhZF91cmJfaW50ZXJ2YWwpOwogCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIEdGUF9LRVJORUwpOwogCiAJaWYgKHJlc3VsdCl7CiAJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWN5cHJlc3Nfc2V0X2RlYWQocG9ydCk7CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTczMyw2ICs3NzMsOSBAQAogCXN0cnVjdCBjeXByZXNzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkKKwlpZiAoIXByaXYtPmNvbW1faXNfb2spCisJCXJldHVybjsKKwogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCWRiZygiJXMgLSBpbnRlcnJ1cHQgb3V0IHNpemUgaXMgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPmludGVycnVwdF9vdXRfc2l6ZSk7CiAJCkBAIC04MDYsMTQgKzg0OSwxNiBAQAogCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCBwb3J0LT5pbnRlcnJ1cHRfb3V0X3NpemUsCiAJCQkgICAgICBwb3J0LT5pbnRlcnJ1cHRfb3V0X3VyYi0+dHJhbnNmZXJfYnVmZmVyKTsKIAotCXBvcnQtPmludGVycnVwdF9vdXRfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gYWN0dWFsX3NpemU7Ci0JcG9ydC0+aW50ZXJydXB0X291dF91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwotCXBvcnQtPmludGVycnVwdF9vdXRfdXJiLT5pbnRlcnZhbCA9IGludGVydmFsOworCXVzYl9maWxsX2ludF91cmIocG9ydC0+aW50ZXJydXB0X291dF91cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LAorCQl1c2Jfc25kaW50cGlwZShwb3J0LT5zZXJpYWwtPmRldiwgcG9ydC0+aW50ZXJydXB0X291dF9lbmRwb2ludEFkZHJlc3MpLAorCQlwb3J0LT5pbnRlcnJ1cHRfb3V0X2J1ZmZlciwgcG9ydC0+aW50ZXJydXB0X291dF9zaXplLAorCQljeXByZXNzX3dyaXRlX2ludF9jYWxsYmFjaywgcG9ydCwgcHJpdi0+d3JpdGVfdXJiX2ludGVydmFsKTsKIAlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYiAocG9ydC0+aW50ZXJydXB0X291dF91cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXN1bHQpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sCiAJCQlyZXN1bHQpOwogCQlwcml2LT53cml0ZV91cmJfaW5fdXNlID0gMDsKKwkJY3lwcmVzc19zZXRfZGVhZChwb3J0KTsKIAl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtMTIxNCwxMyArMTI1OSwxOCBAQAogCXByaXYtPnJ4X2ZsYWdzID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKKwlpZiAoIXByaXYtPmNvbW1faXNfb2spCisJCXJldHVybjsKKwogCWlmIChhY3R1YWxseV90aHJvdHRsZWQpIHsKIAkJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+ZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CiAKIAkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0FUT01JQyk7Ci0JCWlmIChyZXN1bHQpCisJCWlmIChyZXN1bHQpIHsKIAkJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsICIKIAkJCQkJImVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQljeXByZXNzX3NldF9kZWFkKHBvcnQpOworCQl9CiAJfQogfQogCkBAIC0xMjQwLDkgKzEyOTAsMjIgQEAKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCi0JaWYgKHVyYi0+c3RhdHVzKSB7Ci0JCWRiZygiJXMgLSBub256ZXJvIHJlYWQgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywKLQkJCQl1cmItPnN0YXR1cyk7CisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDogLyogc3VjY2VzcyAqLworCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCS8qIHByZWN1cnNvciB0byBkaXNjb25uZWN0IHNvIGp1c3QgZ28gYXdheSAqLworCQlyZXR1cm47CisJY2FzZSAtRVBJUEU6CisJCXVzYl9jbGVhcl9oYWx0KHBvcnQtPnNlcmlhbC0+ZGV2LDB4ODEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBzb21ldGhpbmcgdWdseSBpcyBnb2luZyBvbi4uLiAqLworCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCIlcyAtIHVuZXhwZWN0ZWQgbm9uemVybyByZWFkIHN0YXR1cyByZWNlaXZlZDogJWRcbiIsCisJCQlfX0ZVTkNUSU9OX18sdXJiLT5zdGF0dXMpOworCQljeXByZXNzX3NldF9kZWFkKHBvcnQpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMzQzLDE4ICsxNDA2LDIwIEBACiAKIAkvKiBDb250aW51ZSB0cnlpbmcgdG8gYWx3YXlzIHJlYWQuLi4gdW5sZXNzIHRoZSBwb3J0IGhhcyBjbG9zZWQuICovCiAKLQlpZiAocG9ydC0+b3Blbl9jb3VudCA+IDApIHsKKwlpZiAocG9ydC0+b3Blbl9jb3VudCA+IDAgJiYgcHJpdi0+Y29tbV9pc19vaykgewogCQl1c2JfZmlsbF9pbnRfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIsIHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCXVzYl9yY3ZpbnRwaXBlKHBvcnQtPnNlcmlhbC0+ZGV2LAogCQkJCQlwb3J0LT5pbnRlcnJ1cHRfaW5fZW5kcG9pbnRBZGRyZXNzKSwKIAkJCQlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT50cmFuc2Zlcl9idWZmZXIsCiAJCQkJcG9ydC0+aW50ZXJydXB0X2luX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKLQkJCQljeXByZXNzX3JlYWRfaW50X2NhbGxiYWNrLCBwb3J0LCBpbnRlcnZhbCk7CisJCQkJY3lwcmVzc19yZWFkX2ludF9jYWxsYmFjaywgcG9ydCwgcHJpdi0+cmVhZF91cmJfaW50ZXJ2YWwpOwogCQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKHJlc3VsdCkKKwkJaWYgKHJlc3VsdCkgewogCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gZmFpbGVkIHJlc3VibWl0dGluZyAiCiAJCQkJCSJyZWFkIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywKIAkJCQkJcmVzdWx0KTsKKwkJCWN5cHJlc3Nfc2V0X2RlYWQocG9ydCk7CisJCX0KIAl9CiAKIAlyZXR1cm47CkBAIC0xMzgwLDIwICsxNDQ1LDI2IEBACiAJCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CiAJCQlwcml2LT53cml0ZV91cmJfaW5fdXNlID0gMDsKIAkJCXJldHVybjsKLQkJY2FzZSAtRVBJUEU6IC8qIG5vIGJyZWFrIG5lZWRlZCAqLworCQljYXNlIC1FUElQRTogLyogbm8gYnJlYWsgbmVlZGVkOyBjbGVhciBoYWx0IGFuZCByZXN1Ym1pdCAqLworCQkJaWYgKCFwcml2LT5jb21tX2lzX29rKQorCQkJCWJyZWFrOwogCQkJdXNiX2NsZWFyX2hhbHQocG9ydC0+c2VyaWFsLT5kZXYsIDB4MDIpOwotCQlkZWZhdWx0OgogCQkJLyogZXJyb3IgaW4gdGhlIHVyYiwgc28gd2UgaGF2ZSB0byByZXN1Ym1pdCBpdCAqLwotCQkJZGJnKCIlcyAtIE92ZXJmbG93IGluIHdyaXRlIiwgX19GVU5DVElPTl9fKTsKIAkJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwogCQkJcG9ydC0+aW50ZXJydXB0X291dF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSAxOwogCQkJcG9ydC0+aW50ZXJydXB0X291dF91cmItPmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OwogCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X291dF91cmIsIEdGUF9BVE9NSUMpOwotCQkJaWYgKHJlc3VsdCkKLQkJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgcmVzdWx0KTsKLQkJCWVsc2UKKwkJCWlmICghcmVzdWx0KQogCQkJCXJldHVybjsKKwkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgd3JpdGUgdXJiLCBlcnJvciAlZFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQljeXByZXNzX3NldF9kZWFkKHBvcnQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCIlcyAtIHVuZXhwZWN0ZWQgbm9uemVybyB3cml0ZSBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAorCQkJCV9fRlVOQ1RJT05fXyx1cmItPnN0YXR1cyk7CisJCQljeXByZXNzX3NldF9kZWFkKHBvcnQpOworCQkJYnJlYWs7CiAJfQogCQogCXByaXYtPndyaXRlX3VyYl9pbl91c2UgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYwppbmRleCBjNjExNWFhLi4xZjdiNzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYwpAQCAtMTEwMSwyNSArMTEwMSwyOSBAQAogc3RhdGljIERFVklDRV9BVFRSKGxhdGVuY3lfdGltZXIsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2xhdGVuY3lfdGltZXIsIHN0b3JlX2xhdGVuY3lfdGltZXIpOwogc3RhdGljIERFVklDRV9BVFRSKGV2ZW50X2NoYXIsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX2V2ZW50X2NoYXIpOwogCi1zdGF0aWMgdm9pZCBjcmVhdGVfc3lzZnNfYXR0cnMoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKLXsJCitzdGF0aWMgaW50IGNyZWF0ZV9zeXNmc19hdHRycyhzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQorewogCXN0cnVjdCBmdGRpX3ByaXZhdGUgKnByaXY7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJaW50IHJldHZhbCA9IDA7CiAKIAlkYmcoIiVzIixfX0ZVTkNUSU9OX18pOwotCQorCiAJcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0pOwogCXVkZXYgPSBzZXJpYWwtPmRldjsKLQkKKwogCS8qIFhYWCBJJ3ZlIG5vIGlkZWEgaWYgdGhlIG9yaWdpbmFsIFNJTyBzdXBwb3J0cyB0aGUgZXZlbnRfY2hhcgogCSAqIHN5c2ZzIHBhcmFtZXRlciwgc28gSSdtIHBsYXlpbmcgaXQgc2FmZS4gICovCiAJaWYgKHByaXYtPmNoaXBfdHlwZSAhPSBTSU8pIHsKIAkJZGJnKCJzeXNmcyBhdHRyaWJ1dGVzIGZvciAlcyIsIGZ0ZGlfY2hpcF9uYW1lW3ByaXYtPmNoaXBfdHlwZV0pOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJnVkZXYtPmRldiwgJmRldl9hdHRyX2V2ZW50X2NoYXIpOwotCQlpZiAocHJpdi0+Y2hpcF90eXBlID09IEZUMjMyQk0gfHwgcHJpdi0+Y2hpcF90eXBlID09IEZUMjIzMkMpIHsKLQkJCWRldmljZV9jcmVhdGVfZmlsZSgmdWRldi0+ZGV2LCAmZGV2X2F0dHJfbGF0ZW5jeV90aW1lcik7CisJCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmdWRldi0+ZGV2LCAmZGV2X2F0dHJfZXZlbnRfY2hhcik7CisJCWlmICgoIXJldHZhbCkgJiYKKwkJICAgIChwcml2LT5jaGlwX3R5cGUgPT0gRlQyMzJCTSB8fCBwcml2LT5jaGlwX3R5cGUgPT0gRlQyMjMyQykpIHsKKwkJCXJldHZhbCA9IGRldmljZV9jcmVhdGVfZmlsZSgmdWRldi0+ZGV2LAorCQkJCQkJICAgICZkZXZfYXR0cl9sYXRlbmN5X3RpbWVyKTsKIAkJfQogCX0KKwlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgdm9pZCByZW1vdmVfc3lzZnNfYXR0cnMoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKQEAgLTExNjIsNyArMTE2Niw4IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHNlcmlhbC0+cG9ydFswXTsKIAlzdHJ1Y3QgZnRkaV9wcml2YXRlICpwcml2OwogCXN0cnVjdCBmdGRpX3Npb19xdWlyayAqcXVpcms7Ci0JCisJaW50IHJldHZhbDsKKwogCWRiZygiJXMiLF9fRlVOQ1RJT05fXyk7CiAKIAlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZ0ZGlfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwpAQCAtMTIwMywxNSArMTIwOCwxOCBAQAogCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbMF0sIHByaXYpOwogCiAJZnRkaV9kZXRlcm1pbmVfdHlwZSAoc2VyaWFsLT5wb3J0WzBdKTsKLQljcmVhdGVfc3lzZnNfYXR0cnMoc2VyaWFsKTsKKwlyZXR2YWwgPSBjcmVhdGVfc3lzZnNfYXR0cnMoc2VyaWFsKTsKKwlpZiAocmV0dmFsKQorCQlkZXZfZXJyKCZzZXJpYWwtPmRldi0+ZGV2LCAiRXJyb3IgY3JlYXRpbmcgc3lzZnMgZmlsZXMsICIKKwkJCSJjb250aW51aW5nXG4iKTsKIAogCS8qIENoZWNrIGZvciBkZXZpY2UgcmVxdWlyaW5nIHNwZWNpYWwgc2V0IHVwLiAqLwogCXF1aXJrID0gKHN0cnVjdCBmdGRpX3Npb19xdWlyayAqKXVzYl9nZXRfc2VyaWFsX2RhdGEoc2VyaWFsKTsKIAlpZiAocXVpcmsgJiYgcXVpcmstPnNldHVwKSB7CiAJCXF1aXJrLT5zZXR1cChzZXJpYWwpOwogCX0KLQkKLQlyZXR1cm4gKDApOworCisJcmV0dXJuIDA7CiB9IC8qIGZ0ZGlfc2lvX2F0dGFjaCAqLwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZ2FybWluX2dwcy5jCmluZGV4IDcyNzg1MjYuLjRiMTE5NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9nYXJtaW5fZ3BzLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2dhcm1pbl9ncHMuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBHYXJtaW4gR1BTIGRyaXZlcgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwNCBIZXJtYW5uIEtuZWlzc2VsIGhlcmtuZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKKyAqIENvcHlyaWdodCAoQykgMjAwNiBIZXJtYW5uIEtuZWlzc2VsIGhlcmtuZUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQKICAqCiAgKiBUaGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIGRyaXZlciBjYW4gYmUgZm91bmQgYXQKICAqIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZ2FybWluLWdwcy8KQEAgLTM3LDYgKzM3LDggQEAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC91c2Ivc2VyaWFsLmg+CiAKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKIC8qIHRoZSBtb2RlIHRvIGJlIHNldCB3aGVuIHRoZSBwb3J0IGlzdCBvcGVuZWQgKi8KIHN0YXRpYyBpbnQgaW5pdGlhbF9tb2RlID0gMTsKIApAQCAtNTAsNyArNTIsNyBAQAogICovCiAKICNkZWZpbmUgVkVSU0lPTl9NQUpPUgkwCi0jZGVmaW5lIFZFUlNJT05fTUlOT1IJMjMKKyNkZWZpbmUgVkVSU0lPTl9NSU5PUgkyOAogCiAjZGVmaW5lIF9TVFIocykgI3MKICNkZWZpbmUgX0RSSVZFUl9WRVJTSU9OKGEsYikgInYiIF9TVFIoYSkgIi4iIF9TVFIoYikKQEAgLTE2NCw3ICsxNjYsOCBAQAogI2RlZmluZSBGTEFHU19TRVNTSU9OX1JFUExZMV9TRUVOIDB4MDA4MAogI2RlZmluZSBGTEFHU19TRVNTSU9OX1JFUExZMl9TRUVOIDB4MDA0MAogI2RlZmluZSBGTEFHU19CVUxLX0lOX0FDVElWRSAgICAgIDB4MDAyMAotI2RlZmluZSBGTEFHU19USFJPVFRMRUQgICAgICAgICAgIDB4MDAxMAorI2RlZmluZSBGTEFHU19CVUxLX0lOX1JFU1RBUlQgICAgIDB4MDAxMAorI2RlZmluZSBGTEFHU19USFJPVFRMRUQgICAgICAgICAgIDB4MDAwOAogI2RlZmluZSBDTEVBUl9IQUxUX1JFUVVJUkVEICAgICAgIDB4MDAwMQogCiAjZGVmaW5lIEZMQUdTX1FVRVVJTkcgICAgICAgICAgICAgMHgwMTAwCkBAIC0yMjQsNyArMjI3LDcgQEAKIAkucHJvYmUgPQl1c2Jfc2VyaWFsX3Byb2JlLAogCS5kaXNjb25uZWN0ID0JdXNiX3NlcmlhbF9kaXNjb25uZWN0LAogCS5pZF90YWJsZSA9CWlkX3RhYmxlLAotCS5ub19keW5hbWljX2lkID0gCTEsCisJLm5vX2R5bmFtaWNfaWQgPSAxLAogfTsKIAogCkBAIC0yNzAsNyArMjczLDcgQEAKIAogCiBzdGF0aWMgdm9pZCBzZW5kX3RvX3R0eShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IGFjdHVhbF9sZW5ndGgpCisJCQljaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgYWN0dWFsX2xlbmd0aCkKIHsKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gcG9ydC0+dHR5OwogCkBAIC0yOTQsMTUgKzI5NywxNSBAQAogICogcXVldWUgYSByZWNlaXZlZCAodXNiLSlwYWNrZXQgZm9yIGxhdGVyIHByb2Nlc3NpbmcKICAqLwogc3RhdGljIGludCBwa3RfYWRkKHN0cnVjdCBnYXJtaW5fZGF0YSAqIGdhcm1pbl9kYXRhX3AsCi0gICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IGRhdGFfbGVuZ3RoKQorCQkgICB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YV9sZW5ndGgpCiB7CisJaW50IHN0YXRlID0gMDsKIAlpbnQgcmVzdWx0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBnYXJtaW5fcGFja2V0ICpwa3Q7CiAKIAkvKiBwcm9jZXNzIG9ubHkgcGFja2V0cyBjb250YWluZyBkYXRhIC4uLiAqLwogCWlmIChkYXRhX2xlbmd0aCkgewotCQlnYXJtaW5fZGF0YV9wLT5mbGFncyB8PSBGTEFHU19RVUVVSU5HOwogCQlwa3QgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZ2FybWluX3BhY2tldCkrZGF0YV9sZW5ndGgsCiAJCSAgICAgICAgICAgICAgR0ZQX0FUT01JQyk7CiAJCWlmIChwa3QgPT0gTlVMTCkgewpAQCAtMzEzLDE0ICszMTYsMTYgQEAKIAkJbWVtY3B5KHBrdC0+ZGF0YSwgZGF0YSwgZGF0YV9sZW5ndGgpOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CisJCWdhcm1pbl9kYXRhX3AtPmZsYWdzIHw9IEZMQUdTX1FVRVVJTkc7CiAJCXJlc3VsdCA9IGxpc3RfZW1wdHkoJmdhcm1pbl9kYXRhX3AtPnBrdGxpc3QpOwogCQlwa3QtPnNlcSA9IGdhcm1pbl9kYXRhX3AtPnNlcV9jb3VudGVyKys7CiAJCWxpc3RfYWRkX3RhaWwoJnBrdC0+bGlzdCwgJmdhcm1pbl9kYXRhX3AtPnBrdGxpc3QpOworCQlzdGF0ZSA9IGdhcm1pbl9kYXRhX3AtPnN0YXRlOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAKIAkJLyogaW4gc2VyaWFsIG1vZGUsIGlmIHNvbWVvbmUgaXMgd2FpdGluZyBmb3IgZGF0YSBmcm9tCiAJCSAgIHRoZSBkZXZpY2UsIGljb252ZXJ0IGFuZCBzZW5kIHRoZSBuZXh0IHBhY2tldCB0byB0dHkuICovCi0JCWlmIChyZXN1bHQgJiYgKGdhcm1pbl9kYXRhX3AtPnN0YXRlID09IFNUQVRFX0dTUF9XQUlUX0RBVEEpKSB7CisJCWlmIChyZXN1bHQgJiYgKHN0YXRlID09IFNUQVRFX0dTUF9XQUlUX0RBVEEpKSB7CiAJCQlnc3BfbmV4dF9wYWNrZXQoZ2FybWluX2RhdGFfcCk7CiAJCX0KIAl9CkBAIC0zNzAsOSArMzc1LDkgQEAKIHN0YXRpYyBpbnQgZ3NwX3NlbmRfYWNrKHN0cnVjdCBnYXJtaW5fZGF0YSAqIGdhcm1pbl9kYXRhX3AsIF9fdTggcGt0X2lkKQogewogCV9fdTggcGt0WzEwXTsKLSAgICAgICAgX191OCBja3N1bSA9IDA7Ci0gICAgICAgIF9fdTggKnB0ciA9IHBrdDsKLSAgICAgICAgdW5zaWduZWQgIGwgPSAwOworCV9fdTggY2tzdW0gPSAwOworCV9fdTggKnB0ciA9IHBrdDsKKwl1bnNpZ25lZCAgbCA9IDA7CiAKIAlkYmcoIiVzIC0gcGt0LWlkOiAweCVYLiIsIF9fRlVOQ1RJT05fXywgMHhGRiAmIHBrdF9pZCk7CiAKQEAgLTQxNiw3ICs0MjEsNyBAQAogc3RhdGljIGludCBnc3BfcmVjX3BhY2tldChzdHJ1Y3QgZ2FybWluX2RhdGEgKiBnYXJtaW5fZGF0YV9wLCBpbnQgY291bnQpCiB7CiAJY29uc3QgX191OCogcmVjcGt0ID0gZ2FybWluX2RhdGFfcC0+aW5idWZmZXIrR1NQX0lOSVRJQUxfT0ZGU0VUOwotICAgICAgICBfX2xlMzIgKnVzYmRhdGEgPSAoX19sZTMyICopIGdhcm1pbl9kYXRhX3AtPmluYnVmZmVyOworCV9fbGUzMiAqdXNiZGF0YSA9IChfX2xlMzIgKikgZ2FybWluX2RhdGFfcC0+aW5idWZmZXI7CiAKIAlpbnQgY2tzdW0gPSAwOwogCWludCBuID0gMDsKQEAgLTQ0NywxMSArNDUyLDExIEBACiAJCW4rKzsKIAl9CiAKLSAgICAgICBpZiAoKDB4ZmYgJiAoY2tzdW0gKyAqcmVjcGt0KSkgIT0gMCkgewotICAgICAgICAgICAgICAgIGRiZygiJXMgLSBpbnZhbGlkIGNoZWNrc3VtLCBleHBlY3RlZCAlMDJ4LCBnb3QgJTAyeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIDB4ZmYgJiAtY2tzdW0sIDB4ZmYgJiAqcmVjcGt0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZQS1Q7Ci0gICAgICAgIH0KKwlpZiAoKDB4ZmYgJiAoY2tzdW0gKyAqcmVjcGt0KSkgIT0gMCkgeworCQlkYmcoIiVzIC0gaW52YWxpZCBjaGVja3N1bSwgZXhwZWN0ZWQgJTAyeCwgZ290ICUwMngiLAorCQkJX19GVU5DVElPTl9fLCAweGZmICYgLWNrc3VtLCAweGZmICYgKnJlY3BrdCk7CisJCXJldHVybiAtRUlOVlBLVDsKKwl9CiAKIAl1c2JkYXRhWzBdID0gX19jcHVfdG9fbGUzMihHQVJNSU5fTEFZRVJJRF9BUFBMKTsKIAl1c2JkYXRhWzFdID0gX19jcHVfdG9fbGUzMihwa3RpZCk7CkBAIC00OTEsMjAgKzQ5NiwyOCBAQAogICovCiAKIHN0YXRpYyBpbnQgZ3NwX3JlY2VpdmUoc3RydWN0IGdhcm1pbl9kYXRhICogZ2FybWluX2RhdGFfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCisJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBvZmZzID0gMDsKIAlpbnQgYWNrX29yX25ha19zZWVuID0gMDsKIAlpbnQgaSA9IDA7Ci0JX191OCAqZGVzdCA9IGdhcm1pbl9kYXRhX3AtPmluYnVmZmVyOwotCWludCBzaXplID0gZ2FybWluX2RhdGFfcC0+aW5zaXplOworCV9fdTggKmRlc3Q7CisJaW50IHNpemU7CiAJLy8gZGxlU2Vlbjogc2V0IGlmIGxhc3QgYnl0ZSByZWFkIHdhcyBhIERMRQotCWludCBkbGVTZWVuID0gZ2FybWluX2RhdGFfcC0+ZmxhZ3MgJiBGTEFHU19HU1BfRExFU0VFTjsKKwlpbnQgZGxlU2VlbjsKIAkvLyBza2lwOiBpZiBzZXQsIHNraXAgaW5jb21pbmcgZGF0YSB1bnRpbCBwb3NzaWJsZSBzdGFydCBvZgogCS8vICAgICAgIG5ldyBwYWNrZXQKLQlpbnQgc2tpcCA9IGdhcm1pbl9kYXRhX3AtPmZsYWdzICYgRkxBR1NfR1NQX1NLSVA7CisJaW50IHNraXA7CiAJX191OCBkYXRhOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKKwlkZXN0ID0gZ2FybWluX2RhdGFfcC0+aW5idWZmZXI7CisJc2l6ZSA9IGdhcm1pbl9kYXRhX3AtPmluc2l6ZTsKKwlkbGVTZWVuID0gZ2FybWluX2RhdGFfcC0+ZmxhZ3MgJiBGTEFHU19HU1BfRExFU0VFTjsKKwlza2lwID0gZ2FybWluX2RhdGFfcC0+ZmxhZ3MgJiBGTEFHU19HU1BfU0tJUDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CisKIAlkYmcoIiVzIC0gZGxlPSVkIHNraXA9JWQgc2l6ZT0lZCBjb3VudD0lZCIsCiAJCV9fRlVOQ1RJT05fXywgZGxlU2Vlbiwgc2tpcCwgc2l6ZSwgY291bnQpOwogCkBAIC01NzIsNiArNTg1LDggQEAKIAkJfQogCX0KIAorCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CisKIAlnYXJtaW5fZGF0YV9wLT5pbnNpemUgPSBzaXplOwogCiAJLy8gY29weSBmbGFncyBiYWNrIHRvIHN0cnVjdHVyZQpAQCAtNTg3LDYgKzYwMiwxMSBAQAogCiAJaWYgKGFja19vcl9uYWtfc2VlbikgewogCQlnYXJtaW5fZGF0YV9wLT5zdGF0ZSA9IFNUQVRFX0dTUF9XQUlUX0RBVEE7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGFja19vcl9uYWtfc2VlbikgewogCQlnc3BfbmV4dF9wYWNrZXQoZ2FybWluX2RhdGFfcCk7CiAJfQogCkBAIC02NzYsNyArNjk2LDcgQEAKIAlzcmMgPSBnYXJtaW5fZGF0YV9wLT5vdXRidWZmZXIrR0FSTUlOX1BLVEhEUl9MRU5HVEg7CiAJaWYgKGsgPiAoR0FSTUlOX1BLVEhEUl9MRU5HVEgtMikpIHsKIAkJLyogY2FuJ3QgYWRkIHN0dWZmaW5nIERMRXMgaW4gcGxhY2UsIG1vdmUgZGF0YSB0byBlbmQgCi0gICAgICAgICAgICAgICAgICAgb2YgYnVmZmVyIC4uLiAqLworCQkgICBvZiBidWZmZXIgLi4uICovCiAJCWRzdCA9IGdhcm1pbl9kYXRhX3AtPm91dGJ1ZmZlcitHUFNfT1VUX0JVRlNJWi1kYXRhbGVuOwogCQltZW1jcHkoZHN0LCBzcmMsIGRhdGFsZW4pOwogCQlzcmMgPSBkc3Q7CkBAIC03NTUsOCArNzc1LDkgQEAKICAqIG9yIGV2ZW4gaW5jb21wbGV0ZSBwYWNrZXRzCiAgKi8KIHN0YXRpYyBpbnQgbmF0X3JlY2VpdmUoc3RydWN0IGdhcm1pbl9kYXRhICogZ2FybWluX2RhdGFfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCisJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCV9fdTggKiBkZXN0OwogCWludCBvZmZzID0gMDsKIAlpbnQgcmVzdWx0ID0gY291bnQ7CkBAIC04MDMsNyArODI0LDkgQEAKIAkJCQkvKiBpZiB0aGlzIHdhcyBhbiBhYm9ydC10cmFuc2ZlciBjb21tYW5kLAogCQkJCSAgIGZsdXNoIGFsbCBxdWV1ZWQgZGF0YS4gKi8KIAkJCQlpZiAoaXNBYm9ydFRyZkNtbmQoZ2FybWluX2RhdGFfcC0+aW5idWZmZXIpKSB7CisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAJCQkJCWdhcm1pbl9kYXRhX3AtPmZsYWdzIHw9IEZMQUdTX0RST1BfREFUQTsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCQkJCQlwa3RfY2xlYXIoZ2FybWluX2RhdGFfcCk7CiAJCQkJfQogCQkJfQpAQCAtODM5LDEyICs4NjIsMTUgQEAKIAogc3RhdGljIGludCBwcm9jZXNzX3Jlc2V0ZGV2X3JlcXVlc3Qoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzdGF0dXM7CiAJc3RydWN0IGdhcm1pbl9kYXRhICogZ2FybWluX2RhdGFfcCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAJZ2FybWluX2RhdGFfcC0+ZmxhZ3MgJj0gfihDTEVBUl9IQUxUX1JFUVVJUkVEKTsKIAlnYXJtaW5fZGF0YV9wLT5zdGF0ZSA9IFNUQVRFX1JFU0VUOwogCWdhcm1pbl9kYXRhX3AtPnNlcmlhbF9udW0gPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAogCXVzYl9raWxsX3VyYiAocG9ydC0+aW50ZXJydXB0X2luX3VyYik7CiAJZGJnKCIlcyAtIHVzYl9yZXNldF9kZXZpY2UiLCBfX0ZVTkNUSU9OX18gKTsKQEAgLTg2Miw2ICs4ODgsNyBAQAogICovCiBzdGF0aWMgaW50IGdhcm1pbl9jbGVhcihzdHJ1Y3QgZ2FybWluX2RhdGEgKiBnYXJtaW5fZGF0YV9wKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHN0YXR1cyA9IDA7CiAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gZ2FybWluX2RhdGFfcC0+cG9ydDsKQEAgLTg3NSw4ICs5MDIsMTAgQEAKIAkvKiBmbHVzaCBhbGwgcXVldWVkIGRhdGEgKi8KIAlwa3RfY2xlYXIoZ2FybWluX2RhdGFfcCk7CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCWdhcm1pbl9kYXRhX3AtPmluc2l6ZSA9IDA7CiAJZ2FybWluX2RhdGFfcC0+b3V0c2l6ZSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTg4OCw2ICs5MTcsNyBAQAogCiBzdGF0aWMgaW50IGdhcm1pbl9pbml0X3Nlc3Npb24oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CiAJc3RydWN0IGdhcm1pbl9kYXRhICogZ2FybWluX2RhdGFfcCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlpbnQgc3RhdHVzID0gMDsKQEAgLTkxMyw3ICs5NDMsOSBAQAogCiAJCWlmIChzdGF0dXMgPj0gMCkgewogCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCQkJZ2FybWluX2RhdGFfcC0+aWdub3JlUGt0cysrOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCiAJCQkvKiBub3QgbmVlZGVkLCBidXQgdGhlIHdpbjMyIGRyaXZlciBkb2VzIGl0IHRvbyAuLi4gKi8KIAkJCXN0YXR1cyA9IGdhcm1pbl93cml0ZV9idWxrKHBvcnQsCkBAIC05MjEsNyArOTUzLDkgQEAKIAkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihHQVJNSU5fU1RBUlRfU0VTU0lPTl9SRVEyKSk7CiAJCQlpZiAoc3RhdHVzID49IDApIHsKIAkJCQlzdGF0dXMgPSAwOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAJCQkJZ2FybWluX2RhdGFfcC0+aWdub3JlUGt0cysrOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAkJCX0KIAkJfQogCX0KQEAgLTkzNSw2ICs5NjksNyBAQAogCiBzdGF0aWMgaW50IGdhcm1pbl9vcGVuIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzdGF0dXMgPSAwOwogCXN0cnVjdCBnYXJtaW5fZGF0YSAqIGdhcm1pbl9kYXRhX3AgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAKQEAgLTk0OCw5ICs5ODMsMTEgQEAKIAlpZiAocG9ydC0+dHR5KQogCQlwb3J0LT50dHktPmxvd19sYXRlbmN5ID0gMTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAJZ2FybWluX2RhdGFfcC0+bW9kZSAgPSBpbml0aWFsX21vZGU7CiAJZ2FybWluX2RhdGFfcC0+Y291bnQgPSAwOwogCWdhcm1pbl9kYXRhX3AtPmZsYWdzID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBzaHV0ZG93biBhbnkgYnVsayByZWFkcyB0aGF0IG1pZ2h0IGJlIGdvaW5nIG9uICovCiAJdXNiX2tpbGxfdXJiIChwb3J0LT53cml0ZV91cmIpOwpAQCAtOTk2LDYgKzEwMzMsNyBAQAogCiBzdGF0aWMgdm9pZCBnYXJtaW5fd3JpdGVfYnVsa19jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKXVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgZ2FybWluX2RhdGEgKiBnYXJtaW5fZGF0YV9wID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwogCkBAIC0xMDA3LDcgKzEwNDUsOSBAQAogCWlmICh1cmItPnN0YXR1cykgewogCQlkYmcoIiVzIC0gbm9uemVybyB3cml0ZSBidWxrIHN0YXR1cyByZWNlaXZlZDogJWQiLAogCQkJX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAJCWdhcm1pbl9kYXRhX3AtPmZsYWdzIHw9IENMRUFSX0hBTFRfUkVRVUlSRUQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAl9CiAKIAl1c2Jfc2VyaWFsX3BvcnRfc29mdGludChwb3J0KTsKQEAgLTEwMTUsOCArMTA1NSw5IEBACiAKIAogc3RhdGljIGludCBnYXJtaW5fd3JpdGVfYnVsayAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KQorCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCXN0cnVjdCBnYXJtaW5fZGF0YSAqIGdhcm1pbl9kYXRhX3AgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJc3RydWN0IHVyYiAqdXJiOwpAQCAtMTAyNiw3ICsxMDY3LDkgQEAKIAlkYmcoIiVzIC0gcG9ydCAlZCwgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlciwKIAkJZ2FybWluX2RhdGFfcC0+c3RhdGUpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAlnYXJtaW5fZGF0YV9wLT5mbGFncyAmPSB+RkxBR1NfRFJPUF9EQVRBOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAogCWJ1ZmZlciA9IGttYWxsb2MgKGNvdW50LCBHRlBfQVRPTUlDKTsKIAlpZiAoIWJ1ZmZlcikgewpAQCAtMTA1Myw3ICsxMDk2LDkgQEAKIAl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9aRVJPX1BBQ0tFVDsKIAogCWlmIChHQVJNSU5fTEFZRVJJRF9BUFBMID09IGdldExheWVySWQoYnVmZmVyKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCQlnYXJtaW5fZGF0YV9wLT5mbGFncyB8PSBGTEFHU19BUFBfUkVRX1NFRU47CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAkJaWYgKGdhcm1pbl9kYXRhX3AtPm1vZGUgPT0gTU9ERV9HQVJNSU5fU0VSSUFMKSAgewogCQkJcGt0X2NsZWFyKGdhcm1pbl9kYXRhX3ApOwogCQkJZ2FybWluX2RhdGFfcC0+c3RhdGUgPSBTVEFURV9HU1BfV0FJVF9EQVRBOwpAQCAtMTA4Nyw4ICsxMTMyLDkgQEAKIAogCiBzdGF0aWMgaW50IGdhcm1pbl93cml0ZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKKwkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBwa3RpZCwgcGt0c2l6LCBsZW47CiAJc3RydWN0IGdhcm1pbl9kYXRhICogZ2FybWluX2RhdGFfcCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAlfX2xlMzIgKnByaXZwa3QgPSAoX19sZTMyICopZ2FybWluX2RhdGFfcC0+cHJpdnBrdDsKQEAgLTExMzksNyArMTE4NSw5IEBACiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgUFJJVl9QS1RJRF9SRVNFVF9SRVE6CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAkJCQlnYXJtaW5fZGF0YV9wLT5mbGFncyB8PSBGTEFHU19BUFBfUkVRX1NFRU47CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCQkJCWJyZWFrOwogCiAJCQljYXNlIFBSSVZfUEtUSURfU0VUX0RFRl9NT0RFOgpAQCAtMTE1NSw2ICsxMjAzLDggQEAKIAkJfQogCX0KIAorCWdhcm1pbl9kYXRhX3AtPmlnbm9yZVBrdHMgPSAwOworCiAJaWYgKGdhcm1pbl9kYXRhX3AtPm1vZGUgPT0gTU9ERV9HQVJNSU5fU0VSSUFMKSB7CiAJCXJldHVybiBnc3BfcmVjZWl2ZShnYXJtaW5fZGF0YV9wLCBidWYsIGNvdW50KTsKIAl9IGVsc2UgewkvKiBNT0RFX05BVElWRSAqLwpAQCAtMTE3NywxMCArMTIyNywxMCBAQAogewogCS8qCiAJICogUmVwb3J0IGJhY2sgdGhlIG51bWJlciBvZiBieXRlcyBjdXJyZW50bHkgaW4gb3VyIGlucHV0IGJ1ZmZlci4KLSAgICAgICAgICogV2lsbCB0aGlzIGxvY2sgdXAgdGhlIGRyaXZlciAtIHRoZSBidWZmZXIgY29udGFpbnMgYW4gaW5jb21wbGV0ZQotICAgICAgICAgKiBwYWNrYWdlIHdoaWNoIHdpbGwgbm90IGJlIHdyaXR0ZW4gdG8gdGhlIGRldmljZSB1bnRpbCBpdAotICAgICAgICAgKiBoYXMgYmVlbiBjb21wbGV0ZWQgPwotICAgICAgICAgKi8KKwkgKiBXaWxsIHRoaXMgbG9jayB1cCB0aGUgZHJpdmVyIC0gdGhlIGJ1ZmZlciBjb250YWlucyBhbiBpbmNvbXBsZXRlCisJICogcGFja2FnZSB3aGljaCB3aWxsIG5vdCBiZSB3cml0dGVuIHRvIHRoZSBkZXZpY2UgdW50aWwgaXQKKwkgKiBoYXMgYmVlbiBjb21wbGV0ZWQgPworCSAqLwogCS8vc3RydWN0IGdhcm1pbl9kYXRhICogZ2FybWluX2RhdGFfcCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAkvL3JldHVybiBnYXJtaW5fZGF0YV9wLT5pbnNpemU7CiAJcmV0dXJuIDA7CkBAIC0xMTkwLDYgKzEyNDAsOCBAQAogc3RhdGljIHZvaWQgZ2FybWluX3JlYWRfcHJvY2VzcyhzdHJ1Y3QgZ2FybWluX2RhdGEgKiBnYXJtaW5fZGF0YV9wLAogCQkJCSB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBkYXRhX2xlbmd0aCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCiAJaWYgKGdhcm1pbl9kYXRhX3AtPmZsYWdzICYgRkxBR1NfRFJPUF9EQVRBKSB7CiAJCS8qIGFib3J0LXRyYW5zZmVyIGNtZCBpcyBhY3RpY2UgKi8KIAkJZGJnKCIlcyAtIHBrdCBkcm9wcGVkIiwgX19GVU5DVElPTl9fKTsKQEAgLTEyMDAsMTEgKzEyNTIsMTQgQEAKIAkJICAgaWYgYSByZXNldCBpcyByZXF1aXJlZCBvciBub3Qgd2hlbiBjbG9zaW5nCiAJCSAgIHRoZSBkZXZpY2UgKi8KIAkJaWYgKDAgPT0gbWVtY21wKGRhdGEsIEdBUk1JTl9BUFBfTEFZRVJfUkVQTFksCi0JCSAgICAgICAgICAgICAgICBzaXplb2YoR0FSTUlOX0FQUF9MQVlFUl9SRVBMWSkpKQorCQkgICAgICAgICAgICAgICAgc2l6ZW9mKEdBUk1JTl9BUFBfTEFZRVJfUkVQTFkpKSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAkJCWdhcm1pbl9kYXRhX3AtPmZsYWdzIHw9IEZMQUdTX0FQUF9SRVNQX1NFRU47CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CisJCX0KIAogCQkvKiBpZiB0aHJvdHRsaW5nIGlzIGFjdGl2ZSBvciBwb3N0cHJlY2Vzc2luZyBpcyByZXF1aXJlZAotCQkgICBwdXQgdGhlIHJlY2VpdmVkIGRhdGEgaW4gdGggaW5wdXQgcXVldWUsIG90aGVyd2lzZQorCQkgICBwdXQgdGhlIHJlY2VpdmVkIGRhdGEgaW4gdGhlIGlucHV0IHF1ZXVlLCBvdGhlcndpc2UKIAkJICAgc2VuZCBpdCBkaXJlY3RseSB0byB0aGUgdHR5IHBvcnQgKi8KIAkJaWYgKGdhcm1pbl9kYXRhX3AtPmZsYWdzICYgRkxBR1NfUVVFVUlORykgewogCQkJcGt0X2FkZChnYXJtaW5fZGF0YV9wLCBkYXRhLCBkYXRhX2xlbmd0aCk7CkBAIC0xMjIxLDYgKzEyNzYsNyBAQAogCiBzdGF0aWMgdm9pZCBnYXJtaW5fcmVhZF9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OwogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSAgcG9ydC0+c2VyaWFsOwogCXN0cnVjdCBnYXJtaW5fZGF0YSAqIGdhcm1pbl9kYXRhX3AgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CkBAIC0xMjQ1LDE5ICsxMzAxLDMwIEBACiAKIAlnYXJtaW5fcmVhZF9wcm9jZXNzKGdhcm1pbl9kYXRhX3AsIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAKLQkvKiBDb250aW51ZSB0cnlpbmcgdG8gcmVhZCB1bnRpbCBub3RoaW5nIG1vcmUgaXMgcmVjZWl2ZWQgICovCi0JaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA+IDApIHsKLQkJdXNiX2ZpbGxfYnVsa191cmIgKHBvcnQtPnJlYWRfdXJiLCBzZXJpYWwtPmRldiwKLQkJCSAgIHVzYl9yY3ZidWxrcGlwZSAoc2VyaWFsLT5kZXYsCi0JCQkJCSAgICBwb3J0LT5idWxrX2luX2VuZHBvaW50QWRkcmVzcyksCi0JCQkgICBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyLAotCQkJICAgcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCi0JCQkgICBnYXJtaW5fcmVhZF9idWxrX2NhbGxiYWNrLCBwb3J0KTsKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDAgJiYKKwkJCTAgIT0gKGdhcm1pbl9kYXRhX3AtPmZsYWdzICYgRkxBR1NfQlVMS19JTl9SRVNUQVJUKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOworCQlnYXJtaW5fZGF0YV9wLT5mbGFncyAmPSB+RkxBR1NfQlVMS19JTl9SRVNUQVJUOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAJCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHN0YXR1cykKIAkJCWRldl9lcnIoJnBvcnQtPmRldiwKIAkJCQkiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKIAkJCSAgICAgICAgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCX0gZWxzZSBpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID4gMCkgeworCQkvKiBDb250aW51ZSB0cnlpbmcgdG8gcmVhZCB1bnRpbCBub3RoaW5nIG1vcmUgaXMgcmVjZWl2ZWQgICovCisJCWlmICgwID09IChnYXJtaW5fZGF0YV9wLT5mbGFncyAmIEZMQUdTX1RIUk9UVExFRCkpIHsKKwkJCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKKwkJCWlmIChzdGF0dXMpCisJCQkJZGV2X2VycigmcG9ydC0+ZGV2LAorCQkJCQkiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKKwkJCSAgICAgICAgCV9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwkJfQorCX0gZWxzZSB7CisJCWRiZygiJXMgLSBlbmQgb2YgYnVsayBkYXRhIiwgX19GVU5DVElPTl9fKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKKwkJZ2FybWluX2RhdGFfcC0+ZmxhZ3MgJj0gfkZMQUdTX0JVTEtfSU5fQUNUSVZFOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAJfQogCXJldHVybjsKIH0KQEAgLTEyNjUsNiArMTMzMiw3IEBACiAKIHN0YXRpYyB2b2lkIGdhcm1pbl9yZWFkX2ludF9jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzdGF0dXM7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopdXJiLT5jb250ZXh0OwogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CkBAIC0xMjk3LDI1ICsxMzY1LDQxIEBACiAKIAkJZGJnKCIlcyAtIGJ1bGsgZGF0YSBhdmFpbGFibGUuIiwgX19GVU5DVElPTl9fKTsKIAotCQkvKiBidWxrIGRhdGEgYXZhaWxhYmxlICovCi0JCXVzYl9maWxsX2J1bGtfdXJiIChwb3J0LT5yZWFkX3VyYiwgc2VyaWFsLT5kZXYsCi0JCQkJdXNiX3JjdmJ1bGtwaXBlIChzZXJpYWwtPmRldiwKLQkJCQlwb3J0LT5idWxrX2luX2VuZHBvaW50QWRkcmVzcyksCi0JCQkJcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlciwKLQkJCQlwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKLQkJCQlnYXJtaW5fcmVhZF9idWxrX2NhbGxiYWNrLCBwb3J0KTsKLQkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpOwotCQlpZiAoc3RhdHVzKSB7Ci0JCQlkZXZfZXJyKCZwb3J0LT5kZXYsCi0JCQkJIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLAotCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQlpZiAoMCA9PSAoZ2FybWluX2RhdGFfcC0+ZmxhZ3MgJiBGTEFHU19CVUxLX0lOX0FDVElWRSkpIHsKKworCQkJLyogYnVsayBkYXRhIGF2YWlsYWJsZSAqLworCQkJdXNiX2ZpbGxfYnVsa191cmIgKHBvcnQtPnJlYWRfdXJiLCBzZXJpYWwtPmRldiwKKwkJCQkJdXNiX3JjdmJ1bGtwaXBlIChzZXJpYWwtPmRldiwKKwkJCQkJcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpLAorCQkJCQlwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCQlwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJCQkJZ2FybWluX3JlYWRfYnVsa19jYWxsYmFjaywgcG9ydCk7CisJCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CisJCQlpZiAoc3RhdHVzKSB7CisJCQkJZGV2X2VycigmcG9ydC0+ZGV2LAorCQkJCQkiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCisJCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJfSBlbHNlIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOworCQkJCWdhcm1pbl9kYXRhX3AtPmZsYWdzIHw9IEZMQUdTX0JVTEtfSU5fQUNUSVZFOworCQkJCS8qIGRvIG5vdCBzZW5kIHRoaXMgcGFja2V0IHRvIHRoZSB1c2VyICovCisJCQkJZ2FybWluX2RhdGFfcC0+aWdub3JlUGt0cyA9IDE7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogYnVsay1pbiB0cmFuc2ZlciBzdGlsbCBhY3RpdmUgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CisJCQlnYXJtaW5fZGF0YV9wLT5mbGFncyB8PSBGTEFHU19CVUxLX0lOX1JFU1RBUlQ7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAJCX0KIAogCX0gZWxzZSBpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID09ICg0K3NpemVvZihHQVJNSU5fU1RBUlRfU0VTU0lPTl9SRVBMWSkpCiAJCQkgJiYgMCA9PSBtZW1jbXAoZGF0YSwgR0FSTUlOX1NUQVJUX1NFU1NJT05fUkVQTFksCiAJCQkgICAgICAgICAgICAgICAgc2l6ZW9mKEdBUk1JTl9TVEFSVF9TRVNTSU9OX1JFUExZKSkpIHsKIAorCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCQlnYXJtaW5fZGF0YV9wLT5mbGFncyB8PSBGTEFHU19TRVNTSU9OX1JFUExZMV9TRUVOOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAKIAkJLyogc2F2ZSB0aGUgc2VyaWFsIG51bWJlciAqLwogCQlnYXJtaW5fZGF0YV9wLT5zZXJpYWxfbnVtIApAQCAtMTMzMCw3ICsxNDE0LDkgQEAKIAkJICAgaWdub3JlIGl0LiAqLwogCQlkYmcoIiVzIC0gcGt0IGlnbm9yZWQgKCVkKSIsCiAJCQlfX0ZVTkNUSU9OX18sIGdhcm1pbl9kYXRhX3AtPmlnbm9yZVBrdHMpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCQlnYXJtaW5fZGF0YV9wLT5pZ25vcmVQa3RzLS07CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAl9IGVsc2UgewogCQlnYXJtaW5fcmVhZF9wcm9jZXNzKGdhcm1pbl9kYXRhX3AsIGRhdGEsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CiAJfQpAQCAtMTM1MSwxOCArMTQzNywyMCBAQAogICovCiBzdGF0aWMgaW50IGdhcm1pbl9mbHVzaF9xdWV1ZShzdHJ1Y3QgZ2FybWluX2RhdGEgKiBnYXJtaW5fZGF0YV9wKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGdhcm1pbl9wYWNrZXQgKnBrdDsKIAogCWlmICgoZ2FybWluX2RhdGFfcC0+ZmxhZ3MgJiBGTEFHU19USFJPVFRMRUQpID09IDApIHsKIAkJcGt0ID0gcGt0X3BvcChnYXJtaW5fZGF0YV9wKTsKIAkJaWYgKHBrdCAhPSBOVUxMKSB7Ci0KIAkJCXNlbmRfdG9fdHR5KGdhcm1pbl9kYXRhX3AtPnBvcnQsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKIAkJCWtmcmVlKHBrdCk7CiAJCQltb2RfdGltZXIoJmdhcm1pbl9kYXRhX3AtPnRpbWVyLCAoMSkramlmZmllcyk7CiAKIAkJfSBlbHNlIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiAJCQlnYXJtaW5fZGF0YV9wLT5mbGFncyAmPSB+RkxBR1NfUVVFVUlORzsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAkJfQogCX0KIAlyZXR1cm4gMDsKQEAgLTEzNzEsMjYgKzE0NTksNDEgQEAKIAogc3RhdGljIHZvaWQgZ2FybWluX3Rocm90dGxlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGdhcm1pbl9kYXRhICogZ2FybWluX2RhdGFfcCA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKIAogCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOwogCS8qIHNldCBmbGFnLCBkYXRhIHJlY2VpdmVkIHdpbGwgYmUgcHV0IGludG8gYSBxdWV1ZQogCSAgIGZvciBsYXRlciBwcm9jZXNzaW5nICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdhcm1pbl9kYXRhX3AtPmxvY2ssIGZsYWdzKTsKIAlnYXJtaW5fZGF0YV9wLT5mbGFncyB8PSBGTEFHU19RVUVVSU5HfEZMQUdTX1RIUk9UVExFRDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZnYXJtaW5fZGF0YV9wLT5sb2NrLCBmbGFncyk7CiB9CiAKIAogc3RhdGljIHZvaWQgZ2FybWluX3VudGhyb3R0bGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCiB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZ2FybWluX2RhdGEgKiBnYXJtaW5fZGF0YV9wID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCWludCBzdGF0dXM7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCWdhcm1pbl9kYXRhX3AtPmZsYWdzICY9IH5GTEFHU19USFJPVFRMRUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2FybWluX2RhdGFfcC0+bG9jaywgZmxhZ3MpOwogCiAJLyogaW4gbmF0aXZlIG1vZGUgc2VuZCBxdWV1ZWQgZGF0YSB0byB0dHksIGluCiAJICAgc2VyaWFsIG1vZGUgbm90aGluZyBuZWVkcyB0byBiZSBkb25lIGhlcmUgKi8KIAlpZiAoZ2FybWluX2RhdGFfcC0+bW9kZSA9PSBNT0RFX05BVElWRSkKIAkJZ2FybWluX2ZsdXNoX3F1ZXVlKGdhcm1pbl9kYXRhX3ApOworCisJaWYgKDAgIT0gKGdhcm1pbl9kYXRhX3AtPmZsYWdzICYgRkxBR1NfQlVMS19JTl9BQ1RJVkUpKSB7CisJCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHN0YXR1cykKKwkJCWRldl9lcnIoJnBvcnQtPmRldiwKKwkJCQkiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJfQogfQogCiAKQEAgLTE0MjAsMTEgKzE1MjMsMTIgQEAKIAogCWRiZygiJXMiLCBfX0ZVTkNUSU9OX18pOwogCi0JZ2FybWluX2RhdGFfcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnYXJtaW5fZGF0YSksIEdGUF9LRVJORUwpOworCWdhcm1pbl9kYXRhX3AgPSBrbWFsbG9jIChzaXplb2Yoc3RydWN0IGdhcm1pbl9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGdhcm1pbl9kYXRhX3AgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIE91dCBvZiBtZW1vcnlcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KKwltZW1zZXQgKGdhcm1pbl9kYXRhX3AsIDAsIHNpemVvZihzdHJ1Y3QgZ2FybWluX2RhdGEpKTsKIAlpbml0X3RpbWVyKCZnYXJtaW5fZGF0YV9wLT50aW1lcik7CiAJc3Bpbl9sb2NrX2luaXQoJmdhcm1pbl9kYXRhX3AtPmxvY2spOwogCUlOSVRfTElTVF9IRUFEKCZnYXJtaW5fZGF0YV9wLT5wa3RsaXN0KTsKQEAgLTE0NTksMTAgKzE1NjMsMTAgQEAKIC8qIEFsbCBvZiB0aGUgZGV2aWNlIGluZm8gbmVlZGVkICovCiBzdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyIGdhcm1pbl9kZXZpY2UgPSB7CiAJLmRyaXZlciA9IHsKLQkJLm93bmVyID0JVEhJU19NT0RVTEUsCi0JCS5uYW1lID0JCSJnYXJtaW5fZ3BzIiwKKwkJLm93bmVyICAgICAgID0gVEhJU19NT0RVTEUsCisJCS5uYW1lICAgICAgICA9ICJnYXJtaW5fZ3BzIiwKIAl9LAotCS5kZXNjcmlwdGlvbiA9CQkiR2FybWluIEdQUyB1c2IvdHR5IiwKKwkuZGVzY3JpcHRpb24gICAgICAgICA9ICJHYXJtaW4gR1BTIHVzYi90dHkiLAogCS5pZF90YWJsZSAgICAgICAgICAgID0gaWRfdGFibGUsCiAJLm51bV9pbnRlcnJ1cHRfaW4gICAgPSAxLAogCS5udW1fYnVsa19pbiAgICAgICAgID0gMSwKQEAgLTE0ODMsNiArMTU4Nyw3IEBACiB9OwogCiAKKwogc3RhdGljIGludCBfX2luaXQgZ2FybWluX2luaXQgKHZvaWQpCiB7CiAJaW50IHJldHZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvaXBhcS5jCmluZGV4IDk4NDBiYWQuLmJmYzY5OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9pcGFxLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2lwYXEuYwpAQCAtNjUyLDExICs2NTIsNiBAQAogCXBvcnQtPmJ1bGtfb3V0X3NpemUgPSBwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBVUkJEQVRBX1NJWkU7CiAJCiAJbXNsZWVwKDEwMDAqaW5pdGlhbF93YWl0KTsKLQkvKiBTdGFydCByZWFkaW5nIGZyb20gdGhlIGRldmljZSAqLwotCXVzYl9maWxsX2J1bGtfdXJiKHBvcnQtPnJlYWRfdXJiLCBzZXJpYWwtPmRldiwgCi0JCSAgICAgIHVzYl9yY3ZidWxrcGlwZShzZXJpYWwtPmRldiwgcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpLAotCQkgICAgICBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKLQkJICAgICAgaXBhcV9yZWFkX2J1bGtfY2FsbGJhY2ssIHBvcnQpOwogCiAJLyoKIAkgKiBTZW5kIG91dCBjb250cm9sIG1lc3NhZ2Ugb2JzZXJ2ZWQgaW4gd2luOTggc25pZmZzLiBOb3Qgc3VyZSB3aGF0CkBAIC02NzAsMTggKzY2NSwzMSBAQAogCQlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsCiAJCQkJdXNiX3NuZGN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwgMHgyMiwgMHgyMSwKIAkJCQkweDEsIDAsIE5VTEwsIDAsIDEwMCk7Ci0JCWlmIChyZXN1bHQgPT0gMCkgewotCQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpOwotCQkJaWYgKHJlc3VsdCkgewotCQkJCWVycigiJXMgLSBmYWlsZWQgc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9CisJCWlmICghcmVzdWx0KQorCQkJYnJlYWs7CisKIAkJbXNsZWVwKDEwMDApOwogCX0KLQllcnIoIiVzIC0gZmFpbGVkIGRvaW5nIGNvbnRyb2wgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKLQlnb3RvIGVycm9yOworCisJaWYgKCFyZXRyaWVzICYmIHJlc3VsdCkgeworCQllcnIoIiVzIC0gZmFpbGVkIGRvaW5nIGNvbnRyb2wgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywKKwkJICAgIHJlc3VsdCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyogU3RhcnQgcmVhZGluZyBmcm9tIHRoZSBkZXZpY2UgKi8KKwl1c2JfZmlsbF9idWxrX3VyYihwb3J0LT5yZWFkX3VyYiwgc2VyaWFsLT5kZXYsCisJCSAgICAgIHVzYl9yY3ZidWxrcGlwZShzZXJpYWwtPmRldiwgcG9ydC0+YnVsa19pbl9lbmRwb2ludEFkZHJlc3MpLAorCQkgICAgICBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyLCBwb3J0LT5yZWFkX3VyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJICAgICAgaXBhcV9yZWFkX2J1bGtfY2FsbGJhY2ssIHBvcnQpOworCisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXN1bHQpIHsKKwkJZXJyKCIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKIAogZW5vbWVtOgogCXJlc3VsdCA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvbW9zNzg0MC5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWJmNTcxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL21vczc4NDAuYwpAQCAtMCwwICsxLDI5NjIgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICogQ2xlYW4gdXBzIGZyb20gTW9zY2hpcCB2ZXJzaW9uIGFuZCBhIGZldyBpb2N0bCBpbXBsZW1lbnRhdGlvbnMgYnk6CisgKglQYXVsIEIgU2Nocm9lZGVyIDxwc2Nocm9lZGVyICJhdCIgdXBsb2dpeCAiZG90IiBjb20+CisgKgorICogT3JpZ2luYWxseSBiYXNlZCBvbiBkcml2ZXJzL3VzYi9zZXJpYWwvaW9fZWRnZXBvcnQuYyB3aGljaCBpczoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAyMDAwIEluc2lkZSBPdXQgTmV0d29ya3MsIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgICAgIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdHR5X2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eV9mbGlwLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL3NlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qCisgKiBWZXJzaW9uIEluZm9ybWF0aW9uCisgKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjEuMy4xIgorI2RlZmluZSBEUklWRVJfREVTQyAiTW9zY2hpcCA3ODQwLzc4MjAgVVNCIFNlcmlhbCBEcml2ZXIiCisKKy8qCisgKiAxNkM1MCBVQVJUIHJlZ2lzdGVyIGRlZmluZXMKKyAqLworCisjZGVmaW5lIExDUl9CSVRTXzUgICAgICAgICAgICAgMHgwMAkvKiA1IGJpdHMvY2hhciAqLworI2RlZmluZSBMQ1JfQklUU182ICAgICAgICAgICAgIDB4MDEJLyogNiBiaXRzL2NoYXIgKi8KKyNkZWZpbmUgTENSX0JJVFNfNyAgICAgICAgICAgICAweDAyCS8qIDcgYml0cy9jaGFyICovCisjZGVmaW5lIExDUl9CSVRTXzggICAgICAgICAgICAgMHgwMwkvKiA4IGJpdHMvY2hhciAqLworI2RlZmluZSBMQ1JfQklUU19NQVNLICAgICAgICAgIDB4MDMJLyogTWFzayBmb3IgYml0cy9jaGFyIGZpZWxkICovCisKKyNkZWZpbmUgTENSX1NUT1BfMSAgICAgICAgICAgICAweDAwCS8qIDEgc3RvcCBiaXQgKi8KKyNkZWZpbmUgTENSX1NUT1BfMV81ICAgICAgICAgICAweDA0CS8qIDEuNSBzdG9wIGJpdHMgKGlmIDUgICBiaXRzL2NoYXIpICovCisjZGVmaW5lIExDUl9TVE9QXzIgICAgICAgICAgICAgMHgwNAkvKiAyIHN0b3AgYml0cyAgIChpZiA2LTggYml0cy9jaGFyKSAqLworI2RlZmluZSBMQ1JfU1RPUF9NQVNLICAgICAgICAgIDB4MDQJLyogTWFzayBmb3Igc3RvcCBiaXRzIGZpZWxkICovCisKKyNkZWZpbmUgTENSX1BBUl9OT05FICAgICAgICAgICAweDAwCS8qIE5vIHBhcml0eSAqLworI2RlZmluZSBMQ1JfUEFSX09ERCAgICAgICAgICAgIDB4MDgJLyogT2RkIHBhcml0eSAqLworI2RlZmluZSBMQ1JfUEFSX0VWRU4gICAgICAgICAgIDB4MTgJLyogRXZlbiBwYXJpdHkgKi8KKyNkZWZpbmUgTENSX1BBUl9NQVJLICAgICAgICAgICAweDI4CS8qIEZvcmNlIHBhcml0eSBiaXQgdG8gMSAqLworI2RlZmluZSBMQ1JfUEFSX1NQQUNFICAgICAgICAgIDB4MzgJLyogRm9yY2UgcGFyaXR5IGJpdCB0byAwICovCisjZGVmaW5lIExDUl9QQVJfTUFTSyAgICAgICAgICAgMHgzOAkvKiBNYXNrIGZvciBwYXJpdHkgZmllbGQgKi8KKworI2RlZmluZSBMQ1JfU0VUX0JSRUFLICAgICAgICAgIDB4NDAJLyogU2V0IEJyZWFrIGNvbmRpdGlvbiAqLworI2RlZmluZSBMQ1JfRExfRU5BQkxFICAgICAgICAgIDB4ODAJLyogRW5hYmxlIGFjY2VzcyB0byBkaXZpc29yIGxhdGNoICovCisKKyNkZWZpbmUgTUNSX0RUUiAgICAgICAgICAgICAgICAweDAxCS8qIEFzc2VydCBEVFIgKi8KKyNkZWZpbmUgTUNSX1JUUyAgICAgICAgICAgICAgICAweDAyCS8qIEFzc2VydCBSVFMgKi8KKyNkZWZpbmUgTUNSX09VVDEgICAgICAgICAgICAgICAweDA0CS8qIExvb3BiYWNrIG9ubHk6IFNldHMgc3RhdGUgb2YgUkkgKi8KKyNkZWZpbmUgTUNSX01BU1RFUl9JRSAgICAgICAgICAweDA4CS8qIEVuYWJsZSBpbnRlcnJ1cHQgb3V0cHV0cyAqLworI2RlZmluZSBNQ1JfTE9PUEJBQ0sgICAgICAgICAgIDB4MTAJLyogU2V0IGludGVybmFsIChkaWdpdGFsKSBsb29wYmFjayBtb2RlICovCisjZGVmaW5lIE1DUl9YT05fQU5ZICAgICAgICAgICAgMHgyMAkvKiBFbmFibGUgYW55IGNoYXIgdG8gZXhpdCBYT0ZGIG1vZGUgKi8KKworI2RlZmluZSBNT1M3ODQwX01TUl9DVFMgICAgICAgIDB4MTAJLyogQ3VycmVudCBzdGF0ZSBvZiBDVFMgKi8KKyNkZWZpbmUgTU9TNzg0MF9NU1JfRFNSICAgICAgICAweDIwCS8qIEN1cnJlbnQgc3RhdGUgb2YgRFNSICovCisjZGVmaW5lIE1PUzc4NDBfTVNSX1JJICAgICAgICAgMHg0MAkvKiBDdXJyZW50IHN0YXRlIG9mIFJJICovCisjZGVmaW5lIE1PUzc4NDBfTVNSX0NEICAgICAgICAgMHg4MAkvKiBDdXJyZW50IHN0YXRlIG9mIENEICovCisKKy8qCisgKiBEZWZpbmVzIHVzZWQgZm9yIHNlbmRpbmcgY29tbWFuZHMgdG8gcG9ydAorICovCisKKyNkZWZpbmUgV0FJVF9GT1JfRVZFUiAgIChIWiAqIDAgKQkvKiB0aW1lb3V0IHVyYiBpcyB3YWl0IGZvciBldmVyICovCisjZGVmaW5lIE1PU19XRFJfVElNRU9VVCAoSFogKiA1ICkJLyogZGVmYXVsdCB1cmIgdGltZW91dCAqLworCisjZGVmaW5lIE1PU19QT1JUMSAgICAgICAweDAyMDAKKyNkZWZpbmUgTU9TX1BPUlQyICAgICAgIDB4MDMwMAorI2RlZmluZSBNT1NfVkVOUkVHICAgICAgMHgwMDAwCisjZGVmaW5lIE1PU19NQVhfUE9SVAkweDAyCisjZGVmaW5lIE1PU19XUklURSAgICAgICAweDBFCisjZGVmaW5lIE1PU19SRUFEICAgICAgICAweDBECisKKy8qIFJlcXVlc3RzICovCisjZGVmaW5lIE1DU19SRF9SVFlQRSAgICAweEMwCisjZGVmaW5lIE1DU19XUl9SVFlQRSAgICAweDQwCisjZGVmaW5lIE1DU19SRFJFUSAgICAgICAweDBECisjZGVmaW5lIE1DU19XUlJFUSAgICAgICAweDBFCisjZGVmaW5lIE1DU19DVFJMX1RJTUVPVVQgICAgICAgIDUwMAorI2RlZmluZSBWRU5ET1JfUkVBRF9MRU5HVEggICAgICAoMHgwMSkKKworI2RlZmluZSBNQVhfTkFNRV9MRU4gICAgNjQKKworI2RlZmluZSBaTFBfUkVHMSAgMHgzQQkJLy9aZXJvX0ZsYWdfUmVnMSAgICA1OAorI2RlZmluZSBaTFBfUkVHNSAgMHgzRQkJLy9aZXJvX0ZsYWdfUmVnNSAgICA2MgorCisvKiBGb3IgaGlnaGVyIGJhdWQgUmF0ZXMgdXNlIFRJT0NFWEJBVUQgKi8KKyNkZWZpbmUgVElPQ0VYQkFVRCAgICAgMHg1NDYyCisKKy8qIHZlbmRvciBpZCBhbmQgZGV2aWNlIGlkIGRlZmluZXMgKi8KKworI2RlZmluZSBVU0JfVkVORE9SX0lEX01PU0NISVAgICAgICAgICAgIDB4OTcxMAorI2RlZmluZSBNT1NDSElQX0RFVklDRV9JRF83ODQwICAgICAgICAgIDB4Nzg0MAorI2RlZmluZSBNT1NDSElQX0RFVklDRV9JRF83ODIwICAgICAgICAgIDB4NzgyMAorCisvKiBJbnRlcnJ1cHQgUm90aW51ZSBEZWZpbmVzICAgICovCisKKyNkZWZpbmUgU0VSSUFMX0lJUl9STFMgICAgICAweDA2CisjZGVmaW5lIFNFUklBTF9JSVJfTVMgICAgICAgMHgwMAorCisvKgorICogIEVtdWxhdGlvbiBvZiB0aGUgYml0IG1hc2sgb24gdGhlIExJTkUgU1RBVFVTIFJFR0lTVEVSLgorICovCisjZGVmaW5lIFNFUklBTF9MU1JfRFIgICAgICAgMHgwMDAxCisjZGVmaW5lIFNFUklBTF9MU1JfT0UgICAgICAgMHgwMDAyCisjZGVmaW5lIFNFUklBTF9MU1JfUEUgICAgICAgMHgwMDA0CisjZGVmaW5lIFNFUklBTF9MU1JfRkUgICAgICAgMHgwMDA4CisjZGVmaW5lIFNFUklBTF9MU1JfQkkgICAgICAgMHgwMDEwCisKKyNkZWZpbmUgTU9TX01TUl9ERUxUQV9DVFMgICAweDEwCisjZGVmaW5lIE1PU19NU1JfREVMVEFfRFNSICAgMHgyMAorI2RlZmluZSBNT1NfTVNSX0RFTFRBX1JJICAgIDB4NDAKKyNkZWZpbmUgTU9TX01TUl9ERUxUQV9DRCAgICAweDgwCisKKy8vIFNlcmlhbCBQb3J0IHJlZ2lzdGVyIEFkZHJlc3MKKyNkZWZpbmUgSU5URVJSVVBUX0VOQUJMRV9SRUdJU1RFUiAgKChfX3UxNikoMHgwMSkpCisjZGVmaW5lIEZJRk9fQ09OVFJPTF9SRUdJU1RFUiAgICAgICgoX191MTYpKDB4MDIpKQorI2RlZmluZSBMSU5FX0NPTlRST0xfUkVHSVNURVIgICAgICAoKF9fdTE2KSgweDAzKSkKKyNkZWZpbmUgTU9ERU1fQ09OVFJPTF9SRUdJU1RFUiAgICAgKChfX3UxNikoMHgwNCkpCisjZGVmaW5lIExJTkVfU1RBVFVTX1JFR0lTVEVSICAgICAgICgoX191MTYpKDB4MDUpKQorI2RlZmluZSBNT0RFTV9TVEFUVVNfUkVHSVNURVIgICAgICAoKF9fdTE2KSgweDA2KSkKKyNkZWZpbmUgU0NSQVRDSF9QQURfUkVHSVNURVIgICAgICAgKChfX3UxNikoMHgwNykpCisjZGVmaW5lIERJVklTT1JfTEFUQ0hfTFNCICAgICAgICAgICgoX191MTYpKDB4MDApKQorI2RlZmluZSBESVZJU09SX0xBVENIX01TQiAgICAgICAgICAoKF9fdTE2KSgweDAxKSkKKworI2RlZmluZSBDTEtfTVVMVElfUkVHSVNURVIgICAgICAgICAoKF9fdTE2KSgweDAyKSkKKyNkZWZpbmUgQ0xLX1NUQVJUX1ZBTFVFX1JFR0lTVEVSICAgKChfX3UxNikoMHgwMykpCisKKyNkZWZpbmUgU0VSSUFMX0xDUl9ETEFCICAgICAgICAgICAgKChfX3UxNikoMHgwMDgwKSkKKworLyoKKyAqIFVSQiBQT09MIHJlbGF0ZWQgZGVmaW5lcworICovCisjZGVmaW5lIE5VTV9VUkJTICAgICAgICAgICAgICAgICAgICAgICAgMTYJLyogVVJCIENvdW50ICovCisjZGVmaW5lIFVSQl9UUkFOU0ZFUl9CVUZGRVJfU0laRSAgICAgICAgMzIJLyogVVJCIFNpemUgICovCisKKworc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIG1vc2NoaXBfcG9ydF9pZF90YWJsZVtdID0geworCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTU9TQ0hJUCwgTU9TQ0hJUF9ERVZJQ0VfSURfNzg0MCl9LAorCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTU9TQ0hJUCwgTU9TQ0hJUF9ERVZJQ0VfSURfNzgyMCl9LAorCXt9CQkJLyogdGVybWluYXRpbmcgZW50cnkgKi8KK307CisKK3N0YXRpYyBfX2RldmluaXRkYXRhIHN0cnVjdCB1c2JfZGV2aWNlX2lkIG1vc2NoaXBfaWRfdGFibGVfY29tYmluZWRbXSA9IHsKKwl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01PU0NISVAsIE1PU0NISVBfREVWSUNFX0lEXzc4NDApfSwKKwl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX01PU0NISVAsIE1PU0NISVBfREVWSUNFX0lEXzc4MjApfSwKKwl7fQkJCS8qIHRlcm1pbmF0aW5nIGVudHJ5ICovCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgbW9zY2hpcF9pZF90YWJsZV9jb21iaW5lZCk7CisKKy8qIFRoaXMgc3RydWN0dXJlIGhvbGRzIGFsbCBvZiB0aGUgbG9jYWwgcG9ydCBpbmZvcm1hdGlvbiAqLworCitzdHJ1Y3QgbW9zY2hpcF9wb3J0IHsKKwlpbnQgcG9ydF9udW07CQkvKkFjdHVhbCBwb3J0IG51bWJlciBpbiB0aGUgZGV2aWNlKDEsMixldGMpICovCisJc3RydWN0IHVyYiAqd3JpdGVfdXJiOwkvKiB3cml0ZSBVUkIgZm9yIHRoaXMgcG9ydCAqLworCXN0cnVjdCB1cmIgKnJlYWRfdXJiOwkvKiByZWFkIFVSQiBmb3IgdGhpcyBwb3J0ICovCisJX191OCBzaGFkb3dMQ1I7CQkvKiBsYXN0IExDUiB2YWx1ZSByZWNlaXZlZCAqLworCV9fdTggc2hhZG93TUNSOwkJLyogbGFzdCBNQ1IgdmFsdWUgcmVjZWl2ZWQgKi8KKwljaGFyIG9wZW47CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9jaGFzZTsJLyogZm9yIGhhbmRsaW5nIHNsZWVwaW5nIHdoaWxlIHdhaXRpbmcgZm9yIGNoYXNlIHRvIGZpbmlzaCAqLworCXdhaXRfcXVldWVfaGVhZF90IGRlbHRhX21zcl93YWl0OwkvKiBmb3IgaGFuZGxpbmcgc2xlZXBpbmcgd2hpbGUgd2FpdGluZyBmb3IgbXNyIGNoYW5nZSB0byBoYXBwZW4gKi8KKwlpbnQgZGVsdGFfbXNyX2NvbmQ7CisJc3RydWN0IGFzeW5jX2ljb3VudCBpY291bnQ7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsJLyogbG9vcCBiYWNrIHRvIHRoZSBvd25lciBvZiB0aGlzIG9iamVjdCAqLworCisJLypPZmZzZXRzICovCisJX191OCBTcFJlZ09mZnNldDsKKwlfX3U4IENvbnRyb2xSZWdPZmZzZXQ7CisJX191OCBEY3JSZWdPZmZzZXQ7CisJLy9mb3IgcHJvY2Vzc2luZyBjb250cm9sIFVSQlMgaW4gaW50ZXJydXB0IGNvbnRleHQKKwlzdHJ1Y3QgdXJiICpjb250cm9sX3VyYjsKKwljaGFyICpjdHJsX2J1ZjsKKwlpbnQgTXNyTHNyOworCisJc3RydWN0IHVyYiAqd3JpdGVfdXJiX3Bvb2xbTlVNX1VSQlNdOworfTsKKworCitzdGF0aWMgaW50IGRlYnVnOworc3RhdGljIGludCBtb3M3ODQwX251bV9wb3J0czsJLy90aGlzIHNheXMgdGhlIG51bWJlciBvZiBwb3J0cyBpbiB0aGUgZGV2aWNlCitzdGF0aWMgaW50IG1vczc4NDBfbnVtX29wZW5fcG9ydHM7CisKKworLyoKKyAqIG1vczc4NDBfc2V0X3JlZ19zeW5jCisgKiAJVG8gc2V0IHRoZSBDb250cm9sIHJlZ2lzdGVyIGJ5IGNhbGxpbmcgdXNiX2ZpbGxfY29udHJvbF91cmIgZnVuY3Rpb24KKyAqCWJ5IHBhc3NpbmcgdXNiX3NuZGN0cmxwaXBlIGZ1bmN0aW9uIGFzIHBhcmFtZXRlci4KKyAqLworCitzdGF0aWMgaW50IG1vczc4NDBfc2V0X3JlZ19zeW5jKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIF9fdTE2IHJlZywKKwkJCQlfX3UxNiB2YWwpCit7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OworCXZhbCA9IHZhbCAmIDB4MDBmZjsKKwlkYmcoIm1vczc4NDBfc2V0X3JlZ19zeW5jIG9mZnNldCBpcyAleCwgdmFsdWUgJXhcbiIsIHJlZywgdmFsKTsKKworCXJldHVybiB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwgTUNTX1dSUkVRLAorCQkJICAgICAgIE1DU19XUl9SVFlQRSwgdmFsLCByZWcsIE5VTEwsIDAsCisJCQkgICAgICAgTU9TX1dEUl9USU1FT1VUKTsKK30KKworLyoKKyAqIG1vczc4NDBfZ2V0X3JlZ19zeW5jCisgKiAJVG8gc2V0IHRoZSBVYXJ0IHJlZ2lzdGVyIGJ5IGNhbGxpbmcgdXNiX2ZpbGxfY29udHJvbF91cmIgZnVuY3Rpb24gYnkKKyAqCXBhc3NpbmcgdXNiX3JjdmN0cmxwaXBlIGZ1bmN0aW9uIGFzIHBhcmFtZXRlci4KKyAqLworCitzdGF0aWMgaW50IG1vczc4NDBfZ2V0X3JlZ19zeW5jKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIF9fdTE2IHJlZywKKwkJCQlfX3UxNiAqIHZhbCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LCAwKSwgTUNTX1JEUkVRLAorCQkJICAgICAgTUNTX1JEX1JUWVBFLCAwLCByZWcsIHZhbCwgVkVORE9SX1JFQURfTEVOR1RILAorCQkJICAgICAgTU9TX1dEUl9USU1FT1VUKTsKKwlkYmcoIm1vczc4NDBfZ2V0X3JlZ19zeW5jIG9mZnNldCBpcyAleCwgcmV0dXJuIHZhbCAleFxuIiwgcmVnLCAqdmFsKTsKKwkqdmFsID0gKCp2YWwpICYgMHgwMGZmOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBtb3M3ODQwX3NldF91YXJ0X3JlZworICoJVG8gc2V0IHRoZSBVYXJ0IHJlZ2lzdGVyIGJ5IGNhbGxpbmcgdXNiX2ZpbGxfY29udHJvbF91cmIgZnVuY3Rpb24gYnkKKyAqCXBhc3NpbmcgdXNiX3NuZGN0cmxwaXBlIGZ1bmN0aW9uIGFzIHBhcmFtZXRlci4KKyAqLworCitzdGF0aWMgaW50IG1vczc4NDBfc2V0X3VhcnRfcmVnKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIF9fdTE2IHJlZywKKwkJCQlfX3UxNiB2YWwpCit7CisKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gcG9ydC0+c2VyaWFsLT5kZXY7CisJdmFsID0gdmFsICYgMHgwMGZmOworCS8vIEZvciB0aGUgVUFSVCBjb250cm9sIHJlZ2lzdGVycywgdGhlIGFwcGxpY2F0aW9uIG51bWJlciBuZWVkIHRvIGJlIE9yJ2VkCisJaWYgKG1vczc4NDBfbnVtX3BvcnRzID09IDQpIHsKKwkJdmFsIHw9CisJCSAgICAoKChfX3UxNikgcG9ydC0+bnVtYmVyIC0gKF9fdTE2KSAocG9ydC0+c2VyaWFsLT5taW5vcikpICsKKwkJICAgICAxKSA8PCA4OworCQlkYmcoIm1vczc4NDBfc2V0X3VhcnRfcmVnIGFwcGxpY2F0aW9uIG51bWJlciBpcyAleFxuIiwgdmFsKTsKKwl9IGVsc2UgeworCQlpZiAoKChfX3UxNikgcG9ydC0+bnVtYmVyIC0gKF9fdTE2KSAocG9ydC0+c2VyaWFsLT5taW5vcikpID09IDApIHsKKwkJCXZhbCB8PQorCQkJICAgICgoKF9fdTE2KSBwb3J0LT5udW1iZXIgLQorCQkJICAgICAgKF9fdTE2KSAocG9ydC0+c2VyaWFsLT5taW5vcikpICsgMSkgPDwgODsKKwkJCWRiZygibW9zNzg0MF9zZXRfdWFydF9yZWcgYXBwbGljYXRpb24gbnVtYmVyIGlzICV4XG4iLAorCQkJICAgIHZhbCk7CisJCX0gZWxzZSB7CisJCQl2YWwgfD0KKwkJCSAgICAoKChfX3UxNikgcG9ydC0+bnVtYmVyIC0KKwkJCSAgICAgIChfX3UxNikgKHBvcnQtPnNlcmlhbC0+bWlub3IpKSArIDIpIDw8IDg7CisJCQlkYmcoIm1vczc4NDBfc2V0X3VhcnRfcmVnIGFwcGxpY2F0aW9uIG51bWJlciBpcyAleFxuIiwKKwkJCSAgICB2YWwpOworCQl9CisJfQorCXJldHVybiB1c2JfY29udHJvbF9tc2coZGV2LCB1c2Jfc25kY3RybHBpcGUoZGV2LCAwKSwgTUNTX1dSUkVRLAorCQkJICAgICAgIE1DU19XUl9SVFlQRSwgdmFsLCByZWcsIE5VTEwsIDAsCisJCQkgICAgICAgTU9TX1dEUl9USU1FT1VUKTsKKworfQorCisvKgorICogbW9zNzg0MF9nZXRfdWFydF9yZWcKKyAqCVRvIHNldCB0aGUgQ29udHJvbCByZWdpc3RlciBieSBjYWxsaW5nIHVzYl9maWxsX2NvbnRyb2xfdXJiIGZ1bmN0aW9uCisgKglieSBwYXNzaW5nIHVzYl9yY3ZjdHJscGlwZSBmdW5jdGlvbiBhcyBwYXJhbWV0ZXIuCisgKi8KK3N0YXRpYyBpbnQgbW9zNzg0MF9nZXRfdWFydF9yZWcoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgX191MTYgcmVnLAorCQkJCV9fdTE2ICogdmFsKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKKwlpbnQgcmV0ID0gMDsKKwlfX3UxNiBXdmFsOworCisJLy9kYmcoImFwcGxpY2F0aW9uIG51bWJlciBpcyAlNHggXG4iLCgoKF9fdTE2KXBvcnQtPm51bWJlciAtIChfX3UxNikocG9ydC0+c2VyaWFsLT5taW5vcikpKzEpPDw4KTsKKwkvKld2YWwgIGlzIHNhbWUgYXMgYXBwbGljYXRpb24gbnVtYmVyICovCisJaWYgKG1vczc4NDBfbnVtX3BvcnRzID09IDQpIHsKKwkJV3ZhbCA9CisJCSAgICAoKChfX3UxNikgcG9ydC0+bnVtYmVyIC0gKF9fdTE2KSAocG9ydC0+c2VyaWFsLT5taW5vcikpICsKKwkJICAgICAxKSA8PCA4OworCQlkYmcoIm1vczc4NDBfZ2V0X3VhcnRfcmVnIGFwcGxpY2F0aW9uIG51bWJlciBpcyAleFxuIiwgV3ZhbCk7CisJfSBlbHNlIHsKKwkJaWYgKCgoX191MTYpIHBvcnQtPm51bWJlciAtIChfX3UxNikgKHBvcnQtPnNlcmlhbC0+bWlub3IpKSA9PSAwKSB7CisJCQlXdmFsID0KKwkJCSAgICAoKChfX3UxNikgcG9ydC0+bnVtYmVyIC0KKwkJCSAgICAgIChfX3UxNikgKHBvcnQtPnNlcmlhbC0+bWlub3IpKSArIDEpIDw8IDg7CisJCQlkYmcoIm1vczc4NDBfZ2V0X3VhcnRfcmVnIGFwcGxpY2F0aW9uIG51bWJlciBpcyAleFxuIiwKKwkJCSAgICBXdmFsKTsKKwkJfSBlbHNlIHsKKwkJCVd2YWwgPQorCQkJICAgICgoKF9fdTE2KSBwb3J0LT5udW1iZXIgLQorCQkJICAgICAgKF9fdTE2KSAocG9ydC0+c2VyaWFsLT5taW5vcikpICsgMikgPDwgODsKKwkJCWRiZygibW9zNzg0MF9nZXRfdWFydF9yZWcgYXBwbGljYXRpb24gbnVtYmVyIGlzICV4XG4iLAorCQkJICAgIFd2YWwpOworCQl9CisJfQorCXJldCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLCBNQ1NfUkRSRVEsCisJCQkgICAgICBNQ1NfUkRfUlRZUEUsIFd2YWwsIHJlZywgdmFsLCBWRU5ET1JfUkVBRF9MRU5HVEgsCisJCQkgICAgICBNT1NfV0RSX1RJTUVPVVQpOworCSp2YWwgPSAoKnZhbCkgJiAweDAwZmY7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbW9zNzg0MF9kdW1wX3NlcmlhbF9wb3J0KHN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydCkKK3sKKworCWRiZygiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKwlkYmcoIlNwUmVnT2Zmc2V0IGlzICUyeFxuIiwgbW9zNzg0MF9wb3J0LT5TcFJlZ09mZnNldCk7CisJZGJnKCJDb250cm9sUmVnT2Zmc2V0IGlzICUyeCBcbiIsIG1vczc4NDBfcG9ydC0+Q29udHJvbFJlZ09mZnNldCk7CisJZGJnKCJEQ1JSZWdPZmZzZXQgaXMgJTJ4IFxuIiwgbW9zNzg0MF9wb3J0LT5EY3JSZWdPZmZzZXQpOworCWRiZygiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgIEkgTiBUIEUgUiBGIEEgQyBFICAgRiBVIE4gQyBUIEkgTyBOIFMJCQkqLworLyogICAgICAgICAgICAgSSBOIFQgRSBSIEYgQSBDIEUgICBGIFUgTiBDIFQgSSBPIE4gUwkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSB2b2lkIG1vczc4NDBfc2V0X3BvcnRfcHJpdmF0ZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorCQkJCQkgICAgc3RydWN0IG1vc2NoaXBfcG9ydCAqZGF0YSkKK3sKKwl1c2Jfc2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCwgKHZvaWQgKilkYXRhKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3ODQwX2dldF9wb3J0X3ByaXZhdGUoc3RydWN0CisJCQkJCQkJICAgIHVzYl9zZXJpYWxfcG9ydAorCQkJCQkJCSAgICAqcG9ydCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBtb3NjaGlwX3BvcnQgKil1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgbW9zNzg0MF9oYW5kbGVfbmV3X21zcihzdHJ1Y3QgbW9zY2hpcF9wb3J0ICpwb3J0LCBfX3U4IG5ld19tc3IpCit7CisJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzg0MF9wb3J0OworCXN0cnVjdCBhc3luY19pY291bnQgKmljb3VudDsKKwltb3M3ODQwX3BvcnQgPSBwb3J0OworCWljb3VudCA9ICZtb3M3ODQwX3BvcnQtPmljb3VudDsKKwlpZiAobmV3X21zciAmCisJICAgIChNT1NfTVNSX0RFTFRBX0NUUyB8IE1PU19NU1JfREVMVEFfRFNSIHwgTU9TX01TUl9ERUxUQV9SSSB8CisJICAgICBNT1NfTVNSX0RFTFRBX0NEKSkgeworCQlpY291bnQgPSAmbW9zNzg0MF9wb3J0LT5pY291bnQ7CisKKwkJLyogdXBkYXRlIGlucHV0IGxpbmUgY291bnRlcnMgKi8KKwkJaWYgKG5ld19tc3IgJiBNT1NfTVNSX0RFTFRBX0NUUykgeworCQkJaWNvdW50LT5jdHMrKzsKKwkJfQorCQlpZiAobmV3X21zciAmIE1PU19NU1JfREVMVEFfRFNSKSB7CisJCQlpY291bnQtPmRzcisrOworCQl9CisJCWlmIChuZXdfbXNyICYgTU9TX01TUl9ERUxUQV9DRCkgeworCQkJaWNvdW50LT5kY2QrKzsKKwkJfQorCQlpZiAobmV3X21zciAmIE1PU19NU1JfREVMVEFfUkkpIHsKKwkJCWljb3VudC0+cm5nKys7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3M3ODQwX2hhbmRsZV9uZXdfbHNyKHN0cnVjdCBtb3NjaGlwX3BvcnQgKnBvcnQsIF9fdTggbmV3X2xzcikKK3sKKwlzdHJ1Y3QgYXN5bmNfaWNvdW50ICppY291bnQ7CisKKwlkYmcoIiVzIC0gJTAyeCIsIF9fRlVOQ1RJT05fXywgbmV3X2xzcik7CisKKwlpZiAobmV3X2xzciAmIFNFUklBTF9MU1JfQkkpIHsKKwkJLy8KKwkJLy8gUGFyaXR5IGFuZCBGcmFtaW5nIGVycm9ycyBvbmx5IGNvdW50IGlmIHRoZXkKKwkJLy8gb2NjdXIgZXhjbHVzaXZlIG9mIGEgYnJlYWsgYmVpbmcKKwkJLy8gcmVjZWl2ZWQuCisJCS8vCisJCW5ld19sc3IgJj0gKF9fdTgpIChTRVJJQUxfTFNSX09FIHwgU0VSSUFMX0xTUl9CSSk7CisJfQorCisJLyogdXBkYXRlIGlucHV0IGxpbmUgY291bnRlcnMgKi8KKwlpY291bnQgPSAmcG9ydC0+aWNvdW50OworCWlmIChuZXdfbHNyICYgU0VSSUFMX0xTUl9CSSkgeworCQlpY291bnQtPmJyaysrOworCX0KKwlpZiAobmV3X2xzciAmIFNFUklBTF9MU1JfT0UpIHsKKwkJaWNvdW50LT5vdmVycnVuKys7CisJfQorCWlmIChuZXdfbHNyICYgU0VSSUFMX0xTUl9QRSkgeworCQlpY291bnQtPnBhcml0eSsrOworCX0KKwlpZiAobmV3X2xzciAmIFNFUklBTF9MU1JfRkUpIHsKKwkJaWNvdW50LT5mcmFtZSsrOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgVSBTIEIgIEMgQSBMIEwgQiBBIEMgSyAgIEYgVSBOIEMgVCBJIE8gTiBTICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIFUgUyBCICBDIEEgTCBMIEIgQSBDIEsgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIG1vczc4NDBfY29udHJvbF9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzg0MF9wb3J0OworCV9fdTggcmVndmFsID0gMHgwOworCisJaWYgKCF1cmIpIHsKKwkJZGJnKCIlcyIsICJJbnZhbGlkIFBvaW50ZXIgISEhITpcbiIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJLyogc3VjY2VzcyAqLworCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18sCisJCSAgICB1cmItPnN0YXR1cyk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywKKwkJICAgIHVyYi0+c3RhdHVzKTsKKwkJZ290byBleGl0OworCX0KKworCW1vczc4NDBfcG9ydCA9IChzdHJ1Y3QgbW9zY2hpcF9wb3J0ICopdXJiLT5jb250ZXh0OworCisJZGJnKCIlcyB1cmIgYnVmZmVyIHNpemUgaXMgJWRcbiIsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwlkYmcoIiVzIG1vczc4NDBfcG9ydC0+TXNyTHNyIGlzICVkIHBvcnQgJWRcbiIsIF9fRlVOQ1RJT05fXywKKwkgICAgbW9zNzg0MF9wb3J0LT5Nc3JMc3IsIG1vczc4NDBfcG9ydC0+cG9ydF9udW0pOworCWRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwlyZWd2YWwgPSAoX191OCkgZGF0YVswXTsKKwlkYmcoIiVzIGRhdGEgaXMgJXhcbiIsIF9fRlVOQ1RJT05fXywgcmVndmFsKTsKKwlpZiAobW9zNzg0MF9wb3J0LT5Nc3JMc3IgPT0gMCkKKwkJbW9zNzg0MF9oYW5kbGVfbmV3X21zcihtb3M3ODQwX3BvcnQsIHJlZ3ZhbCk7CisJZWxzZSBpZiAobW9zNzg0MF9wb3J0LT5Nc3JMc3IgPT0gMSkKKwkJbW9zNzg0MF9oYW5kbGVfbmV3X2xzcihtb3M3ODQwX3BvcnQsIHJlZ3ZhbCk7CisKKyAgICAgIGV4aXQ6CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IG1vczc4NDBfZ2V0X3JlZyhzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptY3MsIF9fdTE2IFd2YWwsIF9fdTE2IHJlZywKKwkJCSAgIF9fdTE2ICogdmFsKQoreworCXN0cnVjdCB1c2JfZGV2aWNlICpkZXYgPSBtY3MtPnBvcnQtPnNlcmlhbC0+ZGV2OworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmRyID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSBOVUxMOworCWludCByZXQgPSAwOworCWJ1ZmZlciA9IChfX3U4ICopIG1jcy0+Y3RybF9idWY7CisKKy8vICAgICAgZHI9KHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKikoYnVmZmVyKTsKKwlkciA9ICh2b2lkICopKGJ1ZmZlciArIDIpOworCWRyLT5iUmVxdWVzdFR5cGUgPSBNQ1NfUkRfUlRZUEU7CisJZHItPmJSZXF1ZXN0ID0gTUNTX1JEUkVROworCWRyLT53VmFsdWUgPSBjcHVfdG9fbGUxNihXdmFsKTsJLy8wOworCWRyLT53SW5kZXggPSBjcHVfdG9fbGUxNihyZWcpOworCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoMik7CisKKwl1c2JfZmlsbF9jb250cm9sX3VyYihtY3MtPmNvbnRyb2xfdXJiLCBkZXYsIHVzYl9yY3ZjdHJscGlwZShkZXYsIDApLAorCQkJICAgICAodW5zaWduZWQgY2hhciAqKWRyLCBidWZmZXIsIDIsCisJCQkgICAgIG1vczc4NDBfY29udHJvbF9jYWxsYmFjaywgbWNzKTsKKwltY3MtPmNvbnRyb2xfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gMjsKKwlyZXQgPSB1c2Jfc3VibWl0X3VyYihtY3MtPmNvbnRyb2xfdXJiLCBHRlBfQVRPTUlDKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1vczc4NDBfaW50ZXJydXB0X2NhbGxiYWNrCisgKgl0aGlzIGlzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBmb3Igd2hlbiB3ZSBoYXZlIHJlY2VpdmVkIGRhdGEgb24gdGhlCisgKglpbnRlcnJ1cHQgZW5kcG9pbnQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIG1vczc4NDBfaW50ZXJydXB0X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IHJlc3VsdDsKKwlpbnQgbGVuZ3RoOworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOworCV9fdTE2IERhdGE7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlfX3U4IHNwWzVdLCBzdDsKKwlpbnQgaTsKKwlfX3UxNiB3dmFsOworCisJZGJnKCIlcyIsICIgOiBFbnRlcmluZ1xuIik7CisJaWYgKCF1cmIpIHsKKwkJZGJnKCIlcyIsICJJbnZhbGlkIFBvaW50ZXIgISEhITpcbiIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJLyogc3VjY2VzcyAqLworCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0ZWQsIGNsZWFuIHVwICovCisJCWRiZygiJXMgLSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWQiLCBfX0ZVTkNUSU9OX18sCisJCSAgICB1cmItPnN0YXR1cyk7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlkYmcoIiVzIC0gbm9uemVybyB1cmIgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywKKwkJICAgIHVyYi0+c3RhdHVzKTsKKwkJZ290byBleGl0OworCX0KKworCWxlbmd0aCA9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKwlkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisKKwlzZXJpYWwgPSAoc3RydWN0IHVzYl9zZXJpYWwgKil1cmItPmNvbnRleHQ7CisKKwkvKiBNb3NjaGlwIGdldCA1IGJ5dGVzCisJICogQnl0ZSAxIElJUiBQb3J0IDEgKHBvcnQubnVtYmVyIGlzIDApCisJICogQnl0ZSAyIElJUiBQb3J0IDIgKHBvcnQubnVtYmVyIGlzIDEpCisJICogQnl0ZSAzIElJUiBQb3J0IDMgKHBvcnQubnVtYmVyIGlzIDIpCisJICogQnl0ZSA0IElJUiBQb3J0IDQgKHBvcnQubnVtYmVyIGlzIDMpCisJICogQnl0ZSA1IEZJRk8gc3RhdHVzIGZvciBib3RoICovCisKKwlpZiAobGVuZ3RoICYmIGxlbmd0aCA+IDUpIHsKKwkJZGJnKCIlcyBcbiIsICJXcm9uZyBkYXRhICEhISIpOworCQlyZXR1cm47CisJfQorCisJc3BbMF0gPSAoX191OCkgZGF0YVswXTsKKwlzcFsxXSA9IChfX3U4KSBkYXRhWzFdOworCXNwWzJdID0gKF9fdTgpIGRhdGFbMl07CisJc3BbM10gPSAoX191OCkgZGF0YVszXTsKKwlzdCA9IChfX3U4KSBkYXRhWzRdOworCisJZm9yIChpID0gMDsgaSA8IHNlcmlhbC0+bnVtX3BvcnRzOyBpKyspIHsKKwkJbW9zNzg0MF9wb3J0ID0gbW9zNzg0MF9nZXRfcG9ydF9wcml2YXRlKHNlcmlhbC0+cG9ydFtpXSk7CisJCXd2YWwgPQorCQkgICAgKCgoX191MTYpIHNlcmlhbC0+cG9ydFtpXS0+bnVtYmVyIC0KKwkJICAgICAgKF9fdTE2KSAoc2VyaWFsLT5taW5vcikpICsgMSkgPDwgODsKKwkJaWYgKG1vczc4NDBfcG9ydC0+b3BlbikgeworCQkJaWYgKHNwW2ldICYgMHgwMSkgeworCQkJCWRiZygiU1AlZCBObyBJbnRlcnJ1cHQgISEhXG4iLCBpKTsKKwkJCX0gZWxzZSB7CisJCQkJc3dpdGNoIChzcFtpXSAmIDB4MGYpIHsKKwkJCQljYXNlIFNFUklBTF9JSVJfUkxTOgorCQkJCQlkYmcoIlNlcmlhbCBQb3J0ICVkOiBSZWNlaXZlciBzdGF0dXMgZXJyb3Igb3IgIiwgaSk7CisJCQkJCWRiZygiYWRkcmVzcyBiaXQgZGV0ZWN0ZWQgaW4gOS1iaXQgbW9kZVxuIik7CisJCQkJCW1vczc4NDBfcG9ydC0+TXNyTHNyID0gMTsKKwkJCQkJbW9zNzg0MF9nZXRfcmVnKG1vczc4NDBfcG9ydCwgd3ZhbCwKKwkJCQkJCQlMSU5FX1NUQVRVU19SRUdJU1RFUiwKKwkJCQkJCQkmRGF0YSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0VSSUFMX0lJUl9NUzoKKwkJCQkJZGJnKCJTZXJpYWwgUG9ydCAlZDogTW9kZW0gc3RhdHVzIGNoYW5nZVxuIiwgaSk7CisJCQkJCW1vczc4NDBfcG9ydC0+TXNyTHNyID0gMDsKKwkJCQkJbW9zNzg0MF9nZXRfcmVnKG1vczc4NDBfcG9ydCwgd3ZhbCwKKwkJCQkJCQlNT0RFTV9TVEFUVVNfUkVHSVNURVIsCisJCQkJCQkJJkRhdGEpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisgICAgICBleGl0OgorCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJlc3VsdCkgeworCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiXG4iLAorCQkJX19GVU5DVElPTl9fLCByZXN1bHQpOworCX0KKworCXJldHVybjsKKworfQorCitzdGF0aWMgaW50IG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorCQkJCSAgICAgICBjb25zdCBjaGFyICpmdW5jdGlvbikKK3sKKwlpZiAoIXBvcnQpIHsKKwkJZGJnKCIlcyAtIHBvcnQgPT0gTlVMTCIsIGZ1bmN0aW9uKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIXBvcnQtPnNlcmlhbCkgeworCQlkYmcoIiVzIC0gcG9ydC0+c2VyaWFsID09IE5VTEwiLCBmdW5jdGlvbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogSW5saW5lIGZ1bmN0aW9ucyB0byBjaGVjayB0aGUgc2FuaXR5IG9mIGEgcG9pbnRlciB0aGF0IGlzIHBhc3NlZCB0byB1cyAqLworc3RhdGljIGludCBtb3M3ODQwX3NlcmlhbF9wYXJhbm9pYV9jaGVjayhzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsLAorCQkJCQkgY29uc3QgY2hhciAqZnVuY3Rpb24pCit7CisJaWYgKCFzZXJpYWwpIHsKKwkJZGJnKCIlcyAtIHNlcmlhbCA9PSBOVUxMIiwgZnVuY3Rpb24pOworCQlyZXR1cm4gLTE7CisJfQorCWlmICghc2VyaWFsLT50eXBlKSB7CisJCWRiZygiJXMgLSBzZXJpYWwtPnR5cGUgPT0gTlVMTCEiLCBmdW5jdGlvbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsICptb3M3ODQwX2dldF91c2Jfc2VyaWFsKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCisJCQkJCQkgY29uc3QgY2hhciAqZnVuY3Rpb24pCit7CisJLyogaWYgbm8gcG9ydCB3YXMgc3BlY2lmaWVkLCBvciBpdCBmYWlscyBhIHBhcmFub2lhIGNoZWNrICovCisJaWYgKCFwb3J0IHx8CisJICAgIG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBmdW5jdGlvbikgfHwKKwkgICAgbW9zNzg0MF9zZXJpYWxfcGFyYW5vaWFfY2hlY2socG9ydC0+c2VyaWFsLCBmdW5jdGlvbikpIHsKKwkJLyogdGhlbiBzYXkgdGhhdCB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgdXNiX3NlcmlhbCB0aGluZywgd2hpY2ggd2lsbCAgICAgICAgICAgICAgICAgICogZW5kIHVwIGdlbnJhdGluZyAtRU5PREVWIHJldHVybiB2YWx1ZXMgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHBvcnQtPnNlcmlhbDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtb3M3ODQwX2J1bGtfaW5fY2FsbGJhY2sKKyAqCXRoaXMgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB3aGVuIHdlIGhhdmUgcmVjZWl2ZWQgZGF0YSBvbiB0aGUKKyAqCWJ1bGsgaW4gZW5kcG9pbnQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIG1vczc4NDBfYnVsa19pbl9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBzdGF0dXM7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CisJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzg0MF9wb3J0OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwlpZiAoIXVyYikgeworCQlkYmcoIiVzIiwgIkludmFsaWQgUG9pbnRlciAhISEhOlxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJZGJnKCJub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgdXJiLT5zdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJbW9zNzg0MF9wb3J0ID0gKHN0cnVjdCBtb3NjaGlwX3BvcnQgKil1cmItPmNvbnRleHQ7CisJaWYgKCFtb3M3ODQwX3BvcnQpIHsKKwkJZGJnKCIlcyIsICJOVUxMIG1vczc4NDBfcG9ydCBwb2ludGVyIFxuIik7CisJCXJldHVybjsKKwl9CisKKwlwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKiltb3M3ODQwX3BvcnQtPnBvcnQ7CisJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX0ZVTkNUSU9OX18pKSB7CisJCWRiZygiJXMiLCAiUG9ydCBQYXJhbm9pYSBmYWlsZWQgXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNlcmlhbCA9IG1vczc4NDBfZ2V0X3VzYl9zZXJpYWwocG9ydCwgX19GVU5DVElPTl9fKTsKKwlpZiAoIXNlcmlhbCkgeworCQlkYmcoIiVzXG4iLCAiQmFkIHNlcmlhbCBwb2ludGVyICIpOworCQlyZXR1cm47CisJfQorCisJZGJnKCIlc1xuIiwgIkVudGVyaW5nLi4uIFxuIik7CisKKwlkYXRhID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisKKwlkYmcoIiVzIiwgIkVudGVyaW5nIC4uLi4uLi4uLi4uIFxuIik7CisKKwlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoKSB7CisJCXR0eSA9IG1vczc4NDBfcG9ydC0+cG9ydC0+dHR5OworCQlpZiAodHR5KSB7CisJCQl0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCQl0dHlfaW5zZXJ0X2ZsaXBfc3RyaW5nKHR0eSwgZGF0YSwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKKwkJCWRiZygiICVzIFxuIiwgZGF0YSk7CisJCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCQl9CisJCW1vczc4NDBfcG9ydC0+aWNvdW50LnJ4ICs9IHVyYi0+YWN0dWFsX2xlbmd0aDsKKwkJZGJnKCJtb3M3ODQwX3BvcnQtPmljb3VudC5yeCBpcyAlZDpcbiIsCisJCSAgICBtb3M3ODQwX3BvcnQtPmljb3VudC5yeCk7CisJfQorCisJaWYgKCFtb3M3ODQwX3BvcnQtPnJlYWRfdXJiKSB7CisJCWRiZygiJXMiLCAiVVJCIEtJTExFRCAhISFcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKG1vczc4NDBfcG9ydC0+cmVhZF91cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJbW9zNzg0MF9wb3J0LT5yZWFkX3VyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7CisKKwkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIobW9zNzg0MF9wb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CisKKwkJaWYgKHN0YXR1cykgeworCQkJZGJnKCIgdXNiX3N1Ym1pdF91cmIocmVhZCBidWxrKSBmYWlsZWQsIHN0YXR1cyA9ICVkIiwKKwkJCSAgICBzdGF0dXMpOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1vczc4NDBfYnVsa19vdXRfZGF0YV9jYWxsYmFjaworICoJdGhpcyBpcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHdoZW4gd2UgaGF2ZSBmaW5pc2hlZCBzZW5kaW5nIHNlcmlhbCBkYXRhCisgKglvbiB0aGUgYnVsayBvdXQgZW5kcG9pbnQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIG1vczc4NDBfYnVsa19vdXRfZGF0YV9jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsCisJCQkJCSAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWlmICghdXJiKSB7CisJCWRiZygiJXMiLCAiSW52YWxpZCBQb2ludGVyICEhISE6XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICh1cmItPnN0YXR1cykgeworCQlkYmcoIm5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6JWRcbiIsIHVyYi0+c3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCW1vczc4NDBfcG9ydCA9IChzdHJ1Y3QgbW9zY2hpcF9wb3J0ICopdXJiLT5jb250ZXh0OworCWlmICghbW9zNzg0MF9wb3J0KSB7CisJCWRiZygiJXMiLCAiTlVMTCBtb3M3ODQwX3BvcnQgcG9pbnRlciBcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhtb3M3ODQwX3BvcnQtPnBvcnQsIF9fRlVOQ1RJT05fXykpIHsKKwkJZGJnKCIlcyIsICJQb3J0IFBhcmFub2lhIGZhaWxlZCBcbiIpOworCQlyZXR1cm47CisJfQorCisJZGJnKCIlcyBcbiIsICJFbnRlcmluZyAuLi4uLi4uLi4iKTsKKworCXR0eSA9IG1vczc4NDBfcG9ydC0+cG9ydC0+dHR5OworCisJaWYgKHR0eSAmJiBtb3M3ODQwX3BvcnQtPm9wZW4pIHsKKwkJLyogbGV0IHRoZSB0dHkgZHJpdmVyIHdha2V1cCBpZiBpdCBoYXMgYSBzcGVjaWFsICoKKwkJICogd3JpdGVfd2FrZXVwIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwkJaWYgKCh0dHktPmZsYWdzICYgKDEgPDwgVFRZX0RPX1dSSVRFX1dBS0VVUCkpCisJCSAgICAmJiB0dHktPmxkaXNjLndyaXRlX3dha2V1cCkgeworCQkJKHR0eS0+bGRpc2Mud3JpdGVfd2FrZXVwKSAodHR5KTsKKwkJfQorCisJCS8qIHRlbGwgdGhlIHR0eSBkcml2ZXIgdGhhdCBzb21ldGhpbmcgaGFzIGNoYW5nZWQgKi8KKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ0dHktPndyaXRlX3dhaXQpOworCX0KKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgRCBSIEkgViBFIFIgIFQgVCBZICBJIE4gVCBFIFIgRiBBIEMgRSAgRiBVIE4gQyBUIEkgTyBOIFMgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgTUNTU2VyaWFsUHJvYmUKK3N0YXRpYyBpbnQgbW9zNzg0MF9zZXJpYWxfcHJvYmUoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCwKKwkJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisKKwkvKm5lZWQgdG8gaW1wbGVtZW50IHRoZSBtb2RlX3JlZyByZWFkaW5nIGFuZCB1cGRhdGluZ1wKKwkgICBzdHJ1Y3R1cmVzIHVzYl9zZXJpYWxfIGRldmljZV90eXBlXAorCSAgIChpLmUgbnVtX3BvcnRzLCBudW1fYnVsa2luLGJ1bGtvdXQgZXRjKSAqLworCS8qIEFsc28gd2UgY2FuIHVwZGF0ZSB0aGUgY2hhbmdlcyAgYXR0YWNoICovCisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtb3M3ODQwX29wZW4KKyAqCXRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSB0dHkgZHJpdmVyIHdoZW4gYSBwb3J0IGlzIG9wZW5lZAorICoJSWYgc3VjY2Vzc2Z1bCwgd2UgcmV0dXJuIDAKKyAqCU90aGVyd2lzZSB3ZSByZXR1cm4gYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgbW9zNzg0MF9vcGVuKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWludCByZXNwb25zZTsKKwlpbnQgajsKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOworCXN0cnVjdCB1cmIgKnVyYjsKKwlfX3UxNiBEYXRhOworCWludCBzdGF0dXM7CisJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzg0MF9wb3J0OworCisJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX0ZVTkNUSU9OX18pKSB7CisJCWRiZygiJXMiLCAiUG9ydCBQYXJhbm9pYSBmYWlsZWQgXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbW9zNzg0MF9udW1fb3Blbl9wb3J0cysrOworCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKworCWlmIChtb3M3ODQwX3NlcmlhbF9wYXJhbm9pYV9jaGVjayhzZXJpYWwsIF9fRlVOQ1RJT05fXykpIHsKKwkJZGJnKCIlcyIsICJTZXJpYWwgUGFyYW5vaWEgZmFpbGVkIFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW1vczc4NDBfcG9ydCA9IG1vczc4NDBfZ2V0X3BvcnRfcHJpdmF0ZShwb3J0KTsKKworCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl1c2JfY2xlYXJfaGFsdChzZXJpYWwtPmRldiwgcG9ydC0+d3JpdGVfdXJiLT5waXBlKTsKKwl1c2JfY2xlYXJfaGFsdChzZXJpYWwtPmRldiwgcG9ydC0+cmVhZF91cmItPnBpcGUpOworCisJLyogSW5pdGlhbGlzaW5nIHRoZSB3cml0ZSB1cmIgcG9vbCAqLworCWZvciAoaiA9IDA7IGogPCBOVU1fVVJCUzsgKytqKSB7CisJCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgU0xBQl9BVE9NSUMpOworCQltb3M3ODQwX3BvcnQtPndyaXRlX3VyYl9wb29sW2pdID0gdXJiOworCisJCWlmICh1cmIgPT0gTlVMTCkgeworCQkJZXJyKCJObyBtb3JlIHVyYnM/Pz8iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBOVUxMOworCQl1cmItPnRyYW5zZmVyX2J1ZmZlciA9CisJCSAgICBrbWFsbG9jKFVSQl9UUkFOU0ZFUl9CVUZGRVJfU0laRSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdXJiLT50cmFuc2Zlcl9idWZmZXIpIHsKKwkJCWVycigiJXMtb3V0IG9mIG1lbW9yeSBmb3IgdXJiIGJ1ZmZlcnMuIiwgX19GVU5DVElPTl9fKTsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXRpYWxpemUgTUNTNzg0MCAtLSBXcml0ZSBJbml0IHZhbHVlcyB0byBjb3JyZXNwb25kaW5nIFJlZ2lzdGVycworICoKKyAqIFJlZ2lzdGVyIEluZGV4CisgKiAxIDogSUVSCisgKiAyIDogRkNSCisgKiAzIDogTENSCisgKiA0IDogTUNSCisgKgorICogMHgwOCA6IFNQMS8yIENvbnRyb2wgUmVnCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vTkVFRCB0byBjaGVjayB0aGUgZm9sbG93aW5nIEJsb2NrCisKKwlzdGF0dXMgPSAwOworCURhdGEgPSAweDA7CisJc3RhdHVzID0gbW9zNzg0MF9nZXRfcmVnX3N5bmMocG9ydCwgbW9zNzg0MF9wb3J0LT5TcFJlZ09mZnNldCwgJkRhdGEpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWRiZygiUmVhZGluZyBTcHJlZyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCURhdGEgfD0gMHg4MDsKKwlzdGF0dXMgPSBtb3M3ODQwX3NldF9yZWdfc3luYyhwb3J0LCBtb3M3ODQwX3BvcnQtPlNwUmVnT2Zmc2V0LCBEYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkYmcoIndyaXRpbmcgU3ByZWcgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCURhdGEgJj0gfjB4ODA7CisJc3RhdHVzID0gbW9zNzg0MF9zZXRfcmVnX3N5bmMocG9ydCwgbW9zNzg0MF9wb3J0LT5TcFJlZ09mZnNldCwgRGF0YSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJZGJnKCJ3cml0aW5nIFNwcmVnIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisvL0VuZCBvZiBibG9jayB0byBiZSBjaGVja2VkCisKKwlzdGF0dXMgPSAwOworCURhdGEgPSAweDA7CisJc3RhdHVzID0KKwkgICAgbW9zNzg0MF9nZXRfcmVnX3N5bmMocG9ydCwgbW9zNzg0MF9wb3J0LT5Db250cm9sUmVnT2Zmc2V0LCAmRGF0YSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJZGJnKCJSZWFkaW5nIENvbnRyb2xyZWcgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlEYXRhIHw9IDB4MDg7CQkvL0RyaXZlciBkb25lIGJpdAorCURhdGEgfD0gMHgyMDsJCS8vcnhfZGlzYWJsZQorCXN0YXR1cyA9IDA7CisJc3RhdHVzID0KKwkgICAgbW9zNzg0MF9zZXRfcmVnX3N5bmMocG9ydCwgbW9zNzg0MF9wb3J0LT5Db250cm9sUmVnT2Zmc2V0LCBEYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkYmcoIndyaXRpbmcgQ29udHJvbHJlZyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCS8vZG8gcmVnaXN0ZXIgc2V0dGluZ3MgaGVyZQorCS8vIFNldCBhbGwgcmVncyB0byB0aGUgZGV2aWNlIGRlZmF1bHQgdmFsdWVzLgorCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCS8vIEZpcnN0IERpc2FibGUgYWxsIGludGVycnVwdHMuCisJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwlEYXRhID0gMHgwMDsKKwlzdGF0dXMgPSAwOworCXN0YXR1cyA9IG1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsIElOVEVSUlVQVF9FTkFCTEVfUkVHSVNURVIsIERhdGEpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWRiZygiZGlzYWJsZWluZyBpbnRlcnJ1cHRzIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJLy8gU2V0IEZJRk9fQ09OVFJPTF9SRUdJU1RFUiB0byB0aGUgZGVmYXVsdCB2YWx1ZQorCURhdGEgPSAweDAwOworCXN0YXR1cyA9IDA7CisJc3RhdHVzID0gbW9zNzg0MF9zZXRfdWFydF9yZWcocG9ydCwgRklGT19DT05UUk9MX1JFR0lTVEVSLCBEYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkYmcoIldyaXRpbmcgRklGT19DT05UUk9MX1JFR0lTVEVSICBmYWlsZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJRGF0YSA9IDB4Y2Y7CisJc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBtb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBGSUZPX0NPTlRST0xfUkVHSVNURVIsIERhdGEpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWRiZygiV3JpdGluZyBGSUZPX0NPTlRST0xfUkVHSVNURVIgIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlEYXRhID0gMHgwMzsKKwlzdGF0dXMgPSAwOworCXN0YXR1cyA9IG1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsIExJTkVfQ09OVFJPTF9SRUdJU1RFUiwgRGF0YSk7CisJbW9zNzg0MF9wb3J0LT5zaGFkb3dMQ1IgPSBEYXRhOworCisJRGF0YSA9IDB4MGI7CisJc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBtb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBNT0RFTV9DT05UUk9MX1JFR0lTVEVSLCBEYXRhKTsKKwltb3M3ODQwX3BvcnQtPnNoYWRvd01DUiA9IERhdGE7CisKKwlEYXRhID0gMHgwMDsKKwlzdGF0dXMgPSAwOworCXN0YXR1cyA9IG1vczc4NDBfZ2V0X3VhcnRfcmVnKHBvcnQsIExJTkVfQ09OVFJPTF9SRUdJU1RFUiwgJkRhdGEpOworCW1vczc4NDBfcG9ydC0+c2hhZG93TENSID0gRGF0YTsKKworCURhdGEgfD0gU0VSSUFMX0xDUl9ETEFCOwkvL2RhdGEgbGF0Y2ggZW5hYmxlIGluIExDUiAweDgwCisJc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBtb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBMSU5FX0NPTlRST0xfUkVHSVNURVIsIERhdGEpOworCisJRGF0YSA9IDB4MGM7CisJc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBtb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBESVZJU09SX0xBVENIX0xTQiwgRGF0YSk7CisKKwlEYXRhID0gMHgwOworCXN0YXR1cyA9IDA7CisJc3RhdHVzID0gbW9zNzg0MF9zZXRfdWFydF9yZWcocG9ydCwgRElWSVNPUl9MQVRDSF9NU0IsIERhdGEpOworCisJRGF0YSA9IDB4MDA7CisJc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBtb3M3ODQwX2dldF91YXJ0X3JlZyhwb3J0LCBMSU5FX0NPTlRST0xfUkVHSVNURVIsICZEYXRhKTsKKworCURhdGEgPSBEYXRhICYgflNFUklBTF9MQ1JfRExBQjsKKwlzdGF0dXMgPSAwOworCXN0YXR1cyA9IG1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsIExJTkVfQ09OVFJPTF9SRUdJU1RFUiwgRGF0YSk7CisJbW9zNzg0MF9wb3J0LT5zaGFkb3dMQ1IgPSBEYXRhOworCisJLy9jbGVhcmluZyBCdWxraW4gYW5kIEJ1bGtvdXQgRmlmbworCURhdGEgPSAweDA7CisJc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBtb3M3ODQwX2dldF9yZWdfc3luYyhwb3J0LCBtb3M3ODQwX3BvcnQtPlNwUmVnT2Zmc2V0LCAmRGF0YSk7CisKKwlEYXRhID0gRGF0YSB8IDB4MGM7CisJc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBtb3M3ODQwX3NldF9yZWdfc3luYyhwb3J0LCBtb3M3ODQwX3BvcnQtPlNwUmVnT2Zmc2V0LCBEYXRhKTsKKworCURhdGEgPSBEYXRhICYgfjB4MGM7CisJc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBtb3M3ODQwX3NldF9yZWdfc3luYyhwb3J0LCBtb3M3ODQwX3BvcnQtPlNwUmVnT2Zmc2V0LCBEYXRhKTsKKwkvL0ZpbmFsbHkgZW5hYmxlIGFsbCBpbnRlcnJ1cHRzCisJRGF0YSA9IDB4MDsKKwlEYXRhID0gMHgwYzsKKwlzdGF0dXMgPSAwOworCXN0YXR1cyA9IG1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsIElOVEVSUlVQVF9FTkFCTEVfUkVHSVNURVIsIERhdGEpOworCisJLy9jbGVhcmluZyByeF9kaXNhYmxlCisJRGF0YSA9IDB4MDsKKwlzdGF0dXMgPSAwOworCXN0YXR1cyA9CisJICAgIG1vczc4NDBfZ2V0X3JlZ19zeW5jKHBvcnQsIG1vczc4NDBfcG9ydC0+Q29udHJvbFJlZ09mZnNldCwgJkRhdGEpOworCURhdGEgPSBEYXRhICYgfjB4MjA7CisJc3RhdHVzID0gMDsKKwlzdGF0dXMgPQorCSAgICBtb3M3ODQwX3NldF9yZWdfc3luYyhwb3J0LCBtb3M3ODQwX3BvcnQtPkNvbnRyb2xSZWdPZmZzZXQsIERhdGEpOworCisJLy8gcnhfbmVnYXRlCisJRGF0YSA9IDB4MDsKKwlzdGF0dXMgPSAwOworCXN0YXR1cyA9CisJICAgIG1vczc4NDBfZ2V0X3JlZ19zeW5jKHBvcnQsIG1vczc4NDBfcG9ydC0+Q29udHJvbFJlZ09mZnNldCwgJkRhdGEpOworCURhdGEgPSBEYXRhIHwgMHgxMDsKKwlzdGF0dXMgPSAwOworCXN0YXR1cyA9CisJICAgIG1vczc4NDBfc2V0X3JlZ19zeW5jKHBvcnQsIG1vczc4NDBfcG9ydC0+Q29udHJvbFJlZ09mZnNldCwgRGF0YSk7CisKKwkvKiBmb3JjZSBsb3dfbGF0ZW5jeSBvbiBzbyB0aGF0IG91ciB0dHlfcHVzaCBhY3R1YWxseSBmb3JjZXMgKgorCSAqIHRoZSBkYXRhIHRocm91Z2gsb3RoZXJ3aXNlIGl0IGlzIHNjaGVkdWxlZCwgYW5kIHdpdGggICAgICAqCisJICogaGlnaCBkYXRhIHJhdGVzIChsaWtlIHdpdGggT0hDSSkgZGF0YSBjYW4gZ2V0IGxvc3QuICAgICAgICovCisKKwlpZiAocG9ydC0+dHR5KQorCQlwb3J0LT50dHktPmxvd19sYXRlbmN5ID0gMTsKKy8qIENoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBzZXQgdXAgb3VyIGVuZHBvaW50IGluZm8geWV0ICAgICoKKyAgICAgKiAoY2FuJ3Qgc2V0IGl0IHVwIGluIG1vczc4NDBfc3RhcnR1cCBhcyB0aGUgc3RydWN0dXJlcyAqCisgICAgICogd2VyZSBub3Qgc2V0IHVwIGF0IHRoYXQgdGltZS4pICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpZiAobW9zNzg0MF9udW1fb3Blbl9wb3J0cyA9PSAxKSB7CisJCWlmIChzZXJpYWwtPnBvcnRbMF0tPmludGVycnVwdF9pbl9idWZmZXIgPT0gTlVMTCkgeworCisJCQkvKiBzZXQgdXAgaW50ZXJydXB0IHVyYiAqLworCisJCQl1c2JfZmlsbF9pbnRfdXJiKHNlcmlhbC0+cG9ydFswXS0+aW50ZXJydXB0X2luX3VyYiwKKwkJCQkJIHNlcmlhbC0+ZGV2LAorCQkJCQkgdXNiX3JjdmludHBpcGUoc2VyaWFsLT5kZXYsCisJCQkJCQkJc2VyaWFsLT5wb3J0WzBdLT4KKwkJCQkJCQlpbnRlcnJ1cHRfaW5fZW5kcG9pbnRBZGRyZXNzKSwKKwkJCQkJIHNlcmlhbC0+cG9ydFswXS0+aW50ZXJydXB0X2luX2J1ZmZlciwKKwkJCQkJIHNlcmlhbC0+cG9ydFswXS0+aW50ZXJydXB0X2luX3VyYi0+CisJCQkJCSB0cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAorCQkJCQkgbW9zNzg0MF9pbnRlcnJ1cHRfY2FsbGJhY2ssCisJCQkJCSBzZXJpYWwsCisJCQkJCSBzZXJpYWwtPnBvcnRbMF0tPmludGVycnVwdF9pbl91cmItPgorCQkJCQkgaW50ZXJ2YWwpOworCisJCQkvKiBzdGFydCBpbnRlcnJ1cHQgcmVhZCBmb3IgbW9zNzg0MCAgICAgICAgICAgICAgICoKKwkJCSAqIHdpbGwgY29udGludWUgYXMgbG9uZyBhcyBtb3M3ODQwIGlzIGNvbm5lY3RlZCAgKi8KKworCQkJcmVzcG9uc2UgPQorCQkJICAgIHVzYl9zdWJtaXRfdXJiKHNlcmlhbC0+cG9ydFswXS0+aW50ZXJydXB0X2luX3VyYiwKKwkJCQkJICAgR0ZQX0tFUk5FTCk7CisJCQlpZiAocmVzcG9uc2UpIHsKKwkJCQllcnIoIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiIiwKKwkJCQkgICAgX19GVU5DVElPTl9fLCByZXNwb25zZSk7CisJCQl9CisKKwkJfQorCisJfQorCisJLyogc2VlIGlmIHdlJ3ZlIHNldCB1cCBvdXIgZW5kcG9pbnQgaW5mbyB5ZXQgICAqCisJICogKGNhbid0IHNldCBpdCB1cCBpbiBtb3M3ODQwX3N0YXJ0dXAgYXMgdGhlICAqCisJICogc3RydWN0dXJlcyB3ZXJlIG5vdCBzZXQgdXAgYXQgdGhhdCB0aW1lLikgICAqLworCisJZGJnKCJwb3J0IG51bWJlciBpcyAlZCBcbiIsIHBvcnQtPm51bWJlcik7CisJZGJnKCJzZXJpYWwgbnVtYmVyIGlzICVkIFxuIiwgcG9ydC0+c2VyaWFsLT5taW5vcik7CisJZGJnKCJCdWxraW4gZW5kcG9pbnQgaXMgJWQgXG4iLCBwb3J0LT5idWxrX2luX2VuZHBvaW50QWRkcmVzcyk7CisJZGJnKCJCdWxrT3V0IGVuZHBvaW50IGlzICVkIFxuIiwgcG9ydC0+YnVsa19vdXRfZW5kcG9pbnRBZGRyZXNzKTsKKwlkYmcoIkludGVycnVwdCBlbmRwb2ludCBpcyAlZCBcbiIsIHBvcnQtPmludGVycnVwdF9pbl9lbmRwb2ludEFkZHJlc3MpOworCWRiZygicG9ydCdzIG51bWJlciBpbiB0aGUgZGV2aWNlIGlzICVkXG4iLCBtb3M3ODQwX3BvcnQtPnBvcnRfbnVtKTsKKwltb3M3ODQwX3BvcnQtPnJlYWRfdXJiID0gcG9ydC0+cmVhZF91cmI7CisKKwkvKiBzZXQgdXAgb3VyIGJ1bGsgaW4gdXJiICovCisKKwl1c2JfZmlsbF9idWxrX3VyYihtb3M3ODQwX3BvcnQtPnJlYWRfdXJiLAorCQkJICBzZXJpYWwtPmRldiwKKwkJCSAgdXNiX3JjdmJ1bGtwaXBlKHNlcmlhbC0+ZGV2LAorCQkJCQkgIHBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKSwKKwkJCSAgcG9ydC0+YnVsa19pbl9idWZmZXIsCisJCQkgIG1vczc4NDBfcG9ydC0+cmVhZF91cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQkgIG1vczc4NDBfYnVsa19pbl9jYWxsYmFjaywgbW9zNzg0MF9wb3J0KTsKKworCWRiZygibW9zNzg0MF9vcGVuOiBidWxraW4gZW5kcG9pbnQgaXMgJWRcbiIsCisJICAgIHBvcnQtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyZXNzKTsKKwlyZXNwb25zZSA9IHVzYl9zdWJtaXRfdXJiKG1vczc4NDBfcG9ydC0+cmVhZF91cmIsIEdGUF9LRVJORUwpOworCWlmIChyZXNwb25zZSkgeworCQllcnIoIiVzIC0gRXJyb3IgJWQgc3VibWl0dGluZyBjb250cm9sIHVyYiIsIF9fRlVOQ1RJT05fXywKKwkJICAgIHJlc3BvbnNlKTsKKwl9CisKKwkvKiBpbml0aWFsaXplIG91ciB3YWl0IHF1ZXVlcyAqLworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1vczc4NDBfcG9ydC0+d2FpdF9jaGFzZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbW9zNzg0MF9wb3J0LT5kZWx0YV9tc3Jfd2FpdCk7CisKKwkvKiBpbml0aWFsaXplIG91ciBpY291bnQgc3RydWN0dXJlICovCisJbWVtc2V0KCYobW9zNzg0MF9wb3J0LT5pY291bnQpLCAweDAwLCBzaXplb2YobW9zNzg0MF9wb3J0LT5pY291bnQpKTsKKworCS8qIGluaXRpYWxpemUgb3VyIHBvcnQgc2V0dGluZ3MgKi8KKwltb3M3ODQwX3BvcnQtPnNoYWRvd01DUiA9IE1DUl9NQVNURVJfSUU7CS8qIE11c3Qgc2V0IHRvIGVuYWJsZSBpbnRzISAqLworCS8qIHNlbmQgYSBvcGVuIHBvcnQgY29tbWFuZCAqLworCW1vczc4NDBfcG9ydC0+b3BlbiA9IDE7CisJLy9tb3M3ODQwX2NoYW5nZV9wb3J0X3NldHRpbmdzKG1vczc4NDBfcG9ydCxvbGRfdGVybWlvcyk7CisJbW9zNzg0MF9wb3J0LT5pY291bnQudHggPSAwOworCW1vczc4NDBfcG9ydC0+aWNvdW50LnJ4ID0gMDsKKworCWRiZygiXG5cbnVzYl9zZXJpYWwgc2VyaWFsOiV4ICAgICAgIG1vczc4NDBfcG9ydDoleFxuICAgICAgdXNiX3NlcmlhbF9wb3J0IHBvcnQ6JXhcblxuIiwgKHVuc2lnbmVkIGludClzZXJpYWwsICh1bnNpZ25lZCBpbnQpbW9zNzg0MF9wb3J0LCAodW5zaWduZWQgaW50KXBvcnQpOworCisJcmV0dXJuIDA7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtb3M3ODQwX2NoYXJzX2luX2J1ZmZlcgorICoJdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHR0eSBkcml2ZXIgd2hlbiBpdCB3YW50cyB0byBrbm93IGhvdyBtYW55CisgKglieXRlcyBvZiBkYXRhIHdlIGN1cnJlbnRseSBoYXZlIG91dHN0YW5kaW5nIGluIHRoZSBwb3J0IChkYXRhIHRoYXQgaGFzCisgKgliZWVuIHdyaXR0ZW4sIGJ1dCBoYXNuJ3QgbWFkZSBpdCBvdXQgdGhlIHBvcnQgeWV0KQorICoJSWYgc3VjY2Vzc2Z1bCwgd2UgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCB0byBiZSB3cml0dGVuIGluIHRoZQorICoJc3lzdGVtLAorICoJT3RoZXJ3aXNlIHdlIHJldHVybiBhIG5lZ2F0aXZlIGVycm9yIG51bWJlci4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBtb3M3ODQwX2NoYXJzX2luX2J1ZmZlcihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCWludCBpOworCWludCBjaGFycyA9IDA7CisJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzg0MF9wb3J0OworCisJZGJnKCIlcyBcbiIsICIgbW9zNzg0MF9jaGFyc19pbl9idWZmZXI6ZW50ZXJpbmcgLi4uLi4uLi4uLi4iKTsKKworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCQlkYmcoIiVzIiwgIkludmFsaWQgcG9ydCBcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbW9zNzg0MF9wb3J0ID0gbW9zNzg0MF9nZXRfcG9ydF9wcml2YXRlKHBvcnQpOworCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCkgeworCQlkYmcoIiVzIFxuIiwgIm1vczc4NDBfYnJlYWs6bGVhdmluZyAuLi4uLi4uLi4uLiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE5VTV9VUkJTOyArK2kpIHsKKwkJaWYgKG1vczc4NDBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbaV0tPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKKwkJCWNoYXJzICs9IFVSQl9UUkFOU0ZFUl9CVUZGRVJfU0laRTsKKwkJfQorCX0KKwlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgY2hhcnMpOworCXJldHVybiAoY2hhcnMpOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBtb3M3ODQwX2Jsb2NrX3VudGlsX3R4X2VtcHR5CisgKgorICoJVGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHRoZSBjbG9zZSB1bnRpbCBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqCQkxLiBUWCBjb3VudCBhcmUgMAorICoJCTIuIFRoZSBtb3M3ODQwIGhhcyBzdG9wcGVkCisgKgkJMy4gQSB0aW1vdXQgb2YgMyBzZWNvbmRzIHdpdGhvdXQgYWN0aXZpdHkgaGFzIGV4cGlyZWQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbW9zNzg0MF9ibG9ja191bnRpbF90eF9lbXB0eShzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3ODQwX3BvcnQpCit7CisJaW50IHRpbWVvdXQgPSBIWiAvIDEwOworCWludCB3YWl0ID0gMzA7CisJaW50IGNvdW50OworCisJd2hpbGUgKDEpIHsKKworCQljb3VudCA9IG1vczc4NDBfY2hhcnNfaW5fYnVmZmVyKG1vczc4NDBfcG9ydC0+cG9ydCk7CisKKwkJLyogQ2hlY2sgZm9yIEJ1ZmZlciBzdGF0dXMgKi8KKwkJaWYgKGNvdW50IDw9IDApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIEJsb2NrIHRoZSB0aHJlYWQgZm9yIGEgd2hpbGUgKi8KKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZtb3M3ODQwX3BvcnQtPndhaXRfY2hhc2UsCisJCQkJCSAgICAgICB0aW1lb3V0KTsKKworCQkvKiBObyBhY3Rpdml0eS4uIGNvdW50IGRvd24gc2VjdGlvbiAqLworCQl3YWl0LS07CisJCWlmICh3YWl0ID09IDApIHsKKwkJCWRiZygiJXMgLSBUSU1FT1VUIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCS8qIFJlc2V0IHRpbW91dCB2YWx1ZSBiYWNrIHRvIHNlY29uZHMgKi8KKwkJCXdhaXQgPSAzMDsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtb3M3ODQwX2Nsb3NlCisgKgl0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdHR5IGRyaXZlciB3aGVuIGEgcG9ydCBpcyBjbG9zZWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgbW9zNzg0MF9jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKKwlpbnQgajsKKwlfX3UxNiBEYXRhOworCisJZGJnKCIlc1xuIiwgIm1vczc4NDBfY2xvc2U6ZW50ZXJpbmcuLi4iKTsKKworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCQlkYmcoIiVzIiwgIlBvcnQgUGFyYW5vaWEgZmFpbGVkIFxuIik7CisJCXJldHVybjsKKwl9CisKKwlzZXJpYWwgPSBtb3M3ODQwX2dldF91c2Jfc2VyaWFsKHBvcnQsIF9fRlVOQ1RJT05fXyk7CisJaWYgKCFzZXJpYWwpIHsKKwkJZGJnKCIlcyIsICJTZXJpYWwgUGFyYW5vaWEgZmFpbGVkIFxuIik7CisJCXJldHVybjsKKwl9CisKKwltb3M3ODQwX3BvcnQgPSBtb3M3ODQwX2dldF9wb3J0X3ByaXZhdGUocG9ydCk7CisKKwlpZiAobW9zNzg0MF9wb3J0ID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaiA9IDA7IGogPCBOVU1fVVJCUzsgKytqKQorCQl1c2Jfa2lsbF91cmIobW9zNzg0MF9wb3J0LT53cml0ZV91cmJfcG9vbFtqXSk7CisKKwkvKiBGcmVlaW5nIFdyaXRlIFVSQnMgKi8KKwlmb3IgKGogPSAwOyBqIDwgTlVNX1VSQlM7ICsraikgeworCQlpZiAobW9zNzg0MF9wb3J0LT53cml0ZV91cmJfcG9vbFtqXSkgeworCQkJaWYgKG1vczc4NDBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbal0tPnRyYW5zZmVyX2J1ZmZlcikKKwkJCQlrZnJlZShtb3M3ODQwX3BvcnQtPndyaXRlX3VyYl9wb29sW2pdLT4KKwkJCQkgICAgICB0cmFuc2Zlcl9idWZmZXIpOworCisJCQl1c2JfZnJlZV91cmIobW9zNzg0MF9wb3J0LT53cml0ZV91cmJfcG9vbFtqXSk7CisJCX0KKwl9CisKKwlpZiAoc2VyaWFsLT5kZXYpIHsKKwkJLyogZmx1c2ggYW5kIGJsb2NrIHVudGlsIHR4IGlzIGVtcHR5ICovCisJCW1vczc4NDBfYmxvY2tfdW50aWxfdHhfZW1wdHkobW9zNzg0MF9wb3J0KTsKKwl9CisKKwkvKiBXaGlsZSBjbG9zaW5nIHBvcnQsIHNodXRkb3duIGFsbCBidWxrIHJlYWQsIHdyaXRlICAqCisJICogYW5kIGludGVycnVwdCByZWFkIGlmIHRoZXkgZXhpc3RzICAgICAgICAgICAgICAgICAgKi8KKwlpZiAoc2VyaWFsLT5kZXYpIHsKKworCQlpZiAobW9zNzg0MF9wb3J0LT53cml0ZV91cmIpIHsKKwkJCWRiZygiJXMiLCAiU2h1dGRvd24gYnVsayB3cml0ZVxuIik7CisJCQl1c2Jfa2lsbF91cmIobW9zNzg0MF9wb3J0LT53cml0ZV91cmIpOworCQl9CisKKwkJaWYgKG1vczc4NDBfcG9ydC0+cmVhZF91cmIpIHsKKwkJCWRiZygiJXMiLCAiU2h1dGRvd24gYnVsayByZWFkXG4iKTsKKwkJCXVzYl9raWxsX3VyYihtb3M3ODQwX3BvcnQtPnJlYWRfdXJiKTsKKwkJfQorCQlpZiAoKCZtb3M3ODQwX3BvcnQtPmNvbnRyb2xfdXJiKSkgeworCQkJZGJnKCIlcyIsICJTaHV0ZG93biBjb250cm9sIHJlYWRcbiIpOworCQkJLy8gICAgICB1c2Jfa2lsbF91cmIgKG1vczc4NDBfcG9ydC0+Y29udHJvbF91cmIpOworCisJCX0KKwl9CisvLyAgICAgICAgICAgICAgaWYobW9zNzg0MF9wb3J0LT5jdHJsX2J1ZiAhPSBOVUxMKQorLy8gICAgICAgICAgICAgICAgICAgICAga2ZyZWUobW9zNzg0MF9wb3J0LT5jdHJsX2J1Zik7CisJbW9zNzg0MF9udW1fb3Blbl9wb3J0cy0tOworCWRiZygibW9zNzg0MF9udW1fb3Blbl9wb3J0cyBpbiBjbG9zZSVkOmluIHBvcnQlZFxuIiwKKwkgICAgbW9zNzg0MF9udW1fb3Blbl9wb3J0cywgcG9ydC0+bnVtYmVyKTsKKwlpZiAobW9zNzg0MF9udW1fb3Blbl9wb3J0cyA9PSAwKSB7CisJCWlmIChzZXJpYWwtPnBvcnRbMF0tPmludGVycnVwdF9pbl91cmIpIHsKKwkJCWRiZygiJXMiLCAiU2h1dGRvd24gaW50ZXJydXB0X2luX3VyYlxuIik7CisJCX0KKwl9CisKKwlpZiAobW9zNzg0MF9wb3J0LT53cml0ZV91cmIpIHsKKwkJLyogaWYgdGhpcyB1cmIgaGFkIGEgdHJhbnNmZXIgYnVmZmVyIGFscmVhZHkgKG9sZCB0eCkgZnJlZSBpdCAqLworCisJCWlmIChtb3M3ODQwX3BvcnQtPndyaXRlX3VyYi0+dHJhbnNmZXJfYnVmZmVyICE9IE5VTEwpIHsKKwkJCWtmcmVlKG1vczc4NDBfcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQl9CisJCXVzYl9mcmVlX3VyYihtb3M3ODQwX3BvcnQtPndyaXRlX3VyYik7CisJfQorCisJRGF0YSA9IDB4MDsKKwltb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBNT0RFTV9DT05UUk9MX1JFR0lTVEVSLCBEYXRhKTsKKworCURhdGEgPSAweDAwOworCW1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsIElOVEVSUlVQVF9FTkFCTEVfUkVHSVNURVIsIERhdGEpOworCisJbW9zNzg0MF9wb3J0LT5vcGVuID0gMDsKKworCWRiZygiJXMgXG4iLCAiTGVhdmluZyAuLi4uLi4uLi4uLi4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG1vczc4NDBfYmxvY2tfdW50aWxfY2hhc2VfcmVzcG9uc2UKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHdpbGwgYmxvY2sgdGhlIGNsb3NlIHVudGlsIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorICoJCTEuIFJlc3BvbnNlIHRvIG91ciBDaGFzZSBjb21lcyBmcm9tIG1vczc4NDAKKyAqCQkyLiBBIHRpbW91dCBvZiAxMCBzZWNvbmRzIHdpdGhvdXQgYWN0aXZpdHkgaGFzIGV4cGlyZWQKKyAqCQkgICAoMUsgb2YgbW9zNzg0MCBkYXRhIEAgMjQwMCBiYXVkID09PiA0IHNlYyB0byBlbXB0eSkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBtb3M3ODQwX2Jsb2NrX3VudGlsX2NoYXNlX3Jlc3BvbnNlKHN0cnVjdCBtb3NjaGlwX3BvcnQKKwkJCQkJICAgICAgICptb3M3ODQwX3BvcnQpCit7CisJaW50IHRpbWVvdXQgPSAxICogSFo7CisJaW50IHdhaXQgPSAxMDsKKwlpbnQgY291bnQ7CisKKwl3aGlsZSAoMSkgeworCQljb3VudCA9IG1vczc4NDBfY2hhcnNfaW5fYnVmZmVyKG1vczc4NDBfcG9ydC0+cG9ydCk7CisKKwkJLyogQ2hlY2sgZm9yIEJ1ZmZlciBzdGF0dXMgKi8KKwkJaWYgKGNvdW50IDw9IDApIHsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIEJsb2NrIHRoZSB0aHJlYWQgZm9yIGEgd2hpbGUgKi8KKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZtb3M3ODQwX3BvcnQtPndhaXRfY2hhc2UsCisJCQkJCSAgICAgICB0aW1lb3V0KTsKKwkJLyogTm8gYWN0aXZpdHkuLiBjb3VudCBkb3duIHNlY3Rpb24gKi8KKwkJd2FpdC0tOworCQlpZiAod2FpdCA9PSAwKSB7CisJCQlkYmcoIiVzIC0gVElNRU9VVCIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQkvKiBSZXNldCB0aW1vdXQgdmFsdWUgYmFjayB0byBzZWNvbmRzICovCisJCQl3YWl0ID0gMTA7CisJCX0KKwl9CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtb3M3ODQwX2JyZWFrCisgKgl0aGlzIGZ1bmN0aW9uIHNlbmRzIGEgYnJlYWsgdG8gdGhlIHBvcnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIG1vczc4NDBfYnJlYWsoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgaW50IGJyZWFrX3N0YXRlKQoreworCXVuc2lnbmVkIGNoYXIgZGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKKworCWRiZygiJXMgXG4iLCAiRW50ZXJpbmcgLi4uLi4uLi4uLi4iKTsKKwlkYmcoIm1vczc4NDBfYnJlYWs6IFN0YXJ0XG4iKTsKKworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCQlkYmcoIiVzIiwgIlBvcnQgUGFyYW5vaWEgZmFpbGVkIFxuIik7CisJCXJldHVybjsKKwl9CisKKwlzZXJpYWwgPSBtb3M3ODQwX2dldF91c2Jfc2VyaWFsKHBvcnQsIF9fRlVOQ1RJT05fXyk7CisJaWYgKCFzZXJpYWwpIHsKKwkJZGJnKCIlcyIsICJTZXJpYWwgUGFyYW5vaWEgZmFpbGVkIFxuIik7CisJCXJldHVybjsKKwl9CisKKwltb3M3ODQwX3BvcnQgPSBtb3M3ODQwX2dldF9wb3J0X3ByaXZhdGUocG9ydCk7CisKKwlpZiAobW9zNzg0MF9wb3J0ID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKworCWlmIChzZXJpYWwtPmRldikgeworCisJCS8qIGZsdXNoIGFuZCBibG9jayB1bnRpbCB0eCBpcyBlbXB0eSAqLworCQltb3M3ODQwX2Jsb2NrX3VudGlsX2NoYXNlX3Jlc3BvbnNlKG1vczc4NDBfcG9ydCk7CisJfQorCisJaWYgKGJyZWFrX3N0YXRlID09IC0xKSB7CisJCWRhdGEgPSBtb3M3ODQwX3BvcnQtPnNoYWRvd0xDUiB8IExDUl9TRVRfQlJFQUs7CisJfSBlbHNlIHsKKwkJZGF0YSA9IG1vczc4NDBfcG9ydC0+c2hhZG93TENSICYgfkxDUl9TRVRfQlJFQUs7CisJfQorCisJbW9zNzg0MF9wb3J0LT5zaGFkb3dMQ1IgPSBkYXRhOworCWRiZygibWNzNzg0MF9icmVhayBtb3M3ODQwX3BvcnQtPnNoYWRvd0xDUiBpcyAleFxuIiwKKwkgICAgbW9zNzg0MF9wb3J0LT5zaGFkb3dMQ1IpOworCW1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsIExJTkVfQ09OVFJPTF9SRUdJU1RFUiwKKwkJCSAgICAgbW9zNzg0MF9wb3J0LT5zaGFkb3dMQ1IpOworCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1vczc4NDBfd3JpdGVfcm9vbQorICoJdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHR0eSBkcml2ZXIgd2hlbiBpdCB3YW50cyB0byBrbm93IGhvdyBtYW55CisgKglieXRlcyBvZiBkYXRhIHdlIGNhbiBhY2NlcHQgZm9yIGEgc3BlY2lmaWMgcG9ydC4KKyAqCUlmIHN1Y2Nlc3NmdWwsIHdlIHJldHVybiB0aGUgYW1vdW50IG9mIHJvb20gdGhhdCB3ZSBoYXZlIGZvciB0aGlzIHBvcnQKKyAqCU90aGVyd2lzZSB3ZSByZXR1cm4gYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgbW9zNzg0MF93cml0ZV9yb29tKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJaW50IGk7CisJaW50IHJvb20gPSAwOworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKKworCWRiZygiJXMgXG4iLCAiIG1vczc4NDBfd3JpdGVfcm9vbTplbnRlcmluZyAuLi4uLi4uLi4uLiIpOworCisJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX0ZVTkNUSU9OX18pKSB7CisJCWRiZygiJXMiLCAiSW52YWxpZCBwb3J0IFxuIik7CisJCWRiZygiJXMgXG4iLCAiIG1vczc4NDBfd3JpdGVfcm9vbTpsZWF2aW5nIC4uLi4uLi4uLi4uIik7CisJCXJldHVybiAtMTsKKwl9CisKKwltb3M3ODQwX3BvcnQgPSBtb3M3ODQwX2dldF9wb3J0X3ByaXZhdGUocG9ydCk7CisJaWYgKG1vczc4NDBfcG9ydCA9PSBOVUxMKSB7CisJCWRiZygiJXMgXG4iLCAibW9zNzg0MF9icmVhazpsZWF2aW5nIC4uLi4uLi4uLi4uIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX1VSQlM7ICsraSkgeworCQlpZiAobW9zNzg0MF9wb3J0LT53cml0ZV91cmJfcG9vbFtpXS0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUykgeworCQkJcm9vbSArPSBVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkU7CisJCX0KKwl9CisKKwlkYmcoIiVzIC0gcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcm9vbSk7CisJcmV0dXJuIChyb29tKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1vczc4NDBfd3JpdGUKKyAqCXRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSB0dHkgZHJpdmVyIHdoZW4gZGF0YSBzaG91bGQgYmUgd3JpdHRlbiB0bworICoJdGhlIHBvcnQuCisgKglJZiBzdWNjZXNzZnVsLCB3ZSByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCBvdGhlcndpc2Ugd2UKKyAqICAgICAgcmV0dXJuIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG1vczc4NDBfd3JpdGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgY291bnQpCit7CisJaW50IHN0YXR1czsKKwlpbnQgaTsKKwlpbnQgYnl0ZXNfc2VudCA9IDA7CisJaW50IHRyYW5zZmVyX3NpemU7CisJaW50IGZyb21fdXNlciA9IDA7CisKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3ODQwX3BvcnQ7CisJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKKwlzdHJ1Y3QgdXJiICp1cmI7CisJLy9fX3UxNiBEYXRhOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmN1cnJlbnRfcG9zaXRpb24gPSBkYXRhOworCXVuc2lnbmVkIGNoYXIgKmRhdGExOworCWRiZygiJXMgXG4iLCAiZW50ZXJpbmcgLi4uLi4uLi4uLi4iKTsKKwkvL2RiZygibW9zNzg0MF93cml0ZTogbW9zNzg0MF9wb3J0LT5zaGFkb3dMQ1IgaXMgJXhcbiIsbW9zNzg0MF9wb3J0LT5zaGFkb3dMQ1IpOworCisjaWZkZWYgTk9UTU9TNzg0MAorCURhdGEgPSAweDAwOworCXN0YXR1cyA9IDA7CisJc3RhdHVzID0gbW9zNzg0MF9nZXRfdWFydF9yZWcocG9ydCwgTElORV9DT05UUk9MX1JFR0lTVEVSLCAmRGF0YSk7CisJbW9zNzg0MF9wb3J0LT5zaGFkb3dMQ1IgPSBEYXRhOworCWRiZygibW9zNzg0MF93cml0ZTogTElORV9DT05UUk9MX1JFR0lTVEVSIGlzICV4XG4iLCBEYXRhKTsKKwlkYmcoIm1vczc4NDBfd3JpdGU6IG1vczc4NDBfcG9ydC0+c2hhZG93TENSIGlzICV4XG4iLAorCSAgICBtb3M3ODQwX3BvcnQtPnNoYWRvd0xDUik7CisKKwkvL0RhdGEgPSAweDAzOworCS8vc3RhdHVzID0gbW9zNzg0MF9zZXRfdWFydF9yZWcocG9ydCxMSU5FX0NPTlRST0xfUkVHSVNURVIsRGF0YSk7CisJLy9tb3M3ODQwX3BvcnQtPnNoYWRvd0xDUj1EYXRhOy8vTmVlZCB0byBhZGQgbGF0ZXIKKworCURhdGEgfD0gU0VSSUFMX0xDUl9ETEFCOwkvL2RhdGEgbGF0Y2ggZW5hYmxlIGluIExDUiAweDgwCisJc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBtb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBMSU5FX0NPTlRST0xfUkVHSVNURVIsIERhdGEpOworCisJLy9EYXRhID0gMHgwYzsKKwkvL3N0YXR1cyA9IG1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsRElWSVNPUl9MQVRDSF9MU0IsRGF0YSk7CisJRGF0YSA9IDB4MDA7CisJc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBtb3M3ODQwX2dldF91YXJ0X3JlZyhwb3J0LCBESVZJU09SX0xBVENIX0xTQiwgJkRhdGEpOworCWRiZygibW9zNzg0MF93cml0ZTpETEwgdmFsdWUgaXMgJXhcbiIsIERhdGEpOworCisJRGF0YSA9IDB4MDsKKwlzdGF0dXMgPSAwOworCXN0YXR1cyA9IG1vczc4NDBfZ2V0X3VhcnRfcmVnKHBvcnQsIERJVklTT1JfTEFUQ0hfTVNCLCAmRGF0YSk7CisJZGJnKCJtb3M3ODQwX3dyaXRlOkRMTSB2YWx1ZSBpcyAleFxuIiwgRGF0YSk7CisKKwlEYXRhID0gRGF0YSAmIH5TRVJJQUxfTENSX0RMQUI7CisJZGJnKCJtb3M3ODQwX3dyaXRlOiBtb3M3ODQwX3BvcnQtPnNoYWRvd0xDUiBpcyAleFxuIiwKKwkgICAgbW9zNzg0MF9wb3J0LT5zaGFkb3dMQ1IpOworCXN0YXR1cyA9IDA7CisJc3RhdHVzID0gbW9zNzg0MF9zZXRfdWFydF9yZWcocG9ydCwgTElORV9DT05UUk9MX1JFR0lTVEVSLCBEYXRhKTsKKyNlbmRpZgorCisJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX0ZVTkNUSU9OX18pKSB7CisJCWRiZygiJXMiLCAiUG9ydCBQYXJhbm9pYSBmYWlsZWQgXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKKwlpZiAobW9zNzg0MF9zZXJpYWxfcGFyYW5vaWFfY2hlY2soc2VyaWFsLCBfX0ZVTkNUSU9OX18pKSB7CisJCWRiZygiJXMiLCAiU2VyaWFsIFBhcmFub2lhIGZhaWxlZCBcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbW9zNzg0MF9wb3J0ID0gbW9zNzg0MF9nZXRfcG9ydF9wcml2YXRlKHBvcnQpOworCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCkgeworCQlkYmcoIiVzIiwgIm1vczc4NDBfcG9ydCBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHRyeSB0byBmaW5kIGEgZnJlZSB1cmIgaW4gdGhlIGxpc3QgKi8KKwl1cmIgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9VUkJTOyArK2kpIHsKKwkJaWYgKG1vczc4NDBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbaV0tPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJCXVyYiA9IG1vczc4NDBfcG9ydC0+d3JpdGVfdXJiX3Bvb2xbaV07CisJCQlkYmcoIlxuVVJCOiVkIiwgaSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICh1cmIgPT0gTlVMTCkgeworCQlkYmcoIiVzIC0gbm8gbW9yZSBmcmVlIHVyYnMiLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPQorCQkgICAga21hbGxvYyhVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOworCisJCWlmICh1cmItPnRyYW5zZmVyX2J1ZmZlciA9PSBOVUxMKSB7CisJCQllcnIoIiVzIG5vIG1vcmUga2VybmVsIG1lbW9yeS4uLiIsIF9fRlVOQ1RJT05fXyk7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisJdHJhbnNmZXJfc2l6ZSA9IG1pbihjb3VudCwgVVJCX1RSQU5TRkVSX0JVRkZFUl9TSVpFKTsKKworCWlmIChmcm9tX3VzZXIpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAodXJiLT50cmFuc2Zlcl9idWZmZXIsIGN1cnJlbnRfcG9zaXRpb24sIHRyYW5zZmVyX3NpemUpKSB7CisJCQlieXRlc19zZW50ID0gLUVGQVVMVDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0gZWxzZSB7CisJCW1lbWNweSh1cmItPnRyYW5zZmVyX2J1ZmZlciwgY3VycmVudF9wb3NpdGlvbiwgdHJhbnNmZXJfc2l6ZSk7CisJfQorCisJLyogZmlsbCB1cmIgd2l0aCBkYXRhIGFuZCBzdWJtaXQgICovCisJdXNiX2ZpbGxfYnVsa191cmIodXJiLAorCQkJICBzZXJpYWwtPmRldiwKKwkJCSAgdXNiX3NuZGJ1bGtwaXBlKHNlcmlhbC0+ZGV2LAorCQkJCQkgIHBvcnQtPmJ1bGtfb3V0X2VuZHBvaW50QWRkcmVzcyksCisJCQkgIHVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJICB0cmFuc2Zlcl9zaXplLAorCQkJICBtb3M3ODQwX2J1bGtfb3V0X2RhdGFfY2FsbGJhY2ssIG1vczc4NDBfcG9ydCk7CisKKwlkYXRhMSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOworCWRiZygiXG5idWxrb3V0IGVuZHBvaW50IGlzICVkIiwgcG9ydC0+YnVsa19vdXRfZW5kcG9pbnRBZGRyZXNzKTsKKworCS8qIHNlbmQgaXQgZG93biB0aGUgcGlwZSAqLworCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisKKwlpZiAoc3RhdHVzKSB7CisJCWVycigiJXMgLSB1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxrKSBmYWlsZWQgd2l0aCBzdGF0dXMgPSAlZCIsCisJCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCWJ5dGVzX3NlbnQgPSBzdGF0dXM7CisJCWdvdG8gZXhpdDsKKwl9CisJYnl0ZXNfc2VudCA9IHRyYW5zZmVyX3NpemU7CisJbW9zNzg0MF9wb3J0LT5pY291bnQudHggKz0gdHJhbnNmZXJfc2l6ZTsKKwlkYmcoIm1vczc4NDBfcG9ydC0+aWNvdW50LnR4IGlzICVkOlxuIiwgbW9zNzg0MF9wb3J0LT5pY291bnQudHgpOworICAgICAgZXhpdDoKKworCXJldHVybiBieXRlc19zZW50OworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbW9zNzg0MF90aHJvdHRsZQorICoJdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIHR0eSBkcml2ZXIgd2hlbiBpdCB3YW50cyB0byBzdG9wIHRoZSBkYXRhCisgKgliZWluZyByZWFkIGZyb20gdGhlIHBvcnQuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIG1vczc4NDBfdGhyb3R0bGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3ODQwX3BvcnQ7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgc3RhdHVzOworCisJaWYgKG1vczc4NDBfcG9ydF9wYXJhbm9pYV9jaGVjayhwb3J0LCBfX0ZVTkNUSU9OX18pKSB7CisJCWRiZygiJXMiLCAiSW52YWxpZCBwb3J0IFxuIik7CisJCXJldHVybjsKKwl9CisKKwlkYmcoIi0gcG9ydCAlZFxuIiwgcG9ydC0+bnVtYmVyKTsKKworCW1vczc4NDBfcG9ydCA9IG1vczc4NDBfZ2V0X3BvcnRfcHJpdmF0ZShwb3J0KTsKKworCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKCFtb3M3ODQwX3BvcnQtPm9wZW4pIHsKKwkJZGJnKCIlc1xuIiwgInBvcnQgbm90IG9wZW5lZCIpOworCQlyZXR1cm47CisJfQorCisJZGJnKCIlcyIsICJFbnRlcmluZyAuLi4uLi4uLi4uIFxuIik7CisKKwl0dHkgPSBwb3J0LT50dHk7CisJaWYgKCF0dHkpIHsKKwkJZGJnKCIlcyAtIG5vIHR0eSBhdmFpbGFibGUiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJLyogaWYgd2UgYXJlIGltcGxlbWVudGluZyBYT04vWE9GRiwgc2VuZCB0aGUgc3RvcCBjaGFyYWN0ZXIgKi8KKwlpZiAoSV9JWE9GRih0dHkpKSB7CisJCXVuc2lnbmVkIGNoYXIgc3RvcF9jaGFyID0gU1RPUF9DSEFSKHR0eSk7CisJCXN0YXR1cyA9IG1vczc4NDBfd3JpdGUocG9ydCwgJnN0b3BfY2hhciwgMSk7CisJCWlmIChzdGF0dXMgPD0gMCkgeworCQkJcmV0dXJuOworCQl9CisJfQorCisJLyogaWYgd2UgYXJlIGltcGxlbWVudGluZyBSVFMvQ1RTLCB0b2dnbGUgdGhhdCBsaW5lICovCisJaWYgKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKKwkJbW9zNzg0MF9wb3J0LT5zaGFkb3dNQ1IgJj0gfk1DUl9SVFM7CisJCXN0YXR1cyA9IDA7CisJCXN0YXR1cyA9CisJCSAgICBtb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBNT0RFTV9DT05UUk9MX1JFR0lTVEVSLAorCQkJCQkgbW9zNzg0MF9wb3J0LT5zaGFkb3dNQ1IpOworCisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbW9zNzg0MF91bnRocm90dGxlCisgKgl0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgdHR5IGRyaXZlciB3aGVuIGl0IHdhbnRzIHRvIHJlc3VtZSB0aGUgZGF0YQorICoJYmVpbmcgcmVhZCBmcm9tIHRoZSBwb3J0IChjYWxsZWQgYWZ0ZXIgU2VyaWFsVGhyb3R0bGUgaXMgY2FsbGVkKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbW9zNzg0MF91bnRocm90dGxlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydCA9IG1vczc4NDBfZ2V0X3BvcnRfcHJpdmF0ZShwb3J0KTsKKworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCQlkYmcoIiVzIiwgIkludmFsaWQgcG9ydCBcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKG1vczc4NDBfcG9ydCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoIW1vczc4NDBfcG9ydC0+b3BlbikgeworCQlkYmcoIiVzIC0gcG9ydCBub3Qgb3BlbmVkIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCWRiZygiJXMiLCAiRW50ZXJpbmcgLi4uLi4uLi4uLiBcbiIpOworCisJdHR5ID0gcG9ydC0+dHR5OworCWlmICghdHR5KSB7CisJCWRiZygiJXMgLSBubyB0dHkgYXZhaWxhYmxlIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGlmIHdlIGFyZSBpbXBsZW1lbnRpbmcgWE9OL1hPRkYsIHNlbmQgdGhlIHN0YXJ0IGNoYXJhY3RlciAqLworCWlmIChJX0lYT0ZGKHR0eSkpIHsKKwkJdW5zaWduZWQgY2hhciBzdGFydF9jaGFyID0gU1RBUlRfQ0hBUih0dHkpOworCQlzdGF0dXMgPSBtb3M3ODQwX3dyaXRlKHBvcnQsICZzdGFydF9jaGFyLCAxKTsKKwkJaWYgKHN0YXR1cyA8PSAwKSB7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBpZiB3ZSBhcmUgaW1wbGVtZW50aW5nIFJUUy9DVFMsIHRvZ2dsZSB0aGF0IGxpbmUgKi8KKwlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgeworCQltb3M3ODQwX3BvcnQtPnNoYWRvd01DUiB8PSBNQ1JfUlRTOworCQlzdGF0dXMgPSAwOworCQlzdGF0dXMgPQorCQkgICAgbW9zNzg0MF9zZXRfdWFydF9yZWcocG9ydCwgTU9ERU1fQ09OVFJPTF9SRUdJU1RFUiwKKwkJCQkJIG1vczc4NDBfcG9ydC0+c2hhZG93TUNSKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXJldHVybjsKK30KKworc3RhdGljIGludCBtb3M3ODQwX3Rpb2NtZ2V0KHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0OworCV9fdTE2IG1zcjsKKwlfX3UxNiBtY3I7CisJaW50IHN0YXR1cyA9IDA7CisJbW9zNzg0MF9wb3J0ID0gbW9zNzg0MF9nZXRfcG9ydF9wcml2YXRlKHBvcnQpOworCisJZGJnKCIlcyAtIHBvcnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisKKwlpZiAobW9zNzg0MF9wb3J0ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJc3RhdHVzID0gbW9zNzg0MF9nZXRfdWFydF9yZWcocG9ydCwgTU9ERU1fU1RBVFVTX1JFR0lTVEVSLCAmbXNyKTsKKwlzdGF0dXMgPSBtb3M3ODQwX2dldF91YXJ0X3JlZyhwb3J0LCBNT0RFTV9DT05UUk9MX1JFR0lTVEVSLCAmbWNyKTsKKwlyZXN1bHQgPSAoKG1jciAmIE1DUl9EVFIpID8gVElPQ01fRFRSIDogMCkKKwkgICAgfCAoKG1jciAmIE1DUl9SVFMpID8gVElPQ01fUlRTIDogMCkKKwkgICAgfCAoKG1jciAmIE1DUl9MT09QQkFDSykgPyBUSU9DTV9MT09QIDogMCkKKwkgICAgfCAoKG1zciAmIE1PUzc4NDBfTVNSX0NUUykgPyBUSU9DTV9DVFMgOiAwKQorCSAgICB8ICgobXNyICYgTU9TNzg0MF9NU1JfQ0QpID8gVElPQ01fQ0FSIDogMCkKKwkgICAgfCAoKG1zciAmIE1PUzc4NDBfTVNSX1JJKSA/IFRJT0NNX1JJIDogMCkKKwkgICAgfCAoKG1zciAmIE1PUzc4NDBfTVNSX0RTUikgPyBUSU9DTV9EU1IgOiAwKTsKKworCWRiZygiJXMgLSAweCUwNFgiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IG1vczc4NDBfdGlvY21zZXQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQoreworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKKwl1bnNpZ25lZCBpbnQgbWNyOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKworCW1vczc4NDBfcG9ydCA9IG1vczc4NDBfZ2V0X3BvcnRfcHJpdmF0ZShwb3J0KTsKKworCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltY3IgPSBtb3M3ODQwX3BvcnQtPnNoYWRvd01DUjsKKwlpZiAoY2xlYXIgJiBUSU9DTV9SVFMpCisJCW1jciAmPSB+TUNSX1JUUzsKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCW1jciAmPSB+TUNSX0RUUjsKKwlpZiAoY2xlYXIgJiBUSU9DTV9MT09QKQorCQltY3IgJj0gfk1DUl9MT09QQkFDSzsKKworCWlmIChzZXQgJiBUSU9DTV9SVFMpCisJCW1jciB8PSBNQ1JfUlRTOworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCW1jciB8PSBNQ1JfRFRSOworCWlmIChzZXQgJiBUSU9DTV9MT09QKQorCQltY3IgfD0gTUNSX0xPT1BCQUNLOworCisJbW9zNzg0MF9wb3J0LT5zaGFkb3dNQ1IgPSBtY3I7CisKKwlzdGF0dXMgPSAwOworCXN0YXR1cyA9IG1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsIE1PREVNX0NPTlRST0xfUkVHSVNURVIsIG1jcik7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJZGJnKCJzZXR0aW5nIE1PREVNX0NPTlRST0xfUkVHSVNURVIgRmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1vczc4NDBfY2FsY19iYXVkX3JhdGVfZGl2aXNvcgorICoJdGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBwcm9wZXIgYmF1ZCByYXRlIGRpdmlzb3IgZm9yIHRoZSBzcGVjaWZpZWQKKyAqCWJhdWQgcmF0ZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgbW9zNzg0MF9jYWxjX2JhdWRfcmF0ZV9kaXZpc29yKGludCBiYXVkUmF0ZSwgaW50ICpkaXZpc29yLAorCQkJCQkgIF9fdTE2ICogY2xrX3NlbF92YWwpCit7CisKKwlkYmcoIiVzIC0gJWQiLCBfX0ZVTkNUSU9OX18sIGJhdWRSYXRlKTsKKworCWlmIChiYXVkUmF0ZSA8PSAxMTUyMDApIHsKKwkJKmRpdmlzb3IgPSAxMTUyMDAgLyBiYXVkUmF0ZTsKKwkJKmNsa19zZWxfdmFsID0gMHgwOworCX0KKwlpZiAoKGJhdWRSYXRlID4gMTE1MjAwKSAmJiAoYmF1ZFJhdGUgPD0gMjMwNDAwKSkgeworCQkqZGl2aXNvciA9IDIzMDQwMCAvIGJhdWRSYXRlOworCQkqY2xrX3NlbF92YWwgPSAweDEwOworCX0gZWxzZSBpZiAoKGJhdWRSYXRlID4gMjMwNDAwKSAmJiAoYmF1ZFJhdGUgPD0gNDAzMjAwKSkgeworCQkqZGl2aXNvciA9IDQwMzIwMCAvIGJhdWRSYXRlOworCQkqY2xrX3NlbF92YWwgPSAweDIwOworCX0gZWxzZSBpZiAoKGJhdWRSYXRlID4gNDAzMjAwKSAmJiAoYmF1ZFJhdGUgPD0gNDYwODAwKSkgeworCQkqZGl2aXNvciA9IDQ2MDgwMCAvIGJhdWRSYXRlOworCQkqY2xrX3NlbF92YWwgPSAweDMwOworCX0gZWxzZSBpZiAoKGJhdWRSYXRlID4gNDYwODAwKSAmJiAoYmF1ZFJhdGUgPD0gODA2NDAwKSkgeworCQkqZGl2aXNvciA9IDgwNjQwMCAvIGJhdWRSYXRlOworCQkqY2xrX3NlbF92YWwgPSAweDQwOworCX0gZWxzZSBpZiAoKGJhdWRSYXRlID4gODA2NDAwKSAmJiAoYmF1ZFJhdGUgPD0gOTIxNjAwKSkgeworCQkqZGl2aXNvciA9IDkyMTYwMCAvIGJhdWRSYXRlOworCQkqY2xrX3NlbF92YWwgPSAweDUwOworCX0gZWxzZSBpZiAoKGJhdWRSYXRlID4gOTIxNjAwKSAmJiAoYmF1ZFJhdGUgPD0gMTU3Mjg2NCkpIHsKKwkJKmRpdmlzb3IgPSAxNTcyODY0IC8gYmF1ZFJhdGU7CisJCSpjbGtfc2VsX3ZhbCA9IDB4NjA7CisJfSBlbHNlIGlmICgoYmF1ZFJhdGUgPiAxNTcyODY0KSAmJiAoYmF1ZFJhdGUgPD0gMzE0NTcyOCkpIHsKKwkJKmRpdmlzb3IgPSAzMTQ1NzI4IC8gYmF1ZFJhdGU7CisJCSpjbGtfc2VsX3ZhbCA9IDB4NzA7CisJfQorCXJldHVybiAwOworCisjaWZkZWYgTk9UTUNTNzg0MAorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW9zNzg0MF9kaXZpc29yX3RhYmxlKTsgaSsrKSB7CisJCWlmIChtb3M3ODQwX2Rpdmlzb3JfdGFibGVbaV0uQmF1ZFJhdGUgPT0gYmF1ZHJhdGUpIHsKKwkJCSpkaXZpc29yID0gbW9zNzg0MF9kaXZpc29yX3RhYmxlW2ldLkRpdmlzb3I7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIEFmdGVyIHRyeWluZyBmb3IgYWxsIHRoZSBzdGFuZGFyZCBiYXVkIHJhdGVzICAgICoKKwkgKiBUcnkgY2FsY3VsYXRpbmcgdGhlIGRpdmlzb3IgZm9yIHRoaXMgYmF1ZCByYXRlICAqLworCisJaWYgKGJhdWRyYXRlID4gNzUgJiYgYmF1ZHJhdGUgPCAyMzA0MDApIHsKKwkJLyogZ2V0IHRoZSBkaXZpc29yICovCisJCWN1c3RvbSA9IChfX3UxNikgKDIzMDQwMEwgLyBiYXVkcmF0ZSk7CisKKwkJLyogQ2hlY2sgZm9yIHJvdW5kIG9mZiAqLworCQlyb3VuZDEgPSAoX191MTYpICgyMzA0MDAwTCAvIGJhdWRyYXRlKTsKKwkJcm91bmQgPSAoX191MTYpIChyb3VuZDEgLSAoY3VzdG9tICogMTApKTsKKwkJaWYgKHJvdW5kID4gNCkgeworCQkJY3VzdG9tKys7CisJCX0KKwkJKmRpdmlzb3IgPSBjdXN0b207CisKKwkJZGJnKCIgQmF1ZCAlZCA9ICVkXG4iLCBiYXVkcmF0ZSwgY3VzdG9tKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZGJnKCIlc1xuIiwgIiBCYXVkIGNhbGN1bGF0aW9uIEZhaWxlZC4uLiIpOworCXJldHVybiAtMTsKKyNlbmRpZgorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1vczc4NDBfc2VuZF9jbWRfd3JpdGVfYmF1ZF9yYXRlCisgKgl0aGlzIGZ1bmN0aW9uIHNlbmRzIHRoZSBwcm9wZXIgY29tbWFuZCB0byBjaGFuZ2UgdGhlIGJhdWQgcmF0ZSBvZiB0aGUKKyAqCXNwZWNpZmllZCBwb3J0LgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG1vczc4NDBfc2VuZF9jbWRfd3JpdGVfYmF1ZF9yYXRlKHN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydCwKKwkJCQkJICAgIGludCBiYXVkUmF0ZSkKK3sKKwlpbnQgZGl2aXNvciA9IDA7CisJaW50IHN0YXR1czsKKwlfX3UxNiBEYXRhOworCXVuc2lnbmVkIGNoYXIgbnVtYmVyOworCV9fdTE2IGNsa19zZWxfdmFsOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CisKKwlpZiAobW9zNzg0MF9wb3J0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKW1vczc4NDBfcG9ydC0+cG9ydDsKKwlpZiAobW9zNzg0MF9wb3J0X3BhcmFub2lhX2NoZWNrKHBvcnQsIF9fRlVOQ1RJT05fXykpIHsKKwkJZGJnKCIlcyIsICJJbnZhbGlkIHBvcnQgXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChtb3M3ODQwX3NlcmlhbF9wYXJhbm9pYV9jaGVjayhwb3J0LT5zZXJpYWwsIF9fRlVOQ1RJT05fXykpIHsKKwkJZGJnKCIlcyIsICJJbnZhbGlkIFNlcmlhbCBcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGJnKCIlcyIsICJFbnRlcmluZyAuLi4uLi4uLi4uIFxuIik7CisKKwludW1iZXIgPSBtb3M3ODQwX3BvcnQtPnBvcnQtPm51bWJlciAtIG1vczc4NDBfcG9ydC0+cG9ydC0+c2VyaWFsLT5taW5vcjsKKworCWRiZygiJXMgLSBwb3J0ID0gJWQsIGJhdWQgPSAlZCIsIF9fRlVOQ1RJT05fXywKKwkgICAgbW9zNzg0MF9wb3J0LT5wb3J0LT5udW1iZXIsIGJhdWRSYXRlKTsKKwkvL3Jlc2V0IGNsa191YXJ0X3NlbCBpbiBzcHJlZ09mZnNldAorCWlmIChiYXVkUmF0ZSA+IDExNTIwMCkgeworI2lmZGVmIEhXX2Zsb3dfY29udHJvbAorCQkvL05PVEU6IG5lZWQgdG8gc2VlIHRoZSBwdGhlciByZWdpc3RlciB0byBtb2RpZnkKKwkJLy9zZXR0aW5nIGgvdyBmbG93IGNvbnRyb2wgYml0IHRvIDE7CisJCXN0YXR1cyA9IDA7CisJCURhdGEgPSAweDJiOworCQltb3M3ODQwX3BvcnQtPnNoYWRvd01DUiA9IERhdGE7CisJCXN0YXR1cyA9CisJCSAgICBtb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBNT0RFTV9DT05UUk9MX1JFR0lTVEVSLCBEYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWRiZygiV3JpdGluZyBzcHJlZyBmYWlsZWQgaW4gc2V0X3NlcmlhbF9iYXVkXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorI2VuZGlmCisKKwl9IGVsc2UgeworI2lmZGVmIEhXX2Zsb3dfY29udHJvbAorCQkvL3NldHRpbmcgaC93IGZsb3cgY29udHJvbCBiaXQgdG8gMDsKKwkJc3RhdHVzID0gMDsKKwkJRGF0YSA9IDB4YjsKKwkJbW9zNzg0MF9wb3J0LT5zaGFkb3dNQ1IgPSBEYXRhOworCQlzdGF0dXMgPQorCQkgICAgbW9zNzg0MF9zZXRfdWFydF9yZWcocG9ydCwgTU9ERU1fQ09OVFJPTF9SRUdJU1RFUiwgRGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlkYmcoIldyaXRpbmcgc3ByZWcgZmFpbGVkIGluIHNldF9zZXJpYWxfYmF1ZFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKyNlbmRpZgorCisJfQorCisJaWYgKDEpCQkJLy9iYXVkUmF0ZSA8PSAxMTUyMDApCisJeworCQljbGtfc2VsX3ZhbCA9IDB4MDsKKwkJRGF0YSA9IDB4MDsKKwkJc3RhdHVzID0gMDsKKwkJc3RhdHVzID0KKwkJICAgIG1vczc4NDBfY2FsY19iYXVkX3JhdGVfZGl2aXNvcihiYXVkUmF0ZSwgJmRpdmlzb3IsCisJCQkJCQkgICAmY2xrX3NlbF92YWwpOworCQlzdGF0dXMgPQorCQkgICAgbW9zNzg0MF9nZXRfcmVnX3N5bmMocG9ydCwgbW9zNzg0MF9wb3J0LT5TcFJlZ09mZnNldCwKKwkJCQkJICZEYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWRiZygicmVhZGluZyBzcHJlZyBmYWlsZWQgaW4gc2V0X3NlcmlhbF9iYXVkXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlEYXRhID0gKERhdGEgJiAweDhmKSB8IGNsa19zZWxfdmFsOworCQlzdGF0dXMgPSAwOworCQlzdGF0dXMgPQorCQkgICAgbW9zNzg0MF9zZXRfcmVnX3N5bmMocG9ydCwgbW9zNzg0MF9wb3J0LT5TcFJlZ09mZnNldCwgRGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlkYmcoIldyaXRpbmcgc3ByZWcgZmFpbGVkIGluIHNldF9zZXJpYWxfYmF1ZFxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLyogQ2FsY3VsYXRlIHRoZSBEaXZpc29yICovCisKKwkJaWYgKHN0YXR1cykgeworCQkJZXJyKCIlcyAtIGJhZCBiYXVkIHJhdGUiLCBfX0ZVTkNUSU9OX18pOworCQkJZGJnKCIlc1xuIiwgImJhZCBiYXVkIHJhdGUiKTsKKwkJCXJldHVybiBzdGF0dXM7CisJCX0KKwkJLyogRW5hYmxlIGFjY2VzcyB0byBkaXZpc29yIGxhdGNoICovCisJCURhdGEgPSBtb3M3ODQwX3BvcnQtPnNoYWRvd0xDUiB8IFNFUklBTF9MQ1JfRExBQjsKKwkJbW9zNzg0MF9wb3J0LT5zaGFkb3dMQ1IgPSBEYXRhOworCQltb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBMSU5FX0NPTlRST0xfUkVHSVNURVIsIERhdGEpOworCisJCS8qIFdyaXRlIHRoZSBkaXZpc29yICovCisJCURhdGEgPSAodW5zaWduZWQgY2hhcikoZGl2aXNvciAmIDB4ZmYpOworCQlkYmcoInNldF9zZXJpYWxfYmF1ZCBWYWx1ZSB0byB3cml0ZSBETEwgaXMgJXhcbiIsIERhdGEpOworCQltb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBESVZJU09SX0xBVENIX0xTQiwgRGF0YSk7CisKKwkJRGF0YSA9ICh1bnNpZ25lZCBjaGFyKSgoZGl2aXNvciAmIDB4ZmYwMCkgPj4gOCk7CisJCWRiZygic2V0X3NlcmlhbF9iYXVkIFZhbHVlIHRvIHdyaXRlIERMTSBpcyAleFxuIiwgRGF0YSk7CisJCW1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsIERJVklTT1JfTEFUQ0hfTVNCLCBEYXRhKTsKKworCQkvKiBEaXNhYmxlIGFjY2VzcyB0byBkaXZpc29yIGxhdGNoICovCisJCURhdGEgPSBtb3M3ODQwX3BvcnQtPnNoYWRvd0xDUiAmIH5TRVJJQUxfTENSX0RMQUI7CisJCW1vczc4NDBfcG9ydC0+c2hhZG93TENSID0gRGF0YTsKKwkJbW9zNzg0MF9zZXRfdWFydF9yZWcocG9ydCwgTElORV9DT05UUk9MX1JFR0lTVEVSLCBEYXRhKTsKKworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbW9zNzg0MF9jaGFuZ2VfcG9ydF9zZXR0aW5ncworICoJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBzZXQgdGhlIFVBUlQgb24gdGhlIGRldmljZSB0byBtYXRjaAorICogICAgICB0aGUgc3BlY2lmaWVkIG5ldyBzZXR0aW5ncy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgbW9zNzg0MF9jaGFuZ2VfcG9ydF9zZXR0aW5ncyhzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3ODQwX3BvcnQsCisJCQkJCSBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlpbnQgYmF1ZDsKKwl1bnNpZ25lZCBjZmxhZzsKKwl1bnNpZ25lZCBpZmxhZzsKKwlfX3U4IGxEYXRhOworCV9fdTggbFBhcml0eTsKKwlfX3U4IGxTdG9wOworCWludCBzdGF0dXM7CisJX191MTYgRGF0YTsKKwlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0OworCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWw7CisKKwlpZiAobW9zNzg0MF9wb3J0ID09IE5VTEwpCisJCXJldHVybjsKKworCXBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKW1vczc4NDBfcG9ydC0+cG9ydDsKKworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCQlkYmcoIiVzIiwgIkludmFsaWQgcG9ydCBcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKG1vczc4NDBfc2VyaWFsX3BhcmFub2lhX2NoZWNrKHBvcnQtPnNlcmlhbCwgX19GVU5DVElPTl9fKSkgeworCQlkYmcoIiVzIiwgIkludmFsaWQgU2VyaWFsIFxuIik7CisJCXJldHVybjsKKwl9CisKKwlzZXJpYWwgPSBwb3J0LT5zZXJpYWw7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgbW9zNzg0MF9wb3J0LT5wb3J0LT5udW1iZXIpOworCisJaWYgKCFtb3M3ODQwX3BvcnQtPm9wZW4pIHsKKwkJZGJnKCIlcyAtIHBvcnQgbm90IG9wZW5lZCIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwl0dHkgPSBtb3M3ODQwX3BvcnQtPnBvcnQtPnR0eTsKKworCWlmICgoIXR0eSkgfHwgKCF0dHktPnRlcm1pb3MpKSB7CisJCWRiZygiJXMgLSBubyB0dHkgc3RydWN0dXJlcyIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybjsKKwl9CisKKwlkYmcoIiVzIiwgIkVudGVyaW5nIC4uLi4uLi4uLi4gXG4iKTsKKworCWxEYXRhID0gTENSX0JJVFNfODsKKwlsU3RvcCA9IExDUl9TVE9QXzE7CisJbFBhcml0eSA9IExDUl9QQVJfTk9ORTsKKworCWNmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCWlmbGFnID0gdHR5LT50ZXJtaW9zLT5jX2lmbGFnOworCisJLyogQ2hhbmdlIHRoZSBudW1iZXIgb2YgYml0cyAqLworCWlmIChjZmxhZyAmIENTSVpFKSB7CisJCXN3aXRjaCAoY2ZsYWcgJiBDU0laRSkgeworCQljYXNlIENTNToKKwkJCWxEYXRhID0gTENSX0JJVFNfNTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ1M2OgorCQkJbERhdGEgPSBMQ1JfQklUU182OworCQkJYnJlYWs7CisKKwkJY2FzZSBDUzc6CisJCQlsRGF0YSA9IExDUl9CSVRTXzc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSBDUzg6CisJCQlsRGF0YSA9IExDUl9CSVRTXzg7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBDaGFuZ2UgdGhlIFBhcml0eSBiaXQgKi8KKwlpZiAoY2ZsYWcgJiBQQVJFTkIpIHsKKwkJaWYgKGNmbGFnICYgUEFST0REKSB7CisJCQlsUGFyaXR5ID0gTENSX1BBUl9PREQ7CisJCQlkYmcoIiVzIC0gcGFyaXR5ID0gb2RkIiwgX19GVU5DVElPTl9fKTsKKwkJfSBlbHNlIHsKKwkJCWxQYXJpdHkgPSBMQ1JfUEFSX0VWRU47CisJCQlkYmcoIiVzIC0gcGFyaXR5ID0gZXZlbiIsIF9fRlVOQ1RJT05fXyk7CisJCX0KKworCX0gZWxzZSB7CisJCWRiZygiJXMgLSBwYXJpdHkgPSBub25lIiwgX19GVU5DVElPTl9fKTsKKwl9CisKKwlpZiAoY2ZsYWcgJiBDTVNQQVIpIHsKKwkJbFBhcml0eSA9IGxQYXJpdHkgfCAweDIwOworCX0KKworCS8qIENoYW5nZSB0aGUgU3RvcCBiaXQgKi8KKwlpZiAoY2ZsYWcgJiBDU1RPUEIpIHsKKwkJbFN0b3AgPSBMQ1JfU1RPUF8yOworCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMiIsIF9fRlVOQ1RJT05fXyk7CisJfSBlbHNlIHsKKwkJbFN0b3AgPSBMQ1JfU1RPUF8xOworCQlkYmcoIiVzIC0gc3RvcCBiaXRzID0gMSIsIF9fRlVOQ1RJT05fXyk7CisJfQorCisJLyogVXBkYXRlIHRoZSBMQ1Igd2l0aCB0aGUgY29ycmVjdCB2YWx1ZSAqLworCW1vczc4NDBfcG9ydC0+c2hhZG93TENSICY9CisJICAgIH4oTENSX0JJVFNfTUFTSyB8IExDUl9TVE9QX01BU0sgfCBMQ1JfUEFSX01BU0spOworCW1vczc4NDBfcG9ydC0+c2hhZG93TENSIHw9IChsRGF0YSB8IGxQYXJpdHkgfCBsU3RvcCk7CisKKwlkYmcoIm1vczc4NDBfY2hhbmdlX3BvcnRfc2V0dGluZ3MgbW9zNzg0MF9wb3J0LT5zaGFkb3dMQ1IgaXMgJXhcbiIsCisJICAgIG1vczc4NDBfcG9ydC0+c2hhZG93TENSKTsKKwkvKiBEaXNhYmxlIEludGVycnVwdHMgKi8KKwlEYXRhID0gMHgwMDsKKwltb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBJTlRFUlJVUFRfRU5BQkxFX1JFR0lTVEVSLCBEYXRhKTsKKworCURhdGEgPSAweDAwOworCW1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsIEZJRk9fQ09OVFJPTF9SRUdJU1RFUiwgRGF0YSk7CisKKwlEYXRhID0gMHhjZjsKKwltb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBGSUZPX0NPTlRST0xfUkVHSVNURVIsIERhdGEpOworCisJLyogU2VuZCB0aGUgdXBkYXRlZCBMQ1IgdmFsdWUgdG8gdGhlIG1vczc4NDAgKi8KKwlEYXRhID0gbW9zNzg0MF9wb3J0LT5zaGFkb3dMQ1I7CisKKwltb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBMSU5FX0NPTlRST0xfUkVHSVNURVIsIERhdGEpOworCisJRGF0YSA9IDB4MDBiOworCW1vczc4NDBfcG9ydC0+c2hhZG93TUNSID0gRGF0YTsKKwltb3M3ODQwX3NldF91YXJ0X3JlZyhwb3J0LCBNT0RFTV9DT05UUk9MX1JFR0lTVEVSLCBEYXRhKTsKKwlEYXRhID0gMHgwMGI7CisJbW9zNzg0MF9zZXRfdWFydF9yZWcocG9ydCwgTU9ERU1fQ09OVFJPTF9SRUdJU1RFUiwgRGF0YSk7CisKKwkvKiBzZXQgdXAgdGhlIE1DUiByZWdpc3RlciBhbmQgc2VuZCBpdCB0byB0aGUgbW9zNzg0MCAqLworCisJbW9zNzg0MF9wb3J0LT5zaGFkb3dNQ1IgPSBNQ1JfTUFTVEVSX0lFOworCWlmIChjZmxhZyAmIENCQVVEKSB7CisJCW1vczc4NDBfcG9ydC0+c2hhZG93TUNSIHw9IChNQ1JfRFRSIHwgTUNSX1JUUyk7CisJfQorCisJaWYgKGNmbGFnICYgQ1JUU0NUUykgeworCQltb3M3ODQwX3BvcnQtPnNoYWRvd01DUiB8PSAoTUNSX1hPTl9BTlkpOworCisJfSBlbHNlIHsKKwkJbW9zNzg0MF9wb3J0LT5zaGFkb3dNQ1IgJj0gfihNQ1JfWE9OX0FOWSk7CisJfQorCisJRGF0YSA9IG1vczc4NDBfcG9ydC0+c2hhZG93TUNSOworCW1vczc4NDBfc2V0X3VhcnRfcmVnKHBvcnQsIE1PREVNX0NPTlRST0xfUkVHSVNURVIsIERhdGEpOworCisJLyogRGV0ZXJtaW5lIGRpdmlzb3IgYmFzZWQgb24gYmF1ZCByYXRlICovCisJYmF1ZCA9IHR0eV9nZXRfYmF1ZF9yYXRlKHR0eSk7CisKKwlpZiAoIWJhdWQpIHsKKwkJLyogcGljayBhIGRlZmF1bHQsIGFueSBkZWZhdWx0Li4uICovCisJCWRiZygiJXNcbiIsICJQaWNrZWQgZGVmYXVsdCBiYXVkLi4uIik7CisJCWJhdWQgPSA5NjAwOworCX0KKworCWRiZygiJXMgLSBiYXVkIHJhdGUgPSAlZCIsIF9fRlVOQ1RJT05fXywgYmF1ZCk7CisJc3RhdHVzID0gbW9zNzg0MF9zZW5kX2NtZF93cml0ZV9iYXVkX3JhdGUobW9zNzg0MF9wb3J0LCBiYXVkKTsKKworCS8qIEVuYWJsZSBJbnRlcnJ1cHRzICovCisJRGF0YSA9IDB4MGM7CisJbW9zNzg0MF9zZXRfdWFydF9yZWcocG9ydCwgSU5URVJSVVBUX0VOQUJMRV9SRUdJU1RFUiwgRGF0YSk7CisKKwlpZiAobW9zNzg0MF9wb3J0LT5yZWFkX3VyYi0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUykgeworCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKKworCQlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYihtb3M3ODQwX3BvcnQtPnJlYWRfdXJiLCBHRlBfQVRPTUlDKTsKKworCQlpZiAoc3RhdHVzKSB7CisJCQlkYmcoIiB1c2Jfc3VibWl0X3VyYihyZWFkIGJ1bGspIGZhaWxlZCwgc3RhdHVzID0gJWQiLAorCQkJICAgIHN0YXR1cyk7CisJCX0KKwl9CisJd2FrZV91cCgmbW9zNzg0MF9wb3J0LT5kZWx0YV9tc3Jfd2FpdCk7CisJbW9zNzg0MF9wb3J0LT5kZWx0YV9tc3JfY29uZCA9IDE7CisJZGJnKCJtb3M3ODQwX2NoYW5nZV9wb3J0X3NldHRpbmdzIG1vczc4NDBfcG9ydC0+c2hhZG93TENSIGlzIEVuZCAleFxuIiwKKwkgICAgbW9zNzg0MF9wb3J0LT5zaGFkb3dMQ1IpOworCisJcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1vczc4NDBfc2V0X3Rlcm1pb3MKKyAqCXRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSB0dHkgZHJpdmVyIHdoZW4gaXQgd2FudHMgdG8gY2hhbmdlCisgKgl0aGUgdGVybWlvcyBzdHJ1Y3R1cmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgbW9zNzg0MF9zZXRfdGVybWlvcyhzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorCQkJCXN0cnVjdCB0ZXJtaW9zICpvbGRfdGVybWlvcykKK3sKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGludCBjZmxhZzsKKwlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsOworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCWRiZygibW9zNzg0MF9zZXRfdGVybWlvczogU1RBUlRcbiIpOworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCQlkYmcoIiVzIiwgIkludmFsaWQgcG9ydCBcbiIpOworCQlyZXR1cm47CisJfQorCisJc2VyaWFsID0gcG9ydC0+c2VyaWFsOworCisJaWYgKG1vczc4NDBfc2VyaWFsX3BhcmFub2lhX2NoZWNrKHNlcmlhbCwgX19GVU5DVElPTl9fKSkgeworCQlkYmcoIiVzIiwgIkludmFsaWQgU2VyaWFsIFxuIik7CisJCXJldHVybjsKKwl9CisKKwltb3M3ODQwX3BvcnQgPSBtb3M3ODQwX2dldF9wb3J0X3ByaXZhdGUocG9ydCk7CisKKwlpZiAobW9zNzg0MF9wb3J0ID09IE5VTEwpCisJCXJldHVybjsKKworCXR0eSA9IHBvcnQtPnR0eTsKKworCWlmICghcG9ydC0+dHR5IHx8ICFwb3J0LT50dHktPnRlcm1pb3MpIHsKKwkJZGJnKCIlcyAtIG5vIHR0eSBvciB0ZXJtaW9zIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghbW9zNzg0MF9wb3J0LT5vcGVuKSB7CisJCWRiZygiJXMgLSBwb3J0IG5vdCBvcGVuZWQiLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm47CisJfQorCisJZGJnKCIlc1xuIiwgInNldHRpbmcgdGVybWlvcyAtICIpOworCisJY2ZsYWcgPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7CisKKwlpZiAoIWNmbGFnKSB7CisJCWRiZygiJXMgJXNcbiIsIF9fRlVOQ1RJT05fXywgImNmbGFnIGlzIE5VTEwiKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGNoZWNrIHRoYXQgdGhleSByZWFsbHkgd2FudCB1cyB0byBjaGFuZ2Ugc29tZXRoaW5nICovCisJaWYgKG9sZF90ZXJtaW9zKSB7CisJCWlmICgoY2ZsYWcgPT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpICYmCisJCSAgICAoUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSA9PQorCQkgICAgIFJFTEVWQU5UX0lGTEFHKG9sZF90ZXJtaW9zLT5jX2lmbGFnKSkpIHsKKwkJCWRiZygiJXNcbiIsICJOb3RoaW5nIHRvIGNoYW5nZSIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJZGJnKCIlcyAtIGNsZmFnICUwOHggaWZsYWcgJTA4eCIsIF9fRlVOQ1RJT05fXywKKwkgICAgdHR5LT50ZXJtaW9zLT5jX2NmbGFnLCBSRUxFVkFOVF9JRkxBRyh0dHktPnRlcm1pb3MtPmNfaWZsYWcpKTsKKworCWlmIChvbGRfdGVybWlvcykgeworCQlkYmcoIiVzIC0gb2xkIGNsZmFnICUwOHggb2xkIGlmbGFnICUwOHgiLCBfX0ZVTkNUSU9OX18sCisJCSAgICBvbGRfdGVybWlvcy0+Y19jZmxhZywgUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKTsKKwl9CisKKwlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKworCS8qIGNoYW5nZSB0aGUgcG9ydCBzZXR0aW5ncyB0byB0aGUgbmV3IG9uZXMgc3BlY2lmaWVkICovCisKKwltb3M3ODQwX2NoYW5nZV9wb3J0X3NldHRpbmdzKG1vczc4NDBfcG9ydCwgb2xkX3Rlcm1pb3MpOworCisJaWYgKCFtb3M3ODQwX3BvcnQtPnJlYWRfdXJiKSB7CisJCWRiZygiJXMiLCAiVVJCIEtJTExFRCAhISEhIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAobW9zNzg0MF9wb3J0LT5yZWFkX3VyYi0+c3RhdHVzICE9IC1FSU5QUk9HUkVTUykgeworCQltb3M3ODQwX3BvcnQtPnJlYWRfdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKKwkJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIobW9zNzg0MF9wb3J0LT5yZWFkX3VyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChzdGF0dXMpIHsKKwkJCWRiZygiIHVzYl9zdWJtaXRfdXJiKHJlYWQgYnVsaykgZmFpbGVkLCBzdGF0dXMgPSAlZCIsCisJCQkgICAgc3RhdHVzKTsKKwkJfQorCX0KKwlyZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbW9zNzg0MF9nZXRfbHNyX2luZm8gLSBnZXQgbGluZSBzdGF0dXMgcmVnaXN0ZXIgaW5mbworICoKKyAqIFB1cnBvc2U6IExldCB1c2VyIGNhbGwgaW9jdGwoKSB0byBnZXQgaW5mbyB3aGVuIHRoZSBVQVJUIHBoeXNpY2FsbHkKKyAqIAkgICAgaXMgZW1wdGllZC4gIE9uIGJ1cyB0eXBlcyBsaWtlIFJTNDg1LCB0aGUgdHJhbnNtaXR0ZXIgbXVzdAorICogCSAgICByZWxlYXNlIHRoZSBidXMgYWZ0ZXIgdHJhbnNtaXR0aW5nLiBUaGlzIG11c3QgYmUgZG9uZSB3aGVuCisgKiAJICAgIHRoZSB0cmFuc21pdCBzaGlmdCByZWdpc3RlciBpcyBlbXB0eSwgbm90IGJlIGRvbmUgd2hlbiB0aGUKKyAqIAkgICAgdHJhbnNtaXQgaG9sZGluZyByZWdpc3RlciBpcyBlbXB0eS4gIFRoaXMgZnVuY3Rpb25hbGl0eQorICogCSAgICBhbGxvd3MgYW4gUlM0ODUgZHJpdmVyIHRvIGJlIHdyaXR0ZW4gaW4gdXNlciBzcGFjZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBtb3M3ODQwX2dldF9sc3JfaW5mbyhzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3ODQwX3BvcnQsCisJCQkJdW5zaWduZWQgaW50ICp2YWx1ZSkKK3sKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CisKKwljb3VudCA9IG1vczc4NDBfY2hhcnNfaW5fYnVmZmVyKG1vczc4NDBfcG9ydC0+cG9ydCk7CisJaWYgKGNvdW50ID09IDApIHsKKwkJZGJnKCIlcyAtLSBFbXB0eSIsIF9fRlVOQ1RJT05fXyk7CisJCXJlc3VsdCA9IFRJT0NTRVJfVEVNVDsKKwl9CisKKwlpZiAoY29weV90b191c2VyKHZhbHVlLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1vczc4NDBfZ2V0X2J5dGVzX2F2YWlsIC0gZ2V0IG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUKKyAqCisgKiBQdXJwb3NlOiBMZXQgdXNlciBjYWxsIGlvY3RsIHRvIGdldCB0aGUgY291bnQgb2YgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBtb3M3ODQwX2dldF9ieXRlc19hdmFpbChzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3ODQwX3BvcnQsCisJCQkJICAgdW5zaWduZWQgaW50ICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5ID0gbW9zNzg0MF9wb3J0LT5wb3J0LT50dHk7CisKKwlpZiAoIXR0eSkKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworCXJlc3VsdCA9IHR0eS0+cmVhZF9jbnQ7CisKKwlkYmcoIiVzKCVkKSA9ICVkIiwgX19GVU5DVElPTl9fLCBtb3M3ODQwX3BvcnQtPnBvcnQtPm51bWJlciwgcmVzdWx0KTsKKwlpZiAoY29weV90b191c2VyKHZhbHVlLCAmcmVzdWx0LCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtb3M3ODQwX3NldF9tb2RlbV9pbmZvCisgKiAgICAgIGZ1bmN0aW9uIHRvIHNldCBtb2RlbSBpbmZvCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgbW9zNzg0MF9zZXRfbW9kZW1faW5mbyhzdHJ1Y3QgbW9zY2hpcF9wb3J0ICptb3M3ODQwX3BvcnQsCisJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgKnZhbHVlKQoreworCXVuc2lnbmVkIGludCBtY3I7CisJdW5zaWduZWQgaW50IGFyZzsKKwlfX3UxNiBEYXRhOworCWludCBzdGF0dXM7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKKworCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJcG9ydCA9IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICopbW9zNzg0MF9wb3J0LT5wb3J0OworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCQlkYmcoIiVzIiwgIkludmFsaWQgcG9ydCBcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbWNyID0gbW9zNzg0MF9wb3J0LT5zaGFkb3dNQ1I7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmFyZywgdmFsdWUsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVElPQ01CSVM6CisJCWlmIChhcmcgJiBUSU9DTV9SVFMpCisJCQltY3IgfD0gTUNSX1JUUzsKKwkJaWYgKGFyZyAmIFRJT0NNX0RUUikKKwkJCW1jciB8PSBNQ1JfUlRTOworCQlpZiAoYXJnICYgVElPQ01fTE9PUCkKKwkJCW1jciB8PSBNQ1JfTE9PUEJBQ0s7CisJCWJyZWFrOworCisJY2FzZSBUSU9DTUJJQzoKKwkJaWYgKGFyZyAmIFRJT0NNX1JUUykKKwkJCW1jciAmPSB+TUNSX1JUUzsKKwkJaWYgKGFyZyAmIFRJT0NNX0RUUikKKwkJCW1jciAmPSB+TUNSX1JUUzsKKwkJaWYgKGFyZyAmIFRJT0NNX0xPT1ApCisJCQltY3IgJj0gfk1DUl9MT09QQkFDSzsKKwkJYnJlYWs7CisKKwljYXNlIFRJT0NNU0VUOgorCQkvKiB0dXJuIG9mZiB0aGUgUlRTIGFuZCBEVFIgYW5kIExPT1BCQUNLCisJCSAqIGFuZCB0aGVuIG9ubHkgdHVybiBvbiB3aGF0IHdhcyBhc2tlZCB0byAqLworCQltY3IgJj0gfihNQ1JfUlRTIHwgTUNSX0RUUiB8IE1DUl9MT09QQkFDSyk7CisJCW1jciB8PSAoKGFyZyAmIFRJT0NNX1JUUykgPyBNQ1JfUlRTIDogMCk7CisJCW1jciB8PSAoKGFyZyAmIFRJT0NNX0RUUikgPyBNQ1JfRFRSIDogMCk7CisJCW1jciB8PSAoKGFyZyAmIFRJT0NNX0xPT1ApID8gTUNSX0xPT1BCQUNLIDogMCk7CisJCWJyZWFrOworCX0KKworCW1vczc4NDBfcG9ydC0+c2hhZG93TUNSID0gbWNyOworCisJRGF0YSA9IG1vczc4NDBfcG9ydC0+c2hhZG93TUNSOworCXN0YXR1cyA9IDA7CisJc3RhdHVzID0gbW9zNzg0MF9zZXRfdWFydF9yZWcocG9ydCwgTU9ERU1fQ09OVFJPTF9SRUdJU1RFUiwgRGF0YSk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJZGJnKCJzZXR0aW5nIE1PREVNX0NPTlRST0xfUkVHSVNURVIgRmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1vczc4NDBfZ2V0X21vZGVtX2luZm8KKyAqICAgICAgZnVuY3Rpb24gdG8gZ2V0IG1vZGVtIGluZm8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBtb3M3ODQwX2dldF9tb2RlbV9pbmZvKHN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydCwKKwkJCQkgIHVuc2lnbmVkIGludCAqdmFsdWUpCit7CisJdW5zaWduZWQgaW50IHJlc3VsdCA9IDA7CisJX191MTYgbXNyOworCXVuc2lnbmVkIGludCBtY3IgPSBtb3M3ODQwX3BvcnQtPnNoYWRvd01DUjsKKwlpbnQgc3RhdHVzID0gMDsKKwlzdGF0dXMgPQorCSAgICBtb3M3ODQwX2dldF91YXJ0X3JlZyhtb3M3ODQwX3BvcnQtPnBvcnQsIE1PREVNX1NUQVRVU19SRUdJU1RFUiwKKwkJCQkgJm1zcik7CisJcmVzdWx0ID0gKChtY3IgJiBNQ1JfRFRSKSA/IFRJT0NNX0RUUiA6IDApCS8qIDB4MDAyICovCisJICAgIHwoKG1jciAmIE1DUl9SVFMpID8gVElPQ01fUlRTIDogMCkJLyogMHgwMDQgKi8KKwkgICAgfCgobXNyICYgTU9TNzg0MF9NU1JfQ1RTKSA/IFRJT0NNX0NUUyA6IDApCS8qIDB4MDIwICovCisJICAgIHwoKG1zciAmIE1PUzc4NDBfTVNSX0NEKSA/IFRJT0NNX0NBUiA6IDApCS8qIDB4MDQwICovCisJICAgIHwoKG1zciAmIE1PUzc4NDBfTVNSX1JJKSA/IFRJT0NNX1JJIDogMCkJLyogMHgwODAgKi8KKwkgICAgfCgobXNyICYgTU9TNzg0MF9NU1JfRFNSKSA/IFRJT0NNX0RTUiA6IDApOwkvKiAweDEwMCAqLworCisJZGJnKCIlcyAtLSAleCIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKworCWlmIChjb3B5X3RvX3VzZXIodmFsdWUsICZyZXN1bHQsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbW9zNzg0MF9nZXRfc2VyaWFsX2luZm8KKyAqICAgICAgZnVuY3Rpb24gdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHNlcmlhbCBwb3J0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgbW9zNzg0MF9nZXRfc2VyaWFsX2luZm8oc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzg0MF9wb3J0LAorCQkJCSAgIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpyZXRpbmZvKQoreworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKKworCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKCFyZXRpbmZvKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisKKwl0bXAudHlwZSA9IFBPUlRfMTY1NTBBOworCXRtcC5saW5lID0gbW9zNzg0MF9wb3J0LT5wb3J0LT5zZXJpYWwtPm1pbm9yOworCXRtcC5wb3J0ID0gbW9zNzg0MF9wb3J0LT5wb3J0LT5udW1iZXI7CisJdG1wLmlycSA9IDA7CisJdG1wLmZsYWdzID0gQVNZTkNfU0tJUF9URVNUIHwgQVNZTkNfQVVUT19JUlE7CisJdG1wLnhtaXRfZmlmb19zaXplID0gTlVNX1VSQlMgKiBVUkJfVFJBTlNGRVJfQlVGRkVSX1NJWkU7CisJdG1wLmJhdWRfYmFzZSA9IDk2MDA7CisJdG1wLmNsb3NlX2RlbGF5ID0gNSAqIEhaOworCXRtcC5jbG9zaW5nX3dhaXQgPSAzMCAqIEhaOworCisJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogU2VyaWFsSW9jdGwKKyAqCXRoaXMgZnVuY3Rpb24gaGFuZGxlcyBhbnkgaW9jdGwgY2FsbHMgdG8gdGhlIGRyaXZlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG1vczc4NDBfaW9jdGwoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzg0MF9wb3J0OworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CisKKwlzdHJ1Y3QgYXN5bmNfaWNvdW50IGNub3c7CisJc3RydWN0IGFzeW5jX2ljb3VudCBjcHJldjsKKwlzdHJ1Y3Qgc2VyaWFsX2ljb3VudGVyX3N0cnVjdCBpY291bnQ7CisJaW50IG1vc3JldCA9IDA7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgdHR5X2xkaXNjICpsZDsKKworCWlmIChtb3M3ODQwX3BvcnRfcGFyYW5vaWFfY2hlY2socG9ydCwgX19GVU5DVElPTl9fKSkgeworCQlkYmcoIiVzIiwgIkludmFsaWQgcG9ydCBcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJbW9zNzg0MF9wb3J0ID0gbW9zNzg0MF9nZXRfcG9ydF9wcml2YXRlKHBvcnQpOworCXR0eSA9IG1vczc4NDBfcG9ydC0+cG9ydC0+dHR5OworCisJaWYgKG1vczc4NDBfcG9ydCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlkYmcoIiVzIC0gcG9ydCAlZCwgY21kID0gMHgleCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOworCisJc3dpdGNoIChjbWQpIHsKKwkJLyogcmV0dXJuIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgKi8KKworCWNhc2UgVElPQ0lOUToKKwkJZGJnKCIlcyAoJWQpIFRJT0NJTlEiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJCXJldHVybiBtb3M3ODQwX2dldF9ieXRlc19hdmFpbChtb3M3ODQwX3BvcnQsCisJCQkJCSAgICAgICAodW5zaWduZWQgaW50ICopYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIFRJT0NPVVRROgorCQlkYmcoIiVzICglZCkgVElPQ09VVFEiLCBfX0ZVTkNUSU9OX18sIHBvcnQtPm51bWJlcik7CisJCXJldHVybiBwdXRfdXNlcih0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyID8KKwkJCQl0dHktPmRyaXZlci0+Y2hhcnNfaW5fYnVmZmVyKHR0eSkgOiAwLAorCQkJCShpbnQgX191c2VyICopYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIFRDRkxTSDoKKwkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKworCQlsZCA9IHR0eV9sZGlzY19yZWYodHR5KTsKKwkJc3dpdGNoIChhcmcpIHsKKwkJY2FzZSBUQ0lGTFVTSDoKKwkJCWlmIChsZCAmJiBsZC0+Zmx1c2hfYnVmZmVyKQorCQkJCWxkLT5mbHVzaF9idWZmZXIodHR5KTsKKwkJCWJyZWFrOworCQljYXNlIFRDSU9GTFVTSDoKKwkJCWlmIChsZCAmJiBsZC0+Zmx1c2hfYnVmZmVyKQorCQkJCWxkLT5mbHVzaF9idWZmZXIodHR5KTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIFRDT0ZMVVNIOgorCQkJaWYgKHR0eS0+ZHJpdmVyLT5mbHVzaF9idWZmZXIpCisJCQkJdHR5LT5kcml2ZXItPmZsdXNoX2J1ZmZlcih0dHkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0dHlfbGRpc2NfZGVyZWYobGQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFRDR0VUUzoKKwkJaWYgKGtlcm5lbF90ZXJtaW9zX3RvX3VzZXJfdGVybWlvcworCQkgICAgKChzdHJ1Y3QgdGVybWlvcyBfX3VzZXIgKilhcmcsIHR0eS0+dGVybWlvcykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFRJT0NTRVJHRVRMU1I6CisJCWRiZygiJXMgKCVkKSBUSU9DU0VSR0VUTFNSIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQlyZXR1cm4gbW9zNzg0MF9nZXRfbHNyX2luZm8obW9zNzg0MF9wb3J0LCAodW5zaWduZWQgaW50ICopYXJnKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFRJT0NNQklTOgorCWNhc2UgVElPQ01CSUM6CisJY2FzZSBUSU9DTVNFVDoKKwkJZGJnKCIlcyAoJWQpIFRJT0NNU0VUL1RJT0NNQklDL1RJT0NNU0VUIiwgX19GVU5DVElPTl9fLAorCQkgICAgcG9ydC0+bnVtYmVyKTsKKwkJbW9zcmV0ID0KKwkJICAgIG1vczc4NDBfc2V0X21vZGVtX2luZm8obW9zNzg0MF9wb3J0LCBjbWQsCisJCQkJCSAgICh1bnNpZ25lZCBpbnQgKilhcmcpOworCQlyZXR1cm4gbW9zcmV0OworCisJY2FzZSBUSU9DTUdFVDoKKwkJZGJnKCIlcyAoJWQpIFRJT0NNR0VUIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQlyZXR1cm4gbW9zNzg0MF9nZXRfbW9kZW1faW5mbyhtb3M3ODQwX3BvcnQsCisJCQkJCSAgICAgICh1bnNpZ25lZCBpbnQgKilhcmcpOworCisJY2FzZSBUSU9DR1NFUklBTDoKKwkJZGJnKCIlcyAoJWQpIFRJT0NHU0VSSUFMIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQlyZXR1cm4gbW9zNzg0MF9nZXRfc2VyaWFsX2luZm8obW9zNzg0MF9wb3J0LAorCQkJCQkgICAgICAgKHN0cnVjdCBzZXJpYWxfc3RydWN0ICopYXJnKTsKKworCWNhc2UgVElPQ1NTRVJJQUw6CisJCWRiZygiJXMgKCVkKSBUSU9DU1NFUklBTCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKKwkJYnJlYWs7CisKKwljYXNlIFRJT0NNSVdBSVQ6CisJCWRiZygiJXMgKCVkKSBUSU9DTUlXQUlUIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCQljcHJldiA9IG1vczc4NDBfcG9ydC0+aWNvdW50OworCQl3aGlsZSAoMSkgeworCQkJLy9pbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZtb3M3ODQwX3BvcnQtPmRlbHRhX21zcl93YWl0KTsKKwkJCW1vczc4NDBfcG9ydC0+ZGVsdGFfbXNyX2NvbmQgPSAwOworCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKG1vczc4NDBfcG9ydC0+ZGVsdGFfbXNyX3dhaXQsCisJCQkJCQkgKG1vczc4NDBfcG9ydC0+CisJCQkJCQkgIGRlbHRhX21zcl9jb25kID09IDEpKTsKKworCQkJLyogc2VlIGlmIGEgc2lnbmFsIGRpZCBpdCAqLworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCQljbm93ID0gbW9zNzg0MF9wb3J0LT5pY291bnQ7CisJCQlpZiAoY25vdy5ybmcgPT0gY3ByZXYucm5nICYmIGNub3cuZHNyID09IGNwcmV2LmRzciAmJgorCQkJICAgIGNub3cuZGNkID09IGNwcmV2LmRjZCAmJiBjbm93LmN0cyA9PSBjcHJldi5jdHMpCisJCQkJcmV0dXJuIC1FSU87CS8qIG5vIGNoYW5nZSA9PiBlcnJvciAqLworCQkJaWYgKCgoYXJnICYgVElPQ01fUk5HKSAmJiAoY25vdy5ybmcgIT0gY3ByZXYucm5nKSkgfHwKKwkJCSAgICAoKGFyZyAmIFRJT0NNX0RTUikgJiYgKGNub3cuZHNyICE9IGNwcmV2LmRzcikpIHx8CisJCQkgICAgKChhcmcgJiBUSU9DTV9DRCkgJiYgKGNub3cuZGNkICE9IGNwcmV2LmRjZCkpIHx8CisJCQkgICAgKChhcmcgJiBUSU9DTV9DVFMpICYmIChjbm93LmN0cyAhPSBjcHJldi5jdHMpKSkgeworCQkJCXJldHVybiAwOworCQkJfQorCQkJY3ByZXYgPSBjbm93OworCQl9CisJCS8qIE5PVFJFQUNIRUQgKi8KKwkJYnJlYWs7CisKKwljYXNlIFRJT0NHSUNPVU5UOgorCQljbm93ID0gbW9zNzg0MF9wb3J0LT5pY291bnQ7CisJCWljb3VudC5jdHMgPSBjbm93LmN0czsKKwkJaWNvdW50LmRzciA9IGNub3cuZHNyOworCQlpY291bnQucm5nID0gY25vdy5ybmc7CisJCWljb3VudC5kY2QgPSBjbm93LmRjZDsKKwkJaWNvdW50LnJ4ID0gY25vdy5yeDsKKwkJaWNvdW50LnR4ID0gY25vdy50eDsKKwkJaWNvdW50LmZyYW1lID0gY25vdy5mcmFtZTsKKwkJaWNvdW50Lm92ZXJydW4gPSBjbm93Lm92ZXJydW47CisJCWljb3VudC5wYXJpdHkgPSBjbm93LnBhcml0eTsKKwkJaWNvdW50LmJyayA9IGNub3cuYnJrOworCQlpY291bnQuYnVmX292ZXJydW4gPSBjbm93LmJ1Zl9vdmVycnVuOworCisJCWRiZygiJXMgKCVkKSBUSU9DR0lDT1VOVCBSWD0lZCwgVFg9JWQiLCBfX0ZVTkNUSU9OX18sCisJCSAgICBwb3J0LT5udW1iZXIsIGljb3VudC5yeCwgaWNvdW50LnR4KTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmljb3VudCwgc2l6ZW9mKGljb3VudCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBUSU9DRVhCQVVEOgorCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCitzdGF0aWMgaW50IG1vczc4NDBfY2FsY19udW1fcG9ydHMoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKK3sKKworCWRiZygibnVtYmVyb2ZlbmRwb2ludHM6ICVkIFxuIiwKKwkgICAgKGludClzZXJpYWwtPmludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYk51bUVuZHBvaW50cyk7CisJZGJnKCJudW1iZXJvZmVuZHBvaW50czogJWQgXG4iLAorCSAgICAoaW50KXNlcmlhbC0+aW50ZXJmYWNlLT5hbHRzZXR0aW5nLT5kZXNjLmJOdW1FbmRwb2ludHMpOworCWlmIChzZXJpYWwtPmludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYk51bUVuZHBvaW50cyA9PSA1KSB7CisJCW1vczc4NDBfbnVtX3BvcnRzID0gMjsKKwkJc2VyaWFsLT50eXBlLT5udW1fcG9ydHMgPSAyOworCX0gZWxzZSBpZiAoc2VyaWFsLT5pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJOdW1FbmRwb2ludHMgPT0gOSkgeworCQltb3M3ODQwX251bV9wb3J0cyA9IDQ7CisJCXNlcmlhbC0+dHlwZS0+bnVtX2J1bGtfaW4gPSA0OworCQlzZXJpYWwtPnR5cGUtPm51bV9idWxrX291dCA9IDQ7CisJCXNlcmlhbC0+dHlwZS0+bnVtX3BvcnRzID0gNDsKKwl9CisKKwlyZXR1cm4gbW9zNzg0MF9udW1fcG9ydHM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtb3M3ODQwX3N0YXJ0dXAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG1vczc4NDBfc3RhcnR1cChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQoreworCXN0cnVjdCBtb3NjaGlwX3BvcnQgKm1vczc4NDBfcG9ydDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2OworCWludCBpLCBzdGF0dXM7CisKKwlfX3UxNiBEYXRhOworCWRiZygiJXMgXG4iLCAiIG1vczc4NDBfc3RhcnR1cCA6ZW50ZXJpbmcuLi4uLi4uLi4uIik7CisKKwlpZiAoIXNlcmlhbCkgeworCQlkYmcoIiVzXG4iLCAiSW52YWxpZCBIYW5kbGVyIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlkZXYgPSBzZXJpYWwtPmRldjsKKworCWRiZygiJXNcbiIsICJFbnRlcmluZy4uLiIpOworCisJLyogd2Ugc2V0IHVwIHRoZSBwb2ludGVycyB0byB0aGUgZW5kcG9pbnRzIGluIHRoZSBtb3M3ODQwX29wZW4gKgorCSAqIGZ1bmN0aW9uLCBhcyB0aGUgc3RydWN0dXJlcyBhcmVuJ3QgY3JlYXRlZCB5ZXQuICAgICAgICAgICAgICovCisKKwkvKiBzZXQgdXAgcG9ydCBwcml2YXRlIHN0cnVjdHVyZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgeworCQltb3M3ODQwX3BvcnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbW9zY2hpcF9wb3J0KSwgR0ZQX0tFUk5FTCk7CisJCWlmIChtb3M3ODQwX3BvcnQgPT0gTlVMTCkgeworCQkJZXJyKCIlcyAtIE91dCBvZiBtZW1vcnkiLCBfX0ZVTkNUSU9OX18pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWVtc2V0KG1vczc4NDBfcG9ydCwgMCwgc2l6ZW9mKHN0cnVjdCBtb3NjaGlwX3BvcnQpKTsKKworCQkvKiBJbml0aWFsaXplIGFsbCBwb3J0IGludGVycnVwdCBlbmQgcG9pbnQgdG8gcG9ydCAwIGludCBlbmRwb2ludCAqCisJCSAqIE91ciBkZXZpY2UgaGFzIG9ubHkgb25lIGludGVycnVwdCBlbmQgcG9pbnQgY29tbWFuIHRvIGFsbCBwb3J0ICovCisKKwkJbW9zNzg0MF9wb3J0LT5wb3J0ID0gc2VyaWFsLT5wb3J0W2ldOworCQltb3M3ODQwX3NldF9wb3J0X3ByaXZhdGUoc2VyaWFsLT5wb3J0W2ldLCBtb3M3ODQwX3BvcnQpOworCisJCW1vczc4NDBfcG9ydC0+cG9ydF9udW0gPSAoKHNlcmlhbC0+cG9ydFtpXS0+bnVtYmVyIC0KKwkJCQkJICAgKHNlcmlhbC0+cG9ydFtpXS0+c2VyaWFsLT5taW5vcikpICsKKwkJCQkJICAxKTsKKworCQlpZiAobW9zNzg0MF9wb3J0LT5wb3J0X251bSA9PSAxKSB7CisJCQltb3M3ODQwX3BvcnQtPlNwUmVnT2Zmc2V0ID0gMHgwOworCQkJbW9zNzg0MF9wb3J0LT5Db250cm9sUmVnT2Zmc2V0ID0gMHgxOworCQkJbW9zNzg0MF9wb3J0LT5EY3JSZWdPZmZzZXQgPSAweDQ7CisJCX0gZWxzZSBpZiAoKG1vczc4NDBfcG9ydC0+cG9ydF9udW0gPT0gMikKKwkJCSAgICYmIChtb3M3ODQwX251bV9wb3J0cyA9PSA0KSkgeworCQkJbW9zNzg0MF9wb3J0LT5TcFJlZ09mZnNldCA9IDB4ODsKKwkJCW1vczc4NDBfcG9ydC0+Q29udHJvbFJlZ09mZnNldCA9IDB4OTsKKwkJCW1vczc4NDBfcG9ydC0+RGNyUmVnT2Zmc2V0ID0gMHgxNjsKKwkJfSBlbHNlIGlmICgobW9zNzg0MF9wb3J0LT5wb3J0X251bSA9PSAyKQorCQkJICAgJiYgKG1vczc4NDBfbnVtX3BvcnRzID09IDIpKSB7CisJCQltb3M3ODQwX3BvcnQtPlNwUmVnT2Zmc2V0ID0gMHhhOworCQkJbW9zNzg0MF9wb3J0LT5Db250cm9sUmVnT2Zmc2V0ID0gMHhiOworCQkJbW9zNzg0MF9wb3J0LT5EY3JSZWdPZmZzZXQgPSAweDE5OworCQl9IGVsc2UgaWYgKChtb3M3ODQwX3BvcnQtPnBvcnRfbnVtID09IDMpCisJCQkgICAmJiAobW9zNzg0MF9udW1fcG9ydHMgPT0gNCkpIHsKKwkJCW1vczc4NDBfcG9ydC0+U3BSZWdPZmZzZXQgPSAweGE7CisJCQltb3M3ODQwX3BvcnQtPkNvbnRyb2xSZWdPZmZzZXQgPSAweGI7CisJCQltb3M3ODQwX3BvcnQtPkRjclJlZ09mZnNldCA9IDB4MTk7CisJCX0gZWxzZSBpZiAoKG1vczc4NDBfcG9ydC0+cG9ydF9udW0gPT0gNCkKKwkJCSAgICYmIChtb3M3ODQwX251bV9wb3J0cyA9PSA0KSkgeworCQkJbW9zNzg0MF9wb3J0LT5TcFJlZ09mZnNldCA9IDB4YzsKKwkJCW1vczc4NDBfcG9ydC0+Q29udHJvbFJlZ09mZnNldCA9IDB4ZDsKKwkJCW1vczc4NDBfcG9ydC0+RGNyUmVnT2Zmc2V0ID0gMHgxYzsKKwkJfQorCQltb3M3ODQwX2R1bXBfc2VyaWFsX3BvcnQobW9zNzg0MF9wb3J0KTsKKworCQltb3M3ODQwX3NldF9wb3J0X3ByaXZhdGUoc2VyaWFsLT5wb3J0W2ldLCBtb3M3ODQwX3BvcnQpOworCisJCS8vZW5hYmxlIHJ4X2Rpc2FibGUgYml0IGluIGNvbnRyb2wgcmVnaXN0ZXIKKworCQlzdGF0dXMgPQorCQkgICAgbW9zNzg0MF9nZXRfcmVnX3N5bmMoc2VyaWFsLT5wb3J0W2ldLAorCQkJCQkgbW9zNzg0MF9wb3J0LT5Db250cm9sUmVnT2Zmc2V0LCAmRGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlkYmcoIlJlYWRpbmcgQ29udHJvbFJlZyBmYWlsZWQgc3RhdHVzLTB4JXhcbiIsIHN0YXR1cyk7CisJCQlicmVhazsKKwkJfSBlbHNlCisJCQlkYmcoIkNvbnRyb2xSZWcgUmVhZGluZyBzdWNjZXNzIHZhbCBpcyAleCwgc3RhdHVzJWRcbiIsCisJCQkgICAgRGF0YSwgc3RhdHVzKTsKKwkJRGF0YSB8PSAweDA4OwkvL3NldHRpbmcgZHJpdmVyIGRvbmUgYml0CisJCURhdGEgfD0gMHgwNDsJLy9zcDFfYml0IHRvIGhhdmUgY3RzIGNoYW5nZSByZWZsZWN0IGluIG1vZGVtIHN0YXR1cyByZWcKKworCQkvL0RhdGEgfD0gMHgyMDsgLy9yeF9kaXNhYmxlIGJpdAorCQlzdGF0dXMgPSAwOworCQlzdGF0dXMgPQorCQkgICAgbW9zNzg0MF9zZXRfcmVnX3N5bmMoc2VyaWFsLT5wb3J0W2ldLAorCQkJCQkgbW9zNzg0MF9wb3J0LT5Db250cm9sUmVnT2Zmc2V0LCBEYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWRiZygiV3JpdGluZyBDb250cm9sUmVnIGZhaWxlZChyeF9kaXNhYmxlKSBzdGF0dXMtMHgleFxuIiwgc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCWRiZygiQ29udHJvbFJlZyBXcml0aW5nIHN1Y2Nlc3MocnhfZGlzYWJsZSkgc3RhdHVzJWRcbiIsCisJCQkgICAgc3RhdHVzKTsKKworCQkvL1dyaXRlIGRlZmF1bHQgdmFsdWVzIGluIERDUiAoaS5lIDB4MDEgaW4gRENSMCwgMHgwNSBpbiBEQ1IyIGFuZCAweDI0IGluIERDUjMKKwkJRGF0YSA9IDB4MDE7CisJCXN0YXR1cyA9IDA7CisJCXN0YXR1cyA9CisJCSAgICBtb3M3ODQwX3NldF9yZWdfc3luYyhzZXJpYWwtPnBvcnRbaV0sCisJCQkJCSAoX191MTYpIChtb3M3ODQwX3BvcnQtPkRjclJlZ09mZnNldCArCisJCQkJCQkgIDApLCBEYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWRiZygiV3JpdGluZyBEQ1IwIGZhaWxlZCBzdGF0dXMtMHgleFxuIiwgc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCWRiZygiRENSMCBXcml0aW5nIHN1Y2Nlc3Mgc3RhdHVzJWRcbiIsIHN0YXR1cyk7CisKKwkJRGF0YSA9IDB4MDU7CisJCXN0YXR1cyA9IDA7CisJCXN0YXR1cyA9CisJCSAgICBtb3M3ODQwX3NldF9yZWdfc3luYyhzZXJpYWwtPnBvcnRbaV0sCisJCQkJCSAoX191MTYpIChtb3M3ODQwX3BvcnQtPkRjclJlZ09mZnNldCArCisJCQkJCQkgIDEpLCBEYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWRiZygiV3JpdGluZyBEQ1IxIGZhaWxlZCBzdGF0dXMtMHgleFxuIiwgc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCWRiZygiRENSMSBXcml0aW5nIHN1Y2Nlc3Mgc3RhdHVzJWRcbiIsIHN0YXR1cyk7CisKKwkJRGF0YSA9IDB4MjQ7CisJCXN0YXR1cyA9IDA7CisJCXN0YXR1cyA9CisJCSAgICBtb3M3ODQwX3NldF9yZWdfc3luYyhzZXJpYWwtPnBvcnRbaV0sCisJCQkJCSAoX191MTYpIChtb3M3ODQwX3BvcnQtPkRjclJlZ09mZnNldCArCisJCQkJCQkgIDIpLCBEYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWRiZygiV3JpdGluZyBEQ1IyIGZhaWxlZCBzdGF0dXMtMHgleFxuIiwgc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCWRiZygiRENSMiBXcml0aW5nIHN1Y2Nlc3Mgc3RhdHVzJWRcbiIsIHN0YXR1cyk7CisKKwkJLy8gd3JpdGUgdmFsdWVzIGluIGNsa3N0YXJ0MHgwIGFuZCBjbGttdWx0aSAweDIwCisJCURhdGEgPSAweDA7CisJCXN0YXR1cyA9IDA7CisJCXN0YXR1cyA9CisJCSAgICBtb3M3ODQwX3NldF9yZWdfc3luYyhzZXJpYWwtPnBvcnRbaV0sCisJCQkJCSBDTEtfU1RBUlRfVkFMVUVfUkVHSVNURVIsIERhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJZGJnKCJXcml0aW5nIENMS19TVEFSVF9WQUxVRV9SRUdJU1RFUiBmYWlsZWQgc3RhdHVzLTB4JXhcbiIsIHN0YXR1cyk7CisJCQlicmVhazsKKwkJfSBlbHNlCisJCQlkYmcoIkNMS19TVEFSVF9WQUxVRV9SRUdJU1RFUiBXcml0aW5nIHN1Y2Nlc3Mgc3RhdHVzJWRcbiIsIHN0YXR1cyk7CisKKwkJRGF0YSA9IDB4MjA7CisJCXN0YXR1cyA9IDA7CisJCXN0YXR1cyA9CisJCSAgICBtb3M3ODQwX3NldF9yZWdfc3luYyhzZXJpYWwtPnBvcnRbaV0sIENMS19NVUxUSV9SRUdJU1RFUiwKKwkJCQkJIERhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJZGJnKCJXcml0aW5nIENMS19NVUxUSV9SRUdJU1RFUiBmYWlsZWQgc3RhdHVzLTB4JXhcbiIsCisJCQkgICAgc3RhdHVzKTsKKwkJCWJyZWFrOworCQl9IGVsc2UKKwkJCWRiZygiQ0xLX01VTFRJX1JFR0lTVEVSIFdyaXRpbmcgc3VjY2VzcyBzdGF0dXMlZFxuIiwKKwkJCSAgICBzdGF0dXMpOworCisJCS8vd3JpdGUgdmFsdWUgMHgwIHRvIHNjcmF0Y2hwYWQgcmVnaXN0ZXIKKwkJRGF0YSA9IDB4MDA7CisJCXN0YXR1cyA9IDA7CisJCXN0YXR1cyA9CisJCSAgICBtb3M3ODQwX3NldF91YXJ0X3JlZyhzZXJpYWwtPnBvcnRbaV0sIFNDUkFUQ0hfUEFEX1JFR0lTVEVSLAorCQkJCQkgRGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlkYmcoIldyaXRpbmcgU0NSQVRDSF9QQURfUkVHSVNURVIgZmFpbGVkIHN0YXR1cy0weCV4XG4iLAorCQkJICAgIHN0YXR1cyk7CisJCQlicmVhazsKKwkJfSBlbHNlCisJCQlkYmcoIlNDUkFUQ0hfUEFEX1JFR0lTVEVSIFdyaXRpbmcgc3VjY2VzcyBzdGF0dXMlZFxuIiwKKwkJCSAgICBzdGF0dXMpOworCisJCS8vWmVybyBMZW5ndGggZmxhZyByZWdpc3RlcgorCQlpZiAoKG1vczc4NDBfcG9ydC0+cG9ydF9udW0gIT0gMSkKKwkJICAgICYmIChtb3M3ODQwX251bV9wb3J0cyA9PSAyKSkgeworCisJCQlEYXRhID0gMHhmZjsKKwkJCXN0YXR1cyA9IDA7CisJCQlzdGF0dXMgPSBtb3M3ODQwX3NldF9yZWdfc3luYyhzZXJpYWwtPnBvcnRbaV0sCisJCQkJCQkgICAgICAoX191MTYpIChaTFBfUkVHMSArCisJCQkJCQkJICAgICAgICgoX191MTYpCisJCQkJCQkJCW1vczc4NDBfcG9ydC0+CisJCQkJCQkJCXBvcnRfbnVtKSksCisJCQkJCQkgICAgICBEYXRhKTsKKwkJCWRiZygiWkxJUCBvZmZzZXQleFxuIiwKKwkJCSAgICAoX191MTYpIChaTFBfUkVHMSArCisJCQkJICAgICAoKF9fdTE2KSBtb3M3ODQwX3BvcnQtPnBvcnRfbnVtKSkpOworCQkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCQlkYmcoIldyaXRpbmcgWkxQX1JFRyVkIGZhaWxlZCBzdGF0dXMtMHgleFxuIiwKKwkJCQkgICAgaSArIDIsIHN0YXR1cyk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQlkYmcoIlpMUF9SRUclZCBXcml0aW5nIHN1Y2Nlc3Mgc3RhdHVzJWRcbiIsCisJCQkJICAgIGkgKyAyLCBzdGF0dXMpOworCQl9IGVsc2UgeworCQkJRGF0YSA9IDB4ZmY7CisJCQlzdGF0dXMgPSAwOworCQkJc3RhdHVzID0gbW9zNzg0MF9zZXRfcmVnX3N5bmMoc2VyaWFsLT5wb3J0W2ldLAorCQkJCQkJICAgICAgKF9fdTE2KSAoWkxQX1JFRzEgKworCQkJCQkJCSAgICAgICAoKF9fdTE2KQorCQkJCQkJCQltb3M3ODQwX3BvcnQtPgorCQkJCQkJCQlwb3J0X251bSkgLQorCQkJCQkJCSAgICAgICAweDEpLCBEYXRhKTsKKwkJCWRiZygiWkxJUCBvZmZzZXQleFxuIiwKKwkJCSAgICAoX191MTYpIChaTFBfUkVHMSArCisJCQkJICAgICAoKF9fdTE2KSBtb3M3ODQwX3BvcnQtPnBvcnRfbnVtKSAtIDB4MSkpOworCQkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCQlkYmcoIldyaXRpbmcgWkxQX1JFRyVkIGZhaWxlZCBzdGF0dXMtMHgleFxuIiwKKwkJCQkgICAgaSArIDEsIHN0YXR1cyk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQlkYmcoIlpMUF9SRUclZCBXcml0aW5nIHN1Y2Nlc3Mgc3RhdHVzJWRcbiIsCisJCQkJICAgIGkgKyAxLCBzdGF0dXMpOworCisJCX0KKwkJbW9zNzg0MF9wb3J0LT5jb250cm9sX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgU0xBQl9BVE9NSUMpOworCQltb3M3ODQwX3BvcnQtPmN0cmxfYnVmID0ga21hbGxvYygxNiwgR0ZQX0tFUk5FTCk7CisKKwl9CisKKwkvL1plcm8gTGVuZ3RoIGZsYWcgZW5hYmxlCisJRGF0YSA9IDB4MGY7CisJc3RhdHVzID0gMDsKKwlzdGF0dXMgPSBtb3M3ODQwX3NldF9yZWdfc3luYyhzZXJpYWwtPnBvcnRbMF0sIFpMUF9SRUc1LCBEYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkYmcoIldyaXRpbmcgWkxQX1JFRzUgZmFpbGVkIHN0YXR1cy0weCV4XG4iLCBzdGF0dXMpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlCisJCWRiZygiWkxQX1JFRzUgV3JpdGluZyBzdWNjZXNzIHN0YXR1cyVkXG4iLCBzdGF0dXMpOworCisJLyogc2V0dGluZyBjb25maWd1cmF0aW9uIGZlYXR1cmUgdG8gb25lICovCisJdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LCB1c2Jfc25kY3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLAorCQkJKF9fdTgpIDB4MDMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDUgKiBIWik7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtb3M3ODQwX3NodXRkb3duCisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgZGV2aWNlIGlzIHJlbW92ZWQgZnJvbSB0aGUgdXNiIGJ1cy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBtb3M3ODQwX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCit7CisJaW50IGk7CisJc3RydWN0IG1vc2NoaXBfcG9ydCAqbW9zNzg0MF9wb3J0OworCWRiZygiJXMgXG4iLCAiIHNodXRkb3duIDplbnRlcmluZy4uLi4uLi4uLi4iKTsKKworCWlmICghc2VyaWFsKSB7CisJCWRiZygiJXMiLCAiSW52YWxpZCBIYW5kbGVyIFxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiAgICAgIGNoZWNrIGZvciB0aGUgcG9ydHMgdG8gYmUgY2xvc2VkLGNsb3NlIHRoZSBwb3J0cyBhbmQgZGlzY29ubmVjdCAgICAgICAgICovCisKKwkvKiBmcmVlIHByaXZhdGUgc3RydWN0dXJlIGFsbG9jYXRlZCBmb3Igc2VyaWFsIHBvcnQgICoKKwkgKiBzdG9wIHJlYWRzIGFuZCB3cml0ZXMgb24gYWxsIHBvcnRzICAgICAgICAgICAgICAgICovCisKKwlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsLT5udW1fcG9ydHM7ICsraSkgeworCQltb3M3ODQwX3BvcnQgPSBtb3M3ODQwX2dldF9wb3J0X3ByaXZhdGUoc2VyaWFsLT5wb3J0W2ldKTsKKwkJa2ZyZWUobW9zNzg0MF9wb3J0LT5jdHJsX2J1Zik7CisJCXVzYl9raWxsX3VyYihtb3M3ODQwX3BvcnQtPmNvbnRyb2xfdXJiKTsKKwkJa2ZyZWUobW9zNzg0MF9wb3J0KTsKKwkJbW9zNzg0MF9zZXRfcG9ydF9wcml2YXRlKHNlcmlhbC0+cG9ydFtpXSwgTlVMTCk7CisJfQorCisJZGJnKCIlc1xuIiwgIlRoYW5rIHUgOjogIik7CisKK30KKworc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciBtb3NjaGlwNzg0MF80cG9ydF9kZXZpY2UgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIC5uYW1lID0gIm1vczc4NDAiLAorCQkgICB9LAorCS5kZXNjcmlwdGlvbiA9IERSSVZFUl9ERVNDLAorCS5pZF90YWJsZSA9IG1vc2NoaXBfcG9ydF9pZF90YWJsZSwKKwkubnVtX2ludGVycnVwdF9pbiA9IDEsCS8vTlVNX0RPTlRfQ0FSRSwvLzEsCisjaWZkZWYgY2hlY2sKKwkubnVtX2J1bGtfaW4gPSA0LAorCS5udW1fYnVsa19vdXQgPSA0LAorCS5udW1fcG9ydHMgPSA0LAorI2VuZGlmCisJLm9wZW4gPSBtb3M3ODQwX29wZW4sCisJLmNsb3NlID0gbW9zNzg0MF9jbG9zZSwKKwkud3JpdGUgPSBtb3M3ODQwX3dyaXRlLAorCS53cml0ZV9yb29tID0gbW9zNzg0MF93cml0ZV9yb29tLAorCS5jaGFyc19pbl9idWZmZXIgPSBtb3M3ODQwX2NoYXJzX2luX2J1ZmZlciwKKwkudGhyb3R0bGUgPSBtb3M3ODQwX3Rocm90dGxlLAorCS51bnRocm90dGxlID0gbW9zNzg0MF91bnRocm90dGxlLAorCS5jYWxjX251bV9wb3J0cyA9IG1vczc4NDBfY2FsY19udW1fcG9ydHMsCisjaWZkZWYgTUNTU2VyaWFsUHJvYmUKKwkucHJvYmUgPSBtb3M3ODQwX3NlcmlhbF9wcm9iZSwKKyNlbmRpZgorCS5pb2N0bCA9IG1vczc4NDBfaW9jdGwsCisJLnNldF90ZXJtaW9zID0gbW9zNzg0MF9zZXRfdGVybWlvcywKKwkuYnJlYWtfY3RsID0gbW9zNzg0MF9icmVhaywKKwkudGlvY21nZXQgPSBtb3M3ODQwX3Rpb2NtZ2V0LAorCS50aW9jbXNldCA9IG1vczc4NDBfdGlvY21zZXQsCisJLmF0dGFjaCA9IG1vczc4NDBfc3RhcnR1cCwKKwkuc2h1dGRvd24gPSBtb3M3ODQwX3NodXRkb3duLAorCS5yZWFkX2J1bGtfY2FsbGJhY2sgPSBtb3M3ODQwX2J1bGtfaW5fY2FsbGJhY2ssCisJLnJlYWRfaW50X2NhbGxiYWNrID0gbW9zNzg0MF9pbnRlcnJ1cHRfY2FsbGJhY2ssCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgaW9fZHJpdmVyID0geworCS5uYW1lID0gIm1vczc4NDAiLAorCS5wcm9iZSA9IHVzYl9zZXJpYWxfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSB1c2Jfc2VyaWFsX2Rpc2Nvbm5lY3QsCisJLmlkX3RhYmxlID0gbW9zY2hpcF9pZF90YWJsZV9jb21iaW5lZCwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtb3NjaGlwNzg0MF9pbml0CisgKglUaGlzIGlzIGNhbGxlZCBieSB0aGUgbW9kdWxlIHN1YnN5c3RlbSwgb3Igb24gc3RhcnR1cCB0byBpbml0aWFsaXplIHVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgX19pbml0IG1vc2NoaXA3ODQwX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJZGJnKCIlcyBcbiIsICIgbW9zNzg0MF9pbml0IDplbnRlcmluZy4uLi4uLi4uLi4iKTsKKworCS8qIFJlZ2lzdGVyIHdpdGggdGhlIHVzYiBzZXJpYWwgKi8KKwlyZXR2YWwgPSB1c2Jfc2VyaWFsX3JlZ2lzdGVyKCZtb3NjaGlwNzg0MF80cG9ydF9kZXZpY2UpOworCisJaWYgKHJldHZhbCkKKwkJZ290byBmYWlsZWRfcG9ydF9kZXZpY2VfcmVnaXN0ZXI7CisKKwlkYmcoIiVzXG4iLCAiRW50cmluZy4uLiIpOworCWluZm8oRFJJVkVSX0RFU0MgIiAiIERSSVZFUl9WRVJTSU9OKTsKKworCS8qIFJlZ2lzdGVyIHdpdGggdGhlIHVzYiAqLworCXJldHZhbCA9IHVzYl9yZWdpc3RlcigmaW9fZHJpdmVyKTsKKworCWlmIChyZXR2YWwpCisJCWdvdG8gZmFpbGVkX3VzYl9yZWdpc3RlcjsKKworCWlmIChyZXR2YWwgPT0gMCkgeworCQlkYmcoIiVzXG4iLCAiTGVhdmluZy4uLiIpOworCQlyZXR1cm4gMDsKKwl9CisKKyAgICAgIGZhaWxlZF91c2JfcmVnaXN0ZXI6CisJdXNiX3NlcmlhbF9kZXJlZ2lzdGVyKCZtb3NjaGlwNzg0MF80cG9ydF9kZXZpY2UpOworCisgICAgICBmYWlsZWRfcG9ydF9kZXZpY2VfcmVnaXN0ZXI6CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogbW9zY2hpcDc4NDBfZXhpdAorICoJQ2FsbGVkIHdoZW4gdGhlIGRyaXZlciBpcyBhYm91dCB0byBiZSB1bmxvYWRlZC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgX19leGl0IG1vc2NoaXA3ODQwX2V4aXQodm9pZCkKK3sKKworCWRiZygiJXMgXG4iLCAiIG1vczc4NDBfZXhpdCA6ZW50ZXJpbmcuLi4uLi4uLi4uIik7CisKKwl1c2JfZGVyZWdpc3RlcigmaW9fZHJpdmVyKTsKKworCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmbW9zY2hpcDc4NDBfNHBvcnRfZGV2aWNlKTsKKworCWRiZygiJXNcbiIsICJFbnRyaW5nLi4uIik7Cit9CisKK21vZHVsZV9pbml0KG1vc2NoaXA3ODQwX2luaXQpOworbW9kdWxlX2V4aXQobW9zY2hpcDc4NDBfZXhpdCk7CisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgZW5hYmxlZCBvciBub3QiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuYwppbmRleCA2NWU0ZDA0Li4xMDM2ZDQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3BsMjMwMy5jCkBAIC04MSwxMCArODEsMTEgQEAKIAl7IFVTQl9ERVZJQ0UoU1BFRUREUkFHT05fVkVORE9SX0lELCBTUEVFRERSQUdPTl9QUk9EVUNUX0lEKSB9LAogCXsgVVNCX0RFVklDRShEQVRBUElMT1RfVTJfVkVORE9SX0lELCBEQVRBUElMT1RfVTJfUFJPRFVDVF9JRCkgfSwKIAl7IFVTQl9ERVZJQ0UoQkVMS0lOX1ZFTkRPUl9JRCwgQkVMS0lOX1BST0RVQ1RfSUQpIH0sCisJeyBVU0JfREVWSUNFKEFMQ09SX1ZFTkRPUl9JRCwgQUxDT1JfUFJPRFVDVF9JRCkgfSwKIAl7IH0JCQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogCi1NT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIGlkX3RhYmxlKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUodXNiLCBpZF90YWJsZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBwbDIzMDNfZHJpdmVyID0gewogCS5uYW1lID0JCSJwbDIzMDMiLApAQCAtMTI3LDY1ICsxMjgsNiBAQAogI2RlZmluZSBVQVJUX09WRVJSVU5fRVJST1IJCTB4NDAKICNkZWZpbmUgVUFSVF9DVFMJCQkweDgwCiAKLS8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIGEgUEwyMzAzIHNlcmlhbCBjb252ZXJ0ZXIgKi8KLXN0YXRpYyBpbnQgcGwyMzAzX29wZW4gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxwKTsKLXN0YXRpYyB2b2lkIHBsMjMwM19jbG9zZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApOwotc3RhdGljIHZvaWQgcGwyMzAzX3NldF90ZXJtaW9zIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCQkJCXN0cnVjdCB0ZXJtaW9zICpvbGQpOwotc3RhdGljIGludCBwbDIzMDNfaW9jdGwgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKLXN0YXRpYyB2b2lkIHBsMjMwM19yZWFkX2ludF9jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1zdGF0aWMgdm9pZCBwbDIzMDNfcmVhZF9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLXN0YXRpYyB2b2lkIHBsMjMwM193cml0ZV9idWxrX2NhbGxiYWNrIChzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLXN0YXRpYyBpbnQgcGwyMzAzX3dyaXRlIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAotCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNvdW50KTsKLXN0YXRpYyB2b2lkIHBsMjMwM19zZW5kIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KTsKLXN0YXRpYyBpbnQgcGwyMzAzX3dyaXRlX3Jvb20oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgaW50IHBsMjMwM19jaGFyc19pbl9idWZmZXIoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCk7Ci1zdGF0aWMgdm9pZCBwbDIzMDNfYnJlYWtfY3RsKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsaW50IGJyZWFrX3N0YXRlKTsKLXN0YXRpYyBpbnQgcGwyMzAzX3Rpb2NtZ2V0IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgaW50IHBsMjMwM190aW9jbXNldCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKTsKLXN0YXRpYyBpbnQgcGwyMzAzX3N0YXJ0dXAgKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpOwotc3RhdGljIHZvaWQgcGwyMzAzX3NodXRkb3duIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKTsKLXN0YXRpYyBzdHJ1Y3QgcGwyMzAzX2J1ZiAqcGwyMzAzX2J1Zl9hbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSk7Ci1zdGF0aWMgdm9pZCBwbDIzMDNfYnVmX2ZyZWUoc3RydWN0IHBsMjMwM19idWYgKnBiKTsKLXN0YXRpYyB2b2lkIHBsMjMwM19idWZfY2xlYXIoc3RydWN0IHBsMjMwM19idWYgKnBiKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGwyMzAzX2J1Zl9kYXRhX2F2YWlsKHN0cnVjdCBwbDIzMDNfYnVmICpwYik7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHBsMjMwM19idWZfc3BhY2VfYXZhaWwoc3RydWN0IHBsMjMwM19idWYgKnBiKTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGwyMzAzX2J1Zl9wdXQoc3RydWN0IHBsMjMwM19idWYgKnBiLCBjb25zdCBjaGFyICpidWYsCi0JdW5zaWduZWQgaW50IGNvdW50KTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGwyMzAzX2J1Zl9nZXQoc3RydWN0IHBsMjMwM19idWYgKnBiLCBjaGFyICpidWYsCi0JdW5zaWduZWQgaW50IGNvdW50KTsKLQotCi0vKiBBbGwgb2YgdGhlIGRldmljZSBpbmZvIG5lZWRlZCBmb3IgdGhlIFBMMjMwMyBTSU8gc2VyaWFsIGNvbnZlcnRlciAqLwotc3RhdGljIHN0cnVjdCB1c2Jfc2VyaWFsX2RyaXZlciBwbDIzMDNfZGV2aWNlID0gewotCS5kcml2ZXIgPSB7Ci0JCS5vd25lciA9CVRISVNfTU9EVUxFLAotCQkubmFtZSA9CQkicGwyMzAzIiwKLQl9LAotCS5pZF90YWJsZSA9CQlpZF90YWJsZSwKLQkubnVtX2ludGVycnVwdF9pbiA9CU5VTV9ET05UX0NBUkUsCi0JLm51bV9idWxrX2luID0JCTEsCi0JLm51bV9idWxrX291dCA9CQkxLAotCS5udW1fcG9ydHMgPQkJMSwKLQkub3BlbiA9CQkJcGwyMzAzX29wZW4sCi0JLmNsb3NlID0JCXBsMjMwM19jbG9zZSwKLQkud3JpdGUgPQkJcGwyMzAzX3dyaXRlLAotCS5pb2N0bCA9CQlwbDIzMDNfaW9jdGwsCi0JLmJyZWFrX2N0bCA9CQlwbDIzMDNfYnJlYWtfY3RsLAotCS5zZXRfdGVybWlvcyA9CQlwbDIzMDNfc2V0X3Rlcm1pb3MsCi0JLnRpb2NtZ2V0ID0JCXBsMjMwM190aW9jbWdldCwKLQkudGlvY21zZXQgPQkJcGwyMzAzX3Rpb2Ntc2V0LAotCS5yZWFkX2J1bGtfY2FsbGJhY2sgPQlwbDIzMDNfcmVhZF9idWxrX2NhbGxiYWNrLAotCS5yZWFkX2ludF9jYWxsYmFjayA9CXBsMjMwM19yZWFkX2ludF9jYWxsYmFjaywKLQkud3JpdGVfYnVsa19jYWxsYmFjayA9CXBsMjMwM193cml0ZV9idWxrX2NhbGxiYWNrLAotCS53cml0ZV9yb29tID0JCXBsMjMwM193cml0ZV9yb29tLAotCS5jaGFyc19pbl9idWZmZXIgPQlwbDIzMDNfY2hhcnNfaW5fYnVmZmVyLAotCS5hdHRhY2ggPQkJcGwyMzAzX3N0YXJ0dXAsCi0JLnNodXRkb3duID0JCXBsMjMwM19zaHV0ZG93biwKLX07CiAKIGVudW0gcGwyMzAzX3R5cGUgewogCXR5cGVfMCwJCS8qIGRvbid0IGtub3cgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0eXBlIDAgYW5kICovCkBAIC0yMDQsOCArMTQ2LDE2NiBAQAogCWVudW0gcGwyMzAzX3R5cGUgdHlwZTsKIH07CiAKKy8qCisgKiBwbDIzMDNfYnVmX2FsbG9jCisgKgorICogQWxsb2NhdGUgYSBjaXJjdWxhciBidWZmZXIgYW5kIGFsbCBhc3NvY2lhdGVkIG1lbW9yeS4KKyAqLworc3RhdGljIHN0cnVjdCBwbDIzMDNfYnVmICpwbDIzMDNfYnVmX2FsbG9jKHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBwbDIzMDNfYnVmICpwYjsKIAotc3RhdGljIGludCBwbDIzMDNfc3RhcnR1cCAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCXBiID0gKHN0cnVjdCBwbDIzMDNfYnVmICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHBsMjMwM19idWYpLCBHRlBfS0VSTkVMKTsKKwlpZiAocGIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwYi0+YnVmX2J1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBiLT5idWZfYnVmID09IE5VTEwpIHsKKwkJa2ZyZWUocGIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwYi0+YnVmX3NpemUgPSBzaXplOworCXBiLT5idWZfZ2V0ID0gcGItPmJ1Zl9wdXQgPSBwYi0+YnVmX2J1ZjsKKworCXJldHVybiBwYjsKK30KKworLyoKKyAqIHBsMjMwM19idWZfZnJlZQorICoKKyAqIEZyZWUgdGhlIGJ1ZmZlciBhbmQgYWxsIGFzc29jaWF0ZWQgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCBwbDIzMDNfYnVmX2ZyZWUoc3RydWN0IHBsMjMwM19idWYgKnBiKQoreworCWlmIChwYikgeworCQlrZnJlZShwYi0+YnVmX2J1Zik7CisJCWtmcmVlKHBiKTsKKwl9Cit9CisKKy8qCisgKiBwbDIzMDNfYnVmX2NsZWFyCisgKgorICogQ2xlYXIgb3V0IGFsbCBkYXRhIGluIHRoZSBjaXJjdWxhciBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIHBsMjMwM19idWZfY2xlYXIoc3RydWN0IHBsMjMwM19idWYgKnBiKQoreworCWlmIChwYiAhPSBOVUxMKQorCQlwYi0+YnVmX2dldCA9IHBiLT5idWZfcHV0OworCQkvKiBlcXVpdmFsZW50IHRvIGEgZ2V0IG9mIGFsbCBkYXRhIGF2YWlsYWJsZSAqLworfQorCisvKgorICogcGwyMzAzX2J1Zl9kYXRhX2F2YWlsCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSBhdmFpbGFibGUgaW4gdGhlIGNpcmN1bGFyCisgKiBidWZmZXIuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGwyMzAzX2J1Zl9kYXRhX2F2YWlsKHN0cnVjdCBwbDIzMDNfYnVmICpwYikKK3sKKwlpZiAocGIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKChwYi0+YnVmX3NpemUgKyBwYi0+YnVmX3B1dCAtIHBiLT5idWZfZ2V0KSAlIHBiLT5idWZfc2l6ZSk7Cit9CisKKy8qCisgKiBwbDIzMDNfYnVmX3NwYWNlX2F2YWlsCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2Ygc3BhY2UgYXZhaWxhYmxlIGluIHRoZSBjaXJjdWxhcgorICogYnVmZmVyLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHBsMjMwM19idWZfc3BhY2VfYXZhaWwoc3RydWN0IHBsMjMwM19idWYgKnBiKQoreworCWlmIChwYiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAoKHBiLT5idWZfc2l6ZSArIHBiLT5idWZfZ2V0IC0gcGItPmJ1Zl9wdXQgLSAxKSAlIHBiLT5idWZfc2l6ZSk7Cit9CisKKy8qCisgKiBwbDIzMDNfYnVmX3B1dAorICoKKyAqIENvcHkgZGF0YSBkYXRhIGZyb20gYSB1c2VyIGJ1ZmZlciBhbmQgcHV0IGl0IGludG8gdGhlIGNpcmN1bGFyIGJ1ZmZlci4KKyAqIFJlc3RyaWN0IHRvIHRoZSBhbW91bnQgb2Ygc3BhY2UgYXZhaWxhYmxlLgorICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBwbDIzMDNfYnVmX3B1dChzdHJ1Y3QgcGwyMzAzX2J1ZiAqcGIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWlmIChwYiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWxlbiAgPSBwbDIzMDNfYnVmX3NwYWNlX2F2YWlsKHBiKTsKKwlpZiAoY291bnQgPiBsZW4pCisJCWNvdW50ID0gbGVuOworCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCisJbGVuID0gcGItPmJ1Zl9idWYgKyBwYi0+YnVmX3NpemUgLSBwYi0+YnVmX3B1dDsKKwlpZiAoY291bnQgPiBsZW4pIHsKKwkJbWVtY3B5KHBiLT5idWZfcHV0LCBidWYsIGxlbik7CisJCW1lbWNweShwYi0+YnVmX2J1ZiwgYnVmK2xlbiwgY291bnQgLSBsZW4pOworCQlwYi0+YnVmX3B1dCA9IHBiLT5idWZfYnVmICsgY291bnQgLSBsZW47CisJfSBlbHNlIHsKKwkJbWVtY3B5KHBiLT5idWZfcHV0LCBidWYsIGNvdW50KTsKKwkJaWYgKGNvdW50IDwgbGVuKQorCQkJcGItPmJ1Zl9wdXQgKz0gY291bnQ7CisJCWVsc2UgLyogY291bnQgPT0gbGVuICovCisJCQlwYi0+YnVmX3B1dCA9IHBiLT5idWZfYnVmOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIHBsMjMwM19idWZfZ2V0CisgKgorICogR2V0IGRhdGEgZnJvbSB0aGUgY2lyY3VsYXIgYnVmZmVyIGFuZCBjb3B5IHRvIHRoZSBnaXZlbiBidWZmZXIuCisgKiBSZXN0cmljdCB0byB0aGUgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlLgorICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBwbDIzMDNfYnVmX2dldChzdHJ1Y3QgcGwyMzAzX2J1ZiAqcGIsIGNoYXIgKmJ1ZiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWlmIChwYiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWxlbiA9IHBsMjMwM19idWZfZGF0YV9hdmFpbChwYik7CisJaWYgKGNvdW50ID4gbGVuKQorCQljb3VudCA9IGxlbjsKKworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWxlbiA9IHBiLT5idWZfYnVmICsgcGItPmJ1Zl9zaXplIC0gcGItPmJ1Zl9nZXQ7CisJaWYgKGNvdW50ID4gbGVuKSB7CisJCW1lbWNweShidWYsIHBiLT5idWZfZ2V0LCBsZW4pOworCQltZW1jcHkoYnVmK2xlbiwgcGItPmJ1Zl9idWYsIGNvdW50IC0gbGVuKTsKKwkJcGItPmJ1Zl9nZXQgPSBwYi0+YnVmX2J1ZiArIGNvdW50IC0gbGVuOworCX0gZWxzZSB7CisJCW1lbWNweShidWYsIHBiLT5idWZfZ2V0LCBjb3VudCk7CisJCWlmIChjb3VudCA8IGxlbikKKwkJCXBiLT5idWZfZ2V0ICs9IGNvdW50OworCQllbHNlIC8qIGNvdW50ID09IGxlbiAqLworCQkJcGItPmJ1Zl9nZXQgPSBwYi0+YnVmX2J1ZjsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgcGwyMzAzX3N0YXJ0dXAoc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCkKIHsKIAlzdHJ1Y3QgcGwyMzAzX3ByaXZhdGUgKnByaXY7CiAJZW51bSBwbDIzMDNfdHlwZSB0eXBlID0gdHlwZV8wOwpAQCAtMjQ3LDM2ICszNDcsMTcgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotc3RhdGljIGludCBzZXRfY29udHJvbF9saW5lcyAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdTggdmFsdWUpCitzdGF0aWMgaW50IHNldF9jb250cm9sX2xpbmVzKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHU4IHZhbHVlKQogewogCWludCByZXR2YWw7CiAJCi0JcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnIChkZXYsIHVzYl9zbmRjdHJscGlwZSAoZGV2LCAwKSwKLQkJCQkgIFNFVF9DT05UUk9MX1JFUVVFU1QsIFNFVF9DT05UUk9MX1JFUVVFU1RfVFlQRSwKLQkJCQkgIHZhbHVlLCAwLCBOVUxMLCAwLCAxMDApOworCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhkZXYsIHVzYl9zbmRjdHJscGlwZShkZXYsIDApLAorCQkJCSBTRVRfQ09OVFJPTF9SRVFVRVNULCBTRVRfQ09OVFJPTF9SRVFVRVNUX1RZUEUsCisJCQkJIHZhbHVlLCAwLCBOVUxMLCAwLCAxMDApOwogCWRiZygiJXMgLSB2YWx1ZSA9ICVkLCByZXR2YWwgPSAlZCIsIF9fRlVOQ1RJT05fXywgdmFsdWUsIHJldHZhbCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCBwbDIzMDNfd3JpdGUgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgcGwyMzAzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWRiZygiJXMgLSBwb3J0ICVkLCAlZCBieXRlcyIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7Ci0KLQlpZiAoIWNvdW50KQotCQlyZXR1cm4gY291bnQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWNvdW50ID0gcGwyMzAzX2J1Zl9wdXQocHJpdi0+YnVmLCBidWYsIGNvdW50KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlwbDIzMDNfc2VuZChwb3J0KTsKLQotCXJldHVybiBjb3VudDsKLX0KLQogc3RhdGljIHZvaWQgcGwyMzAzX3NlbmQoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlpbnQgY291bnQsIHJlc3VsdDsKQEAgLTI5Myw3ICszNzQsNyBAQAogCX0KIAogCWNvdW50ID0gcGwyMzAzX2J1Zl9nZXQocHJpdi0+YnVmLCBwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlciwKLQkJcG9ydC0+YnVsa19vdXRfc2l6ZSk7CisJCQkgICAgICAgcG9ydC0+YnVsa19vdXRfc2l6ZSk7CiAKIAlpZiAoY291bnQgPT0gMCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC0zMDQsMTMgKzM4NSwxNSBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGNvdW50LCBwb3J0LT53cml0ZV91cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sIGNvdW50LAorCQkJICAgICAgcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXIpOwogCiAJcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gY291bnQ7CiAJcG9ydC0+d3JpdGVfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKLQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYiAocG9ydC0+d3JpdGVfdXJiLCBHRlBfQVRPTUlDKTsKKwlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT53cml0ZV91cmIsIEdGUF9BVE9NSUMpOwogCWlmIChyZXN1bHQpIHsKLQkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgc3VibWl0dGluZyB3cml0ZSB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgd3JpdGUgdXJiLCIKKwkJCSIgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKIAkJcHJpdi0+d3JpdGVfdXJiX2luX3VzZSA9IDA7CiAJCS8vIFRPRE86IHJlc2NoZWR1bGUgcGwyMzAzX3NlbmQKIAl9CkBAIC0zMTgsNiArNDAxLDI2IEBACiAJdXNiX3NlcmlhbF9wb3J0X3NvZnRpbnQocG9ydCk7CiB9CiAKK3N0YXRpYyBpbnQgcGwyMzAzX3dyaXRlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCWludCBjb3VudCkKK3sKKwlzdHJ1Y3QgcGwyMzAzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRiZygiJXMgLSBwb3J0ICVkLCAlZCBieXRlcyIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjb3VudCk7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gY291bnQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCWNvdW50ID0gcGwyMzAzX2J1Zl9wdXQocHJpdi0+YnVmLCBidWYsIGNvdW50KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlwbDIzMDNfc2VuZChwb3J0KTsKKworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIGludCBwbDIzMDNfd3JpdGVfcm9vbShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBwbDIzMDNfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKQEAgLTM1MCw3ICs0NTMsOCBAQAogCXJldHVybiBjaGFyczsKIH0KIAotc3RhdGljIHZvaWQgcGwyMzAzX3NldF90ZXJtaW9zIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCitzdGF0aWMgdm9pZCBwbDIzMDNfc2V0X3Rlcm1pb3Moc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJCSAgICAgICBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IHBvcnQtPnNlcmlhbDsKIAlzdHJ1Y3QgcGwyMzAzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CkBAIC0zNzEsNyArNDc1LDggQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCWlmICghcHJpdi0+dGVybWlvc19pbml0aWFsaXplZCkgewogCQkqKHBvcnQtPnR0eS0+dGVybWlvcykgPSB0dHlfc3RkX3Rlcm1pb3M7Ci0JCXBvcnQtPnR0eS0+dGVybWlvcy0+Y19jZmxhZyA9IEI5NjAwIHwgQ1M4IHwgQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKwkJcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnID0gQjk2MDAgfCBDUzggfCBDUkVBRCB8CisJCQkJCSAgICAgIEhVUENMIHwgQ0xPQ0FMOwogCQlwcml2LT50ZXJtaW9zX2luaXRpYWxpemVkID0gMTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwpAQCAtMzgwLDI0ICs0ODUsMjQgQEAKIAkvKiBjaGVjayB0aGF0IHRoZXkgcmVhbGx5IHdhbnQgdXMgdG8gY2hhbmdlIHNvbWV0aGluZyAqLwogCWlmIChvbGRfdGVybWlvcykgewogCQlpZiAoKGNmbGFnID09IG9sZF90ZXJtaW9zLT5jX2NmbGFnKSAmJgotCQkgICAgKFJFTEVWQU5UX0lGTEFHKHBvcnQtPnR0eS0+dGVybWlvcy0+Y19pZmxhZykgPT0gUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkgewotCQkgICAgZGJnKCIlcyAtIG5vdGhpbmcgdG8gY2hhbmdlLi4uIiwgX19GVU5DVElPTl9fKTsKLQkJICAgIHJldHVybjsKKwkJICAgIChSRUxFVkFOVF9JRkxBRyhwb3J0LT50dHktPnRlcm1pb3MtPmNfaWZsYWcpID09CisJCSAgICAgUkVMRVZBTlRfSUZMQUcob2xkX3Rlcm1pb3MtPmNfaWZsYWcpKSkgeworCQkJZGJnKCIlcyAtIG5vdGhpbmcgdG8gY2hhbmdlLi4uIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybjsKIAkJfQogCX0KIAotCWJ1ZiA9IGt6YWxsb2MgKDcsIEdGUF9LRVJORUwpOworCWJ1ZiA9IGt6YWxsb2MoNywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBvdXQgb2YgbWVtb3J5LlxuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuOwogCX0KLQkKLQlpID0gdXNiX2NvbnRyb2xfbXNnIChzZXJpYWwtPmRldiwgdXNiX3JjdmN0cmxwaXBlIChzZXJpYWwtPmRldiwgMCksCi0JCQkgICAgIEdFVF9MSU5FX1JFUVVFU1QsIEdFVF9MSU5FX1JFUVVFU1RfVFlQRSwKLQkJCSAgICAgMCwgMCwgYnVmLCA3LCAxMDApOwotCWRiZyAoIjB4YTE6MHgyMTowOjAgICVkIC0gJXggJXggJXggJXggJXggJXggJXgiLCBpLAotCSAgICAgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdLCBidWZbNF0sIGJ1Zls1XSwgYnVmWzZdKTsKIAorCWkgPSB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsIHVzYl9yY3ZjdHJscGlwZShzZXJpYWwtPmRldiwgMCksCisJCQkgICAgR0VUX0xJTkVfUkVRVUVTVCwgR0VUX0xJTkVfUkVRVUVTVF9UWVBFLAorCQkJICAgIDAsIDAsIGJ1ZiwgNywgMTAwKTsKKwlkYmcoIjB4YTE6MHgyMTowOjAgICVkIC0gJXggJXggJXggJXggJXggJXggJXgiLCBpLAorCSAgICBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sIGJ1Zls0XSwgYnVmWzVdLCBidWZbNl0pOwogCiAJaWYgKGNmbGFnICYgQ1NJWkUpIHsKIAkJc3dpdGNoIChjZmxhZyAmIENTSVpFKSB7CkBAIC00MjksNyArNTM0LDggQEAKIAkJY2FzZSBCMjMwNDAwOgliYXVkID0gMjMwNDAwOwlicmVhazsKIAkJY2FzZSBCNDYwODAwOgliYXVkID0gNDYwODAwOwlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWRldl9lcnIoJnBvcnQtPmRldiwgInBsMjMwMyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYmF1ZHJhdGUgcmVxdWVzdGVkIChmaXggaXQpXG4iKTsKKwkJCWRldl9lcnIoJnBvcnQtPmRldiwgInBsMjMwMyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCIKKwkJCQkiIHRoZSBiYXVkcmF0ZSByZXF1ZXN0ZWQgKGZpeCBpdClcbiIpOwogCQkJYnJlYWs7CiAJfQogCWRiZygiJXMgLSBiYXVkID0gJWQiLCBfX0ZVTkNUSU9OX18sIGJhdWQpOwpAQCAtNDY5LDEwICs1NzUsMTAgQEAKIAkJZGJnKCIlcyAtIHBhcml0eSA9IG5vbmUiLCBfX0ZVTkNUSU9OX18pOwogCX0KIAotCWkgPSB1c2JfY29udHJvbF9tc2cgKHNlcmlhbC0+ZGV2LCB1c2Jfc25kY3RybHBpcGUgKHNlcmlhbC0+ZGV2LCAwKSwKLQkJCSAgICAgU0VUX0xJTkVfUkVRVUVTVCwgU0VUX0xJTkVfUkVRVUVTVF9UWVBFLCAKLQkJCSAgICAgMCwgMCwgYnVmLCA3LCAxMDApOwotCWRiZyAoIjB4MjE6MHgyMDowOjAgICVkIiwgaSk7CisJaSA9IHVzYl9jb250cm9sX21zZyhzZXJpYWwtPmRldiwgdXNiX3NuZGN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwKKwkJCSAgICBTRVRfTElORV9SRVFVRVNULCBTRVRfTElORV9SRVFVRVNUX1RZUEUsCisJCQkgICAgMCwgMCwgYnVmLCA3LCAxMDApOworCWRiZygiMHgyMToweDIwOjA6MCAgJWQiLCBpKTsKIAogCS8qIGNoYW5nZSBjb250cm9sIGxpbmVzIGlmIHdlIGFyZSBzd2l0Y2hpbmcgdG8gb3IgZnJvbSBCMCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CkBAIC00ODgsMTMgKzU5NCwxMyBAQAogCX0gZWxzZSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAl9Ci0JCisKIAlidWZbMF0gPSBidWZbMV0gPSBidWZbMl0gPSBidWZbM10gPSBidWZbNF0gPSBidWZbNV0gPSBidWZbNl0gPSAwOwogCi0JaSA9IHVzYl9jb250cm9sX21zZyAoc2VyaWFsLT5kZXYsIHVzYl9yY3ZjdHJscGlwZSAoc2VyaWFsLT5kZXYsIDApLAotCQkJICAgICBHRVRfTElORV9SRVFVRVNULCBHRVRfTElORV9SRVFVRVNUX1RZUEUsCi0JCQkgICAgIDAsIDAsIGJ1ZiwgNywgMTAwKTsKLQlkYmcgKCIweGExOjB4MjE6MDowICAlZCAtICV4ICV4ICV4ICV4ICV4ICV4ICV4IiwgaSwKKwlpID0gdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LCB1c2JfcmN2Y3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLAorCQkJICAgIEdFVF9MSU5FX1JFUVVFU1QsIEdFVF9MSU5FX1JFUVVFU1RfVFlQRSwKKwkJCSAgICAwLCAwLCBidWYsIDcsIDEwMCk7CisJZGJnKCIweGExOjB4MjE6MDowICAlZCAtICV4ICV4ICV4ICV4ICV4ICV4ICV4IiwgaSwKIAkgICAgIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSwgYnVmWzRdLCBidWZbNV0sIGJ1Zls2XSk7CiAKIAlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CkBAIC01MDMsMTggKzYwOSw4MiBAQAogCQkJaW5kZXggPSAweDYxOwogCQllbHNlCiAJCQlpbmRleCA9IDB4NDE7Ci0JCWkgPSB1c2JfY29udHJvbF9tc2coc2VyaWFsLT5kZXYsIAorCQlpID0gdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LAogCQkJCSAgICB1c2Jfc25kY3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLAogCQkJCSAgICBWRU5ET1JfV1JJVEVfUkVRVUVTVCwKIAkJCQkgICAgVkVORE9SX1dSSVRFX1JFUVVFU1RfVFlQRSwKIAkJCQkgICAgMHgwLCBpbmRleCwgTlVMTCwgMCwgMTAwKTsKLQkJZGJnICgiMHg0MDoweDE6MHgwOjB4JXggICVkIiwgaW5kZXgsIGkpOworCQlkYmcoIjB4NDA6MHgxOjB4MDoweCV4ICAlZCIsIGluZGV4LCBpKTsKIAl9CiAKLQlrZnJlZSAoYnVmKTsKKwlrZnJlZShidWYpOwogfQogCi1zdGF0aWMgaW50IHBsMjMwM19vcGVuIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyB2b2lkIHBsMjMwM19jbG9zZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgcGwyMzAzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgY19jZmxhZzsKKwlpbnQgYnBzOworCWxvbmcgdGltZW91dDsKKwl3YWl0X3F1ZXVlX3Qgd2FpdDsKKworCWRiZygiJXMgLSBwb3J0ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0LT5udW1iZXIpOworCisJLyogd2FpdCBmb3IgZGF0YSB0byBkcmFpbiBmcm9tIHRoZSBidWZmZXIgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXRpbWVvdXQgPSBQTDIzMDNfQ0xPU0lOR19XQUlUOworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKKwlhZGRfd2FpdF9xdWV1ZSgmcG9ydC0+dHR5LT53cml0ZV93YWl0LCAmd2FpdCk7CisJZm9yICg7OykgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlpZiAocGwyMzAzX2J1Zl9kYXRhX2F2YWlsKHByaXYtPmJ1ZikgPT0gMCB8fAorCQkgICAgdGltZW91dCA9PSAwIHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpIHx8CisJCSAgICAhdXNiX2dldF9pbnRmZGF0YShwb3J0LT5zZXJpYWwtPmludGVyZmFjZSkpCS8qIGRpc2Nvbm5lY3QgKi8KKwkJCWJyZWFrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZwb3J0LT50dHktPndyaXRlX3dhaXQsICZ3YWl0KTsKKwkvKiBjbGVhciBvdXQgYW55IHJlbWFpbmluZyBkYXRhIGluIHRoZSBidWZmZXIgKi8KKwlwbDIzMDNfYnVmX2NsZWFyKHByaXYtPmJ1Zik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCisJLyogd2FpdCBmb3IgY2hhcmFjdGVycyB0byBkcmFpbiBmcm9tIHRoZSBkZXZpY2UgKi8KKwkvKiAodGhpcyBpcyBsb25nIGVub3VnaCBmb3IgdGhlIGVudGlyZSAyNTYgYnl0ZSAqLworCS8qIHBsMjMwMyBoYXJkd2FyZSBidWZmZXIgdG8gZHJhaW4gd2l0aCBubyBmbG93ICovCisJLyogY29udHJvbCBmb3IgZGF0YSByYXRlcyBvZiAxMjAwIGJwcyBvciBtb3JlLCAqLworCS8qIGZvciBsb3dlciByYXRlcyB3ZSBzaG91bGQgcmVhbGx5IGtub3cgaG93IG11Y2ggKi8KKwkvKiBkYXRhIGlzIGluIHRoZSBidWZmZXIgdG8gY29tcHV0ZSBhIGRlbGF5ICovCisJLyogdGhhdCBpcyBub3QgdW5uZWNlc3NhcmlseSBsb25nKSAqLworCWJwcyA9IHR0eV9nZXRfYmF1ZF9yYXRlKHBvcnQtPnR0eSk7CisJaWYgKGJwcyA+IDEyMDApCisJCXRpbWVvdXQgPSBtYXgoKEhaKjI1NjApL2JwcyxIWi8xMCk7CisJZWxzZQorCQl0aW1lb3V0ID0gMipIWjsKKwlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUodGltZW91dCk7CisKKwkvKiBzaHV0ZG93biBvdXIgdXJicyAqLworCWRiZygiJXMgLSBzaHV0dGluZyBkb3duIHVyYnMiLCBfX0ZVTkNUSU9OX18pOworCXVzYl9raWxsX3VyYihwb3J0LT53cml0ZV91cmIpOworCXVzYl9raWxsX3VyYihwb3J0LT5yZWFkX3VyYik7CisJdXNiX2tpbGxfdXJiKHBvcnQtPmludGVycnVwdF9pbl91cmIpOworCisJaWYgKHBvcnQtPnR0eSkgeworCQljX2NmbGFnID0gcG9ydC0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCQlpZiAoY19jZmxhZyAmIEhVUENMKSB7CisJCQkvKiBkcm9wIERUUiBhbmQgUlRTICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOworCQkJcHJpdi0+bGluZV9jb250cm9sID0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwkJCXNldF9jb250cm9sX2xpbmVzKHBvcnQtPnNlcmlhbC0+ZGV2LCAwKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBwbDIzMDNfb3BlbihzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlscCkKIHsKIAlzdHJ1Y3QgdGVybWlvcyB0bXBfdGVybWlvczsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwpAQCAtNTY4LDk4ICs3MzgsMzUgQEAKIAogCS8qIFNldHVwIHRlcm1pb3MgKi8KIAlpZiAocG9ydC0+dHR5KSB7Ci0JCXBsMjMwM19zZXRfdGVybWlvcyAocG9ydCwgJnRtcF90ZXJtaW9zKTsKKwkJcGwyMzAzX3NldF90ZXJtaW9zKHBvcnQsICZ0bXBfdGVybWlvcyk7CiAJfQogCiAJLy9GSVhNRTogbmVlZCB0byBhc3NlcnQgUlRTIGFuZCBEVFIgaWYgQ1JUU0NUUyBvZmYKIAogCWRiZygiJXMgLSBzdWJtaXR0aW5nIHJlYWQgdXJiIiwgX19GVU5DVElPTl9fKTsKIAlwb3J0LT5yZWFkX3VyYi0+ZGV2ID0gc2VyaWFsLT5kZXY7Ci0JcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIgKHBvcnQtPnJlYWRfdXJiLCBHRlBfS0VSTkVMKTsKKwlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYihwb3J0LT5yZWFkX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlc3VsdCkgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCBlcnJvciAlZFxuIiwgX19GVU5DVElPTl9fLCByZXN1bHQpOwotCQlwbDIzMDNfY2xvc2UgKHBvcnQsIE5VTEwpOworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIHJlYWQgdXJiLCIKKwkJCSIgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJcGwyMzAzX2Nsb3NlKHBvcnQsIE5VTEwpOwogCQlyZXR1cm4gLUVQUk9UTzsKIAl9CiAKIAlkYmcoIiVzIC0gc3VibWl0dGluZyBpbnRlcnJ1cHQgdXJiIiwgX19GVU5DVElPTl9fKTsKIAlwb3J0LT5pbnRlcnJ1cHRfaW5fdXJiLT5kZXYgPSBzZXJpYWwtPmRldjsKLQlyZXN1bHQgPSB1c2Jfc3VibWl0X3VyYiAocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CisJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJlc3VsdCkgewotCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyAtIGZhaWxlZCBzdWJtaXR0aW5nIGludGVycnVwdCB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7Ci0JCXBsMjMwM19jbG9zZSAocG9ydCwgTlVMTCk7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIC0gZmFpbGVkIHN1Ym1pdHRpbmcgaW50ZXJydXB0IHVyYiwiCisJCQkiIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCXBsMjMwM19jbG9zZShwb3J0LCBOVUxMKTsKIAkJcmV0dXJuIC1FUFJPVE87CiAJfQogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyB2b2lkIHBsMjMwM19jbG9zZSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbHApCi17Ci0Jc3RydWN0IHBsMjMwM19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGNfY2ZsYWc7Ci0JaW50IGJwczsKLQlsb25nIHRpbWVvdXQ7Ci0Jd2FpdF9xdWV1ZV90IHdhaXQ7Ci0KLQlkYmcoIiVzIC0gcG9ydCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyKTsKLQotCS8qIHdhaXQgZm9yIGRhdGEgdG8gZHJhaW4gZnJvbSB0aGUgYnVmZmVyICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQl0aW1lb3V0ID0gUEwyMzAzX0NMT1NJTkdfV0FJVDsKLQlpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7Ci0JYWRkX3dhaXRfcXVldWUoJnBvcnQtPnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOwotCWZvciAoOzspIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKHBsMjMwM19idWZfZGF0YV9hdmFpbChwcml2LT5idWYpID09IDAKLQkJfHwgdGltZW91dCA9PSAwIHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpCi0JCXx8ICF1c2JfZ2V0X2ludGZkYXRhKHBvcnQtPnNlcmlhbC0+aW50ZXJmYWNlKSkJLyogZGlzY29ubmVjdCAqLwotCQkJYnJlYWs7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JfQotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnBvcnQtPnR0eS0+d3JpdGVfd2FpdCwgJndhaXQpOwotCS8qIGNsZWFyIG91dCBhbnkgcmVtYWluaW5nIGRhdGEgaW4gdGhlIGJ1ZmZlciAqLwotCXBsMjMwM19idWZfY2xlYXIocHJpdi0+YnVmKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiB3YWl0IGZvciBjaGFyYWN0ZXJzIHRvIGRyYWluIGZyb20gdGhlIGRldmljZSAqLwotCS8qICh0aGlzIGlzIGxvbmcgZW5vdWdoIGZvciB0aGUgZW50aXJlIDI1NiBieXRlICovCi0JLyogcGwyMzAzIGhhcmR3YXJlIGJ1ZmZlciB0byBkcmFpbiB3aXRoIG5vIGZsb3cgKi8KLQkvKiBjb250cm9sIGZvciBkYXRhIHJhdGVzIG9mIDEyMDAgYnBzIG9yIG1vcmUsICovCi0JLyogZm9yIGxvd2VyIHJhdGVzIHdlIHNob3VsZCByZWFsbHkga25vdyBob3cgbXVjaCAqLwotCS8qIGRhdGEgaXMgaW4gdGhlIGJ1ZmZlciB0byBjb21wdXRlIGEgZGVsYXkgKi8KLQkvKiB0aGF0IGlzIG5vdCB1bm5lY2Vzc2FyaWx5IGxvbmcpICovCi0JYnBzID0gdHR5X2dldF9iYXVkX3JhdGUocG9ydC0+dHR5KTsKLQlpZiAoYnBzID4gMTIwMCkKLQkJdGltZW91dCA9IG1heCgoSFoqMjU2MCkvYnBzLEhaLzEwKTsKLQllbHNlCi0JCXRpbWVvdXQgPSAyKkhaOwotCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSh0aW1lb3V0KTsKLQotCS8qIHNodXRkb3duIG91ciB1cmJzICovCi0JZGJnKCIlcyAtIHNodXR0aW5nIGRvd24gdXJicyIsIF9fRlVOQ1RJT05fXyk7Ci0JdXNiX2tpbGxfdXJiKHBvcnQtPndyaXRlX3VyYik7Ci0JdXNiX2tpbGxfdXJiKHBvcnQtPnJlYWRfdXJiKTsKLQl1c2Jfa2lsbF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYik7Ci0KLQlpZiAocG9ydC0+dHR5KSB7Ci0JCWNfY2ZsYWcgPSBwb3J0LT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7Ci0JCWlmIChjX2NmbGFnICYgSFVQQ0wpIHsKLQkJCS8qIGRyb3AgRFRSIGFuZCBSVFMgKi8KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCQlwcml2LT5saW5lX2NvbnRyb2wgPSAwOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCXNldF9jb250cm9sX2xpbmVzIChwb3J0LT5zZXJpYWwtPmRldiwgMCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgcGwyMzAzX3Rpb2Ntc2V0IChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCitzdGF0aWMgaW50IHBsMjMwM190aW9jbXNldChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKIHsKIAlzdHJ1Y3QgcGwyMzAzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTY2OCw3ICs3NzUsNyBAQAogCWlmICghdXNiX2dldF9pbnRmZGF0YShwb3J0LT5zZXJpYWwtPmludGVyZmFjZSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUgKCZwcml2LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAlpZiAoc2V0ICYgVElPQ01fUlRTKQogCQlwcml2LT5saW5lX2NvbnRyb2wgfD0gQ09OVFJPTF9SVFM7CiAJaWYgKHNldCAmIFRJT0NNX0RUUikKQEAgLTY3OCwxMiArNzg1LDEyIEBACiAJaWYgKGNsZWFyICYgVElPQ01fRFRSKQogCQlwcml2LT5saW5lX2NvbnRyb2wgJj0gfkNPTlRST0xfRFRSOwogCWNvbnRyb2wgPSBwcml2LT5saW5lX2NvbnRyb2w7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKLQlyZXR1cm4gc2V0X2NvbnRyb2xfbGluZXMgKHBvcnQtPnNlcmlhbC0+ZGV2LCBjb250cm9sKTsKKwlyZXR1cm4gc2V0X2NvbnRyb2xfbGluZXMocG9ydC0+c2VyaWFsLT5kZXYsIGNvbnRyb2wpOwogfQogCi1zdGF0aWMgaW50IHBsMjMwM190aW9jbWdldCAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgaW50IHBsMjMwM190aW9jbWdldChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3QgcGwyMzAzX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTY5NiwxMCArODAzLDEwIEBACiAJaWYgKCF1c2JfZ2V0X2ludGZkYXRhKHBvcnQtPnNlcmlhbC0+aW50ZXJmYWNlKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSAoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCW1jciA9IHByaXYtPmxpbmVfY29udHJvbDsKIAlzdGF0dXMgPSBwcml2LT5saW5lX3N0YXR1czsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAogCXJlc3VsdCA9ICgobWNyICYgQ09OVFJPTF9EVFIpCQk/IFRJT0NNX0RUUiA6IDApCiAJCSAgfCAoKG1jciAmIENPTlRST0xfUlRTKQk/IFRJT0NNX1JUUyA6IDApCkBAIC03MjEsMjIgKzgyOCwyMiBAQAogCXVuc2lnbmVkIGludCBzdGF0dXM7CiAJdW5zaWduZWQgaW50IGNoYW5nZWQ7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSAoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCXByZXZzdGF0dXMgPSBwcml2LT5saW5lX3N0YXR1czsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmcHJpdi0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAogCXdoaWxlICgxKSB7CiAJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnByaXYtPmRlbHRhX21zcl93YWl0KTsKIAkJLyogc2VlIGlmIGEgc2lnbmFsIGRpZCBpdCAqLwogCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCQkKLQkJc3Bpbl9sb2NrX2lycXNhdmUgKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIAkJc3RhdHVzID0gcHJpdi0+bGluZV9zdGF0dXM7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKIAkJY2hhbmdlZD1wcmV2c3RhdHVzXnN0YXR1czsKLQkJCisKIAkJaWYgKCgoYXJnICYgVElPQ01fUk5HKSAmJiAoY2hhbmdlZCAmIFVBUlRfUklORykpIHx8CiAJCSAgICAoKGFyZyAmIFRJT0NNX0RTUikgJiYgKGNoYW5nZWQgJiBVQVJUX0RTUikpIHx8CiAJCSAgICAoKGFyZyAmIFRJT0NNX0NEKSAgJiYgKGNoYW5nZWQgJiBVQVJUX0RDRCkpIHx8CkBAIC03NDksNyArODU2LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwbDIzMDNfaW9jdGwgKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgcGwyMzAzX2lvY3RsKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJZGJnKCIlcyAoJWQpIGNtZCA9IDB4JTA0eCIsIF9fRlVOQ1RJT05fXywgcG9ydC0+bnVtYmVyLCBjbWQpOwogCkBAIC03NjYsNyArODc0LDcgQEAKIAlyZXR1cm4gLUVOT0lPQ1RMQ01EOwogfQogCi1zdGF0aWMgdm9pZCBwbDIzMDNfYnJlYWtfY3RsIChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBpbnQgYnJlYWtfc3RhdGUpCitzdGF0aWMgdm9pZCBwbDIzMDNfYnJlYWtfY3RsKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gcG9ydC0+c2VyaWFsOwogCXUxNiBzdGF0ZTsKQEAgLTc4MCwxNSArODg4LDE0IEBACiAJCXN0YXRlID0gQlJFQUtfT047CiAJZGJnKCIlcyAtIHR1cm5pbmcgYnJlYWsgJXMiLCBfX0ZVTkNUSU9OX18sIHN0YXRlPT1CUkVBS19PRkYgPyAib2ZmIiA6ICJvbiIpOwogCi0JcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnIChzZXJpYWwtPmRldiwgdXNiX3NuZGN0cmxwaXBlIChzZXJpYWwtPmRldiwgMCksCi0JCQkJICBCUkVBS19SRVFVRVNULCBCUkVBS19SRVFVRVNUX1RZUEUsIHN0YXRlLCAKLQkJCQkgIDAsIE5VTEwsIDAsIDEwMCk7CisJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKHNlcmlhbC0+ZGV2LCB1c2Jfc25kY3RybHBpcGUoc2VyaWFsLT5kZXYsIDApLAorCQkJCSBCUkVBS19SRVFVRVNULCBCUkVBS19SRVFVRVNUX1RZUEUsIHN0YXRlLAorCQkJCSAwLCBOVUxMLCAwLCAxMDApOwogCWlmIChyZXN1bHQpCiAJCWRiZygiJXMgLSBlcnJvciBzZW5kaW5nIGJyZWFrID0gJWQiLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CiB9CiAKLQotc3RhdGljIHZvaWQgcGwyMzAzX3NodXRkb3duIChzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsKQorc3RhdGljIHZvaWQgcGwyMzAzX3NodXRkb3duKHN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwpCiB7CiAJaW50IGk7CiAJc3RydWN0IHBsMjMwM19wcml2YXRlICpwcml2OwpAQCAtODAyLDcgKzkwOSw3IEBACiAJCQlrZnJlZShwcml2KTsKIAkJCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShzZXJpYWwtPnBvcnRbaV0sIE5VTEwpOwogCQl9Ci0JfQkJCisJfQogfQogCiBzdGF0aWMgdm9pZCBwbDIzMDNfdXBkYXRlX2xpbmVfc3RhdHVzKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCkBAIC04MTQsMjkgKzkyMSwzMyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTggc3RhdHVzX2lkeCA9IFVBUlRfU1RBVEU7CiAJdTggbGVuZ3RoID0gVUFSVF9TVEFURSArIDE7CisJdTE2IGlkdiwgaWRwOwogCi0JaWYgKChsZTE2X3RvX2NwdShwb3J0LT5zZXJpYWwtPmRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgPT0gU0lFTUVOU19WRU5ET1JfSUQpICYmCi0JICAgIChsZTE2X3RvX2NwdShwb3J0LT5zZXJpYWwtPmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IFNJRU1FTlNfUFJPRFVDVF9JRF9YNjUgfHwKLQkgICAgIGxlMTZfdG9fY3B1KHBvcnQtPnNlcmlhbC0+ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gU0lFTUVOU19QUk9EVUNUX0lEX1NYMSB8fAotCSAgICAgbGUxNl90b19jcHUocG9ydC0+c2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBTSUVNRU5TX1BST0RVQ1RfSURfWDc1KSkgewotCQlsZW5ndGggPSAxOwotCQlzdGF0dXNfaWR4ID0gMDsKKwlpZHYgPSBsZTE2X3RvX2NwdShwb3J0LT5zZXJpYWwtPmRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CisJaWRwID0gbGUxNl90b19jcHUocG9ydC0+c2VyaWFsLT5kZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKworCisJaWYgKGlkdiA9PSBTSUVNRU5TX1ZFTkRPUl9JRCkgeworCQlpZiAoaWRwID09IFNJRU1FTlNfUFJPRFVDVF9JRF9YNjUgfHwKKwkJICAgIGlkcCA9PSBTSUVNRU5TX1BST0RVQ1RfSURfU1gxIHx8CisJCSAgICBpZHAgPT0gU0lFTUVOU19QUk9EVUNUX0lEX1g3NSkgeworCisJCQlsZW5ndGggPSAxOworCQkJc3RhdHVzX2lkeCA9IDA7CisJCX0KIAl9CiAKIAlpZiAoYWN0dWFsX2xlbmd0aCA8IGxlbmd0aCkKLQkJZ290byBleGl0OworCQlyZXR1cm47CiAKICAgICAgICAgLyogU2F2ZSBvZmYgdGhlIHVhcnQgc3RhdHVzIGZvciBvdGhlcnMgdG8gbG9vayBhdCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAJcHJpdi0+bGluZV9zdGF0dXMgPSBkYXRhW3N0YXR1c19pZHhdOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUgKCZwcml2LT5kZWx0YV9tc3Jfd2FpdCk7Ci0KLWV4aXQ6Ci0JcmV0dXJuOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+ZGVsdGFfbXNyX3dhaXQpOwogfQogCi1zdGF0aWMgdm9pZCBwbDIzMDNfcmVhZF9pbnRfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBwbDIzMDNfcmVhZF9pbnRfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKQEAgLTg1MywyNSArOTY0LDI5IEBACiAJY2FzZSAtRU5PRU5UOgogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KLQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLAorCQkgICAgdXJiLT5zdGF0dXMpOwogCQlyZXR1cm47CiAJZGVmYXVsdDoKLQkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sIHVyYi0+c3RhdHVzKTsKKwkJZGJnKCIlcyAtIG5vbnplcm8gdXJiIHN0YXR1cyByZWNlaXZlZDogJWQiLCBfX0ZVTkNUSU9OX18sCisJCSAgICB1cmItPnN0YXR1cyk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQl1c2Jfc2VyaWFsX2RlYnVnX2RhdGEoZGVidWcsICZwb3J0LT5kZXYsIF9fRlVOQ1RJT05fXywgdXJiLT5hY3R1YWxfbGVuZ3RoLCB1cmItPnRyYW5zZmVyX2J1ZmZlcik7CisJdXNiX3NlcmlhbF9kZWJ1Z19kYXRhKGRlYnVnLCAmcG9ydC0+ZGV2LCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICB1cmItPmFjdHVhbF9sZW5ndGgsIHVyYi0+dHJhbnNmZXJfYnVmZmVyKTsKKwogCXBsMjMwM191cGRhdGVfbGluZV9zdGF0dXMocG9ydCwgZGF0YSwgYWN0dWFsX2xlbmd0aCk7CiAKIGV4aXQ6Ci0Jc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIgKHVyYiwgR0ZQX0FUT01JQyk7CisJc3RhdHVzID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoc3RhdHVzKQotCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWRcbiIsCisJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgd2l0aCByZXN1bHQgJWRcbiIsCiAJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CiB9CiAKLQotc3RhdGljIHZvaWQgcGwyMzAzX3JlYWRfYnVsa19jYWxsYmFjayAoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3N0YXRpYyB2b2lkIHBsMjMwM19yZWFkX2J1bGtfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKikgdXJiLT5jb250ZXh0OwogCXN0cnVjdCBwbDIzMDNfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKQEAgLTg5MiwyMCArMTAwNywyNSBAQAogCQkJcmV0dXJuOwogCQl9CiAJCWlmICh1cmItPnN0YXR1cyA9PSAtRVBST1RPKSB7Ci0JCQkvKiBQTDIzMDMgbXlzdGVyaW91c2x5IGZhaWxzIHdpdGggLUVQUk9UTyByZXNjaGVkdWxlIHRoZSByZWFkICovCi0JCQlkYmcoIiVzIC0gY2F1Z2h0IC1FUFJPVE8sIHJlc3VibWl0dGluZyB0aGUgdXJiIiwgX19GVU5DVElPTl9fKTsKKwkJCS8qIFBMMjMwMyBteXN0ZXJpb3VzbHkgZmFpbHMgd2l0aCAtRVBST1RPIHJlc2NoZWR1bGUKKwkJCSAqIHRoZSByZWFkICovCisJCQlkYmcoIiVzIC0gY2F1Z2h0IC1FUFJPVE8sIHJlc3VibWl0dGluZyB0aGUgdXJiIiwKKwkJCSAgICBfX0ZVTkNUSU9OX18pOwogCQkJdXJiLT5zdGF0dXMgPSAwOwogCQkJdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAkJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJCQlpZiAocmVzdWx0KQotCQkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzIC0gZmFpbGVkIgorCQkJCQkiIHJlc3VibWl0dGluZyByZWFkIHVyYiwgZXJyb3IgJWRcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgcmVzdWx0KTsKIAkJCXJldHVybjsKIAkJfQogCQlkYmcoIiVzIC0gdW5hYmxlIHRvIGhhbmRsZSB0aGUgZXJyb3IsIGV4aXRpbmcuIiwgX19GVU5DVElPTl9fKTsKIAkJcmV0dXJuOwogCX0KIAotCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLCB1cmItPmFjdHVhbF9sZW5ndGgsIGRhdGEpOworCXVzYl9zZXJpYWxfZGVidWdfZGF0YShkZWJ1ZywgJnBvcnQtPmRldiwgX19GVU5DVElPTl9fLAorCQkJICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoLCBkYXRhKTsKIAogCS8qIGdldCB0dHlfZmxhZyBmcm9tIHN0YXR1cyAqLwogCXR0eV9mbGFnID0gVFRZX05PUk1BTDsKQEAgLTkxNCw3ICsxMDM0LDcgQEAKIAlzdGF0dXMgPSBwcml2LT5saW5lX3N0YXR1czsKIAlwcml2LT5saW5lX3N0YXR1cyAmPSB+VUFSVF9TVEFURV9UUkFOU0lFTlRfTUFTSzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlICgmcHJpdi0+ZGVsdGFfbXNyX3dhaXQpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcHJpdi0+ZGVsdGFfbXNyX3dhaXQpOwogCiAJLyogYnJlYWsgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHBhcml0eSwgKi8KIAkvKiB3aGljaCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZnJhbWluZyBlcnJvcnMgKi8KQEAgLTkzMyw4ICsxMDUzLDggQEAKIAkJaWYgKHN0YXR1cyAmIFVBUlRfT1ZFUlJVTl9FUlJPUikKIAkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOwogCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5hY3R1YWxfbGVuZ3RoOyArK2kpCi0JCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhciAodHR5LCBkYXRhW2ldLCB0dHlfZmxhZyk7Ci0JCXR0eV9mbGlwX2J1ZmZlcl9wdXNoICh0dHkpOworCQkJdHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCBkYXRhW2ldLCB0dHlfZmxhZyk7CisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAJfQogCiAJLyogU2NoZWR1bGUgdGhlIG5leHQgcmVhZCBfaWZfIHdlIGFyZSBzdGlsbCBvcGVuICovCkBAIC05NDIsMTUgKzEwNjIsMTQgQEAKIAkJdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKIAkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJlc3VsdCkKLQkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CisJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIgorCQkJCSIgcmVhZCB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CiAJfQogCiAJcmV0dXJuOwogfQogCi0KLQotc3RhdGljIHZvaWQgcGwyMzAzX3dyaXRlX2J1bGtfY2FsbGJhY2sgKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBwbDIzMDNfd3JpdGVfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSAoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqKSB1cmItPmNvbnRleHQ7CiAJc3RydWN0IHBsMjMwM19wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOwpAQCAtOTY2LDE4ICsxMDg1LDIxIEBACiAJY2FzZSAtRU5PRU5UOgogCWNhc2UgLUVTSFVURE9XTjoKIAkJLyogdGhpcyB1cmIgaXMgdGVybWluYXRlZCwgY2xlYW4gdXAgKi8KLQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3RhdHVzOiAlZCIsIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOworCQlkYmcoIiVzIC0gdXJiIHNodXR0aW5nIGRvd24gd2l0aCBzdGF0dXM6ICVkIiwgX19GVU5DVElPTl9fLAorCQkgICAgdXJiLT5zdGF0dXMpOwogCQlwcml2LT53cml0ZV91cmJfaW5fdXNlID0gMDsKIAkJcmV0dXJuOwogCWRlZmF1bHQ6CiAJCS8qIGVycm9yIGluIHRoZSB1cmIsIHNvIHdlIGhhdmUgdG8gcmVzdWJtaXQgaXQgKi8KIAkJZGJnKCIlcyAtIE92ZXJmbG93IGluIHdyaXRlIiwgX19GVU5DVElPTl9fKTsKLQkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19GVU5DVElPTl9fLCB1cmItPnN0YXR1cyk7CisJCWRiZygiJXMgLSBub256ZXJvIHdyaXRlIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAlZCIsIF9fRlVOQ1RJT05fXywKKwkJICAgIHVyYi0+c3RhdHVzKTsKIAkJcG9ydC0+d3JpdGVfdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gMTsKIAkJcG9ydC0+d3JpdGVfdXJiLT5kZXYgPSBwb3J0LT5zZXJpYWwtPmRldjsKLQkJcmVzdWx0ID0gdXNiX3N1Ym1pdF91cmIgKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CisJCXJlc3VsdCA9IHVzYl9zdWJtaXRfdXJiKHBvcnQtPndyaXRlX3VyYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChyZXN1bHQpCi0JCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LCAiJXMgLSBmYWlsZWQgcmVzdWJtaXR0aW5nIHdyaXRlIHVyYiwgZXJyb3IgJWRcbiIsIF9fRlVOQ1RJT05fXywgcmVzdWx0KTsKKwkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICIlcyAtIGZhaWxlZCByZXN1Ym1pdHRpbmcgd3JpdGUiCisJCQkJIiB1cmIsIGVycm9yICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJlc3VsdCk7CiAJCWVsc2UKIAkJCXJldHVybjsKIAl9CkBAIC05ODgsMTkxICsxMTEwLDM4IEBACiAJcGwyMzAzX3NlbmQocG9ydCk7CiB9CiAKKy8qIEFsbCBvZiB0aGUgZGV2aWNlIGluZm8gbmVlZGVkIGZvciB0aGUgUEwyMzAzIFNJTyBzZXJpYWwgY29udmVydGVyICovCitzdGF0aWMgc3RydWN0IHVzYl9zZXJpYWxfZHJpdmVyIHBsMjMwM19kZXZpY2UgPSB7CisJLmRyaXZlciA9IHsKKwkJLm93bmVyID0JVEhJU19NT0RVTEUsCisJCS5uYW1lID0JCSJwbDIzMDMiLAorCX0sCisJLmlkX3RhYmxlID0JCWlkX3RhYmxlLAorCS5udW1faW50ZXJydXB0X2luID0JTlVNX0RPTlRfQ0FSRSwKKwkubnVtX2J1bGtfaW4gPQkJMSwKKwkubnVtX2J1bGtfb3V0ID0JCTEsCisJLm51bV9wb3J0cyA9CQkxLAorCS5vcGVuID0JCQlwbDIzMDNfb3BlbiwKKwkuY2xvc2UgPQkJcGwyMzAzX2Nsb3NlLAorCS53cml0ZSA9CQlwbDIzMDNfd3JpdGUsCisJLmlvY3RsID0JCXBsMjMwM19pb2N0bCwKKwkuYnJlYWtfY3RsID0JCXBsMjMwM19icmVha19jdGwsCisJLnNldF90ZXJtaW9zID0JCXBsMjMwM19zZXRfdGVybWlvcywKKwkudGlvY21nZXQgPQkJcGwyMzAzX3Rpb2NtZ2V0LAorCS50aW9jbXNldCA9CQlwbDIzMDNfdGlvY21zZXQsCisJLnJlYWRfYnVsa19jYWxsYmFjayA9CXBsMjMwM19yZWFkX2J1bGtfY2FsbGJhY2ssCisJLnJlYWRfaW50X2NhbGxiYWNrID0JcGwyMzAzX3JlYWRfaW50X2NhbGxiYWNrLAorCS53cml0ZV9idWxrX2NhbGxiYWNrID0JcGwyMzAzX3dyaXRlX2J1bGtfY2FsbGJhY2ssCisJLndyaXRlX3Jvb20gPQkJcGwyMzAzX3dyaXRlX3Jvb20sCisJLmNoYXJzX2luX2J1ZmZlciA9CXBsMjMwM19jaGFyc19pbl9idWZmZXIsCisJLmF0dGFjaCA9CQlwbDIzMDNfc3RhcnR1cCwKKwkuc2h1dGRvd24gPQkJcGwyMzAzX3NodXRkb3duLAorfTsKIAotLyoKLSAqIHBsMjMwM19idWZfYWxsb2MKLSAqCi0gKiBBbGxvY2F0ZSBhIGNpcmN1bGFyIGJ1ZmZlciBhbmQgYWxsIGFzc29jaWF0ZWQgbWVtb3J5LgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgcGwyMzAzX2J1ZiAqcGwyMzAzX2J1Zl9hbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLQotCXN0cnVjdCBwbDIzMDNfYnVmICpwYjsKLQotCi0JaWYgKHNpemUgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlwYiA9IChzdHJ1Y3QgcGwyMzAzX2J1ZiAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwbDIzMDNfYnVmKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBiID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JcGItPmJ1Zl9idWYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwotCWlmIChwYi0+YnVmX2J1ZiA9PSBOVUxMKSB7Ci0JCWtmcmVlKHBiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcGItPmJ1Zl9zaXplID0gc2l6ZTsKLQlwYi0+YnVmX2dldCA9IHBiLT5idWZfcHV0ID0gcGItPmJ1Zl9idWY7Ci0KLQlyZXR1cm4gcGI7Ci0KLX0KLQotCi0vKgotICogcGwyMzAzX2J1Zl9mcmVlCi0gKgotICogRnJlZSB0aGUgYnVmZmVyIGFuZCBhbGwgYXNzb2NpYXRlZCBtZW1vcnkuCi0gKi8KLQotc3RhdGljIHZvaWQgcGwyMzAzX2J1Zl9mcmVlKHN0cnVjdCBwbDIzMDNfYnVmICpwYikKLXsKLQlpZiAocGIpIHsKLQkJa2ZyZWUocGItPmJ1Zl9idWYpOwotCQlrZnJlZShwYik7Ci0JfQotfQotCi0KLS8qCi0gKiBwbDIzMDNfYnVmX2NsZWFyCi0gKgotICogQ2xlYXIgb3V0IGFsbCBkYXRhIGluIHRoZSBjaXJjdWxhciBidWZmZXIuCi0gKi8KLQotc3RhdGljIHZvaWQgcGwyMzAzX2J1Zl9jbGVhcihzdHJ1Y3QgcGwyMzAzX2J1ZiAqcGIpCi17Ci0JaWYgKHBiICE9IE5VTEwpCi0JCXBiLT5idWZfZ2V0ID0gcGItPmJ1Zl9wdXQ7Ci0JCS8qIGVxdWl2YWxlbnQgdG8gYSBnZXQgb2YgYWxsIGRhdGEgYXZhaWxhYmxlICovCi19Ci0KLQotLyoKLSAqIHBsMjMwM19idWZfZGF0YV9hdmFpbAotICoKLSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBjaXJjdWxhcgotICogYnVmZmVyLgotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcGwyMzAzX2J1Zl9kYXRhX2F2YWlsKHN0cnVjdCBwbDIzMDNfYnVmICpwYikKLXsKLQlpZiAocGIgIT0gTlVMTCkKLQkJcmV0dXJuICgocGItPmJ1Zl9zaXplICsgcGItPmJ1Zl9wdXQgLSBwYi0+YnVmX2dldCkgJSBwYi0+YnVmX3NpemUpOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIHBsMjMwM19idWZfc3BhY2VfYXZhaWwKLSAqCi0gKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZiBzcGFjZSBhdmFpbGFibGUgaW4gdGhlIGNpcmN1bGFyCi0gKiBidWZmZXIuCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGludCBwbDIzMDNfYnVmX3NwYWNlX2F2YWlsKHN0cnVjdCBwbDIzMDNfYnVmICpwYikKLXsKLQlpZiAocGIgIT0gTlVMTCkKLQkJcmV0dXJuICgocGItPmJ1Zl9zaXplICsgcGItPmJ1Zl9nZXQgLSBwYi0+YnVmX3B1dCAtIDEpICUgcGItPmJ1Zl9zaXplKTsKLQllbHNlCi0JCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBwbDIzMDNfYnVmX3B1dAotICoKLSAqIENvcHkgZGF0YSBkYXRhIGZyb20gYSB1c2VyIGJ1ZmZlciBhbmQgcHV0IGl0IGludG8gdGhlIGNpcmN1bGFyIGJ1ZmZlci4KLSAqIFJlc3RyaWN0IHRvIHRoZSBhbW91bnQgb2Ygc3BhY2UgYXZhaWxhYmxlLgotICoKLSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4KLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgaW50IHBsMjMwM19idWZfcHV0KHN0cnVjdCBwbDIzMDNfYnVmICpwYiwgY29uc3QgY2hhciAqYnVmLAotCXVuc2lnbmVkIGludCBjb3VudCkKLXsKLQotCXVuc2lnbmVkIGludCBsZW47Ci0KLQotCWlmIChwYiA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCWxlbiAgPSBwbDIzMDNfYnVmX3NwYWNlX2F2YWlsKHBiKTsKLQlpZiAoY291bnQgPiBsZW4pCi0JCWNvdW50ID0gbGVuOwotCi0JaWYgKGNvdW50ID09IDApCi0JCXJldHVybiAwOwotCi0JbGVuID0gcGItPmJ1Zl9idWYgKyBwYi0+YnVmX3NpemUgLSBwYi0+YnVmX3B1dDsKLQlpZiAoY291bnQgPiBsZW4pIHsKLQkJbWVtY3B5KHBiLT5idWZfcHV0LCBidWYsIGxlbik7Ci0JCW1lbWNweShwYi0+YnVmX2J1ZiwgYnVmK2xlbiwgY291bnQgLSBsZW4pOwotCQlwYi0+YnVmX3B1dCA9IHBiLT5idWZfYnVmICsgY291bnQgLSBsZW47Ci0JfSBlbHNlIHsKLQkJbWVtY3B5KHBiLT5idWZfcHV0LCBidWYsIGNvdW50KTsKLQkJaWYgKGNvdW50IDwgbGVuKQotCQkJcGItPmJ1Zl9wdXQgKz0gY291bnQ7Ci0JCWVsc2UgLyogY291bnQgPT0gbGVuICovCi0JCQlwYi0+YnVmX3B1dCA9IHBiLT5idWZfYnVmOwotCX0KLQotCXJldHVybiBjb3VudDsKLQotfQotCi0KLS8qCi0gKiBwbDIzMDNfYnVmX2dldAotICoKLSAqIEdldCBkYXRhIGZyb20gdGhlIGNpcmN1bGFyIGJ1ZmZlciBhbmQgY29weSB0byB0aGUgZ2l2ZW4gYnVmZmVyLgotICogUmVzdHJpY3QgdG8gdGhlIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZS4KLSAqCi0gKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCi0gKi8KLQotc3RhdGljIHVuc2lnbmVkIGludCBwbDIzMDNfYnVmX2dldChzdHJ1Y3QgcGwyMzAzX2J1ZiAqcGIsIGNoYXIgKmJ1ZiwKLQl1bnNpZ25lZCBpbnQgY291bnQpCi17Ci0KLQl1bnNpZ25lZCBpbnQgbGVuOwotCi0KLQlpZiAocGIgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQlsZW4gPSBwbDIzMDNfYnVmX2RhdGFfYXZhaWwocGIpOwotCWlmIChjb3VudCA+IGxlbikKLQkJY291bnQgPSBsZW47Ci0KLQlpZiAoY291bnQgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlsZW4gPSBwYi0+YnVmX2J1ZiArIHBiLT5idWZfc2l6ZSAtIHBiLT5idWZfZ2V0OwotCWlmIChjb3VudCA+IGxlbikgewotCQltZW1jcHkoYnVmLCBwYi0+YnVmX2dldCwgbGVuKTsKLQkJbWVtY3B5KGJ1ZitsZW4sIHBiLT5idWZfYnVmLCBjb3VudCAtIGxlbik7Ci0JCXBiLT5idWZfZ2V0ID0gcGItPmJ1Zl9idWYgKyBjb3VudCAtIGxlbjsKLQl9IGVsc2UgewotCQltZW1jcHkoYnVmLCBwYi0+YnVmX2dldCwgY291bnQpOwotCQlpZiAoY291bnQgPCBsZW4pCi0JCQlwYi0+YnVmX2dldCArPSBjb3VudDsKLQkJZWxzZSAvKiBjb3VudCA9PSBsZW4gKi8KLQkJCXBiLT5idWZfZ2V0ID0gcGItPmJ1Zl9idWY7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotCi19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBsMjMwM19pbml0ICh2b2lkKQorc3RhdGljIGludCBfX2luaXQgcGwyMzAzX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0dmFsOworCiAJcmV0dmFsID0gdXNiX3NlcmlhbF9yZWdpc3RlcigmcGwyMzAzX2RldmljZSk7CiAJaWYgKHJldHZhbCkKIAkJZ290byBmYWlsZWRfdXNiX3NlcmlhbF9yZWdpc3RlcjsKQEAgLTExODcsMTQgKzExNTYsMTIgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwbDIzMDNfZXhpdCAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBwbDIzMDNfZXhpdCh2b2lkKQogewotCXVzYl9kZXJlZ2lzdGVyICgmcGwyMzAzX2RyaXZlcik7Ci0JdXNiX3NlcmlhbF9kZXJlZ2lzdGVyICgmcGwyMzAzX2RldmljZSk7CisJdXNiX2RlcmVnaXN0ZXIoJnBsMjMwM19kcml2ZXIpOworCXVzYl9zZXJpYWxfZGVyZWdpc3RlcigmcGwyMzAzX2RldmljZSk7CiB9CiAKLQogbW9kdWxlX2luaXQocGwyMzAzX2luaXQpOwogbW9kdWxlX2V4aXQocGwyMzAzX2V4aXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmgKaW5kZXggNTUxOTVlNy4uNzYyY2MyOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9wbDIzMDMuaAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvcGwyMzAzLmgKQEAgLTg5LDMgKzg5LDcgQEAKIC8qIEJlbGtpbiAiRjVVMjU3IiBTZXJpYWwgQWRhcHRlciAqLwogI2RlZmluZSBCRUxLSU5fVkVORE9SX0lECTB4MDUwZAogI2RlZmluZSBCRUxLSU5fUFJPRFVDVF9JRAkweDAyNTcKKworLyogQWxjb3IgTWljcm8gQ29ycC4gVVNCIDIuMCBUTyBSUy0yMzIgKi8KKyNkZWZpbmUgQUxDT1JfVkVORE9SX0lECQkweDA1OEYKKyNkZWZpbmUgQUxDT1JfUFJPRFVDVF9JRAkweDk3MjAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvdXNiLXNlcmlhbC5jCmluZGV4IGUwNmE0MWIuLjAyMjJkOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC91c2Itc2VyaWFsLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL3VzYi1zZXJpYWwuYwpAQCAtNjc2LDMzICs2NzYsMjkgQEAKIAlpZmFjZV9kZXNjID0gaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKIAlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKIAkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKLQkJCi0JCWlmICgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSAmJgotCQkgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMykgPT0gMHgwMikpIHsKKworCQlpZiAodXNiX2VuZHBvaW50X2lzX2J1bGtfaW4oZW5kcG9pbnQpKSB7CiAJCQkvKiB3ZSBmb3VuZCBhIGJ1bGsgaW4gZW5kcG9pbnQgKi8KIAkJCWRiZygiZm91bmQgYnVsayBpbiBvbiBlbmRwb2ludCAlZCIsIGkpOwogCQkJYnVsa19pbl9lbmRwb2ludFtudW1fYnVsa19pbl0gPSBlbmRwb2ludDsKIAkJCSsrbnVtX2J1bGtfaW47CiAJCX0KIAotCQlpZiAoKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApID09IDB4MDApICYmCi0JCSAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAzKSA9PSAweDAyKSkgeworCQlpZiAodXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkgewogCQkJLyogd2UgZm91bmQgYSBidWxrIG91dCBlbmRwb2ludCAqLwogCQkJZGJnKCJmb3VuZCBidWxrIG91dCBvbiBlbmRwb2ludCAlZCIsIGkpOwogCQkJYnVsa19vdXRfZW5kcG9pbnRbbnVtX2J1bGtfb3V0XSA9IGVuZHBvaW50OwogCQkJKytudW1fYnVsa19vdXQ7CiAJCX0KLQkJCi0JCWlmICgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSAmJgotCQkgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgMykgPT0gMHgwMykpIHsKKworCQlpZiAodXNiX2VuZHBvaW50X2lzX2ludF9pbihlbmRwb2ludCkpIHsKIAkJCS8qIHdlIGZvdW5kIGEgaW50ZXJydXB0IGluIGVuZHBvaW50ICovCiAJCQlkYmcoImZvdW5kIGludGVycnVwdCBpbiBvbiBlbmRwb2ludCAlZCIsIGkpOwogCQkJaW50ZXJydXB0X2luX2VuZHBvaW50W251bV9pbnRlcnJ1cHRfaW5dID0gZW5kcG9pbnQ7CiAJCQkrK251bV9pbnRlcnJ1cHRfaW47CiAJCX0KIAotCQlpZiAoKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmIDB4ODApID09IDB4MDApICYmCi0JCSAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAzKSA9PSAweDAzKSkgeworCQlpZiAodXNiX2VuZHBvaW50X2lzX2ludF9vdXQoZW5kcG9pbnQpKSB7CiAJCQkvKiB3ZSBmb3VuZCBhbiBpbnRlcnJ1cHQgb3V0IGVuZHBvaW50ICovCiAJCQlkYmcoImZvdW5kIGludGVycnVwdCBvdXQgb24gZW5kcG9pbnQgJWQiLCBpKTsKIAkJCWludGVycnVwdF9vdXRfZW5kcG9pbnRbbnVtX2ludGVycnVwdF9vdXRdID0gZW5kcG9pbnQ7CkBAIC03MTYsMTQgKzcxMiwxNSBAQAogCWlmICgoKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgPT0gUEwyMzAzX1ZFTkRPUl9JRCkgJiYKIAkgICAgIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBQTDIzMDNfUFJPRFVDVF9JRCkpIHx8CiAJICAgICgobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSA9PSBBVEVOX1ZFTkRPUl9JRCkgJiYKLQkgICAgIChsZTE2X3RvX2NwdShkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSA9PSBBVEVOX1BST0RVQ1RfSUQpKSkgeworCSAgICAgKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpID09IEFURU5fUFJPRFVDVF9JRCkpIHx8CisJICAgICgobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSA9PSBBTENPUl9WRU5ET1JfSUQpICYmCisJICAgICAobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gQUxDT1JfUFJPRFVDVF9JRCkpKSB7CiAJCWlmIChpbnRlcmZhY2UgIT0gZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVswXSkgewogCQkJLyogY2hlY2sgb3V0IHRoZSBlbmRwb2ludHMgb2YgdGhlIG90aGVyIGludGVyZmFjZSovCiAJCQlpZmFjZV9kZXNjID0gZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVswXS0+Y3VyX2FsdHNldHRpbmc7CiAJCQlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKIAkJCQllbmRwb2ludCA9ICZpZmFjZV9kZXNjLT5lbmRwb2ludFtpXS5kZXNjOwotCQkJCWlmICgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiAweDgwKSAmJgotCQkJCSAgICAoKGVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiAzKSA9PSAweDAzKSkgeworCQkJCWlmICh1c2JfZW5kcG9pbnRfaXNfaW50X2luKGVuZHBvaW50KSkgewogCQkJCQkvKiB3ZSBmb3VuZCBhIGludGVycnVwdCBpbiBlbmRwb2ludCAqLwogCQkJCQlkYmcoImZvdW5kIGludGVycnVwdCBpbiBmb3IgUHJvbGlmaWMgZGV2aWNlIG9uIHNlcGFyYXRlIGludGVyZmFjZSIpOwogCQkJCQlpbnRlcnJ1cHRfaW5fZW5kcG9pbnRbbnVtX2ludGVycnVwdF9pbl0gPSBlbmRwb2ludDsKQEAgLTkzNyw3ICs5MzQsMTAgQEAKIAogCQlzbnByaW50ZiAoJnBvcnQtPmRldi5idXNfaWRbMF0sIHNpemVvZihwb3J0LT5kZXYuYnVzX2lkKSwgInR0eVVTQiVkIiwgcG9ydC0+bnVtYmVyKTsKIAkJZGJnICgiJXMgLSByZWdpc3RlcmluZyAlcyIsIF9fRlVOQ1RJT05fXywgcG9ydC0+ZGV2LmJ1c19pZCk7Ci0JCWRldmljZV9yZWdpc3RlciAoJnBvcnQtPmRldik7CisJCXJldHZhbCA9IGRldmljZV9yZWdpc3RlcigmcG9ydC0+ZGV2KTsKKwkJaWYgKHJldHZhbCkKKwkJCWRldl9lcnIoJnBvcnQtPmRldiwgIkVycm9yIHJlZ2lzdGVyaW5nIHBvcnQgZGV2aWNlLCAiCisJCQkJImNvbnRpbnVpbmdcbiIpOwogCX0KIAogCXVzYl9zZXJpYWxfY29uc29sZV9pbml0IChkZWJ1ZywgbWlub3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9LY29uZmlnIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9LY29uZmlnCmluZGV4IGJlOWVlYzIuLjg2ZTQ4YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL0tjb25maWcKQEAgLTEzNSw2ICsxMzUsMTggQEAKIAkgIHRoaXMgaW5wdXQgaW4gYW55IGtleWJpbmRpbmcgc29mdHdhcmUuIChlLmcuIGdub21lJ3Mga2V5Ym9hcmQgc2hvcnQtCiAJICBjdXRzKQogCitjb25maWcgVVNCX1NUT1JBR0VfS0FSTUEKKwlib29sICJTdXBwb3J0IGZvciBSaW8gS2FybWEgbXVzaWMgcGxheWVyIgorCWRlcGVuZHMgb24gVVNCX1NUT1JBR0UKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgYWRkaXRpb25hbCBjb2RlIHRvIHN1cHBvcnQgdGhlIFJpbyBLYXJtYQorCSAgVVNCIGludGVyZmFjZS4KKworCSAgVGhpcyBjb2RlIHBsYWNlcyB0aGUgUmlvIEthcm1hIGludG8gbWFzcyBzdG9yYWdlIG1vZGUsIGVuYWJsaW5nCisJICBpdCB0byBiZSBtb3VudGVkIGFzIGFuIG9yZGluYXJ5IGZpbGVzeXN0ZW0uIFBlcmZvcm1pbmcgYW4gZWplY3QKKwkgIG9uIHRoZSByZXN1bHRpbmcgc2NzaSBkZXZpY2Ugbm9kZSByZXR1cm5zIHRoZSBLYXJtYSB0byBub3JtYWwKKwkgIG9wZXJhdGlvbi4KKwogY29uZmlnIFVTQl9MSUJVU1VBTAogCWJvb2wgIlRoZSBzaGFyZWQgdGFibGUgb2YgY29tbW9uIChvciB1c3VhbCkgc3RvcmFnZSBkZXZpY2VzIgogCWRlcGVuZHMgb24gVVNCCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL01ha2VmaWxlIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9NYWtlZmlsZQppbmRleCA4Y2JiYTIyLi4wMjM5NjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvTWFrZWZpbGUKQEAgLTIwLDYgKzIwLDcgQEAKIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCkJKz0ganVtcHNob3QubwogdXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX0FMQVVEQSkJKz0gYWxhdWRhLm8KIHVzYi1zdG9yYWdlLW9iai0kKENPTkZJR19VU0JfU1RPUkFHRV9PTkVUT1VDSCkJKz0gb25ldG91Y2gubwordXNiLXN0b3JhZ2Utb2JqLSQoQ09ORklHX1VTQl9TVE9SQUdFX0tBUk1BKQkrPSBrYXJtYS5vCiAKIHVzYi1zdG9yYWdlLW9ianMgOj0Jc2NzaWdsdWUubyBwcm90b2NvbC5vIHRyYW5zcG9ydC5vIHVzYi5vIFwKIAkJCWluaXRpYWxpemVycy5vICQodXNiLXN0b3JhZ2Utb2JqLXkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2luaXRpYWxpemVycy5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9pbml0aWFsaXplcnMuYwppbmRleCBhYjE3M2IzLi41YjA2ZjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2luaXRpYWxpemVycy5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvaW5pdGlhbGl6ZXJzLmMKQEAgLTQ1LDEyICs0NSw2IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKIAotI2RlZmluZSBSSU9fTVNDIDB4MDgKLSNkZWZpbmUgUklPUF9JTklUICJSSU9QXHgwMFx4MDFceDA4IgotI2RlZmluZSBSSU9QX0lOSVRfTEVOIDcKLSNkZWZpbmUgUklPX1NFTkRfTEVOIDQwCi0jZGVmaW5lIFJJT19SRUNWX0xFTiAweDIwMAotCiAvKiBUaGlzIHBsYWNlcyB0aGUgU2h1dHRsZS9TQ00gVVNCPC0+U0NTSSBicmlkZ2UgZGV2aWNlcyBpbiBtdWx0aS10YXJnZXQKICAqIG1vZGUgKi8KIGludCB1c2Jfc3Rvcl9ldXNjc2lfaW5pdChzdHJ1Y3QgdXNfZGF0YSAqdXMpCkBAIC05Nyw3MCArOTEsMyBAQAogCiAJcmV0dXJuIChyZXMgPyAtMSA6IDApOwogfQotCi0vKiBQbGFjZSB0aGUgUmlvIEthcm1hIGludG8gbWFzcyBzdG9yYWdlIG1vZGUuCi0gKgotICogVGhlIGluaXRpYWxpemF0aW9uIGJlZ2lucyBieSBzZW5kaW5nIDQwIGJ5dGVzIHN0YXJ0aW5nCi0gKiBSSU9QXHgwMFx4MDFceDA4XHgwMCwgd2hpY2ggdGhlIGRldmljZSB3aWxsIGFjayB3aXRoIGEgNTEyLWJ5dGUKLSAqIHBhY2tldCB3aXRoIHRoZSBoaWdoIGZvdXIgYml0cyBzZXQgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBudWxsLgotICoKLSAqIE5leHQsIHdlIHNlbmQgUklPUFx4ODBceDAwXHgwOFx4MDAuICBFYWNoIHRpbWUsIGEgNTEyIGJ5dGUgcmVzcG9uc2UKLSAqIG11c3QgYmUgcmVhZCwgYnV0IHdlIG11c3QgbG9vcCB1bnRpbCBieXRlIDUgaW4gdGhlIHJlc3BvbnNlIGlzIDB4MDgsCi0gKiBpbmRpY2F0aW5nIHN1Y2Nlc3MuICAqLwotaW50IHJpb19rYXJtYV9pbml0KHN0cnVjdCB1c19kYXRhICp1cykKLXsKLQlpbnQgcmVzdWx0LCBwYXJ0aWFsOwotCWNoYXIgKnJlY3Y7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCi0JLy8gdXMtPmlvYnVmIGlzIGJpZyBlbm91Z2ggdG8gaG9sZCBjbWQgYnV0IG5vdCByZWNlaXZlCi0JaWYgKCEocmVjdiA9IGttYWxsb2MoUklPX1JFQ1ZfTEVOLCBHRlBfS0VSTkVMKSkpCi0JCWdvdG8gZGllX25vbWVtOwotCi0JVVNfREVCVUdQKCJJbml0aWFsaXppbmcgS2FybWEuLi5cbiIpOwotCi0JbWVtc2V0KHVzLT5pb2J1ZiwgMCwgUklPX1NFTkRfTEVOKTsKLQltZW1jcHkodXMtPmlvYnVmLCBSSU9QX0lOSVQsIFJJT1BfSU5JVF9MRU4pOwotCi0JcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5zZW5kX2J1bGtfcGlwZSwKLQkJdXMtPmlvYnVmLCBSSU9fU0VORF9MRU4sICZwYXJ0aWFsKTsKLQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQkJZ290byBkaWU7Ci0KLQlyZXN1bHQgPSB1c2Jfc3Rvcl9idWxrX3RyYW5zZmVyX2J1Zih1cywgdXMtPnJlY3ZfYnVsa19waXBlLAotCQlyZWN2LCBSSU9fUkVDVl9MRU4sICZwYXJ0aWFsKTsKLQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQkJZ290byBkaWU7Ci0KLQl1cy0+aW9idWZbNF0gPSAweDgwOwotCXVzLT5pb2J1Zls1XSA9IDA7Ci0JdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDMwMDApOwotCWZvciAoOzspIHsKLQkJVVNfREVCVUdQKCJTZW5kaW5nIGluaXQgY29tbWFuZFxuIik7Ci0JCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+c2VuZF9idWxrX3BpcGUsCi0JCQl1cy0+aW9idWYsIFJJT19TRU5EX0xFTiwgJnBhcnRpYWwpOwotCQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKLQkJCWdvdG8gZGllOwotCi0JCXJlc3VsdCA9IHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKHVzLCB1cy0+cmVjdl9idWxrX3BpcGUsCi0JCQlyZWN2LCBSSU9fUkVDVl9MRU4sICZwYXJ0aWFsKTsKLQkJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JCQlnb3RvIGRpZTsKLQotCQlpZiAocmVjdls1XSA9PSBSSU9fTVNDKQotCQkJYnJlYWs7Ci0JCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQotCQkJZ290byBkaWU7Ci0JCW1zbGVlcCgxMCk7Ci0JfQotCVVTX0RFQlVHUCgiS2FybWEgaW5pdGlhbGl6ZWQuXG4iKTsKLQlrZnJlZShyZWN2KTsKLQlyZXR1cm4gMDsKLQotZGllOgotCWtmcmVlKHJlY3YpOwotZGllX25vbWVtOgotCVVTX0RFQlVHUCgiQ291bGQgbm90IGluaXRpYWxpemUga2FybWEuXG4iKTsKLQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0ZBSUxFRDsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9pbml0aWFsaXplcnMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvaW5pdGlhbGl6ZXJzLmgKaW5kZXggOTI3Zjc3OC4uZTI5NjdhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9pbml0aWFsaXplcnMuaAorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2luaXRpYWxpemVycy5oCkBAIC00Nyw0ICs0NywzIEBACiAvKiBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIGFjdGl2YXRlIGFsbCBmb3VyIHNsb3RzIG9uIHRoZSBVQ1ItNjFTMkIKICAqIGZsYXNoIHJlYWRlciAqLwogaW50IHVzYl9zdG9yX3VjcjYxczJiX2luaXQoc3RydWN0IHVzX2RhdGEgKnVzKTsKLWludCByaW9fa2FybWFfaW5pdChzdHJ1Y3QgdXNfZGF0YSAqdXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9rYXJtYS5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9rYXJtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNzlhZTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2thcm1hLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qIERyaXZlciBmb3IgUmlvIEthcm1hCisgKgorICogICAoYykgMjAwNiBCb2IgQ29wZWxhbmQgPG1lQGJvYmNvcGVsYW5kLmNvbT4KKyAqICAgKGMpIDIwMDYgS2VpdGggQmVubmV0dCA8a2VpdGhAbWNzLnN0LWFuZC5hYy51az4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisKKyNpbmNsdWRlICJ1c2IuaCIKKyNpbmNsdWRlICJ0cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgImthcm1hLmgiCisKKyNkZWZpbmUgUklPX1BSRUZJWCAiUklPUFx4MDAiCisjZGVmaW5lIFJJT19QUkVGSVhfTEVOIDUKKyNkZWZpbmUgUklPX1NFTkRfTEVOIDQwCisjZGVmaW5lIFJJT19SRUNWX0xFTiAweDIwMAorCisjZGVmaW5lIFJJT19FTlRFUl9TVE9SQUdFIDB4MQorI2RlZmluZSBSSU9fTEVBVkVfU1RPUkFHRSAweDIKKyNkZWZpbmUgUklPX1JFU0VUIDB4QworCitleHRlcm4gaW50IHVzYl9zdG9yX0J1bGtfdHJhbnNwb3J0KHN0cnVjdCBzY3NpX2NtbmQgKiwgc3RydWN0IHVzX2RhdGEgKik7CisKK3N0cnVjdCBrYXJtYV9kYXRhIHsKKwlpbnQgaW5fc3RvcmFnZTsKKwljaGFyICpyZWN2OworfTsKKworLyoKKyAqIFNlbmQgY29tbWFuZHMgdG8gUmlvIEthcm1hLgorICoKKyAqIEZvciBlYWNoIGNvbW1hbmQgd2Ugc2VuZCA0MCBieXRlcyBzdGFydGluZyAnUklPUFwwJyBmb2xsb3dlZCBieQorICogdGhlIGNvbW1hbmQgbnVtYmVyIGFuZCBhIHNlcXVlbmNlIG51bWJlciwgd2hpY2ggdGhlIGRldmljZSB3aWxsIGFjaworICogd2l0aCBhIDUxMi1ieXRlIHBhY2tldCB3aXRoIHRoZSBoaWdoIGZvdXIgYml0cyBzZXQgYW5kIGV2ZXJ5dGhpbmcKKyAqIGVsc2UgbnVsbC4gIFRoZW4gd2Ugc2VuZCAnUklPUFx4ODAnIGZvbGxvd2VkIGJ5IGEgemVybyBhbmQgdGhlCisgKiBzZXF1ZW5jZSBudW1iZXIsIHVudGlsIGJ5dGUgNSBpbiB0aGUgcmVzcG9uc2UgcmVwZWF0cyB0aGUgc2VxdWVuY2UKKyAqIG51bWJlci4KKyAqLworc3RhdGljIGludCByaW9fa2FybWFfc2VuZF9jb21tYW5kKGNoYXIgY21kLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJaW50IHJlc3VsdCwgcGFydGlhbDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgc2VxID0gMTsKKwlzdHJ1Y3Qga2FybWFfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qga2FybWFfZGF0YSAqKSB1cy0+ZXh0cmE7CisKKwlVU19ERUJVR1AoImthcm1hOiBzZW5kaW5nIGNvbW1hbmQgJTA0eFxuIiwgY21kKTsKKwltZW1zZXQodXMtPmlvYnVmLCAwLCBSSU9fU0VORF9MRU4pOworCW1lbWNweSh1cy0+aW9idWYsIFJJT19QUkVGSVgsIFJJT19QUkVGSVhfTEVOKTsKKwl1cy0+aW9idWZbNV0gPSBjbWQ7CisJdXMtPmlvYnVmWzZdID0gc2VxOworCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDYwMDApOworCWZvciAoOzspIHsKKwkJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5zZW5kX2J1bGtfcGlwZSwKKwkJCXVzLT5pb2J1ZiwgUklPX1NFTkRfTEVOLCAmcGFydGlhbCk7CisJCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQorCQkJZ290byBlcnI7CisKKwkJcmVzdWx0ID0gdXNiX3N0b3JfYnVsa190cmFuc2Zlcl9idWYodXMsIHVzLT5yZWN2X2J1bGtfcGlwZSwKKwkJCWRhdGEtPnJlY3YsIFJJT19SRUNWX0xFTiwgJnBhcnRpYWwpOworCQlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKKwkJCWdvdG8gZXJyOworCisJCWlmIChkYXRhLT5yZWN2WzVdID09IHNlcSkKKwkJCWJyZWFrOworCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKQorCQkJZ290byBlcnI7CisKKwkJdXMtPmlvYnVmWzRdID0gMHg4MDsKKwkJdXMtPmlvYnVmWzVdID0gMDsKKwkJbXNsZWVwKDUwKTsKKwl9CisKKwlzZXErKzsKKwlpZiAoc2VxID09IDApCisJCXNlcSA9IDE7CisKKwlVU19ERUJVR1AoImthcm1hOiBzZW50IGNvbW1hbmQgJTA0eFxuIiwgY21kKTsKKwlyZXR1cm4gMDsKK2VycjoKKwlVU19ERUJVR1AoImthcm1hOiBjb21tYW5kICUwNHggZmFpbGVkXG4iLCBjbWQpOworCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRkFJTEVEOworfQorCisvKgorICogVHJhcCBTVEFSVF9TVE9QIGFuZCBSRUFEXzEwIHRvIGxlYXZlL3JlLWVudGVyIHN0b3JhZ2UgbW9kZS4KKyAqIEV2ZXJ5dGhpbmcgZWxzZSBpcyBwcm9wYWdhdGVkIHRvIHRoZSBub3JtYWwgYnVsayBsYXllci4KKyAqLworaW50IHJpb19rYXJtYV90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qga2FybWFfZGF0YSAqZGF0YSA9IChzdHJ1Y3Qga2FybWFfZGF0YSAqKSB1cy0+ZXh0cmE7CisKKwlpZiAoc3JiLT5jbW5kWzBdID09IFJFQURfMTAgJiYgIWRhdGEtPmluX3N0b3JhZ2UpIHsKKwkJcmV0ID0gcmlvX2thcm1hX3NlbmRfY29tbWFuZChSSU9fRU5URVJfU1RPUkFHRSwgdXMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlkYXRhLT5pbl9zdG9yYWdlID0gMTsKKwkJcmV0dXJuIHVzYl9zdG9yX0J1bGtfdHJhbnNwb3J0KHNyYiwgdXMpOworCX0gZWxzZSBpZiAoc3JiLT5jbW5kWzBdID09IFNUQVJUX1NUT1ApIHsKKwkJcmV0ID0gcmlvX2thcm1hX3NlbmRfY29tbWFuZChSSU9fTEVBVkVfU1RPUkFHRSwgdXMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlkYXRhLT5pbl9zdG9yYWdlID0gMDsKKwkJcmV0dXJuIHJpb19rYXJtYV9zZW5kX2NvbW1hbmQoUklPX1JFU0VULCB1cyk7CisJfQorCXJldHVybiB1c2Jfc3Rvcl9CdWxrX3RyYW5zcG9ydChzcmIsIHVzKTsKK30KKworc3RhdGljIHZvaWQgcmlvX2thcm1hX2Rlc3RydWN0b3Iodm9pZCAqZXh0cmEpCit7CisJc3RydWN0IGthcm1hX2RhdGEgKmRhdGEgPSAoc3RydWN0IGthcm1hX2RhdGEgKikgZXh0cmE7CisJa2ZyZWUoZGF0YS0+cmVjdik7Cit9CisKK2ludCByaW9fa2FybWFfaW5pdChzdHJ1Y3QgdXNfZGF0YSAqdXMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGthcm1hX2RhdGEgKmRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qga2FybWFfZGF0YSksIEdGUF9OT0lPKTsKKwlpZiAoIWRhdGEpCisJCWdvdG8gb3V0OworCisJZGF0YS0+cmVjdiA9IGttYWxsb2MoUklPX1JFQ1ZfTEVOLCBHRlBfTk9JTyk7CisJaWYgKCFkYXRhLT5yZWN2KSB7CisJCWtmcmVlKGRhdGEpOworCQlnb3RvIG91dDsKKwl9CisKKwl1cy0+ZXh0cmEgPSBkYXRhOworCXVzLT5leHRyYV9kZXN0cnVjdG9yID0gcmlvX2thcm1hX2Rlc3RydWN0b3I7CisJcmV0ID0gcmlvX2thcm1hX3NlbmRfY29tbWFuZChSSU9fRU5URVJfU1RPUkFHRSwgdXMpOworCWRhdGEtPmluX3N0b3JhZ2UgPSAocmV0ID09IDApOworb3V0OgorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2thcm1hLmggYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2thcm1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2MDk3MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2Uva2FybWEuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX0tBUk1BX1VTQl9ICisjZGVmaW5lIF9LQVJNQV9VU0JfSAorCitleHRlcm4gaW50IHJpb19rYXJtYV9pbml0KHN0cnVjdCB1c19kYXRhICp1cyk7CitleHRlcm4gaW50IHJpb19rYXJtYV90cmFuc3BvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgdXNfZGF0YSAqdXMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvbGlidXN1YWwuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvbGlidXN1YWwuYwppbmRleCBiMWVjNGE3Li41OTlhZDEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2xpYnVzdWFsLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9saWJ1c3VhbC5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYl91c3VhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAKIC8qCiAgKi8KQEAgLTExNyw3ICsxMTgsNyBAQAogCQkJIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAl1bnNpZ25lZCBsb25nIHR5cGU7Ci0JaW50IHJjOworCXN0cnVjdCB0YXNrX3N0cnVjdCogdGFzazsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJdHlwZSA9IFVTQl9VU19UWVBFKGlkLT5kcml2ZXJfaW5mbyk7CkBAIC0xMzIsOCArMTMzLDkgQEAKIAlzdGF0W3R5cGVdLmZscyB8PSBVU1VfTU9EX0ZMX1RIUkVBRDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c3VfbG9jaywgZmxhZ3MpOwogCi0JcmMgPSBrZXJuZWxfdGhyZWFkKHVzdV9wcm9iZV90aHJlYWQsICh2b2lkKil0eXBlLCBDTE9ORV9WTSk7Ci0JaWYgKHJjIDwgMCkgeworCXRhc2sgPSBrdGhyZWFkX3J1bih1c3VfcHJvYmVfdGhyZWFkLCAodm9pZCopdHlwZSwgImxpYnVzdWFsXyVkIiwgdHlwZSk7CisJaWYgKElTX0VSUih0YXNrKSkgeworCQlpbnQgcmMgPSBQVFJfRVJSKHRhc2spOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJsaWJ1c3VhbDogIgogCQkgICAgIlVuYWJsZSB0byBzdGFydCB0aGUgdGhyZWFkIGZvciAlczogJWRcbiIsCiAJCSAgICBiaWFzX25hbWVzW3R5cGVdLCByYyk7CkBAIC0xNzUsOCArMTc3LDYgQEAKIAlpbnQgcmM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRhZW1vbml6ZSgibGlidXN1YWxfJWQiLCB0eXBlKTsJLyogInVzYi1zdG9yYWdlIiBpcyBraW5kYSB0b28gbG9uZyAqLwotCiAJLyogQSBjb21wbGV0aW9uIGRvZXMgbm90IHdvcmsgaGVyZSBiZWNhdXNlIGl0J3MgY291bnRlZC4gKi8KIAlkb3duKCZ1c3VfaW5pdF9ub3RpZnkpOwogCXVwKCZ1c3VfaW5pdF9ub3RpZnkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9vbmV0b3VjaC5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9vbmV0b3VjaC5jCmluZGV4IDMxMzkyMGQuLmY4NDNhMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvb25ldG91Y2guYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL29uZXRvdWNoLmMKQEAgLTEzNSw2ICsxMzUsNyBAQAogCXN0cnVjdCB1c2Jfb25ldG91Y2ggKm9uZXRvdWNoOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKIAlpbnQgcGlwZSwgbWF4cDsKKwlpbnQgZXJyb3IgPSAtRU5PTUVNOwogCiAJaW50ZXJmYWNlID0gc3MtPnB1c2JfaW50Zi0+Y3VyX2FsdHNldHRpbmc7CiAKQEAgLTIxMSwxNSArMjEyLDE4IEBACiAJc3MtPnN1c3BlbmRfcmVzdW1lX2hvb2sgPSB1c2Jfb25ldG91Y2hfcG1faG9vazsKICNlbmRpZgogCi0JaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKG9uZXRvdWNoLT5kZXYpOworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKG9uZXRvdWNoLT5kZXYpOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsMzsKIAogCXJldHVybiAwOwogCisgZmFpbDM6CXVzYl9mcmVlX3VyYihvbmV0b3VjaC0+aXJxKTsKICBmYWlsMjoJdXNiX2J1ZmZlcl9mcmVlKHVkZXYsIE9ORVRPVUNIX1BLVF9MRU4sCiAJCQlvbmV0b3VjaC0+ZGF0YSwgb25ldG91Y2gtPmRhdGFfZG1hKTsKICBmYWlsMToJa2ZyZWUob25ldG91Y2gpOwogCWlucHV0X2ZyZWVfZGV2aWNlKGlucHV0X2Rldik7Ci0JcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIGVycm9yOwogfQogCiB2b2lkIG9uZXRvdWNoX3JlbGVhc2VfaW5wdXQodm9pZCAqb25ldG91Y2hfKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9zY3NpZ2x1ZS5jCmluZGV4IGE0YjdkZjkuLmUxMDcyZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2Uvc2NzaWdsdWUuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3Njc2lnbHVlLmMKQEAgLTcyLDEyICs3MiwyNyBAQAogCiBzdGF0aWMgaW50IHNsYXZlX2FsbG9jIChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCiB7CisJc3RydWN0IHVzX2RhdGEgKnVzID0gaG9zdF90b191cyhzZGV2LT5ob3N0KTsKKwogCS8qCiAJICogU2V0IHRoZSBJTlFVSVJZIHRyYW5zZmVyIGxlbmd0aCB0byAzNi4gIFdlIGRvbid0IHVzZSBhbnkgb2YKIAkgKiB0aGUgZXh0cmEgZGF0YSBhbmQgbWFueSBkZXZpY2VzIGNob2tlIGlmIGFza2VkIGZvciBtb3JlIG9yCiAJICogbGVzcyB0aGFuIDM2IGJ5dGVzLgogCSAqLwogCXNkZXYtPmlucXVpcnlfbGVuID0gMzY7CisKKwkvKgorCSAqIFRoZSBVRkkgc3BlYyB0cmVhdGVzIHRoZSBQZXJpcGhlcmFsIFF1YWxpZmllciBiaXRzIGluIGFuCisJICogSU5RVUlSWSByZXN1bHQgYXMgcmVzZXJ2ZWQgYW5kIHJlcXVpcmVzIGRldmljZXMgdG8gc2V0IHRoZW0KKwkgKiB0byAwLiAgSG93ZXZlciB0aGUgU0NTSSBzcGVjIHJlcXVpcmVzIHRoZXNlIGJpdHMgdG8gYmUgc2V0CisJICogdG8gMyB0byBpbmRpY2F0ZSB3aGVuIGEgTFVOIGlzIG5vdCBwcmVzZW50LgorCSAqCisJICogTGV0IHRoZSBzY2FubmluZyBjb2RlIGtub3cgaWYgdGhpcyB0YXJnZXQgbWVyZWx5IHNldHMKKwkgKiBQZXJpcGhlcmFsIERldmljZSBUeXBlIHRvIDB4MWYgdG8gaW5kaWNhdGUgbm8gTFVOLgorCSAqLworCWlmICh1cy0+c3ViY2xhc3MgPT0gVVNfU0NfVUZJKQorCQlzZGV2LT5zZGV2X3RhcmdldC0+cGR0XzFmX2Zvcl9ub19sdW4gPSAxOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3RyYW5zcG9ydC5jCmluZGV4IGQ2YWNjOTIuLmYyMzUxNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS90cmFuc3BvcnQuYwpAQCAtMjk0LDExICsyOTQsNiBAQAogCQkJcmV0dXJuIFVTQl9TVE9SX1hGRVJfRVJST1I7CiAJCXJldHVybiBVU0JfU1RPUl9YRkVSX1NUQUxMRUQ7CiAKLQkvKiB0aW1lb3V0IG9yIGV4Y2Vzc2l2ZWx5IGxvbmcgTkFLICovCi0JY2FzZSAtRVRJTUVET1VUOgotCQlVU19ERUJVR1AoIi0tIHRpbWVvdXQgb3IgTkFLXG4iKTsKLQkJcmV0dXJuIFVTQl9TVE9SX1hGRVJfRVJST1I7Ci0KIAkvKiBiYWJibGUgLSB0aGUgZGV2aWNlIHRyaWVkIHRvIHNlbmQgbW9yZSB0aGFuIHdlIHdhbnRlZCB0byByZWFkICovCiAJY2FzZSAtRU9WRVJGTE9XOgogCQlVU19ERUJVR1AoIi0tIGJhYmJsZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAppbmRleCBiMTMwZTE3Li40MGJmMTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKQEAgLTIxOCwxMCArMjE4LDEyIEBACiAgICAgICAgICAgICAgICAgVVNfU0NfREVWSUNFLCBVU19QUl9ERVZJQ0UsIE5VTEwsCiAgICAgICAgICAgICAgICAgVVNfRkxfTk9UX0xPQ0tBQkxFICksCiAKKyNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfS0FSTUEKIFVOVVNVQUxfREVWKCAgMHgwNDVhLCAweDUyMTAsIDB4MDEwMSwgMHgwMTAxLAogCQkiUmlvIiwKIAkJIlJpbyBLYXJtYSIsCi0JCVVTX1NDX1NDU0ksIFVTX1BSX0JVTEssIHJpb19rYXJtYV9pbml0LCAwKSwKKwkJVVNfU0NfU0NTSSwgVVNfUFJfS0FSTUEsIHJpb19rYXJtYV9pbml0LCAwKSwKKyNlbmRpZgogCiAvKiBQYXRjaCBzdWJtaXR0ZWQgYnkgUGhpbGlwcCBGcmllZHJpY2ggPHBoaWxpcHBAdm9pZC5hdD4gKi8KIFVOVVNVQUxfREVWKCAgMHgwNDgyLCAweDAxMDAsIDB4MDEwMCwgMHgwMTAwLApAQCAtNjMxLDYgKzYzMywxMyBAQAogCQkiRGlnaXRhbCBDYW1lcmEgRVgtMjAgRFNDIiwKIAkJVVNfU0NfODA3MCwgVVNfUFJfREVWSUNFLCBOVUxMLCAwICksCiAKKy8qIFJlcG9ydGVkIGJ5IDxIZW5kcnlrLlBmZWlmZmVyQGdteC5kZT4gKi8KK1VOVVNVQUxfREVWKCAgMHgwNTlmLCAweDA2NDMsIDB4MDAwMCwgMHgwMDAwLAorCQkiTGFDaWUiLAorCQkiRFZEKy1SVyIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9HT19TTE9XICksCisKIC8qIFN1Ym1pdHRlZCBieSBKb2VsIEJvdXJxdWFyZCA8bnVtbG9ja0BmcmVlc3VyZi5jaD4KICAqIFNvbWUgdmVyc2lvbnMgb2YgdGhpcyBkZXZpY2UgbmVlZCB0aGUgU3ViQ2xhc3MgYW5kIFByb3RvY29sIG92ZXJyaWRlcwogICogd2hpbGUgb3RoZXJzIGRvbid0LgpAQCAtMTI1NCw2ICsxMjYzLDEzIEBACiAJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9OT19XUF9ERVRFQ1QgKSwKIAorLyogUmVwb3J0ZWQgYnkgSmFuIE1hdGUgPG1hdGVAZmlpdC5zdHViYS5zaz4gKi8KK1VOVVNVQUxfREVWKCAgMHgwZmNlLCAweGUwMzAsIDB4MDAwMCwgMHgwMDAwLAorCQkiU29ueSBFcmljc3NvbiIsCisJCSJQOTkwaSIsCisJCVVTX1NDX0RFVklDRSwgVVNfUFJfREVWSUNFLCBOVUxMLAorCQlVU19GTF9GSVhfQ0FQQUNJVFkgKSwKKwogLyogUmVwb3J0ZWQgYnkgRW1tYW51ZWwgVmFzaWxha2lzIDxldmFzQGZvcnRobmV0LmdyPiAqLwogVU5VU1VBTF9ERVYoICAweDBmY2UsIDB4ZTAzMSwgMHgwMDAwLCAweDAwMDAsCiAJCSJTb255IEVyaWNzc29uIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL3VzYi5jCmluZGV4IDhkN2JkY2IuLmI4ZDYwMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdXNiLmMKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91c2IuYwpAQCAtOTgsNiArOTgsOSBAQAogI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEKICNpbmNsdWRlICJhbGF1ZGEuaCIKICNlbmRpZgorI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQQorI2luY2x1ZGUgImthcm1hLmgiCisjZW5kaWYKIAogLyogU29tZSBpbmZvcm1hdGlvbmFsIGRhdGEgKi8KIE1PRFVMRV9BVVRIT1IoIk1hdHRoZXcgRGhhcm0gPG1kaGFybS11c2JAb25lLWV5ZWQtYWxpZW4ubmV0PiIpOwpAQCAtNjQ2LDYgKzY0OSwxNCBAQAogCQlicmVhazsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1VTQl9TVE9SQUdFX0tBUk1BCisJY2FzZSBVU19QUl9LQVJNQToKKwkJdXMtPnRyYW5zcG9ydF9uYW1lID0gIlJpbyBLYXJtYS9CdWxrIjsKKwkJdXMtPnRyYW5zcG9ydCA9IHJpb19rYXJtYV90cmFuc3BvcnQ7CisJCXVzLT50cmFuc3BvcnRfcmVzZXQgPSB1c2Jfc3Rvcl9CdWxrX3Jlc2V0OworCQlicmVhazsKKyNlbmRpZgorCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU87CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvdXNiLXNrZWxldG9uLmMgYi9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYwppbmRleCBiMzYyMDM5Li4xYjUxZDMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYworKysgYi9kcml2ZXJzL3VzYi91c2Itc2tlbGV0b24uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBVU0IgU2tlbGV0b24gZHJpdmVyIC0gMi4wCisgKiBVU0IgU2tlbGV0b24gZHJpdmVyIC0gMi4yCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgR3JlZyBLcm9haC1IYXJ0bWFuIChncmVnQGtyb2FoLmNvbSkKICAqCkBAIC03LDkgKzcsOCBAQAogICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICAqCXB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCiAgKgotICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gdGhlIDIuNi4zIHZlcnNpb24gb2YgZHJpdmVycy91c2IvdXNiLXNrZWxldG9uLmMgCi0gKiBidXQgaGFzIGJlZW4gcmV3cml0dGVuIHRvIGJlIGVhc3kgdG8gcmVhZCBhbmQgdXNlLCBhcyBubyBsb2NrcyBhcmUgbm93Ci0gKiBuZWVkZWQgYW55bW9yZS4KKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHRoZSAyLjYuMyB2ZXJzaW9uIG9mIGRyaXZlcnMvdXNiL3VzYi1za2VsZXRvbi5jCisgKiBidXQgaGFzIGJlZW4gcmV3cml0dGVuIHRvIGJlIGVhc2llciB0byByZWFkIGFuZCB1c2UuCiAgKgogICovCiAKQEAgLTIxLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAKIC8qIERlZmluZSB0aGVzZSB2YWx1ZXMgdG8gbWF0Y2ggeW91ciBkZXZpY2VzICovCkBAIC0zMiwzOCArMzIsMzkgQEAKIAl7IFVTQl9ERVZJQ0UoVVNCX1NLRUxfVkVORE9SX0lELCBVU0JfU0tFTF9QUk9EVUNUX0lEKSB9LAogCXsgfQkJCQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIHNrZWxfdGFibGUpOworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHNrZWxfdGFibGUpOwogCiAKIC8qIEdldCBhIG1pbm9yIHJhbmdlIGZvciB5b3VyIGRldmljZXMgZnJvbSB0aGUgdXNiIG1haW50YWluZXIgKi8KICNkZWZpbmUgVVNCX1NLRUxfTUlOT1JfQkFTRQkxOTIKIAogLyogb3VyIHByaXZhdGUgZGVmaW5lcy4gaWYgdGhpcyBncm93cyBhbnkgbGFyZ2VyLCB1c2UgeW91ciBvd24gLmggZmlsZSAqLwotI2RlZmluZSBNQVhfVFJBTlNGRVIJCSggUEFHRV9TSVpFIC0gNTEyICkKKyNkZWZpbmUgTUFYX1RSQU5TRkVSCQkoUEFHRV9TSVpFIC0gNTEyKQogI2RlZmluZSBXUklURVNfSU5fRkxJR0hUCTgKIAogLyogU3RydWN0dXJlIHRvIGhvbGQgYWxsIG9mIG91ciBkZXZpY2Ugc3BlY2lmaWMgc3R1ZmYgKi8KIHN0cnVjdCB1c2Jfc2tlbCB7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKgl1ZGV2OwkJCS8qIHRoZSB1c2IgZGV2aWNlIGZvciB0aGlzIGRldmljZSAqLwotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICoJaW50ZXJmYWNlOwkJLyogdGhlIGludGVyZmFjZSBmb3IgdGhpcyBkZXZpY2UgKi8KKwlzdHJ1Y3QgdXNiX2RldmljZSAgICAgICAqZGV2OwkJCS8qIHRoZSB1c2IgZGV2aWNlIGZvciB0aGlzIGRldmljZSAqLworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICAgICppbnRlcmZhY2U7CQkvKiB0aGUgaW50ZXJmYWNlIGZvciB0aGlzIGRldmljZSAqLwogCXN0cnVjdCBzZW1hcGhvcmUJbGltaXRfc2VtOwkJLyogbGltaXRpbmcgdGhlIG51bWJlciBvZiB3cml0ZXMgaW4gcHJvZ3Jlc3MgKi8KLQl1bnNpZ25lZCBjaGFyICoJCWJ1bGtfaW5fYnVmZmVyOwkJLyogdGhlIGJ1ZmZlciB0byByZWNlaXZlIGRhdGEgKi8KKwl1bnNpZ25lZCBjaGFyICAgICAgICAgICAqYnVsa19pbl9idWZmZXI7CS8qIHRoZSBidWZmZXIgdG8gcmVjZWl2ZSBkYXRhICovCiAJc2l6ZV90CQkJYnVsa19pbl9zaXplOwkJLyogdGhlIHNpemUgb2YgdGhlIHJlY2VpdmUgYnVmZmVyICovCiAJX191OAkJCWJ1bGtfaW5fZW5kcG9pbnRBZGRyOwkvKiB0aGUgYWRkcmVzcyBvZiB0aGUgYnVsayBpbiBlbmRwb2ludCAqLwogCV9fdTgJCQlidWxrX291dF9lbmRwb2ludEFkZHI7CS8qIHRoZSBhZGRyZXNzIG9mIHRoZSBidWxrIG91dCBlbmRwb2ludCAqLwogCXN0cnVjdCBrcmVmCQlrcmVmOworCXN0cnVjdCBtdXRleAkJaW9fbXV0ZXg7CQkvKiBzeW5jaHJvbml6ZSBJL08gd2l0aCBkaXNjb25uZWN0ICovCiB9OwogI2RlZmluZSB0b19za2VsX2RldihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHVzYl9za2VsLCBrcmVmKQogCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgc2tlbF9kcml2ZXI7CiAKIHN0YXRpYyB2b2lkIHNrZWxfZGVsZXRlKHN0cnVjdCBrcmVmICprcmVmKQotewkKK3sKIAlzdHJ1Y3QgdXNiX3NrZWwgKmRldiA9IHRvX3NrZWxfZGV2KGtyZWYpOwogCiAJdXNiX3B1dF9kZXYoZGV2LT51ZGV2KTsKLQlrZnJlZSAoZGV2LT5idWxrX2luX2J1ZmZlcik7Ci0Ja2ZyZWUgKGRldik7CisJa2ZyZWUoZGV2LT5idWxrX2luX2J1ZmZlcik7CisJa2ZyZWUoZGV2KTsKIH0KIAogc3RhdGljIGludCBza2VsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC04OSw2ICs5MCwxMSBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCisJLyogcHJldmVudCB0aGUgZGV2aWNlIGZyb20gYmVpbmcgYXV0b3N1c3BlbmRlZCAqLworCXJldHZhbCA9IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShpbnRlcmZhY2UpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXhpdDsKKwogCS8qIGluY3JlbWVudCBvdXIgdXNhZ2UgY291bnQgZm9yIHRoZSBkZXZpY2UgKi8KIAlrcmVmX2dldCgmZGV2LT5rcmVmKTsKIApAQCAtMTA3LDYgKzExMywxMiBAQAogCWlmIChkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKKwkvKiBhbGxvdyB0aGUgZGV2aWNlIHRvIGJlIGF1dG9zdXNwZW5kZWQgKi8KKwltdXRleF9sb2NrKCZkZXYtPmlvX211dGV4KTsKKwlpZiAoZGV2LT5pbnRlcmZhY2UpCisJCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShkZXYtPmludGVyZmFjZSk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmlvX211dGV4KTsKKwogCS8qIGRlY3JlbWVudCB0aGUgY291bnQgb24gb3VyIGRldmljZSAqLwogCWtyZWZfcHV0KCZkZXYtPmtyZWYsIHNrZWxfZGVsZXRlKTsKIAlyZXR1cm4gMDsKQEAgLTExNSwxMSArMTI3LDE3IEBACiBzdGF0aWMgc3NpemVfdCBza2VsX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHVzYl9za2VsICpkZXY7Ci0JaW50IHJldHZhbCA9IDA7CisJaW50IHJldHZhbDsKIAlpbnQgYnl0ZXNfcmVhZDsKIAogCWRldiA9IChzdHJ1Y3QgdXNiX3NrZWwgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0JCisKKwltdXRleF9sb2NrKCZkZXYtPmlvX211dGV4KTsKKwlpZiAoIWRldi0+aW50ZXJmYWNlKSB7CQkvKiBkaXNjb25uZWN0KCkgd2FzIGNhbGxlZCAqLworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCiAJLyogZG8gYSBibG9ja2luZyBidWxrIHJlYWQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgZGV2aWNlICovCiAJcmV0dmFsID0gdXNiX2J1bGtfbXNnKGRldi0+dWRldiwKIAkJCSAgICAgIHVzYl9yY3ZidWxrcGlwZShkZXYtPnVkZXYsIGRldi0+YnVsa19pbl9lbmRwb2ludEFkZHIpLApAQCAtMTM1LDYgKzE1Myw4IEBACiAJCQlyZXR2YWwgPSBieXRlc19yZWFkOwogCX0KIAorZXhpdDoKKwltdXRleF91bmxvY2soJmRldi0+aW9fbXV0ZXgpOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTE0NSwxNiArMTY1LDE2IEBACiAJZGV2ID0gKHN0cnVjdCB1c2Jfc2tlbCAqKXVyYi0+Y29udGV4dDsKIAogCS8qIHN5bmMvYXN5bmMgdW5saW5rIGZhdWx0cyBhcmVuJ3QgZXJyb3JzICovCi0JaWYgKHVyYi0+c3RhdHVzICYmIAotCSAgICAhKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwgCisJaWYgKHVyYi0+c3RhdHVzICYmCisJICAgICEodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fAogCSAgICAgIHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUIHx8CiAJICAgICAgdXJiLT5zdGF0dXMgPT0gLUVTSFVURE9XTikpIHsKLQkJZGJnKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKKwkJZXJyKCIlcyAtIG5vbnplcm8gd3JpdGUgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwKIAkJICAgIF9fRlVOQ1RJT05fXywgdXJiLT5zdGF0dXMpOwogCX0KIAogCS8qIGZyZWUgdXAgb3VyIGFsbG9jYXRlZCBidWZmZXIgKi8KLQl1c2JfYnVmZmVyX2ZyZWUodXJiLT5kZXYsIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwgCisJdXNiX2J1ZmZlcl9mcmVlKHVyYi0+ZGV2LCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCiAJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT50cmFuc2Zlcl9kbWEpOwogCXVwKCZkZXYtPmxpbWl0X3NlbSk7CiB9CkBAIC0xNzksNiArMTk5LDEyIEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKKwltdXRleF9sb2NrKCZkZXYtPmlvX211dGV4KTsKKwlpZiAoIWRldi0+aW50ZXJmYWNlKSB7CQkvKiBkaXNjb25uZWN0KCkgd2FzIGNhbGxlZCAqLworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0KKwogCS8qIGNyZWF0ZSBhIHVyYiwgYW5kIGEgYnVmZmVyIGZvciBpdCwgYW5kIGNvcHkgdGhlIGRhdGEgdG8gdGhlIHVyYiAqLwogCXVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF1cmIpIHsKQEAgLTIxMywxNyArMjM5LDIyIEBACiAJLyogcmVsZWFzZSBvdXIgcmVmZXJlbmNlIHRvIHRoaXMgdXJiLCB0aGUgVVNCIGNvcmUgd2lsbCBldmVudHVhbGx5IGZyZWUgaXQgZW50aXJlbHkgKi8KIAl1c2JfZnJlZV91cmIodXJiKTsKIAotZXhpdDoKKwltdXRleF91bmxvY2soJmRldi0+aW9fbXV0ZXgpOwogCXJldHVybiB3cml0ZXNpemU7CiAKIGVycm9yOgotCXVzYl9idWZmZXJfZnJlZShkZXYtPnVkZXYsIHdyaXRlc2l6ZSwgYnVmLCB1cmItPnRyYW5zZmVyX2RtYSk7Ci0JdXNiX2ZyZWVfdXJiKHVyYik7CisJaWYgKHVyYikgeworCQl1c2JfYnVmZmVyX2ZyZWUoZGV2LT51ZGV2LCB3cml0ZXNpemUsIGJ1ZiwgdXJiLT50cmFuc2Zlcl9kbWEpOworCQl1c2JfZnJlZV91cmIodXJiKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmlvX211dGV4KTsKIAl1cCgmZGV2LT5saW1pdF9zZW0pOworCitleGl0OgogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNrZWxfZm9wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNrZWxfZm9wcyA9IHsKIAkub3duZXIgPQlUSElTX01PRFVMRSwKIAkucmVhZCA9CQlza2VsX3JlYWQsCiAJLndyaXRlID0Jc2tlbF93cml0ZSwKQEAgLTIzMSw3ICsyNjIsNyBAQAogCS5yZWxlYXNlID0Jc2tlbF9yZWxlYXNlLAogfTsKIAotLyogCisvKgogICogdXNiIGNsYXNzIGRyaXZlciBpbmZvIGluIG9yZGVyIHRvIGdldCBhIG1pbm9yIG51bWJlciBmcm9tIHRoZSB1c2IgY29yZSwKICAqIGFuZCB0byBoYXZlIHRoZSBkZXZpY2UgcmVnaXN0ZXJlZCB3aXRoIHRoZSBkcml2ZXIgY29yZQogICovCkBAIC0yNDMsNyArMjc0LDcgQEAKIAogc3RhdGljIGludCBza2VsX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKLQlzdHJ1Y3QgdXNiX3NrZWwgKmRldiA9IE5VTEw7CisJc3RydWN0IHVzYl9za2VsICpkZXY7CiAJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaWZhY2VfZGVzYzsKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVuZHBvaW50OwogCXNpemVfdCBidWZmZXJfc2l6ZTsKQEAgLTI1MiwxMiArMjgzLDEzIEBACiAKIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIG91ciBkZXZpY2Ugc3RhdGUgYW5kIGluaXRpYWxpemUgaXQgKi8KIAlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldiA9PSBOVUxMKSB7CisJaWYgKCFkZXYpIHsKIAkJZXJyKCJPdXQgb2YgbWVtb3J5Iik7CiAJCWdvdG8gZXJyb3I7CiAJfQogCWtyZWZfaW5pdCgmZGV2LT5rcmVmKTsKIAlzZW1hX2luaXQoJmRldi0+bGltaXRfc2VtLCBXUklURVNfSU5fRkxJR0hUKTsKKwltdXRleF9pbml0KCZkZXYtPmlvX211dGV4KTsKIAogCWRldi0+dWRldiA9IHVzYl9nZXRfZGV2KGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKSk7CiAJZGV2LT5pbnRlcmZhY2UgPSBpbnRlcmZhY2U7CkBAIC0yNjksMTAgKzMwMSw3IEBACiAJCWVuZHBvaW50ID0gJmlmYWNlX2Rlc2MtPmVuZHBvaW50W2ldLmRlc2M7CiAKIAkJaWYgKCFkZXYtPmJ1bGtfaW5fZW5kcG9pbnRBZGRyICYmCi0JCSAgICAoKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0VORFBPSU5UX0RJUl9NQVNLKQotCQkJCQk9PSBVU0JfRElSX0lOKSAmJgotCQkgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spCi0JCQkJCT09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspKSB7CisJCSAgICB1c2JfZW5kcG9pbnRfaXNfYnVsa19pbihlbmRwb2ludCkpIHsKIAkJCS8qIHdlIGZvdW5kIGEgYnVsayBpbiBlbmRwb2ludCAqLwogCQkJYnVmZmVyX3NpemUgPSBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpOwogCQkJZGV2LT5idWxrX2luX3NpemUgPSBidWZmZXJfc2l6ZTsKQEAgLTI4NSwxMCArMzE0LDcgQEAKIAkJfQogCiAJCWlmICghZGV2LT5idWxrX291dF9lbmRwb2ludEFkZHIgJiYKLQkJICAgICgoZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5EUE9JTlRfRElSX01BU0spCi0JCQkJCT09IFVTQl9ESVJfT1VUKSAmJgotCQkgICAgKChlbmRwb2ludC0+Ym1BdHRyaWJ1dGVzICYgVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spCi0JCQkJCT09IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEspKSB7CisJCSAgICB1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZW5kcG9pbnQpKSB7CiAJCQkvKiB3ZSBmb3VuZCBhIGJ1bGsgb3V0IGVuZHBvaW50ICovCiAJCQlkZXYtPmJ1bGtfb3V0X2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwogCQl9CkBAIC0zMzQsNiArMzYwLDExIEBACiAJLyogZ2l2ZSBiYWNrIG91ciBtaW5vciAqLwogCXVzYl9kZXJlZ2lzdGVyX2RldihpbnRlcmZhY2UsICZza2VsX2NsYXNzKTsKIAorCS8qIHByZXZlbnQgbW9yZSBJL08gZnJvbSBzdGFydGluZyAqLworCW11dGV4X2xvY2soJmRldi0+aW9fbXV0ZXgpOworCWRldi0+aW50ZXJmYWNlID0gTlVMTDsKKwltdXRleF91bmxvY2soJmRldi0+aW9fbXV0ZXgpOworCiAJdW5sb2NrX2tlcm5lbCgpOwogCiAJLyogZGVjcmVtZW50IG91ciB1c2FnZSBjb3VudCAqLwpAQCAtMzY3LDcgKzM5OCw3IEBACiAJdXNiX2RlcmVnaXN0ZXIoJnNrZWxfZHJpdmVyKTsKIH0KIAotbW9kdWxlX2luaXQgKHVzYl9za2VsX2luaXQpOwotbW9kdWxlX2V4aXQgKHVzYl9za2VsX2V4aXQpOworbW9kdWxlX2luaXQodXNiX3NrZWxfaW5pdCk7Cittb2R1bGVfZXhpdCh1c2Jfc2tlbF9leGl0KTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX3BtLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fcG0uYwppbmRleCBlMzA4ZWQyLi4zNjVkZTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fcG0uYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fcG0uYwpAQCAtMjYyMSwyNSArMjYyMSwyOCBAQAogfQogCiAKLWludCByYWRlb25mYl9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoraW50IHJhZGVvbmZiX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKIHsKICAgICAgICAgc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAgICAgICAgIHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbyA9IGluZm8tPnBhcjsKIAlpbnQgaTsKIAotCWlmIChzdGF0ZS5ldmVudCA9PSBwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpCisJaWYgKG1lc2cuZXZlbnQgPT0gcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50KQogCQlyZXR1cm4gMDsKIAotCXByaW50ayhLRVJOX0RFQlVHICJyYWRlb25mYiAoJXMpOiBzdXNwZW5kaW5nIHRvIHN0YXRlOiAlZC4uLlxuIiwKLQkgICAgICAgcGNpX25hbWUocGRldiksIHN0YXRlLmV2ZW50KTsKKwlwcmludGsoS0VSTl9ERUJVRyAicmFkZW9uZmIgKCVzKTogc3VzcGVuZGluZyBmb3IgZXZlbnQ6ICVkLi4uXG4iLAorCSAgICAgICBwY2lfbmFtZShwZGV2KSwgbWVzZy5ldmVudCk7CiAKIAkvKiBGb3Igc3VzcGVuZC10by1kaXNrLCB3ZSBjaGVhdCBoZXJlLiBXZSBkb24ndCBzdXNwZW5kIGFueXRoaW5nIGFuZAogCSAqIGxldCBmYmNvbiBjb250aW51ZSBkcmF3aW5nIHVudGlsIHdlIGFyZSBhbGwgc2V0LiBUaGF0IHNob3VsZG4ndAogCSAqIHJlYWxseSBjYXVzZSBhbnkgcHJvYmxlbSBhdCB0aGlzIHBvaW50LCBwcm92aWRlZCB0aGF0IHRoZSB3YWtldXAKIAkgKiBjb2RlIGtub3dzIHRoYXQgYW55IHN0YXRlIGluIG1lbW9yeSBtYXkgbm90IG1hdGNoIHRoZSBIVwogCSAqLwotCWlmIChzdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9GUkVFWkUpCisJc3dpdGNoIChtZXNnLmV2ZW50KSB7CisJY2FzZSBQTV9FVkVOVF9GUkVFWkU6CQkvKiBhYm91dCB0byB0YWtlIHNuYXBzaG90ICovCisJY2FzZSBQTV9FVkVOVF9QUkVUSEFXOgkJLyogYmVmb3JlIHJlc3RvcmluZyBzbmFwc2hvdCAqLwogCQlnb3RvIGRvbmU7CisJfQogCiAJYWNxdWlyZV9jb25zb2xlX3NlbSgpOwogCkBAIC0yNzA2LDcgKzI3MDksNyBAQAogCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKIAogIGRvbmU6Ci0JcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7CisJcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gbWVzZzsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvaHA2ODBfYmwuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2hwNjgwX2JsLmMKaW5kZXggZmZjNzJhZS4uZmUxNDg4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvaHA2ODBfYmwuYworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9ocDY4MF9ibC5jCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxhc20vY3B1L2RhYy5oPgogI2luY2x1ZGUgPGFzbS9ocDZ4eC9ocDZ4eC5oPgotI2luY2x1ZGUgPGFzbS9oZDY0NDYxL2hkNjQ0NjEuaD4KKyNpbmNsdWRlIDxhc20vaGQ2NDQ2MS5oPgogCiAjZGVmaW5lIEhQNjgwX01BWF9JTlRFTlNJVFkgMjU1CiAjZGVmaW5lIEhQNjgwX0RFRkFVTFRfSU5URU5TSVRZIDEwCkBAIC0xNjMsNiArMTYzLDYgQEAKIG1vZHVsZV9pbml0KGhwNjgwYmxfaW5pdCk7CiBtb2R1bGVfZXhpdChocDY4MGJsX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJBbmRyaXkgU2t1bHlzaCA8YXNrdWx5c2hAaW1hZ2Uua2lldi51YT4iKTsKK01PRFVMRV9BVVRIT1IoIkFuZHJpeSBTa3VseXNoIDxhc2t1bHlzaEBnbWFpbC5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkhQIEpvcm5hZGEgNjgwIEJhY2tsaWdodCBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS9LY29uZmlnIGIvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcKaW5kZXggNDQ0NGJlZi4uYWEzOTM1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL0tjb25maWcKQEAgLTYsNyArNiw3IEBACiAKIGNvbmZpZyBWR0FfQ09OU09MRQogCWJvb2wgIlZHQSB0ZXh0IGNvbnNvbGUiIGlmIEVNQkVEREVEIHx8ICFYODYKLQlkZXBlbmRzIG9uICFBUkNIX0FDT1JOICYmICFBUkNIX0VCU0ExMTAgJiYgITR4eCAmJiAhOHh4ICYmICFTUEFSQyAmJiAhTTY4SyAmJiAhUEFSSVNDICYmICFGUlYgJiYgIUFSQ0hfVkVSU0FUSUxFCisJZGVwZW5kcyBvbiAhQVJDSF9BQ09STiAmJiAhQVJDSF9FQlNBMTEwICYmICE0eHggJiYgITh4eCAmJiAhU1BBUkMgJiYgIU02OEsgJiYgIVBBUklTQyAmJiAhRlJWICYmICFBUkNIX1ZFUlNBVElMRSAmJiAhU1VQRVJICiAJZGVmYXVsdCB5CiAJaGVscAogCSAgU2F5aW5nIFkgaGVyZSB3aWxsIGFsbG93IHlvdSB0byB1c2UgTGludXggaW4gdGV4dCBtb2RlIHRocm91Z2ggYQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9oaXRmYi5jIGIvZHJpdmVycy92aWRlby9oaXRmYi5jCmluZGV4IDRjYzZiNDUuLjNhZmI0NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaGl0ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL2hpdGZiLmMKQEAgLTQsNyArNCw3IEBACiAgKiAoQykgMTk5OSBNaWhhaSBTcGF0YXIKICAqIChDKSAyMDAwIFlBRUdBU0hJIFRha2VzaGkKICAqIChDKSAyMDAzLCAyMDA0IFBhdWwgTXVuZHQKLSAqIChDKSAyMDAzLCAyMDA0IEFuZHJpeSBTa3VseXNoCisgKiAoQykgMjAwMywgMjAwNCwgMjAwNiBBbmRyaXkgU2t1bHlzaAogICoKICAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwogICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yCkBAIC0yMCwxOCArMjAsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZmIuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9oZDY0NDYxL2hkNjQ0NjEuaD4KLQotI2lmZGVmIE1BQ0hfSFA2MDAKKyNpbmNsdWRlIDxhc20vaGQ2NDQ2MS5oPgogI2luY2x1ZGUgPGFzbS9jcHUvZGFjLmg+CiAjaW5jbHVkZSA8YXNtL2hwNnh4L2hwNnh4Lmg+Ci0jZW5kaWYKIAogI2RlZmluZQlXSURUSCA2NDAKIApAQCAtNDUsNyArNDMsNiBAQAogc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBoaXRmYl9maXggX19pbml0ZGF0YSA9IHsKIAkuaWQJCT0gIkhpdGFjaGkgSEQ2NDQ2MSIsCiAJLnR5cGUJCT0gRkJfVFlQRV9QQUNLRURfUElYRUxTLAotCS55cGFuc3RlcAk9IDgsCiAJLmFjY2VsCQk9IEZCX0FDQ0VMX05PTkUsCiB9OwogCkBAIC03MywyNiArNzAsMTQgQEAKIAlpZiAodHJ1ZWNvbG9yKQogCQlzYWRkciA8PD0gMTsKIAotCWZiX3dyaXRldyh3aWR0aCwgSEQ2NDQ2MV9CQlREV1IpOwotCWZiX3dyaXRldyhoZWlnaHQsIEhENjQ0NjFfQkJUREhSKTsKKwlmYl93cml0ZXcod2lkdGgtMSwgSEQ2NDQ2MV9CQlREV1IpOworCWZiX3dyaXRldyhoZWlnaHQtMSwgSEQ2NDQ2MV9CQlRESFIpOwogCiAJZmJfd3JpdGV3KHNhZGRyICYgMHhmZmZmLCBIRDY0NDYxX0JCVERTQVJMKTsKIAlmYl93cml0ZXcoc2FkZHIgPj4gMTYsIEhENjQ0NjFfQkJURFNBUkgpOwogCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBoaXRmYl9hY2NlbF9zb2xpZGZpbGwoaW50IHRydWVjb2xvciwgdTE2IGR4LCB1MTYgZHksCi0JCQkJCSB1MTYgd2lkdGgsIHUxNiBoZWlnaHQsIHUxNiBjb2xvcikKLXsKLQloaXRmYl9hY2NlbF9zZXRfZGVzdCh0cnVlY29sb3IsIGR4LCBkeSwgd2lkdGgsIGhlaWdodCk7Ci0KLQlmYl93cml0ZXcoMHgwMGYwLCBIRDY0NDYxX0JCVFJPUFIpOwotCWZiX3dyaXRldygxNiwgSEQ2NDQ2MV9CQlRNRFIpOwotCWZiX3dyaXRldyhjb2xvciwgSEQ2NDQ2MV9HUlNDUik7Ci0KLQloaXRmYl9hY2NlbF9zdGFydCh0cnVlY29sb3IpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgaGl0ZmJfYWNjZWxfYml0Ymx0KGludCB0cnVlY29sb3IsIHUxNiBzeCwgdTE2IHN5LCB1MTYgZHgsCiAJCQkJICAgICAgdTE2IGR5LCB1MTYgd2lkdGgsIHUxNiBoZWlnaHQsIHUxNiByb3AsCiAJCQkJICAgICAgdTMyIG1hc2tfYWRkcikKQEAgLTEwMCw2ICs4NSw4IEBACiAJdTMyIHNhZGRyLCBkYWRkcjsKIAl1MzIgbWFkZHIgPSAwOwogCisJaGVpZ2h0LS07CisJd2lkdGgtLTsKIAlmYl93cml0ZXcocm9wLCBIRDY0NDYxX0JCVFJPUFIpOwogCWlmICgoc3kgPCBkeSkgfHwgKChzeSA9PSBkeSkgJiYgKHN4IDw9IGR4KSkpIHsKIAkJc2FkZHIgPSBXSURUSCAqIChzeSArIGhlaWdodCkgKyBzeCArIHdpZHRoOwpAQCAtMTQ2LDYgKzEzMyw3IEBACiAJaWYgKHJlY3QtPnJvcCAhPSBST1BfQ09QWSkKIAkJY2ZiX2ZpbGxyZWN0KHAsIHJlY3QpOwogCWVsc2UgeworCQloaXRmYl9hY2NlbF93YWl0KCk7CiAJCWZiX3dyaXRldygweDAwZjAsIEhENjQ0NjFfQkJUUk9QUik7CiAJCWZiX3dyaXRldygxNiwgSEQ2NDQ2MV9CQlRNRFIpOwogCkBAIC0xNjEsMTYgKzE0OSwxNSBAQAogCQkJCQkgICAgIHJlY3QtPmhlaWdodCk7CiAJCQloaXRmYl9hY2NlbF9zdGFydCgwKTsKIAkJfQotCQloaXRmYl9hY2NlbF93YWl0KCk7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBoaXRmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqcCwgY29uc3Qgc3RydWN0IGZiX2NvcHlhcmVhICphcmVhKQogeworCWhpdGZiX2FjY2VsX3dhaXQoKTsKIAloaXRmYl9hY2NlbF9iaXRibHQocC0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDE2LCBhcmVhLT5zeCwgYXJlYS0+c3ksCiAJCQkgICBhcmVhLT5keCwgYXJlYS0+ZHksIGFyZWEtPndpZHRoLCBhcmVhLT5oZWlnaHQsCiAJCQkgICAweDAwY2MsIDApOwotCWhpdGZiX2FjY2VsX3dhaXQoKTsKIH0KIAogc3RhdGljIGludCBoaXRmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKQEAgLTE4Miw3ICsxNjksNyBAQAogCWlmICh4b2Zmc2V0ICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZmJfd3JpdGV3KHlvZmZzZXQsIEhENjQ0NjFfTENEQ0JBUik7CisJZmJfd3JpdGV3KCh5b2Zmc2V0KmluZm8tPmZpeC5saW5lX2xlbmd0aCk+PjEwLCBIRDY0NDYxX0xDRENCQVIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTIsMTIgKzE3OSw2IEBACiAJdW5zaWduZWQgc2hvcnQgdjsKIAogCWlmIChibGFua19tb2RlKSB7Ci0jaWZkZWYgTUFDSF9IUDYwMAotCQlzaF9kYWNfZGlzYWJsZShEQUNfTENEX0JSSUdIVE5FU1MpOwotCQl2ID0gZmJfcmVhZHcoSEQ2NDQ2MV9HUEJEUik7Ci0JCXYgfD0gSEQ2NDQ2MV9HUEJEUl9MQ0RPRkY7Ci0JCWZiX3dyaXRldyh2LCBIRDY0NDYxX0dQQkRSKTsKLSNlbmRpZgogCQl2ID0gZmJfcmVhZHcoSEQ2NDQ2MV9MRFIxKTsKIAkJdiAmPSB+SEQ2NDQ2MV9MRFIxX0RPTjsKIAkJZmJfd3JpdGV3KHYsIEhENjQ0NjFfTERSMSk7CkBAIC0yMTMsMTkgKzE5NCwxOCBAQAogCQl2ID0gZmJfcmVhZHcoSEQ2NDQ2MV9TVEJDUik7CiAJCXYgJj0gfkhENjQ0NjFfU1RCQ1JfU0xDRFNUOwogCQlmYl93cml0ZXcodiwgSEQ2NDQ2MV9TVEJDUik7Ci0jaWZkZWYgTUFDSF9IUDYwMAotCQlzaF9kYWNfZW5hYmxlKERBQ19MQ0RfQlJJR0hUTkVTUyk7Ci0JCXYgPSBmYl9yZWFkdyhIRDY0NDYxX0dQQkRSKTsKLQkJdiAmPSB+SEQ2NDQ2MV9HUEJEUl9MQ0RPRkY7Ci0JCWZiX3dyaXRldyh2LCBIRDY0NDYxX0dQQkRSKTsKLSNlbmRpZgorCisJCXYgPSBmYl9yZWFkdyhIRDY0NDYxX0xDRENDUik7CisJCXYgJj0gfihIRDY0NDYxX0xDRENDUl9NT0ZGIHwgSEQ2NDQ2MV9MQ0RDQ1JfU1RSRVEpOworCQlmYl93cml0ZXcodiwgSEQ2NDQ2MV9MQ0RDQ1IpOworCisJCWRvIHsKKwkJICAgIHYgPSBmYl9yZWFkdyhIRDY0NDYxX0xDRENDUik7CisJCX0gd2hpbGUodiZIRDY0NDYxX0xDRENDUl9TVEJBQ0spOworCiAJCXYgPSBmYl9yZWFkdyhIRDY0NDYxX0xEUjEpOwogCQl2IHw9IEhENjQ0NjFfTERSMV9ET047CiAJCWZiX3dyaXRldyh2LCBIRDY0NDYxX0xEUjEpOwotCi0JCXYgPSBmYl9yZWFkdyhIRDY0NDYxX0xDRENDUik7Ci0JCXYgJj0gfkhENjQ0NjFfTENEQ0NSX01PRkY7Ci0JCWZiX3dyaXRldyh2LCBIRDY0NDYxX0xDRENDUik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjMzLDcgKzIxMyw3IEBACiBzdGF0aWMgaW50IGhpdGZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKIAkJCSAgIHVuc2lnbmVkIGJsdWUsIHVuc2lnbmVkIHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7Ci0JaWYgKHJlZ25vID49IGluZm8tPmNtYXAubGVuKQorCWlmIChyZWdubyA+PSAyNTYpCiAJCXJldHVybiAxOwogCiAJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKQEAgLTI0NCw2ICsyMjQsOCBAQAogCQlmYl93cml0ZXcoYmx1ZSA+PiAxMCwgSEQ2NDQ2MV9DUFRXRFIpOwogCQlicmVhazsKIAljYXNlIDE2OgorCQlpZiAocmVnbm8gPj0gMTYpCisJCQlyZXR1cm4gMTsKIAkJKCh1MzIgKikgKGluZm8tPnBzZXVkb19wYWxldHRlKSlbcmVnbm9dID0KIAkJICAgICgocmVkICYgMHhmODAwKSkgfAogCQkgICAgKChncmVlbiAmIDB4ZmMwMCkgPj4gNSkgfCAoKGJsdWUgJiAweGY4MDApID4+IDExKTsKQEAgLTI1MiwyNiArMjM0LDExMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGhpdGZiX3N5bmMoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJaGl0ZmJfYWNjZWxfd2FpdCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGl0ZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwlpbnQgbWF4eTsKKworCXZhci0+eHJlcyA9IGluZm8tPnZhci54cmVzOworCXZhci0+eHJlc192aXJ0dWFsID0gaW5mby0+dmFyLnhyZXM7CisJdmFyLT55cmVzID0gaW5mby0+dmFyLnlyZXM7CisKKwlpZiAoKHZhci0+Yml0c19wZXJfcGl4ZWwgIT0gOCkgJiYgKHZhci0+Yml0c19wZXJfcGl4ZWwgIT0gMTYpKQorCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOworCisJaWYgKHZhci0+eXJlc192aXJ0dWFsIDwgdmFyLT55cmVzKQorCQl2YXItPnlyZXNfdmlydHVhbCA9IHZhci0+eXJlczsKKworCW1heHkgPSBpbmZvLT5maXguc21lbV9sZW4gLyB2YXItPnhyZXM7CisKKwlpZiAodmFyLT5iaXRzX3Blcl9waXhlbCA9PSAxNikKKwkJbWF4eSAvPSAyOworCisJaWYgKHZhci0+eXJlc192aXJ0dWFsID4gbWF4eSkKKwkJdmFyLT55cmVzX3ZpcnR1YWwgPSBtYXh5OworCisJdmFyLT54b2Zmc2V0ID0gMDsKKwl2YXItPnlvZmZzZXQgPSAwOworCisJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSA4OgorCQl2YXItPnJlZC5vZmZzZXQgPSAwOworCQl2YXItPnJlZC5sZW5ndGggPSA4OworCQl2YXItPmdyZWVuLm9mZnNldCA9IDA7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+Ymx1ZS5sZW5ndGggPSA4OworCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOworCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOworCQlicmVhazsKKwljYXNlIDE2OgkJLyogUkdCIDU2NSAqLworCQl2YXItPnJlZC5vZmZzZXQgPSAxMTsKKwkJdmFyLT5yZWQubGVuZ3RoID0gNTsKKwkJdmFyLT5ncmVlbi5vZmZzZXQgPSA1OworCQl2YXItPmdyZWVuLmxlbmd0aCA9IDY7CisJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOworCQl2YXItPmJsdWUubGVuZ3RoID0gNTsKKwkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKKwkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGl0ZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwl1bnNpZ25lZCBzaG9ydCBsZHIzOworCisJc3dpdGNoIChpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpIHsKKwljYXNlIDg6CisJCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IGluZm8tPnZhci54cmVzOworCQlpbmZvLT5maXgudmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOworCQlpbmZvLT5maXgueXBhbnN0ZXAgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gaW5mby0+dmFyLnhyZXMqMjsKKwkJaW5mby0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJCWluZm8tPmZpeC55cGFuc3RlcCA9IDg7CisJCWJyZWFrOworCX0KKworCWZiX3dyaXRldyhpbmZvLT5maXgubGluZV9sZW5ndGgsIEhENjQ0NjFfTENEQ0xPUik7CisJbGRyMyA9IGZiX3JlYWR3KEhENjQ0NjFfTERSMyk7CisJbGRyMyAmPSB+MTU7CisJbGRyMyB8PSAoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID09IDgpID8gNCA6IDg7CisJZmJfd3JpdGV3KGxkcjMsIEhENjQ0NjFfTERSMyk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZmJfb3BzIGhpdGZiX29wcyA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmZiX2NoZWNrX3Zhcgk9IGhpdGZiX2NoZWNrX3ZhciwKKwkuZmJfc2V0X3BhcgkJPSBoaXRmYl9zZXRfcGFyLAogCS5mYl9zZXRjb2xyZWcJPSBoaXRmYl9zZXRjb2xyZWcsCiAJLmZiX2JsYW5rCT0gaGl0ZmJfYmxhbmssCisJLmZiX3N5bmMJPSBoaXRmYl9zeW5jLAogCS5mYl9wYW5fZGlzcGxheSA9IGhpdGZiX3Bhbl9kaXNwbGF5LAogCS5mYl9maWxscmVjdAk9IGhpdGZiX2ZpbGxyZWN0LAogCS5mYl9jb3B5YXJlYQk9IGhpdGZiX2NvcHlhcmVhLAogCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0LAogfTsKIAotaW50IF9faW5pdCBoaXRmYl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBoaXRmYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCiB7CiAJdW5zaWduZWQgc2hvcnQgbGNkY2xvciwgbGRyMywgbGR2bmRyOwotCWludCBzaXplOwogCiAJaWYgKGZiX2dldF9vcHRpb25zKCJoaXRmYiIsIE5VTEwpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCWhpdGZiX2ZpeC5tbWlvX3N0YXJ0ID0gQ09ORklHX0hENjQ0NjFfSU9CQVNFKzB4MTAwMDsKKwloaXRmYl9maXgubW1pb19sZW4gPSAweDEwMDA7CiAJaGl0ZmJfZml4LnNtZW1fc3RhcnQgPSBDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyAweDAyMDAwMDAwOwotCWhpdGZiX2ZpeC5zbWVtX2xlbiA9IChNQUNIX0hQNjkwKSA/IDEwMjQgKiAxMDI0IDogNTEyICogMTAyNDsKKwloaXRmYl9maXguc21lbV9sZW4gPSA1MTIgKiAxMDI0OwogCiAJbGNkY2xvciA9IGZiX3JlYWR3KEhENjQ0NjFfTENEQ0xPUik7CiAJbGR2bmRyID0gZmJfcmVhZHcoSEQ2NDQ2MV9MRFZORFIpOwpAQCAtMzIxLDEyICszOTAsMTIgQEAKIAlmYl9pbmZvLnZhciA9IGhpdGZiX3ZhcjsKIAlmYl9pbmZvLmZpeCA9IGhpdGZiX2ZpeDsKIAlmYl9pbmZvLnBzZXVkb19wYWxldHRlID0gcHNldWRvX3BhbGV0dGU7Ci0JZmJfaW5mby5mbGFncyA9IEZCSU5GT19ERUZBVUxUOworCWZiX2luZm8uZmxhZ3MgPSBGQklORk9fREVGQVVMVCB8IEZCSU5GT19IV0FDQ0VMX1lQQU4gfAorCQlGQklORk9fSFdBQ0NFTF9GSUxMUkVDVCB8IEZCSU5GT19IV0FDQ0VMX0NPUFlBUkVBOwogCiAJZmJfaW5mby5zY3JlZW5fYmFzZSA9ICh2b2lkICopaGl0ZmJfZml4LnNtZW1fc3RhcnQ7CiAKLQlzaXplID0gKGZiX2luZm8udmFyLmJpdHNfcGVyX3BpeGVsID09IDgpID8gMjU2IDogMTY7Ci0JZmJfYWxsb2NfY21hcCgmZmJfaW5mby5jbWFwLCBzaXplLCAwKTsKKwlmYl9hbGxvY19jbWFwKCZmYl9pbmZvLmNtYXAsIDI1NiwgMCk7CiAKIAlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoJmZiX2luZm8pIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMzYsOSArNDA1LDc1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgX19kZXZleGl0IGhpdGZiX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHVucmVnaXN0ZXJfZnJhbWVidWZmZXIoJmZiX2luZm8pOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGhpdGZiX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJdTE2IHY7CisKKwloaXRmYl9ibGFuaygxLDApOworCXYgPSBmYl9yZWFkdyhIRDY0NDYxX1NUQkNSKTsKKwl2IHw9IEhENjQ0NjFfU1RCQ1JfU0xDS0VfSVNUOworCWZiX3dyaXRldyh2LCBIRDY0NDYxX1NUQkNSKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhpdGZiX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJdTE2IHY7CisKKwl2ID0gZmJfcmVhZHcoSEQ2NDQ2MV9TVEJDUik7CisJdiAmPSB+SEQ2NDQ2MV9TVEJDUl9TTENLRV9PU1Q7CisJbXNsZWVwKDEwMCk7CisJdiA9IGZiX3JlYWR3KEhENjQ0NjFfU1RCQ1IpOworCXYgJj0gfkhENjQ0NjFfU1RCQ1JfU0xDS0VfSVNUOworCWZiX3dyaXRldyh2LCBIRDY0NDYxX1NUQkNSKTsKKwloaXRmYl9ibGFuaygwLDApOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaGl0ZmJfZHJpdmVyID0geworCS5wcm9iZQkJPSBoaXRmYl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGhpdGZiX3JlbW92ZSksCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBoaXRmYl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gaGl0ZmJfcmVzdW1lLAorI2VuZGlmCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImhpdGZiIiwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaGl0ZmJfZGV2aWNlID0geworCS5uYW1lCT0gImhpdGZiIiwKKwkuaWQJPSAtMSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGhpdGZiX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZoaXRmYl9kcml2ZXIpOworCWlmICghcmV0KSB7CisJCXJldCA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaGl0ZmJfZGV2aWNlKTsKKwkJaWYgKHJldCkKKwkJCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZoaXRmYl9kcml2ZXIpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisKIHN0YXRpYyB2b2lkIF9fZXhpdCBoaXRmYl9leGl0KHZvaWQpCiB7Ci0JdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcigmZmJfaW5mbyk7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJmhpdGZiX2RldmljZSk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmhpdGZiX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGhpdGZiX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9pODEwL2k4MTAtaTJjLmMgYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMC1pMmMuYwppbmRleCBjMWY3YjQ5Li43ZDA2YjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMC1pMmMuYworKysgYi9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMC1pMmMuYwpAQCAtOTgsNyArOTgsNiBAQAogCWNoYW4tPmFsZ28uZ2V0c2RhICAgICAgICAgICAgICAgPSBpODEwaTJjX2dldHNkYTsKIAljaGFuLT5hbGdvLmdldHNjbCAgICAgICAgICAgICAgID0gaTgxMGkyY19nZXRzY2w7CiAJY2hhbi0+YWxnby51ZGVsYXkgICAgICAgICAgICAgICA9IDEwOwotCWNoYW4tPmFsZ28ubWRlbGF5ICAgICAgICAgICAgICAgPSAxMDsKICAgICAgICAgY2hhbi0+YWxnby50aW1lb3V0ICAgICAgICAgICAgICA9IChIWi8yKTsKICAgICAgICAgY2hhbi0+YWxnby5kYXRhICAgICAgICAgICAgICAgICA9IGNoYW47CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX21haW4uYyBiL2RyaXZlcnMvdmlkZW8vaTgxMC9pODEwX21haW4uYwppbmRleCBhNmNhMDJmLi5kNDJlZGFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2k4MTAvaTgxMF9tYWluLmMKKysrIGIvZHJpdmVycy92aWRlby9pODEwL2k4MTBfbWFpbi5jCkBAIC0xNTU0LDE1ICsxNTU0LDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgICAgICAgIFBvd2VyIE1hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGludCBpODEwZmJfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IGk4MTBmYl9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGk4MTBmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKIAotCXBhci0+Y3VyX3N0YXRlID0gc3RhdGUuZXZlbnQ7CisJcGFyLT5jdXJfc3RhdGUgPSBtZXNnLmV2ZW50OwogCi0JaWYgKHN0YXRlLmV2ZW50ID09IFBNX0VWRU5UX0ZSRUVaRSkgewotCQlkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOworCXN3aXRjaCAobWVzZy5ldmVudCkgeworCWNhc2UgUE1fRVZFTlRfRlJFRVpFOgorCWNhc2UgUE1fRVZFTlRfUFJFVEhBVzoKKwkJZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBtZXNnOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE1NzgsNyArMTU4MCw3IEBACiAKIAlwY2lfc2F2ZV9zdGF0ZShkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwotCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBwY2lfY2hvb3NlX3N0YXRlKGRldiwgc3RhdGUpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgcGNpX2Nob29zZV9zdGF0ZShkZXYsIG1lc2cpKTsKIAlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L2kyYy1tYXRyb3hmYi5jIGIvZHJpdmVycy92aWRlby9tYXRyb3gvaTJjLW1hdHJveGZiLmMKaW5kZXggNTdhYmJhZS4uNzk1YzFhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9tYXRyb3gvaTJjLW1hdHJveGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9tYXRyb3gvaTJjLW1hdHJveGZiLmMKQEAgLTk1LDEyICs5NSwxMiBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIG1hdHJveF9pMmNfYWxnb190ZW1wbGF0ZSA9CiB7Ci0JTlVMTCwKLQltYXRyb3hmYl9ncGlvX3NldHNkYSwKLQltYXRyb3hmYl9ncGlvX3NldHNjbCwKLQltYXRyb3hmYl9ncGlvX2dldHNkYSwKLQltYXRyb3hmYl9ncGlvX2dldHNjbCwKLQkxMCwgMTAsIDEwMCwKKwkuc2V0c2RhCQk9IG1hdHJveGZiX2dwaW9fc2V0c2RhLAorCS5zZXRzY2wJCT0gbWF0cm94ZmJfZ3Bpb19zZXRzY2wsCisJLmdldHNkYQkJPSBtYXRyb3hmYl9ncGlvX2dldHNkYSwKKwkuZ2V0c2NsCQk9IG1hdHJveGZiX2dwaW9fZ2V0c2NsLAorCS51ZGVsYXkJCT0gMTAsCisJLnRpbWVvdXQJPSAxMDAsCiB9OwogCiBzdGF0aWMgaW50IGkyY19idXNfcmVnKHN0cnVjdCBpMmNfYml0X2FkYXB0ZXIqIGIsIHN0cnVjdCBtYXRyb3hfZmJfaW5mbyogbWluZm8sIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZpZGlhLmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYwppbmRleCBkNGY4NTAxLi5mOGNkNGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYwpAQCAtOTUwLDI0ICs5NTAsMjUgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgbnZpZGlhZmJfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IG52aWRpYWZiX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IG1lc2cpCiB7CiAJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyID0gaW5mby0+cGFyOwogCisJaWYgKG1lc2cuZXZlbnQgPT0gUE1fRVZFTlRfUFJFVEhBVykKKwkJbWVzZy5ldmVudCA9IFBNX0VWRU5UX0ZSRUVaRTsKIAlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7Ci0JcGFyLT5wbV9zdGF0ZSA9IHN0YXRlLmV2ZW50OworCXBhci0+cG1fc3RhdGUgPSBtZXNnLmV2ZW50OwogCi0JaWYgKHN0YXRlLmV2ZW50ID09IFBNX0VWRU5UX0ZSRUVaRSkgewotCQlkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOwotCX0gZWxzZSB7CisJaWYgKG1lc2cuZXZlbnQgPT0gUE1fRVZFTlRfU1VTUEVORCkgewogCQlmYl9zZXRfc3VzcGVuZChpbmZvLCAxKTsKIAkJbnZpZGlhZmJfYmxhbmsoRkJfQkxBTktfUE9XRVJET1dOLCBpbmZvKTsKIAkJbnZpZGlhX3dyaXRlX3JlZ3MocGFyLCAmcGFyLT5TYXZlZFJlZyk7CiAJCXBjaV9zYXZlX3N0YXRlKGRldik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwotCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgcGNpX2Nob29zZV9zdGF0ZShkZXYsIHN0YXRlKSk7CisJCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBwY2lfY2hvb3NlX3N0YXRlKGRldiwgbWVzZykpOwogCX0KKwlkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IG1lc2c7CiAKIAlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3B2cjJmYi5jIGIvZHJpdmVycy92aWRlby9wdnIyZmIuYwppbmRleCA5NDBiYTJiLi43OGRjNTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL3B2cjJmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vcHZyMmZiLmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBpc19ibGFua2VkID0gMDsJCS8qIElzIHRoZSBzY3JlZW4gYmxhbmtlZD8gKi8KIAogI2lmZGVmIENPTkZJR19TSF9TVE9SRV9RVUVVRVMKLXN0YXRpYyBzdHJ1Y3Qgc3FfbWFwcGluZyAqcHZyMmZiX21hcDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHB2cjJmYl9tYXA7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TSF9ETUEKQEAgLTIxMywxNSArMjEzLDE3IEBACiBzdGF0aWMgaW50IHB2cjJfaW5pdF9jYWJsZSh2b2lkKTsKIHN0YXRpYyBpbnQgcHZyMl9nZXRfcGFyYW0oY29uc3Qgc3RydWN0IHB2cjJfcGFyYW1zICpwLCBjb25zdCBjaGFyICpzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWwsIGludCBzaXplKTsKKyNpZmRlZiBDT05GSUdfU0hfRE1BCiBzdGF0aWMgc3NpemVfdCBwdnIyZmJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBmYl9vcHMgcHZyMmZiX29wcyA9IHsKLQkub3duZXIgCQk9IFRISVNfTU9EVUxFLAotCS5mYl9zZXRjb2xyZWcgCT0gcHZyMmZiX3NldGNvbHJlZywKLQkuZmJfYmxhbmsgCT0gcHZyMmZiX2JsYW5rLAotCS5mYl9jaGVja192YXIgCT0gcHZyMmZiX2NoZWNrX3ZhciwKLQkuZmJfc2V0X3BhciAJPSBwdnIyZmJfc2V0X3BhciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmZiX3NldGNvbHJlZwk9IHB2cjJmYl9zZXRjb2xyZWcsCisJLmZiX2JsYW5rCT0gcHZyMmZiX2JsYW5rLAorCS5mYl9jaGVja192YXIJPSBwdnIyZmJfY2hlY2tfdmFyLAorCS5mYl9zZXRfcGFyCT0gcHZyMmZiX3NldF9wYXIsCiAjaWZkZWYgQ09ORklHX1NIX0RNQQogCS5mYl93cml0ZQk9IHB2cjJmYl93cml0ZSwKICNlbmRpZgpAQCAtNzgzLDcgKzc4NSw3IEBACiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKLQlmYl9tZW1zZXQoKHVuc2lnbmVkIGxvbmcpZmJfaW5mby0+c2NyZWVuX2Jhc2UsIDAsIHB2cjJfZml4LnNtZW1fbGVuKTsKKwlmYl9tZW1zZXQoZmJfaW5mby0+c2NyZWVuX2Jhc2UsIDAsIHB2cjJfZml4LnNtZW1fbGVuKTsKIAogCXB2cjJfZml4LnlwYW5zdGVwCT0gbm9wYW4gID8gMCA6IDE7CiAJcHZyMl9maXgueXdyYXBzdGVwCT0gbm93cmFwID8gMCA6IDE7CkBAIC04MjAsNyArODIyLDcgQEAKIAkgICAgICAgbW9kZW1lbXVzZWQgPj4gMTAsICh1bnNpZ25lZCBsb25nKShmYl9pbmZvLT5maXguc21lbV9sZW4gPj4gMTApKTsKIAlwcmludGsoImZiJWQ6IE1vZGUgJWR4JWQtJWQgcGl0Y2ggPSAlbGQgY2FibGU6ICVzIHZpZGVvIG91dHB1dDogJXNcbiIsIAogCSAgICAgICBmYl9pbmZvLT5ub2RlLCBmYl9pbmZvLT52YXIueHJlcywgZmJfaW5mby0+dmFyLnlyZXMsCi0JICAgICAgIGZiX2luZm8tPnZhci5iaXRzX3Blcl9waXhlbCwgCisJICAgICAgIGZiX2luZm8tPnZhci5iaXRzX3Blcl9waXhlbCwKIAkgICAgICAgZ2V0X2xpbmVfbGVuZ3RoKGZiX2luZm8tPnZhci54cmVzLCBmYl9pbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpLAogCSAgICAgICAoY2hhciAqKXB2cjJfZ2V0X3BhcmFtKGNhYmxlcywgTlVMTCwgY2FibGVfdHlwZSwgMyksCiAJICAgICAgIChjaGFyICopcHZyMl9nZXRfcGFyYW0ob3V0cHV0cywgTlVMTCwgdmlkZW9fb3V0cHV0LCAzKSk7CkBAIC04MjksMTAgKzgzMSwxMCBAQAogCXByaW50ayhLRVJOX05PVElDRSAiZmIlZDogcmVnaXN0ZXJpbmcgd2l0aCBTUSBBUElcbiIsIGZiX2luZm8tPm5vZGUpOwogCiAJcHZyMmZiX21hcCA9IHNxX3JlbWFwKGZiX2luZm8tPmZpeC5zbWVtX3N0YXJ0LCBmYl9pbmZvLT5maXguc21lbV9sZW4sCi0JCQkgICAgICBmYl9pbmZvLT5maXguaWQpOworCQkJICAgICAgZmJfaW5mby0+Zml4LmlkLCBwZ3Byb3RfdmFsKFBBR0VfU0hBUkVEKSk7CiAKIAlwcmludGsoS0VSTl9OT1RJQ0UgImZiJWQ6IE1hcHBlZCB2aWRlbyBtZW1vcnkgdG8gU1EgYWRkciAweCVseFxuIiwKLQkgICAgICAgZmJfaW5mby0+bm9kZSwgcHZyMmZiX21hcC0+c3FfYWRkcik7CisJICAgICAgIGZiX2luZm8tPm5vZGUsIHB2cjJmYl9tYXApOwogI2VuZGlmCiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiLWkyYy5jIGIvZHJpdmVycy92aWRlby9zYXZhZ2Uvc2F2YWdlZmItaTJjLmMKaW5kZXggZTgzYmVmZC4uZDdkODEwZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiLWkyYy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiLWkyYy5jCkBAIC0xNDgsNyArMTQ4LDYgQEAKIAkJY2hhbi0+YWRhcHRlci5hbGdvX2RhdGEJCT0gJmNoYW4tPmFsZ287CiAJCWNoYW4tPmFkYXB0ZXIuZGV2LnBhcmVudAk9ICZjaGFuLT5wYXItPnBjaWRldi0+ZGV2OwogCQljaGFuLT5hbGdvLnVkZWxheQkJPSA0MDsKLQkJY2hhbi0+YWxnby5tZGVsYXkgICAgICAgICAgICAgICA9IDU7CiAJCWNoYW4tPmFsZ28udGltZW91dAkJPSAyMDsKIAkJY2hhbi0+YWxnby5kYXRhIAkJPSBjaGFuOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3NhdmFnZS9zYXZhZ2VmYl9kcml2ZXIuYyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCmluZGV4IDQ2MWUwOTQuLjgyYjNkZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvdmlkZW8vc2F2YWdlL3NhdmFnZWZiX2RyaXZlci5jCkBAIC0yMzIzLDI0ICsyMzIzLDI0IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHNhdmFnZWZiX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBzYXZhZ2VmYl9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQogewogCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHNhdmFnZWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwogCiAJREJHKCJzYXZhZ2VmYl9zdXNwZW5kIik7CiAKLQotCXBhci0+cG1fc3RhdGUgPSBzdGF0ZS5ldmVudDsKKwlpZiAobWVzZy5ldmVudCA9PSBQTV9FVkVOVF9QUkVUSEFXKQorCQltZXNnLmV2ZW50ID0gUE1fRVZFTlRfRlJFRVpFOworCXBhci0+cG1fc3RhdGUgPSBtZXNnLmV2ZW50OworCWRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gbWVzZzsKIAogCS8qCiAJICogRm9yIFBNX0VWRU5UX0ZSRUVaRSwgZG8gbm90IHBvd2VyIGRvd24gc28gdGhlIGNvbnNvbGUKIAkgKiBjYW4gcmVtYWluIGFjdGl2ZS4KIAkgKi8KLQlpZiAoc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfRlJFRVpFKSB7Ci0JCWRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7CisJaWYgKG1lc2cuZXZlbnQgPT0gUE1fRVZFTlRfRlJFRVpFKQogCQlyZXR1cm4gMDsKLQl9CiAKIAlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CiAJZmJfc2V0X3N1c3BlbmQoaW5mbywgMSk7CkBAIC0yMzUzLDcgKzIzNTMsNyBAQAogCXNhdmFnZV9kaXNhYmxlX21taW8ocGFyKTsKIAlwY2lfc2F2ZV9zdGF0ZShkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwotCXBjaV9zZXRfcG93ZXJfc3RhdGUoZGV2LCBwY2lfY2hvb3NlX3N0YXRlKGRldiwgc3RhdGUpKTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgcGNpX2Nob29zZV9zdGF0ZShkZXYsIG1lc2cpKTsKIAlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19pbm9kZS5jIGIvZnMvOXAvdmZzX2lub2RlLmMKaW5kZXggZWFlNTBjOS4uN2E3ZWMyZCAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2lub2RlLmMKKysrIGIvZnMvOXAvdmZzX2lub2RlLmMKQEAgLTIwNCw3ICsyMDQsNiBAQAogCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CiAJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOwotCQlpbm9kZS0+aV9ibGtzaXplID0gc2ItPnNfYmxvY2tzaXplOwogCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9yZGV2ID0gMDsKIAkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwpAQCAtOTUwLDkgKzk0OSw4IEBACiAKIAlpbm9kZS0+aV9zaXplID0gc3RhdC0+bGVuZ3RoOwogCi0JaW5vZGUtPmlfYmxrc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKIAlpbm9kZS0+aV9ibG9ja3MgPQotCSAgICAoaW5vZGUtPmlfc2l6ZSArIGlub2RlLT5pX2Jsa3NpemUgLSAxKSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwkgICAgKGlub2RlLT5pX3NpemUgKyBzYi0+c19ibG9ja3NpemUgLSAxKSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZwppbmRleCBhMjcwMDI2Li5kMzExMTk4IDEwMDY0NAotLS0gYS9mcy9LY29uZmlnCisrKyBiL2ZzL0tjb25maWcKQEAgLTgyNiw2ICs4MjYsMjUgQEAKICAgICAgICAgaGVscAogICAgICAgICBFeHBvcnRzIHRoZSBkdW1wIGltYWdlIG9mIGNyYXNoZWQga2VybmVsIGluIEVMRiBmb3JtYXQuCiAKK2NvbmZpZyBQUk9DX1NZU0NUTAorCWJvb2wgIlN5c2N0bCBzdXBwb3J0ICgvcHJvYy9zeXMpIiBpZiBFTUJFRERFRAorCWRlcGVuZHMgb24gUFJPQ19GUworCXNlbGVjdCBTWVNDVEwKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBUaGUgc3lzY3RsIGludGVyZmFjZSBwcm92aWRlcyBhIG1lYW5zIG9mIGR5bmFtaWNhbGx5IGNoYW5naW5nCisJICBjZXJ0YWluIGtlcm5lbCBwYXJhbWV0ZXJzIGFuZCB2YXJpYWJsZXMgb24gdGhlIGZseSB3aXRob3V0IHJlcXVpcmluZworCSAgYSByZWNvbXBpbGUgb2YgdGhlIGtlcm5lbCBvciByZWJvb3Qgb2YgdGhlIHN5c3RlbS4gIFRoZSBwcmltYXJ5CisJICBpbnRlcmZhY2UgaXMgdGhyb3VnaCAvcHJvYy9zeXMuICBJZiB5b3Ugc2F5IFkgaGVyZSBhIHRyZWUgb2YKKwkgIG1vZGlmaWFibGUgc3lzY3RsIGVudHJpZXMgd2lsbCBiZSBnZW5lcmF0ZWQgYmVuZWF0aCB0aGUKKyAgICAgICAgICAvcHJvYy9zeXMgZGlyZWN0b3J5LiBUaGV5IGFyZSBleHBsYWluZWQgaW4gdGhlIGZpbGVzCisJICBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL3N5c2N0bC8+LiAgTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMKKwkgIG9wdGlvbiB3aWxsIGVubGFyZ2UgdGhlIGtlcm5lbCBieSBhdCBsZWFzdCA4IEtCLgorCisJICBBcyBpdCBpcyBnZW5lcmFsbHkgYSBnb29kIHRoaW5nLCB5b3Ugc2hvdWxkIHNheSBZIGhlcmUgdW5sZXNzCisJICBidWlsZGluZyBhIGtlcm5lbCBmb3IgaW5zdGFsbC9yZXNjdWUgZGlza3Mgb3IgeW91ciBzeXN0ZW0gaXMgdmVyeQorCSAgbGltaXRlZCBpbiBtZW1vcnkuCisKIGNvbmZpZyBTWVNGUwogCWJvb2wgInN5c2ZzIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGlmIEVNQkVEREVECiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9mcy9hZGZzL2lub2RlLmMgYi9mcy9hZGZzL2lub2RlLmMKaW5kZXggNTM0ZjNlZS4uN2U3YTA0YiAxMDA2NDQKLS0tIGEvZnMvYWRmcy9pbm9kZS5jCisrKyBiL2ZzL2FkZnMvaW5vZGUuYwpAQCAtMjY5LDcgKzI2OSw2IEBACiAJaW5vZGUtPmlfaW5vCSA9IG9iai0+ZmlsZV9pZDsKIAlpbm9kZS0+aV9zaXplCSA9IG9iai0+c2l6ZTsKIAlpbm9kZS0+aV9ubGluawkgPSAyOwotCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7CiAJaW5vZGUtPmlfYmxvY2tzCSA9IChpbm9kZS0+aV9zaXplICsgc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4KIAkJCSAgICBzYi0+c19ibG9ja3NpemVfYml0czsKIApkaWZmIC0tZ2l0IGEvZnMvYWRmcy9zdXBlci5jIGIvZnMvYWRmcy9zdXBlci5jCmluZGV4IDgyMDExMDEuLjlhZGUxMzkgMTAwNjQ0Ci0tLSBhL2ZzL2FkZnMvc3VwZXIuYworKysgYi9mcy9hZGZzL3N1cGVyLmMKQEAgLTI1MSw4ICsyNTEsNyBAQAogCiBzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKIHsKLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGFkZnNfaW5vZGVfY2FjaGVwKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYWRmc19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworCWttZW1fY2FjaGVfZGVzdHJveShhZGZzX2lub2RlX2NhY2hlcCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBhZGZzX3NvcHMgPSB7CkBAIC0zMzksMTEgKzMzOCwxMCBAQAogCiAJc2ItPnNfZmxhZ3MgfD0gTVNfTk9ESVJBVElNRTsKIAotCWFzYiA9IGttYWxsb2Moc2l6ZW9mKCphc2IpLCBHRlBfS0VSTkVMKTsKKwlhc2IgPSBremFsbG9jKHNpemVvZigqYXNiKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhc2IpCiAJCXJldHVybiAtRU5PTUVNOwogCXNiLT5zX2ZzX2luZm8gPSBhc2I7Ci0JbWVtc2V0KGFzYiwgMCwgc2l6ZW9mKCphc2IpKTsKIAogCS8qIHNldCBkZWZhdWx0IG9wdGlvbnMgKi8KIAlhc2ItPnNfdWlkID0gMDsKZGlmZiAtLWdpdCBhL2ZzL2FmZnMvc3VwZXIuYyBiL2ZzL2FmZnMvc3VwZXIuYwppbmRleCAxNzM1MjAxLi41ZWE3MmMzIDEwMDY0NAotLS0gYS9mcy9hZmZzL3N1cGVyLmMKKysrIGIvZnMvYWZmcy9zdXBlci5jCkBAIC0xMDksOCArMTA5LDcgQEAKIAogc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCiB7Ci0JaWYgKGttZW1fY2FjaGVfZGVzdHJveShhZmZzX2lub2RlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gImFmZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koYWZmc19pbm9kZV9jYWNoZXApOwogfQogCiBzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgYWZmc19zb3BzID0gewpAQCAtMjgwLDExICsyNzksMTAgQEAKIAlzYi0+c19vcCAgICAgICAgICAgICAgICA9ICZhZmZzX3NvcHM7CiAJc2ItPnNfZmxhZ3MgfD0gTVNfTk9ESVJBVElNRTsKIAotCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZmZzX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlzYmkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWZmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpCiAJCXJldHVybiAtRU5PTUVNOwogCXNiLT5zX2ZzX2luZm8gPSBzYmk7Ci0JbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKCpzYmkpKTsKIAlpbml0X01VVEVYKCZzYmktPnNfYm1sb2NrKTsKIAogCWlmICghcGFyc2Vfb3B0aW9ucyhkYXRhLCZ1aWQsJmdpZCwmaSwmcmVzZXJ2ZWQsJnJvb3RfYmxvY2ssCmRpZmYgLS1naXQgYS9mcy9hZnMvaW5vZGUuYyBiL2ZzL2Fmcy9pbm9kZS5jCmluZGV4IDRlYmIzMGEuLjZmMzc3NTQgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9pbm9kZS5jCisrKyBiL2ZzL2Fmcy9pbm9kZS5jCkBAIC03Miw3ICs3Miw2IEBACiAJaW5vZGUtPmlfY3RpbWUudHZfc2VjCT0gdm5vZGUtPnN0YXR1cy5tdGltZV9zZXJ2ZXI7CiAJaW5vZGUtPmlfY3RpbWUudHZfbnNlYwk9IDA7CiAJaW5vZGUtPmlfYXRpbWUJCT0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZTsKLQlpbm9kZS0+aV9ibGtzaXplCT0gUEFHRV9DQUNIRV9TSVpFOwogCWlub2RlLT5pX2Jsb2NrcwkJPSAwOwogCWlub2RlLT5pX3ZlcnNpb24JPSB2bm9kZS0+ZmlkLnVuaXF1ZTsKIAlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcwk9ICZhZnNfZnNfYW9wczsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy92bG9jYXRpb24uYyBiL2ZzL2Fmcy92bG9jYXRpb24uYwppbmRleCAzMzFmNzMwLi43ODJlZTdjIDEwMDY0NAotLS0gYS9mcy9hZnMvdmxvY2F0aW9uLmMKKysrIGIvZnMvYWZzL3Zsb2NhdGlvbi5jCkBAIC0yODEsMTEgKzI4MSwxMCBAQAogCXNwaW5fdW5sb2NrKCZjZWxsLT52bF9neWxvY2spOwogCiAJLyogbm90IGluIHRoZSBjZWxsJ3MgaW4tbWVtb3J5IGxpc3RzIC0gY3JlYXRlIGEgbmV3IHJlY29yZCAqLwotCXZsb2NhdGlvbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfdmxvY2F0aW9uKSwgR0ZQX0tFUk5FTCk7CisJdmxvY2F0aW9uID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFmc192bG9jYXRpb24pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZsb2NhdGlvbikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQltZW1zZXQodmxvY2F0aW9uLCAwLCBzaXplb2Yoc3RydWN0IGFmc192bG9jYXRpb24pKTsKIAlhdG9taWNfc2V0KCZ2bG9jYXRpb24tPnVzYWdlLCAxKTsKIAlJTklUX0xJU1RfSEVBRCgmdmxvY2F0aW9uLT5saW5rKTsKIAlyd2xvY2tfaW5pdCgmdmxvY2F0aW9uLT5sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy92b2x1bWUuYyBiL2ZzL2Fmcy92b2x1bWUuYwppbmRleCAwZmY0Yjg2Li43NjhjNmRiIDEwMDY0NAotLS0gYS9mcy9hZnMvdm9sdW1lLmMKKysrIGIvZnMvYWZzL3ZvbHVtZS5jCkBAIC0xODYsMTEgKzE4NiwxMCBAQAogCV9kZWJ1ZygiY3JlYXRpbmcgbmV3IHZvbHVtZSByZWNvcmQiKTsKIAogCXJldCA9IC1FTk9NRU07Ci0Jdm9sdW1lID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFmc192b2x1bWUpLCBHRlBfS0VSTkVMKTsKKwl2b2x1bWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWZzX3ZvbHVtZSksIEdGUF9LRVJORUwpOwogCWlmICghdm9sdW1lKQogCQlnb3RvIGVycm9yX3VwOwogCi0JbWVtc2V0KHZvbHVtZSwgMCwgc2l6ZW9mKHN0cnVjdCBhZnNfdm9sdW1lKSk7CiAJYXRvbWljX3NldCgmdm9sdW1lLT51c2FnZSwgMSk7CiAJdm9sdW1lLT50eXBlCQk9IHR5cGU7CiAJdm9sdW1lLT50eXBlX2ZvcmNlCT0gZm9yY2U7CmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvaW5vZGUuYyBiL2ZzL2F1dG9mcy9pbm9kZS5jCmluZGV4IGFmMmVmYmIuLjJjOTc1OWJhIDEwMDY0NAotLS0gYS9mcy9hdXRvZnMvaW5vZGUuYworKysgYi9mcy9hdXRvZnMvaW5vZGUuYwpAQCAtMTI5LDEwICsxMjksOSBAQAogCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpOwogCWludCBtaW5wcm90bywgbWF4cHJvdG87CiAKLQlzYmkgPSBrbWFsbG9jKHNpemVvZigqc2JpKSwgR0ZQX0tFUk5FTCk7CisJc2JpID0ga3phbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOwogCWlmICggIXNiaSApCiAJCWdvdG8gZmFpbF91bmxvY2s7Ci0JbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKCpzYmkpKTsKIAlEUFJJTlRLKCgiYXV0b2ZzOiBzdGFydGluZyB1cCwgc2JpID0gJXBcbiIsc2JpKSk7CiAKIAlzLT5zX2ZzX2luZm8gPSBzYmk7CkBAIC0yMTcsNyArMjE2LDYgQEAKIAlpbm9kZS0+aV9ubGluayA9IDI7CiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCWlub2RlLT5pX2Jsb2NrcyA9IDA7Ci0JaW5vZGUtPmlfYmxrc2l6ZSA9IDEwMjQ7CiAKIAlpZiAoIGlubyA9PSBBVVRPRlNfUk9PVF9JTk8gKSB7CiAJCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR08gfCBTX0lXVVNSOwpAQCAtMjQyLDcgKzI0MCw3IEBACiAJCQogCQlpbm9kZS0+aV9vcCA9ICZhdXRvZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwogCQlzbCA9ICZzYmktPnN5bWxpbmtbbl07Ci0JCWlub2RlLT51LmdlbmVyaWNfaXAgPSBzbDsKKwkJaW5vZGUtPmlfcHJpdmF0ZSA9IHNsOwogCQlpbm9kZS0+aV9tb2RlID0gU19JRkxOSyB8IFNfSVJXWFVHTzsKIAkJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gc2wtPm10aW1lOwogCQlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7CmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvc3ltbGluay5jIGIvZnMvYXV0b2ZzL3N5bWxpbmsuYwppbmRleCA1MmU4NzcyLi5jNzRmMmViIDEwMDY0NAotLS0gYS9mcy9hdXRvZnMvc3ltbGluay5jCisrKyBiL2ZzL2F1dG9mcy9zeW1saW5rLmMKQEAgLTE1LDcgKzE1LDcgQEAKIC8qIE5vdGhpbmcgdG8gcmVsZWFzZS4uICovCiBzdGF0aWMgdm9pZCAqYXV0b2ZzX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7Ci0JY2hhciAqcz0oKHN0cnVjdCBhdXRvZnNfc3ltbGluayAqKWRlbnRyeS0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwKS0+ZGF0YTsKKwljaGFyICpzPSgoc3RydWN0IGF1dG9mc19zeW1saW5rICopZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGUpLT5kYXRhOwogCW5kX3NldF9saW5rKG5kLCBzKTsKIAlyZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvaW5vZGUuYyBiL2ZzL2F1dG9mczQvaW5vZGUuYwppbmRleCAxMWE2YTlhLi44MDBjZTg3IDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L2lub2RlLmMKKysrIGIvZnMvYXV0b2ZzNC9pbm9kZS5jCkBAIC00NDcsNyArNDQ3LDYgQEAKIAkJaW5vZGUtPmlfdWlkID0gMDsKIAkJaW5vZGUtPmlfZ2lkID0gMDsKIAl9Ci0JaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIApkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9yb290LmMgYi9mcy9hdXRvZnM0L3Jvb3QuYwppbmRleCA1MTAwZjk4NC4uMjdlMTdmOSAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC9yb290LmMKKysrIGIvZnMvYXV0b2ZzNC9yb290LmMKQEAgLTEzNyw3ICsxMzcsOSBAQAogCQluZC5mbGFncyA9IExPT0tVUF9ESVJFQ1RPUlk7CiAJCXJldCA9IChkZW50cnktPmRfb3AtPmRfcmV2YWxpZGF0ZSkoZGVudHJ5LCAmbmQpOwogCi0JCWlmICghcmV0KSB7CisJCWlmIChyZXQgPD0gMCkgeworCQkJaWYgKHJldCA8IDApCisJCQkJc3RhdHVzID0gcmV0OwogCQkJZGNhY2hlX2Rpcl9jbG9zZShpbm9kZSwgZmlsZSk7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtNDAwLDEzICs0MDIsMjMgQEAKIAlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mczRfc2JpKGRpci0+aV9zYik7CiAJaW50IG96X21vZGUgPSBhdXRvZnM0X296X21vZGUoc2JpKTsKIAlpbnQgZmxhZ3MgPSBuZCA/IG5kLT5mbGFncyA6IDA7Ci0JaW50IHN0YXR1cyA9IDA7CisJaW50IHN0YXR1cyA9IDE7CiAKIAkvKiBQZW5kaW5nIGRlbnRyeSAqLwogCWlmIChhdXRvZnM0X2lzcGVuZGluZyhkZW50cnkpKSB7Ci0JCWlmICghb3pfbW9kZSkKLQkJCXN0YXR1cyA9IHRyeV90b19maWxsX2RlbnRyeShkZW50cnksIGZsYWdzKTsKLQkJcmV0dXJuICFzdGF0dXM7CisJCS8qIFRoZSBkYWVtb24gbmV2ZXIgY2F1c2VzIGEgbW91bnQgdG8gdHJpZ2dlciAqLworCQlpZiAob3pfbW9kZSkKKwkJCXJldHVybiAxOworCisJCS8qCisJCSAqIEEgemVybyBzdGF0dXMgaXMgc3VjY2VzcyBvdGhlcndpc2Ugd2UgaGF2ZSBhCisJCSAqIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisJCSAqLworCQlzdGF0dXMgPSB0cnlfdG9fZmlsbF9kZW50cnkoZGVudHJ5LCBmbGFncyk7CisJCWlmIChzdGF0dXMgPT0gMCkKKwkJCQlyZXR1cm4gMTsKKworCQlyZXR1cm4gc3RhdHVzOwogCX0KIAogCS8qIE5lZ2F0aXZlIGRlbnRyeS4uIGludmFsaWRhdGUgaWYgIm9sZCIgKi8KQEAgLTQyMSw5ICs0MzMsMTkgQEAKIAkJRFBSSU5USygiZGVudHJ5PSVwICUuKnMsIGVtcHR5ZGlyIiwKIAkJCSBkZW50cnksIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Ci0JCWlmICghb3pfbW9kZSkKLQkJCXN0YXR1cyA9IHRyeV90b19maWxsX2RlbnRyeShkZW50cnksIGZsYWdzKTsKLQkJcmV0dXJuICFzdGF0dXM7CisJCS8qIFRoZSBkYWVtb24gbmV2ZXIgY2F1c2VzIGEgbW91bnQgdG8gdHJpZ2dlciAqLworCQlpZiAob3pfbW9kZSkKKwkJCXJldHVybiAxOworCisJCS8qCisJCSAqIEEgemVybyBzdGF0dXMgaXMgc3VjY2VzcyBvdGhlcndpc2Ugd2UgaGF2ZSBhCisJCSAqIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisJCSAqLworCQlzdGF0dXMgPSB0cnlfdG9fZmlsbF9kZW50cnkoZGVudHJ5LCBmbGFncyk7CisJCWlmIChzdGF0dXMgPT0gMCkKKwkJCXJldHVybiAxOworCisJCXJldHVybiBzdGF0dXM7CiAJfQogCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CiAKZGlmZiAtLWdpdCBhL2ZzL2JlZnMvbGludXh2ZnMuYyBiL2ZzL2JlZnMvbGludXh2ZnMuYwppbmRleCA1MGNmY2E1Li41NzAyMGM3IDEwMDY0NAotLS0gYS9mcy9iZWZzL2xpbnV4dmZzLmMKKysrIGIvZnMvYmVmcy9saW51eHZmcy5jCkBAIC0zNjUsNyArMzY1LDYgQEAKIAlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsgICAvKiBsb3dlciAxNiBiaXRzIGFyZSBub3QgYSB0aW1lICovCQogCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWU7CiAJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZTsKLQlpbm9kZS0+aV9ibGtzaXplID0gYmVmc19zYi0+YmxvY2tfc2l6ZTsKIAogCWJlZnNfaW5vLT5pX2lub2RlX251bSA9IGZzcnVuX3RvX2NwdShzYiwgcmF3X2lub2RlLT5pbm9kZV9udW0pOwogCWJlZnNfaW5vLT5pX3BhcmVudCA9IGZzcnVuX3RvX2NwdShzYiwgcmF3X2lub2RlLT5wYXJlbnQpOwpAQCAtNDQ2LDkgKzQ0NSw3IEBACiBzdGF0aWMgdm9pZAogYmVmc19kZXN0cm95X2lub2RlY2FjaGUodm9pZCkKIHsKLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGJlZnNfaW5vZGVfY2FjaGVwKSkKLQkJcHJpbnRrKEtFUk5fRVJSICJiZWZzX2Rlc3Ryb3lfaW5vZGVjYWNoZTogIgotCQkgICAgICAgIm5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koYmVmc19pbm9kZV9jYWNoZXApOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvYmZzL2Rpci5jIGIvZnMvYmZzL2Rpci5jCmluZGV4IDI2ZmFkOTYuLmRjZjA0Y2IgMTAwNjQ0Ci0tLSBhL2ZzL2Jmcy9kaXIuYworKysgYi9mcy9iZnMvZGlyLmMKQEAgLTEwMiw3ICsxMDIsNyBAQAogCWlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOwogCWlub2RlLT5pX2dpZCA9IChkaXItPmlfbW9kZSAmIFNfSVNHSUQpID8gZGlyLT5pX2dpZCA6IGN1cnJlbnQtPmZzZ2lkOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7Ci0JaW5vZGUtPmlfYmxvY2tzID0gaW5vZGUtPmlfYmxrc2l6ZSA9IDA7CisJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAlpbm9kZS0+aV9vcCA9ICZiZnNfZmlsZV9pbm9wczsKIAlpbm9kZS0+aV9mb3AgPSAmYmZzX2ZpbGVfb3BlcmF0aW9uczsKIAlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZiZnNfYW9wczsKZGlmZiAtLWdpdCBhL2ZzL2Jmcy9pbm9kZS5jIGIvZnMvYmZzL2lub2RlLmMKaW5kZXggY2Y3NGYzZC4uZWQyN2ZmYiAxMDA2NDQKLS0tIGEvZnMvYmZzL2lub2RlLmMKKysrIGIvZnMvYmZzL2lub2RlLmMKQEAgLTc2LDcgKzc2LDYgQEAKIAlpbm9kZS0+aV9zaXplID0gQkZTX0ZJTEVTSVpFKGRpKTsKIAlpbm9kZS0+aV9ibG9ja3MgPSBCRlNfRklMRUJMT0NLUyhkaSk7CiAgICAgICAgIGlmIChpbm9kZS0+aV9zaXplIHx8IGlub2RlLT5pX2Jsb2NrcykgZHByaW50ZigiUmVnaXN0ZXJlZCBpbm9kZSB3aXRoICVsbGQgc2l6ZSwgJWxkIGJsb2Nrc1xuIiwgaW5vZGUtPmlfc2l6ZSwgaW5vZGUtPmlfYmxvY2tzKTsKLQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOwogCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9ICBsZTMyX3RvX2NwdShkaS0+aV9hdGltZSk7CiAJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gIGxlMzJfdG9fY3B1KGRpLT5pX210aW1lKTsKIAlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSAgbGUzMl90b19jcHUoZGktPmlfY3RpbWUpOwpAQCAtMjY4LDggKzI2Nyw3IEBACiAKIHN0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQogewotCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koYmZzX2lub2RlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gImJmc19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworCWttZW1fY2FjaGVfZGVzdHJveShiZnNfaW5vZGVfY2FjaGVwKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGJmc19zb3BzID0gewpAQCAtMzExLDExICszMDksMTAgQEAKIAl1bnNpZ25lZCBpLCBpbWFwX2xlbjsKIAlzdHJ1Y3QgYmZzX3NiX2luZm8gKiBpbmZvOwogCi0JaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CisJaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKCppbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKIAlzLT5zX2ZzX2luZm8gPSBpbmZvOwotCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKIAogCXNiX3NldF9ibG9ja3NpemUocywgQkZTX0JTSVpFKTsKIApAQCAtMzM4LDEwICszMzUsOSBAQAogCQkJKyBCRlNfUk9PVF9JTk8gLSAxOwogCiAJaW1hcF9sZW4gPSBpbmZvLT5zaV9sYXN0aS84ICsgMTsKLQlpbmZvLT5zaV9pbWFwID0ga21hbGxvYyhpbWFwX2xlbiwgR0ZQX0tFUk5FTCk7CisJaW5mby0+c2lfaW1hcCA9IGt6YWxsb2MoaW1hcF9sZW4sIEdGUF9LRVJORUwpOwogCWlmICghaW5mby0+c2lfaW1hcCkKIAkJZ290byBvdXQ7Ci0JbWVtc2V0KGluZm8tPnNpX2ltYXAsIDAsIGltYXBfbGVuKTsKIAlmb3IgKGk9MDsgaTxCRlNfUk9PVF9JTk87IGkrKykgCiAJCXNldF9iaXQoaSwgaW5mby0+c2lfaW1hcCk7CiAKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9lbGYuYyBiL2ZzL2JpbmZtdF9lbGYuYwppbmRleCA2NDgwMmFhLi5kZmQ4Y2ZiIDEwMDY0NAotLS0gYS9mcy9iaW5mbXRfZWxmLmMKKysrIGIvZnMvYmluZm10X2VsZi5jCkBAIC01MTUsNyArNTE1LDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgcmFuZG9tX3ZhcmlhYmxlID0gMDsKIAotCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkgeworCWlmICgoY3VycmVudC0+ZmxhZ3MgJiBQRl9SQU5ET01JWkUpICYmCisJCSEoY3VycmVudC0+cGVyc29uYWxpdHkgJiBBRERSX05PX1JBTkRPTUlaRSkpIHsKIAkJcmFuZG9tX3ZhcmlhYmxlID0gZ2V0X3JhbmRvbV9pbnQoKSAmIFNUQUNLX1JORF9NQVNLOwogCQlyYW5kb21fdmFyaWFibGUgPDw9IFBBR0VfU0hJRlQ7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X21pc2MuYyBiL2ZzL2JpbmZtdF9taXNjLmMKaW5kZXggMzRlYmJjMS4uNjZiYTEzNyAxMDA2NDQKLS0tIGEvZnMvYmluZm10X21pc2MuYworKysgYi9mcy9iaW5mbXRfbWlzYy5jCkBAIC01MDcsNyArNTA3LDYgQEAKIAkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlub2RlLT5pX3VpZCA9IDA7CiAJCWlub2RlLT5pX2dpZCA9IDA7Ci0JCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CiAJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9CiAJCQljdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOwpAQCAtNTE3LDcgKzUxNiw3IEBACiAKIHN0YXRpYyB2b2lkIGJtX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0Ja2ZyZWUoaW5vZGUtPnUuZ2VuZXJpY19pcCk7CisJa2ZyZWUoaW5vZGUtPmlfcHJpdmF0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGtpbGxfbm9kZShOb2RlICplKQpAQCAtNTQ1LDcgKzU0NCw3IEBACiBzdGF0aWMgc3NpemVfdAogYm1fZW50cnlfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCiB7Ci0JTm9kZSAqZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT51LmdlbmVyaWNfaXA7CisJTm9kZSAqZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CiAJbG9mZl90IHBvcyA9ICpwcG9zOwogCXNzaXplX3QgcmVzOwogCWNoYXIgKnBhZ2U7CkBAIC01NzksNyArNTc4LDcgQEAKIAkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpyb290OwotCU5vZGUgKmUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwOworCU5vZGUgKmUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOwogCWludCByZXMgPSBwYXJzZV9jb21tYW5kKGJ1ZmZlciwgY291bnQpOwogCiAJc3dpdGNoIChyZXMpIHsKQEAgLTY0Niw3ICs2NDUsNyBAQAogCX0KIAogCWUtPmRlbnRyeSA9IGRnZXQoZGVudHJ5KTsKLQlpbm9kZS0+dS5nZW5lcmljX2lwID0gZTsKKwlpbm9kZS0+aV9wcml2YXRlID0gZTsKIAlpbm9kZS0+aV9mb3AgPSAmYm1fZW50cnlfb3BlcmF0aW9uczsKIAogCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9jaGFyX2Rldi5jIGIvZnMvY2hhcl9kZXYuYwppbmRleCAzNDgzZDNjLi4wMDA5MzQ2IDEwMDY0NAotLS0gYS9mcy9jaGFyX2Rldi5jCisrKyBiL2ZzL2NoYXJfZGV2LmMKQEAgLTE5LDExICsxOSwzMCBAQAogI2luY2x1ZGUgPGxpbnV4L2tvYmpfbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvY2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KIAogI2lmZGVmIENPTkZJR19LTU9ECiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogI2VuZGlmCiAKKy8qCisgKiBjYXBhYmlsaXRpZXMgZm9yIC9kZXYvbWVtLCAvZGV2L2ttZW0gYW5kIHNpbWlsYXIgZGlyZWN0bHkgbWFwcGFibGUgY2hhcmFjdGVyCisgKiBkZXZpY2VzCisgKiAtIHBlcm1pdHMgc2hhcmVkLW1tYXAgZm9yIHJlYWQsIHdyaXRlIGFuZC9vciBleGVjCisgKiAtIGRvZXMgbm90IHBlcm1pdCBwcml2YXRlIG1tYXAgaW4gTk9NTVUgbW9kZSAoY2FuJ3QgZG8gQ09XKQorICogLSBubyByZWFkYWhlYWQgb3IgSS9PIHF1ZXVlIHVucGx1Z2dpbmcgcmVxdWlyZWQKKyAqLworc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gZGlyZWN0bHlfbWFwcGFibGVfY2Rldl9iZGkgPSB7CisJLmNhcGFiaWxpdGllcwk9ICgKKyNpZmRlZiBDT05GSUdfTU1VCisJCS8qIHBlcm1pdCBwcml2YXRlIGNvcGllcyBvZiB0aGUgZGF0YSB0byBiZSB0YWtlbiAqLworCQlCRElfQ0FQX01BUF9DT1BZIHwKKyNlbmRpZgorCQkvKiBwZXJtaXQgZGlyZWN0IG1tYXAsIGZvciByZWFkLCB3cml0ZSBvciBleGVjICovCisJCUJESV9DQVBfTUFQX0RJUkVDVCB8CisJCUJESV9DQVBfUkVBRF9NQVAgfCBCRElfQ0FQX1dSSVRFX01BUCB8IEJESV9DQVBfRVhFQ19NQVApLAorfTsKKwogc3RhdGljIHN0cnVjdCBrb2JqX21hcCAqY2Rldl9tYXA7CiAKIHN0YXRpYyBERUZJTkVfTVVURVgoY2hyZGV2c19sb2NrKTsKQEAgLTQ2MSwzICs0ODAsNCBAQAogRVhQT1JUX1NZTUJPTChjZGV2X2FkZCk7CiBFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2NocmRldik7CiBFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfY2hyZGV2KTsKK0VYUE9SVF9TWU1CT0woZGlyZWN0bHlfbWFwcGFibGVfY2Rldl9iZGkpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggYzNlZjFjMC4uMjJiY2Y0ZCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC0yNTMsNyArMjUzLDYgQEAKIAlmaWxlIGRhdGEgb3IgbWV0YWRhdGEgKi8KIAljaWZzX2lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPSBGQUxTRTsKIAljaWZzX2lub2RlLT5jbGllbnRDYW5DYWNoZUFsbCA9IEZBTFNFOwotCWNpZnNfaW5vZGUtPnZmc19pbm9kZS5pX2Jsa3NpemUgPSBDSUZTX01BWF9NU0dTSVpFOwogCWNpZnNfaW5vZGUtPnZmc19pbm9kZS5pX2Jsa2JpdHMgPSAxNDsgIC8qIDIqKjE0ID0gQ0lGU19NQVhfTVNHU0laRSAqLwogCWNpZnNfaW5vZGUtPnZmc19pbm9kZS5pX2ZsYWdzID0gU19OT0FUSU1FIHwgU19OT0NNVElNRTsKIAlJTklUX0xJU1RfSEVBRCgmY2lmc19pbm9kZS0+b3BlbkZpbGVMaXN0KTsKQEAgLTY5OSw4ICs2OTgsNyBAQAogc3RhdGljIHZvaWQKIGNpZnNfZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCiB7Ci0JaWYgKGttZW1fY2FjaGVfZGVzdHJveShjaWZzX2lub2RlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgImNpZnNfaW5vZGVfY2FjaGU6IGVycm9yIGZyZWVpbmdcbiIpOworCWttZW1fY2FjaGVfZGVzdHJveShjaWZzX2lub2RlX2NhY2hlcCk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTc3OCwxMyArNzc2LDkgQEAKIGNpZnNfZGVzdHJveV9yZXF1ZXN0X2J1ZnModm9pZCkKIHsKIAltZW1wb29sX2Rlc3Ryb3koY2lmc19yZXFfcG9vbHApOwotCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koY2lmc19yZXFfY2FjaGVwKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImNpZnNfZGVzdHJveV9yZXF1ZXN0X2NhY2hlOiBlcnJvciBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7CisJa21lbV9jYWNoZV9kZXN0cm95KGNpZnNfcmVxX2NhY2hlcCk7CiAJbWVtcG9vbF9kZXN0cm95KGNpZnNfc21fcmVxX3Bvb2xwKTsKLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGNpZnNfc21fcmVxX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICAgImNpZnNfZGVzdHJveV9yZXF1ZXN0X2NhY2hlOiBjaWZzX3NtYWxsX3JxIGZyZWUgZXJyb3JcbiIpOworCWttZW1fY2FjaGVfZGVzdHJveShjaWZzX3NtX3JlcV9jYWNoZXApOwogfQogCiBzdGF0aWMgaW50CkBAIC04MTksMTMgKzgxMyw4IEBACiBjaWZzX2Rlc3Ryb3lfbWlkcyh2b2lkKQogewogCW1lbXBvb2xfZGVzdHJveShjaWZzX21pZF9wb29scCk7Ci0JaWYgKGttZW1fY2FjaGVfZGVzdHJveShjaWZzX21pZF9jYWNoZXApKQotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAgICAiY2lmc19kZXN0cm95X21pZHM6IGVycm9yIG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKLQotCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koY2lmc19vcGxvY2tfY2FjaGVwKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImVycm9yIG5vdCBhbGwgb3Bsb2NrIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7CisJa21lbV9jYWNoZV9kZXN0cm95KGNpZnNfbWlkX2NhY2hlcCk7CisJa21lbV9jYWNoZV9kZXN0cm95KGNpZnNfb3Bsb2NrX2NhY2hlcCk7CiB9CiAKIHN0YXRpYyBpbnQgY2lmc19vcGxvY2tfdGhyZWFkKHZvaWQgKiBkdW1teWFyZykKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvcmVhZGRpci5jIGIvZnMvY2lmcy9yZWFkZGlyLmMKaW5kZXggOWFlYjU4YS4uYjI3YjM0NSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9yZWFkZGlyLmMKKysrIGIvZnMvY2lmcy9yZWFkZGlyLmMKQEAgLTIxNiwxMCArMjE2LDkgQEAKIAogCWlmIChhbGxvY2F0aW9uX3NpemUgPCBlbmRfb2ZfZmlsZSkKIAkJY0ZZSSgxLCAoIk1heSBiZSBzcGFyc2UgZmlsZSwgYWxsb2NhdGlvbiBsZXNzIHRoYW4gZmlsZSBzaXplIikpOwotCWNGWUkoMSwgKCJGaWxlIFNpemUgJWxkIGFuZCBibG9ja3MgJWxsdSBhbmQgYmxvY2tzaXplICVsZCIsCisJY0ZZSSgxLCAoIkZpbGUgU2l6ZSAlbGQgYW5kIGJsb2NrcyAlbGx1IiwKIAkJKHVuc2lnbmVkIGxvbmcpdG1wX2lub2RlLT5pX3NpemUsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpdG1wX2lub2RlLT5pX2Jsb2NrcywKLQkJdG1wX2lub2RlLT5pX2Jsa3NpemUpKTsKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0bXBfaW5vZGUtPmlfYmxvY2tzKSk7CiAJaWYgKFNfSVNSRUcodG1wX2lub2RlLT5pX21vZGUpKSB7CiAJCWNGWUkoMSwgKCJGaWxlIGlub2RlIikpOwogCQl0bXBfaW5vZGUtPmlfb3AgPSAmY2lmc19maWxlX2lub2RlX29wczsKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvY29kYV9saW51eC5jIGIvZnMvY29kYS9jb2RhX2xpbnV4LmMKaW5kZXggNTU5NzA4MC4uOTVhNTQyNSAxMDA2NDQKLS0tIGEvZnMvY29kYS9jb2RhX2xpbnV4LmMKKysrIGIvZnMvY29kYS9jb2RhX2xpbnV4LmMKQEAgLTExMCw4ICsxMTAsNiBAQAogCSAgICAgICAgaW5vZGUtPmlfbmxpbmsgPSBhdHRyLT52YV9ubGluazsKIAlpZiAoYXR0ci0+dmFfc2l6ZSAhPSAtMSkKIAkgICAgICAgIGlub2RlLT5pX3NpemUgPSBhdHRyLT52YV9zaXplOwotCWlmIChhdHRyLT52YV9ibG9ja3NpemUgIT0gLTEpCi0JCWlub2RlLT5pX2Jsa3NpemUgPSBhdHRyLT52YV9ibG9ja3NpemU7CiAJaWYgKGF0dHItPnZhX3NpemUgIT0gLTEpCiAJCWlub2RlLT5pX2Jsb2NrcyA9IChhdHRyLT52YV9zaXplICsgNTExKSA+PiA5OwogCWlmIChhdHRyLT52YV9hdGltZS50dl9zZWMgIT0gLTEpIApkaWZmIC0tZ2l0IGEvZnMvY29kYS9kaXIuYyBiL2ZzL2NvZGEvZGlyLmMKaW5kZXggNzFmMmVhNi4uODY1MWVhNiAxMDA2NDQKLS0tIGEvZnMvY29kYS9kaXIuYworKysgYi9mcy9jb2RhL2Rpci5jCkBAIC01MTMsNyArNTEzLDcgQEAKIAlpbm9fdCBpbm87CiAJaW50IHJldCwgaTsKIAotCXZkaXIgPSAoc3RydWN0IHZlbnVzX2RpcmVudCAqKWttYWxsb2Moc2l6ZW9mKCp2ZGlyKSwgR0ZQX0tFUk5FTCk7CisJdmRpciA9IGttYWxsb2Moc2l6ZW9mKCp2ZGlyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2ZGlyKSByZXR1cm4gLUVOT01FTTsKIAogCWkgPSBmaWxwLT5mX3BvczsKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvaW5vZGUuYyBiL2ZzL2NvZGEvaW5vZGUuYwppbmRleCA4N2YxZGM4Li44OGQxMjMzIDEwMDY0NAotLS0gYS9mcy9jb2RhL2lub2RlLmMKKysrIGIvZnMvY29kYS9pbm9kZS5jCkBAIC04MCw4ICs4MCw3IEBACiAKIHZvaWQgY29kYV9kZXN0cm95X2lub2RlY2FjaGUodm9pZCkKIHsKLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGNvZGFfaW5vZGVfY2FjaGVwKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiY29kYV9pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworCWttZW1fY2FjaGVfZGVzdHJveShjb2RhX2lub2RlX2NhY2hlcCk7CiB9CiAKIHN0YXRpYyBpbnQgY29kYV9yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCmRpZmYgLS1naXQgYS9mcy9jb21wYXQuYyBiL2ZzL2NvbXBhdC5jCmluZGV4IGUzMWU5Y2YuLmNlOTgyZjYgMTAwNjQ0Ci0tLSBhL2ZzL2NvbXBhdC5jCisrKyBiL2ZzL2NvbXBhdC5jCkBAIC0xODU1LDcgKzE4NTUsNyBAQAogCiAJfSB3aGlsZSAoIXJldCAmJiAhdGltZW91dCAmJiB0c3AgJiYgKHRzLnR2X3NlYyB8fCB0cy50dl9uc2VjKSk7CiAKLQlpZiAodHNwICYmICEoY3VycmVudC0+cGVyc29uYWxpdHkgJiBTVElDS1lfVElNRU9VVFMpKSB7CisJaWYgKHJldCA9PSAwICYmIHRzcCAmJiAhKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgU1RJQ0tZX1RJTUVPVVRTKSkgewogCQlzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIHJ0czsKIAogCQlydHMudHZfc2VjID0gdGltZW91dCAvIEhaOwpAQCAtMTg2Niw3ICsxODY2LDggQEAKIAkJfQogCQlpZiAoY29tcGF0X3RpbWVzcGVjX2NvbXBhcmUoJnJ0cywgJnRzKSA+PSAwKQogCQkJcnRzID0gdHM7Ci0JCWNvcHlfdG9fdXNlcih0c3AsICZydHMsIHNpemVvZihydHMpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcih0c3AsICZydHMsIHNpemVvZihydHMpKSkKKwkJCXJldCA9IC1FRkFVTFQ7CiAJfQogCiAJaWYgKHJldCA9PSAtRVJFU1RBUlROT0hBTkQpIHsKZGlmZiAtLWdpdCBhL2ZzL2NvbmZpZ2ZzL2ZpbGUuYyBiL2ZzL2NvbmZpZ2ZzL2ZpbGUuYwppbmRleCBmNDk5ODAzLi44NTEwNWU1IDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9maWxlLmMKKysrIGIvZnMvY29uZmlnZnMvZmlsZS5jCkBAIC0yNzQsOSArMjc0LDggQEAKIAkvKiBObyBlcnJvcj8gR3JlYXQsIGFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgZmlsZSwgYW5kIHN0b3JlIGl0CiAJICogaXQgaW4gZmlsZS0+cHJpdmF0ZV9kYXRhIGZvciBlYXN5IGFjY2Vzcy4KIAkgKi8KLQlidWZmZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZmlnZnNfYnVmZmVyKSxHRlBfS0VSTkVMKTsKKwlidWZmZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY29uZmlnZnNfYnVmZmVyKSxHRlBfS0VSTkVMKTsKIAlpZiAoYnVmZmVyKSB7Ci0JCW1lbXNldChidWZmZXIsMCxzaXplb2Yoc3RydWN0IGNvbmZpZ2ZzX2J1ZmZlcikpOwogCQlpbml0X01VVEVYKCZidWZmZXItPnNlbSk7CiAJCWJ1ZmZlci0+bmVlZHNfcmVhZF9maWxsID0gMTsKIAkJYnVmZmVyLT5vcHMgPSBvcHM7CmRpZmYgLS1naXQgYS9mcy9jb25maWdmcy9pbm9kZS5jIGIvZnMvY29uZmlnZnMvaW5vZGUuYwppbmRleCBlMTQ0ODhjLi5mYjE4OTE3IDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9pbm9kZS5jCisrKyBiL2ZzL2NvbmZpZ2ZzL2lub2RlLmMKQEAgLTc2LDExICs3NiwxMCBAQAogCiAJaWYgKCFzZF9pYXR0cikgewogCQkvKiBzZXR0aW5nIGF0dHJpYnV0ZXMgZm9yIHRoZSBmaXJzdCB0aW1lLCBhbGxvY2F0ZSBub3cgKi8KLQkJc2RfaWF0dHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWF0dHIpLCBHRlBfS0VSTkVMKTsKKwkJc2RfaWF0dHIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWF0dHIpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFzZF9pYXR0cikKIAkJCXJldHVybiAtRU5PTUVNOwogCQkvKiBhc3NpZ24gZGVmYXVsdCBhdHRyaWJ1dGVzICovCi0JCW1lbXNldChzZF9pYXR0ciwgMCwgc2l6ZW9mKHN0cnVjdCBpYXR0cikpOwogCQlzZF9pYXR0ci0+aWFfbW9kZSA9IHNkLT5zX21vZGU7CiAJCXNkX2lhdHRyLT5pYV91aWQgPSAwOwogCQlzZF9pYXR0ci0+aWFfZ2lkID0gMDsKQEAgLTEzNiw3ICsxMzUsNiBAQAogewogCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gbmV3X2lub2RlKGNvbmZpZ2ZzX3NiKTsKIAlpZiAoaW5vZGUpIHsKLQkJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmY29uZmlnZnNfYW9wczsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZjb25maWdmc19iYWNraW5nX2Rldl9pbmZvOwpkaWZmIC0tZ2l0IGEvZnMvY3JhbWZzL2lub2RlLmMgYi9mcy9jcmFtZnMvaW5vZGUuYwppbmRleCAyMjNjMDQzLi5hZDk2YjY5IDEwMDY0NAotLS0gYS9mcy9jcmFtZnMvaW5vZGUuYworKysgYi9mcy9jcmFtZnMvaW5vZGUuYwpAQCAtNzMsNyArNzMsNiBAQAogCWlub2RlLT5pX3VpZCA9IGNyYW1mc19pbm9kZS0+dWlkOwogCWlub2RlLT5pX3NpemUgPSBjcmFtZnNfaW5vZGUtPnNpemU7CiAJaW5vZGUtPmlfYmxvY2tzID0gKGNyYW1mc19pbm9kZS0+c2l6ZSAtIDEpIC8gNTEyICsgMTsKLQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCWlub2RlLT5pX2dpZCA9IGNyYW1mc19pbm9kZS0+Z2lkOwogCS8qIFN0cnVjdCBjb3B5IGludGVudGlvbmFsICovCiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gemVyb3RpbWU7CkBAIC0yNDIsMTEgKzI0MSwxMCBAQAogCiAJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwogCi0Jc2JpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNyYW1mc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJc2JpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNyYW1mc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpCiAJCXJldHVybiAtRU5PTUVNOwogCXNiLT5zX2ZzX2luZm8gPSBzYmk7Ci0JbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKHN0cnVjdCBjcmFtZnNfc2JfaW5mbykpOwogCiAJLyogSW52YWxpZGF0ZSB0aGUgcmVhZCBidWZmZXJzIG9uIG1vdW50OiB0aGluayBkaXNrIGNoYW5nZS4uICovCiAJbXV0ZXhfbG9jaygmcmVhZF9tdXRleCk7CmRpZmYgLS1naXQgYS9mcy9kZWJ1Z2ZzL2ZpbGUuYyBiL2ZzL2RlYnVnZnMvZmlsZS5jCmluZGV4IDM5NjQwZmQuLmJmMzkwMWEgMTAwNjQ0Ci0tLSBhL2ZzL2RlYnVnZnMvZmlsZS5jCisrKyBiL2ZzL2RlYnVnZnMvZmlsZS5jCkBAIC0zMiw4ICszMiw4IEBACiAKIHN0YXRpYyBpbnQgZGVmYXVsdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCWlmIChpbm9kZS0+dS5nZW5lcmljX2lwKQotCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+dS5nZW5lcmljX2lwOworCWlmIChpbm9kZS0+aV9wcml2YXRlKQorCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NSwxMiArNTUsMTEgQEAKIERFRklORV9TSU1QTEVfQVRUUklCVVRFKGZvcHNfdTgsIGRlYnVnZnNfdThfZ2V0LCBkZWJ1Z2ZzX3U4X3NldCwgIiVsbHVcbiIpOwogCiAvKioKLSAqIGRlYnVnZnNfY3JlYXRlX3U4IC0gY3JlYXRlIGEgZmlsZSBpbiB0aGUgZGVidWdmcyBmaWxlc3lzdGVtIHRoYXQgaXMgdXNlZCB0byByZWFkIGFuZCB3cml0ZSBhbiB1bnNpZ25lZCA4IGJpdCB2YWx1ZS4KLSAqCisgKiBkZWJ1Z2ZzX2NyZWF0ZV91OCAtIGNyZWF0ZSBhIGRlYnVnZnMgZmlsZSB0aGF0IGlzIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgYW4gdW5zaWduZWQgOC1iaXQgdmFsdWUKICAqIEBuYW1lOiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUuCiAgKiBAbW9kZTogdGhlIHBlcm1pc3Npb24gdGhhdCB0aGUgZmlsZSBzaG91bGQgaGF2ZQogICogQHBhcmVudDogYSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgZGVudHJ5IGZvciB0aGlzIGZpbGUuICBUaGlzIHNob3VsZCBiZSBhCi0gKiAgICAgICAgICBkaXJlY3RvcnkgZGVudHJ5IGlmIHNldC4gIElmIHRoaXMgcGFyYW1hdGVyIGlzIE5VTEwsIHRoZW4gdGhlCisgKiAgICAgICAgICBkaXJlY3RvcnkgZGVudHJ5IGlmIHNldC4gIElmIHRoaXMgcGFyYW1ldGVyIGlzICVOVUxMLCB0aGVuIHRoZQogICogICAgICAgICAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIGRlYnVnZnMgZmlsZXN5c3RlbS4KICAqIEB2YWx1ZTogYSBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSB0aGF0IHRoZSBmaWxlIHNob3VsZCByZWFkIHRvIGFuZCB3cml0ZQogICogICAgICAgICBmcm9tLgpAQCAtNzIsMTEgKzcxLDExIEBACiAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byBhIGRlbnRyeSBpZiBpdCBzdWNjZWVkcy4gIFRoaXMKICAqIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIGRlYnVnZnNfcmVtb3ZlKCkgZnVuY3Rpb24gd2hlbiB0aGUgZmlsZSBpcwogICogdG8gYmUgcmVtb3ZlZCAobm8gYXV0b21hdGljIGNsZWFudXAgaGFwcGVucyBpZiB5b3VyIG1vZHVsZSBpcyB1bmxvYWRlZCwKLSAqIHlvdSBhcmUgcmVzcG9uc2libGUgaGVyZS4pICBJZiBhbiBlcnJvciBvY2N1cnMsIE5VTEwgd2lsbCBiZSByZXR1cm5lZC4KKyAqIHlvdSBhcmUgcmVzcG9uc2libGUgaGVyZS4pICBJZiBhbiBlcnJvciBvY2N1cnMsICVOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCiAgKgotICogSWYgZGVidWdmcyBpcyBub3QgZW5hYmxlZCBpbiB0aGUga2VybmVsLCB0aGUgdmFsdWUgLUVOT0RFViB3aWxsIGJlCisgKiBJZiBkZWJ1Z2ZzIGlzIG5vdCBlbmFibGVkIGluIHRoZSBrZXJuZWwsIHRoZSB2YWx1ZSAtJUVOT0RFViB3aWxsIGJlCiAgKiByZXR1cm5lZC4gIEl0IGlzIG5vdCB3aXNlIHRvIGNoZWNrIGZvciB0aGlzIHZhbHVlLCBidXQgcmF0aGVyLCBjaGVjayBmb3IKLSAqIE5VTEwgb3IgIU5VTEwgaW5zdGVhZCBhcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yICNpZmRlZiBpbiB0aGUgY2FsbGluZworICogJU5VTEwgb3IgISVOVUxMIGluc3RlYWQgYXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciAjaWZkZWYgaW4gdGhlIGNhbGxpbmcKICAqIGNvZGUuCiAgKi8KIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX3U4KGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLApAQCAtOTcsMTIgKzk2LDExIEBACiBERUZJTkVfU0lNUExFX0FUVFJJQlVURShmb3BzX3UxNiwgZGVidWdmc191MTZfZ2V0LCBkZWJ1Z2ZzX3UxNl9zZXQsICIlbGx1XG4iKTsKIAogLyoqCi0gKiBkZWJ1Z2ZzX2NyZWF0ZV91MTYgLSBjcmVhdGUgYSBmaWxlIGluIHRoZSBkZWJ1Z2ZzIGZpbGVzeXN0ZW0gdGhhdCBpcyB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIGFuIHVuc2lnbmVkIDE2IGJpdCB2YWx1ZS4KLSAqCisgKiBkZWJ1Z2ZzX2NyZWF0ZV91MTYgLSBjcmVhdGUgYSBkZWJ1Z2ZzIGZpbGUgdGhhdCBpcyB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIGFuIHVuc2lnbmVkIDE2LWJpdCB2YWx1ZQogICogQG5hbWU6IGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS4KICAqIEBtb2RlOiB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZSBmaWxlIHNob3VsZCBoYXZlCiAgKiBAcGFyZW50OiBhIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBkZW50cnkgZm9yIHRoaXMgZmlsZS4gIFRoaXMgc2hvdWxkIGJlIGEKLSAqICAgICAgICAgIGRpcmVjdG9yeSBkZW50cnkgaWYgc2V0LiAgSWYgdGhpcyBwYXJhbWF0ZXIgaXMgTlVMTCwgdGhlbiB0aGUKKyAqICAgICAgICAgIGRpcmVjdG9yeSBkZW50cnkgaWYgc2V0LiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgJU5VTEwsIHRoZW4gdGhlCiAgKiAgICAgICAgICBmaWxlIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgcm9vdCBvZiB0aGUgZGVidWdmcyBmaWxlc3lzdGVtLgogICogQHZhbHVlOiBhIHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlIHRoYXQgdGhlIGZpbGUgc2hvdWxkIHJlYWQgdG8gYW5kIHdyaXRlCiAgKiAgICAgICAgIGZyb20uCkBAIC0xMTQsMTEgKzExMiwxMSBAQAogICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gYSBkZW50cnkgaWYgaXQgc3VjY2VlZHMuICBUaGlzCiAgKiBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBkZWJ1Z2ZzX3JlbW92ZSgpIGZ1bmN0aW9uIHdoZW4gdGhlIGZpbGUgaXMKICAqIHRvIGJlIHJlbW92ZWQgKG5vIGF1dG9tYXRpYyBjbGVhbnVwIGhhcHBlbnMgaWYgeW91ciBtb2R1bGUgaXMgdW5sb2FkZWQsCi0gKiB5b3UgYXJlIHJlc3BvbnNpYmxlIGhlcmUuKSAgSWYgYW4gZXJyb3Igb2NjdXJzLCBOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCisgKiB5b3UgYXJlIHJlc3BvbnNpYmxlIGhlcmUuKSAgSWYgYW4gZXJyb3Igb2NjdXJzLCAlTlVMTCB3aWxsIGJlIHJldHVybmVkLgogICoKLSAqIElmIGRlYnVnZnMgaXMgbm90IGVuYWJsZWQgaW4gdGhlIGtlcm5lbCwgdGhlIHZhbHVlIC1FTk9ERVYgd2lsbCBiZQorICogSWYgZGVidWdmcyBpcyBub3QgZW5hYmxlZCBpbiB0aGUga2VybmVsLCB0aGUgdmFsdWUgLSVFTk9ERVYgd2lsbCBiZQogICogcmV0dXJuZWQuICBJdCBpcyBub3Qgd2lzZSB0byBjaGVjayBmb3IgdGhpcyB2YWx1ZSwgYnV0IHJhdGhlciwgY2hlY2sgZm9yCi0gKiBOVUxMIG9yICFOVUxMIGluc3RlYWQgYXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciAjaWZkZWYgaW4gdGhlIGNhbGxpbmcKKyAqICVOVUxMIG9yICElTlVMTCBpbnN0ZWFkIGFzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgI2lmZGVmIGluIHRoZSBjYWxsaW5nCiAgKiBjb2RlLgogICovCiBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV91MTYoY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCkBAIC0xMzksMTIgKzEzNywxMSBAQAogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoZm9wc191MzIsIGRlYnVnZnNfdTMyX2dldCwgZGVidWdmc191MzJfc2V0LCAiJWxsdVxuIik7CiAKIC8qKgotICogZGVidWdmc19jcmVhdGVfdTMyIC0gY3JlYXRlIGEgZmlsZSBpbiB0aGUgZGVidWdmcyBmaWxlc3lzdGVtIHRoYXQgaXMgdXNlZCB0byByZWFkIGFuZCB3cml0ZSBhbiB1bnNpZ25lZCAzMiBiaXQgdmFsdWUuCi0gKgorICogZGVidWdmc19jcmVhdGVfdTMyIC0gY3JlYXRlIGEgZGVidWdmcyBmaWxlIHRoYXQgaXMgdXNlZCB0byByZWFkIGFuZCB3cml0ZSBhbiB1bnNpZ25lZCAzMi1iaXQgdmFsdWUKICAqIEBuYW1lOiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUuCiAgKiBAbW9kZTogdGhlIHBlcm1pc3Npb24gdGhhdCB0aGUgZmlsZSBzaG91bGQgaGF2ZQogICogQHBhcmVudDogYSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgZGVudHJ5IGZvciB0aGlzIGZpbGUuICBUaGlzIHNob3VsZCBiZSBhCi0gKiAgICAgICAgICBkaXJlY3RvcnkgZGVudHJ5IGlmIHNldC4gIElmIHRoaXMgcGFyYW1hdGVyIGlzIE5VTEwsIHRoZW4gdGhlCisgKiAgICAgICAgICBkaXJlY3RvcnkgZGVudHJ5IGlmIHNldC4gIElmIHRoaXMgcGFyYW1ldGVyIGlzICVOVUxMLCB0aGVuIHRoZQogICogICAgICAgICAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIGRlYnVnZnMgZmlsZXN5c3RlbS4KICAqIEB2YWx1ZTogYSBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSB0aGF0IHRoZSBmaWxlIHNob3VsZCByZWFkIHRvIGFuZCB3cml0ZQogICogICAgICAgICBmcm9tLgpAQCAtMTU2LDExICsxNTMsMTEgQEAKICAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIGEgZGVudHJ5IGlmIGl0IHN1Y2NlZWRzLiAgVGhpcwogICogcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byB0aGUgZGVidWdmc19yZW1vdmUoKSBmdW5jdGlvbiB3aGVuIHRoZSBmaWxlIGlzCiAgKiB0byBiZSByZW1vdmVkIChubyBhdXRvbWF0aWMgY2xlYW51cCBoYXBwZW5zIGlmIHlvdXIgbW9kdWxlIGlzIHVubG9hZGVkLAotICogeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLikgIElmIGFuIGVycm9yIG9jY3VycywgTlVMTCB3aWxsIGJlIHJldHVybmVkLgorICogeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLikgIElmIGFuIGVycm9yIG9jY3VycywgJU5VTEwgd2lsbCBiZSByZXR1cm5lZC4KICAqCi0gKiBJZiBkZWJ1Z2ZzIGlzIG5vdCBlbmFibGVkIGluIHRoZSBrZXJuZWwsIHRoZSB2YWx1ZSAtRU5PREVWIHdpbGwgYmUKKyAqIElmIGRlYnVnZnMgaXMgbm90IGVuYWJsZWQgaW4gdGhlIGtlcm5lbCwgdGhlIHZhbHVlIC0lRU5PREVWIHdpbGwgYmUKICAqIHJldHVybmVkLiAgSXQgaXMgbm90IHdpc2UgdG8gY2hlY2sgZm9yIHRoaXMgdmFsdWUsIGJ1dCByYXRoZXIsIGNoZWNrIGZvcgotICogTlVMTCBvciAhTlVMTCBpbnN0ZWFkIGFzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgI2lmZGVmIGluIHRoZSBjYWxsaW5nCisgKiAlTlVMTCBvciAhJU5VTEwgaW5zdGVhZCBhcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yICNpZmRlZiBpbiB0aGUgY2FsbGluZwogICogY29kZS4KICAqLwogc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfdTMyKGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLApAQCAtMjE5LDEyICsyMTYsMTEgQEAKIH07CiAKIC8qKgotICogZGVidWdmc19jcmVhdGVfYm9vbCAtIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGRlYnVnZnMgZmlsZXN5c3RlbSB0aGF0IGlzIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgYSBib29sZWFuIHZhbHVlLgotICoKKyAqIGRlYnVnZnNfY3JlYXRlX2Jvb2wgLSBjcmVhdGUgYSBkZWJ1Z2ZzIGZpbGUgdGhhdCBpcyB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIGEgYm9vbGVhbiB2YWx1ZQogICogQG5hbWU6IGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS4KICAqIEBtb2RlOiB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZSBmaWxlIHNob3VsZCBoYXZlCiAgKiBAcGFyZW50OiBhIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBkZW50cnkgZm9yIHRoaXMgZmlsZS4gIFRoaXMgc2hvdWxkIGJlIGEKLSAqICAgICAgICAgIGRpcmVjdG9yeSBkZW50cnkgaWYgc2V0LiAgSWYgdGhpcyBwYXJhbWF0ZXIgaXMgTlVMTCwgdGhlbiB0aGUKKyAqICAgICAgICAgIGRpcmVjdG9yeSBkZW50cnkgaWYgc2V0LiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgJU5VTEwsIHRoZW4gdGhlCiAgKiAgICAgICAgICBmaWxlIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgcm9vdCBvZiB0aGUgZGVidWdmcyBmaWxlc3lzdGVtLgogICogQHZhbHVlOiBhIHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlIHRoYXQgdGhlIGZpbGUgc2hvdWxkIHJlYWQgdG8gYW5kIHdyaXRlCiAgKiAgICAgICAgIGZyb20uCkBAIC0yMzYsMTEgKzIzMiwxMSBAQAogICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gYSBkZW50cnkgaWYgaXQgc3VjY2VlZHMuICBUaGlzCiAgKiBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBkZWJ1Z2ZzX3JlbW92ZSgpIGZ1bmN0aW9uIHdoZW4gdGhlIGZpbGUgaXMKICAqIHRvIGJlIHJlbW92ZWQgKG5vIGF1dG9tYXRpYyBjbGVhbnVwIGhhcHBlbnMgaWYgeW91ciBtb2R1bGUgaXMgdW5sb2FkZWQsCi0gKiB5b3UgYXJlIHJlc3BvbnNpYmxlIGhlcmUuKSAgSWYgYW4gZXJyb3Igb2NjdXJzLCBOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCisgKiB5b3UgYXJlIHJlc3BvbnNpYmxlIGhlcmUuKSAgSWYgYW4gZXJyb3Igb2NjdXJzLCAlTlVMTCB3aWxsIGJlIHJldHVybmVkLgogICoKLSAqIElmIGRlYnVnZnMgaXMgbm90IGVuYWJsZWQgaW4gdGhlIGtlcm5lbCwgdGhlIHZhbHVlIC1FTk9ERVYgd2lsbCBiZQorICogSWYgZGVidWdmcyBpcyBub3QgZW5hYmxlZCBpbiB0aGUga2VybmVsLCB0aGUgdmFsdWUgLSVFTk9ERVYgd2lsbCBiZQogICogcmV0dXJuZWQuICBJdCBpcyBub3Qgd2lzZSB0byBjaGVjayBmb3IgdGhpcyB2YWx1ZSwgYnV0IHJhdGhlciwgY2hlY2sgZm9yCi0gKiBOVUxMIG9yICFOVUxMIGluc3RlYWQgYXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciAjaWZkZWYgaW4gdGhlIGNhbGxpbmcKKyAqICVOVUxMIG9yICElTlVMTCBpbnN0ZWFkIGFzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgI2lmZGVmIGluIHRoZSBjYWxsaW5nCiAgKiBjb2RlLgogICovCiBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV9ib29sKGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLApAQCAtMjY0LDEzICsyNjAsMTEgQEAKIH07CiAKIC8qKgotICogZGVidWdmc19jcmVhdGVfYmxvYiAtIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGRlYnVnZnMgZmlsZXN5c3RlbSB0aGF0IGlzCi0gKiB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIGEgYmluYXJ5IGJsb2IuCi0gKgorICogZGVidWdmc19jcmVhdGVfYmxvYiAtIGNyZWF0ZSBhIGRlYnVnZnMgZmlsZSB0aGF0IGlzIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgYSBiaW5hcnkgYmxvYgogICogQG5hbWU6IGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZS4KICAqIEBtb2RlOiB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZSBmaWxlIHNob3VsZCBoYXZlCiAgKiBAcGFyZW50OiBhIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBkZW50cnkgZm9yIHRoaXMgZmlsZS4gIFRoaXMgc2hvdWxkIGJlIGEKLSAqICAgICAgICAgIGRpcmVjdG9yeSBkZW50cnkgaWYgc2V0LiAgSWYgdGhpcyBwYXJhbWF0ZXIgaXMgTlVMTCwgdGhlbiB0aGUKKyAqICAgICAgICAgIGRpcmVjdG9yeSBkZW50cnkgaWYgc2V0LiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgJU5VTEwsIHRoZW4gdGhlCiAgKiAgICAgICAgICBmaWxlIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgcm9vdCBvZiB0aGUgZGVidWdmcyBmaWxlc3lzdGVtLgogICogQGJsb2I6IGEgcG9pbnRlciB0byBhIHN0cnVjdCBkZWJ1Z2ZzX2Jsb2Jfd3JhcHBlciB3aGljaCBjb250YWlucyBhIHBvaW50ZXIKICAqICAgICAgICB0byB0aGUgYmxvYiBkYXRhIGFuZCB0aGUgc2l6ZSBvZiB0aGUgZGF0YS4KQEAgLTI4MiwxMSArMjc2LDExIEBACiAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byBhIGRlbnRyeSBpZiBpdCBzdWNjZWVkcy4gIFRoaXMKICAqIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIGRlYnVnZnNfcmVtb3ZlKCkgZnVuY3Rpb24gd2hlbiB0aGUgZmlsZSBpcwogICogdG8gYmUgcmVtb3ZlZCAobm8gYXV0b21hdGljIGNsZWFudXAgaGFwcGVucyBpZiB5b3VyIG1vZHVsZSBpcyB1bmxvYWRlZCwKLSAqIHlvdSBhcmUgcmVzcG9uc2libGUgaGVyZS4pICBJZiBhbiBlcnJvciBvY2N1cnMsIE5VTEwgd2lsbCBiZSByZXR1cm5lZC4KKyAqIHlvdSBhcmUgcmVzcG9uc2libGUgaGVyZS4pICBJZiBhbiBlcnJvciBvY2N1cnMsICVOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCiAgKgotICogSWYgZGVidWdmcyBpcyBub3QgZW5hYmxlZCBpbiB0aGUga2VybmVsLCB0aGUgdmFsdWUgLUVOT0RFViB3aWxsIGJlCisgKiBJZiBkZWJ1Z2ZzIGlzIG5vdCBlbmFibGVkIGluIHRoZSBrZXJuZWwsIHRoZSB2YWx1ZSAtJUVOT0RFViB3aWxsIGJlCiAgKiByZXR1cm5lZC4gIEl0IGlzIG5vdCB3aXNlIHRvIGNoZWNrIGZvciB0aGlzIHZhbHVlLCBidXQgcmF0aGVyLCBjaGVjayBmb3IKLSAqIE5VTEwgb3IgIU5VTEwgaW5zdGVhZCBhcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yICNpZmRlZiBpbiB0aGUgY2FsbGluZworICogJU5VTEwgb3IgISVOVUxMIGluc3RlYWQgYXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciAjaWZkZWYgaW4gdGhlIGNhbGxpbmcKICAqIGNvZGUuCiAgKi8KIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX2Jsb2IoY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCmRpZmYgLS1naXQgYS9mcy9kZWJ1Z2ZzL2lub2RlLmMgYi9mcy9kZWJ1Z2ZzL2lub2RlLmMKaW5kZXggZThhZTMwNC4uMjY5ZTY0OSAxMDA2NDQKLS0tIGEvZnMvZGVidWdmcy9pbm9kZS5jCisrKyBiL2ZzL2RlYnVnZnMvaW5vZGUuYwpAQCAtNDAsNyArNDAsNiBAQAogCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJaW5vZGUtPmlfdWlkID0gMDsKIAkJaW5vZGUtPmlfZ2lkID0gMDsKLQkJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKQEAgLTE2MiwxNCArMTYxLDEzIEBACiAKIC8qKgogICogZGVidWdmc19jcmVhdGVfZmlsZSAtIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGRlYnVnZnMgZmlsZXN5c3RlbQotICoKICAqIEBuYW1lOiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUuCiAgKiBAbW9kZTogdGhlIHBlcm1pc3Npb24gdGhhdCB0aGUgZmlsZSBzaG91bGQgaGF2ZQogICogQHBhcmVudDogYSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgZGVudHJ5IGZvciB0aGlzIGZpbGUuICBUaGlzIHNob3VsZCBiZSBhCiAgKiAgICAgICAgICBkaXJlY3RvcnkgZGVudHJ5IGlmIHNldC4gIElmIHRoaXMgcGFyYW1hdGVyIGlzIE5VTEwsIHRoZW4gdGhlCiAgKiAgICAgICAgICBmaWxlIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgcm9vdCBvZiB0aGUgZGVidWdmcyBmaWxlc3lzdGVtLgogICogQGRhdGE6IGEgcG9pbnRlciB0byBzb21ldGhpbmcgdGhhdCB0aGUgY2FsbGVyIHdpbGwgd2FudCB0byBnZXQgdG8gbGF0ZXIKLSAqICAgICAgICBvbi4gIFRoZSBpbm9kZS51LmdlbmVyaWNfaXAgcG9pbnRlciB3aWxsIHBvaW50IHRvIHRoaXMgdmFsdWUgb24KKyAqICAgICAgICBvbi4gIFRoZSBpbm9kZS5pX3ByaXZhdGUgcG9pbnRlciB3aWxsIHBvaW50IHRvIHRoaXMgdmFsdWUgb24KICAqICAgICAgICB0aGUgb3BlbigpIGNhbGwuCiAgKiBAZm9wczogYSBwb2ludGVyIHRvIGEgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0aGF0IHNob3VsZCBiZSB1c2VkIGZvcgogICogICAgICAgIHRoaXMgZmlsZS4KQEAgLTE4MiwxMSArMTgwLDExIEBACiAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byBhIGRlbnRyeSBpZiBpdCBzdWNjZWVkcy4gIFRoaXMKICAqIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIGRlYnVnZnNfcmVtb3ZlKCkgZnVuY3Rpb24gd2hlbiB0aGUgZmlsZSBpcwogICogdG8gYmUgcmVtb3ZlZCAobm8gYXV0b21hdGljIGNsZWFudXAgaGFwcGVucyBpZiB5b3VyIG1vZHVsZSBpcyB1bmxvYWRlZCwKLSAqIHlvdSBhcmUgcmVzcG9uc2libGUgaGVyZS4pICBJZiBhbiBlcnJvciBvY2N1cnMsIE5VTEwgd2lsbCBiZSByZXR1cm5lZC4KKyAqIHlvdSBhcmUgcmVzcG9uc2libGUgaGVyZS4pICBJZiBhbiBlcnJvciBvY2N1cnMsICVOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCiAgKgotICogSWYgZGVidWdmcyBpcyBub3QgZW5hYmxlZCBpbiB0aGUga2VybmVsLCB0aGUgdmFsdWUgLUVOT0RFViB3aWxsIGJlCisgKiBJZiBkZWJ1Z2ZzIGlzIG5vdCBlbmFibGVkIGluIHRoZSBrZXJuZWwsIHRoZSB2YWx1ZSAtJUVOT0RFViB3aWxsIGJlCiAgKiByZXR1cm5lZC4gIEl0IGlzIG5vdCB3aXNlIHRvIGNoZWNrIGZvciB0aGlzIHZhbHVlLCBidXQgcmF0aGVyLCBjaGVjayBmb3IKLSAqIE5VTEwgb3IgIU5VTEwgaW5zdGVhZCBhcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yICNpZmRlZiBpbiB0aGUgY2FsbGluZworICogJU5VTEwgb3IgISVOVUxMIGluc3RlYWQgYXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciAjaWZkZWYgaW4gdGhlIGNhbGxpbmcKICAqIGNvZGUuCiAgKi8KIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCkBAIC0yMTAsNyArMjA4LDcgQEAKIAogCWlmIChkZW50cnktPmRfaW5vZGUpIHsKIAkJaWYgKGRhdGEpCi0JCQlkZW50cnktPmRfaW5vZGUtPnUuZ2VuZXJpY19pcCA9IGRhdGE7CisJCQlkZW50cnktPmRfaW5vZGUtPmlfcHJpdmF0ZSA9IGRhdGE7CiAJCWlmIChmb3BzKQogCQkJZGVudHJ5LT5kX2lub2RlLT5pX2ZvcCA9IGZvcHM7CiAJfQpAQCAtMjIxLDcgKzIxOSw2IEBACiAKIC8qKgogICogZGVidWdmc19jcmVhdGVfZGlyIC0gY3JlYXRlIGEgZGlyZWN0b3J5IGluIHRoZSBkZWJ1Z2ZzIGZpbGVzeXN0ZW0KLSAqCiAgKiBAbmFtZTogYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0bwogICogICAgICAgIGNyZWF0ZS4KICAqIEBwYXJlbnQ6IGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhpcyBmaWxlLiAgVGhpcyBzaG91bGQgYmUgYQpAQCAtMjMzLDExICsyMzAsMTEgQEAKICAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIGEgZGVudHJ5IGlmIGl0IHN1Y2NlZWRzLiAgVGhpcwogICogcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byB0aGUgZGVidWdmc19yZW1vdmUoKSBmdW5jdGlvbiB3aGVuIHRoZSBmaWxlIGlzCiAgKiB0byBiZSByZW1vdmVkIChubyBhdXRvbWF0aWMgY2xlYW51cCBoYXBwZW5zIGlmIHlvdXIgbW9kdWxlIGlzIHVubG9hZGVkLAotICogeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLikgIElmIGFuIGVycm9yIG9jY3VycywgTlVMTCB3aWxsIGJlIHJldHVybmVkLgorICogeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLikgIElmIGFuIGVycm9yIG9jY3VycywgJU5VTEwgd2lsbCBiZSByZXR1cm5lZC4KICAqCi0gKiBJZiBkZWJ1Z2ZzIGlzIG5vdCBlbmFibGVkIGluIHRoZSBrZXJuZWwsIHRoZSB2YWx1ZSAtRU5PREVWIHdpbGwgYmUKKyAqIElmIGRlYnVnZnMgaXMgbm90IGVuYWJsZWQgaW4gdGhlIGtlcm5lbCwgdGhlIHZhbHVlIC0lRU5PREVWIHdpbGwgYmUKICAqIHJldHVybmVkLiAgSXQgaXMgbm90IHdpc2UgdG8gY2hlY2sgZm9yIHRoaXMgdmFsdWUsIGJ1dCByYXRoZXIsIGNoZWNrIGZvcgotICogTlVMTCBvciAhTlVMTCBpbnN0ZWFkIGFzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgI2lmZGVmIGluIHRoZSBjYWxsaW5nCisgKiAlTlVMTCBvciAhJU5VTEwgaW5zdGVhZCBhcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yICNpZmRlZiBpbiB0aGUgY2FsbGluZwogICogY29kZS4KICAqLwogc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfZGlyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCkKQEAgLTI1MCw3ICsyNDcsNiBAQAogCiAvKioKICAqIGRlYnVnZnNfcmVtb3ZlIC0gcmVtb3ZlcyBhIGZpbGUgb3IgZGlyZWN0b3J5IGZyb20gdGhlIGRlYnVnZnMgZmlsZXN5c3RlbQotICoKICAqIEBkZW50cnk6IGEgcG9pbnRlciB0byBhIHRoZSBkZW50cnkgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGJlCiAgKiAgICAgICAgICByZW1vdmVkLgogICoKZGlmZiAtLWdpdCBhL2ZzL2RldnB0cy9pbm9kZS5jIGIvZnMvZGV2cHRzL2lub2RlLmMKaW5kZXggZjdhZWY1Yi4uNWY3YjVhNiAxMDA2NDQKLS0tIGEvZnMvZGV2cHRzL2lub2RlLmMKKysrIGIvZnMvZGV2cHRzL2lub2RlLmMKQEAgLTExMyw3ICsxMTMsNiBAQAogCWlub2RlLT5pX2lubyA9IDE7CiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCWlub2RlLT5pX2Jsb2NrcyA9IDA7Ci0JaW5vZGUtPmlfYmxrc2l6ZSA9IDEwMjQ7CiAJaW5vZGUtPmlfdWlkID0gaW5vZGUtPmlfZ2lkID0gMDsKIAlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPIHwgU19JV1VTUjsKIAlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CkBAIC0xNzIsMTIgKzE3MSwxMSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlub2RlLT5pX2lubyA9IG51bWJlcisyOwotCWlub2RlLT5pX2Jsa3NpemUgPSAxMDI0OwogCWlub2RlLT5pX3VpZCA9IGNvbmZpZy5zZXR1aWQgPyBjb25maWcudWlkIDogY3VycmVudC0+ZnN1aWQ7CiAJaW5vZGUtPmlfZ2lkID0gY29uZmlnLnNldGdpZCA/IGNvbmZpZy5naWQgOiBjdXJyZW50LT5mc2dpZDsKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBTX0lGQ0hSfGNvbmZpZy5tb2RlLCBkZXZpY2UpOwotCWlub2RlLT51LmdlbmVyaWNfaXAgPSB0dHk7CisJaW5vZGUtPmlfcHJpdmF0ZSA9IHR0eTsKIAogCWRlbnRyeSA9IGdldF9ub2RlKG51bWJlcik7CiAJaWYgKCFJU19FUlIoZGVudHJ5KSAmJiAhZGVudHJ5LT5kX2lub2RlKQpAQCAtMTk2LDcgKzE5NCw3IEBACiAJdHR5ID0gTlVMTDsKIAlpZiAoIUlTX0VSUihkZW50cnkpKSB7CiAJCWlmIChkZW50cnktPmRfaW5vZGUpCi0JCQl0dHkgPSBkZW50cnktPmRfaW5vZGUtPnUuZ2VuZXJpY19pcDsKKwkJCXR0eSA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOwogCQlkcHV0KGRlbnRyeSk7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9lZnMvc3VwZXIuYyBiL2ZzL2Vmcy9zdXBlci5jCmluZGV4IDhhYzI0NjIuLmIzZjUwNjUgMTAwNjQ0Ci0tLSBhL2ZzL2Vmcy9zdXBlci5jCisrKyBiL2ZzL2Vmcy9zdXBlci5jCkBAIC05MCw4ICs5MCw3IEBACiAKIHN0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQogewotCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koZWZzX2lub2RlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gImVmc19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworCWttZW1fY2FjaGVfZGVzdHJveShlZnNfaW5vZGVfY2FjaGVwKTsKIH0KIAogc3RhdGljIHZvaWQgZWZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCkBAIC0yNDgsMTEgKzI0NywxMCBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJc3RydWN0IGlub2RlICpyb290OwogCi0gCXNiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisgCXNiID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYikKIAkJcmV0dXJuIC1FTk9NRU07CiAJcy0+c19mc19pbmZvID0gc2I7Ci0JbWVtc2V0KHNiLCAwLCBzaXplb2Yoc3RydWN0IGVmc19zYl9pbmZvKSk7CiAgCiAJcy0+c19tYWdpYwkJPSBFRlNfU1VQRVJfTUFHSUM7CiAJaWYgKCFzYl9zZXRfYmxvY2tzaXplKHMsIEVGU19CTE9DS1NJWkUpKSB7CmRpZmYgLS1naXQgYS9mcy9ldmVudHBvbGwuYyBiL2ZzL2V2ZW50cG9sbC5jCmluZGV4IDNhMzU2NzQuLjhkNTQ0MzMgMTAwNjQ0Ci0tLSBhL2ZzL2V2ZW50cG9sbC5jCisrKyBiL2ZzL2V2ZW50cG9sbC5jCkBAIC0xNTkwLDcgKzE1OTAsNiBAQAogCWlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOwogCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOwogCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKLQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOwogCXJldHVybiBpbm9kZTsKIAogZWV4aXRfMToKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwppbmRleCA1NDEzNWRmLi45N2RmNmUwIDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMvZXhlYy5jCkBAIC01OTUsNyArNTk1LDcgQEAKIAlpZiAoIW5ld3NpZ2hhbmQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKHRocmVhZF9ncm91cF9lbXB0eShjdXJyZW50KSkKKwlpZiAodGhyZWFkX2dyb3VwX2VtcHR5KHRzaykpCiAJCWdvdG8gbm9fdGhyZWFkX2dyb3VwOwogCiAJLyoKQEAgLTYyMCwxNyArNjIwLDE3IEBACiAJICogUmVwYXJlbnRpbmcgbmVlZHMgd3JpdGVfbG9jayBvbiB0YXNrbGlzdF9sb2NrLAogCSAqIHNvIGl0IGlzIHNhZmUgdG8gZG8gaXQgdW5kZXIgcmVhZF9sb2NrLgogCSAqLwotCWlmICh1bmxpa2VseShjdXJyZW50LT5ncm91cF9sZWFkZXIgPT0gY2hpbGRfcmVhcGVyKSkKLQkJY2hpbGRfcmVhcGVyID0gY3VycmVudDsKKwlpZiAodW5saWtlbHkodHNrLT5ncm91cF9sZWFkZXIgPT0gY2hpbGRfcmVhcGVyKSkKKwkJY2hpbGRfcmVhcGVyID0gdHNrOwogCi0JemFwX290aGVyX3RocmVhZHMoY3VycmVudCk7CisJemFwX290aGVyX3RocmVhZHModHNrKTsKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAKIAkvKgogCSAqIEFjY291bnQgZm9yIHRoZSB0aHJlYWQgZ3JvdXAgbGVhZGVyIGhhbmdpbmcgYXJvdW5kOgogCSAqLwogCWNvdW50ID0gMTsKLQlpZiAoIXRocmVhZF9ncm91cF9sZWFkZXIoY3VycmVudCkpIHsKKwlpZiAoIXRocmVhZF9ncm91cF9sZWFkZXIodHNrKSkgewogCQljb3VudCA9IDI7CiAJCS8qCiAJCSAqIFRoZSBTSUdBTFJNIHRpbWVyIHN1cnZpdmVzIHRoZSBleGVjLCBidXQgbmVlZHMgdG8gcG9pbnQKQEAgLTYzOSwxNCArNjM5LDE0IEBACiAJCSAqIHN5bmNocm9uaXplIHdpdGggYW55IGZpcmluZyAoYnkgY2FsbGluZyBkZWxfdGltZXJfc3luYykKIAkJICogYmVmb3JlIHdlIGNhbiBzYWZlbHkgbGV0IHRoZSBvbGQgZ3JvdXAgbGVhZGVyIGRpZS4KIAkJICovCi0JCXNpZy0+dHNrID0gY3VycmVudDsKKwkJc2lnLT50c2sgPSB0c2s7CiAJCXNwaW5fdW5sb2NrX2lycShsb2NrKTsKIAkJaWYgKGhydGltZXJfY2FuY2VsKCZzaWctPnJlYWxfdGltZXIpKQogCQkJaHJ0aW1lcl9yZXN0YXJ0KCZzaWctPnJlYWxfdGltZXIpOwogCQlzcGluX2xvY2tfaXJxKGxvY2spOwogCX0KIAl3aGlsZSAoYXRvbWljX3JlYWQoJnNpZy0+Y291bnQpID4gY291bnQpIHsKLQkJc2lnLT5ncm91cF9leGl0X3Rhc2sgPSBjdXJyZW50OworCQlzaWctPmdyb3VwX2V4aXRfdGFzayA9IHRzazsKIAkJc2lnLT5ub3RpZnlfY291bnQgPSBjb3VudDsKIAkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiAJCXNwaW5fdW5sb2NrX2lycShsb2NrKTsKQEAgLTY2MiwxMyArNjYyLDEzIEBACiAJICogZG8gaXMgdG8gd2FpdCBmb3IgdGhlIHRocmVhZCBncm91cCBsZWFkZXIgdG8gYmVjb21lIGluYWN0aXZlLAogCSAqIGFuZCB0byBhc3N1bWUgaXRzIFBJRDoKIAkgKi8KLQlpZiAoIXRocmVhZF9ncm91cF9sZWFkZXIoY3VycmVudCkpIHsKKwlpZiAoIXRocmVhZF9ncm91cF9sZWFkZXIodHNrKSkgewogCQkvKgogCQkgKiBXYWl0IGZvciB0aGUgdGhyZWFkIGdyb3VwIGxlYWRlciB0byBiZSBhIHpvbWJpZS4KIAkJICogSXQgc2hvdWxkIGFscmVhZHkgYmUgem9tYmllIGF0IHRoaXMgcG9pbnQsIG1vc3QKIAkJICogb2YgdGhlIHRpbWUuCiAJCSAqLwotCQlsZWFkZXIgPSBjdXJyZW50LT5ncm91cF9sZWFkZXI7CisJCWxlYWRlciA9IHRzay0+Z3JvdXBfbGVhZGVyOwogCQl3aGlsZSAobGVhZGVyLT5leGl0X3N0YXRlICE9IEVYSVRfWk9NQklFKQogCQkJeWllbGQoKTsKIApAQCAtNjgyLDEyICs2ODIsMTIgQEAKIAkJICogV2hlbiB3ZSB0YWtlIG9uIGl0cyBpZGVudGl0eSBieSBzd2l0Y2hpbmcgdG8gaXRzIFBJRCwgd2UKIAkJICogYWxzbyB0YWtlIGl0cyBiaXJ0aGRhdGUgKGFsd2F5cyBlYXJsaWVyIHRoYW4gb3VyIG93bikuCiAJCSAqLwotCQljdXJyZW50LT5zdGFydF90aW1lID0gbGVhZGVyLT5zdGFydF90aW1lOworCQl0c2stPnN0YXJ0X3RpbWUgPSBsZWFkZXItPnN0YXJ0X3RpbWU7CiAKIAkJd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwogCi0JCUJVR19PTihsZWFkZXItPnRnaWQgIT0gY3VycmVudC0+dGdpZCk7Ci0JCUJVR19PTihjdXJyZW50LT5waWQgPT0gY3VycmVudC0+dGdpZCk7CisJCUJVR19PTihsZWFkZXItPnRnaWQgIT0gdHNrLT50Z2lkKTsKKwkJQlVHX09OKHRzay0+cGlkID09IHRzay0+dGdpZCk7CiAJCS8qCiAJCSAqIEFuIGV4ZWMoKSBzdGFydHMgYSBuZXcgdGhyZWFkIGdyb3VwIHdpdGggdGhlCiAJCSAqIFRHSUQgb2YgdGhlIHByZXZpb3VzIHRocmVhZCBncm91cC4gUmVoYXNoIHRoZQpAQCAtNjk2LDI0ICs2OTYsMjEgQEAKIAkJICovCiAKIAkJLyogQmVjb21lIGEgcHJvY2VzcyBncm91cCBsZWFkZXIgd2l0aCB0aGUgb2xkIGxlYWRlcidzIHBpZC4KLQkJICogTm90ZTogVGhlIG9sZCBsZWFkZXIgYWxzbyB1c2VzIHRoaXNwaWQgdW50aWwgcmVsZWFzZV90YXNrCisJCSAqIFRoZSBvbGQgbGVhZGVyIGJlY29tZXMgYSB0aHJlYWQgb2YgdGhlIHRoaXMgdGhyZWFkIGdyb3VwLgorCQkgKiBOb3RlOiBUaGUgb2xkIGxlYWRlciBhbHNvIHVzZXMgdGhpcyBwaWQgdW50aWwgcmVsZWFzZV90YXNrCiAJCSAqICAgICAgIGlzIGNhbGxlZC4gIE9kZCBidXQgc2ltcGxlIGFuZCBjb3JyZWN0LgogCQkgKi8KLQkJZGV0YWNoX3BpZChjdXJyZW50LCBQSURUWVBFX1BJRCk7Ci0JCWN1cnJlbnQtPnBpZCA9IGxlYWRlci0+cGlkOwotCQlhdHRhY2hfcGlkKGN1cnJlbnQsIFBJRFRZUEVfUElELCAgY3VycmVudC0+cGlkKTsKLQkJYXR0YWNoX3BpZChjdXJyZW50LCBQSURUWVBFX1BHSUQsIGN1cnJlbnQtPnNpZ25hbC0+cGdycCk7Ci0JCWF0dGFjaF9waWQoY3VycmVudCwgUElEVFlQRV9TSUQsICBjdXJyZW50LT5zaWduYWwtPnNlc3Npb24pOwotCQlsaXN0X3JlcGxhY2VfcmN1KCZsZWFkZXItPnRhc2tzLCAmY3VycmVudC0+dGFza3MpOworCQlkZXRhY2hfcGlkKHRzaywgUElEVFlQRV9QSUQpOworCQl0c2stPnBpZCA9IGxlYWRlci0+cGlkOworCQlhdHRhY2hfcGlkKHRzaywgUElEVFlQRV9QSUQsICB0c2stPnBpZCk7CisJCXRyYW5zZmVyX3BpZChsZWFkZXIsIHRzaywgUElEVFlQRV9QR0lEKTsKKwkJdHJhbnNmZXJfcGlkKGxlYWRlciwgdHNrLCBQSURUWVBFX1NJRCk7CisJCWxpc3RfcmVwbGFjZV9yY3UoJmxlYWRlci0+dGFza3MsICZ0c2stPnRhc2tzKTsKIAotCQljdXJyZW50LT5ncm91cF9sZWFkZXIgPSBjdXJyZW50OwotCQlsZWFkZXItPmdyb3VwX2xlYWRlciA9IGN1cnJlbnQ7CisJCXRzay0+Z3JvdXBfbGVhZGVyID0gdHNrOworCQlsZWFkZXItPmdyb3VwX2xlYWRlciA9IHRzazsKIAotCQkvKiBSZWR1Y2UgbGVhZGVyIHRvIGEgdGhyZWFkICovCi0JCWRldGFjaF9waWQobGVhZGVyLCBQSURUWVBFX1BHSUQpOwotCQlkZXRhY2hfcGlkKGxlYWRlciwgUElEVFlQRV9TSUQpOwotCi0JCWN1cnJlbnQtPmV4aXRfc2lnbmFsID0gU0lHQ0hMRDsKKwkJdHNrLT5leGl0X3NpZ25hbCA9IFNJR0NITEQ7CiAKIAkJQlVHX09OKGxlYWRlci0+ZXhpdF9zdGF0ZSAhPSBFWElUX1pPTUJJRSk7CiAJCWxlYWRlci0+ZXhpdF9zdGF0ZSA9IEVYSVRfREVBRDsKQEAgLTc1Myw3ICs3NTAsNyBAQAogCQlzcGluX2xvY2soJm9sZHNpZ2hhbmQtPnNpZ2xvY2spOwogCQlzcGluX2xvY2tfbmVzdGVkKCZuZXdzaWdoYW5kLT5zaWdsb2NrLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKGN1cnJlbnQtPnNpZ2hhbmQsIG5ld3NpZ2hhbmQpOworCQlyY3VfYXNzaWduX3BvaW50ZXIodHNrLT5zaWdoYW5kLCBuZXdzaWdoYW5kKTsKIAkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKIAogCQlzcGluX3VubG9jaygmbmV3c2lnaGFuZC0+c2lnbG9jayk7CkBAIC03NjQsNyArNzYxLDcgQEAKIAkJCWttZW1fY2FjaGVfZnJlZShzaWdoYW5kX2NhY2hlcCwgb2xkc2lnaGFuZCk7CiAJfQogCi0JQlVHX09OKCF0aHJlYWRfZ3JvdXBfbGVhZGVyKGN1cnJlbnQpKTsKKwlCVUdfT04oIXRocmVhZF9ncm91cF9sZWFkZXIodHNrKSk7CiAJcmV0dXJuIDA7CiB9CiAJCmRpZmYgLS1naXQgYS9mcy9leHQyL2FjbC5jIGIvZnMvZXh0Mi9hY2wuYwppbmRleCBkYTUyYjRhLi43YzQyMGI4IDEwMDY0NAotLS0gYS9mcy9leHQyL2FjbC5jCisrKyBiL2ZzL2V4dDIvYWNsLmMKQEAgLTg5LDggKzg5LDggQEAKIAlzaXplX3QgbjsKIAogCSpzaXplID0gZXh0Ml9hY2xfc2l6ZShhY2wtPmFfY291bnQpOwotCWV4dF9hY2wgPSAoZXh0Ml9hY2xfaGVhZGVyICopa21hbGxvYyhzaXplb2YoZXh0Ml9hY2xfaGVhZGVyKSArCi0JCWFjbC0+YV9jb3VudCAqIHNpemVvZihleHQyX2FjbF9lbnRyeSksIEdGUF9LRVJORUwpOworCWV4dF9hY2wgPSBrbWFsbG9jKHNpemVvZihleHQyX2FjbF9oZWFkZXIpICsgYWNsLT5hX2NvdW50ICoKKwkJCXNpemVvZihleHQyX2FjbF9lbnRyeSksIEdGUF9LRVJORUwpOwogCWlmICghZXh0X2FjbCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJZXh0X2FjbC0+YV92ZXJzaW9uID0gY3B1X3RvX2xlMzIoRVhUMl9BQ0xfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9mcy9leHQyL2lhbGxvYy5jIGIvZnMvZXh0Mi9pYWxsb2MuYwppbmRleCA2OTVmNjljLi4yY2I1NDViIDEwMDY0NAotLS0gYS9mcy9leHQyL2lhbGxvYy5jCisrKyBiL2ZzL2V4dDIvaWFsbG9jLmMKQEAgLTU3NCw3ICs1NzQsNiBAQAogCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCiAJaW5vZGUtPmlfaW5vID0gaW5vOwotCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7CS8qIFRoaXMgaXMgdGhlIG9wdGltYWwgSU8gc2l6ZSAoZm9yIHN0YXQpLCBub3QgdGhlIGZzIGJsb2NrIHNpemUgKi8KIAlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CiAJbWVtc2V0KGVpLT5pX2RhdGEsIDAsIHNpemVvZihlaS0+aV9kYXRhKSk7CmRpZmYgLS1naXQgYS9mcy9leHQyL2lub2RlLmMgYi9mcy9leHQyL2lub2RlLmMKaW5kZXggZmI0ZDMyMi4uZGQ0ZTE0YyAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9pbm9kZS5jCisrKyBiL2ZzL2V4dDIvaW5vZGUuYwpAQCAtMTA5NCw3ICsxMDk0LDYgQEAKIAkJYnJlbHNlIChiaCk7CiAJCWdvdG8gYmFkX2lub2RlOwogCX0KLQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOwkvKiBUaGlzIGlzIHRoZSBvcHRpbWFsIElPIHNpemUgKGZvciBzdGF0KSwgbm90IHRoZSBmcyBibG9jayBzaXplICovCiAJaW5vZGUtPmlfYmxvY2tzID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2Jsb2Nrcyk7CiAJZWktPmlfZmxhZ3MgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZmxhZ3MpOwogCWVpLT5pX2ZhZGRyID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2ZhZGRyKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvc3VwZXIuYyBiL2ZzL2V4dDIvc3VwZXIuYwppbmRleCA0Mjg2ZmY2Li41MTNjZDQyIDEwMDY0NAotLS0gYS9mcy9leHQyL3N1cGVyLmMKKysrIGIvZnMvZXh0Mi9zdXBlci5jCkBAIC0xODQsOCArMTg0LDcgQEAKIAogc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCiB7Ci0JaWYgKGttZW1fY2FjaGVfZGVzdHJveShleHQyX2lub2RlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gImV4dDJfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koZXh0Ml9pbm9kZV9jYWNoZXApOwogfQogCiBzdGF0aWMgdm9pZCBleHQyX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCkBAIC01NDQsMTcgKzU0MywyNCBAQAogCWludCBpOwogCWludCBkZXNjX2Jsb2NrID0gMDsKIAlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmkgPSBFWFQyX1NCKHNiKTsKLQl1bnNpZ25lZCBsb25nIGJsb2NrID0gbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCXVuc2lnbmVkIGxvbmcgZmlyc3RfYmxvY2sgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJdW5zaWduZWQgbG9uZyBsYXN0X2Jsb2NrOwogCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKiBnZHAgPSBOVUxMOwogCiAJZXh0Ml9kZWJ1ZyAoIkNoZWNraW5nIGdyb3VwIGRlc2NyaXB0b3JzIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2JpLT5zX2dyb3Vwc19jb3VudDsgaSsrKQogCXsKKwkJaWYgKGkgPT0gc2JpLT5zX2dyb3Vwc19jb3VudCAtIDEpCisJCQlsYXN0X2Jsb2NrID0gbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2Jsb2Nrc19jb3VudCkgLSAxOworCQllbHNlCisJCQlsYXN0X2Jsb2NrID0gZmlyc3RfYmxvY2sgKworCQkJCShFWFQyX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMSk7CisKIAkJaWYgKChpICUgRVhUMl9ERVNDX1BFUl9CTE9DSyhzYikpID09IDApCiAJCQlnZHAgPSAoc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqKSBzYmktPnNfZ3JvdXBfZGVzY1tkZXNjX2Jsb2NrKytdLT5iX2RhdGE7Ci0JCWlmIChsZTMyX3RvX2NwdShnZHAtPmJnX2Jsb2NrX2JpdG1hcCkgPCBibG9jayB8fAotCQkgICAgbGUzMl90b19jcHUoZ2RwLT5iZ19ibG9ja19iaXRtYXApID49IGJsb2NrICsgRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKSkKKwkJaWYgKGxlMzJfdG9fY3B1KGdkcC0+YmdfYmxvY2tfYml0bWFwKSA8IGZpcnN0X2Jsb2NrIHx8CisJCSAgICBsZTMyX3RvX2NwdShnZHAtPmJnX2Jsb2NrX2JpdG1hcCkgPiBsYXN0X2Jsb2NrKQogCQl7CiAJCQlleHQyX2Vycm9yIChzYiwgImV4dDJfY2hlY2tfZGVzY3JpcHRvcnMiLAogCQkJCSAgICAiQmxvY2sgYml0bWFwIGZvciBncm91cCAlZCIKQEAgLTU2Miw4ICs1NjgsOCBAQAogCQkJCSAgICBpLCAodW5zaWduZWQgbG9uZykgbGUzMl90b19jcHUoZ2RwLT5iZ19ibG9ja19iaXRtYXApKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCWlmIChsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX2JpdG1hcCkgPCBibG9jayB8fAotCQkgICAgbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV9iaXRtYXApID49IGJsb2NrICsgRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKSkKKwkJaWYgKGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfYml0bWFwKSA8IGZpcnN0X2Jsb2NrIHx8CisJCSAgICBsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX2JpdG1hcCkgPiBsYXN0X2Jsb2NrKQogCQl7CiAJCQlleHQyX2Vycm9yIChzYiwgImV4dDJfY2hlY2tfZGVzY3JpcHRvcnMiLAogCQkJCSAgICAiSW5vZGUgYml0bWFwIGZvciBncm91cCAlZCIKQEAgLTU3MSw5ICs1NzcsOSBAQAogCQkJCSAgICBpLCAodW5zaWduZWQgbG9uZykgbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV9iaXRtYXApKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCWlmIChsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX3RhYmxlKSA8IGJsb2NrIHx8Ci0JCSAgICBsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX3RhYmxlKSArIHNiaS0+c19pdGJfcGVyX2dyb3VwID49Ci0JCSAgICBibG9jayArIEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYikpCisJCWlmIChsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX3RhYmxlKSA8IGZpcnN0X2Jsb2NrIHx8CisJCSAgICBsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX3RhYmxlKSArIHNiaS0+c19pdGJfcGVyX2dyb3VwID4KKwkJICAgIGxhc3RfYmxvY2spCiAJCXsKIAkJCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9jaGVja19kZXNjcmlwdG9ycyIsCiAJCQkJICAgICJJbm9kZSB0YWJsZSBmb3IgZ3JvdXAgJWQiCkBAIC01ODEsNyArNTg3LDcgQEAKIAkJCQkgICAgaSwgKHVuc2lnbmVkIGxvbmcpIGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCWJsb2NrICs9IEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJCWZpcnN0X2Jsb2NrICs9IEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYik7CiAJCWdkcCsrOwogCX0KIAlyZXR1cm4gMTsKQEAgLTY0OCwxMSArNjU0LDEwIEBACiAJaW50IGksIGo7CiAJX19sZTMyIGZlYXR1cmVzOwogCi0Jc2JpID0ga21hbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOworCXNiaSA9IGt6YWxsb2Moc2l6ZW9mKCpzYmkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNiaSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJc2ItPnNfZnNfaW5mbyA9IHNiaTsKLQltZW1zZXQoc2JpLCAwLCBzaXplb2YoKnNiaSkpOwogCiAJLyoKIAkgKiBTZWUgd2hhdCB0aGUgY3VycmVudCBibG9ja3NpemUgZm9yIHRoZSBkZXZpY2UgaXMsIGFuZApAQCAtODYxLDEwICs4NjYsOSBAQAogCiAJaWYgKEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYikgPT0gMCkKIAkJZ290byBjYW50ZmluZF9leHQyOwotCXNiaS0+c19ncm91cHNfY291bnQgPSAobGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSAtCi0JCQkJICAgICAgICBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArCi0JCQkJICAgICAgIEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYikgLSAxKSAvCi0JCQkJICAgICAgIEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisgCXNiaS0+c19ncm91cHNfY291bnQgPSAoKGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgLQorIAkJCQlsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSAtIDEpCisgCQkJCQkvIEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYikpICsgMTsKIAlkYl9jb3VudCA9IChzYmktPnNfZ3JvdXBzX2NvdW50ICsgRVhUMl9ERVNDX1BFUl9CTE9DSyhzYikgLSAxKSAvCiAJCSAgIEVYVDJfREVTQ19QRVJfQkxPQ0soc2IpOwogCXNiaS0+c19ncm91cF9kZXNjID0ga21hbGxvYyAoZGJfY291bnQgKiBzaXplb2YgKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9mcy9leHQyL3hhdHRyLmMgYi9mcy9leHQyL3hhdHRyLmMKaW5kZXggODZhZThlOS4uYWY1MmE3ZiAxMDA2NDQKLS0tIGEvZnMvZXh0Mi94YXR0ci5jCisrKyBiL2ZzL2V4dDIveGF0dHIuYwpAQCAtNTIxLDExICs1MjEsMTAgQEAKIAkJfQogCX0gZWxzZSB7CiAJCS8qIEFsbG9jYXRlIGEgYnVmZmVyIHdoZXJlIHdlIGNvbnN0cnVjdCB0aGUgbmV3IGJsb2NrLiAqLwotCQloZWFkZXIgPSBrbWFsbG9jKHNiLT5zX2Jsb2Nrc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWhlYWRlciA9IGt6YWxsb2Moc2ItPnNfYmxvY2tzaXplLCBHRlBfS0VSTkVMKTsKIAkJZXJyb3IgPSAtRU5PTUVNOwogCQlpZiAoaGVhZGVyID09IE5VTEwpCiAJCQlnb3RvIGNsZWFudXA7Ci0JCW1lbXNldChoZWFkZXIsIDAsIHNiLT5zX2Jsb2Nrc2l6ZSk7CiAJCWVuZCA9IChjaGFyICopaGVhZGVyICsgc2ItPnNfYmxvY2tzaXplOwogCQloZWFkZXItPmhfbWFnaWMgPSBjcHVfdG9fbGUzMihFWFQyX1hBVFRSX01BR0lDKTsKIAkJaGVhZGVyLT5oX2Jsb2NrcyA9IGhlYWRlci0+aF9yZWZjb3VudCA9IGNwdV90b19sZTMyKDEpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9hY2wuYyBiL2ZzL2V4dDMvYWNsLmMKaW5kZXggMGQyMWQ1NS4uMWU1MDM4ZCAxMDA2NDQKLS0tIGEvZnMvZXh0My9hY2wuYworKysgYi9mcy9leHQzL2FjbC5jCkBAIC05MCw4ICs5MCw4IEBACiAJc2l6ZV90IG47CiAKIAkqc2l6ZSA9IGV4dDNfYWNsX3NpemUoYWNsLT5hX2NvdW50KTsKLQlleHRfYWNsID0gKGV4dDNfYWNsX2hlYWRlciAqKWttYWxsb2Moc2l6ZW9mKGV4dDNfYWNsX2hlYWRlcikgKwotCQlhY2wtPmFfY291bnQgKiBzaXplb2YoZXh0M19hY2xfZW50cnkpLCBHRlBfS0VSTkVMKTsKKwlleHRfYWNsID0ga21hbGxvYyhzaXplb2YoZXh0M19hY2xfaGVhZGVyKSArIGFjbC0+YV9jb3VudCAqCisJCQlzaXplb2YoZXh0M19hY2xfZW50cnkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWV4dF9hY2wpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCWV4dF9hY2wtPmFfdmVyc2lvbiA9IGNwdV90b19sZTMyKEVYVDNfQUNMX1ZFUlNJT04pOwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0gCWlmIChhY2wpIHsKKwlpZiAoYWNsKSB7CiAJCXZhbHVlID0gZXh0M19hY2xfdG9fZGlzayhhY2wsICZzaXplKTsKIAkJaWYgKElTX0VSUih2YWx1ZSkpCiAJCQlyZXR1cm4gKGludClQVFJfRVJSKHZhbHVlKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvYmFsbG9jLmMgYi9mcy9leHQzL2JhbGxvYy5jCmluZGV4IDA2M2Q5OTQuLmI0MWE3ZDcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvYmFsbG9jLmMKKysrIGIvZnMvZXh0My9iYWxsb2MuYwpAQCAtMzgsNiArMzgsMTMgQEAKIAogI2RlZmluZSBpbl9yYW5nZShiLCBmaXJzdCwgbGVuKQkoKGIpID49IChmaXJzdCkgJiYgKGIpIDw9IChmaXJzdCkgKyAobGVuKSAtIDEpCiAKKy8qKgorICogZXh0M19nZXRfZ3JvdXBfZGVzYygpIC0tIGxvYWQgZ3JvdXAgZGVzY3JpcHRvciBmcm9tIGRpc2sKKyAqIEBzYjoJCQlzdXBlciBibG9jaworICogQGJsb2NrX2dyb3VwOglnaXZlbiBibG9jayBncm91cAorICogQGJoOgkJCXBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBoZWFkIHRvIHN0b3JlIHRoZSBibG9jaworICoJCQlncm91cCBkZXNjcmlwdG9yCisgKi8KIHN0cnVjdCBleHQzX2dyb3VwX2Rlc2MgKiBleHQzX2dldF9ncm91cF9kZXNjKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAogCQkJCQkgICAgIHVuc2lnbmVkIGludCBibG9ja19ncm91cCwKIAkJCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogYmgpCkBAIC03Myw4ICs4MCwxMiBAQAogCXJldHVybiBkZXNjICsgb2Zmc2V0OwogfQogCi0vKgotICogUmVhZCB0aGUgYml0bWFwIGZvciBhIGdpdmVuIGJsb2NrX2dyb3VwLCByZWFkaW5nIGludG8gdGhlIHNwZWNpZmllZCAKKy8qKgorICogcmVhZF9ibG9ja19iaXRtYXAoKQorICogQHNiOgkJCXN1cGVyIGJsb2NrCisgKiBAYmxvY2tfZ3JvdXA6CWdpdmVuIGJsb2NrIGdyb3VwCisgKgorICogUmVhZCB0aGUgYml0bWFwIGZvciBhIGdpdmVuIGJsb2NrX2dyb3VwLCByZWFkaW5nIGludG8gdGhlIHNwZWNpZmllZAogICogc2xvdCBpbiB0aGUgc3VwZXJibG9jaydzIGJpdG1hcCBjYWNoZS4KICAqCiAgKiBSZXR1cm4gYnVmZmVyX2hlYWQgb24gc3VjY2VzcyBvciBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZS4KQEAgLTEwMywxNSArMTE0LDIyIEBACiAgKiBPcGVyYXRpb25zIGluY2x1ZGU6CiAgKiBkdW1wLCBmaW5kLCBhZGQsIHJlbW92ZSwgaXNfZW1wdHksIGZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdywgZXRjLgogICoKLSAqIFdlIHVzZSBzb3J0ZWQgZG91YmxlIGxpbmtlZCBsaXN0IGZvciB0aGUgcGVyLWZpbGVzeXN0ZW0gcmVzZXJ2YXRpb24KLSAqIHdpbmRvdyBsaXN0LiAobGlrZSBpbiB2bV9yZWdpb24pLgorICogV2UgdXNlIGEgcmVkLWJsYWNrIHRyZWUgdG8gcmVwcmVzZW50IHBlci1maWxlc3lzdGVtIHJlc2VydmF0aW9uCisgKiB3aW5kb3dzLgogICoKLSAqIEluaXRpYWxseSwgd2Uga2VlcCB0aG9zZSBzbWFsbCBvcGVyYXRpb25zIGluIHRoZSBhYnN0cmFjdCBmdW5jdGlvbnMsCi0gKiBzbyBsYXRlciBpZiB3ZSBuZWVkIGEgYmV0dGVyIHNlYXJjaGluZyB0cmVlIHRoYW4gZG91YmxlIGxpbmtlZC1saXN0LAotICogd2UgY291bGQgZWFzaWx5IHN3aXRjaCB0byB0aGF0IHdpdGhvdXQgY2hhbmdpbmcgdG9vIG11Y2gKLSAqIGNvZGUuCiAgKi8KLSNpZiAwCisKKy8qKgorICogX19yc3Zfd2luZG93X2R1bXAoKSAtLSBEdW1wIHRoZSBmaWxlc3lzdGVtIGJsb2NrIGFsbG9jYXRpb24gcmVzZXJ2YXRpb24gbWFwCisgKiBAcmJfcm9vdDoJCXJvb3Qgb2YgcGVyLWZpbGVzeXN0ZW0gcmVzZXJ2YXRpb24gcmIgdHJlZQorICogQHZlcmJvc2U6CQl2ZXJib3NlIG1vZGUKKyAqIEBmbjoJCQlmdW5jdGlvbiB3aGljaCB3aXNoZXMgdG8gZHVtcCB0aGUgcmVzZXJ2YXRpb24gbWFwCisgKgorICogSWYgdmVyYm9zZSBpcyB0dXJuZWQgb24sIGl0IHdpbGwgcHJpbnQgdGhlIHdob2xlIGJsb2NrIHJlc2VydmF0aW9uCisgKiB3aW5kb3dzKHN0YXJ0LCBlbmQpLglPdGhlcndpc2UsIGl0IHdpbGwgb25seSBwcmludCBvdXQgdGhlICJiYWQiIHdpbmRvd3MsCisgKiB0aG9zZSB3aW5kb3dzIHRoYXQgb3ZlcmxhcCB3aXRoIHRoZWlyIGltbWVkaWF0ZSBuZWlnaGJvcnMuCisgKi8KKyNpZiAxCiBzdGF0aWMgdm9pZCBfX3Jzdl93aW5kb3dfZHVtcChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgaW50IHZlcmJvc2UsCiAJCQkgICAgICBjb25zdCBjaGFyICpmbikKIHsKQEAgLTEyOSw3ICsxNDcsNyBAQAogCQlyc3YgPSBsaXN0X2VudHJ5KG4sIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUsIHJzdl9ub2RlKTsKIAkJaWYgKHZlcmJvc2UpCiAJCQlwcmludGsoInJlc2VydmF0aW9uIHdpbmRvdyAweCVwICIKLQkJCSAgICAgICAic3RhcnQ6ICAlZCwgZW5kOiAgJWRcbiIsCisJCQkgICAgICAgInN0YXJ0OiAgJWx1LCBlbmQ6ICAlbHVcbiIsCiAJCQkgICAgICAgcnN2LCByc3YtPnJzdl9zdGFydCwgcnN2LT5yc3ZfZW5kKTsKIAkJaWYgKHJzdi0+cnN2X3N0YXJ0ICYmIHJzdi0+cnN2X3N0YXJ0ID49IHJzdi0+cnN2X2VuZCkgewogCQkJcHJpbnRrKCJCYWQgcmVzZXJ2YXRpb24gJXAgKHN0YXJ0ID49IGVuZClcbiIsCkBAIC0xNjEsNiArMTc5LDIyIEBACiAjZGVmaW5lIHJzdl93aW5kb3dfZHVtcChyb290LCB2ZXJib3NlKSBkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgogCisvKioKKyAqIGdvYWxfaW5fbXlfcmVzZXJ2YXRpb24oKQorICogQHJzdjoJCWlub2RlJ3MgcmVzZXJ2YXRpb24gd2luZG93CisgKiBAZ3JwX2dvYWw6CQlnaXZlbiBnb2FsIGJsb2NrIHJlbGF0aXZlIHRvIHRoZSBhbGxvY2F0aW9uIGJsb2NrIGdyb3VwCisgKiBAZ3JvdXA6CQl0aGUgY3VycmVudCBhbGxvY2F0aW9uIGJsb2NrIGdyb3VwCisgKiBAc2I6CQkJZmlsZXN5c3RlbSBzdXBlciBibG9jaworICoKKyAqIFRlc3QgaWYgdGhlIGdpdmVuIGdvYWwgYmxvY2sgKGdyb3VwIHJlbGF0aXZlKSBpcyB3aXRoaW4gdGhlIGZpbGUncworICogb3duIGJsb2NrIHJlc2VydmF0aW9uIHdpbmRvdyByYW5nZS4KKyAqCisgKiBJZiB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGlzIG91dHNpZGUgdGhlIGdvYWwgYWxsb2NhdGlvbiBncm91cCwgcmV0dXJuIDA7CisgKiBncnBfZ29hbCAoZ2l2ZW4gZ29hbCBibG9jaykgY291bGQgYmUgLTEsIHdoaWNoIG1lYW5zIG5vIHNwZWNpZmljCisgKiBnb2FsIGJsb2NrLiBJbiB0aGlzIGNhc2UsIGFsd2F5cyByZXR1cm4gMS4KKyAqIElmIHRoZSBnb2FsIGJsb2NrIGlzIHdpdGhpbiB0aGUgcmVzZXJ2YXRpb24gd2luZG93LCByZXR1cm4gMTsKKyAqIG90aGVyd2lzZSwgcmV0dXJuIDA7CisgKi8KIHN0YXRpYyBpbnQKIGdvYWxfaW5fbXlfcmVzZXJ2YXRpb24oc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3cgKnJzdiwgZXh0M19ncnBibGtfdCBncnBfZ29hbCwKIAkJCXVuc2lnbmVkIGludCBncm91cCwgc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCkBAIC0xNjgsNyArMjAyLDcgQEAKIAlleHQzX2ZzYmxrX3QgZ3JvdXBfZmlyc3RfYmxvY2ssIGdyb3VwX2xhc3RfYmxvY2s7CiAKIAlncm91cF9maXJzdF9ibG9jayA9IGV4dDNfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGdyb3VwKTsKLQlncm91cF9sYXN0X2Jsb2NrID0gZ3JvdXBfZmlyc3RfYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMTsKKwlncm91cF9sYXN0X2Jsb2NrID0gZ3JvdXBfZmlyc3RfYmxvY2sgKyAoRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSAtIDEpOwogCiAJaWYgKChyc3YtPl9yc3Zfc3RhcnQgPiBncm91cF9sYXN0X2Jsb2NrKSB8fAogCSAgICAocnN2LT5fcnN2X2VuZCA8IGdyb3VwX2ZpcnN0X2Jsb2NrKSkKQEAgLTE3OSw3ICsyMTMsMTEgQEAKIAlyZXR1cm4gMTsKIH0KIAotLyoKKy8qKgorICogc2VhcmNoX3Jlc2VydmVfd2luZG93KCkKKyAqIEByYl9yb290OgkJcm9vdCBvZiByZXNlcnZhdGlvbiB0cmVlCisgKiBAZ29hbDoJCXRhcmdldCBhbGxvY2F0aW9uIGJsb2NrCisgKgogICogRmluZCB0aGUgcmVzZXJ2ZWQgd2luZG93IHdoaWNoIGluY2x1ZGVzIHRoZSBnb2FsLCBvciB0aGUgcHJldmlvdXMgb25lCiAgKiBpZiB0aGUgZ29hbCBpcyBub3QgaW4gYW55IHdpbmRvdy4KICAqIFJldHVybnMgTlVMTCBpZiB0aGVyZSBhcmUgbm8gd2luZG93cyBvciBpZiBhbGwgd2luZG93cyBzdGFydCBhZnRlciB0aGUgZ29hbC4KQEAgLTIxNiw2ICsyNTQsMTMgQEAKIAlyZXR1cm4gcnN2OwogfQogCisvKioKKyAqIGV4dDNfcnN2X3dpbmRvd19hZGQoKSAtLSBJbnNlcnQgYSB3aW5kb3cgdG8gdGhlIGJsb2NrIHJlc2VydmF0aW9uIHJiIHRyZWUuCisgKiBAc2I6CQkJc3VwZXIgYmxvY2sKKyAqIEByc3Y6CQlyZXNlcnZhdGlvbiB3aW5kb3cgdG8gYWRkCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCByc3ZfbG9jayBob2xkLgorICovCiB2b2lkIGV4dDNfcnN2X3dpbmRvd19hZGQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJICAgIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKnJzdikKIHsKQEAgLTIzNiwxNCArMjgxLDI1IEBACiAJCQlwID0gJigqcCktPnJiX2xlZnQ7CiAJCWVsc2UgaWYgKHN0YXJ0ID4gdGhpcy0+cnN2X2VuZCkKIAkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7Ci0JCWVsc2UKKwkJZWxzZSB7CisJCQlyc3Zfd2luZG93X2R1bXAocm9vdCwgMSk7CiAJCQlCVUcoKTsKKwkJfQogCX0KIAogCXJiX2xpbmtfbm9kZShub2RlLCBwYXJlbnQsIHApOwogCXJiX2luc2VydF9jb2xvcihub2RlLCByb290KTsKIH0KIAorLyoqCisgKiBleHQzX3Jzdl93aW5kb3dfcmVtb3ZlKCkgLS0gdW5saW5rIGEgd2luZG93IGZyb20gdGhlIHJlc2VydmF0aW9uIHJiIHRyZWUKKyAqIEBzYjoJCQlzdXBlciBibG9jaworICogQHJzdjoJCXJlc2VydmF0aW9uIHdpbmRvdyB0byByZW1vdmUKKyAqCisgKiBNYXJrIHRoZSBibG9jayByZXNlcnZhdGlvbiB3aW5kb3cgYXMgbm90IGFsbG9jYXRlZCwgYW5kIHVubGluayBpdAorICogZnJvbSB0aGUgZmlsZXN5c3RlbSByZXNlcnZhdGlvbiB3aW5kb3cgcmIgdHJlZS4gTXVzdCBiZSBjYWxsZWQgd2l0aAorICogcnN2X2xvY2sgaG9sZC4KKyAqLwogc3RhdGljIHZvaWQgcnN2X3dpbmRvd19yZW1vdmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCSAgICAgIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKnJzdikKIHsKQEAgLTI1MywxMSArMzA5LDM5IEBACiAJcmJfZXJhc2UoJnJzdi0+cnN2X25vZGUsICZFWFQzX1NCKHNiKS0+c19yc3Zfd2luZG93X3Jvb3QpOwogfQogCisvKgorICogcnN2X2lzX2VtcHR5KCkgLS0gQ2hlY2sgaWYgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBpcyBhbGxvY2F0ZWQuCisgKiBAcnN2OgkJZ2l2ZW4gcmVzZXJ2YXRpb24gd2luZG93IHRvIGNoZWNrCisgKgorICogcmV0dXJucyAxIGlmIHRoZSBlbmQgYmxvY2sgaXMgRVhUM19SRVNFUlZFX1dJTkRPV19OT1RfQUxMT0NBVEVELgorICovCiBzdGF0aWMgaW5saW5lIGludCByc3ZfaXNfZW1wdHkoc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3cgKnJzdikKIHsKIAkvKiBhIHZhbGlkIHJlc2VydmF0aW9uIGVuZCBibG9jayBjb3VsZCBub3QgYmUgMCAqLwotCXJldHVybiAocnN2LT5fcnN2X2VuZCA9PSBFWFQzX1JFU0VSVkVfV0lORE9XX05PVF9BTExPQ0FURUQpOworCXJldHVybiByc3YtPl9yc3ZfZW5kID09IEVYVDNfUkVTRVJWRV9XSU5ET1dfTk9UX0FMTE9DQVRFRDsKIH0KKworLyoqCisgKiBleHQzX2luaXRfYmxvY2tfYWxsb2NfaW5mbygpCisgKiBAaW5vZGU6CQlmaWxlIGlub2RlIHN0cnVjdHVyZQorICoKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZQlyZXNlcnZhdGlvbiB3aW5kb3cgc3RydWN0dXJlLCBhbmQKKyAqIGxpbmsgdGhlIHdpbmRvdyB0byB0aGUgZXh0MyBpbm9kZSBzdHJ1Y3R1cmUgYXQgbGFzdAorICoKKyAqIFRoZSByZXNlcnZhdGlvbiB3aW5kb3cgc3RydWN0dXJlIGlzIG9ubHkgZHluYW1pY2FsbHkgYWxsb2NhdGVkCisgKiBhbmQgbGlua2VkIHRvIGV4dDMgaW5vZGUgdGhlIGZpcnN0IHRpbWUgdGhlIG9wZW4gZmlsZQorICogbmVlZHMgYSBuZXcgYmxvY2suIFNvLCBiZWZvcmUgZXZlcnkgZXh0M19uZXdfYmxvY2socykgY2FsbCwgZm9yCisgKiByZWd1bGFyIGZpbGVzLCB3ZSBzaG91bGQgY2hlY2sgd2hldGhlciB0aGUgcmVzZXJ2YXRpb24gd2luZG93CisgKiBzdHJ1Y3R1cmUgZXhpc3RzIG9yIG5vdC4gSW4gdGhlIGxhdHRlciBjYXNlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqIEZhaWwgdG8gZG8gc28gd2lsbCByZXN1bHQgaW4gYmxvY2sgcmVzZXJ2YXRpb24gYmVpbmcgdHVybmVkIG9mZiBmb3IgdGhhdAorICogb3BlbiBmaWxlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gZXh0M19nZXRfYmxvY2tzX2hhbmRsZSgpLCBhbHNvIGNhbGxlZAorICogd2hlbiBzZXR0aW5nIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cgc2l6ZSB0aHJvdWdoIGlvY3RsIGJlZm9yZSB0aGUgZmlsZQorICogaXMgb3BlbiBmb3Igd3JpdGUgKG5lZWRzIGJsb2NrIGFsbG9jYXRpb24pLgorICoKKyAqIE5lZWRzIHRydW5jYXRlX211dGV4IHByb3RlY3Rpb24gcHJpb3IgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgorICovCiB2b2lkIGV4dDNfaW5pdF9ibG9ja19hbGxvY19pbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGV4dDNfaW5vZGVfaW5mbyAqZWkgPSBFWFQzX0koaW5vZGUpOwpAQCAtMjcxLDcgKzM1NSw3IEBACiAJCXJzdi0+cnN2X3N0YXJ0ID0gRVhUM19SRVNFUlZFX1dJTkRPV19OT1RfQUxMT0NBVEVEOwogCQlyc3YtPnJzdl9lbmQgPSBFWFQzX1JFU0VSVkVfV0lORE9XX05PVF9BTExPQ0FURUQ7CiAKLQkgCS8qCisJCS8qCiAJCSAqIGlmIGZpbGVzeXN0ZW0gaXMgbW91bnRlZCB3aXRoIE5PUkVTRVJWQVRJT04sIHRoZSBnb2FsCiAJCSAqIHJlc2VydmF0aW9uIHdpbmRvdyBzaXplIGlzIHNldCB0byB6ZXJvIHRvIGluZGljYXRlCiAJCSAqIGJsb2NrIHJlc2VydmF0aW9uIGlzIG9mZgpAQCAtMjg3LDYgKzM3MSwxOSBAQAogCWVpLT5pX2Jsb2NrX2FsbG9jX2luZm8gPSBibG9ja19pOwogfQogCisvKioKKyAqIGV4dDNfZGlzY2FyZF9yZXNlcnZhdGlvbigpCisgKiBAaW5vZGU6CQlpbm9kZQorICoKKyAqIERpc2NhcmQoZnJlZSkgYmxvY2sgcmVzZXJ2YXRpb24gd2luZG93IG9uIGxhc3QgZmlsZSBjbG9zZSwgb3IgdHJ1bmNhdGUKKyAqIG9yIGF0IGxhc3QgaXB1dCgpLgorICoKKyAqIEl0IGlzIGJlaW5nIGNhbGxlZCBpbiB0aHJlZSBjYXNlczoKKyAqCWV4dDNfcmVsZWFzZV9maWxlKCk6IGxhc3Qgd3JpdGVyIGNsb3NlIHRoZSBmaWxlCisgKglleHQzX2NsZWFyX2lub2RlKCk6IGxhc3QgaXB1dCgpLCB3aGVuIG5vYm9keSBsaW5rIHRvIHRoaXMgZmlsZS4KKyAqCWV4dDNfdHJ1bmNhdGUoKTogd2hlbiB0aGUgYmxvY2sgaW5kaXJlY3QgbWFwIGlzIGFib3V0IHRvIGNoYW5nZS4KKyAqCisgKi8KIHZvaWQgZXh0M19kaXNjYXJkX3Jlc2VydmF0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IGV4dDNfaW5vZGVfaW5mbyAqZWkgPSBFWFQzX0koaW5vZGUpOwpAQCAtMzA2LDcgKzQwMywxNCBAQAogCX0KIH0KIAotLyogRnJlZSBnaXZlbiBibG9ja3MsIHVwZGF0ZSBxdW90YSBhbmQgaV9ibG9ja3MgZmllbGQgKi8KKy8qKgorICogZXh0M19mcmVlX2Jsb2Nrc19zYigpIC0tIEZyZWUgZ2l2ZW4gYmxvY2tzIGFuZCB1cGRhdGUgcXVvdGEKKyAqIEBoYW5kbGU6CQkJaGFuZGxlIHRvIHRoaXMgdHJhbnNhY3Rpb24KKyAqIEBzYjoJCQkJc3VwZXIgYmxvY2sKKyAqIEBibG9jazoJCQlzdGFydCBwaHlzY2lhbCBibG9jayB0byBmcmVlCisgKiBAY291bnQ6CQkJbnVtYmVyIG9mIGJsb2NrcyB0byBmcmVlCisgKiBAcGRxdW90X2ZyZWVkX2Jsb2NrczoJcG9pbnRlciB0byBxdW90YQorICovCiB2b2lkIGV4dDNfZnJlZV9ibG9ja3Nfc2IoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCSBleHQzX2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQsCiAJCQkgdW5zaWduZWQgbG9uZyAqcGRxdW90X2ZyZWVkX2Jsb2NrcykKQEAgLTQxOSw4ICs1MjMsOCBAQAogCQl9CiAJCS8qIEBAQCBUaGlzIHByZXZlbnRzIG5ld2x5LWFsbG9jYXRlZCBkYXRhIGZyb20gYmVpbmcKIAkJICogZnJlZWQgYW5kIHRoZW4gcmVhbGxvY2F0ZWQgd2l0aGluIHRoZSBzYW1lCi0JCSAqIHRyYW5zYWN0aW9uLiAKLQkJICogCisJCSAqIHRyYW5zYWN0aW9uLgorCQkgKgogCQkgKiBJZGVhbGx5IHdlIHdvdWxkIHdhbnQgdG8gYWxsb3cgdGhhdCB0byBoYXBwZW4sIGJ1dCB0bwogCQkgKiBkbyBzbyByZXF1aXJlcyBtYWtpbmcgam91cm5hbF9mb3JnZXQoKSBjYXBhYmxlIG9mCiAJCSAqIHJldm9raW5nIHRoZSBxdWV1ZWQgd3JpdGUgb2YgYSBkYXRhIGJsb2NrLCB3aGljaApAQCAtNDMzLDcgKzUzNyw3IEBACiAJCSAqIHNhZmUgbm90IHRvIHNldCB0aGUgYWxsb2NhdGlvbiBiaXQgaW4gdGhlIGNvbW1pdHRlZAogCQkgKiBiaXRtYXAsIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZXJlIGlzIG5vIG91dHN0YW5kaW5nCiAJCSAqIGFjdGl2aXR5IG9uIHRoZSBidWZmZXIgYW55IG1vcmUgYW5kIHNvIGl0IGlzIHNhZmUgdG8KLQkJICogcmVhbGxvY2F0ZSBpdC4gIAorCQkgKiByZWFsbG9jYXRlIGl0LgogCQkgKi8KIAkJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgInNldCBpbiBiX2NvbW1pdHRlZF9kYXRhIik7CiAJCUpfQVNTRVJUX0JIKGJpdG1hcF9iaCwKQEAgLTQ5MCw3ICs1OTQsMTMgQEAKIAlyZXR1cm47CiB9CiAKLS8qIEZyZWUgZ2l2ZW4gYmxvY2tzLCB1cGRhdGUgcXVvdGEgYW5kIGlfYmxvY2tzIGZpZWxkICovCisvKioKKyAqIGV4dDNfZnJlZV9ibG9ja3MoKSAtLSBGcmVlIGdpdmVuIGJsb2NrcyBhbmQgdXBkYXRlIHF1b3RhCisgKiBAaGFuZGxlOgkJaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCisgKiBAaW5vZGU6CQlpbm9kZQorICogQGJsb2NrOgkJc3RhcnQgcGh5c2ljYWwgYmxvY2sgdG8gZnJlZQorICogQGNvdW50OgkJbnVtYmVyIG9mIGJsb2NrcyB0byBjb3VudAorICovCiB2b2lkIGV4dDNfZnJlZV9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKIAkJCWV4dDNfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKQEAgLTUwOCw3ICs2MTgsMTEgQEAKIAlyZXR1cm47CiB9CiAKLS8qCisvKioKKyAqIGV4dDNfdGVzdF9hbGxvY2F0YWJsZSgpCisgKiBAbnI6CQkJZ2l2ZW4gYWxsb2NhdGlvbiBibG9jayBncm91cAorICogQGJoOgkJCWJ1ZmZlcmhlYWQgY29udGFpbnMgdGhlIGJpdG1hcCBvZiB0aGUgZ2l2ZW4gYmxvY2sgZ3JvdXAKKyAqCiAgKiBGb3IgZXh0MyBhbGxvY2F0aW9ucywgd2UgbXVzdCBub3QgcmV1c2UgYW55IGJsb2NrcyB3aGljaCBhcmUKICAqIGFsbG9jYXRlZCBpbiB0aGUgYml0bWFwIGJ1ZmZlcidzICJsYXN0IGNvbW1pdHRlZCBkYXRhIiBjb3B5LiAgVGhpcwogICogcHJldmVudHMgZGVsZXRlcyBmcm9tIGZyZWVpbmcgdXAgdGhlIHBhZ2UgZm9yIHJldXNlIHVudGlsIHdlIGhhdmUKQEAgLTUxOCw3ICs2MzIsNyBAQAogICogZGF0YSB3b3VsZCBhbGxvdyB0aGUgb2xkIGJsb2NrIHRvIGJlIG92ZXJ3cml0dGVuIGJlZm9yZSB0aGUKICAqIHRyYW5zYWN0aW9uIGNvbW1pdHRlZCAoYmVjYXVzZSB3ZSBmb3JjZSBkYXRhIHRvIGRpc2sgYmVmb3JlIGNvbW1pdCkuCiAgKiBUaGlzIHdvdWxkIGxlYWQgdG8gY29ycnVwdGlvbiBpZiB3ZSBjcmFzaGVkIGJldHdlZW4gb3ZlcndyaXRpbmcgdGhlCi0gKiBkYXRhIGFuZCBjb21taXR0aW5nIHRoZSBkZWxldGUuIAorICogZGF0YSBhbmQgY29tbWl0dGluZyB0aGUgZGVsZXRlLgogICoKICAqIEBAQCBXZSBtYXkgd2FudCB0byBtYWtlIHRoaXMgYWxsb2NhdGlvbiBiZWhhdmlvdXIgY29uZGl0aW9uYWwgb24KICAqIGRhdGEtd3JpdGVzIGF0IHNvbWUgcG9pbnQsIGFuZCBkaXNhYmxlIGl0IGZvciBtZXRhZGF0YSBhbGxvY2F0aW9ucyBvcgpAQCAtNTQxLDYgKzY1NSwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qKgorICogYml0bWFwX3NlYXJjaF9uZXh0X3VzYWJsZV9ibG9jaygpCisgKiBAc3RhcnQ6CQl0aGUgc3RhcnRpbmcgYmxvY2sgKGdyb3VwIHJlbGF0aXZlKSBvZiB0aGUgc2VhcmNoCisgKiBAYmg6CQkJYnVmZmVyaGVhZCBjb250YWlucyB0aGUgYmxvY2sgZ3JvdXAgYml0bWFwCisgKiBAbWF4YmxvY2tzOgkJdGhlIGVuZGluZyBibG9jayAoZ3JvdXAgcmVsYXRpdmUpIG9mIHRoZSByZXNlcnZhdGlvbgorICoKKyAqIFRoZSBiaXRtYXAgc2VhcmNoIC0tLSBzZWFyY2ggZm9yd2FyZCBhbHRlcm5hdGVseSB0aHJvdWdoIHRoZSBhY3R1YWwKKyAqIGJpdG1hcCBvbiBkaXNrIGFuZCB0aGUgbGFzdC1jb21taXR0ZWQgY29weSBpbiBqb3VybmFsLCB1bnRpbCB3ZSBmaW5kIGEKKyAqIGJpdCBmcmVlIGluIGJvdGggYml0bWFwcy4KKyAqLwogc3RhdGljIGV4dDNfZ3JwYmxrX3QKIGJpdG1hcF9zZWFyY2hfbmV4dF91c2FibGVfYmxvY2soZXh0M19ncnBibGtfdCBzdGFydCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKIAkJCQkJZXh0M19ncnBibGtfdCBtYXhibG9ja3MpCkBAIC01NDgsMTEgKzY3Miw2IEBACiAJZXh0M19ncnBibGtfdCBuZXh0OwogCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoID0gYmgyamgoYmgpOwogCi0JLyoKLQkgKiBUaGUgYml0bWFwIHNlYXJjaCAtLS0gc2VhcmNoIGZvcndhcmQgYWx0ZXJuYXRlbHkgdGhyb3VnaCB0aGUgYWN0dWFsCi0JICogYml0bWFwIGFuZCB0aGUgbGFzdC1jb21taXR0ZWQgY29weSB1bnRpbCB3ZSBmaW5kIGEgYml0IGZyZWUgaW4KLQkgKiBib3RoCi0JICovCiAJd2hpbGUgKHN0YXJ0IDwgbWF4YmxvY2tzKSB7CiAJCW5leHQgPSBleHQzX2ZpbmRfbmV4dF96ZXJvX2JpdChiaC0+Yl9kYXRhLCBtYXhibG9ja3MsIHN0YXJ0KTsKIAkJaWYgKG5leHQgPj0gbWF4YmxvY2tzKQpAQCAtNTYyLDE0ICs2ODEsMjAgQEAKIAkJamJkX2xvY2tfYmhfc3RhdGUoYmgpOwogCQlpZiAoamgtPmJfY29tbWl0dGVkX2RhdGEpCiAJCQlzdGFydCA9IGV4dDNfZmluZF9uZXh0X3plcm9fYml0KGpoLT5iX2NvbW1pdHRlZF9kYXRhLAotCQkJCQkJIAltYXhibG9ja3MsIG5leHQpOworCQkJCQkJCW1heGJsb2NrcywgbmV4dCk7CiAJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwogCX0KIAlyZXR1cm4gLTE7CiB9CiAKLS8qCi0gKiBGaW5kIGFuIGFsbG9jYXRhYmxlIGJsb2NrIGluIGEgYml0bWFwLiAgV2UgaG9ub3VyIGJvdGggdGhlIGJpdG1hcCBhbmQKKy8qKgorICogZmluZF9uZXh0X3VzYWJsZV9ibG9jaygpCisgKiBAc3RhcnQ6CQl0aGUgc3RhcnRpbmcgYmxvY2sgKGdyb3VwIHJlbGF0aXZlKSB0byBmaW5kIG5leHQKKyAqCQkJYWxsb2NhdGFibGUgYmxvY2sgaW4gYml0bWFwLgorICogQGJoOgkJCWJ1ZmZlcmhlYWQgY29udGFpbnMgdGhlIGJsb2NrIGdyb3VwIGJpdG1hcAorICogQG1heGJsb2NrczoJCXRoZSBlbmRpbmcgYmxvY2sgKGdyb3VwIHJlbGF0aXZlKSBmb3IgdGhlIHNlYXJjaAorICoKKyAqIEZpbmQgYW4gYWxsb2NhdGFibGUgYmxvY2sgaW4gYSBiaXRtYXAuICBXZSBob25vciBib3RoIHRoZSBiaXRtYXAgYW5kCiAgKiBpdHMgbGFzdC1jb21taXR0ZWQgY29weSAoaWYgdGhhdCBleGlzdHMpLCBhbmQgcGVyZm9ybSB0aGUgIm1vc3QKICAqIGFwcHJvcHJpYXRlIGFsbG9jYXRpb24iIGFsZ29yaXRobSBvZiBsb29raW5nIGZvciBhIGZyZWUgYmxvY2sgbmVhcgogICogdGhlIGluaXRpYWwgZ29hbDsgdGhlbiBmb3IgYSBmcmVlIGJ5dGUgc29tZXdoZXJlIGluIHRoZSBiaXRtYXA7IHRoZW4KQEAgLTU4NCw3ICs3MDksNyBAQAogCiAJaWYgKHN0YXJ0ID4gMCkgewogCQkvKgotCQkgKiBUaGUgZ29hbCB3YXMgb2NjdXBpZWQ7IHNlYXJjaCBmb3J3YXJkIGZvciBhIGZyZWUgCisJCSAqIFRoZSBnb2FsIHdhcyBvY2N1cGllZDsgc2VhcmNoIGZvcndhcmQgZm9yIGEgZnJlZQogCQkgKiBibG9jayB3aXRoaW4gdGhlIG5leHQgWFggYmxvY2tzLgogCQkgKgogCQkgKiBlbmRfZ29hbCBpcyBtb3JlIG9yIGxlc3MgcmFuZG9tLCBidXQgaXQgaGFzIHRvIGJlCkBAIC02MjAsNyArNzQ1LDExIEBACiAJcmV0dXJuIGhlcmU7CiB9CiAKLS8qCisvKioKKyAqIGNsYWltX2Jsb2NrKCkKKyAqIEBibG9jazoJCXRoZSBmcmVlIGJsb2NrIChncm91cCByZWxhdGl2ZSkgdG8gYWxsb2NhdGUKKyAqIEBiaDoJCQl0aGUgYnVmZmVyaGVhZCBjb250YWludHMgdGhlIGJsb2NrIGdyb3VwIGJpdG1hcAorICoKICAqIFdlIHRoaW5rIHdlIGNhbiBhbGxvY2F0ZSB0aGlzIGJsb2NrIGluIHRoaXMgYml0bWFwLiAgVHJ5IHRvIHNldCB0aGUgYml0LgogICogSWYgdGhhdCBzdWNjZWVkcyB0aGVuIGNoZWNrIHRoYXQgbm9ib2R5IGhhcyBhbGxvY2F0ZWQgYW5kIHRoZW4gZnJlZWQgdGhlCiAgKiBibG9jayBzaW5jZSB3ZSBzYXcgdGhhdCBpcyB3YXMgbm90IG1hcmtlZCBpbiBiX2NvbW1pdHRlZF9kYXRhLiAgSWYgaXQgX3dhc18KQEAgLTY0Niw3ICs3NzUsMjYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgorLyoqCisgKiBleHQzX3RyeV90b19hbGxvY2F0ZSgpCisgKiBAc2I6CQkJc3VwZXJibG9jaworICogQGhhbmRsZToJCWhhbmRsZSB0byB0aGlzIHRyYW5zYWN0aW9uCisgKiBAZ3JvdXA6CQlnaXZlbiBhbGxvY2F0aW9uIGJsb2NrIGdyb3VwCisgKiBAYml0bWFwX2JoOgkJYnVmZmVyaGVhZCBob2xkcyB0aGUgYmxvY2sgYml0bWFwCisgKiBAZ3JwX2dvYWw6CQlnaXZlbiB0YXJnZXQgYmxvY2sgd2l0aGluIHRoZSBncm91cAorICogQGNvdW50OgkJdGFyZ2V0IG51bWJlciBvZiBibG9ja3MgdG8gYWxsb2NhdGUKKyAqIEBteV9yc3Y6CQlyZXNlcnZhdGlvbiB3aW5kb3cKKyAqCisgKiBBdHRlbXB0IHRvIGFsbG9jYXRlIGJsb2NrcyB3aXRoaW4gYSBnaXZlIHJhbmdlLiBTZXQgdGhlIHJhbmdlIG9mIGFsbG9jYXRpb24KKyAqIGZpcnN0LCB0aGVuIGZpbmQgdGhlIGZpcnN0IGZyZWUgYml0KHMpIGZyb20gdGhlIGJpdG1hcCAod2l0aGluIHRoZSByYW5nZSksCisgKiBhbmQgYXQgbGFzdCwgYWxsb2NhdGUgdGhlIGJsb2NrcyBieSBjbGFpbWluZyB0aGUgZm91bmQgZnJlZSBiaXQgYXMgYWxsb2NhdGVkLgorICoKKyAqIFRvIHNldCB0aGUgcmFuZ2Ugb2YgdGhpcyBhbGxvY2F0aW9uOgorICoJaWYgdGhlcmUgaXMgYSByZXNlcnZhdGlvbiB3aW5kb3csIG9ubHkgdHJ5IHRvIGFsbG9jYXRlIGJsb2NrKHMpIGZyb20gdGhlCisgKglmaWxlJ3Mgb3duIHJlc2VydmF0aW9uIHdpbmRvdzsKKyAqCU90aGVyd2lzZSwgdGhlIGFsbG9jYXRpb24gcmFuZ2Ugc3RhcnRzIGZyb20gdGhlIGdpdmUgZ29hbCBibG9jaywgZW5kcyBhdAorICoJdGhlIGJsb2NrIGdyb3VwJ3MgbGFzdCBibG9jay4KKyAqCiAgKiBJZiB3ZSBmYWlsZWQgdG8gYWxsb2NhdGUgdGhlIGRlc2lyZWQgYmxvY2sgdGhlbiB3ZSBtYXkgZW5kIHVwIGNyb3NzaW5nIHRvIGEKICAqIG5ldyBiaXRtYXAuICBJbiB0aGF0IGNhc2Ugd2UgbXVzdCByZWxlYXNlIHdyaXRlIGFjY2VzcyB0byB0aGUgb2xkIG9uZSB2aWEKICAqIGV4dDNfam91cm5hbF9yZWxlYXNlX2J1ZmZlcigpLCBlbHNlIHdlJ2xsIHJ1biBvdXQgb2YgY3JlZGl0cy4KQEAgLTcwMyw3ICs4NTEsOCBAQAogCX0KIAlzdGFydCA9IGdycF9nb2FsOwogCi0JaWYgKCFjbGFpbV9ibG9jayhzYl9iZ2xfbG9jayhFWFQzX1NCKHNiKSwgZ3JvdXApLCBncnBfZ29hbCwgYml0bWFwX2JoKSkgeworCWlmICghY2xhaW1fYmxvY2soc2JfYmdsX2xvY2soRVhUM19TQihzYiksIGdyb3VwKSwKKwkJZ3JwX2dvYWwsIGJpdG1hcF9iaCkpIHsKIAkJLyoKIAkJICogVGhlIGJsb2NrIHdhcyBhbGxvY2F0ZWQgYnkgYW5vdGhlciB0aHJlYWQsIG9yIGl0IHdhcwogCQkgKiBhbGxvY2F0ZWQgYW5kIHRoZW4gZnJlZWQgYnkgYW5vdGhlciB0aHJlYWQKQEAgLTcxOCw3ICs4NjcsOCBAQAogCWdycF9nb2FsKys7CiAJd2hpbGUgKG51bSA8ICpjb3VudCAmJiBncnBfZ29hbCA8IGVuZAogCQkmJiBleHQzX3Rlc3RfYWxsb2NhdGFibGUoZ3JwX2dvYWwsIGJpdG1hcF9iaCkKLQkJJiYgY2xhaW1fYmxvY2soc2JfYmdsX2xvY2soRVhUM19TQihzYiksIGdyb3VwKSwgZ3JwX2dvYWwsIGJpdG1hcF9iaCkpIHsKKwkJJiYgY2xhaW1fYmxvY2soc2JfYmdsX2xvY2soRVhUM19TQihzYiksIGdyb3VwKSwKKwkJCQlncnBfZ29hbCwgYml0bWFwX2JoKSkgewogCQludW0rKzsKIAkJZ3JwX2dvYWwrKzsKIAl9CkBAIC03MzAsMTIgKzg4MCwxMiBAQAogfQogCiAvKioKLSAqIAlmaW5kX25leHRfcmVzZXJ2YWJsZV93aW5kb3coKToKKyAqCWZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdygpOgogICoJCWZpbmQgYSByZXNlcnZhYmxlIHNwYWNlIHdpdGhpbiB0aGUgZ2l2ZW4gcmFuZ2UuCiAgKgkJSXQgZG9lcyBub3QgYWxsb2NhdGUgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBmb3Igbm93OgogICoJCWFsbG9jX25ld19yZXNlcnZhdGlvbigpIHdpbGwgZG8gdGhlIHdvcmsgbGF0ZXIuCiAgKgotICogCUBzZWFyY2hfaGVhZDogdGhlIGhlYWQgb2YgdGhlIHNlYXJjaGluZyBsaXN0OworICoJQHNlYXJjaF9oZWFkOiB0aGUgaGVhZCBvZiB0aGUgc2VhcmNoaW5nIGxpc3Q7CiAgKgkJVGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIGxpc3QgaGVhZCBvZiB0aGUgd2hvbGUgZmlsZXN5c3RlbQogICoKICAqCQlXZSBoYXZlIGJvdGggaGVhZCBhbmQgc3RhcnRfYmxvY2sgdG8gYXNzaXN0IHRoZSBzZWFyY2gKQEAgLTc0MywxMiArODkzLDEyIEBACiAgKgkJYnV0IHdlIHdpbGwgc2hpZnQgdG8gdGhlIHBsYWNlIHdoZXJlIHN0YXJ0X2Jsb2NrIGlzLAogICoJCXRoZW4gc3RhcnQgZnJvbSB0aGVyZSwgd2hlbiBsb29raW5nIGZvciBhIHJlc2VydmFibGUgc3BhY2UuCiAgKgotICogCUBzaXplOiB0aGUgdGFyZ2V0IG5ldyByZXNlcnZhdGlvbiB3aW5kb3cgc2l6ZQorICoJQHNpemU6IHRoZSB0YXJnZXQgbmV3IHJlc2VydmF0aW9uIHdpbmRvdyBzaXplCiAgKgotICogCUBncm91cF9maXJzdF9ibG9jazogdGhlIGZpcnN0IGJsb2NrIHdlIGNvbnNpZGVyIHRvIHN0YXJ0CisgKglAZ3JvdXBfZmlyc3RfYmxvY2s6IHRoZSBmaXJzdCBibG9jayB3ZSBjb25zaWRlciB0byBzdGFydAogICoJCQl0aGUgcmVhbCBzZWFyY2ggZnJvbQogICoKLSAqIAlAbGFzdF9ibG9jazoKKyAqCUBsYXN0X2Jsb2NrOgogICoJCXRoZSBtYXhpbXVtIGJsb2NrIG51bWJlciB0aGF0IG91ciBnb2FsIHJlc2VydmFibGUgc3BhY2UKICAqCQljb3VsZCBzdGFydCBmcm9tLiBUaGlzIGlzIG5vcm1hbGx5IHRoZSBsYXN0IGJsb2NrIGluIHRoaXMKICAqCQlncm91cC4gVGhlIHNlYXJjaCB3aWxsIGVuZCB3aGVuIHdlIGZvdW5kIHRoZSBzdGFydCBvZiBuZXh0CkBAIC03NTYsMTAgKzkwNiwxMCBAQAogICoJCVRoaXMgY291bGQgaGFuZGxlIHRoZSBjcm9zcyBib3VuZGFyeSByZXNlcnZhdGlvbiB3aW5kb3cKICAqCQlyZXF1ZXN0LgogICoKLSAqIAliYXNpY2FsbHkgd2Ugc2VhcmNoIGZyb20gdGhlIGdpdmVuIHJhbmdlLCByYXRoZXIgdGhhbiB0aGUgd2hvbGUKLSAqIAlyZXNlcnZhdGlvbiBkb3VibGUgbGlua2VkIGxpc3QsIChzdGFydF9ibG9jaywgbGFzdF9ibG9jaykKLSAqIAl0byBmaW5kIGEgZnJlZSByZWdpb24gdGhhdCBpcyBvZiBteSBzaXplIGFuZCBoYXMgbm90Ci0gKiAJYmVlbiByZXNlcnZlZC4KKyAqCWJhc2ljYWxseSB3ZSBzZWFyY2ggZnJvbSB0aGUgZ2l2ZW4gcmFuZ2UsIHJhdGhlciB0aGFuIHRoZSB3aG9sZQorICoJcmVzZXJ2YXRpb24gZG91YmxlIGxpbmtlZCBsaXN0LCAoc3RhcnRfYmxvY2ssIGxhc3RfYmxvY2spCisgKgl0byBmaW5kIGEgZnJlZSByZWdpb24gdGhhdCBpcyBvZiBteSBzaXplIGFuZCBoYXMgbm90CisgKgliZWVuIHJlc2VydmVkLgogICoKICAqLwogc3RhdGljIGludCBmaW5kX25leHRfcmVzZXJ2YWJsZV93aW5kb3coCkBAIC04MTIsNyArOTYyLDcgQEAKIAkJCS8qCiAJCQkgKiBGb3VuZCBhIHJlc2VydmVhYmxlIHNwYWNlIGJpZyBlbm91Z2guICBXZSBjb3VsZAogCQkJICogaGF2ZSBhIHJlc2VydmF0aW9uIGFjcm9zcyB0aGUgZ3JvdXAgYm91bmRhcnkgaGVyZQotCQkgCSAqLworCQkJICovCiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTg0OCw3ICs5OTgsNyBAQAogfQogCiAvKioKLSAqIAlhbGxvY19uZXdfcmVzZXJ2YXRpb24oKS0tYWxsb2NhdGUgYSBuZXcgcmVzZXJ2YXRpb24gd2luZG93CisgKglhbGxvY19uZXdfcmVzZXJ2YXRpb24oKS0tYWxsb2NhdGUgYSBuZXcgcmVzZXJ2YXRpb24gd2luZG93CiAgKgogICoJCVRvIG1ha2UgYSBuZXcgcmVzZXJ2YXRpb24sIHdlIHNlYXJjaCBwYXJ0IG9mIHRoZSBmaWxlc3lzdGVtCiAgKgkJcmVzZXJ2YXRpb24gbGlzdCAodGhlIGxpc3QgdGhhdCBpbnNpZGUgdGhlIGdyb3VwKS4gV2UgdHJ5IHRvCkBAIC04OTcsNyArMTA0Nyw3IEBACiAJc3BpbmxvY2tfdCAqcnN2X2xvY2sgPSAmRVhUM19TQihzYiktPnNfcnN2X3dpbmRvd19sb2NrOwogCiAJZ3JvdXBfZmlyc3RfYmxvY2sgPSBleHQzX2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBncm91cCk7Ci0JZ3JvdXBfZW5kX2Jsb2NrID0gZ3JvdXBfZmlyc3RfYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMTsKKwlncm91cF9lbmRfYmxvY2sgPSBncm91cF9maXJzdF9ibG9jayArIChFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMSk7CiAKIAlpZiAoZ3JwX2dvYWwgPCAwKQogCQlzdGFydF9ibG9jayA9IGdyb3VwX2ZpcnN0X2Jsb2NrOwpAQCAtOTI5LDkgKzEwNzksMTAgQEAKIAkJaWYgKChteV9yc3YtPnJzdl9hbGxvY19oaXQgPgogCQkgICAgIChteV9yc3YtPnJzdl9lbmQgLSBteV9yc3YtPnJzdl9zdGFydCArIDEpIC8gMikpIHsKIAkJCS8qCi0JCQkgKiBpZiB3ZSBwcmV2aW91c2x5IGFsbG9jYXRpb24gaGl0IHJhdGlvbiBpcyBncmVhdGVyIHRoYW4gaGFsZgotCQkJICogd2UgZG91YmxlIHRoZSBzaXplIG9mIHJlc2VydmF0aW9uIHdpbmRvdyBuZXh0IHRpbWUKLQkJCSAqIG90aGVyd2lzZSBrZWVwIHRoZSBzYW1lCisJCQkgKiBpZiB0aGUgcHJldmlvdXNseSBhbGxvY2F0aW9uIGhpdCByYXRpbyBpcworCQkJICogZ3JlYXRlciB0aGFuIDEvMiwgdGhlbiB3ZSBkb3VibGUgdGhlIHNpemUgb2YKKwkJCSAqIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cgdGhlIG5leHQgdGltZSwKKwkJCSAqIG90aGVyd2lzZSB3ZSBrZWVwIHRoZSBzYW1lIHNpemUgd2luZG93CiAJCQkgKi8KIAkJCXNpemUgPSBzaXplICogMjsKIAkJCWlmIChzaXplID4gRVhUM19NQVhfUkVTRVJWRV9CTE9DS1MpCkBAIC0xMDEwLDYgKzExNjEsMjMgQEAKIAlnb3RvIHJldHJ5OwogfQogCisvKioKKyAqIHRyeV90b19leHRlbmRfcmVzZXJ2YXRpb24oKQorICogQG15X3JzdjoJCWdpdmVuIHJlc2VydmF0aW9uIHdpbmRvdworICogQHNiOgkJCXN1cGVyIGJsb2NrCisgKiBAc2l6ZToJCXRoZSBkZWx0YSB0byBleHRlbmQKKyAqCisgKiBBdHRlbXB0IHRvIGV4cGFuZCB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGxhcmdlIGVub3VnaCB0byBoYXZlCisgKiByZXF1aXJlZCBudW1iZXIgb2YgZnJlZSBibG9ja3MKKyAqCisgKiBTaW5jZSBleHQzX3RyeV90b19hbGxvY2F0ZSgpIHdpbGwgYWx3YXlzIGFsbG9jYXRlIGJsb2NrcyB3aXRoaW4KKyAqIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cgcmFuZ2UsIGlmIHRoZSB3aW5kb3cgc2l6ZSBpcyB0b28gc21hbGwsCisgKiBtdWx0aXBsZSBibG9ja3MgYWxsb2NhdGlvbiBoYXMgdG8gc3RvcCBhdCB0aGUgZW5kIG9mIHRoZSByZXNlcnZhdGlvbgorICogd2luZG93LiBUbyBtYWtlIHRoaXMgbW9yZSBlZmZpY2llbnQsIGdpdmVuIHRoZSB0b3RhbCBudW1iZXIgb2YKKyAqIGJsb2NrcyBuZWVkZWQgYW5kIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHdpbmRvdywgd2UgdHJ5IHRvCisgKiBleHBhbmQgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBzaXplIGlmIG5lY2Vzc2FyeSBvbiBhIGJlc3QtZWZmb3J0CisgKiBiYXNpcyBiZWZvcmUgZXh0M19uZXdfYmxvY2tzKCkgdHJpZXMgdG8gYWxsb2NhdGUgYmxvY2tzLAorICovCiBzdGF0aWMgdm9pZCB0cnlfdG9fZXh0ZW5kX3Jlc2VydmF0aW9uKHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKm15X3JzdiwKIAkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBzaXplKQogewpAQCAtMTAzNSw3ICsxMjAzLDE3IEBACiAJc3Bpbl91bmxvY2socnN2X2xvY2spOwogfQogCi0vKgorLyoqCisgKiBleHQzX3RyeV90b19hbGxvY2F0ZV93aXRoX3JzdigpCisgKiBAc2I6CQkJc3VwZXJibG9jaworICogQGhhbmRsZToJCWhhbmRsZSB0byB0aGlzIHRyYW5zYWN0aW9uCisgKiBAZ3JvdXA6CQlnaXZlbiBhbGxvY2F0aW9uIGJsb2NrIGdyb3VwCisgKiBAYml0bWFwX2JoOgkJYnVmZmVyaGVhZCBob2xkcyB0aGUgYmxvY2sgYml0bWFwCisgKiBAZ3JwX2dvYWw6CQlnaXZlbiB0YXJnZXQgYmxvY2sgd2l0aGluIHRoZSBncm91cAorICogQGNvdW50OgkJdGFyZ2V0IG51bWJlciBvZiBibG9ja3MgdG8gYWxsb2NhdGUKKyAqIEBteV9yc3Y6CQlyZXNlcnZhdGlvbiB3aW5kb3cKKyAqIEBlcnJwOgkJcG9pbnRlciB0byBzdG9yZSB0aGUgZXJyb3IgY29kZQorICoKICAqIFRoaXMgaXMgdGhlIG1haW4gZnVuY3Rpb24gdXNlZCB0byBhbGxvY2F0ZSBhIG5ldyBibG9jayBhbmQgaXRzIHJlc2VydmF0aW9uCiAgKiB3aW5kb3cuCiAgKgpAQCAtMTA1MSw5ICsxMjI5LDcgQEAKICAqIHJlc2VydmF0aW9uKSwgYW5kIHRoZXJlIGFyZSBsb3RzIG9mIGZyZWUgYmxvY2tzLCBidXQgdGhleSBhcmUgYWxsCiAgKiBiZWluZyByZXNlcnZlZC4KICAqCi0gKiBXZSB1c2UgYSBzb3J0ZWQgZG91YmxlIGxpbmtlZCBsaXN0IGZvciB0aGUgcGVyLWZpbGVzeXN0ZW0gcmVzZXJ2YXRpb24gbGlzdC4KLSAqIFRoZSBpbnNlcnQsIHJlbW92ZSBhbmQgZmluZCBhIGZyZWUgc3BhY2Uobm9uLXJlc2VydmVkKSBvcGVyYXRpb25zIGZvciB0aGUKLSAqIHNvcnRlZCBkb3VibGUgbGlua2VkIGxpc3Qgc2hvdWxkIGJlIGZhc3QuCisgKiBXZSB1c2UgYSByZWQtYmxhY2sgdHJlZSBmb3IgdGhlIHBlci1maWxlc3lzdGVtIHJlc2VydmF0aW9uIGxpc3QuCiAgKgogICovCiBzdGF0aWMgZXh0M19ncnBibGtfdApAQCAtMTA2Myw3ICsxMjM5LDcgQEAKIAkJCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKiBteV9yc3YsCiAJCQl1bnNpZ25lZCBsb25nICpjb3VudCwgaW50ICplcnJwKQogewotCWV4dDNfZnNibGtfdCBncm91cF9maXJzdF9ibG9jazsKKwlleHQzX2ZzYmxrX3QgZ3JvdXBfZmlyc3RfYmxvY2ssIGdyb3VwX2xhc3RfYmxvY2s7CiAJZXh0M19ncnBibGtfdCByZXQgPSAwOwogCWludCBmYXRhbDsKIAl1bnNpZ25lZCBsb25nIG51bSA9ICpjb3VudDsKQEAgLTExMDAsNiArMTI3Niw3IEBACiAJICogZmlyc3QgYmxvY2sgaXMgdGhlIGJsb2NrIG51bWJlciBvZiB0aGUgZmlyc3QgYmxvY2sgaW4gdGhpcyBncm91cAogCSAqLwogCWdyb3VwX2ZpcnN0X2Jsb2NrID0gZXh0M19ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgZ3JvdXApOworCWdyb3VwX2xhc3RfYmxvY2sgPSBncm91cF9maXJzdF9ibG9jayArIChFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMSk7CiAKIAkvKgogCSAqIEJhc2ljYWxseSB3ZSB3aWxsIGFsbG9jYXRlIGEgbmV3IGJsb2NrIGZyb20gaW5vZGUncyByZXNlcnZhdGlvbgpAQCAtMTExOCw3ICsxMjk1LDggQEAKIAkgKi8KIAl3aGlsZSAoMSkgewogCQlpZiAocnN2X2lzX2VtcHR5KCZteV9yc3YtPnJzdl93aW5kb3cpIHx8IChyZXQgPCAwKSB8fAotCQkJIWdvYWxfaW5fbXlfcmVzZXJ2YXRpb24oJm15X3Jzdi0+cnN2X3dpbmRvdywgZ3JwX2dvYWwsIGdyb3VwLCBzYikpIHsKKwkJCSFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZteV9yc3YtPnJzdl93aW5kb3csCisJCQkJCQlncnBfZ29hbCwgZ3JvdXAsIHNiKSkgewogCQkJaWYgKG15X3Jzdi0+cnN2X2dvYWxfc2l6ZSA8ICpjb3VudCkKIAkJCQlteV9yc3YtPnJzdl9nb2FsX3NpemUgPSAqY291bnQ7CiAJCQlyZXQgPSBhbGxvY19uZXdfcmVzZXJ2YXRpb24obXlfcnN2LCBncnBfZ29hbCwgc2IsCkBAIC0xMTI2LDE3ICsxMzA0LDIxIEBACiAJCQlpZiAocmV0IDwgMCkKIAkJCQlicmVhazsJCQkvKiBmYWlsZWQgKi8KIAotCQkJaWYgKCFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZteV9yc3YtPnJzdl93aW5kb3csIGdycF9nb2FsLCBncm91cCwgc2IpKQorCQkJaWYgKCFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZteV9yc3YtPnJzdl93aW5kb3csCisJCQkJCQkJZ3JwX2dvYWwsIGdyb3VwLCBzYikpCiAJCQkJZ3JwX2dvYWwgPSAtMTsKLQkJfSBlbHNlIGlmIChncnBfZ29hbCA+IDAgJiYgKG15X3Jzdi0+cnN2X2VuZC1ncnBfZ29hbCsxKSA8ICpjb3VudCkKKwkJfSBlbHNlIGlmIChncnBfZ29hbCA+IDAgJiYKKwkJCSAgKG15X3Jzdi0+cnN2X2VuZC1ncnBfZ29hbCsxKSA8ICpjb3VudCkKIAkJCXRyeV90b19leHRlbmRfcmVzZXJ2YXRpb24obXlfcnN2LCBzYiwKIAkJCQkJKmNvdW50LW15X3Jzdi0+cnN2X2VuZCArIGdycF9nb2FsIC0gMSk7CiAKLQkJaWYgKChteV9yc3YtPnJzdl9zdGFydCA+PSBncm91cF9maXJzdF9ibG9jayArIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikpCi0JCSAgICB8fCAobXlfcnN2LT5yc3ZfZW5kIDwgZ3JvdXBfZmlyc3RfYmxvY2spKQorCQlpZiAoKG15X3Jzdi0+cnN2X3N0YXJ0ID4gZ3JvdXBfbGFzdF9ibG9jaykgfHwKKwkJCQkobXlfcnN2LT5yc3ZfZW5kIDwgZ3JvdXBfZmlyc3RfYmxvY2spKSB7CisJCQlyc3Zfd2luZG93X2R1bXAoJkVYVDNfU0Ioc2IpLT5zX3Jzdl93aW5kb3dfcm9vdCwgMSk7CiAJCQlCVUcoKTsKLQkJcmV0ID0gZXh0M190cnlfdG9fYWxsb2NhdGUoc2IsIGhhbmRsZSwgZ3JvdXAsIGJpdG1hcF9iaCwgZ3JwX2dvYWwsCi0JCQkJCSAgICZudW0sICZteV9yc3YtPnJzdl93aW5kb3cpOworCQl9CisJCXJldCA9IGV4dDNfdHJ5X3RvX2FsbG9jYXRlKHNiLCBoYW5kbGUsIGdyb3VwLCBiaXRtYXBfYmgsCisJCQkJCSAgIGdycF9nb2FsLCAmbnVtLCAmbXlfcnN2LT5yc3Zfd2luZG93KTsKIAkJaWYgKHJldCA+PSAwKSB7CiAJCQlteV9yc3YtPnJzdl9hbGxvY19oaXQgKz0gbnVtOwogCQkJKmNvdW50ID0gbnVtOwpAQCAtMTE2MSw2ICsxMzQzLDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiBleHQzX2hhc19mcmVlX2Jsb2NrcygpCisgKiBAc2JpOgkJaW4tY29yZSBzdXBlciBibG9jayBzdHJ1Y3R1cmUuCisgKgorICogQ2hlY2sgaWYgZmlsZXN5c3RlbSBoYXMgYXQgbGVhc3QgMSBmcmVlIGJsb2NrIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbi4KKyAqLwogc3RhdGljIGludCBleHQzX2hhc19mcmVlX2Jsb2NrcyhzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkpCiB7CiAJZXh0M19mc2Jsa190IGZyZWVfYmxvY2tzLCByb290X2Jsb2NrczsKQEAgLTExNzUsMTEgKzEzNjMsMTcgQEAKIAlyZXR1cm4gMTsKIH0KIAotLyoKKy8qKgorICogZXh0M19zaG91bGRfcmV0cnlfYWxsb2MoKQorICogQHNiOgkJCXN1cGVyIGJsb2NrCisgKiBAcmV0cmllcwkJbnVtYmVyIG9mIGF0dGVtcHMgaGFzIGJlZW4gbWFkZQorICoKICAqIGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKCkgaXMgY2FsbGVkIHdoZW4gRU5PU1BDIGlzIHJldHVybmVkLCBhbmQgaWYKICAqIGl0IGlzIHByb2ZpdGFibGUgdG8gcmV0cnkgdGhlIG9wZXJhdGlvbiwgdGhpcyBmdW5jdGlvbiB3aWxsIHdhaXQKICAqIGZvciB0aGUgY3VycmVudCBvciBjb21taXRpbmcgdHJhbnNhY3Rpb24gdG8gY29tcGxldGUsIGFuZCB0aGVuCiAgKiByZXR1cm4gVFJVRS4KKyAqCisgKiBpZiB0aGUgdG90YWwgbnVtYmVyIG9mIHJldHJpZXMgZXhjZWVkIHRocmVlIHRpbWVzLCByZXR1cm4gRkFMU0UuCiAgKi8KIGludCBleHQzX3Nob3VsZF9yZXRyeV9hbGxvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKnJldHJpZXMpCiB7CkBAIC0xMTkxLDEzICsxMzg1LDE5IEBACiAJcmV0dXJuIGpvdXJuYWxfZm9yY2VfY29tbWl0X25lc3RlZChFWFQzX1NCKHNiKS0+c19qb3VybmFsKTsKIH0KIAotLyoKLSAqIGV4dDNfbmV3X2Jsb2NrIHVzZXMgYSBnb2FsIGJsb2NrIHRvIGFzc2lzdCBhbGxvY2F0aW9uLiAgSWYgdGhlIGdvYWwgaXMKLSAqIGZyZWUsIG9yIHRoZXJlIGlzIGEgZnJlZSBibG9jayB3aXRoaW4gMzIgYmxvY2tzIG9mIHRoZSBnb2FsLCB0aGF0IGJsb2NrCi0gKiBpcyBhbGxvY2F0ZWQuICBPdGhlcndpc2UgYSBmb3J3YXJkIHNlYXJjaCBpcyBtYWRlIGZvciBhIGZyZWUgYmxvY2s7IHdpdGhpbiAKLSAqIGVhY2ggYmxvY2sgZ3JvdXAgdGhlIHNlYXJjaCBmaXJzdCBsb29rcyBmb3IgYW4gZW50aXJlIGZyZWUgYnl0ZSBpbiB0aGUgYmxvY2sKLSAqIGJpdG1hcCwgYW5kIHRoZW4gZm9yIGFueSBmcmVlIGJpdCBpZiB0aGF0IGZhaWxzLgotICogVGhpcyBmdW5jdGlvbiBhbHNvIHVwZGF0ZXMgcXVvdGEgYW5kIGlfYmxvY2tzIGZpZWxkLgorLyoqCisgKiBleHQzX25ld19ibG9ja3MoKSAtLSBjb3JlIGJsb2NrKHMpIGFsbG9jYXRpb24gZnVuY3Rpb24KKyAqIEBoYW5kbGU6CQloYW5kbGUgdG8gdGhpcyB0cmFuc2FjdGlvbgorICogQGlub2RlOgkJZmlsZSBpbm9kZQorICogQGdvYWw6CQlnaXZlbiB0YXJnZXQgYmxvY2soZmlsZXN5c3RlbSB3aWRlKQorICogQGNvdW50OgkJdGFyZ2V0IG51bWJlciBvZiBibG9ja3MgdG8gYWxsb2NhdGUKKyAqIEBlcnJwOgkJZXJyb3IgY29kZQorICoKKyAqIGV4dDNfbmV3X2Jsb2NrcyB1c2VzIGEgZ29hbCBibG9jayB0byBhc3Npc3QgYWxsb2NhdGlvbi4gIEl0IHRyaWVzIHRvCisgKiBhbGxvY2F0ZSBibG9jayhzKSBmcm9tIHRoZSBibG9jayBncm91cCBjb250YWlucyB0aGUgZ29hbCBibG9jayBmaXJzdC4gSWYgdGhhdAorICogZmFpbHMsIGl0IHdpbGwgdHJ5IHRvIGFsbG9jYXRlIGJsb2NrKHMpIGZyb20gb3RoZXIgYmxvY2sgZ3JvdXBzIHdpdGhvdXQKKyAqIGFueSBzcGVjaWZpYyBnb2FsIGJsb2NrLgorICoKICAqLwogZXh0M19mc2Jsa190IGV4dDNfbmV3X2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJZXh0M19mc2Jsa190IGdvYWwsIHVuc2lnbmVkIGxvbmcgKmNvdW50LCBpbnQgKmVycnApCkBAIC0xMzAzLDcgKzE1MDMsNyBAQAogCXNtcF9ybWIoKTsKIAogCS8qCi0JICogTm93IHNlYXJjaCB0aGUgcmVzdCBvZiB0aGUgZ3JvdXBzLiAgV2UgYXNzdW1lIHRoYXQgCisJICogTm93IHNlYXJjaCB0aGUgcmVzdCBvZiB0aGUgZ3JvdXBzLiAgV2UgYXNzdW1lIHRoYXQKIAkgKiBpIGFuZCBnZHAgY29ycmVjdGx5IHBvaW50IHRvIHRoZSBsYXN0IGdyb3VwIHZpc2l0ZWQuCiAJICovCiAJZm9yIChiZ2kgPSAwOyBiZ2kgPCBuZ3JvdXBzOyBiZ2krKykgewpAQCAtMTQyOCw3ICsxNjI4LDcgQEAKIAogCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CiAJZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCA9Ci0JCQljcHVfdG9fbGUxNihsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSAtIG51bSk7CisJCQljcHVfdG9fbGUxNihsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KS1udW0pOwogCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXBfbm8pKTsKIAlwZXJjcHVfY291bnRlcl9tb2QoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsIC1udW0pOwogCkBAIC0xNDcxLDYgKzE2NzEsMTIgQEAKIAlyZXR1cm4gZXh0M19uZXdfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGdvYWwsICZjb3VudCwgZXJycCk7CiB9CiAKKy8qKgorICogZXh0M19jb3VudF9mcmVlX2Jsb2NrcygpIC0tIGNvdW50IGZpbGVzeXN0ZW0gZnJlZSBibG9ja3MKKyAqIEBzYjoJCXN1cGVyYmxvY2sKKyAqCisgKiBBZGRzIHVwIHRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgZnJvbSBlYWNoIGJsb2NrIGdyb3VwLgorICovCiBleHQzX2ZzYmxrX3QgZXh0M19jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCWV4dDNfZnNibGtfdCBkZXNjX2NvdW50OwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9iaXRtYXAuYyBiL2ZzL2V4dDMvYml0bWFwLmMKaW5kZXggY2U0ZjgyYi4uYjkxNzZlZSAxMDA2NDQKLS0tIGEvZnMvZXh0My9iaXRtYXAuYworKysgYi9mcy9leHQzL2JpdG1hcC5jCkBAIC0yMCw3ICsyMCw3IEBACiAJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgbG9uZyBzdW0gPSAwOwogCi0JaWYgKCFtYXApIAorCWlmICghbWFwKQogCQlyZXR1cm4gKDApOwogCWZvciAoaSA9IDA7IGkgPCBudW1jaGFyczsgaSsrKQogCQlzdW0gKz0gbmliYmxlbWFwW21hcC0+Yl9kYXRhW2ldICYgMHhmXSArCmRpZmYgLS1naXQgYS9mcy9leHQzL2Rpci5jIGIvZnMvZXh0My9kaXIuYwppbmRleCBmYmIwZDRlLi40MjlhY2JiIDEwMDY0NAotLS0gYS9mcy9leHQzL2Rpci5jCisrKyBiL2ZzL2V4dDMvZGlyLmMKQEAgLTU5LDcgKzU5LDcgQEAKIAogCXJldHVybiAoZXh0M19maWxldHlwZV90YWJsZVtmaWxldHlwZV0pOwogfQotCQkJICAgICAgIAorCiAKIGludCBleHQzX2NoZWNrX2Rpcl9lbnRyeSAoY29uc3QgY2hhciAqIGZ1bmN0aW9uLCBzdHJ1Y3QgaW5vZGUgKiBkaXIsCiAJCQkgIHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICogZGUsCkBAIC02Nyw3ICs2Nyw3IEBACiAJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQogewogCWNvbnN0IGNoYXIgKiBlcnJvcl9tc2cgPSBOVUxMOwotIAljb25zdCBpbnQgcmxlbiA9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKKwljb25zdCBpbnQgcmxlbiA9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKIAogCWlmIChybGVuIDwgRVhUM19ESVJfUkVDX0xFTigxKSkKIAkJZXJyb3JfbXNnID0gInJlY19sZW4gaXMgc21hbGxlciB0aGFuIG1pbmltYWwiOwpAQCAtMTYyLDcgKzE2Miw3IEBACiAJCSAqIHRvIG1ha2Ugc3VyZS4gKi8KIAkJaWYgKGZpbHAtPmZfdmVyc2lvbiAhPSBpbm9kZS0+aV92ZXJzaW9uKSB7CiAJCQlmb3IgKGkgPSAwOyBpIDwgc2ItPnNfYmxvY2tzaXplICYmIGkgPCBvZmZzZXQ7ICkgewotCQkJCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIAorCQkJCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopCiAJCQkJCShiaC0+Yl9kYXRhICsgaSk7CiAJCQkJLyogSXQncyB0b28gZXhwZW5zaXZlIHRvIGRvIGEgZnVsbAogCQkJCSAqIGRpcmVudCB0ZXN0IGVhY2ggdGltZSByb3VuZCB0aGlzCkBAIC0xODEsNyArMTgxLDcgQEAKIAkJCWZpbHAtPmZfdmVyc2lvbiA9IGlub2RlLT5pX3ZlcnNpb247CiAJCX0KIAotCQl3aGlsZSAoIWVycm9yICYmIGZpbHAtPmZfcG9zIDwgaW5vZGUtPmlfc2l6ZSAKKwkJd2hpbGUgKCFlcnJvciAmJiBmaWxwLT5mX3BvcyA8IGlub2RlLT5pX3NpemUKIAkJICAgICAgICYmIG9mZnNldCA8IHNiLT5zX2Jsb2Nrc2l6ZSkgewogCQkJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgKGJoLT5iX2RhdGEgKyBvZmZzZXQpOwogCQkJaWYgKCFleHQzX2NoZWNrX2Rpcl9lbnRyeSAoImV4dDNfcmVhZGRpciIsIGlub2RlLCBkZSwKQEAgLTIyOSw3ICsyMjksNyBAQAogLyoKICAqIFRoZXNlIGZ1bmN0aW9ucyBjb252ZXJ0IGZyb20gdGhlIG1ham9yL21pbm9yIGhhc2ggdG8gYW4gZl9wb3MKICAqIHZhbHVlLgotICogCisgKgogICogQ3VycmVudGx5IHdlIG9ubHkgdXNlIG1ham9yIGhhc2ggbnVtZXIuICBUaGlzIGlzIHVuZm9ydHVuYXRlLCBidXQKICAqIG9uIDMyLWJpdCBtYWNoaW5lcywgdGhlIHNhbWUgVkZTIGludGVyZmFjZSBpcyB1c2VkIGZvciBsc2VlayBhbmQKICAqIGxsc2Vlaywgc28gaWYgd2UgdXNlIHRoZSA2NCBiaXQgb2Zmc2V0LCB0aGVuIHRoZSAzMi1iaXQgdmVyc2lvbnMgb2YKQEAgLTI1MCw3ICsyNTAsNyBAQAogc3RydWN0IGZuYW1lIHsKIAlfX3UzMgkJaGFzaDsKIAlfX3UzMgkJbWlub3JfaGFzaDsKLQlzdHJ1Y3QgcmJfbm9kZQlyYl9oYXNoOyAKKwlzdHJ1Y3QgcmJfbm9kZQlyYl9oYXNoOwogCXN0cnVjdCBmbmFtZQkqbmV4dDsKIAlfX3UzMgkJaW5vZGU7CiAJX191OAkJbmFtZV9sZW47CkBAIC0zNDMsMTAgKzM0Myw5IEBACiAKIAkvKiBDcmVhdGUgYW5kIGFsbG9jYXRlIHRoZSBmbmFtZSBzdHJ1Y3R1cmUgKi8KIAlsZW4gPSBzaXplb2Yoc3RydWN0IGZuYW1lKSArIGRpcmVudC0+bmFtZV9sZW4gKyAxOwotCW5ld19mbiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwluZXdfZm4gPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXdfZm4pCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChuZXdfZm4sIDAsIGxlbik7CiAJbmV3X2ZuLT5oYXNoID0gaGFzaDsKIAluZXdfZm4tPm1pbm9yX2hhc2ggPSBtaW5vcl9oYXNoOwogCW5ld19mbi0+aW5vZGUgPSBsZTMyX3RvX2NwdShkaXJlbnQtPmlub2RlKTsKQEAgLTQxMCw3ICs0MDksNyBAQAogCWN1cnJfcG9zID0gaGFzaDJwb3MoZm5hbWUtPmhhc2gsIGZuYW1lLT5taW5vcl9oYXNoKTsKIAl3aGlsZSAoZm5hbWUpIHsKIAkJZXJyb3IgPSBmaWxsZGlyKGRpcmVudCwgZm5hbWUtPm5hbWUsCi0JCQkJZm5hbWUtPm5hbWVfbGVuLCBjdXJyX3BvcywgCisJCQkJZm5hbWUtPm5hbWVfbGVuLCBjdXJyX3BvcywKIAkJCQlmbmFtZS0+aW5vZGUsCiAJCQkJZ2V0X2R0eXBlKHNiLCBmbmFtZS0+ZmlsZV90eXBlKSk7CiAJCWlmIChlcnJvcikgewpAQCAtNDY1LDcgKzQ2NCw3IEBACiAJCS8qCiAJCSAqIEZpbGwgdGhlIHJidHJlZSBpZiB3ZSBoYXZlIG5vIG1vcmUgZW50cmllcywKIAkJICogb3IgdGhlIGlub2RlIGhhcyBjaGFuZ2VkIHNpbmNlIHdlIGxhc3QgcmVhZCBpbiB0aGUKLQkJICogY2FjaGVkIGVudHJpZXMuIAorCQkgKiBjYWNoZWQgZW50cmllcy4KIAkJICovCiAJCWlmICgoIWluZm8tPmN1cnJfbm9kZSkgfHwKIAkJICAgIChmaWxwLT5mX3ZlcnNpb24gIT0gaW5vZGUtPmlfdmVyc2lvbikpIHsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvZmlsZS5jIGIvZnMvZXh0My9maWxlLmMKaW5kZXggMWVmZWZiNi4uOTk0ZWZkMSAxMDA2NDQKLS0tIGEvZnMvZXh0My9maWxlLmMKKysrIGIvZnMvZXh0My9maWxlLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCiBmb3JjZV9jb21taXQ6CiAJZXJyID0gZXh0M19mb3JjZV9jb21taXQoaW5vZGUtPmlfc2IpOwotCWlmIChlcnIpIAorCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2V4dDMvZnN5bmMuYyBiL2ZzL2V4dDMvZnN5bmMuYwppbmRleCA0OTM4MmEyMC4uZGQxZmQzYyAxMDA2NDQKLS0tIGEvZnMvZXh0My9mc3luYy5jCisrKyBiL2ZzL2V4dDMvZnN5bmMuYwpAQCAtOCwxNCArOCwxNCBAQAogICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQogICogIGZyb20KICAqICBsaW51eC9mcy9taW5peC90cnVuY2F0ZS5jICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcwotICogCisgKgogICogIGV4dDNmcyBmc3luYyBwcmltaXRpdmUKICAqCiAgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQogICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKLSAqIAorICoKICAqICBSZW1vdmVkIHVubmVjZXNzYXJ5IGNvZGUgZHVwbGljYXRpb24gZm9yIGxpdHRsZSBlbmRpYW4gbWFjaGluZXMKLSAqICBhbmQgZXhjZXNzaXZlIF9faW5saW5lX19zLiAKKyAqICBhbmQgZXhjZXNzaXZlIF9faW5saW5lX19zLgogICogICAgICAgIEFuZGkgS2xlZW4sIDE5OTcKICAqCiAgKiBNYWpvciBzaW1wbGljYXRpb25zIGFuZCBjbGVhbnVwIC0gd2Ugb25seSBuZWVkIHRvIGRvIHRoZSBtZXRhZGF0YSwgYmVjYXVzZQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9oYXNoLmMgYi9mcy9leHQzL2hhc2guYwppbmRleCA1YTJkMTIzLi5kZWViMjdiIDEwMDY0NAotLS0gYS9mcy9leHQzL2hhc2guYworKysgYi9mcy9leHQzL2hhc2guYwpAQCAtNCw3ICs0LDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwMiBieSBUaGVvZG9yZSBUcydvCiAgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgdjIuCi0gKiAKKyAqCiAgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCiAgKiBMaWNlbnNlLgogICovCkBAIC04MCwxMSArODAsMTEgQEAKICAqIFJldHVybnMgdGhlIGhhc2ggb2YgYSBmaWxlbmFtZS4gIElmIGxlbiBpcyAwIGFuZCBuYW1lIGlzIE5VTEwsIHRoZW4KICAqIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gdGVzdCB3aGV0aGVyIG9yIG5vdCBhIGhhc2ggdmVyc2lvbiBpcwogICogc3VwcG9ydGVkLgotICogCisgKgogICogVGhlIHNlZWQgaXMgYW4gNCBsb25nd29yZCAoMzIgYml0cykgInNlY3JldCIgd2hpY2ggY2FuIGJlIHVzZWQgdG8KICAqIHVuaXF1aWZ5IGEgaGFzaC4gIElmIHRoZSBzZWVkIGlzIGFsbCB6ZXJvJ3MsIHRoZW4gc29tZSBkZWZhdWx0IHNlZWQKICAqIG1heSBiZSB1c2VkLgotICogCisgKgogICogQSBwYXJ0aWN1bGFyIGhhc2ggdmVyc2lvbiBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIHNlZWQgaXMKICAqIHJlcHJlc2VudGVkLCBhbmQgd2hldGhlciBvciBub3QgdGhlIHJldHVybmVkIGhhc2ggaXMgMzIgYml0cyBvciA2NAogICogYml0cy4gIDMyIGJpdCBoYXNoZXMgd2lsbCByZXR1cm4gMCBmb3IgdGhlIG1pbm9yIGhhc2guCkBAIC05NSw3ICs5NSw3IEBACiAJX191MzIJbWlub3JfaGFzaCA9IDA7CiAJY29uc3QgY2hhcgkqcDsKIAlpbnQJCWk7Ci0JX191MzIgCQlpbls4XSwgYnVmWzRdOworCV9fdTMyCQlpbls4XSwgYnVmWzRdOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBzZWVkIGZvciB0aGUgaGFzaCBjaGVja3N1bSBmdW5jdGlvbnMgKi8KIAlidWZbMF0gPSAweDY3NDUyMzAxOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9pYWxsb2MuYyBiL2ZzL2V4dDMvaWFsbG9jLmMKaW5kZXggMzY1NDZlZC4uZTQ1ZGJkNiAxMDA2NDQKLS0tIGEvZnMvZXh0My9pYWxsb2MuYworKysgYi9mcy9leHQzL2lhbGxvYy5jCkBAIC0yMDIsNyArMjAyLDcgQEAKIHN0YXRpYyBpbnQgZmluZF9ncm91cF9kaXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlICpwYXJlbnQpCiB7CiAJaW50IG5ncm91cHMgPSBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7Ci0JaW50IGZyZWVpLCBhdmVmcmVlaTsKKwl1bnNpZ25lZCBpbnQgZnJlZWksIGF2ZWZyZWVpOwogCXN0cnVjdCBleHQzX2dyb3VwX2Rlc2MgKmRlc2MsICpiZXN0X2Rlc2MgPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJaW50IGdyb3VwLCBiZXN0X2dyb3VwID0gLTE7CkBAIC0yMTYsNyArMjE2LDcgQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpIDwgYXZlZnJlZWkpCiAJCQljb250aW51ZTsKLQkJaWYgKCFiZXN0X2Rlc2MgfHwgCisJCWlmICghYmVzdF9kZXNjIHx8CiAJCSAgICAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpID4KIAkJICAgICBsZTE2X3RvX2NwdShiZXN0X2Rlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSkpIHsKIAkJCWJlc3RfZ3JvdXAgPSBncm91cDsKQEAgLTIyNiwzMCArMjI2LDMwIEBACiAJcmV0dXJuIGJlc3RfZ3JvdXA7CiB9CiAKLS8qIAotICogT3Jsb3YncyBhbGxvY2F0b3IgZm9yIGRpcmVjdG9yaWVzLiAKLSAqIAorLyoKKyAqIE9ybG92J3MgYWxsb2NhdG9yIGZvciBkaXJlY3Rvcmllcy4KKyAqCiAgKiBXZSBhbHdheXMgdHJ5IHRvIHNwcmVhZCBmaXJzdC1sZXZlbCBkaXJlY3Rvcmllcy4KICAqCi0gKiBJZiB0aGVyZSBhcmUgYmxvY2tncm91cHMgd2l0aCBib3RoIGZyZWUgaW5vZGVzIGFuZCBmcmVlIGJsb2NrcyBjb3VudHMgCi0gKiBub3Qgd29yc2UgdGhhbiBhdmVyYWdlIHdlIHJldHVybiBvbmUgd2l0aCBzbWFsbGVzdCBkaXJlY3RvcnkgY291bnQuIAotICogT3RoZXJ3aXNlIHdlIHNpbXBseSByZXR1cm4gYSByYW5kb20gZ3JvdXAuIAotICogCi0gKiBGb3IgdGhlIHJlc3QgcnVsZXMgbG9vayBzbzogCi0gKiAKLSAqIEl0J3MgT0sgdG8gcHV0IGRpcmVjdG9yeSBpbnRvIGEgZ3JvdXAgdW5sZXNzIAotICogaXQgaGFzIHRvbyBtYW55IGRpcmVjdG9yaWVzIGFscmVhZHkgKG1heF9kaXJzKSBvciAKLSAqIGl0IGhhcyB0b28gZmV3IGZyZWUgaW5vZGVzIGxlZnQgKG1pbl9pbm9kZXMpIG9yIAotICogaXQgaGFzIHRvbyBmZXcgZnJlZSBibG9ja3MgbGVmdCAobWluX2Jsb2Nrcykgb3IgCi0gKiBpdCdzIGFscmVhZHkgcnVubmluZyB0b28gbGFyZ2UgZGVidCAobWF4X2RlYnQpLiAKLSAqIFBhcmVudCdzIGdyb3VwIGlzIHByZWZlcmVkLCBpZiBpdCBkb2Vzbid0IHNhdGlzZnkgdGhlc2UgCi0gKiBjb25kaXRpb25zIHdlIHNlYXJjaCBjeWNsaWNhbGx5IHRocm91Z2ggdGhlIHJlc3QuIElmIG5vbmUgCi0gKiBvZiB0aGUgZ3JvdXBzIGxvb2sgZ29vZCB3ZSBqdXN0IGxvb2sgZm9yIGEgZ3JvdXAgd2l0aCBtb3JlIAotICogZnJlZSBpbm9kZXMgdGhhbiBhdmVyYWdlIChzdGFydGluZyBhdCBwYXJlbnQncyBncm91cCkuIAotICogCi0gKiBEZWJ0IGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSB3ZSBhbGxvY2F0ZSBhIGRpcmVjdG9yeSBhbmQgZGVjcmVtZW50ZWQgCi0gKiB3aGVuIHdlIGFsbG9jYXRlIGFuIGlub2RlLCB3aXRoaW4gMC0tMjU1LiAKLSAqLyAKKyAqIElmIHRoZXJlIGFyZSBibG9ja2dyb3VwcyB3aXRoIGJvdGggZnJlZSBpbm9kZXMgYW5kIGZyZWUgYmxvY2tzIGNvdW50cworICogbm90IHdvcnNlIHRoYW4gYXZlcmFnZSB3ZSByZXR1cm4gb25lIHdpdGggc21hbGxlc3QgZGlyZWN0b3J5IGNvdW50LgorICogT3RoZXJ3aXNlIHdlIHNpbXBseSByZXR1cm4gYSByYW5kb20gZ3JvdXAuCisgKgorICogRm9yIHRoZSByZXN0IHJ1bGVzIGxvb2sgc286CisgKgorICogSXQncyBPSyB0byBwdXQgZGlyZWN0b3J5IGludG8gYSBncm91cCB1bmxlc3MKKyAqIGl0IGhhcyB0b28gbWFueSBkaXJlY3RvcmllcyBhbHJlYWR5IChtYXhfZGlycykgb3IKKyAqIGl0IGhhcyB0b28gZmV3IGZyZWUgaW5vZGVzIGxlZnQgKG1pbl9pbm9kZXMpIG9yCisgKiBpdCBoYXMgdG9vIGZldyBmcmVlIGJsb2NrcyBsZWZ0IChtaW5fYmxvY2tzKSBvcgorICogaXQncyBhbHJlYWR5IHJ1bm5pbmcgdG9vIGxhcmdlIGRlYnQgKG1heF9kZWJ0KS4KKyAqIFBhcmVudCdzIGdyb3VwIGlzIHByZWZlcmVkLCBpZiBpdCBkb2Vzbid0IHNhdGlzZnkgdGhlc2UKKyAqIGNvbmRpdGlvbnMgd2Ugc2VhcmNoIGN5Y2xpY2FsbHkgdGhyb3VnaCB0aGUgcmVzdC4gSWYgbm9uZQorICogb2YgdGhlIGdyb3VwcyBsb29rIGdvb2Qgd2UganVzdCBsb29rIGZvciBhIGdyb3VwIHdpdGggbW9yZQorICogZnJlZSBpbm9kZXMgdGhhbiBhdmVyYWdlIChzdGFydGluZyBhdCBwYXJlbnQncyBncm91cCkuCisgKgorICogRGVidCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgd2UgYWxsb2NhdGUgYSBkaXJlY3RvcnkgYW5kIGRlY3JlbWVudGVkCisgKiB3aGVuIHdlIGFsbG9jYXRlIGFuIGlub2RlLCB3aXRoaW4gMC0tMjU1LgorICovCiAKICNkZWZpbmUgSU5PREVfQ09TVCA2NAogI2RlZmluZSBCTE9DS19DT1NUIDI1NgpAQCAtMjYxLDEwICsyNjEsMTAgQEAKIAlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CiAJaW50IG5ncm91cHMgPSBzYmktPnNfZ3JvdXBzX2NvdW50OwogCWludCBpbm9kZXNfcGVyX2dyb3VwID0gRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKTsKLQlpbnQgZnJlZWksIGF2ZWZyZWVpOworCXVuc2lnbmVkIGludCBmcmVlaSwgYXZlZnJlZWk7CiAJZXh0M19mc2Jsa190IGZyZWViLCBhdmVmcmVlYjsKIAlleHQzX2ZzYmxrX3QgYmxvY2tzX3Blcl9kaXI7Ci0JaW50IG5kaXJzOworCXVuc2lnbmVkIGludCBuZGlyczsKIAlpbnQgbWF4X2RlYnQsIG1heF9kaXJzLCBtaW5faW5vZGVzOwogCWV4dDNfZ3JwYmxrX3QgbWluX2Jsb2NrczsKIAlpbnQgZ3JvdXAgPSAtMSwgaTsKQEAgLTQ1NCw3ICs0NTQsNyBAQAogCQkJZ3JvdXAgPSBmaW5kX2dyb3VwX2RpcihzYiwgZGlyKTsKIAkJZWxzZQogCQkJZ3JvdXAgPSBmaW5kX2dyb3VwX29ybG92KHNiLCBkaXIpOwotCX0gZWxzZSAKKwl9IGVsc2UKIAkJZ3JvdXAgPSBmaW5kX2dyb3VwX290aGVyKHNiLCBkaXIpOwogCiAJZXJyID0gLUVOT1NQQzsKQEAgLTU1OSw3ICs1NTksNiBAQAogCiAJaW5vZGUtPmlfaW5vID0gaW5vOwogCS8qIFRoaXMgaXMgdGhlIG9wdGltYWwgSU8gc2l6ZSAoZm9yIHN0YXQpLCBub3QgdGhlIGZzIGJsb2NrIHNpemUgKi8KLQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOwogCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKIApkaWZmIC0tZ2l0IGEvZnMvZXh0My9pbm9kZS5jIGIvZnMvZXh0My9pbm9kZS5jCmluZGV4IDg0YmUwMmUuLmRjZjRmMWQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaW5vZGUuYworKysgYi9mcy9leHQzL2lub2RlLmMKQEAgLTEzLDExICsxMywxMSBAQAogICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKICAqCiAgKiAgR29hbC1kaXJlY3RlZCBibG9jayBhbGxvY2F0aW9uIGJ5IFN0ZXBoZW4gVHdlZWRpZQotICogCShzY3RAcmVkaGF0LmNvbSksIDE5OTMsIDE5OTgKKyAqCShzY3RAcmVkaGF0LmNvbSksIDE5OTMsIDE5OTgKICAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CiAgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQogICogIDY0LWJpdCBmaWxlIHN1cHBvcnQgb24gNjQtYml0IHBsYXRmb3JtcyBieSBKYWt1YiBKZWxpbmVrCi0gKiAJKGpqQHN1bnNpdGUubXMubWZmLmN1bmkuY3opCisgKgkoampAc3Vuc2l0ZS5tcy5tZmYuY3VuaS5jeikKICAqCiAgKiAgQXNzb3J0ZWQgcmFjZSBmaXhlcywgcmV3cml0ZSBvZiBleHQzX2dldF9ibG9jaygpIGJ5IEFsIFZpcm8sIDIwMDAKICAqLwpAQCAtNTUsNyArNTUsNyBAQAogLyoKICAqIFRoZSBleHQzIGZvcmdldCBmdW5jdGlvbiBtdXN0IHBlcmZvcm0gYSByZXZva2UgaWYgd2UgYXJlIGZyZWVpbmcgZGF0YQogICogd2hpY2ggaGFzIGJlZW4gam91cm5hbGVkLiAgTWV0YWRhdGEgKGVnLiBpbmRpcmVjdCBibG9ja3MpIG11c3QgYmUKLSAqIHJldm9rZWQgaW4gYWxsIGNhc2VzLiAKKyAqIHJldm9rZWQgaW4gYWxsIGNhc2VzLgogICoKICAqICJiaCIgbWF5IGJlIE5VTEw6IGEgbWV0YWRhdGEgYmxvY2sgbWF5IGhhdmUgYmVlbiBmcmVlZCBmcm9tIG1lbW9yeQogICogYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBhIHJlY29yZCBvZiBpdCBpbiB0aGUgam91cm5hbCwgYW5kIHRoYXQgcmVjb3JkCkBAIC0xMDUsNyArMTA1LDcgQEAKICAqIFdvcmsgb3V0IGhvdyBtYW55IGJsb2NrcyB3ZSBuZWVkIHRvIHByb2NlZWQgd2l0aCB0aGUgbmV4dCBjaHVuayBvZiBhCiAgKiB0cnVuY2F0ZSB0cmFuc2FjdGlvbi4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgYmxvY2tzX2Zvcl90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKSAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJsb2Nrc19mb3JfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAl1bnNpZ25lZCBsb25nIG5lZWRlZDsKIApAQCAtMTIyLDEzICsxMjIsMTMgQEAKIAogCS8qIEJ1dCB3ZSBuZWVkIHRvIGJvdW5kIHRoZSB0cmFuc2FjdGlvbiBzbyB3ZSBkb24ndCBvdmVyZmxvdyB0aGUKIAkgKiBqb3VybmFsLiAqLwotCWlmIChuZWVkZWQgPiBFWFQzX01BWF9UUkFOU19EQVRBKSAKKwlpZiAobmVlZGVkID4gRVhUM19NQVhfVFJBTlNfREFUQSkKIAkJbmVlZGVkID0gRVhUM19NQVhfVFJBTlNfREFUQTsKIAogCXJldHVybiBFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKSArIG5lZWRlZDsKIH0KIAotLyogCisvKgogICogVHJ1bmNhdGUgdHJhbnNhY3Rpb25zIGNhbiBiZSBjb21wbGV4IGFuZCBhYnNvbHV0ZWx5IGh1Z2UuICBTbyB3ZSBuZWVkIHRvCiAgKiBiZSBhYmxlIHRvIHJlc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGF0IGEgY29udmVudGllbnQgY2hlY2twb2ludCB0byBtYWtlCiAgKiBzdXJlIHdlIGRvbid0IG92ZXJmbG93IHRoZSBqb3VybmFsLgpAQCAtMTM2LDkgKzEzNiw5IEBACiAgKiBzdGFydF90cmFuc2FjdGlvbiBnZXRzIHVzIGEgbmV3IGhhbmRsZSBmb3IgYSB0cnVuY2F0ZSB0cmFuc2FjdGlvbiwKICAqIGFuZCBleHRlbmRfdHJhbnNhY3Rpb24gdHJpZXMgdG8gZXh0ZW5kIHRoZSBleGlzdGluZyBvbmUgYSBiaXQuICBJZgogICogZXh0ZW5kIGZhaWxzLCB3ZSBuZWVkIHRvIHByb3BhZ2F0ZSB0aGUgZmFpbHVyZSB1cCBhbmQgcmVzdGFydCB0aGUKLSAqIHRyYW5zYWN0aW9uIGluIHRoZSB0b3AtbGV2ZWwgdHJ1bmNhdGUgbG9vcC4gLS1zY3QgCisgKiB0cmFuc2FjdGlvbiBpbiB0aGUgdG9wLWxldmVsIHRydW5jYXRlIGxvb3AuIC0tc2N0CiAgKi8KLXN0YXRpYyBoYW5kbGVfdCAqc3RhcnRfdHJhbnNhY3Rpb24oc3RydWN0IGlub2RlICppbm9kZSkgCitzdGF0aWMgaGFuZGxlX3QgKnN0YXJ0X3RyYW5zYWN0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaGFuZGxlX3QgKnJlc3VsdDsKIApAQCAtMjE1LDEyICsyMTUsMTIgQEAKIAlleHQzX29ycGhhbl9kZWwoaGFuZGxlLCBpbm9kZSk7CiAJRVhUM19JKGlub2RlKS0+aV9kdGltZQk9IGdldF9zZWNvbmRzKCk7CiAKLQkvKiAKKwkvKgogCSAqIE9uZSBzdWJ0bGUgb3JkZXJpbmcgcmVxdWlyZW1lbnQ6IGlmIGFueXRoaW5nIGhhcyBnb25lIHdyb25nCiAJICogKHRyYW5zYWN0aW9uIGFib3J0LCBJTyBlcnJvcnMsIHdoYXRldmVyKSwgdGhlbiB3ZSBjYW4gc3RpbGwKIAkgKiBkbyB0aGVzZSBuZXh0IHN0ZXBzICh0aGUgZnMgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiBtYXJrZWQgYXMKIAkgKiBoYXZpbmcgZXJyb3JzKSwgYnV0IHdlIGNhbid0IGZyZWUgdGhlIGlub2RlIGlmIHRoZSBtYXJrX2RpcnR5Ci0JICogZmFpbHMuICAKKwkgKiBmYWlscy4KIAkgKi8KIAlpZiAoZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpKQogCQkvKiBJZiB0aGF0IGZhaWxlZCwganVzdCBkbyB0aGUgcmVxdWlyZWQgaW4tY29yZSBpbm9kZSBjbGVhci4gKi8KQEAgLTM5OCw3ICszOTgsNyBAQAogICoJICArIGlmIHRoZXJlIGlzIGEgYmxvY2sgdG8gdGhlIGxlZnQgb2Ygb3VyIHBvc2l0aW9uIC0gYWxsb2NhdGUgbmVhciBpdC4KICAqCSAgKyBpZiBwb2ludGVyIHdpbGwgbGl2ZSBpbiBpbmRpcmVjdCBibG9jayAtIGFsbG9jYXRlIG5lYXIgdGhhdCBibG9jay4KICAqCSAgKyBpZiBwb2ludGVyIHdpbGwgbGl2ZSBpbiBpbm9kZSAtIGFsbG9jYXRlIGluIHRoZSBzYW1lCi0gKgkgICAgY3lsaW5kZXIgZ3JvdXAuIAorICoJICAgIGN5bGluZGVyIGdyb3VwLgogICoKICAqIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSBjb2xvdXIgdGhlIHN0YXJ0aW5nIGJsb2NrIGJ5IHRoZSBjYWxsZXJzIFBJRCB0bwogICogcHJldmVudCBpdCBmcm9tIGNsYXNoaW5nIHdpdGggY29uY3VycmVudCBhbGxvY2F0aW9ucyBmb3IgYSBkaWZmZXJlbnQgaW5vZGUKQEAgLTQ3MCw3ICs0NzAsNyBAQAogICoJZXh0M19ibGtzX3RvX2FsbG9jYXRlOiBMb29rIHVwIHRoZSBibG9jayBtYXAgYW5kIGNvdW50IHRoZSBudW1iZXIKICAqCW9mIGRpcmVjdCBibG9ja3MgbmVlZCB0byBiZSBhbGxvY2F0ZWQgZm9yIHRoZSBnaXZlbiBicmFuY2guCiAgKgotICogCUBicmFuY2g6IGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcworICoJQGJyYW5jaDogY2hhaW4gb2YgaW5kaXJlY3QgYmxvY2tzCiAgKglAazogbnVtYmVyIG9mIGJsb2NrcyBuZWVkIGZvciBpbmRpcmVjdCBibG9ja3MKICAqCUBibGtzOiBudW1iZXIgb2YgZGF0YSBibG9ja3MgdG8gYmUgbWFwcGVkLgogICoJQGJsb2Nrc190b19ib3VuZGFyeTogIHRoZSBvZmZzZXQgaW4gdGhlIGluZGlyZWN0IGJsb2NrCkBAIC03NDQsNyArNzQ0LDcgQEAKIAkJamJkX2RlYnVnKDUsICJzcGxpY2luZyBpbmRpcmVjdCBvbmx5XG4iKTsKIAkJQlVGRkVSX1RSQUNFKHdoZXJlLT5iaCwgImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CiAJCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIHdoZXJlLT5iaCk7Ci0JCWlmIChlcnIpIAorCQlpZiAoZXJyKQogCQkJZ290byBlcnJfb3V0OwogCX0gZWxzZSB7CiAJCS8qCkBAIC0xMDk4LDcgKzEwOTgsNyBAQAogCiAJZm9yICgJYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7CiAJCXJldCA9PSAwICYmIChiaCAhPSBoZWFkIHx8ICFibG9ja19zdGFydCk7Ci0JICAgIAlibG9ja19zdGFydCA9IGJsb2NrX2VuZCwgYmggPSBuZXh0KQorCQlibG9ja19zdGFydCA9IGJsb2NrX2VuZCwgYmggPSBuZXh0KQogCXsKIAkJbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKIAkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBibG9ja3NpemU7CkBAIC0xMTM3LDcgKzExMzcsNyBAQAogICogU28gd2hhdCB3ZSBkbyBpcyB0byByZWx5IG9uIHRoZSBmYWN0IHRoYXQgam91cm5hbF9zdG9wL2pvdXJuYWxfc3RhcnQKICAqIHdpbGwgX25vdF8gcnVuIGNvbW1pdCB1bmRlciB0aGVzZSBjaXJjdW1zdGFuY2VzIGJlY2F1c2UgaGFuZGxlLT5oX3JlZgogICogaXMgZWxldmF0ZWQuICBXZSdsbCBzdGlsbCBoYXZlIGVub3VnaCBjcmVkaXRzIGZvciB0aGUgdGlueSBxdW90YWZpbGUKLSAqIHdyaXRlLiAgCisgKiB3cml0ZS4KICAqLwogc3RhdGljIGludCBkb19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlX3QgKmhhbmRsZSwKIAkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKQEAgLTEyODIsNyArMTI4Miw3IEBACiAJaWYgKGlub2RlLT5pX3NpemUgPiBFWFQzX0koaW5vZGUpLT5pX2Rpc2tzaXplKSB7CiAJCUVYVDNfSShpbm9kZSktPmlfZGlza3NpemUgPSBpbm9kZS0+aV9zaXplOwogCQlyZXQyID0gZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCQlpZiAoIXJldCkgCisJCWlmICghcmV0KQogCQkJcmV0ID0gcmV0MjsKIAl9CiAJcmV0MiA9IGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CkBAIC0xMjkxLDcgKzEyOTEsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIAorLyoKICAqIGJtYXAoKSBpcyBzcGVjaWFsLiAgSXQgZ2V0cyB1c2VkIGJ5IGFwcGxpY2F0aW9ucyBzdWNoIGFzIGxpbG8gYW5kIGJ5CiAgKiB0aGUgc3dhcHBlciB0byBmaW5kIHRoZSBvbi1kaXNrIGJsb2NrIG9mIGEgc3BlY2lmaWMgcGllY2Ugb2YgZGF0YS4KICAqCkBAIC0xMzAwLDEwICsxMzAwLDEwIEBACiAgKiBmaWxlc3lzdGVtIGFuZCBlbmFibGVzIHN3YXAsIHRoZW4gdGhleSBtYXkgZ2V0IGEgbmFzdHkgc2hvY2sgd2hlbiB0aGUKICAqIGRhdGEgZ2V0dGluZyBzd2FwcGVkIHRvIHRoYXQgc3dhcGZpbGUgc3VkZGVubHkgZ2V0cyBvdmVyd3JpdHRlbiBieQogICogdGhlIG9yaWdpbmFsIHplcm8ncyB3cml0dGVuIG91dCBwcmV2aW91c2x5IHRvIHRoZSBqb3VybmFsIGFuZAotICogYXdhaXRpbmcgd3JpdGViYWNrIGluIHRoZSBrZXJuZWwncyBidWZmZXIgY2FjaGUuIAorICogYXdhaXRpbmcgd3JpdGViYWNrIGluIHRoZSBrZXJuZWwncyBidWZmZXIgY2FjaGUuCiAgKgogICogU28sIGlmIHdlIHNlZSBhbnkgYm1hcCBjYWxscyBoZXJlIG9uIGEgbW9kaWZpZWQsIGRhdGEtam91cm5hbGVkIGZpbGUsCi0gKiB0YWtlIGV4dHJhIHN0ZXBzIHRvIGZsdXNoIGFueSBibG9ja3Mgd2hpY2ggbWlnaHQgYmUgaW4gdGhlIGNhY2hlLiAKKyAqIHRha2UgZXh0cmEgc3RlcHMgdG8gZmx1c2ggYW55IGJsb2NrcyB3aGljaCBtaWdodCBiZSBpbiB0aGUgY2FjaGUuCiAgKi8KIHN0YXRpYyBzZWN0b3JfdCBleHQzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKQogewpAQCAtMTMxMiwxNiArMTMxMiwxNiBAQAogCWludCBlcnI7CiAKIAlpZiAoRVhUM19JKGlub2RlKS0+aV9zdGF0ZSAmIEVYVDNfU1RBVEVfSkRBVEEpIHsKLQkJLyogCisJCS8qCiAJCSAqIFRoaXMgaXMgYSBSRUFMTFkgaGVhdnl3ZWlnaHQgYXBwcm9hY2gsIGJ1dCB0aGUgdXNlIG9mCiAJCSAqIGJtYXAgb24gZGlydHkgZmlsZXMgaXMgZXhwZWN0ZWQgdG8gYmUgZXh0cmVtZWx5IHJhcmU6CiAJCSAqIG9ubHkgaWYgd2UgcnVuIGxpbG8gb3Igc3dhcG9uIG9uIGEgZnJlc2hseSBtYWRlIGZpbGUKLQkJICogZG8gd2UgZXhwZWN0IHRoaXMgdG8gaGFwcGVuLiAKKwkJICogZG8gd2UgZXhwZWN0IHRoaXMgdG8gaGFwcGVuLgogCQkgKgogCQkgKiAoYm1hcCByZXF1aXJlcyBDQVBfU1lTX1JBV0lPIHNvIHRoaXMgZG9lcyBub3QKIAkJICogcmVwcmVzZW50IGFuIHVucHJpdmlsZWdlZCB1c2VyIERPUyBhdHRhY2sgLS0tIHdlJ2QgYmUKIAkJICogaW4gdHJvdWJsZSBpZiBtb3J0YWwgdXNlcnMgY291bGQgdHJpZ2dlciB0aGlzIHBhdGggYXQKLQkJICogd2lsbC4pIAorCQkgKiB3aWxsLikKIAkJICoKIAkJICogTkIuIEVYVDNfU1RBVEVfSkRBVEEgaXMgbm90IHNldCBvbiBmaWxlcyBvdGhlciB0aGFuCiAJCSAqIHJlZ3VsYXIgZmlsZXMuICBJZiBzb21lYm9keSB3YW50cyB0byBibWFwIGEgZGlyZWN0b3J5CkBAIC0xNDU3LDcgKzE0NTcsNyBAQAogCSAqLwogCiAJLyoKLQkgKiBBbmQgYXR0YWNoIHRoZW0gdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uICBCdXQgb25seSBpZiAKKwkgKiBBbmQgYXR0YWNoIHRoZW0gdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uICBCdXQgb25seSBpZgogCSAqIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZSgpIHN1Y2NlZWRlZC4gIE90aGVyd2lzZSB0aGV5IGFyZSB1bm1hcHBlZCwKIAkgKiBhbmQgZ2VuZXJhbGx5IGp1bmsuCiAJICovCkBAIC0xNjQ0LDcgKzE2NDQsNyBAQAogCQl9CiAJfQogCi0JcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW5vZGUtPmlfc2ItPnNfYmRldiwgaW92LCAKKwlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCiAJCQkJIG9mZnNldCwgbnJfc2VncywKIAkJCQkgZXh0M19nZXRfYmxvY2ssIE5VTEwpOwogCkBAIC0yMDI1LDcgKzIwMjUsNyBAQAogCQkJICAgX19sZTMyICpmaXJzdCwgX19sZTMyICpsYXN0KQogewogCWV4dDNfZnNibGtfdCBibG9ja190b19mcmVlID0gMDsgICAgLyogU3RhcnRpbmcgYmxvY2sgIyBvZiBhIHJ1biAqLwotCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwOwkgICAgLyogTnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgcnVuICovIAorCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwOwkgICAgLyogTnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgcnVuICovCiAJX19sZTMyICpibG9ja190b19mcmVlX3AgPSBOVUxMOwkgICAgLyogUG9pbnRlciBpbnRvIGlub2RlL2luZAogCQkJCQkgICAgICAgY29ycmVzcG9uZGluZyB0bwogCQkJCQkgICAgICAgYmxvY2tfdG9fZnJlZSAqLwpAQCAtMjA1NCw3ICsyMDU0LDcgQEAKIAkJCX0gZWxzZSBpZiAobnIgPT0gYmxvY2tfdG9fZnJlZSArIGNvdW50KSB7CiAJCQkJY291bnQrKzsKIAkJCX0gZWxzZSB7Ci0JCQkJZXh0M19jbGVhcl9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgdGhpc19iaCwgCisJCQkJZXh0M19jbGVhcl9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgdGhpc19iaCwKIAkJCQkJCSAgYmxvY2tfdG9fZnJlZSwKIAkJCQkJCSAgY291bnQsIGJsb2NrX3RvX2ZyZWVfcCwgcCk7CiAJCQkJYmxvY2tfdG9fZnJlZSA9IG5yOwpAQCAtMjExNSw3ICsyMTE1LDcgQEAKIAkJCSAqLwogCQkJaWYgKCFiaCkgewogCQkJCWV4dDNfZXJyb3IoaW5vZGUtPmlfc2IsICJleHQzX2ZyZWVfYnJhbmNoZXMiLAotCQkJCQkgICAiUmVhZCBmYWlsdXJlLCBpbm9kZT0lbGQsIGJsb2NrPSJFM0ZTQkxLLAorCQkJCQkgICAiUmVhZCBmYWlsdXJlLCBpbm9kZT0lbHUsIGJsb2NrPSJFM0ZTQkxLLAogCQkJCQkgICBpbm9kZS0+aV9pbm8sIG5yKTsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTIxODQsNyArMjE4NCw3IEBACiAJCQkJCSpwID0gMDsKIAkJCQkJQlVGRkVSX1RSQUNFKHBhcmVudF9iaCwKIAkJCQkJImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7Ci0JCQkJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIAorCQkJCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAogCQkJCQkJCQkgICAgcGFyZW50X2JoKTsKIAkJCQl9CiAJCQl9CkBAIC0yNjMyLDkgKzI2MzIsNiBAQAogCQkgKiByZWNvdmVyeSBjb2RlOiB0aGF0J3MgZmluZSwgd2UncmUgYWJvdXQgdG8gY29tcGxldGUKIAkJICogdGhlIHByb2Nlc3Mgb2YgZGVsZXRpbmcgdGhvc2UuICovCiAJfQotCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7CS8qIFRoaXMgaXMgdGhlIG9wdGltYWwgSU8gc2l6ZQotCQkJCQkgKiAoZm9yIHN0YXQpLCBub3QgdGhlIGZzIGJsb2NrCi0JCQkJCSAqIHNpemUgKi8gIAogCWlub2RlLT5pX2Jsb2NrcyA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9ibG9ja3MpOwogCWVpLT5pX2ZsYWdzID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2ZsYWdzKTsKICNpZmRlZiBFWFQzX0ZSQUdNRU5UUwpAQCAtMjcwNCw3ICsyNzAxLDcgQEAKIAkJaWYgKHJhd19pbm9kZS0+aV9ibG9ja1swXSkKIAkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKIAkJCSAgIG9sZF9kZWNvZGVfZGV2KGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9ibG9ja1swXSkpKTsKLQkJZWxzZSAKKwkJZWxzZQogCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLAogCQkJICAgbmV3X2RlY29kZV9kZXYobGUzMl90b19jcHUocmF3X2lub2RlLT5pX2Jsb2NrWzFdKSkpOwogCX0KQEAgLTI3MjQsOCArMjcyMSw4IEBACiAgKgogICogVGhlIGNhbGxlciBtdXN0IGhhdmUgd3JpdGUgYWNjZXNzIHRvIGlsb2MtPmJoLgogICovCi1zdGF0aWMgaW50IGV4dDNfZG9fdXBkYXRlX2lub2RlKGhhbmRsZV90ICpoYW5kbGUsIAotCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIAorc3RhdGljIGludCBleHQzX2RvX3VwZGF0ZV9pbm9kZShoYW5kbGVfdCAqaGFuZGxlLAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkJc3RydWN0IGV4dDNfaWxvYyAqaWxvYykKIHsKIAlzdHJ1Y3QgZXh0M19pbm9kZSAqcmF3X2lub2RlID0gZXh0M19yYXdfaW5vZGUoaWxvYyk7CkBAIC0yOTAwLDcgKzI4OTcsNyBAQAogICogY29tbWl0IHdpbGwgbGVhdmUgdGhlIGJsb2NrcyBiZWluZyBmbHVzaGVkIGluIGFuIHVudXNlZCBzdGF0ZSBvbgogICogZGlzay4gIChPbiByZWNvdmVyeSwgdGhlIGlub2RlIHdpbGwgZ2V0IHRydW5jYXRlZCBhbmQgdGhlIGJsb2NrcyB3aWxsCiAgKiBiZSBmcmVlZCwgc28gd2UgaGF2ZSBhIHN0cm9uZyBndWFyYW50ZWUgdGhhdCBubyBmdXR1cmUgY29tbWl0IHdpbGwKLSAqIGxlYXZlIHRoZXNlIGJsb2NrcyB2aXNpYmxlIHRvIHRoZSB1c2VyLikgIAorICogbGVhdmUgdGhlc2UgYmxvY2tzIHZpc2libGUgdG8gdGhlIHVzZXIuKQogICoKICAqIENhbGxlZCB3aXRoIGlub2RlLT5zZW0gZG93bi4KICAqLwpAQCAtMzA0MywxMyArMzA0MCwxMyBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qIAorLyoKICAqIE9uIHN1Y2Nlc3MsIFdlIGVuZCB1cCB3aXRoIGFuIG91dHN0YW5kaW5nIHJlZmVyZW5jZSBjb3VudCBhZ2FpbnN0Ci0gKiBpbG9jLT5iaC4gIFRoaXMgX211c3RfIGJlIGNsZWFuZWQgdXAgbGF0ZXIuIAorICogaWxvYy0+YmguICBUaGlzIF9tdXN0XyBiZSBjbGVhbmVkIHVwIGxhdGVyLgogICovCiAKIGludAotZXh0M19yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIAorZXh0M19yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgc3RydWN0IGV4dDNfaWxvYyAqaWxvYykKIHsKIAlpbnQgZXJyID0gMDsKQEAgLTMxMzksNyArMzEzNiw3IEBACiB9CiAKICNpZiAwCi0vKiAKKy8qCiAgKiBCaW5kIGFuIGlub2RlJ3MgYmFja2luZyBidWZmZXJfaGVhZCBpbnRvIHRoaXMgdHJhbnNhY3Rpb24sIHRvIHByZXZlbnQKICAqIGl0IGZyb20gYmVpbmcgZmx1c2hlZCB0byBkaXNrIGVhcmx5LiAgVW5saWtlCiAgKiBleHQzX3Jlc2VydmVfaW5vZGVfd3JpdGUsIHRoaXMgbGVhdmVzIGJlaGluZCBubyBiaCByZWZlcmVuY2UgYW5kCkBAIC0zMTU3LDcgKzMxNTQsNyBAQAogCQkJQlVGRkVSX1RSQUNFKGlsb2MuYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CiAJCQllcnIgPSBqb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpbG9jLmJoKTsKIAkJCWlmICghZXJyKQotCQkJCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIAorCQkJCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCiAJCQkJCQkJCSAgaWxvYy5iaCk7CiAJCQlicmVsc2UoaWxvYy5iaCk7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDMvbmFtZWkuYyBiL2ZzL2V4dDMvbmFtZWkuYwppbmRleCAyYWE3MTAxLi44NWQxMzJjIDEwMDY0NAotLS0gYS9mcy9leHQzL25hbWVpLmMKKysrIGIvZnMvZXh0My9uYW1laS5jCkBAIC0xNSwxMyArMTUsMTMgQEAKICAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CiAgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQogICogIERpcmVjdG9yeSBlbnRyeSBmaWxlIHR5cGUgc3VwcG9ydCBhbmQgZm9yd2FyZCBjb21wYXRpYmlsaXR5IGhvb2tzCi0gKiAgCWZvciBCLXRyZWUgZGlyZWN0b3JpZXMgYnkgVGhlb2RvcmUgVHMnbyAodHl0c29AbWl0LmVkdSksIDE5OTgKKyAqCWZvciBCLXRyZWUgZGlyZWN0b3JpZXMgYnkgVGhlb2RvcmUgVHMnbyAodHl0c29AbWl0LmVkdSksIDE5OTgKICAqICBIYXNoIFRyZWUgRGlyZWN0b3J5IGluZGV4aW5nIChjKQotICogIAlEYW5pZWwgUGhpbGxpcHMsIDIwMDEKKyAqCURhbmllbCBQaGlsbGlwcywgMjAwMQogICogIEhhc2ggVHJlZSBEaXJlY3RvcnkgaW5kZXhpbmcgcG9ydGluZwotICogIAlDaHJpc3RvcGhlciBMaSwgMjAwMgorICoJQ2hyaXN0b3BoZXIgTGksIDIwMDIKICAqICBIYXNoIFRyZWUgRGlyZWN0b3J5IGluZGV4aW5nIGNsZWFudXAKLSAqIAlUaGVvZG9yZSBUcydvLCAyMDAyCisgKglUaGVvZG9yZSBUcydvLCAyMDAyCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CkBAIC03Niw3ICs3Niw3IEBACiAjaWZkZWYgRFhfREVCVUcKICNkZWZpbmUgZHh0cmFjZShjb21tYW5kKSBjb21tYW5kCiAjZWxzZQotI2RlZmluZSBkeHRyYWNlKGNvbW1hbmQpIAorI2RlZmluZSBkeHRyYWNlKGNvbW1hbmQpCiAjZW5kaWYKIAogc3RydWN0IGZha2VfZGlyZW50CkBAIC0xNjksNyArMTY5LDcgQEAKIHN0YXRpYyB2b2lkIGR4X2luc2VydF9ibG9jayAoc3RydWN0IGR4X2ZyYW1lICpmcmFtZSwgdTMyIGhhc2gsIHUzMiBibG9jayk7CiBzdGF0aWMgaW50IGV4dDNfaHRyZWVfbmV4dF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmRpciwgX191MzIgaGFzaCwKIAkJCQkgc3RydWN0IGR4X2ZyYW1lICpmcmFtZSwKLQkJCQkgc3RydWN0IGR4X2ZyYW1lICpmcmFtZXMsIAorCQkJCSBzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lcywKIAkJCQkgX191MzIgKnN0YXJ0X2hhc2gpOwogc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGV4dDNfZHhfZmluZF9lbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCSAgICAgICBzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKnJlc19kaXIsIGludCAqZXJyKTsKQEAgLTI1MCw3ICsyNTAsNyBAQAogfQogCiBzdHJ1Y3Qgc3RhdHMKLXsgCit7CiAJdW5zaWduZWQgbmFtZXM7CiAJdW5zaWduZWQgc3BhY2U7CiAJdW5zaWduZWQgYmNvdW50OwpAQCAtMjc4LDcgKzI3OCw3IEBACiAJCQkJICAgICAgICgoY2hhciAqKSBkZSAtIGJhc2UpKTsKIAkJCX0KIAkJCXNwYWNlICs9IEVYVDNfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKLQkgCQluYW1lcysrOworCQkJbmFtZXMrKzsKIAkJfQogCQlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSAoKGNoYXIgKikgZGUgKyBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOwogCX0KQEAgLTQ2NCw3ICs0NjQsNyBAQAogICovCiBzdGF0aWMgaW50IGV4dDNfaHRyZWVfbmV4dF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmRpciwgX191MzIgaGFzaCwKIAkJCQkgc3RydWN0IGR4X2ZyYW1lICpmcmFtZSwKLQkJCQkgc3RydWN0IGR4X2ZyYW1lICpmcmFtZXMsIAorCQkJCSBzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lcywKIAkJCQkgX191MzIgKnN0YXJ0X2hhc2gpCiB7CiAJc3RydWN0IGR4X2ZyYW1lICpwOwpAQCAtNjMyLDcgKzYzMiw3IEBACiAJCX0KIAkJY291bnQgKz0gcmV0OwogCQloYXNodmFsID0gfjA7Ci0JCXJldCA9IGV4dDNfaHRyZWVfbmV4dF9ibG9jayhkaXIsIEhBU0hfTkJfQUxXQVlTLCAKKwkJcmV0ID0gZXh0M19odHJlZV9uZXh0X2Jsb2NrKGRpciwgSEFTSF9OQl9BTFdBWVMsCiAJCQkJCSAgICBmcmFtZSwgZnJhbWVzLCAmaGFzaHZhbCk7CiAJCSpuZXh0X2hhc2ggPSBoYXNodmFsOwogCQlpZiAocmV0IDwgMCkgewpAQCAtNjQ5LDcgKzY0OSw3IEBACiAJCQlicmVhazsKIAl9CiAJZHhfcmVsZWFzZShmcmFtZXMpOwotCWR4dHJhY2UocHJpbnRrKCJGaWxsIHRyZWU6IHJldHVybmVkICVkIGVudHJpZXMsIG5leHQgaGFzaDogJXhcbiIsIAorCWR4dHJhY2UocHJpbnRrKCJGaWxsIHRyZWU6IHJldHVybmVkICVkIGVudHJpZXMsIG5leHQgaGFzaDogJXhcbiIsCiAJCSAgICAgICBjb3VudCwgKm5leHRfaGFzaCkpOwogCXJldHVybiBjb3VudDsKIGVycm91dDoKQEAgLTEwNTAsNyArMTA1MCw3IEBACiAJCXBhcmVudCA9IEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCXJldHVybiBwYXJlbnQ7Ci19IAorfQogCiAjZGVmaW5lIFNfU0hJRlQgMTIKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGV4dDNfdHlwZV9ieV9tb2RlW1NfSUZNVCA+PiBTX1NISUZUXSA9IHsKQEAgLTExOTgsNyArMTE5OCw3IEBACiAgKiBhZGRfZGlyZW50X3RvX2J1ZiB3aWxsIGF0dGVtcHQgc2VhcmNoIHRoZSBkaXJlY3RvcnkgYmxvY2sgZm9yCiAgKiBzcGFjZS4gIEl0IHdpbGwgcmV0dXJuIC1FTk9TUEMgaWYgbm8gc3BhY2UgaXMgYXZhaWxhYmxlLCBhbmQgLUVJTwogICogYW5kIC1FRVhJU1QgaWYgZGlyZWN0b3J5IGVudHJ5IGFscmVhZHkgZXhpc3RzLgotICogCisgKgogICogTk9URSEgIGJoIGlzIE5PVCByZWxlYXNlZCBpbiB0aGUgY2FzZSB3aGVyZSBFTk9TUEMgaXMgcmV0dXJuZWQuICBJbgogICogYWxsIG90aGVyIGNhc2VzIGJoIGlzIHJlbGVhc2VkLgogICovCkBAIC0xNTcyLDcgKzE1NzIsNyBAQAogICogZXh0M19kZWxldGVfZW50cnkgZGVsZXRlcyBhIGRpcmVjdG9yeSBlbnRyeSBieSBtZXJnaW5nIGl0IHdpdGggdGhlCiAgKiBwcmV2aW91cyBlbnRyeQogICovCi1zdGF0aWMgaW50IGV4dDNfZGVsZXRlX2VudHJ5IChoYW5kbGVfdCAqaGFuZGxlLCAKK3N0YXRpYyBpbnQgZXh0M19kZWxldGVfZW50cnkgKGhhbmRsZV90ICpoYW5kbGUsCiAJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKiBkaXIsCiAJCQkgICAgICBzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqIGRlX2RlbCwKIAkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQpAQCAtMTY0MywxMiArMTY0MywxMiBAQAogICogaXMgc28gZmFyIG5lZ2F0aXZlIC0gaXQgaGFzIG5vIGlub2RlLgogICoKICAqIElmIHRoZSBjcmVhdGUgc3VjY2VlZHMsIHdlIGZpbGwgaW4gdGhlIGlub2RlIGluZm9ybWF0aW9uCi0gKiB3aXRoIGRfaW5zdGFudGlhdGUoKS4gCisgKiB3aXRoIGRfaW5zdGFudGlhdGUoKS4KICAqLwogc3RhdGljIGludCBleHQzX2NyZWF0ZSAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBpbnQgbW9kZSwKIAkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7Ci0JaGFuZGxlX3QgKmhhbmRsZTsgCisJaGFuZGxlX3QgKmhhbmRsZTsKIAlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKIAlpbnQgZXJyLCByZXRyaWVzID0gMDsKIApAQCAtMTY4OCw3ICsxNjg4LDcgQEAKIAogcmV0cnk6CiAJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRpciwgRVhUM19EQVRBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpICsKLQkJCSAJCUVYVDNfSU5ERVhfRVhUUkFfVFJBTlNfQkxPQ0tTICsgMyArCisJCQkJCUVYVDNfSU5ERVhfRVhUUkFfVFJBTlNfQkxPQ0tTICsgMyArCiAJCQkJCTIqRVhUM19RVU9UQV9JTklUX0JMT0NLUyhkaXItPmlfc2IpKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpCiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CkBAIC0xODEzLDEwICsxODEzLDEwIEBACiAJZGUxID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopCiAJCQkoKGNoYXIgKikgZGUgKyBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOwogCWlmIChsZTMyX3RvX2NwdShkZS0+aW5vZGUpICE9IGlub2RlLT5pX2lubyB8fAotCQkJIWxlMzJfdG9fY3B1KGRlMS0+aW5vZGUpIHx8IAorCQkJIWxlMzJfdG9fY3B1KGRlMS0+aW5vZGUpIHx8CiAJCQlzdHJjbXAgKCIuIiwgZGUtPm5hbWUpIHx8CiAJCQlzdHJjbXAgKCIuLiIsIGRlMS0+bmFtZSkpIHsKLQkgICAgCWV4dDNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJlbXB0eV9kaXIiLAorCQlleHQzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiZW1wdHlfZGlyIiwKIAkJCSAgICAgICJiYWQgZGlyZWN0b3J5IChkaXIgIyVsdSkgLSBubyBgLicgb3IgYC4uJyIsCiAJCQkgICAgICBpbm9kZS0+aV9pbm8pOwogCQlicmVsc2UgKGJoKTsKQEAgLTE4ODMsNyArMTg4Myw3IEBACiAJICogYmVpbmcgdHJ1bmNhdGVkLCBvciBmaWxlcyBiZWluZyB1bmxpbmtlZC4gKi8KIAogCS8qIEBAQCBGSVhNRTogT2JzZXJ2YXRpb24gZnJvbSBhdmlybzoKLQkgKiBJIHRoaW5rIEkgY2FuIHRyaWdnZXIgSl9BU1NFUlQgaW4gZXh0M19vcnBoYW5fYWRkKCkuICBXZSBibG9jayAKKwkgKiBJIHRoaW5rIEkgY2FuIHRyaWdnZXIgSl9BU1NFUlQgaW4gZXh0M19vcnBoYW5fYWRkKCkuICBXZSBibG9jawogCSAqIGhlcmUgKG9uIGxvY2tfc3VwZXIoKSksIHNvIHJhY2Ugd2l0aCBleHQzX2xpbmsoKSB3aGljaCBtaWdodCBidW1wCiAJICogLT5pX25saW5rLiBGb3IsIHNheSBpdCwgY2hhcmFjdGVyIGRldmljZS4gTm90IGEgcmVndWxhciBmaWxlLAogCSAqIG5vdCBhIGRpcmVjdG9yeSwgbm90IGEgc3ltbGluayBhbmQgLT5pX25saW5rID4gMC4KQEAgLTE5MTksOCArMTkxOSw4IEBACiAJaWYgKCFlcnIpCiAJCWxpc3RfYWRkKCZFWFQzX0koaW5vZGUpLT5pX29ycGhhbiwgJkVYVDNfU0Ioc2IpLT5zX29ycGhhbik7CiAKLQlqYmRfZGVidWcoNCwgInN1cGVyYmxvY2sgd2lsbCBwb2ludCB0byAlbGRcbiIsIGlub2RlLT5pX2lubyk7Ci0JamJkX2RlYnVnKDQsICJvcnBoYW4gaW5vZGUgJWxkIHdpbGwgcG9pbnQgdG8gJWRcbiIsCisJamJkX2RlYnVnKDQsICJzdXBlcmJsb2NrIHdpbGwgcG9pbnQgdG8gJWx1XG4iLCBpbm9kZS0+aV9pbm8pOworCWpiZF9kZWJ1Zyg0LCAib3JwaGFuIGlub2RlICVsdSB3aWxsIHBvaW50IHRvICVkXG4iLAogCQkJaW5vZGUtPmlfaW5vLCBORVhUX09SUEhBTihpbm9kZSkpOwogb3V0X3VubG9jazoKIAl1bmxvY2tfc3VwZXIoc2IpOwpAQCAtMjEyOSw3ICsyMTI5LDcgQEAKIAogcmV0cnk6CiAJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRpciwgRVhUM19EQVRBX1RSQU5TX0JMT0NLUyhkaXItPmlfc2IpICsKLQkJCSAJCUVYVDNfSU5ERVhfRVhUUkFfVFJBTlNfQkxPQ0tTICsgNSArCisJCQkJCUVYVDNfSU5ERVhfRVhUUkFfVFJBTlNfQkxPQ0tTICsgNSArCiAJCQkJCTIqRVhUM19RVU9UQV9JTklUX0JMT0NLUyhkaXItPmlfc2IpKTsKIAlpZiAoSVNfRVJSKGhhbmRsZSkpCiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CkBAIC0yMjI3LDcgKzIyMjcsNyBAQAogCQlEUVVPVF9JTklUKG5ld19kZW50cnktPmRfaW5vZGUpOwogCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChvbGRfZGlyLCAyICoKIAkJCQkJRVhUM19EQVRBX1RSQU5TX0JMT0NLUyhvbGRfZGlyLT5pX3NiKSArCi0JCQkgCQlFWFQzX0lOREVYX0VYVFJBX1RSQU5TX0JMT0NLUyArIDIpOworCQkJCQlFWFQzX0lOREVYX0VYVFJBX1RSQU5TX0JMT0NLUyArIDIpOwogCWlmIChJU19FUlIoaGFuZGxlKSkKIAkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKIApAQCAtMjM5Myw0ICsyMzkzLDQgQEAKIAkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAogI2VuZGlmCiAJLnBlcm1pc3Npb24JPSBleHQzX3Blcm1pc3Npb24sCi19OyAKK307CmRpZmYgLS1naXQgYS9mcy9leHQzL3Jlc2l6ZS5jIGIvZnMvZXh0My9yZXNpemUuYwppbmRleCA1ZTEzMzdmLi5iNzNjYmExIDEwMDY0NAotLS0gYS9mcy9leHQzL3Jlc2l6ZS5jCisrKyBiL2ZzL2V4dDMvcmVzaXplLmMKQEAgLTMzNiw3ICszMzYsNyBAQAogCXVuc2lnbmVkIGZpdmUgPSA1OwogCXVuc2lnbmVkIHNldmVuID0gNzsKIAl1bnNpZ25lZCBncnA7Ci0JX191MzIgKnAgPSAoX191MzIgKilwcmltYXJ5LT5iX2RhdGE7CisJX19sZTMyICpwID0gKF9fbGUzMiAqKXByaW1hcnktPmJfZGF0YTsKIAlpbnQgZ2RiYWNrdXBzID0gMDsKIAogCXdoaWxlICgoZ3JwID0gZXh0M19saXN0X2JhY2t1cHMoc2IsICZ0aHJlZSwgJmZpdmUsICZzZXZlbikpIDwgZW5kKSB7CkBAIC0zODAsNyArMzgwLDcgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpbmQ7CiAJaW50IGdkYmFja3VwczsKIAlzdHJ1Y3QgZXh0M19pbG9jIGlsb2M7Ci0JX191MzIgKmRhdGE7CisJX19sZTMyICpkYXRhOwogCWludCBlcnI7CiAKIAlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKQEAgLTQxNyw3ICs0MTcsNyBAQAogCQlnb3RvIGV4aXRfYmg7CiAJfQogCi0JZGF0YSA9IChfX3UzMiAqKWRpbmQtPmJfZGF0YTsKKwlkYXRhID0gKF9fbGUzMiAqKWRpbmQtPmJfZGF0YTsKIAlpZiAobGUzMl90b19jcHUoZGF0YVtnZGJfbnVtICUgRVhUM19BRERSX1BFUl9CTE9DSyhzYildKSAhPSBnZGJsb2NrKSB7CiAJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAogCQkJICAgICAibmV3IGdyb3VwICV1IEdEVCBibG9jayAiRTNGU0JMSyIgbm90IHJlc2VydmVkIiwKQEAgLTQzOSw4ICs0MzksOCBAQAogCWlmICgoZXJyID0gZXh0M19yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZSwgaW5vZGUsICZpbG9jKSkpCiAJCWdvdG8gZXhpdF9kaW5kajsKIAotCW5fZ3JvdXBfZGVzYyA9IChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopa21hbGxvYygoZ2RiX251bSArIDEpICoKLQkJCQlzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBHRlBfS0VSTkVMKTsKKwluX2dyb3VwX2Rlc2MgPSBrbWFsbG9jKChnZGJfbnVtICsgMSkgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLAorCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFuX2dyb3VwX2Rlc2MpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZXh0M193YXJuaW5nIChzYiwgX19GVU5DVElPTl9fLApAQCAtNTE5LDcgKzUxOSw3IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaW5kOwogCXN0cnVjdCBleHQzX2lsb2MgaWxvYzsKIAlleHQzX2ZzYmxrX3QgYmxrOwotCV9fdTMyICpkYXRhLCAqZW5kOworCV9fbGUzMiAqZGF0YSwgKmVuZDsKIAlpbnQgZ2RiYWNrdXBzID0gMDsKIAlpbnQgcmVzLCBpOwogCWludCBlcnI7CkBAIC01MzYsOCArNTM2LDggQEAKIAl9CiAKIAlibGsgPSBFWFQzX1NCKHNiKS0+c19zYmgtPmJfYmxvY2tuciArIDEgKyBFWFQzX1NCKHNiKS0+c19nZGJfY291bnQ7Ci0JZGF0YSA9IChfX3UzMiAqKWRpbmQtPmJfZGF0YSArIEVYVDNfU0Ioc2IpLT5zX2dkYl9jb3VudDsKLQllbmQgPSAoX191MzIgKilkaW5kLT5iX2RhdGEgKyBFWFQzX0FERFJfUEVSX0JMT0NLKHNiKTsKKwlkYXRhID0gKF9fbGUzMiAqKWRpbmQtPmJfZGF0YSArIEVYVDNfU0Ioc2IpLT5zX2dkYl9jb3VudDsKKwllbmQgPSAoX19sZTMyICopZGluZC0+Yl9kYXRhICsgRVhUM19BRERSX1BFUl9CTE9DSyhzYik7CiAKIAkvKiBHZXQgZWFjaCByZXNlcnZlZCBwcmltYXJ5IEdEVCBibG9jayBhbmQgdmVyaWZ5IGl0IGhvbGRzIGJhY2t1cHMgKi8KIAlmb3IgKHJlcyA9IDA7IHJlcyA8IHJlc2VydmVkX2dkYjsgcmVzKyssIGJsaysrKSB7CkBAIC01NDUsNyArNTQ1LDggQEAKIAkJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAogCQkJCSAgICAgInJlc2VydmVkIGJsb2NrICJFM0ZTQkxLCiAJCQkJICAgICAiIG5vdCBhdCBvZmZzZXQgJWxkIiwKLQkJCQkgICAgIGJsaywgKGxvbmcpKGRhdGEgLSAoX191MzIgKilkaW5kLT5iX2RhdGEpKTsKKwkJCQkgICAgIGJsaywKKwkJCQkgICAgIChsb25nKShkYXRhIC0gKF9fbGUzMiAqKWRpbmQtPmJfZGF0YSkpOwogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gZXhpdF9iaDsKIAkJfQpAQCAtNTYwLDcgKzU2MSw3IEBACiAJCQlnb3RvIGV4aXRfYmg7CiAJCX0KIAkJaWYgKCsrZGF0YSA+PSBlbmQpCi0JCQlkYXRhID0gKF9fdTMyICopZGluZC0+Yl9kYXRhOworCQkJZGF0YSA9IChfX2xlMzIgKilkaW5kLT5iX2RhdGE7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHJlc2VydmVkX2dkYjsgaSsrKSB7CkBAIC01ODQsNyArNTg1LDcgQEAKIAlibGsgPSBpbnB1dC0+Z3JvdXAgKiBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpOwogCWZvciAoaSA9IDA7IGkgPCByZXNlcnZlZF9nZGI7IGkrKykgewogCQlpbnQgZXJyMjsKLQkJZGF0YSA9IChfX3UzMiAqKXByaW1hcnlbaV0tPmJfZGF0YTsKKwkJZGF0YSA9IChfX2xlMzIgKilwcmltYXJ5W2ldLT5iX2RhdGE7CiAJCS8qIHByaW50aygicmVzZXJ2aW5nIGJhY2t1cCAlbHVbJXVdID0gJWx1XG4iLAogCQkgICAgICAgcHJpbWFyeVtpXS0+Yl9ibG9ja25yLCBnZGJhY2t1cHMsCiAJCSAgICAgICBibGsgKyBwcmltYXJ5W2ldLT5iX2Jsb2NrbnIpOyAqLwpAQCAtNjg5LDcgKzY5MCw3IEBACiAJCQkgICAgICJjYW4ndCB1cGRhdGUgYmFja3VwIGZvciBncm91cCAlZCAoZXJyICVkKSwgIgogCQkJICAgICAiZm9yY2luZyBmc2NrIG9uIG5leHQgcmVib290IiwgZ3JvdXAsIGVycik7CiAJCXNiaS0+c19tb3VudF9zdGF0ZSAmPSB+RVhUM19WQUxJRF9GUzsKLQkJc2JpLT5zX2VzLT5zX3N0YXRlICY9IH5jcHVfdG9fbGUxNihFWFQzX1ZBTElEX0ZTKTsKKwkJc2JpLT5zX2VzLT5zX3N0YXRlICY9IGNwdV90b19sZTE2KH5FWFQzX1ZBTElEX0ZTKTsKIAkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX3NiaCk7CiAJfQogfQpAQCAtNzMwLDYgKzczMSwxOCBAQAogCQlyZXR1cm4gLUVQRVJNOwogCX0KIAorCWlmIChsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpICsgaW5wdXQtPmJsb2Nrc19jb3VudCA8CisJICAgIGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkpIHsKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sICJibG9ja3NfY291bnQgb3ZlcmZsb3dcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobGUzMl90b19jcHUoZXMtPnNfaW5vZGVzX2NvdW50KSArIEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYikgPAorCSAgICBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpKSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLCAiaW5vZGVzX2NvdW50IG92ZXJmbG93XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaWYgKHJlc2VydmVkX2dkYiB8fCBnZGJfb2ZmID09IDApIHsKIAkJaWYgKCFFWFQzX0hBU19DT01QQVRfRkVBVFVSRShzYiwKIAkJCQkJICAgICBFWFQzX0ZFQVRVUkVfQ09NUEFUX1JFU0laRV9JTk9ERSkpewpAQCAtOTU4LDYgKzk3MSwxMSBAQAogCiAJYWRkID0gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSAtIGxhc3Q7CiAKKwlpZiAob19ibG9ja3NfY291bnQgKyBhZGQgPCBvX2Jsb2Nrc19jb3VudCkgeworCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywgImJsb2Nrc19jb3VudCBvdmVyZmxvdyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlpZiAob19ibG9ja3NfY291bnQgKyBhZGQgPiBuX2Jsb2Nrc19jb3VudCkKIAkJYWRkID0gbl9ibG9ja3NfY291bnQgLSBvX2Jsb2Nrc19jb3VudDsKIApkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IDM1NTkwODYuLjhiZmQ1NmUgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIHN0YXRpYyBpbnQgZXh0M19sb2FkX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICosCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgam91cm5hbF9kZXZudW0pOwogc3RhdGljIGludCBleHQzX2NyZWF0ZV9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqLAotCQkJICAgICAgIGludCk7CisJCQkgICAgICAgdW5zaWduZWQgaW50KTsKIHN0YXRpYyB2b2lkIGV4dDNfY29tbWl0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKIAkJCSAgICAgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzLAogCQkJICAgICAgIGludCBzeW5jKTsKQEAgLTYyLDEzICs2MiwxMyBAQAogc3RhdGljIHZvaWQgZXh0M193cml0ZV9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpOwogc3RhdGljIHZvaWQgZXh0M193cml0ZV9zdXBlcl9sb2NrZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiAKLS8qIAorLyoKICAqIFdyYXBwZXJzIGZvciBqb3VybmFsX3N0YXJ0L2VuZC4KICAqCiAgKiBUaGUgb25seSBzcGVjaWFsIHRoaW5nIHdlIG5lZWQgdG8gZG8gaGVyZSBpcyB0byBtYWtlIHN1cmUgdGhhdCBhbGwKICAqIGpvdXJuYWxfZW5kIGNhbGxzIHJlc3VsdCBpbiB0aGUgc3VwZXJibG9jayBiZWluZyBtYXJrZWQgZGlydHksIHNvCiAgKiB0aGF0IHN5bmMoKSB3aWxsIGNhbGwgdGhlIGZpbGVzeXN0ZW0ncyB3cml0ZV9zdXBlciBjYWxsYmFjayBpZgotICogYXBwcm9wcmlhdGUuIAorICogYXBwcm9wcmlhdGUuCiAgKi8KIGhhbmRsZV90ICpleHQzX2pvdXJuYWxfc3RhcnRfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG5ibG9ja3MpCiB7CkBAIC05MCwxMSArOTAsMTEgQEAKIAlyZXR1cm4gam91cm5hbF9zdGFydChqb3VybmFsLCBuYmxvY2tzKTsKIH0KIAotLyogCisvKgogICogVGhlIG9ubHkgc3BlY2lhbCB0aGluZyB3ZSBuZWVkIHRvIGRvIGhlcmUgaXMgdG8gbWFrZSBzdXJlIHRoYXQgYWxsCiAgKiBqb3VybmFsX3N0b3AgY2FsbHMgcmVzdWx0IGluIHRoZSBzdXBlcmJsb2NrIGJlaW5nIG1hcmtlZCBkaXJ0eSwgc28KICAqIHRoYXQgc3luYygpIHdpbGwgY2FsbCB0aGUgZmlsZXN5c3RlbSdzIHdyaXRlX3N1cGVyIGNhbGxiYWNrIGlmCi0gKiBhcHByb3ByaWF0ZS4gCisgKiBhcHByb3ByaWF0ZS4KICAqLwogaW50IF9fZXh0M19qb3VybmFsX3N0b3AoY29uc3QgY2hhciAqd2hlcmUsIGhhbmRsZV90ICpoYW5kbGUpCiB7CkBAIC0xNTksMjAgKzE1OSwyMSBAQAogCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKIAkJcmV0dXJuOwogCi0JaWYgKHRlc3Rfb3B0IChzYiwgRVJST1JTX1JPKSkgewotCQlwcmludGsgKEtFUk5fQ1JJVCAiUmVtb3VudGluZyBmaWxlc3lzdGVtIHJlYWQtb25seVxuIik7Ci0JCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKLQl9IGVsc2UgeworCWlmICghdGVzdF9vcHQgKHNiLCBFUlJPUlNfQ09OVCkpIHsKIAkJam91cm5hbF90ICpqb3VybmFsID0gRVhUM19TQihzYiktPnNfam91cm5hbDsKIAogCQlFWFQzX1NCKHNiKS0+c19tb3VudF9vcHQgfD0gRVhUM19NT1VOVF9BQk9SVDsKIAkJaWYgKGpvdXJuYWwpCiAJCQlqb3VybmFsX2Fib3J0KGpvdXJuYWwsIC1FSU8pOwogCX0KKwlpZiAodGVzdF9vcHQgKHNiLCBFUlJPUlNfUk8pKSB7CisJCXByaW50ayAoS0VSTl9DUklUICJSZW1vdW50aW5nIGZpbGVzeXN0ZW0gcmVhZC1vbmx5XG4iKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0KKwlleHQzX2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOwogCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1BBTklDKSkKIAkJcGFuaWMoIkVYVDMtZnMgKGRldmljZSAlcyk6IHBhbmljIGZvcmNlZCBhZnRlciBlcnJvclxuIiwKIAkJCXNiLT5zX2lkKTsKLQlleHQzX2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOwogfQogCiB2b2lkIGV4dDNfZXJyb3IgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBjb25zdCBjaGFyICogZnVuY3Rpb24sCkBAIC0zNjksMTYgKzM3MCwxNiBAQAogewogCXN0cnVjdCBsaXN0X2hlYWQgKmw7CiAKLQlwcmludGsoS0VSTl9FUlIgInNiIG9ycGhhbiBoZWFkIGlzICVkXG4iLCAKKwlwcmludGsoS0VSTl9FUlIgInNiIG9ycGhhbiBoZWFkIGlzICVkXG4iLAogCSAgICAgICBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfbGFzdF9vcnBoYW4pKTsKIAogCXByaW50ayhLRVJOX0VSUiAic2JfaW5mbyBvcnBoYW4gbGlzdDpcbiIpOwogCWxpc3RfZm9yX2VhY2gobCwgJnNiaS0+c19vcnBoYW4pIHsKIAkJc3RydWN0IGlub2RlICppbm9kZSA9IG9ycGhhbl9saXN0X2VudHJ5KGwpOwogCQlwcmludGsoS0VSTl9FUlIgIiAgIgotCQkgICAgICAgImlub2RlICVzOiVsZCBhdCAlcDogbW9kZSAlbywgbmxpbmsgJWQsIG5leHQgJWRcbiIsCisJCSAgICAgICAiaW5vZGUgJXM6JWx1IGF0ICVwOiBtb2RlICVvLCBubGluayAlZCwgbmV4dCAlZFxuIiwKIAkJICAgICAgIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sIGlub2RlLAotCQkgICAgICAgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfbmxpbmssIAorCQkgICAgICAgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfbmxpbmssCiAJCSAgICAgICBORVhUX09SUEhBTihpbm9kZSkpOwogCX0KIH0KQEAgLTQ3NSw3ICs0NzYsNyBAQAogCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOwogCX0KIH0KLSAKKwogc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKIHsKIAlleHQzX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJleHQzX2lub2RlX2NhY2hlIiwKQEAgLTQ5MCw4ICs0OTEsNyBAQAogCiBzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKIHsKLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGV4dDNfaW5vZGVfY2FjaGVwKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiZXh0M19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworCWttZW1fY2FjaGVfZGVzdHJveShleHQzX2lub2RlX2NhY2hlcCk7CiB9CiAKIHN0YXRpYyB2b2lkIGV4dDNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKQEAgLTczMyw4ICs3MzMsOCBAQAogCiBzdGF0aWMgZXh0M19mc2Jsa190IGdldF9zYl9ibG9jayh2b2lkICoqZGF0YSkKIHsKLQlleHQzX2ZzYmxrX3QgCXNiX2Jsb2NrOwotCWNoYXIgCQkqb3B0aW9ucyA9IChjaGFyICopICpkYXRhOworCWV4dDNfZnNibGtfdAlzYl9ibG9jazsKKwljaGFyCQkqb3B0aW9ucyA9IChjaGFyICopICpkYXRhOwogCiAJaWYgKCFvcHRpb25zIHx8IHN0cm5jbXAob3B0aW9ucywgInNiPSIsIDMpICE9IDApCiAJCXJldHVybiAxOwkvKiBEZWZhdWx0IGxvY2F0aW9uICovCkBAIC03NTMsNyArNzUzLDcgQEAKIH0KIAogc3RhdGljIGludCBwYXJzZV9vcHRpb25zIChjaGFyICpvcHRpb25zLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJICB1bnNpZ25lZCBsb25nICppbnVtLCB1bnNpZ25lZCBsb25nICpqb3VybmFsX2Rldm51bSwKKwkJCSAgdW5zaWduZWQgaW50ICppbnVtLCB1bnNpZ25lZCBsb25nICpqb3VybmFsX2Rldm51bSwKIAkJCSAgZXh0M19mc2Jsa190ICpuX2Jsb2Nrc19jb3VudCwgaW50IGlzX3JlbW91bnQpCiB7CiAJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7CkBAIC0xMTc0LDcgKzExNzQsOCBAQAogc3RhdGljIGludCBleHQzX2NoZWNrX2Rlc2NyaXB0b3JzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKIHsKIAlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKLQlleHQzX2ZzYmxrX3QgYmxvY2sgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJZXh0M19mc2Jsa190IGZpcnN0X2Jsb2NrID0gbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCWV4dDNfZnNibGtfdCBsYXN0X2Jsb2NrOwogCXN0cnVjdCBleHQzX2dyb3VwX2Rlc2MgKiBnZHAgPSBOVUxMOwogCWludCBkZXNjX2Jsb2NrID0gMDsKIAlpbnQgaTsKQEAgLTExODMsMTIgKzExODQsMTcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ3JvdXBzX2NvdW50OyBpKyspCiAJeworCQlpZiAoaSA9PSBzYmktPnNfZ3JvdXBzX2NvdW50IC0gMSkKKwkJCWxhc3RfYmxvY2sgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfYmxvY2tzX2NvdW50KSAtIDE7CisJCWVsc2UKKwkJCWxhc3RfYmxvY2sgPSBmaXJzdF9ibG9jayArCisJCQkJKEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikgLSAxKTsKKwogCQlpZiAoKGkgJSBFWFQzX0RFU0NfUEVSX0JMT0NLKHNiKSkgPT0gMCkKIAkJCWdkcCA9IChzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICopCiAJCQkJCXNiaS0+c19ncm91cF9kZXNjW2Rlc2NfYmxvY2srK10tPmJfZGF0YTsKLQkJaWYgKGxlMzJfdG9fY3B1KGdkcC0+YmdfYmxvY2tfYml0bWFwKSA8IGJsb2NrIHx8Ci0JCSAgICBsZTMyX3RvX2NwdShnZHAtPmJnX2Jsb2NrX2JpdG1hcCkgPj0KLQkJCQlibG9jayArIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikpCisJCWlmIChsZTMyX3RvX2NwdShnZHAtPmJnX2Jsb2NrX2JpdG1hcCkgPCBmaXJzdF9ibG9jayB8fAorCQkgICAgbGUzMl90b19jcHUoZ2RwLT5iZ19ibG9ja19iaXRtYXApID4gbGFzdF9ibG9jaykKIAkJewogCQkJZXh0M19lcnJvciAoc2IsICJleHQzX2NoZWNrX2Rlc2NyaXB0b3JzIiwKIAkJCQkgICAgIkJsb2NrIGJpdG1hcCBmb3IgZ3JvdXAgJWQiCkBAIC0xMTk3LDkgKzEyMDMsOCBAQAogCQkJCQlsZTMyX3RvX2NwdShnZHAtPmJnX2Jsb2NrX2JpdG1hcCkpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJaWYgKGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfYml0bWFwKSA8IGJsb2NrIHx8Ci0JCSAgICBsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX2JpdG1hcCkgPj0KLQkJCQlibG9jayArIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikpCisJCWlmIChsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX2JpdG1hcCkgPCBmaXJzdF9ibG9jayB8fAorCQkgICAgbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV9iaXRtYXApID4gbGFzdF9ibG9jaykKIAkJewogCQkJZXh0M19lcnJvciAoc2IsICJleHQzX2NoZWNrX2Rlc2NyaXB0b3JzIiwKIAkJCQkgICAgIklub2RlIGJpdG1hcCBmb3IgZ3JvdXAgJWQiCkBAIC0xMjA4LDkgKzEyMTMsOSBAQAogCQkJCQlsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX2JpdG1hcCkpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJaWYgKGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpIDwgYmxvY2sgfHwKLQkJICAgIGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXAgPj0KLQkJICAgIGJsb2NrICsgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSkKKwkJaWYgKGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpIDwgZmlyc3RfYmxvY2sgfHwKKwkJICAgIGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXAgPgorCQkgICAgbGFzdF9ibG9jaykKIAkJewogCQkJZXh0M19lcnJvciAoc2IsICJleHQzX2NoZWNrX2Rlc2NyaXB0b3JzIiwKIAkJCQkgICAgIklub2RlIHRhYmxlIGZvciBncm91cCAlZCIKQEAgLTEyMTksNyArMTIyNCw3IEBACiAJCQkJCWxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpKTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCWJsb2NrICs9IEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJCWZpcnN0X2Jsb2NrICs9IEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CiAJCWdkcCsrOwogCX0KIApAQCAtMTMwMSwxNyArMTMwNiwxNyBAQAogCQlEUVVPVF9JTklUKGlub2RlKTsKIAkJaWYgKGlub2RlLT5pX25saW5rKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRwotCQkJCSIlczogdHJ1bmNhdGluZyBpbm9kZSAlbGQgdG8gJUxkIGJ5dGVzXG4iLAorCQkJCSIlczogdHJ1bmNhdGluZyBpbm9kZSAlbHUgdG8gJUxkIGJ5dGVzXG4iLAogCQkJCV9fRlVOQ1RJT05fXywgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9zaXplKTsKLQkJCWpiZF9kZWJ1ZygyLCAidHJ1bmNhdGluZyBpbm9kZSAlbGQgdG8gJUxkIGJ5dGVzXG4iLAorCQkJamJkX2RlYnVnKDIsICJ0cnVuY2F0aW5nIGlub2RlICVsdSB0byAlTGQgYnl0ZXNcbiIsCiAJCQkJICBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX3NpemUpOwogCQkJZXh0M190cnVuY2F0ZShpbm9kZSk7CiAJCQlucl90cnVuY2F0ZXMrKzsKIAkJfSBlbHNlIHsKIAkJCXByaW50ayhLRVJOX0RFQlVHCi0JCQkJIiVzOiBkZWxldGluZyB1bnJlZmVyZW5jZWQgaW5vZGUgJWxkXG4iLAorCQkJCSIlczogZGVsZXRpbmcgdW5yZWZlcmVuY2VkIGlub2RlICVsdVxuIiwKIAkJCQlfX0ZVTkNUSU9OX18sIGlub2RlLT5pX2lubyk7Ci0JCQlqYmRfZGVidWcoMiwgImRlbGV0aW5nIHVucmVmZXJlbmNlZCBpbm9kZSAlbGRcbiIsCisJCQlqYmRfZGVidWcoMiwgImRlbGV0aW5nIHVucmVmZXJlbmNlZCBpbm9kZSAlbHVcbiIsCiAJCQkJICBpbm9kZS0+aV9pbm8pOwogCQkJbnJfb3JwaGFucysrOwogCQl9CkBAIC0xMzkwLDcgKzEzOTUsNyBAQAogCWV4dDNfZnNibGtfdCBzYl9ibG9jayA9IGdldF9zYl9ibG9jaygmZGF0YSk7CiAJZXh0M19mc2Jsa190IGxvZ2ljX3NiX2Jsb2NrOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKLQl1bnNpZ25lZCBsb25nIGpvdXJuYWxfaW51bSA9IDA7CisJdW5zaWduZWQgaW50IGpvdXJuYWxfaW51bSA9IDA7CiAJdW5zaWduZWQgbG9uZyBqb3VybmFsX2Rldm51bSA9IDA7CiAJdW5zaWduZWQgbG9uZyBkZWZfbW91bnRfb3B0czsKIAlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CkBAIC0xNDAxLDExICsxNDA2LDEwIEBACiAJaW50IG5lZWRzX3JlY292ZXJ5OwogCV9fbGUzMiBmZWF0dXJlczsKIAotCXNiaSA9IGttYWxsb2Moc2l6ZW9mKCpzYmkpLCBHRlBfS0VSTkVMKTsKKwlzYmkgPSBremFsbG9jKHNpemVvZigqc2JpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpCiAJCXJldHVybiAtRU5PTUVNOwogCXNiLT5zX2ZzX2luZm8gPSBzYmk7Ci0JbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKCpzYmkpKTsKIAlzYmktPnNfbW91bnRfb3B0ID0gMDsKIAlzYmktPnNfcmVzdWlkID0gRVhUM19ERUZfUkVTVUlEOwogCXNiaS0+c19yZXNnaWQgPSBFWFQzX0RFRl9SRVNHSUQ7CkBAIC0xNDgzLDcgKzE0ODcsNyBAQAogCSAgICAoRVhUM19IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsIH4wVSkgfHwKIAkgICAgIEVYVDNfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLCB+MFUpIHx8CiAJICAgICBFWFQzX0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCB+MFUpKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkgICAgICAgIkVYVDMtZnMgd2FybmluZzogZmVhdHVyZSBmbGFncyBzZXQgb24gcmV2IDAgZnMsICIKIAkJICAgICAgICJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZFxuIik7CiAJLyoKQEAgLTE1MDksNyArMTUxMyw3IEBACiAKIAlpZiAoYmxvY2tzaXplIDwgRVhUM19NSU5fQkxPQ0tfU0laRSB8fAogCSAgICBibG9ja3NpemUgPiBFWFQzX01BWF9CTE9DS19TSVpFKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAKKwkJcHJpbnRrKEtFUk5fRVJSCiAJCSAgICAgICAiRVhUMy1mczogVW5zdXBwb3J0ZWQgZmlsZXN5c3RlbSBibG9ja3NpemUgJWQgb24gJXMuXG4iLAogCQkgICAgICAgYmxvY2tzaXplLCBzYi0+c19pZCk7CiAJCWdvdG8gZmFpbGVkX21vdW50OwpAQCAtMTUzMywxNCArMTUzNywxNCBAQAogCQlvZmZzZXQgPSAoc2JfYmxvY2sgKiBFWFQzX01JTl9CTE9DS19TSVpFKSAlIGJsb2Nrc2l6ZTsKIAkJYmggPSBzYl9icmVhZChzYiwgbG9naWNfc2JfYmxvY2spOwogCQlpZiAoIWJoKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgCisJCQlwcmludGsoS0VSTl9FUlIKIAkJCSAgICAgICAiRVhUMy1mczogQ2FuJ3QgcmVhZCBzdXBlcmJsb2NrIG9uIDJuZCB0cnkuXG4iKTsKIAkJCWdvdG8gZmFpbGVkX21vdW50OwogCQl9CiAJCWVzID0gKHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICopKCgoY2hhciAqKWJoLT5iX2RhdGEpICsgb2Zmc2V0KTsKIAkJc2JpLT5zX2VzID0gZXM7CiAJCWlmIChlcy0+c19tYWdpYyAhPSBjcHVfdG9fbGUxNihFWFQzX1NVUEVSX01BR0lDKSkgewotCQkJcHJpbnRrIChLRVJOX0VSUiAKKwkJCXByaW50ayAoS0VSTl9FUlIKIAkJCQkiRVhUMy1mczogTWFnaWMgbWlzbWF0Y2gsIHZlcnkgd2VpcmQgIVxuIik7CiAJCQlnb3RvIGZhaWxlZF9tb3VudDsKIAkJfQpAQCAtMTYyMiwxMCArMTYyNiw5IEBACiAKIAlpZiAoRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSA9PSAwKQogCQlnb3RvIGNhbnRmaW5kX2V4dDM7Ci0Jc2JpLT5zX2dyb3Vwc19jb3VudCA9IChsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpIC0KLQkJCSAgICAgICBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArCi0JCQkgICAgICAgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSAtIDEpIC8KLQkJCSAgICAgIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJc2JpLT5zX2dyb3Vwc19jb3VudCA9ICgobGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSAtCisJCQkgICAgICAgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgLSAxKQorCQkJCSAgICAgICAvIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikpICsgMTsKIAlkYl9jb3VudCA9IChzYmktPnNfZ3JvdXBzX2NvdW50ICsgRVhUM19ERVNDX1BFUl9CTE9DSyhzYikgLSAxKSAvCiAJCSAgIEVYVDNfREVTQ19QRVJfQkxPQ0soc2IpOwogCXNiaS0+c19ncm91cF9kZXNjID0ga21hbGxvYyhkYl9jb3VudCAqIHNpemVvZiAoc3RydWN0IGJ1ZmZlcl9oZWFkICopLApAQCAtMTgyMCw3ICsxODIzLDcgQEAKIC8qCiAgKiBTZXR1cCBhbnkgcGVyLWZzIGpvdXJuYWwgcGFyYW1ldGVycyBub3cuICBXZSdsbCBkbyB0aGlzIGJvdGggb24KICAqIGluaXRpYWwgbW91bnQsIG9uY2UgdGhlIGpvdXJuYWwgaGFzIGJlZW4gaW5pdGlhbGlzZWQgYnV0IGJlZm9yZSB3ZSd2ZQotICogZG9uZSBhbnkgcmVjb3Zlcnk7IGFuZCBhZ2FpbiBvbiBhbnkgc3Vic2VxdWVudCByZW1vdW50LiAKKyAqIGRvbmUgYW55IHJlY292ZXJ5OyBhbmQgYWdhaW4gb24gYW55IHN1YnNlcXVlbnQgcmVtb3VudC4KICAqLwogc3RhdGljIHZvaWQgZXh0M19pbml0X2pvdXJuYWxfcGFyYW1zKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGpvdXJuYWxfdCAqam91cm5hbCkKIHsKQEAgLTE4NDAsNyArMTg0Myw4IEBACiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CiB9CiAKLXN0YXRpYyBqb3VybmFsX3QgKmV4dDNfZ2V0X2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGpvdXJuYWxfaW51bSkKK3N0YXRpYyBqb3VybmFsX3QgKmV4dDNfZ2V0X2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgam91cm5hbF9pbnVtKQogewogCXN0cnVjdCBpbm9kZSAqam91cm5hbF9pbm9kZTsKIAlqb3VybmFsX3QgKmpvdXJuYWw7CkBAIC0xOTc1LDcgKzE5NzksNyBAQAogCQkJICAgICB1bnNpZ25lZCBsb25nIGpvdXJuYWxfZGV2bnVtKQogewogCWpvdXJuYWxfdCAqam91cm5hbDsKLQlpbnQgam91cm5hbF9pbnVtID0gbGUzMl90b19jcHUoZXMtPnNfam91cm5hbF9pbnVtKTsKKwl1bnNpZ25lZCBpbnQgam91cm5hbF9pbnVtID0gbGUzMl90b19jcHUoZXMtPnNfam91cm5hbF9pbnVtKTsKIAlkZXZfdCBqb3VybmFsX2RldjsKIAlpbnQgZXJyID0gMDsKIAlpbnQgcmVhbGx5X3JlYWRfb25seTsKQEAgLTIwNjEsNyArMjA2NSw3IEBACiAKIHN0YXRpYyBpbnQgZXh0M19jcmVhdGVfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKIAkJCSAgICAgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzLAotCQkJICAgICAgIGludCBqb3VybmFsX2ludW0pCisJCQkgICAgICAgdW5zaWduZWQgaW50IGpvdXJuYWxfaW51bSkKIHsKIAlqb3VybmFsX3QgKmpvdXJuYWw7CiAKQEAgLTIwNzQsNyArMjA3OCw3IEBACiAJaWYgKCEoam91cm5hbCA9IGV4dDNfZ2V0X2pvdXJuYWwoc2IsIGpvdXJuYWxfaW51bSkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXByaW50ayhLRVJOX0lORk8gIkVYVDMtZnM6IGNyZWF0aW5nIG5ldyBqb3VybmFsIG9uIGlub2RlICVkXG4iLAorCXByaW50ayhLRVJOX0lORk8gIkVYVDMtZnM6IGNyZWF0aW5nIG5ldyBqb3VybmFsIG9uIGlub2RlICV1XG4iLAogCSAgICAgICBqb3VybmFsX2ludW0pOwogCiAJaWYgKGpvdXJuYWxfY3JlYXRlKGpvdXJuYWwpKSB7CkBAIC0yMzQyLDEwICsyMzQ2LDggQEAKIAkJCSAqLwogCQkJZXh0M19jbGVhcl9qb3VybmFsX2VycihzYiwgZXMpOwogCQkJc2JpLT5zX21vdW50X3N0YXRlID0gbGUxNl90b19jcHUoZXMtPnNfc3RhdGUpOwotCQkJaWYgKChyZXQgPSBleHQzX2dyb3VwX2V4dGVuZChzYiwgZXMsIG5fYmxvY2tzX2NvdW50KSkpIHsKLQkJCQllcnIgPSByZXQ7CisJCQlpZiAoKGVyciA9IGV4dDNfZ3JvdXBfZXh0ZW5kKHNiLCBlcywgbl9ibG9ja3NfY291bnQpKSkKIAkJCQlnb3RvIHJlc3RvcmVfb3B0czsKLQkJCX0KIAkJCWlmICghZXh0M19zZXR1cF9zdXBlciAoc2IsIGVzLCAwKSkKIAkJCQlzYi0+c19mbGFncyAmPSB+TVNfUkRPTkxZOwogCQl9CkBAIC0yNzM0LDcgKzI3MzYsNyBAQAogb3V0OgogCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOwogb3V0MToKLSAJZXhpdF9leHQzX3hhdHRyKCk7CisJZXhpdF9leHQzX3hhdHRyKCk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZXh0My94YXR0ci5jIGIvZnMvZXh0My94YXR0ci5jCmluZGV4IGE0NGEwNTYuLmY4NmYyNDggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMveGF0dHIuYworKysgYi9mcy9leHQzL3hhdHRyLmMKQEAgLTc1LDcgKzc1LDcgQEAKIAogI2lmZGVmIEVYVDNfWEFUVFJfREVCVUcKICMgZGVmaW5lIGVhX2lkZWJ1Zyhpbm9kZSwgZi4uLikgZG8geyBcCi0JCXByaW50ayhLRVJOX0RFQlVHICJpbm9kZSAlczolbGQ6ICIsIFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImlub2RlICVzOiVsdTogIiwgXAogCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7IFwKIAkJcHJpbnRrKGYpOyBcCiAJCXByaW50aygiXG4iKTsgXApAQCAtMjMzLDcgKzIzMyw3IEBACiAJCWF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSwgbGUzMl90b19jcHUoQkhEUihiaCktPmhfcmVmY291bnQpKTsKIAlpZiAoZXh0M194YXR0cl9jaGVja19ibG9jayhiaCkpIHsKIGJhZF9ibG9jazoJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAotCQkJICAgImlub2RlICVsZDogYmFkIGJsb2NrICJFM0ZTQkxLLCBpbm9kZS0+aV9pbm8sCisJCQkgICAiaW5vZGUgJWx1OiBiYWQgYmxvY2sgIkUzRlNCTEssIGlub2RlLT5pX2lubywKIAkJCSAgIEVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wpOwogCQllcnJvciA9IC1FSU87CiAJCWdvdG8gY2xlYW51cDsKQEAgLTM3NSw3ICszNzUsNyBAQAogCQlhdG9taWNfcmVhZCgmKGJoLT5iX2NvdW50KSksIGxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX3JlZmNvdW50KSk7CiAJaWYgKGV4dDNfeGF0dHJfY2hlY2tfYmxvY2soYmgpKSB7CiAJCWV4dDNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICJpbm9kZSAlbGQ6IGJhZCBibG9jayAiRTNGU0JMSywgaW5vZGUtPmlfaW5vLAorCQkJICAgImlub2RlICVsdTogYmFkIGJsb2NrICJFM0ZTQkxLLCBpbm9kZS0+aV9pbm8sCiAJCQkgICBFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKIAkJZXJyb3IgPSAtRUlPOwogCQlnb3RvIGNsZWFudXA7CkBAIC02NDcsNyArNjQ3LDcgQEAKIAkJCWxlMzJfdG9fY3B1KEJIRFIoYnMtPmJoKS0+aF9yZWZjb3VudCkpOwogCQlpZiAoZXh0M194YXR0cl9jaGVja19ibG9jayhicy0+YmgpKSB7CiAJCQlleHQzX2Vycm9yKHNiLCBfX0ZVTkNUSU9OX18sCi0JCQkJImlub2RlICVsZDogYmFkIGJsb2NrICJFM0ZTQkxLLCBpbm9kZS0+aV9pbm8sCisJCQkJImlub2RlICVsdTogYmFkIGJsb2NrICJFM0ZTQkxLLCBpbm9kZS0+aV9pbm8sCiAJCQkJRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CiAJCQllcnJvciA9IC1FSU87CiAJCQlnb3RvIGNsZWFudXA7CkBAIC04NDgsNyArODQ4LDcgQEAKIAogYmFkX2Jsb2NrOgogCWV4dDNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKLQkJICAgImlub2RlICVsZDogYmFkIGJsb2NrICJFM0ZTQkxLLCBpbm9kZS0+aV9pbm8sCisJCSAgICJpbm9kZSAlbHU6IGJhZCBibG9jayAiRTNGU0JMSywgaW5vZGUtPmlfaW5vLAogCQkgICBFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKIAlnb3RvIGNsZWFudXA7CiAKQEAgLTEwNzcsMTQgKzEwNzcsMTQgQEAKIAliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKIAlpZiAoIWJoKSB7CiAJCWV4dDNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKLQkJCSJpbm9kZSAlbGQ6IGJsb2NrICJFM0ZTQkxLIiByZWFkIGVycm9yIiwgaW5vZGUtPmlfaW5vLAorCQkJImlub2RlICVsdTogYmxvY2sgIkUzRlNCTEsiIHJlYWQgZXJyb3IiLCBpbm9kZS0+aV9pbm8sCiAJCQlFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAlpZiAoQkhEUihiaCktPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIoRVhUM19YQVRUUl9NQUdJQykgfHwKIAkgICAgQkhEUihiaCktPmhfYmxvY2tzICE9IGNwdV90b19sZTMyKDEpKSB7CiAJCWV4dDNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKLQkJCSJpbm9kZSAlbGQ6IGJhZCBibG9jayAiRTNGU0JMSywgaW5vZGUtPmlfaW5vLAorCQkJImlub2RlICVsdTogYmFkIGJsb2NrICJFM0ZTQkxLLCBpbm9kZS0+aV9pbm8sCiAJCQlFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKIAkJZ290byBjbGVhbnVwOwogCX0KQEAgLTEyMTEsNyArMTIxMSw3IEBACiAJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGNlLT5lX2Jsb2NrKTsKIAkJaWYgKCFiaCkgewogCQkJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAotCQkJCSJpbm9kZSAlbGQ6IGJsb2NrICVsdSByZWFkIGVycm9yIiwKKwkJCQkiaW5vZGUgJWx1OiBibG9jayAlbHUgcmVhZCBlcnJvciIsCiAJCQkJaW5vZGUtPmlfaW5vLCAodW5zaWduZWQgbG9uZykgY2UtPmVfYmxvY2spOwogCQl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX3JlZmNvdW50KSA+PQogCQkJCUVYVDNfWEFUVFJfUkVGQ09VTlRfTUFYKSB7CmRpZmYgLS1naXQgYS9mcy9mYXQvY2FjaGUuYyBiL2ZzL2ZhdC9jYWNoZS5jCmluZGV4IDk3Yjk2N2IuLjgyY2M0ZjU5IDEwMDY0NAotLS0gYS9mcy9mYXQvY2FjaGUuYworKysgYi9mcy9mYXQvY2FjaGUuYwpAQCAtNTgsOCArNTgsNyBAQAogCiB2b2lkIGZhdF9jYWNoZV9kZXN0cm95KHZvaWQpCiB7Ci0JaWYgKGttZW1fY2FjaGVfZGVzdHJveShmYXRfY2FjaGVfY2FjaGVwKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiZmF0X2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7CisJa21lbV9jYWNoZV9kZXN0cm95KGZhdF9jYWNoZV9jYWNoZXApOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBmYXRfY2FjaGUgKmZhdF9jYWNoZV9hbGxvYyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQpkaWZmIC0tZ2l0IGEvZnMvZmF0L2lub2RlLmMgYi9mcy9mYXQvaW5vZGUuYwppbmRleCAzMWI3MTc0Li5hYjk2YWU4IDEwMDY0NAotLS0gYS9mcy9mYXQvaW5vZGUuYworKysgYi9mcy9mYXQvaW5vZGUuYwpAQCAtNTAsMTQgKzUwLDE0IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2ZhdF9nZXRfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKLQkJCSAgICB1bnNpZ25lZCBsb25nICptYXhfYmxvY2tzLAotCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQorc3RhdGljIGlubGluZSBpbnQgX19mYXRfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgKm1heF9ibG9ja3MsCisJCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKLQlzZWN0b3JfdCBwaHlzOwogCXVuc2lnbmVkIGxvbmcgbWFwcGVkX2Jsb2NrczsKKwlzZWN0b3JfdCBwaHlzOwogCWludCBlcnIsIG9mZnNldDsKIAogCWVyciA9IGZhdF9ibWFwKGlub2RlLCBpYmxvY2ssICZwaHlzLCAmbWFwcGVkX2Jsb2Nrcyk7CkBAIC03Myw3ICs3Myw3IEBACiAKIAlpZiAoaWJsb2NrICE9IE1TRE9TX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0cykgewogCQlmYXRfZnNfcGFuaWMoc2IsICJjb3JydXB0ZWQgZmlsZSBzaXplIChpX3BvcyAlbGxkLCAlbGxkKSIsCi0JCQkgICAgIE1TRE9TX0koaW5vZGUpLT5pX3BvcywgTVNET1NfSShpbm9kZSktPm1tdV9wcml2YXRlKTsKKwkJCU1TRE9TX0koaW5vZGUpLT5pX3BvcywgTVNET1NfSShpbm9kZSktPm1tdV9wcml2YXRlKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC05MywzMiArOTMsMjcgQEAKIAllcnIgPSBmYXRfYm1hcChpbm9kZSwgaWJsb2NrLCAmcGh5cywgJm1hcHBlZF9ibG9ja3MpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CisKIAlCVUdfT04oIXBoeXMpOwogCUJVR19PTigqbWF4X2Jsb2NrcyAhPSBtYXBwZWRfYmxvY2tzKTsKIAlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOwogCW1hcF9iaChiaF9yZXN1bHQsIHNiLCBwaHlzKTsKLQlyZXR1cm4gMDsKLX0KIAotc3RhdGljIGludCBmYXRfZ2V0X2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCi0JCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQotewotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKLQlpbnQgZXJyOwotCXVuc2lnbmVkIGxvbmcgbWF4X2Jsb2NrcyA9IGJoX3Jlc3VsdC0+Yl9zaXplID4+IGlub2RlLT5pX2Jsa2JpdHM7Ci0KLQllcnIgPSBfX2ZhdF9nZXRfYmxvY2tzKGlub2RlLCBpYmxvY2ssICZtYXhfYmxvY2tzLCBiaF9yZXN1bHQsIGNyZWF0ZSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQliaF9yZXN1bHQtPmJfc2l6ZSA9IG1heF9ibG9ja3MgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHM7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZmF0X2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCiAJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCiB7Ci0JdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzID0gMTsKLQlyZXR1cm4gX19mYXRfZ2V0X2Jsb2Nrcyhpbm9kZSwgaWJsb2NrLCAmbWF4X2Jsb2NrcywgYmhfcmVzdWx0LCBjcmVhdGUpOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwl1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MgPSBiaF9yZXN1bHQtPmJfc2l6ZSA+PiBpbm9kZS0+aV9ibGtiaXRzOworCWludCBlcnI7CisKKwllcnIgPSBfX2ZhdF9nZXRfYmxvY2soaW5vZGUsIGlibG9jaywgJm1heF9ibG9ja3MsIGJoX3Jlc3VsdCwgY3JlYXRlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWJoX3Jlc3VsdC0+Yl9zaXplID0gbWF4X2Jsb2NrcyA8PCBzYi0+c19ibG9ja3NpemVfYml0czsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBmYXRfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKQEAgLTE4OCw3ICsxODMsNyBAQAogCSAqIGNvbmRpdGlvbiBvZiBmYXRfZ2V0X2Jsb2NrKCkgYW5kIC0+dHJ1bmNhdGUoKS4KIAkgKi8KIAlyZXR1cm4gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW5vZGUtPmlfc2ItPnNfYmRldiwgaW92LAotCQkJCSAgb2Zmc2V0LCBucl9zZWdzLCBmYXRfZ2V0X2Jsb2NrcywgTlVMTCk7CisJCQkJICBvZmZzZXQsIG5yX3NlZ3MsIGZhdF9nZXRfYmxvY2ssIE5VTEwpOwogfQogCiBzdGF0aWMgc2VjdG9yX3QgX2ZhdF9ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKQEAgLTM3NSw4ICszNzAsNiBAQAogCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CiAJfQogCU1TRE9TX0koaW5vZGUpLT5pX2F0dHJzID0gZGUtPmF0dHIgJiBBVFRSX1VOVVNFRDsKLQkvKiB0aGlzIGlzIGFzIGNsb3NlIHRvIHRoZSB0cnV0aCBhcyB3ZSBjYW4gZ2V0IC4uLiAqLwotCWlub2RlLT5pX2Jsa3NpemUgPSBzYmktPmNsdXN0ZXJfc2l6ZTsKIAlpbm9kZS0+aV9ibG9ja3MgPSAoKGlub2RlLT5pX3NpemUgKyAoc2JpLT5jbHVzdGVyX3NpemUgLSAxKSkKIAkJCSAgICYgfigobG9mZl90KXNiaS0+Y2x1c3Rlcl9zaXplIC0gMSkpID4+IDk7CiAJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0KQEAgLTUyOCw4ICs1MjEsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZmF0X2Rlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQogewotCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koZmF0X2lub2RlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gImZhdF9pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworCWttZW1fY2FjaGVfZGVzdHJveShmYXRfaW5vZGVfY2FjaGVwKTsKIH0KIAogc3RhdGljIGludCBmYXRfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQpAQCAtMTEzNyw3ICsxMTI5LDYgQEAKIAkJTVNET1NfSShpbm9kZSktPmlfc3RhcnQgPSAwOwogCQlpbm9kZS0+aV9zaXplID0gc2JpLT5kaXJfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5KTsKIAl9Ci0JaW5vZGUtPmlfYmxrc2l6ZSA9IHNiaS0+Y2x1c3Rlcl9zaXplOwogCWlub2RlLT5pX2Jsb2NrcyA9ICgoaW5vZGUtPmlfc2l6ZSArIChzYmktPmNsdXN0ZXJfc2l6ZSAtIDEpKQogCQkJICAgJiB+KChsb2ZmX3Qpc2JpLT5jbHVzdGVyX3NpemUgLSAxKSkgPj4gOTsKIAlNU0RPU19JKGlub2RlKS0+aV9sb2dzdGFydCA9IDA7CkBAIC0xMTY4LDExICsxMTU5LDEwIEBACiAJbG9uZyBlcnJvcjsKIAljaGFyIGJ1Zls1MF07CiAKLQlzYmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCXNiaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc2Rvc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpCiAJCXJldHVybiAtRU5PTUVNOwogCXNiLT5zX2ZzX2luZm8gPSBzYmk7Ci0JbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKHN0cnVjdCBtc2Rvc19zYl9pbmZvKSk7CiAKIAlzYi0+c19mbGFncyB8PSBNU19OT0RJUkFUSU1FOwogCXNiLT5zX21hZ2ljID0gTVNET1NfU1VQRVJfTUFHSUM7CmRpZmYgLS1naXQgYS9mcy9maWxlLmMgYi9mcy9maWxlLmMKaW5kZXggYjNjNmI4Mi4uOGQzYmZjYSAxMDA2NDQKLS0tIGEvZnMvZmlsZS5jCisrKyBiL2ZzL2ZpbGUuYwpAQCAtMjgxLDEwICsyODEsOCBAQAogb3V0MjoKIAluZmRzID0gZmR0LT5tYXhfZmRzZXQ7CiBvdXQ6Ci0gIAlpZiAobmV3X29wZW5zZXQpCi0gIAkJZnJlZV9mZHNldChuZXdfb3BlbnNldCwgbmZkcyk7Ci0gIAlpZiAobmV3X2V4ZWNzZXQpCi0gIAkJZnJlZV9mZHNldChuZXdfZXhlY3NldCwgbmZkcyk7CisJZnJlZV9mZHNldChuZXdfb3BlbnNldCwgbmZkcyk7CisJZnJlZV9mZHNldChuZXdfZXhlY3NldCwgbmZkcyk7CiAJa2ZyZWUoZmR0KTsKIAlyZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2ZpbGVfdGFibGUuYyBiL2ZzL2ZpbGVfdGFibGUuYwppbmRleCAwMTMxYmEwLi5iYzM1YTQwIDEwMDY0NAotLS0gYS9mcy9maWxlX3RhYmxlLmMKKysrIGIvZnMvZmlsZV90YWJsZS5jCkBAIC0xNjksNyArMTY5LDcgQEAKIAlpZiAoZmlsZS0+Zl9vcCAmJiBmaWxlLT5mX29wLT5yZWxlYXNlKQogCQlmaWxlLT5mX29wLT5yZWxlYXNlKGlub2RlLCBmaWxlKTsKIAlzZWN1cml0eV9maWxlX2ZyZWUoZmlsZSk7Ci0JaWYgKHVubGlrZWx5KGlub2RlLT5pX2NkZXYgIT0gTlVMTCkpCisJaWYgKHVubGlrZWx5KFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgJiYgaW5vZGUtPmlfY2RldiAhPSBOVUxMKSkKIAkJY2Rldl9wdXQoaW5vZGUtPmlfY2Rldik7CiAJZm9wc19wdXQoZmlsZS0+Zl9vcCk7CiAJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmcy5oIGIvZnMvZnJlZXZ4ZnMvdnhmcy5oCmluZGV4IGQzNTk3OWEuLmM4YTkyNjUgMTAwNjQ0Ci0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnMuaAorKysgYi9mcy9mcmVldnhmcy92eGZzLmgKQEAgLTI1Miw3ICsyNTIsNyBAQAogICogR2V0IGZpbGVzeXN0ZW0gcHJpdmF0ZSBkYXRhIGZyb20gVkZTIGlub2RlLgogICovCiAjZGVmaW5lIFZYRlNfSU5PKGlwKSBcCi0JKChzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICopKGlwKS0+dS5nZW5lcmljX2lwKQorCSgoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqKShpcCktPmlfcHJpdmF0ZSkKIAogLyoKICAqIEdldCBmaWxlc3lzdGVtIHByaXZhdGUgZGF0YSBmcm9tIFZGUyBzdXBlcmJsb2NrLgpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5jCmluZGV4IGNhNmEzOTcuLjQ3ODZkNTEgMTAwNjQ0Ci0tLSBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuYworKysgYi9mcy9mcmVldnhmcy92eGZzX2lub2RlLmMKQEAgLTIzOSwxMSArMjM5LDEwIEBACiAJaXAtPmlfY3RpbWUudHZfbnNlYyA9IDA7CiAJaXAtPmlfbXRpbWUudHZfbnNlYyA9IDA7CiAKLQlpcC0+aV9ibGtzaXplID0gUEFHRV9TSVpFOwogCWlwLT5pX2Jsb2NrcyA9IHZpcC0+dmlpX2Jsb2NrczsKIAlpcC0+aV9nZW5lcmF0aW9uID0gdmlwLT52aWlfZ2VuOwogCi0JaXAtPnUuZ2VuZXJpY19pcCA9ICh2b2lkICopdmlwOworCWlwLT5pX3ByaXZhdGUgPSB2aXA7CiAJCiB9CiAKQEAgLTMzOCw1ICszMzcsNSBAQAogdm9pZAogdnhmc19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlwKQogewotCWttZW1fY2FjaGVfZnJlZSh2eGZzX2lub2RlX2NhY2hlcCwgaXAtPnUuZ2VuZXJpY19pcCk7CisJa21lbV9jYWNoZV9mcmVlKHZ4ZnNfaW5vZGVfY2FjaGVwLCBpcC0+aV9wcml2YXRlKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvY29udHJvbC5jIGIvZnMvZnVzZS9jb250cm9sLmMKaW5kZXggNDZmZTYwYi4uNzllYzFmMiAxMDA2NDQKLS0tIGEvZnMvZnVzZS9jb250cm9sLmMKKysrIGIvZnMvZnVzZS9jb250cm9sLmMKQEAgLTIzLDcgKzIzLDcgQEAKIHsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYzsKIAltdXRleF9sb2NrKCZmdXNlX211dGV4KTsKLQlmYyA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT51LmdlbmVyaWNfaXA7CisJZmMgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9wcml2YXRlOwogCWlmIChmYykKIAkJZmMgPSBmdXNlX2Nvbm5fZ2V0KGZjKTsKIAltdXRleF91bmxvY2soJmZ1c2VfbXV0ZXgpOwpAQCAtOTgsNyArOTgsNyBAQAogCQlpbm9kZS0+aV9vcCA9IGlvcDsKIAlpbm9kZS0+aV9mb3AgPSBmb3A7CiAJaW5vZGUtPmlfbmxpbmsgPSBubGluazsKLQlpbm9kZS0+dS5nZW5lcmljX2lwID0gZmM7CisJaW5vZGUtPmlfcHJpdmF0ZSA9IGZjOwogCWRfYWRkKGRlbnRyeSwgaW5vZGUpOwogCXJldHVybiBkZW50cnk7CiB9CkBAIC0xNTAsNyArMTUwLDcgQEAKIAogCWZvciAoaSA9IGZjLT5jdGxfbmRlbnRzIC0gMTsgaSA+PSAwOyBpLS0pIHsKIAkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmMtPmN0bF9kZW50cnlbaV07Ci0JCWRlbnRyeS0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwID0gTlVMTDsKKwkJZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGUgPSBOVUxMOwogCQlkX2Ryb3AoZGVudHJ5KTsKIAkJZHB1dChkZW50cnkpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvaW5vZGUuYyBiL2ZzL2Z1c2UvaW5vZGUuYwppbmRleCA3ZDI1MDkyLi5jYjdjYWRiIDEwMDY0NAotLS0gYS9mcy9mdXNlL2lub2RlLmMKKysrIGIvZnMvZnVzZS9pbm9kZS5jCkBAIC0xMTgsNyArMTE4LDYgQEAKIAlpbm9kZS0+aV91aWQgICAgID0gYXR0ci0+dWlkOwogCWlub2RlLT5pX2dpZCAgICAgPSBhdHRyLT5naWQ7CiAJaV9zaXplX3dyaXRlKGlub2RlLCBhdHRyLT5zaXplKTsKLQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCWlub2RlLT5pX2Jsb2NrcyAgPSBhdHRyLT5ibG9ja3M7CiAJaW5vZGUtPmlfYXRpbWUudHZfc2VjICAgPSBhdHRyLT5hdGltZTsKIAlpbm9kZS0+aV9hdGltZS50dl9uc2VjICA9IGF0dHItPmF0aW1lbnNlYzsKZGlmZiAtLWdpdCBhL2ZzL2hmcy9ibm9kZS5jIGIvZnMvaGZzL2Jub2RlLmMKaW5kZXggMTMyMzFkZC4uMGQyMDAwNiAxMDA2NDQKLS0tIGEvZnMvaGZzL2Jub2RlLmMKKysrIGIvZnMvaGZzL2Jub2RlLmMKQEAgLTI0OSwxMCArMjQ5LDkgQEAKIAlzYiA9IHRyZWUtPmlub2RlLT5pX3NiOwogCXNpemUgPSBzaXplb2Yoc3RydWN0IGhmc19ibm9kZSkgKyB0cmVlLT5wYWdlc19wZXJfYm5vZGUgKgogCQlzaXplb2Yoc3RydWN0IHBhZ2UgKik7Ci0Jbm9kZSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJbm9kZSA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFub2RlKQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQobm9kZSwgMCwgc2l6ZSk7CiAJbm9kZS0+dHJlZSA9IHRyZWU7CiAJbm9kZS0+dGhpcyA9IGNuaWQ7CiAJc2V0X2JpdChIRlNfQk5PREVfTkVXLCAmbm9kZS0+ZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZnMvaGZzL2J0cmVlLmMgYi9mcy9oZnMvYnRyZWUuYwppbmRleCA0MDAzNTc5Li41ZmQwZWQ3IDEwMDY0NAotLS0gYS9mcy9oZnMvYnRyZWUuYworKysgYi9mcy9oZnMvYnRyZWUuYwpAQCAtMjEsMTAgKzIxLDkgQEAKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAl1bnNpZ25lZCBpbnQgc2l6ZTsKIAotCXRyZWUgPSBrbWFsbG9jKHNpemVvZigqdHJlZSksIEdGUF9LRVJORUwpOworCXRyZWUgPSBremFsbG9jKHNpemVvZigqdHJlZSksIEdGUF9LRVJORUwpOwogCWlmICghdHJlZSkKIAkJcmV0dXJuIE5VTEw7Ci0JbWVtc2V0KHRyZWUsIDAsIHNpemVvZigqdHJlZSkpOwogCiAJaW5pdF9NVVRFWCgmdHJlZS0+dHJlZV9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmdHJlZS0+aGFzaF9sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2hmcy9pbm9kZS5jIGIvZnMvaGZzL2lub2RlLmMKaW5kZXggMzE1Y2Y0NC4uZDA1NjQxYyAxMDA2NDQKLS0tIGEvZnMvaGZzL2lub2RlLmMKKysrIGIvZnMvaGZzL2lub2RlLmMKQEAgLTE1NCw3ICsxNTQsNiBAQAogCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOwogCWlub2RlLT5pX25saW5rID0gMTsKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotCWlub2RlLT5pX2Jsa3NpemUgPSBIRlNfU0Ioc2IpLT5hbGxvY19ibGtzejsKIAlIRlNfSShpbm9kZSktPmZsYWdzID0gMDsKIAlIRlNfSShpbm9kZSktPnJzcmNfaW5vZGUgPSBOVUxMOwogCUhGU19JKGlub2RlKS0+ZnNfYmxvY2tzID0gMDsKQEAgLTI4NCw3ICsyODMsNiBAQAogCWlub2RlLT5pX3VpZCA9IGhzYi0+c191aWQ7CiAJaW5vZGUtPmlfZ2lkID0gaHNiLT5zX2dpZDsKIAlpbm9kZS0+aV9ubGluayA9IDE7Ci0JaW5vZGUtPmlfYmxrc2l6ZSA9IEhGU19TQihpbm9kZS0+aV9zYiktPmFsbG9jX2Jsa3N6OwogCiAJaWYgKGlkYXRhLT5rZXkpCiAJCUhGU19JKGlub2RlKS0+Y2F0X2tleSA9ICppZGF0YS0+a2V5OwpkaWZmIC0tZ2l0IGEvZnMvaGZzL3N1cGVyLmMgYi9mcy9oZnMvc3VwZXIuYwppbmRleCAzNDkzN2VlLi5kNDNiNGZjIDEwMDY0NAotLS0gYS9mcy9oZnMvc3VwZXIuYworKysgYi9mcy9oZnMvc3VwZXIuYwpAQCAtMzU2LDExICszNTYsMTAgQEAKIAlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CiAJaW50IHJlczsKIAotCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBoZnNfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCXNiaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoZnNfc2JfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKQogCQlyZXR1cm4gLUVOT01FTTsKIAlzYi0+c19mc19pbmZvID0gc2JpOwotCW1lbXNldChzYmksIDAsIHNpemVvZihzdHJ1Y3QgaGZzX3NiX2luZm8pKTsKIAlJTklUX0hMSVNUX0hFQUQoJnNiaS0+cnNyY19pbm9kZXMpOwogCiAJcmVzID0gLUVJTlZBTDsKQEAgLTQ1NSw4ICs0NTQsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IGV4aXRfaGZzX2ZzKHZvaWQpCiB7CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZoZnNfZnNfdHlwZSk7Ci0JaWYgKGttZW1fY2FjaGVfZGVzdHJveShoZnNfaW5vZGVfY2FjaGVwKSkKLQkJcHJpbnRrKEtFUk5fRVJSICJoZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koaGZzX2lub2RlX2NhY2hlcCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXRfaGZzX2ZzKQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9ibm9kZS5jIGIvZnMvaGZzcGx1cy9ibm9kZS5jCmluZGV4IDc3YmY0MzQuLjI5ZGE2NTcgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvYm5vZGUuYworKysgYi9mcy9oZnNwbHVzL2Jub2RlLmMKQEAgLTQwOSwxMCArNDA5LDkgQEAKIAlzYiA9IHRyZWUtPmlub2RlLT5pX3NiOwogCXNpemUgPSBzaXplb2Yoc3RydWN0IGhmc19ibm9kZSkgKyB0cmVlLT5wYWdlc19wZXJfYm5vZGUgKgogCQlzaXplb2Yoc3RydWN0IHBhZ2UgKik7Ci0Jbm9kZSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJbm9kZSA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFub2RlKQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQobm9kZSwgMCwgc2l6ZSk7CiAJbm9kZS0+dHJlZSA9IHRyZWU7CiAJbm9kZS0+dGhpcyA9IGNuaWQ7CiAJc2V0X2JpdChIRlNfQk5PREVfTkVXLCAmbm9kZS0+ZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9idHJlZS5jIGIvZnMvaGZzcGx1cy9idHJlZS5jCmluZGV4IGNmYzg1MmYuLmE5YjllODcgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvYnRyZWUuYworKysgYi9mcy9oZnNwbHVzL2J0cmVlLmMKQEAgLTI0LDEwICsyNCw5IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgaW50IHNpemU7CiAKLQl0cmVlID0ga21hbGxvYyhzaXplb2YoKnRyZWUpLCBHRlBfS0VSTkVMKTsKKwl0cmVlID0ga3phbGxvYyhzaXplb2YoKnRyZWUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRyZWUpCiAJCXJldHVybiBOVUxMOwotCW1lbXNldCh0cmVlLCAwLCBzaXplb2YoKnRyZWUpKTsKIAogCWluaXRfTVVURVgoJnRyZWUtPnRyZWVfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnRyZWUtPmhhc2hfbG9jayk7CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2lub2RlLmMgYi9mcy9oZnNwbHVzL2lub2RlLmMKaW5kZXggOTI0ZWNkZS4uMGViMWE2MCAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9pbm9kZS5jCisrKyBiL2ZzL2hmc3BsdXMvaW5vZGUuYwpAQCAtMzA0LDcgKzMwNCw2IEBACiAJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CiAJaW5vZGUtPmlfbmxpbmsgPSAxOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7Ci0JaW5vZGUtPmlfYmxrc2l6ZSA9IEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2Jsa3N6OwogCUlOSVRfTElTVF9IRUFEKCZIRlNQTFVTX0koaW5vZGUpLm9wZW5fZGlyX2xpc3QpOwogCWluaXRfTVVURVgoJkhGU1BMVVNfSShpbm9kZSkuZXh0ZW50c19sb2NrKTsKIAlhdG9taWNfc2V0KCZIRlNQTFVTX0koaW5vZGUpLm9wZW5jbnQsIDApOwpAQCAtNDA3LDcgKzQwNiw2IEBACiAJdHlwZSA9IGhmc19ibm9kZV9yZWFkX3UxNihmZC0+Ym5vZGUsIGZkLT5lbnRyeW9mZnNldCk7CiAKIAlIRlNQTFVTX0koaW5vZGUpLmRldiA9IDA7Ci0JaW5vZGUtPmlfYmxrc2l6ZSA9IEhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLmFsbG9jX2Jsa3N6OwogCWlmICh0eXBlID09IEhGU1BMVVNfRk9MREVSKSB7CiAJCXN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIgKmZvbGRlciA9ICZlbnRyeS5mb2xkZXI7CiAKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvc3VwZXIuYyBiL2ZzL2hmc3BsdXMvc3VwZXIuYwppbmRleCBkMjc5ZDU5Li4xOTRlZWRlIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL3N1cGVyLmMKKysrIGIvZnMvaGZzcGx1cy9zdXBlci5jCkBAIC00OTMsOCArNDkzLDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2hmc3BsdXNfZnModm9pZCkKIHsKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmhmc3BsdXNfZnNfdHlwZSk7Ci0JaWYgKGttZW1fY2FjaGVfZGVzdHJveShoZnNwbHVzX2lub2RlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0VSUiAiaGZzcGx1c19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworCWttZW1fY2FjaGVfZGVzdHJveShoZnNwbHVzX2lub2RlX2NhY2hlcCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXRfaGZzcGx1c19mcykKZGlmZiAtLWdpdCBhL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jIGIvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKaW5kZXggYjgyZTNkOS4uMzIyZTg3NiAxMDA2NDQKLS0tIGEvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKKysrIGIvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKQEAgLTE1Niw3ICsxNTYsNiBAQAogCWluby0+aV9tb2RlID0gaV9tb2RlOwogCWluby0+aV9ubGluayA9IGlfbmxpbms7CiAJaW5vLT5pX3NpemUgPSBpX3NpemU7Ci0JaW5vLT5pX2Jsa3NpemUgPSBpX2Jsa3NpemU7CiAJaW5vLT5pX2Jsb2NrcyA9IGlfYmxvY2tzOwogCXJldHVybigwKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2hwZnMvYnVmZmVyLmMgYi9mcy9ocGZzL2J1ZmZlci5jCmluZGV4IDI4MDdhYTguLmI1MmI3MzggMTAwNjQ0Ci0tLSBhL2ZzL2hwZnMvYnVmZmVyLmMKKysrIGIvZnMvaHBmcy9idWZmZXIuYwpAQCAtNzYsNyArNzYsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlxYmgtPmRhdGEgPSBkYXRhID0gKGNoYXIgKilrbWFsbG9jKDIwNDgsIEdGUF9OT0ZTKTsKKwlxYmgtPmRhdGEgPSBkYXRhID0ga21hbGxvYygyMDQ4LCBHRlBfTk9GUyk7CiAJaWYgKCFkYXRhKSB7CiAJCXByaW50aygiSFBGUzogaHBmc19tYXBfNHNlY3RvcnM6IG91dCBvZiBtZW1vcnlcbiIpOwogCQlnb3RvIGJhaWw7CmRpZmYgLS1naXQgYS9mcy9ocGZzL2lub2RlLmMgYi9mcy9ocGZzL2lub2RlLmMKaW5kZXggNTZmMmMzMy4uYmNmNmVlMyAxMDA2NDQKLS0tIGEvZnMvaHBmcy9pbm9kZS5jCisrKyBiL2ZzL2hwZnMvaW5vZGUuYwpAQCAtMTcsNyArMTcsNiBAQAogCWktPmlfZ2lkID0gaHBmc19zYihzYiktPnNiX2dpZDsKIAlpLT5pX21vZGUgPSBocGZzX3NiKHNiKS0+c2JfbW9kZTsKIAlocGZzX2lub2RlLT5pX2NvbnYgPSBocGZzX3NiKHNiKS0+c2JfY29udjsKLQlpLT5pX2Jsa3NpemUgPSA1MTI7CiAJaS0+aV9zaXplID0gLTE7CiAJaS0+aV9ibG9ja3MgPSAtMTsKIAkKZGlmZiAtLWdpdCBhL2ZzL2hwZnMvc3VwZXIuYyBiL2ZzL2hwZnMvc3VwZXIuYwppbmRleCA4ZmU1MWMzLi40NTBiNWUwIDEwMDY0NAotLS0gYS9mcy9ocGZzL3N1cGVyLmMKKysrIGIvZnMvaHBmcy9zdXBlci5jCkBAIC0yMDMsOCArMjAzLDcgQEAKIAogc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCiB7Ci0JaWYgKGttZW1fY2FjaGVfZGVzdHJveShocGZzX2lub2RlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gImhwZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koaHBmc19pbm9kZV9jYWNoZXApOwogfQogCiAvKgpAQCAtNDYyLDExICs0NjEsMTAgQEAKIAogCWludCBvOwogCi0Jc2JpID0ga21hbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOworCXNiaSA9IGt6YWxsb2Moc2l6ZW9mKCpzYmkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNiaSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcy0+c19mc19pbmZvID0gc2JpOwotCW1lbXNldChzYmksIDAsIHNpemVvZigqc2JpKSk7CiAKIAlzYmktPnNiX2JtcF9kaXIgPSBOVUxMOwogCXNiaS0+c2JfY3BfdGFibGUgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZnMvaHBwZnMvaHBwZnNfa2Vybi5jIGIvZnMvaHBwZnMvaHBwZnNfa2Vybi5jCmluZGV4IDNhOWJkZjU4Li5kY2I2ZDJlIDEwMDY0NAotLS0gYS9mcy9ocHBmcy9ocHBmc19rZXJuLmMKKysrIGIvZnMvaHBwZnMvaHBwZnNfa2Vybi5jCkBAIC0xNTIsNyArMTUyLDYgQEAKIAlpbm8tPmlfbW9kZSA9IHByb2NfaW5vLT5pX21vZGU7CiAJaW5vLT5pX25saW5rID0gcHJvY19pbm8tPmlfbmxpbms7CiAJaW5vLT5pX3NpemUgPSBwcm9jX2luby0+aV9zaXplOwotCWluby0+aV9ibGtzaXplID0gcHJvY19pbm8tPmlfYmxrc2l6ZTsKIAlpbm8tPmlfYmxvY2tzID0gcHJvY19pbm8tPmlfYmxvY2tzOwogfQogCmRpZmYgLS1naXQgYS9mcy9odWdldGxiZnMvaW5vZGUuYyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCmluZGV4IGMzOTIwYzkuLmUwMjVhMzEgMTAwNjQ0Ci0tLSBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCisrKyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCkBAIC0zNTcsNyArMzU3LDYgQEAKIAkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlub2RlLT5pX3VpZCA9IHVpZDsKIAkJaW5vZGUtPmlfZ2lkID0gZ2lkOwotCQlpbm9kZS0+aV9ibGtzaXplID0gSFBBR0VfU0laRTsKIAkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmaHVnZXRsYmZzX2FvcHM7CiAJCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSZodWdldGxiZnNfYmFja2luZ19kZXZfaW5mbzsKZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jCmluZGV4IDBiZjlmMDQuLmY1YzA0ZGQgMTAwNjQ0Ci0tLSBhL2ZzL2lub2RlLmMKKysrIGIvZnMvaW5vZGUuYwpAQCAtMTYzLDcgKzE2Myw3IEBACiAJCQkJYmRpID0gc2ItPnNfYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKIAkJCW1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSBiZGk7CiAJCX0KLQkJbWVtc2V0KCZpbm9kZS0+dSwgMCwgc2l6ZW9mKGlub2RlLT51KSk7CisJCWlub2RlLT5pX3ByaXZhdGUgPSAwOwogCQlpbm9kZS0+aV9tYXBwaW5nID0gbWFwcGluZzsKIAl9CiAJcmV0dXJuIGlub2RlOwpAQCAtMjU0LDkgKzI1NCw5IEBACiAJRFFVT1RfRFJPUChpbm9kZSk7CiAJaWYgKGlub2RlLT5pX3NiICYmIGlub2RlLT5pX3NiLT5zX29wLT5jbGVhcl9pbm9kZSkKIAkJaW5vZGUtPmlfc2ItPnNfb3AtPmNsZWFyX2lub2RlKGlub2RlKTsKLQlpZiAoaW5vZGUtPmlfYmRldikKKwlpZiAoU19JU0JMSyhpbm9kZS0+aV9tb2RlKSAmJiBpbm9kZS0+aV9iZGV2KQogCQliZF9mb3JnZXQoaW5vZGUpOwotCWlmIChpbm9kZS0+aV9jZGV2KQorCWlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpICYmIGlub2RlLT5pX2NkZXYpCiAJCWNkX2ZvcmdldChpbm9kZSk7CiAJaW5vZGUtPmlfc3RhdGUgPSBJX0NMRUFSOwogfQpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvaW5vZGUuYyBiL2ZzL2lzb2ZzL2lub2RlLmMKaW5kZXggMTQzOTEzNi4uNDUyNzY5MiAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvaW5vZGUuYworKysgYi9mcy9pc29mcy9pbm9kZS5jCkBAIC05Niw5ICs5Niw3IEBACiAKIHN0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQogewotCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koaXNvZnNfaW5vZGVfY2FjaGVwKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaXNvX2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSAiCi0JCQkJCSJmcmVlZFxuIik7CisJa21lbV9jYWNoZV9kZXN0cm95KGlzb2ZzX2lub2RlX2NhY2hlcCk7CiB9CiAKIHN0YXRpYyBpbnQgaXNvZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQpAQCAtNTU3LDExICs1NTUsMTAgQEAKIAlzdHJ1Y3QgaXNvOTY2MF9vcHRpb25zCQlvcHQ7CiAJc3RydWN0IGlzb2ZzX3NiX2luZm8JICAgICAgKiBzYmk7CiAKLQlzYmkgPSBrbWFsbG9jKHNpemVvZigqc2JpKSwgR0ZQX0tFUk5FTCk7CisJc2JpID0ga3phbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKQogCQlyZXR1cm4gLUVOT01FTTsKIAlzLT5zX2ZzX2luZm8gPSBzYmk7Ci0JbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKCpzYmkpKTsKIAogCWlmICghcGFyc2Vfb3B0aW9ucygoY2hhciAqKWRhdGEsICZvcHQpKQogCQlnb3RvIG91dF9mcmVlc2JpOwpAQCAtMTIzOCw3ICsxMjM1LDcgQEAKIAl9CiAJaW5vZGUtPmlfdWlkID0gc2JpLT5zX3VpZDsKIAlpbm9kZS0+aV9naWQgPSBzYmktPnNfZ2lkOwotCWlub2RlLT5pX2Jsb2NrcyA9IGlub2RlLT5pX2Jsa3NpemUgPSAwOworCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAKIAllaS0+aV9mb3JtYXRfcGFybVswXSA9IDA7CiAJZWktPmlfZm9ybWF0X3Bhcm1bMV0gPSAwOwpAQCAtMTI5NCw3ICsxMjkxLDYgQEAKIAkJCSAgICAgIGlzb251bV83MTEgKGRlLT5leHRfYXR0cl9sZW5ndGgpKTsKIAogCS8qIFNldCB0aGUgbnVtYmVyIG9mIGJsb2NrcyBmb3Igc3RhdCgpIC0gc2hvdWxkIGJlIGRvbmUgYmVmb3JlIFJSICovCi0JaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsgLyogRm9yIHN0YXQoKSBvbmx5ICovCiAJaW5vZGUtPmlfYmxvY2tzICA9IChpbm9kZS0+aV9zaXplICsgNTExKSA+PiA5OwogCiAJLyoKZGlmZiAtLWdpdCBhL2ZzL2piZC9jaGVja3BvaW50LmMgYi9mcy9qYmQvY2hlY2twb2ludC5jCmluZGV4IDQ3Njc4YTIuLjAyMDhjYzcgMTAwNjQ0Ci0tLSBhL2ZzL2piZC9jaGVja3BvaW50LmMKKysrIGIvZnMvamJkL2NoZWNrcG9pbnQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBsaW51eC9mcy9jaGVja3BvaW50LmMKLSAqIAorICoKICAqIFdyaXR0ZW4gYnkgU3RlcGhlbiBDLiBUd2VlZGllIDxzY3RAcmVkaGF0LmNvbT4sIDE5OTkKICAqCiAgKiBDb3B5cmlnaHQgMTk5OSBSZWQgSGF0IFNvZnR3YXJlIC0tLSBBbGwgUmlnaHRzIFJlc2VydmVkCkBAIC05LDggKzksOCBAQAogICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCiAgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KICAqCi0gKiBDaGVja3BvaW50IHJvdXRpbmVzIGZvciB0aGUgZ2VuZXJpYyBmaWxlc3lzdGVtIGpvdXJuYWxpbmcgY29kZS4gIAotICogUGFydCBvZiB0aGUgZXh0MmZzIGpvdXJuYWxpbmcgc3lzdGVtLiAgCisgKiBDaGVja3BvaW50IHJvdXRpbmVzIGZvciB0aGUgZ2VuZXJpYyBmaWxlc3lzdGVtIGpvdXJuYWxpbmcgY29kZS4KKyAqIFBhcnQgb2YgdGhlIGV4dDJmcyBqb3VybmFsaW5nIHN5c3RlbS4KICAqCiAgKiBDaGVja3BvaW50aW5nIGlzIHRoZSBwcm9jZXNzIG9mIGVuc3VyaW5nIHRoYXQgYSBzZWN0aW9uIG9mIHRoZSBsb2cgaXMKICAqIGNvbW1pdHRlZCBmdWxseSB0byBkaXNrLCBzbyB0aGF0IHRoYXQgcG9ydGlvbiBvZiB0aGUgbG9nIGNhbiBiZQpAQCAtMTQ1LDYgKzE0NSw3IEBACiAgKiBqYmRfdW5sb2NrX2JoX3N0YXRlKCkuCiAgKi8KIHN0YXRpYyB2b2lkIGpiZF9zeW5jX2JoKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKKwlfX3JlbGVhc2VzKGpvdXJuYWwtPmpfbGlzdF9sb2NrKQogewogCWdldF9iaChiaCk7CiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKQEAgLTIyNSw3ICsyMjYsNyBAQAogICogVHJ5IHRvIGZsdXNoIG9uZSBidWZmZXIgZnJvbSB0aGUgY2hlY2twb2ludCBsaXN0IHRvIGRpc2suCiAgKgogICogUmV0dXJuIDEgaWYgc29tZXRoaW5nIGhhcHBlbmVkIHdoaWNoIHJlcXVpcmVzIHVzIHRvIGFib3J0IHRoZSBjdXJyZW50Ci0gKiBzY2FuIG9mIHRoZSBjaGVja3BvaW50IGxpc3QuICAKKyAqIHNjYW4gb2YgdGhlIGNoZWNrcG9pbnQgbGlzdC4KICAqCiAgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkIGFuZCBkcm9wcyBpdCBpZiAxIGlzIHJldHVybmVkCiAgKiBDYWxsZWQgdW5kZXIgamJkX2xvY2tfYmhfc3RhdGUoamgyYmgoamgpKSwgYW5kIGRyb3BzIGl0CkBAIC0yNjksNyArMjcwLDcgQEAKIAkJICogcG9zc2libHkgYmxvY2ssIHdoaWxlIHN0aWxsIGhvbGRpbmcgdGhlIGpvdXJuYWwgbG9jay4KIAkJICogV2UgY2Fubm90IGFmZm9yZCB0byBsZXQgdGhlIHRyYW5zYWN0aW9uIGxvZ2ljIHN0YXJ0CiAJCSAqIG1lc3NpbmcgYXJvdW5kIHdpdGggdGhpcyBidWZmZXIgYmVmb3JlIHdlIHdyaXRlIGl0IHRvCi0JCSAqIGRpc2ssIGFzIHRoYXQgd291bGQgYnJlYWsgcmVjb3ZlcmFiaWxpdHkuICAKKwkJICogZGlzaywgYXMgdGhhdCB3b3VsZCBicmVhayByZWNvdmVyYWJpbGl0eS4KIAkJICovCiAJCUJVRkZFUl9UUkFDRShiaCwgInF1ZXVlIik7CiAJCWdldF9iaChiaCk7CkBAIC0yOTIsNyArMjkzLDcgQEAKICAqIFBlcmZvcm0gYW4gYWN0dWFsIGNoZWNrcG9pbnQuIFdlIHRha2UgdGhlIGZpcnN0IHRyYW5zYWN0aW9uIG9uIHRoZQogICogbGlzdCBvZiB0cmFuc2FjdGlvbnMgdG8gYmUgY2hlY2twb2ludGVkIGFuZCBzZW5kIGFsbCBpdHMgYnVmZmVycwogICogdG8gZGlzay4gV2Ugc3VibWl0IGxhcmdlciBjaHVua3Mgb2YgZGF0YSBhdCBvbmNlLgotICogCisgKgogICogVGhlIGpvdXJuYWwgc2hvdWxkIGJlIGxvY2tlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogICovCiBpbnQgbG9nX2RvX2NoZWNrcG9pbnQoam91cm5hbF90ICpqb3VybmFsKQpAQCAtMzAzLDEwICszMDQsMTAgQEAKIAogCWpiZF9kZWJ1ZygxLCAiU3RhcnQgY2hlY2twb2ludFxuIik7CiAKLQkvKiAKKwkvKgogCSAqIEZpcnN0IHRoaW5nOiBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyBpbiB0aGUgbG9nIHdoaWNoCiAJICogZG9uJ3QgbmVlZCBjaGVja3BvaW50aW5nLCBqdXN0IGVsaW1pbmF0ZSB0aGVtIGZyb20gdGhlCi0JICogam91cm5hbCBzdHJhaWdodCBhd2F5LiAgCisJICogam91cm5hbCBzdHJhaWdodCBhd2F5LgogCSAqLwogCXJlc3VsdCA9IGNsZWFudXBfam91cm5hbF90YWlsKGpvdXJuYWwpOwogCWpiZF9kZWJ1ZygxLCAiY2xlYW51cF9qb3VybmFsX3RhaWwgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7CkBAIC0zODQsOSArMzg1LDkgQEAKICAqIHdlIGhhdmUgYWxyZWFkeSBnb3QgcmlkIG9mIGFueSBzaW5jZSB0aGUgbGFzdCB1cGRhdGUgb2YgdGhlIGxvZyB0YWlsCiAgKiBpbiB0aGUgam91cm5hbCBzdXBlcmJsb2NrLiAgSWYgc28sIHdlIGNhbiBpbnN0YW50bHkgcm9sbCB0aGUKICAqIHN1cGVyYmxvY2sgZm9yd2FyZCB0byByZW1vdmUgdGhvc2UgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGxvZy4KLSAqIAorICoKICAqIFJldHVybiA8MCBvbiBlcnJvciwgMCBvbiBzdWNjZXNzLCAxIGlmIHRoZXJlIHdhcyBub3RoaW5nIHRvIGNsZWFuIHVwLgotICogCisgKgogICogQ2FsbGVkIHdpdGggdGhlIGpvdXJuYWwgbG9jayBoZWxkLgogICoKICAqIFRoaXMgaXMgdGhlIG9ubHkgcGFydCBvZiB0aGUgam91cm5hbGluZyBjb2RlIHdoaWNoIHJlYWxseSBuZWVkcyB0byBiZQpAQCAtNDAzLDggKzQwNCw4IEBACiAJdW5zaWduZWQgbG9uZwlibG9ja25yLCBmcmVlZDsKIAogCS8qIE9LLCB3b3JrIG91dCB0aGUgb2xkZXN0IHRyYW5zYWN0aW9uIHJlbWFpbmluZyBpbiB0aGUgbG9nLCBhbmQKLQkgKiB0aGUgbG9nIGJsb2NrIGl0IHN0YXJ0cyBhdC4gCi0JICogCisJICogdGhlIGxvZyBibG9jayBpdCBzdGFydHMgYXQuCisJICoKIAkgKiBJZiB0aGUgbG9nIGlzIG5vdyBlbXB0eSwgd2UgbmVlZCB0byB3b3JrIG91dCB3aGljaCBpcyB0aGUKIAkgKiBuZXh0IHRyYW5zYWN0aW9uIElEIHdlIHdpbGwgd3JpdGUsIGFuZCB3aGVyZSBpdCB3aWxsCiAJICogc3RhcnQuICovCkBAIC00NzksNyArNDgwLDcgQEAKIAlpZiAoIWpoKQogCQlyZXR1cm4gMDsKIAotIAlsYXN0X2poID0gamgtPmJfY3BwcmV2OworCWxhc3RfamggPSBqaC0+Yl9jcHByZXY7CiAJZG8gewogCQlqaCA9IG5leHRfamg7CiAJCW5leHRfamggPSBqaC0+Yl9jcG5leHQ7CkBAIC01NTcsNyArNTU4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiAKKy8qCiAgKiBqb3VybmFsX3JlbW92ZV9jaGVja3BvaW50OiBjYWxsZWQgYWZ0ZXIgYSBidWZmZXIgaGFzIGJlZW4gY29tbWl0dGVkCiAgKiB0byBkaXNrIChlaXRoZXIgYnkgYmVpbmcgd3JpdGUtYmFjayBmbHVzaGVkIHRvIGRpc2ssIG9yIGJlaW5nCiAgKiBjb21taXR0ZWQgdG8gdGhlIGxvZykuCkBAIC02MzUsNyArNjM2LDcgQEAKICAqIENhbGxlZCB3aXRoIHRoZSBqb3VybmFsIGxvY2tlZC4KICAqIENhbGxlZCB3aXRoIGpfbGlzdF9sb2NrIGhlbGQuCiAgKi8KLXZvaWQgX19qb3VybmFsX2luc2VydF9jaGVja3BvaW50KHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLCAKK3ZvaWQgX19qb3VybmFsX2luc2VydF9jaGVja3BvaW50KHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLAogCQkJICAgICAgIHRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uKQogewogCUpCVUZGRVJfVFJBQ0UoamgsICJlbnRyeSIpOwpAQCAtNjU3LDcgKzY1OCw3IEBACiAKIC8qCiAgKiBXZSd2ZSBmaW5pc2hlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24gc3RydWN0dXJlOiBhZGlvcy4uLgotICogCisgKgogICogVGhlIHRyYW5zYWN0aW9uIG11c3QgaGF2ZSBubyBsaW5rcyBleGNlcHQgZm9yIHRoZSBjaGVja3BvaW50IGJ5IHRoaXMKICAqIHBvaW50LgogICoKZGlmZiAtLWdpdCBhL2ZzL2piZC9qb3VybmFsLmMgYi9mcy9qYmQvam91cm5hbC5jCmluZGV4IGY2NjcyNGMuLjJmYzY2YzMgMTAwNjQ0Ci0tLSBhL2ZzL2piZC9qb3VybmFsLmMKKysrIGIvZnMvamJkL2pvdXJuYWwuYwpAQCAtMTgxLDcgKzE4MSw3IEBACiAJCQkJCQl0cmFuc2FjdGlvbi0+dF9leHBpcmVzKSkKIAkJCXNob3VsZF9zbGVlcCA9IDA7CiAJCWlmIChqb3VybmFsLT5qX2ZsYWdzICYgSkZTX1VOTU9VTlQpCi0gCQkJc2hvdWxkX3NsZWVwID0gMDsKKwkJCXNob3VsZF9zbGVlcCA9IDA7CiAJCWlmIChzaG91bGRfc2xlZXApIHsKIAkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwogCQkJc2NoZWR1bGUoKTsKQEAgLTI3MSw3ICsyNzEsNyBAQAogaW50IGpvdXJuYWxfd3JpdGVfbWV0YWRhdGFfYnVmZmVyKHRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uLAogCQkJCSAgc3RydWN0IGpvdXJuYWxfaGVhZCAgKmpoX2luLAogCQkJCSAgc3RydWN0IGpvdXJuYWxfaGVhZCAqKmpoX291dCwKLQkJCQkgIGludCBibG9ja25yKQorCQkJCSAgdW5zaWduZWQgbG9uZyBibG9ja25yKQogewogCWludCBuZWVkX2NvcHlfb3V0ID0gMDsKIAlpbnQgZG9uZV9jb3B5X291dCA9IDA7CkBAIC01NzgsNyArNTc4LDcgQEAKICAqIHRoaXMgaXMgYSBuby1vcC4gIElmIG5lZWRlZCwgd2UgY2FuIHVzZSBqX2Jsa19vZmZzZXQgLSBldmVyeXRoaW5nIGlzCiAgKiByZWFkeS4KICAqLwotaW50IGpvdXJuYWxfYm1hcChqb3VybmFsX3QgKmpvdXJuYWwsIHVuc2lnbmVkIGxvbmcgYmxvY2tuciwgCitpbnQgam91cm5hbF9ibWFwKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgbG9uZyBibG9ja25yLAogCQkgdW5zaWduZWQgbG9uZyAqcmV0cCkKIHsKIAlpbnQgZXJyID0gMDsKQEAgLTY5NiwxMyArNjk2LDEzIEBACiAgKiAgQGJkZXY6IEJsb2NrIGRldmljZSBvbiB3aGljaCB0byBjcmVhdGUgdGhlIGpvdXJuYWwKICAqICBAZnNfZGV2OiBEZXZpY2Ugd2hpY2ggaG9sZCBqb3VybmFsbGVkIGZpbGVzeXN0ZW0gZm9yIHRoaXMgam91cm5hbC4KICAqICBAc3RhcnQ6IEJsb2NrIG5yIFN0YXJ0IG9mIGpvdXJuYWwuCi0gKiAgQGxlbjogIExlbmdodCBvZiB0aGUgam91cm5hbCBpbiBibG9ja3MuCisgKiAgQGxlbjogIExlbmd0aCBvZiB0aGUgam91cm5hbCBpbiBibG9ja3MuCiAgKiAgQGJsb2Nrc2l6ZTogYmxvY2tzaXplIG9mIGpvdXJuYWxsaW5nIGRldmljZQogICogIEByZXR1cm5zOiBhIG5ld2x5IGNyZWF0ZWQgam91cm5hbF90ICoKLSAqICAKKyAqCiAgKiAgam91cm5hbF9pbml0X2RldiBjcmVhdGVzIGEgam91cm5hbCB3aGljaCBtYXBzIGEgZml4ZWQgY29udGlndW91cwogICogIHJhbmdlIG9mIGJsb2NrcyBvbiBhbiBhcmJpdHJhcnkgYmxvY2sgZGV2aWNlLgotICogCisgKgogICovCiBqb3VybmFsX3QgKiBqb3VybmFsX2luaXRfZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpmc19kZXYsCkBAIC03MzksMTEgKzczOSwxMSBAQAogCiAJcmV0dXJuIGpvdXJuYWw7CiB9Ci0gCi0vKiogCisKKy8qKgogICogIGpvdXJuYWxfdCAqIGpvdXJuYWxfaW5pdF9pbm9kZSAoKSAtIGNyZWF0ZXMgYSBqb3VybmFsIHdoaWNoIG1hcHMgdG8gYSBpbm9kZS4KICAqICBAaW5vZGU6IEFuIGlub2RlIHRvIGNyZWF0ZSB0aGUgam91cm5hbCBpbgotICogIAorICoKICAqIGpvdXJuYWxfaW5pdF9pbm9kZSBjcmVhdGVzIGEgam91cm5hbCB3aGljaCBtYXBzIGFuIG9uLWRpc2sgaW5vZGUgYXMKICAqIHRoZSBqb3VybmFsLiAgVGhlIGlub2RlIG11c3QgZXhpc3QgYWxyZWFkeSwgbXVzdCBzdXBwb3J0IGJtYXAoKSBhbmQKICAqIG11c3QgaGF2ZSBhbGwgZGF0YSBibG9ja3MgcHJlYWxsb2NhdGVkLgpAQCAtNzYzLDcgKzc2Myw3IEBACiAJam91cm5hbC0+al9pbm9kZSA9IGlub2RlOwogCWpiZF9kZWJ1ZygxLAogCQkgICJqb3VybmFsICVwOiBpbm9kZSAlcy8lbGQsIHNpemUgJUxkLCBiaXRzICVkLCBibGtzaXplICVsZFxuIiwKLQkJICBqb3VybmFsLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLCAKKwkJICBqb3VybmFsLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAogCQkgIChsb25nIGxvbmcpIGlub2RlLT5pX3NpemUsCiAJCSAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CiAKQEAgLTc5OCwxMCArNzk4LDEwIEBACiAJcmV0dXJuIGpvdXJuYWw7CiB9CiAKLS8qIAorLyoKICAqIElmIHRoZSBqb3VybmFsIGluaXQgb3IgY3JlYXRlIGFib3J0cywgd2UgbmVlZCB0byBtYXJrIHRoZSBqb3VybmFsCiAgKiBzdXBlcmJsb2NrIGFzIGJlaW5nIE5VTEwgdG8gcHJldmVudCB0aGUgam91cm5hbCBkZXN0cm95IGZyb20gd3JpdGluZwotICogYmFjayBhIGJvZ3VzIHN1cGVyYmxvY2suIAorICogYmFjayBhIGJvZ3VzIHN1cGVyYmxvY2suCiAgKi8KIHN0YXRpYyB2b2lkIGpvdXJuYWxfZmFpbF9zdXBlcmJsb2NrIChqb3VybmFsX3QgKmpvdXJuYWwpCiB7CkBAIC04MjAsNyArODIwLDcgQEAKIHN0YXRpYyBpbnQgam91cm5hbF9yZXNldChqb3VybmFsX3QgKmpvdXJuYWwpCiB7CiAJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOwotCXVuc2lnbmVkIGludCBmaXJzdCwgbGFzdDsKKwl1bnNpZ25lZCBsb25nIGZpcnN0LCBsYXN0OwogCiAJZmlyc3QgPSBiZTMyX3RvX2NwdShzYi0+c19maXJzdCk7CiAJbGFzdCA9IGJlMzJfdG9fY3B1KHNiLT5zX21heGxlbik7CkBAIC04NDQsMTMgKzg0NCwxMyBAQAogCXJldHVybiAwOwogfQogCi0vKiogCisvKioKICAqIGludCBqb3VybmFsX2NyZWF0ZSgpIC0gSW5pdGlhbGlzZSB0aGUgbmV3IGpvdXJuYWwgZmlsZQogICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gY3JlYXRlLiBUaGlzIHN0cnVjdHVyZSBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXNlZAotICogCisgKgogICogR2l2ZW4gYSBqb3VybmFsX3Qgc3RydWN0dXJlIHdoaWNoIHRlbGxzIHVzIHdoaWNoIGRpc2sgYmxvY2tzIHdlIGNhbgogICogdXNlLCBjcmVhdGUgYSBuZXcgam91cm5hbCBzdXBlcmJsb2NrIGFuZCBpbml0aWFsaXNlIGFsbCBvZiB0aGUKLSAqIGpvdXJuYWwgZmllbGRzIGZyb20gc2NyYXRjaC4gIAorICogam91cm5hbCBmaWVsZHMgZnJvbSBzY3JhdGNoLgogICoqLwogaW50IGpvdXJuYWxfY3JlYXRlKGpvdXJuYWxfdCAqam91cm5hbCkKIHsKQEAgLTkxNSw3ICs5MTUsNyBAQAogCXJldHVybiBqb3VybmFsX3Jlc2V0KGpvdXJuYWwpOwogfQogCi0vKiogCisvKioKICAqIHZvaWQgam91cm5hbF91cGRhdGVfc3VwZXJibG9jaygpIC0gVXBkYXRlIGpvdXJuYWwgc2Igb24gZGlzay4KICAqIEBqb3VybmFsOiBUaGUgam91cm5hbCB0byB1cGRhdGUuCiAgKiBAd2FpdDogU2V0IHRvICcwJyBpZiB5b3UgZG9uJ3Qgd2FudCB0byB3YWl0IGZvciBJTyBjb21wbGV0aW9uLgpAQCAtOTM5LDcgKzkzOSw3IEBACiAJCQkJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSkgewogCQlqYmRfZGVidWcoMSwiSkJEOiBTa2lwcGluZyBzdXBlcmJsb2NrIHVwZGF0ZSBvbiByZWNvdmVyZWQgc2IgIgogCQkJIihzdGFydCAlbGQsIHNlcSAlZCwgZXJybm8gJWQpXG4iLAotCQkJam91cm5hbC0+al90YWlsLCBqb3VybmFsLT5qX3RhaWxfc2VxdWVuY2UsIAorCQkJam91cm5hbC0+al90YWlsLCBqb3VybmFsLT5qX3RhaWxfc2VxdWVuY2UsCiAJCQlqb3VybmFsLT5qX2Vycm5vKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTA2Miw3ICsxMDYyLDcgQEAKIC8qKgogICogaW50IGpvdXJuYWxfbG9hZCgpIC0gUmVhZCBqb3VybmFsIGZyb20gZGlzay4KICAqIEBqb3VybmFsOiBKb3VybmFsIHRvIGFjdCBvbi4KLSAqIAorICoKICAqIEdpdmVuIGEgam91cm5hbF90IHN0cnVjdHVyZSB3aGljaCB0ZWxscyB1cyB3aGljaCBkaXNrIGJsb2NrcyBjb250YWluCiAgKiBhIGpvdXJuYWwsIHJlYWQgdGhlIGpvdXJuYWwgZnJvbSBkaXNrIHRvIGluaXRpYWxpc2UgdGhlIGluLW1lbW9yeQogICogc3RydWN0dXJlcy4KQEAgLTEwOTQsNyArMTA5NCw3IEBACiAJLyoKIAkgKiBDcmVhdGUgYSBzbGFiIGZvciB0aGlzIGJsb2Nrc2l6ZQogCSAqLwotCWVyciA9IGpvdXJuYWxfY3JlYXRlX2piZF9zbGFiKGNwdV90b19iZTMyKHNiLT5zX2Jsb2Nrc2l6ZSkpOworCWVyciA9IGpvdXJuYWxfY3JlYXRlX2piZF9zbGFiKGJlMzJfdG9fY3B1KHNiLT5zX2Jsb2Nrc2l6ZSkpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTExNzIsOSArMTE3Miw5IEBACiAgKiBAY29tcGF0OiBiaXRtYXNrIG9mIGNvbXBhdGlibGUgZmVhdHVyZXMKICAqIEBybzogYml0bWFzayBvZiBmZWF0dXJlcyB0aGF0IGZvcmNlIHJlYWQtb25seSBtb3VudAogICogQGluY29tcGF0OiBiaXRtYXNrIG9mIGluY29tcGF0aWJsZSBmZWF0dXJlcwotICogCisgKgogICogQ2hlY2sgd2hldGhlciB0aGUgam91cm5hbCB1c2VzIGFsbCBvZiBhIGdpdmVuIHNldCBvZgotICogZmVhdHVyZXMuICBSZXR1cm4gdHJ1ZSAobm9uLXplcm8pIGlmIGl0IGRvZXMuIAorICogZmVhdHVyZXMuICBSZXR1cm4gdHJ1ZSAobm9uLXplcm8pIGlmIGl0IGRvZXMuCiAgKiovCiAKIGludCBqb3VybmFsX2NoZWNrX3VzZWRfZmVhdHVyZXMgKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgbG9uZyBjb21wYXQsCkBAIC0xMjAzLDcgKzEyMDMsNyBAQAogICogQGNvbXBhdDogYml0bWFzayBvZiBjb21wYXRpYmxlIGZlYXR1cmVzCiAgKiBAcm86IGJpdG1hc2sgb2YgZmVhdHVyZXMgdGhhdCBmb3JjZSByZWFkLW9ubHkgbW91bnQKICAqIEBpbmNvbXBhdDogYml0bWFzayBvZiBpbmNvbXBhdGlibGUgZmVhdHVyZXMKLSAqIAorICoKICAqIENoZWNrIHdoZXRoZXIgdGhlIGpvdXJuYWxpbmcgY29kZSBzdXBwb3J0cyB0aGUgdXNlIG9mCiAgKiBhbGwgb2YgYSBnaXZlbiBzZXQgb2YgZmVhdHVyZXMgb24gdGhpcyBqb3VybmFsLiAgUmV0dXJuIHRydWUKICAqIChub24temVybykgaWYgaXQgY2FuLiAqLwpAQCAtMTI0MSw3ICsxMjQxLDcgQEAKICAqIEBpbmNvbXBhdDogYml0bWFzayBvZiBpbmNvbXBhdGlibGUgZmVhdHVyZXMKICAqCiAgKiBNYXJrIGEgZ2l2ZW4gam91cm5hbCBmZWF0dXJlIGFzIHByZXNlbnQgb24gdGhlCi0gKiBzdXBlcmJsb2NrLiAgUmV0dXJucyB0cnVlIGlmIHRoZSByZXF1ZXN0ZWQgZmVhdHVyZXMgY291bGQgYmUgc2V0LiAKKyAqIHN1cGVyYmxvY2suICBSZXR1cm5zIHRydWUgaWYgdGhlIHJlcXVlc3RlZCBmZWF0dXJlcyBjb3VsZCBiZSBzZXQuCiAgKgogICovCiAKQEAgLTEzMjcsNyArMTMyNyw3IEBACiAvKioKICAqIGludCBqb3VybmFsX2ZsdXNoICgpIC0gRmx1c2ggam91cm5hbAogICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gYWN0IG9uLgotICogCisgKgogICogRmx1c2ggYWxsIGRhdGEgZm9yIGEgZ2l2ZW4gam91cm5hbCB0byBkaXNrIGFuZCBlbXB0eSB0aGUgam91cm5hbC4KICAqIEZpbGVzeXN0ZW1zIGNhbiB1c2UgdGhpcyB3aGVuIHJlbW91bnRpbmcgcmVhZG9ubHkgdG8gZW5zdXJlIHRoYXQKICAqIHJlY292ZXJ5IGRvZXMgbm90IG5lZWQgdG8gaGFwcGVuIG9uIHJlbW91bnQuCkBAIC0xMzk0LDcgKzEzOTQsNyBAQAogICogaW50IGpvdXJuYWxfd2lwZSgpIC0gV2lwZSBqb3VybmFsIGNvbnRlbnRzCiAgKiBAam91cm5hbDogSm91cm5hbCB0byBhY3Qgb24uCiAgKiBAd3JpdGU6IGZsYWcgKHNlZSBiZWxvdykKLSAqIAorICoKICAqIFdpcGUgb3V0IGFsbCBvZiB0aGUgY29udGVudHMgb2YgYSBqb3VybmFsLCBzYWZlbHkuICBUaGlzIHdpbGwgcHJvZHVjZQogICogYSB3YXJuaW5nIGlmIHRoZSBqb3VybmFsIGNvbnRhaW5zIGFueSB2YWxpZCByZWNvdmVyeSBpbmZvcm1hdGlvbi4KICAqIE11c3QgYmUgY2FsbGVkIGJldHdlZW4gam91cm5hbF9pbml0XyooKSBhbmQgam91cm5hbF9sb2FkKCkuCkBAIC0xNDQ5LDcgKzE0NDksNyBAQAogCiAvKgogICogSm91cm5hbCBhYm9ydCBoYXMgdmVyeSBzcGVjaWZpYyBzZW1hbnRpY3MsIHdoaWNoIHdlIGRlc2NyaWJlCi0gKiBmb3Igam91cm5hbCBhYm9ydC4gCisgKiBmb3Igam91cm5hbCBhYm9ydC4KICAqCiAgKiBUd28gaW50ZXJuYWwgZnVuY3Rpb24sIHdoaWNoIHByb3ZpZGUgYWJvcnQgdG8gdGUgamJkIGxheWVyCiAgKiBpdHNlbGYgYXJlIGhlcmUuCkBAIC0xNTA0LDcgKzE1MDQsNyBAQAogICogUGVyZm9ybSBhIGNvbXBsZXRlLCBpbW1lZGlhdGUgc2h1dGRvd24gb2YgdGhlIEVOVElSRQogICogam91cm5hbCAobm90IG9mIGEgc2luZ2xlIHRyYW5zYWN0aW9uKS4gIFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZQogICogdW5kb25lIHdpdGhvdXQgY2xvc2luZyBhbmQgcmVvcGVuaW5nIHRoZSBqb3VybmFsLgotICogICAgICAgICAgIAorICoKICAqIFRoZSBqb3VybmFsX2Fib3J0IGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIHN1cHBvcnQgaGlnaGVyIGxldmVsIGVycm9yCiAgKiByZWNvdmVyeSBtZWNoYW5pc21zIHN1Y2ggYXMgdGhlIGV4dDIvZXh0MyByZW1vdW50LXJlYWRvbmx5IGVycm9yCiAgKiBtb2RlLgpAQCAtMTUzOCw3ICsxNTM4LDcgQEAKICAqIHN1cHBseSBhbiBlcnJubzsgYSBudWxsIGVycm5vIGltcGxpZXMgdGhhdCBhYnNvbHV0ZWx5IG5vIGZ1cnRoZXIKICAqIHdyaXRlcyBhcmUgZG9uZSB0byB0aGUgam91cm5hbCAodW5sZXNzIHRoZXJlIGFyZSBhbnkgYWxyZWFkeSBpbgogICogcHJvZ3Jlc3MpLgotICogCisgKgogICovCiAKIHZvaWQgam91cm5hbF9hYm9ydChqb3VybmFsX3QgKmpvdXJuYWwsIGludCBlcnJubykKQEAgLTE1NDYsNyArMTU0Niw3IEBACiAJX19qb3VybmFsX2Fib3J0X3NvZnQoam91cm5hbCwgZXJybm8pOwogfQogCi0vKiogCisvKioKICAqIGludCBqb3VybmFsX2Vycm5vICgpIC0gcmV0dXJucyB0aGUgam91cm5hbCdzIGVycm9yIHN0YXRlLgogICogQGpvdXJuYWw6IGpvdXJuYWwgdG8gZXhhbWluZS4KICAqCkBAIC0xNTcwLDcgKzE1NzAsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qKiAKKy8qKgogICogaW50IGpvdXJuYWxfY2xlYXJfZXJyICgpIC0gY2xlYXJzIHRoZSBqb3VybmFsJ3MgZXJyb3Igc3RhdGUKICAqIEBqb3VybmFsOiBqb3VybmFsIHRvIGFjdCBvbi4KICAqCkBAIC0xNTkwLDcgKzE1OTAsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qKiAKKy8qKgogICogdm9pZCBqb3VybmFsX2Fja19lcnIoKSAtIEFjayBqb3VybmFsIGVyci4KICAqIEBqb3VybmFsOiBqb3VybmFsIHRvIGFjdCBvbi4KICAqCkBAIC0xNjEyLDcgKzE2MTIsNyBAQAogCiAvKgogICogU2ltcGxlIHN1cHBvcnQgZm9yIHJldHJ5aW5nIG1lbW9yeSBhbGxvY2F0aW9ucy4gIEludHJvZHVjZWQgdG8gaGVscCB0bwotICogZGVidWcgZGlmZmVyZW50IFZNIGRlYWRsb2NrIGF2b2lkYW5jZSBzdHJhdGVnaWVzLiAKKyAqIGRlYnVnIGRpZmZlcmVudCBWTSBkZWFkbG9jayBhdm9pZGFuY2Ugc3RyYXRlZ2llcy4KICAqLwogdm9pZCAqIF9famJkX2ttYWxsb2MgKGNvbnN0IGNoYXIgKndoZXJlLCBzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MsIGludCByZXRyeSkKIHsKQEAgLTIwNDcsMTMgKzIwNDcsNyBAQAogewogCWludCByZXQ7CiAKLS8qIFN0YXRpYyBjaGVjayBmb3IgZGF0YSBzdHJ1Y3R1cmUgY29uc2lzdGVuY3kuICBUaGVyZSdzIG5vIGNvZGUKLSAqIGludm9rZWQgLS0tIHdlJ2xsIGp1c3QgZ2V0IGEgbGlua2VyIGZhaWx1cmUgaWYgdGhpbmdzIGFyZW4ndCByaWdodC4KLSAqLwotCWV4dGVybiB2b2lkIGpvdXJuYWxfYmFkX3N1cGVyYmxvY2tfc2l6ZSh2b2lkKTsKLQlpZiAoc2l6ZW9mKHN0cnVjdCBqb3VybmFsX3N1cGVyYmxvY2tfcykgIT0gMTAyNCkKLQkJam91cm5hbF9iYWRfc3VwZXJibG9ja19zaXplKCk7Ci0KKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBqb3VybmFsX3N1cGVyYmxvY2tfcykgIT0gMTAyNCk7CiAKIAlyZXQgPSBqb3VybmFsX2luaXRfY2FjaGVzKCk7CiAJaWYgKHJldCAhPSAwKQpkaWZmIC0tZ2l0IGEvZnMvamJkL3JlY292ZXJ5LmMgYi9mcy9qYmQvcmVjb3ZlcnkuYwppbmRleCBkZTViYWZiNGUuLjQ0NWVlZDYgMTAwNjQ0Ci0tLSBhL2ZzL2piZC9yZWNvdmVyeS5jCisrKyBiL2ZzL2piZC9yZWNvdmVyeS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIGxpbnV4L2ZzL3JlY292ZXJ5LmMKLSAqIAorICoKICAqIFdyaXR0ZW4gYnkgU3RlcGhlbiBDLiBUd2VlZGllIDxzY3RAcmVkaGF0LmNvbT4sIDE5OTkKICAqCiAgKiBDb3B5cmlnaHQgMTk5OS0yMDAwIFJlZCBIYXQgU29mdHdhcmUgLS0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKQEAgLTEwLDcgKzEwLDcgQEAKICAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgogICoKICAqIEpvdXJuYWwgcmVjb3Zlcnkgcm91dGluZXMgZm9yIHRoZSBnZW5lcmljIGZpbGVzeXN0ZW0gam91cm5hbGluZyBjb2RlOwotICogcGFydCBvZiB0aGUgZXh0MmZzIGpvdXJuYWxpbmcgc3lzdGVtLiAgCisgKiBwYXJ0IG9mIHRoZSBleHQyZnMgam91cm5hbGluZyBzeXN0ZW0uCiAgKi8KIAogI2lmbmRlZiBfX0tFUk5FTF9fCkBAIC0yNSw5ICsyNSw5IEBACiAKIC8qCiAgKiBNYWludGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIHJlY292ZXJ5IGpvYiwgc28gdGhhdAotICogdGhlIGRpZmZlcmVudCBwYXNzZXMgY2FuIGNhcnJ5IGluZm9ybWF0aW9uIGJldHdlZW4gdGhlbS4gCisgKiB0aGUgZGlmZmVyZW50IHBhc3NlcyBjYW4gY2FycnkgaW5mb3JtYXRpb24gYmV0d2VlbiB0aGVtLgogICovCi1zdHJ1Y3QgcmVjb3ZlcnlfaW5mbyAKK3N0cnVjdCByZWNvdmVyeV9pbmZvCiB7CiAJdGlkX3QJCXN0YXJ0X3RyYW5zYWN0aW9uOwogCXRpZF90CQllbmRfdHJhbnNhY3Rpb247CkBAIC0xMTYsNyArMTE2LDcgQEAKIAllcnIgPSAwOwogCiBmYWlsZWQ6Ci0JaWYgKG5idWZzKSAKKwlpZiAobmJ1ZnMpCiAJCWpvdXJuYWxfYnJlbHNlX2FycmF5KGJ1ZnMsIG5idWZzKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTI4LDcgKzEyOCw3IEBACiAgKiBSZWFkIGEgYmxvY2sgZnJvbSB0aGUgam91cm5hbAogICovCiAKLXN0YXRpYyBpbnQganJlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwLCBqb3VybmFsX3QgKmpvdXJuYWwsIAorc3RhdGljIGludCBqcmVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHAsIGpvdXJuYWxfdCAqam91cm5hbCwKIAkJIHVuc2lnbmVkIGludCBvZmZzZXQpCiB7CiAJaW50IGVycjsKQEAgLTIxMiwxNCArMjEyLDE0IEBACiAvKioKICAqIGpvdXJuYWxfcmVjb3ZlciAtIHJlY292ZXJzIGEgb24tZGlzayBqb3VybmFsCiAgKiBAam91cm5hbDogdGhlIGpvdXJuYWwgdG8gcmVjb3ZlcgotICogCisgKgogICogVGhlIHByaW1hcnkgZnVuY3Rpb24gZm9yIHJlY292ZXJpbmcgdGhlIGxvZyBjb250ZW50cyB3aGVuIG1vdW50aW5nIGEKLSAqIGpvdXJuYWxlZCBkZXZpY2UuICAKKyAqIGpvdXJuYWxlZCBkZXZpY2UuCiAgKgogICogUmVjb3ZlcnkgaXMgZG9uZSBpbiB0aHJlZSBwYXNzZXMuICBJbiB0aGUgZmlyc3QgcGFzcywgd2UgbG9vayBmb3IgdGhlCiAgKiBlbmQgb2YgdGhlIGxvZy4gIEluIHRoZSBzZWNvbmQsIHdlIGFzc2VtYmxlIHRoZSBsaXN0IG9mIHJldm9rZQogICogYmxvY2tzLiAgSW4gdGhlIHRoaXJkIGFuZCBmaW5hbCBwYXNzLCB3ZSByZXBsYXkgYW55IHVuLXJldm9rZWQgYmxvY2tzCi0gKiBpbiB0aGUgbG9nLiAgCisgKiBpbiB0aGUgbG9nLgogICovCiBpbnQgam91cm5hbF9yZWNvdmVyKGpvdXJuYWxfdCAqam91cm5hbCkKIHsKQEAgLTIzMSwxMCArMjMxLDEwIEBACiAJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOwogCXNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOwogCi0JLyogCisJLyoKIAkgKiBUaGUgam91cm5hbCBzdXBlcmJsb2NrJ3Mgc19zdGFydCBmaWVsZCAodGhlIGN1cnJlbnQgbG9nIGhlYWQpCiAJICogaXMgYWx3YXlzIHplcm8gaWYsIGFuZCBvbmx5IGlmLCB0aGUgam91cm5hbCB3YXMgY2xlYW5seQotCSAqIHVubW91bnRlZC4gIAorCSAqIHVubW91bnRlZC4KIAkgKi8KIAogCWlmICghc2ItPnNfc3RhcnQpIHsKQEAgLTI1Myw3ICsyNTMsNyBAQAogCWpiZF9kZWJ1ZygwLCAiSkJEOiByZWNvdmVyeSwgZXhpdCBzdGF0dXMgJWQsICIKIAkJICAicmVjb3ZlcmVkIHRyYW5zYWN0aW9ucyAldSB0byAldVxuIiwKIAkJICBlcnIsIGluZm8uc3RhcnRfdHJhbnNhY3Rpb24sIGluZm8uZW5kX3RyYW5zYWN0aW9uKTsKLQlqYmRfZGVidWcoMCwgIkpCRDogUmVwbGF5ZWQgJWQgYW5kIHJldm9rZWQgJWQvJWQgYmxvY2tzXG4iLCAKKwlqYmRfZGVidWcoMCwgIkpCRDogUmVwbGF5ZWQgJWQgYW5kIHJldm9rZWQgJWQvJWQgYmxvY2tzXG4iLAogCQkgIGluZm8ubnJfcmVwbGF5cywgaW5mby5ucl9yZXZva2VfaGl0cywgaW5mby5ucl9yZXZva2VzKTsKIAogCS8qIFJlc3RhcnQgdGhlIGxvZyBhdCB0aGUgbmV4dCB0cmFuc2FjdGlvbiBJRCwgdGh1cyBpbnZhbGlkYXRpbmcKQEAgLTI2OCwxNSArMjY4LDE1IEBACiAvKioKICAqIGpvdXJuYWxfc2tpcF9yZWNvdmVyeSAtIFN0YXJ0IGpvdXJuYWwgYW5kIHdpcGUgZXhpdGluZyByZWNvcmRzCiAgKiBAam91cm5hbDogam91cm5hbCB0byBzdGFydHVwCi0gKiAKKyAqCiAgKiBMb2NhdGUgYW55IHZhbGlkIHJlY292ZXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIGpvdXJuYWwgYW5kIHNldCB1cCB0aGUKICAqIGpvdXJuYWwgc3RydWN0dXJlcyBpbiBtZW1vcnkgdG8gaWdub3JlIGl0IChwcmVzdW1hYmx5IGJlY2F1c2UgdGhlCi0gKiBjYWxsZXIgaGFzIGV2aWRlbmNlIHRoYXQgaXQgaXMgb3V0IG9mIGRhdGUpLiAgCisgKiBjYWxsZXIgaGFzIGV2aWRlbmNlIHRoYXQgaXQgaXMgb3V0IG9mIGRhdGUpLgogICogVGhpcyBmdW5jdGlvbiBkb2VzJ250IGFwcGVhciB0byBiZSBleG9ydGVkLi4KICAqCiAgKiBXZSBwZXJmb3JtIG9uZSBwYXNzIG92ZXIgdGhlIGpvdXJuYWwgdG8gYWxsb3cgdXMgdG8gdGVsbCB0aGUgdXNlciBob3cKICAqIG11Y2ggcmVjb3ZlcnkgaW5mb3JtYXRpb24gaXMgYmVpbmcgZXJhc2VkLCBhbmQgdG8gbGV0IHVzIGluaXRpYWxpc2UKLSAqIHRoZSBqb3VybmFsIHRyYW5zYWN0aW9uIHNlcXVlbmNlIG51bWJlcnMgdG8gdGhlIG5leHQgdW51c2VkIElELiAKKyAqIHRoZSBqb3VybmFsIHRyYW5zYWN0aW9uIHNlcXVlbmNlIG51bWJlcnMgdG8gdGhlIG5leHQgdW51c2VkIElELgogICovCiBpbnQgam91cm5hbF9za2lwX3JlY292ZXJ5KGpvdXJuYWxfdCAqam91cm5hbCkKIHsKQEAgLTI5Nyw3ICsyOTcsNyBAQAogI2lmZGVmIENPTkZJR19KQkRfREVCVUcKIAkJaW50IGRyb3BwZWQgPSBpbmZvLmVuZF90cmFuc2FjdGlvbiAtIGJlMzJfdG9fY3B1KHNiLT5zX3NlcXVlbmNlKTsKICNlbmRpZgotCQlqYmRfZGVidWcoMCwgCisJCWpiZF9kZWJ1ZygwLAogCQkJICAiSkJEOiBpZ25vcmluZyAlZCB0cmFuc2FjdGlvbiVzIGZyb20gdGhlIGpvdXJuYWwuXG4iLAogCQkJICBkcm9wcGVkLCAoZHJvcHBlZCA9PSAxKSA/ICIiIDogInMiKTsKIAkJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9ICsraW5mby5lbmRfdHJhbnNhY3Rpb247CkBAIC0zMTQsNyArMzE0LDcgQEAKIAl1bnNpZ25lZCBsb25nCQluZXh0X2xvZ19ibG9jazsKIAlpbnQJCQllcnIsIHN1Y2Nlc3MgPSAwOwogCWpvdXJuYWxfc3VwZXJibG9ja190ICoJc2I7Ci0Jam91cm5hbF9oZWFkZXJfdCAqIAl0bXA7CisJam91cm5hbF9oZWFkZXJfdCAqCXRtcDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKgliaDsKIAl1bnNpZ25lZCBpbnQJCXNlcXVlbmNlOwogCWludAkJCWJsb2NrdHlwZTsKQEAgLTMyNCwxMCArMzI0LDEwIEBACiAJTUFYX0JMT0NLU19QRVJfREVTQyA9ICgoam91cm5hbC0+al9ibG9ja3NpemUtc2l6ZW9mKGpvdXJuYWxfaGVhZGVyX3QpKQogCQkJICAgICAgIC8gc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpKTsKIAotCS8qIAorCS8qCiAJICogRmlyc3QgdGhpbmcgaXMgdG8gZXN0YWJsaXNoIHdoYXQgd2UgZXhwZWN0IHRvIGZpbmQgaW4gdGhlIGxvZwogCSAqIChpbiB0ZXJtcyBvZiB0cmFuc2FjdGlvbiBJRHMpLCBhbmQgd2hlcmUgKGluIHRlcm1zIG9mIGxvZwotCSAqIGJsb2NrIG9mZnNldHMpOiBxdWVyeSB0aGUgc3VwZXJibG9jay4gIAorCSAqIGJsb2NrIG9mZnNldHMpOiBxdWVyeSB0aGUgc3VwZXJibG9jay4KIAkgKi8KIAogCXNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOwpAQCAtMzQ0LDcgKzM0NCw3IEBACiAJICogTm93IHdlIHdhbGsgdGhyb3VnaCB0aGUgbG9nLCB0cmFuc2FjdGlvbiBieSB0cmFuc2FjdGlvbiwKIAkgKiBtYWtpbmcgc3VyZSB0aGF0IGVhY2ggdHJhbnNhY3Rpb24gaGFzIGEgY29tbWl0IGJsb2NrIGluIHRoZQogCSAqIGV4cGVjdGVkIHBsYWNlLiAgRWFjaCBjb21wbGV0ZSB0cmFuc2FjdGlvbiBnZXRzIHJlcGxheWVkIGJhY2sKLQkgKiBpbnRvIHRoZSBtYWluIGZpbGVzeXN0ZW0uIAorCSAqIGludG8gdGhlIG1haW4gZmlsZXN5c3RlbS4KIAkgKi8KIAogCXdoaWxlICgxKSB7CkBAIC0zNzksOCArMzc5LDggQEAKIAkJbmV4dF9sb2dfYmxvY2srKzsKIAkJd3JhcChqb3VybmFsLCBuZXh0X2xvZ19ibG9jayk7CiAKLQkJLyogV2hhdCBraW5kIG9mIGJ1ZmZlciBpcyBpdD8gCi0JCSAqIAorCQkvKiBXaGF0IGtpbmQgb2YgYnVmZmVyIGlzIGl0PworCQkgKgogCQkgKiBJZiBpdCBpcyBhIGRlc2NyaXB0b3IgYmxvY2ssIGNoZWNrIHRoYXQgaXQgaGFzIHRoZQogCQkgKiBleHBlY3RlZCBzZXF1ZW5jZSBudW1iZXIuICBPdGhlcndpc2UsIHdlJ3JlIGFsbCBkb25lCiAJCSAqIGhlcmUuICovCkBAIC0zOTQsNyArMzk0LDcgQEAKIAogCQlibG9ja3R5cGUgPSBiZTMyX3RvX2NwdSh0bXAtPmhfYmxvY2t0eXBlKTsKIAkJc2VxdWVuY2UgPSBiZTMyX3RvX2NwdSh0bXAtPmhfc2VxdWVuY2UpOwotCQlqYmRfZGVidWcoMywgIkZvdW5kIG1hZ2ljICVkLCBzZXF1ZW5jZSAlZFxuIiwgCisJCWpiZF9kZWJ1ZygzLCAiRm91bmQgbWFnaWMgJWQsIHNlcXVlbmNlICVkXG4iLAogCQkJICBibG9ja3R5cGUsIHNlcXVlbmNlKTsKIAogCQlpZiAoc2VxdWVuY2UgIT0gbmV4dF9jb21taXRfSUQpIHsKQEAgLTQzOCw3ICs0MzgsNyBAQAogCQkJCQkvKiBSZWNvdmVyIHdoYXQgd2UgY2FuLCBidXQKIAkJCQkJICogcmVwb3J0IGZhaWx1cmUgYXQgdGhlIGVuZC4gKi8KIAkJCQkJc3VjY2VzcyA9IGVycjsKLQkJCQkJcHJpbnRrIChLRVJOX0VSUiAKKwkJCQkJcHJpbnRrIChLRVJOX0VSUgogCQkJCQkJIkpCRDogSU8gZXJyb3IgJWQgcmVjb3ZlcmluZyAiCiAJCQkJCQkiYmxvY2sgJWxkIGluIGxvZ1xuIiwKIAkJCQkJCWVyciwgaW9fYmxvY2spOwpAQCAtNDUyLDcgKzQ1Miw3IEBACiAJCQkJCSAqIHJldm9rZWQsIHRoZW4gd2UncmUgYWxsIGRvbmUKIAkJCQkJICogaGVyZS4gKi8KIAkJCQkJaWYgKGpvdXJuYWxfdGVzdF9yZXZva2UKLQkJCQkJICAgIChqb3VybmFsLCBibG9ja25yLCAKKwkJCQkJICAgIChqb3VybmFsLCBibG9ja25yLAogCQkJCQkgICAgIG5leHRfY29tbWl0X0lEKSkgewogCQkJCQkJYnJlbHNlKG9iaCk7CiAJCQkJCQkrK2luZm8tPm5yX3Jldm9rZV9oaXRzOwpAQCAtNDY1LDcgKzQ2NSw3IEBACiAJCQkJCQkJYmxvY2tuciwKIAkJCQkJCQlqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CiAJCQkJCWlmIChuYmggPT0gTlVMTCkgewotCQkJCQkJcHJpbnRrKEtFUk5fRVJSIAorCQkJCQkJcHJpbnRrKEtFUk5fRVJSCiAJCQkJCQkgICAgICAgIkpCRDogT3V0IG9mIG1lbW9yeSAiCiAJCQkJCQkgICAgICAgImR1cmluZyByZWNvdmVyeS5cbiIpOwogCQkJCQkJZXJyID0gLUVOT01FTTsKQEAgLTUzNyw3ICs1MzcsNyBAQAogCX0KIAogIGRvbmU6Ci0JLyogCisJLyoKIAkgKiBXZSBicm9rZSBvdXQgb2YgdGhlIGxvZyBzY2FuIGxvb3A6IGVpdGhlciB3ZSBjYW1lIHRvIHRoZQogCSAqIGtub3duIGVuZCBvZiB0aGUgbG9nIG9yIHdlIGZvdW5kIGFuIHVuZXhwZWN0ZWQgYmxvY2sgaW4gdGhlCiAJICogbG9nLiAgSWYgdGhlIGxhdHRlciBoYXBwZW5lZCwgdGhlbiB3ZSBrbm93IHRoYXQgdGhlICJjdXJyZW50IgpAQCAtNTY3LDcgKzU2Nyw3IEBACiAKIC8qIFNjYW4gYSByZXZva2UgcmVjb3JkLCBtYXJraW5nIGFsbCBibG9ja3MgbWVudGlvbmVkIGFzIHJldm9rZWQuICovCiAKLXN0YXRpYyBpbnQgc2Nhbl9yZXZva2VfcmVjb3Jkcyhqb3VybmFsX3QgKmpvdXJuYWwsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIAorc3RhdGljIGludCBzY2FuX3Jldm9rZV9yZWNvcmRzKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKIAkJCSAgICAgICB0aWRfdCBzZXF1ZW5jZSwgc3RydWN0IHJlY292ZXJ5X2luZm8gKmluZm8pCiB7CiAJam91cm5hbF9yZXZva2VfaGVhZGVyX3QgKmhlYWRlcjsKZGlmZiAtLWdpdCBhL2ZzL2piZC9yZXZva2UuYyBiL2ZzL2piZC9yZXZva2UuYwppbmRleCBhNTYxNDQxLi5jNTMyNDI5IDEwMDY0NAotLS0gYS9mcy9qYmQvcmV2b2tlLmMKKysrIGIvZnMvamJkL3Jldm9rZS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIGxpbnV4L2ZzL3Jldm9rZS5jCi0gKiAKKyAqCiAgKiBXcml0dGVuIGJ5IFN0ZXBoZW4gQy4gVHdlZWRpZSA8c2N0QHJlZGhhdC5jb20+LCAyMDAwCiAgKgogICogQ29weXJpZ2h0IDIwMDAgUmVkIEhhdCBjb3JwIC0tLSBBbGwgUmlnaHRzIFJlc2VydmVkCkBAIC0xNSwxMCArMTUsMTAgQEAKICAqIFJldm9rZSBpcyB0aGUgbWVjaGFuaXNtIHVzZWQgdG8gcHJldmVudCBvbGQgbG9nIHJlY29yZHMgZm9yIGRlbGV0ZWQKICAqIG1ldGFkYXRhIGZyb20gYmVpbmcgcmVwbGF5ZWQgb24gdG9wIG9mIG5ld2VyIGRhdGEgdXNpbmcgdGhlIHNhbWUKICAqIGJsb2Nrcy4gIFRoZSByZXZva2UgbWVjaGFuaXNtIGlzIHVzZWQgaW4gdHdvIHNlcGFyYXRlIHBsYWNlczoKLSAqIAorICoKICAqICsgQ29tbWl0OiBkdXJpbmcgY29tbWl0IHdlIHdyaXRlIHRoZSBlbnRpcmUgbGlzdCBvZiB0aGUgY3VycmVudAogICogICB0cmFuc2FjdGlvbidzIHJldm9rZWQgYmxvY2tzIHRvIHRoZSBqb3VybmFsCi0gKiAKKyAqCiAgKiArIFJlY292ZXJ5OiBkdXJpbmcgcmVjb3Zlcnkgd2UgcmVjb3JkIHRoZSB0cmFuc2FjdGlvbiBJRCBvZiBhbGwKICAqICAgcmV2b2tlZCBibG9ja3MuICBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgcmV2b2tlIHJlY29yZHMgaW4gdGhlIGxvZwogICogICBmb3IgYSBzaW5nbGUgYmxvY2ssIG9ubHkgdGhlIGxhc3Qgb25lIGNvdW50cywgYW5kIGlmIHRoZXJlIGlzIGEgbG9nCkBAIC0yOSw3ICsyOSw3IEBACiAgKiBzaW5nbGUgdHJhbnNhY3Rpb246CiAgKgogICogQmxvY2sgaXMgcmV2b2tlZCBhbmQgdGhlbiBqb3VybmFsZWQ6Ci0gKiAgIFRoZSBkZXNpcmVkIGVuZCByZXN1bHQgaXMgdGhlIGpvdXJuYWxpbmcgb2YgdGhlIG5ldyBibG9jaywgc28gd2UgCisgKiAgIFRoZSBkZXNpcmVkIGVuZCByZXN1bHQgaXMgdGhlIGpvdXJuYWxpbmcgb2YgdGhlIG5ldyBibG9jaywgc28gd2UKICAqICAgY2FuY2VsIHRoZSByZXZva2UgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBjb21taXRzLgogICoKICAqIEJsb2NrIGlzIGpvdXJuYWxlZCBhbmQgdGhlbiByZXZva2VkOgpAQCAtNDEsNyArNDEsNyBAQAogICogICB0cmFuc2FjdGlvbiBtdXN0IGhhdmUgaGFwcGVuZWQgYWZ0ZXIgdGhlIGJsb2NrIHdhcyBqb3VybmFsZWQgYW5kIHNvCiAgKiAgIHRoZSByZXZva2UgbXVzdCB0YWtlIHByZWNlZGVuY2UuCiAgKgotICogQmxvY2sgaXMgcmV2b2tlZCBhbmQgdGhlbiB3cml0dGVuIGFzIGRhdGE6IAorICogQmxvY2sgaXMgcmV2b2tlZCBhbmQgdGhlbiB3cml0dGVuIGFzIGRhdGE6CiAgKiAgIFRoZSBkYXRhIHdyaXRlIGlzIGFsbG93ZWQgdG8gc3VjY2VlZCwgYnV0IHRoZSByZXZva2UgaXMgX25vdF8KICAqICAgY2FuY2VsbGVkLiAgV2Ugc3RpbGwgbmVlZCB0byBwcmV2ZW50IG9sZCBsb2cgcmVjb3JkcyBmcm9tCiAgKiAgIG92ZXJ3cml0aW5nIHRoZSBuZXcgZGF0YS4gIFdlIGRvbid0IGV2ZW4gbmVlZCB0byBjbGVhciB0aGUgcmV2b2tlCkBAIC01NCw3ICs1NCw3IEBACiAgKgkJCWJ1ZmZlciBoYXMgbm90IGJlZW4gcmV2b2tlZCwgYW5kIGNhbmNlbF9yZXZva2UKICAqCQkJbmVlZCBkbyBub3RoaW5nLgogICogUmV2b2tlVmFsaWQgc2V0LCBSZXZva2VkIHNldDoKLSAqCQkJYnVmZmVyIGhhcyBiZWVuIHJldm9rZWQuICAKKyAqCQkJYnVmZmVyIGhhcyBiZWVuIHJldm9rZWQuCiAgKi8KIAogI2lmbmRlZiBfX0tFUk5FTF9fCkBAIC03Nyw3ICs3Nyw3IEBACiAgICBqb3VybmFsIHJlcGxheSwgdGhpcyBpbnZvbHZlcyByZWNvcmRpbmcgdGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZQogICAgbGFzdCB0cmFuc2FjdGlvbiB0byByZXZva2UgdGhpcyBibG9jay4gKi8KIAotc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgCitzdHJ1Y3QgamJkX3Jldm9rZV9yZWNvcmRfcwogewogCXN0cnVjdCBsaXN0X2hlYWQgIGhhc2g7CiAJdGlkX3QJCSAgc2VxdWVuY2U7CS8qIFVzZWQgZm9yIHJlY292ZXJ5IG9ubHkgKi8KQEAgLTkwLDggKzkwLDggQEAKIHsKIAkvKiBJdCBpcyBjb25jZWl2YWJsZSB0aGF0IHdlIG1pZ2h0IHdhbnQgYSBsYXJnZXIgaGFzaCB0YWJsZQogCSAqIGZvciByZWNvdmVyeS4gIE11c3QgYmUgYSBwb3dlciBvZiB0d28uICovCi0JaW50CQkgIGhhc2hfc2l6ZTsgCi0JaW50CQkgIGhhc2hfc2hpZnQ7IAorCWludAkJICBoYXNoX3NpemU7CisJaW50CQkgIGhhc2hfc2hpZnQ7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGFzaF90YWJsZTsKIH07CiAKQEAgLTMwMSwyMiArMzAxLDIyIEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLS8qIAorLyoKICAqIGpvdXJuYWxfcmV2b2tlOiByZXZva2UgYSBnaXZlbiBidWZmZXJfaGVhZCBmcm9tIHRoZSBqb3VybmFsLiAgVGhpcwogICogcHJldmVudHMgdGhlIGJsb2NrIGZyb20gYmVpbmcgcmVwbGF5ZWQgZHVyaW5nIHJlY292ZXJ5IGlmIHdlIHRha2UgYQogICogY3Jhc2ggYWZ0ZXIgdGhpcyBjdXJyZW50IHRyYW5zYWN0aW9uIGNvbW1pdHMuICBBbnkgc3Vic2VxdWVudAogICogbWV0YWRhdGEgd3JpdGVzIG9mIHRoZSBidWZmZXIgaW4gdGhpcyB0cmFuc2FjdGlvbiBjYW5jZWwgdGhlCi0gKiByZXZva2UuICAKKyAqIHJldm9rZS4KICAqCiAgKiBOb3RlIHRoYXQgdGhpcyBjYWxsIG1heSBibG9jayAtLS0gaXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBtYWtlCiAgKiBzdXJlIHRoYXQgdGhlcmUgYXJlIG5vIGZ1cnRoZXIgY2FsbHMgdG8gam91cm5hbF93cml0ZV9tZXRhZGF0YQogICogYmVmb3JlIHRoZSByZXZva2UgaXMgY29tcGxldGUuICBJbiBleHQzLCB0aGlzIGltcGxpZXMgY2FsbGluZyB0aGUKICAqIHJldm9rZSBiZWZvcmUgY2xlYXJpbmcgdGhlIGJsb2NrIGJpdG1hcCB3aGVuIHdlIGFyZSBkZWxldGluZwotICogbWV0YWRhdGEuIAorICogbWV0YWRhdGEuCiAgKgogICogUmV2b2tlIHBlcmZvcm1zIGEgam91cm5hbF9mb3JnZXQgb24gYW55IGJ1ZmZlcl9oZWFkIHBhc3NlZCBpbiBhcyBhCiAgKiBwYXJhbWV0ZXIsIGJ1dCBkb2VzIF9ub3RfIGZvcmdldCB0aGUgYnVmZmVyX2hlYWQgaWYgdGhlIGJoIHdhcyBvbmx5Ci0gKiBmb3VuZCBpbXBsaWNpdGx5LiAKKyAqIGZvdW5kIGltcGxpY2l0bHkuCiAgKgogICogYmhfaW4gbWF5IG5vdCBiZSBhIGpvdXJuYWxsZWQgYnVmZmVyIC0gaXQgbWF5IGhhdmUgY29tZSBvZmYKICAqIHRoZSBoYXNoIHRhYmxlcyB3aXRob3V0IGFuIGF0dGFjaGVkIGpvdXJuYWxfaGVhZC4KQEAgLTMyNSw3ICszMjUsNyBAQAogICogYnkgb25lLgogICovCiAKLWludCBqb3VybmFsX3Jldm9rZShoYW5kbGVfdCAqaGFuZGxlLCB1bnNpZ25lZCBsb25nIGJsb2NrbnIsIAoraW50IGpvdXJuYWxfcmV2b2tlKGhhbmRsZV90ICpoYW5kbGUsIHVuc2lnbmVkIGxvbmcgYmxvY2tuciwKIAkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9pbikKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKQEAgLTQ4Nyw3ICs0ODcsNyBAQAogCWVsc2UKIAkJam91cm5hbC0+al9yZXZva2UgPSBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXTsKIAotCWZvciAoaSA9IDA7IGkgPCBqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaXplOyBpKyspIAorCWZvciAoaSA9IDA7IGkgPCBqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaXplOyBpKyspCiAJCUlOSVRfTElTVF9IRUFEKCZqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF90YWJsZVtpXSk7CiB9CiAKQEAgLTQ5OCw3ICs0OTgsNyBAQAogICogQ2FsbGVkIHdpdGggdGhlIGpvdXJuYWwgbG9jayBoZWxkLgogICovCiAKLXZvaWQgam91cm5hbF93cml0ZV9yZXZva2VfcmVjb3Jkcyhqb3VybmFsX3QgKmpvdXJuYWwsIAordm9pZCBqb3VybmFsX3dyaXRlX3Jldm9rZV9yZWNvcmRzKGpvdXJuYWxfdCAqam91cm5hbCwKIAkJCQkgIHRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uKQogewogCXN0cnVjdCBqb3VybmFsX2hlYWQgKmRlc2NyaXB0b3I7CkBAIC01MDcsNyArNTA3LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CiAJaW50IGksIG9mZnNldCwgY291bnQ7CiAKLQlkZXNjcmlwdG9yID0gTlVMTDsgCisJZGVzY3JpcHRvciA9IE5VTEw7CiAJb2Zmc2V0ID0gMDsKIAljb3VudCA9IDA7CiAKQEAgLTUxOSwxMCArNTE5LDEwIEBACiAJCWhhc2hfbGlzdCA9ICZyZXZva2UtPmhhc2hfdGFibGVbaV07CiAKIAkJd2hpbGUgKCFsaXN0X2VtcHR5KGhhc2hfbGlzdCkpIHsKLQkJCXJlY29yZCA9IChzdHJ1Y3QgamJkX3Jldm9rZV9yZWNvcmRfcyAqKSAKKwkJCXJlY29yZCA9IChzdHJ1Y3QgamJkX3Jldm9rZV9yZWNvcmRfcyAqKQogCQkJCWhhc2hfbGlzdC0+bmV4dDsKIAkJCXdyaXRlX29uZV9yZXZva2VfcmVjb3JkKGpvdXJuYWwsIHRyYW5zYWN0aW9uLAotCQkJCQkJJmRlc2NyaXB0b3IsICZvZmZzZXQsIAorCQkJCQkJJmRlc2NyaXB0b3IsICZvZmZzZXQsCiAJCQkJCQlyZWNvcmQpOwogCQkJY291bnQrKzsKIAkJCWxpc3RfZGVsKCZyZWNvcmQtPmhhc2gpOwpAQCAtNTM0LDE0ICs1MzQsMTQgQEAKIAlqYmRfZGVidWcoMSwgIldyb3RlICVkIHJldm9rZSByZWNvcmRzXG4iLCBjb3VudCk7CiB9CiAKLS8qIAorLyoKICAqIFdyaXRlIG91dCBvbmUgcmV2b2tlIHJlY29yZC4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IKLSAqIGJsb2NrIGlmIHRoZSBvbGQgb25lIGlzIGZ1bGwgb3IgaWYgd2UgaGF2ZSBub3QgYWxyZWFkeSBjcmVhdGVkIG9uZS4gIAorICogYmxvY2sgaWYgdGhlIG9sZCBvbmUgaXMgZnVsbCBvciBpZiB3ZSBoYXZlIG5vdCBhbHJlYWR5IGNyZWF0ZWQgb25lLgogICovCiAKLXN0YXRpYyB2b2lkIHdyaXRlX29uZV9yZXZva2VfcmVjb3JkKGpvdXJuYWxfdCAqam91cm5hbCwgCitzdGF0aWMgdm9pZCB3cml0ZV9vbmVfcmV2b2tlX3JlY29yZChqb3VybmFsX3QgKmpvdXJuYWwsCiAJCQkJICAgIHRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uLAotCQkJCSAgICBzdHJ1Y3Qgam91cm5hbF9oZWFkICoqZGVzY3JpcHRvcnAsIAorCQkJCSAgICBzdHJ1Y3Qgam91cm5hbF9oZWFkICoqZGVzY3JpcHRvcnAsCiAJCQkJICAgIGludCAqb2Zmc2V0cCwKIAkJCQkgICAgc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKnJlY29yZCkKIHsKQEAgLTU4NCwyMSArNTg0LDIxIEBACiAJCSpkZXNjcmlwdG9ycCA9IGRlc2NyaXB0b3I7CiAJfQogCi0JKiAoKF9fYmUzMiAqKSgmamgyYmgoZGVzY3JpcHRvciktPmJfZGF0YVtvZmZzZXRdKSkgPSAKKwkqICgoX19iZTMyICopKCZqaDJiaChkZXNjcmlwdG9yKS0+Yl9kYXRhW29mZnNldF0pKSA9CiAJCWNwdV90b19iZTMyKHJlY29yZC0+YmxvY2tucik7CiAJb2Zmc2V0ICs9IDQ7CiAJKm9mZnNldHAgPSBvZmZzZXQ7CiB9CiAKLS8qIAorLyoKICAqIEZsdXNoIGEgcmV2b2tlIGRlc2NyaXB0b3Igb3V0IHRvIHRoZSBqb3VybmFsLiAgSWYgd2UgYXJlIGFib3J0aW5nLAogICogdGhpcyBpcyBhIG5vb3A7IG90aGVyd2lzZSB3ZSBhcmUgZ2VuZXJhdGluZyBhIGJ1ZmZlciB3aGljaCBuZWVkcyB0bwogICogYmUgd2FpdGVkIGZvciBkdXJpbmcgY29tbWl0LCBzbyBpdCBoYXMgdG8gZ28gb250byB0aGUgYXBwcm9wcmlhdGUKICAqIGpvdXJuYWwgYnVmZmVyIGxpc3QuCiAgKi8KIAotc3RhdGljIHZvaWQgZmx1c2hfZGVzY3JpcHRvcihqb3VybmFsX3QgKmpvdXJuYWwsIAotCQkJICAgICBzdHJ1Y3Qgam91cm5hbF9oZWFkICpkZXNjcmlwdG9yLCAKK3N0YXRpYyB2b2lkIGZsdXNoX2Rlc2NyaXB0b3Ioam91cm5hbF90ICpqb3VybmFsLAorCQkJICAgICBzdHJ1Y3Qgam91cm5hbF9oZWFkICpkZXNjcmlwdG9yLAogCQkJICAgICBpbnQgb2Zmc2V0KQogewogCWpvdXJuYWxfcmV2b2tlX2hlYWRlcl90ICpoZWFkZXI7CkBAIC02MTgsNyArNjE4LDcgQEAKIH0KICNlbmRpZgogCi0vKiAKKy8qCiAgKiBSZXZva2Ugc3VwcG9ydCBmb3IgcmVjb3ZlcnkuCiAgKgogICogUmVjb3ZlcnkgbmVlZHMgdG8gYmUgYWJsZSB0bzoKQEAgLTYyOSw3ICs2MjksNyBAQAogICogIGNoZWNrIHdoZXRoZXIgYSBnaXZlbiBibG9jayBpbiBhIGdpdmVuIHRyYW5zYWN0aW9uIHNob3VsZCBiZSByZXBsYXllZAogICogIChpZS4gaGFzIG5vdCBiZWVuIHJldm9rZWQgYnkgYSByZXZva2UgcmVjb3JkIGluIHRoYXQgb3IgYSBzdWJzZXF1ZW50CiAgKiAgdHJhbnNhY3Rpb24pCi0gKiAKKyAqCiAgKiAgZW1wdHkgdGhlIHJldm9rZSB0YWJsZSBhZnRlciByZWNvdmVyeS4KICAqLwogCkBAIC02MzcsMTEgKzYzNywxMSBAQAogICogRmlyc3QsIHNldHRpbmcgcmV2b2tlIHJlY29yZHMuICBXZSBjcmVhdGUgYSBuZXcgcmV2b2tlIHJlY29yZCBmb3IKICAqIGV2ZXJ5IGJsb2NrIGV2ZXIgcmV2b2tlZCBpbiB0aGUgbG9nIGFzIHdlIHNjYW4gaXQgZm9yIHJlY292ZXJ5LCBhbmQKICAqIHdlIHVwZGF0ZSB0aGUgZXhpc3RpbmcgcmVjb3JkcyBpZiB3ZSBmaW5kIG11bHRpcGxlIHJldm9rZXMgZm9yIGEKLSAqIHNpbmdsZSBibG9jay4gCisgKiBzaW5nbGUgYmxvY2suCiAgKi8KIAotaW50IGpvdXJuYWxfc2V0X3Jldm9rZShqb3VybmFsX3QgKmpvdXJuYWwsIAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBibG9ja25yLCAKK2ludCBqb3VybmFsX3NldF9yZXZva2Uoam91cm5hbF90ICpqb3VybmFsLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBibG9ja25yLAogCQkgICAgICAgdGlkX3Qgc2VxdWVuY2UpCiB7CiAJc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKnJlY29yZDsKQEAgLTY1MywxOCArNjUzLDE4IEBACiAJCWlmICh0aWRfZ3Qoc2VxdWVuY2UsIHJlY29yZC0+c2VxdWVuY2UpKQogCQkJcmVjb3JkLT5zZXF1ZW5jZSA9IHNlcXVlbmNlOwogCQlyZXR1cm4gMDsKLQl9IAorCX0KIAlyZXR1cm4gaW5zZXJ0X3Jldm9rZV9oYXNoKGpvdXJuYWwsIGJsb2NrbnIsIHNlcXVlbmNlKTsKIH0KIAotLyogCisvKgogICogVGVzdCByZXZva2UgcmVjb3Jkcy4gIEZvciBhIGdpdmVuIGJsb2NrIHJlZmVyZW5jZWQgaW4gdGhlIGxvZywgaGFzCiAgKiB0aGF0IGJsb2NrIGJlZW4gcmV2b2tlZD8gIEEgcmV2b2tlIHJlY29yZCB3aXRoIGEgZ2l2ZW4gdHJhbnNhY3Rpb24KICAqIHNlcXVlbmNlIG51bWJlciByZXZva2VzIGFsbCBibG9ja3MgaW4gdGhhdCB0cmFuc2FjdGlvbiBhbmQgZWFybGllcgogICogb25lcywgYnV0IGxhdGVyIHRyYW5zYWN0aW9ucyBzdGlsbCBuZWVkIHJlcGxheWVkLgogICovCiAKLWludCBqb3VybmFsX3Rlc3RfcmV2b2tlKGpvdXJuYWxfdCAqam91cm5hbCwgCitpbnQgam91cm5hbF90ZXN0X3Jldm9rZShqb3VybmFsX3QgKmpvdXJuYWwsCiAJCQl1bnNpZ25lZCBsb25nIGJsb2NrbnIsCiAJCQl0aWRfdCBzZXF1ZW5jZSkKIHsKZGlmZiAtLWdpdCBhL2ZzL2piZC90cmFuc2FjdGlvbi5jIGIvZnMvamJkL3RyYW5zYWN0aW9uLmMKaW5kZXggZjUxNjlhOS4uZTFiM2M4YSAxMDA2NDQKLS0tIGEvZnMvamJkL3RyYW5zYWN0aW9uLmMKKysrIGIvZnMvamJkL3RyYW5zYWN0aW9uLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogbGludXgvZnMvdHJhbnNhY3Rpb24uYwotICogCisgKgogICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPiwgMTk5OAogICoKICAqIENvcHlyaWdodCAxOTk4IFJlZCBIYXQgY29ycCAtLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZApAQCAtMTAsNyArMTAsNyBAQAogICogb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCiAgKgogICogR2VuZXJpYyBmaWxlc3lzdGVtIHRyYW5zYWN0aW9uIGhhbmRsaW5nIGNvZGU7IHBhcnQgb2YgdGhlIGV4dDJmcwotICogam91cm5hbGluZyBzeXN0ZW0uICAKKyAqIGpvdXJuYWxpbmcgc3lzdGVtLgogICoKICAqIFRoaXMgZmlsZSBtYW5hZ2VzIHRyYW5zYWN0aW9ucyAoY29tcG91bmQgY29tbWl0cyBtYW5hZ2VkIGJ5IHRoZQogICogam91cm5hbGluZyBjb2RlKSBhbmQgaGFuZGxlcyAoaW5kaXZpZHVhbCBhdG9taWMgb3BlcmF0aW9ucyBieSB0aGUKQEAgLTc0LDcgKzc0LDcgQEAKICAqIHN0YXJ0X3RoaXNfaGFuZGxlOiBHaXZlbiBhIGhhbmRsZSwgZGVhbCB3aXRoIGFueSBsb2NraW5nIG9yIHN0YWxsaW5nCiAgKiBuZWVkZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgZW5vdWdoIGpvdXJuYWwgc3BhY2UgZm9yIHRoZSBoYW5kbGUKICAqIHRvIGJlZ2luLiAgQXR0YWNoIHRoZSBoYW5kbGUgdG8gYSB0cmFuc2FjdGlvbiBhbmQgc2V0IHVwIHRoZQotICogdHJhbnNhY3Rpb24ncyBidWZmZXIgY3JlZGl0cy4gIAorICogdHJhbnNhY3Rpb24ncyBidWZmZXIgY3JlZGl0cy4KICAqLwogCiBzdGF0aWMgaW50IHN0YXJ0X3RoaXNfaGFuZGxlKGpvdXJuYWxfdCAqam91cm5hbCwgaGFuZGxlX3QgKmhhbmRsZSkKQEAgLTExNyw3ICsxMTcsNyBAQAogCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkgfHwKIAkgICAgKGpvdXJuYWwtPmpfZXJybm8gIT0gMCAmJiAhKGpvdXJuYWwtPmpfZmxhZ3MgJiBKRlNfQUNLX0VSUikpKSB7CiAJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwotCQlyZXQgPSAtRVJPRlM7IAorCQlyZXQgPSAtRVJPRlM7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMTgyLDcgKzE4Miw3IEBACiAJCWdvdG8gcmVwZWF0OwogCX0KIAotCS8qIAorCS8qCiAJICogVGhlIGNvbW1pdCBjb2RlIGFzc3VtZXMgdGhhdCBpdCBjYW4gZ2V0IGVub3VnaCBsb2cgc3BhY2UKIAkgKiB3aXRob3V0IGZvcmNpbmcgYSBjaGVja3BvaW50LiAgVGhpcyBpcyAqY3JpdGljYWwqIGZvcgogCSAqIGNvcnJlY3RuZXNzOiBhIGNoZWNrcG9pbnQgb2YgYSBidWZmZXIgd2hpY2ggaXMgYWxzbwpAQCAtMTkxLDcgKzE5MSw3IEBACiAJICoKIAkgKiBXZSBtdXN0IHRoZXJlZm9yZSBlbnN1cmUgdGhlIG5lY2Vzc2FyeSBzcGFjZSBpbiB0aGUgam91cm5hbAogCSAqICpiZWZvcmUqIHN0YXJ0aW5nIHRvIGRpcnR5IHBvdGVudGlhbGx5IGNoZWNrcG9pbnRlZCBidWZmZXJzCi0JICogaW4gdGhlIG5ldyB0cmFuc2FjdGlvbi4gCisJICogaW4gdGhlIG5ldyB0cmFuc2FjdGlvbi4KIAkgKgogCSAqIFRoZSB3b3JzdCBwYXJ0IGlzLCBhbnkgdHJhbnNhY3Rpb24gY3VycmVudGx5IGNvbW1pdHRpbmcgY2FuCiAJICogcmVkdWNlIHRoZSBmcmVlIHNwYWNlIGFyYml0cmFyaWx5LiAgQmUgY2FyZWZ1bCB0byBhY2NvdW50IGZvcgpAQCAtMjQ2LDEzICsyNDYsMTMgQEAKIH0KIAogLyoqCi0gKiBoYW5kbGVfdCAqam91cm5hbF9zdGFydCgpIC0gT2J0YWluIGEgbmV3IGhhbmRsZS4gIAorICogaGFuZGxlX3QgKmpvdXJuYWxfc3RhcnQoKSAtIE9idGFpbiBhIG5ldyBoYW5kbGUuCiAgKiBAam91cm5hbDogSm91cm5hbCB0byBzdGFydCB0cmFuc2FjdGlvbiBvbi4KICAqIEBuYmxvY2tzOiBudW1iZXIgb2YgYmxvY2sgYnVmZmVyIHdlIG1pZ2h0IG1vZGlmeQogICoKICAqIFdlIG1ha2Ugc3VyZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBjYW4gZ3VhcmFudGVlIGF0IGxlYXN0IG5ibG9ja3Mgb2YKICAqIG1vZGlmaWVkIGJ1ZmZlcnMgaW4gdGhlIGxvZy4gIFdlIGJsb2NrIHVudGlsIHRoZSBsb2cgY2FuIGd1YXJhbnRlZQotICogdGhhdCBtdWNoIHNwYWNlLiAgCisgKiB0aGF0IG11Y2ggc3BhY2UuCiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyB2aXNpYmxlIHRvIGpvdXJuYWwgdXNlcnMgKGxpa2UgZXh0M2ZzKSwgc28gaXMgbm90CiAgKiBjYWxsZWQgd2l0aCB0aGUgam91cm5hbCBhbHJlYWR5IGxvY2tlZC4KQEAgLTI5MiwxMSArMjkyLDExIEBACiAgKiBpbnQgam91cm5hbF9leHRlbmQoKSAtIGV4dGVuZCBidWZmZXIgY3JlZGl0cy4KICAqIEBoYW5kbGU6ICBoYW5kbGUgdG8gJ2V4dGVuZCcKICAqIEBuYmxvY2tzOiBuciBibG9ja3MgdG8gdHJ5IHRvIGV4dGVuZCBieS4KLSAqIAorICoKICAqIFNvbWUgdHJhbnNhY3Rpb25zLCBzdWNoIGFzIGxhcmdlIGV4dGVuZHMgYW5kIHRydW5jYXRlcywgY2FuIGJlIGRvbmUKICAqIGF0b21pY2FsbHkgYWxsIGF0IG9uY2Ugb3IgaW4gc2V2ZXJhbCBzdGFnZXMuICBUaGUgb3BlcmF0aW9uIHJlcXVlc3RzCiAgKiBhIGNyZWRpdCBmb3IgYSBudW1iZXIgb2YgYnVmZmVyIG1vZGljYXRpb25zIGluIGFkdmFuY2UsIGJ1dCBjYW4KLSAqIGV4dGVuZCBpdHMgY3JlZGl0IGlmIGl0IG5lZWRzIG1vcmUuICAKKyAqIGV4dGVuZCBpdHMgY3JlZGl0IGlmIGl0IG5lZWRzIG1vcmUuCiAgKgogICogam91cm5hbF9leHRlbmQgdHJpZXMgdG8gZ2l2ZSB0aGUgcnVubmluZyBoYW5kbGUgbW9yZSBidWZmZXIgY3JlZGl0cy4KICAqIEl0IGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IGFsbG9jYXRpb24gLSB0aGlzIGlzIGEgYmVzdC1lZmZvcnQgb25seS4KQEAgLTM2Myw3ICszNjMsNyBAQAogICogaW50IGpvdXJuYWxfcmVzdGFydCgpIC0gcmVzdGFydCBhIGhhbmRsZSAuCiAgKiBAaGFuZGxlOiAgaGFuZGxlIHRvIHJlc3RhcnQKICAqIEBuYmxvY2tzOiBuciBjcmVkaXRzIHJlcXVlc3RlZAotICogCisgKgogICogUmVzdGFydCBhIGhhbmRsZSBmb3IgYSBtdWx0aS10cmFuc2FjdGlvbiBmaWxlc3lzdGVtCiAgKiBvcGVyYXRpb24uCiAgKgpAQCAtNDYyLDcgKzQ2Miw3IEBACiAvKioKICAqIHZvaWQgam91cm5hbF91bmxvY2tfdXBkYXRlcyAoam91cm5hbF90KiBqb3VybmFsKSAtIHJlbGVhc2UgYmFycmllcgogICogQGpvdXJuYWw6ICBKb3VybmFsIHRvIHJlbGVhc2UgdGhlIGJhcnJpZXIgb24uCi0gKiAKKyAqCiAgKiBSZWxlYXNlIGEgdHJhbnNhY3Rpb24gYmFycmllciBvYnRhaW5lZCB3aXRoIGpvdXJuYWxfbG9ja191cGRhdGVzKCkuCiAgKgogICogU2hvdWxkIGJlIGNhbGxlZCB3aXRob3V0IHRoZSBqb3VybmFsIGxvY2sgaGVsZC4KQEAgLTU0Nyw4ICs1NDcsOCBAQAogCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKIAogCS8qIFdlIG5vdyBob2xkIHRoZSBidWZmZXIgbG9jayBzbyBpdCBpcyBzYWZlIHRvIHF1ZXJ5IHRoZSBidWZmZXIKLQkgKiBzdGF0ZS4gIElzIHRoZSBidWZmZXIgZGlydHk/IAotCSAqIAorCSAqIHN0YXRlLiAgSXMgdGhlIGJ1ZmZlciBkaXJ0eT8KKwkgKgogCSAqIElmIHNvLCB0aGVyZSBhcmUgdHdvIHBvc3NpYmlsaXRpZXMuICBUaGUgYnVmZmVyIG1heSBiZQogCSAqIG5vbi1qb3VybmFsZWQsIGFuZCB1bmRlcmdvaW5nIGEgcXVpdGUgbGVnaXRpbWF0ZSB3cml0ZWJhY2suCiAJICogT3RoZXJ3aXNlLCBpdCBpcyBqb3VybmFsZWQsIGFuZCB3ZSBkb24ndCBleHBlY3QgZGlydHkgYnVmZmVycwpAQCAtNTY2LDcgKzU2Niw3IEBACiAJCSAqLwogCQlpZiAoamgtPmJfdHJhbnNhY3Rpb24pIHsKIAkJCUpfQVNTRVJUX0pIKGpoLAotCQkJCWpoLT5iX3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uIHx8IAorCQkJCWpoLT5iX3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uIHx8CiAJCQkJamgtPmJfdHJhbnNhY3Rpb24gPT0KIAkJCQkJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKTsKIAkJCWlmIChqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uKQpAQCAtNTgwLDcgKzU4MCw3IEBACiAJCSAqLwogCQlKQlVGRkVSX1RSQUNFKGpoLCAiVW5leHBlY3RlZCBkaXJ0eSBidWZmZXIiKTsKIAkJamJkX3VuZXhwZWN0ZWRfZGlydHlfYnVmZmVyKGpoKTsKLSAJfQorCX0KIAogCXVubG9ja19idWZmZXIoYmgpOwogCkBAIC02NTMsNyArNjUzLDcgQEAKIAkJICogYnVmZmVyIGhhZCBiZXR0ZXIgcmVtYWluIGxvY2tlZCBkdXJpbmcgdGhlIGttYWxsb2MsCiAJCSAqIGJ1dCB0aGF0IHNob3VsZCBiZSB0cnVlIC0tLSB3ZSBob2xkIHRoZSBqb3VybmFsIGxvY2sKIAkJICogc3RpbGwgYW5kIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBvbiB0aGUgQlVGX0pPVVJOQUwKLQkJICogbGlzdCBzbyB3b24ndCBiZSBmbHVzaGVkLiAKKwkJICogbGlzdCBzbyB3b24ndCBiZSBmbHVzaGVkLgogCQkgKgogCQkgKiBTdWJ0bGUgcG9pbnQsIHRob3VnaDogaWYgdGhpcyBpcyBhIGdldF91bmRvX2FjY2VzcywKIAkJICogdGhlbiB3ZSB3aWxsIGJlIHJlbHlpbmcgb24gdGhlIGZyb3plbl9kYXRhIHRvIGNvbnRhaW4KQEAgLTc2NSw4ICs3NjUsOCBAQAogICogbWFudWFsbHkgcmF0aGVyIHRoYW4gcmVhZGluZyBvZmYgZGlzayksIHRoZW4gd2UgbmVlZCB0byBrZWVwIHRoZQogICogYnVmZmVyX2hlYWQgbG9ja2VkIHVudGlsIGl0IGhhcyBiZWVuIGNvbXBsZXRlbHkgZmlsbGVkIHdpdGggbmV3CiAgKiBkYXRhLiAgSW4gdGhpcyBjYXNlLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBtYWtlIHRoZSBhc3NlcnRpb24gdGhhdAotICogdGhlIGJoIGlzIG5vdCBhbHJlYWR5IHBhcnQgb2YgYW4gZXhpc3RpbmcgdHJhbnNhY3Rpb24uICAKLSAqIAorICogdGhlIGJoIGlzIG5vdCBhbHJlYWR5IHBhcnQgb2YgYW4gZXhpc3RpbmcgdHJhbnNhY3Rpb24uCisgKgogICogVGhlIGJ1ZmZlciBzaG91bGQgYWxyZWFkeSBiZSBsb2NrZWQgYnkgdGhlIGNhbGxlciBieSB0aGlzIHBvaW50LgogICogVGhlcmUgaXMgbm8gbG9jayByYW5raW5nIHZpb2xhdGlvbjogaXQgd2FzIGEgbmV3bHkgY3JlYXRlZCwKICAqIHVubG9ja2VkIGJ1ZmZlciBiZWZvcmVoYW5kLiAqLwpAQCAtNzc4LDcgKzc3OCw3IEBACiAgKgogICogQ2FsbCB0aGlzIGlmIHlvdSBjcmVhdGUgYSBuZXcgYmguCiAgKi8KLWludCBqb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIAoraW50IGpvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbiA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbjsKIAlqb3VybmFsX3QgKmpvdXJuYWwgPSB0cmFuc2FjdGlvbi0+dF9qb3VybmFsOwpAQCAtODQ3LDEzICs4NDcsMTMgQEAKICAqIGRvIG5vdCByZXVzZSBmcmVlZCBzcGFjZSB1bnRpbCB0aGUgZGVhbGxvY2F0aW9uIGhhcyBiZWVuIGNvbW1pdHRlZCwKICAqIHNpbmNlIGlmIHdlIG92ZXJ3cm90ZSB0aGF0IHNwYWNlIHdlIHdvdWxkIG1ha2UgdGhlIGRlbGV0ZQogICogdW4tcmV3aW5kYWJsZSBpbiBjYXNlIG9mIGEgY3Jhc2guCi0gKiAKKyAqCiAgKiBUbyBkZWFsIHdpdGggdGhhdCwgam91cm5hbF9nZXRfdW5kb19hY2Nlc3MgcmVxdWVzdHMgd3JpdGUgYWNjZXNzIHRvIGEKICAqIGJ1ZmZlciBmb3IgcGFydHMgb2Ygbm9uLXJld2luZGFibGUgb3BlcmF0aW9ucyBzdWNoIGFzIGRlbGV0ZQogICogb3BlcmF0aW9ucyBvbiB0aGUgYml0bWFwcy4gIFRoZSBqb3VybmFsaW5nIGNvZGUgbXVzdCBrZWVwIGEgY29weSBvZgogICogdGhlIGJ1ZmZlcidzIGNvbnRlbnRzIHByaW9yIHRvIHRoZSB1bmRvX2FjY2VzcyBjYWxsIHVudGlsIHN1Y2ggdGltZQogICogYXMgd2Uga25vdyB0aGF0IHRoZSBidWZmZXIgaGFzIGRlZmluaXRlbHkgYmVlbiBjb21taXR0ZWQgdG8gZGlzay4KLSAqIAorICoKICAqIFdlIG5ldmVyIG5lZWQgdG8ga25vdyB3aGljaCB0cmFuc2FjdGlvbiB0aGUgY29tbWl0dGVkIGRhdGEgaXMgcGFydAogICogb2YsIGJ1ZmZlcnMgdG91Y2hlZCBoZXJlIGFyZSBndWFyYW50ZWVkIHRvIGJlIGRpcnRpZWQgbGF0ZXIgYW5kIHNvCiAgKiB3aWxsIGJlIGNvbW1pdHRlZCB0byBhIG5ldyB0cmFuc2FjdGlvbiBpbiBkdWUgY291cnNlLCBhdCB3aGljaCBwb2ludApAQCAtOTExLDEzICs5MTEsMTMgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKiogCisvKioKICAqIGludCBqb3VybmFsX2RpcnR5X2RhdGEoKSAtICBtYXJrIGEgYnVmZmVyIGFzIGNvbnRhaW5pbmcgZGlydHkgZGF0YSB3aGljaAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzIHRvIGJlIGZsdXNoZWQgYmVmb3JlIHdlIGNhbiBjb21taXQgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCB0cmFuc2FjdGlvbi4gIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgdHJhbnNhY3Rpb24uCiAgKiBAaGFuZGxlOiB0cmFuc2FjdGlvbgogICogQGJoOiBidWZmZXJoZWFkIHRvIG1hcmsKLSAqIAorICoKICAqIFRoZSBidWZmZXIgaXMgcGxhY2VkIG9uIHRoZSB0cmFuc2FjdGlvbidzIGRhdGEgbGlzdCBhbmQgaXMgbWFya2VkIGFzCiAgKiBiZWxvbmdpbmcgdG8gdGhlIHRyYW5zYWN0aW9uLgogICoKQEAgLTk0NiwxNSArOTQ2LDE1IEBACiAKIAkvKgogCSAqIFdoYXQgaWYgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IHBhcnQgb2YgYSBydW5uaW5nIHRyYW5zYWN0aW9uPwotCSAqIAorCSAqCiAJICogVGhlcmUgYXJlIHR3byBjYXNlczoKIAkgKiAxKSBJdCBpcyBwYXJ0IG9mIHRoZSBjdXJyZW50IHJ1bm5pbmcgdHJhbnNhY3Rpb24uICBSZWZpbGUgaXQsCiAJICogICAganVzdCBpbiBjYXNlIHdlIGhhdmUgYWxsb2NhdGVkIGl0IGFzIG1ldGFkYXRhLCBkZWFsbG9jYXRlZAotCSAqICAgIGl0LCB0aGVuIHJlYWxsb2NhdGVkIGl0IGFzIGRhdGEuIAorCSAqICAgIGl0LCB0aGVuIHJlYWxsb2NhdGVkIGl0IGFzIGRhdGEuCiAJICogMikgSXQgaXMgcGFydCBvZiB0aGUgcHJldmlvdXMsIHN0aWxsLWNvbW1pdHRpbmcgdHJhbnNhY3Rpb24uCiAJICogICAgSWYgYWxsIHdlIHdhbnQgdG8gZG8gaXMgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGJ1ZmZlciB3aWxsIGJlCiAJICogICAgd3JpdHRlbiB0byBkaXNrIGJlZm9yZSB0aGlzIG5ldyB0cmFuc2FjdGlvbiBjb21taXRzLCB0aGVuCi0JICogICAgYmVpbmcgc3VyZSB0aGF0IHRoZSAqcHJldmlvdXMqIHRyYW5zYWN0aW9uIGhhcyB0aGlzIHNhbWUgCisJICogICAgYmVpbmcgc3VyZSB0aGF0IHRoZSAqcHJldmlvdXMqIHRyYW5zYWN0aW9uIGhhcyB0aGlzIHNhbWUKIAkgKiAgICBwcm9wZXJ0eSBpcyBzdWZmaWNpZW50IGZvciB1cyEgIEp1c3QgbGVhdmUgaXQgb24gaXRzIG9sZAogCSAqICAgIHRyYW5zYWN0aW9uLgogCSAqCkBAIC0xMDc2LDE4ICsxMDc2LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qKiAKKy8qKgogICogaW50IGpvdXJuYWxfZGlydHlfbWV0YWRhdGEoKSAtICBtYXJrIGEgYnVmZmVyIGFzIGNvbnRhaW5pbmcgZGlydHkgbWV0YWRhdGEKICAqIEBoYW5kbGU6IHRyYW5zYWN0aW9uIHRvIGFkZCBidWZmZXIgdG8uCi0gKiBAYmg6IGJ1ZmZlciB0byBtYXJrIAotICogCisgKiBAYmg6IGJ1ZmZlciB0byBtYXJrCisgKgogICogbWFyayBkaXJ0eSBtZXRhZGF0YSB3aGljaCBuZWVkcyB0byBiZSBqb3VybmFsZWQgYXMgcGFydCBvZiB0aGUgY3VycmVudAogICogdHJhbnNhY3Rpb24uCiAgKgogICogVGhlIGJ1ZmZlciBpcyBwbGFjZWQgb24gdGhlIHRyYW5zYWN0aW9uJ3MgbWV0YWRhdGEgbGlzdCBhbmQgaXMgbWFya2VkCi0gKiBhcyBiZWxvbmdpbmcgdG8gdGhlIHRyYW5zYWN0aW9uLiAgCisgKiBhcyBiZWxvbmdpbmcgdG8gdGhlIHRyYW5zYWN0aW9uLgogICoKLSAqIFJldHVybnMgZXJyb3IgbnVtYmVyIG9yIDAgb24gc3VjY2Vzcy4gIAorICogUmV0dXJucyBlcnJvciBudW1iZXIgb3IgMCBvbiBzdWNjZXNzLgogICoKICAqIFNwZWNpYWwgY2FyZSBuZWVkcyB0byBiZSB0YWtlbiBpZiB0aGUgYnVmZmVyIGFscmVhZHkgYmVsb25ncyB0byB0aGUKICAqIGN1cnJlbnQgY29tbWl0dGluZyB0cmFuc2FjdGlvbiAoaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgaGF2ZSBmcm96ZW4KQEAgLTExMzUsMTEgKzExMzUsMTEgQEAKIAogCXNldF9idWZmZXJfamJkZGlydHkoYmgpOwogCi0JLyogCisJLyoKIAkgKiBNZXRhZGF0YSBhbHJlYWR5IG9uIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGxpc3QgZG9lc24ndAogCSAqIG5lZWQgdG8gYmUgZmlsZWQuICBNZXRhZGF0YSBvbiBhbm90aGVyIHRyYW5zYWN0aW9uJ3MgbGlzdCBtdXN0CiAJICogYmUgY29tbWl0dGluZywgYW5kIHdpbGwgYmUgcmVmaWxlZCBvbmNlIHRoZSBjb21taXQgY29tcGxldGVzOgotCSAqIGxlYXZlIGl0IGFsb25lIGZvciBub3cuIAorCSAqIGxlYXZlIGl0IGFsb25lIGZvciBub3cuCiAJICovCiAJaWYgKGpoLT5iX3RyYW5zYWN0aW9uICE9IHRyYW5zYWN0aW9uKSB7CiAJCUpCVUZGRVJfVFJBQ0UoamgsICJhbHJlYWR5IG9uIG90aGVyIHRyYW5zYWN0aW9uIik7CkBAIC0xMTY1LDcgKzExNjUsNyBAQAogCXJldHVybiAwOwogfQogCi0vKiAKKy8qCiAgKiBqb3VybmFsX3JlbGVhc2VfYnVmZmVyOiB1bmRvIGEgZ2V0X3dyaXRlX2FjY2VzcyB3aXRob3V0IGFueSBidWZmZXIKICAqIHVwZGF0ZXMsIGlmIHRoZSB1cGRhdGUgZGVjaWRlZCBpbiB0aGUgZW5kIHRoYXQgaXQgZGlkbid0IG5lZWQgYWNjZXNzLgogICoKQEAgLTExNzYsMjAgKzExNzYsMjAgQEAKIAlCVUZGRVJfVFJBQ0UoYmgsICJlbnRyeSIpOwogfQogCi0vKiogCisvKioKICAqIHZvaWQgam91cm5hbF9mb3JnZXQoKSAtIGJmb3JnZXQoKSBmb3IgcG90ZW50aWFsbHktam91cm5hbGVkIGJ1ZmZlcnMuCiAgKiBAaGFuZGxlOiB0cmFuc2FjdGlvbiBoYW5kbGUKICAqIEBiaDogICAgIGJoIHRvICdmb3JnZXQnCiAgKgogICogV2UgY2FuIG9ubHkgZG8gdGhlIGJmb3JnZXQgaWYgdGhlcmUgYXJlIG5vIGNvbW1pdHMgcGVuZGluZyBhZ2FpbnN0IHRoZQogICogYnVmZmVyLiAgSWYgdGhlIGJ1ZmZlciBpcyBkaXJ0eSBpbiB0aGUgY3VycmVudCBydW5uaW5nIHRyYW5zYWN0aW9uIHdlCi0gKiBjYW4gc2FmZWx5IHVubGluayBpdC4gCisgKiBjYW4gc2FmZWx5IHVubGluayBpdC4KICAqCiAgKiBiaCBtYXkgbm90IGJlIGEgam91cm5hbGxlZCBidWZmZXIgYXQgYWxsIC0gaXQgbWF5IGJlIGEgbm9uLUpCRAogICogYnVmZmVyIHdoaWNoIGNhbWUgb2ZmIHRoZSBoYXNodGFibGUuICBDaGVjayBmb3IgdGhpcy4KICAqCiAgKiBEZWNyZW1lbnRzIGJoLT5iX2NvdW50IGJ5IG9uZS4KLSAqIAorICoKICAqIEFsbG93IHRoaXMgY2FsbCBldmVuIGlmIHRoZSBoYW5kbGUgaGFzIGFib3J0ZWQgLS0tIGl0IG1heSBiZSBwYXJ0IG9mCiAgKiB0aGUgY2FsbGVyJ3MgY2xlYW51cCBhZnRlciBhbiBhYm9ydC4KICAqLwpAQCAtMTIzNyw3ICsxMjM3LDcgQEAKIAogCQlkcm9wX3Jlc2VydmUgPSAxOwogCi0JCS8qIAorCQkvKgogCQkgKiBXZSBhcmUgbm8gbG9uZ2VyIGdvaW5nIHRvIGpvdXJuYWwgdGhpcyBidWZmZXIuCiAJCSAqIEhvd2V2ZXIsIHRoZSBjb21taXQgb2YgdGhpcyB0cmFuc2FjdGlvbiBpcyBzdGlsbAogCQkgKiBpbXBvcnRhbnQgdG8gdGhlIGJ1ZmZlcjogdGhlIGRlbGV0ZSB0aGF0IHdlIGFyZSBub3cKQEAgLTEyNDYsNyArMTI0Niw3IEBACiAJCSAqCiAJCSAqIFNvLCBpZiB3ZSBoYXZlIGEgY2hlY2twb2ludCBvbiB0aGUgYnVmZmVyLCB3ZSBzaG91bGQKIAkJICogbm93IHJlZmlsZSB0aGUgYnVmZmVyIG9uIG91ciBCSl9Gb3JnZXQgbGlzdCBzbyB0aGF0Ci0JCSAqIHdlIGtub3cgdG8gcmVtb3ZlIHRoZSBjaGVja3BvaW50IGFmdGVyIHdlIGNvbW1pdC4gCisJCSAqIHdlIGtub3cgdG8gcmVtb3ZlIHRoZSBjaGVja3BvaW50IGFmdGVyIHdlIGNvbW1pdC4KIAkJICovCiAKIAkJaWYgKGpoLT5iX2NwX3RyYW5zYWN0aW9uKSB7CkBAIC0xMjY0LDcgKzEyNjQsNyBAQAogCQkJfQogCQl9CiAJfSBlbHNlIGlmIChqaC0+Yl90cmFuc2FjdGlvbikgewotCQlKX0FTU0VSVF9KSChqaCwgKGpoLT5iX3RyYW5zYWN0aW9uID09IAorCQlKX0FTU0VSVF9KSChqaCwgKGpoLT5iX3RyYW5zYWN0aW9uID09CiAJCQkJIGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbikpOwogCQkvKiBIb3dldmVyLCBpZiB0aGUgYnVmZmVyIGlzIHN0aWxsIG93bmVkIGJ5IGEgcHJpb3IKIAkJICogKGNvbW1pdHRpbmcpIHRyYW5zYWN0aW9uLCB3ZSBjYW4ndCBkcm9wIGl0IHlldC4uLiAqLwpAQCAtMTI5NCw3ICsxMjk0LDcgQEAKIC8qKgogICogaW50IGpvdXJuYWxfc3RvcCgpIC0gY29tcGxldGUgYSB0cmFuc2FjdGlvbgogICogQGhhbmRsZTogdHJhbmFjdGlvbiB0byBjb21wbGV0ZS4KLSAqIAorICoKICAqIEFsbCBkb25lIGZvciBhIHBhcnRpY3VsYXIgaGFuZGxlLgogICoKICAqIFRoZXJlIGlzIG5vdCBtdWNoIGFjdGlvbiBuZWVkZWQgaGVyZS4gIFdlIGp1c3QgcmV0dXJuIGFueSByZW1haW5pbmcKQEAgLTEzMDMsNyArMTMwMyw3IEBACiAgKiBmaWxlc3lzdGVtIGlzIG1hcmtlZCBmb3Igc3luY2hyb25vdXMgdXBkYXRlLgogICoKICAqIGpvdXJuYWxfc3RvcCBpdHNlbGYgd2lsbCBub3QgdXN1YWxseSByZXR1cm4gYW4gZXJyb3IsIGJ1dCBpdCBtYXkKLSAqIGRvIHNvIGluIHVudXN1YWwgY2lyY3Vtc3RhbmNlcy4gIEluIHBhcnRpY3VsYXIsIGV4cGVjdCBpdCB0byAKKyAqIGRvIHNvIGluIHVudXN1YWwgY2lyY3Vtc3RhbmNlcy4gIEluIHBhcnRpY3VsYXIsIGV4cGVjdCBpdCB0bwogICogcmV0dXJuIC1FSU8gaWYgYSBqb3VybmFsX2Fib3J0IGhhcyBiZWVuIGV4ZWN1dGVkIHNpbmNlIHRoZQogICogdHJhbnNhY3Rpb24gYmVnYW4uCiAgKi8KQEAgLTEzNzMsNyArMTM3Myw3IEBACiAJaWYgKGhhbmRsZS0+aF9zeW5jIHx8CiAJCQl0cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzID4KIAkJCQlqb3VybmFsLT5qX21heF90cmFuc2FjdGlvbl9idWZmZXJzIHx8Ci0JICAgIAkJdGltZV9hZnRlcl9lcShqaWZmaWVzLCB0cmFuc2FjdGlvbi0+dF9leHBpcmVzKSkgeworCQkJdGltZV9hZnRlcl9lcShqaWZmaWVzLCB0cmFuc2FjdGlvbi0+dF9leHBpcmVzKSkgewogCQkvKiBEbyB0aGlzIGV2ZW4gZm9yIGFib3J0ZWQgam91cm5hbHM6IGFuIGFib3J0IHN0aWxsCiAJCSAqIGNvbXBsZXRlcyB0aGUgY29tbWl0IHRocmVhZCwgaXQganVzdCBkb2Vzbid0IHdyaXRlCiAJCSAqIGFueXRoaW5nIHRvIGRpc2suICovCkBAIC0xMzg4LDcgKzEzODgsNyBAQAogCiAJCS8qCiAJCSAqIFNwZWNpYWwgY2FzZTogSkZTX1NZTkMgc3luY2hyb25vdXMgdXBkYXRlcyByZXF1aXJlIHVzCi0JCSAqIHRvIHdhaXQgZm9yIHRoZSBjb21taXQgdG8gY29tcGxldGUuICAKKwkJICogdG8gd2FpdCBmb3IgdGhlIGNvbW1pdCB0byBjb21wbGV0ZS4KIAkJICovCiAJCWlmIChoYW5kbGUtPmhfc3luYyAmJiAhKGN1cnJlbnQtPmZsYWdzICYgUEZfTUVNQUxMT0MpKQogCQkJZXJyID0gbG9nX3dhaXRfY29tbWl0KGpvdXJuYWwsIHRpZCk7CkBAIC0xNDM5LDcgKzE0MzksNyBAQAogICogamJkX2xvY2tfYmhfc3RhdGUoamgyYmgoamgpKSBpcyBoZWxkLgogICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCAKK3N0YXRpYyBpbmxpbmUgdm9pZAogX19ibGlzdF9hZGRfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKipsaXN0LCBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKIHsKIAlpZiAoISpsaXN0KSB7CkBAIC0xNDU0LDcgKzE0NTQsNyBAQAogCX0KIH0KIAotLyogCisvKgogICogUmVtb3ZlIGEgYnVmZmVyIGZyb20gYSB0cmFuc2FjdGlvbiBsaXN0LCBnaXZlbiB0aGUgdHJhbnNhY3Rpb24ncyBsaXN0CiAgKiBoZWFkIHBvaW50ZXIuCiAgKgpAQCAtMTQ3NSw3ICsxNDc1LDcgQEAKIAlqaC0+Yl90bmV4dC0+Yl90cHJldiA9IGpoLT5iX3RwcmV2OwogfQogCi0vKiAKKy8qCiAgKiBSZW1vdmUgYSBidWZmZXIgZnJvbSB0aGUgYXBwcm9wcmlhdGUgdHJhbnNhY3Rpb24gbGlzdC4KICAqCiAgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW4gKmNoYW5nZSogdGhlIHZhbHVlIG9mCkBAIC0xNTk1LDE3ICsxNTk1LDE3IEBACiB9CiAKIAotLyoqIAorLyoqCiAgKiBpbnQgam91cm5hbF90cnlfdG9fZnJlZV9idWZmZXJzKCkgLSB0cnkgdG8gZnJlZSBwYWdlIGJ1ZmZlcnMuCiAgKiBAam91cm5hbDogam91cm5hbCBmb3Igb3BlcmF0aW9uCiAgKiBAcGFnZTogdG8gdHJ5IGFuZCBmcmVlCiAgKiBAdW51c2VkX2dmcF9tYXNrOiB1bnVzZWQKICAqCi0gKiAKKyAqCiAgKiBGb3IgYWxsIHRoZSBidWZmZXJzIG9uIHRoaXMgcGFnZSwKICAqIGlmIHRoZXkgYXJlIGZ1bGx5IHdyaXR0ZW4gb3V0IG9yZGVyZWQgZGF0YSwgbW92ZSB0aGVtIG9udG8gQlVGX0NMRUFOCiAgKiBzbyB0cnlfdG9fZnJlZV9idWZmZXJzKCkgY2FuIHJlYXAgdGhlbS4KLSAqIAorICoKICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBub24temVybyBpZiB3ZSB3aXNoIHRyeV90b19mcmVlX2J1ZmZlcnMoKQogICogdG8gYmUgY2FsbGVkLiBXZSBkbyB0aGlzIGlmIHRoZSBwYWdlIGlzIHJlbGVhc2FibGUgYnkgdHJ5X3RvX2ZyZWVfYnVmZmVycygpLgogICogV2UgYWxzbyBkbyBpdCBpZiB0aGUgcGFnZSBoYXMgbG9ja2VkIG9yIGRpcnR5IGJ1ZmZlcnMgYW5kIHRoZSBjYWxsZXIgd2FudHMKQEAgLTE2MjksNyArMTYyOSw3IEBACiAgKiBjYW5ub3QgaGFwcGVuIGJlY2F1c2Ugd2UgbmV2ZXIgcmVhbGxvY2F0ZSBmcmVlZCBkYXRhIGFzIG1ldGFkYXRhCiAgKiB3aGlsZSB0aGUgZGF0YSBpcyBwYXJ0IG9mIGEgdHJhbnNhY3Rpb24uICBZZXM/CiAgKi8KLWludCBqb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcnMoam91cm5hbF90ICpqb3VybmFsLCAKK2ludCBqb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcnMoam91cm5hbF90ICpqb3VybmFsLAogCQkJCXN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCB1bnVzZWRfZ2ZwX21hc2spCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkOwpAQCAtMTY5Nyw3ICsxNjk3LDcgQEAKIH0KIAogLyoKLSAqIGpvdXJuYWxfaW52YWxpZGF0ZXBhZ2UgCisgKiBqb3VybmFsX2ludmFsaWRhdGVwYWdlCiAgKgogICogVGhpcyBjb2RlIGlzIHRyaWNreS4gIEl0IGhhcyBhIG51bWJlciBvZiBjYXNlcyB0byBkZWFsIHdpdGguCiAgKgpAQCAtMTcwNSwxNSArMTcwNSwxNSBAQAogICoKICAqIGlfc2l6ZSBtdXN0IGJlIHVwZGF0ZWQgb24gZGlzayBiZWZvcmUgd2Ugc3RhcnQgY2FsbGluZyBpbnZhbGlkYXRlcGFnZSBvbiB0aGUKICAqIGRhdGEuCi0gKiAKKyAqCiAgKiAgVGhpcyBpcyBkb25lIGluIGV4dDMgYnkgZGVmaW5pbmcgYW4gZXh0M19zZXRhdHRyIG1ldGhvZCB3aGljaAogICogIHVwZGF0ZXMgaV9zaXplIGJlZm9yZSB0cnVuY2F0ZSBnZXRzIGdvaW5nLiAgQnkgbWFpbnRhaW5pbmcgdGhpcwogICogIGludmFyaWFudCwgd2UgY2FuIGJlIHN1cmUgdGhhdCBpdCBpcyBzYWZlIHRvIHRocm93IGF3YXkgYW55IGJ1ZmZlcnMKICAqICBhdHRhY2hlZCB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbjogb25jZSB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cywKICAqICB3ZSBrbm93IHRoYXQgdGhlIGRhdGEgd2lsbCBub3QgYmUgbmVlZGVkLgotICogCisgKgogICogIE5vdGUgaG93ZXZlciB0aGF0IHdlIGNhbiAqbm90KiB0aHJvdyBhd2F5IGRhdGEgYmVsb25naW5nIHRvIHRoZQotICogIHByZXZpb3VzLCBjb21taXR0aW5nIHRyYW5zYWN0aW9uISAgCisgKiAgcHJldmlvdXMsIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24hCiAgKgogICogQW55IGRpc2sgYmxvY2tzIHdoaWNoICphcmUqIHBhcnQgb2YgdGhlIHByZXZpb3VzLCBjb21taXR0aW5nCiAgKiB0cmFuc2FjdGlvbiAoYW5kIHdoaWNoIHRoZXJlZm9yZSBjYW5ub3QgYmUgZGlzY2FyZGVkIGltbWVkaWF0ZWx5KSBhcmUKQEAgLTE3MzIsNyArMTczMiw3IEBACiAgKiBkb24ndCBtYWtlIGd1YXJhbnRlZXMgYWJvdXQgdGhlIG9yZGVyIGluIHdoaWNoIGRhdGEgaGl0cyBkaXNrIC0tLSBpbgogICogcGFydGljdWxhciB3ZSBkb24ndCBndWFyYW50ZWUgdGhhdCBuZXcgZGlydHkgZGF0YSBpcyBmbHVzaGVkIGJlZm9yZQogICogdHJhbnNhY3Rpb24gY29tbWl0IC0tLSBzbyBpdCBpcyBhbHdheXMgc2FmZSBqdXN0IHRvIGRpc2NhcmQgZGF0YQotICogaW1tZWRpYXRlbHkgaW4gdGhhdCBtb2RlLiAgLS1zY3QgCisgKiBpbW1lZGlhdGVseSBpbiB0aGF0IG1vZGUuICAtLXNjdAogICovCiAKIC8qCkBAIC0xODc2LDkgKzE4NzYsOSBAQAogCXJldHVybiBtYXlfZnJlZTsKIH0KIAotLyoqIAorLyoqCiAgKiB2b2lkIGpvdXJuYWxfaW52YWxpZGF0ZXBhZ2UoKQotICogQGpvdXJuYWw6IGpvdXJuYWwgdG8gdXNlIGZvciBmbHVzaC4uLiAKKyAqIEBqb3VybmFsOiBqb3VybmFsIHRvIHVzZSBmb3IgZmx1c2guLi4KICAqIEBwYWdlOiAgICBwYWdlIHRvIGZsdXNoCiAgKiBAb2Zmc2V0OiAgbGVuZ3RoIG9mIHBhZ2UgdG8gaW52YWxpZGF0ZS4KICAqCkBAIC0xODg2LDcgKzE4ODYsNyBAQAogICoKICAqLwogdm9pZCBqb3VybmFsX2ludmFsaWRhdGVwYWdlKGpvdXJuYWxfdCAqam91cm5hbCwKLQkJICAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsIAorCQkgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLCAqYmgsICpuZXh0OwpAQCAtMTkwOCw3ICsxOTA4LDcgQEAKIAkJbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKIAogCQlpZiAob2Zmc2V0IDw9IGN1cnJfb2ZmKSB7Ci0JCSAJLyogVGhpcyBibG9jayBpcyB3aG9sbHkgb3V0c2lkZSB0aGUgdHJ1bmNhdGlvbiBwb2ludCAqLworCQkJLyogVGhpcyBibG9jayBpcyB3aG9sbHkgb3V0c2lkZSB0aGUgdHJ1bmNhdGlvbiBwb2ludCAqLwogCQkJbG9ja19idWZmZXIoYmgpOwogCQkJbWF5X2ZyZWUgJj0gam91cm5hbF91bm1hcF9idWZmZXIoam91cm5hbCwgYmgpOwogCQkJdW5sb2NrX2J1ZmZlcihiaCk7CkBAIC0xOTI0LDggKzE5MjQsOCBAQAogCX0KIH0KIAotLyogCi0gKiBGaWxlIGEgYnVmZmVyIG9uIHRoZSBnaXZlbiB0cmFuc2FjdGlvbiBsaXN0LiAKKy8qCisgKiBGaWxlIGEgYnVmZmVyIG9uIHRoZSBnaXZlbiB0cmFuc2FjdGlvbiBsaXN0LgogICovCiB2b2lkIF9fam91cm5hbF9maWxlX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCwKIAkJCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uLCBpbnQgamxpc3QpCkBAIC0xOTQ4LDcgKzE5NDgsNyBAQAogCSAqIHdpdGggX19qYmRfdW5leHBlY3RlZF9kaXJ0eV9idWZmZXIoKSdzIGhhbmRsaW5nIG9mIGRpcnR5CiAJICogc3RhdGUuICovCiAKLQlpZiAoamxpc3QgPT0gQkpfTWV0YWRhdGEgfHwgamxpc3QgPT0gQkpfUmVzZXJ2ZWQgfHwgCisJaWYgKGpsaXN0ID09IEJKX01ldGFkYXRhIHx8IGpsaXN0ID09IEJKX1Jlc2VydmVkIHx8CiAJICAgIGpsaXN0ID09IEJKX1NoYWRvdyB8fCBqbGlzdCA9PSBCSl9Gb3JnZXQpIHsKIAkJaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSB8fAogCQkgICAgdGVzdF9jbGVhcl9idWZmZXJfamJkZGlydHkoYmgpKQpAQCAtMjAwOCw3ICsyMDA4LDcgQEAKIAlqYmRfdW5sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSk7CiB9CiAKLS8qIAorLyoKICAqIFJlbW92ZSBhIGJ1ZmZlciBmcm9tIGl0cyBjdXJyZW50IGJ1ZmZlciBsaXN0IGluIHByZXBhcmF0aW9uIGZvcgogICogZHJvcHBpbmcgaXQgZnJvbSBpdHMgY3VycmVudCB0cmFuc2FjdGlvbiBlbnRpcmVseS4gIElmIHRoZSBidWZmZXIgaGFzCiAgKiBhbHJlYWR5IHN0YXJ0ZWQgdG8gYmUgdXNlZCBieSBhIHN1YnNlcXVlbnQgdHJhbnNhY3Rpb24sIHJlZmlsZSB0aGUKQEAgLTIwNjAsNyArMjA2MCw3IEBACiAgKiB0byB0aGUgY2FsbGVyIHRvIHJlbW92ZSB0aGUgam91cm5hbF9oZWFkIGlmIG5lY2Vzc2FyeS4gIEZvciB0aGUKICAqIHVubG9ja2VkIGpvdXJuYWxfcmVmaWxlX2J1ZmZlciBjYWxsLCB0aGUgY2FsbGVyIGlzbid0IGdvaW5nIHRvIGJlCiAgKiBkb2luZyBhbnl0aGluZyBlbHNlIHRvIHRoZSBidWZmZXIgc28gd2UgbmVlZCB0byBkbyB0aGUgY2xlYW51cAotICogb3Vyc2VsdmVzIHRvIGF2b2lkIGEgamggbGVhay4gCisgKiBvdXJzZWx2ZXMgdG8gYXZvaWQgYSBqaCBsZWFrLgogICoKICAqICoqKiBUaGUgam91cm5hbF9oZWFkIG1heSBiZSBmcmVlZCBieSB0aGlzIGNhbGwhICoqKgogICovCmRpZmYgLS1naXQgYS9mcy9qZmZzL2lub2RlLXYyMy5jIGIvZnMvamZmcy9pbm9kZS12MjMuYwppbmRleCA5MzA2ODY5Li5mNWNmOWM5IDEwMDY0NAotLS0gYS9mcy9qZmZzL2lub2RlLXYyMy5jCisrKyBiL2ZzL2pmZnMvaW5vZGUtdjIzLmMKQEAgLTM2NCwxMiArMzY0LDExIEBACiAJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7CiAJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7CiAJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7Ci0JaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsKIAlpbm9kZS0+aV9ibG9ja3MgPSAoaW5vZGUtPmlfc2l6ZSArIDUxMSkgPj4gOTsKIAogCWYgPSBqZmZzX2ZpbmRfZmlsZShjLCByYXdfaW5vZGUtPmlubyk7CiAKLQlpbm9kZS0+dS5nZW5lcmljX2lwID0gKHZvaWQgKilmOworCWlub2RlLT5pX3ByaXZhdGUgPSAodm9pZCAqKWY7CiAJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOwogCiAJcmV0dXJuIGlub2RlOwpAQCAtNDQyLDcgKzQ0MSw3IEBACiAJfSk7CiAKIAlyZXN1bHQgPSAtRU5PVERJUjsKLQlpZiAoIShvbGRfZGlyX2YgPSAoc3RydWN0IGpmZnNfZmlsZSAqKW9sZF9kaXItPnUuZ2VuZXJpY19pcCkpIHsKKwlpZiAoIShvbGRfZGlyX2YgPSBvbGRfZGlyLT5pX3ByaXZhdGUpKSB7CiAJCUQocHJpbnRrKCJqZmZzX3JlbmFtZSgpOiBPbGQgZGlyIGludmFsaWQuXG4iKSk7CiAJCWdvdG8gamZmc19yZW5hbWVfZW5kOwogCX0KQEAgLTQ1Niw3ICs0NTUsNyBAQAogCiAJLyogRmluZCB0aGUgbmV3IGRpcmVjdG9yeS4gICovCiAJcmVzdWx0ID0gLUVOT1RESVI7Ci0JaWYgKCEobmV3X2Rpcl9mID0gKHN0cnVjdCBqZmZzX2ZpbGUgKiluZXdfZGlyLT51LmdlbmVyaWNfaXApKSB7CisJaWYgKCEobmV3X2Rpcl9mID0gbmV3X2Rpci0+aV9wcml2YXRlKSkgewogCQlEKHByaW50aygiamZmc19yZW5hbWUoKTogTmV3IGRpciBpbnZhbGlkLlxuIikpOwogCQlnb3RvIGpmZnNfcmVuYW1lX2VuZDsKIAl9CkBAIC01OTMsNyArNTkyLDcgQEAKIAkJfQogCQllbHNlIHsKIAkJCWRkaW5vID0gKChzdHJ1Y3QgamZmc19maWxlICopCi0JCQkJIGlub2RlLT51LmdlbmVyaWNfaXApLT5waW5vOworCQkJCSBpbm9kZS0+aV9wcml2YXRlKS0+cGlubzsKIAkJfQogCQlEMyhwcmludGsoImpmZnNfcmVhZGRpcigpOiBcIi4uXCIgJXVcbiIsIGRkaW5vKSk7CiAJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgZmlscC0+Zl9wb3MsIGRkaW5vLCBEVF9ESVIpIDwgMCkgewpAQCAtNjA0LDcgKzYwMyw3IEBACiAJCX0KIAkJZmlscC0+Zl9wb3MrKzsKIAl9Ci0JZiA9ICgoc3RydWN0IGpmZnNfZmlsZSAqKWlub2RlLT51LmdlbmVyaWNfaXApLT5jaGlsZHJlbjsKKwlmID0gKChzdHJ1Y3QgamZmc19maWxlICopaW5vZGUtPmlfcHJpdmF0ZSktPmNoaWxkcmVuOwogCiAJaiA9IDI7CiAJd2hpbGUoZiAmJiAoZi0+ZGVsZXRlZCB8fCBqKysgPCBmaWxwLT5mX3BvcyApKSB7CkBAIC02NTIsNyArNjUxLDcgQEAKIAlsb2NrX2tlcm5lbCgpOwogCiAJRDMoewotCQljaGFyICpzID0gKGNoYXIgKilrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCQljaGFyICpzID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKIAkJbWVtY3B5KHMsIG5hbWUsIGxlbik7CiAJCXNbbGVuXSA9ICdcMCc7CiAJCXByaW50aygiamZmc19sb29rdXAoKTogZGlyOiAweCVwLCBuYW1lOiBcIiVzXCJcbiIsIGRpciwgcyk7CkBAIC02NjgsNyArNjY3LDcgQEAKIAl9CiAKIAlyID0gLUVBQ0NFUzsKLQlpZiAoIShkID0gKHN0cnVjdCBqZmZzX2ZpbGUgKilkaXItPnUuZ2VuZXJpY19pcCkpIHsKKwlpZiAoIShkID0gKHN0cnVjdCBqZmZzX2ZpbGUgKilkaXItPmlfcHJpdmF0ZSkpIHsKIAkJRChwcmludGsoImpmZnNfbG9va3VwKCk6IE5vIHN1Y2ggaW5vZGUhICglbHUpXG4iLAogCQkJIGRpci0+aV9pbm8pKTsKIAkJZ290byBqZmZzX2xvb2t1cF9lbmQ7CkBAIC03MzksNyArNzM4LDcgQEAKIAl1bnNpZ25lZCBsb25nIHJlYWRfbGVuOwogCWludCByZXN1bHQ7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IChzdHJ1Y3QgaW5vZGUqKXBhZ2UtPm1hcHBpbmctPmhvc3Q7Ci0Jc3RydWN0IGpmZnNfZmlsZSAqZiA9IChzdHJ1Y3QgamZmc19maWxlICopaW5vZGUtPnUuZ2VuZXJpY19pcDsKKwlzdHJ1Y3QgamZmc19maWxlICpmID0gKHN0cnVjdCBqZmZzX2ZpbGUgKilpbm9kZS0+aV9wcml2YXRlOwogCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmMgPSAoc3RydWN0IGpmZnNfY29udHJvbCAqKWlub2RlLT5pX3NiLT5zX2ZzX2luZm87CiAJaW50IHI7CiAJbG9mZl90IG9mZnNldDsKQEAgLTgyOCw3ICs4MjcsNyBAQAogCX0pOwogCiAJbG9ja19rZXJuZWwoKTsKLQlkaXJfZiA9IChzdHJ1Y3QgamZmc19maWxlICopZGlyLT51LmdlbmVyaWNfaXA7CisJZGlyX2YgPSBkaXItPmlfcHJpdmF0ZTsKIAogCUFTU0VSVChpZiAoIWRpcl9mKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiamZmc19ta2RpcigpOiBObyByZWZlcmVuY2UgdG8gYSAiCkBAIC05NzIsNyArOTcxLDcgQEAKIAkJa2ZyZWUoX25hbWUpOwogCX0pOwogCi0JZGlyX2YgPSAoc3RydWN0IGpmZnNfZmlsZSAqKSBkaXItPnUuZ2VuZXJpY19pcDsKKwlkaXJfZiA9IGRpci0+aV9wcml2YXRlOwogCWMgPSBkaXJfZi0+YzsKIAogCXJlc3VsdCA9IC1FTk9FTlQ7CkBAIC0xMDgyLDcgKzEwODEsNyBAQAogCWlmICghb2xkX3ZhbGlkX2RldihyZGV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJbG9ja19rZXJuZWwoKTsKLQlkaXJfZiA9IChzdHJ1Y3QgamZmc19maWxlICopZGlyLT51LmdlbmVyaWNfaXA7CisJZGlyX2YgPSBkaXItPmlfcHJpdmF0ZTsKIAljID0gZGlyX2YtPmM7CiAKIAlEMyhwcmludGsgKEtFUk5fTk9USUNFICJta25vZCgpOiBkb3duIGJpZ2xvY2tcbiIpKTsKQEAgLTExNzMsOCArMTE3Miw4IEBACiAJbG9ja19rZXJuZWwoKTsKIAlEMSh7CiAJCWludCBsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47IAotCQljaGFyICpfbmFtZSA9IChjaGFyICopa21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKLQkJY2hhciAqX3N5bW5hbWUgPSAoY2hhciAqKWttYWxsb2Moc3ltbmFtZV9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJY2hhciAqX25hbWUgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCQljaGFyICpfc3ltbmFtZSA9IGttYWxsb2Moc3ltbmFtZV9sZW4gKyAxLCBHRlBfS0VSTkVMKTsKIAkJbWVtY3B5KF9uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLCBsZW4pOwogCQlfbmFtZVtsZW5dID0gJ1wwJzsKIAkJbWVtY3B5KF9zeW1uYW1lLCBzeW1uYW1lLCBzeW1uYW1lX2xlbik7CkBAIC0xMTg2LDcgKzExODUsNyBAQAogCQlrZnJlZShfc3ltbmFtZSk7CiAJfSk7CiAKLQlkaXJfZiA9IChzdHJ1Y3QgamZmc19maWxlICopZGlyLT51LmdlbmVyaWNfaXA7CisJZGlyX2YgPSBkaXItPmlfcHJpdmF0ZTsKIAlBU1NFUlQoaWYgKCFkaXJfZikgewogCQlwcmludGsoS0VSTl9FUlIgImpmZnNfc3ltbGluaygpOiBObyByZWZlcmVuY2UgdG8gYSAiCiAJCSAgICAgICAiamZmc19maWxlIHN0cnVjdCBpbiBpbm9kZS5cbiIpOwpAQCAtMTI4MiwxNCArMTI4MSwxNCBAQAogCWxvY2tfa2VybmVsKCk7CiAJRDEoewogCQlpbnQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOwotCQljaGFyICpzID0gKGNoYXIgKilrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCQljaGFyICpzID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKIAkJbWVtY3B5KHMsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGxlbik7CiAJCXNbbGVuXSA9ICdcMCc7CiAJCXByaW50aygiamZmc19jcmVhdGUoKTogZGlyOiAweCVwLCBuYW1lOiBcIiVzXCJcbiIsIGRpciwgcyk7CiAJCWtmcmVlKHMpOwogCX0pOwogCi0JZGlyX2YgPSAoc3RydWN0IGpmZnNfZmlsZSAqKWRpci0+dS5nZW5lcmljX2lwOworCWRpcl9mID0gZGlyLT5pX3ByaXZhdGU7CiAJQVNTRVJUKGlmICghZGlyX2YpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJqZmZzX2NyZWF0ZSgpOiBObyByZWZlcmVuY2UgdG8gYSAiCiAJCSAgICAgICAiamZmc19maWxlIHN0cnVjdCBpbiBpbm9kZS5cbiIpOwpAQCAtMTQwMyw5ICsxNDAyLDkgQEAKIAkJZ290byBvdXRfaXNlbTsKIAl9CiAKLQlpZiAoIShmID0gKHN0cnVjdCBqZmZzX2ZpbGUgKilpbm9kZS0+dS5nZW5lcmljX2lwKSkgewotCQlEKHByaW50aygiamZmc19maWxlX3dyaXRlKCk6IGlub2RlLT51LmdlbmVyaWNfaXAgPSAweCVwXG4iLAotCQkJCWlub2RlLT51LmdlbmVyaWNfaXApKTsKKwlpZiAoIShmID0gaW5vZGUtPmlfcHJpdmF0ZSkpIHsKKwkJRChwcmludGsoImpmZnNfZmlsZV93cml0ZSgpOiBpbm9kZS0+aV9wcml2YXRlID0gMHglcFxuIiwKKwkJCQlpbm9kZS0+aV9wcml2YXRlKSk7CiAJCWdvdG8gb3V0X2lzZW07CiAJfQogCkBAIC0xNjkzLDcgKzE2OTIsNyBAQAogCQltdXRleF91bmxvY2soJmMtPmZtYy0+YmlnbG9jayk7CiAJCXJldHVybjsKIAl9Ci0JaW5vZGUtPnUuZ2VuZXJpY19pcCA9ICh2b2lkICopZjsKKwlpbm9kZS0+aV9wcml2YXRlID0gZjsKIAlpbm9kZS0+aV9tb2RlID0gZi0+bW9kZTsKIAlpbm9kZS0+aV9ubGluayA9IGYtPm5saW5rOwogCWlub2RlLT5pX3VpZCA9IGYtPnVpZDsKQEAgLTE3MDYsNyArMTcwNSw2IEBACiAJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IAogCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOwogCi0JaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsKIAlpbm9kZS0+aV9ibG9ja3MgPSAoaW5vZGUtPmlfc2l6ZSArIDUxMSkgPj4gOTsKIAlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQlpbm9kZS0+aV9vcCA9ICZqZmZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKQEAgLTE3NDgsNyArMTc0Niw3IEBACiAJbG9ja19rZXJuZWwoKTsKIAlpbm9kZS0+aV9zaXplID0gMDsKIAlpbm9kZS0+aV9ibG9ja3MgPSAwOwotCWlub2RlLT51LmdlbmVyaWNfaXAgPSBOVUxMOworCWlub2RlLT5pX3ByaXZhdGUgPSBOVUxMOwogCWNsZWFyX2lub2RlKGlub2RlKTsKIAlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkgewogCQljID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKikgaW5vZGUtPmlfc2ItPnNfZnNfaW5mbzsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMvaW50cmVwLmMgYi9mcy9qZmZzL2ludHJlcC5jCmluZGV4IDkwMDBmMWUuLjRhNTQzZTEgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMvaW50cmVwLmMKKysrIGIvZnMvamZmcy9pbnRyZXAuYwpAQCAtNDg4LDEzICs0ODgsMTEgQEAKIHsKIAlzdHJ1Y3QgamZmc19maWxlICpmOwogCi0JaWYgKCEoZiA9IChzdHJ1Y3QgamZmc19maWxlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGpmZnNfZmlsZSksCi0JCQkJCSAgICAgIEdGUF9LRVJORUwpKSkgeworCWlmICghKGYgPSBremFsbG9jKHNpemVvZigqZiksIEdGUF9LRVJORUwpKSkgewogCQlEKHByaW50aygiamZmc19jcmVhdGVfZmlsZSgpOiBGYWlsZWQhXG4iKSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlub19qZmZzX2ZpbGUrKzsKLQltZW1zZXQoZiwgMCwgc2l6ZW9mKHN0cnVjdCBqZmZzX2ZpbGUpKTsKIAlmLT5pbm8gPSByYXdfaW5vZGUtPmlubzsKIAlmLT5waW5vID0gcmF3X2lub2RlLT5waW5vOwogCWYtPm5saW5rID0gcmF3X2lub2RlLT5ubGluazsKQEAgLTUxNiw3ICs1MTQsNyBAQAogCiAJRDIocHJpbnRrKCJqZmZzX2NyZWF0ZV9jb250cm9sKClcbiIpKTsKIAotCWlmICghKGMgPSAoc3RydWN0IGpmZnNfY29udHJvbCAqKWttYWxsb2MocywgR0ZQX0tFUk5FTCkpKSB7CisJaWYgKCEoYyA9IGttYWxsb2MocywgR0ZQX0tFUk5FTCkpKSB7CiAJCWdvdG8gZmFpbF9jb250cm9sOwogCX0KIAlESk0obm9famZmc19jb250cm9sKyspOwpAQCAtNTI0LDcgKzUyMiw3IEBACiAJYy0+Z2NfdGFzayA9IE5VTEw7CiAJYy0+aGFzaF9sZW4gPSBKRkZTX0hBU0hfU0laRTsKIAlzID0gc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpICogYy0+aGFzaF9sZW47Ci0JaWYgKCEoYy0+aGFzaCA9IChzdHJ1Y3QgbGlzdF9oZWFkICopa21hbGxvYyhzLCBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoIShjLT5oYXNoID0ga21hbGxvYyhzLCBHRlBfS0VSTkVMKSkpIHsKIAkJZ290byBmYWlsX2hhc2g7CiAJfQogCURKTShub19oYXNoKyspOwpAQCAtNTkzLDggKzU5MSw3IEBACiAJRDIocHJpbnRrKCJqZmZzX2FkZF92aXJ0dWFsX3Jvb3QoKTogIgogCQkgICJDcmVhdGluZyBhIHZpcnR1YWwgcm9vdCBkaXJlY3RvcnkuXG4iKSk7CiAKLQlpZiAoIShyb290ID0gKHN0cnVjdCBqZmZzX2ZpbGUgKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgamZmc19maWxlKSwKLQkJCQkJCSBHRlBfS0VSTkVMKSkpIHsKKwlpZiAoIShyb290ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGpmZnNfZmlsZSksIEdGUF9LRVJORUwpKSkgewogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbm9famZmc19maWxlKys7CmRpZmYgLS1naXQgYS9mcy9qZmZzL2pmZnNfZm0uYyBiL2ZzL2pmZnMvamZmc19mbS5jCmluZGV4IDdkOGNhMWEuLjI5YjY4ZDkgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMvamZmc19mbS5jCisrKyBiL2ZzL2pmZnMvamZmc19mbS5jCkBAIC05NCw4ICs5NCw3IEBACiAJc3RydWN0IG10ZF9pbmZvICptdGQ7CiAJCiAJRDMocHJpbnRrKCJqZmZzX2J1aWxkX2JlZ2luKClcbiIpKTsKLQlmbWMgPSAoc3RydWN0IGpmZnNfZm1jb250cm9sICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGpmZnNfZm1jb250cm9sKSwKLQkJCQkJICAgICAgIEdGUF9LRVJORUwpOworCWZtYyA9IGttYWxsb2Moc2l6ZW9mKCpmbWMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZtYykgewogCQlEKHByaW50aygiamZmc19idWlsZF9iZWdpbigpOiBBbGxvY2F0aW9uIG9mICIKIAkJCSAic3RydWN0IGpmZnNfZm1jb250cm9sIGZhaWxlZCFcbiIpKTsKQEAgLTQ4Niw4ICs0ODUsNyBAQAogCiAJRDMocHJpbnRrKCJqZmZzX2FkZF9ub2RlKCk6IGlubyA9ICV1XG4iLCBub2RlLT5pbm8pKTsKIAotCXJlZiA9IChzdHJ1Y3QgamZmc19ub2RlX3JlZiAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBqZmZzX25vZGVfcmVmKSwKLQkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJcmVmID0ga21hbGxvYyhzaXplb2YoKnJlZiksIEdGUF9LRVJORUwpOwogCWlmICghcmVmKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZnMvamZmczIvZnMuYyBiL2ZzL2pmZnMyL2ZzLmMKaW5kZXggNDc4MGY4Mi4uNzJkOTkwOWQgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2ZzLmMKKysrIGIvZnMvamZmczIvZnMuYwpAQCAtMjYzLDcgKzI2Myw2IEBACiAKIAlpbm9kZS0+aV9ubGluayA9IGYtPmlub2NhY2hlLT5ubGluazsKIAotCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7CiAJaW5vZGUtPmlfYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CiAKIAlzd2l0Y2ggKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpIHsKQEAgLTQ0OSw3ICs0NDgsNiBAQAogCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CiAJcmktPmF0aW1lID0gcmktPm10aW1lID0gcmktPmN0aW1lID0gY3B1X3RvX2plMzIoSV9TRUMoaW5vZGUtPmlfbXRpbWUpKTsKIAotCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7CiAJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAlpbm9kZS0+aV9zaXplID0gMDsKIApkaWZmIC0tZ2l0IGEvZnMvamZmczIvc3VwZXIuYyBiL2ZzL2pmZnMyL3N1cGVyLmMKaW5kZXggNjhlMzk1My4uNmRlMzc0NSAxMDA2NDQKLS0tIGEvZnMvamZmczIvc3VwZXIuYworKysgYi9mcy9qZmZzMi9zdXBlci5jCkBAIC0xMTksMTAgKzExOSw5IEBACiAJc3RydWN0IGpmZnMyX3NiX2luZm8gKmM7CiAJaW50IHJldDsKIAotCWMgPSBrbWFsbG9jKHNpemVvZigqYyksIEdGUF9LRVJORUwpOworCWMgPSBremFsbG9jKHNpemVvZigqYyksIEdGUF9LRVJORUwpOwogCWlmICghYykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGMsIDAsIHNpemVvZigqYykpOwogCWMtPm10ZCA9IG10ZDsKIAogCXNiID0gc2dldChmc190eXBlLCBqZmZzMl9zYl9jb21wYXJlLCBqZmZzMl9zYl9zZXQsIGMpOwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19leHRlbnQuYyBiL2ZzL2pmcy9qZnNfZXh0ZW50LmMKaW5kZXggNGQ1MjU5My4uNGM3NGYwOSAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19leHRlbnQuYworKysgYi9mcy9qZnMvamZzX2V4dGVudC5jCkBAIC00NjgsNyArNDY4LDcgQEAKIGludCBleHRGaWxsKHN0cnVjdCBpbm9kZSAqaXAsIHhhZF90ICogeHApCiB7CiAJaW50IHJjLCBuYnBlcnBhZ2UgPSBKRlNfU0JJKGlwLT5pX3NiKS0+bmJwZXJwYWdlOwotCXM2NCBibGtubyA9IG9mZnNldFhBRCh4cCkgPj4gaXAtPmlfYmxrc2l6ZTsKKwlzNjQgYmxrbm8gPSBvZmZzZXRYQUQoeHApID4+IGlwLT5pX2Jsa2JpdHM7CiAKIC8vICAgICAgYXNzZXJ0KElTU1BBUlNFKGlwKSk7CiAKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfaW1hcC5jIGIvZnMvamZzL2pmc19pbWFwLmMKaW5kZXggY2NiZTYwYS4uMzY5ZDdmMyAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19pbWFwLmMKKysrIGIvZnMvamZzL2pmc19pbWFwLmMKQEAgLTMxMTUsNyArMzExNSw2IEBACiAJaXAtPmlfbXRpbWUudHZfbnNlYyA9IGxlMzJfdG9fY3B1KGRpcC0+ZGlfbXRpbWUudHZfbnNlYyk7CiAJaXAtPmlfY3RpbWUudHZfc2VjID0gbGUzMl90b19jcHUoZGlwLT5kaV9jdGltZS50dl9zZWMpOwogCWlwLT5pX2N0aW1lLnR2X25zZWMgPSBsZTMyX3RvX2NwdShkaXAtPmRpX2N0aW1lLnR2X25zZWMpOwotCWlwLT5pX2Jsa3NpemUgPSBpcC0+aV9zYi0+c19ibG9ja3NpemU7CiAJaXAtPmlfYmxvY2tzID0gTEJMSzJQQkxLKGlwLT5pX3NiLCBsZTY0X3RvX2NwdShkaXAtPmRpX25ibG9ja3MpKTsKIAlpcC0+aV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUoZGlwLT5kaV9nZW4pOwogCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2lub2RlLmMgYi9mcy9qZnMvamZzX2lub2RlLmMKaW5kZXggNDk1ZGY0MC4uYmZmYWNhOSAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19pbm9kZS5jCisrKyBiL2ZzL2pmcy9qZnNfaW5vZGUuYwpAQCAtMTE1LDcgKzExNSw2IEBACiAJfQogCWpmc19pbm9kZS0+bW9kZTIgfD0gbW9kZTsKIAotCWlub2RlLT5pX2Jsa3NpemUgPSBzYi0+c19ibG9ja3NpemU7CiAJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJamZzX2lub2RlLT5vdGltZSA9IGlub2RlLT5pX2N0aW1lLnR2X3NlYzsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfbWV0YXBhZ2UuYyBiL2ZzL2pmcy9qZnNfbWV0YXBhZ2UuYwppbmRleCBlMWUwYTZlLi5mNWFmYzEyIDEwMDY0NAotLS0gYS9mcy9qZnMvamZzX21ldGFwYWdlLmMKKysrIGIvZnMvamZzL2pmc19tZXRhcGFnZS5jCkBAIC0yNTcsNyArMjU3LDcgQEAKIAlpbnQgcmMgPSAwOwogCWludCB4ZmxhZzsKIAlzNjQgeGFkZHI7Ci0Jc2VjdG9yX3QgZmlsZV9ibG9ja3MgPSAoaW5vZGUtPmlfc2l6ZSArIGlub2RlLT5pX2Jsa3NpemUgLSAxKSA+PgorCXNlY3Rvcl90IGZpbGVfYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PgogCQkJICAgICAgIGlub2RlLT5pX2Jsa2JpdHM7CiAKIAlpZiAobGJsb2NrID49IGZpbGVfYmxvY2tzKQpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc190eG5tZ3IuYyBiL2ZzL2pmcy9qZnNfdHhubWdyLmMKaW5kZXggZWZiYjU4Ni4uMzg1NmVmYyAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc190eG5tZ3IuYworKysgYi9mcy9qZnMvamZzX3R4bm1nci5jCkBAIC0yODIsNyArMjgyLDcgQEAKIAlUeExvY2tWSFdNID0gKG5UeExvY2sgKiA4KSAvIDEwOwogCiAJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdGJsb2NrKSAqIG5UeEJsb2NrOwotCVR4QmxvY2sgPSAoc3RydWN0IHRibG9jayAqKSB2bWFsbG9jKHNpemUpOworCVR4QmxvY2sgPSB2bWFsbG9jKHNpemUpOwogCWlmIChUeEJsb2NrID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0zMDcsNyArMzA3LDcgQEAKIAkgKiB0bG9jayBpZCA9IDAgaXMgcmVzZXJ2ZWQuCiAJICovCiAJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdGxvY2spICogblR4TG9jazsKLQlUeExvY2sgPSAoc3RydWN0IHRsb2NrICopIHZtYWxsb2Moc2l6ZSk7CisJVHhMb2NrID0gdm1hbGxvYyhzaXplKTsKIAlpZiAoVHhMb2NrID09IE5VTEwpIHsKIAkJdmZyZWUoVHhCbG9jayk7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZnMvbGliZnMuYyBiL2ZzL2xpYmZzLmMKaW5kZXggYWMwMmVhNi4uOGRiNWFmYiAxMDA2NDQKLS0tIGEvZnMvbGliZnMuYworKysgYi9mcy9saWJmcy5jCkBAIC0zODMsNyArMzgzLDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCAwNzU1OwogCWlub2RlLT5pX3VpZCA9IGlub2RlLT5pX2dpZCA9IDA7Ci0JaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CkBAIC00MDUsNyArNDA0LDYgQEAKIAkJCWdvdG8gb3V0OwogCQlpbm9kZS0+aV9tb2RlID0gU19JRlJFRyB8IGZpbGVzLT5tb2RlOwogCQlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOwotCQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJCWlub2RlLT5pX2ZvcCA9IGZpbGVzLT5vcHM7CkBAIC01NDcsNyArNTQ1LDcgQEAKIAogCWF0dHItPmdldCA9IGdldDsKIAlhdHRyLT5zZXQgPSBzZXQ7Ci0JYXR0ci0+ZGF0YSA9IGlub2RlLT51LmdlbmVyaWNfaXA7CisJYXR0ci0+ZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CiAJYXR0ci0+Zm10ID0gZm10OwogCW11dGV4X2luaXQoJmF0dHItPm11dGV4KTsKIApkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvY2xudGxvY2suYyBiL2ZzL2xvY2tkL2NsbnRsb2NrLmMKaW5kZXggNTI3NzRmZS4uZjk1Y2MzZiAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvY2xudGxvY2suYworKysgYi9mcy9sb2NrZC9jbG50bG9jay5jCkBAIC0xNjAsNyArMTYwLDcgQEAKIAkgKi8KIAlsaXN0X3NwbGljZV9pbml0KCZob3N0LT5oX2dyYW50ZWQsICZob3N0LT5oX3JlY2xhaW0pOwogCi0JZHByaW50aygiTkxNOiByZWNsYWltaW5nIGxvY2tzIGZvciBob3N0ICVzIiwgaG9zdC0+aF9uYW1lKTsKKwlkcHJpbnRrKCJOTE06IHJlY2xhaW1pbmcgbG9ja3MgZm9yIGhvc3QgJXNcbiIsIGhvc3QtPmhfbmFtZSk7CiB9CiAKIHN0YXRpYyB2b2lkIG5sbWNsbnRfZmluaXNoX3JlY2xhaW0oc3RydWN0IG5sbV9ob3N0ICpob3N0KQpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvY2xudHByb2MuYyBiL2ZzL2xvY2tkL2NsbnRwcm9jLmMKaW5kZXggNTBkYmI2Ny4uMjcxZTIxNiAxMDA2NDQKLS0tIGEvZnMvbG9ja2QvY2xudHByb2MuYworKysgYi9mcy9sb2NrZC9jbG50cHJvYy5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAlyZXMgPSBfX25sbV9maW5kX2xvY2tvd25lcihob3N0LCBvd25lcik7CiAJaWYgKHJlcyA9PSBOVUxMKSB7CiAJCXNwaW5fdW5sb2NrKCZob3N0LT5oX2xvY2spOwotCQluZXcgPSAoc3RydWN0IG5sbV9sb2Nrb3duZXIgKilrbWFsbG9jKHNpemVvZigqbmV3KSwgR0ZQX0tFUk5FTCk7CisJCW5ldyA9IGttYWxsb2Moc2l6ZW9mKCpuZXcpLCBHRlBfS0VSTkVMKTsKIAkJc3Bpbl9sb2NrKCZob3N0LT5oX2xvY2spOwogCQlyZXMgPSBfX25sbV9maW5kX2xvY2tvd25lcihob3N0LCBvd25lcik7CiAJCWlmIChyZXMgPT0gTlVMTCAmJiBuZXcgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvaG9zdC5jIGIvZnMvbG9ja2QvaG9zdC5jCmluZGV4IDcwM2ZiMDMuLmEwZDBiNTggMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL2hvc3QuYworKysgYi9mcy9sb2NrZC9ob3N0LmMKQEAgLTk5LDkgKzk5LDkgQEAKIAkvKiBPb29wcywgbm8gaG9zdCBmb3VuZCwgY3JlYXRlIGl0ICovCiAJZHByaW50aygibG9ja2Q6IGNyZWF0aW5nIGhvc3QgZW50cnlcbiIpOwogCi0JaWYgKCEoaG9zdCA9IChzdHJ1Y3QgbmxtX2hvc3QgKikga21hbGxvYyhzaXplb2YoKmhvc3QpLCBHRlBfS0VSTkVMKSkpCisJaG9zdCA9IGt6YWxsb2Moc2l6ZW9mKCpob3N0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFob3N0KQogCQlnb3RvIG5vaG9zdDsKLQltZW1zZXQoaG9zdCwgMCwgc2l6ZW9mKCpob3N0KSk7CiAKIAlhZGRyID0gc2luLT5zaW5fYWRkci5zX2FkZHI7CiAJc3ByaW50Zihob3N0LT5oX25hbWUsICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoYWRkcikpOwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3Zjc3Vicy5jIGIvZnMvbG9ja2Qvc3Zjc3Vicy5jCmluZGV4IDAxYjRkYjkuLmE5MmRkOThmIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9zdmNzdWJzLmMKKysrIGIvZnMvbG9ja2Qvc3Zjc3Vicy5jCkBAIC0xMDAsMTEgKzEwMCwxMCBAQAogCW5sbV9kZWJ1Z19wcmludF9maCgiY3JlYXRpbmcgZmlsZSBmb3IiLCBmKTsKIAogCW5mc2VyciA9IG5sbV9sY2tfZGVuaWVkX25vbG9ja3M7Ci0JZmlsZSA9IChzdHJ1Y3QgbmxtX2ZpbGUgKikga21hbGxvYyhzaXplb2YoKmZpbGUpLCBHRlBfS0VSTkVMKTsKKwlmaWxlID0ga3phbGxvYyhzaXplb2YoKmZpbGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZpbGUpCiAJCWdvdG8gb3V0X3VubG9jazsKIAotCW1lbXNldChmaWxlLCAwLCBzaXplb2YoKmZpbGUpKTsKIAltZW1jcHkoJmZpbGUtPmZfaGFuZGxlLCBmLCBzaXplb2Yoc3RydWN0IG5mc19maCkpOwogCWZpbGUtPmZfaGFzaCA9IGhhc2g7CiAJaW5pdF9NVVRFWCgmZmlsZS0+Zl9zZW1hKTsKZGlmZiAtLWdpdCBhL2ZzL21pbml4L2JpdG1hcC5jIGIvZnMvbWluaXgvYml0bWFwLmMKaW5kZXggNGE2YWJjNC4uZGY2YjEwNyAxMDA2NDQKLS0tIGEvZnMvbWluaXgvYml0bWFwLmMKKysrIGIvZnMvbWluaXgvYml0bWFwLmMKQEAgLTI1NCw3ICsyNTQsNyBAQAogCWlub2RlLT5pX2dpZCA9IChkaXItPmlfbW9kZSAmIFNfSVNHSUQpID8gZGlyLT5pX2dpZCA6IGN1cnJlbnQtPmZzZ2lkOwogCWlub2RlLT5pX2lubyA9IGo7CiAJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKLQlpbm9kZS0+aV9ibG9ja3MgPSBpbm9kZS0+aV9ibGtzaXplID0gMDsKKwlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCW1lbXNldCgmbWluaXhfaShpbm9kZSktPnUsIDAsIHNpemVvZihtaW5peF9pKGlub2RlKS0+dSkpOwogCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKIAltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL21pbml4L2lub2RlLmMgYi9mcy9taW5peC9pbm9kZS5jCmluZGV4IDMzMGZmOWYuLmMxMWE0YjkgMTAwNjQ0Ci0tLSBhL2ZzL21pbml4L2lub2RlLmMKKysrIGIvZnMvbWluaXgvaW5vZGUuYwpAQCAtOTAsOCArOTAsNyBAQAogCiBzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKIHsKLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG1pbml4X2lub2RlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gIm1pbml4X2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7CisJa21lbV9jYWNoZV9kZXN0cm95KG1pbml4X2lub2RlX2NhY2hlcCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBtaW5peF9zb3BzID0gewpAQCAtMTQ1LDExICsxNDQsMTAgQEAKIAlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CiAJc3RydWN0IG1pbml4X3NiX2luZm8gKnNiaTsKIAotCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaW5peF9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJc2JpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1pbml4X3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNiaSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcy0+c19mc19pbmZvID0gc2JpOwotCW1lbXNldChzYmksIDAsIHNpemVvZihzdHJ1Y3QgbWluaXhfc2JfaW5mbykpOwogCiAJLyogTi5CLiBUaGVzZSBzaG91bGQgYmUgY29tcGlsZS10aW1lIHRlc3RzLgogCSAgIFVuZm9ydHVuYXRlbHkgdGhhdCBpcyBpbXBvc3NpYmxlLiAqLwpAQCAtMjA3LDEwICsyMDUsOSBAQAogCWlmIChzYmktPnNfaW1hcF9ibG9ja3MgPT0gMCB8fCBzYmktPnNfem1hcF9ibG9ja3MgPT0gMCkKIAkJZ290byBvdXRfaWxsZWdhbF9zYjsKIAlpID0gKHNiaS0+c19pbWFwX2Jsb2NrcyArIHNiaS0+c196bWFwX2Jsb2NrcykgKiBzaXplb2YoYmgpOwotCW1hcCA9IGttYWxsb2MoaSwgR0ZQX0tFUk5FTCk7CisJbWFwID0ga3phbGxvYyhpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1hcCkKIAkJZ290byBvdXRfbm9fbWFwOwotCW1lbXNldChtYXAsIDAsIGkpOwogCXNiaS0+c19pbWFwID0gJm1hcFswXTsKIAlzYmktPnNfem1hcCA9ICZtYXBbc2JpLT5zX2ltYXBfYmxvY2tzXTsKIApAQCAtMzk5LDcgKzM5Niw3IEBACiAJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7CiAJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CiAJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7Ci0JaW5vZGUtPmlfYmxvY2tzID0gaW5vZGUtPmlfYmxrc2l6ZSA9IDA7CisJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQogCQltaW5peF9pbm9kZS0+dS5pMV9kYXRhW2ldID0gcmF3X2lub2RlLT5pX3pvbmVbaV07CiAJbWluaXhfc2V0X2lub2RlKGlub2RlLCBvbGRfZGVjb2RlX2RldihyYXdfaW5vZGUtPmlfem9uZVswXSkpOwpAQCAtNDMyLDcgKzQyOSw3IEBACiAJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7CiAJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CiAJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7Ci0JaW5vZGUtPmlfYmxvY2tzID0gaW5vZGUtPmlfYmxrc2l6ZSA9IDA7CisJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKIAkJbWluaXhfaW5vZGUtPnUuaTJfZGF0YVtpXSA9IHJhd19pbm9kZS0+aV96b25lW2ldOwogCW1pbml4X3NldF9pbm9kZShpbm9kZSwgb2xkX2RlY29kZV9kZXYocmF3X2lub2RlLT5pX3pvbmVbMF0pKTsKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IDZiNTkxYzAuLjgwOGU0ZWEgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMzcyLDYgKzM3MiwzMCBAQAogCQlmcHV0KG5kLT5pbnRlbnQub3Blbi5maWxlKTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgZGVudHJ5ICoKK2RvX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgc3RhdHVzID0gZGVudHJ5LT5kX29wLT5kX3JldmFsaWRhdGUoZGVudHJ5LCBuZCk7CisJaWYgKHVubGlrZWx5KHN0YXR1cyA8PSAwKSkgeworCQkvKgorCQkgKiBUaGUgZGVudHJ5IGZhaWxlZCB2YWxpZGF0aW9uLgorCQkgKiBJZiBkX3JldmFsaWRhdGUgcmV0dXJuZWQgMCBhdHRlbXB0IHRvIGludmFsaWRhdGUKKwkJICogdGhlIGRlbnRyeSBvdGhlcndpc2UgZF9yZXZhbGlkYXRlIGlzIGFza2luZyB1cworCQkgKiB0byByZXR1cm4gYSBmYWlsIHN0YXR1cy4KKwkJICovCisJCWlmICghc3RhdHVzKSB7CisJCQlpZiAoIWRfaW52YWxpZGF0ZShkZW50cnkpKSB7CisJCQkJZHB1dChkZW50cnkpOworCQkJCWRlbnRyeSA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkcHV0KGRlbnRyeSk7CisJCQlkZW50cnkgPSBFUlJfUFRSKHN0YXR1cyk7CisJCX0KKwl9CisJcmV0dXJuIGRlbnRyeTsKK30KKwogLyoKICAqIEludGVybmFsIGxvb2t1cCgpIHVzaW5nIHRoZSBuZXcgZ2VuZXJpYyBkY2FjaGUuCiAgKiBTTVAtc2FmZQpAQCAtMzg2LDEyICs0MTAsOSBAQAogCWlmICghZGVudHJ5KQogCQlkZW50cnkgPSBkX2xvb2t1cChwYXJlbnQsIG5hbWUpOwogCi0JaWYgKGRlbnRyeSAmJiBkZW50cnktPmRfb3AgJiYgZGVudHJ5LT5kX29wLT5kX3JldmFsaWRhdGUpIHsKLQkJaWYgKCFkZW50cnktPmRfb3AtPmRfcmV2YWxpZGF0ZShkZW50cnksIG5kKSAmJiAhZF9pbnZhbGlkYXRlKGRlbnRyeSkpIHsKLQkJCWRwdXQoZGVudHJ5KTsKLQkJCWRlbnRyeSA9IE5VTEw7Ci0JCX0KLQl9CisJaWYgKGRlbnRyeSAmJiBkZW50cnktPmRfb3AgJiYgZGVudHJ5LT5kX29wLT5kX3JldmFsaWRhdGUpCisJCWRlbnRyeSA9IGRvX3JldmFsaWRhdGUoZGVudHJ5LCBuZCk7CisKIAlyZXR1cm4gZGVudHJ5OwogfQogCkBAIC00ODQsMTAgKzUwNSw5IEBACiAJICovCiAJbXV0ZXhfdW5sb2NrKCZkaXItPmlfbXV0ZXgpOwogCWlmIChyZXN1bHQtPmRfb3AgJiYgcmVzdWx0LT5kX29wLT5kX3JldmFsaWRhdGUpIHsKLQkJaWYgKCFyZXN1bHQtPmRfb3AtPmRfcmV2YWxpZGF0ZShyZXN1bHQsIG5kKSAmJiAhZF9pbnZhbGlkYXRlKHJlc3VsdCkpIHsKLQkJCWRwdXQocmVzdWx0KTsKKwkJcmVzdWx0ID0gZG9fcmV2YWxpZGF0ZShyZXN1bHQsIG5kKTsKKwkJaWYgKCFyZXN1bHQpCiAJCQlyZXN1bHQgPSBFUlJfUFRSKC1FTk9FTlQpOwotCQl9CiAJfQogCXJldHVybiByZXN1bHQ7CiB9CkBAIC03NjcsMTIgKzc4NywxMiBAQAogCWdvdG8gZG9uZTsKIAogbmVlZF9yZXZhbGlkYXRlOgotCWlmIChkZW50cnktPmRfb3AtPmRfcmV2YWxpZGF0ZShkZW50cnksIG5kKSkKLQkJZ290byBkb25lOwotCWlmIChkX2ludmFsaWRhdGUoZGVudHJ5KSkKLQkJZ290byBkb25lOwotCWRwdXQoZGVudHJ5KTsKLQlnb3RvIG5lZWRfbG9va3VwOworCWRlbnRyeSA9IGRvX3JldmFsaWRhdGUoZGVudHJ5LCBuZCk7CisJaWYgKCFkZW50cnkpCisJCWdvdG8gbmVlZF9sb29rdXA7CisJaWYgKElTX0VSUihkZW50cnkpKQorCQlnb3RvIGZhaWw7CisJZ290byBkb25lOwogCiBmYWlsOgogCXJldHVybiBQVFJfRVJSKGRlbnRyeSk7CmRpZmYgLS1naXQgYS9mcy9uYW1lc3BhY2UuYyBiL2ZzL25hbWVzcGFjZS5jCmluZGV4IGZhN2VkNmE5Zi4uMzZkMTgwOCAxMDA2NDQKLS0tIGEvZnMvbmFtZXNwYWNlLmMKKysrIGIvZnMvbmFtZXNwYWNlLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hY2N0Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgpAQCAtMjgsMTUgKzI5LDYgQEAKIAogZXh0ZXJuIGludCBfX2luaXQgaW5pdF9yb290ZnModm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfU1lTRlMKLWV4dGVybiBpbnQgX19pbml0IHN5c2ZzX2luaXQodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgc3lzZnNfaW5pdCh2b2lkKQotewotCXJldHVybiAwOwotfQotI2VuZGlmCi0KIC8qIHNwaW5sb2NrIGZvciB2ZnNtb3VudCByZWxhdGVkIG9wZXJhdGlvbnMsIGlucGxhY2Ugb2YgZGNhY2hlX2xvY2sgKi8KIF9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wIERFRklORV9TUElOTE9DSyh2ZnNtb3VudF9sb2NrKTsKIApkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvaW5vZGUuYyBiL2ZzL25jcGZzL2lub2RlLmMKaW5kZXggMWRkZjc3Yi4uNDJlM2JlZiAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvaW5vZGUuYworKysgYi9mcy9uY3Bmcy9pbm9kZS5jCkBAIC04MSw4ICs4MSw3IEBACiAKIHN0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQogewotCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobmNwX2lub2RlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gIm5jcF9pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworCWttZW1fY2FjaGVfZGVzdHJveShuY3BfaW5vZGVfY2FjaGVwKTsKIH0KIAogc3RhdGljIGludCBuY3BfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyKiBkYXRhKQpAQCAtMjI0LDcgKzIyMyw2IEBACiAJaW5vZGUtPmlfbmxpbmsgPSAxOwogCWlub2RlLT5pX3VpZCA9IHNlcnZlci0+bS51aWQ7CiAJaW5vZGUtPmlfZ2lkID0gc2VydmVyLT5tLmdpZDsKLQlpbm9kZS0+aV9ibGtzaXplID0gTkNQX0JMT0NLX1NJWkU7CiAKIAluY3BfdXBkYXRlX2RhdGVzKGlub2RlLCAmbndpbmZvLT5pKTsKIAluY3BfdXBkYXRlX2lub2RlKGlub2RlLCBud2luZm8pOwpAQCAtNDExLDExICs0MDksMTAgQEAKICNlbmRpZgogCXN0cnVjdCBuY3BfZW50cnlfaW5mbyBmaW5mbzsKIAotCXNlcnZlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuY3Bfc2VydmVyKSwgR0ZQX0tFUk5FTCk7CisJc2VydmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5jcF9zZXJ2ZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNlcnZlcikKIAkJcmV0dXJuIC1FTk9NRU07CiAJc2ItPnNfZnNfaW5mbyA9IHNlcnZlcjsKLQltZW1zZXQoc2VydmVyLCAwLCBzaXplb2Yoc3RydWN0IG5jcF9zZXJ2ZXIpKTsKIAogCWVycm9yID0gLUVGQVVMVDsKIAlpZiAocmF3X2RhdGEgPT0gTlVMTCkKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL3N5bWxpbmsuYyBiL2ZzL25jcGZzL3N5bWxpbmsuYwppbmRleCBjYTkyYzI0Li5lM2QyNmMxIDEwMDY0NAotLS0gYS9mcy9uY3Bmcy9zeW1saW5rLmMKKysrIGIvZnMvbmNwZnMvc3ltbGluay5jCkBAIC00OCw3ICs0OCw3IEBACiAJY2hhciAqYnVmID0ga21hcChwYWdlKTsKIAogCWVycm9yID0gLUVOT01FTTsKLQlyYXdsaW5rPShjaGFyICopa21hbGxvYyhOQ1BfTUFYX1NZTUxJTktfU0laRSwgR0ZQX0tFUk5FTCk7CisJcmF3bGluayA9IGttYWxsb2MoTkNQX01BWF9TWU1MSU5LX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICghcmF3bGluaykKIAkJZ290byBmYWlsOwogCkBAIC0xMjYsNyArMTI2LDcgQEAKIAkvKiBFUEVSTSBpcyByZXR1cm5lZCBieSBWRlMgaWYgc3ltbGluayBwcm9jZWR1cmUgZG9lcyBub3QgZXhpc3QgKi8KIAkJcmV0dXJuIC1FUEVSTTsKICAgCi0JcmF3bGluaz0oY2hhciAqKWttYWxsb2MoTkNQX01BWF9TWU1MSU5LX1NJWkUsIEdGUF9LRVJORUwpOworCXJhd2xpbmsgPSBrbWFsbG9jKE5DUF9NQVhfU1lNTElOS19TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJhd2xpbmspCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9mcy9uZnMvZGVsZWdhdGlvbi5jIGIvZnMvbmZzL2RlbGVnYXRpb24uYwppbmRleCA1NzEzMzY3Li44NDFjOTlhIDEwMDY0NAotLS0gYS9mcy9uZnMvZGVsZWdhdGlvbi5jCisrKyBiL2ZzL25mcy9kZWxlZ2F0aW9uLmMKQEAgLTIwLDExICsyMCw2IEBACiAjaW5jbHVkZSAiZGVsZWdhdGlvbi5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKm5mc19hbGxvY19kZWxlZ2F0aW9uKHZvaWQpCi17Ci0JcmV0dXJuIChzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmZzX2RlbGVnYXRpb24pLCBHRlBfS0VSTkVMKTsKLX0KLQogc3RhdGljIHZvaWQgbmZzX2ZyZWVfZGVsZWdhdGlvbihzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24pCiB7CiAJaWYgKGRlbGVnYXRpb24tPmNyZWQpCkBAIC0xMjQsNyArMTE5LDcgQEAKIAlpZiAoKG5mc2ktPmNhY2hlX3ZhbGlkaXR5ICYgKE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFfE5GU19JTk9fSU5WQUxJRF9BVFRSKSkpCiAJCV9fbmZzX3JldmFsaWRhdGVfaW5vZGUoTkZTX1NFUlZFUihpbm9kZSksIGlub2RlKTsKIAotCWRlbGVnYXRpb24gPSBuZnNfYWxsb2NfZGVsZWdhdGlvbigpOworCWRlbGVnYXRpb24gPSBrbWFsbG9jKHNpemVvZigqZGVsZWdhdGlvbiksIEdGUF9LRVJORUwpOwogCWlmIChkZWxlZ2F0aW9uID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCW1lbWNweShkZWxlZ2F0aW9uLT5zdGF0ZWlkLmRhdGEsIHJlcy0+ZGVsZWdhdGlvbi5kYXRhLApkaWZmIC0tZ2l0IGEvZnMvbmZzL2RpcmVjdC5jIGIvZnMvbmZzL2RpcmVjdC5jCmluZGV4IDc2Y2ExY2IuLjM3NzgzOWIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9kaXJlY3QuYworKysgYi9mcy9uZnMvZGlyZWN0LmMKQEAgLTg1NSw2ICs4NTUsNSBAQAogICovCiB2b2lkIG5mc19kZXN0cm95X2RpcmVjdGNhY2hlKHZvaWQpCiB7Ci0JaWYgKGttZW1fY2FjaGVfZGVzdHJveShuZnNfZGlyZWN0X2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gIm5mc19kaXJlY3RfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kobmZzX2RpcmVjdF9jYWNoZXApOwogfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2lub2RlLmMgYi9mcy9uZnMvaW5vZGUuYwppbmRleCBlOGMxNDNkLi5iYzkzNzZjIDEwMDY0NAotLS0gYS9mcy9uZnMvaW5vZGUuYworKysgYi9mcy9uZnMvaW5vZGUuYwpAQCAtMjc3LDEwICsyNzcsOCBAQAogCQkJICogcmVwb3J0IHRoZSBibG9ja3MgaW4gNTEyYnl0ZSB1bml0cwogCQkJICovCiAJCQlpbm9kZS0+aV9ibG9ja3MgPSBuZnNfY2FsY19ibG9ja19zaXplKGZhdHRyLT5kdS5uZnMzLnVzZWQpOwotCQkJaW5vZGUtPmlfYmxrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKIAkJfSBlbHNlIHsKIAkJCWlub2RlLT5pX2Jsb2NrcyA9IGZhdHRyLT5kdS5uZnMyLmJsb2NrczsKLQkJCWlub2RlLT5pX2Jsa3NpemUgPSBmYXR0ci0+ZHUubmZzMi5ibG9ja3NpemU7CiAJCX0KIAkJbmZzaS0+YXR0cnRpbWVvID0gTkZTX01JTkFUVFJUSU1FTyhpbm9kZSk7CiAJCW5mc2ktPmF0dHJ0aW1lb190aW1lc3RhbXAgPSBqaWZmaWVzOwpAQCAtNDQzLDcgKzQ0MSw3IEBACiB7CiAJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eDsKIAotCWN0eCA9IChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKWttYWxsb2Moc2l6ZW9mKCpjdHgpLCBHRlBfS0VSTkVMKTsKKwljdHggPSBrbWFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGN0eCAhPSBOVUxMKSB7CiAJCWF0b21pY19zZXQoJmN0eC0+Y291bnQsIDEpOwogCQljdHgtPmRlbnRyeSA9IGRnZXQoZGVudHJ5KTsKQEAgLTk2OSwxMCArOTY3LDggQEAKIAkJICogcmVwb3J0IHRoZSBibG9ja3MgaW4gNTEyYnl0ZSB1bml0cwogCQkgKi8KIAkJaW5vZGUtPmlfYmxvY2tzID0gbmZzX2NhbGNfYmxvY2tfc2l6ZShmYXR0ci0+ZHUubmZzMy51c2VkKTsKLQkJaW5vZGUtPmlfYmxrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKICAJfSBlbHNlIHsKICAJCWlub2RlLT5pX2Jsb2NrcyA9IGZhdHRyLT5kdS5uZnMyLmJsb2NrczsKLSAJCWlub2RlLT5pX2Jsa3NpemUgPSBmYXR0ci0+ZHUubmZzMi5ibG9ja3NpemU7CiAgCX0KIAogCWlmICgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfVjQpICE9IDAgJiYKQEAgLTExMzQsOCArMTEzMCw3IEBACiAKIHN0YXRpYyB2b2lkIG5mc19kZXN0cm95X2lub2RlY2FjaGUodm9pZCkKIHsKLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG5mc19pbm9kZV9jYWNoZXApKQotCQlwcmludGsoS0VSTl9JTkZPICJuZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kobmZzX2lub2RlX2NhY2hlcCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9uZnMvbmFtZXNwYWNlLmMgYi9mcy9uZnMvbmFtZXNwYWNlLmMKaW5kZXggNzdiMDA2OC4uNjA0MDg2NCAxMDA2NDQKLS0tIGEvZnMvbmZzL25hbWVzcGFjZS5jCisrKyBiL2ZzL25mcy9uYW1lc3BhY2UuYwpAQCAtMjYsNiArMjYsMTEgQEAKIHN0YXRpYyBERUNMQVJFX1dPUksobmZzX2F1dG9tb3VudF90YXNrLCBuZnNfZXhwaXJlX2F1dG9tb3VudHMsICZuZnNfYXV0b21vdW50X2xpc3QpOwogaW50IG5mc19tb3VudHBvaW50X2V4cGlyeV90aW1lb3V0ID0gNTAwICogSFo7CiAKK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKm5mc19kb19zdWJtb3VudChjb25zdCBzdHJ1Y3QgdmZzbW91bnQgKm1udF9wYXJlbnQsCisJCQkJCWNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkJc3RydWN0IG5mc19maCAqZmgsCisJCQkJCXN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKTsKKwogLyoKICAqIG5mc19wYXRoIC0gcmVjb25zdHJ1Y3QgdGhlIHBhdGggZ2l2ZW4gYW4gYXJiaXRyYXJ5IGRlbnRyeQogICogQGJhc2UgLSBhcmJpdHJhcnkgc3RyaW5nIHRvIHByZXBlbmQgdG8gdGhlIHBhdGgKQEAgLTIwOSw5ICsyMTQsMTAgQEAKICAqIEBmYXR0ciAtIGF0dHJpYnV0ZXMgZm9yIG5ldyByb290IGlub2RlCiAgKgogICovCi1zdHJ1Y3QgdmZzbW91bnQgKm5mc19kb19zdWJtb3VudChjb25zdCBzdHJ1Y3QgdmZzbW91bnQgKm1udF9wYXJlbnQsCi0JCWNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5mc19maCAqZmgsCi0JCXN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQorc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqbmZzX2RvX3N1Ym1vdW50KGNvbnN0IHN0cnVjdCB2ZnNtb3VudCAqbW50X3BhcmVudCwKKwkJCQkJY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCQlzdHJ1Y3QgbmZzX2ZoICpmaCwKKwkJCQkJc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCiB7CiAJc3RydWN0IG5mc19jbG9uZV9tb3VudCBtb3VudGRhdGEgPSB7CiAJCS5zYiA9IG1udF9wYXJlbnQtPm1udF9zYiwKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMzcHJvYy5jIGIvZnMvbmZzL25mczNwcm9jLmMKaW5kZXggZjg2ODhlYS4uM2IyMzRkNCAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczNwcm9jLmMKKysrIGIvZnMvbmZzL25mczNwcm9jLmMKQEAgLTQ0OSw3ICs0NDksNyBAQAogCQlzdHJ1Y3QgbmZzX2ZhdHRyIHJlczsKIAl9ICpwdHI7CiAKLQlwdHIgPSAoc3RydWN0IHVubGlua3hkciAqKWttYWxsb2Moc2l6ZW9mKCpwdHIpLCBHRlBfS0VSTkVMKTsKKwlwdHIgPSBrbWFsbG9jKHNpemVvZigqcHRyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwdHIpCiAJCXJldHVybiAtRU5PTUVNOwogCXB0ci0+YXJnLmZoID0gTkZTX0ZIKGRpci0+ZF9pbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9uZnMvcGFnZWxpc3QuYyBiL2ZzL25mcy9wYWdlbGlzdC5jCmluZGV4IDM2ZTkwMmEuLjgyOWFmMzIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wYWdlbGlzdC5jCisrKyBiL2ZzL25mcy9wYWdlbGlzdC5jCkBAIC0zOTIsNyArMzkyLDYgQEAKIAogdm9pZCBuZnNfZGVzdHJveV9uZnNwYWdlY2FjaGUodm9pZCkKIHsKLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG5mc19wYWdlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gIm5mc19wYWdlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7CisJa21lbV9jYWNoZV9kZXN0cm95KG5mc19wYWdlX2NhY2hlcCk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9wcm9jLmMgYi9mcy9uZnMvcHJvYy5jCmluZGV4IDYzMGU1MDYuLjQ1MjljYzQgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wcm9jLmMKKysrIGIvZnMvbmZzL3Byb2MuYwpAQCAtMzUyLDcgKzM1Miw3IEBACiB7CiAJc3RydWN0IG5mc19kaXJvcGFyZ3MJKmFyZzsKIAotCWFyZyA9IChzdHJ1Y3QgbmZzX2Rpcm9wYXJncyAqKWttYWxsb2Moc2l6ZW9mKCphcmcpLCBHRlBfS0VSTkVMKTsKKwlhcmcgPSBrbWFsbG9jKHNpemVvZigqYXJnKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhcmcpCiAJCXJldHVybiAtRU5PTUVNOwogCWFyZy0+ZmggPSBORlNfRkgoZGlyLT5kX2lub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9yZWFkLmMgYi9mcy9uZnMvcmVhZC5jCmluZGV4IDY5ZjE1NDkuLmMyZTQ5YzMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9yZWFkLmMKKysrIGIvZnMvbmZzL3JlYWQuYwpAQCAtNzM3LDYgKzczNyw1IEBACiB2b2lkIG5mc19kZXN0cm95X3JlYWRwYWdlY2FjaGUodm9pZCkKIHsKIAltZW1wb29sX2Rlc3Ryb3kobmZzX3JkYXRhX21lbXBvb2wpOwotCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobmZzX3JkYXRhX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gIm5mc19yZWFkX2RhdGE6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kobmZzX3JkYXRhX2NhY2hlcCk7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnMvd3JpdGUuYyBiL2ZzL25mcy93cml0ZS5jCmluZGV4IGMxMmVmZmIuLmI2NzQ0NjIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy93cml0ZS5jCisrKyBiL2ZzL25mcy93cml0ZS5jCkBAIC0xNTY1LDcgKzE1NjUsNiBAQAogewogCW1lbXBvb2xfZGVzdHJveShuZnNfY29tbWl0X21lbXBvb2wpOwogCW1lbXBvb2xfZGVzdHJveShuZnNfd2RhdGFfbWVtcG9vbCk7Ci0JaWYgKGttZW1fY2FjaGVfZGVzdHJveShuZnNfd2RhdGFfY2FjaGVwKSkKLQkJcHJpbnRrKEtFUk5fSU5GTyAibmZzX3dyaXRlX2RhdGE6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kobmZzX3dkYXRhX2NhY2hlcCk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNGlkbWFwLmMgYi9mcy9uZnNkL25mczRpZG1hcC5jCmluZGV4IGJlYTZiOTQuLmIxOTAyZWIgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNGlkbWFwLmMKKysrIGIvZnMvbmZzZC9uZnM0aWRtYXAuYwpAQCAtNTczLDEwICs1NzMsOSBAQAogCXN0cnVjdCBpZG1hcF9kZWZlcl9yZXEgKm1kcjsKIAlpbnQgcmV0OwogCi0JbWRyID0ga21hbGxvYyhzaXplb2YoKm1kciksIEdGUF9LRVJORUwpOworCW1kciA9IGt6YWxsb2Moc2l6ZW9mKCptZHIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW1kcikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KG1kciwgMCwgc2l6ZW9mKCptZHIpKTsKIAlhdG9taWNfc2V0KCZtZHItPmNvdW50LCAxKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtZHItPndhaXRxKTsKIAltZHItPnJlcS5kZWZlciA9IGlkbWFwX2RlZmVyOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0c3RhdGUuYyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKaW5kZXggOWRhYTBiOS4uZWJjZjIyNiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0c3RhdGUuYworKysgYi9mcy9uZnNkL25mczRzdGF0ZS5jCkBAIC0zMzksOCArMzM5LDcgQEAKIHsKIAlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscDsKIAotCWlmICgoY2xwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mczRfY2xpZW50KSwgR0ZQX0tFUk5FTCkpIT0gTlVMTCkgewotCQltZW1zZXQoY2xwLCAwLCBzaXplb2YoKmNscCkpOworCWlmICgoY2xwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5mczRfY2xpZW50KSwgR0ZQX0tFUk5FTCkpIT0gTlVMTCkgewogCQlpZiAoKGNscC0+Y2xfbmFtZS5kYXRhID0ga21hbGxvYyhuYW1lLmxlbiwgR0ZQX0tFUk5FTCkpICE9IE5VTEwpIHsKIAkJCW1lbWNweShjbHAtPmNsX25hbWUuZGF0YSwgbmFtZS5kYXRhLCBuYW1lLmxlbik7CiAJCQljbHAtPmNsX25hbWUubGVuID0gbmFtZS5sZW47CkBAIC0xMDA2LDEzICsxMDA1LDEwIEBACiBzdGF0aWMgdm9pZAogbmZzZDRfZnJlZV9zbGFiKGttZW1fY2FjaGVfdCAqKnNsYWIpCiB7Ci0JaW50IHN0YXR1czsKLQogCWlmICgqc2xhYiA9PSBOVUxMKQogCQlyZXR1cm47Ci0Jc3RhdHVzID0ga21lbV9jYWNoZV9kZXN0cm95KCpzbGFiKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koKnNsYWIpOwogCSpzbGFiID0gTlVMTDsKLQlXQVJOX09OKHN0YXR1cyk7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9mcy9udGZzL2Rpci5jIGIvZnMvbnRmcy9kaXIuYwppbmRleCBkMWUyYzZmLi44NWMzNmI4IDEwMDY0NAotLS0gYS9mcy9udGZzL2Rpci5jCisrKyBiL2ZzL250ZnMvZGlyLmMKQEAgLTExNDksOCArMTE0OSw3IEBACiAJICogQWxsb2NhdGUgYSBidWZmZXIgdG8gc3RvcmUgdGhlIGN1cnJlbnQgbmFtZSBiZWluZyBwcm9jZXNzZWQKIAkgKiBjb252ZXJ0ZWQgdG8gZm9ybWF0IGRldGVybWluZWQgYnkgY3VycmVudCBOTFMuCiAJICovCi0JbmFtZSA9ICh1OCopa21hbGxvYyhOVEZTX01BWF9OQU1FX0xFTiAqIE5MU19NQVhfQ0hBUlNFVF9TSVpFICsgMSwKLQkJCUdGUF9OT0ZTKTsKKwluYW1lID0ga21hbGxvYyhOVEZTX01BWF9OQU1FX0xFTiAqIE5MU19NQVhfQ0hBUlNFVF9TSVpFICsgMSwgR0ZQX05PRlMpOwogCWlmICh1bmxpa2VseSghbmFtZSkpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJfb3V0OwpAQCAtMTE5MSw3ICsxMTkwLDcgQEAKIAkgKiBtYXAgdGhlIG1mdCByZWNvcmQgd2l0aG91dCBkZWFkbG9ja2luZy4KIAkgKi8KIAlyYyA9IGxlMzJfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOwotCWlyID0gKElOREVYX1JPT1QqKWttYWxsb2MocmMsIEdGUF9OT0ZTKTsKKwlpciA9IGttYWxsb2MocmMsIEdGUF9OT0ZTKTsKIAlpZiAodW5saWtlbHkoIWlyKSkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9vdXQ7CmRpZmYgLS1naXQgYS9mcy9udGZzL2lub2RlLmMgYi9mcy9udGZzL2lub2RlLmMKaW5kZXggZDMxM2YzNS4uOTMzZGJkOCAxMDA2NDQKLS0tIGEvZnMvbnRmcy9pbm9kZS5jCisrKyBiL2ZzL250ZnMvaW5vZGUuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAKIAkJQlVHX09OKCFuYS0+bmFtZSk7CiAJCWkgPSBuYS0+bmFtZV9sZW4gKiBzaXplb2YobnRmc2NoYXIpOwotCQluaS0+bmFtZSA9IChudGZzY2hhciopa21hbGxvYyhpICsgc2l6ZW9mKG50ZnNjaGFyKSwgR0ZQX0FUT01JQyk7CisJCW5pLT5uYW1lID0ga21hbGxvYyhpICsgc2l6ZW9mKG50ZnNjaGFyKSwgR0ZQX0FUT01JQyk7CiAJCWlmICghbmktPm5hbWUpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJbWVtY3B5KG5pLT5uYW1lLCBuYS0+bmFtZSwgaSk7CkBAIC01NTYsOCArNTU2LDYgQEAKIAogCS8qIFNldHVwIHRoZSBnZW5lcmljIHZmcyBpbm9kZSBwYXJ0cyBub3cuICovCiAKLQkvKiBUaGlzIGlzIHRoZSBvcHRpbWFsIElPIHNpemUgKGZvciBzdGF0KSwgbm90IHRoZSBmcyBibG9jayBzaXplLiAqLwotCXZpLT5pX2Jsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CiAJLyoKIAkgKiBUaGlzIGlzIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGlub2RlIGhhcyBjaGFuZ2VkIHcuci50LiBhIGZpbGUgc28KIAkgKiB0aGF0IHRoZSBmaWxlIGNhbiBiZSB1cGRhdGVkIGlmIG5lY2Vzc2FyeSAoY29tcGFyZSB3aXRoIGZfdmVyc2lvbikuCkBAIC0xMjM0LDcgKzEyMzIsNiBAQAogCWJhc2VfbmkgPSBOVEZTX0koYmFzZV92aSk7CiAKIAkvKiBKdXN0IG1pcnJvciB0aGUgdmFsdWVzIGZyb20gdGhlIGJhc2UgaW5vZGUuICovCi0JdmktPmlfYmxrc2l6ZQk9IGJhc2VfdmktPmlfYmxrc2l6ZTsKIAl2aS0+aV92ZXJzaW9uCT0gYmFzZV92aS0+aV92ZXJzaW9uOwogCXZpLT5pX3VpZAk9IGJhc2VfdmktPmlfdWlkOwogCXZpLT5pX2dpZAk9IGJhc2VfdmktPmlfZ2lkOwpAQCAtMTUwNCw3ICsxNTAxLDYgQEAKIAluaQk9IE5URlNfSSh2aSk7CiAJYmFzZV9uaSA9IE5URlNfSShiYXNlX3ZpKTsKIAkvKiBKdXN0IG1pcnJvciB0aGUgdmFsdWVzIGZyb20gdGhlIGJhc2UgaW5vZGUuICovCi0JdmktPmlfYmxrc2l6ZQk9IGJhc2VfdmktPmlfYmxrc2l6ZTsKIAl2aS0+aV92ZXJzaW9uCT0gYmFzZV92aS0+aV92ZXJzaW9uOwogCXZpLT5pX3VpZAk9IGJhc2VfdmktPmlfdWlkOwogCXZpLT5pX2dpZAk9IGJhc2VfdmktPmlfZ2lkOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9tZnQuYyBiL2ZzL250ZnMvbWZ0LmMKaW5kZXggMjQzOGMwMC4uNTg0MjYwZiAxMDA2NDQKLS0tIGEvZnMvbnRmcy9tZnQuYworKysgYi9mcy9udGZzL21mdC5jCkBAIC0zMzEsNyArMzMxLDcgQEAKIAkJbnRmc19pbm9kZSAqKnRtcDsKIAkJaW50IG5ld19zaXplID0gKGJhc2VfbmktPm5yX2V4dGVudHMgKyA0KSAqIHNpemVvZihudGZzX2lub2RlICopOwogCi0JCXRtcCA9IChudGZzX2lub2RlICoqKWttYWxsb2MobmV3X3NpemUsIEdGUF9OT0ZTKTsKKwkJdG1wID0ga21hbGxvYyhuZXdfc2l6ZSwgR0ZQX05PRlMpOwogCQlpZiAodW5saWtlbHkoIXRtcCkpIHsKIAkJCW50ZnNfZXJyb3IoYmFzZV9uaS0+dm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSAiCiAJCQkJCSJpbnRlcm5hbCBidWZmZXIuIik7CkBAIC0yNjM4LDExICsyNjM4LDYgQEAKIAkJfQogCQl2aS0+aV9pbm8gPSBiaXQ7CiAJCS8qCi0JCSAqIFRoaXMgaXMgdGhlIG9wdGltYWwgSU8gc2l6ZSAoZm9yIHN0YXQpLCBub3QgdGhlIGZzIGJsb2NrCi0JCSAqIHNpemUuCi0JCSAqLwotCQl2aS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOwotCQkvKgogCQkgKiBUaGlzIGlzIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGlub2RlIGhhcyBjaGFuZ2VkIHcuci50LiBhCiAJCSAqIGZpbGUgc28gdGhhdCB0aGUgZmlsZSBjYW4gYmUgdXBkYXRlZCBpZiBuZWNlc3NhcnkgKGNvbXBhcmUKIAkJICogd2l0aCBmX3ZlcnNpb24pLgpAQCAtMjg5Myw3ICsyODg4LDcgQEAKIAlpZiAoIShiYXNlX25pLT5ucl9leHRlbnRzICYgMykpIHsKIAkJaW50IG5ld19zaXplID0gKGJhc2VfbmktPm5yX2V4dGVudHMgKyA0KSAqIHNpemVvZihudGZzX2lub2RlKik7CiAKLQkJZXh0ZW50X25pcyA9IChudGZzX2lub2RlKiopa21hbGxvYyhuZXdfc2l6ZSwgR0ZQX05PRlMpOworCQlleHRlbnRfbmlzID0ga21hbGxvYyhuZXdfc2l6ZSwgR0ZQX05PRlMpOwogCQlpZiAodW5saWtlbHkoIWV4dGVudF9uaXMpKSB7CiAJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYWxsb2NhdGUgaW50ZXJuYWwgIgogCQkJCQkiYnVmZmVyIGR1cmluZyByb2xsYmFjay4lcyIsIGVzKTsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvc3VwZXIuYyBiL2ZzL250ZnMvc3VwZXIuYwppbmRleCA3NGUwZWU4Li42YjI3MTJmIDEwMDY0NAotLS0gYS9mcy9udGZzL3N1cGVyLmMKKysrIGIvZnMvbnRmcy9zdXBlci5jCkBAIC0zMjQ4LDMyICszMjQ4LDE0IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBleGl0X250ZnNfZnModm9pZCkKIHsKLQlpbnQgZXJyID0gMDsKLQogCW50ZnNfZGVidWcoIlVucmVnaXN0ZXJpbmcgTlRGUyBkcml2ZXIuIik7CiAKIAl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJm50ZnNfZnNfdHlwZSk7Ci0KLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG50ZnNfYmlnX2lub2RlX2NhY2hlKSAmJiAoZXJyID0gMSkpCi0JCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byBkZXN0b3J5ICVzLlxuIiwKLQkJCQludGZzX2JpZ19pbm9kZV9jYWNoZV9uYW1lKTsKLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG50ZnNfaW5vZGVfY2FjaGUpICYmIChlcnIgPSAxKSkKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogRmFpbGVkIHRvIGRlc3RvcnkgJXMuXG4iLAotCQkJCW50ZnNfaW5vZGVfY2FjaGVfbmFtZSk7Ci0JaWYgKGttZW1fY2FjaGVfZGVzdHJveShudGZzX25hbWVfY2FjaGUpICYmIChlcnIgPSAxKSkKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogRmFpbGVkIHRvIGRlc3RvcnkgJXMuXG4iLAotCQkJCW50ZnNfbmFtZV9jYWNoZV9uYW1lKTsKLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG50ZnNfYXR0cl9jdHhfY2FjaGUpICYmIChlcnIgPSAxKSkKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogRmFpbGVkIHRvIGRlc3RvcnkgJXMuXG4iLAotCQkJCW50ZnNfYXR0cl9jdHhfY2FjaGVfbmFtZSk7Ci0JaWYgKGttZW1fY2FjaGVfZGVzdHJveShudGZzX2luZGV4X2N0eF9jYWNoZSkgJiYgKGVyciA9IDEpKQotCQlwcmludGsoS0VSTl9DUklUICJOVEZTOiBGYWlsZWQgdG8gZGVzdG9yeSAlcy5cbiIsCi0JCQkJbnRmc19pbmRleF9jdHhfY2FjaGVfbmFtZSk7Ci0JaWYgKGVycikKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogVGhpcyBjYXVzZXMgbWVtb3J5IHRvIGxlYWshIFRoZXJlIGlzICIKLQkJCQkicHJvYmFibHkgYSBCVUcgaW4gdGhlIGRyaXZlciEgUGxlYXNlIHJlcG9ydCAiCi0JCQkJInlvdSBzYXcgdGhpcyBtZXNzYWdlIHRvICIKLQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuc291cmNlZm9yZ2UubmV0XG4iKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kobnRmc19iaWdfaW5vZGVfY2FjaGUpOworCWttZW1fY2FjaGVfZGVzdHJveShudGZzX2lub2RlX2NhY2hlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kobnRmc19uYW1lX2NhY2hlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kobnRmc19hdHRyX2N0eF9jYWNoZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KG50ZnNfaW5kZXhfY3R4X2NhY2hlKTsKIAkvKiBVbnJlZ2lzdGVyIHRoZSBudGZzIHN5c2N0bHMuICovCiAJbnRmc19zeXNjdGwoMCk7CiB9CmRpZmYgLS1naXQgYS9mcy9udGZzL3VuaXN0ci5jIGIvZnMvbnRmcy91bmlzdHIuYwppbmRleCBiMTIzYzBmLi5hMWI1NzIxIDEwMDY0NAotLS0gYS9mcy9udGZzL3VuaXN0ci5jCisrKyBiL2ZzL250ZnMvdW5pc3RyLmMKQEAgLTM1MCw3ICszNTAsNyBAQAogCQl9CiAJCWlmICghbnMpIHsKIAkJCW5zX2xlbiA9IGluc19sZW4gKiBOTFNfTUFYX0NIQVJTRVRfU0laRTsKLQkJCW5zID0gKHVuc2lnbmVkIGNoYXIqKWttYWxsb2MobnNfbGVuICsgMSwgR0ZQX05PRlMpOworCQkJbnMgPSBrbWFsbG9jKG5zX2xlbiArIDEsIEdGUF9OT0ZTKTsKIAkJCWlmICghbnMpCiAJCQkJZ290byBtZW1fZXJyX291dDsKIAkJfQpAQCAtMzY1LDcgKzM2NSw3IEBACiAJCQllbHNlIGlmICh3YyA9PSAtRU5BTUVUT09MT05HICYmIG5zICE9ICpvdXRzKSB7CiAJCQkJdW5zaWduZWQgY2hhciAqdGM7CiAJCQkJLyogR3JvdyBpbiBtdWx0aXBsZXMgb2YgNjQgYnl0ZXMuICovCi0JCQkJdGMgPSAodW5zaWduZWQgY2hhciopa21hbGxvYygobnNfbGVuICsgNjQpICYKKwkJCQl0YyA9IGttYWxsb2MoKG5zX2xlbiArIDY0KSAmCiAJCQkJCQl+NjMsIEdGUF9OT0ZTKTsKIAkJCQlpZiAodGMpIHsKIAkJCQkJbWVtY3B5KHRjLCBucywgbnNfbGVuKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1mcy5jIGIvZnMvb2NmczIvZGxtL2RsbWZzLmMKaW5kZXggMDMzYWQxNy4uMDM2OGM2NCAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWZzLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWZzLmMKQEAgLTMzNSw3ICszMzUsNiBAQAogCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CiAJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOwotCQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJmRsbWZzX2JhY2tpbmdfZGV2X2luZm87CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKQEAgLTM2Miw3ICszNjEsNiBAQAogCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCWlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOwogCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOwotCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CiAJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJmRsbWZzX2JhY2tpbmdfZGV2X2luZm87CiAJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwpAQCAtNjI5LDkgKzYyNyw3IEBACiAJZmx1c2hfd29ya3F1ZXVlKHVzZXJfZGxtX3dvcmtlcik7CiAJZGVzdHJveV93b3JrcXVldWUodXNlcl9kbG1fd29ya2VyKTsKIAotCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koZGxtZnNfaW5vZGVfY2FjaGUpKQotCQlwcmludGsoS0VSTl9JTkZPICJkbG1mc19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzICIKLQkJICAgICAgICJ3ZXJlIGZyZWVkXG4iKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koZGxtZnNfaW5vZGVfY2FjaGUpOwogfQogCiBNT0RVTEVfQVVUSE9SKCJPcmFjbGUiKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbWdsdWUuYyBiL2ZzL29jZnMyL2RsbWdsdWUuYwppbmRleCBkZTg4NzA2Li44ODAxZTQxIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG1nbHVlLmMKKysrIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCkBAIC0yMDUyLDcgKzIwNTIsNyBAQAogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gb3V0OwogCX0KLQlvc2IgPSAoc3RydWN0IG9jZnMyX3N1cGVyICopIGlub2RlLT51LmdlbmVyaWNfaXA7CisJb3NiID0gaW5vZGUtPmlfcHJpdmF0ZTsKIAlvY2ZzMl9nZXRfZGxtX2RlYnVnKG9zYi0+b3NiX2RsbV9kZWJ1Zyk7CiAJcHJpdi0+cF9kbG1fZGVidWcgPSBvc2ItPm9zYl9kbG1fZGVidWc7CiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnBfaXRlcl9yZXMubF9kZWJ1Z19saXN0KTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2lub2RlLmMgYi9mcy9vY2ZzMi9pbm9kZS5jCmluZGV4IDY5ZDNkYjUuLjE2ZThlNzQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2lub2RlLmMKKysrIGIvZnMvb2NmczIvaW5vZGUuYwpAQCAtMjY5LDcgKzI2OSw2IEBACiAJaW5vZGUtPmlfbW9kZSA9IGxlMTZfdG9fY3B1KGZlLT5pX21vZGUpOwogCWlub2RlLT5pX3VpZCA9IGxlMzJfdG9fY3B1KGZlLT5pX3VpZCk7CiAJaW5vZGUtPmlfZ2lkID0gbGUzMl90b19jcHUoZmUtPmlfZ2lkKTsKLQlpbm9kZS0+aV9ibGtzaXplID0gKHUzMilvc2ItPnNfY2x1c3RlcnNpemU7CiAKIAkvKiBGYXN0IHN5bWxpbmtzIHdpbGwgaGF2ZSBpX3NpemUgYnV0IG5vIGFsbG9jYXRlZCBjbHVzdGVycy4gKi8KIAlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSAmJiAhZmUtPmlfY2x1c3RlcnMpCkBAIC0xMjU4LDggKzEyNTcsNiBAQAogdm9pZCBvY2ZzMl9yZWZyZXNoX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgc3RydWN0IG9jZnMyX2Rpbm9kZSAqZmUpCiB7Ci0Jc3RydWN0IG9jZnMyX3N1cGVyICpvc2IgPSBPQ0ZTMl9TQihpbm9kZS0+aV9zYik7Ci0KIAlzcGluX2xvY2soJk9DRlMyX0koaW5vZGUpLT5pcF9sb2NrKTsKIAogCU9DRlMyX0koaW5vZGUpLT5pcF9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKTsKQEAgLTEyNzAsNyArMTI2Nyw2IEBACiAJaW5vZGUtPmlfdWlkID0gbGUzMl90b19jcHUoZmUtPmlfdWlkKTsKIAlpbm9kZS0+aV9naWQgPSBsZTMyX3RvX2NwdShmZS0+aV9naWQpOwogCWlub2RlLT5pX21vZGUgPSBsZTE2X3RvX2NwdShmZS0+aV9tb2RlKTsKLQlpbm9kZS0+aV9ibGtzaXplID0gKHUzMikgb3NiLT5zX2NsdXN0ZXJzaXplOwogCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpICYmIGxlMzJfdG9fY3B1KGZlLT5pX2NsdXN0ZXJzKSA9PSAwKQogCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCWVsc2UKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvZWZpLmMgYi9mcy9wYXJ0aXRpb25zL2VmaS5jCmluZGV4IDYzNzMwMjguLjFiZWE2MTAgMTAwNjQ0Ci0tLSBhL2ZzL3BhcnRpdGlvbnMvZWZpLmMKKysrIGIvZnMvcGFydGl0aW9ucy9lZmkuYwpAQCAtMjM4LDEwICsyMzgsOSBAQAogICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1KGdwdC0+c2l6ZW9mX3BhcnRpdGlvbl9lbnRyeSk7CiAJaWYgKCFjb3VudCkKIAkJcmV0dXJuIE5VTEw7Ci0JcHRlID0ga21hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisJcHRlID0ga3phbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwdGUpCiAJCXJldHVybiBOVUxMOwotCW1lbXNldChwdGUsIDAsIGNvdW50KTsKIAogCWlmIChyZWFkX2xiYShiZGV2LCBsZTY0X3RvX2NwdShncHQtPnBhcnRpdGlvbl9lbnRyeV9sYmEpLAogICAgICAgICAgICAgICAgICAgICAgKHU4ICopIHB0ZSwKQEAgLTI2OSwxMCArMjY4LDkgQEAKIAlpZiAoIWJkZXYpCiAJCXJldHVybiBOVUxMOwogCi0JZ3B0ID0ga21hbGxvYyhzaXplb2YgKGdwdF9oZWFkZXIpLCBHRlBfS0VSTkVMKTsKKwlncHQgPSBremFsbG9jKHNpemVvZiAoZ3B0X2hlYWRlciksIEdGUF9LRVJORUwpOwogCWlmICghZ3B0KQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQoZ3B0LCAwLCBzaXplb2YgKGdwdF9oZWFkZXIpKTsKIAogCWlmIChyZWFkX2xiYShiZGV2LCBsYmEsICh1OCAqKSBncHQsCiAJCSAgICAgc2l6ZW9mIChncHRfaGVhZGVyKSkgPCBzaXplb2YgKGdwdF9oZWFkZXIpKSB7CkBAIC01MjYsOSArNTI0LDggQEAKIAlsYXN0bGJhID0gbGFzdF9sYmEoYmRldik7CiAgICAgICAgIGlmICghZm9yY2VfZ3B0KSB7CiAgICAgICAgICAgICAgICAgLyogVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBFRkkgU3BlYy4gcGVyIEludGVsIGFmdGVyIHYxLjAyLiAqLwotICAgICAgICAgICAgICAgIGxlZ2FjeW1iciA9IGttYWxsb2Moc2l6ZW9mICgqbGVnYWN5bWJyKSwgR0ZQX0tFUk5FTCk7CisgICAgICAgICAgICAgICAgbGVnYWN5bWJyID0ga3phbGxvYyhzaXplb2YgKCpsZWdhY3ltYnIpLCBHRlBfS0VSTkVMKTsKICAgICAgICAgICAgICAgICBpZiAobGVnYWN5bWJyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobGVnYWN5bWJyLCAwLCBzaXplb2YgKCpsZWdhY3ltYnIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfbGJhKGJkZXYsIDAsICh1OCAqKSBsZWdhY3ltYnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCpsZWdhY3ltYnIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2RfcG1iciA9IGlzX3BtYnJfdmFsaWQobGVnYWN5bWJyLCBsYXN0bGJhKTsKZGlmZiAtLWdpdCBhL2ZzL3BpcGUuYyBiL2ZzL3BpcGUuYwppbmRleCAyMDM1MjU3Li5mM2I2ZjcxIDEwMDY0NAotLS0gYS9mcy9waXBlLmMKKysrIGIvZnMvcGlwZS5jCkBAIC04NzksNyArODc5LDYgQEAKIAlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKIAlpbm9kZS0+aV9naWQgPSBjdXJyZW50LT5mc2dpZDsKIAlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsKIAogCXJldHVybiBpbm9kZTsKIApkaWZmIC0tZ2l0IGEvZnMvcHJvYy9pbnRlcm5hbC5oIGIvZnMvcHJvYy9pbnRlcm5hbC5oCmluZGV4IDE0NmE0MzQuLjk4N2M3NzMgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvaW50ZXJuYWwuaAorKysgYi9mcy9wcm9jL2ludGVybmFsLmgKQEAgLTI4LDYgKzI4LDcgQEAKIAkodm1pKS0+bGFyZ2VzdF9jaHVuayA9IDA7CQlcCiB9IHdoaWxlKDApCiAKK2V4dGVybiBpbnQgbm9tbXVfdm1hX3Nob3coc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKICNlbmRpZgogCiBleHRlcm4gdm9pZCBjcmVhdGVfc2VxX2VudHJ5KGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLCBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmKTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2Mva2NvcmUuYyBiL2ZzL3Byb2Mva2NvcmUuYwppbmRleCA2YTk4NGY2Li4zY2VmZjM4IDEwMDY0NAotLS0gYS9mcy9wcm9jL2tjb3JlLmMKKysrIGIvZnMvcHJvYy9rY29yZS5jCkBAIC0yNzksMTIgKzI3OSwxMSBAQAogCQl0c3ogPSBlbGZfYnVmbGVuIC0gKmZwb3M7CiAJCWlmIChidWZsZW4gPCB0c3opCiAJCQl0c3ogPSBidWZsZW47Ci0JCWVsZl9idWYgPSBrbWFsbG9jKGVsZl9idWZsZW4sIEdGUF9BVE9NSUMpOworCQllbGZfYnVmID0ga3phbGxvYyhlbGZfYnVmbGVuLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFlbGZfYnVmKSB7CiAJCQlyZWFkX3VubG9jaygma2NsaXN0X2xvY2spOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KLQkJbWVtc2V0KGVsZl9idWYsIDAsIGVsZl9idWZsZW4pOwogCQllbGZfa2NvcmVfc3RvcmVfaGRyKGVsZl9idWYsIG5waGRyLCBlbGZfYnVmbGVuKTsKIAkJcmVhZF91bmxvY2soJmtjbGlzdF9sb2NrKTsKIAkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGVsZl9idWYgKyAqZnBvcywgdHN6KSkgewpAQCAtMzMwLDEwICszMjksOSBAQAogCQkJdW5zaWduZWQgbG9uZyBjdXJzdGFydCA9IHN0YXJ0OwogCQkJdW5zaWduZWQgbG9uZyBjdXJzaXplID0gdHN6OwogCi0JCQllbGZfYnVmID0ga21hbGxvYyh0c3osIEdGUF9LRVJORUwpOworCQkJZWxmX2J1ZiA9IGt6YWxsb2ModHN6LCBHRlBfS0VSTkVMKTsKIAkJCWlmICghZWxmX2J1ZikKIAkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCW1lbXNldChlbGZfYnVmLCAwLCB0c3opOwogCiAJCQlyZWFkX2xvY2soJnZtbGlzdF9sb2NrKTsKIAkJCWZvciAobT12bWxpc3Q7IG0gJiYgY3Vyc2l6ZTsgbT1tLT5uZXh0KSB7CmRpZmYgLS1naXQgYS9mcy9wcm9jL25vbW11LmMgYi9mcy9wcm9jL25vbW11LmMKaW5kZXggY2ZmMTBhYi4uZDdkYmRmOSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9ub21tdS5jCisrKyBiL2ZzL3Byb2Mvbm9tbXUuYwpAQCAtMzMsMTkgKzMzLDE1IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogLyoKLSAqIGRpc3BsYXkgYSBsaXN0IG9mIGFsbCB0aGUgVk1BcyB0aGUga2VybmVsIGtub3dzIGFib3V0Ci0gKiAtIG5vbW11IGtlcm5hbHMgaGF2ZSBhIHNpbmdsZSBmbGF0IGxpc3QKKyAqIGRpc3BsYXkgYSBzaW5nbGUgVk1BIHRvIGEgc2VxdWVuY2VkIGZpbGUKICAqLwotc3RhdGljIGludCBub21tdV92bWFfbGlzdF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK2ludCBub21tdV92bWFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCXVuc2lnbmVkIGxvbmcgaW5vID0gMDsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKIAlkZXZfdCBkZXYgPSAwOwogCWludCBmbGFncywgbGVuOwogCi0Jdm1hID0gcmJfZW50cnkoKHN0cnVjdCByYl9ub2RlICopIHYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCwgdm1fcmIpOwotCiAJZmxhZ3MgPSB2bWEtPnZtX2ZsYWdzOwogCWZpbGUgPSB2bWEtPnZtX2ZpbGU7CiAKQEAgLTc4LDYgKzc0LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBkaXNwbGF5IGEgbGlzdCBvZiBhbGwgdGhlIFZNQXMgdGhlIGtlcm5lbCBrbm93cyBhYm91dAorICogLSBub21tdSBrZXJuYWxzIGhhdmUgYSBzaW5nbGUgZmxhdCBsaXN0CisgKi8KK3N0YXRpYyBpbnQgbm9tbXVfdm1hX2xpc3Rfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisKKwl2bWEgPSByYl9lbnRyeSgoc3RydWN0IHJiX25vZGUgKikgdiwgc3RydWN0IHZtX2FyZWFfc3RydWN0LCB2bV9yYik7CisJcmV0dXJuIG5vbW11X3ZtYV9zaG93KG0sIHZtYSk7Cit9CisKIHN0YXRpYyB2b2lkICpub21tdV92bWFfbGlzdF9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqX3JiOwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy90YXNrX21tdS5jIGIvZnMvcHJvYy90YXNrX21tdS5jCmluZGV4IDBhMTYzYTQuLjZiNzY5YWYgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvdGFza19tbXUuYworKysgYi9mcy9wcm9jL3Rhc2tfbW11LmMKQEAgLTEyMiwxMSArMTIyLDYgQEAKIAl1bnNpZ25lZCBsb25nIHByaXZhdGVfZGlydHk7CiB9OwogCi1fX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgY29uc3QgY2hhciAqYXJjaF92bWFfbmFtZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlyZXR1cm4gTlVMTDsKLX0KLQogc3RhdGljIGludCBzaG93X21hcF9pbnRlcm5hbChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIHN0cnVjdCBtZW1fc2l6ZV9zdGF0cyAqbXNzKQogewogCXN0cnVjdCBwcm9jX21hcHNfcHJpdmF0ZSAqcHJpdiA9IG0tPnByaXZhdGU7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Rhc2tfbm9tbXUuYyBiL2ZzL3Byb2MvdGFza19ub21tdS5jCmluZGV4IDQ2MTZlZDUuLjA5MWFhOGUgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvdGFza19ub21tdS5jCisrKyBiL2ZzL3Byb2MvdGFza19ub21tdS5jCkBAIC0xMzgsMjUgKzEzOCw2MyBAQAogfQogCiAvKgotICogQWxiZXJ0IEQuIENhaGFsYW4gc3VnZ2VzdGVkIHRvIGZha2UgZW50cmllcyBmb3IgdGhlIHRyYWRpdGlvbmFsCi0gKiBzZWN0aW9ucyBoZXJlLiAgVGhpcyBtaWdodCBiZSB3b3J0aCBpbnZlc3RpZ2F0aW5nLgorICogZGlzcGxheSBtYXBwaW5nIGxpbmVzIGZvciBhIHBhcnRpY3VsYXIgcHJvY2VzcydzIC9wcm9jL3BpZC9tYXBzCiAgKi8KLXN0YXRpYyBpbnQgc2hvd19tYXAoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQorc3RhdGljIGludCBzaG93X21hcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKl92bWwpCiB7Ci0JcmV0dXJuIDA7CisJc3RydWN0IHZtX2xpc3Rfc3RydWN0ICp2bWwgPSBfdm1sOworCXJldHVybiBub21tdV92bWFfc2hvdyhtLCB2bWwtPnZtYSk7CiB9CisKIHN0YXRpYyB2b2lkICptX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCiB7CisJc3RydWN0IHByb2NfbWFwc19wcml2YXRlICpwcml2ID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QgKnZtbDsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlsb2ZmX3QgbiA9ICpwb3M7CisKKwkvKiBwaW4gdGhlIHRhc2sgYW5kIG1tIHdoaWxzdCB3ZSBwbGF5IHdpdGggdGhlbSAqLworCXByaXYtPnRhc2sgPSBnZXRfcGlkX3Rhc2socHJpdi0+cGlkLCBQSURUWVBFX1BJRCk7CisJaWYgKCFwcml2LT50YXNrKQorCQlyZXR1cm4gTlVMTDsKKworCW1tID0gZ2V0X3Rhc2tfbW0ocHJpdi0+dGFzayk7CisJaWYgKCFtbSkgeworCQlwdXRfdGFza19zdHJ1Y3QocHJpdi0+dGFzayk7CisJCXByaXYtPnRhc2sgPSBOVUxMOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisKKwkvKiBzdGFydCBmcm9tIHRoZSBOdGggVk1BICovCisJZm9yICh2bWwgPSBtbS0+Y29udGV4dC52bWxpc3Q7IHZtbDsgdm1sID0gdm1sLT5uZXh0KQorCQlpZiAobi0tID09IDApCisJCQlyZXR1cm4gdm1sOwogCXJldHVybiBOVUxMOwogfQotc3RhdGljIHZvaWQgbV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKKworc3RhdGljIHZvaWQgbV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqX3ZtbCkKIHsKKwlzdHJ1Y3QgcHJvY19tYXBzX3ByaXZhdGUgKnByaXYgPSBtLT5wcml2YXRlOworCisJaWYgKHByaXYtPnRhc2spIHsKKwkJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBwcml2LT50YXNrLT5tbTsKKwkJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwkJbW1wdXQobW0pOworCQlwdXRfdGFza19zdHJ1Y3QocHJpdi0+dGFzayk7CisJfQogfQotc3RhdGljIHZvaWQgKm1fbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQorCitzdGF0aWMgdm9pZCAqbV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqX3ZtbCwgbG9mZl90ICpwb3MpCiB7Ci0JcmV0dXJuIE5VTEw7CisJc3RydWN0IHZtX2xpc3Rfc3RydWN0ICp2bWwgPSBfdm1sOworCisJKCpwb3MpKys7CisJcmV0dXJuIHZtbCA/IHZtbC0+bmV4dCA6IE5VTEw7CiB9Ci1zdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIHByb2NfcGlkX21hcHNfb3AgPSB7CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19waWRfbWFwc19vcHMgPSB7CiAJLnN0YXJ0CT0gbV9zdGFydCwKIAkubmV4dAk9IG1fbmV4dCwKIAkuc3RvcAk9IG1fc3RvcCwKQEAgLTE2NSwxMSArMjAzLDE5IEBACiAKIHN0YXRpYyBpbnQgbWFwc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCWludCByZXQ7Ci0JcmV0ID0gc2VxX29wZW4oZmlsZSwgJnByb2NfcGlkX21hcHNfb3ApOwotCWlmICghcmV0KSB7Ci0JCXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQkJbS0+cHJpdmF0ZSA9IE5VTEw7CisJc3RydWN0IHByb2NfbWFwc19wcml2YXRlICpwcml2OworCWludCByZXQgPSAtRU5PTUVNOworCisJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYpIHsKKwkJcHJpdi0+cGlkID0gcHJvY19waWQoaW5vZGUpOworCQlyZXQgPSBzZXFfb3BlbihmaWxlLCAmcHJvY19waWRfbWFwc19vcHMpOworCQlpZiAoIXJldCkgeworCQkJc3RydWN0IHNlcV9maWxlICptID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQkJbS0+cHJpdmF0ZSA9IHByaXY7CisJCX0gZWxzZSB7CisJCQlrZnJlZShwcml2KTsKKwkJfQogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtMTc4LDYgKzIyNCw2IEBACiAJLm9wZW4JCT0gbWFwc19vcGVuLAogCS5yZWFkCQk9IHNlcV9yZWFkLAogCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAotCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZV9wcml2YXRlLAogfTsKIApkaWZmIC0tZ2l0IGEvZnMvcW54NC9pbm9kZS5jIGIvZnMvcW54NC9pbm9kZS5jCmluZGV4IDVhOTAzNDkuLjVhNDFkYjIgMTAwNjQ0Ci0tLSBhL2ZzL3FueDQvaW5vZGUuYworKysgYi9mcy9xbng0L2lub2RlLmMKQEAgLTM1OCwxMSArMzU4LDEwIEBACiAJY29uc3QgY2hhciAqZXJybXNnOwogCXN0cnVjdCBxbng0X3NiX2luZm8gKnFzOwogCi0JcXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcW54NF9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJcXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcW54NF9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFxcykKIAkJcmV0dXJuIC1FTk9NRU07CiAJcy0+c19mc19pbmZvID0gcXM7Ci0JbWVtc2V0KHFzLCAwLCBzaXplb2Yoc3RydWN0IHFueDRfc2JfaW5mbykpOwogCiAJc2Jfc2V0X2Jsb2Nrc2l6ZShzLCBRTlg0X0JMT0NLX1NJWkUpOwogCkBAIC00OTcsNyArNDk2LDYgQEAKIAlpbm9kZS0+aV9jdGltZS50dl9zZWMgICA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+ZGlfY3RpbWUpOwogCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOwogCWlub2RlLT5pX2Jsb2NrcyAgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmRpX2ZpcnN0X3h0bnQueHRudF9zaXplKTsKLQlpbm9kZS0+aV9ibGtzaXplID0gUU5YNF9ESVJfRU5UUllfU0laRTsKIAogCW1lbWNweShxbng0X2lub2RlLCByYXdfaW5vZGUsIFFOWDRfRElSX0VOVFJZX1NJWkUpOwogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CkBAIC01NTcsOSArNTU1LDcgQEAKIAogc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCiB7Ci0JaWYgKGttZW1fY2FjaGVfZGVzdHJveShxbng0X2lub2RlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJxbng0X2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7CisJa21lbV9jYWNoZV9kZXN0cm95KHFueDRfaW5vZGVfY2FjaGVwKTsKIH0KIAogc3RhdGljIGludCBxbng0X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKZGlmZiAtLWdpdCBhL2ZzL3JhbWZzL2lub2RlLmMgYi9mcy9yYW1mcy9pbm9kZS5jCmluZGV4IGI5Njc3MzMuLmJjMGU1MTYgMTAwNjQ0Ci0tLSBhL2ZzL3JhbWZzL2lub2RlLmMKKysrIGIvZnMvcmFtZnMvaW5vZGUuYwpAQCAtNTgsNyArNTgsNiBAQAogCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CiAJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOwotCQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZyYW1mc19hb3BzOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJnJhbWZzX2JhY2tpbmdfZGV2X2luZm87CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pbm9kZS5jIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwppbmRleCA1MmYxZTIxLi44ODEwZmRhIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9pbm9kZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2lub2RlLmMKQEAgLTE3LDggKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgogCi1leHRlcm4gaW50IHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZTsJLyogZGVmYXVsdCBpbyBzaXplIGRldnVuZWQgaW4gc3VwZXIuYyAqLwotCiBzdGF0aWMgaW50IHJlaXNlcmZzX2NvbW1pdF93cml0ZShzdHJ1Y3QgZmlsZSAqZiwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkJIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKTsKIHN0YXRpYyBpbnQgcmVpc2VyZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZiwgc3RydWN0IHBhZ2UgKnBhZ2UsCkBAIC0xMTIyLDcgKzExMjAsNiBAQAogCWloID0gUEFUSF9QSVRFTV9IRUFEKHBhdGgpOwogCiAJY29weV9rZXkoSU5PREVfUEtFWShpbm9kZSksICYoaWgtPmloX2tleSkpOwotCWlub2RlLT5pX2Jsa3NpemUgPSByZWlzZXJmc19kZWZhdWx0X2lvX3NpemU7CiAKIAlJTklUX0xJU1RfSEVBRCgmKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2xpc3QpKTsKIAlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyA9IDA7CkBAIC0xODc3LDcgKzE4NzQsNiBAQAogCX0KIAkvLyB0aGVzZSBkbyBub3QgZ28gdG8gb24tZGlzayBzdGF0IGRhdGEKIAlpbm9kZS0+aV9pbm8gPSBsZTMyX3RvX2NwdShpaC5paF9rZXkua19vYmplY3RpZCk7Ci0JaW5vZGUtPmlfYmxrc2l6ZSA9IHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZTsKIAogCS8vIHN0b3JlIGluIGluLWNvcmUgaW5vZGUgdGhlIGtleSBvZiBzdGF0IGRhdGEgYW5kIHZlcnNpb24gYWxsCiAJLy8gb2JqZWN0IGl0ZW1zIHdpbGwgaGF2ZSAoZGlyZWN0b3J5IGl0ZW1zIHdpbGwgaGF2ZSBvbGQgb2Zmc2V0CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9zdXBlci5jIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwppbmRleCA1NTY3MzI4Li5iNDBkNGQ2IDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy9zdXBlci5jCisrKyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKQEAgLTUzMCw5ICs1MzAsNyBAQAogCiBzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKIHsKLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KHJlaXNlcmZzX2lub2RlX2NhY2hlcCkpCi0JCXJlaXNlcmZzX3dhcm5pbmcoTlVMTCwKLQkJCQkgInJlaXNlcmZzX2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZCIpOworCWttZW1fY2FjaGVfZGVzdHJveShyZWlzZXJmc19pbm9kZV9jYWNoZXApOwogfQogCiAvKiB3ZSBkb24ndCBtYXJrIGlub2RlcyBkaXJ0eSwgd2UganVzdCBsb2cgdGhlbSAqLwpAQCAtNzI1LDEyICs3MjMsNiBAQAogCXtOVUxMLCAwLCAwfSwKIH07CiAKLWludCByZWlzZXJmc19kZWZhdWx0X2lvX3NpemUgPSAxMjggKiAxMDI0OwkvKiBEZWZhdWx0IHJlY29tbWVuZGVkIEkvTyBzaXplIGlzIDEyOGsuCi0JCQkJCQkgICBUaGVyZSBtaWdodCBiZSBicm9rZW4gYXBwbGljYXRpb25zIHRoYXQgYXJlCi0JCQkJCQkgICBjb25mdXNlZCBieSB0aGlzLiBVc2Ugbm9sYXJnZWlvIG1vdW50IG9wdGlvbgotCQkJCQkJICAgdG8gZ2V0IHVzdWFsIGkvbyBzaXplID0gUEFHRV9TSVpFLgotCQkJCQkJICovCi0KIC8qIHByb2NlZWQgb25seSBvbmUgb3B0aW9uIGZyb20gYSBsaXN0ICpjdXIgLSBzdHJpbmcgY29udGFpbmluZyBvZiBtb3VudCBvcHRpb25zCiAgICBvcHRzIC0gYXJyYXkgb2Ygb3B0aW9ucyB3aGljaCBhcmUgYWNjZXB0ZWQKICAgIG9wdF9hcmcgLSBpZiBvcHRpb24gaXMgZm91bmQgYW5kIHJlcXVpcmVzIGFuIGFyZ3VtZW50IGFuZCBpZiBpdCBpcyBzcGVjaWZlZApAQCAtOTU5LDE5ICs5NTEsOCBAQAogCQl9CiAKIAkJaWYgKGMgPT0gJ3cnKSB7Ci0JCQljaGFyICpwID0gTlVMTDsKLQkJCWludCB2YWwgPSBzaW1wbGVfc3RydG91bChhcmcsICZwLCAwKTsKLQotCQkJaWYgKCpwICE9ICdcMCcpIHsKLQkJCQlyZWlzZXJmc193YXJuaW5nKHMsCi0JCQkJCQkgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IG5vbi1udW1lcmljIHZhbHVlICVzIGZvciBub2xhcmdlaW8gb3B0aW9uIiwKLQkJCQkJCSBhcmcpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQkJaWYgKHZhbCkKLQkJCQlyZWlzZXJmc19kZWZhdWx0X2lvX3NpemUgPSBQQUdFX1NJWkU7Ci0JCQllbHNlCi0JCQkJcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplID0gMTI4ICogMTAyNDsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzOiBub2xhcmdlaW8gb3B0aW9uIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTsKKwkJCXJldHVybiAwOwogCQl9CiAKIAkJaWYgKGMgPT0gJ2onKSB7CmRpZmYgLS1naXQgYS9mcy9yb21mcy9pbm9kZS5jIGIvZnMvcm9tZnMvaW5vZGUuYwppbmRleCAyMmVlZDYxLi5kZGNkOWUxIDEwMDY0NAotLS0gYS9mcy9yb21mcy9pbm9kZS5jCisrKyBiL2ZzL3JvbWZzL2lub2RlLmMKQEAgLTU4OSw4ICs1ODksNyBAQAogCiBzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKIHsKLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KHJvbWZzX2lub2RlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gInJvbWZzX2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7CisJa21lbV9jYWNoZV9kZXN0cm95KHJvbWZzX2lub2RlX2NhY2hlcCk7CiB9CiAKIHN0YXRpYyBpbnQgcm9tZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvaW5vZGUuYyBiL2ZzL3NtYmZzL2lub2RlLmMKaW5kZXggYTFlZDY1Ny4uMmMxMjJlZSAxMDA2NDQKLS0tIGEvZnMvc21iZnMvaW5vZGUuYworKysgYi9mcy9zbWJmcy9pbm9kZS5jCkBAIC04OSw4ICs4OSw3IEBACiAKIHN0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQogewotCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koc21iX2lub2RlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gInNtYl9pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworCWttZW1fY2FjaGVfZGVzdHJveShzbWJfaW5vZGVfY2FjaGVwKTsKIH0KIAogc3RhdGljIGludCBzbWJfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQpAQCAtMTY3LDcgKzE2Niw2IEBACiAJZmF0dHItPmZfbXRpbWUJPSBpbm9kZS0+aV9tdGltZTsKIAlmYXR0ci0+Zl9jdGltZQk9IGlub2RlLT5pX2N0aW1lOwogCWZhdHRyLT5mX2F0aW1lCT0gaW5vZGUtPmlfYXRpbWU7Ci0JZmF0dHItPmZfYmxrc2l6ZT0gaW5vZGUtPmlfYmxrc2l6ZTsKIAlmYXR0ci0+Zl9ibG9ja3MJPSBpbm9kZS0+aV9ibG9ja3M7CiAKIAlmYXR0ci0+YXR0cgk9IFNNQl9JKGlub2RlKS0+YXR0cjsKQEAgLTIwMSw3ICsxOTksNiBAQAogCWlub2RlLT5pX3VpZAk9IGZhdHRyLT5mX3VpZDsKIAlpbm9kZS0+aV9naWQJPSBmYXR0ci0+Zl9naWQ7CiAJaW5vZGUtPmlfY3RpbWUJPSBmYXR0ci0+Zl9jdGltZTsKLQlpbm9kZS0+aV9ibGtzaXplPSBmYXR0ci0+Zl9ibGtzaXplOwogCWlub2RlLT5pX2Jsb2NrcyA9IGZhdHRyLT5mX2Jsb2NrczsKIAlpbm9kZS0+aV9zaXplCT0gZmF0dHItPmZfc2l6ZTsKIAlpbm9kZS0+aV9tdGltZQk9IGZhdHRyLT5mX210aW1lOwpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvcHJvYy5jIGIvZnMvc21iZnMvcHJvYy5jCmluZGV4IGMzNDk1MDUuLjQwZTE3NGQgMTAwNjQ0Ci0tLSBhL2ZzL3NtYmZzL3Byb2MuYworKysgYi9mcy9zbWJmcy9wcm9jLmMKQEAgLTE4MjYsNyArMTgyNiw2IEBACiAJZmF0dHItPmZfbmxpbmsgPSAxOwogCWZhdHRyLT5mX3VpZCA9IHNlcnZlci0+bW50LT51aWQ7CiAJZmF0dHItPmZfZ2lkID0gc2VydmVyLT5tbnQtPmdpZDsKLQlmYXR0ci0+Zl9ibGtzaXplID0gU01CX1NUX0JMS1NJWkU7CiAJZmF0dHItPmZfdW5peCA9IDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL3JlcXVlc3QuYyBiL2ZzL3NtYmZzL3JlcXVlc3QuYwppbmRleCBjOGU5NjE5Li4wZmI3NDY5IDEwMDY0NAotLS0gYS9mcy9zbWJmcy9yZXF1ZXN0LmMKKysrIGIvZnMvc21iZnMvcmVxdWVzdC5jCkBAIC00OSw4ICs0OSw3IEBACiAKIHZvaWQgc21iX2Rlc3Ryb3lfcmVxdWVzdF9jYWNoZSh2b2lkKQogewotCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kocmVxX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gInNtYl9kZXN0cm95X3JlcXVlc3RfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kocmVxX2NhY2hlcCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9mcy9zdGF0LmMgYi9mcy9zdGF0LmMKaW5kZXggM2E0NGRjZi4uNjBhMzFkNSAxMDA2NDQKLS0tIGEvZnMvc3RhdC5jCisrKyBiL2ZzL3N0YXQuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgpAQCAtMzIsNyArMzMsNyBAQAogCXN0YXQtPmN0aW1lID0gaW5vZGUtPmlfY3RpbWU7CiAJc3RhdC0+c2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAlzdGF0LT5ibG9ja3MgPSBpbm9kZS0+aV9ibG9ja3M7Ci0Jc3RhdC0+Ymxrc2l6ZSA9IGlub2RlLT5pX2Jsa3NpemU7CisJc3RhdC0+Ymxrc2l6ZSA9ICgxIDw8IGlub2RlLT5pX2Jsa2JpdHMpOwogfQogCiBFWFBPUlRfU1lNQk9MKGdlbmVyaWNfZmlsbGF0dHIpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvYmluLmMgYi9mcy9zeXNmcy9iaW4uYwppbmRleCBjMTZhOTNjLi45ODAyMmU0IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9iaW4uYworKysgYi9mcy9zeXNmcy9iaW4uYwpAQCAtMTAsNiArMTAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xNzYsNyArMTc3LDYgQEAKICAqCXN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSAtIGNyZWF0ZSBiaW5hcnkgZmlsZSBmb3Igb2JqZWN0LgogICoJQGtvYmo6CW9iamVjdC4KICAqCUBhdHRyOglhdHRyaWJ1dGUgZGVzY3JpcHRvci4KLSAqCiAgKi8KIAogaW50IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZShzdHJ1Y3Qga29iamVjdCAqIGtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICogYXR0cikKQEAgLTE5MSwxMyArMTkxLDE2IEBACiAgKglzeXNmc19yZW1vdmVfYmluX2ZpbGUgLSByZW1vdmUgYmluYXJ5IGZpbGUgZm9yIG9iamVjdC4KICAqCUBrb2JqOglvYmplY3QuCiAgKglAYXR0cjoJYXR0cmlidXRlIGRlc2NyaXB0b3IuCi0gKgogICovCiAKLWludCBzeXNmc19yZW1vdmVfYmluX2ZpbGUoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqIGF0dHIpCit2b2lkIHN5c2ZzX3JlbW92ZV9iaW5fZmlsZShzdHJ1Y3Qga29iamVjdCAqIGtvYmosIHN0cnVjdCBiaW5fYXR0cmlidXRlICogYXR0cikKIHsKLQlzeXNmc19oYXNoX2FuZF9yZW1vdmUoa29iai0+ZGVudHJ5LGF0dHItPmF0dHIubmFtZSk7Ci0JcmV0dXJuIDA7CisJaWYgKHN5c2ZzX2hhc2hfYW5kX3JlbW92ZShrb2JqLT5kZW50cnksIGF0dHItPmF0dHIubmFtZSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6ICIKKwkJCSJiYWQgZGVudHJ5IG9yIGlub2RlIG9yIG5vIHN1Y2ggZmlsZTogXCIlc1wiXG4iLAorCQkJX19GVU5DVElPTl9fLCBhdHRyLT5hdHRyLm5hbWUpOworCQlkdW1wX3N0YWNrKCk7CisJfQogfQogCiBFWFBPUlRfU1lNQk9MX0dQTChzeXNmc19jcmVhdGVfYmluX2ZpbGUpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvZGlyLmMgYi9mcy9zeXNmcy9kaXIuYwppbmRleCA2MWM0MjQzLi41ZjNkNzI1IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9kaXIuYworKysgYi9mcy9zeXNmcy9kaXIuYwpAQCAtNDMsNyArNDMsNyBAQAogCiAJbWVtc2V0KHNkLCAwLCBzaXplb2YoKnNkKSk7CiAJYXRvbWljX3NldCgmc2QtPnNfY291bnQsIDEpOwotCWF0b21pY19zZXQoJnNkLT5zX2V2ZW50LCAwKTsKKwlhdG9taWNfc2V0KCZzZC0+c19ldmVudCwgMSk7CiAJSU5JVF9MSVNUX0hFQUQoJnNkLT5zX2NoaWxkcmVuKTsKIAlsaXN0X2FkZCgmc2QtPnNfc2libGluZywgJnBhcmVudF9zZC0+c19jaGlsZHJlbik7CiAJc2QtPnNfZWxlbWVudCA9IGVsZW1lbnQ7CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9pbm9kZS5jIGIvZnMvc3lzZnMvaW5vZGUuYwppbmRleCA5ODg5ZTU0Li5lNzllMzhkNSAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvaW5vZGUuYworKysgYi9mcy9zeXNmcy9pbm9kZS5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgInN5c2ZzLmgiCiAKIGV4dGVybiBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzeXNmc19zYjsKQEAgLTEyNCw3ICsxMjUsNiBAQAogewogCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gbmV3X2lub2RlKHN5c2ZzX3NiKTsKIAlpZiAoaW5vZGUpIHsKLQkJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmc3lzZnNfYW9wczsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZzeXNmc19iYWNraW5nX2Rldl9pbmZvOwpAQCAtMjM0LDE3ICsyMzQsMTggQEAKIAl9CiB9CiAKLXZvaWQgc3lzZnNfaGFzaF9hbmRfcmVtb3ZlKHN0cnVjdCBkZW50cnkgKiBkaXIsIGNvbnN0IGNoYXIgKiBuYW1lKQoraW50IHN5c2ZzX2hhc2hfYW5kX3JlbW92ZShzdHJ1Y3QgZGVudHJ5ICogZGlyLCBjb25zdCBjaGFyICogbmFtZSkKIHsKIAlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2Q7CiAJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHBhcmVudF9zZDsKKwlpbnQgZm91bmQgPSAwOwogCiAJaWYgKCFkaXIpCi0JCXJldHVybjsKKwkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlpZiAoZGlyLT5kX2lub2RlID09IE5VTEwpCiAJCS8qIG5vIGlub2RlIG1lYW5zIHRoaXMgaGFzbid0IGJlZW4gbWFkZSB2aXNpYmxlIHlldCAqLwotCQlyZXR1cm47CisJCXJldHVybiAtRU5PRU5UOwogCiAJcGFyZW50X3NkID0gZGlyLT5kX2ZzZGF0YTsKIAltdXRleF9sb2NrKCZkaXItPmRfaW5vZGUtPmlfbXV0ZXgpOwpAQCAtMjU1LDggKzI1NiwxMSBAQAogCQkJbGlzdF9kZWxfaW5pdCgmc2QtPnNfc2libGluZyk7CiAJCQlzeXNmc19kcm9wX2RlbnRyeShzZCwgZGlyKTsKIAkJCXN5c2ZzX3B1dChzZCk7CisJCQlmb3VuZCA9IDE7CiAJCQlicmVhazsKIAkJfQogCX0KIAltdXRleF91bmxvY2soJmRpci0+ZF9pbm9kZS0+aV9tdXRleCk7CisKKwlyZXR1cm4gZm91bmQgPyAwIDogLUVOT0VOVDsKIH0KZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL3N5bWxpbmsuYyBiL2ZzL3N5c2ZzL3N5bWxpbmsuYwppbmRleCBkMmVhYzNjLi5mNTBlM2NjIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9zeW1saW5rLmMKKysrIGIvZnMvc3lzZnMvc3ltbGluay5jCkBAIC0zLDYgKzMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CkBAIC04MiwxMCArODMsMTkgQEAKICAqLwogaW50IHN5c2ZzX2NyZWF0ZV9saW5rKHN0cnVjdCBrb2JqZWN0ICoga29iaiwgc3RydWN0IGtvYmplY3QgKiB0YXJnZXQsIGNvbnN0IGNoYXIgKiBuYW1lKQogewotCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBrb2JqLT5kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gTlVMTDsKIAlpbnQgZXJyb3IgPSAtRUVYSVNUOwogCi0JQlVHX09OKCFrb2JqIHx8ICFrb2JqLT5kZW50cnkgfHwgIW5hbWUpOworCUJVR19PTighbmFtZSk7CisKKwlpZiAoIWtvYmopIHsKKwkJaWYgKHN5c2ZzX21vdW50ICYmIHN5c2ZzX21vdW50LT5tbnRfc2IpCisJCQlkZW50cnkgPSBzeXNmc19tb3VudC0+bW50X3NiLT5zX3Jvb3Q7CisJfSBlbHNlCisJCWRlbnRyeSA9IGtvYmotPmRlbnRyeTsKKworCWlmICghZGVudHJ5KQorCQlyZXR1cm4gLUVGQVVMVDsKIAogCW11dGV4X2xvY2soJmRlbnRyeS0+ZF9pbm9kZS0+aV9tdXRleCk7CiAJaWYgKCFzeXNmc19kaXJlbnRfZXhpc3QoZGVudHJ5LT5kX2ZzZGF0YSwgbmFtZSkpCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9zeXNmcy5oIGIvZnMvc3lzZnMvc3lzZnMuaAppbmRleCAzNjUxZmZiLi42ZjNkNmJkIDEwMDY0NAotLS0gYS9mcy9zeXNmcy9zeXNmcy5oCisrKyBiL2ZzL3N5c2ZzL3N5c2ZzLmgKQEAgLTEwLDcgKzEwLDcgQEAKIAkJCQl1bW9kZV90LCBpbnQpOwogCiBleHRlcm4gaW50IHN5c2ZzX2FkZF9maWxlKHN0cnVjdCBkZW50cnkgKiwgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgc3lzZnNfaGFzaF9hbmRfcmVtb3ZlKHN0cnVjdCBkZW50cnkgKiBkaXIsIGNvbnN0IGNoYXIgKiBuYW1lKTsKK2V4dGVybiBpbnQgc3lzZnNfaGFzaF9hbmRfcmVtb3ZlKHN0cnVjdCBkZW50cnkgKiBkaXIsIGNvbnN0IGNoYXIgKiBuYW1lKTsKIGV4dGVybiBzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzeXNmc19maW5kKHN0cnVjdCBzeXNmc19kaXJlbnQgKmRpciwgY29uc3QgY2hhciAqIG5hbWUpOwogCiBleHRlcm4gaW50IHN5c2ZzX2NyZWF0ZV9zdWJkaXIoc3RydWN0IGtvYmplY3QgKiwgY29uc3QgY2hhciAqLCBzdHJ1Y3QgZGVudHJ5ICoqKTsKZGlmZiAtLWdpdCBhL2ZzL3N5c3YvaWFsbG9jLmMgYi9mcy9zeXN2L2lhbGxvYy5jCmluZGV4IDliNTg1ZDEuLjExNWFiMGQgMTAwNjQ0Ci0tLSBhL2ZzL3N5c3YvaWFsbG9jLmMKKysrIGIvZnMvc3lzdi9pYWxsb2MuYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CiAJaW5vZGUtPmlfaW5vID0gZnMxNl90b19jcHUoc2JpLCBpbm8pOwogCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7Ci0JaW5vZGUtPmlfYmxvY2tzID0gaW5vZGUtPmlfYmxrc2l6ZSA9IDA7CisJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAltZW1zZXQoU1lTVl9JKGlub2RlKS0+aV9kYXRhLCAwLCBzaXplb2YoU1lTVl9JKGlub2RlKS0+aV9kYXRhKSk7CiAJU1lTVl9JKGlub2RlKS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKIAlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9zeXN2L2lub2RlLmMgYi9mcy9zeXN2L2lub2RlLmMKaW5kZXggNThiMmQyMi4uZDYzYzVlNCAxMDA2NDQKLS0tIGEvZnMvc3lzdi9pbm9kZS5jCisrKyBiL2ZzL3N5c3YvaW5vZGUuYwpAQCAtMjAxLDcgKzIwMSw3IEBACiAJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7CiAJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CiAJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7Ci0JaW5vZGUtPmlfYmxvY2tzID0gaW5vZGUtPmlfYmxrc2l6ZSA9IDA7CisJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAogCXNpID0gU1lTVl9JKGlub2RlKTsKIAlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCAxMCsxKzErMTsgYmxvY2srKykKZGlmZiAtLWdpdCBhL2ZzL3N5c3Yvc3VwZXIuYyBiL2ZzL3N5c3Yvc3VwZXIuYwppbmRleCA4NzY2MzliLi4zNTBjYmE1IDEwMDY0NAotLS0gYS9mcy9zeXN2L3N1cGVyLmMKKysrIGIvZnMvc3lzdi9zdXBlci5jCkBAIC0zNjksMTAgKzM2OSw5IEBACiAJaWYgKDY0ICE9IHNpemVvZiAoc3RydWN0IHN5c3ZfaW5vZGUpKQogCQlwYW5pYygic3lzdiBmczogYmFkIGlub2RlIHNpemUiKTsKIAotCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeXN2X3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlzYmkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3lzdl9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzYmkpCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbXNldChzYmksIDAsIHNpemVvZihzdHJ1Y3Qgc3lzdl9zYl9pbmZvKSk7CiAKIAlzYmktPnNfc2IgPSBzYjsKIAlzYmktPnNfYmxvY2tfYmFzZSA9IDA7CkBAIC00NTMsMTAgKzQ1Miw5IEBACiAJaWYgKDY0ICE9IHNpemVvZiAoc3RydWN0IHN5c3ZfaW5vZGUpKQogCQlwYW5pYygic3lzdiBmczogYmFkIGktbm9kZSBzaXplIik7CiAKLQlzYmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3lzdl9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJc2JpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN5c3Zfc2JfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1zZXQoc2JpLCAwLCBzaXplb2Yoc3RydWN0IHN5c3Zfc2JfaW5mbykpOwogCiAJc2JpLT5zX3NiID0gc2I7CiAJc2JpLT5zX2Jsb2NrX2Jhc2UgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvdWRmL2lhbGxvYy5jIGIvZnMvdWRmL2lhbGxvYy5jCmluZGV4IDMzMzIzNDcuLjgyMDY5ODMgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9pYWxsb2MuYworKysgYi9mcy91ZGYvaWFsbG9jLmMKQEAgLTEyMSw3ICsxMjEsNiBAQAogCVVERl9JX0xPQ0FUSU9OKGlub2RlKS5sb2dpY2FsQmxvY2tOdW0gPSBibG9jazsKIAlVREZfSV9MT0NBVElPTihpbm9kZSkucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gVURGX0lfTE9DQVRJT04oZGlyKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW07CiAJaW5vZGUtPmlfaW5vID0gdWRmX2dldF9sYl9wYmxvY2soc2IsIFVERl9JX0xPQ0FUSU9OKGlub2RlKSwgMCk7Ci0JaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsKIAlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCVVERl9JX0xFTkVBVFRSKGlub2RlKSA9IDA7CiAJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gMDsKQEAgLTEzMCwxNCArMTI5LDEyIEBACiAJewogCQlVREZfSV9FRkUoaW5vZGUpID0gMTsKIAkJVURGX1VQREFURV9VREZSRVYoaW5vZGUtPmlfc2IsIFVERl9WRVJTX1VTRV9FWFRFTkRFRF9GRSk7Ci0JCVVERl9JX0RBVEEoaW5vZGUpID0ga21hbGxvYyhpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSwgR0ZQX0tFUk5FTCk7Ci0JCW1lbXNldChVREZfSV9EQVRBKGlub2RlKSwgMHgwMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSkpOworCQlVREZfSV9EQVRBKGlub2RlKSA9IGt6YWxsb2MoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSksIEdGUF9LRVJORUwpOwogCX0KIAllbHNlCiAJewogCQlVREZfSV9FRkUoaW5vZGUpID0gMDsKLQkJVURGX0lfREFUQShpbm9kZSkgPSBrbWFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSwgR0ZQX0tFUk5FTCk7Ci0JCW1lbXNldChVREZfSV9EQVRBKGlub2RlKSwgMHgwMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpKTsKKwkJVURGX0lfREFUQShpbm9kZSkgPSBremFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSwgR0ZQX0tFUk5FTCk7CiAJfQogCWlmIChVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfVVNFX0FEX0lOX0lDQikpCiAJCVVERl9JX0FMTE9DVFlQRShpbm9kZSkgPSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0I7CmRpZmYgLS1naXQgYS9mcy91ZGYvaW5vZGUuYyBiL2ZzL3VkZi9pbm9kZS5jCmluZGV4IDYwNWY1MTEuLmIyMjNiMzIgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9pbm9kZS5jCisrKyBiL2ZzL3VkZi9pbm9kZS5jCkBAIC05MTYsOCArOTE2LDYgQEAKIAkgKiAgICAgIGlfbmxpbmsgPSAxCiAJICogICAgICBpX29wID0gTlVMTDsKIAkgKi8KLQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOwotCiAJYmggPSB1ZGZfcmVhZF9wdGFnZ2VkKGlub2RlLT5pX3NiLCBVREZfSV9MT0NBVElPTihpbm9kZSksIDAsICZpZGVudCk7CiAKIAlpZiAoIWJoKQpkaWZmIC0tZ2l0IGEvZnMvdWRmL3N1cGVyLmMgYi9mcy91ZGYvc3VwZXIuYwppbmRleCBmY2NlMWEyLi41ZGQzNTZjIDEwMDY0NAotLS0gYS9mcy91ZGYvc3VwZXIuYworKysgYi9mcy91ZGYvc3VwZXIuYwpAQCAtMTU2LDggKzE1Niw3IEBACiAKIHN0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQogewotCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kodWRmX2lub2RlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gInVkZl9pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworCWttZW1fY2FjaGVfZGVzdHJveSh1ZGZfaW5vZGVfY2FjaGVwKTsKIH0KIAogLyogU3VwZXJibG9jayBvcGVyYXRpb25zICovCmRpZmYgLS1naXQgYS9mcy91ZnMvaWFsbG9jLmMgYi9mcy91ZnMvaWFsbG9jLmMKaW5kZXggOTUwMWRjZC4uMmFkMTI1OSAxMDA2NDQKLS0tIGEvZnMvdWZzL2lhbGxvYy5jCisrKyBiL2ZzL3Vmcy9pYWxsb2MuYwpAQCAtMjU1LDcgKzI1NSw2IEBACiAJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOwogCiAJaW5vZGUtPmlfaW5vID0gY2cgKiB1c3BpLT5zX2lwZyArIGJpdDsKLQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOwkvKiBUaGlzIGlzIHRoZSBvcHRpbWFsIElPIHNpemUgKGZvciBzdGF0KSwgbm90IHRoZSBmcyBibG9jayBzaXplICovCiAJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCXVmc2ktPmlfZmxhZ3MgPSBVRlNfSShkaXIpLT5pX2ZsYWdzOwpkaWZmIC0tZ2l0IGEvZnMvdWZzL2lub2RlLmMgYi9mcy91ZnMvaW5vZGUuYwppbmRleCAzMGM2ZThhOS4uZWUxZWFhNiAxMDA2NDQKLS0tIGEvZnMvdWZzL2lub2RlLmMKKysrIGIvZnMvdWZzL2lub2RlLmMKQEAgLTc0MSw3ICs3NDEsNiBAQAogCQl1ZnMxX3JlYWRfaW5vZGUoaW5vZGUsIHVmc19pbm9kZSArIHVmc19pbm90b2ZzYm8oaW5vZGUtPmlfaW5vKSk7CiAJfQogCi0JaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsvKlRoaXMgaXMgdGhlIG9wdGltYWwgSU8gc2l6ZSAoZm9yIHN0YXQpKi8KIAlpbm9kZS0+aV92ZXJzaW9uKys7CiAJdWZzaS0+aV9sYXN0ZnJhZyA9CiAJCShpbm9kZS0+aV9zaXplICsgdXNwaS0+c19mc2l6ZSAtIDEpID4+IHVzcGktPnNfZnNoaWZ0OwpkaWZmIC0tZ2l0IGEvZnMvdWZzL3N1cGVyLmMgYi9mcy91ZnMvc3VwZXIuYwppbmRleCA5OTJlZTBiLi5lYzc5ZTMwIDEwMDY0NAotLS0gYS9mcy91ZnMvc3VwZXIuYworKysgYi9mcy91ZnMvc3VwZXIuYwpAQCAtNjExLDExICs2MTEsMTAgQEAKIAkKIAlVRlNEKCJFTlRFUlxuIik7CiAJCQotCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1ZnNfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCXNiaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1ZnNfc2JfaW5mbyksIEdGUF9LRVJORUwpOwogCWlmICghc2JpKQogCQlnb3RvIGZhaWxlZF9ub21lbTsKIAlzYi0+c19mc19pbmZvID0gc2JpOwotCW1lbXNldChzYmksIDAsIHNpemVvZihzdHJ1Y3QgdWZzX3NiX2luZm8pKTsKIAogCVVGU0QoImZsYWcgJXVcbiIsIChpbnQpKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSk7CiAJCkBAIC0xMjQ1LDggKzEyNDQsNyBAQAogCiBzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKIHsKLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KHVmc19pbm9kZV9jYWNoZXApKQotCQlwcmludGsoS0VSTl9JTkZPICJ1ZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kodWZzX2lub2RlX2NhY2hlcCk7CiB9CiAKICNpZmRlZiBDT05GSUdfUVVPVEEKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYva21lbS5oIGIvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmgKaW5kZXggOTM5YmQ4NC4uMGU4MjkzYyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmgKKysrIGIvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmgKQEAgLTkxLDggKzkxLDggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAoga21lbV96b25lX2Rlc3Ryb3koa21lbV96b25lX3QgKnpvbmUpCiB7Ci0JaWYgKHpvbmUgJiYga21lbV9jYWNoZV9kZXN0cm95KHpvbmUpKQotCQlCVUcoKTsKKwlpZiAoem9uZSkKKwkJa21lbV9jYWNoZV9kZXN0cm95KHpvbmUpOwogfQogCiBleHRlcm4gdm9pZCAqa21lbV96b25lX2FsbG9jKGttZW1fem9uZV90ICosIHVuc2lnbmVkIGludCBfX25vY2FzdCk7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19maWxlLmMKaW5kZXggM2Q0ZjZkZi4uNDFjZmNiYSAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYwpAQCAtMzcwLDcgKzM3MCw3IEBACiAKIAkvKiBUcnkgZmFpcmx5IGhhcmQgdG8gZ2V0IG1lbW9yeSAqLwogCWRvIHsKLQkJaWYgKChyZWFkX2J1ZiA9IChjYWRkcl90KWttYWxsb2MocmxlbiwgR0ZQX0tFUk5FTCkpKQorCQlpZiAoKHJlYWRfYnVmID0ga21hbGxvYyhybGVuLCBHRlBfS0VSTkVMKSkpCiAJCQlicmVhazsKIAkJcmxlbiA+Pj0gMTsKIAl9IHdoaWxlIChybGVuID49IDEwMjQpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCmluZGV4IGQ5MTgwMDIuLjIyZTNiNzEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmMKQEAgLTU1MywxMyArNTUzLDEzIEBACiAJQVNTRVJUKGRlbnRyeSk7CiAJQVNTRVJUKG5kKTsKIAotCWxpbmsgPSAoY2hhciAqKWttYWxsb2MoTUFYUEFUSExFTisxLCBHRlBfS0VSTkVMKTsKKwlsaW5rID0ga21hbGxvYyhNQVhQQVRITEVOKzEsIEdGUF9LRVJORUwpOwogCWlmICghbGluaykgewogCQluZF9zZXRfbGluayhuZCwgRVJSX1BUUigtRU5PTUVNKSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAotCXVpbyA9ICh1aW9fdCAqKWttYWxsb2Moc2l6ZW9mKHVpb190KSwgR0ZQX0tFUk5FTCk7CisJdWlvID0ga21hbGxvYyhzaXplb2YodWlvX3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXVpbykgewogCQlrZnJlZShsaW5rKTsKIAkJbmRfc2V0X2xpbmsobmQsIEVSUl9QVFIoLUVOT01FTSkpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKaW5kZXggNDc1NGYzNC4uOWRmOWVkMyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYworKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCkBAIC0xNzEsNyArMTcxLDYgQEAKIAkJYnJlYWs7CiAJfQogCi0JaW5vZGUtPmlfYmxrc2l6ZSA9IHhmc19wcmVmZXJyZWRfaW9zaXplKG1wKTsKIAlpbm9kZS0+aV9nZW5lcmF0aW9uID0gaXAtPmlfZC5kaV9nZW47CiAJaV9zaXplX3dyaXRlKGlub2RlLCBpcC0+aV9kLmRpX3NpemUpOwogCWlub2RlLT5pX2Jsb2NrcyA9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdm5vZGUuYwppbmRleCA2NjI4ZDk2Li41NTNmYTczIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmMKQEAgLTEyMiw3ICsxMjIsNiBAQAogCWlub2RlLT5pX2Jsb2NrcwkgICAgPSB2YXAtPnZhX25ibG9ja3M7CiAJaW5vZGUtPmlfbXRpbWUJICAgID0gdmFwLT52YV9tdGltZTsKIAlpbm9kZS0+aV9jdGltZQkgICAgPSB2YXAtPnZhX2N0aW1lOwotCWlub2RlLT5pX2Jsa3NpemUgICAgPSB2YXAtPnZhX2Jsb2Nrc2l6ZTsKIAlpZiAodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfSU1NVVRBQkxFKQogCQlpbm9kZS0+aV9mbGFncyB8PSBTX0lNTVVUQUJMRTsKIAllbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvdWRjLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvdWRjLmgKaW5kZXggMzA1NDhhMy4uMTIxY2QyNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcHhhL3VkYy5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS91ZGMuaApAQCAtMTIsNiArMTIsMTQgQEAKICAgICAgICAgdm9pZCAoKnVkY19jb21tYW5kKShpbnQgY21kKTsKICNkZWZpbmUJUFhBMlhYX1VEQ19DTURfQ09OTkVDVAkJMAkvKiBsZXQgaG9zdCBzZWUgdXMgKi8KICNkZWZpbmUJUFhBMlhYX1VEQ19DTURfRElTQ09OTkVDVAkxCS8qIHNvIGhvc3Qgd29uJ3Qgc2VlIHVzICovCisKKwkvKiBCb2FyZHMgZm9sbG93aW5nIHRoZSBkZXNpZ24gZ3VpZGVsaW5lcyBpbiB0aGUgZGV2ZWxvcGVyJ3MgbWFudWFsLAorCSAqIHdpdGggb24tY2hpcCBHUElPcyBub3QgTHViYm9jaydzIHdpZXJkIGhhcmR3YXJlLCBjYW4gaGF2ZSBhIHNhbmUKKwkgKiBWQlVTIElSUSBhbmQgb21pdCB0aGUgbWV0aG9kcyBhYm92ZS4gIFN0b3JlIHRoZSBHUElPIG51bWJlcgorCSAqIGhlcmU7IGZvciBHUElPIDAsIGFsc28gbWFzayBpbiBvbmUgb2YgdGhlIHB4YV9ncGlvX21vZGUoKSBiaXRzLgorCSAqLworCXUxNglncGlvX3ZidXM7CQkJLyogaGlnaCA9PSB2YnVzIHByZXNlbnQgKi8KKwl1MTYJZ3Bpb19wdWxsdXA7CQkJLyogaGlnaCA9PSBwdWxsdXAgYWN0aXZhdGVkICovCiB9OwogCiBleHRlcm4gdm9pZCBweGFfc2V0X3VkY19pbmZvKHN0cnVjdCBweGEyeHhfdWRjX21hY2hfaW5mbyAqaW5mbyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1hcm0vdW5pc3RkLmgKaW5kZXggMWU4OTFmOC4uMmFiNDA3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS91bmlzdGQuaApAQCAtMzc3LDYgKzM3Nyw3IEBACiAjZW5kaWYKIAogI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKICNkZWZpbmUgX19zeXMyKHgpICN4CkBAIC0zOTYsNyArMzk3LDcgQEAKIAogI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCi0JaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtMTI5KSkgewkJXAorCWlmICgodW5zaWduZWQgbG9uZykocmVzKSA+PSAodW5zaWduZWQgbG9uZykoLU1BWF9FUlJOTykpIHsJXAogCQllcnJubyA9IC0ocmVzKTsJCQkJCQlcCiAJCXJlcyA9IC0xOwkJCQkJCVwKIAl9CQkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLWFybTI2L3VuaXN0ZC5oCmluZGV4IDcwZWI2ZDkuLmM2ZDI0MzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L3VuaXN0ZC5oCkBAIC0zMTEsNiArMzExLDcgQEAKICNkZWZpbmUgX19BUk1fTlJfdXNyMjYJCQkoX19BUk1fTlJfQkFTRSszKQogCiAjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KIAogI2RlZmluZSBfX3N5czIoeCkgI3gKQEAgLTMyMiw3ICszMjMsNyBAQAogCiAjZGVmaW5lIF9fc3lzY2FsbF9yZXR1cm4odHlwZSwgcmVzKQkJCQkJXAogZG8gewkJCQkJCQkJCVwKLQlpZiAoKHVuc2lnbmVkIGxvbmcpKHJlcykgPj0gKHVuc2lnbmVkIGxvbmcpKC0xMjUpKSB7CQlcCisJaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKS1NQVhfRVJSTk8pIHsJXAogCQllcnJubyA9IC0ocmVzKTsJCQkJCQlcCiAJCXJlcyA9IC0xOwkJCQkJCVwKIAl9CQkJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1mcnYvdW5pc3RkLmgKaW5kZXggYjgwZGJkOC4uZDEwNGQxYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi91bmlzdGQuaApAQCAtMzIwLDYgKzMyMCw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjZGVmaW5lIE5SX3N5c2NhbGxzIDMxMAorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAvKgogICogcHJvY2VzcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgc3lzY2FsbCwgY29uc2lnbmluZyBpdCB0byBvbmUgb2YgdHdvIHBvc3NpYmxlIGZhdGVzCkBAIC0zMjksNyArMzMwLDcgQEAKICNkZWZpbmUgX19zeXNjYWxsX3JldHVybih0eXBlLCByZXMpCQkJCQlcCiBkbyB7CQkJCQkJCQkJXAogICAgICAgICB1bnNpZ25lZCBsb25nIF9fc3IyID0gKHJlcyk7CQkJCQlcCi0JaWYgKF9fYnVpbHRpbl9leHBlY3QoX19zcjIgPj0gKHVuc2lnbmVkIGxvbmcpKC00MDk1KSwgMCkpIHsJXAorCWlmIChfX2J1aWx0aW5fZXhwZWN0KF9fc3IyID49ICh1bnNpZ25lZCBsb25nKSgtTUFYX0VSUk5PKSwgMCkpIHsgXAogCQllcnJubyA9ICgtX19zcjIpOwkJCQkJXAogCQlfX3NyMiA9IH4wVUw7CQkJCQkJXAogCX0JCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaAppbmRleCAyNTNhZTEzLi42OTI0MGI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCkBAIC0xMTgsMTUgKzExOCwxNSBAQAogICAgICAgICBfX2tzeW10YWJfc3RyaW5ncyA6IEFUKEFERFIoX19rc3ltdGFiX3N0cmluZ3MpIC0gTE9BRF9PRkZTRVQpIHsJXAogCQkqKF9fa3N5bXRhYl9zdHJpbmdzKQkJCQkJXAogCX0JCQkJCQkJCVwKLQlfX2VuZF9yb2RhdGEgPSAuOwkJCQkJCVwKLQkuID0gQUxJR04oNDA5Nik7CQkJCQkJXAogCQkJCQkJCQkJXAogCS8qIEJ1aWx0LWluIG1vZHVsZSBwYXJhbWV0ZXJzLiAqLwkJCQlcCiAJX19wYXJhbSA6IEFUKEFERFIoX19wYXJhbSkgLSBMT0FEX09GRlNFVCkgewkJCVwKIAkJVk1MSU5VWF9TWU1CT0woX19zdGFydF9fX3BhcmFtKSA9IC47CQkJXAogCQkqKF9fcGFyYW0pCQkJCQkJXAogCQlWTUxJTlVYX1NZTUJPTChfX3N0b3BfX19wYXJhbSkgPSAuOwkJCVwKLQl9CisJfQkJCQkJCQkJXAorCV9fZW5kX3JvZGF0YSA9IC47CQkJCQkJXAorCS4gPSBBTElHTig0MDk2KTsKIAogI2RlZmluZSBTRUNVUklUWV9JTklUCQkJCQkJCVwKIAkuc2VjdXJpdHlfaW5pdGNhbGwuaW5pdCA6IEFUKEFERFIoLnNlY3VyaXR5X2luaXRjYWxsLmluaXQpIC0gTE9BRF9PRkZTRVQpIHsgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taDgzMDAvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1oODMwMC91bmlzdGQuaAppbmRleCAyMjZkZDU5Li5hMmRkOTA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1oODMwMC91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1oODMwMC91bmlzdGQuaApAQCAtMjk1LDE0ICsyOTUsMTQgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNkZWZpbmUgTlJfc3lzY2FsbHMgMjg5CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKLQotLyogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC0xMjI6IHNlZQorLyogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC1NQVhfRVJSTk86IHNlZQogICAgPGFzbS1tNjhrL2Vycm5vLmg+ICovCiAKICNkZWZpbmUgX19zeXNjYWxsX3JldHVybih0eXBlLCByZXMpIFwKIGRvIHsgXAotCWlmICgodW5zaWduZWQgbG9uZykocmVzKSA+PSAodW5zaWduZWQgbG9uZykoLTEyNSkpIHsgXAorCWlmICgodW5zaWduZWQgbG9uZykocmVzKSA+PSAodW5zaWduZWQgbG9uZykoLU1BWF9FUlJOTykpIHsgXAogCS8qIGF2b2lkIHVzaW5nIHJlcyB3aGljaCBpcyBkZWNsYXJlZCB0byBiZSBpbiByZWdpc3RlciBkMDsgXAogCSAgIGVycm5vIG1pZ2h0IGV4cGFuZCB0byBhIGZ1bmN0aW9uIGNhbGwgYW5kIGNsb2JiZXIgaXQuICAqLyBcCiAJCWludCBfX2VyciA9IC0ocmVzKTsgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hY3BpLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAppbmRleCAyMGY1MjM5Li42MDE2NjMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaApAQCAtMTMxLDIxICsxMzEsNyBAQAogZXh0ZXJuIGludCBhY3BpX2dzaV90b19pcnEodTMyIGdzaSwgdW5zaWduZWQgaW50ICppcnEpOwogCiAjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCi1leHRlcm4gaW50IHNraXBfaW9hcGljX3NldHVwOwogZXh0ZXJuIGludCBhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGU7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX2lvYXBpY19zZXR1cCh2b2lkKQotewotCXNraXBfaW9hcGljX3NldHVwID0gMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaW9hcGljX3NldHVwX2Rpc2FibGVkKHZvaWQpCi17Ci0JcmV0dXJuIHNraXBfaW9hcGljX3NldHVwOwotfQotCi0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfaW9hcGljX3NldHVwKHZvaWQpIHsgfQogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX25vaXJxX3NldCh2b2lkKSB7IGFjcGlfbm9pcnEgPSAxOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2FsdGVybmF0aXZlLWFzbS5pIGIvaW5jbHVkZS9hc20taTM4Ni9hbHRlcm5hdGl2ZS1hc20uaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzQ3ZTNiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9hbHRlcm5hdGl2ZS1hc20uaQpAQCAtMCwwICsxLDE0IEBACisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfU01QCisJLm1hY3JvIExPQ0tfUFJFRklYCisxOglsb2NrCisJLnNlY3Rpb24gLnNtcF9sb2NrcywiYSIKKwkuYWxpZ24gNAorCS5sb25nIDFiCisJLnByZXZpb3VzCisJLmVuZG0KKyNlbHNlCisJLm1hY3JvIExPQ0tfUFJFRklYCisJLmVuZG0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hcGljLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaAppbmRleCAyYzFlMzcxLi4zYTQyYjdkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaApAQCAtMTYsMjAgKzE2LDggQEAKICNkZWZpbmUgQVBJQ19WRVJCT1NFIDEKICNkZWZpbmUgQVBJQ19ERUJVRyAgIDIKIAotZXh0ZXJuIGludCBlbmFibGVfbG9jYWxfYXBpYzsKIGV4dGVybiBpbnQgYXBpY192ZXJib3NpdHk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsYXBpY19kaXNhYmxlKHZvaWQpCi17Ci0JZW5hYmxlX2xvY2FsX2FwaWMgPSAtMTsKLQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfQVBJQywgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsYXBpY19lbmFibGUodm9pZCkKLXsKLQllbmFibGVfbG9jYWxfYXBpYyA9IDE7Ci19Ci0KIC8qCiAgKiBEZWZpbmUgdGhlIGRlZmF1bHQgbGV2ZWwgb2Ygb3V0cHV0IHRvIGJlIHZlcnkgbGl0dGxlCiAgKiBUaGlzIGNhbiBiZSB0dXJuZWQgdXAgYnkgdXNpbmcgYXBpYz12ZXJib3NlIGZvciBtb3JlCkBAIC00Miw2ICszMCw4IEBACiAJfSB3aGlsZSAoMCkKIAogCitleHRlcm4gdm9pZCBnZW5lcmljX2FwaWNfcHJvYmUodm9pZCk7CisKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIAogLyoKQEAgLTExNyw4ICsxMDcsNiBAQAogCiBleHRlcm4gdm9pZCBlbmFibGVfTk1JX3Rocm91Z2hfTFZUMCAodm9pZCAqIGR1bW15KTsKIAotZXh0ZXJuIGludCBkaXNhYmxlX3RpbWVyX3Bpbl8xOwotCiB2b2lkIHNtcF9zZW5kX3RpbWVyX2Jyb2FkY2FzdF9pcGkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogdm9pZCBzd2l0Y2hfQVBJQ190aW1lcl90b19pcGkodm9pZCAqY3B1bWFzayk7CiB2b2lkIHN3aXRjaF9pcGlfdG9fQVBJQ190aW1lcih2b2lkICpjcHVtYXNrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvZGVzYy5oIGIvaW5jbHVkZS9hc20taTM4Ni9kZXNjLmgKaW5kZXggODliOGI4Mi4uNTg3NGVmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9kZXNjLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9kZXNjLmgKQEAgLTMzLDUwICszMyw5OSBAQAogCXJldHVybiAoc3RydWN0IGRlc2Nfc3RydWN0ICopcGVyX2NwdShjcHVfZ2R0X2Rlc2NyLCBjcHUpLmFkZHJlc3M7CiB9CiAKLSNkZWZpbmUgbG9hZF9UUl9kZXNjKCkgX19hc21fXyBfX3ZvbGF0aWxlX18oImx0ciAldzAiOjoicSIgKEdEVF9FTlRSWV9UU1MqOCkpCi0jZGVmaW5lIGxvYWRfTERUX2Rlc2MoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXygibGxkdCAldzAiOjoicSIgKEdEVF9FTlRSWV9MRFQqOCkpCi0KLSNkZWZpbmUgbG9hZF9nZHQoZHRyKSBfX2FzbV9fIF9fdm9sYXRpbGUoImxnZHQgJTAiOjoibSIgKCpkdHIpKQotI2RlZmluZSBsb2FkX2lkdChkdHIpIF9fYXNtX18gX192b2xhdGlsZSgibGlkdCAlMCI6OiJtIiAoKmR0cikpCi0jZGVmaW5lIGxvYWRfdHIodHIpIF9fYXNtX18gX192b2xhdGlsZSgibHRyICUwIjo6Im1yIiAodHIpKQotI2RlZmluZSBsb2FkX2xkdChsZHQpIF9fYXNtX18gX192b2xhdGlsZSgibGxkdCAlMCI6OiJtciIgKGxkdCkpCi0KLSNkZWZpbmUgc3RvcmVfZ2R0KGR0cikgX19hc21fXyAoInNnZHQgJTAiOiI9bSIgKCpkdHIpKQotI2RlZmluZSBzdG9yZV9pZHQoZHRyKSBfX2FzbV9fICgic2lkdCAlMCI6Ij1tIiAoKmR0cikpCi0jZGVmaW5lIHN0b3JlX3RyKHRyKSBfX2FzbV9fICgic3RyICUwIjoiPW1yIiAodHIpKQotI2RlZmluZSBzdG9yZV9sZHQobGR0KSBfX2FzbV9fICgic2xkdCAlMCI6Ij1tciIgKGxkdCkpCi0KIC8qCiAgKiBUaGlzIGlzIHRoZSBsZHQgdGhhdCBldmVyeSBwcm9jZXNzIHdpbGwgZ2V0IHVubGVzcyB3ZSBuZWVkCiAgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGlzLgogICovCiBleHRlcm4gc3RydWN0IGRlc2Nfc3RydWN0IGRlZmF1bHRfbGR0W107CitleHRlcm4gc3RydWN0IGRlc2Nfc3RydWN0IGlkdF90YWJsZVtdOwogZXh0ZXJuIHZvaWQgc2V0X2ludHJfZ2F0ZSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICogYWRkcik7CiAKLSNkZWZpbmUgX3NldF90c3NsZHRfZGVzYyhuLGFkZHIsbGltaXQsdHlwZSkgXAotX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3Z3ICV3MywwKCUyKVxuXHQiIFwKLQkibW92dyAldzEsMiglMilcblx0IiBcCi0JInJvcmwgJDE2LCUxXG5cdCIgXAotCSJtb3ZiICViMSw0KCUyKVxuXHQiIFwKLQkibW92YiAlNCw1KCUyKVxuXHQiIFwKLQkibW92YiAkMCw2KCUyKVxuXHQiIFwKLQkibW92YiAlaDEsNyglMilcblx0IiBcCi0JInJvcmwgJDE2LCUxIiBcCi0JOiAiPW0iKCoobikpIDogInEiIChhZGRyKSwgInIiKG4pLCAiaXIiKGxpbWl0KSwgImkiKHR5cGUpKQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfdHNzX2Rlc2ModW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IGVudHJ5LCB2b2lkICphZGRyKQorc3RhdGljIGlubGluZSB2b2lkIHBhY2tfZGVzY3JpcHRvcihfX3UzMiAqYSwgX191MzIgKmIsCisJdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIGxpbWl0LCB1bnNpZ25lZCBjaGFyIHR5cGUsIHVuc2lnbmVkIGNoYXIgZmxhZ3MpCiB7Ci0JX3NldF90c3NsZHRfZGVzYygmZ2V0X2NwdV9nZHRfdGFibGUoY3B1KVtlbnRyeV0sIChpbnQpYWRkciwKLQkJb2Zmc2V0b2Yoc3RydWN0IHRzc19zdHJ1Y3QsIF9fY2FjaGVsaW5lX2ZpbGxlcikgLSAxLCAweDg5KTsKKwkqYSA9ICgoYmFzZSAmIDB4ZmZmZikgPDwgMTYpIHwgKGxpbWl0ICYgMHhmZmZmKTsKKwkqYiA9IChiYXNlICYgMHhmZjAwMDAwMCkgfCAoKGJhc2UgJiAweGZmMDAwMCkgPj4gMTYpIHwKKwkJKGxpbWl0ICYgMHgwMDBmMDAwMCkgfCAoKHR5cGUgJiAweGZmKSA8PCA4KSB8ICgoZmxhZ3MgJiAweGYpIDw8IDIwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBhY2tfZ2F0ZShfX3UzMiAqYSwgX191MzIgKmIsCisJdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBzaG9ydCBzZWcsIHVuc2lnbmVkIGNoYXIgdHlwZSwgdW5zaWduZWQgY2hhciBmbGFncykKK3sKKwkqYSA9IChzZWcgPDwgMTYpIHwgKGJhc2UgJiAweGZmZmYpOworCSpiID0gKGJhc2UgJiAweGZmZmYwMDAwKSB8ICgodHlwZSAmIDB4ZmYpIDw8IDgpIHwgKGZsYWdzICYgMHhmZik7Cit9CisKKyNkZWZpbmUgREVTQ1RZUEVfTERUIAkweDgyCS8qIHByZXNlbnQsIHN5c3RlbSwgRFBMLTAsIExEVCAqLworI2RlZmluZSBERVNDVFlQRV9UU1MgCTB4ODkJLyogcHJlc2VudCwgc3lzdGVtLCBEUEwtMCwgMzItYml0IFRTUyAqLworI2RlZmluZSBERVNDVFlQRV9UQVNLCTB4ODUJLyogcHJlc2VudCwgc3lzdGVtLCBEUEwtMCwgdGFzayBnYXRlICovCisjZGVmaW5lIERFU0NUWVBFX0lOVAkweDhlCS8qIHByZXNlbnQsIHN5c3RlbSwgRFBMLTAsIGludGVycnVwdCBnYXRlICovCisjZGVmaW5lIERFU0NUWVBFX1RSQVAJMHg4ZgkvKiBwcmVzZW50LCBzeXN0ZW0sIERQTC0wLCB0cmFwIGdhdGUgKi8KKyNkZWZpbmUgREVTQ1RZUEVfRFBMMwkweDYwCS8qIERQTC0zICovCisjZGVmaW5lIERFU0NUWVBFX1MJMHgxMAkvKiAhc3lzdGVtICovCisKKyNkZWZpbmUgbG9hZF9UUl9kZXNjKCkgX19hc21fXyBfX3ZvbGF0aWxlX18oImx0ciAldzAiOjoicSIgKEdEVF9FTlRSWV9UU1MqOCkpCisjZGVmaW5lIGxvYWRfTERUX2Rlc2MoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXygibGxkdCAldzAiOjoicSIgKEdEVF9FTlRSWV9MRFQqOCkpCisKKyNkZWZpbmUgbG9hZF9nZHQoZHRyKSBfX2FzbV9fIF9fdm9sYXRpbGUoImxnZHQgJTAiOjoibSIgKCpkdHIpKQorI2RlZmluZSBsb2FkX2lkdChkdHIpIF9fYXNtX18gX192b2xhdGlsZSgibGlkdCAlMCI6OiJtIiAoKmR0cikpCisjZGVmaW5lIGxvYWRfdHIodHIpIF9fYXNtX18gX192b2xhdGlsZSgibHRyICUwIjo6Im0iICh0cikpCisjZGVmaW5lIGxvYWRfbGR0KGxkdCkgX19hc21fXyBfX3ZvbGF0aWxlKCJsbGR0ICUwIjo6Im0iIChsZHQpKQorCisjZGVmaW5lIHN0b3JlX2dkdChkdHIpIF9fYXNtX18gKCJzZ2R0ICUwIjoiPW0iICgqZHRyKSkKKyNkZWZpbmUgc3RvcmVfaWR0KGR0cikgX19hc21fXyAoInNpZHQgJTAiOiI9bSIgKCpkdHIpKQorI2RlZmluZSBzdG9yZV90cih0cikgX19hc21fXyAoInN0ciAlMCI6Ij1tIiAodHIpKQorI2RlZmluZSBzdG9yZV9sZHQobGR0KSBfX2FzbV9fICgic2xkdCAlMCI6Ij1tIiAobGR0KSkKKworI2lmIFRMU19TSVpFICE9IDI0CisjIGVycm9yIHVwZGF0ZSB0aGlzIGNvZGUuCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGxvYWRfVExTKHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0LCB1bnNpZ25lZCBpbnQgY3B1KQoreworI2RlZmluZSBDKGkpIGdldF9jcHVfZ2R0X3RhYmxlKGNwdSlbR0RUX0VOVFJZX1RMU19NSU4gKyBpXSA9IHQtPnRsc19hcnJheVtpXQorCUMoMCk7IEMoMSk7IEMoMik7CisjdW5kZWYgQworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfZHRfZW50cnkodm9pZCAqZHQsIGludCBlbnRyeSwgX191MzIgZW50cnlfYSwgX191MzIgZW50cnlfYikKK3sKKwlfX3UzMiAqbHAgPSAoX191MzIgKikoKGNoYXIgKilkdCArIGVudHJ5KjgpOworCSpscCA9IGVudHJ5X2E7CisJKihscCsxKSA9IGVudHJ5X2I7Cit9CisKKyNkZWZpbmUgd3JpdGVfbGR0X2VudHJ5KGR0LCBlbnRyeSwgYSwgYikgd3JpdGVfZHRfZW50cnkoZHQsIGVudHJ5LCBhLCBiKQorI2RlZmluZSB3cml0ZV9nZHRfZW50cnkoZHQsIGVudHJ5LCBhLCBiKSB3cml0ZV9kdF9lbnRyeShkdCwgZW50cnksIGEsIGIpCisjZGVmaW5lIHdyaXRlX2lkdF9lbnRyeShkdCwgZW50cnksIGEsIGIpIHdyaXRlX2R0X2VudHJ5KGR0LCBlbnRyeSwgYSwgYikKKworc3RhdGljIGlubGluZSB2b2lkIF9zZXRfZ2F0ZShpbnQgZ2F0ZSwgdW5zaWduZWQgaW50IHR5cGUsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNob3J0IHNlZykKK3sKKwlfX3UzMiBhLCBiOworCXBhY2tfZ2F0ZSgmYSwgJmIsICh1bnNpZ25lZCBsb25nKWFkZHIsIHNlZywgdHlwZSwgMCk7CisJd3JpdGVfaWR0X2VudHJ5KGlkdF90YWJsZSwgZ2F0ZSwgYSwgYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3NldF90c3NfZGVzYyh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgZW50cnksIGNvbnN0IHZvaWQgKmFkZHIpCit7CisJX191MzIgYSwgYjsKKwlwYWNrX2Rlc2NyaXB0b3IoJmEsICZiLCAodW5zaWduZWQgbG9uZylhZGRyLAorCQkJb2Zmc2V0b2Yoc3RydWN0IHRzc19zdHJ1Y3QsIF9fY2FjaGVsaW5lX2ZpbGxlcikgLSAxLAorCQkJREVTQ1RZUEVfVFNTLCAwKTsKKwl3cml0ZV9nZHRfZW50cnkoZ2V0X2NwdV9nZHRfdGFibGUoY3B1KSwgZW50cnksIGEsIGIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2xkdF9kZXNjKHVuc2lnbmVkIGludCBjcHUsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGludCBlbnRyaWVzKQoreworCV9fdTMyIGEsIGI7CisJcGFja19kZXNjcmlwdG9yKCZhLCAmYiwgKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkJCWVudHJpZXMgKiBzaXplb2Yoc3RydWN0IGRlc2Nfc3RydWN0KSAtIDEsCisJCQlERVNDVFlQRV9MRFQsIDApOworCXdyaXRlX2dkdF9lbnRyeShnZXRfY3B1X2dkdF90YWJsZShjcHUpLCBHRFRfRU5UUllfTERULCBhLCBiKTsKIH0KIAogI2RlZmluZSBzZXRfdHNzX2Rlc2MoY3B1LGFkZHIpIF9fc2V0X3Rzc19kZXNjKGNwdSwgR0RUX0VOVFJZX1RTUywgYWRkcikKIAotc3RhdGljIGlubGluZSB2b2lkIHNldF9sZHRfZGVzYyh1bnNpZ25lZCBpbnQgY3B1LCB2b2lkICphZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLQlfc2V0X3Rzc2xkdF9kZXNjKCZnZXRfY3B1X2dkdF90YWJsZShjcHUpW0dEVF9FTlRSWV9MRFRdLCAoaW50KWFkZHIsICgoc2l6ZSA8PCAzKS0xKSwgMHg4Mik7Ci19Ci0KICNkZWZpbmUgTERUX2VudHJ5X2EoaW5mbykgXAogCSgoKChpbmZvKS0+YmFzZV9hZGRyICYgMHgwMDAwZmZmZikgPDwgMTYpIHwgKChpbmZvKS0+bGltaXQgJiAweDBmZmZmKSkKIApAQCAtMTAyLDI0ICsxNTEsNiBAQAogCShpbmZvKS0+c2VnX25vdF9wcmVzZW50CT09IDEJJiYgXAogCShpbmZvKS0+dXNlYWJsZQkJPT0gMAkpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9sZHRfZW50cnkodm9pZCAqbGR0LCBpbnQgZW50cnksIF9fdTMyIGVudHJ5X2EsIF9fdTMyIGVudHJ5X2IpCi17Ci0JX191MzIgKmxwID0gKF9fdTMyICopKChjaGFyICopbGR0ICsgZW50cnkqOCk7Ci0JKmxwID0gZW50cnlfYTsKLQkqKGxwKzEpID0gZW50cnlfYjsKLX0KLQotI2lmIFRMU19TSVpFICE9IDI0Ci0jIGVycm9yIHVwZGF0ZSB0aGlzIGNvZGUuCi0jZW5kaWYKLQotc3RhdGljIGlubGluZSB2b2lkIGxvYWRfVExTKHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0LCB1bnNpZ25lZCBpbnQgY3B1KQotewotI2RlZmluZSBDKGkpIGdldF9jcHVfZ2R0X3RhYmxlKGNwdSlbR0RUX0VOVFJZX1RMU19NSU4gKyBpXSA9IHQtPnRsc19hcnJheVtpXQotCUMoMCk7IEMoMSk7IEMoMik7Ci0jdW5kZWYgQwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfTERUKHZvaWQpCiB7CiAJaW50IGNwdSA9IGdldF9jcHUoKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvZHdhcmYyLmggYi9pbmNsdWRlL2FzbS1pMzg2L2R3YXJmMi5oCmluZGV4IDIyODBmNjIuLjZkNjYzOTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvZHdhcmYyLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9kd2FyZjIuaApAQCAtMSw4ICsxLDYgQEAKICNpZm5kZWYgX0RXQVJGMl9ICiAjZGVmaW5lIF9EV0FSRjJfSAogCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0KICNpZm5kZWYgX19BU1NFTUJMWV9fCiAjd2FybmluZyAiYXNtL2R3YXJmMi5oIHNob3VsZCBiZSBvbmx5IGluY2x1ZGVkIGluIHB1cmUgYXNzZW1ibHkgZmlsZXMiCiAjZW5kaWYKQEAgLTI4LDYgKzI2LDEzIEBACiAjZGVmaW5lIENGSV9SRVNUT1JFIC5jZmlfcmVzdG9yZQogI2RlZmluZSBDRklfUkVNRU1CRVJfU1RBVEUgLmNmaV9yZW1lbWJlcl9zdGF0ZQogI2RlZmluZSBDRklfUkVTVE9SRV9TVEFURSAuY2ZpX3Jlc3RvcmVfc3RhdGUKKyNkZWZpbmUgQ0ZJX1VOREVGSU5FRCAuY2ZpX3VuZGVmaW5lZAorCisjaWZkZWYgQ09ORklHX0FTX0NGSV9TSUdOQUxfRlJBTUUKKyNkZWZpbmUgQ0ZJX1NJR05BTF9GUkFNRSAuY2ZpX3NpZ25hbF9mcmFtZQorI2Vsc2UKKyNkZWZpbmUgQ0ZJX1NJR05BTF9GUkFNRQorI2VuZGlmCiAKICNlbHNlCiAKQEAgLTQ4LDYgKzUzLDggQEAKICNkZWZpbmUgQ0ZJX1JFU1RPUkUJaWdub3JlCiAjZGVmaW5lIENGSV9SRU1FTUJFUl9TVEFURSBpZ25vcmUKICNkZWZpbmUgQ0ZJX1JFU1RPUkVfU1RBVEUgaWdub3JlCisjZGVmaW5lIENGSV9VTkRFRklORUQgaWdub3JlCisjZGVmaW5lIENGSV9TSUdOQUxfRlJBTUUgaWdub3JlCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2U4MjAuaCBiL2luY2x1ZGUvYXNtLWkzODYvZTgyMC5oCmluZGV4IGNhODJhY2IuLmY3NTE0ZmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvZTgyMC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvZTgyMC5oCkBAIC0xOCw3ICsxOCw3IEBACiAKICNkZWZpbmUgRTgyMF9SQU0JMQogI2RlZmluZSBFODIwX1JFU0VSVkVECTIKLSNkZWZpbmUgRTgyMF9BQ1BJCTMgLyogdXNhYmxlIGFzIFJBTSBvbmNlIEFDUEkgdGFibGVzIGhhdmUgYmVlbiByZWFkICovCisjZGVmaW5lIEU4MjBfQUNQSQkzCiAjZGVmaW5lIEU4MjBfTlZTCTQKIAogI2RlZmluZSBISUdIX01FTU9SWQkoMTAyNCoxMDI0KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9mcmFtZS5pIGIvaW5jbHVkZS9hc20taTM4Ni9mcmFtZS5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjhkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2ZyYW1lLmkKQEAgLTAsMCArMSwyNCBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9kd2FyZjIuaD4KKworLyogVGhlIGFubm90YXRpb24gaGlkZXMgdGhlIGZyYW1lIGZyb20gdGhlIHVud2luZGVyIGFuZCBtYWtlcyBpdCBsb29rCisgICBsaWtlIGEgb3JkaW5hcnkgZWJwIHNhdmUvcmVzdG9yZS4gVGhpcyBhdm9pZHMgc29tZSBzcGVjaWFsIGNhc2VzIGZvcgorICAgZnJhbWUgcG9pbnRlciBsYXRlciAqLworI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCisJLm1hY3JvIEZSQU1FCisJcHVzaGwgJWVicAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA0CisJQ0ZJX1JFTF9PRkZTRVQgZWJwLDAKKwltb3ZsICVlc3AsJWVicAorCS5lbmRtCisJLm1hY3JvIEVOREZSQU1FCisJcG9wbCAlZWJwCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC00CisJQ0ZJX1JFU1RPUkUgZWJwCisJLmVuZG0KKyNlbHNlCisJLm1hY3JvIEZSQU1FCisJLmVuZG0KKwkubWFjcm8gRU5ERlJBTUUKKwkuZW5kbQorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2dlbmFwaWMuaCBiL2luY2x1ZGUvYXNtLWkzODYvZ2VuYXBpYy5oCmluZGV4IGIzNzgzYTMuLjhmZmJiMGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvZ2VuYXBpYy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvZ2VuYXBpYy5oCkBAIC0xLDYgKzEsOCBAQAogI2lmbmRlZiBfQVNNX0dFTkFQSUNfSAogI2RlZmluZSBfQVNNX0dFTkFQSUNfSCAxCiAKKyNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CisKIC8qCiAgKiBHZW5lcmljIEFQSUMgZHJpdmVyIGludGVyZmFjZS4KICAqCkBAIC02MywxNCArNjUsMjUgQEAKIAl1bnNpZ25lZCAoKmdldF9hcGljX2lkKSh1bnNpZ25lZCBsb25nIHgpOwogCXVuc2lnbmVkIGxvbmcgYXBpY19pZF9tYXNrOwogCXVuc2lnbmVkIGludCAoKmNwdV9tYXNrX3RvX2FwaWNpZCkoY3B1bWFza190IGNwdW1hc2spOwotCQorCisjaWZkZWYgQ09ORklHX1NNUAogCS8qIGlwaSAqLwogCXZvaWQgKCpzZW5kX0lQSV9tYXNrKShjcHVtYXNrX3QgbWFzaywgaW50IHZlY3Rvcik7CiAJdm9pZCAoKnNlbmRfSVBJX2FsbGJ1dHNlbGYpKGludCB2ZWN0b3IpOwogCXZvaWQgKCpzZW5kX0lQSV9hbGwpKGludCB2ZWN0b3IpOworI2VuZGlmCiB9OyAKIAotI2RlZmluZSBBUElDRlVOQyh4KSAueCA9IHgKKyNkZWZpbmUgQVBJQ0ZVTkMoeCkgLnggPSB4LAorCisvKiBNb3JlIGZ1bmN0aW9ucyBjb3VsZCBiZSBwcm9iYWJseSBtYXJrZWQgSVBJRlVOQyBhbmQgc2F2ZSBzb21lIHNwYWNlCisgICBpbiBVUCBHRU5FUklDQVJDSCBrZXJuZWxzLCBidXQgSSBkb24ndCBoYXZlIHRoZSBuZXJ2ZSByaWdodCBub3cKKyAgIHRvIHVudGFuZ2xlIHRoaXMgbWVzcy4gLUFLICAqLworI2lmZGVmIENPTkZJR19TTVAKKyNkZWZpbmUgSVBJRlVOQyh4KSBBUElDRlVOQyh4KQorI2Vsc2UKKyNkZWZpbmUgSVBJRlVOQyh4KQorI2VuZGlmCiAKICNkZWZpbmUgQVBJQ19JTklUKGFuYW1lLCBhcHJvYmUpIHsgXAogCS5uYW1lID0gYW5hbWUsIFwKQEAgLTgwLDMzICs5MywzMyBAQAogCS5ub19iYWxhbmNlX2lycSA9IE5PX0JBTEFOQ0VfSVJRLCBcCiAJLkVTUl9ESVNBQkxFID0gZXNyX2Rpc2FibGUsIFwKIAkuYXBpY19kZXN0aW5hdGlvbl9sb2dpY2FsID0gQVBJQ19ERVNUX0xPR0lDQUwsIFwKLQlBUElDRlVOQyhhcGljX2lkX3JlZ2lzdGVyZWQpLCBcCi0JQVBJQ0ZVTkModGFyZ2V0X2NwdXMpLCBcCi0JQVBJQ0ZVTkMoY2hlY2tfYXBpY2lkX3VzZWQpLCBcCi0JQVBJQ0ZVTkMoY2hlY2tfYXBpY2lkX3ByZXNlbnQpLCBcCi0JQVBJQ0ZVTkMoaW5pdF9hcGljX2xkciksIFwKLQlBUElDRlVOQyhpb2FwaWNfcGh5c19pZF9tYXApLCBcCi0JQVBJQ0ZVTkMoY2x1c3RlcmVkX2FwaWNfY2hlY2spLCBcCi0JQVBJQ0ZVTkMobXVsdGlfdGltZXJfY2hlY2spLCBcCi0JQVBJQ0ZVTkMoYXBpY2lkX3RvX25vZGUpLCBcCi0JQVBJQ0ZVTkMoY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKSwgXAotCUFQSUNGVU5DKGNwdV9wcmVzZW50X3RvX2FwaWNpZCksIFwKLQlBUElDRlVOQyhhcGljaWRfdG9fY3B1X3ByZXNlbnQpLCBcCi0JQVBJQ0ZVTkMobXBjX2FwaWNfaWQpLCBcCi0JQVBJQ0ZVTkMoc2V0dXBfcG9ydGlvX3JlbWFwKSwgXAotCUFQSUNGVU5DKGNoZWNrX3BoeXNfYXBpY2lkX3ByZXNlbnQpLCBcCi0JQVBJQ0ZVTkMobXBjX29lbV9idXNfaW5mbyksIFwKLQlBUElDRlVOQyhtcGNfb2VtX3BjaV9idXMpLCBcCi0JQVBJQ0ZVTkMobXBzX29lbV9jaGVjayksIFwKLQlBUElDRlVOQyhnZXRfYXBpY19pZCksIFwKKwlBUElDRlVOQyhhcGljX2lkX3JlZ2lzdGVyZWQpIFwKKwlBUElDRlVOQyh0YXJnZXRfY3B1cykgXAorCUFQSUNGVU5DKGNoZWNrX2FwaWNpZF91c2VkKSBcCisJQVBJQ0ZVTkMoY2hlY2tfYXBpY2lkX3ByZXNlbnQpIFwKKwlBUElDRlVOQyhpbml0X2FwaWNfbGRyKSBcCisJQVBJQ0ZVTkMoaW9hcGljX3BoeXNfaWRfbWFwKSBcCisJQVBJQ0ZVTkMoY2x1c3RlcmVkX2FwaWNfY2hlY2spIFwKKwlBUElDRlVOQyhtdWx0aV90aW1lcl9jaGVjaykgXAorCUFQSUNGVU5DKGFwaWNpZF90b19ub2RlKSBcCisJQVBJQ0ZVTkMoY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKSBcCisJQVBJQ0ZVTkMoY3B1X3ByZXNlbnRfdG9fYXBpY2lkKSBcCisJQVBJQ0ZVTkMoYXBpY2lkX3RvX2NwdV9wcmVzZW50KSBcCisJQVBJQ0ZVTkMobXBjX2FwaWNfaWQpIFwKKwlBUElDRlVOQyhzZXR1cF9wb3J0aW9fcmVtYXApIFwKKwlBUElDRlVOQyhjaGVja19waHlzX2FwaWNpZF9wcmVzZW50KSBcCisJQVBJQ0ZVTkMobXBjX29lbV9idXNfaW5mbykgXAorCUFQSUNGVU5DKG1wY19vZW1fcGNpX2J1cykgXAorCUFQSUNGVU5DKG1wc19vZW1fY2hlY2spIFwKKwlBUElDRlVOQyhnZXRfYXBpY19pZCkgXAogCS5hcGljX2lkX21hc2sgPSBBUElDX0lEX01BU0ssIFwKLQlBUElDRlVOQyhjcHVfbWFza190b19hcGljaWQpLCBcCi0JQVBJQ0ZVTkMoYWNwaV9tYWR0X29lbV9jaGVjayksIFwKLQlBUElDRlVOQyhzZW5kX0lQSV9tYXNrKSwgXAotCUFQSUNGVU5DKHNlbmRfSVBJX2FsbGJ1dHNlbGYpLCBcCi0JQVBJQ0ZVTkMoc2VuZF9JUElfYWxsKSwgXAotCUFQSUNGVU5DKGVuYWJsZV9hcGljX21vZGUpLCBcCi0JQVBJQ0ZVTkMocGh5c19wa2dfaWQpLCBcCisJQVBJQ0ZVTkMoY3B1X21hc2tfdG9fYXBpY2lkKSBcCisJQVBJQ0ZVTkMoYWNwaV9tYWR0X29lbV9jaGVjaykgXAorCUlQSUZVTkMoc2VuZF9JUElfbWFzaykgXAorCUlQSUZVTkMoc2VuZF9JUElfYWxsYnV0c2VsZikgXAorCUlQSUZVTkMoc2VuZF9JUElfYWxsKSBcCisJQVBJQ0ZVTkMoZW5hYmxlX2FwaWNfbW9kZSkgXAorCUFQSUNGVU5DKHBoeXNfcGtnX2lkKSBcCiAJfQogCiBleHRlcm4gc3RydWN0IGdlbmFwaWMgKmdlbmFwaWM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2ludGVsX2FyY2hfcGVyZm1vbi5oIGIvaW5jbHVkZS9hc20taTM4Ni9pbnRlbF9hcmNoX3BlcmZtb24uaAppbmRleCAxMzRlYTljLi5iNTJjZDYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2ludGVsX2FyY2hfcGVyZm1vbi5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaW50ZWxfYXJjaF9wZXJmbW9uLmgKQEAgLTE0LDYgKzE0LDE4IEBACiAKICNkZWZpbmUgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1NFTAkoMHgzYykKICNkZWZpbmUgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1VNQVNLCSgweDAwIDw8IDgpCi0jZGVmaW5lIEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19QUkVTRU5UICgxIDw8IDApCisjZGVmaW5lIEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19JTkRFWCAoMCkKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1BSRVNFTlQgXAorCQkJCSgxIDw8IChBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfSU5ERVgpKQorCit1bmlvbiBjcHVpZDEwX2VheCB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IHZlcnNpb25faWQ6ODsKKwkJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczo4OworCQl1bnNpZ25lZCBpbnQgYml0X3dpZHRoOjg7CisJCXVuc2lnbmVkIGludCBtYXNrX2xlbmd0aDo4OworCX0gc3BsaXQ7CisJdW5zaWduZWQgaW50IGZ1bGw7Cit9OwogCiAjZW5kaWYJLyogWDg2X0lOVEVMX0FSQ0hfUEVSRk1PTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2lvX2FwaWMuaCBiL2luY2x1ZGUvYXNtLWkzODYvaW9fYXBpYy5oCmluZGV4IDUwOTJlODEuLjVkMzA5MjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvaW9fYXBpYy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaW9fYXBpYy5oCkBAIC0xODgsNiArMTg4LDE2IEBACiAvKiAxIGlmICJub2FwaWMiIGJvb3Qgb3B0aW9uIHBhc3NlZCAqLwogZXh0ZXJuIGludCBza2lwX2lvYXBpY19zZXR1cDsKIAorc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfaW9hcGljX3NldHVwKHZvaWQpCit7CisJc2tpcF9pb2FwaWNfc2V0dXAgPSAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBpb2FwaWNfc2V0dXBfZGlzYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gc2tpcF9pb2FwaWNfc2V0dXA7Cit9CisKIC8qCiAgKiBJZiB3ZSB1c2UgdGhlIElPLUFQSUMgZm9yIElSUSByb3V0aW5nLCBkaXNhYmxlIGF1dG9tYXRpYwogICogYXNzaWdubWVudCBvZiBQQ0kgSVJRJ3MuCkBAIC0yMDYsNiArMjE2LDcgQEAKIAogI2Vsc2UgIC8qICFDT05GSUdfWDg2X0lPX0FQSUMgKi8KICNkZWZpbmUgaW9fYXBpY19hc3NpZ25fcGNpX2lycXMgMAorc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfaW9hcGljX3NldHVwKHZvaWQpIHsgfQogI2VuZGlmCiAKIGV4dGVybiBpbnQgYXNzaWduX2lycV92ZWN0b3IoaW50IGlycSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2tleGVjLmggYi9pbmNsdWRlL2FzbS1pMzg2L2tleGVjLmgKaW5kZXggNTNmMGUwNi4uNGRmYzlmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9rZXhlYy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYva2V4ZWMuaApAQCAtMSw2ICsxLDI2IEBACiAjaWZuZGVmIF9JMzg2X0tFWEVDX0gKICNkZWZpbmUgX0kzODZfS0VYRUNfSAogCisjZGVmaW5lIFBBX0NPTlRST0xfUEFHRSAgMAorI2RlZmluZSBWQV9DT05UUk9MX1BBR0UgIDEKKyNkZWZpbmUgUEFfUEdEICAgICAgICAgICAyCisjZGVmaW5lIFZBX1BHRCAgICAgICAgICAgMworI2RlZmluZSBQQV9QVEVfMCAgICAgICAgIDQKKyNkZWZpbmUgVkFfUFRFXzAgICAgICAgICA1CisjZGVmaW5lIFBBX1BURV8xICAgICAgICAgNgorI2RlZmluZSBWQV9QVEVfMSAgICAgICAgIDcKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorI2RlZmluZSBQQV9QTURfMCAgICAgICAgIDgKKyNkZWZpbmUgVkFfUE1EXzAgICAgICAgICA5CisjZGVmaW5lIFBBX1BNRF8xICAgICAgICAgMTAKKyNkZWZpbmUgVkFfUE1EXzEgICAgICAgICAxMQorI2RlZmluZSBQQUdFU19OUiAgICAgICAgIDEyCisjZWxzZQorI2RlZmluZSBQQUdFU19OUiAgICAgICAgIDgKKyNlbmRpZgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCiAjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CkBAIC03Miw1ICs5MiwxMiBAQAogICAgICAgICAgICAgICAgbmV3cmVncy0+ZWlwID0gKHVuc2lnbmVkIGxvbmcpY3VycmVudF90ZXh0X2FkZHIoKTsKICAgICAgICB9CiB9Cithc21saW5rYWdlIE5PUkVUX1RZUEUgdm9pZAorcmVsb2NhdGVfa2VybmVsKHVuc2lnbmVkIGxvbmcgaW5kaXJlY3Rpb25fcGFnZSwKKwkJdW5zaWduZWQgbG9uZyBjb250cm9sX3BhZ2UsCisJCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcmVzcywKKwkJdW5zaWduZWQgaW50IGhhc19wYWUpIEFUVFJJQl9OT1JFVDsKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX0kzODZfS0VYRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWVzNzAwMC9tYWNoX2FwaWMuaCBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1lczcwMDAvbWFjaF9hcGljLmgKaW5kZXggYjVmM2YwZC4uMjYzMzM2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWVzNzAwMC9tYWNoX2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZXM3MDAwL21hY2hfYXBpYy5oCkBAIC0xMjMsOSArMTIzLDEzIEBACiAvKiBNYXBwaW5nIGZyb20gY3B1IG51bWJlciB0byBsb2dpY2FsIGFwaWNpZCAqLwogc3RhdGljIGlubGluZSBpbnQgY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKGludCBjcHUpCiB7CisjaWZkZWYgQ09ORklHX1NNUAogICAgICAgIGlmIChjcHUgPj0gTlJfQ1BVUykKIAkgICAgICAgcmV0dXJuIEJBRF9BUElDSUQ7CiAgICAgICAgcmV0dXJuIChpbnQpY3B1XzJfbG9naWNhbF9hcGljaWRbY3B1XTsKKyNlbHNlCisJcmV0dXJuIGxvZ2ljYWxfc21wX3Byb2Nlc3Nvcl9pZCgpOworI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG1wY19hcGljX2lkKHN0cnVjdCBtcGNfY29uZmlnX3Byb2Nlc3NvciAqbSwgc3RydWN0IG1wY19jb25maWdfdHJhbnNsYXRpb24gKnVudXNlZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1zdW1taXQvbWFjaF9hcGljLmggYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtc3VtbWl0L21hY2hfYXBpYy5oCmluZGV4IDlmZDA3MzIuLmE4MWIwNTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1zdW1taXQvbWFjaF9hcGljLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXN1bW1pdC9tYWNoX2FwaWMuaApAQCAtNDYsMTAgKzQ2LDEyIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9hcGljX2xkcih2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgdmFsLCBpZDsKLQlpbnQgaSwgY291bnQ7Ci0JdTggbGlkOworCWludCBjb3VudCA9IDA7CiAJdTggbXlfaWQgPSAodTgpaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CiAJdTggbXlfY2x1c3RlciA9ICh1OClhcGljaWRfY2x1c3RlcihteV9pZCk7CisjaWZkZWYgQ09ORklHX1NNUAorCXU4IGxpZDsKKwlpbnQgaTsKIAogCS8qIENyZWF0ZSBsb2dpY2FsIEFQSUMgSURzIGJ5IGNvdW50aW5nIENQVXMgYWxyZWFkeSBpbiBjbHVzdGVyLiAqLwogCWZvciAoY291bnQgPSAwLCBpID0gTlJfQ1BVUzsgLS1pID49IDA7ICkgewpAQCAtNTcsNiArNTksNyBAQAogCQlpZiAobGlkICE9IEJBRF9BUElDSUQgJiYgYXBpY2lkX2NsdXN0ZXIobGlkKSA9PSBteV9jbHVzdGVyKQogCQkJKytjb3VudDsKIAl9CisjZW5kaWYKIAkvKiBXZSBvbmx5IGhhdmUgYSA0IHdpZGUgYml0bWFwIGluIGNsdXN0ZXIgbW9kZS4gIElmIGEgZGVyYW5nZWQKIAkgKiBCSU9TIHB1dHMgNSBDUFVzIGluIG9uZSBBUElDIGNsdXN0ZXIsIHdlJ3JlIGhvc2VkLiAqLwogCUJVR19PTihjb3VudCA+PSBYQVBJQ19ERVNUX0NQVVNfU0hJRlQpOwpAQCAtOTEsOSArOTQsMTMgQEAKIC8qIE1hcHBpbmcgZnJvbSBjcHUgbnVtYmVyIHRvIGxvZ2ljYWwgYXBpY2lkICovCiBzdGF0aWMgaW5saW5lIGludCBjcHVfdG9fbG9naWNhbF9hcGljaWQoaW50IGNwdSkKIHsKKyNpZmRlZiBDT05GSUdfU01QCiAgICAgICAgaWYgKGNwdSA+PSBOUl9DUFVTKQogCSAgICAgICByZXR1cm4gQkFEX0FQSUNJRDsKIAlyZXR1cm4gKGludCljcHVfMl9sb2dpY2FsX2FwaWNpZFtjcHVdOworI2Vsc2UKKwlyZXR1cm4gbG9naWNhbF9zbXBfcHJvY2Vzc29yX2lkKCk7CisjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSBpbnQgY3B1X3ByZXNlbnRfdG9fYXBpY2lkKGludCBtcHNfY3B1KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tdXRleC5oIGIvaW5jbHVkZS9hc20taTM4Ni9tdXRleC5oCmluZGV4IDA1YTUzODUuLjdhMTdkOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbXV0ZXguaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L211dGV4LmgKQEAgLTMwLDE0ICszMCwxMCBAQAogCQkJCQkJCQkJXAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKIAkJTE9DS19QUkVGSVggIiAgIGRlY2wgKCUlZWF4KQlcbiIJCQlcCi0JCQkiICAganMgMmYJCVxuIgkJCVwKKwkJCSIgICBqbnMgMWYJCVxuIgkJCVwKKwkJCSIgICBjYWxsICIjZmFpbF9mbiIJXG4iCQkJXAogCQkJIjE6CQkJXG4iCQkJXAogCQkJCQkJCQkJXAotCQlMT0NLX1NFQ1RJT05fU1RBUlQoIiIpCQkJCQlcCi0JCQkiMjogY2FsbCAiI2ZhaWxfZm4iCVxuIgkJCVwKLQkJCSIgICBqbXAgMWIJCVxuIgkJCVwKLQkJTE9DS19TRUNUSU9OX0VORAkJCQkJXAotCQkJCQkJCQkJXAogCQk6Ij1hIiAoZHVtbXkpCQkJCQkJXAogCQk6ICJhIiAoY291bnQpCQkJCQkJXAogCQk6ICJtZW1vcnkiLCAiZWN4IiwgImVkeCIpOwkJCQlcCkBAIC04NiwxNCArODIsMTAgQEAKIAkJCQkJCQkJCVwKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCiAJCUxPQ0tfUFJFRklYICIgICBpbmNsICglJWVheCkJXG4iCQkJXAotCQkJIiAgIGpsZSAyZgkJXG4iCQkJXAorCQkJIiAgIGpnCTFmCQlcbiIJCQlcCisJCQkiICAgY2FsbCAiI2ZhaWxfZm4iCVxuIgkJCVwKIAkJCSIxOgkJCVxuIgkJCVwKIAkJCQkJCQkJCVwKLQkJTE9DS19TRUNUSU9OX1NUQVJUKCIiKQkJCQkJXAotCQkJIjI6IGNhbGwgIiNmYWlsX2ZuIglcbiIJCQlcCi0JCQkiICAgam1wIDFiCQlcbiIJCQlcCi0JCUxPQ0tfU0VDVElPTl9FTkQJCQkJCVwKLQkJCQkJCQkJCVwKIAkJOiI9YSIgKGR1bW15KQkJCQkJCVwKIAkJOiAiYSIgKGNvdW50KQkJCQkJCVwKIAkJOiAibWVtb3J5IiwgImVjeCIsICJlZHgiKTsJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9ubWkuaCBiL2luY2x1ZGUvYXNtLWkzODYvbm1pLmgKaW5kZXggNjdkOTk0Ny4uMzAzYmNkNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9ubWkuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L25taS5oCkBAIC02LDMyICs2LDI5IEBACiAKICNpbmNsdWRlIDxsaW51eC9wbS5oPgogCi1zdHJ1Y3QgcHRfcmVnczsKLQotdHlwZWRlZiBpbnQgKCpubWlfY2FsbGJhY2tfdCkoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBpbnQgY3B1KTsKLQogLyoqCi0gKiBzZXRfbm1pX2NhbGxiYWNrCisgKiBkb19ubWlfY2FsbGJhY2sKICAqCi0gKiBTZXQgYSBoYW5kbGVyIGZvciBhbiBOTUkuIE9ubHkgb25lIGhhbmRsZXIgbWF5IGJlCi0gKiBzZXQuIFJldHVybiAxIGlmIHRoZSBOTUkgd2FzIGhhbmRsZWQuCisgKiBDaGVjayB0byBzZWUgaWYgYSBjYWxsYmFjayBleGlzdHMgYW5kIGV4ZWN1dGUgaXQuICBSZXR1cm4gMQorICogaWYgdGhlIGhhbmRsZXIgZXhpc3RzIGFuZCB3YXMgaGFuZGxlZCBzdWNjZXNzZnVsbHkuCiAgKi8KLXZvaWQgc2V0X25taV9jYWxsYmFjayhubWlfY2FsbGJhY2tfdCBjYWxsYmFjayk7CitpbnQgZG9fbm1pX2NhbGxiYWNrKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY3B1KTsKIAotLyoqCi0gKiB1bnNldF9ubWlfY2FsbGJhY2sKLSAqCi0gKiBSZW1vdmUgdGhlIGhhbmRsZXIgcHJldmlvdXNseSBzZXQuCi0gKi8KLXZvaWQgdW5zZXRfbm1pX2NhbGxiYWNrKHZvaWQpOworZXh0ZXJuIGludCBubWlfd2F0Y2hkb2dfZW5hYmxlZDsKK2V4dGVybiBpbnQgYXZhaWxfdG9fcmVzcnZfcGVyZmN0cl9ubWlfYml0KHVuc2lnbmVkIGludCk7CitleHRlcm4gaW50IGF2YWlsX3RvX3Jlc3J2X3BlcmZjdHJfbm1pKHVuc2lnbmVkIGludCk7CitleHRlcm4gaW50IHJlc2VydmVfcGVyZmN0cl9ubWkodW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIHJlbGVhc2VfcGVyZmN0cl9ubWkodW5zaWduZWQgaW50KTsKK2V4dGVybiBpbnQgcmVzZXJ2ZV9ldm50c2VsX25taSh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHZvaWQgcmVsZWFzZV9ldm50c2VsX25taSh1bnNpZ25lZCBpbnQpOwogCi1leHRlcm4gdm9pZCBzZXR1cF9hcGljX25taV93YXRjaGRvZyAodm9pZCk7Ci1leHRlcm4gaW50IHJlc2VydmVfbGFwaWNfbm1pKHZvaWQpOwotZXh0ZXJuIHZvaWQgcmVsZWFzZV9sYXBpY19ubWkodm9pZCk7CitleHRlcm4gdm9pZCBzZXR1cF9hcGljX25taV93YXRjaGRvZyAodm9pZCAqKTsKK2V4dGVybiB2b2lkIHN0b3BfYXBpY19ubWlfd2F0Y2hkb2cgKHZvaWQgKik7CiBleHRlcm4gdm9pZCBkaXNhYmxlX3RpbWVyX25taV93YXRjaGRvZyh2b2lkKTsKIGV4dGVybiB2b2lkIGVuYWJsZV90aW1lcl9ubWlfd2F0Y2hkb2codm9pZCk7Ci1leHRlcm4gdm9pZCBubWlfd2F0Y2hkb2dfdGljayAoc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKK2V4dGVybiBpbnQgbm1pX3dhdGNoZG9nX3RpY2sgKHN0cnVjdCBwdF9yZWdzICogcmVncywgdW5zaWduZWQgcmVhc29uKTsKIAorZXh0ZXJuIGF0b21pY190IG5taV9hY3RpdmU7CiBleHRlcm4gdW5zaWduZWQgaW50IG5taV93YXRjaGRvZzsKICNkZWZpbmUgTk1JX0RFRkFVTFQgICAgIC0xCiAjZGVmaW5lIE5NSV9OT05FCTAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKaW5kZXggMGRjMDUxYS4uNTQxYjNlMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9wZ3RhYmxlLmgKQEAgLTQxMSw4ICs0MTEsNiBAQAogIHN0YXRpYyBpbmxpbmUgaW50IHNldF9rZXJuZWxfZXhlYyh1bnNpZ25lZCBsb25nIHZhZGRyLCBpbnQgZW5hYmxlKSB7IHJldHVybiAwO30KICNlbmRpZgogCi1leHRlcm4gdm9pZCBub2V4ZWNfc2V0dXAoY29uc3QgY2hhciAqc3RyKTsKLQogI2lmIGRlZmluZWQoQ09ORklHX0hJR0hQVEUpCiAjZGVmaW5lIHB0ZV9vZmZzZXRfbWFwKGRpciwgYWRkcmVzcykgXAogCSgocHRlX3QgKilrbWFwX2F0b21pYyhwbWRfcGFnZSgqKGRpcikpLEtNX1BURTApICsgcHRlX2luZGV4KGFkZHJlc3MpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLWkzODYvcHRyYWNlLmgKaW5kZXggMTkxMDg4MC4uYTRhMGU1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3B0cmFjZS5oCkBAIC0yNyw2ICsyNyw3IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8YXNtL3ZtODYuaD4KKyNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7CiBleHRlcm4gdm9pZCBzZW5kX3NpZ3RyYXAoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZXJyb3JfY29kZSk7CkBAIC00MCwxOCArNDEsMTQgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgdXNlcl9tb2RlKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXJldHVybiAocmVncy0+eGNzICYgMykgIT0gMDsKKwlyZXR1cm4gKHJlZ3MtPnhjcyAmIFNFR01FTlRfUlBMX01BU0spID09IFVTRVJfUlBMOwogfQogc3RhdGljIGlubGluZSBpbnQgdXNlcl9tb2RlX3ZtKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXJldHVybiAoKHJlZ3MtPnhjcyAmIDMpIHwgKHJlZ3MtPmVmbGFncyAmIFZNX01BU0spKSAhPSAwOworCXJldHVybiAoKHJlZ3MtPnhjcyAmIFNFR01FTlRfUlBMX01BU0spIHwgKHJlZ3MtPmVmbGFncyAmIFZNX01BU0spKSA+PSBVU0VSX1JQTDsKIH0KICNkZWZpbmUgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSAoKHJlZ3MpLT5laXApCi0jaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiBkZWZpbmVkKENPTkZJR19GUkFNRV9QT0lOVEVSKQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcHJvZmlsZV9wYyhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci0jZWxzZQotI2RlZmluZSBwcm9maWxlX3BjKHJlZ3MpIGluc3RydWN0aW9uX3BvaW50ZXIocmVncykKLSNlbmRpZgogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3J3bG9jay5oIGIvaW5jbHVkZS9hc20taTM4Ni9yd2xvY2suaAppbmRleCA4N2MwNjljLi5jM2U1ZGIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3J3bG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcndsb2NrLmgKQEAgLTIwLDUyICsyMCw2IEBACiAjZGVmaW5lIFJXX0xPQ0tfQklBUwkJIDB4MDEwMDAwMDAKICNkZWZpbmUgUldfTE9DS19CSUFTX1NUUgkiMHgwMTAwMDAwMCIKIAotI2RlZmluZSBfX2J1aWxkX3JlYWRfbG9ja19wdHIocncsIGhlbHBlcikgICBcCi0JYXNtIHZvbGF0aWxlKExPQ0tfUFJFRklYICIgc3VibCAkMSwoJTApXG5cdCIgXAotCQkJImpucyAxZlxuIiBcCi0JCQkiY2FsbCAiIGhlbHBlciAiXG5cdCIgXAotCQkJIjE6XG4iIFwKLQkJCTo6ImEiIChydykgOiAibWVtb3J5IikKLQotI2RlZmluZSBfX2J1aWxkX3JlYWRfbG9ja19jb25zdChydywgaGVscGVyKSAgIFwKLQlhc20gdm9sYXRpbGUoTE9DS19QUkVGSVggIiBzdWJsICQxLCUwXG5cdCIgXAotCQkJImpucyAxZlxuIiBcCi0JCQkicHVzaGwgJSVlYXhcblx0IiBcCi0JCQkibGVhbCAlMCwlJWVheFxuXHQiIFwKLQkJCSJjYWxsICIgaGVscGVyICJcblx0IiBcCi0JCQkicG9wbCAlJWVheFxuXHQiIFwKLQkJCSIxOlxuIiBcCi0JCQk6IittIiAoKih2b2xhdGlsZSBpbnQgKilydykgOiA6ICJtZW1vcnkiKQotCi0jZGVmaW5lIF9fYnVpbGRfcmVhZF9sb2NrKHJ3LCBoZWxwZXIpCWRvIHsgXAotCQkJCQkJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHJ3KSkgXAotCQkJCQkJCV9fYnVpbGRfcmVhZF9sb2NrX2NvbnN0KHJ3LCBoZWxwZXIpOyBcCi0JCQkJCQllbHNlIFwKLQkJCQkJCQlfX2J1aWxkX3JlYWRfbG9ja19wdHIocncsIGhlbHBlcik7IFwKLQkJCQkJfSB3aGlsZSAoMCkKLQotI2RlZmluZSBfX2J1aWxkX3dyaXRlX2xvY2tfcHRyKHJ3LCBoZWxwZXIpIFwKLQlhc20gdm9sYXRpbGUoTE9DS19QUkVGSVggIiBzdWJsICQiIFJXX0xPQ0tfQklBU19TVFIgIiwoJTApXG5cdCIgXAotCQkJImp6IDFmXG4iIFwKLQkJCSJjYWxsICIgaGVscGVyICJcblx0IiBcCi0JCQkiMTpcbiIgXAotCQkJOjoiYSIgKHJ3KSA6ICJtZW1vcnkiKQotCi0jZGVmaW5lIF9fYnVpbGRfd3JpdGVfbG9ja19jb25zdChydywgaGVscGVyKSBcCi0JYXNtIHZvbGF0aWxlKExPQ0tfUFJFRklYICIgc3VibCAkIiBSV19MT0NLX0JJQVNfU1RSICIsJTBcblx0IiBcCi0JCQkianogMWZcbiIgXAotCQkJInB1c2hsICUlZWF4XG5cdCIgXAotCQkJImxlYWwgJTAsJSVlYXhcblx0IiBcCi0JCQkiY2FsbCAiIGhlbHBlciAiXG5cdCIgXAotCQkJInBvcGwgJSVlYXhcblx0IiBcCi0JCQkiMTpcbiIgXAotCQkJOiIrbSIgKCoodm9sYXRpbGUgaW50ICopcncpIDogOiAibWVtb3J5IikKLQotI2RlZmluZSBfX2J1aWxkX3dyaXRlX2xvY2socncsIGhlbHBlcikJZG8geyBcCi0JCQkJCQlpZiAoX19idWlsdGluX2NvbnN0YW50X3AocncpKSBcCi0JCQkJCQkJX19idWlsZF93cml0ZV9sb2NrX2NvbnN0KHJ3LCBoZWxwZXIpOyBcCi0JCQkJCQllbHNlIFwKLQkJCQkJCQlfX2J1aWxkX3dyaXRlX2xvY2tfcHRyKHJ3LCBoZWxwZXIpOyBcCi0JCQkJCX0gd2hpbGUgKDApCisvKiBDb2RlIGlzIGluIGFzbS1pMzg2L3NwaW5sb2NrLmggKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3J3c2VtLmggYi9pbmNsdWRlL2FzbS1pMzg2L3J3c2VtLmgKaW5kZXggNDMxMTNmNS4uYmM1OThkNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9yd3NlbS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcndzZW0uaApAQCAtOTksMTcgKzk5LDkgQEAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJIiMgYmVnaW5uaW5nIGRvd25fcmVhZFxuXHQiCiBMT0NLX1BSRUZJWAkiICBpbmNsICAgICAgKCUlZWF4KVxuXHQiIC8qIGFkZHMgMHgwMDAwMDAwMSwgcmV0dXJucyB0aGUgb2xkIHZhbHVlICovCi0JCSIgIGpzICAgICAgICAyZlxuXHQiIC8qIGp1bXAgaWYgd2Ugd2VyZW4ndCBncmFudGVkIHRoZSBsb2NrICovCisJCSIgIGpucyAgICAgICAgMWZcbiIKKwkJIiAgY2FsbCBjYWxsX3J3c2VtX2Rvd25fcmVhZF9mYWlsZWRcbiIKIAkJIjE6XG5cdCIKLQkJTE9DS19TRUNUSU9OX1NUQVJUKCIiKQotCQkiMjpcblx0IgotCQkiICBwdXNobCAgICAgJSVlY3hcblx0IgotCQkiICBwdXNobCAgICAgJSVlZHhcblx0IgotCQkiICBjYWxsICAgICAgcndzZW1fZG93bl9yZWFkX2ZhaWxlZFxuXHQiCi0JCSIgIHBvcGwgICAgICAlJWVkeFxuXHQiCi0JCSIgIHBvcGwgICAgICAlJWVjeFxuXHQiCi0JCSIgIGptcCAgICAgICAxYlxuIgotCQlMT0NLX1NFQ1RJT05fRU5ECiAJCSIjIGVuZGluZyBkb3duX3JlYWRcblx0IgogCQk6ICIrbSIgKHNlbS0+Y291bnQpCiAJCTogImEiIChzZW0pCkBAIC0xNTEsMTUgKzE0Myw5IEBACiAJCSIjIGJlZ2lubmluZyBkb3duX3dyaXRlXG5cdCIKIExPQ0tfUFJFRklYCSIgIHhhZGQgICAgICAlJWVkeCwoJSVlYXgpXG5cdCIgLyogc3VidHJhY3QgMHgwMDAwZmZmZiwgcmV0dXJucyB0aGUgb2xkIHZhbHVlICovCiAJCSIgIHRlc3RsICAgICAlJWVkeCwlJWVkeFxuXHQiIC8qIHdhcyB0aGUgY291bnQgMCBiZWZvcmU/ICovCi0JCSIgIGpueiAgICAgICAyZlxuXHQiIC8qIGp1bXAgaWYgd2Ugd2VyZW4ndCBncmFudGVkIHRoZSBsb2NrICovCi0JCSIxOlxuXHQiCi0JCUxPQ0tfU0VDVElPTl9TVEFSVCgiIikKLQkJIjI6XG5cdCIKLQkJIiAgcHVzaGwgICAgICUlZWN4XG5cdCIKLQkJIiAgY2FsbCAgICAgIHJ3c2VtX2Rvd25fd3JpdGVfZmFpbGVkXG5cdCIKLQkJIiAgcG9wbCAgICAgICUlZWN4XG5cdCIKLQkJIiAgam1wICAgICAgIDFiXG4iCi0JCUxPQ0tfU0VDVElPTl9FTkQKKwkJIiAganogICAgICAgIDFmXG4iCisJCSIgIGNhbGwgY2FsbF9yd3NlbV9kb3duX3dyaXRlX2ZhaWxlZFxuIgorCQkiMTpcbiIKIAkJIiMgZW5kaW5nIGRvd25fd3JpdGUiCiAJCTogIittIiAoc2VtLT5jb3VudCksICI9ZCIgKHRtcCkKIAkJOiAiYSIgKHNlbSksICIxIiAodG1wKQpAQCAtMTkzLDE3ICsxNzksOSBAQAogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCQkiIyBiZWdpbm5pbmcgX191cF9yZWFkXG5cdCIKIExPQ0tfUFJFRklYCSIgIHhhZGQgICAgICAlJWVkeCwoJSVlYXgpXG5cdCIgLyogc3VidHJhY3RzIDEsIHJldHVybnMgdGhlIG9sZCB2YWx1ZSAqLwotCQkiICBqcyAgICAgICAgMmZcblx0IiAvKiBqdW1wIGlmIHRoZSBsb2NrIGlzIGJlaW5nIHdhaXRlZCB1cG9uICovCi0JCSIxOlxuXHQiCi0JCUxPQ0tfU0VDVElPTl9TVEFSVCgiIikKLQkJIjI6XG5cdCIKLQkJIiAgZGVjdyAgICAgICUlZHhcblx0IiAvKiBkbyBub3RoaW5nIGlmIHN0aWxsIG91dHN0YW5kaW5nIGFjdGl2ZSByZWFkZXJzICovCi0JCSIgIGpueiAgICAgICAxYlxuXHQiCi0JCSIgIHB1c2hsICAgICAlJWVjeFxuXHQiCi0JCSIgIGNhbGwgICAgICByd3NlbV93YWtlXG5cdCIKLQkJIiAgcG9wbCAgICAgICUlZWN4XG5cdCIKLQkJIiAgam1wICAgICAgIDFiXG4iCi0JCUxPQ0tfU0VDVElPTl9FTkQKKwkJIiAgam5zICAgICAgICAxZlxuXHQiCisJCSIgIGNhbGwgY2FsbF9yd3NlbV93YWtlXG4iCisJCSIxOlxuIgogCQkiIyBlbmRpbmcgX191cF9yZWFkXG4iCiAJCTogIittIiAoc2VtLT5jb3VudCksICI9ZCIgKHRtcCkKIAkJOiAiYSIgKHNlbSksICIxIiAodG1wKQpAQCAtMjE5LDE3ICsxOTcsOSBAQAogCQkiIyBiZWdpbm5pbmcgX191cF93cml0ZVxuXHQiCiAJCSIgIG1vdmwgICAgICAlMiwlJWVkeFxuXHQiCiBMT0NLX1BSRUZJWAkiICB4YWRkbCAgICAgJSVlZHgsKCUlZWF4KVxuXHQiIC8qIHRyaWVzIHRvIHRyYW5zaXRpb24gMHhmZmZmMDAwMSAtPiAweDAwMDAwMDAwICovCi0JCSIgIGpueiAgICAgICAyZlxuXHQiIC8qIGp1bXAgaWYgdGhlIGxvY2sgaXMgYmVpbmcgd2FpdGVkIHVwb24gKi8KKwkJIiAganogICAgICAgMWZcbiIKKwkJIiAgY2FsbCBjYWxsX3J3c2VtX3dha2VcbiIKIAkJIjE6XG5cdCIKLQkJTE9DS19TRUNUSU9OX1NUQVJUKCIiKQotCQkiMjpcblx0IgotCQkiICBkZWN3ICAgICAgJSVkeFxuXHQiIC8qIGRpZCB0aGUgYWN0aXZlIGNvdW50IHJlZHVjZSB0byAwPyAqLwotCQkiICBqbnogICAgICAgMWJcblx0IiAvKiBqdW1wIGJhY2sgaWYgbm90ICovCi0JCSIgIHB1c2hsICAgICAlJWVjeFxuXHQiCi0JCSIgIGNhbGwgICAgICByd3NlbV93YWtlXG5cdCIKLQkJIiAgcG9wbCAgICAgICUlZWN4XG5cdCIKLQkJIiAgam1wICAgICAgIDFiXG4iCi0JCUxPQ0tfU0VDVElPTl9FTkQKIAkJIiMgZW5kaW5nIF9fdXBfd3JpdGVcbiIKIAkJOiAiK20iIChzZW0tPmNvdW50KQogCQk6ICJhIiAoc2VtKSwgImkiICgtUldTRU1fQUNUSVZFX1dSSVRFX0JJQVMpCkBAIC0yNDQsMTcgKzIxNCw5IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSIjIGJlZ2lubmluZyBfX2Rvd25ncmFkZV93cml0ZVxuXHQiCiBMT0NLX1BSRUZJWAkiICBhZGRsICAgICAgJTIsKCUlZWF4KVxuXHQiIC8qIHRyYW5zaXRpb25zIDB4WlpaWjAwMDEgLT4gMHhZWVlZMDAwMSAqLwotCQkiICBqcyAgICAgICAgMmZcblx0IiAvKiBqdW1wIGlmIHRoZSBsb2NrIGlzIGJlaW5nIHdhaXRlZCB1cG9uICovCisJCSIgIGpucyAgICAgICAxZlxuXHQiCisJCSIgIGNhbGwgY2FsbF9yd3NlbV9kb3duZ3JhZGVfd2FrZVxuIgogCQkiMTpcblx0IgotCQlMT0NLX1NFQ1RJT05fU1RBUlQoIiIpCi0JCSIyOlxuXHQiCi0JCSIgIHB1c2hsICAgICAlJWVjeFxuXHQiCi0JCSIgIHB1c2hsICAgICAlJWVkeFxuXHQiCi0JCSIgIGNhbGwgICAgICByd3NlbV9kb3duZ3JhZGVfd2FrZVxuXHQiCi0JCSIgIHBvcGwgICAgICAlJWVkeFxuXHQiCi0JCSIgIHBvcGwgICAgICAlJWVjeFxuXHQiCi0JCSIgIGptcCAgICAgICAxYlxuIgotCQlMT0NLX1NFQ1RJT05fRU5ECiAJCSIjIGVuZGluZyBfX2Rvd25ncmFkZV93cml0ZVxuIgogCQk6ICIrbSIgKHNlbS0+Y291bnQpCiAJCTogImEiIChzZW0pLCAiaSIgKC1SV1NFTV9XQUlUSU5HX0JJQVMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3NlZ21lbnQuaCBiL2luY2x1ZGUvYXNtLWkzODYvc2VnbWVudC5oCmluZGV4IGZhZjk5NTMuLmI3YWI1OTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvc2VnbWVudC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvc2VnbWVudC5oCkBAIC04Myw2ICs4MywxMSBAQAogCiAjZGVmaW5lIEdEVF9TSVpFIChHRFRfRU5UUklFUyAqIDgpCiAKKy8qIE1hdGNoZXMgX19LRVJORUxfQ1MgYW5kIF9fVVNFUl9DUyAodGhleSBtdXN0IGJlIDIgZW50cmllcyBhcGFydCkgKi8KKyNkZWZpbmUgU0VHTUVOVF9JU19GTEFUX0NPREUoeCkgICgoKHgpICYgMHhlYykgPT0gR0RUX0VOVFJZX0tFUk5FTF9DUyAqIDgpCisvKiBNYXRjaGVzIFBOUF9DUzMyIGFuZCBQTlBfQ1MxNiAodGhleSBtdXN0IGJlIGNvbnNlY3V0aXZlKSAqLworI2RlZmluZSBTRUdNRU5UX0lTX1BOUF9DT0RFKHgpICAgKCgoeCkgJiAweGY0KSA9PSBHRFRfRU5UUllfUE5QQklPU19CQVNFICogOCkKKwogLyogU2ltcGxlIGFuZCBzbWFsbCBHRFQgZW50cmllcyBmb3IgYm9vdGluZyBvbmx5ICovCiAKICNkZWZpbmUgR0RUX0VOVFJZX0JPT1RfQ1MJCTIKQEAgLTExMiw0ICsxMTcsMTYgQEAKICAqLwogI2RlZmluZSBJRFRfRU5UUklFUyAyNTYKIAorLyogQm90dG9tIHR3byBiaXRzIG9mIHNlbGVjdG9yIGdpdmUgdGhlIHJpbmcgcHJpdmlsZWdlIGxldmVsICovCisjZGVmaW5lIFNFR01FTlRfUlBMX01BU0sJMHgzCisvKiBCaXQgMiBpcyB0YWJsZSBpbmRpY2F0b3IgKExEVC9HRFQpICovCisjZGVmaW5lIFNFR01FTlRfVElfTUFTSwkJMHg0CisKKy8qIFVzZXIgbW9kZSBpcyBwcml2aWxlZ2UgbGV2ZWwgMyAqLworI2RlZmluZSBVU0VSX1JQTAkJMHgzCisvKiBMRFQgc2VnbWVudCBoYXMgVEkgc2V0LCBHRFQgaGFzIGl0IGNsZWFyZWQgKi8KKyNkZWZpbmUgU0VHTUVOVF9MRFQJCTB4NAorI2RlZmluZSBTRUdNRU5UX0dEVAkJMHgwCisKKyNkZWZpbmUgZ2V0X2tlcm5lbF9ycGwoKSAgMAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3NlbWFwaG9yZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9zZW1hcGhvcmUuaAppbmRleCBkNTFlODAwLi40ZTM0YTQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3NlbWFwaG9yZS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvc2VtYXBob3JlLmgKQEAgLTEwMCwxMyArMTAwLDEwIEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSIjIGF0b21pYyBkb3duIG9wZXJhdGlvblxuXHQiCiAJCUxPQ0tfUFJFRklYICJkZWNsICUwXG5cdCIgICAgIC8qIC0tc2VtLT5jb3VudCAqLwotCQkianMgMmZcbiIKLQkJIjE6XG4iCi0JCUxPQ0tfU0VDVElPTl9TVEFSVCgiIikKLQkJIjI6XHRsZWEgJTAsJSVlYXhcblx0IgotCQkiY2FsbCBfX2Rvd25fZmFpbGVkXG5cdCIKLQkJImptcCAxYlxuIgotCQlMT0NLX1NFQ1RJT05fRU5ECisJCSJqbnMgMmZcbiIKKwkJIlx0bGVhICUwLCUlZWF4XG5cdCIKKwkJImNhbGwgX19kb3duX2ZhaWxlZFxuIgorCQkiMjoiCiAJCToiK20iIChzZW0tPmNvdW50KQogCQk6CiAJCToibWVtb3J5IiwiYXgiKTsKQEAgLTEyMywxNiArMTIwLDEzIEBACiAJbWlnaHRfc2xlZXAoKTsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJIiMgYXRvbWljIGludGVycnVwdGlibGUgZG93biBvcGVyYXRpb25cblx0IgorCQkieG9ybCAlMCwlMFxuXHQiCiAJCUxPQ0tfUFJFRklYICJkZWNsICUxXG5cdCIgICAgIC8qIC0tc2VtLT5jb3VudCAqLwotCQkianMgMmZcblx0IgotCQkieG9ybCAlMCwlMFxuIgotCQkiMTpcbiIKLQkJTE9DS19TRUNUSU9OX1NUQVJUKCIiKQotCQkiMjpcdGxlYSAlMSwlJWVheFxuXHQiCi0JCSJjYWxsIF9fZG93bl9mYWlsZWRfaW50ZXJydXB0aWJsZVxuXHQiCi0JCSJqbXAgMWJcbiIKLQkJTE9DS19TRUNUSU9OX0VORAotCQk6Ij1hIiAocmVzdWx0KSwgIittIiAoc2VtLT5jb3VudCkKKwkJImpucyAyZlxuXHQiCisJCSJsZWEgJTEsJSVlYXhcblx0IgorCQkiY2FsbCBfX2Rvd25fZmFpbGVkX2ludGVycnVwdGlibGVcbiIKKwkJIjI6IgorCQk6Ij0mYSIgKHJlc3VsdCksICIrbSIgKHNlbS0+Y291bnQpCiAJCToKIAkJOiJtZW1vcnkiKTsKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTQ4LDE2ICsxNDIsMTMgQEAKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCQkiIyBhdG9taWMgaW50ZXJydXB0aWJsZSBkb3duIG9wZXJhdGlvblxuXHQiCisJCSJ4b3JsICUwLCUwXG5cdCIKIAkJTE9DS19QUkVGSVggImRlY2wgJTFcblx0IiAgICAgLyogLS1zZW0tPmNvdW50ICovCi0JCSJqcyAyZlxuXHQiCi0JCSJ4b3JsICUwLCUwXG4iCi0JCSIxOlxuIgotCQlMT0NLX1NFQ1RJT05fU1RBUlQoIiIpCi0JCSIyOlx0bGVhICUxLCUlZWF4XG5cdCIKKwkJImpucyAyZlxuXHQiCisJCSJsZWEgJTEsJSVlYXhcblx0IgogCQkiY2FsbCBfX2Rvd25fZmFpbGVkX3RyeWxvY2tcblx0IgotCQkiam1wIDFiXG4iCi0JCUxPQ0tfU0VDVElPTl9FTkQKLQkJOiI9YSIgKHJlc3VsdCksICIrbSIgKHNlbS0+Y291bnQpCisJCSIyOlxuIgorCQk6Ij0mYSIgKHJlc3VsdCksICIrbSIgKHNlbS0+Y291bnQpCiAJCToKIAkJOiJtZW1vcnkiKTsKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTY2LDIyICsxNTcsMTYgQEAKIC8qCiAgKiBOb3RlISBUaGlzIGlzIHN1YnRsZS4gV2UganVtcCB0byB3YWtlIHBlb3BsZSB1cCBvbmx5IGlmCiAgKiB0aGUgc2VtYXBob3JlIHdhcyBuZWdhdGl2ZSAoPT0gc29tZWJvZHkgd2FzIHdhaXRpbmcgb24gaXQpLgotICogVGhlIGRlZmF1bHQgY2FzZSAobm8gY29udGVudGlvbikgd2lsbCByZXN1bHQgaW4gTk8KLSAqIGp1bXBzIGZvciBib3RoIGRvd24oKSBhbmQgdXAoKS4KICAqLwogc3RhdGljIGlubGluZSB2b2lkIHVwKHN0cnVjdCBzZW1hcGhvcmUgKiBzZW0pCiB7CiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSIjIGF0b21pYyB1cCBvcGVyYXRpb25cblx0IgogCQlMT0NLX1BSRUZJWCAiaW5jbCAlMFxuXHQiICAgICAvKiArK3NlbS0+Y291bnQgKi8KLQkJImpsZSAyZlxuIgotCQkiMTpcbiIKLQkJTE9DS19TRUNUSU9OX1NUQVJUKCIiKQotCQkiMjpcdGxlYSAlMCwlJWVheFxuXHQiCi0JCSJjYWxsIF9fdXBfd2FrZXVwXG5cdCIKLQkJImptcCAxYlxuIgotCQlMT0NLX1NFQ1RJT05fRU5ECi0JCSIuc3Vic2VjdGlvbiAwXG4iCisJCSJqZyAxZlxuXHQiCisJCSJsZWEgJTAsJSVlYXhcblx0IgorCQkiY2FsbCBfX3VwX3dha2V1cFxuIgorCQkiMToiCiAJCToiK20iIChzZW0tPmNvdW50KQogCQk6CiAJCToibWVtb3J5IiwiYXgiKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvc21wLmggYi9pbmNsdWRlL2FzbS1pMzg2L3NtcC5oCmluZGV4IDE0MmQxMGUuLjMyYWM4YzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvc21wLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9zbXAuaApAQCAtODAsMTcgKzgwLDEyIEBACiAJcmV0dXJuIEdFVF9BUElDX0lEKCoodW5zaWduZWQgbG9uZyAqKShBUElDX0JBU0UrQVBJQ19JRCkpOwogfQogI2VuZGlmCi0KLXN0YXRpYyBfX2lubGluZSBpbnQgbG9naWNhbF9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpCi17Ci0JLyogd2UgZG9uJ3Qgd2FudCB0byBtYXJrIHRoaXMgYWNjZXNzIHZvbGF0aWxlIC0gYmFkIGNvZGUgZ2VuZXJhdGlvbiAqLwotCXJldHVybiBHRVRfQVBJQ19MT0dJQ0FMX0lEKCoodW5zaWduZWQgbG9uZyAqKShBUElDX0JBU0UrQVBJQ19MRFIpKTsKLX0KLQogI2VuZGlmCiAKIGV4dGVybiBpbnQgX19jcHVfZGlzYWJsZSh2b2lkKTsKIGV4dGVybiB2b2lkIF9fY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgbnVtX3Byb2Nlc3NvcnM7CisKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKICNlbHNlIC8qIENPTkZJR19TTVAgKi8KQEAgLTEwMCw0ICs5NSwxNSBAQAogI2RlZmluZSBOT19QUk9DX0lECQkweEZGCQkvKiBObyBwcm9jZXNzb3IgbWFnaWMgbWFya2VyICovCiAKICNlbmRpZgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworc3RhdGljIF9faW5saW5lIGludCBsb2dpY2FsX3NtcF9wcm9jZXNzb3JfaWQodm9pZCkKK3sKKwkvKiB3ZSBkb24ndCB3YW50IHRvIG1hcmsgdGhpcyBhY2Nlc3Mgdm9sYXRpbGUgLSBiYWQgY29kZSBnZW5lcmF0aW9uICovCisJcmV0dXJuIEdFVF9BUElDX0xPR0lDQUxfSUQoKih1bnNpZ25lZCBsb25nICopKEFQSUNfQkFTRStBUElDX0xEUikpOworfQorI2VuZGlmCisjZW5kaWYKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3NwaW5sb2NrLmggYi9pbmNsdWRlL2FzbS1pMzg2L3NwaW5sb2NrLmgKaW5kZXggZDEwMjAzNi4uYjBiMzA0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvc3BpbmxvY2suaApAQCAtNCw4ICs0LDEyIEBACiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9yd2xvY2suaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogCisjZGVmaW5lIENMSV9TVFJJTkcJImNsaSIKKyNkZWZpbmUgU1RJX1NUUklORwkic3RpIgorCiAvKgogICogWW91ciBiYXNpYyBTTVAgc3BpbmxvY2tzLCBhbGxvd2luZyBvbmx5IGEgc2luZ2xlIENQVSBhbnl3aGVyZQogICoKQEAgLTE3LDY3ICsyMSw2NCBAQAogICogKHRoZSB0eXBlIGRlZmluaXRpb25zIGFyZSBpbiBhc20vc3BpbmxvY2tfdHlwZXMuaCkKICAqLwogCi0jZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKHgpIFwKLQkJKCoodm9sYXRpbGUgc2lnbmVkIGNoYXIgKikoJih4KS0+c2xvY2spIDw9IDApCi0KLSNkZWZpbmUgX19yYXdfc3Bpbl9sb2NrX3N0cmluZyBcCi0JIlxuMTpcdCIgXAotCUxPQ0tfUFJFRklYICIgOyBkZWNiICUwXG5cdCIgXAotCSJqbnMgM2ZcbiIgXAotCSIyOlx0IiBcCi0JInJlcDtub3Bcblx0IiBcCi0JImNtcGIgJDAsJTBcblx0IiBcCi0JImpsZSAyYlxuXHQiIFwKLQkiam1wIDFiXG4iIFwKLQkiMzpcblx0IgotCi0vKgotICogTk9URTogdGhlcmUncyBhbiBpcnFzLW9uIHNlY3Rpb24gaGVyZSwgd2hpY2ggbm9ybWFsbHkgd291bGQgaGF2ZSB0byBiZQotICogaXJxLXRyYWNlZCwgYnV0IG9uIENPTkZJR19UUkFDRV9JUlFGTEFHUyB3ZSBuZXZlciB1c2UKLSAqIF9fcmF3X3NwaW5fbG9ja19zdHJpbmdfZmxhZ3MoKS4KLSAqLwotI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfc3RyaW5nX2ZsYWdzIFwKLQkiXG4xOlx0IiBcCi0JTE9DS19QUkVGSVggIiA7IGRlY2IgJTBcblx0IiBcCi0JImpucyA1ZlxuIiBcCi0JIjI6XHQiIFwKLQkidGVzdGwgJDB4MjAwLCAlMVxuXHQiIFwKLQkianogNGZcblx0IiBcCi0JInN0aVxuIiBcCi0JIjM6XHQiIFwKLQkicmVwO25vcFxuXHQiIFwKLQkiY21wYiAkMCwgJTBcblx0IiBcCi0JImpsZSAzYlxuXHQiIFwKLQkiY2xpXG5cdCIgXAotCSJqbXAgMWJcbiIgXAotCSI0Olx0IiBcCi0JInJlcDtub3Bcblx0IiBcCi0JImNtcGIgJDAsICUwXG5cdCIgXAotCSJqZyAxYlxuXHQiIFwKLQkiam1wIDRiXG4iIFwKLQkiNTpcblx0Igorc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl9pc19sb2NrZWQocmF3X3NwaW5sb2NrX3QgKngpCit7CisJcmV0dXJuICoodm9sYXRpbGUgc2lnbmVkIGNoYXIgKikoJih4KS0+c2xvY2spIDw9IDA7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX2xvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7Ci0JYXNtKF9fcmF3X3NwaW5fbG9ja19zdHJpbmcgOiAiK20iIChsb2NrLT5zbG9jaykgOiA6ICJtZW1vcnkiKTsKKwlhc20gdm9sYXRpbGUoIlxuMTpcdCIKKwkJICAgICBMT0NLX1BSRUZJWCAiIDsgZGVjYiAlMFxuXHQiCisJCSAgICAgImpucyAzZlxuIgorCQkgICAgICIyOlx0IgorCQkgICAgICJyZXA7bm9wXG5cdCIKKwkJICAgICAiY21wYiAkMCwlMFxuXHQiCisJCSAgICAgImpsZSAyYlxuXHQiCisJCSAgICAgImptcCAxYlxuIgorCQkgICAgICIzOlxuXHQiCisJCSAgICAgOiAiK20iIChsb2NrLT5zbG9jaykgOiA6ICJtZW1vcnkiKTsKIH0KIAogLyoKICAqIEl0IGlzIGVhc2llciBmb3IgdGhlIGxvY2sgdmFsaWRhdG9yIGlmIGludGVycnVwdHMgYXJlIG5vdCByZS1lbmFibGVkCiAgKiBpbiB0aGUgbWlkZGxlIG9mIGEgbG9jay1hY3F1aXJlLiBUaGlzIGlzIGEgcGVyZm9ybWFuY2UgZmVhdHVyZSBhbnl3YXkKICAqIHNvIHdlIHR1cm4gaXQgb2ZmOgorICoKKyAqIE5PVEU6IHRoZXJlJ3MgYW4gaXJxcy1vbiBzZWN0aW9uIGhlcmUsIHdoaWNoIG5vcm1hbGx5IHdvdWxkIGhhdmUgdG8gYmUKKyAqIGlycS10cmFjZWQsIGJ1dCBvbiBDT05GSUdfVFJBQ0VfSVJRRkxBR1Mgd2UgbmV2ZXIgdXNlIHRoaXMgdmFyaWFudC4KICAqLwogI2lmbmRlZiBDT05GSUdfUFJPVkVfTE9DS0lORwogc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fbG9ja19mbGFncyhyYXdfc3BpbmxvY2tfdCAqbG9jaywgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQlhc20oX19yYXdfc3Bpbl9sb2NrX3N0cmluZ19mbGFncyA6ICIrbSIgKGxvY2stPnNsb2NrKSA6ICJyIiAoZmxhZ3MpIDogIm1lbW9yeSIpOworCWFzbSB2b2xhdGlsZSgKKwkJIlxuMTpcdCIKKwkJTE9DS19QUkVGSVggIiA7IGRlY2IgJTBcblx0IgorCQkiam5zIDVmXG4iCisJCSIyOlx0IgorCQkidGVzdGwgJDB4MjAwLCAlMVxuXHQiCisJCSJqeiA0ZlxuXHQiCisJCVNUSV9TVFJJTkcgIlxuIgorCQkiMzpcdCIKKwkJInJlcDtub3Bcblx0IgorCQkiY21wYiAkMCwgJTBcblx0IgorCQkiamxlIDNiXG5cdCIKKwkJQ0xJX1NUUklORyAiXG5cdCIKKwkJImptcCAxYlxuIgorCQkiNDpcdCIKKwkJInJlcDtub3Bcblx0IgorCQkiY21wYiAkMCwgJTBcblx0IgorCQkiamcgMWJcblx0IgorCQkiam1wIDRiXG4iCisJCSI1OlxuXHQiCisJCTogIittIiAobG9jay0+c2xvY2spIDogInIiIChmbGFncykgOiAibWVtb3J5Iik7CiB9CiAjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgX19yYXdfc3Bpbl90cnlsb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCWNoYXIgb2xkdmFsOwotCV9fYXNtX18gX192b2xhdGlsZV9fKAorCWFzbSB2b2xhdGlsZSgKIAkJInhjaGdiICViMCwlMSIKIAkJOiI9cSIgKG9sZHZhbCksICIrbSIgKGxvY2stPnNsb2NrKQogCQk6IjAiICgwKSA6ICJtZW1vcnkiKTsKQEAgLTkzLDM4ICs5NCwyOSBAQAogCiAjaWYgIWRlZmluZWQoQ09ORklHX1g4Nl9PT1NUT1JFKSAmJiAhZGVmaW5lZChDT05GSUdfWDg2X1BQUk9fRkVOQ0UpCiAKLSNkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2tfc3RyaW5nIFwKLQkibW92YiAkMSwlMCIgXAotCQk6IittIiAobG9jay0+c2xvY2spIDogOiAibWVtb3J5IgotCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19zcGluX3VubG9jayhyYXdfc3BpbmxvY2tfdCAqbG9jaykKIHsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJX19yYXdfc3Bpbl91bmxvY2tfc3RyaW5nCi0JKTsKKwlhc20gdm9sYXRpbGUoIm1vdmIgJDEsJTAiIDogIittIiAobG9jay0+c2xvY2spIDo6ICJtZW1vcnkiKTsKIH0KIAogI2Vsc2UKIAotI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja19zdHJpbmcgXAotCSJ4Y2hnYiAlYjAsICUxIiBcCi0JCToiPXEiIChvbGR2YWwpLCAiK20iIChsb2NrLT5zbG9jaykgXAotCQk6IjAiIChvbGR2YWwpIDogIm1lbW9yeSIKLQogc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3NwaW5fdW5sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewogCWNoYXIgb2xkdmFsID0gMTsKIAotCV9fYXNtX18gX192b2xhdGlsZV9fKAotCQlfX3Jhd19zcGluX3VubG9ja19zdHJpbmcKLQkpOworCWFzbSB2b2xhdGlsZSgieGNoZ2IgJWIwLCAlMSIKKwkJICAgICA6ICI9cSIgKG9sZHZhbCksICIrbSIgKGxvY2stPnNsb2NrKQorCQkgICAgIDogIjAiIChvbGR2YWwpIDogIm1lbW9yeSIpOwogfQogCiAjZW5kaWYKIAotI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja193YWl0KGxvY2spIFwKLQlkbyB7IHdoaWxlIChfX3Jhd19zcGluX2lzX2xvY2tlZChsb2NrKSkgY3B1X3JlbGF4KCk7IH0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2tfd2FpdChyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwl3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQobG9jaykpCisJCWNwdV9yZWxheCgpOworfQogCiAvKgogICogUmVhZC13cml0ZSBzcGlubG9ja3MsIGFsbG93aW5nIG11bHRpcGxlIHJlYWRlcnMKQEAgLTE1MSwyMiArMTQzLDM2IEBACiAgKiByZWFkX2Nhbl9sb2NrIC0gd291bGQgcmVhZF90cnlsb2NrKCkgc3VjY2VlZD8KICAqIEBsb2NrOiB0aGUgcndsb2NrIGluIHF1ZXN0aW9uLgogICovCi0jZGVmaW5lIF9fcmF3X3JlYWRfY2FuX2xvY2soeCkJCSgoaW50KSh4KS0+bG9jayA+IDApCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19yZWFkX2Nhbl9sb2NrKHJhd19yd2xvY2tfdCAqeCkKK3sKKwlyZXR1cm4gKGludCkoeCktPmxvY2sgPiAwOworfQogCiAvKioKICAqIHdyaXRlX2Nhbl9sb2NrIC0gd291bGQgd3JpdGVfdHJ5bG9jaygpIHN1Y2NlZWQ/CiAgKiBAbG9jazogdGhlIHJ3bG9jayBpbiBxdWVzdGlvbi4KICAqLwotI2RlZmluZSBfX3Jhd193cml0ZV9jYW5fbG9jayh4KQkJKCh4KS0+bG9jayA9PSBSV19MT0NLX0JJQVMpCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd193cml0ZV9jYW5fbG9jayhyYXdfcndsb2NrX3QgKngpCit7CisJcmV0dXJuICh4KS0+bG9jayA9PSBSV19MT0NLX0JJQVM7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKLQlfX2J1aWxkX3JlYWRfbG9jayhydywgIl9fcmVhZF9sb2NrX2ZhaWxlZCIpOworCWFzbSB2b2xhdGlsZShMT0NLX1BSRUZJWCAiIHN1YmwgJDEsKCUwKVxuXHQiCisJCSAgICAgImpucyAxZlxuIgorCQkgICAgICJjYWxsIF9fcmVhZF9sb2NrX2ZhaWxlZFxuXHQiCisJCSAgICAgIjE6XG4iCisJCSAgICAgOjoiYSIgKHJ3KSA6ICJtZW1vcnkiKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIF9fcmF3X3dyaXRlX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKLQlfX2J1aWxkX3dyaXRlX2xvY2socncsICJfX3dyaXRlX2xvY2tfZmFpbGVkIik7CisJYXNtIHZvbGF0aWxlKExPQ0tfUFJFRklYICIgc3VibCAkIiBSV19MT0NLX0JJQVNfU1RSICIsKCUwKVxuXHQiCisJCSAgICAgImp6IDFmXG4iCisJCSAgICAgImNhbGwgX193cml0ZV9sb2NrX2ZhaWxlZFxuXHQiCisJCSAgICAgIjE6XG4iCisJCSAgICAgOjoiYSIgKHJ3KSA6ICJtZW1vcnkiKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgX19yYXdfcmVhZF90cnlsb2NrKHJhd19yd2xvY2tfdCAqbG9jaykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvc3RhY2t0cmFjZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9zdGFja3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QxZjZhNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvc3RhY2t0cmFjZS5oCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlIDxhc20teDg2XzY0L3N0YWNrdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdGhlcm1fdGhyb3QuaCBiL2luY2x1ZGUvYXNtLWkzODYvdGhlcm1fdGhyb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTliZjYwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taTM4Ni90aGVybV90aHJvdC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfX0FTTV9JMzg2X1RIRVJNX1RIUk9UX0hfXworI2RlZmluZSBfX0FTTV9JMzg2X1RIRVJNX1RIUk9UX0hfXyAxCisKKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKK2V4dGVybiBhdG9taWNfdCB0aGVybV90aHJvdF9lbjsKK2ludCB0aGVybV90aHJvdF9wcm9jZXNzKGludCBjdXJyKTsKKworI2VuZGlmIC8qIF9fQVNNX0kzODZfVEhFUk1fVEhST1RfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3RsYmZsdXNoLmggYi9pbmNsdWRlL2FzbS1pMzg2L3RsYmZsdXNoLmgKaW5kZXggZDU3Y2E1Yy4uMzYwNjQ4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni90bGJmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvdGxiZmx1c2guaApAQCAtMzYsOCArMzYsNiBAQAogCQkJOiAibWVtb3J5Iik7CQkJCQlcCiAJfSB3aGlsZSAoMCkKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGdrZXJuX21hc2s7Ci0KICMgZGVmaW5lIF9fZmx1c2hfdGxiX2FsbCgpCQkJCQkJXAogCWRvIHsJCQkJCQkJCVwKIAkJaWYgKGNwdV9oYXNfcGdlKQkJCQkJXApAQCAtNDksNyArNDcsNyBAQAogI2RlZmluZSBjcHVfaGFzX2ludmxwZwkoYm9vdF9jcHVfZGF0YS54ODYgPiAzKQogCiAjZGVmaW5lIF9fZmx1c2hfdGxiX3NpbmdsZShhZGRyKSBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oImludmxwZyAlMCI6IDoibSIgKCooY2hhciAqKSBhZGRyKSkKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW52bHBnICglMCkiIDo6InIiIChhZGRyKSA6ICJtZW1vcnkiKQogCiAjaWZkZWYgQ09ORklHX1g4Nl9JTlZMUEcKICMgZGVmaW5lIF9fZmx1c2hfdGxiX29uZShhZGRyKSBfX2ZsdXNoX3RsYl9zaW5nbGUoYWRkcikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdHNjLmggYi9pbmNsdWRlL2FzbS1pMzg2L3RzYy5oCmluZGV4IDk3YjgyOGMuLmMxMzkzMzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdHNjLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni90c2MuaApAQCAtNiw3ICs2LDYgQEAKICNpZm5kZWYgX0FTTV9pMzg2X1RTQ19ICiAjZGVmaW5lIF9BU01faTM4Nl9UU0NfSAogCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLWkzODYvdW5pc3RkLmgKaW5kZXggZmMxYzhkZC4uYmQ5OTg3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3VuaXN0ZC5oCkBAIC0zMjMsMTggKzMyMywyMCBAQAogI2RlZmluZSBfX05SX3RlZQkJMzE1CiAjZGVmaW5lIF9fTlJfdm1zcGxpY2UJCTMxNgogI2RlZmluZSBfX05SX21vdmVfcGFnZXMJCTMxNworI2RlZmluZSBfX05SX2dldGNwdQkJMzE4CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMgMzE4CisjZGVmaW5lIE5SX3N5c2NhbGxzIDMxOQorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAvKgotICogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC0xMjg6IHNlZQorICogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC1NQVhfRVJSTk86IHNlZQogICogPGFzbS1pMzg2L2Vycm5vLmg+CiAgKi8KICNkZWZpbmUgX19zeXNjYWxsX3JldHVybih0eXBlLCByZXMpIFwKIGRvIHsgXAotCWlmICgodW5zaWduZWQgbG9uZykocmVzKSA+PSAodW5zaWduZWQgbG9uZykoLSgxMjggKyAxKSkpIHsgXAorCWlmICgodW5zaWduZWQgbG9uZykocmVzKSA+PSAodW5zaWduZWQgbG9uZykoLU1BWF9FUlJOTykpIHsgXAogCQllcnJubyA9IC0ocmVzKTsgXAogCQlyZXMgPSAtMTsgXAogCX0gXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni91bndpbmQuaCBiL2luY2x1ZGUvYXNtLWkzODYvdW53aW5kLmgKaW5kZXggNGMxYTBiOS4uNTAzMWQ2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni91bndpbmQuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3Vud2luZC5oCkBAIC0xOCw2ICsxOCw3IEBACiB7CiAJc3RydWN0IHB0X3JlZ3MgcmVnczsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJdW5zaWduZWQgY2FsbF9mcmFtZToxOwogfTsKIAogI2RlZmluZSBVTldfUEMoZnJhbWUpICAgICAgICAoZnJhbWUpLT5yZWdzLmVpcApAQCAtMjgsNiArMjksOCBAQAogI2RlZmluZSBGUkFNRV9MSU5LX09GRlNFVCAgICAwCiAjZGVmaW5lIFNUQUNLX0JPVFRPTSh0c2spICAgIFNUQUNLX0xJTUlUKCh0c2spLT50aHJlYWQuZXNwMCkKICNkZWZpbmUgU1RBQ0tfVE9QKHRzaykgICAgICAgKCh0c2spLT50aHJlYWQuZXNwMCkKKyNlbHNlCisjZGVmaW5lIFVOV19GUChmcmFtZSkgKCh2b2lkKShmcmFtZSksIDApCiAjZW5kaWYKICNkZWZpbmUgU1RBQ0tfTElNSVQocHRyKSAgICAgKCgocHRyKSAtIDEpICYgfihUSFJFQURfU0laRSAtIDEpKQogCkBAIC00Miw2ICs0NSwxMCBAQAogCVBUUkVHU19JTkZPKGVkaSksIFwKIAlQVFJFR1NfSU5GTyhlaXApCiAKKyNkZWZpbmUgVU5XX0RFRkFVTFRfUkEocmFJdGVtLCBkYXRhQWxpZ24pIFwKKwkoKHJhSXRlbSkud2hlcmUgPT0gTWVtb3J5ICYmIFwKKwkgISgocmFJdGVtKS52YWx1ZSAqIChkYXRhQWxpZ24pICsgNCkpCisKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3Vud19pbml0X2ZyYW1lX2luZm8oc3RydWN0IHVud2luZF9mcmFtZV9pbmZvICppbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbnN0Ki8gc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC04OCw2ICs5NSw3IEBACiAKICNkZWZpbmUgVU5XX1BDKGZyYW1lKSAoKHZvaWQpKGZyYW1lKSwgMCkKICNkZWZpbmUgVU5XX1NQKGZyYW1lKSAoKHZvaWQpKGZyYW1lKSwgMCkKKyNkZWZpbmUgVU5XX0ZQKGZyYW1lKSAoKHZvaWQpKGZyYW1lKSwgMCkKIAogc3RhdGljIGlubGluZSBpbnQgYXJjaF91bndfdXNlcl9tb2RlKGNvbnN0IHZvaWQgKmluZm8pCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2VzaS5oIGIvaW5jbHVkZS9hc20taWE2NC9lc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGFhYzBlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20taWE2NC9lc2kuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogRVNJIHNlcnZpY2UgY2FsbHMuCisgKgorICogQ29weXJpZ2h0IChjKSBDb3B5cmlnaHQgMjAwNS0yMDA2IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKiAJQWxleCBXaWxsaWFtc29uIDxhbGV4LndpbGxpYW1zb25AaHAuY29tPgorICovCisjaWZuZGVmIGVzaV9oCisjZGVmaW5lIGVzaV9oCisKKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKworI2RlZmluZSBFU0lfUVVFUlkJCQkweDAwMDAwMDAxCisjZGVmaW5lIEVTSV9PUEVOX0hBTkRMRQkJCTB4MDIwMDAwMDAKKyNkZWZpbmUgRVNJX0NMT1NFX0hBTkRMRQkJMHgwMjAwMDAwMQorCitlbnVtIGVzaV9wcm9jX3R5cGUgeworCUVTSV9QUk9DX1NFUklBTElaRUQsCS8qIGNhbGxzIG5lZWQgdG8gYmUgc2VyaWFsaXplZCAqLworCUVTSV9QUk9DX01QX1NBRkUsCS8qIE1QLXNhZmUsIGJ1dCBub3QgcmVlbnRyYW50ICovCisJRVNJX1BST0NfUkVFTlRSQU5UCS8qIE1QLXNhZmUgYW5kIHJlZW50cmFudCAqLworfTsKKworZXh0ZXJuIGludCBpYTY0X2VzaV9pbml0ICh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgaWE2NF9zYWxfcmV0dmFsIGVzaV9jYWxsX3BoeXMgKHZvaWQgKiwgdTY0ICopOworZXh0ZXJuIGludCBpYTY0X2VzaV9jYWxsKGVmaV9ndWlkX3QsIHN0cnVjdCBpYTY0X3NhbF9yZXR2YWwgKiwKKwkJCSBlbnVtIGVzaV9wcm9jX3R5cGUsCisJCQkgdTY0LCB1NjQsIHU2NCwgdTY0LCB1NjQsIHU2NCwgdTY0LCB1NjQpOworZXh0ZXJuIGludCBpYTY0X2VzaV9jYWxsX3BoeXMoZWZpX2d1aWRfdCwgc3RydWN0IGlhNjRfc2FsX3JldHZhbCAqLCB1NjQsIHU2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU2NCwgdTY0LCB1NjQsIHU2NCwgdTY0LCB1NjQpOworCisjZW5kaWYgLyogZXNpX2ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvZnV0ZXguaCBiL2luY2x1ZGUvYXNtLWlhNjQvZnV0ZXguaAppbmRleCA2YTMzMmE5Li4wN2Q3N2YzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9mdXRleC5oCkBAIC0xLDYgKzEsMTI0IEBACiAjaWZuZGVmIF9BU01fRlVURVhfSAogI2RlZmluZSBfQVNNX0ZVVEVYX0gKIAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2Z1dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotI2VuZGlmCisjZGVmaW5lIF9fZnV0ZXhfYXRvbWljX29wMShpbnNuLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKSBcCitkbyB7CQkJCQkJCQkJXAorCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjggX19hc20gKCJyOCIpID0gMDsJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAorCQkiCW1mOzsJCQkJCVxuIglcCisJCSJbMTpdICIJaW5zbiAiOzsJCQkJXG4iCVwKKwkJIgkueGRhdGE0IFwiX19leF90YWJsZVwiLCAxYi0uLCAyZi0uCVxuIglcCisJCSJbMjpdIgkJCQkJCQlcCisJCTogIityIiAocjgpLCAiPXIiIChvbGR2YWwpCQkJCVwKKwkJOiAiciIgKHVhZGRyKSwgInIiIChvcGFyZykJCQkJXAorCQk6ICJtZW1vcnkiKTsJCQkJCQlcCisJcmV0ID0gcjg7CQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgX19mdXRleF9hdG9taWNfb3AyKGluc24sIHJldCwgb2xkdmFsLCB1YWRkciwgb3BhcmcpIFwKK2RvIHsJCQkJCQkJCQlcCisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByOCBfX2FzbSAoInI4IikgPSAwOwkJCVwKKwlpbnQgdmFsLCBuZXd2YWw7CQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJCQkiCW1mOzsJCQkJICBcbiIJXAorCQkJIlsxOl0JbGQ0ICUzPVslNF07OwkJCSAgXG4iCVwKKwkJCSIJbW92ICUyPSUzCQkJICBcbiIJXAorCQkJCWluc24JIjs7CQkJICBcbiIJXAorCQkJIgltb3YgYXIuY2N2PSUyOzsJCQkgIFxuIglcCisJCQkiWzI6XQljbXB4Y2hnNC5hY3EgJTE9WyU0XSwlMyxhci5jY3Y7OyAgXG4iCVwKKwkJCSIJLnhkYXRhNCBcIl9fZXhfdGFibGVcIiwgMWItLiwgM2YtLlxuIglcCisJCQkiCS54ZGF0YTQgXCJfX2V4X3RhYmxlXCIsIDJiLS4sIDNmLS5cbiIJXAorCQkJIlszOl0iCQkJCQkJXAorCQkJOiAiK3IiIChyOCksICI9ciIgKHZhbCksICI9JnIiIChvbGR2YWwpLAlcCisJCQkgICAiPSZyIiAobmV3dmFsKQkJCQlcCisJCQk6ICJyIiAodWFkZHIpLCAiciIgKG9wYXJnKQkJCVwKKwkJCTogIm1lbW9yeSIpOwkJCQkJXAorCQlpZiAodW5saWtlbHkgKHI4KSkJCQkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwl9IHdoaWxlICh1bmxpa2VseSAodmFsICE9IG9sZHZhbCkpOwkJCQlcCisJcmV0ID0gcjg7CQkJCQkJCVwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50CitmdXRleF9hdG9taWNfb3BfaW51c2VyIChpbnQgZW5jb2RlZF9vcCwgaW50IF9fdXNlciAqdWFkZHIpCit7CisJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKKwlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CisJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CisJaW50IGNtcGFyZyA9IChlbmNvZGVkX29wIDw8IDIwKSA+PiAyMDsKKwlpbnQgb2xkdmFsID0gMCwgcmV0OworCWlmIChlbmNvZGVkX29wICYgKEZVVEVYX09QX09QQVJHX1NISUZUIDw8IDI4KSkKKwkJb3BhcmcgPSAxIDw8IG9wYXJnOworCisJaWYgKCEgYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIHVhZGRyLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaW5jX3ByZWVtcHRfY291bnQoKTsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIEZVVEVYX09QX1NFVDoKKwkJX19mdXRleF9hdG9taWNfb3AxKCJ4Y2hnNCAlMT1bJTJdLCUzIiwgcmV0LCBvbGR2YWwsIHVhZGRyLAorCQkJCSAgIG9wYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGVVRFWF9PUF9BREQ6CisJCV9fZnV0ZXhfYXRvbWljX29wMigiYWRkICUzPSUzLCU1IiwgcmV0LCBvbGR2YWwsIHVhZGRyLCBvcGFyZyk7CisJCWJyZWFrOworCWNhc2UgRlVURVhfT1BfT1I6CisJCV9fZnV0ZXhfYXRvbWljX29wMigib3IgJTM9JTMsJTUiLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGVVRFWF9PUF9BTkROOgorCQlfX2Z1dGV4X2F0b21pY19vcDIoImFuZCAlMz0lMywlNSIsIHJldCwgb2xkdmFsLCB1YWRkciwKKwkJCQkgICB+b3BhcmcpOworCQlicmVhazsKKwljYXNlIEZVVEVYX09QX1hPUjoKKwkJX19mdXRleF9hdG9taWNfb3AyKCJ4b3IgJTM9JTMsJTUiLCByZXQsIG9sZHZhbCwgdWFkZHIsIG9wYXJnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT1NZUzsKKwl9CisKKwlkZWNfcHJlZW1wdF9jb3VudCgpOworCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChjbXApIHsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfRVE6IHJldCA9IChvbGR2YWwgPT0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX05FOiByZXQgPSAob2xkdmFsICE9IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9MVDogcmV0ID0gKG9sZHZhbCA8IGNtcGFyZyk7IGJyZWFrOworCQljYXNlIEZVVEVYX09QX0NNUF9HRTogcmV0ID0gKG9sZHZhbCA+PSBjbXBhcmcpOyBicmVhazsKKwkJY2FzZSBGVVRFWF9PUF9DTVBfTEU6IHJldCA9IChvbGR2YWwgPD0gY21wYXJnKTsgYnJlYWs7CisJCWNhc2UgRlVURVhfT1BfQ01QX0dUOiByZXQgPSAob2xkdmFsID4gY21wYXJnKTsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IC1FTk9TWVM7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2Z1dGV4X2F0b21pY19jbXB4Y2hnX2luYXRvbWljKGludCBfX3VzZXIgKnVhZGRyLCBpbnQgb2xkdmFsLCBpbnQgbmV3dmFsKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl7CisJCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcjggX19hc20gKCJyOCIpOworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkJCSIJbWY7OwkJCQkJXG4iCisJCQkiCW1vdiBhci5jY3Y9JTM7OwkJCQlcbiIKKwkJCSJbMTpdCWNtcHhjaGc0LmFjcSAlMD1bJTFdLCUyLGFyLmNjdgkJXG4iCisJCQkiCS54ZGF0YTQgXCJfX2V4X3RhYmxlXCIsIDFiLS4sIDJmLS4JXG4iCisJCQkiWzI6XSIKKwkJCTogIj1yIiAocjgpCisJCQk6ICJyIiAodWFkZHIpLCAiciIgKG5ld3ZhbCksCisJCQkgICJyTyIgKChsb25nKSAodW5zaWduZWQpIG9sZHZhbCkKKwkJCTogIm1lbW9yeSIpOworCQlyZXR1cm4gcjg7CisJfQorfQorCisjZW5kaWYgLyogX0FTTV9GVVRFWF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2twcm9iZXMuaCBiL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oCmluZGV4IDkzODkwNDkuLjFiNDViNzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQva3Byb2Jlcy5oCkBAIC0yOSw3ICsyOSw4IEBACiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8YXNtL2JyZWFrLmg+CiAKLSNkZWZpbmUgTUFYX0lOU05fU0laRSAgIDE2CisjZGVmaW5lIF9fQVJDSF9XQU5UX0tQUk9CRVNfSU5TTl9TTE9UCisjZGVmaW5lIE1BWF9JTlNOX1NJWkUgICAxCiAjZGVmaW5lIEJSRUFLX0lOU1QJKGxvbmcpKF9fSUE2NF9CUkVBS19LUFJPQkUgPDwgNikKIAogdHlwZWRlZiB1bmlvbiBjbXBfaW5zdCB7CkBAIC05NCw3ICs5NSw3IEBACiAjZGVmaW5lIElQX1JFTEFUSVZFX1BSRURJQ1RfT1BDT0RFCSg3KQogI2RlZmluZSBMT05HX0JSQU5DSF9PUENPREUJCSgweEMpCiAjZGVmaW5lIExPTkdfQ0FMTF9PUENPREUJCSgweEQpCi0jZGVmaW5lIGFyY2hfcmVtb3ZlX2twcm9iZShwKQkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGZsdXNoX2luc25fc2xvdChwKQkJZG8geyB9IHdoaWxlICgwKQogCiB0eXBlZGVmIHN0cnVjdCBrcHJvYmVfb3Bjb2RlIHsKIAlidW5kbGVfdCBidW5kbGU7CkBAIC0xMDgsNyArMTA5LDcgQEAKIC8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb3B5IG9mIG9yaWdpbmFsIGluc3RydWN0aW9uKi8KIHN0cnVjdCBhcmNoX3NwZWNpZmljX2luc24gewogCS8qIGNvcHkgb2YgdGhlIGluc3RydWN0aW9uIHRvIGJlIGVtdWxhdGVkICovCi0Ja3Byb2JlX29wY29kZV90IGluc247CisJa3Byb2JlX29wY29kZV90ICppbnNuOwogICNkZWZpbmUgSU5TVF9GTEFHX0ZJWF9SRUxBVElWRV9JUF9BRERSCQkxCiAgI2RlZmluZSBJTlNUX0ZMQUdfRklYX0JSQU5DSF9SRUcJCTIKICAjZGVmaW5lIElOU1RfRkxBR19CUkVBS19JTlNUCQkJNApAQCAtMTI1LDYgKzEyNiw2IEBACiB9CiBleHRlcm4gdm9pZCBpbnZhbGlkYXRlX3N0YWNrZWRfcmVncyh2b2lkKTsKIGV4dGVybiB2b2lkIGZsdXNoX3JlZ2lzdGVyX3N0YWNrKHZvaWQpOwotZXh0ZXJuIHZvaWQgZmx1c2hfaW5zbl9zbG90KHN0cnVjdCBrcHJvYmUgKnApOworZXh0ZXJuIHZvaWQgYXJjaF9yZW1vdmVfa3Byb2JlKHN0cnVjdCBrcHJvYmUgKnApOwogCiAjZW5kaWYJCQkJLyogX0FTTV9LUFJPQkVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvbWNhX2FzbS5oIGIvaW5jbHVkZS9hc20taWE2NC9tY2FfYXNtLmgKaW5kZXggMjdjOTIwMy4uNzYyMDNmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9tY2FfYXNtLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9tY2FfYXNtLmgKQEAgLTE5Nyw5ICsxOTcsOSBAQAogCW1vdmwJdGVtcDIgPSBzdGFydF9hZGRyOwkJCQlcCiAJOzsJCQkJCQkJXAogCW1vdgljci5paXAgPSB0ZW1wMjsJCQkJCVwKKwltb3ZsCWdwID0gX19ncAkJCQkJXAogCTs7CQkJCQkJCVwKIAlEQVRBX1BBX1RPX1ZBKHNwLCB0ZW1wMSk7CQkJCVwKLQlEQVRBX1BBX1RPX1ZBKGdwLCB0ZW1wMik7CQkJCVwKIAlzcmx6Lmk7CQkJCQkJCVwKIAk7OwkJCQkJCQlcCiAJbm9wCTE7CQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9tZW1pbml0LmggYi9pbmNsdWRlL2FzbS1pYTY0L21lbWluaXQuaAppbmRleCA2YTMzYTA3Li5jM2IxZjg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L21lbWluaXQuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L21lbWluaXQuaApAQCAtNTUsNiArNTUsNyBAQAogICBleHRlcm4gdW5zaWduZWQgbG9uZyB2bWFsbG9jX2VuZDsKICAgZXh0ZXJuIHN0cnVjdCBwYWdlICp2bWVtX21hcDsKICAgZXh0ZXJuIGludCBmaW5kX2xhcmdlc3RfaG9sZSAodTY0IHN0YXJ0LCB1NjQgZW5kLCB2b2lkICphcmcpOworICBleHRlcm4gaW50IHJlZ2lzdGVyX2FjdGl2ZV9yYW5nZXMgKHU2NCBzdGFydCwgdTY0IGVuZCwgdm9pZCAqYXJnKTsKICAgZXh0ZXJuIGludCBjcmVhdGVfbWVtX21hcF9wYWdlX3RhYmxlICh1NjQgc3RhcnQsIHU2NCBlbmQsIHZvaWQgKmFyZyk7CiAgIGV4dGVybiBpbnQgdm1lbW1hcF9maW5kX25leHRfdmFsaWRfcGZuKGludCwgaW50KTsKICNlbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L21vZHVsZS5oIGIvaW5jbHVkZS9hc20taWE2NC9tb2R1bGUuaAppbmRleCA4NWM4MmJkLi5kMmRhNjFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvbW9kdWxlLmgKQEAgLTI4LDcgKzI4LDggQEAKICNkZWZpbmUgRWxmX0VoZHIJRWxmNjRfRWhkcgogCiAjZGVmaW5lIE1PRFVMRV9QUk9DX0ZBTUlMWQkiaWE2NCIKLSNkZWZpbmUgTU9EVUxFX0FSQ0hfVkVSTUFHSUMJTU9EVUxFX1BST0NfRkFNSUxZCisjZGVmaW5lIE1PRFVMRV9BUkNIX1ZFUk1BR0lDCU1PRFVMRV9QUk9DX0ZBTUlMWSBcCisJImdjYy0iIF9fc3RyaW5naWZ5KF9fR05VQ19fKSAiLiIgX19zdHJpbmdpZnkoX19HTlVDX01JTk9SX18pCiAKICNkZWZpbmUgQVJDSF9TSEZfU01BTEwJU0hGX0lBXzY0X1NIT1JUCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvbnVtYS5oIGIvaW5jbHVkZS9hc20taWE2NC9udW1hLmgKaW5kZXggZTBhMWQxNy4uN2Q1ZTJjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9udW1hLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9udW1hLmgKQEAgLTY5LDYgKzY5LDggQEAKIAogCiAjZWxzZSAvKiAhQ09ORklHX05VTUEgKi8KKyNkZWZpbmUgbWFwX2NwdV90b19ub2RlKGNwdSwgbmlkKQlkb3t9d2hpbGUoMCkKKyNkZWZpbmUgdW5tYXBfY3B1X2Zyb21fbm9kZShjcHUsIG5pZCkJZG97fXdoaWxlKDApCiAKICNkZWZpbmUgcGFkZHJfdG9fbmlkKGFkZHIpCTAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9wYWwuaCBiL2luY2x1ZGUvYXNtLWlhNjQvcGFsLmgKaW5kZXggMjBhOGQ2MS4uMmM4ZmQ5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9wYWwuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3BhbC5oCkBAIC03OCw2ICs3OCw3IEBACiAjZGVmaW5lIFBBTF9WTV9UUl9SRUFECQkyNjEJLyogcmVhZCBjb250ZW50cyBvZiB0cmFuc2xhdGlvbiByZWdpc3RlciAqLwogI2RlZmluZSBQQUxfR0VUX1BTVEFURQkJMjYyCS8qIGdldCB0aGUgY3VycmVudCBQLXN0YXRlICovCiAjZGVmaW5lIFBBTF9TRVRfUFNUQVRFCQkyNjMJLyogc2V0IHRoZSBQLXN0YXRlICovCisjZGVmaW5lIFBBTF9CUkFORF9JTkZPCQkyNzQJLyogUHJvY2Vzc29yIGJyYW5kaW5nIGluZm9ybWF0aW9uICovCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKQEAgLTk2Myw3ICs5NjQsOCBAQAogaWE2NF9wYWxfY2FjaGVfcmVhZCAocGFsX2NhY2hlX2xpbmVfaWRfdV90IGxpbmVfaWQsIHU2NCBwaHlzaWNhbF9hZGRyKQogewogCXN0cnVjdCBpYTY0X3BhbF9yZXR2YWwgaXBydjsKLQlQQUxfQ0FMTChpcHJ2LCBQQUxfQ0FDSEVfUkVBRCwgbGluZV9pZC5wY2xpZF9kYXRhLCBwaHlzaWNhbF9hZGRyLCAwKTsKKwlQQUxfQ0FMTF9QSFlTX1NUSyhpcHJ2LCBQQUxfQ0FDSEVfUkVBRCwgbGluZV9pZC5wY2xpZF9kYXRhLAorCQkJCXBoeXNpY2FsX2FkZHIsIDApOwogCXJldHVybiBpcHJ2LnN0YXR1czsKIH0KIApAQCAtOTg1LDcgKzk4Nyw4IEBACiBpYTY0X3BhbF9jYWNoZV93cml0ZSAocGFsX2NhY2hlX2xpbmVfaWRfdV90IGxpbmVfaWQsIHU2NCBwaHlzaWNhbF9hZGRyLCB1NjQgZGF0YSkKIHsKIAlzdHJ1Y3QgaWE2NF9wYWxfcmV0dmFsIGlwcnY7Ci0JUEFMX0NBTEwoaXBydiwgUEFMX0NBQ0hFX1dSSVRFLCBsaW5lX2lkLnBjbGlkX2RhdGEsIHBoeXNpY2FsX2FkZHIsIGRhdGEpOworCVBBTF9DQUxMX1BIWVNfU1RLKGlwcnYsIFBBTF9DQUNIRV9XUklURSwgbGluZV9pZC5wY2xpZF9kYXRhLAorCQkJCXBoeXNpY2FsX2FkZHIsIGRhdGEpOwogCXJldHVybiBpcHJ2LnN0YXR1czsKIH0KIApAQCAtMTEzMyw2ICsxMTM2LDE1IEBACiAJcmV0dXJuIGlwcnYuc3RhdHVzOwogfQogCisvKiBQcm9jZXNzb3IgYnJhbmRpbmcgaW5mb3JtYXRpb24qLworc3RhdGljIGlubGluZSBzNjQKK2lhNjRfcGFsX2dldF9icmFuZF9pbmZvIChjaGFyICpicmFuZF9pbmZvKQoreworCXN0cnVjdCBpYTY0X3BhbF9yZXR2YWwgaXBydjsKKwlQQUxfQ0FMTF9TVEsoaXBydiwgUEFMX0JSQU5EX0lORk8sIDAsICh1NjQpYnJhbmRfaW5mbywgMCk7CisJcmV0dXJuIGlwcnYuc3RhdHVzOworfQorCiAvKiBDYXVzZSB0aGUgcHJvY2Vzc29yIHRvIGVudGVyIExJR0hUIEhBTFQgc3RhdGUsIHdoZXJlIHByZWZldGNoaW5nIGFuZCBleGVjdXRpb24gYXJlCiAgKiBzdXNwZW5kZWQsIGJ1dCBjYWNoZSBhbmQgVExCIGNvaGVyZW5jeSBpcyBtYWludGFpbmVkLgogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20taWE2NC9wcm9jZXNzb3IuaAppbmRleCAyNjVmNDgyLi41ODMwZDM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvcHJvY2Vzc29yLmgKQEAgLTIwLDEyICsyMCw2IEBACiAjaW5jbHVkZSA8YXNtL3VzdGFjay5oPgogCiAjZGVmaW5lIElBNjRfTlVNX0RCR19SRUdTCTgKLS8qCi0gKiBMaW1pdHMgZm9yIFBNQyBhbmQgUE1EIGFyZSBzZXQgdG8gbGVzcyB0aGFuIG1heGltdW0gYXJjaGl0ZWN0ZWQgdmFsdWVzCi0gKiBidXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgZm9yIGEgd2hpbGUKLSAqLwotI2RlZmluZSBJQTY0X05VTV9QTUNfUkVHUwk2NAotI2RlZmluZSBJQTY0X05VTV9QTURfUkVHUwk2NAogCiAjZGVmaW5lIERFRkFVTFRfTUFQX0JBU0UJX19JQTY0X1VMX0NPTlNUKDB4MjAwMDAwMDAwMDAwMDAwMCkKICNkZWZpbmUgREVGQVVMVF9UQVNLX1NJWkUJX19JQTY0X1VMX0NPTlNUKDB4YTAwMDAwMDAwMDAwMDAwMCkKQEAgLTE2Myw2ICsxNTcsNyBAQAogCV9fdTggZmFtaWx5OwogCV9fdTggYXJjaHJldjsKIAljaGFyIHZlbmRvclsxNl07CisJY2hhciAqbW9kZWxfbmFtZTsKIAogI2lmZGVmIENPTkZJR19OVU1BCiAJc3RydWN0IGlhNjRfbm9kZV9kYXRhICpub2RlX2RhdGE7CkBAIC0yNjIsMTMgKzI1Nyw5IEBACiAjIGRlZmluZSBJTklUX1RIUkVBRF9JQTMyCiAjZW5kaWYgLyogQ09ORklHX0lBMzJfU1VQUE9SVCAqLwogI2lmZGVmIENPTkZJR19QRVJGTU9OCi0JX191NjQgcG1jc1tJQTY0X05VTV9QTUNfUkVHU107Ci0JX191NjQgcG1kc1tJQTY0X05VTV9QTURfUkVHU107CiAJdm9pZCAqcGZtX2NvbnRleHQ7CQkgICAgIC8qIHBvaW50ZXIgdG8gZGV0YWlsZWQgUE1VIGNvbnRleHQgKi8KIAl1bnNpZ25lZCBsb25nIHBmbV9uZWVkc19jaGVja2luZzsgICAgLyogd2hlbiA+MCwgcGVuZGluZyBwZXJmbW9uIHdvcmsgb24ga2VybmVsIGV4aXQgKi8KLSMgZGVmaW5lIElOSVRfVEhSRUFEX1BNCQkucG1jcyA9CQkJezBVTCwgfSwgIFwKLQkJCQkucG1kcyA9CQkJezBVTCwgfSwgIFwKLQkJCQkucGZtX2NvbnRleHQgPQkJTlVMTCwgICAgIFwKKyMgZGVmaW5lIElOSVRfVEhSRUFEX1BNCQkucGZtX2NvbnRleHQgPQkJTlVMTCwgICAgIFwKIAkJCQkucGZtX25lZWRzX2NoZWNraW5nID0JMFVMLAogI2Vsc2UKICMgZGVmaW5lIElOSVRfVEhSRUFEX1BNCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NtcC5oIGIvaW5jbHVkZS9hc20taWE2NC9zbXAuaAppbmRleCA3NGJkZTFjLi42MGZkNGFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NtcC5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc21wLmgKQEAgLTEyNiw2ICsxMjYsNyBAQAogZXh0ZXJuIHZvaWQgbG9ja19pcGlfY2FsbGxvY2sodm9pZCk7CiBleHRlcm4gdm9pZCB1bmxvY2tfaXBpX2NhbGxsb2NrKHZvaWQpOwogZXh0ZXJuIHZvaWQgaWRlbnRpZnlfc2libGluZ3MgKHN0cnVjdCBjcHVpbmZvX2lhNjQgKik7CitleHRlcm4gaW50IGlzX211bHRpdGhyZWFkaW5nX2VuYWJsZWQodm9pZCk7CiAKICNlbHNlCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1pYTY0L3VuaXN0ZC5oCmluZGV4IGY1ODE2NjIuLmJiMGViNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC91bmlzdGQuaApAQCAtMjg2LDcgKzI4Niw4IEBACiAvKiAxMjk0LCAxMjk1IHJlc2VydmVkIGZvciBwc2VsZWN0L3Bwb2xsICovCiAjZGVmaW5lIF9fTlJfdW5zaGFyZQkJCTEyOTYKICNkZWZpbmUgX19OUl9zcGxpY2UJCQkxMjk3Ci0vKiAxMjk4LCAxMjk5IHJlc2VydmVkIGZvciBzZXRfcm9idXN0X2xpc3QvZ2V0X3JvYnVzdF9saXN0ICovCisjZGVmaW5lIF9fTlJfc2V0X3JvYnVzdF9saXN0CQkxMjk4CisjZGVmaW5lIF9fTlJfZ2V0X3JvYnVzdF9saXN0CQkxMjk5CiAjZGVmaW5lIF9fTlJfc3luY19maWxlX3JhbmdlCQkxMzAwCiAjZGVmaW5lIF9fTlJfdGVlCQkJMTMwMQogI2RlZmluZSBfX05SX3Ztc3BsaWNlCQkJMTMwMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTMyci9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20tbTMyci9zcGlubG9jay5oCmluZGV4IGY5NGMxYTYuLmY5ZjkwNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvc3BpbmxvY2suaAorKysgYi9pbmNsdWRlL2FzbS1tMzJyL3NwaW5sb2NrLmgKQEAgLTI5OCw3ICsyOTgsMTQgQEAKIAkpOwogfQogCi0jZGVmaW5lIF9fcmF3X3JlYWRfdHJ5bG9jayhsb2NrKSBnZW5lcmljX19yYXdfcmVhZF90cnlsb2NrKGxvY2spCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19yZWFkX3RyeWxvY2socmF3X3J3bG9ja190ICpsb2NrKQoreworCWF0b21pY190ICpjb3VudCA9IChhdG9taWNfdCopbG9jazsKKwlpZiAoYXRvbWljX2RlY19yZXR1cm4oY291bnQpID49IDApCisJCXJldHVybiAxOworCWF0b21pY19pbmMoY291bnQpOworCXJldHVybiAwOworfQogCiBzdGF0aWMgaW5saW5lIGludCBfX3Jhd193cml0ZV90cnlsb2NrKHJhd19yd2xvY2tfdCAqbG9jaykKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS1tMzJyL3N5c3RlbS5oCmluZGV4IDllNjE4YWYuLjRjZTA2MTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci9zeXN0ZW0uaApAQCAtMzI4LDE1ICszMjgsMTUgQEAKICNkZWZpbmUgc21wX3JtYigpCXJtYigpCiAjZGVmaW5lIHNtcF93bWIoKQl3bWIoKQogI2RlZmluZSBzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlyZWFkX2JhcnJpZXJfZGVwZW5kcygpCisjZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBkbyB7ICh2b2lkKSB4Y2hnKCZ2YXIsIHZhbHVlKTsgfSB3aGlsZSAoMCkKICNlbHNlCiAjZGVmaW5lIHNtcF9tYigpCWJhcnJpZXIoKQogI2RlZmluZSBzbXBfcm1iKCkJYmFycmllcigpCiAjZGVmaW5lIHNtcF93bWIoKQliYXJyaWVyKCkKICNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBzZXRfbWIodmFyLCB2YWx1ZSkgZG8geyB2YXIgPSB2YWx1ZTsgYmFycmllcigpOyB9IHdoaWxlICgwKQogI2VuZGlmCiAKLSNkZWZpbmUgc2V0X21iKHZhciwgdmFsdWUpIGRvIHsgeGNoZygmdmFyLCB2YWx1ZSk7IH0gd2hpbGUgKDApCi0KICNkZWZpbmUgYXJjaF9hbGlnbl9zdGFjayh4KSAoeCkKIAogI2VuZGlmICAvKiBfQVNNX00zMlJfU1lTVEVNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1tMzJyL3VuaXN0ZC5oCmluZGV4IDg5ZjM3NmUuLjVjNmE5YWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci91bmlzdGQuaApAQCAtMjk2LDggKzI5Niw5IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjZGVmaW5lIE5SX3N5c2NhbGxzIDI4NQorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCi0vKiB1c2VyLXZpc2libGUgZXJyb3IgbnVtYmVycyBhcmUgaW4gdGhlIHJhbmdlIC0xIC0gLTEyNDogc2VlCisvKiB1c2VyLXZpc2libGUgZXJyb3IgbnVtYmVycyBhcmUgaW4gdGhlIHJhbmdlIC0xIC0gLU1BWF9FUlJOTzogc2VlCiAgKiA8YXNtLW0zMnIvZXJybm8uaD4KICAqLwogCkBAIC0zMDUsNyArMzA2LDcgQEAKIAogI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykgXAogZG8geyBcCi0JaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtKDEyNCArIDEpKSkgeyBcCisJaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtTUFYX0VSUk5PKSkgeyBcCiAJLyogQXZvaWQgdXNpbmcgInJlcyIgd2hpY2ggaXMgZGVjbGFyZWQgdG8gYmUgaW4gcmVnaXN0ZXIgcjA7IFwKIAkgICBlcnJubyBtaWdodCBleHBhbmQgdG8gYSBmdW5jdGlvbiBjYWxsIGFuZCBjbG9iYmVyIGl0LiAgKi8gXAogCQlpbnQgX19lcnIgPSAtKHJlcyk7IFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1tNjhrL3VuaXN0ZC5oCmluZGV4IDdjMGI2MjkuLjc1MTYzMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay91bmlzdGQuaApAQCAtMjg4LDEzICsyODgsMTQgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNkZWZpbmUgTlJfc3lzY2FsbHMJCTI4MgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCi0vKiB1c2VyLXZpc2libGUgZXJyb3IgbnVtYmVycyBhcmUgaW4gdGhlIHJhbmdlIC0xIC0gLTEyNDogc2VlCisvKiB1c2VyLXZpc2libGUgZXJyb3IgbnVtYmVycyBhcmUgaW4gdGhlIHJhbmdlIC0xIC0gLU1BWF9FUlJOTzogc2VlCiAgICA8YXNtLW02OGsvZXJybm8uaD4gKi8KIAogI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykgXAogZG8geyBcCi0JaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtMTI1KSkgeyBcCisJaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtTUFYX0VSUk5PKSkgeyBcCiAJLyogYXZvaWQgdXNpbmcgcmVzIHdoaWNoIGlzIGRlY2xhcmVkIHRvIGJlIGluIHJlZ2lzdGVyIGQwOyBcCiAJICAgZXJybm8gbWlnaHQgZXhwYW5kIHRvIGEgZnVuY3Rpb24gY2FsbCBhbmQgY2xvYmJlciBpdC4gICovIFwKIAkJaW50IF9fZXJyID0gLShyZXMpOyBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvdW5pc3RkLmgKaW5kZXggMWIyYWJkZi4uMjFmZGMzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGtub21tdS91bmlzdGQuaApAQCAtMjg5LDEzICsyODksMTQgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNkZWZpbmUgTlJfc3lzY2FsbHMJCTI4MgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCi0vKiB1c2VyLXZpc2libGUgZXJyb3IgbnVtYmVycyBhcmUgaW4gdGhlIHJhbmdlIC0xIC0gLTEyMjogc2VlCisvKiB1c2VyLXZpc2libGUgZXJyb3IgbnVtYmVycyBhcmUgaW4gdGhlIHJhbmdlIC0xIC0gLU1BWF9FUlJOTzogc2VlCiAgICA8YXNtLW02OGsvZXJybm8uaD4gKi8KIAogI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykgXAogZG8geyBcCi0JaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtMTI1KSkgeyBcCisJaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtTUFYX0VSUk5PKSkgeyBcCiAJLyogYXZvaWQgdXNpbmcgcmVzIHdoaWNoIGlzIGRlY2xhcmVkIHRvIGJlIGluIHJlZ2lzdGVyIGQwOyBcCiAJICAgZXJybm8gbWlnaHQgZXhwYW5kIHRvIGEgZnVuY3Rpb24gY2FsbCBhbmQgY2xvYmJlciBpdC4gICovIFwKIAkJaW50IF9fZXJyID0gLShyZXMpOyBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL0tidWlsZCBiL2luY2x1ZGUvYXNtLW1pcHMvS2J1aWxkCmluZGV4IGM2OGUxNjguLjc4OTdmMDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvS2J1aWxkCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvS2J1aWxkCkBAIC0xICsxLDMgQEAKIGluY2x1ZGUgaW5jbHVkZS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCisKK2hlYWRlci15ICs9IGNhY2hlY3RsLmggc2dpZGVmcy5oIHN5c21pcHMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9ib290aW5mby5oIGIvaW5jbHVkZS9hc20tbWlwcy9ib290aW5mby5oCmluZGV4IDNiNzQ1ZTcuLjc4YzM1ZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvYm9vdGluZm8uaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2Jvb3RpbmZvLmgKQEAgLTExMiw4ICsxMTIsNyBAQAogICogVmFsaWQgbWFjaHR5cGUgZm9yIGdyb3VwIEdBTElMRU8KICAqLwogI2RlZmluZSBNQUNIX0dST1VQX0dBTElMRU8gICAgIDExCS8qIEdhbGlsZW8gRXZhbCBCb2FyZHMJCSovCi0jZGVmaW5lICBNQUNIX0VWOTYxMDAJCTAJLyogRVY5NjEwMCAqLwotI2RlZmluZSAgTUFDSF9FVjY0MTIwQQkJMQkvKiBFVjY0MTIwQSAqLworI2RlZmluZSAgTUFDSF9FVjY0MTIwQQkJMAkvKiBFVjY0MTIwQSAqLwogCiAvKgogICogVmFsaWQgbWFjaHR5cGUgZm9yIGdyb3VwIE1PTUVOQ08KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tbWlwcy9jYWNoZWZsdXNoLmgKaW5kZXggNDdiYzhmNi4uMzY0MTZmZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9jYWNoZWZsdXNoLmgKQEAgLTIxLDcgKzIxLDYgQEAKICAqICAtIGZsdXNoX2NhY2hlX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCkgZmx1c2hlcyBhIHJhbmdlIG9mIHBhZ2VzCiAgKiAgLSBmbHVzaF9pY2FjaGVfcmFuZ2Uoc3RhcnQsIGVuZCkgZmx1c2ggYSByYW5nZSBvZiBpbnN0cnVjdGlvbnMKICAqICAtIGZsdXNoX2RjYWNoZV9wYWdlKHBnKSBmbHVzaGVzKHdiYWNrJmludmFsaWRhdGVzKSBhIHBhZ2UgZm9yIGRjYWNoZQotICogIC0gZmx1c2hfaWNhY2hlX3BhZ2Uodm1hLCBwZykgZmx1c2hlcyhpbnZhbGlkYXRlcykgYSBwYWdlIGZvciBpY2FjaGUKICAqCiAgKiBNSVBTIHNwZWNpZmljIGZsdXNoIG9wZXJhdGlvbnM6CiAgKgpAQCAtMzksNyArMzgsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfZGNhY2hlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JaWYgKGNwdV9oYXNfZGNfYWxpYXNlcykKKwlpZiAoY3B1X2hhc19kY19hbGlhc2VzIHx8ICFjcHVfaGFzX2ljX2ZpbGxzX2ZfZGMpCiAJCV9fZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CiAKIH0KQEAgLTQ3LDggKzQ2LDEzIEBACiAjZGVmaW5lIGZsdXNoX2RjYWNoZV9tbWFwX2xvY2sobWFwcGluZykJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZmx1c2hfZGNhY2hlX21tYXBfdW5sb2NrKG1hcHBpbmcpCWRvIHsgfSB3aGlsZSAoMCkKIAotZXh0ZXJuIHZvaWQgKCpmbHVzaF9pY2FjaGVfcGFnZSkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCitleHRlcm4gdm9pZCAoKl9fZmx1c2hfaWNhY2hlX3BhZ2UpKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCXN0cnVjdCBwYWdlICpwYWdlKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9pY2FjaGVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwlzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKK30KKwogZXh0ZXJuIHZvaWQgKCpmbHVzaF9pY2FjaGVfcmFuZ2UpKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKICNkZWZpbmUgZmx1c2hfY2FjaGVfdm1hcChzdGFydCwgZW5kKQkJZmx1c2hfY2FjaGVfYWxsKCkKICNkZWZpbmUgZmx1c2hfY2FjaGVfdnVubWFwKHN0YXJ0LCBlbmQpCQlmbHVzaF9jYWNoZV9hbGwoKQpAQCAtNjAsNyArNjQsNyBAQAogCWlmIChjcHVfaGFzX2RjX2FsaWFzZXMpCiAJCWZsdXNoX2NhY2hlX3BhZ2Uodm1hLCB2YWRkciwgcGFnZV90b19wZm4ocGFnZSkpOwogCW1lbWNweShkc3QsIHNyYywgbGVuKTsKLQlmbHVzaF9pY2FjaGVfcGFnZSh2bWEsIHBhZ2UpOworCV9fZmx1c2hfaWNhY2hlX3BhZ2Uodm1hLCBwYWdlKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNvcHlfZnJvbV91c2VyX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL2ZjbnRsLmggYi9pbmNsdWRlL2FzbS1taXBzL2ZjbnRsLmgKaW5kZXggNzg3MjIwZS4uMDBhNTBlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9mY250bC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvZmNudGwuaApAQCAtMjUsOCArMjUsNiBAQAogCiAjZGVmaW5lIEZfU0VUT1dOCTI0CS8qICBmb3Igc29ja2V0cy4gKi8KICNkZWZpbmUgRl9HRVRPV04JMjMJLyogIGZvciBzb2NrZXRzLiAqLwotI2RlZmluZSBGX1NFVFNJRwkxMAkvKiAgZm9yIHNvY2tldHMuICovCi0jZGVmaW5lIEZfR0VUU0lHCTExCS8qICBmb3Igc29ja2V0cy4gKi8KIAogI2lmbmRlZiBfX21pcHM2NAogI2RlZmluZSBGX0dFVExLNjQJMzMJLyogIHVzaW5nICdzdHJ1Y3QgZmxvY2s2NCcgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvZ2FsaWxlby1ib2FyZHMvZ3Q5NjEwMC5oIGIvaW5jbHVkZS9hc20tbWlwcy9nYWxpbGVvLWJvYXJkcy9ndDk2MTAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYmQxYjYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9nYWxpbGVvLWJvYXJkcy9ndDk2MTAwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDAwIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgotICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCi0gKiAgICAgICAgIAlzdGV2ZWxAbXZpc3RhLmNvbSBvciBzb3VyY2VAbXZpc3RhLmNvbQotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChWZXJzaW9uIDIpIGFzCi0gKiAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqICBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIFJlZ2lzdGVyIG9mZnNldHMgb2YgdGhlIE1JUFMgR1Q5NjEwMCBBZHZhbmNlZCBDb21tdW5pY2F0aW9uIENvbnRyb2xsZXIuCi0gKi8KLSNpZm5kZWYgX0dUOTYxMDBfSAotI2RlZmluZSBfR1Q5NjEwMF9ICi0KLS8qCi0gKiBHYWxpbGVvIEdUOTYxMDAgaW50ZXJuYWwgcmVnaXN0ZXIgYmFzZS4KLSAqLwotI2RlZmluZSBNSVBTX0dUOTYxMDBfQkFTRSAoS1NFRzFBRERSKDB4MTQwMDAwMDApKQotCi0jZGVmaW5lIEdUOTYxMDBfV1JJVEUob2ZzLCBkYXRhKSBcCi0gICAgKih2b2xhdGlsZSB1MzIgKikoTUlQU19HVDk2MTAwX0JBU0Urb2ZzKSA9IGNwdV90b19sZTMyKGRhdGEpCi0jZGVmaW5lIEdUOTYxMDBfUkVBRChvZnMpIFwKLSAgICBsZTMyX3RvX2NwdSgqKHZvbGF0aWxlIHUzMiAqKShNSVBTX0dUOTYxMDBfQkFTRStvZnMpKQotCi0jZGVmaW5lIEdUOTYxMDBfRVRIX0lPX1NJWkUgMHg0MDAwCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBSZWdpc3RlciBvZmZzZXQgYWRkcmVzc2VzIGZvbGxvdwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ1BVIEludGVyZmFjZSBDb250cm9sIFJlZ2lzdGVycyAqLwotI2RlZmluZSBHVDk2MTAwX0NQVV9JTlRFUkZfQ09ORklHIDB4MDAwMDAwCi0KLS8qIEV0aGVybmV0IFBvcnRzICovCi0jZGVmaW5lIEdUOTYxMDBfRVRIX1BIWV9BRERSX1JFRyAgICAgICAgICAgICAweDA4MDgwMAotI2RlZmluZSBHVDk2MTAwX0VUSF9TTUlfUkVHICAgICAgICAgICAgICAgICAgMHgwODA4MTAKLS8qCi0gIFRoZXNlIGFyZSBvZmZzZXRzIHRvIHBvcnQgMCByZWdpc3RlcnMuIEFkZCBHVDk2MTAwX0VUSF9JT19TSVpFIHRvCi0gIGdldCBvZmZzZXRzIHRvIHBvcnQgMSByZWdpc3RlcnMuCi0qLwotI2RlZmluZSBHVDk2MTAwX0VUSF9QT1JUX0NPTkZJRyAgICAgICAgICAweDA4NDgwMAotI2RlZmluZSBHVDk2MTAwX0VUSF9QT1JUX0NPTkZJR19FWFQgICAgICAweDA4NDgwOAotI2RlZmluZSBHVDk2MTAwX0VUSF9QT1JUX0NPTU0gICAgICAgICAgICAweDA4NDgxMAotI2RlZmluZSBHVDk2MTAwX0VUSF9QT1JUX1NUQVRVUyAgICAgICAgICAweDA4NDgxOAotI2RlZmluZSBHVDk2MTAwX0VUSF9TRVJfUEFSQU0gICAgICAgICAgICAweDA4NDgyMAotI2RlZmluZSBHVDk2MTAwX0VUSF9IQVNIX1RCTF9QVFIgICAgICAgICAweDA4NDgyOAotI2RlZmluZSBHVDk2MTAwX0VUSF9GTE9XX0NOVFJMX1NSQ19BRERSX0wgICAgMHgwODQ4MzAKLSNkZWZpbmUgR1Q5NjEwMF9FVEhfRkxPV19DTlRSTF9TUkNfQUREUl9IICAgIDB4MDg0ODM4Ci0jZGVmaW5lIEdUOTYxMDBfRVRIX1NETUFfQ09ORklHICAgICAgICAgIDB4MDg0ODQwCi0jZGVmaW5lIEdUOTYxMDBfRVRIX1NETUFfQ09NTSAgICAgICAgICAgIDB4MDg0ODQ4Ci0jZGVmaW5lIEdUOTYxMDBfRVRIX0lOVF9DQVVTRSAgICAgICAgICAgIDB4MDg0ODUwCi0jZGVmaW5lIEdUOTYxMDBfRVRIX0lOVF9NQVNLICAgICAgICAgICAgIDB4MDg0ODU4Ci0jZGVmaW5lIEdUOTYxMDBfRVRIXzFTVF9SWF9ERVNDX1BUUjAgICAgICAgICAweDA4NDg4MAotI2RlZmluZSBHVDk2MTAwX0VUSF8xU1RfUlhfREVTQ19QVFIxICAgICAgICAgMHgwODQ4ODQKLSNkZWZpbmUgR1Q5NjEwMF9FVEhfMVNUX1JYX0RFU0NfUFRSMiAgICAgICAgIDB4MDg0ODg4Ci0jZGVmaW5lIEdUOTYxMDBfRVRIXzFTVF9SWF9ERVNDX1BUUjMgICAgICAgICAweDA4NDg4QwotI2RlZmluZSBHVDk2MTAwX0VUSF9DVVJSX1JYX0RFU0NfUFRSMCAgICAgICAgMHgwODQ4QTAKLSNkZWZpbmUgR1Q5NjEwMF9FVEhfQ1VSUl9SWF9ERVNDX1BUUjEgICAgICAgIDB4MDg0OEE0Ci0jZGVmaW5lIEdUOTYxMDBfRVRIX0NVUlJfUlhfREVTQ19QVFIyICAgICAgICAweDA4NDhBOAotI2RlZmluZSBHVDk2MTAwX0VUSF9DVVJSX1JYX0RFU0NfUFRSMyAgICAgICAgMHgwODQ4QUMKLSNkZWZpbmUgR1Q5NjEwMF9FVEhfQ1VSUl9UWF9ERVNDX1BUUjAgICAgICAgIDB4MDg0OEUwCi0jZGVmaW5lIEdUOTYxMDBfRVRIX0NVUlJfVFhfREVTQ19QVFIxICAgICAgICAweDA4NDhFNAotI2RlZmluZSBHVDk2MTAwX0VUSF9NSUJfQ09VTlRfQkFTRSAgICAgICAgICAgMHgwODU4MDAKLQotLyogU0RNQXMgKi8KLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0dST1VQX0NPTkZJRyAgICAgICAgICAgMHgxMDFBRjAKLS8qIFNETUEgR3JvdXAgMCAqLwotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjBfQ09ORklHICAgICAgICAweDAwMDkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjBfQ09NTSAgICAgICAgICAweDAwMDkwOAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjBfUlhfREVTQ19CQVNFICAgICAgMHgwMDg5MDAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU4wX0NVUlJfUlhfREVTQ19QVFIgIDB4MDA4OTEwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFOMF9UWF9ERVNDX0JBU0UgICAgICAweDAwQzkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjBfQ1VSUl9UWF9ERVNDX1BUUiAgMHgwMEM5MTAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU4wXzFTVF9UWF9ERVNDX1BUUiAgIDB4MDBDOTE0Ci0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFOMV9DT05GSUcgICAgICAgIDB4MDEwOTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFOMV9DT01NICAgICAgICAgIDB4MDEwOTA4Ci0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFOMV9SWF9ERVNDX0JBU0UgICAgICAweDAxODkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjFfQ1VSUl9SWF9ERVNDX1BUUiAgMHgwMTg5MTAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU4xX1RYX0RFU0NfQkFTRSAgICAgIDB4MDFDOTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFOMV9DVVJSX1RYX0RFU0NfUFRSICAweDAxQzkxMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjFfMVNUX1RYX0RFU0NfUFRSICAgMHgwMUM5MTQKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU4yX0NPTkZJRyAgICAgICAgMHgwMjA5MDAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU4yX0NPTU0gICAgICAgICAgMHgwMjA5MDgKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU4yX1JYX0RFU0NfQkFTRSAgICAgIDB4MDI4OTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFOMl9DVVJSX1JYX0RFU0NfUFRSICAweDAyODkxMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjJfVFhfREVTQ19CQVNFICAgICAgMHgwMkM5MDAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU4yX0NVUlJfVFhfREVTQ19QVFIgIDB4MDJDOTEwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFOMl8xU1RfVFhfREVTQ19QVFIgICAweDAyQzkxNAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjNfQ09ORklHICAgICAgICAweDAzMDkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjNfQ09NTSAgICAgICAgICAweDAzMDkwOAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjNfUlhfREVTQ19CQVNFICAgICAgMHgwMzg5MDAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU4zX0NVUlJfUlhfREVTQ19QVFIgIDB4MDM4OTEwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFOM19UWF9ERVNDX0JBU0UgICAgICAweDAzQzkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjNfQ1VSUl9UWF9ERVNDX1BUUiAgMHgwM0M5MTAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU4zXzFTVF9UWF9ERVNDX1BUUiAgIDB4MDNDOTE0Ci0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFONF9DT05GSUcgICAgICAgIDB4MDQwOTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFONF9DT01NICAgICAgICAgIDB4MDQwOTA4Ci0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFONF9SWF9ERVNDX0JBU0UgICAgICAweDA0ODkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjRfQ1VSUl9SWF9ERVNDX1BUUiAgMHgwNDg5MTAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU40X1RYX0RFU0NfQkFTRSAgICAgIDB4MDRDOTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFONF9DVVJSX1RYX0RFU0NfUFRSICAweDA0QzkxMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjRfMVNUX1RYX0RFU0NfUFRSICAgMHgwNEM5MTQKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU41X0NPTkZJRyAgICAgICAgMHgwNTA5MDAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU41X0NPTU0gICAgICAgICAgMHgwNTA5MDgKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU41X1JYX0RFU0NfQkFTRSAgICAgIDB4MDU4OTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFONV9DVVJSX1JYX0RFU0NfUFRSICAweDA1ODkxMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjVfVFhfREVTQ19CQVNFICAgICAgMHgwNUM5MDAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU41X0NVUlJfVFhfREVTQ19QVFIgIDB4MDVDOTEwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFONV8xU1RfVFhfREVTQ19QVFIgICAweDA1QzkxNAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjZfQ09ORklHICAgICAgICAweDA2MDkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjZfQ09NTSAgICAgICAgICAweDA2MDkwOAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjZfUlhfREVTQ19CQVNFICAgICAgMHgwNjg5MDAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU42X0NVUlJfUlhfREVTQ19QVFIgIDB4MDY4OTEwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFONl9UWF9ERVNDX0JBU0UgICAgICAweDA2QzkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjZfQ1VSUl9UWF9ERVNDX1BUUiAgMHgwNkM5MTAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU42XzFTVF9UWF9ERVNDX1BUUiAgIDB4MDZDOTE0Ci0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFON19DT05GSUcgICAgICAgIDB4MDcwOTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFON19DT01NICAgICAgICAgIDB4MDcwOTA4Ci0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFON19SWF9ERVNDX0JBU0UgICAgICAweDA3ODkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjdfQ1VSUl9SWF9ERVNDX1BUUiAgMHgwNzg5MTAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cwX0NIQU43X1RYX0RFU0NfQkFTRSAgICAgIDB4MDdDOTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMF9DSEFON19DVVJSX1RYX0RFU0NfUFRSICAweDA3QzkxMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzBfQ0hBTjdfMVNUX1RYX0RFU0NfUFRSICAgMHgwN0M5MTQKLS8qIFNETUEgR3JvdXAgMSAqLwotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjBfQ09ORklHICAgICAgICAweDEwMDkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjBfQ09NTSAgICAgICAgICAweDEwMDkwOAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjBfUlhfREVTQ19CQVNFICAgICAgMHgxMDg5MDAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU4wX0NVUlJfUlhfREVTQ19QVFIgIDB4MTA4OTEwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFOMF9UWF9ERVNDX0JBU0UgICAgICAweDEwQzkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjBfQ1VSUl9UWF9ERVNDX1BUUiAgMHgxMEM5MTAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU4wXzFTVF9UWF9ERVNDX1BUUiAgIDB4MTBDOTE0Ci0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFOMV9DT05GSUcgICAgICAgIDB4MTEwOTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFOMV9DT01NICAgICAgICAgIDB4MTEwOTA4Ci0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFOMV9SWF9ERVNDX0JBU0UgICAgICAweDExODkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjFfQ1VSUl9SWF9ERVNDX1BUUiAgMHgxMTg5MTAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU4xX1RYX0RFU0NfQkFTRSAgICAgIDB4MTFDOTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFOMV9DVVJSX1RYX0RFU0NfUFRSICAweDExQzkxMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjFfMVNUX1RYX0RFU0NfUFRSICAgMHgxMUM5MTQKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU4yX0NPTkZJRyAgICAgICAgMHgxMjA5MDAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU4yX0NPTU0gICAgICAgICAgMHgxMjA5MDgKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU4yX1JYX0RFU0NfQkFTRSAgICAgIDB4MTI4OTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFOMl9DVVJSX1JYX0RFU0NfUFRSICAweDEyODkxMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjJfVFhfREVTQ19CQVNFICAgICAgMHgxMkM5MDAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU4yX0NVUlJfVFhfREVTQ19QVFIgIDB4MTJDOTEwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFOMl8xU1RfVFhfREVTQ19QVFIgICAweDEyQzkxNAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjNfQ09ORklHICAgICAgICAweDEzMDkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjNfQ09NTSAgICAgICAgICAweDEzMDkwOAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjNfUlhfREVTQ19CQVNFICAgICAgMHgxMzg5MDAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU4zX0NVUlJfUlhfREVTQ19QVFIgIDB4MTM4OTEwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFOM19UWF9ERVNDX0JBU0UgICAgICAweDEzQzkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjNfQ1VSUl9UWF9ERVNDX1BUUiAgMHgxM0M5MTAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU4zXzFTVF9UWF9ERVNDX1BUUiAgIDB4MTNDOTE0Ci0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFONF9DT05GSUcgICAgICAgIDB4MTQwOTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFONF9DT01NICAgICAgICAgIDB4MTQwOTA4Ci0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFONF9SWF9ERVNDX0JBU0UgICAgICAweDE0ODkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjRfQ1VSUl9SWF9ERVNDX1BUUiAgMHgxNDg5MTAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU40X1RYX0RFU0NfQkFTRSAgICAgIDB4MTRDOTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFONF9DVVJSX1RYX0RFU0NfUFRSICAweDE0QzkxMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjRfMVNUX1RYX0RFU0NfUFRSICAgMHgxNEM5MTQKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU41X0NPTkZJRyAgICAgICAgMHgxNTA5MDAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU41X0NPTU0gICAgICAgICAgMHgxNTA5MDgKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU41X1JYX0RFU0NfQkFTRSAgICAgIDB4MTU4OTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFONV9DVVJSX1JYX0RFU0NfUFRSICAweDE1ODkxMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjVfVFhfREVTQ19CQVNFICAgICAgMHgxNUM5MDAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU41X0NVUlJfVFhfREVTQ19QVFIgIDB4MTVDOTEwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFONV8xU1RfVFhfREVTQ19QVFIgICAweDE1QzkxNAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjZfQ09ORklHICAgICAgICAweDE2MDkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjZfQ09NTSAgICAgICAgICAweDE2MDkwOAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjZfUlhfREVTQ19CQVNFICAgICAgMHgxNjg5MDAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU42X0NVUlJfUlhfREVTQ19QVFIgIDB4MTY4OTEwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFONl9UWF9ERVNDX0JBU0UgICAgICAweDE2QzkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjZfQ1VSUl9UWF9ERVNDX1BUUiAgMHgxNkM5MTAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU42XzFTVF9UWF9ERVNDX1BUUiAgIDB4MTZDOTE0Ci0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFON19DT05GSUcgICAgICAgIDB4MTcwOTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFON19DT01NICAgICAgICAgIDB4MTcwOTA4Ci0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFON19SWF9ERVNDX0JBU0UgICAgICAweDE3ODkwMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjdfQ1VSUl9SWF9ERVNDX1BUUiAgMHgxNzg5MTAKLSNkZWZpbmUgR1Q5NjEwMF9TRE1BX0cxX0NIQU43X1RYX0RFU0NfQkFTRSAgICAgIDB4MTdDOTAwCi0jZGVmaW5lIEdUOTYxMDBfU0RNQV9HMV9DSEFON19DVVJSX1RYX0RFU0NfUFRSICAweDE3QzkxMAotI2RlZmluZSBHVDk2MTAwX1NETUFfRzFfQ0hBTjdfMVNUX1RYX0RFU0NfUFRSICAgMHgxN0M5MTQKLS8qICBNUFNDcyAgKi8KLSNkZWZpbmUgR1Q5NjEwMF9NUFNDMF9NQUlOX0NPTkZJR19MT1cgICAweDAwMEEwMAotI2RlZmluZSBHVDk2MTAwX01QU0MwX01BSU5fQ09ORklHX0hJR0ggIDB4MDAwQTA0Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQzBfUFJPVE9DT0xfQ09ORklHICAgMHgwMDBBMDgKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU4wX1JFRzEgICAgICAgICAweDAwMEEwQwotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjBfUkVHMiAgICAgICAgIDB4MDAwQTEwCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFOMF9SRUczICAgICAgICAgMHgwMDBBMTQKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU4wX1JFRzQgICAgICAgICAweDAwMEExOAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjBfUkVHNSAgICAgICAgIDB4MDAwQTFDCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFOMF9SRUc2ICAgICAgICAgMHgwMDBBMjAKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU4wX1JFRzcgICAgICAgICAweDAwMEEyNAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjBfUkVHOCAgICAgICAgIDB4MDAwQTI4Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFOMF9SRUc5ICAgICAgICAgMHgwMDBBMkMKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU4wX1JFRzEwICAgICAgICAweDAwMEEzMAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjBfUkVHMTEgICAgICAgIDB4MDAwQTM0Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQzFfTUFJTl9DT05GSUdfTE9XICAgMHgwMDhBMDAKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDMV9NQUlOX0NPTkZJR19ISUdIICAweDAwOEEwNAotI2RlZmluZSBHVDk2MTAwX01QU0MxX1BST1RPQ09MX0NPTkZJRyAgIDB4MDA4QTA4Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFOMV9SRUcxICAgICAgICAgMHgwMDhBMEMKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU4xX1JFRzIgICAgICAgICAweDAwOEExMAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjFfUkVHMyAgICAgICAgIDB4MDA4QTE0Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFOMV9SRUc0ICAgICAgICAgMHgwMDhBMTgKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU4xX1JFRzUgICAgICAgICAweDAwOEExQwotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjFfUkVHNiAgICAgICAgIDB4MDA4QTIwCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFOMV9SRUc3ICAgICAgICAgMHgwMDhBMjQKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU4xX1JFRzggICAgICAgICAweDAwOEEyOAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjFfUkVHOSAgICAgICAgIDB4MDA4QTJDCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFOMV9SRUcxMCAgICAgICAgMHgwMDhBMzAKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU4xX1JFRzExICAgICAgICAweDAwOEEzNAotI2RlZmluZSBHVDk2MTAwX01QU0MyX01BSU5fQ09ORklHX0xPVyAgIDB4MDEwQTAwCi0jZGVmaW5lIEdUOTYxMDBfTVBTQzJfTUFJTl9DT05GSUdfSElHSCAgMHgwMTBBMDQKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDMl9QUk9UT0NPTF9DT05GSUcgICAweDAxMEEwOAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjJfUkVHMSAgICAgICAgIDB4MDEwQTBDCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFOMl9SRUcyICAgICAgICAgMHgwMTBBMTAKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU4yX1JFRzMgICAgICAgICAweDAxMEExNAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjJfUkVHNCAgICAgICAgIDB4MDEwQTE4Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFOMl9SRUc1ICAgICAgICAgMHgwMTBBMUMKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU4yX1JFRzYgICAgICAgICAweDAxMEEyMAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjJfUkVHNyAgICAgICAgIDB4MDEwQTI0Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFOMl9SRUc4ICAgICAgICAgMHgwMTBBMjgKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU4yX1JFRzkgICAgICAgICAweDAxMEEyQwotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjJfUkVHMTAgICAgICAgIDB4MDEwQTMwCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFOMl9SRUcxMSAgICAgICAgMHgwMTBBMzQKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDM19NQUlOX0NPTkZJR19MT1cgICAweDAxOEEwMAotI2RlZmluZSBHVDk2MTAwX01QU0MzX01BSU5fQ09ORklHX0hJR0ggIDB4MDE4QTA0Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQzNfUFJPVE9DT0xfQ09ORklHICAgMHgwMThBMDgKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU4zX1JFRzEgICAgICAgICAweDAxOEEwQwotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjNfUkVHMiAgICAgICAgIDB4MDE4QTEwCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFOM19SRUczICAgICAgICAgMHgwMThBMTQKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU4zX1JFRzQgICAgICAgICAweDAxOEExOAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjNfUkVHNSAgICAgICAgIDB4MDE4QTFDCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFOM19SRUc2ICAgICAgICAgMHgwMThBMjAKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU4zX1JFRzcgICAgICAgICAweDAxOEEyNAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjNfUkVHOCAgICAgICAgIDB4MDE4QTI4Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFOM19SRUc5ICAgICAgICAgMHgwMThBMkMKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU4zX1JFRzEwICAgICAgICAweDAxOEEzMAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjNfUkVHMTEgICAgICAgIDB4MDE4QTM0Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQzRfTUFJTl9DT05GSUdfTE9XICAgMHgwMjBBMDAKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDNF9NQUlOX0NPTkZJR19ISUdIICAweDAyMEEwNAotI2RlZmluZSBHVDk2MTAwX01QU0M0X1BST1RPQ09MX0NPTkZJRyAgIDB4MDIwQTA4Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFONF9SRUcxICAgICAgICAgMHgwMjBBMEMKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU40X1JFRzIgICAgICAgICAweDAyMEExMAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjRfUkVHMyAgICAgICAgIDB4MDIwQTE0Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFONF9SRUc0ICAgICAgICAgMHgwMjBBMTgKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU40X1JFRzUgICAgICAgICAweDAyMEExQwotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjRfUkVHNiAgICAgICAgIDB4MDIwQTIwCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFONF9SRUc3ICAgICAgICAgMHgwMjBBMjQKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU40X1JFRzggICAgICAgICAweDAyMEEyOAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjRfUkVHOSAgICAgICAgIDB4MDIwQTJDCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFONF9SRUcxMCAgICAgICAgMHgwMjBBMzAKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU40X1JFRzExICAgICAgICAweDAyMEEzNAotI2RlZmluZSBHVDk2MTAwX01QU0M1X01BSU5fQ09ORklHX0xPVyAgIDB4MDI4QTAwCi0jZGVmaW5lIEdUOTYxMDBfTVBTQzVfTUFJTl9DT05GSUdfSElHSCAgMHgwMjhBMDQKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDNV9QUk9UT0NPTF9DT05GSUcgICAweDAyOEEwOAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjVfUkVHMSAgICAgICAgIDB4MDI4QTBDCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFONV9SRUcyICAgICAgICAgMHgwMjhBMTAKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU41X1JFRzMgICAgICAgICAweDAyOEExNAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjVfUkVHNCAgICAgICAgIDB4MDI4QTE4Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFONV9SRUc1ICAgICAgICAgMHgwMjhBMUMKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU41X1JFRzYgICAgICAgICAweDAyOEEyMAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjVfUkVHNyAgICAgICAgIDB4MDI4QTI0Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFONV9SRUc4ICAgICAgICAgMHgwMjhBMjgKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU41X1JFRzkgICAgICAgICAweDAyOEEyQwotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjVfUkVHMTAgICAgICAgIDB4MDI4QTMwCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFONV9SRUcxMSAgICAgICAgMHgwMjhBMzQKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDNl9NQUlOX0NPTkZJR19MT1cgICAweDAzMEEwMAotI2RlZmluZSBHVDk2MTAwX01QU0M2X01BSU5fQ09ORklHX0hJR0ggIDB4MDMwQTA0Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQzZfUFJPVE9DT0xfQ09ORklHICAgMHgwMzBBMDgKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU42X1JFRzEgICAgICAgICAweDAzMEEwQwotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjZfUkVHMiAgICAgICAgIDB4MDMwQTEwCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFONl9SRUczICAgICAgICAgMHgwMzBBMTQKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU42X1JFRzQgICAgICAgICAweDAzMEExOAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjZfUkVHNSAgICAgICAgIDB4MDMwQTFDCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFONl9SRUc2ICAgICAgICAgMHgwMzBBMjAKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU42X1JFRzcgICAgICAgICAweDAzMEEyNAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjZfUkVHOCAgICAgICAgIDB4MDMwQTI4Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFONl9SRUc5ICAgICAgICAgMHgwMzBBMkMKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU42X1JFRzEwICAgICAgICAweDAzMEEzMAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjZfUkVHMTEgICAgICAgIDB4MDMwQTM0Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQzdfTUFJTl9DT05GSUdfTE9XICAgMHgwMzhBMDAKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDN19NQUlOX0NPTkZJR19ISUdIICAweDAzOEEwNAotI2RlZmluZSBHVDk2MTAwX01QU0M3X1BST1RPQ09MX0NPTkZJRyAgIDB4MDM4QTA4Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFON19SRUcxICAgICAgICAgMHgwMzhBMEMKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU43X1JFRzIgICAgICAgICAweDAzOEExMAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjdfUkVHMyAgICAgICAgIDB4MDM4QTE0Ci0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFON19SRUc0ICAgICAgICAgMHgwMzhBMTgKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU43X1JFRzUgICAgICAgICAweDAzOEExQwotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjdfUkVHNiAgICAgICAgIDB4MDM4QTIwCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFON19SRUc3ICAgICAgICAgMHgwMzhBMjQKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU43X1JFRzggICAgICAgICAweDAzOEEyOAotI2RlZmluZSBHVDk2MTAwX01QU0NfQ0hBTjdfUkVHOSAgICAgICAgIDB4MDM4QTJDCi0jZGVmaW5lIEdUOTYxMDBfTVBTQ19DSEFON19SRUcxMCAgICAgICAgMHgwMzhBMzAKLSNkZWZpbmUgR1Q5NjEwMF9NUFNDX0NIQU43X1JFRzExICAgICAgICAweDAzOEEzNAotLyogIEZsZXhURE1zICAqLwotLyogVERQUjAgLSBUcmFuc21pdCBEdWFsIFBvcnQgUkFNLiBibG9jayBzaXplIDB4ZmYgKi8KLSNkZWZpbmUgR1Q5NjEwMF9GWFRETTBfVERQUjBfQkxLMF9CQVNFICAweDAwMEIwMAotI2RlZmluZSBHVDk2MTAwX0ZYVERNMF9URFBSMF9CTEsxX0JBU0UgIDB4MDAxQjAwCi0jZGVmaW5lIEdUOTYxMDBfRlhURE0wX1REUFIwX0JMSzJfQkFTRSAgMHgwMDJCMDAKLSNkZWZpbmUgR1Q5NjEwMF9GWFRETTBfVERQUjBfQkxLM19CQVNFICAweDAwM0IwMAotLyogUkRQUjAgLSBSZWNlaXZlIER1YWwgUG9ydCBSQU0uIGJsb2NrIHNpemUgMHhmZiAqLwotI2RlZmluZSBHVDk2MTAwX0ZYVERNMF9SRFBSMF9CTEswX0JBU0UgIDB4MDA0QjAwCi0jZGVmaW5lIEdUOTYxMDBfRlhURE0wX1JEUFIwX0JMSzFfQkFTRSAgMHgwMDVCMDAKLSNkZWZpbmUgR1Q5NjEwMF9GWFRETTBfUkRQUjBfQkxLMl9CQVNFICAweDAwNkIwMAotI2RlZmluZSBHVDk2MTAwX0ZYVERNMF9SRFBSMF9CTEszX0JBU0UgIDB4MDA3QjAwCi0jZGVmaW5lIEdUOTYxMDBfRlhURE0wX1RYX1JFQURfUFRSICAgICAgMHgwMDhCMDAKLSNkZWZpbmUgR1Q5NjEwMF9GWFRETTBfUlhfUkVBRF9QVFIgICAgICAweDAwOEIwNAotI2RlZmluZSBHVDk2MTAwX0ZYVERNMF9DT05GSUcgICAgICAgMHgwMDhCMDgKLSNkZWZpbmUgR1Q5NjEwMF9GWFRETTBfQVVYX0NIQU5BX1RYIDB4MDA4QjBDCi0jZGVmaW5lIEdUOTYxMDBfRlhURE0wX0FVWF9DSEFOQV9SWCAweDAwOEIxMAotI2RlZmluZSBHVDk2MTAwX0ZYVERNMF9BVVhfQ0hBTkJfVFggMHgwMDhCMTQKLSNkZWZpbmUgR1Q5NjEwMF9GWFRETTBfQVVYX0NIQU5CX1JYIDB4MDA4QjE4Ci0jZGVmaW5lIEdUOTYxMDBfRlhURE0xX1REUFIxX0JMSzBfQkFTRSAgMHgwMTBCMDAKLSNkZWZpbmUgR1Q5NjEwMF9GWFRETTFfVERQUjFfQkxLMV9CQVNFICAweDAxMUIwMAotI2RlZmluZSBHVDk2MTAwX0ZYVERNMV9URFBSMV9CTEsyX0JBU0UgIDB4MDEyQjAwCi0jZGVmaW5lIEdUOTYxMDBfRlhURE0xX1REUFIxX0JMSzNfQkFTRSAgMHgwMTNCMDAKLSNkZWZpbmUgR1Q5NjEwMF9GWFRETTFfUkRQUjFfQkxLMF9CQVNFICAweDAxNEIwMAotI2RlZmluZSBHVDk2MTAwX0ZYVERNMV9SRFBSMV9CTEsxX0JBU0UgIDB4MDE1QjAwCi0jZGVmaW5lIEdUOTYxMDBfRlhURE0xX1JEUFIxX0JMSzJfQkFTRSAgMHgwMTZCMDAKLSNkZWZpbmUgR1Q5NjEwMF9GWFRETTFfUkRQUjFfQkxLM19CQVNFICAweDAxN0IwMAotI2RlZmluZSBHVDk2MTAwX0ZYVERNMV9UWF9SRUFEX1BUUiAgICAgIDB4MDE4QjAwCi0jZGVmaW5lIEdUOTYxMDBfRlhURE0xX1JYX1JFQURfUFRSICAgICAgMHgwMThCMDQKLSNkZWZpbmUgR1Q5NjEwMF9GWFRETTFfQ09ORklHICAgICAgIDB4MDE4QjA4Ci0jZGVmaW5lIEdUOTYxMDBfRlhURE0xX0FVWF9DSEFOQV9UWCAweDAxOEIwQwotI2RlZmluZSBHVDk2MTAwX0ZYVERNMV9BVVhfQ0hBTkFfUlggMHgwMThCMTAKLSNkZWZpbmUgR1Q5NjEwMF9GTFRETTFfQVVYX0NIQU5CX1RYIDB4MDE4QjE0Ci0jZGVmaW5lIEdUOTYxMDBfRkxURE0xX0FVWF9DSEFOQl9SWCAweDAxOEIxOAotI2RlZmluZSBHVDk2MTAwX0ZMVERNMl9URFBSMl9CTEswX0JBU0UgIDB4MDIwQjAwCi0jZGVmaW5lIEdUOTYxMDBfRkxURE0yX1REUFIyX0JMSzFfQkFTRSAgMHgwMjFCMDAKLSNkZWZpbmUgR1Q5NjEwMF9GTFRETTJfVERQUjJfQkxLMl9CQVNFICAweDAyMkIwMAotI2RlZmluZSBHVDk2MTAwX0ZMVERNMl9URFBSMl9CTEszX0JBU0UgIDB4MDIzQjAwCi0jZGVmaW5lIEdUOTYxMDBfRkxURE0yX1JEUFIyX0JMSzBfQkFTRSAgMHgwMjRCMDAKLSNkZWZpbmUgR1Q5NjEwMF9GTFRETTJfUkRQUjJfQkxLMV9CQVNFICAweDAyNUIwMAotI2RlZmluZSBHVDk2MTAwX0ZMVERNMl9SRFBSMl9CTEsyX0JBU0UgIDB4MDI2QjAwCi0jZGVmaW5lIEdUOTYxMDBfRkxURE0yX1JEUFIyX0JMSzNfQkFTRSAgMHgwMjdCMDAKLSNkZWZpbmUgR1Q5NjEwMF9GTFRETTJfVFhfUkVBRF9QVFIgICAgICAweDAyOEIwMAotI2RlZmluZSBHVDk2MTAwX0ZMVERNMl9SWF9SRUFEX1BUUiAgICAgIDB4MDI4QjA0Ci0jZGVmaW5lIEdUOTYxMDBfRkxURE0yX0NPTkZJRyAgICAgICAweDAyOEIwOAotI2RlZmluZSBHVDk2MTAwX0ZMVERNMl9BVVhfQ0hBTkFfVFggMHgwMjhCMEMKLSNkZWZpbmUgR1Q5NjEwMF9GTFRETTJfQVVYX0NIQU5BX1JYIDB4MDI4QjEwCi0jZGVmaW5lIEdUOTYxMDBfRkxURE0yX0FVWF9DSEFOQl9UWCAweDAyOEIxNAotI2RlZmluZSBHVDk2MTAwX0ZMVERNMl9BVVhfQ0hBTkJfUlggMHgwMjhCMTgKLSNkZWZpbmUgR1Q5NjEwMF9GTFRETTNfVERQUjNfQkxLMF9CQVNFICAweDAzMEIwMAotI2RlZmluZSBHVDk2MTAwX0ZMVERNM19URFBSM19CTEsxX0JBU0UgIDB4MDMxQjAwCi0jZGVmaW5lIEdUOTYxMDBfRkxURE0zX1REUFIzX0JMSzJfQkFTRSAgMHgwMzJCMDAKLSNkZWZpbmUgR1Q5NjEwMF9GTFRETTNfVERQUjNfQkxLM19CQVNFICAweDAzM0IwMAotI2RlZmluZSBHVDk2MTAwX0ZYVERNM19SRFBSM19CTEswX0JBU0UgIDB4MDM0QjAwCi0jZGVmaW5lIEdUOTYxMDBfRlhURE0zX1JEUFIzX0JMSzFfQkFTRSAgMHgwMzVCMDAKLSNkZWZpbmUgR1Q5NjEwMF9GWFRETTNfUkRQUjNfQkxLMl9CQVNFICAweDAzNkIwMAotI2RlZmluZSBHVDk2MTAwX0ZYVERNM19SRFBSM19CTEszX0JBU0UgIDB4MDM3QjAwCi0jZGVmaW5lIEdUOTYxMDBfRlhURE0zX1RYX1JFQURfUFRSICAgICAgMHgwMzhCMDAKLSNkZWZpbmUgR1Q5NjEwMF9GWFRETTNfUlhfUkVBRF9QVFIgICAgICAweDAzOEIwNAotI2RlZmluZSBHVDk2MTAwX0ZYVERNM19DT05GSUcgICAgICAgMHgwMzhCMDgKLSNkZWZpbmUgR1Q5NjEwMF9GWFRETTNfQVVYX0NIQU5BX1RYIDB4MDM4QjBDCi0jZGVmaW5lIEdUOTYxMDBfRlhURE0zX0FVWF9DSEFOQV9SWCAweDAzOEIxMAotI2RlZmluZSBHVDk2MTAwX0ZYVERNM19BVVhfQ0hBTkJfVFggMHgwMzhCMTQKLSNkZWZpbmUgR1Q5NjEwMF9GWFRETTNfQVVYX0NIQU5CX1JYIDB4MDM4QjE4Ci0vKiAgQmF1ZCBSYXRlIEdlbmVyYXRvcnMgICovCi0jZGVmaW5lIEdUOTYxMDBfQlJHMF9DT05GSUcgICAgIDB4MTAyQTAwCi0jZGVmaW5lIEdUOTYxMDBfQlJHMF9CQVVEX1RVTkUgIDB4MTAyQTA0Ci0jZGVmaW5lIEdUOTYxMDBfQlJHMV9DT05GSUcgICAgIDB4MTAyQTA4Ci0jZGVmaW5lIEdUOTYxMDBfQlJHMV9CQVVEX1RVTkUgIDB4MTAyQTBDCi0jZGVmaW5lIEdUOTYxMDBfQlJHMl9DT05GSUcgICAgIDB4MTAyQTEwCi0jZGVmaW5lIEdUOTYxMDBfQlJHMl9CQVVEX1RVTkUgIDB4MTAyQTE0Ci0jZGVmaW5lIEdUOTYxMDBfQlJHM19DT05GSUcgICAgIDB4MTAyQTE4Ci0jZGVmaW5lIEdUOTYxMDBfQlJHM19CQVVEX1RVTkUgIDB4MTAyQTFDCi0jZGVmaW5lIEdUOTYxMDBfQlJHNF9DT05GSUcgICAgIDB4MTAyQTIwCi0jZGVmaW5lIEdUOTYxMDBfQlJHNF9CQVVEX1RVTkUgIDB4MTAyQTI0Ci0jZGVmaW5lIEdUOTYxMDBfQlJHNV9DT05GSUcgICAgIDB4MTAyQTI4Ci0jZGVmaW5lIEdUOTYxMDBfQlJHNV9CQVVEX1RVTkUgIDB4MTAyQTJDCi0jZGVmaW5lIEdUOTYxMDBfQlJHNl9DT05GSUcgICAgIDB4MTAyQTMwCi0jZGVmaW5lIEdUOTYxMDBfQlJHNl9CQVVEX1RVTkUgIDB4MTAyQTM0Ci0jZGVmaW5lIEdUOTYxMDBfQlJHN19DT05GSUcgICAgIDB4MTAyQTM4Ci0jZGVmaW5lIEdUOTYxMDBfQlJHN19CQVVEX1RVTkUgIDB4MTAyQTNDCi0vKiAgUm91dGluZyBSZWdpc3RlcnMgICovCi0jZGVmaW5lIEdUOTYxMDBfUk9VVEVfTUFJTiAgICAgIDB4MTAxQTAwCi0jZGVmaW5lIEdUOTYxMDBfUk9VVEVfUlhfQ0xPQ0sgIDB4MTAxQTEwCi0jZGVmaW5lIEdUOTYxMDBfUk9VVEVfVFhfQ0xPQ0sgIDB4MTAxQTIwCi0vKiAgR2VuZXJhbCBQdXJwb3NlIFBvcnRzICAqLwotI2RlZmluZSBHVDk2MTAwX0dQUF9DT05GSUcwICAgICAweDEwMEEwMAotI2RlZmluZSBHVDk2MTAwX0dQUF9DT05GSUcxICAgICAweDEwMEEwNAotI2RlZmluZSBHVDk2MTAwX0dQUF9DT05GSUcyICAgICAweDEwMEEwOAotI2RlZmluZSBHVDk2MTAwX0dQUF9DT05GSUczICAgICAweDEwMEEwQwotI2RlZmluZSBHVDk2MTAwX0dQUF9JTzAgICAgICAgICAweDEwMEEyMAotI2RlZmluZSBHVDk2MTAwX0dQUF9JTzEgICAgICAgICAweDEwMEEyNAotI2RlZmluZSBHVDk2MTAwX0dQUF9JTzIgICAgICAgICAweDEwMEEyOAotI2RlZmluZSBHVDk2MTAwX0dQUF9JTzMgICAgICAgICAweDEwMEEyQwotI2RlZmluZSBHVDk2MTAwX0dQUF9EQVRBMCAgICAgICAweDEwMEE0MAotI2RlZmluZSBHVDk2MTAwX0dQUF9EQVRBMSAgICAgICAweDEwMEE0NAotI2RlZmluZSBHVDk2MTAwX0dQUF9EQVRBMiAgICAgICAweDEwMEE0OAotI2RlZmluZSBHVDk2MTAwX0dQUF9EQVRBMyAgICAgICAweDEwMEE0QwotI2RlZmluZSBHVDk2MTAwX0dQUF9MRVZFTDAgICAgICAweDEwMEE2MAotI2RlZmluZSBHVDk2MTAwX0dQUF9MRVZFTDEgICAgICAweDEwMEE2NAotI2RlZmluZSBHVDk2MTAwX0dQUF9MRVZFTDIgICAgICAweDEwMEE2OAotI2RlZmluZSBHVDk2MTAwX0dQUF9MRVZFTDMgICAgICAweDEwMEE2QwotLyogIFdhdGNoZG9nICAqLwotI2RlZmluZSBHVDk2MTAwX1dEX0NPTkZJRyAgIDB4MTAxQTgwCi0jZGVmaW5lIEdUOTYxMDBfV0RfVkFMVUUgICAgMHgxMDFBODQKLS8qIENvbW11bmljYXRpb24gVW5pdCBBcmJpdGVyICAqLwotI2RlZmluZSBHVDk2MTAwX0NPTU1fVU5JVF9BUkJUUl9DT05GSUcgMHgxMDFBQzAKLS8qICBQQ0kgQXJiaXRlcnMgICovCi0jZGVmaW5lIEdUOTYxMDBfUENJMF9BUkJUUl9DT05GSUcgMHgxMDFBRTAKLSNkZWZpbmUgR1Q5NjEwMF9QQ0kxX0FSQlRSX0NPTkZJRyAweDEwMUFFNAotLyogQ0lVIEFyYml0ZXIgKi8KLSNkZWZpbmUgR1Q5NjEwMF9DSVVfQVJCSVRFUl9DT05GSUcgMHgxMDFBQzAKLS8qIEludGVycnVwdCBDb250cm9sbGVyICovCi0jZGVmaW5lIEdUOTYxMDBfTUFJTl9DQVVTRSAgICAgMHgwMDBDMTgKLSNkZWZpbmUgR1Q5NjEwMF9JTlQwX01BSU5fTUFTSyAweDAwMEMxQwotI2RlZmluZSBHVDk2MTAwX0lOVDFfTUFJTl9NQVNLIDB4MDAwQzI0Ci0jZGVmaW5lIEdUOTYxMDBfSElHSF9DQVVTRSAgICAgMHgwMDBDOTgKLSNkZWZpbmUgR1Q5NjEwMF9JTlQwX0hJR0hfTUFTSyAweDAwMEM5QwotI2RlZmluZSBHVDk2MTAwX0lOVDFfSElHSF9NQVNLIDB4MDAwQ0E0Ci0jZGVmaW5lIEdUOTYxMDBfSU5UMF9TRUxFQ1QgICAgMHgwMDBDNzAKLSNkZWZpbmUgR1Q5NjEwMF9JTlQxX1NFTEVDVCAgICAweDAwMEM3NAotI2RlZmluZSBHVDk2MTAwX1NFUklBTF9DQVVTRSAgIDB4MTAzQTAwCi0jZGVmaW5lIEdUOTYxMDBfU0VSSU5UMF9NQVNLICAgMHgxMDNBODAKLSNkZWZpbmUgR1Q5NjEwMF9TRVJJTlQxX01BU0sgICAweDEwM0E4OAotCi0jZW5kaWYgLyogIF9HVDk2MTAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvaGF6YXJkcy5oIGIvaW5jbHVkZS9hc20tbWlwcy9oYXphcmRzLmgKaW5kZXggMjVmNWU4YS4uMGZlMDI5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9oYXphcmRzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9oYXphcmRzLmgKQEAgLTEyLDI1MiArMTIsNTMgQEAKIAogCiAjaWZkZWYgX19BU1NFTUJMWV9fCi0KLQkubWFjcm8JX3Nzbm9wCi0Jc2xsCSQwLCAkMCwgMQotCS5lbmRtCi0KLQkubWFjcm8JX2VoYgotCXNsbAkkMCwgJDAsIDMKLQkuZW5kbQotCi0vKgotICogUk05MDAwIGhhemFyZHMuICBXaGVuIHRoZSBKVExCIGlzIHVwZGF0ZWQgYnkgdGxid2kgb3IgdGxid3IsIGEgc3Vic2VxdWVudAotICogdXNlIG9mIHRoZSBKVExCIGZvciBpbnN0cnVjdGlvbnMgc2hvdWxkIG5vdCBvY2N1ciBmb3IgNCBjcHUgY3ljbGVzIGFuZCB1c2UKLSAqIGZvciBkYXRhIHRyYW5zbGF0aW9ucyBzaG91bGQgbm90IG9jY3VyIGZvciAzIGNwdSBjeWNsZXMuCi0gKi8KLSNpZmRlZiBDT05GSUdfQ1BVX1JNOTAwMAotCi0JLm1hY3JvCW10YzBfdGxid19oYXphcmQKLQkuc2V0CXB1c2gKLQkuc2V0CW1pcHMzMgotCV9zc25vcDsgX3Nzbm9wOyBfc3Nub3A7IF9zc25vcAotCS5zZXQJcG9wCi0JLmVuZG0KLQotCS5tYWNybwl0bGJ3X2VyZXRfaGF6YXJkCi0JLnNldAlwdXNoCi0JLnNldAltaXBzMzIKLQlfc3Nub3A7IF9zc25vcDsgX3Nzbm9wOyBfc3Nub3AKLQkuc2V0CXBvcAotCS5lbmRtCi0KKyNkZWZpbmUgQVNNTUFDUk8obmFtZSwgY29kZS4uLikgLm1hY3JvIG5hbWU7IGNvZGU7IC5lbmRtCiAjZWxzZQogCi0vKgotICogVGhlIHRha2VuIGJyYW5jaCB3aWxsIHJlc3VsdCBpbiBhIHR3byBjeWNsZSBwZW5hbHR5IGZvciB0aGUgdHdvIGtpbGxlZAotICogaW5zdHJ1Y3Rpb25zIG9uIFI0MDAwIC8gUjQ0MDAuICBPdGhlciBwcm9jZXNzb3JzIG9ubHkgaGF2ZSBhIHNpbmdsZSBjeWNsZQotICogaGF6YXJkIHNvIHRoaXMgaXMgbmljZSB0cmljayB0byBoYXZlIGFuIG9wdGltYWwgY29kZSBmb3IgYSByYW5nZSBvZgotICogcHJvY2Vzc29ycy4KLSAqLwotCS5tYWNybwltdGMwX3RsYndfaGF6YXJkCi0JYgkuICsgOAotCS5lbmRtCisjZGVmaW5lIEFTTU1BQ1JPKG5hbWUsIGNvZGUuLi4pCQkJCQkJXAorX19hc21fXygiLm1hY3JvICIgI25hbWUgIjsgIiAjY29kZSAiOyAuZW5kbSIpOwkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgbmFtZSh2b2lkKQkJCQkJCVwKK3sJCQkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCNuYW1lKTsJCQkJCVwKK30KIAotCS5tYWNybwl0bGJ3X2VyZXRfaGF6YXJkCi0JLmVuZG0KICNlbmRpZgogCitBU01NQUNSTyhfc3Nub3AsCisJIHNsbAkkMCwgJDAsIDEKKwkpCisKK0FTTU1BQ1JPKF9laGIsCisJIHNsbAkkMCwgJDAsIDMKKwkpCisKIC8qCi0gKiBtdGMwLT5tZmMwIGhhemFyZAotICogVGhlIDI0SyBoYXMgYSAyIGN5Y2xlIG10YzAvbWZjMCBleGVjdXRpb24gaGF6YXJkLgotICogSXQgaXMgYSBNSVBTMzJSMiBwcm9jZXNzb3Igc28gZWhiIHdpbGwgY2xlYXIgdGhlIGhhemFyZC4KKyAqIFRMQiBoYXphcmRzCisgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfTUlQU1IyKQorCisvKgorICogTUlQU1IyIGRlZmluZXMgZWhiIGZvciBoYXphcmQgYXZvaWRhbmNlCiAgKi8KIAotI2lmZGVmIENPTkZJR19DUFVfTUlQU1IyCi0vKgotICogVXNlIGEgbWFjcm8gZm9yIGVoYiB1bmxlc3MgZXhwbGljaXQgc3VwcG9ydCBmb3IgTUlQU1IyIGlzIGVuYWJsZWQKLSAqLwotCi0jZGVmaW5lIGlycV9lbmFibGVfaGF6YXJkCQkJCQkJXAorQVNNTUFDUk8obXRjMF90bGJ3X2hhemFyZCwKKwkgX2VoYgorCSkKK0FTTU1BQ1JPKHRsYndfdXNlX2hhemFyZCwKKwkgX2VoYgorCSkKK0FTTU1BQ1JPKHRsYl9wcm9iZV9oYXphcmQsCisJIF9laGIKKwkpCitBU01NQUNSTyhpcnFfZW5hYmxlX2hhemFyZCwKKwkpCitBU01NQUNSTyhpcnFfZGlzYWJsZV9oYXphcmQsCiAJX2VoYgotCi0jZGVmaW5lIGlycV9kaXNhYmxlX2hhemFyZAkJCQkJCVwKLQlfZWhiCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9SMTAwMDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9STTkwMDApCi0KLS8qCi0gKiBSMTAwMDAgcm9ja3MgLSBhbGwgaGF6YXJkcyBoYW5kbGVkIGluIGhhcmR3YXJlLCBzbyB0aGlzIGJlY29tZXMgYSBub2JyYWluZXIuCi0gKi8KLQotI2RlZmluZSBpcnFfZW5hYmxlX2hhemFyZAotCi0jZGVmaW5lIGlycV9kaXNhYmxlX2hhemFyZAotCi0jZWxzZQotCi0vKgotICogQ2xhc3NpYyBNSVBTIG5lZWRzIDEgLSAzIG5vcHMgb3Igc3Nub3BzCi0gKi8KLSNkZWZpbmUgaXJxX2VuYWJsZV9oYXphcmQKLSNkZWZpbmUgaXJxX2Rpc2FibGVfaGF6YXJkCQkJCQkJXAotCV9zc25vcDsgX3Nzbm9wOyBfc3Nub3AKLQotI2VuZGlmCi0KLSNlbHNlIC8qIF9fQVNTRU1CTFlfXyAqLwotCi1fX2FzbV9fKAotCSIJLm1hY3JvCV9zc25vcAkJCQkJXG4iCi0JIglzbGwJJDAsICQwLCAxCQkJCVxuIgotCSIJLmVuZG0JCQkJCQlcbiIKLQkiCQkJCQkJCVxuIgotCSIJLm1hY3JvCV9laGIJCQkJCVxuIgotCSIJc2xsCSQwLCAkMCwgMwkJCQlcbiIKLQkiCS5lbmRtCQkJCQkJXG4iKTsKLQotI2lmZGVmIENPTkZJR19DUFVfUk05MDAwCi0KLS8qCi0gKiBSTTkwMDAgaGF6YXJkcy4gIFdoZW4gdGhlIEpUTEIgaXMgdXBkYXRlZCBieSB0bGJ3aSBvciB0bGJ3ciwgYSBzdWJzZXF1ZW50Ci0gKiB1c2Ugb2YgdGhlIEpUTEIgZm9yIGluc3RydWN0aW9ucyBzaG91bGQgbm90IG9jY3VyIGZvciA0IGNwdSBjeWNsZXMgYW5kIHVzZQotICogZm9yIGRhdGEgdHJhbnNsYXRpb25zIHNob3VsZCBub3Qgb2NjdXIgZm9yIDMgY3B1IGN5Y2xlcy4KLSAqLwotCi0jZGVmaW5lIG10YzBfdGxid19oYXphcmQoKQkJCQkJCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCQlcCi0JIgkuc2V0CW1pcHMzMgkJCQkJXG4iCVwKLQkiCV9zc25vcAkJCQkJCVxuIglcCi0JIglfc3Nub3AJCQkJCQlcbiIJXAotCSIJX3Nzbm9wCQkJCQkJXG4iCVwKLQkiCV9zc25vcAkJCQkJCVxuIglcCi0JIgkuc2V0CW1pcHMwCQkJCQlcbiIpCi0KLSNkZWZpbmUgdGxid191c2VfaGF6YXJkKCkJCQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCSIJLnNldAltaXBzMzIJCQkJCVxuIglcCi0JIglfc3Nub3AJCQkJCQlcbiIJXAotCSIJX3Nzbm9wCQkJCQkJXG4iCVwKLQkiCV9zc25vcAkJCQkJCVxuIglcCi0JIglfc3Nub3AJCQkJCQlcbiIJXAotCSIJLnNldAltaXBzMAkJCQkJXG4iKQotCi0jZWxzZQotCi0vKgotICogT3ZlcmtpbGwgd2FybmluZyAuLi4KLSAqLwotI2RlZmluZSBtdGMwX3RsYndfaGF6YXJkKCkJCQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAotCSIJLnNldAlub3Jlb3JkZXIJCQkJXG4iCVwKLQkiCW5vcAkJCQkJCVxuIglcCi0JIglub3AJCQkJCQlcbiIJXAotCSIJbm9wCQkJCQkJXG4iCVwKLQkiCW5vcAkJCQkJCVxuIglcCi0JIglub3AJCQkJCQlcbiIJXAotCSIJbm9wCQkJCQkJXG4iCVwKLQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iKQotCi0jZGVmaW5lIHRsYndfdXNlX2hhemFyZCgpCQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKLQkiCS5zZXQJbm9yZW9yZGVyCQkJCVxuIglcCi0JIglub3AJCQkJCQlcbiIJXAotCSIJbm9wCQkJCQkJXG4iCVwKLQkiCW5vcAkJCQkJCVxuIglcCi0JIglub3AJCQkJCQlcbiIJXAotCSIJbm9wCQkJCQkJXG4iCVwKLQkiCW5vcAkJCQkJCVxuIglcCi0JIgkuc2V0CXJlb3JkZXIJCQkJCVxuIikKLQotI2VuZGlmCi0KLS8qCi0gKiBJbnRlcnJ1cHQgZW5hYmxlL2Rpc2FibGUgaGF6YXJkcwotICogU29tZSBwcm9jZXNzb3JzIGhhdmUgaGF6YXJkcyB3aGVuIG1vZGlmeWluZwotICogdGhlIHN0YXR1cyByZWdpc3RlciB0byBjaGFuZ2UgdGhlIGludGVycnVwdCBzdGF0ZQotICovCi0KLSNpZmRlZiBDT05GSUdfQ1BVX01JUFNSMgotCi1fX2FzbV9fKCIJLm1hY3JvCWlycV9lbmFibGVfaGF6YXJkCQkJXG4iCi0JIglfZWhiCQkJCQkJXG4iCi0JIgkuZW5kbQkJCQkJCVxuIgotCSIJCQkJCQkJXG4iCi0JIgkubWFjcm8JaXJxX2Rpc2FibGVfaGF6YXJkCQkJXG4iCi0JIglfZWhiCQkJCQkJXG4iCi0JIgkuZW5kbQkJCQkJCVxuIik7Ci0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9SMTAwMDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9STTkwMDApCi0KLS8qCi0gKiBSMTAwMDAgcm9ja3MgLSBhbGwgaGF6YXJkcyBoYW5kbGVkIGluIGhhcmR3YXJlLCBzbyB0aGlzIGJlY29tZXMgYSBub2JyYWluZXIuCi0gKi8KLQotX19hc21fXygKLQkiCS5tYWNybwlpcnFfZW5hYmxlX2hhemFyZAkJCVxuIgotCSIJLmVuZG0JCQkJCQlcbiIKLQkiCQkJCQkJCVxuIgotCSIJLm1hY3JvCWlycV9kaXNhYmxlX2hhemFyZAkJCVxuIgotCSIJLmVuZG0JCQkJCQlcbiIpOwotCi0jZWxzZQotCi0vKgotICogRGVmYXVsdCBmb3IgY2xhc3NpYyBNSVBTIHByb2Nlc3NvcnMuICBBc3N1bWUgd29yc3QgY2FzZSBoYXphcmRzIGJ1dCBkb24ndAotICogY2FyZSBhYm91dCB0aGUgaXJxX2VuYWJsZV9oYXphcmQgLSBzb29uZXIgb3IgbGF0ZXIgdGhlIGhhcmR3YXJlIHdpbGwKLSAqIGVuYWJsZSBpdCBhbmQgd2UgZG9uJ3QgY2FyZSB3aGVuIGV4YWN0bHkuCi0gKi8KLQotX19hc21fXygKLQkiCSMJCQkJCQlcbiIKLQkiCSMgVGhlcmUgaXMgYSBoYXphcmQgYnV0IHdlIGRvIG5vdCBjYXJlCQlcbiIKLQkiCSMJCQkJCQlcbiIKLQkiCS5tYWNyb1x0aXJxX2VuYWJsZV9oYXphcmQJCQlcbiIKLQkiCS5lbmRtCQkJCQkJXG4iCi0JIgkJCQkJCQlcbiIKLQkiCS5tYWNyb1x0aXJxX2Rpc2FibGVfaGF6YXJkCQkJXG4iCi0JIglfc3Nub3AJCQkJCQlcbiIKLQkiCV9zc25vcAkJCQkJCVxuIgotCSIJX3Nzbm9wCQkJCQkJXG4iCi0JIgkuZW5kbQkJCQkJCVxuIik7Ci0KLSNlbmRpZgotCi0jZGVmaW5lIGlycV9lbmFibGVfaGF6YXJkKCkJCQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oImlycV9lbmFibGVfaGF6YXJkIikKLSNkZWZpbmUgaXJxX2Rpc2FibGVfaGF6YXJkKCkJCQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oImlycV9kaXNhYmxlX2hhemFyZCIpCi0KLQotLyoKLSAqIEJhY2stdG8tYmFjayBoYXphcmRzIC0KLSAqCi0gKiBXaGF0IGlzIG5lZWRlZCB0byBzZXBhcmF0ZSBhIG1vdmUgdG8gY3AwIGZyb20gYSBzdWJzZXF1ZW50IHJlYWQgZnJvbSB0aGUKLSAqIHNhbWUgY3AwIHJlZ2lzdGVyPwotICovCi0jaWZkZWYgQ09ORklHX0NQVV9NSVBTUjIKLQotX19hc21fXygiCS5tYWNybwliYWNrX3RvX2JhY2tfYzBfaGF6YXJkCQkJXG4iCi0JIglfZWhiCQkJCQkJXG4iCi0JIgkuZW5kbQkJCQkJCVxuIik7Ci0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9SMTAwMDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9STTkwMDApIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TQjEpCi0KLV9fYXNtX18oIgkubWFjcm8JYmFja190b19iYWNrX2MwX2hhemFyZAkJCVxuIgotCSIJLmVuZG0JCQkJCQlcbiIpOwotCi0jZWxzZQotCi1fX2FzbV9fKCIJLm1hY3JvCWJhY2tfdG9fYmFja19jMF9oYXphcmQJCQlcbiIKLQkiCS5zZXQJbm9yZW9yZGVyCQkJCVxuIgotCSIJX3Nzbm9wCQkJCQkJXG4iCi0JIglfc3Nub3AJCQkJCQlcbiIKLQkiCV9zc25vcAkJCQkJCVxuIgotCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKLQkiCS5lbmRtIik7Ci0KLSNlbmRpZgotCi0jZGVmaW5lIGJhY2tfdG9fYmFja19jMF9oYXphcmQoKQkJCQkJXAotCV9fYXNtX18gX192b2xhdGlsZV9fKCJiYWNrX3RvX2JhY2tfYzBfaGF6YXJkIikKLQotCi0vKgotICogSW5zdHJ1Y3Rpb24gZXhlY3V0aW9uIGhhemFyZAotICovCi0jaWZkZWYgQ09ORklHX0NQVV9NSVBTUjIKKwkpCitBU01NQUNSTyhiYWNrX3RvX2JhY2tfYzBfaGF6YXJkLAorCSBfZWhiCisJKQogLyoKICAqIGdjYyBoYXMgYSB0cmFkaXRpb24gb2YgbWlzc2NvbXBpbGluZyB0aGUgcHJldmlvdXMgY29uc3RydWN0IHVzaW5nIHRoZQogICogYWRkcmVzcyBvZiBhIGxhYmVsIGFzIGFyZ3VtZW50IHRvIGlubGluZSBhc3NlbWJsZXIuICBHYXMgb3RvaCBoYXMgdGhlCkBAIC0yNzksMTIgKzgwLDEwMSBAQAogCTogIj1yIiAodG1wKSk7CQkJCQkJCVwKIH0gd2hpbGUgKDApCiAKLSNlbHNlCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfUjEwMDAwKQorCisvKgorICogUjEwMDAwIHJvY2tzIC0gYWxsIGhhemFyZHMgaGFuZGxlZCBpbiBoYXJkd2FyZSwgc28gdGhpcyBiZWNvbWVzIGEgbm9icmFpbmVyLgorICovCisKK0FTTU1BQ1JPKG10YzBfdGxid19oYXphcmQsCisJKQorQVNNTUFDUk8odGxid191c2VfaGF6YXJkLAorCSkKK0FTTU1BQ1JPKHRsYl9wcm9iZV9oYXphcmQsCisJKQorQVNNTUFDUk8oaXJxX2VuYWJsZV9oYXphcmQsCisJKQorQVNNTUFDUk8oaXJxX2Rpc2FibGVfaGF6YXJkLAorCSkKK0FTTU1BQ1JPKGJhY2tfdG9fYmFja19jMF9oYXphcmQsCisJKQogI2RlZmluZSBpbnN0cnVjdGlvbl9oYXphcmQoKSBkbyB7IH0gd2hpbGUgKDApCisKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9STTkwMDApCisKKy8qCisgKiBSTTkwMDAgaGF6YXJkcy4gIFdoZW4gdGhlIEpUTEIgaXMgdXBkYXRlZCBieSB0bGJ3aSBvciB0bGJ3ciwgYSBzdWJzZXF1ZW50CisgKiB1c2Ugb2YgdGhlIEpUTEIgZm9yIGluc3RydWN0aW9ucyBzaG91bGQgbm90IG9jY3VyIGZvciA0IGNwdSBjeWNsZXMgYW5kIHVzZQorICogZm9yIGRhdGEgdHJhbnNsYXRpb25zIHNob3VsZCBub3Qgb2NjdXIgZm9yIDMgY3B1IGN5Y2xlcy4KKyAqLworCitBU01NQUNSTyhtdGMwX3RsYndfaGF6YXJkLAorCSBfc3Nub3A7IF9zc25vcDsgX3Nzbm9wOyBfc3Nub3AKKwkpCitBU01NQUNSTyh0bGJ3X3VzZV9oYXphcmQsCisJIF9zc25vcDsgX3Nzbm9wOyBfc3Nub3A7IF9zc25vcAorCSkKK0FTTU1BQ1JPKHRsYl9wcm9iZV9oYXphcmQsCisJIF9zc25vcDsgX3Nzbm9wOyBfc3Nub3A7IF9zc25vcAorCSkKK0FTTU1BQ1JPKGlycV9lbmFibGVfaGF6YXJkLAorCSkKK0FTTU1BQ1JPKGlycV9kaXNhYmxlX2hhemFyZCwKKwkpCitBU01NQUNSTyhiYWNrX3RvX2JhY2tfYzBfaGF6YXJkLAorCSkKKyNkZWZpbmUgaW5zdHJ1Y3Rpb25faGF6YXJkKCkgZG8geyB9IHdoaWxlICgwKQorCisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU0IxKQorCisvKgorICogTW9zdGx5IGxpa2UgUjQwMDAgZm9yIGhpc3RvcmljIHJlYXNvbnMKKyAqLworQVNNTUFDUk8obXRjMF90bGJ3X2hhemFyZCwKKwkpCitBU01NQUNSTyh0bGJ3X3VzZV9oYXphcmQsCisJKQorQVNNTUFDUk8odGxiX3Byb2JlX2hhemFyZCwKKwkpCitBU01NQUNSTyhpcnFfZW5hYmxlX2hhemFyZCwKKwkpCitBU01NQUNSTyhpcnFfZGlzYWJsZV9oYXphcmQsCisJIF9zc25vcDsgX3Nzbm9wOyBfc3Nub3AKKwkpCitBU01NQUNSTyhiYWNrX3RvX2JhY2tfYzBfaGF6YXJkLAorCSkKKyNkZWZpbmUgaW5zdHJ1Y3Rpb25faGF6YXJkKCkgZG8geyB9IHdoaWxlICgwKQorCisjZWxzZQorCisvKgorICogRmluYWxseSB0aGUgY2F0Y2hhbGwgY2FzZSBmb3IgYWxsIG90aGVyIHByb2Nlc3NvcnMgaW5jbHVkaW5nIFI0MDAwLCBSNDQwMCwKKyAqIFI0NjAwLCBSNDcwMCwgUjUwMDAsIFJNNzAwMCwgTkVDIFZSNDF4eCBldGMuCisgKgorICogVGhlIHRha2VuIGJyYW5jaCB3aWxsIHJlc3VsdCBpbiBhIHR3byBjeWNsZSBwZW5hbHR5IGZvciB0aGUgdHdvIGtpbGxlZAorICogaW5zdHJ1Y3Rpb25zIG9uIFI0MDAwIC8gUjQ0MDAuICBPdGhlciBwcm9jZXNzb3JzIG9ubHkgaGF2ZSBhIHNpbmdsZSBjeWNsZQorICogaGF6YXJkIHNvIHRoaXMgaXMgbmljZSB0cmljayB0byBoYXZlIGFuIG9wdGltYWwgY29kZSBmb3IgYSByYW5nZSBvZgorICogcHJvY2Vzc29ycy4KKyAqLworQVNNTUFDUk8obXRjMF90bGJ3X2hhemFyZCwKKwlub3AKKwkpCitBU01NQUNSTyh0bGJ3X3VzZV9oYXphcmQsCisJbm9wOyBub3A7IG5vcAorCSkKK0FTTU1BQ1JPKHRsYl9wcm9iZV9oYXphcmQsCisJIG5vcDsgbm9wOyBub3AKKwkpCitBU01NQUNSTyhpcnFfZW5hYmxlX2hhemFyZCwKKwkpCitBU01NQUNSTyhpcnFfZGlzYWJsZV9oYXphcmQsCisJbm9wOyBub3A7IG5vcAorCSkKK0FTTU1BQ1JPKGJhY2tfdG9fYmFja19jMF9oYXphcmQsCisJIF9zc25vcDsgX3Nzbm9wOyBfc3Nub3A7CisJKQorI2RlZmluZSBpbnN0cnVjdGlvbl9oYXphcmQoKSBkbyB7IH0gd2hpbGUgKDApCisKICNlbmRpZgogCi1leHRlcm4gdm9pZCBtaXBzX2loYih2b2lkKTsKLQotI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwotCiAjZW5kaWYgLyogX0FTTV9IQVpBUkRTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvaXJxLmggYi9pbmNsdWRlL2FzbS1taXBzL2lycS5oCmluZGV4IDg5NjU1MGIuLmQzNWM2MTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9pcnEuaApAQCAtNzYsOCArNzYsNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGh3bWFzayk7CiAjZW5kaWYgLyogQ09ORklHX01JUFNfTVRfU01UQyAqLwogCi0jaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBBUkNIX0hBU19JUlFfUEVSX0NQVQotI2VuZGlmCi0KICNlbmRpZiAvKiBfQVNNX0lSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtYXRsYXMvbWMxNDY4MThydGMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdGxhcy9tYzE0NjgxOHJ0Yy5oCmluZGV4IDM5NzUyMmUuLmE3M2E1NjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdGxhcy9tYzE0NjgxOHJ0Yy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdGxhcy9tYzE0NjgxOHJ0Yy5oCkBAIC0yOCwxMCArMjgsMTIgQEAKICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvYXRsYXMuaD4KICNpbmNsdWRlIDxhc20vbWlwcy1ib2FyZHMvYXRsYXNpbnQuaD4KIAorI2RlZmluZSBBUkNIX1JUQ19MT0NBVElPTgorCiAjZGVmaW5lIFJUQ19QT1JUKHgpCShBVExBU19SVENfQURSX1JFRyArICh4KSAqIDgpCiAjZGVmaW5lIFJUQ19JT19FWFRFTlQJMHgxMDAKICNkZWZpbmUgUlRDX0lPTUFQUEVECTAKLSNkZWZpbmUgUlRDX0lSUQkJQVRMQVNJTlRfUlRDCisjZGVmaW5lIFJUQ19JUlEJCUFUTEFTX0lOVF9SVEMKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIENNT1NfUkVBRCh1bnNpZ25lZCBsb25nIGFkZHIpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZXY5NjEwMC9tYWNoLWd0NjQxMjAuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1ldjk2MTAwL21hY2gtZ3Q2NDEyMC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWYxZTZjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1ldjk2MTAwL21hY2gtZ3Q2NDEyMC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqICBUaGlzIGlzIGEgZGlyZWN0IGNvcHkgb2YgdGhlIGV2OTYxMDAuaCBmaWxlLCB3aXRoIGEgZ2xvYmFsCi0gKiBzZWFyY2ggYW5kIHJlcGxhY2UuICBUaGUgbnVtYmVycyBhcmUgdGhlIHNhbWUuCi0gKgotICogIFRoZSByZWFzb24gSSdtIGR1cGxpY2F0aW5nIHRoaXMgaXMgc28gdGhhdCB0aGUgNjQxMjAvOTYxMDAKLSAqIGRlZmluZXMgd29uJ3QgYmUgY29uZnVzaW5nIGluIHRoZSBzb3VyY2UgY29kZS4KLSAqLwotI2lmbmRlZiBfQVNNX0dUNjQxMjBfRVY5NjEwMF9HVDY0MTIwX0RFUF9ICi0jZGVmaW5lIF9BU01fR1Q2NDEyMF9FVjk2MTAwX0dUNjQxMjBfREVQX0gKLQotLyoKLSAqICAgR1Q5NjEwMCBjb25maWcgc3BhY2UgYmFzZSBhZGRyZXNzCi0gKi8KLSNkZWZpbmUgR1Q2NDEyMF9CQVNFCShLU0VHMUFERFIoMHgxNDAwMDAwMCkpCi0KLS8qCi0gKiAgIFBDSSBCdXMgYWxsb2NhdGlvbgotICoKLSAqICAgKEd1ZXNzaW5nIC4uLikKLSAqLwotI2RlZmluZSBHVF9QQ0lfTUVNX0JBU0UJMHgxMjAwMDAwMFVMCi0jZGVmaW5lIEdUX1BDSV9NRU1fU0laRQkweDAyMDAwMDAwVUwKLSNkZWZpbmUgR1RfUENJX0lPX0JBU0UJMHgxMDAwMDAwMFVMCi0jZGVmaW5lIEdUX1BDSV9JT19TSVpFCTB4MDIwMDAwMDBVTAotI2RlZmluZSBHVF9JU0FfSU9fQkFTRQlQQ0lfSU9fQkFTRQotCi0vKgotICogICBEdWFydCBJL08gcG9ydHMuCi0gKi8KLSNkZWZpbmUgRVY5NjEwMF9DT00xX0JBU0VfQUREUgkoMHhCRDAwMDAwMCArIDB4MjApCi0jZGVmaW5lIEVWOTYxMDBfQ09NMl9CQVNFX0FERFIJKDB4QkQwMDAwMDAgKyAweDAwKQotCi0KLS8qCi0gKiAgIEVWOTYxMDAgaW50ZXJydXB0IGNvbnRyb2xsZXIgcmVnaXN0ZXIgYmFzZS4KLSAqLwotI2RlZmluZSBFVjk2MTAwX0lDVFJMX1JFR1NfQkFTRQkoS1NFRzFBRERSKDB4MWYwMDAwMDApKQotCi0vKgotICogICBFVjk2MTAwIFVBUlQgcmVnaXN0ZXIgYmFzZS4KLSAqLwotI2RlZmluZSBFVjk2MTAwX1VBUlQwX1JFR1NfQkFTRQlFVjk2MTAwX0NPTTFfQkFTRV9BRERSCi0jZGVmaW5lIEVWOTYxMDBfVUFSVDFfUkVHU19CQVNFCUVWOTYxMDBfQ09NMl9CQVNFX0FERFIKLSNkZWZpbmUgRVY5NjEwMF9CQVNFX0JBVUQJKCAzNjg2NDAwIC8gMTYgKQotCi0jZW5kaWYgLyogX0FTTV9HVDY0MTIwX0VWOTYxMDBfR1Q2NDEyMF9ERVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWV4Y2l0ZS9leGNpdGUuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1leGNpdGUvZXhjaXRlLmgKaW5kZXggMTMwYmQ0Yi4uNGMyOWJhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWV4Y2l0ZS9leGNpdGUuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtZXhjaXRlL2V4Y2l0ZS5oCkBAIC03LDcgKzcsNyBAQAogCiAjZGVmaW5lIEVYQ0lURV9DUFVfRVhUX0NMT0NLIDEwMDAwMDAwMAogCi0jaWYgIWRlZmluZWQoX19BU1NFTUJMRVJfXykKKyNpZiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCiB2b2lkIF9faW5pdCBleGNpdGVfa2dkYl9pbml0KHZvaWQpOwogdm9pZCBleGNpdGVfcHJvY2ZzX2luaXQodm9pZCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBtZW1zaXplOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Jhc2xlci9leGNpdGUvZXhjaXRlX2ZwZ2EuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1leGNpdGUvZXhjaXRlX2ZwZ2EuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9taXBzL2Jhc2xlci9leGNpdGUvZXhjaXRlX2ZwZ2EuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20tbWlwcy9tYWNoLWV4Y2l0ZS9leGNpdGVfZnBnYS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtcWVtdS9jcHUtZmVhdHVyZS1vdmVycmlkZXMuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1xZW11L2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCmluZGV4IGY0ZTM3MGUuLjUyOTQ0NWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1xZW11L2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1xZW11L2NwdS1mZWF0dXJlLW92ZXJyaWRlcy5oCkBAIC0yMCw3ICsyMCw3IEBACiAKICNkZWZpbmUgY3B1X2hhc19sbHNjCQkxCiAjZGVmaW5lIGNwdV9oYXNfdnRhZ19pY2FjaGUJMAotI2RlZmluZSBjcHVfaGFzX2RjX2FsaWFzZXMJKFBBR0VfU0laRSA8IDB4NDAwMCkKKyNkZWZpbmUgY3B1X2hhc19kY19hbGlhc2VzCTAKICNkZWZpbmUgY3B1X2hhc19pY19maWxsc19mX2RjCTAKIAogI2RlZmluZSBjcHVfaGFzX2RzcAkJMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9taXBzLWJvYXJkcy9hdGxhc2ludC5oIGIvaW5jbHVkZS9hc20tbWlwcy9taXBzLWJvYXJkcy9hdGxhc2ludC5oCmluZGV4IGZkN2ViYzUuLmIxNWU0ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvbWlwcy1ib2FyZHMvYXRsYXNpbnQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21pcHMtYm9hcmRzL2F0bGFzaW50LmgKQEAgLTEsNiArMSw3IEBACiAvKgotICogQ2Fyc3RlbiBMYW5nZ2FhcmQsIGNhcnN0ZW5sQG1pcHMuY29tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgTUlQUyBUZWNobm9sb2dpZXMsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDYgIE1JUFMgVGVjaG5vbG9naWVzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoJQXV0aG9yczogQ2Fyc3RlbiBMYW5nZ2FhcmQgPGNhcnN0ZW5sQG1pcHMuY29tPgorICoJCSBNYWNpZWogVy4gUm96eWNraSA8bWFjcm9AbWlwcy5jb20+CiAgKgogICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgKgpAQCAtMjUsNDEgKzI2LDg4IEBACiAjaWZuZGVmIF9NSVBTX0FUTEFTSU5UX0gKICNkZWZpbmUgX01JUFNfQVRMQVNJTlRfSAogCi0jZGVmaW5lIEFUTEFTSU5UX0JBU0UJCTEKLSNkZWZpbmUgQVRMQVNJTlRfVUFSVAkJKEFUTEFTSU5UX0JBU0UrMCkKLSNkZWZpbmUgQVRMQVNJTlRfVElNMAkJKEFUTEFTSU5UX0JBU0UrMSkKLSNkZWZpbmUgQVRMQVNJTlRfUkVTMgkJKEFUTEFTSU5UX0JBU0UrMikKLSNkZWZpbmUgQVRMQVNJTlRfUkVTMwkJKEFUTEFTSU5UX0JBU0UrMykKLSNkZWZpbmUgQVRMQVNJTlRfUlRDCQkoQVRMQVNJTlRfQkFTRSs0KQotI2RlZmluZSBBVExBU0lOVF9DT1JFSEkJCShBVExBU0lOVF9CQVNFKzUpCi0jZGVmaW5lIEFUTEFTSU5UX0NPUkVMTwkJKEFUTEFTSU5UX0JBU0UrNikKLSNkZWZpbmUgQVRMQVNJTlRfUkVTNwkJKEFUTEFTSU5UX0JBU0UrNykKLSNkZWZpbmUgQVRMQVNJTlRfUENJQQkJKEFUTEFTSU5UX0JBU0UrOCkKLSNkZWZpbmUgQVRMQVNJTlRfUENJQgkJKEFUTEFTSU5UX0JBU0UrOSkKLSNkZWZpbmUgQVRMQVNJTlRfUENJQwkJKEFUTEFTSU5UX0JBU0UrMTApCi0jZGVmaW5lIEFUTEFTSU5UX1BDSUQJCShBVExBU0lOVF9CQVNFKzExKQotI2RlZmluZSBBVExBU0lOVF9FTlVNCQkoQVRMQVNJTlRfQkFTRSsxMikKLSNkZWZpbmUgQVRMQVNJTlRfREVHCQkoQVRMQVNJTlRfQkFTRSsxMykKLSNkZWZpbmUgQVRMQVNJTlRfQVRYRkFJTAkoQVRMQVNJTlRfQkFTRSsxNCkKLSNkZWZpbmUgQVRMQVNJTlRfSU5UQQkJKEFUTEFTSU5UX0JBU0UrMTUpCi0jZGVmaW5lIEFUTEFTSU5UX0lOVEIJCShBVExBU0lOVF9CQVNFKzE2KQotI2RlZmluZSBBVExBU0lOVF9FVEgJCUFUTEFTSU5UX0lOVEIKLSNkZWZpbmUgQVRMQVNJTlRfSU5UQwkJKEFUTEFTSU5UX0JBU0UrMTcpCi0jZGVmaW5lIEFUTEFTSU5UX1NDU0kJCUFUTEFTSU5UX0lOVEMKLSNkZWZpbmUgQVRMQVNJTlRfSU5URAkJKEFUTEFTSU5UX0JBU0UrMTgpCi0jZGVmaW5lIEFUTEFTSU5UX1NFUlIJCShBVExBU0lOVF9CQVNFKzE5KQotI2RlZmluZSBBVExBU0lOVF9SRVMyMAkJKEFUTEFTSU5UX0JBU0UrMjApCi0jZGVmaW5lIEFUTEFTSU5UX1JFUzIxCQkoQVRMQVNJTlRfQkFTRSsyMSkKLSNkZWZpbmUgQVRMQVNJTlRfUkVTMjIJCShBVExBU0lOVF9CQVNFKzIyKQotI2RlZmluZSBBVExBU0lOVF9SRVMyMwkJKEFUTEFTSU5UX0JBU0UrMjMpCi0jZGVmaW5lIEFUTEFTSU5UX1JFUzI0CQkoQVRMQVNJTlRfQkFTRSsyNCkKLSNkZWZpbmUgQVRMQVNJTlRfUkVTMjUJCShBVExBU0lOVF9CQVNFKzI1KQotI2RlZmluZSBBVExBU0lOVF9SRVMyNgkJKEFUTEFTSU5UX0JBU0UrMjYpCi0jZGVmaW5lIEFUTEFTSU5UX1JFUzI3CQkoQVRMQVNJTlRfQkFTRSsyNykKLSNkZWZpbmUgQVRMQVNJTlRfUkVTMjgJCShBVExBU0lOVF9CQVNFKzI4KQotI2RlZmluZSBBVExBU0lOVF9SRVMyOQkJKEFUTEFTSU5UX0JBU0UrMjkpCi0jZGVmaW5lIEFUTEFTSU5UX1JFUzMwCQkoQVRMQVNJTlRfQkFTRSszMCkKLSNkZWZpbmUgQVRMQVNJTlRfUkVTMzEJCShBVExBU0lOVF9CQVNFKzMxKQotI2RlZmluZSBBVExBU0lOVF9FTkQJCShBVExBU0lOVF9CQVNFKzMxKQorLyoKKyAqIEludGVycnVwdHMgMC4uNyBhcmUgdXNlZCBmb3IgQXRsYXMgQ1BVIGludGVycnVwdHMgKG5vbkVJQyBtb2RlKQorICovCisjZGVmaW5lIE1JUFNDUFVfSU5UX0JBU0UJMAorCisvKiBDUFUgaW50ZXJydXB0IG9mZnNldHMgKi8KKyNkZWZpbmUgTUlQU0NQVV9JTlRfU1cwCQkwCisjZGVmaW5lIE1JUFNDUFVfSU5UX1NXMQkJMQorI2RlZmluZSBNSVBTQ1BVX0lOVF9NQjAJCTIKKyNkZWZpbmUgTUlQU0NQVV9JTlRfQVRMQVMJTUlQU0NQVV9JTlRfTUIwCisjZGVmaW5lIE1JUFNDUFVfSU5UX01CMQkJMworI2RlZmluZSBNSVBTQ1BVX0lOVF9NQjIJCTQKKyNkZWZpbmUgTUlQU0NQVV9JTlRfTUIzCQk1CisjZGVmaW5lIE1JUFNDUFVfSU5UX01CNAkJNgorI2RlZmluZSBNSVBTQ1BVX0lOVF9DUFVDVFIJNworCisvKgorICogSW50ZXJydXB0cyA4Li4zOSBhcmUgdXNlZCBmb3IgQXRsYXMgaW50ZXJydXB0IGNvbnRyb2xsZXIgaW50ZXJydXB0cworICovCisjZGVmaW5lIEFUTEFTX0lOVF9CQVNFCQk4CisjZGVmaW5lIEFUTEFTX0lOVF9VQVJUCQkoQVRMQVNfSU5UX0JBU0UgKyAwKQorI2RlZmluZSBBVExBU19JTlRfVElNMAkJKEFUTEFTX0lOVF9CQVNFICsgMSkKKyNkZWZpbmUgQVRMQVNfSU5UX1JFUzIJCShBVExBU19JTlRfQkFTRSArIDIpCisjZGVmaW5lIEFUTEFTX0lOVF9SRVMzCQkoQVRMQVNfSU5UX0JBU0UgKyAzKQorI2RlZmluZSBBVExBU19JTlRfUlRDCQkoQVRMQVNfSU5UX0JBU0UgKyA0KQorI2RlZmluZSBBVExBU19JTlRfQ09SRUhJCShBVExBU19JTlRfQkFTRSArIDUpCisjZGVmaW5lIEFUTEFTX0lOVF9DT1JFTE8JKEFUTEFTX0lOVF9CQVNFICsgNikKKyNkZWZpbmUgQVRMQVNfSU5UX1JFUzcJCShBVExBU19JTlRfQkFTRSArIDcpCisjZGVmaW5lIEFUTEFTX0lOVF9QQ0lBCQkoQVRMQVNfSU5UX0JBU0UgKyA4KQorI2RlZmluZSBBVExBU19JTlRfUENJQgkJKEFUTEFTX0lOVF9CQVNFICsgOSkKKyNkZWZpbmUgQVRMQVNfSU5UX1BDSUMJCShBVExBU19JTlRfQkFTRSArIDEwKQorI2RlZmluZSBBVExBU19JTlRfUENJRAkJKEFUTEFTX0lOVF9CQVNFICsgMTEpCisjZGVmaW5lIEFUTEFTX0lOVF9FTlVNCQkoQVRMQVNfSU5UX0JBU0UgKyAxMikKKyNkZWZpbmUgQVRMQVNfSU5UX0RFRwkJKEFUTEFTX0lOVF9CQVNFICsgMTMpCisjZGVmaW5lIEFUTEFTX0lOVF9BVFhGQUlMCShBVExBU19JTlRfQkFTRSArIDE0KQorI2RlZmluZSBBVExBU19JTlRfSU5UQQkJKEFUTEFTX0lOVF9CQVNFICsgMTUpCisjZGVmaW5lIEFUTEFTX0lOVF9JTlRCCQkoQVRMQVNfSU5UX0JBU0UgKyAxNikKKyNkZWZpbmUgQVRMQVNfSU5UX0VUSAkJQVRMQVNfSU5UX0lOVEIKKyNkZWZpbmUgQVRMQVNfSU5UX0lOVEMJCShBVExBU19JTlRfQkFTRSArIDE3KQorI2RlZmluZSBBVExBU19JTlRfU0NTSQkJQVRMQVNfSU5UX0lOVEMKKyNkZWZpbmUgQVRMQVNfSU5UX0lOVEQJCShBVExBU19JTlRfQkFTRSArIDE4KQorI2RlZmluZSBBVExBU19JTlRfU0VSUgkJKEFUTEFTX0lOVF9CQVNFICsgMTkpCisjZGVmaW5lIEFUTEFTX0lOVF9SRVMyMAkJKEFUTEFTX0lOVF9CQVNFICsgMjApCisjZGVmaW5lIEFUTEFTX0lOVF9SRVMyMQkJKEFUTEFTX0lOVF9CQVNFICsgMjEpCisjZGVmaW5lIEFUTEFTX0lOVF9SRVMyMgkJKEFUTEFTX0lOVF9CQVNFICsgMjIpCisjZGVmaW5lIEFUTEFTX0lOVF9SRVMyMwkJKEFUTEFTX0lOVF9CQVNFICsgMjMpCisjZGVmaW5lIEFUTEFTX0lOVF9SRVMyNAkJKEFUTEFTX0lOVF9CQVNFICsgMjQpCisjZGVmaW5lIEFUTEFTX0lOVF9SRVMyNQkJKEFUTEFTX0lOVF9CQVNFICsgMjUpCisjZGVmaW5lIEFUTEFTX0lOVF9SRVMyNgkJKEFUTEFTX0lOVF9CQVNFICsgMjYpCisjZGVmaW5lIEFUTEFTX0lOVF9SRVMyNwkJKEFUTEFTX0lOVF9CQVNFICsgMjcpCisjZGVmaW5lIEFUTEFTX0lOVF9SRVMyOAkJKEFUTEFTX0lOVF9CQVNFICsgMjgpCisjZGVmaW5lIEFUTEFTX0lOVF9SRVMyOQkJKEFUTEFTX0lOVF9CQVNFICsgMjkpCisjZGVmaW5lIEFUTEFTX0lOVF9SRVMzMAkJKEFUTEFTX0lOVF9CQVNFICsgMzApCisjZGVmaW5lIEFUTEFTX0lOVF9SRVMzMQkJKEFUTEFTX0lOVF9CQVNFICsgMzEpCisjZGVmaW5lIEFUTEFTX0lOVF9FTkQJCShBVExBU19JTlRfQkFTRSArIDMxKQorCisvKgorICogSW50ZXJydXB0cyA2NC4uMTI3IGFyZSB1c2VkIGZvciBTb2MtaXQgQ2xhc3NpYyBpbnRlcnJ1cHRzCisgKi8KKyNkZWZpbmUgTVNDMDFDX0lOVF9CQVNFCQk2NAorCisvKiBTT0MtaXQgQ2xhc3NpYyBpbnRlcnJ1cHQgb2Zmc2V0cyAqLworI2RlZmluZSBNU0MwMUNfSU5UX1RNUgkJMAorI2RlZmluZSBNU0MwMUNfSU5UX1BDSQkJMQorCisvKgorICogSW50ZXJydXB0cyA2NC4uMTI3IGFyZSB1c2VkIGZvciBTb2MtaXQgRUlDIGludGVycnVwdHMKKyAqLworI2RlZmluZSBNU0MwMUVfSU5UX0JBU0UJCTY0CisKKy8qIFNPQy1pdCBFSUMgaW50ZXJydXB0IG9mZnNldHMgKi8KKyNkZWZpbmUJTVNDMDFFX0lOVF9TVzAJCTEKKyNkZWZpbmUJTVNDMDFFX0lOVF9TVzEJCTIKKyNkZWZpbmUJTVNDMDFFX0lOVF9NQjAJCTMKKyNkZWZpbmUJTVNDMDFFX0lOVF9BVExBUwlNU0MwMUVfSU5UX01CMAorI2RlZmluZQlNU0MwMUVfSU5UX01CMQkJNAorI2RlZmluZQlNU0MwMUVfSU5UX01CMgkJNQorI2RlZmluZQlNU0MwMUVfSU5UX01CMwkJNgorI2RlZmluZQlNU0MwMUVfSU5UX01CNAkJNworI2RlZmluZQlNU0MwMUVfSU5UX1RNUgkJOAorI2RlZmluZQlNU0MwMUVfSU5UX1BDSQkJOQorI2RlZmluZQlNU0MwMUVfSU5UX1BFUkZDVFIJMTAKKyNkZWZpbmUJTVNDMDFFX0lOVF9DUFVDVFIJMTEKIAogI2VuZGlmIC8qICEoX01JUFNfQVRMQVNJTlRfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbW11X2NvbnRleHQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvbW11X2NvbnRleHQuaAppbmRleCAxOGI2OWRlLi5mZTA2NWQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21tdV9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tbXVfY29udGV4dC5oCkBAIC0yNjIsMTAgKzI2MiwxMCBAQAogCQkvKiBTZWUgY29tbWVudHMgZm9yIHNpbWlsYXIgY29kZSBhYm92ZSAqLwogCQlwcmV2dnBlID0gZHZwZSgpOwogCQlvbGRhc2lkID0gKHJlYWRfYzBfZW50cnloaSgpICYgQVNJRF9NQVNLKTsKLQkJaWYoc210Y19saXZlX2FzaWRbbXl0bGJdW29sZGFzaWRdKSB7Ci0JCSAgc210Y19saXZlX2FzaWRbbXl0bGJdW29sZGFzaWRdICY9IH4oMHgxIDw8IGNwdSk7Ci0JCSAgaWYoc210Y19saXZlX2FzaWRbbXl0bGJdW29sZGFzaWRdID09IDApCi0JCQlzbXRjX2ZsdXNoX3RsYl9hc2lkKG9sZGFzaWQpOworCQlpZiAoc210Y19saXZlX2FzaWRbbXl0bGJdW29sZGFzaWRdKSB7CisJCQlzbXRjX2xpdmVfYXNpZFtteXRsYl1bb2xkYXNpZF0gJj0gfigweDEgPDwgY3B1KTsKKwkJCWlmKHNtdGNfbGl2ZV9hc2lkW215dGxiXVtvbGRhc2lkXSA9PSAwKQorCQkJCXNtdGNfZmx1c2hfdGxiX2FzaWQob2xkYXNpZCk7CiAJCX0KIAkJLyogU2VlIGNvbW1lbnRzIGZvciBzaW1pbGFyIGNvZGUgYWJvdmUgKi8KIAkJd3JpdGVfYzBfZW50cnloaSgocmVhZF9jMF9lbnRyeWhpKCkgJiB+SFdfQVNJRF9NQVNLKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wYWdlLmggYi9pbmNsdWRlL2FzbS1taXBzL3BhZ2UuaAppbmRleCAyMTlkMzU5Li44NWIyNThlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3BhZ2UuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3BhZ2UuaApAQCAtMzQsNiArMzQsOCBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCisjaW5jbHVkZSA8YXNtL2NwdS1mZWF0dXJlcy5oPgorCiBleHRlcm4gdm9pZCBjbGVhcl9wYWdlKHZvaWQgKiBwYWdlKTsKIGV4dGVybiB2b2lkIGNvcHlfcGFnZSh2b2lkICogdG8sIHZvaWQgKiBmcm9tKTsKIApAQCAtNTMsNyArNTUsNyBAQAogCWV4dGVybiB2b2lkICgqZmx1c2hfZGF0YV9jYWNoZV9wYWdlKSh1bnNpZ25lZCBsb25nIGFkZHIpOwogCiAJY2xlYXJfcGFnZShhZGRyKTsKLQlpZiAocGFnZXNfZG9fYWxpYXMoKHVuc2lnbmVkIGxvbmcpIGFkZHIsIHZhZGRyKSkKKwlpZiAocGFnZXNfZG9fYWxpYXMoKHVuc2lnbmVkIGxvbmcpIGFkZHIsIHZhZGRyICYgUEFHRV9NQVNLKSkKIAkJZmx1c2hfZGF0YV9jYWNoZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkZHIpOwogfQogCkBAIC02Myw3ICs2NSw4IEBACiAJZXh0ZXJuIHZvaWQgKCpmbHVzaF9kYXRhX2NhY2hlX3BhZ2UpKHVuc2lnbmVkIGxvbmcgYWRkcik7CiAKIAljb3B5X3BhZ2UodnRvLCB2ZnJvbSk7Ci0JaWYgKHBhZ2VzX2RvX2FsaWFzKCh1bnNpZ25lZCBsb25nKXZ0bywgdmFkZHIpKQorCWlmICghY3B1X2hhc19pY19maWxsc19mX2RjIHx8CisJICAgIHBhZ2VzX2RvX2FsaWFzKCh1bnNpZ25lZCBsb25nKXZ0bywgdmFkZHIgJiBQQUdFX01BU0spKQogCQlmbHVzaF9kYXRhX2NhY2hlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdnRvKTsKIH0KIApAQCAtNzQsMTUgKzc3LDE3IEBACiAgICNpZmRlZiBDT05GSUdfQ1BVX01JUFMzMgogICAgIHR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwdGVfbG93LCBwdGVfaGlnaDsgfSBwdGVfdDsKICAgICAjZGVmaW5lIHB0ZV92YWwoeCkgICAgKCh4KS5wdGVfbG93IHwgKCh1bnNpZ25lZCBsb25nIGxvbmcpKHgpLnB0ZV9oaWdoIDw8IDMyKSkKKyAgICAjZGVmaW5lIF9fcHRlKHgpICAgICAgKHsgcHRlX3QgX19wdGUgPSB7KHgpLCAoKHVuc2lnbmVkIGxvbmcgbG9uZykoeCkpID4+IDMyfTsgX19wdGU7IH0pCiAgICNlbHNlCiAgICAgIHR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBsb25nIHB0ZTsgfSBwdGVfdDsKICAgICAgI2RlZmluZSBwdGVfdmFsKHgpCSgoeCkucHRlKQorICAgICAjZGVmaW5lIF9fcHRlKHgpCSgocHRlX3QpIHsgKHgpIH0gKQogICAjZW5kaWYKICNlbHNlCiB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcHRlOyB9IHB0ZV90OwogI2RlZmluZSBwdGVfdmFsKHgpCSgoeCkucHRlKQotI2VuZGlmCiAjZGVmaW5lIF9fcHRlKHgpCSgocHRlX3QpIHsgKHgpIH0gKQorI2VuZGlmCiAKIC8qCiAgKiBGb3IgMy1sZXZlbCBwYWdldGFibGVzIHdlIGRlZmluZXMgdGhlc2Ugb3Vyc2VsdmVzLCBmb3IgMi1sZXZlbCB0aGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvcGd0YWJsZS02NC5oIGIvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLTY0LmgKaW5kZXggYzU5YTFlMi4uZDA1ZmI2ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLTY0LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9wZ3RhYmxlLTY0LmgKQEAgLTkzLDggKzkzLDEyIEBACiAjZGVmaW5lIFBUUlNfUEVSX1BNRAkoKFBBR0VfU0laRSA8PCBQTURfT1JERVIpIC8gc2l6ZW9mKHBtZF90KSkKICNkZWZpbmUgUFRSU19QRVJfUFRFCSgoUEFHRV9TSVpFIDw8IFBURV9PUkRFUikgLyBzaXplb2YocHRlX3QpKQogCisjaWYgUEdESVJfU0laRSA+PSBUQVNLX1NJWkUKKyNkZWZpbmUgVVNFUl9QVFJTX1BFUl9QR0QgICAgICAgKDEpCisjZWxzZQogI2RlZmluZSBVU0VSX1BUUlNfUEVSX1BHRAkoVEFTS19TSVpFIC8gUEdESVJfU0laRSkKLSNkZWZpbmUgRklSU1RfVVNFUl9BRERSRVNTCTAKKyNlbmRpZgorI2RlZmluZSBGSVJTVF9VU0VSX0FERFJFU1MJMFVMCiAKICNkZWZpbmUgVk1BTExPQ19TVEFSVAkJTUFQX0JBU0UKICNkZWZpbmUgVk1BTExPQ19FTkQJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLW1pcHMvcHRyYWNlLmgKaW5kZXggNDExMzMxNi4uNGZiMGZjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3B0cmFjZS5oCkBAIC0xMCw4ICsxMCw2IEBACiAjZGVmaW5lIF9BU01fUFRSQUNFX0gKIAogCi0jaW5jbHVkZSA8YXNtL2lzYWRlcC5oPgotCiAvKiAwIC0gMzEgYXJlIGludGVnZXIgcmVnaXN0ZXJzLCAzMiAtIDYzIGFyZSBmcCByZWdpc3RlcnMuICAqLwogI2RlZmluZSBGUFJfQkFTRQkzMgogI2RlZmluZSBQQwkJNjQKQEAgLTczLDYgKzcxLDcgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2lzYWRlcC5oPgogCiAvKgogICogRG9lcyB0aGUgcHJvY2VzcyBhY2NvdW50IGZvciB1c2VyIG9yIGZvciBzeXN0ZW0gdGltZT8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2VyaWFsLmggYi9pbmNsdWRlL2FzbS1taXBzL3NlcmlhbC5oCmluZGV4IDU4NGJkOWMwLi4wMzU2MzdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2VyaWFsLmgKQEAgLTUyLDkgKzUyLDkgQEAKICNlbmRpZgogCiAvKgotICogQm90aCBHYWxpbGVvIGJvYXJkcyBoYXZlIHRoZSBzYW1lIFVBUlQgbWFwcGluZ3MuCisgKiBHYWxpbGVvIEVWNjQxMjAgZXZhbHVhdGlvbiBib2FyZAogICovCi0jaWYgZGVmaW5lZCAoQ09ORklHX01JUFNfRVY5NjEwMCkgfHwgZGVmaW5lZCAoQ09ORklHX01JUFNfRVY2NDEyMCkKKyNpZmRlZiBDT05GSUdfTUlQU19FVjY0MTIwCiAjaW5jbHVkZSA8YXNtL2dhbGlsZW8tYm9hcmRzL2V2OTYxMDAuaD4KICNpbmNsdWRlIDxhc20vZ2FsaWxlby1ib2FyZHMvZXY5NjEwMGludC5oPgogI2RlZmluZSBFVjk2MTAwX1NFUklBTF9QT1JUX0RFRk5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9kZWZzLmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfZGVmcy5oCmluZGV4IDMzNWRiYWYuLmE4ODU0OTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9kZWZzLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX2RlZnMuaApAQCAtMjEyLDcgKzIxMiw3IEBACiAgKiBOb3RlOiB5b3UnbGwgbmVlZCB0byBkZWZpbmUgdWludDMyX3QgYW5kIHVpbnQ2NF90IGluIHlvdXIgaGVhZGVycy4KICAqLwogCi0jaWYgIWRlZmluZWQoX19BU1NFTUJMRVJfXykKKyNpZiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCiAjZGVmaW5lIF9TQl9NQUtFNjQoeCkgKCh1aW50NjRfdCkoeCkpCiAjZGVmaW5lIF9TQl9NQUtFMzIoeCkgKCh1aW50MzJfdCkoeCkpCiAjZWxzZQpAQCAtMjUxLDkgKzI1MSw5IEBACiAgKi8KIAogCi0jaWYgZGVmaW5lZChfX21pcHM2NCkgJiYgIWRlZmluZWQoX19BU1NFTUJMRVJfXykKKyNpZiBkZWZpbmVkKF9fbWlwczY0KSAmJiAhZGVmaW5lZChfX0FTU0VNQkxZX18pCiAjZGVmaW5lIFNCV1JJVEVDU1IoY3NyLHZhbCkgKigodm9sYXRpbGUgdWludDY0X3QgKikgUEhZU19UT19LMShjc3IpKSA9ICh2YWwpCiAjZGVmaW5lIFNCUkVBRENTUihjc3IpICgqKCh2b2xhdGlsZSB1aW50NjRfdCAqKSBQSFlTX1RPX0sxKGNzcikpKQotI2VuZGlmIC8qIF9fQVNTRU1CTEVSX18gKi8KKyNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfc2NkLmggYi9pbmNsdWRlL2FzbS1taXBzL3NpYnl0ZS9zYjEyNTBfc2NkLmgKaW5kZXggZjQxNzhiZC4uN2VkMGJiNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWJ5dGUvc2IxMjUwX3NjZC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc2lieXRlL3NiMTI1MF9zY2QuaApAQCAtMTQ5LDcgKzE0OSw3IEBACiAgKiAoRm9yIHRoZSBhc3NlbWJsZXIgdmVyc2lvbiwgc3lzcmV2IGFuZCBkZXN0IG1heSBiZSB0aGUgc2FtZSByZWdpc3Rlci4KICAqIEFsc28sIGl0IGNsb2JiZXJzIEFULikKICAqLwotI2lmZGVmIF9fQVNTRU1CTEVSX18KKyNpZmRlZiBfX0FTU0VNQkxZX18KICNkZWZpbmUgU1lTX1NPQ19UWVBFKGRlc3QsIHN5c3JldikJCQkJCVwKIAkuc2V0IHB1c2ggOwkJCQkJCQlcCiAJLnNldCByZW9yZGVyIDsJCQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9zaWduYWwuaCBiL2luY2x1ZGUvYXNtLW1pcHMvc2lnbmFsLmgKaW5kZXggODdhMWRmZi4uOGIzOTFhMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zaWduYWwuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3NpZ25hbC5oCkBAIC0xMDgsMTcgKzEwOCw4IEBACiAjZGVmaW5lIFNJR19CTE9DSwkxCS8qIGZvciBibG9ja2luZyBzaWduYWxzICovCiAjZGVmaW5lIFNJR19VTkJMT0NLCTIJLyogZm9yIHVuYmxvY2tpbmcgc2lnbmFscyAqLwogI2RlZmluZSBTSUdfU0VUTUFTSwkzCS8qIGZvciBzZXR0aW5nIHRoZSBzaWduYWwgbWFzayAqLwotI2RlZmluZSBTSUdfU0VUTUFTSzMyCTI1NgkvKiBHb29kaWUgZnJvbSBTR0kgZm9yIEJTRCBjb21wYXRpYmlsaXR5OgotCQkJCSAgIHNldCBvbmx5IHRoZSBsb3cgMzIgYml0IG9mIHRoZSBzaWdzZXQuICAqLwogCi0vKiBUeXBlIG9mIGEgc2lnbmFsIGhhbmRsZXIuICAqLwotdHlwZWRlZiB2b2lkIF9fc2lnbmFsZm5fdChpbnQpOwotdHlwZWRlZiBfX3NpZ25hbGZuX3QgX191c2VyICpfX3NpZ2hhbmRsZXJfdDsKLQotLyogRmFrZSBzaWduYWwgZnVuY3Rpb25zICovCi0jZGVmaW5lIFNJR19ERkwJKChfX3NpZ2hhbmRsZXJfdCkwKQkvKiBkZWZhdWx0IHNpZ25hbCBoYW5kbGluZyAqLwotI2RlZmluZSBTSUdfSUdOCSgoX19zaWdoYW5kbGVyX3QpMSkJLyogaWdub3JlIHNpZ25hbCAqLwotI2RlZmluZSBTSUdfRVJSCSgoX19zaWdoYW5kbGVyX3QpLTEpCS8qIGVycm9yIHJldHVybiBmcm9tIHNpZ25hbCAqLworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NpZ25hbC5oPgogCiBzdHJ1Y3Qgc2lnYWN0aW9uIHsKIAl1bnNpZ25lZCBpbnQJc2FfZmxhZ3M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3NwaW5sb2NrLmggYi9pbmNsdWRlL2FzbS1taXBzL3NwaW5sb2NrLmgKaW5kZXggNjY5YjhlMy4uNGMxYTFiNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9zcGlubG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvc3BpbmxvY2suaApAQCAtMjM5LDcgKzIzOSw1MSBAQAogCTogIm1lbW9yeSIpOwogfQogCi0jZGVmaW5lIF9fcmF3X3JlYWRfdHJ5bG9jayhsb2NrKSBnZW5lcmljX19yYXdfcmVhZF90cnlsb2NrKGxvY2spCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19yZWFkX3RyeWxvY2socmF3X3J3bG9ja190ICpydykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCWludCByZXQ7CisKKwlpZiAoUjEwMDAwX0xMU0NfV0FSKSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fKAorCQkiCS5zZXQJbm9yZW9yZGVyCSMgX19yYXdfcmVhZF90cnlsb2NrCVxuIgorCQkiCWxpCSUyLCAwCQkJCQlcbiIKKwkJIjE6CWxsCSUxLCAlMwkJCQkJXG4iCisJCSIJYm5legklMSwgMmYJCQkJCVxuIgorCQkiCSBhZGR1CSUxLCAxCQkJCQlcbiIKKwkJIglzYwklMSwgJTAJCQkJCVxuIgorCQkiCWJlcXpsCSUxLCAxYgkJCQkJXG4iCisJCSIJLnNldAlyZW9yZGVyCQkJCQlcbiIKKyNpZmRlZiBDT05GSUdfU01QCisJCSIJIHN5bmMJCQkJCQlcbiIKKyNlbmRpZgorCQkiCWxpCSUyLCAxCQkJCQlcbiIKKwkJIjI6CQkJCQkJCVxuIgorCQk6ICI9bSIgKHJ3LT5sb2NrKSwgIj0mciIgKHRtcCksICI9JnIiIChyZXQpCisJCTogIm0iIChydy0+bG9jaykKKwkJOiAibWVtb3J5Iik7CisJfSBlbHNlIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSIJLnNldAlub3Jlb3JkZXIJIyBfX3Jhd19yZWFkX3RyeWxvY2sJXG4iCisJCSIJbGkJJTIsIDAJCQkJCVxuIgorCQkiMToJbGwJJTEsICUzCQkJCQlcbiIKKwkJIglibmV6CSUxLCAyZgkJCQkJXG4iCisJCSIJIGFkZHUJJTEsIDEJCQkJCVxuIgorCQkiCXNjCSUxLCAlMAkJCQkJXG4iCisJCSIJYmVxegklMSwgMWIJCQkJCVxuIgorCQkiCS5zZXQJcmVvcmRlcgkJCQkJXG4iCisjaWZkZWYgQ09ORklHX1NNUAorCQkiCSBzeW5jCQkJCQkJXG4iCisjZW5kaWYKKwkJIglsaQklMiwgMQkJCQkJXG4iCisJCSIyOgkJCQkJCQlcbiIKKwkJOiAiPW0iIChydy0+bG9jayksICI9JnIiICh0bXApLCAiPSZyIiAocmV0KQorCQk6ICJtIiAocnctPmxvY2spCisJCTogIm1lbW9yeSIpOworCX0KKworCXJldHVybiByZXQ7Cit9CiAKIHN0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3dyaXRlX3RyeWxvY2socmF3X3J3bG9ja190ICpydykKIHsKQEAgLTI4Myw0ICszMjcsNSBAQAogCXJldHVybiByZXQ7CiB9CiAKKwogI2VuZGlmIC8qIF9BU01fU1BJTkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy90aW1leC5oIGIvaW5jbHVkZS9hc20tbWlwcy90aW1leC5oCmluZGV4IDk4YWE3MzcuLmI4MGRlOGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvdGltZXguaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL3RpbWV4LmgKQEAgLTgsNiArOCw4IEBACiAjaWZuZGVmIF9BU01fVElNRVhfSAogI2RlZmluZSBfQVNNX1RJTUVYX0gKIAorI2lmZGVmIF9fS0VSTkVMX18KKwogI2luY2x1ZGUgPGFzbS9taXBzcmVncy5oPgogCiAvKgpAQCAtNTEsNCArNTMsNiBAQAogCXJldHVybiByZWFkX2MwX2NvdW50KCk7CiB9CiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKICNlbmRpZiAvKiAgX0FTTV9USU1FWF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tbWlwcy91bmlzdGQuaAppbmRleCA2MTBjY2I4Li5jMzkxNDI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdW5pc3RkLmgKQEAgLTMxMyw3ICszMTMsNyBAQAogI2RlZmluZSBfX05SX21rbm9kYXQJCQkoX19OUl9MaW51eCArIDI5MCkKICNkZWZpbmUgX19OUl9mY2hvd25hdAkJCShfX05SX0xpbnV4ICsgMjkxKQogI2RlZmluZSBfX05SX2Z1dGltZXNhdAkJCShfX05SX0xpbnV4ICsgMjkyKQotI2RlZmluZSBfX05SX2ZzdGF0YXQJCQkoX19OUl9MaW51eCArIDI5MykKKyNkZWZpbmUgX19OUl9mc3RhdGF0NjQJCQkoX19OUl9MaW51eCArIDI5MykKICNkZWZpbmUgX19OUl91bmxpbmthdAkJCShfX05SX0xpbnV4ICsgMjk0KQogI2RlZmluZSBfX05SX3JlbmFtZWF0CQkJKF9fTlJfTGludXggKyAyOTUpCiAjZGVmaW5lIF9fTlJfbGlua2F0CQkJKF9fTlJfTGludXggKyAyOTYpCkBAIC0zMjksMTYgKzMyOSwxOCBAQAogI2RlZmluZSBfX05SX3RlZQkJCShfX05SX0xpbnV4ICsgMzA2KQogI2RlZmluZSBfX05SX3Ztc3BsaWNlCQkJKF9fTlJfTGludXggKyAzMDcpCiAjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJCShfX05SX0xpbnV4ICsgMzA4KQorI2RlZmluZSBfX05SX3NldF9yb2J1c3RfbGlzdAkJKF9fTlJfTGludXggKyAzMDkpCisjZGVmaW5lIF9fTlJfZ2V0X3JvYnVzdF9saXN0CQkoX19OUl9MaW51eCArIDMxMCkKIAogLyoKICAqIE9mZnNldCBvZiB0aGUgbGFzdCBMaW51eCBvMzIgZmxhdm91cmVkIHN5c2NhbGwKICAqLwotI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCQkzMDgKKyNkZWZpbmUgX19OUl9MaW51eF9zeXNjYWxscwkJMzEwCiAKICNlbmRpZiAvKiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX0FCSTMyICovCiAKICNkZWZpbmUgX19OUl9PMzJfTGludXgJCQk0MDAwCi0jZGVmaW5lIF9fTlJfTzMyX0xpbnV4X3N5c2NhbGxzCQkzMDgKKyNkZWZpbmUgX19OUl9PMzJfTGludXhfc3lzY2FsbHMJCTMxMAogCiAjaWYgX01JUFNfU0lNID09IF9NSVBTX1NJTV9BQkk2NAogCkBAIC01OTgsNyArNjAwLDcgQEAKICNkZWZpbmUgX19OUl9ta25vZGF0CQkJKF9fTlJfTGludXggKyAyNDkpCiAjZGVmaW5lIF9fTlJfZmNob3duYXQJCQkoX19OUl9MaW51eCArIDI1MCkKICNkZWZpbmUgX19OUl9mdXRpbWVzYXQJCQkoX19OUl9MaW51eCArIDI1MSkKLSNkZWZpbmUgX19OUl9mc3RhdGF0CQkJKF9fTlJfTGludXggKyAyNTIpCisjZGVmaW5lIF9fTlJfbmV3ZnN0YXRhdAkJCShfX05SX0xpbnV4ICsgMjUyKQogI2RlZmluZSBfX05SX3VubGlua2F0CQkJKF9fTlJfTGludXggKyAyNTMpCiAjZGVmaW5lIF9fTlJfcmVuYW1lYXQJCQkoX19OUl9MaW51eCArIDI1NCkKICNkZWZpbmUgX19OUl9saW5rYXQJCQkoX19OUl9MaW51eCArIDI1NSkKQEAgLTYxNCwxNiArNjE2LDE4IEBACiAjZGVmaW5lIF9fTlJfdGVlCQkJKF9fTlJfTGludXggKyAyNjUpCiAjZGVmaW5lIF9fTlJfdm1zcGxpY2UJCQkoX19OUl9MaW51eCArIDI2NikKICNkZWZpbmUgX19OUl9tb3ZlX3BhZ2VzCQkJKF9fTlJfTGludXggKyAyNjcpCisjZGVmaW5lIF9fTlJfc2V0X3JvYnVzdF9saXN0CQkoX19OUl9MaW51eCArIDI2OCkKKyNkZWZpbmUgX19OUl9nZXRfcm9idXN0X2xpc3QJCShfX05SX0xpbnV4ICsgMjY5KQogCiAvKgogICogT2Zmc2V0IG9mIHRoZSBsYXN0IExpbnV4IDY0LWJpdCBmbGF2b3VyZWQgc3lzY2FsbAogICovCi0jZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJCTI2NworI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCQkyNjkKIAogI2VuZGlmIC8qIF9NSVBTX1NJTSA9PSBfTUlQU19TSU1fQUJJNjQgKi8KIAogI2RlZmluZSBfX05SXzY0X0xpbnV4CQkJNTAwMAotI2RlZmluZSBfX05SXzY0X0xpbnV4X3N5c2NhbGxzCQkyNjcKKyNkZWZpbmUgX19OUl82NF9MaW51eF9zeXNjYWxscwkJMjY5CiAKICNpZiBfTUlQU19TSU0gPT0gX01JUFNfU0lNX05BQkkzMgogCkBAIC04ODcsNyArODkxLDcgQEAKICNkZWZpbmUgX19OUl9ta25vZGF0CQkJKF9fTlJfTGludXggKyAyNTMpCiAjZGVmaW5lIF9fTlJfZmNob3duYXQJCQkoX19OUl9MaW51eCArIDI1NCkKICNkZWZpbmUgX19OUl9mdXRpbWVzYXQJCQkoX19OUl9MaW51eCArIDI1NSkKLSNkZWZpbmUgX19OUl9mc3RhdGF0CQkJKF9fTlJfTGludXggKyAyNTYpCisjZGVmaW5lIF9fTlJfbmV3ZnN0YXRhdAkJCShfX05SX0xpbnV4ICsgMjU2KQogI2RlZmluZSBfX05SX3VubGlua2F0CQkJKF9fTlJfTGludXggKyAyNTcpCiAjZGVmaW5lIF9fTlJfcmVuYW1lYXQJCQkoX19OUl9MaW51eCArIDI1OCkKICNkZWZpbmUgX19OUl9saW5rYXQJCQkoX19OUl9MaW51eCArIDI1OSkKQEAgLTkwMywxNiArOTA3LDE4IEBACiAjZGVmaW5lIF9fTlJfdGVlCQkJKF9fTlJfTGludXggKyAyNjkpCiAjZGVmaW5lIF9fTlJfdm1zcGxpY2UJCQkoX19OUl9MaW51eCArIDI3MCkKICNkZWZpbmUgX19OUl9tb3ZlX3BhZ2VzCQkJKF9fTlJfTGludXggKyAyNzEpCisjZGVmaW5lIF9fTlJfc2V0X3JvYnVzdF9saXN0CQkoX19OUl9MaW51eCArIDI3MikKKyNkZWZpbmUgX19OUl9nZXRfcm9idXN0X2xpc3QJCShfX05SX0xpbnV4ICsgMjczKQogCiAvKgogICogT2Zmc2V0IG9mIHRoZSBsYXN0IE4zMiBmbGF2b3VyZWQgc3lzY2FsbAogICovCi0jZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJCTI3MQorI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCQkyNzMKIAogI2VuZGlmIC8qIF9NSVBTX1NJTSA9PSBfTUlQU19TSU1fTkFCSTMyICovCiAKICNkZWZpbmUgX19OUl9OMzJfTGludXgJCQk2MDAwCi0jZGVmaW5lIF9fTlJfTjMyX0xpbnV4X3N5c2NhbGxzCQkyNzEKKyNkZWZpbmUgX19OUl9OMzJfTGludXhfc3lzY2FsbHMJCTI3MwogCiAjaWZkZWYgX19LRVJORUxfXwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL3VzZXIuaCBiL2luY2x1ZGUvYXNtLW1pcHMvdXNlci5oCmluZGV4IDg5YmY4YjQuLjYxZjJhMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvdXNlci5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvdXNlci5oCkBAIC04LDYgKzgsOCBAQAogI2lmbmRlZiBfQVNNX1VTRVJfSAogI2RlZmluZSBfQVNNX1VTRVJfSAogCisjaWZkZWYgX19LRVJORUxfXworCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcmVnLmg+CiAKQEAgLTU1LDQgKzU3LDYgQEAKICNkZWZpbmUgSE9TVF9EQVRBX1NUQVJUX0FERFIJKHUuc3RhcnRfZGF0YSkKICNkZWZpbmUgSE9TVF9TVEFDS19FTkRfQUREUgkodS5zdGFydF9zdGFjayArIHUudV9zc2l6ZSAqIE5CUEcpCiAKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKICNlbmRpZiAvKiBfQVNNX1VTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tczM5MC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXMzOTAvdW5pc3RkLmgKaW5kZXggMDJiOTQyZC4uZDQ5YzU0YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tczM5MC91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1zMzkwL3VuaXN0ZC5oCkBAIC0zNDIsOSArMzQyLDExIEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKwogI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykJCQkgICAgIFwKIGRvIHsJCQkJCQkJICAgICBcCi0JaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtNDA5NSkpIHtcCisJaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtTUFYX0VSUk5PKSkgeyBcCiAJCWVycm5vID0gLShyZXMpOwkJCQkgICAgIFwKIAkJcmVzID0gLTE7CQkJCSAgICAgXAogCX0JCQkJCQkgICAgIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2FkZHJzcGFjZS5oIGIvaW5jbHVkZS9hc20tc2gvYWRkcnNwYWNlLmgKaW5kZXggNzIwYWZjMS4uYjg2MDIxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvYWRkcnNwYWNlLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvYWRkcnNwYWNlLmgKQEAgLTE0LDExICsxNCwxOSBAQAogI2luY2x1ZGUgPGFzbS9jcHUvYWRkcnNwYWNlLmg+CiAKIC8qIE1lbW9yeSBzZWdtZW50cyAoMzJiaXQgUHJpdmlsZWdlZCBtb2RlIGFkZHJlc3NlcykgICovCisjaWZuZGVmIENPTkZJR19DUFVfU0gyQQogI2RlZmluZSBQMFNFRwkJMHgwMDAwMDAwMAogI2RlZmluZSBQMVNFRwkJMHg4MDAwMDAwMAogI2RlZmluZSBQMlNFRwkJMHhhMDAwMDAwMAogI2RlZmluZSBQM1NFRwkJMHhjMDAwMDAwMAogI2RlZmluZSBQNFNFRwkJMHhlMDAwMDAwMAorI2Vsc2UKKyNkZWZpbmUgUDBTRUcJCTB4MDAwMDAwMDAKKyNkZWZpbmUgUDFTRUcJCTB4MDAwMDAwMDAKKyNkZWZpbmUgUDJTRUcJCTB4MjAwMDAwMDAKKyNkZWZpbmUgUDNTRUcJCTB4MDAwMDAwMDAKKyNkZWZpbmUgUDRTRUcgCQkweDgwMDAwMDAwCisjZW5kaWYKIAogLyogUmV0dXJucyB0aGUgcHJpdmlsZWdlZCBzZWdtZW50IGJhc2Ugb2YgYSBnaXZlbiBhZGRyZXNzICAqLwogI2RlZmluZSBQWFNFRyhhKQkoKCh1bnNpZ25lZCBsb25nKShhKSkgJiAweGUwMDAwMDAwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvYWR4L2lvLmggYi9pbmNsdWRlL2FzbS1zaC9hZHgvaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxMjI1Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9hZHgvaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS1zaC9pb19hZHguaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSBBJkQgQ28uLCBMdGQuCi0gKgotICogVGhpcyBmaWxlIG1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBJTyBmdW5jdGlvbnMgZm9yIGFuIEEmRCBBRFggQm9hcmQKLSAqLwotCi0jaWZuZGVmIF9BU01fU0hfSU9fQURYX0gKLSNkZWZpbmUgX0FTTV9TSF9JT19BRFhfSAotCi0jaW5jbHVkZSA8YXNtL2lvX2dlbmVyaWMuaD4KLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgYWR4X2luYih1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGFkeF9pbncodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgYWR4X2lubCh1bnNpZ25lZCBsb25nIHBvcnQpOwotCi1leHRlcm4gdm9pZCBhZHhfb3V0Yih1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHZvaWQgYWR4X291dHcodW5zaWduZWQgc2hvcnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdm9pZCBhZHhfb3V0bCh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIGFkeF9pbmJfcCh1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHZvaWQgYWR4X291dGJfcCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotCi1leHRlcm4gdm9pZCBhZHhfaW5zYih1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgYWR4X2luc3codW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIGFkeF9pbnNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBhZHhfb3V0c2IodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIGFkeF9vdXRzdyh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgYWR4X291dHNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIGFkeF9yZWFkYih1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGFkeF9yZWFkdyh1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBhZHhfcmVhZGwodW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB2b2lkIGFkeF93cml0ZWIodW5zaWduZWQgY2hhciBiLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHZvaWQgYWR4X3dyaXRldyh1bnNpZ25lZCBzaG9ydCBiLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHZvaWQgYWR4X3dyaXRlbCh1bnNpZ25lZCBpbnQgYiwgdW5zaWduZWQgbG9uZyBhZGRyKTsKLQotZXh0ZXJuIHZvaWQgKiBhZHhfaW9yZW1hcCh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKTsKLWV4dGVybiB2b2lkIGFkeF9pb3VubWFwKHZvaWQgKmFkZHIpOwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBhZHhfaXNhX3BvcnQyYWRkcih1bnNpZ25lZCBsb25nIG9mZnNldCk7Ci0KLWV4dGVybiB2b2lkIHNldHVwX2FkeCh2b2lkKTsKLWV4dGVybiB2b2lkIGluaXRfYWR4X0lSUSh2b2lkKTsKLQotI2lmZGVmIF9fV0FOVF9JT19ERUYKLQotI2RlZmluZSBfX2luYgkJYWR4X2luYgotI2RlZmluZSBfX2ludwkJYWR4X2ludwotI2RlZmluZSBfX2lubAkJYWR4X2lubAotI2RlZmluZSBfX291dGIJCWFkeF9vdXRiCi0jZGVmaW5lIF9fb3V0dwkJYWR4X291dHcKLSNkZWZpbmUgX19vdXRsCQlhZHhfb3V0bAotCi0jZGVmaW5lIF9faW5iX3AJCWFkeF9pbmJfcAotI2RlZmluZSBfX2lud19wCQlhZHhfaW53Ci0jZGVmaW5lIF9faW5sX3AJCWFkeF9pbmwKLSNkZWZpbmUgX19vdXRiX3AJYWR4X291dGJfcAotI2RlZmluZSBfX291dHdfcAlhZHhfb3V0dwotI2RlZmluZSBfX291dGxfcAlhZHhfb3V0bAotCi0jZGVmaW5lIF9faW5zYgkJYWR4X2luc2IKLSNkZWZpbmUgX19pbnN3CQlhZHhfaW5zdwotI2RlZmluZSBfX2luc2wJCWFkeF9pbnNsCi0jZGVmaW5lIF9fb3V0c2IJCWFkeF9vdXRzYgotI2RlZmluZSBfX291dHN3CQlhZHhfb3V0c3cKLSNkZWZpbmUgX19vdXRzbAkJYWR4X291dHNsCi0KLSNkZWZpbmUgX19yZWFkYgkJYWR4X3JlYWRiCi0jZGVmaW5lIF9fcmVhZHcJCWFkeF9yZWFkdwotI2RlZmluZSBfX3JlYWRsCQlhZHhfcmVhZGwKLSNkZWZpbmUgX193cml0ZWIJYWR4X3dyaXRlYgotI2RlZmluZSBfX3dyaXRldwlhZHhfd3JpdGV3Ci0jZGVmaW5lIF9fd3JpdGVsCWFkeF93cml0ZWwKLQotI2RlZmluZSBfX2lzYV9wb3J0MmFkZHIJYWR4X2lzYV9wb3J0MmFkZHIKLSNkZWZpbmUgX19pb3JlbWFwCWFkeF9pb3JlbWFwCi0jZGVmaW5lIF9faW91bm1hcAlhZHhfaW91bm1hcAotCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9BU01fU0hfSU9fQUFORERfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvYXBtLmggYi9pbmNsdWRlL2FzbS1zaC9hcG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjA5MWU5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvYXBtLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDA2IChjKSBBbmRyaXkgU2t1bHlzaCA8YXNrdWx5c2hAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fQVNNX1NIX0FQTV9ICisjZGVmaW5lIF9fQVNNX1NIX0FQTV9ICisKKyNkZWZpbmUgQVBNX0FDX09GRkxJTkUJCQkwCisjZGVmaW5lIEFQTV9BQ19PTkxJTkUJCQkxCisjZGVmaW5lIEFQTV9BQ19CQUNLVVAJCQkyCisjZGVmaW5lIEFQTV9BQ19VTktOT1dOCQkJMHhmZgorCisjZGVmaW5lIEFQTV9CQVRURVJZX1NUQVRVU19ISUdICQkwCisjZGVmaW5lIEFQTV9CQVRURVJZX1NUQVRVU19MT1cJCTEKKyNkZWZpbmUgQVBNX0JBVFRFUllfU1RBVFVTX0NSSVRJQ0FMCTIKKyNkZWZpbmUgQVBNX0JBVFRFUllfU1RBVFVTX0NIQVJHSU5HCTMKKyNkZWZpbmUgQVBNX0JBVFRFUllfU1RBVFVTX05PVF9QUkVTRU5UCTQKKyNkZWZpbmUgQVBNX0JBVFRFUllfU1RBVFVTX1VOS05PV04JMHhmZgorCisjZGVmaW5lIEFQTV9CQVRURVJZX0xJRkVfVU5LTk9XTgkweEZGRkYKKyNkZWZpbmUgQVBNX0JBVFRFUllfTElGRV9NSU5VVEVTCTB4ODAwMAorI2RlZmluZSBBUE1fQkFUVEVSWV9MSUZFX1ZBTFVFX01BU0sJMHg3RkZGCisKKyNkZWZpbmUgQVBNX0JBVFRFUllfRkxBR19ISUdICQkoMSA8PCAwKQorI2RlZmluZSBBUE1fQkFUVEVSWV9GTEFHX0xPVwkJKDEgPDwgMSkKKyNkZWZpbmUgQVBNX0JBVFRFUllfRkxBR19DUklUSUNBTAkoMSA8PCAyKQorI2RlZmluZSBBUE1fQkFUVEVSWV9GTEFHX0NIQVJHSU5HCSgxIDw8IDMpCisjZGVmaW5lIEFQTV9CQVRURVJZX0ZMQUdfTk9UX1BSRVNFTlQJKDEgPDwgNykKKyNkZWZpbmUgQVBNX0JBVFRFUllfRkxBR19VTktOT1dOCTB4ZmYKKworI2RlZmluZSBBUE1fVU5JVFNfTUlOUwkJCTAKKyNkZWZpbmUgQVBNX1VOSVRTX1NFQ1MJCQkxCisjZGVmaW5lIEFQTV9VTklUU19VTktOT1dOCQktMQorCisKK2V4dGVybiBpbnQgKCphcG1fZ2V0X2luZm8pKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBmcG9zLCBpbnQgbGVuZ3RoKTsKK2V4dGVybiBpbnQgYXBtX3N1c3BlbmRlZDsKKwordm9pZCBhcG1fcXVldWVfZXZlbnQoYXBtX2V2ZW50X3QgZXZlbnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2F0b21pYy5oIGIvaW5jbHVkZS9hc20tc2gvYXRvbWljLmgKaW5kZXggZmI2MjdkZS4uOGJkYzFiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvYXRvbWljLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvYXRvbWljLmgKQEAgLTE0LDYgKzE0LDcgQEAKICNkZWZpbmUgYXRvbWljX3JlYWQodikJCSgodiktPmNvdW50ZXIpCiAjZGVmaW5lIGF0b21pY19zZXQodixpKQkJKCh2KS0+Y291bnRlciA9IChpKSkKIAorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCiAvKgpAQCAtMjEsNDkgKzIyLDExMCBAQAogICogZm9yd2FyZCB0byBjb2RlIGF0IHRoZSBlbmQgb2YgdGhpcyBvYmplY3QncyAudGV4dCBzZWN0aW9uLCB0aGVuCiAgKiBicmFuY2ggYmFjayB0byByZXN0YXJ0IHRoZSBvcGVyYXRpb24uCiAgKi8KLQotc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfYWRkKGludCBpLCBhdG9taWNfdCAqIHYpCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2FkZChpbnQgaSwgYXRvbWljX3QgKnYpCiB7CisjaWZkZWYgQ09ORklHX0NQVV9TSDRBCisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisiMToJbW92bGkubCBAJTMsICUwCQkhIGF0b21pY19hZGQJXG4iCisiCWFkZAklMiwgJTAJCQkJXG4iCisiCW1vdmNvLmwJJTAsIEAlMwkJCQlcbiIKKyIJYmYJMWIJCQkJXG4iCisJOiAiPSZ6IiAodG1wKSwgIj1yIiAoJnYtPmNvdW50ZXIpCisJOiAiciIgKGkpLCAiciIgKCZ2LT5jb3VudGVyKQorCTogInQiKTsKKyNlbHNlCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkqKGxvbmcgKil2ICs9IGk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworI2VuZGlmCiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgYXRvbWljX3QgKnYpCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX3N1YihpbnQgaSwgYXRvbWljX3QgKnYpCiB7CisjaWZkZWYgQ09ORklHX0NQVV9TSDRBCisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisiMToJbW92bGkubCBAJTMsICUwCQkhIGF0b21pY19zdWIJXG4iCisiCXN1YgklMiwgJTAJCQkJXG4iCisiCW1vdmNvLmwJJTAsIEAlMwkJCQlcbiIKKyIJYmYJMWIJCQkJXG4iCisJOiAiPSZ6IiAodG1wKSwgIj1yIiAoJnYtPmNvdW50ZXIpCisJOiAiciIgKGkpLCAiciIgKCZ2LT5jb3VudGVyKQorCTogInQiKTsKKyNlbHNlCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkqKGxvbmcgKil2IC09IGk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworI2VuZGlmCiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCBhdG9taWNfYWRkX3JldHVybihpbnQgaSwgYXRvbWljX3QgKiB2KQorLyoKKyAqIFNILTRBIG5vdGU6CisgKgorICogV2UgYmFzaWNhbGx5IGdldCBhdG9taWNfeHh4X3JldHVybigpIGZvciBmcmVlIGNvbXBhcmVkIHdpdGgKKyAqIGF0b21pY194eHgoKS4gbW92bGkubC9tb3Zjby5sIHJlcXVpcmUgcjAgZHVlIHRvIHRoZSBpbnN0cnVjdGlvbgorICogZW5jb2RpbmcsIHNvIHRoZSByZXR2YWwgaXMgYXV0b21hdGljYWxseSBzZXQgd2l0aG91dCBoYXZpbmcgdG8KKyAqIGRvIGFueSBzcGVjaWFsIHdvcmsuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19hZGRfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqdikKIHsKLQl1bnNpZ25lZCBsb25nIHRlbXAsIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdGVtcDsKKworI2lmZGVmIENPTkZJR19DUFVfU0g0QQorCV9fYXNtX18gX192b2xhdGlsZV9fICgKKyIxOgltb3ZsaS5sIEAlMywgJTAJCSEgYXRvbWljX2FkZF9yZXR1cm4JXG4iCisiCWFkZAklMiwgJTAJCQkJCVxuIgorIgltb3Zjby5sCSUwLCBAJTMJCQkJCVxuIgorIgliZgkxYgkJCQkJXG4iCisiCXN5bmNvCQkJCQkJXG4iCisJOiAiPSZ6IiAodGVtcCksICI9ciIgKCZ2LT5jb3VudGVyKQorCTogInIiIChpKSwgInIiICgmdi0+Y291bnRlcikKKwk6ICJ0Iik7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJdGVtcCA9ICoobG9uZyAqKXY7CiAJdGVtcCArPSBpOwogCSoobG9uZyAqKXYgPSB0ZW1wOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyNlbmRpZgogCiAJcmV0dXJuIHRlbXA7CiB9CiAKICNkZWZpbmUgYXRvbWljX2FkZF9uZWdhdGl2ZShhLCB2KQkoYXRvbWljX2FkZF9yZXR1cm4oKGEpLCAodikpIDwgMCkKIAotc3RhdGljIF9faW5saW5lX18gaW50IGF0b21pY19zdWJfcmV0dXJuKGludCBpLCBhdG9taWNfdCAqIHYpCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfc3ViX3JldHVybihpbnQgaSwgYXRvbWljX3QgKnYpCiB7Ci0JdW5zaWduZWQgbG9uZyB0ZW1wLCBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHRlbXA7CisKKyNpZmRlZiBDT05GSUdfQ1BVX1NINEEKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisiMToJbW92bGkubCBAJTMsICUwCQkhIGF0b21pY19zdWJfcmV0dXJuCVxuIgorIglzdWIJJTIsICUwCQkJCQlcbiIKKyIJbW92Y28ubAklMCwgQCUzCQkJCQlcbiIKKyIJYmYJMWIJCQkJCVxuIgorIglzeW5jbwkJCQkJCVxuIgorCTogIj0meiIgKHRlbXApLCAiPXIiICgmdi0+Y291bnRlcikKKwk6ICJyIiAoaSksICJyIiAoJnYtPmNvdW50ZXIpCisJOiAidCIpOworI2Vsc2UKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXRlbXAgPSAqKGxvbmcgKil2OwogCXRlbXAgLT0gaTsKIAkqKGxvbmcgKil2ID0gdGVtcDsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisjZW5kaWYKIAogCXJldHVybiB0ZW1wOwogfQpAQCAtMTE4LDIyICsxODAsNDggQEAKIH0KICNkZWZpbmUgYXRvbWljX2luY19ub3RfemVybyh2KSBhdG9taWNfYWRkX3VubGVzcygodiksIDEsIDApCiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgYXRvbWljX2NsZWFyX21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICp2KQorc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19jbGVhcl9tYXNrKHVuc2lnbmVkIGludCBtYXNrLCBhdG9taWNfdCAqdikKIHsKKyNpZmRlZiBDT05GSUdfQ1BVX1NINEEKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKyIxOgltb3ZsaS5sIEAlMywgJTAJCSEgYXRvbWljX2NsZWFyX21hc2sJXG4iCisiCWFuZAklMiwgJTAJCQkJCVxuIgorIgltb3Zjby5sCSUwLCBAJTMJCQkJCVxuIgorIgliZgkxYgkJCQkJXG4iCisJOiAiPSZ6IiAodG1wKSwgIj1yIiAoJnYtPmNvdW50ZXIpCisJOiAiciIgKH5tYXNrKSwgInIiICgmdi0+Y291bnRlcikKKwk6ICJ0Iik7CisjZWxzZQogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJKihsb25nICopdiAmPSB+bWFzazsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisjZW5kaWYKIH0KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBhdG9taWNfc2V0X21hc2sodW5zaWduZWQgaW50IG1hc2ssIGF0b21pY190ICp2KQorc3RhdGljIGlubGluZSB2b2lkIGF0b21pY19zZXRfbWFzayh1bnNpZ25lZCBpbnQgbWFzaywgYXRvbWljX3QgKnYpCiB7CisjaWZkZWYgQ09ORklHX0NQVV9TSDRBCisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisiMToJbW92bGkubCBAJTMsICUwCQkhIGF0b21pY19zZXRfbWFzawlcbiIKKyIJb3IJJTIsICUwCQkJCQlcbiIKKyIJbW92Y28ubAklMCwgQCUzCQkJCQlcbiIKKyIJYmYJMWIJCQkJCVxuIgorCTogIj0meiIgKHRtcCksICI9ciIgKCZ2LT5jb3VudGVyKQorCTogInIiIChtYXNrKSwgInIiICgmdi0+Y291bnRlcikKKwk6ICJ0Iik7CisjZWxzZQogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJKihsb25nICopdiB8PSBtYXNrOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKyNlbmRpZgogfQogCiAvKiBBdG9taWMgb3BlcmF0aW9ucyBhcmUgYWxyZWFkeSBzZXJpYWxpemluZyBvbiBTSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvYXV4dmVjLmggYi9pbmNsdWRlL2FzbS1zaC9hdXh2ZWMuaAppbmRleCBmYzIxZTRkLi4xYjY5MTZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9hdXh2ZWMuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9hdXh2ZWMuaApAQCAtMSw0ICsxLDE4IEBACiAjaWZuZGVmIF9fQVNNX1NIX0FVWFZFQ19ICiAjZGVmaW5lIF9fQVNNX1NIX0FVWFZFQ19ICiAKKy8qCisgKiBBcmNoaXRlY3R1cmUtbmV1dHJhbCBBVF8gdmFsdWVzIGluIDAtMTcsIGxlYXZlIHNvbWUgcm9vbQorICogZm9yIG1vcmUgb2YgdGhlbS4KKyAqLworCisjaWZkZWYgQ09ORklHX1ZTWVNDQUxMCisvKgorICogT25seSBkZWZpbmUgdGhpcyBpbiB0aGUgdnN5c2NhbGwgY2FzZSwgdGhlIGVudHJ5IHBvaW50IHRvCisgKiB0aGUgdnN5c2NhbGwgcGFnZSBnZXRzIHBsYWNlZCBoZXJlLiBUaGUga2VybmVsIHdpbGwgYXR0ZW1wdAorICogdG8gYnVpbGQgYSBnYXRlIFZNQSB3ZSBkb24ndCBjYXJlIGFib3V0IG90aGVyd2lzZS4uCisgKi8KKyNkZWZpbmUgQVRfU1lTSU5GT19FSERSCQkzMworI2VuZGlmCisKICNlbmRpZiAvKiBfX0FTTV9TSF9BVVhWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvYml0b3BzLmggYi9pbmNsdWRlL2FzbS1zaC9iaXRvcHMuaAppbmRleCBlMzRmODI1Li4xYzE2NzkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9iaXRvcHMuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9iaXRvcHMuaApAQCAtNiw3ICs2LDcgQEAKIC8qIEZvciBfX3N3YWIzMiAqLwogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAotc3RhdGljIF9faW5saW5lX18gdm9pZCBzZXRfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqIGFkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKQogewogCWludAltYXNrOwogCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9IGFkZHI7CkBAIC0yNCw3ICsyNCw3IEBACiAgKi8KICNkZWZpbmUgc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCkJYmFycmllcigpCiAjZGVmaW5lIHNtcF9tYl9fYWZ0ZXJfY2xlYXJfYml0KCkJYmFycmllcigpCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGNsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKQorc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKQogewogCWludAltYXNrOwogCXZvbGF0aWxlIHVuc2lnbmVkIGludCAqYSA9IGFkZHI7CkBAIC0zNyw3ICszNyw3IEBACiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGNoYW5nZV9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICogYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGFuZ2VfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqIGFkZHIpCiB7CiAJaW50CW1hc2s7CiAJdm9sYXRpbGUgdW5zaWduZWQgaW50ICphID0gYWRkcjsKQEAgLTUwLDcgKzUwLDcgQEAKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCB0ZXN0X2FuZF9zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqIGFkZHIpCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X2FuZF9zZXRfYml0KGludCBuciwgdm9sYXRpbGUgdm9pZCAqIGFkZHIpCiB7CiAJaW50CW1hc2ssIHJldHZhbDsKIAl2b2xhdGlsZSB1bnNpZ25lZCBpbnQgKmEgPSBhZGRyOwpAQCAtNjYsNyArNjYsNyBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyBfX2lubGluZV9fIGludCB0ZXN0X2FuZF9jbGVhcl9iaXQoaW50IG5yLCB2b2xhdGlsZSB2b2lkICogYWRkcikKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfYW5kX2NsZWFyX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKQogewogCWludAltYXNrLCByZXR2YWw7CiAJdm9sYXRpbGUgdW5zaWduZWQgaW50ICphID0gYWRkcjsKQEAgLTgyLDcgKzgyLDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyBpbnQgdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKQorc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfY2hhbmdlX2JpdChpbnQgbnIsIHZvbGF0aWxlIHZvaWQgKiBhZGRyKQogewogCWludAltYXNrLCByZXR2YWw7CiAJdm9sYXRpbGUgdW5zaWduZWQgaW50ICphID0gYWRkcjsKQEAgLTEwMCw3ICsxMDAsNyBAQAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL25vbi1hdG9taWMuaD4KIAotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBmZnoodW5zaWduZWQgbG9uZyB3b3JkKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGZmeih1bnNpZ25lZCBsb25nIHdvcmQpCiB7CiAJdW5zaWduZWQgbG9uZyByZXN1bHQ7CiAKQEAgLTEyMCw3ICsxMjAsNyBAQAogICoKICAqIFVuZGVmaW5lZCBpZiBubyBiaXQgZXhpc3RzLCBzbyBjb2RlIHNob3VsZCBjaGVjayBhZ2FpbnN0IDAgZmlyc3QuCiAgKi8KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgX19mZnModW5zaWduZWQgbG9uZyB3b3JkKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fZmZzKHVuc2lnbmVkIGxvbmcgd29yZCkKIHsKIAl1bnNpZ25lZCBsb25nIHJlc3VsdDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvYnVncy5oIGIvaW5jbHVkZS9hc20tc2gvYnVncy5oCmluZGV4IGE2ZGUzZDAuLmI0MDAwYzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2J1Z3MuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9idWdzLmgKQEAgLTMyLDYgKzMyLDEwIEBACiAJY2FzZSBDUFVfU0g3NzUwIC4uLiBDUFVfU0g0XzUwMToKIAkJKnArKyA9ICc0JzsKIAkJYnJlYWs7CisJY2FzZSBDUFVfU0g3NzcwIC4uLiBDUFVfU0g3NzgxOgorCQkqcCsrID0gJzQnOworCQkqcCsrID0gJ2EnOworCQlicmVhazsKIAlkZWZhdWx0OgogCQkqcCsrID0gJz8nOwogCQkqcCsrID0gJyEnOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY2FjaGUuaCBiL2luY2x1ZGUvYXNtLXNoL2NhY2hlLmgKaW5kZXggNjU2ZmRmZS4uZTNhMTgwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY2FjaGUuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jYWNoZS5oCkBAIC0xMCw3ICsxMCw2IEBACiAjaWZkZWYgX19LRVJORUxfXwogCiAjaW5jbHVkZSA8YXNtL2NwdS9jYWNoZS5oPgotI2luY2x1ZGUgPGFzbS9jcHUvY2FjaGVmbHVzaC5oPgogCiAjZGVmaW5lIFNIX0NBQ0hFX1ZBTElECQkxCiAjZGVmaW5lIFNIX0NBQ0hFX1VQREFURUQJMgpAQCAtMjMsMjQgKzIyLDMxIEBACiAjZGVmaW5lIEwxX0NBQ0hFX0FMSUdOKHgpCSgoKHgpKyhMMV9DQUNIRV9CWVRFUy0xKSkmfihMMV9DQUNIRV9CWVRFUy0xKSkKIAogc3RydWN0IGNhY2hlX2luZm8gewotCXVuc2lnbmVkIGludCB3YXlzOwotCXVuc2lnbmVkIGludCBzZXRzOwotCXVuc2lnbmVkIGludCBsaW5lc3o7CisJdW5zaWduZWQgaW50IHdheXM7CQkvKiBOdW1iZXIgb2YgY2FjaGUgd2F5cyAqLworCXVuc2lnbmVkIGludCBzZXRzOwkJLyogTnVtYmVyIG9mIGNhY2hlIHNldHMgKi8KKwl1bnNpZ25lZCBpbnQgbGluZXN6OwkJLyogQ2FjaGUgbGluZSBzaXplIChieXRlcykgKi8KIAorCXVuc2lnbmVkIGludCB3YXlfc2l6ZTsJCS8qIHNldHMgKiBsaW5lIHNpemUgKi8KKworCS8qCisJICogd2F5X2luY3IgaXMgdGhlIGFkZHJlc3Mgb2Zmc2V0IGZvciBhY2Nlc3NpbmcgdGhlIG5leHQgd2F5CisJICogaW4gbWVtb3J5IG1hcHBlZCBjYWNoZSBhcnJheSBvcHMuCisJICovCiAJdW5zaWduZWQgaW50IHdheV9pbmNyOwotCiAJdW5zaWduZWQgaW50IGVudHJ5X3NoaWZ0OwogCXVuc2lnbmVkIGludCBlbnRyeV9tYXNrOwogCisJLyoKKwkgKiBDb21wdXRlIGEgbWFzayB3aGljaCBzZWxlY3RzIHRoZSBhZGRyZXNzIGJpdHMgd2hpY2ggb3ZlcmxhcCBiZXR3ZWVuCisJICogMS4gdGhvc2UgdXNlZCB0byBzZWxlY3QgdGhlIGNhY2hlIHNldCBkdXJpbmcgaW5kZXhpbmcKKwkgKiAyLiB0aG9zZSBpbiB0aGUgcGh5c2ljYWwgcGFnZSBudW1iZXIuCisJICovCisJdW5zaWduZWQgaW50IGFsaWFzX21hc2s7CisKKwl1bnNpZ25lZCBpbnQgbl9hbGlhc2VzOwkJLyogTnVtYmVyIG9mIGFsaWFzZXMgKi8KKwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiB9OwogCi0vKiBGbHVzaCAod3JpdGUtYmFjayBvbmx5KSBhIHJlZ2lvbiAoc21hbGxlciB0aGFuIGEgcGFnZSkgKi8KLWV4dGVybiB2b2lkIF9fZmx1c2hfd2JhY2tfcmVnaW9uKHZvaWQgKnN0YXJ0LCBpbnQgc2l6ZSk7Ci0vKiBGbHVzaCAod3JpdGUtYmFjayAmIGludmFsaWRhdGUpIGEgcmVnaW9uIChzbWFsbGVyIHRoYW4gYSBwYWdlKSAqLwotZXh0ZXJuIHZvaWQgX19mbHVzaF9wdXJnZV9yZWdpb24odm9pZCAqc3RhcnQsIGludCBzaXplKTsKLS8qIEZsdXNoIChpbnZhbGlkYXRlIG9ubHkpIGEgcmVnaW9uIChzbWFsbGVyIHRoYW4gYSBwYWdlKSAqLwotZXh0ZXJuIHZvaWQgX19mbHVzaF9pbnZhbGlkYXRlX3JlZ2lvbih2b2lkICpzdGFydCwgaW50IHNpemUpOwotCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNNX1NIX0NBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NhY2hlZmx1c2guaCBiL2luY2x1ZGUvYXNtLXNoL2NhY2hlZmx1c2guaAppbmRleCA5ZGZiMzNlLi4wN2Y2MmVjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY2FjaGVmbHVzaC5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfX0FTTV9TSF9DQUNIRUZMVVNIX0gKICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGFzbS9jcHUvY2FjaGVmbHVzaC5oPgogCiAvKiBGbHVzaCAod3JpdGUtYmFjayBvbmx5KSBhIHJlZ2lvbiAoc21hbGxlciB0aGFuIGEgcGFnZSkgKi8KQEAgLTI3LDUgKzI4LDcgQEAKIAkJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOwkJCQlcCiAJfSB3aGlsZSAoMCkKIAorI2RlZmluZSBIQVZFX0FSQ0hfVU5NQVBQRURfQVJFQQorCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNNX1NIX0NBQ0hFRkxVU0hfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY2F0Njg3MDEvaW8uaCBiL2luY2x1ZGUvYXNtLXNoL2NhdDY4NzAxL2lvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1M2I4NDYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvY2F0Njg3MDEvaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS1zaC9pb19jYXQ2ODcwMS5oCi0gKgotICogQ29weXJpZ2h0IDIwMDAgU3R1YXJ0IE1lbmVmeSAoc3R1YXJ0Lm1lbmVmeUBzdC5jb20pCi0gKiAgICAgICAgICAgMjAwMSBZdXRhcm91IEViaWhhciAoZWJpaGFyYUBzaS1saW51eC5jb20pCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIElPIGZ1bmN0aW9ucyBmb3IgYW4gQU9ORSBDb3JwLiBDQVQtNjg3MDEgU0g3NzA4IEJvcmFkCi0gKi8KLQotI2lmbmRlZiBfQVNNX1NIX0lPX0NBVDY4NzAxX0gKLSNkZWZpbmUgX0FTTV9TSF9JT19DQVQ2ODcwMV9ICi0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGNhdDY4NzAxX2lzYV9wb3J0MmFkZHIodW5zaWduZWQgbG9uZyBvZmZzZXQpOwotZXh0ZXJuIGludCBjYXQ2ODcwMV9pcnFfZGVtdXgoaW50IGlycSk7Ci0KLWV4dGVybiB2b2lkIGluaXRfY2F0Njg3MDFfSVJRKHZvaWQpOwotZXh0ZXJuIHZvaWQgaGVhcnRiZWF0X2NhdDY4NzAxKHZvaWQpOwotCi0jZW5kaWYgLyogX0FTTV9TSF9JT19DQVQ2ODcwMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jaGVja3N1bS5oIGIvaW5jbHVkZS9hc20tc2gvY2hlY2tzdW0uaAppbmRleCBmYTAzYjMwLi4wODE2OGFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NoZWNrc3VtLmgKQEAgLTE1OSw2ICsxNTksNyBAQAogfQogCiAjZGVmaW5lIF9IQVZFX0FSQ0hfSVBWNl9DU1VNCisjaWZkZWYgQ09ORklHX0lQVjYKIHN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIHNob3J0IGludCBjc3VtX2lwdjZfbWFnaWMoc3RydWN0IGluNl9hZGRyICpzYWRkciwKIAkJCQkJCSAgICAgc3RydWN0IGluNl9hZGRyICpkYWRkciwKIAkJCQkJCSAgICAgX191MzIgbGVuLApAQCAtMTk0LDYgKzE5NSw3IEBACiAKIAlyZXR1cm4gY3N1bV9mb2xkKHN1bSk7CiB9CisjZW5kaWYKIAogLyogCiAgKglDb3B5IGFuZCBjaGVja3N1bSB0byB1c2VyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtZmVhdHVyZXMuaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1mZWF0dXJlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiY2NkN2MwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LWZlYXR1cmVzLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfX0FTTV9TSF9DUFVfRkVBVFVSRVNfSAorI2RlZmluZSBfX0FTTV9TSF9DUFVfRkVBVFVSRVNfSAorCisvKgorICogUHJvY2Vzc29yIGZsYWdzCisgKgorICogTm90ZTogV2hlbiBhZGRpbmcgYSBuZXcgZmxhZywga2VlcCBjcHVfZmxhZ3NbXSBpbgorICogYXJjaC9zaC9rZXJuZWwvc2V0dXAuYyBpbiBzeW5jIHNvIHN5bWJvbGljIG5hbWUKKyAqIG1hcHBpbmcgb2YgdGhlIHByb2Nlc3NvciBmbGFncyBoYXMgYSBjaGFuY2Ugb2YgYmVpbmcKKyAqIHJlYXNvbmFibHkgYWNjdXJhdGUuCisgKgorICogVGhlc2UgZmxhZ3MgYXJlIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlIEVMRgorICogYXV4aWxpYXJ5IHZlY3RvciBhcyBBVF9IV0NBUC4KKyAqLworI2RlZmluZSBDUFVfSEFTX0ZQVQkJMHgwMDAxCS8qIEhhcmR3YXJlIEZQVSBzdXBwb3J0ICovCisjZGVmaW5lIENQVV9IQVNfUDJfRkxVU0hfQlVHCTB4MDAwMgkvKiBOZWVkIHRvIGZsdXNoIHRoZSBjYWNoZSBpbiBQMiBhcmVhICovCisjZGVmaW5lIENQVV9IQVNfTU1VX1BBR0VfQVNTT0MJMHgwMDA0CS8qIFNIMzogVExCIHdheSBzZWxlY3Rpb24gYml0IHN1cHBvcnQgKi8KKyNkZWZpbmUgQ1BVX0hBU19EU1AJCTB4MDAwOAkvKiBTSC1EU1A6IERTUCBzdXBwb3J0ICovCisjZGVmaW5lIENQVV9IQVNfUEVSRl9DT1VOVEVSCTB4MDAxMAkvKiBIYXJkd2FyZSBwZXJmb3JtYW5jZSBjb3VudGVycyAqLworI2RlZmluZSBDUFVfSEFTX1BURUEJCTB4MDAyMAkvKiBQVEVBIHJlZ2lzdGVyICovCisjZGVmaW5lIENQVV9IQVNfTExTQwkJMHgwMDQwCS8qIG1vdmxpLmwvbW92Y28ubCAqLworI2RlZmluZSBDUFVfSEFTX0wyX0NBQ0hFCTB4MDA4MAkvKiBTZWNvbmRhcnkgY2FjaGUgLyBVUkFNICovCisKKyNlbmRpZiAvKiBfX0FTTV9TSF9DUFVfRkVBVFVSRVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMi9zaG1wYXJhbS5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMi9zaG1wYXJhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTdjMTgyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDIvc2htcGFyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS1zaC9jcHUtc2gyL3NobXBhcmFtLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFBhdWwgTXVuZHQKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBfX0FTTV9DUFVfU0gyX1NITVBBUkFNX0gKLSNkZWZpbmUgX19BU01fQ1BVX1NIMl9TSE1QQVJBTV9ICi0KLSNkZWZpbmUJU0hNTEJBIFBBR0VfU0laRQkJIC8qIGF0dGFjaCBhZGRyIGEgbXVsdGlwbGUgb2YgdGhpcyAqLwotCi0jZW5kaWYgLyogX19BU01fQ1BVX1NIMl9TSE1QQVJBTV9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvY2FjaGUuaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvY2FjaGUuaAppbmRleCA0MDZhYThkLi5mZmUwOGQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL2NhY2hlLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy9jYWNoZS5oCkBAIC0yNiwxMiArMjYsMTAgQEAKICNkZWZpbmUgQ0NSX0NBQ0hFX0VOQUJMRQlDQ1JfQ0FDSEVfQ0UKICNkZWZpbmUgQ0NSX0NBQ0hFX0lOVkFMSURBVEUJQ0NSX0NBQ0hFX0NGCiAKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApCiAjZGVmaW5lIENDUjMJMHhhNDAwMDBiNAogI2RlZmluZSBDQ1JfQ0FDSEVfMTZLQiAgMHgwMDAxMDAwMAogI2RlZmluZSBDQ1JfQ0FDSEVfMzJLQgkweDAwMDIwMDAwCiAjZW5kaWYKIAotCiAjZW5kaWYgLyogX19BU01fQ1BVX1NIM19DQUNIRV9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy9jYWNoZWZsdXNoLmgKaW5kZXggZjUxYWVkMC4uMDNmZGU5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy9jYWNoZWZsdXNoLmgKQEAgLTEwLDcgKzEwLDcgQEAKICNpZm5kZWYgX19BU01fQ1BVX1NIM19DQUNIRUZMVVNIX0gKICNkZWZpbmUgX19BU01fQ1BVX1NIM19DQUNIRUZMVVNIX0gKIAotLyogCisvKgogICogQ2FjaGUgZmx1c2hpbmc6CiAgKgogICogIC0gZmx1c2hfY2FjaGVfYWxsKCkgZmx1c2hlcyBlbnRpcmUgY2FjaGUKQEAgLTM1LDUzICszNSwzMyBAQAogIC8qIDMyS0IgY2FjaGUsIDRrYiBQQUdFIHNpemVzIG5lZWQgdG8gY2hlY2sgYml0IDEyICovCiAjZGVmaW5lIENBQ0hFX0FMSUFTIDB4MDAwMDEwMDAKIAotc3RydWN0IHBhZ2U7Ci1zdHJ1Y3QgbW1fc3RydWN0Owotc3RydWN0IHZtX2FyZWFfc3RydWN0OworI2RlZmluZSBQR19tYXBwZWQJUEdfYXJjaF8xCiAKLWV4dGVybiB2b2lkIGZsdXNoX2NhY2hlX2FsbCh2b2lkKTsKLWV4dGVybiB2b2lkIGZsdXNoX2NhY2hlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKLWV4dGVybiB2b2lkIGZsdXNoX2NhY2hlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAordm9pZCBmbHVzaF9jYWNoZV9hbGwodm9pZCk7Cit2b2lkIGZsdXNoX2NhY2hlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKK3ZvaWQgZmx1c2hfY2FjaGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGVuZCk7Ci1leHRlcm4gdm9pZCBmbHVzaF9jYWNoZV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgcGZuKTsKLWV4dGVybiB2b2lkIGZsdXNoX2RjYWNoZV9wYWdlKHN0cnVjdCBwYWdlICpwZyk7Ci1leHRlcm4gdm9pZCBmbHVzaF9pY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwotZXh0ZXJuIHZvaWQgZmx1c2hfaWNhY2hlX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlKTsKK3ZvaWQgZmx1c2hfY2FjaGVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHBmbik7Cit2b2lkIGZsdXNoX2RjYWNoZV9wYWdlKHN0cnVjdCBwYWdlICpwZyk7Cit2b2lkIGZsdXNoX2ljYWNoZV9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7Cit2b2lkIGZsdXNoX2ljYWNoZV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CisjZWxzZQorI2RlZmluZSBmbHVzaF9jYWNoZV9hbGwoKQkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZmx1c2hfY2FjaGVfbW0obW0pCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHN0YXJ0LCBlbmQpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZmx1c2hfY2FjaGVfcGFnZSh2bWEsIHZtYWRkciwgcGZuKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBmbHVzaF9pY2FjaGVfcmFuZ2Uoc3RhcnQsIGVuZCkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZmx1c2hfaWNhY2hlX3BhZ2Uodm1hLHBnKQkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCiAKICNkZWZpbmUgZmx1c2hfZGNhY2hlX21tYXBfbG9jayhtYXBwaW5nKQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9kY2FjaGVfbW1hcF91bmxvY2sobWFwcGluZykJZG8geyB9IHdoaWxlICgwKQogCiAvKiBTSDMgaGFzIHVuaWZpZWQgY2FjaGUgc28gbm8gc3BlY2lhbCBhY3Rpb24gbmVlZGVkIGhlcmUgKi8KICNkZWZpbmUgZmx1c2hfY2FjaGVfc2lndHJhbXAodmFkZHIpCQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGZsdXNoX3BhZ2VfdG9fcmFtKHBhZ2UpCQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9pY2FjaGVfdXNlcl9yYW5nZSh2bWEscGcsYWRyLGxlbikJZG8geyB9IHdoaWxlICgwKQogCiAjZGVmaW5lIHAzX2NhY2hlX2luaXQoKQkJCQlkbyB7IH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgUEdfbWFwcGVkCVBHX2FyY2hfMQotCi0vKiBXZSBwcm92aWRlIG91ciBvd24gZ2V0X3VubWFwcGVkX2FyZWEgdG8gYXZvaWQgY2FjaGUgYWxpYXMgaXNzdWUgKi8KLSNkZWZpbmUgSEFWRV9BUkNIX1VOTUFQUEVEX0FSRUEKLQotI2Vsc2UKLQotI2RlZmluZSBmbHVzaF9jYWNoZV9hbGwoKQkJCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgZmx1c2hfY2FjaGVfbW0obW0pCQkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBmbHVzaF9jYWNoZV9yYW5nZSh2bWEsIHN0YXJ0LCBlbmQpCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgZmx1c2hfY2FjaGVfcGFnZSh2bWEsIHZtYWRkciwgcGZuKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpCQkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBmbHVzaF9kY2FjaGVfbW1hcF9sb2NrKG1hcHBpbmcpCQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGZsdXNoX2RjYWNoZV9tbWFwX3VubG9jayhtYXBwaW5nKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGZsdXNoX2ljYWNoZV9yYW5nZShzdGFydCwgZW5kKQkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBmbHVzaF9pY2FjaGVfcGFnZSh2bWEscGcpCQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGZsdXNoX2ljYWNoZV91c2VyX3JhbmdlKHZtYSxwZyxhZHIsbGVuKQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGZsdXNoX2NhY2hlX3NpZ3RyYW1wKHZhZGRyKQkJZG8geyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIHAzX2NhY2hlX2luaXQoKQkJCQlkbyB7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgSEFWRV9BUkNIX1VOTUFQUEVEX0FSRUEKLQotI2VuZGlmCi0KICNlbmRpZiAvKiBfX0FTTV9DUFVfU0gzX0NBQ0hFRkxVU0hfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL2ZyZXEuaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvZnJlcS5oCmluZGV4IGI2MWI2ZTMuLjI3M2YzMjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvZnJlcS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvZnJlcS5oCkBAIC0xOCw1ICsxOCw5IEBACiAjZGVmaW5lIE1JTl9ESVZJU09SX05SCQkwCiAjZGVmaW5lIE1BWF9ESVZJU09SX05SCQk0CiAKKyNkZWZpbmUgRlJRQ1JfQ0tPRU4JMHgwMTAwCisjZGVmaW5lIEZSUUNSX1BMTEVOCTB4MDA4MAorI2RlZmluZSBGUlFDUl9QU1RCWQkweDAwNDAKKwogI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDNfRlJFUV9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvbW11X2NvbnRleHQuaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvbW11X2NvbnRleHQuaAppbmRleCBhODQ0ZWEwLi5iY2NiN2RkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL21tdV9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy9tbXVfY29udGV4dC5oCkBAIC0yNyw4ICsyNywxMiBAQAogI2RlZmluZSBUUkEJMHhmZmZmZmZkMAogI2RlZmluZSBFWFBFVlQJMHhmZmZmZmZkNAogCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpIHx8IFwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApCiAjZGVmaW5lIElOVEVWVAkweGE0MDAwMDAwCS8qIElOVEVWVEUyKDB4YTQwMDAwMDApICovCiAjZWxzZQogI2RlZmluZSBJTlRFVlQJMHhmZmZmZmZkOApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy9zaG1wYXJhbS5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy9zaG1wYXJhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTViNWVlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvc2htcGFyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS1zaC9jcHUtc2gzL3NobXBhcmFtLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTkgTmlpYmUgWXV0YWthCi0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLSNpZm5kZWYgX19BU01fQ1BVX1NIM19TSE1QQVJBTV9ICi0jZGVmaW5lIF9fQVNNX0NQVV9TSDNfU0hNUEFSQU1fSAotCi0jZGVmaW5lCVNITUxCQSBQQUdFX1NJWkUJCSAvKiBhdHRhY2ggYWRkciBhIG11bHRpcGxlIG9mIHRoaXMgKi8KLQotI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDNfU0hNUEFSQU1fSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL3RpbWVyLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL3RpbWVyLmgKaW5kZXggM2Q4ZTk1ZS4uYjIzOTRjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy90aW1lci5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvdGltZXIuaApAQCAtMjAsOSArMjAsMTQgQEAKICAqCVNINzcxMAogICoJU0g3NzIwCiAgKglTSDczMDAKKyAqCVNINzcxMAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIAorI2lmICFkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjcpCisjZGVmaW5lIFRNVV9UT0NSCTB4ZmZmZmZlOTAJLyogQnl0ZSBhY2Nlc3MgKi8KKyNlbmRpZgorCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzAwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApCiAjZGVmaW5lIFRNVV9UU1RSCTB4YTQxMmZlOTIJLyogQnl0ZSBhY2Nlc3MgKi8KIApAQCAtMzksOSArNDQsNiBAQAogI2RlZmluZSBUTVUyX1RDUgkweGE0MTJmZWI0CS8qIFdvcmQgYWNjZXNzICovCiAKICNlbHNlCi0jaWYgIWRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNykKLSNkZWZpbmUgVE1VX1RPQ1IJMHhmZmZmZmU5MAkvKiBCeXRlIGFjY2VzcyAqLwotI2VuZGlmCiAjZGVmaW5lIFRNVV9UU1RSCTB4ZmZmZmZlOTIJLyogQnl0ZSBhY2Nlc3MgKi8KIAogI2RlZmluZSBUTVUwX1RDT1IJMHhmZmZmZmU5NAkvKiBMb25nIGFjY2VzcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy91YmMuaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDMvdWJjLmgKaW5kZXggMGY4MDlkZS4uOWQzMDhjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy91YmMuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL3ViYy5oCkBAIC0xMSw2ICsxMSwxOSBAQAogI2lmbmRlZiBfX0FTTV9DUFVfU0gzX1VCQ19ICiAjZGVmaW5lIF9fQVNNX0NQVV9TSDNfVUJDX0gKIAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCkKKyNkZWZpbmUgVUJDX0JBUkEJCTB4YTRmZmZmYjAKKyNkZWZpbmUgVUJDX0JBTVJBCQkweGE0ZmZmZmI0CisjZGVmaW5lIFVCQ19CQlJBCQkweGE0ZmZmZmI4CisjZGVmaW5lIFVCQ19CQVNSQQkJMHhmZmZmZmZlNAorI2RlZmluZSBVQkNfQkFSQgkJMHhhNGZmZmZhMAorI2RlZmluZSBVQkNfQkFNUkIJCTB4YTRmZmZmYTQKKyNkZWZpbmUgVUJDX0JCUkIJCTB4YTRmZmZmYTgKKyNkZWZpbmUgVUJDX0JBU1JCCQkweGZmZmZmZmU4CisjZGVmaW5lIFVCQ19CRFJCCQkweGE0ZmZmZjkwCisjZGVmaW5lIFVCQ19CRE1SQgkJMHhhNGZmZmY5NAorI2RlZmluZSBVQkNfQlJDUgkJMHhhNGZmZmY5OAorI2Vsc2UKICNkZWZpbmUgVUJDX0JBUkEgICAgICAgICAgICAgICAgMHhmZmZmZmZiMAogI2RlZmluZSBVQkNfQkFNUkEgICAgICAgICAgICAgICAweGZmZmZmZmI0CiAjZGVmaW5lIFVCQ19CQlJBICAgICAgICAgICAgICAgIDB4ZmZmZmZmYjgKQEAgLTIyLDYgKzM1LDYgQEAKICNkZWZpbmUgVUJDX0JEUkIgICAgICAgICAgICAgICAgMHhmZmZmZmY5MAogI2RlZmluZSBVQkNfQkRNUkIgICAgICAgICAgICAgICAweGZmZmZmZjk0CiAjZGVmaW5lIFVCQ19CUkNSICAgICAgICAgICAgICAgIDB4ZmZmZmZmOTgKKyNlbmRpZgogCiAjZW5kaWYgLyogX19BU01fQ1BVX1NIM19VQkNfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2FkZHJzcGFjZS5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9hZGRyc3BhY2UuaAppbmRleCA3Mjc2MzRkLi5iYjJlMWIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2FkZHJzcGFjZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvYWRkcnNwYWNlLmgKQEAgLTIyLDUgKzIyLDggQEAKICNkZWZpbmUgUDRTRUdfVExCX0RBVEEJMHhmNzAwMDAwMAogI2RlZmluZSBQNFNFR19SRUdfQkFTRQkweGZmMDAwMDAwCiAKKyNkZWZpbmUgUEFfQVJFQTVfSU8JMHhiNDAwMDAwMAkvKiBBcmVhIDUgSU8gTWVtb3J5ICovCisjZGVmaW5lIFBBX0FSRUE2X0lPCTB4YjgwMDAwMDAJLyogQXJlYSA2IElPIE1lbW9yeSAqLworCiAjZW5kaWYgLyogX19BU01fQ1BVX1NINF9BRERSU1BBQ0VfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2NhY2hlLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2NhY2hlLmgKaW5kZXggMWZlMjAzNS4uNmU5YzdlNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9jYWNoZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvY2FjaGUuaApAQCAtMjIsNyArMjIsOSBAQAogI2RlZmluZSBDQ1JfQ0FDSEVfSUNFCTB4MDEwMAkvKiBJbnN0cnVjdGlvbiBDYWNoZSBFbmFibGUgKi8KICNkZWZpbmUgQ0NSX0NBQ0hFX0lDSQkweDA4MDAJLyogSUMgSW52YWxpZGF0ZSAqLwogI2RlZmluZSBDQ1JfQ0FDSEVfSUlYCTB4ODAwMAkvKiBJQyBJbmRleCBFbmFibGUgKi8KKyNpZm5kZWYgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MAogI2RlZmluZSBDQ1JfQ0FDSEVfRU1PREUJMHg4MDAwMDAwMAkvKiBFTU9ERSBFbmFibGUgKi8KKyNlbmRpZgogCiAvKiBEZWZhdWx0IENDUiBzZXR1cDogOGsrMTZrLWJ5dGUgY2FjaGUsUDEtd2IsZW5hYmxlICovCiAjZGVmaW5lIENDUl9DQUNIRV9FTkFCTEUJKENDUl9DQUNIRV9PQ0V8Q0NSX0NBQ0hFX0lDRSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9jYWNoZWZsdXNoLmgKaW5kZXggZjMyMzU2Ny4uNTE1ZmQ1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9jYWNoZWZsdXNoLmgKQEAgLTE2LDQwICsxNiwyOSBAQAogICogIGNhY2hpbmc7IGluIHdoaWNoIGNhc2UgdGhleSdyZSBvbmx5IHNlbWktYnJva2VuKSwKICAqICBzbyB3ZSBuZWVkIHRoZW0uCiAgKi8KLQotLyogUGFnZSBpcyA0SywgT0Mgc2l6ZSBpcyAxNkssIHRoZXJlIGFyZSBmb3VyIGxpbmVzLiAqLwotI2RlZmluZSBDQUNIRV9BTElBUyAweDAwMDAzMDAwCi0KLXN0cnVjdCBwYWdlOwotc3RydWN0IG1tX3N0cnVjdDsKLXN0cnVjdCB2bV9hcmVhX3N0cnVjdDsKLQotZXh0ZXJuIHZvaWQgZmx1c2hfY2FjaGVfYWxsKHZvaWQpOwotZXh0ZXJuIHZvaWQgZmx1c2hfY2FjaGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pOwotZXh0ZXJuIHZvaWQgZmx1c2hfY2FjaGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGVuZCk7Ci1leHRlcm4gdm9pZCBmbHVzaF9jYWNoZV9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgcGZuKTsKLWV4dGVybiB2b2lkIGZsdXNoX2RjYWNoZV9wYWdlKHN0cnVjdCBwYWdlICpwZyk7Cit2b2lkIGZsdXNoX2NhY2hlX2FsbCh2b2lkKTsKK3ZvaWQgZmx1c2hfY2FjaGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pOwordm9pZCBmbHVzaF9jYWNoZV9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kKTsKK3ZvaWQgZmx1c2hfY2FjaGVfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQkgICAgICB1bnNpZ25lZCBsb25nIHBmbik7Cit2b2lkIGZsdXNoX2RjYWNoZV9wYWdlKHN0cnVjdCBwYWdlICpwZyk7CiAKICNkZWZpbmUgZmx1c2hfZGNhY2hlX21tYXBfbG9jayhtYXBwaW5nKQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBmbHVzaF9kY2FjaGVfbW1hcF91bmxvY2sobWFwcGluZykJZG8geyB9IHdoaWxlICgwKQogCi1leHRlcm4gdm9pZCBmbHVzaF9pY2FjaGVfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwotZXh0ZXJuIHZvaWQgZmx1c2hfY2FjaGVfc2lndHJhbXAodW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB2b2lkIGZsdXNoX2ljYWNoZV91c2VyX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQkJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJCSAgICBpbnQgbGVuKTsKK3ZvaWQgZmx1c2hfaWNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKK3ZvaWQgZmx1c2hfY2FjaGVfc2lndHJhbXAodW5zaWduZWQgbG9uZyBhZGRyKTsKK3ZvaWQgZmx1c2hfaWNhY2hlX3VzZXJfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIGludCBsZW4pOwogCiAjZGVmaW5lIGZsdXNoX2ljYWNoZV9wYWdlKHZtYSxwZykJCWRvIHsgfSB3aGlsZSAoMCkKIAogLyogSW5pdGlhbGl6YXRpb24gb2YgUDMgYXJlYSBmb3IgY29weV91c2VyX3BhZ2UgKi8KLWV4dGVybiB2b2lkIHAzX2NhY2hlX2luaXQodm9pZCk7Cit2b2lkIHAzX2NhY2hlX2luaXQodm9pZCk7CiAKICNkZWZpbmUgUEdfbWFwcGVkCVBHX2FyY2hfMQogCi0vKiBXZSBwcm92aWRlIG91ciBvd24gZ2V0X3VubWFwcGVkX2FyZWEgdG8gYXZvaWQgY2FjaGUgYWxpYXMgaXNzdWUgKi8KLSNkZWZpbmUgSEFWRV9BUkNIX1VOTUFQUEVEX0FSRUEKLQogI2lmZGVmIENPTkZJR19NTVUKIGV4dGVybiBpbnQgcmVtYXBfYXJlYV9wYWdlcyh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7CkBAIC02MSw0ICs1MCwzIEBACiB9CiAjZW5kaWYgLyogQ09ORklHX01NVSAqLwogI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDRfQ0FDSEVGTFVTSF9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvZG1hLXNoNzc4MC5oIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9kbWEtc2g3NzgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5MGQyOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvZG1hLXNoNzc4MC5oCkBAIC0wLDAgKzEsMzkgQEAKKyNpZm5kZWYgX19BU01fU0hfQ1BVX1NINF9ETUFfU0g3NzgwX0gKKyNkZWZpbmUgX19BU01fU0hfQ1BVX1NINF9ETUFfU0g3NzgwX0gKKworI2RlZmluZSBSRVFfSEUJMHgwMDAwMDBDMAorI2RlZmluZSBSRVFfSAkweDAwMDAwMDgwCisjZGVmaW5lIFJFUV9MRQkweDAwMDAwMDQwCisjZGVmaW5lIFRNX0JVUlNUIDB4MDAwMDAyMAorI2RlZmluZSBUU184CTB4MDAwMDAwMDAKKyNkZWZpbmUgVFNfMTYJMHgwMDAwMDAwOAorI2RlZmluZSBUU18zMgkweDAwMDAwMDEwCisjZGVmaW5lIFRTXzE2QkxLCTB4MDAwMDAwMTgKKyNkZWZpbmUgVFNfMzJCTEsJMHgwMDEwMDAwMAorCisvKgorICogVGhlIFN1cGVySCBETUFDIHN1cHBvcnRzIGEgbnVtYmVyIG9mIHRyYW5zbWl0IHNpemVzLCB3ZSBsaXN0IHRoZW0gaGVyZSwKKyAqIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSB2YWx1ZXMgYXMgdGhleSBhcHBlYXIgaW4gdGhlIENIQ1IgcmVnaXN0ZXJzLgorICoKKyAqIERlZmF1bHRzIHRvIGEgNjQtYml0IHRyYW5zZmVyIHNpemUuCisgKi8KK2VudW0geworCVhNSVRfU1pfOEJJVCwKKwlYTUlUX1NaXzE2QklULAorCVhNSVRfU1pfMzJCSVQsCisJWE1JVF9TWl8xMjhCSVQsCisJWE1JVF9TWl8yNTZCSVQsCit9OworCisvKgorICogVGhlIERNQSBjb3VudCBpcyBkZWZpbmVkIGFzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19hdHRyaWJ1dGVfXyAoKHVzZWQpKSB0c19zaGlmdFtdID0geworCVtYTUlUX1NaXzhCSVRdCQk9IDAsCisJW1hNSVRfU1pfMTZCSVRdCQk9IDEsCisJW1hNSVRfU1pfMzJCSVRdCQk9IDIsCisJW1hNSVRfU1pfMTI4QklUXQk9IDQsCisJW1hNSVRfU1pfMjU2QklUXQk9IDUsCit9OworCisjZW5kaWYgLyogX19BU01fU0hfQ1BVX1NINF9ETUFfU0g3NzgwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvZG1hLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2RtYS5oCmluZGV4IDBkZmU2MWYuLjNlNGIzZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9kbWEuaApAQCAtMSwxMSArMSwxNyBAQAogI2lmbmRlZiBfX0FTTV9DUFVfU0g0X0RNQV9ICiAjZGVmaW5lIF9fQVNNX0NQVV9TSDRfRE1BX0gKIAorI2RlZmluZSBETUFPUl9JTklUCSggMHg4MDAwIHwgRE1BT1JfRE1FICkKKwogI2lmZGVmIENPTkZJR19DUFVfU0g0QQogI2RlZmluZSBTSF9ETUFDX0JBU0UJMHhmYzgwODAyMAorCisjZGVmaW5lIENIQ1JfVFNfTUFTSwkweDE4CisjZGVmaW5lIENIQ1JfVFNfU0hJRlQJMworCisjaW5jbHVkZSA8YXNtL2NwdS9kbWEtc2g3NzgwLmg+CiAjZWxzZQogI2RlZmluZSBTSF9ETUFDX0JBU0UJMHhmZmEwMDAwMAotI2VuZGlmCiAKIC8qIERlZmluaXRpb25zIGZvciB0aGUgU3VwZXJIIERNQUMgKi8KICNkZWZpbmUgVE1fQlVSU1QJMHgwMDAwMDgwCkBAIC0xOSw4ICsyNSw2IEBACiAKICNkZWZpbmUgRE1BT1JfQ09ECTB4MDAwMDAwMDgKIAotI2RlZmluZSBETUFPUl9JTklUCSggMHg4MDAwIHwgRE1BT1JfRE1FICkKLQogLyoKICAqIFRoZSBTdXBlckggRE1BQyBzdXBwb3J0cyBhIG51bWJlciBvZiB0cmFuc21pdCBzaXplcywgd2UgbGlzdCB0aGVtIGhlcmUsCiAgKiB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgdmFsdWVzIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBDSENSIHJlZ2lzdGVycy4KQEAgLTQ1LDUgKzQ5LDYgQEAKIAlbWE1JVF9TWl8zMkJJVF0JCT0gMiwKIAlbWE1JVF9TWl8yNTZCSVRdCT0gNSwKIH07CisjZW5kaWYKIAogI2VuZGlmIC8qIF9fQVNNX0NQVV9TSDRfRE1BX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvc2htcGFyYW0uaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvc2htcGFyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVhMGFhOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L3NobXBhcmFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9zaG1wYXJhbS5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk5IE5paWJlIFl1dGFrYQotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0jaWZuZGVmIF9fQVNNX0NQVV9TSDRfU0hNUEFSQU1fSAotI2RlZmluZSBfX0FTTV9DUFVfU0g0X1NITVBBUkFNX0gKLQotLyoKLSAqIFNILTQgaGFzIEQtY2FjaGUgYWxpYXMgaXNzdWUKLSAqLwotI2RlZmluZQlTSE1MQkEgKFBBR0VfU0laRSo0KQkJIC8qIGF0dGFjaCBhZGRyIGEgbXVsdGlwbGUgb2YgdGhpcyAqLwotCi0jZW5kaWYgLyogX19BU01fQ1BVX1NINF9TSE1QQVJBTV9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvc3EuaCBiL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvc3EuaAppbmRleCAzNjZiMDkxLi41ODZkNjQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L3NxLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9zcS5oCkBAIC0xNyw3ICsxNyw3IEBACiAgKiBTdG9yZSBxdWV1ZXMgcmFuZ2UgZnJvbSBlMDAwMDAwMC1lM2ZmZmZmYywgYWxsb3dpbmcgYXBwcm94LiA2NE1CIHRvIGJlCiAgKiBtYXBwZWQgdG8gYW55IHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UuIFNpbmNlIGRhdGEgaXMgd3JpdHRlbiAoYW5kIGFsaWduZWQpCiAgKiB0byAzMi1ieXRlIGJvdW5kYXJpZXMsIHdlIG5lZWQgdG8gYmUgc3VyZSB0aGF0IGFsbCBhbGxvY2F0aW9ucyBhcmUgYWxpZ25lZC4KLSAqLyAKKyAqLwogI2RlZmluZSBTUV9TSVpFICAgICAgICAgICAgICAgICAzMgogI2RlZmluZSBTUV9BTElHTl9NQVNLICAgICAgICAgICAofihTUV9TSVpFIC0gMSkpCiAjZGVmaW5lIFNRX0FMSUdOKGFkZHIpICAgICAgICAgICgoKGFkZHIpK1NRX1NJWkUtMSkgJiBTUV9BTElHTl9NQVNLKQpAQCAtMjYsMjMgKzI2LDEwIEBACiAjZGVmaW5lIFNRX1FBQ1IxCQkoUDRTRUdfUkVHX0JBU0UgICsgMHgzYykKICNkZWZpbmUgU1FfQUREUk1BWCAgICAgICAgICAgICAgKFA0U0VHX1NUT1JFX1FVRSArIDB4MDQwMDAwMDApCiAKLXN0cnVjdCBzcV9tYXBwaW5nIHsKLQljb25zdCBjaGFyICpuYW1lOwotCi0JdW5zaWduZWQgbG9uZyBzcV9hZGRyOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLX07Ci0KIC8qIGFyY2gvc2gva2VybmVsL2NwdS9zaDQvc3EuYyAqLwotZXh0ZXJuIHN0cnVjdCBzcV9tYXBwaW5nICpzcV9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGludCBzaXplLCBjb25zdCBjaGFyICpuYW1lKTsKLWV4dGVybiB2b2lkIHNxX3VubWFwKHN0cnVjdCBzcV9tYXBwaW5nICptYXApOwotCi1leHRlcm4gdm9pZCBzcV9jbGVhcih1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBsZW4pOwotZXh0ZXJuIHZvaWQgc3FfZmx1c2godm9pZCAqYWRkcik7Ci1leHRlcm4gdm9pZCBzcV9mbHVzaF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBpbnQgbGVuKTsKK3Vuc2lnbmVkIGxvbmcgc3FfcmVtYXAodW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwordm9pZCBzcV91bm1hcCh1bnNpZ25lZCBsb25nIHZhZGRyKTsKK3ZvaWQgc3FfZmx1c2hfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgaW50IGxlbik7CiAKICNlbmRpZiAvKiBfX0FTTV9DUFVfU0g0X1NRX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3FyZWVrL2NxcmVlay5oIGIvaW5jbHVkZS9hc20tc2gvY3FyZWVrL2NxcmVlay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWFlY2MwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL2NxcmVlay9jcXJlZWsuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSNpZm5kZWYgX19BU01fU0hfQ1FSRUVLX0NRUkVFS19ICi0jZGVmaW5lIF9fQVNNX1NIX0NRUkVFS19DUVJFRUtfSAotCi0jZGVmaW5lIEJSSURHRV9GRUFUVVJFCQkweDAwMDIKLQotI2RlZmluZSBCUklER0VfSURFX0NUUkwJCTB4MDAxOAotI2RlZmluZSBCUklER0VfSURFX0lOVFJfTFZMICAgIAkweDAwMUEKLSNkZWZpbmUgQlJJREdFX0lERV9JTlRSX01BU0sJMHgwMDFDCi0jZGVmaW5lIEJSSURHRV9JREVfSU5UUl9TVEFUCTB4MDAxRQotCi0jZGVmaW5lIEJSSURHRV9JU0FfQ1RSTAkJMHgwMDI4Ci0jZGVmaW5lIEJSSURHRV9JU0FfSU5UUl9MVkwgICAgCTB4MDAyQQotI2RlZmluZSBCUklER0VfSVNBX0lOVFJfTUFTSwkweDAwMkMKLSNkZWZpbmUgQlJJREdFX0lTQV9JTlRSX1NUQVQJMHgwMDJFCi0KLS8qIGFyY2gvc2gvYm9hcmRzL2NxcmVlay9zZXR1cC5jICovCi1leHRlcm4gdm9pZCBzZXR1cF9jcXJlZWsodm9pZCk7Ci0KLS8qIGFyY2gvc2gvYm9hcmRzL2NxcmVlay9pcnEuYyAqLwotZXh0ZXJuIGludCBjcXJlZWtfaGFzX2lkZSwgY3FyZWVrX2hhc19pc2E7Ci1leHRlcm4gdm9pZCBpbml0X2NxcmVla19JUlEodm9pZCk7Ci0KLS8qIGFyY2gvc2gvYm9hcmRzL2NxcmVlay9pby5jICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBjcXJlZWtfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci0KLSNlbmRpZiAvKiBfX0FTTV9TSF9DUVJFRUtfQ1FSRUVLX0ggKi8KLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvZG1hLW1hcHBpbmcuaCBiL2luY2x1ZGUvYXNtLXNoL2RtYS1tYXBwaW5nLmgKaW5kZXggMTI0OTY4ZjkuLjU2Y2Q0YjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2RtYS1tYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvZG1hLW1hcHBpbmcuaApAQCAtMTQxLDI1ICsxNDEsMzUgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLCBzaXplX3Qgc2l6ZSwKLQkJCQkgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQotCV9fYXR0cmlidXRlX18gKChhbGlhcygiZG1hX3N5bmNfc2luZ2xlIikpKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgc2l6ZV90IHNpemUsCisJCQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlkbWFfc3luY19zaW5nbGUoZGV2LCBkbWFfaGFuZGxlLCBzaXplLCBkaXIpOworfQogCi1zdGF0aWMgdm9pZCBkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgICAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgc2l6ZV90IHNpemUsCitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgICBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCQkJCSAgICAgIHNpemVfdCBzaXplLAorCQkJCQkgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJZG1hX3N5bmNfc2luZ2xlKGRldiwgZG1hX2hhbmRsZSwgc2l6ZSwgZGlyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NnX2Zvcl9jcHUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVsZW1zLAogCQkJCSAgICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi0JX19hdHRyaWJ1dGVfXyAoKGFsaWFzKCJkbWFfc3luY19zaW5nbGUiKSkpOworeworCWRtYV9zeW5jX3NnKGRldiwgc2csIG5lbGVtcywgZGlyKTsKK30KIAotc3RhdGljIHZvaWQgZG1hX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKLQkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCi0JX19hdHRyaWJ1dGVfXyAoKGFsaWFzKCJkbWFfc3luY19zZyIpKSk7CitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbGVtcywKKwkJCQkJICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJZG1hX3N5bmNfc2coZGV2LCBzZywgbmVsZW1zLCBkaXIpOworfQogCi1zdGF0aWMgdm9pZCBkbWFfc3luY19zZ19mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbmVsZW1zLAotCQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKLQlfX2F0dHJpYnV0ZV9fICgoYWxpYXMoImRtYV9zeW5jX3NnIikpKTsKIAogc3RhdGljIGlubGluZSBpbnQgZG1hX2dldF9jYWNoZV9hbGlnbm1lbnQodm9pZCkKIHsKQEAgLTE3NCw2ICsxODQsNCBAQAogewogCXJldHVybiBkbWFfYWRkciA9PSAwOwogfQotCiAjZW5kaWYgLyogX19BU01fU0hfRE1BX01BUFBJTkdfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9kbWEuaCBiL2luY2x1ZGUvYXNtLXNoL2RtYS5oCmluZGV4IGU2MmE2ZDAuLmQ5ZGFhMDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2RtYS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2RtYS5oCkBAIC04OSw2ICs4OSw3IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9xdWV1ZTsKIAogCXN0cnVjdCBzeXNfZGV2aWNlIGRldjsKKwljaGFyICpuYW1lOwogfTsKIAogc3RydWN0IGRtYV9pbmZvIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2RtaWRhL2lvLmggYi9pbmNsdWRlL2FzbS1zaC9kbWlkYS9pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWJkNDE2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL2RtaWRhL2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jaWZuZGVmIF9fQVNNX1NIX0RNSURBX0lPX0gKLSNkZWZpbmUgX19BU01fU0hfRE1JREFfSU9fSAotCi0vKgotICogTm90aGluZyBzcGVjaWFsIGhlcmUuLiBqdXN0IHVzZSB0aGUgZ2VuZXJpYyBjY2hpcCBpbyByb3V0aW5lcy4KLSAqLwotI2luY2x1ZGUgPGFzbS9oZDY0NDY1L2lvLmg+Ci0KLSNlbmRpZiAvKiBfX0FTTV9TSF9ETUlEQV9JT19IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2VsZi5oIGIvaW5jbHVkZS9hc20tc2gvZWxmLmgKaW5kZXggMWI2M2RmZS4uM2EwN2FiNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvZWxmLmgKQEAgLTEsNiArMSwxMSBAQAogI2lmbmRlZiBfX0FTTV9TSF9FTEZfSAogI2RlZmluZSBfX0FTTV9TSF9FTEZfSAogCisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFzbS9hdXh2ZWMuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3VzZXIuaD4KKwogLyogU0ggcmVsb2NhdGlvbiB0eXBlcyAgKi8KICNkZWZpbmUJUl9TSF9OT05FCQkwCiAjZGVmaW5lCVJfU0hfRElSMzIJCTEKQEAgLTQ2LDkgKzUxLDYgQEAKICAqIEVMRiByZWdpc3RlciBkZWZpbml0aW9ucy4uCiAgKi8KIAotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vdXNlci5oPgotCiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZWxmX2dyZWdfdDsKIAogI2RlZmluZSBFTEZfTkdSRUcgKHNpemVvZiAoc3RydWN0IHB0X3JlZ3MpIC8gc2l6ZW9mKGVsZl9ncmVnX3QpKQpAQCAtOTEsNyArOTMsNyBAQAogICAgaW5zdHJ1Y3Rpb24gc2V0IHRoaXMgQ1BVIHN1cHBvcnRzLiAgVGhpcyBjb3VsZCBiZSBkb25lIGluIHVzZXIgc3BhY2UsCiAgICBidXQgaXQncyBub3QgZWFzeSwgYW5kIHdlJ3ZlIGFscmVhZHkgZG9uZSBpdCBoZXJlLiAgKi8KIAotI2RlZmluZSBFTEZfSFdDQVAJKDApCisjZGVmaW5lIEVMRl9IV0NBUAkoYm9vdF9jcHVfZGF0YS5mbGFncykKIAogLyogVGhpcyB5aWVsZHMgYSBzdHJpbmcgdGhhdCBsZC5zbyB3aWxsIHVzZSB0byBsb2FkIGltcGxlbWVudGF0aW9uCiAgICBzcGVjaWZpYyBsaWJyYXJpZXMgZm9yIG9wdGltaXphdGlvbi4gIFRoaXMgaXMgbW9yZSBzcGVjaWZpYyBpbgpAQCAtMTE5LDQgKzEyMSwyNCBAQAogI2RlZmluZSBFTEZfQ09SRV9DT1BZX0ZQUkVHUyh0c2ssIGVsZl9mcHJlZ3MpIGR1bXBfdGFza19mcHUodHNrLCBlbGZfZnByZWdzKQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfVlNZU0NBTEwKKy8qIHZEU08gaGFzIGFyY2hfc2V0dXBfYWRkaXRpb25hbF9wYWdlcyAqLworI2RlZmluZSBBUkNIX0hBU19TRVRVUF9BRERJVElPTkFMX1BBR0VTCitzdHJ1Y3QgbGludXhfYmlucHJtOworZXh0ZXJuIGludCBhcmNoX3NldHVwX2FkZGl0aW9uYWxfcGFnZXMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwKKwkJCQkgICAgICAgaW50IGV4ZWN1dGFibGVfc3RhY2spOworCitleHRlcm4gdW5zaWduZWQgaW50IHZkc29fZW5hYmxlZDsKK2V4dGVybiB2b2lkIF9fa2VybmVsX3ZzeXNjYWxsOworCisjZGVmaW5lIFZEU09fQkFTRQkJKCh1bnNpZ25lZCBsb25nKWN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc28pCisjZGVmaW5lIFZEU09fU1lNKHgpCQkoVkRTT19CQVNFICsgKHVuc2lnbmVkIGxvbmcpKHgpKQorCisjZGVmaW5lIEFSQ0hfRExJTkZPCQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmICh2ZHNvX2VuYWJsZWQpCQkJCQlcCisJCU5FV19BVVhfRU5UKEFUX1NZU0lORk9fRUhEUiwgVkRTT19CQVNFKTsJXAorfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDT05GSUdfVlNZU0NBTEwgKi8KKwogI2VuZGlmIC8qIF9fQVNNX1NIX0VMRl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9maXhtYXAuaCBiL2luY2x1ZGUvYXNtLXNoL2ZpeG1hcC5oCmluZGV4IDQxMmJjY2EuLjQ1OGU5ZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2ZpeG1hcC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2ZpeG1hcC5oCkBAIC0yNSw3ICsyNSw3IEBACiAgKiBhZGRyZXNzZXMuIFRoZSBwb2ludCBpcyB0byBoYXZlIGEgY29uc3RhbnQgYWRkcmVzcyBhdAogICogY29tcGlsZSB0aW1lLCBidXQgdG8gc2V0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9ubHkKICAqIGluIHRoZSBib290IHByb2Nlc3MuIFdlIGFsbG9jYXRlIHRoZXNlIHNwZWNpYWwgIGFkZHJlc3NlcwotICogZnJvbSB0aGUgZW5kIG9mIHZpcnR1YWwgbWVtb3J5ICgweGZmZmZmMDAwKSBiYWNrd2FyZHMuCisgKiBmcm9tIHRoZSBlbmQgb2YgUDMgYmFja3dhcmRzLgogICogQWxzbyB0aGlzIGxldHMgdXMgZG8gZmFpbC1zYWZlIHZtYWxsb2MoKSwgd2UKICAqIGNhbiBndWFyYW50ZWUgdGhhdCB0aGVzZSBzcGVjaWFsIGFkZHJlc3NlcyBhbmQKICAqIHZtYWxsb2MoKS1lZCBhZGRyZXNzZXMgbmV2ZXIgb3ZlcmxhcC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2ZsYXQuaCBiL2luY2x1ZGUvYXNtLXNoL2ZsYXQuaAppbmRleCBmMjkwNzJlLi4wZDVjYzA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9mbGF0LmgKKysrIGIvaW5jbHVkZS9hc20tc2gvZmxhdC5oCkBAIC0xMyw3ICsxMyw3IEBACiAjZGVmaW5lIF9fQVNNX1NIX0ZMQVRfSAogCiAjZGVmaW5lCWZsYXRfc3RhY2tfYWxpZ24oc3ApCQkJLyogbm90aGluZyBuZWVkZWQgKi8KLSNkZWZpbmUJZmxhdF9hcmd2cF9lbnZwX29uX3N0YWNrKCkJCTEKKyNkZWZpbmUJZmxhdF9hcmd2cF9lbnZwX29uX3N0YWNrKCkJCTAKICNkZWZpbmUJZmxhdF9vbGRfcmFtX2ZsYWcoZmxhZ3MpCQkoZmxhZ3MpCiAjZGVmaW5lCWZsYXRfcmVsb2NfdmFsaWQocmVsb2MsIHNpemUpCQkoKHJlbG9jKSA8PSAoc2l6ZSkpCiAjZGVmaW5lCWZsYXRfZ2V0X2FkZHJfZnJvbV9ycChycCwgcmVsdmFsLCBmbGFncykJZ2V0X3VuYWxpZ25lZChycCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2hhcnAvaGFycC5oIGIvaW5jbHVkZS9hc20tc2gvaGFycC9oYXJwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZmJjZmEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvaGFycC9oYXJwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMSBEYXZpZCBKLiBNY2theSAoZGF2aWQubWNrYXlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKgotICogRGVmaW50aW9ucyBhcHBsaWNhYmxlIHRvIHRoZSBTVE1pY3JvZWxlY3Ryb25pY3MgU1Q0MFNUQjEgSEFSUCBhbmQKLSAqIGNvbXBhdGlibGUgYm9hcmRzLgotICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TSF9TVEIxX0hBUlApCi0KLSNkZWZpbmUgRVBMRF9CQVNFICAgICAweGEwODAwMDAwCi0KLSNkZWZpbmUgRVBMRF9MRUQgICAgICAoRVBMRF9CQVNFKzB4MDAwYzAwMDApCi0jZGVmaW5lIEVQTERfSU5UU1RBVDAgKEVQTERfQkFTRSsweDAwMjAwMDAwKQotI2RlZmluZSBFUExEX0lOVFNUQVQxIChFUExEX0JBU0UrMHgwMDI0MDAwMCkKLSNkZWZpbmUgRVBMRF9JTlRNQVNLMCAoRVBMRF9CQVNFKzB4MDAyODAwMDApCi0jZGVmaW5lIEVQTERfSU5UTUFTSzEgKEVQTERfQkFTRSsweDAwMmMwMDAwKQotI2RlZmluZSBFUExEX1BBR0VBRERSIChFUExEX0JBU0UrMHgwMDMwMDAwMCkKLSNkZWZpbmUgRVBMRF9SRVZJRDEgICAoRVBMRF9CQVNFKzB4MDAzODAwMDApCi0jZGVmaW5lIEVQTERfUkVWSUQyICAgKEVQTERfQkFTRSsweDAwM2MwMDAwKQotCi0jZGVmaW5lIEVQTERfTEVEX09OICAxCi0jZGVmaW5lIEVQTERfTEVEX09GRiAwCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX1NIX1NUQjFfT1ZFUkRSSVZFKQotCi0jZGVmaW5lIEVQTERfQkFTRSAgICAgMHhhNzAwMDAwMAotCi0jZGVmaW5lIEVQTERfUkVWSUQgICAgKEVQTERfQkFTRSsweDAwMDAwMDAwKQotI2RlZmluZSBFUExEX0xFRCAgICAgIChFUExEX0JBU0UrMHgwMDA0MDAwMCkKLSNkZWZpbmUgRVBMRF9JTlRNQVNLMCAoRVBMRF9CQVNFKzB4MDAxYzAwMDApCi0jZGVmaW5lIEVQTERfSU5UTUFTSzEgKEVQTERfQkFTRSsweDAwMjAwMDAwKQotI2RlZmluZSBFUExEX0lOVFNUQVQwIChFUExEX0JBU0UrMHgwMDI0MDAwMCkKLSNkZWZpbmUgRVBMRF9JTlRTVEFUMSAoRVBMRF9CQVNFKzB4MDAyODAwMDApCi0KLSNkZWZpbmUgRVBMRF9MRURfT04gIDAKLSNkZWZpbmUgRVBMRF9MRURfT0ZGIDEKLQotI2Vsc2UKLSNlcnJvciBVbmtub3duIGJvYXJkCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2hhcnAvaW8uaCBiL2luY2x1ZGUvYXNtLXNoL2hhcnAvaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhmMzllMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9oYXJwL2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jaWZuZGVmIF9fQVNNX1NIX0hBUlBfSU9fSAotI2RlZmluZSBfX0FTTV9TSF9IQVJQX0lPX0gKLQotLyoKLSAqIE5vdGhpbmcgc3BlY2lhbCBoZXJlLi4ganVzdCB1c2UgdGhlIGdlbmVyaWMgY2NoaXAgaW8gcm91dGluZXMuCi0gKi8KLSNpbmNsdWRlIDxhc20vaGQ2NDQ2NS9pby5oPgotCi0jZW5kaWYgLyogX19BU01fU0hfSEFSUF9JT19IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2hkNjQ0NjEvaGQ2NDQ2MS5oIGIvaW5jbHVkZS9hc20tc2gvaGQ2NDQ2MS5oCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXNoL2hkNjQ0NjEvaGQ2NDQ2MS5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1zaC9oZDY0NDYxLmgKaW5kZXggODdmMTNkMi4uMjdlNWMzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvaGQ2NDQ2MS9oZDY0NDYxLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvaGQ2NDQ2MS5oCkBAIC00MCw3ICs0MCwxMiBAQAogI2RlZmluZSBIRDY0NDYxX0xDRENCQVIJCTB4MTEwMDAKICNkZWZpbmUgSEQ2NDQ2MV9MQ0RDTE9SCQkweDExMDAyCiAjZGVmaW5lIEhENjQ0NjFfTENEQ0NSCQkweDExMDA0Ci0jZGVmaW5lIEhENjQ0NjFfTENEQ0NSX01PRkYJMHg4MAorI2RlZmluZSBIRDY0NDYxX0xDRENDUl9TVEJBQ0sJMHgwNDAwCisjZGVmaW5lIEhENjQ0NjFfTENEQ0NSX1NUUkVRCTB4MDEwMAorI2RlZmluZSBIRDY0NDYxX0xDRENDUl9NT0ZGCTB4MDA4MAorI2RlZmluZSBIRDY0NDYxX0xDRENDUl9SRUZTRUwJMHgwMDQwCisjZGVmaW5lIEhENjQ0NjFfTENEQ0NSX0VQT04JMHgwMDIwCisjZGVmaW5lIEhENjQ0NjFfTENEQ0NSX1NQT04JMHgwMDEwCiAKICNkZWZpbmUJSEQ2NDQ2MV9MRFIxCQkweDExMDEwCiAjZGVmaW5lCUhENjQ0NjFfTERSMV9ET04JMHgwMQpAQCAtNTQsOSArNTksOSBAQAogI2RlZmluZSBIRDY0NDYxX0xEVlNQUgkJMHgxMTAxYwogI2RlZmluZSBIRDY0NDYxX0xEUjMJCTB4MTEwMWUKIAotI2RlZmluZSBIRDY0NDYxX0NQVFdBUgkJMHgxMTAzMAkKKyNkZWZpbmUgSEQ2NDQ2MV9DUFRXQVIJCTB4MTEwMzAKICNkZWZpbmUgSEQ2NDQ2MV9DUFRXRFIJCTB4MTEwMzIKLSNkZWZpbmUgSEQ2NDQ2MV9DUFRSQVIJCTB4MTEwMzQJCisjZGVmaW5lIEhENjQ0NjFfQ1BUUkFSCQkweDExMDM0CiAjZGVmaW5lIEhENjQ0NjFfQ1BUUkRSCQkweDExMDM2CiAKICNkZWZpbmUgSEQ2NDQ2MV9HUkRPUgkJMHgxMTA0MApAQCAtMTExLDcgKzExNiw3IEBACiAjZGVmaW5lIEhENjQ0NjFfUENDSVNSX0JWRDEJCTB4MDEJLyogYmF0dGVyeSAxICovCiAKICNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfUENEX01BU0sJCTB4MGMgICAgLyogY2FyZCBkZXRlY3QgKi8KLSNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQlZEX01BU0sJMHgwMyAgICAvKiBiYXR0ZXJ5IHZvbHRhZ2UgKi8KKyNkZWZpbmUgSEQ2NDQ2MV9QQ0NJU1JfQlZEX01BU0sJCTB4MDMgICAgLyogYmF0dGVyeSB2b2x0YWdlICovCiAjZGVmaW5lIEhENjQ0NjFfUENDSVNSX0JWRF9CQVRHT09ECTB4MDMgICAgLyogYmF0dGVyeSBnb29kICovCiAjZGVmaW5lIEhENjQ0NjFfUENDSVNSX0JWRF9CQVRXQVJOCTB4MDEgICAgLyogYmF0dGVyeSBsb3cgd2FybmluZyAqLwogI2RlZmluZSBIRDY0NDYxX1BDQ0lTUl9CVkRfQkFUREVBRDEJMHgwMiAgICAvKiBiYXR0ZXJ5IGRlYWQgKi8KQEAgLTEzOSwxMSArMTQ0LDExIEBACiAKIC8qIFBDQyBDYXJkIFN0YXR1cyBDaGFuZ2UgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLwogI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9DUkUJCTB4ODAgICAgLyogY2hhbmdlIHJlc2V0IGVuYWJsZSAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9NQVNLICAgCTB4NjAgICAvKiBJUkVRIGVuYWJsZSAqLworI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9NQVNLCTB4NjAgICAvKiBJUkVRIGVuYWJsZSAqLwogI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9ESVNBQkxFRAkweDAwICAgLyogSVJFUSBkaXNhYmxlZCAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9MRVZFTCAgCTB4MjAgICAvKiBJUkVRIGxldmVsLXRyaWdnZXJlZCAqLworI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9MRVZFTAkweDIwICAgLyogSVJFUSBsZXZlbC10cmlnZ2VyZWQgKi8KICNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfSVJFUUVfRkFMTElORwkweDQwICAgLyogSVJFUSBmYWxsaW5nLWVkZ2UtdHJpZyAqLwotI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9JUkVRRV9SSVNJTkcgCTB4NjAgICAvKiBJUkVRIHJpc2luZy1lZGdlLXRyaWcgKi8KKyNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfSVJFUUVfUklTSU5HCTB4NjAgICAvKiBJUkVRIHJpc2luZy1lZGdlLXRyaWcgKi8KIAogI2RlZmluZSBIRDY0NDYxX1BDQ0NTQ0lFUl9TQ0UJCTB4MTAgICAgLyogc3RhdHVzIGNoYW5nZSBlbmFibGUgKi8KICNkZWZpbmUgSEQ2NDQ2MV9QQ0NDU0NJRVJfQ0RFCQkweDA4ICAgIC8qIGNhcmQgZGV0ZWN0IGNoYW5nZSBlbmFibGUgKi8KQEAgLTE1NSw3ICsxNjAsNiBAQAogI2RlZmluZSBIRDY0NDYxX1BDQ1NDUl9WQ0MxCQkweDAyCS8qIHZvbHRhZ2UgY29udHJvbCBwaW4gMSAqLwogI2RlZmluZSBIRDY0NDYxX1BDQ1NDUl9TV1AJCTB4MDEgICAgLyogd3JpdGUgcHJvdGVjdCAqLwogCi0KICNkZWZpbmUgSEQ2NDQ2MV9QME9DUiAgICAgICAgICAgMHgxMjAyYQogI2RlZmluZSBIRDY0NDYxX1AxT0NSICAgICAgICAgICAweDEyMDJjCiAjZGVmaW5lIEhENjQ0NjFfUEdDUiAgICAgICAgICAgIDB4MTIwMmUKQEAgLTE4MCwyMyArMTg0LDI1IEBACiAjZGVmaW5lIEhENjQ0NjFfTklSUgkJMHgxNTAwMAogI2RlZmluZSBIRDY0NDYxX05JTVIJCTB4MTUwMDIKIAotI2lmbmRlZiBDT05GSUdfSEQ2NDQ2MV9JT0JBU0UKLSNkZWZpbmUgQ09ORklHX0hENjQ0NjFfSU9CQVNFCTB4YjAwMDAwMDAKLSNlbmRpZgotI2lmbmRlZiBDT05GSUdfSEQ2NDQ2MV9JUlEKLSNkZWZpbmUgQ09ORklHX0hENjQ0NjFfSVJRCTM2Ci0jZW5kaWYKLQogI2RlZmluZSBIRDY0NDYxX0lSUUJBU0UJCU9GRkNISVBfSVJRX0JBU0UKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfTlVNIAkxNgorI2RlZmluZSBIRDY0NDYxX0lSUV9OVU0JCTE2CiAKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfVUFSVCAgICAJKEhENjQ0NjFfSVJRQkFTRSs1KQotI2RlZmluZSBIRDY0NDYxX0lSUV9JUkRBICAgIAkoSEQ2NDQ2MV9JUlFCQVNFKzYpCi0jZGVmaW5lIEhENjQ0NjFfSVJRX1RNVTEgICAJKEhENjQ0NjFfSVJRQkFTRSs5KQotI2RlZmluZSBIRDY0NDYxX0lSUV9UTVUwICAJKEhENjQ0NjFfSVJRQkFTRSsxMCkKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfR1BJTyAgICAJKEhENjQ0NjFfSVJRQkFTRSsxMSkKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfQUZFICAgICAJKEhENjQ0NjFfSVJRQkFTRSsxMikKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfUENDMSAJKEhENjQ0NjFfSVJRQkFTRSsxMykKLSNkZWZpbmUgSEQ2NDQ2MV9JUlFfUENDMCAJKEhENjQ0NjFfSVJRQkFTRSsxNCkKKyNkZWZpbmUgSEQ2NDQ2MV9JUlFfVUFSVAkoSEQ2NDQ2MV9JUlFCQVNFKzUpCisjZGVmaW5lIEhENjQ0NjFfSVJRX0lSREEJKEhENjQ0NjFfSVJRQkFTRSs2KQorI2RlZmluZSBIRDY0NDYxX0lSUV9UTVUxCShIRDY0NDYxX0lSUUJBU0UrOSkKKyNkZWZpbmUgSEQ2NDQ2MV9JUlFfVE1VMAkoSEQ2NDQ2MV9JUlFCQVNFKzEwKQorI2RlZmluZSBIRDY0NDYxX0lSUV9HUElPCShIRDY0NDYxX0lSUUJBU0UrMTEpCisjZGVmaW5lIEhENjQ0NjFfSVJRX0FGRQkJKEhENjQ0NjFfSVJRQkFTRSsxMikKKyNkZWZpbmUgSEQ2NDQ2MV9JUlFfUENDMQkoSEQ2NDQ2MV9JUlFCQVNFKzEzKQorI2RlZmluZSBIRDY0NDYxX0lSUV9QQ0MwCShIRDY0NDYxX0lSUUJBU0UrMTQpCisKKyNkZWZpbmUgX19JT19QUkVGSVgJaGQ2NDQ2MQorI2luY2x1ZGUgPGFzbS9pb19nZW5lcmljLmg+CisKKy8qIGFyY2gvc2gvY2NoaXBzL2hkNjQ0NngvaGQ2NDQ2MS9zZXR1cC5jICovCitpbnQgaGQ2NDQ2MV9pcnFfZGVtdXgoaW50IGlycSk7Cit2b2lkIGhkNjQ0NjFfcmVnaXN0ZXJfaXJxX2RlbXV4KGludCBpcnEsCisJCQkJaW50ICgqZGVtdXgpIChpbnQgaXJxLCB2b2lkICpkZXYpLCB2b2lkICpkZXYpOwordm9pZCBoZDY0NDYxX3VucmVnaXN0ZXJfaXJxX2RlbXV4KGludCBpcnEpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2hkNjQ0NjEvaW8uaCBiL2luY2x1ZGUvYXNtLXNoL2hkNjQ0NjEvaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdmMjQ4OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9oZDY0NDYxL2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tc2gvaW9faGQ2NDQ2MS5oCi0gKgotICogQ29weXJpZ2h0IDIwMDAgU3R1YXJ0IE1lbmVmeSAoc3R1YXJ0Lm1lbmVmeUBzdC5jb20pCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIElPIGZ1bmN0aW9ucyBmb3IgYW4gSEQ2NDQ2MQotICovCi0KLSNpZm5kZWYgX0FTTV9TSF9JT19IRDY0NDYxX0gKLSNkZWZpbmUgX0FTTV9TSF9JT19IRDY0NDYxX0gKLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgaGQ2NDQ2MV9pbmIodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBoZDY0NDYxX2ludyh1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBoZDY0NDYxX2lubCh1bnNpZ25lZCBsb25nIHBvcnQpOwotCi1leHRlcm4gdm9pZCBoZDY0NDYxX291dGIodW5zaWduZWQgY2hhciB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB2b2lkIGhkNjQ0NjFfb3V0dyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB2b2lkIGhkNjQ0NjFfb3V0bCh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIGhkNjQ0NjFfaW5iX3AodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB2b2lkIGhkNjQ0NjFfb3V0Yl9wKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci0KLWV4dGVybiB2b2lkIGhkNjQ0NjFfaW5zYih1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgaGQ2NDQ2MV9pbnN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBoZDY0NDYxX2luc2wodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLQotZXh0ZXJuIHZvaWQgaGQ2NDQ2MV9vdXRzYih1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBoZDY0NDYxX291dHN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIGhkNjQ0NjFfb3V0c2wodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotCi1leHRlcm4gdW5zaWduZWQgc2hvcnQgaGQ2NDQ2MV9yZWFkdyh1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHZvaWQgaGQ2NDQ2MV93cml0ZXcodW5zaWduZWQgc2hvcnQgYiwgdW5zaWduZWQgbG9uZyBhZGRyKTsKLQotCi1leHRlcm4gaW50IGhkNjQ0NjFfaXJxX2RlbXV4KGludCBpcnEpOwotZXh0ZXJuIHZvaWQgaGQ2NDQ2MV9yZWdpc3Rlcl9pcnFfZGVtdXgoaW50IGlycSwKLQkJaW50ICgqZGVtdXgpKGludCBpcnEsIHZvaWQgKmRldiksIHZvaWQgKmRldik7Ci1leHRlcm4gdm9pZCBoZDY0NDYxX3VucmVnaXN0ZXJfaXJxX2RlbXV4KGludCBpcnEpOwotCi0jZW5kaWYgLyogX0FTTV9TSF9JT19IRDY0NDYxX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2hwNnh4L2hwNnh4LmggYi9pbmNsdWRlL2FzbS1zaC9ocDZ4eC9ocDZ4eC5oCmluZGV4IGEyNjI0N2YuLmYzNTEzNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2hwNnh4L2hwNnh4LmgKKysrIGIvaW5jbHVkZS9hc20tc2gvaHA2eHgvaHA2eHguaApAQCAtMiwxNiArMiwzMyBAQAogI2RlZmluZSBfX0FTTV9TSF9IUDZYWF9ICiAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgIEFuZHJpeSBTa3VseXNoCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUgIEFuZHJpeSBTa3VseXNoCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgogICovCiAKLSNkZWZpbmUgSFA2ODBfVFNfSVJRIElSUTNfSVJRCisjZGVmaW5lIEhQNjgwX0JUTl9JUlEJCUlSUTBfSVJRCisjZGVmaW5lIEhQNjgwX1RTX0lSUQkJSVJRM19JUlEKKyNkZWZpbmUgSFA2ODBfSEQ2NDQ2MV9JUlEJSVJRNF9JUlEKIAogI2RlZmluZSBEQUNfTENEX0JSSUdIVE5FU1MJMAogI2RlZmluZSBEQUNfU1BFQUtFUl9WT0xVTUUJMQogCisjZGVmaW5lIFBHRFJfT1BFTkVECQkweDAxCisjZGVmaW5lIFBHRFJfTUFJTl9CQVRURVJZX09VVAkweDA0CisjZGVmaW5lIFBHRFJfUExBWV9CVVRUT04JMHgwOAorI2RlZmluZSBQR0RSX1JFV0lORF9CVVRUT04JMHgxMAorI2RlZmluZSBQR0RSX1JFQ09SRF9CVVRUT04JMHgyMAorCiAjZGVmaW5lIFBIRFJfVFNfUEVOX0RPV04JMHgwOAogCisjZGVmaW5lIFBKRFJfTEVEX0JMSU5LCQkweDAyCisKKyNkZWZpbmUgUEtEUl9MRURfR1JFRU4JCTB4MTAKKwogI2RlZmluZSBTQ1BEUl9UU19TQ0FOX0VOQUJMRQkweDIwCiAjZGVmaW5lIFNDUERSX1RTX1NDQU5fWQkJMHgwMgogI2RlZmluZSBTQ1BEUl9UU19TQ0FOX1gJCTB4MDEKQEAgLTIxLDExICszOCw0MyBAQAogCiAjZGVmaW5lIEFEQ19DSEFOTkVMX1RTX1kJMQogI2RlZmluZSBBRENfQ0hBTk5FTF9UU19YCTIKKyNkZWZpbmUgQURDX0NIQU5ORUxfQkFUVEVSWQkzCisjZGVmaW5lIEFEQ19DSEFOTkVMX0JBQ0tVUAk0CisjZGVmaW5lIEFEQ19DSEFOTkVMX0NIQVJHRQk1CiAKICNkZWZpbmUgSEQ2NDQ2MV9HUEFEUl9TUEVBS0VSCTB4MDEKICNkZWZpbmUgSEQ2NDQ2MV9HUEFEUl9QQ01DSUEwCSgweDAyfDB4MDgpCisKICNkZWZpbmUgSEQ2NDQ2MV9HUEJEUl9MQ0RPRkYJMHgwMQorI2RlZmluZSBIRDY0NDYxX0dQQkRSX0xDRF9DT05UUkFTVF9NQVNLCTB4NzgKICNkZWZpbmUgSEQ2NDQ2MV9HUEJEUl9MRURfUkVECTB4ODAKIAorI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgUEpEUgkweGE0MDAwMTMwCisjZGVmaW5lIFBLRFIJMHhhNDAwMDEzMgorCitzdGF0aWMgaW5saW5lIHZvaWQgaHA2eHhfbGVkX3JlZChpbnQgb24pCit7CisJdTE2IHYxNjsKKwl2MTYgPSBjdHJsX2ludyhDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyBIRDY0NDYxX0dQQkRSIC0gMHgxMDAwMCk7CisJaWYgKG9uKQorCSAgICBjdHJsX291dHcodjE2ICYgKH5IRDY0NDYxX0dQQkRSX0xFRF9SRUQpLCBDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyBIRDY0NDYxX0dQQkRSIC0gMHgxMDAwMCk7CisJZWxzZQorCSAgICBjdHJsX291dHcodjE2IHwgSEQ2NDQ2MV9HUEJEUl9MRURfUkVELCBDT05GSUdfSEQ2NDQ2MV9JT0JBU0UgKyBIRDY0NDYxX0dQQkRSIC0gMHgxMDAwMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBocDZ4eF9sZWRfZ3JlZW4oaW50IG9uKQoreworCXU4IHY4OworCisJdjggPSBjdHJsX2luYihQS0RSKTsKKwlpZiAob24pCisJICAgIGN0cmxfb3V0Yih2OCAmICh+UEtEUl9MRURfR1JFRU4pLCBQS0RSKTsKKwllbHNlCisJICAgIGN0cmxfb3V0Yih2OCB8IFBLRFJfTEVEX0dSRUVOLCBQS0RSKTsKK30KKwogCiAjZW5kaWYgLyogX19BU01fU0hfSFA2WFhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaHA2eHgvaW8uaCBiL2luY2x1ZGUvYXNtLXNoL2hwNnh4L2lvLmgKaW5kZXggNzMxNzk4MC4uMjA0NDQ3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvaHA2eHgvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1zaC9ocDZ4eC9pby5oCkBAIC00LDcgKzQsNyBAQAogLyoKICAqIE5vdGhpbmcgc3BlY2lhbCBoZXJlLi4ganVzdCB1c2UgdGhlIGdlbmVyaWMgY2NoaXAgaW8gcm91dGluZXMuCiAgKi8KLSNpbmNsdWRlIDxhc20vaGQ2NDQ2MS9pby5oPgorI2luY2x1ZGUgPGFzbS9oZDY0NDYxLmg+CiAKICNlbmRpZiAvKiBfX0FTTV9TSF9IUDZYWF9JT19IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2hzNzc1MXJ2b2lwL2hzNzc1MXJ2b2lwLmggYi9pbmNsdWRlL2FzbS1zaC9oczc3NTFydm9pcC9oczc3NTFydm9pcC5oCmluZGV4IDVmOTk1ZjkuLmM0Y2ZmOWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2hzNzc1MXJ2b2lwL2hzNzc1MXJ2b2lwLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvaHM3NzUxcnZvaXAvaHM3NzUxcnZvaXAuaApAQCAtMTksOCArMTksNiBAQAogI2RlZmluZSBQQV9PVVRQT1JUUgkweGE0MDAwMDBlCS8qIE91dHB1dCBQb3J0IFJlZ3VzdGVyICovCiAjZGVmaW5lIFBBX1ZFUlJFRwkweGE0MDAwMDE0CS8qIEZQR0EgVmVyc2lvbiBSZWdpc3RlciAqLwogCi0jZGVmaW5lIFBBX0FSRUE1X0lPCTB4YjQwMDAwMDAJLyogQXJlYSA1IElPIE1lbW9yeSAqLwotI2RlZmluZSBQQV9BUkVBNl9JTwkweGI4MDAwMDAwCS8qIEFyZWEgNiBJTyBNZW1vcnkgKi8KICNkZWZpbmUgUEFfSURFX09GRlNFVAkweDFmMAkJLyogQ0YgSURFIE9mZnNldCAqLwogCiAjZGVmaW5lIElSTENOVFIxCShQQV9CQ1IgKyAwKQkvKiBJbnRlcnJ1cHQgQ29udHJvbCBSZWdpc3RlcjEgKi8KQEAgLTQ0LDQgKzQyLDEzIEBACiAjZGVmaW5lCUlSUV9SSU5HSU5HCTQJCS8qIFJpbmdpbmcgSVJRICovCiAjZGVmaW5lCUlSUV9DT0RFQwk1CQkvKiBDT0RFQyBJUlEgKi8KIAorI2RlZmluZSBfX0lPX1BSRUZJWAloczc3NTFydm9pcAorI2luY2x1ZGUgPGFzbS9pb19nZW5lcmljLmg+CisKKy8qIGFyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvaXJxLmMgKi8KK3ZvaWQgaW5pdF9oczc3NTFydm9pcF9JUlEodm9pZCk7CisKKy8qIGFyY2gvc2gvYm9hcmRzL3JlbmVzYXMvaHM3NzUxcnZvaXAvaW8uYyAqLwordm9pZCAqaHM3NzUxcnZvaXBfaW9yZW1hcCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKKwogI2VuZGlmICAvKiBfX0FTTV9TSF9SRU5FU0FTX0hTNzc1MVJWT0lQICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9pby5oIGIvaW5jbHVkZS9hc20tc2gvaW8uaAppbmRleCA4OTRlNjRiLi5lZDEyZDM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2lvLmgKQEAgLTEwNyw2ICsxMDcsOSBAQAogI2RlZmluZSBfX3Jhd193cml0ZXcodiwgYSkJX193cml0ZXcodiwgKHZvaWQgX19pb21lbSAqKShhKSkKICNkZWZpbmUgX19yYXdfd3JpdGVsKHYsIGEpCV9fd3JpdGVsKHYsICh2b2lkIF9faW9tZW0gKikoYSkpCiAKK3ZvaWQgX19yYXdfd3JpdGVzbCh1bnNpZ25lZCBsb25nIGFkZHIsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsb25nbGVuKTsKK3ZvaWQgX19yYXdfcmVhZHNsKHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqZGF0YSwgaW50IGxvbmdsZW4pOworCiAvKgogICogVGhlIHBsYXRmb3JtIGhlYWRlciBmaWxlcyBtYXkgZGVmaW5lIHNvbWUgb2YgdGhlc2UgbWFjcm9zIHRvIHVzZQogICogdGhlIGlubGluZWQgdmVyc2lvbnMgd2hlcmUgYXBwcm9wcmlhdGUuICBUaGVzZSBtYWNyb3MgbWF5IGFsc28gYmUKQEAgLTEzMiw2ICsxMzUsOSBAQAogIyBkZWZpbmUgd3JpdGVsKHYsYSkJKHsgX19yYXdfd3JpdGVsKCh2KSwoYSkpOyBtYigpOyB9KQogI2VuZGlmCiAKKyNkZWZpbmUgd3JpdGVzbCBfX3Jhd193cml0ZXNsCisjZGVmaW5lIHJlYWRzbCAgX19yYXdfcmVhZHNsCisKICNkZWZpbmUgcmVhZGJfcmVsYXhlZChhKSByZWFkYihhKQogI2RlZmluZSByZWFkd19yZWxheGVkKGEpIHJlYWR3KGEpCiAjZGVmaW5lIHJlYWRsX3JlbGF4ZWQoYSkgcmVhZGwoYSkKQEAgLTIwOSw4ICsyMTUsMTQgQEAKICAgICAgICAgKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nKilhZGRyID0gYjsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGN0cmxfZGVsYXkodm9pZCkKK3sKKwljdHJsX2ludyhQMlNFRyk7Cit9CisKICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQgMHhmZmZmZmZmZgogCisjaWZkZWYgQ09ORklHX01NVQogLyoKICAqIENoYW5nZSB2aXJ0dWFsIGFkZHJlc3NlcyB0byBwaHlzaWNhbCBhZGRyZXNzZXMgYW5kIHZ2LgogICogVGhlc2UgYXJlIHRyaXZpYWwgb24gdGhlIDE6MSBMaW51eC9TdXBlckggbWFwcGluZwpAQCAtMjI0LDYgKzIzNiwxMCBAQAogewogCXJldHVybiAodm9pZCAqKVAxU0VHQUREUihhZGRyZXNzKTsKIH0KKyNlbHNlCisjZGVmaW5lIHBoeXNfdG9fdmlydChhZGRyZXNzKQkoKHZvaWQgKikoYWRkcmVzcykpCisjZGVmaW5lIHZpcnRfdG9fcGh5cyhhZGRyZXNzKQkoKHVuc2lnbmVkIGxvbmcpKGFkZHJlc3MpKQorI2VuZGlmCiAKICNkZWZpbmUgdmlydF90b19idXMgdmlydF90b19waHlzCiAjZGVmaW5lIGJ1c190b192aXJ0IHBoeXNfdG9fdmlydApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaXJxLXNoNzMxODAuaCBiL2luY2x1ZGUvYXNtLXNoL2lycS1zaDczMTgwLmgKaW5kZXggZDcwNTI1Mi4uYjI4YWY5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvaXJxLXNoNzMxODAuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9pcnEtc2g3MzE4MC5oCkBAIC0zMTEsNiArMzExLDQgQEAKICNkZWZpbmUgSVJRNl9QUklPUklUWQkxCiAjZGVmaW5lIElSUTdfUFJJT1JJVFkJMQogCi1pbnQgc2htc2VfaXJxX2RlbXV4KGludCBpcnEpOwotCiAjZW5kaWYgLyogX19BU01fU0hfSVJRX1NINzMxODBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaXJxLXNoNzM0My5oIGIvaW5jbHVkZS9hc20tc2gvaXJxLXNoNzM0My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTU0MTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9pcnEtc2g3MzQzLmgKQEAgLTAsMCArMSwzMTcgQEAKKyNpZm5kZWYgX19BU01fU0hfSVJRX1NINzM0M19ICisjZGVmaW5lIF9fQVNNX1NIX0lSUV9TSDczNDNfSAorCisvKgorICogbGludXgvaW5jbHVkZS9hc20tc2gvaXJxLXNoNzM0My5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEtlbmF0aSBUZWNobm9sb2dpZXMgSW5jLgorICogQW5kcmUgTWNjdXJkeSA8YW5kcmVAa2VuYXRpLmNvbT4KKyAqIFJhbmppdCBEZXNocGFuZGUgPHJhbmppdEBrZW5hdGkuY29tPgorICovCisKKyN1bmRlZiBJTlRDX0lQUkEKKyN1bmRlZiBJTlRDX0lQUkIKKyN1bmRlZiBJTlRDX0lQUkMKKyN1bmRlZiBJTlRDX0lQUkQKKworI3VuZGVmIERNVEUwX0lSUQorI3VuZGVmIERNVEUxX0lSUQorI3VuZGVmIERNVEUyX0lSUQorI3VuZGVmIERNVEUzX0lSUQorI3VuZGVmIERNVEU0X0lSUQorI3VuZGVmIERNVEU1X0lSUQorI3VuZGVmIERNVEU2X0lSUQorI3VuZGVmIERNVEU3X0lSUQorI3VuZGVmIERNQUVfSVJRCisjdW5kZWYgRE1BX0lQUl9BRERSCisjdW5kZWYgRE1BX0lQUl9QT1MKKyN1bmRlZiBETUFfUFJJT1JJVFkKKworI3VuZGVmIElOVENfSU1DUjAKKyN1bmRlZiBJTlRDX0lNQ1IxCisjdW5kZWYgSU5UQ19JTUNSMgorI3VuZGVmIElOVENfSU1DUjMKKyN1bmRlZiBJTlRDX0lNQ1I0CisjdW5kZWYgSU5UQ19JTUNSNQorI3VuZGVmIElOVENfSU1DUjYKKyN1bmRlZiBJTlRDX0lNQ1I3CisjdW5kZWYgSU5UQ19JTUNSOAorI3VuZGVmIElOVENfSU1DUjkKKyN1bmRlZiBJTlRDX0lNQ1IxMAorCisKKyNkZWZpbmUgSU5UQ19JUFJBICAJMHhBNDA4MDAwMFVMCisjZGVmaW5lIElOVENfSVBSQiAgCTB4QTQwODAwMDRVTAorI2RlZmluZSBJTlRDX0lQUkMgIAkweEE0MDgwMDA4VUwKKyNkZWZpbmUgSU5UQ19JUFJEICAJMHhBNDA4MDAwQ1VMCisjZGVmaW5lIElOVENfSVBSRSAgCTB4QTQwODAwMTBVTAorI2RlZmluZSBJTlRDX0lQUkYgIAkweEE0MDgwMDE0VUwKKyNkZWZpbmUgSU5UQ19JUFJHICAJMHhBNDA4MDAxOFVMCisjZGVmaW5lIElOVENfSVBSSCAgCTB4QTQwODAwMUNVTAorI2RlZmluZSBJTlRDX0lQUkkgIAkweEE0MDgwMDIwVUwKKyNkZWZpbmUgSU5UQ19JUFJKICAJMHhBNDA4MDAyNFVMCisjZGVmaW5lIElOVENfSVBSSyAgCTB4QTQwODAwMjhVTAorI2RlZmluZSBJTlRDX0lQUkwgIAkweEE0MDgwMDJDVUwKKworI2RlZmluZSBJTlRDX0lNUjAJMHhBNDA4MDA4MFVMCisjZGVmaW5lIElOVENfSU1SMQkweEE0MDgwMDg0VUwKKyNkZWZpbmUgSU5UQ19JTVIyCTB4QTQwODAwODhVTAorI2RlZmluZSBJTlRDX0lNUjMJMHhBNDA4MDA4Q1VMCisjZGVmaW5lIElOVENfSU1SNAkweEE0MDgwMDkwVUwKKyNkZWZpbmUgSU5UQ19JTVI1CTB4QTQwODAwOTRVTAorI2RlZmluZSBJTlRDX0lNUjYJMHhBNDA4MDA5OFVMCisjZGVmaW5lIElOVENfSU1SNwkweEE0MDgwMDlDVUwKKyNkZWZpbmUgSU5UQ19JTVI4CTB4QTQwODAwQTBVTAorI2RlZmluZSBJTlRDX0lNUjkJMHhBNDA4MDBBNFVMCisjZGVmaW5lIElOVENfSU1SMTAJMHhBNDA4MDBBOFVMCisjZGVmaW5lIElOVENfSU1SMTEJMHhBNDA4MDBBQ1VMCisKKyNkZWZpbmUgSU5UQ19JTUNSMAkweEE0MDgwMEMwVUwKKyNkZWZpbmUgSU5UQ19JTUNSMQkweEE0MDgwMEM0VUwKKyNkZWZpbmUgSU5UQ19JTUNSMgkweEE0MDgwMEM4VUwKKyNkZWZpbmUgSU5UQ19JTUNSMwkweEE0MDgwMENDVUwKKyNkZWZpbmUgSU5UQ19JTUNSNAkweEE0MDgwMEQwVUwKKyNkZWZpbmUgSU5UQ19JTUNSNQkweEE0MDgwMEQ0VUwKKyNkZWZpbmUgSU5UQ19JTUNSNgkweEE0MDgwMEQ4VUwKKyNkZWZpbmUgSU5UQ19JTUNSNwkweEE0MDgwMERDVUwKKyNkZWZpbmUgSU5UQ19JTUNSOAkweEE0MDgwMEUwVUwKKyNkZWZpbmUgSU5UQ19JTUNSOQkweEE0MDgwMEU0VUwKKyNkZWZpbmUgSU5UQ19JTUNSMTAJMHhBNDA4MDBFOFVMCisjZGVmaW5lIElOVENfSU1DUjExCTB4QTQwODAwRUNVTAorCisjZGVmaW5lIElOVENfSUNSMAkweEE0MTQwMDAwVUwKKyNkZWZpbmUgSU5UQ19JQ1IxCTB4QTQxNDAwMUNVTAorCisjZGVmaW5lIElOVE1TSzAJCTB4YTQxNDAwNDQKKyNkZWZpbmUgSU5UTVNLQ0xSMAkweGE0MTQwMDY0CisjZGVmaW5lIElOVENfSU5UUFJJMAkweGE0MTQwMDEwCisKKy8qCisgIE5PVEU6CisKKyAgKl9JUlEgPSAoSU5URVZUMiAtIDB4MjAwKS8weDIwCisqLworCisvKiBUTVUwICovCisjZGVmaW5lIFRNVTBfSVJRCTE2CisjZGVmaW5lIFRNVTBfSVBSX0FERFIJSU5UQ19JUFJBCisjZGVmaW5lIFRNVTBfSVBSX1BPUwkgMworI2RlZmluZSBUTVUwX1BSSU9SSVRZCSAyCisKKyNkZWZpbmUgVElNRVJfSVJRICAgICAgIDE2CisjZGVmaW5lIFRJTUVSX0lQUl9BRERSICBJTlRDX0lQUkEKKyNkZWZpbmUgVElNRVJfSVBSX1BPUyAgICAzCisjZGVmaW5lIFRJTUVSX1BSSU9SSVRZICAgMgorCisvKiBUTVUxICovCisjZGVmaW5lIFRNVTFfSVJRCTE3CisjZGVmaW5lIFRNVTFfSVBSX0FERFIJSU5UQ19JUFJBCisjZGVmaW5lIFRNVTFfSVBSX1BPUwkgMgorI2RlZmluZSBUTVUxX1BSSU9SSVRZCSAyCisKKy8qIFRNVTIgKi8KKyNkZWZpbmUgVE1VMl9JUlEJMTgKKyNkZWZpbmUgVE1VMl9JUFJfQUREUglJTlRDX0lQUkEKKyNkZWZpbmUgVE1VMl9JUFJfUE9TCSAxCisjZGVmaW5lIFRNVTJfUFJJT1JJVFkJIDIKKworLyogTENEQyAqLworI2RlZmluZSBMQ0RDX0lSUQkyOAorI2RlZmluZSBMQ0RDX0lQUl9BRERSCUlOVENfSVBSQgorI2RlZmluZSBMQ0RDX0lQUl9QT1MJIDIKKyNkZWZpbmUgTENEQ19QUklPUklUWQkgMgorCisvKiBWSU8gKFZpZGVvIEkvTykgKi8KKyNkZWZpbmUgQ0VVX0lSUQkJNTIKKyNkZWZpbmUgQkVVX0lSUQkJNTMKKyNkZWZpbmUgVkVVX0lSUQkJNTQKKyNkZWZpbmUgVk9VX0lSUQkJNTUKKyNkZWZpbmUgVklPX0lQUl9BRERSCUlOVENfSVBSRQorI2RlZmluZSBWSU9fSVBSX1BPUwkgMgorI2RlZmluZSBWSU9fUFJJT1JJVFkJIDIKKworLyogTUZJIChNdWx0aSBGdW5jdGlvbmFsIEludGVyZmFjZSkgKi8KKyNkZWZpbmUgTUZJX0lSUQkJNTYKKyNkZWZpbmUgTUZJX0lQUl9BRERSCUlOVENfSVBSRQorI2RlZmluZSBNRklfSVBSX1BPUwkgMQorI2RlZmluZSBNRklfUFJJT1JJVFkJIDIKKworLyogVlBVIChWaWRlbyBQcm9jZXNzaW5nIFVuaXQpICovCisjZGVmaW5lIFZQVV9JUlEJCTYwCisjZGVmaW5lIFZQVV9JUFJfQUREUglJTlRDX0lQUkUKKyNkZWZpbmUgVlBVX0lQUl9QT1MJIDAKKyNkZWZpbmUgVlBVX1BSSU9SSVRZCSAyCisKKy8qIDNERyAqLworI2RlZmluZSBUREdfSVJRCQk2MworI2RlZmluZSBUREdfSVBSX0FERFIJSU5UQ19JUFJKCisjZGVmaW5lIFRER19JUFJfUE9TCSAyCisjZGVmaW5lIFRER19QUklPUklUWQkgMgorCisvKiBETUFDKDEpICovCisjZGVmaW5lIERNVEUwX0lSUQk0OAorI2RlZmluZSBETVRFMV9JUlEJNDkKKyNkZWZpbmUgRE1URTJfSVJRCTUwCisjZGVmaW5lIERNVEUzX0lSUQk1MQorI2RlZmluZSBETUExX0lQUl9BRERSCUlOVENfSVBSRQorI2RlZmluZSBETUExX0lQUl9QT1MJMworI2RlZmluZSBETUExX1BSSU9SSVRZCTcKKworLyogRE1BQygyKSAqLworI2RlZmluZSBETVRFNF9JUlEJNzYKKyNkZWZpbmUgRE1URTVfSVJRCTc3CisjZGVmaW5lIERNQTJfSVBSX0FERFIJSU5UQ19JUFJGCisjZGVmaW5lIERNQTJfSVBSX1BPUwkyCisjZGVmaW5lIERNQTJfUFJJT1JJVFkJNworCisvKiBTQ0lGMCAqLworI2RlZmluZSBTQ0lGX0VSSV9JUlEJODAKKyNkZWZpbmUgU0NJRl9SWElfSVJRCTgxCisjZGVmaW5lIFNDSUZfQlJJX0lSUQk4MgorI2RlZmluZSBTQ0lGX1RYSV9JUlEJODMKKyNkZWZpbmUgU0NJRl9JUFJfQUREUglJTlRDX0lQUkcKKyNkZWZpbmUgU0NJRl9JUFJfUE9TCTMKKyNkZWZpbmUgU0NJRl9QUklPUklUWQkzCisKKy8qIFNJT0YwICovCisjZGVmaW5lIFNJT0YwX0lSUQk4NAorI2RlZmluZSBTSU9GMF9JUFJfQUREUglJTlRDX0lQUkgKKyNkZWZpbmUgU0lPRjBfSVBSX1BPUwkzCisjZGVmaW5lIFNJT0YwX1BSSU9SSVRZCTMKKworLyogRkxDVEwgKEZsYXNoIE1lbW9yeSBDb250cm9sbGVyKSAqLworI2RlZmluZSBGTFNURV9JUlEJOTIKKyNkZWZpbmUgRkxURU5EX0lSUQk5MworI2RlZmluZSBGTFRSUTBfSVJRCTk0CisjZGVmaW5lIEZMVFJRMV9JUlEJOTUKKyNkZWZpbmUgRkxDVExfSVBSX0FERFIJSU5UQ19JUFJICisjZGVmaW5lIEZMQ1RMX0lQUl9QT1MJMQorI2RlZmluZSBGTENUTF9QUklPUklUWQkzCisKKy8qIElJQygwKSAoSUlDIEJ1cyBJbnRlcmZhY2UpICovCisjZGVmaW5lIElJQzBfQUxJX0lSUQk5NgorI2RlZmluZSBJSUMwX1RBQ0tJX0lSUQk5NworI2RlZmluZSBJSUMwX1dBSVRJX0lSUQk5OAorI2RlZmluZSBJSUMwX0RURUlfSVJRCTk5CisjZGVmaW5lIElJQzBfSVBSX0FERFIJSU5UQ19JUFJICisjZGVmaW5lIElJQzBfSVBSX1BPUwkwCisjZGVmaW5lIElJQzBfUFJJT1JJVFkJMworCisvKiBJSUMoMSkgKElJQyBCdXMgSW50ZXJmYWNlKSAqLworI2RlZmluZSBJSUMxX0FMSV9JUlEJNDQKKyNkZWZpbmUgSUlDMV9UQUNLSV9JUlEJNDUKKyNkZWZpbmUgSUlDMV9XQUlUSV9JUlEJNDYKKyNkZWZpbmUgSUlDMV9EVEVJX0lSUQk0NworI2RlZmluZSBJSUMxX0lQUl9BRERSCUlOVENfSVBSSQorI2RlZmluZSBJSUMxX0lQUl9QT1MJMAorI2RlZmluZSBJSUMxX1BSSU9SSVRZCTMKKworLyogU0lPMCAqLworI2RlZmluZSBTSU8wX0lSUQk4OAorI2RlZmluZSBTSU8wX0lQUl9BRERSCUlOVENfSVBSSQorI2RlZmluZSBTSU8wX0lQUl9QT1MJMworI2RlZmluZSBTSU8wX1BSSU9SSVRZCTMKKworLyogU0RISSAqLworI2RlZmluZSBTREhJX1NESElJMF9JUlEJMTAwCisjZGVmaW5lIFNESElfU0RISUkxX0lSUQkxMDEKKyNkZWZpbmUgU0RISV9TREhJSTJfSVJRCTEwMgorI2RlZmluZSBTREhJX1NESElJM19JUlEJMTAzCisjZGVmaW5lIFNESElfSVBSX0FERFIJSU5UQ19JUFJLCisjZGVmaW5lIFNESElfSVBSX1BPUwkwCisjZGVmaW5lIFNESElfUFJJT1JJVFkJMworCisvKiBTSVUgKFNvdW5kIEludGVyZmFjZSBVbml0KSAqLworI2RlZmluZSBTSVVfSVJRCQkxMDgKKyNkZWZpbmUgU0lVX0lQUl9BRERSCUlOVENfSVBSSgorI2RlZmluZSBTSVVfSVBSX1BPUwkxCisjZGVmaW5lIFNJVV9QUklPUklUWQkzCisKKyNkZWZpbmUgUE9SVF9QQUNSCTB4QTQwNTAxMDBVTAorI2RlZmluZSBQT1JUX1BCQ1IJMHhBNDA1MDEwMlVMCisjZGVmaW5lIFBPUlRfUENDUgkweEE0MDUwMTA0VUwKKyNkZWZpbmUgUE9SVF9QRENSCTB4QTQwNTAxMDZVTAorI2RlZmluZSBQT1JUX1BFQ1IJMHhBNDA1MDEwOFVMCisjZGVmaW5lIFBPUlRfUEZDUgkweEE0MDUwMTBBVUwKKyNkZWZpbmUgUE9SVF9QR0NSCTB4QTQwNTAxMENVTAorI2RlZmluZSBQT1JUX1BIQ1IJMHhBNDA1MDEwRVVMCisjZGVmaW5lIFBPUlRfUEpDUgkweEE0MDUwMTEwVUwKKyNkZWZpbmUgUE9SVF9QS0NSCTB4QTQwNTAxMTJVTAorI2RlZmluZSBQT1JUX1BMQ1IJMHhBNDA1MDExNFVMCisjZGVmaW5lIFBPUlRfU0NQQ1IJMHhBNDA1MDExNlVMCisjZGVmaW5lIFBPUlRfUE1DUgkweEE0MDUwMTE4VUwKKyNkZWZpbmUgUE9SVF9QTkNSCTB4QTQwNTAxMUFVTAorI2RlZmluZSBQT1JUX1BRQ1IJMHhBNDA1MDExQ1VMCisjZGVmaW5lIFBPUlRfUFJDUgkweEE0MDUwMTFFVUwKKyNkZWZpbmUgUE9SVF9QVENSCTB4QTQwNTAxNENVTAorI2RlZmluZSBQT1JUX1BVQ1IJMHhBNDA1MDE0RVVMCisjZGVmaW5lIFBPUlRfUFZDUgkweEE0MDUwMTUwVUwKKworI2RlZmluZSBQT1JUX1BTRUxBCTB4QTQwNTAxNDBVTAorI2RlZmluZSBQT1JUX1BTRUxCCTB4QTQwNTAxNDJVTAorI2RlZmluZSBQT1JUX1BTRUxDCTB4QTQwNTAxNDRVTAorI2RlZmluZSBQT1JUX1BTRUxFCTB4QTQwNTAxNThVTAorCisjZGVmaW5lIFBPUlRfSElaQ1JBCTB4QTQwNTAxNDZVTAorI2RlZmluZSBQT1JUX0hJWkNSQgkweEE0MDUwMTQ4VUwKKyNkZWZpbmUgUE9SVF9EUlZDUgkweEE0MDUwMTRBVUwKKworI2RlZmluZSBQT1JUX1BBRFIgIAkweEE0MDUwMTIwVUwKKyNkZWZpbmUgUE9SVF9QQkRSICAJMHhBNDA1MDEyMlVMCisjZGVmaW5lIFBPUlRfUENEUiAgCTB4QTQwNTAxMjRVTAorI2RlZmluZSBQT1JUX1BERFIgIAkweEE0MDUwMTI2VUwKKyNkZWZpbmUgUE9SVF9QRURSICAJMHhBNDA1MDEyOFVMCisjZGVmaW5lIFBPUlRfUEZEUiAgCTB4QTQwNTAxMkFVTAorI2RlZmluZSBQT1JUX1BHRFIgIAkweEE0MDUwMTJDVUwKKyNkZWZpbmUgUE9SVF9QSERSICAJMHhBNDA1MDEyRVVMCisjZGVmaW5lIFBPUlRfUEpEUiAgCTB4QTQwNTAxMzBVTAorI2RlZmluZSBQT1JUX1BLRFIgIAkweEE0MDUwMTMyVUwKKyNkZWZpbmUgUE9SVF9QTERSICAJMHhBNDA1MDEzNFVMCisjZGVmaW5lIFBPUlRfU0NQRFIgIAkweEE0MDUwMTM2VUwKKyNkZWZpbmUgUE9SVF9QTURSICAJMHhBNDA1MDEzOFVMCisjZGVmaW5lIFBPUlRfUE5EUiAgCTB4QTQwNTAxM0FVTAorI2RlZmluZSBQT1JUX1BRRFIgIAkweEE0MDUwMTNDVUwKKyNkZWZpbmUgUE9SVF9QUkRSICAJMHhBNDA1MDEzRVVMCisjZGVmaW5lIFBPUlRfUFREUiAgCTB4QTQwNTAxNkNVTAorI2RlZmluZSBQT1JUX1BVRFIgIAkweEE0MDUwMTZFVUwKKyNkZWZpbmUgUE9SVF9QVkRSICAJMHhBNDA1MDE3MFVMCisKKyNkZWZpbmUgSVJRMF9JUlEJMzIKKyNkZWZpbmUgSVJRMV9JUlEJMzMKKyNkZWZpbmUgSVJRMl9JUlEJMzQKKyNkZWZpbmUgSVJRM19JUlEJMzUKKyNkZWZpbmUgSVJRNF9JUlEJMzYKKyNkZWZpbmUgSVJRNV9JUlEJMzcKKyNkZWZpbmUgSVJRNl9JUlEJMzgKKyNkZWZpbmUgSVJRN19JUlEJMzkKKworI2RlZmluZSBJTlRQUkkwMAkweEE0MTQwMDEwVUwKKworI2RlZmluZSBJUlEwX0lQUl9BRERSCUlOVFBSSTAwCisjZGVmaW5lIElSUTFfSVBSX0FERFIJSU5UUFJJMDAKKyNkZWZpbmUgSVJRMl9JUFJfQUREUglJTlRQUkkwMAorI2RlZmluZSBJUlEzX0lQUl9BRERSCUlOVFBSSTAwCisjZGVmaW5lIElSUTRfSVBSX0FERFIJSU5UUFJJMDAKKyNkZWZpbmUgSVJRNV9JUFJfQUREUglJTlRQUkkwMAorI2RlZmluZSBJUlE2X0lQUl9BRERSCUlOVFBSSTAwCisjZGVmaW5lIElSUTdfSVBSX0FERFIJSU5UUFJJMDAKKworI2RlZmluZSBJUlEwX0lQUl9QT1MJNworI2RlZmluZSBJUlExX0lQUl9QT1MJNgorI2RlZmluZSBJUlEyX0lQUl9QT1MJNQorI2RlZmluZSBJUlEzX0lQUl9QT1MJNAorI2RlZmluZSBJUlE0X0lQUl9QT1MJMworI2RlZmluZSBJUlE1X0lQUl9QT1MJMgorI2RlZmluZSBJUlE2X0lQUl9QT1MJMQorI2RlZmluZSBJUlE3X0lQUl9QT1MJMAorCisjZGVmaW5lIElSUTBfUFJJT1JJVFkJMQorI2RlZmluZSBJUlExX1BSSU9SSVRZCTEKKyNkZWZpbmUgSVJRMl9QUklPUklUWQkxCisjZGVmaW5lIElSUTNfUFJJT1JJVFkJMQorI2RlZmluZSBJUlE0X1BSSU9SSVRZCTEKKyNkZWZpbmUgSVJRNV9QUklPUklUWQkxCisjZGVmaW5lIElSUTZfUFJJT1JJVFkJMQorI2RlZmluZSBJUlE3X1BSSU9SSVRZCTEKKworI2VuZGlmIC8qIF9fQVNNX1NIX0lSUV9TSDczNDNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaXJxLXNoNzc4MC5oIGIvaW5jbHVkZS9hc20tc2gvaXJxLXNoNzc4MC5oCmluZGV4IDdmOTAzMTUuLjg5NWM1NzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2lycS1zaDc3ODAuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9pcnEtc2g3NzgwLmgKQEAgLTE0NSwxMSArMTQ1LDYgQEAKICNkZWZpbmUJVE1VX0NINV9JUFJfUE9TCQkxCiAjZGVmaW5lIFRNVV9DSDVfUFJJT1JJVFkJMgogCi0jZGVmaW5lCVJUQ19JUlEJCTIyCi0jZGVmaW5lCVJUQ19JUFJfQUREUglJTlRDX0lOVDJQUkkxCi0jZGVmaW5lCVJUQ19JUFJfUE9TCTAKLSNkZWZpbmUJUlRDX1BSSU9SSVRZCVRJTUVSX1BSSU9SSVRZCi0KIC8qIFNDSUYwICovCiAjZGVmaW5lIFNDSUYwX0VSSV9JUlEJNDAKICNkZWZpbmUgU0NJRjBfUlhJX0lSUQk0MQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvaXJxLmggYi9pbmNsdWRlL2FzbS1zaC9pcnEuaAppbmRleCA2MTFlNjdjLi4wZTVmMzY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9pcnEuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9pcnEuaApAQCAtMTkyLDcgKzE5Miw3IEBACiAKICNpZiBkZWZpbmVkIChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KSB8fCBkZWZpbmVkIChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4KSB8fCBcCiAgICAgZGVmaW5lZCAoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSkgfHwgZGVmaW5lZCAoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkgfHwgXAotICAgIGRlZmluZWQgKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpCisgICAgZGVmaW5lZCAoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkgfHwgZGVmaW5lZCAoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNikKICNkZWZpbmUgU0NJX0VSSV9JUlEJMjMKICNkZWZpbmUgU0NJX1JYSV9JUlEJMjQKICNkZWZpbmUgU0NJX1RYSV9JUlEJMjUKQEAgLTIwNyw2ICsyMDcsNyBAQAogI2RlZmluZSBTQ0lGMF9JUFJfUE9TCTMKICNkZWZpbmUgU0NJRjBfUFJJT1JJVFkJMwogI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYpIHx8IFwKICAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNykgfHwgXAogICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KQogI2RlZmluZSBTQ0lGX0VSSV9JUlEJNTYKQEAgLTI2MSw5ICsyNjIsMTIgQEAKICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCkKICMgZGVmaW5lIE9OQ0hJUF9OUl9JUlFTIDMyCiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNikgfHwgXAogICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQogIyBkZWZpbmUgT05DSElQX05SX0lSUVMgNjQJLy8gQWN0dWFsbHkgNjEKICMgZGVmaW5lIFBJTlRfTlJfSVJRUyAgIDE2CisjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApCisjIGRlZmluZSBPTkNISVBfTlJfSVJRUyAxMDQKICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkKICMgZGVmaW5lIE9OQ0hJUF9OUl9JUlFTIDQ4CS8vIEFjdHVhbGx5IDQ0CiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpCkBAIC0yNzUsNyArMjc5LDggQEAKICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NUNDBTVEIxKQogIyBkZWZpbmUgT05DSElQX05SX0lSUVMgMTQ0CiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzMxODApCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwKSB8fCBcCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMpCiAjIGRlZmluZSBPTkNISVBfTlJfSVJRUyAxMDkKICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkKICMgZGVmaW5lIE9OQ0hJUF9OUl9JUlFTIDExMQpAQCAtMzExLDYgKzMxNiw4IEBACiAjIGRlZmluZSBPRkZDSElQX05SX0lSUVMgNAogI2VsaWYgZGVmaW5lZChDT05GSUdfU0hfUjc3ODBSUCkKICMgZGVmaW5lIE9GRkNISVBfTlJfSVJRUyAxNgorI2VsaWYgZGVmaW5lZChDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUpCisjIGRlZmluZSBPRkZDSElQX05SX0lSUVMgMTIKICNlbGlmIGRlZmluZWQoQ09ORklHX1NIX1VOS05PV04pCiAjIGRlZmluZSBPRkZDSElQX05SX0lSUVMgMTYJLyogTXVzdCBhbHNvIGJlIGxhc3QgKi8KICNlbHNlCkBAIC0zMzUsNiArMzQyLDExIEBACiBleHRlcm4gdW5zaWduZWQgc2hvcnQgKmlycV9tYXNrX3JlZ2lzdGVyOwogCiAvKgorICogUElOVCBJUlFzCisgKi8KK3ZvaWQgaW5pdF9JUlFfcGludCh2b2lkKTsKKworLyoKICAqIEZ1bmN0aW9uIGZvciAib24gY2hpcCBzdXBwb3J0IG1vZHVsZXMiLgogICovCiBleHRlcm4gdm9pZCBtYWtlX2lwcl9pcnEodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGFkZHIsCkBAIC00NzEsOCArNDgzLDEwIEBACiAKICNkZWZpbmUgSU5UQ19JQ1IJMHhmZmZmZmVlMFVMCiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNikgfHwgXAogICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpCisgICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpIHx8IFwKKyAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCkKICNkZWZpbmUgSU5UQ19JUlIwCTB4YTQwMDAwMDRVTAogI2RlZmluZSBJTlRDX0lSUjEJMHhhNDAwMDAwNlVMCiAjZGVmaW5lIElOVENfSVJSMgkweGE0MDAwMDA4VUwKQEAgLTQ5MSw4ICs1MDUsMTA1IEBACiAjZGVmaW5lIElOVENfSVBSRgkweGE0MDgwMDAwVUwKICNkZWZpbmUgSU5UQ19JUFJHCTB4YTQwODAwMDJVTAogI2RlZmluZSBJTlRDX0lQUkgJMHhhNDA4MDAwNFVMCi0jZW5kaWYKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCkKKy8qIEludGVycnVwdCBDb250cm9sbGVyIFJlZ2lzdGVycyAqLworI3VuZGVmIElOVENfSVBSQQorI3VuZGVmIElOVENfSVBSQgorI2RlZmluZSBJTlRDX0lQUkEgIAkweEE0MTRGRUUyVUwKKyNkZWZpbmUgSU5UQ19JUFJCICAJMHhBNDE0RkVFNFVMCisjZGVmaW5lIElOVENfSVBSRiAgCTB4QTQwODAwMDBVTAorI2RlZmluZSBJTlRDX0lQUkcgIAkweEE0MDgwMDAyVUwKKyNkZWZpbmUgSU5UQ19JUFJIICAJMHhBNDA4MDAwNFVMCisjZGVmaW5lIElOVENfSVBSSSAgCTB4QTQwODAwMDZVTAogCisjdW5kZWYgSU5UQ19JQ1IwCisjdW5kZWYgSU5UQ19JQ1IxCisjZGVmaW5lIElOVENfSUNSMAkweEE0MTRGRUUwVUwKKyNkZWZpbmUgSU5UQ19JQ1IxCTB4QTQxNDAwMTBVTAorCisjZGVmaW5lIElOVENfSVJSMAkweGE0MDAwMDA0VUwKKyNkZWZpbmUgSU5UQ19JUlIxCTB4YTQwMDAwMDZVTAorI2RlZmluZSBJTlRDX0lSUjIJMHhhNDAwMDAwOFVMCisjZGVmaW5lIElOVENfSVJSMwkweGE0MDAwMDBBVUwKKyNkZWZpbmUgSU5UQ19JUlI0CTB4YTQwMDAwMENVTAorI2RlZmluZSBJTlRDX0lSUjUJMHhhNDA4MDAyMFVMCisjZGVmaW5lIElOVENfSVJSNwkweGE0MDgwMDI0VUwKKyNkZWZpbmUgSU5UQ19JUlI4CTB4YTQwODAwMjZVTAorCisvKiBJbnRlcnJ1cHQgbnVtYmVycyAqLworI2RlZmluZSBUSU1FUjJfSVJRICAgICAgMTgKKyNkZWZpbmUgVElNRVIyX0lQUl9BRERSIElOVENfSVBSQQorI2RlZmluZSBUSU1FUjJfSVBSX1BPUyAgIDEKKyNkZWZpbmUgVElNRVIyX1BSSU9SSVRZICAyCisKKy8qIFdEVCAqLworI2RlZmluZSBXRFRfSVJRCQkyNworI2RlZmluZSBXRFRfSVBSX0FERFIJSU5UQ19JUFJCCisjZGVmaW5lIFdEVF9JUFJfUE9TCSAzCisjZGVmaW5lIFdEVF9QUklPUklUWQkgMgorCisjZGVmaW5lIFNDSUYwX0VSSV9JUlEJNTIKKyNkZWZpbmUgU0NJRjBfUlhJX0lSUQk1MworI2RlZmluZSBTQ0lGMF9CUklfSVJRCTU0CisjZGVmaW5lIFNDSUYwX1RYSV9JUlEJNTUKKyNkZWZpbmUgU0NJRjBfSVBSX0FERFIJSU5UQ19JUFJFCisjZGVmaW5lIFNDSUYwX0lQUl9QT1MJMgorI2RlZmluZSBTQ0lGMF9QUklPUklUWQkzCisKKyNkZWZpbmUgRE1URTRfSVJRCTc2CisjZGVmaW5lIERNVEU1X0lSUQk3NworI2RlZmluZSBETUEyX0lQUl9BRERSCUlOVENfSVBSRgorI2RlZmluZSBETUEyX0lQUl9QT1MJMgorI2RlZmluZSBETUEyX1BSSU9SSVRZCTcKKworI2RlZmluZSBJUFNFQ19JUlEJNzkKKyNkZWZpbmUgSVBTRUNfSVBSX0FERFIJSU5UQ19JUFJGCisjZGVmaW5lIElQU0VDX0lQUl9QT1MJMworI2RlZmluZSBJUFNFQ19QUklPUklUWQkzCisKKy8qIEVETUFDICovCisjZGVmaW5lIEVETUFDMF9JUlEJODAKKyNkZWZpbmUgRURNQUMwX0lQUl9BRERSCUlOVENfSVBSRworI2RlZmluZSBFRE1BQzBfSVBSX1BPUwkzCisjZGVmaW5lIEVETUFDMF9QUklPUklUWQkzCisKKyNkZWZpbmUgRURNQUMxX0lSUQk4MQorI2RlZmluZSBFRE1BQzFfSVBSX0FERFIJSU5UQ19JUFJHCisjZGVmaW5lIEVETUFDMV9JUFJfUE9TCTIKKyNkZWZpbmUgRURNQUMxX1BSSU9SSVRZCTMKKworI2RlZmluZSBFRE1BQzJfSVJRCTgyCisjZGVmaW5lIEVETUFDMl9JUFJfQUREUglJTlRDX0lQUkcKKyNkZWZpbmUgRURNQUMyX0lQUl9QT1MJMQorI2RlZmluZSBFRE1BQzJfUFJJT1JJVFkJMworCisvKiBTSU9GICovCisjZGVmaW5lIFNJT0YwX0VSSV9JUlEJOTYKKyNkZWZpbmUgU0lPRjBfVFhJX0lSUQk5NworI2RlZmluZSBTSU9GMF9SWElfSVJRCTk4CisjZGVmaW5lIFNJT0YwX0NDSV9JUlEJOTkKKyNkZWZpbmUgU0lPRjBfSVBSX0FERFIJSU5UQ19JUFJICisjZGVmaW5lIFNJT0YwX0lQUl9QT1MJMAorI2RlZmluZSBTSU9GMF9QUklPUklUWQk3CisKKyNkZWZpbmUgU0lPRjFfRVJJX0lSUQkxMDAKKyNkZWZpbmUgU0lPRjFfVFhJX0lSUQkxMDEKKyNkZWZpbmUgU0lPRjFfUlhJX0lSUQkxMDIKKyNkZWZpbmUgU0lPRjFfQ0NJX0lSUQkxMDMKKyNkZWZpbmUgU0lPRjFfSVBSX0FERFIJSU5UQ19JUFJJCisjZGVmaW5lIFNJT0YxX0lQUl9QT1MJMQorI2RlZmluZSBTSU9GMV9QUklPUklUWQk3CisjZW5kaWYgLyogQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKQorI2RlZmluZSBQT1JUX1BBQ1IJMHhhNDA1MDEwMFVMCisjZGVmaW5lIFBPUlRfUEJDUgkweGE0MDUwMTAyVUwKKyNkZWZpbmUgUE9SVF9QQ0NSCTB4YTQwNTAxMDRVTAorI2RlZmluZSBQT1JUX1BFVENSCTB4YTQwNTAxMDZVTAorI2RlZmluZSBQT1JUX1BBRFIgIAkweGE0MDUwMTIwVUwKKyNkZWZpbmUgUE9SVF9QQkRSICAJMHhhNDA1MDEyMlVMCisjZGVmaW5lIFBPUlRfUENEUiAgCTB4YTQwNTAxMjRVTAorI2Vsc2UKICNkZWZpbmUgUE9SVF9QQUNSCTB4YTQwMDAxMDBVTAogI2RlZmluZSBQT1JUX1BCQ1IJMHhhNDAwMDEwMlVMCiAjZGVmaW5lIFBPUlRfUENDUgkweGE0MDAwMTA0VUwKQEAgLTUwMSw2ICs2MTIsNyBAQAogI2RlZmluZSBQT1JUX1BCRFIgIAkweGE0MDAwMTIyVUwKICNkZWZpbmUgUE9SVF9QQ0RSICAJMHhhNDAwMDEyNFVMCiAjZGVmaW5lIFBPUlRfUEZEUiAgCTB4YTQwMDAxMmFVTAorI2VuZGlmCiAKICNkZWZpbmUgSVJRMF9JUlEJMzIKICNkZWZpbmUgSVJRMV9JUlEJMzMKQEAgLTU3Nyw3ICs2ODksNyBAQAogI2RlZmluZSBOUl9JTlRDMl9JUlFTCTY0CiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODApCiAjZGVmaW5lIElOVEMyX0JBU0UJMHhmZmQ0MDAwMAotI2RlZmluZSBJTlRDMl9GSVJTVF9JUlEJMjIKKyNkZWZpbmUgSU5UQzJfRklSU1RfSVJRCTIxCiAjZGVmaW5lIElOVEMyX0lOVE1TS19PRkZTRVQJKDB4MzgpCiAjZGVmaW5lIElOVEMyX0lOVE1TS0NMUl9PRkZTRVQJKDB4M2MpCiAjZGVmaW5lIE5SX0lOVEMyX0lSUVMJNjAKQEAgLTU5NCw2ICs3MDYsOCBAQAogCiAjZW5kaWYKIAorZXh0ZXJuIGludCBzaG1zZV9pcnFfZGVtdXgoaW50IGlycSk7CisKIHN0YXRpYyBpbmxpbmUgaW50IGdlbmVyaWNfaXJxX2RlbXV4KGludCBpcnEpCiB7CiAJcmV0dXJuIGlycTsKQEAgLTYwNSw4ICs3MTksMjEgQEAKICNkZWZpbmUgaXJxX2Nhbm9uaWNhbGl6ZShpcnEpCShpcnEpCiAjZGVmaW5lIGlycV9kZW11eChpcnEpCQlfX2lycV9kZW11eChzaF9tdi5tdl9pcnFfZGVtdXgoaXJxKSkKIAorI2lmZGVmIENPTkZJR180S1NUQUNLUworZXh0ZXJuIHZvaWQgaXJxX2N0eF9pbml0KGludCBjcHUpOworZXh0ZXJuIHZvaWQgaXJxX2N0eF9leGl0KGludCBjcHUpOworIyBkZWZpbmUgX19BUkNIX0hBU19ET19TT0ZUSVJRCisjZWxzZQorIyBkZWZpbmUgaXJxX2N0eF9pbml0KGNwdSkgZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgaXJxX2N0eF9leGl0KGNwdSkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMTgwKQogI2luY2x1ZGUgPGFzbS9pcnEtc2g3MzE4MC5oPgogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMpCisjaW5jbHVkZSA8YXNtL2lycS1zaDczNDMuaD4KKyNlbmRpZgorCiAjZW5kaWYgLyogX19BU01fU0hfSVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2tleGVjLmggYi9pbmNsdWRlL2FzbS1zaC9rZXhlYy5oCmluZGV4IDlkZmU1OWY2Li45ZDIzNWFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9rZXhlYy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2tleGVjLmgKQEAgLTIzLDExICsyMywxMCBAQAogLyogVGhlIG5hdGl2ZSBhcmNoaXRlY3R1cmUgKi8KICNkZWZpbmUgS0VYRUNfQVJDSCBLRVhFQ19BUkNIX1NICiAKLSNpZm5kZWYgX19BU1NFTUJMWV9fCisjZGVmaW5lIE1BWF9OT1RFX0JZVEVTIDEwMjQKIAotZXh0ZXJuIHZvaWQgbWFjaGluZV9zaHV0ZG93bih2b2lkKTsKLWV4dGVybiB2b2lkICpjcmFzaF9ub3RlczsKLQotI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworLyogUHJvdmlkZSBhIGR1bW15IGRlZmluaXRpb24gdG8gYXZvaWQgYnVpbGQgZmFpbHVyZXMuICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3Jhc2hfc2V0dXBfcmVncyhzdHJ1Y3QgcHRfcmVncyAqbmV3cmVncywKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKm9sZHJlZ3MpIHsgfQogCiAjZW5kaWYgLyogX1NIX0tFWEVDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2tnZGIuaCBiL2luY2x1ZGUvYXNtLXNoL2tnZGIuaAppbmRleCAxNjUzZmZiLi43YjI2ZjUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9rZ2RiLmgKKysrIGIvaW5jbHVkZS9hc20tc2gva2dkYi5oCkBAIC0xMjgsNCArMTI4LDE5IEBACiAjZGVmaW5lIEtHREJfQVNTRVJUKGNvbmRpdGlvbiwgbWVzc2FnZSkKICNlbmRpZgogCisvKiBUYWtlbiBmcm9tIHNoLXN0dWIuYyBvZiBHREIgNC4xOCAqLworc3RhdGljIGNvbnN0IGNoYXIgaGV4Y2hhcnNbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKKworLyogR2V0IGhpZ2ggaGV4IGJpdHMgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciBoaWdoaGV4KGNvbnN0IGludCB4KQoreworCXJldHVybiBoZXhjaGFyc1soeCA+PiA0KSAmIDB4Zl07Cit9CisKKy8qIEdldCBsb3cgaGV4IGJpdHMgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciBsb3doZXgoY29uc3QgaW50IHgpCit7CisJcmV0dXJuIGhleGNoYXJzW3ggJiAweGZdOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2xhbmRpc2svZ2lvLmggYi9pbmNsdWRlL2FzbS1zaC9sYW5kaXNrL2dpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmY2U0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9sYW5kaXNrL2dpby5oCkBAIC0wLDAgKzEsNDUgQEAKKyNpZm5kZWYgX19BU01fU0hfTEFORElTS19HSU9fSAorI2RlZmluZSBfX0FTTV9TSF9MQU5ESVNLX0dJT19ICisKKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorCisvKiB2ZXJzaW9uICovCisjZGVmaW5lIFZFUlNJT05fU1RSCSIxLjAwIgorCisvKiBEcml2ZXIgbmFtZSAqLworI2RlZmluZSBHSU9fRFJJVkVSX05BTUUJCSIvZGV2L2dpb2RydiIKKworLyogVXNlICdrJyBhcyBtYWdpYyBudW1iZXIgKi8KKyNkZWZpbmUgR0lPRFJWX0lPQ19NQUdJQyAgJ2snCisKKyNkZWZpbmUgR0lPRFJWX0lPQ1JFU0VUICAgIF9JTyhHSU9EUlZfSU9DX01BR0lDLCAwKQorLyoKKyAqIFMgbWVhbnMgIlNldCIgdGhyb3VnaCBhIHB0ciwKKyAqIFQgbWVhbnMgIlRlbGwiIGRpcmVjdGx5CisgKiBHIG1lYW5zICJHZXQiICh0byBhIHBvaW50ZWQgdmFyKQorICogUSBtZWFucyAiUXVlcnkiLCByZXNwb25zZSBpcyBvbiB0aGUgcmV0dXJuIHZhbHVlCisgKiBYIG1lYW5zICJlWGNoYW5nZSI6IEcgYW5kIFMgYXRvbWljYWxseQorICogSCBtZWFucyAic0hpZnQiOiBUIGFuZCBRIGF0b21pY2FsbHkKKyAqLworI2RlZmluZSBHSU9EUlZfSU9DU0dJT0RBVEExICAgX0lPVyhHSU9EUlZfSU9DX01BR0lDLCAgMSwgdW5zaWduZWQgY2hhciAqKQorI2RlZmluZSBHSU9EUlZfSU9DR0dJT0RBVEExICAgX0lPUihHSU9EUlZfSU9DX01BR0lDLCAgMiwgdW5zaWduZWQgY2hhciAqKQorI2RlZmluZSBHSU9EUlZfSU9DU0dJT0RBVEEyICAgX0lPVyhHSU9EUlZfSU9DX01BR0lDLCAgMywgdW5zaWduZWQgc2hvcnQgKikKKyNkZWZpbmUgR0lPRFJWX0lPQ0dHSU9EQVRBMiAgIF9JT1IoR0lPRFJWX0lPQ19NQUdJQywgIDQsIHVuc2lnbmVkIHNob3J0ICopCisjZGVmaW5lIEdJT0RSVl9JT0NTR0lPREFUQTQgICBfSU9XKEdJT0RSVl9JT0NfTUFHSUMsICA1LCB1bnNpZ25lZCBsb25nICopCisjZGVmaW5lIEdJT0RSVl9JT0NHR0lPREFUQTQgICBfSU9SKEdJT0RSVl9JT0NfTUFHSUMsICA2LCB1bnNpZ25lZCBsb25nICopCisjZGVmaW5lIEdJT0RSVl9JT0NTR0lPU0VUQUREUiBfSU9XKEdJT0RSVl9JT0NfTUFHSUMsICA3LCB1bnNpZ25lZCBsb25nICopCisjZGVmaW5lIEdJT0RSVl9JT0NIQVJEUkVTRVQgICBfSU8oR0lPRFJWX0lPQ19NQUdJQywgOCkgLyogZGVidWdnaW5nIHRvb2wgKi8KKworI2RlZmluZSBHSU9EUlZfSU9DU0dJT19MRUQgICAgX0lPVyhHSU9EUlZfSU9DX01BR0lDLCAgOSwgdW5zaWduZWQgbG9uZyAqKQorI2RlZmluZSBHSU9EUlZfSU9DR0dJT19MRUQgICAgX0lPUihHSU9EUlZfSU9DX01BR0lDLCAgMTAsIHVuc2lnbmVkIGxvbmcgKikKKyNkZWZpbmUgR0lPRFJWX0lPQ1NHSU9fQlVaWkVSIF9JT1coR0lPRFJWX0lPQ19NQUdJQywgIDExLCB1bnNpZ25lZCBsb25nICopCisjZGVmaW5lIEdJT0RSVl9JT0NHR0lPX0xBTkRJU0sgX0lPUihHSU9EUlZfSU9DX01BR0lDLCAgMTQsIHVuc2lnbmVkIGxvbmcgKikKKyNkZWZpbmUgR0lPRFJWX0lPQ0dHSU9fQlROIF9JT1IoR0lPRFJWX0lPQ19NQUdJQywgIDIyLCB1bnNpZ25lZCBsb25nICopCisjZGVmaW5lIEdJT0RSVl9JT0NTR0lPX0JUTlBJRCBfSU9XKEdJT0RSVl9JT0NfTUFHSUMsICAyMywgdW5zaWduZWQgbG9uZyAqKQorI2RlZmluZSBHSU9EUlZfSU9DR0dJT19CVE5QSUQgX0lPUihHSU9EUlZfSU9DX01BR0lDLCAgMjQsIHVuc2lnbmVkIGxvbmcgKikKKworI2RlZmluZSBHSU9EUlZfSU9DX01BWE5SIDgKKyNkZWZpbmUgR0lPX1JFQUQgMHgwMDAwMDAwMAorI2RlZmluZSBHSU9fV1JJVEUgMHgwMDAwMDAwMQorCisjZW5kaWYgLyogX19BU01fU0hfTEFORElTS19HSU9fSCAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2xhbmRpc2svaWRlLmggYi9pbmNsdWRlL2FzbS1zaC9sYW5kaXNrL2lkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OTBlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9sYW5kaXNrL2lkZS5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qCisgKiBtb2RpZmVkIGJ5IGtvZ2lpZGVuYQorICogMjAwNS4wMy4wMworICovCisKKyNpZm5kZWYgX19BU01fU0hfTEFORElTS19JREVfSAorI2RlZmluZSBfX0FTTV9TSF9MQU5ESVNLX0lERV9ICisKKy8qIE5vdGhpbmcgdG8gc2VlIGhlcmUuLiAqLworI2luY2x1ZGUgPGFzbS9sYW5kaXNrL2lvZGF0YV9sYW5kaXNrLmg+CisjZGVmaW5lIElSUV9DRkNBUkQJSVJRX0ZBVEEJLyogQ0YgQ2FyZCBJUlEgKi8KKyNkZWZpbmUgSVJRX1BDTUNJQQlJUlFfQVRBCQkvKiBQQ01DSUEgSVJRICovCisKKyNlbmRpZiAvKiBfX0FTTV9TSF9MQU5ESVNLX0lERV9IICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvbGFuZGlzay9pb2RhdGFfbGFuZGlzay5oIGIvaW5jbHVkZS9hc20tc2gvbGFuZGlzay9pb2RhdGFfbGFuZGlzay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NGQzYzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9sYW5kaXNrL2lvZGF0YV9sYW5kaXNrLmgKQEAgLTAsMCArMSw3OSBAQAorI2lmbmRlZiBfX0FTTV9TSF9JT0RBVEFfTEFORElTS19ICisjZGVmaW5lIF9fQVNNX1NIX0lPREFUQV9MQU5ESVNLX0gKKworLyoKKyAqIGxpbnV4L2luY2x1ZGUvYXNtLXNoL2xhbmRpc2svaW9kYXRhX2xhbmRpc2suaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgQXRvbSBDcmVhdGUgRW5naW5lZXJpbmcgQ28uLCBMdGQuCisgKgorICogSU8tREFUQSBMQU5ESVNLIHN1cHBvcnQKKyAqLworCisvKiBCb3ggc3BlY2lmaWMgYWRkcmVzc2VzLiAgKi8KKworI2RlZmluZSBQQV9VU0IJCTB4YTQwMDAwMDAJLyogVVNCIENvbnRyb2xsZXIgTTY2NTkwICovCisKKyNkZWZpbmUgUEFfQVRBUlNUCTB4YjAwMDAwMDAJLyogQVRBL0ZBVEEgQWNjZXNzIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEFfTEVECQkweGIwMDAwMDAxCS8qIExFRCBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBBX1NUQVRVUwkweGIwMDAwMDAyCS8qIFN3aXRjaCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEFfU0hVVERPV04JMHhiMDAwMDAwMwkvKiBTaHV0ZG93biBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIFBBX1BDSVBNRQkweGIwMDAwMDA0CS8qIFBDSSBQTUUgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIFBBX0lNQVNLCTB4YjAwMDAwMDUJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKy8qIDIwMDMuMTAuMzEgSS1PIERBVEEgTlNEIE5XRwlhZGQuCWZvciBzaHV0ZG93biBwb3J0IGNsZWFyICovCisjZGVmaW5lIFBBX1BXUklOVF9DTFIJMHhiMDAwMDAwNgkvKiBTaHV0ZG93biBJbnRlcnJ1cHQgY2xlYXIgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBQQV9MQ0RfQ0xSRFNQCTB4MDAJCS8qIExDRCBDbGVhciBEaXNwbGF5IE9mZnNldCAqLworI2RlZmluZSBQQV9MQ0RfUlROSE9NRQkweDAwCQkvKiBMQ0QgUmV0dXJuIEhvbWUgT2Zmc2V0ICovCisjZGVmaW5lIFBBX0xDRF9FTlRNT0RFCTB4MDAJCS8qIExDRCBFbnRyeSBNb2RlIE9mZnNldCAqLworI2RlZmluZSBQQV9MQ0RfRFNQQ1RMCTB4MDAJCS8qIExDRCBEaXNwbGF5IE9OL09GRiBDb250cm9sIE9mZnNldCAqLworI2RlZmluZSBQQV9MQ0RfRlVOQwkweDAwCQkvKiBMQ0QgRnVuY3Rpb24gU2V0IE9mZnNldCAqLworI2RlZmluZSBQQV9MQ0RfQ0dSQU0JMHgwMAkJLyogTENEIFNldCBDR1JBTSBBZGRyZXNzIE9mZnNldCAqLworI2RlZmluZSBQQV9MQ0RfRERSQU0JMHgwMAkJLyogTENEIFNldCBERFJBTSBBZGRyZXNzIE9mZnNldCAqLworI2RlZmluZSBQQV9MQ0RfUkRGTEFHCTB4MDEJCS8qIExDRCBSZWFkIEJ1c3kgRmxhZyBPZmZzZXQgKi8KKyNkZWZpbmUgUEFfTENEX1dUREFUQQkweDAyCQkvKiBMQ0QgV3JpdGUgRGF0YXQgdG8gUkFNIE9mZnNldCAqLworI2RlZmluZSBQQV9MQ0RfUkREQVRBCTB4MDMJCS8qIExDRCBSZWFkIERhdGEgZnJvbSBSQU0gT2Zmc2V0ICovCisjZGVmaW5lIFBBX1BJREVfT0ZGU0VUCTB4NDAJCS8qIENGIElERSBPZmZzZXQgKi8KKyNkZWZpbmUgUEFfU0lERV9PRkZTRVQJMHg0MAkJLyogSEREIElERSBPZmZzZXQgKi8KKworI2RlZmluZSBJUlFfUENJSU5UQQk1CQkvKiBQQ0kgSU5UQSBJUlEgKi8KKyNkZWZpbmUgSVJRX1BDSUlOVEIJNgkJLyogUENJIElOVEIgSVJRICovCisjZGVmaW5lIElSUV9QQ0lJTkRDCTcJCS8qIFBDSSBJTlRDIElSUSAqLworI2RlZmluZSBJUlFfUENJSU5URAk4CQkvKiBQQ0kgSU5URCBJUlEgKi8KKyNkZWZpbmUgSVJRX0FUQQkJOQkJLyogQVRBIElSUSAqLworI2RlZmluZSBJUlFfRkFUQQkxMAkJLyogRkFUQSBJUlEgKi8KKyNkZWZpbmUgSVJRX1BPV0VSCTExCQkvKiBQb3dlciBTd2l0Y2ggSVJRICovCisjZGVmaW5lIElSUV9CVVRUT04JMTIJCS8qIFVTTC01UCBCdXR0b24gSVJRICovCisjZGVmaW5lIElSUV9GQVVMVAkxMwkJLyogVVNMLTVQIEZhdWx0ICBJUlEgKi8KKworI2RlZmluZSBTSFVURE9XTl9CVE5fTUFKT1IJOTkJLyogU2h1dGRvd24gYnV0dG9uIGRldmljZSBtYWpvciBuby4gKi8KKworI2RlZmluZSBTSFVURE9XTl9MT09QX0NOVAk1CS8qIFNodXRkb3duIGJ1dHRvbiBEZXRlY3Rpb24gbG9vcCAqLworI2RlZmluZSBTSFVURE9XTl9ERUxBWQkJMjAwCS8qIFNodXRkb3duIGJ1dHRvbiBkZWxheSB2YWx1ZShtcykgKi8KKworCisvKiBhZGRlZCBieSBrb2dpaWRlbmEgKi8KKy8qCisgKiAgbGFuZGlza19sZWRwYXJhbQorICoKKyAqIGxlZCAgLS0tLS0tMTAgLTY1NDMyMTAgLTY1NDMyMTAgLTY1NDMyMTAKKyAqICAgICB8MDAwMDAwLi58MC4uLi4uLi58MC4uLi4uLi58VS4uLi4uLi58CisgKiAgICAgfCAgSEFSRCAgfGZhc3RibGlrfCBibGluayAgfCAgIG9uICAgfAorICoKKyAqICAgbGVkMDogcG93ZXIgICAgICAgVTp1cGRhdGUgZmxhZworICogICBsZWQxOiBlcnJvcgorICogICBsZWQyOiB1c2IxCisgKiAgIGxlZDM6IHVzYjIKKyAqICAgbGVkNDogdXNiMworICogICBsZWQ1OiB1c2I0CisgKiAgIGxlZDY6IHVzYjUKKyAqCisgKi8KK2V4dGVybiBpbnQgbGFuZGlza19sZWRwYXJhbTsgICAgLyogZnJvbSBzZXR1cC5jICovCitleHRlcm4gaW50IGxhbmRpc2tfYnV6emVycGFyYW07IC8qIGZyb20gc2V0dXAuYyAqLworZXh0ZXJuIGludCBsYW5kaXNrX2FyY2g7ICAgICAgICAvKiBmcm9tIHNldHVwLmMgKi8KKworI2RlZmluZSBfX0lPX1BSRUZJWCBsYW5kaXNrCisjaW5jbHVkZSA8YXNtL2lvX2dlbmVyaWMuaD4KKworI2VuZGlmICAvKiBfX0FTTV9TSF9JT0RBVEFfTEFORElTS19IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL21hY2h2ZWMuaCBiL2luY2x1ZGUvYXNtLXNoL21hY2h2ZWMuaAppbmRleCA1NTA1MDFmLi43MDM4OWI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9tYWNodmVjLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvbWFjaHZlYy5oCkBAIC04LDE3ICs4LDE4IEBACiAgKi8KIAogI2lmbmRlZiBfQVNNX1NIX01BQ0hWRUNfSAotI2RlZmluZSBfQVNNX1NIX01BQ0hWRUNfSCAxCisjZGVmaW5lIF9BU01fU0hfTUFDSFZFQ19ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLQogI2luY2x1ZGUgPGFzbS9tYWNodHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlY19pbml0Lmg+CiAKIHN0cnVjdCBkZXZpY2U7CiAKIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciB7CisJdm9pZCAoKm12X3NldHVwKShjaGFyICoqY21kbGluZV9wKTsKKwljb25zdCBjaGFyICptdl9uYW1lOwogCWludCBtdl9ucl9pcnFzOwogCiAJdTggKCptdl9pbmIpKHVuc2lnbmVkIGxvbmcpOwpAQCAtNjUsNCArNjYsNiBAQAogCiBleHRlcm4gc3RydWN0IHNoX21hY2hpbmVfdmVjdG9yIHNoX212OwogCisjZGVmaW5lIGdldF9zeXN0ZW1fdHlwZSgpCXNoX212Lm12X25hbWUKKwogI2VuZGlmIC8qIF9BU01fU0hfTUFDSFZFQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9tYzE0NjgxOHJ0Yy5oIGIvaW5jbHVkZS9hc20tc2gvbWMxNDY4MThydGMuaAppbmRleCAxNzA3Y2ZiLi4wYWVlOTZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9tYzE0NjgxOHJ0Yy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL21jMTQ2ODE4cnRjLmgKQEAgLTQsMTczICs0LDQgQEAKICNpZm5kZWYgX0FTTV9NQzE0NjgxOFJUQ19ICiAjZGVmaW5lIF9BU01fTUMxNDY4MThSVENfSAogCi0jaWZkZWYgQ09ORklHX1NIX01QQzEyMTEKLSN1bmRlZiAgX0FTTV9NQzE0NjgxOFJUQ19ICi0jdW5kZWYgIFJUQ19JUlEKLSNpbmNsdWRlIDxhc20vbXBjMTIxMS9tYzE0NjgxOHJ0Yy5oPgotI2Vsc2UKLQotI2luY2x1ZGUgPGFzbS9ydGMuaD4KLQotI2RlZmluZSBSVENfQUxXQVlTX0JDRAkxCi0KLS8qIEZJWE1FOlJUQyBJbnRlcnJ1cHQgZmVhdHVyZSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LiAqLwotI3VuZGVmICBSVENfSVJRCi0jZGVmaW5lIFJUQ19JUlEJCTAKLQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDMpCi0jZGVmaW5lIFJUQ19QT1JUKG4pCQkoUjY0Q05UKyhuKSoyKQotI2RlZmluZSBDTU9TX1JFQUQoYWRkcikJCV9fQ01PU19SRUFEKGFkZHIsYikKLSNkZWZpbmUgQ01PU19XUklURSh2YWwsYWRkcikJX19DTU9TX1dSSVRFKHZhbCxhZGRyLGIpCi0KLSNlbGlmIGRlZmluZWQoQ09ORklHX1NIX1NFQ1VSRUVER0U1NDEwKQotI2luY2x1ZGUgPGFzbS9zbmFwZ2Vhci9pby5oPgotCi0jZGVmaW5lIFJUQ19QT1JUKG4pICAgICAgICAgICAgIFNFQ1VSRUVER0VfSU9QT1JUX0FERFIKLSNkZWZpbmUgQ01PU19SRUFEKGFkZHIpICAgICAgICAgc2VjdXJlZWRnZTU0MTBfY21vc19yZWFkKGFkZHIpCi0jZGVmaW5lIENNT1NfV1JJVEUodmFsLGFkZHIpICAgIHNlY3VyZWVkZ2U1NDEwX2Ntb3Nfd3JpdGUodmFsLGFkZHIpCi1leHRlcm4gdW5zaWduZWQgY2hhciBzZWN1cmVlZGdlNTQxMF9jbW9zX3JlYWQoaW50IGFkZHIpOwotZXh0ZXJuIHZvaWQgc2VjdXJlZWRnZTU0MTBfY21vc193cml0ZSh1bnNpZ25lZCBjaGFyIHZhbCwgaW50IGFkZHIpOwotCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQotI2RlZmluZSBSVENfUE9SVChuKQkJKFI2NENOVCsobikqNCkKLSNkZWZpbmUgQ01PU19SRUFEKGFkZHIpCQlfX0NNT1NfUkVBRChhZGRyLHcpCi0jZGVmaW5lIENNT1NfV1JJVEUodmFsLGFkZHIpCV9fQ01PU19XUklURSh2YWwsYWRkcix3KQotI2VuZGlmCi0KLSNkZWZpbmUgX19DTU9TX1JFQUQoYWRkciwgcykgKHsJCQkJCQlcCi0JdW5zaWduZWQgY2hhciB2YWw9MCwgcmNyMSwgcmNyMiwgcjY0Y250LCByZXRyeTsJCQlcCi0Jc3dpdGNoKGFkZHIpIHsJCQkJCQkJXAotCQljYXNlIFJUQ19TRUNPTkRTOgkJCQkJXAotCQkJdmFsID0gY3RybF9pbmIoUlNFQ0NOVCk7CQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIFJUQ19TRUNPTkRTX0FMQVJNOgkJCQkJXAotCQkJdmFsID0gY3RybF9pbmIoUlNFQ0FSKTsJCQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIFJUQ19NSU5VVEVTOgkJCQkJXAotCQkJdmFsID0gY3RybF9pbmIoUk1JTkNOVCk7CQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIFJUQ19NSU5VVEVTX0FMQVJNOgkJCQkJXAotCQkJdmFsID0gY3RybF9pbmIoUk1JTkFSKTsJCQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIFJUQ19IT1VSUzoJCQkJCQlcCi0JCQl2YWwgPSBjdHJsX2luYihSSFJDTlQpOwkJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgUlRDX0hPVVJTX0FMQVJNOgkJCQkJXAotCQkJdmFsID0gY3RybF9pbmIoUkhSQVIpOwkJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgUlRDX0RBWV9PRl9XRUVLOgkJCQkJXAotCQkJdmFsID0gY3RybF9pbmIoUldLQ05UKTsJCQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIFJUQ19EQVlfT0ZfTU9OVEg6CQkJCQlcCi0JCQl2YWwgPSBjdHJsX2luYihSREFZQ05UKTsJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgUlRDX01PTlRIOgkJCQkJCVwKLQkJCXZhbCA9IGN0cmxfaW5iKFJNT05DTlQpOwkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSBSVENfWUVBUjoJCQkJCQlcCi0JCQl2YWwgPSBjdHJsX2luIyNzKFJZUkNOVCk7CQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIFJUQ19SRUdfQTogLyogUlRDX0ZSRVFfU0VMRUNUICovCQkJXAotCQkJcmNyMiA9IGN0cmxfaW5iKFJDUjIpOwkJCQlcCi0JCQl2YWwgPSAocmNyMiAmIFJDUjJfUEVTTUFTSykgPj4gNDsJCVwKLQkJCXJjcjEgPSBjdHJsX2luYihSQ1IxKTsJCQkJXAotCQkJcmNyMSA9IChyY3IxICYgKFJDUjFfQ0lFIHwgUkNSMV9BSUUpKSB8IFJDUjFfQUY7XAotCQkJcmV0cnkgPSAwOwkJCQkJXAotCQkJZG8gewkJCQkJCVwKLQkJCQljdHJsX291dGIocmNyMSwgUkNSMSk7IC8qIGNsZWFyIENGICovCVwKLQkJCQlyNjRjbnQgPSBjdHJsX2luYihSNjRDTlQpOwkJXAotCQkJfSB3aGlsZSgoY3RybF9pbmIoUkNSMSkgJiBSQ1IxX0NGKSAmJiByZXRyeSsrIDwgMTAwMCk7XAotCQkJcjY0Y250IF49IFJUQ19CSVRfSU5WRVJURUQ7CQkJXAotCQkJaWYocjY0Y250ID09IDB4N2YgfHwgcjY0Y250ID09IDApCQlcCi0JCQkJdmFsIHw9IFJUQ19VSVA7CQkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSBSVENfUkVHX0I6CS8qIFJUQ19DT05UUk9MICovCQkJXAotCQkJcmNyMSA9IGN0cmxfaW5iKFJDUjEpOwkJCQlcCi0JCQlyY3IyID0gY3RybF9pbmIoUkNSMik7CQkJCVwKLQkJCWlmKHJjcjEgJiBSQ1IxX0NJRSkJdmFsIHw9IFJUQ19VSUU7CQlcCi0JCQlpZihyY3IxICYgUkNSMV9BSUUpCXZhbCB8PSBSVENfQUlFOwkJXAotCQkJaWYocmNyMiAmIFJDUjJfUEVTTUFTSykJdmFsIHw9IFJUQ19QSUU7CQlcCi0JCQlpZighKHJjcjIgJiBSQ1IyX1NUQVJUKSl2YWwgfD0gUlRDX1NFVDsJCVwKLQkJCXZhbCB8PSBSVENfMjRIOwkJCQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIFJUQ19SRUdfQzoJLyogUlRDX0lOVFJfRkxBR1MgKi8JCQlcCi0JCQlyY3IxID0gY3RybF9pbmIoUkNSMSk7CQkJCVwKLQkJCXJjcjEgJj0gfihSQ1IxX0NGIHwgUkNSMV9BRik7CQkJXAotCQkJY3RybF9vdXRiKHJjcjEsIFJDUjEpOwkJCQlcCi0JCQlyY3IyID0gY3RybF9pbmIoUkNSMik7CQkJCVwKLQkJCXJjcjIgJj0gflJDUjJfUEVGOwkJCQlcCi0JCQljdHJsX291dGIocmNyMiwgUkNSMik7CQkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSBSVENfUkVHX0Q6CS8qIFJUQ19WQUxJRCAqLwkJCQlcCi0JCQkvKiBBbHdheXMgdmFsaWQgLi4uICovCQkJCVwKLQkJCXZhbCA9IFJUQ19WUlQ7CQkJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWRlZmF1bHQ6CQkJCQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCX0JCQkJCQkJCVwKLQl2YWw7CQkJCQkJCQlcCi19KQotCi0jZGVmaW5lIF9fQ01PU19XUklURSh2YWwsIGFkZHIsIHMpICh7CQkJCQlcCi0JdW5zaWduZWQgY2hhciByY3IxLHJjcjI7CQkJCQlcCi0Jc3dpdGNoKGFkZHIpIHsJCQkJCQkJXAotCQljYXNlIFJUQ19TRUNPTkRTOgkJCQkJXAotCQkJY3RybF9vdXRiKHZhbCwgUlNFQ0NOVCk7CQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIFJUQ19TRUNPTkRTX0FMQVJNOgkJCQkJXAotCQkJY3RybF9vdXRiKHZhbCwgUlNFQ0FSKTsJCQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIFJUQ19NSU5VVEVTOgkJCQkJXAotCQkJY3RybF9vdXRiKHZhbCwgUk1JTkNOVCk7CQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIFJUQ19NSU5VVEVTX0FMQVJNOgkJCQkJXAotCQkJY3RybF9vdXRiKHZhbCwgUk1JTkFSKTsJCQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIFJUQ19IT1VSUzoJCQkJCQlcCi0JCQljdHJsX291dGIodmFsLCBSSFJDTlQpOwkJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgUlRDX0hPVVJTX0FMQVJNOgkJCQkJXAotCQkJY3RybF9vdXRiKHZhbCwgUkhSQVIpOwkJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgUlRDX0RBWV9PRl9XRUVLOgkJCQkJXAotCQkJY3RybF9vdXRiKHZhbCwgUldLQ05UKTsJCQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIFJUQ19EQVlfT0ZfTU9OVEg6CQkJCQlcCi0JCQljdHJsX291dGIodmFsLCBSREFZQ05UKTsJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgUlRDX01PTlRIOgkJCQkJCVwKLQkJCWN0cmxfb3V0Yih2YWwsIFJNT05DTlQpOwkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSBSVENfWUVBUjoJCQkJCQlcCi0JCQljdHJsX291dCMjcygoY3RybF9pbiMjcyhSWVJDTlQpICYgMHhmZjAwKSB8ICh2YWwgJiAweGZmKSwgUllSQ05UKTtcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgUlRDX1JFR19BOiAvKiBSVENfRlJFUV9TRUxFQ1QgKi8JCQlcCi0JCQlyY3IyID0gY3RybF9pbmIoUkNSMik7CQkJCVwKLQkJCWlmKCh2YWwgJiBSVENfRElWX0NUTCkgPT0gUlRDX0RJVl9SRVNFVDIpCVwKLQkJCQlyY3IyIHw9IFJDUjJfUkVTRVQ7CQkJXAotCQkJY3RybF9vdXRiKHJjcjIsIFJDUjIpOwkJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgUlRDX1JFR19COgkvKiBSVENfQ09OVFJPTCAqLwkJCVwKLQkJCXJjcjEgPSAoY3RybF9pbmIoUkNSMSkgJiAweDk5KSB8IFJDUjFfQUY7CVwKLQkJCWlmKHZhbCAmIFJUQ19BSUUpIHJjcjEgfD0gUkNSMV9BSUU7CQlcCi0JCQllbHNlICAgICAgICAgICAgICByY3IxICY9IH5SQ1IxX0FJRTsJCVwKLQkJCWlmKHZhbCAmIFJUQ19VSUUpIHJjcjEgfD0gUkNSMV9DSUU7CQlcCi0JCQllbHNlICAgICAgICAgICAgICByY3IxICY9IH5SQ1IxX0NJRTsJCVwKLQkJCWN0cmxfb3V0YihyY3IxLCBSQ1IxKTsJCQkJXAotCQkJcmNyMiA9IGN0cmxfaW5iKFJDUjIpOwkJCQlcCi0JCQlpZih2YWwgJiBSVENfU0VUKSByY3IyICY9IH5SQ1IyX1NUQVJUOwkJXAotCQkJZWxzZSAgICAgICAgICAgICAgcmNyMiB8PSBSQ1IyX1NUQVJUOwkJXAotCQkJY3RybF9vdXRiKHJjcjIsIFJDUjIpOwkJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgUlRDX1JFR19DOgkvKiBSVENfSU5UUl9GTEFHUyAqLwkJCVwKLQkJCWJyZWFrOwkJCQkJCVwKLQkJY2FzZSBSVENfUkVHX0Q6CS8qIFJUQ19WQUxJRCAqLwkJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWRlZmF1bHQ6CQkJCQkJXAotCQkJYnJlYWs7CQkJCQkJXAotCX0JCQkJCQkJCVwKLX0pCi0KLSNlbmRpZiAvKiBDT05GSUdfU0hfTVBDMTIxMSAqLwogI2VuZGlmIC8qIF9BU01fTUMxNDY4MThSVENfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvbW11LmggYi9pbmNsdWRlL2FzbS1zaC9tbXUuaAppbmRleCA3MmYwN2JlLi5jZjQ3ZGY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9tbXUuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9tbXUuaApAQCAtMywyNyArMyw3NiBAQAogCiAjaWYgIWRlZmluZWQoQ09ORklHX01NVSkKIAotc3RydWN0IG1tX3JibG9ja19zdHJ1Y3QgewotCWludAlzaXplOwotCWludAlyZWZjb3VudDsKLQl2b2lkCSprYmxvY2s7Ci19OwotCi1zdHJ1Y3QgbW1fdGJsb2NrX3N0cnVjdCB7Ci0Jc3RydWN0IG1tX3JibG9ja19zdHJ1Y3QgKnJibG9jazsKLQlzdHJ1Y3QgbW1fdGJsb2NrX3N0cnVjdCAqbmV4dDsKLX07Ci0KIHR5cGVkZWYgc3RydWN0IHsKLQlzdHJ1Y3QgbW1fdGJsb2NrX3N0cnVjdCB0YmxvY2s7CisJc3RydWN0IHZtX2xpc3Rfc3RydWN0CSp2bWxpc3Q7CiAJdW5zaWduZWQgbG9uZwkJZW5kX2JyazsKIH0gbW1fY29udGV4dF90OwogCiAjZWxzZQogCiAvKiBEZWZhdWx0ICJ1bnNpZ25lZCBsb25nIiBjb250ZXh0ICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbW1fY29udGV4dF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIG1tX2NvbnRleHRfaWRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCW1tX2NvbnRleHRfaWRfdCBpZDsKKwl2b2lkICp2ZHNvOworfSBtbV9jb250ZXh0X3Q7CiAKICNlbmRpZiAvKiBDT05GSUdfTU1VICovCi0jZW5kaWYgLyogX19NTUhfSCAqLworCisvKgorICogUHJpdmlsZWdlZCBTcGFjZSBNYXBwaW5nIEJ1ZmZlciAoUE1CKSBkZWZpbml0aW9ucworICovCisjZGVmaW5lIFBNQl9QQVNDUgkJMHhmZjAwMDA3MAorI2RlZmluZSBQTUJfSVJNQ1IJCTB4ZmYwMDAwNzgKKworI2RlZmluZSBQTUJfQUREUgkJMHhmNjEwMDAwMAorI2RlZmluZSBQTUJfREFUQQkJMHhmNzEwMDAwMAorI2RlZmluZSBQTUJfRU5UUllfTUFYCQkxNgorI2RlZmluZSBQTUJfRV9NQVNLCQkweDAwMDAwMDBmCisjZGVmaW5lIFBNQl9FX1NISUZUCQk4CisKKyNkZWZpbmUgUE1CX1NaXzE2TQkJMHgwMDAwMDAwMAorI2RlZmluZSBQTUJfU1pfNjRNCQkweDAwMDAwMDEwCisjZGVmaW5lIFBNQl9TWl8xMjhNCQkweDAwMDAwMDgwCisjZGVmaW5lIFBNQl9TWl81MTJNCQkweDAwMDAwMDkwCisjZGVmaW5lIFBNQl9TWl9NQVNLCQlQTUJfU1pfNTEyTQorI2RlZmluZSBQTUJfQwkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgUE1CX1dUCQkJMHgwMDAwMDAwMQorI2RlZmluZSBQTUJfVUIJCQkweDAwMDAwMjAwCisjZGVmaW5lIFBNQl9WCQkJMHgwMDAwMDEwMAorCisjZGVmaW5lIFBNQl9OT19FTlRSWQkJKC0xKQorCitzdHJ1Y3QgcG1iX2VudHJ5OworCitzdHJ1Y3QgcG1iX2VudHJ5IHsKKwl1bnNpZ25lZCBsb25nIHZwbjsKKwl1bnNpZ25lZCBsb25nIHBwbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiAwIC4uIE5SX1BNQl9FTlRSSUVTIGZvciBzcGVjaWZpYyBlbnRyeSBzZWxlY3Rpb24sIG9yCisJICogUE1CX05PX0VOVFJZIHRvIHNlYXJjaCBmb3IgYSBmcmVlIG9uZQorCSAqLworCWludCBlbnRyeTsKKworCXN0cnVjdCBwbWJfZW50cnkgKm5leHQ7CisJLyogQWRqYWNlbnQgZW50cnkgbGluayBmb3IgY29udGlndW91cyBtdWx0aS1lbnRyeSBtYXBwaW5ncyAqLworCXN0cnVjdCBwbWJfZW50cnkgKmxpbms7Cit9OworCisvKiBhcmNoL3NoL21tL3BtYi5jICovCitpbnQgX19zZXRfcG1iX2VudHJ5KHVuc2lnbmVkIGxvbmcgdnBuLCB1bnNpZ25lZCBsb25nIHBwbiwKKwkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCAqZW50cnkpOworaW50IHNldF9wbWJfZW50cnkoc3RydWN0IHBtYl9lbnRyeSAqcG1iZSk7Cit2b2lkIGNsZWFyX3BtYl9lbnRyeShzdHJ1Y3QgcG1iX2VudHJ5ICpwbWJlKTsKK3N0cnVjdCBwbWJfZW50cnkgKnBtYl9hbGxvYyh1bnNpZ25lZCBsb25nIHZwbiwgdW5zaWduZWQgbG9uZyBwcG4sCisJCQkgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7Cit2b2lkIHBtYl9mcmVlKHN0cnVjdCBwbWJfZW50cnkgKnBtYmUpOworbG9uZyBwbWJfcmVtYXAodW5zaWduZWQgbG9uZyB2aXJ0LCB1bnNpZ25lZCBsb25nIHBoeXMsCisJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7Cit2b2lkIHBtYl91bm1hcCh1bnNpZ25lZCBsb25nIGFkZHIpOworCisjZW5kaWYgLyogX19NTVVfSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9tbXVfY29udGV4dC5oIGIvaW5jbHVkZS9hc20tc2gvbW11X2NvbnRleHQuaAppbmRleCA2NzYwZDA2Li5jNzA4OGVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9tbXVfY29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL21tdV9jb250ZXh0LmgKQEAgLTQ5LDcgKzQ5LDcgQEAKIAl1bnNpZ25lZCBsb25nIG1jID0gbW11X2NvbnRleHRfY2FjaGU7CiAKIAkvKiBDaGVjayBpZiB3ZSBoYXZlIG9sZCB2ZXJzaW9uIG9mIGNvbnRleHQuICovCi0JaWYgKCgobW0tPmNvbnRleHQgXiBtYykgJiBNTVVfQ09OVEVYVF9WRVJTSU9OX01BU0spID09IDApCisJaWYgKCgobW0tPmNvbnRleHQuaWQgXiBtYykgJiBNTVVfQ09OVEVYVF9WRVJTSU9OX01BU0spID09IDApCiAJCS8qIEl0J3MgdXAgdG8gZGF0ZSwgZG8gbm90aGluZyAqLwogCQlyZXR1cm47CiAKQEAgLTY4LDcgKzY4LDcgQEAKIAkJaWYgKCFtYykKIAkJCW1tdV9jb250ZXh0X2NhY2hlID0gbWMgPSBNTVVfQ09OVEVYVF9GSVJTVF9WRVJTSU9OOwogCX0KLQltbS0+Y29udGV4dCA9IG1jOworCW1tLT5jb250ZXh0LmlkID0gbWM7CiB9CiAKIC8qCkBAIC03OCw3ICs3OCw3IEBACiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgaW5pdF9uZXdfY29udGV4dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKIAkJCQkgICAgICAgc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JbW0tPmNvbnRleHQgPSBOT19DT05URVhUOworCW1tLT5jb250ZXh0LmlkID0gTk9fQ09OVEVYVDsKIAogCXJldHVybiAwOwogfQpAQCAtMTIzLDcgKzEyMyw3IEBACiBzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGFjdGl2YXRlX2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJZ2V0X21tdV9jb250ZXh0KG1tKTsKLQlzZXRfYXNpZChtbS0+Y29udGV4dCAmIE1NVV9DT05URVhUX0FTSURfTUFTSyk7CisJc2V0X2FzaWQobW0tPmNvbnRleHQuaWQgJiBNTVVfQ09OVEVYVF9BU0lEX01BU0spOwogfQogCiAvKiBNTVVfVFRCIGNhbiBiZSB1c2VkIGZvciBvcHRpbWl6aW5nIHRoZSBmYXVsdCBoYW5kbGluZy4KQEAgLTE3NCw5ICsxNzQsNyBAQAogewogCS8qIEVuYWJsZSBNTVUgKi8KIAljdHJsX291dGwoTU1VX0NPTlRST0xfSU5JVCwgTU1VQ1IpOwotCi0JLyogVGhlIG1hbnVhbCBzdWdnZXN0cyBkb2luZyBzb21lIG5vcHMgYWZ0ZXIgdHVybmluZyBvbiB0aGUgTU1VICovCi0JX19hc21fXyBfX3ZvbGF0aWxlX18gKCJub3A7bm9wO25vcDtub3A7bm9wO25vcDtub3A7bm9wXG5cdCIpOworCWN0cmxfYmFycmllcigpOwogCiAJaWYgKG1tdV9jb250ZXh0X2NhY2hlID09IE5PX0NPTlRFWFQpCiAJCW1tdV9jb250ZXh0X2NhY2hlID0gTU1VX0NPTlRFWFRfRklSU1RfVkVSU0lPTjsKQEAgLTE5MSw3ICsxODksOCBAQAogCWNyID0gY3RybF9pbmwoTU1VQ1IpOwogCWNyICY9IH5NTVVfQ09OVFJPTF9JTklUOwogCWN0cmxfb3V0bChjciwgTU1VQ1IpOwotCV9fYXNtX18gX192b2xhdGlsZV9fICgibm9wO25vcDtub3A7bm9wO25vcDtub3A7bm9wO25vcFxuXHQiKTsKKworCWN0cmxfYmFycmllcigpOwogfQogI2Vsc2UKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9vdmVyZHJpdmUvZnBnYS5oIGIvaW5jbHVkZS9hc20tc2gvb3ZlcmRyaXZlL2ZwZ2EuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkODc5OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9vdmVyZHJpdmUvZnBnYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyogCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgSi4gTWNrYXkgKGRhdmlkLm1ja2F5QHN0LmNvbSkKLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICoKLSAqLwotCi0jaWZuZGVmIF9fRlBHQV9PRF9IX18KLSNkZWZpbmUgX19GUEdBX09EX0hfXwotCi0vKiBUaGlzIHJvdXRpbmUgd2lsbCBwcm9ncmFtIHVwIHRoZSBmcGdhIHdoaWNoIGludGVyZmFjZXMgdG8gdGhlIGdhbGlsZW8gKi8KLWludCBpbml0X292ZXJkcml2ZV9mcGdhKHZvaWQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL292ZXJkcml2ZS9ndDY0MTExLmggYi9pbmNsdWRlL2FzbS1zaC9vdmVyZHJpdmUvZ3Q2NDExMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWQ1OGJjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL292ZXJkcml2ZS9ndDY0MTExLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotI2lmbmRlZiBfR1Q2NDExMV9IXwotI2RlZmluZSBfR1Q2NDExMV9IXwotCi0jZGVmaW5lIE1BU1RFUl9JTlRFUkZBQ0UgICAgICAgICAweDAKLSNkZWZpbmUgUkFTMTBfTE9fREVDX0FEUiAgICAgICAgIDB4OCAgICAgICAgCi0jZGVmaW5lIFJBUzEwX0hJX0RFQ19BRFIgICAgICAgICAweDEwCi0jZGVmaW5lIFJBUzMyX0xPX0RFQ19BRFIgICAgICAgICAweDE4Ci0jZGVmaW5lIFJBUzMyX0hJX0RFQ19BRFIgICAgICAgICAweDIwCi0jZGVmaW5lIENTMjBfTE9fREVDX0FEUiAgICAgICAgICAweDI4Ci0jZGVmaW5lIENTMjBfSElfREVDX0FEUiAgICAgICAgICAweDMwCi0jZGVmaW5lIENTM19MT19ERUNfQURSICAgICAgICAgICAweDM4Ci0jZGVmaW5lIENTM19ISV9ERUNfQURSICAgICAgICAgICAweDQwCi0jZGVmaW5lIFBDSV9JT19MT19ERUNfQURSICAgICAgICAweDQ4Ci0jZGVmaW5lIFBDSV9JT19ISV9ERUNfQURSICAgICAgICAweDUwCi0jZGVmaW5lIFBDSV9NRU0wX0xPX0RFQ19BRFIgICAgICAweDU4Ci0jZGVmaW5lIFBDSV9NRU0wX0hJX0RFQ19BRFIgICAgICAweDYwCi0jZGVmaW5lIElOVEVSTkFMX1NQQUNFX0RFQyAgICAgICAweDY4Ci0jZGVmaW5lIEJVU19FUlJfQURSX0xPX0NQVSAgICAgICAweDcwCi0jZGVmaW5lIFJFQURPTkxZMCAgICAgICAgICAgICAgICAweDc4Ci0jZGVmaW5lIFBDSV9NRU0xX0xPX0RFQ19BRFIgICAgICAweDgwCi0jZGVmaW5lIFBDSV9NRU0xX0hJX0RFQ19BRFIgICAgICAweDg4Ci0jZGVmaW5lIFJBUzBfTE9fREVDX0FEUiAgICAgICAgICAweDQwMCAgIAotI2RlZmluZSBSQVMwX0hJX0RFQ19BRFIgICAgICAgICAgMHg0MDQKLSNkZWZpbmUgUkFTMV9MT19ERUNfQURSICAgICAgICAgIDB4NDA4Ci0jZGVmaW5lIFJBUzFfSElfREVDX0FEUiAgICAgICAgICAweDQwYwotI2RlZmluZSBSQVMyX0xPX0RFQ19BRFIgICAgICAgICAgMHg0MTAKLSNkZWZpbmUgUkFTMl9ISV9ERUNfQURSICAgICAgICAgIDB4NDE0Ci0jZGVmaW5lIFJBUzNfTE9fREVDX0FEUiAgICAgICAgICAweDQxOAotI2RlZmluZSBSQVMzX0hJX0RFQ19BRFIgICAgICAgICAgMHg0MWMKLSNkZWZpbmUgREVWX0NTMF9MT19ERUNfQURSICAgICAgIDB4NDIwCi0jZGVmaW5lIERFVl9DUzBfSElfREVDX0FEUiAgICAgICAweDQyNAotI2RlZmluZSBERVZfQ1MxX0xPX0RFQ19BRFIgICAgICAgMHg0MjgKLSNkZWZpbmUgREVWX0NTMV9ISV9ERUNfQURSICAgICAgIDB4NDJjCi0jZGVmaW5lIERFVl9DUzJfTE9fREVDX0FEUiAgICAgICAweDQzMAotI2RlZmluZSBERVZfQ1MyX0hJX0RFQ19BRFIgICAgICAgMHg0MzQKLSNkZWZpbmUgREVWX0NTM19MT19ERUNfQURSICAgICAgIDB4NDM4Ci0jZGVmaW5lIERFVl9DUzNfSElfREVDX0FEUiAgICAgICAweDQzYwotI2RlZmluZSBERVZfQk9PVENTX0xPX0RFQ19BRFIgICAgMHg0NDAKLSNkZWZpbmUgREVWX0JPT1RDU19ISV9ERUNfQURSICAgIDB4NDQ0Ci0jZGVmaW5lIERFVl9BRFJfREVDX0VSUiAgICAgICAgICAweDQ3MAotI2RlZmluZSBEUkFNX0NGRyAgICAgICAgICAgICAgICAgMHg0NDggICAKLSNkZWZpbmUgRFJBTV9CQU5LMF9QQVJNUyAgICAgICAgIDB4NDRjICAgCi0jZGVmaW5lIERSQU1fQkFOSzFfUEFSTVMgICAgICAgICAweDQ1MAotI2RlZmluZSBEUkFNX0JBTksyX1BBUk1TICAgICAgICAgMHg0NTQKLSNkZWZpbmUgRFJBTV9CQU5LM19QQVJNUyAgICAgICAgIDB4NDU4Ci0jZGVmaW5lIERFVl9CQU5LMF9QQVJNUyAgICAgICAgICAweDQ1YwotI2RlZmluZSBERVZfQkFOSzFfUEFSTVMgICAgICAgICAgMHg0NjAKLSNkZWZpbmUgREVWX0JBTksyX1BBUk1TICAgICAgICAgIDB4NDY0Ci0jZGVmaW5lIERFVl9CQU5LM19QQVJNUyAgICAgICAgICAweDQ2OAotI2RlZmluZSBERVZfQk9PVF9CQU5LX1BBUk1TICAgICAgMHg0NmMKLSNkZWZpbmUgQ0gwX0RNQV9CWVRFQ09VTlQgICAgICAgIDB4ODAwCi0jZGVmaW5lIENIMV9ETUFfQllURUNPVU5UICAgICAgICAweDgwNAotI2RlZmluZSBDSDJfRE1BX0JZVEVDT1VOVCAgICAgICAgMHg4MDgKLSNkZWZpbmUgQ0gzX0RNQV9CWVRFQ09VTlQgICAgICAgIDB4ODBjCi0jZGVmaW5lIENIMF9ETUFfU1JDX0FEUiAgICAgICAgICAweDgxMAotI2RlZmluZSBDSDFfRE1BX1NSQ19BRFIgICAgICAgICAgMHg4MTQKLSNkZWZpbmUgQ0gyX0RNQV9TUkNfQURSICAgICAgICAgIDB4ODE4Ci0jZGVmaW5lIENIM19ETUFfU1JDX0FEUiAgICAgICAgICAweDgxYwotI2RlZmluZSBDSDBfRE1BX0RTVF9BRFIgICAgICAgICAgMHg4MjAKLSNkZWZpbmUgQ0gxX0RNQV9EU1RfQURSICAgICAgICAgIDB4ODI0Ci0jZGVmaW5lIENIMl9ETUFfRFNUX0FEUiAgICAgICAgICAweDgyOAotI2RlZmluZSBDSDNfRE1BX0RTVF9BRFIgICAgICAgICAgMHg4MmMKLSNkZWZpbmUgQ0gwX05FWFRfUkVDX1BUUiAgICAgICAgIDB4ODMwCi0jZGVmaW5lIENIMV9ORVhUX1JFQ19QVFIgICAgICAgICAweDgzNAotI2RlZmluZSBDSDJfTkVYVF9SRUNfUFRSICAgICAgICAgMHg4MzgKLSNkZWZpbmUgQ0gzX05FWFRfUkVDX1BUUiAgICAgICAgIDB4ODNjCi0jZGVmaW5lIENIMF9DVFJMICAgICAgICAgICAgICAgICAweDg0MAotI2RlZmluZSBDSDFfQ1RSTCAgICAgICAgICAgICAgICAgMHg4NDQKLSNkZWZpbmUgQ0gyX0NUUkwgICAgICAgICAgICAgICAgIDB4ODQ4Ci0jZGVmaW5lIENIM19DVFJMICAgICAgICAgICAgICAgICAweDg0YwotI2RlZmluZSBETUFfQVJCSVRFUiAgICAgICAgICAgICAgMHg4NjAKLSNkZWZpbmUgVElNRVIwICAgICAgICAgICAgICAgICAgIDB4ODUwCi0jZGVmaW5lIFRJTUVSMSAgICAgICAgICAgICAgICAgICAweDg1NAotI2RlZmluZSBUSU1FUjIgICAgICAgICAgICAgICAgICAgMHg4NTgKLSNkZWZpbmUgVElNRVIzICAgICAgICAgICAgICAgICAgIDB4ODVjCi0jZGVmaW5lIFRJTUVSX0NUUkwgICAgICAgICAgICAgICAweDg2NAotI2RlZmluZSBQQ0lfQ01EICAgICAgICAgICAgICAgICAgMHhjMDAKLSNkZWZpbmUgUENJX1RJTUVPVVQgICAgICAgICAgICAgIDB4YzA0Ci0jZGVmaW5lIFBDSV9SQVMxMF9CQU5LX1NJWkUgICAgICAweGMwOAotI2RlZmluZSBQQ0lfUkFTMzJfQkFOS19TSVpFICAgICAgMHhjMGMKLSNkZWZpbmUgUENJX0NTMjBfQkFOS19TSVpFICAgICAgIDB4YzEwCi0jZGVmaW5lIFBDSV9DUzNfQkFOS19TSVpFICAgICAgICAweGMxNAotI2RlZmluZSBQQ0lfU0VSUk1BU0sgICAgICAgICAgICAgMHhjMjgKLSNkZWZpbmUgUENJX0lOVEFDSyAgICAgICAgICAgICAgIDB4YzM0Ci0jZGVmaW5lIFBDSV9CQVJfRU4gICAgICAgICAgICAgICAweGMzYwotI2RlZmluZSBQQ0lfQ0ZHX0FEUiAgICAgICAgICAgICAgMHhjZjgKLSNkZWZpbmUgUENJX0NGR19EQVRBICAgICAgICAgICAgIDB4Y2ZjCi0jZGVmaW5lIFBDSV9JTlRDQVVTRSAgICAgICAgICAgICAweGMxOAotI2RlZmluZSBQQ0lfTUFTVF9NQVNLICAgICAgICAgICAgMHhjMWMKLSNkZWZpbmUgUENJX1BDSU1BU0sgICAgICAgICAgICAgIDB4YzI0Ci0jZGVmaW5lIEJBUl9FTkFCTEVfQURSICAgICAgICAgICAweGMzYwotCi0vKiBUaGVzZSBhcmUgY29uZmlnIHJlZ2lzdGVycywgYWNjZXNzaWJsZSB2aWEgUENJIHNwYWNlICovCi0jZGVmaW5lIFBDSV9DT05GSUdfUkFTMTBfQkFTRV9BRFIgICAweDAxMAotI2RlZmluZSBQQ0lfQ09ORklHX1JBUzMyX0JBU0VfQURSICAgMHgwMTQKLSNkZWZpbmUgUENJX0NPTkZJR19DUzIwX0JBU0VfQURSICAgIDB4MDE4Ci0jZGVmaW5lIFBDSV9DT05GSUdfQ1MzX0JBU0VfQURSICAgICAweDAxYwotI2RlZmluZSBQQ0lfQ09ORklHX0lOVF9SRUdfTU1fQURSICAgMHgwMjAKLSNkZWZpbmUgUENJX0NPTkZJR19JTlRfUkVHX0lPX0FEUiAgIDB4MDI0Ci0jZGVmaW5lIFBDSV9DT05GSUdfQk9BUkRfVkVORE9SICAgICAweDAyYwotI2RlZmluZSBQQ0lfQ09ORklHX1JPTV9BRFIgICAgICAgICAgMHgwMzAKLSNkZWZpbmUgUENJX0NPTkZJR19JTlRfUElOX0xJTkUgICAgIDB4MDNjCi0KLQotCi0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL292ZXJkcml2ZS9pby5oIGIvaW5jbHVkZS9hc20tc2gvb3ZlcmRyaXZlL2lvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYmE3MDAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvb3ZlcmRyaXZlL2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tc2gvaW9fb2QuaAotICoKLSAqIENvcHlyaWdodCAyMDAwIFN0dWFydCBNZW5lZnkgKHN0dWFydC5tZW5lZnlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBJTyBmdW5jdGlvbnMgZm9yIGFuIFNUTWljcm9lbGVjdHJvbmljcyBPdmVyZHJpdmUKLSAqLwotCi0jaWZuZGVmIF9BU01fU0hfSU9fT0RfSAotI2RlZmluZSBfQVNNX1NIX0lPX09EX0gKLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgb2RfaW5iKHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdW5zaWduZWQgc2hvcnQgb2RfaW53KHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdW5zaWduZWQgaW50IG9kX2lubCh1bnNpZ25lZCBsb25nIHBvcnQpOwotCi1leHRlcm4gdm9pZCBvZF9vdXRiKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdm9pZCBvZF9vdXR3KHVuc2lnbmVkIHNob3J0IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHZvaWQgb2Rfb3V0bCh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIG9kX2luYl9wKHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdW5zaWduZWQgc2hvcnQgb2RfaW53X3AodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgb2RfaW5sX3AodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB2b2lkIG9kX291dGJfcCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHZvaWQgb2Rfb3V0d19wKHVuc2lnbmVkIHNob3J0IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHZvaWQgb2Rfb3V0bF9wKHVuc2lnbmVkIGludCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KTsKLQotZXh0ZXJuIHZvaWQgb2RfaW5zYih1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgb2RfaW5zdyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgb2RfaW5zbCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgb2Rfb3V0c2IodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIG9kX291dHN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBvZF9vdXRzbCh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBvZF9pc2FfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKLQotI2VuZGlmIC8qIF9BU01fU0hfSU9fT0RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvb3ZlcmRyaXZlL292ZXJkcml2ZS5oIGIvaW5jbHVkZS9hc20tc2gvb3ZlcmRyaXZlL292ZXJkcml2ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzc0NmMyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL292ZXJkcml2ZS9vdmVyZHJpdmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEouIE1ja2F5IChkYXZpZC5tY2theUBzdC5jb20pCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqCi0gKi8KLQotCi0jaWZuZGVmIF9fT1ZFUkRSSVZFX0hfXwotI2RlZmluZSBfX09WRVJEUklWRV9IX18KLQotI2RlZmluZSBPVkVSRFJJVkVfSU5UX0NUIDB4YTNhMDAwMDAKLSNkZWZpbmUgT1ZFUkRSSVZFX0lOVF9EVCAweGEzYjAwMDAwCi0KLSNkZWZpbmUgT1ZFUkRSSVZFX0NUUkwgICAgMHhhMzAwMDAwMAotCi0vKiBTaG92aW5nIGFsbCB0aGVzZSBiaXRzIGludG8gdGhlIHNhbWUgcmVnaXN0ZXIgaXMgbm90IGEgZ29vZCBpZGVhLiAKLSAqIEFzIHNvb24gYXMgSSBnZXQgYSBzcGFyZSBtb21lbnQsIEknbGwgY2hhbmdlIHRoZSBGUEdBIGFuZCBwdXQgZWFjaCAKLSAqIGJpdCBpbiBhIHNlcGFyYXRlIHJlZ2lzdGVyCi0gKi8KLQotI2RlZmluZSBWQUxJRF9DVFJMX0JJVFMJCSAgICAgICAgICAweDFmCi0KLSNkZWZpbmUgRU5BQkxFX1JTMjMyX01BU0sJICAJICAweDFlCi0jZGVmaW5lIERJU0FCTEVfUlMyMzJfQklUCQkgIDB4MDEKLQotI2RlZmluZSBFTkFCTEVfTk1JX01BU0sJCQkgIDB4MWQKLSNkZWZpbmUgRElTQUJMRV9OTUlfQklUCQkJICAweDAyCi0KLSNkZWZpbmUgUkVTRVRfUENJX01BU0sJCQkgIDB4MWIKLSNkZWZpbmUgRU5BQkxFX1BDSV9CSVQJCQkgIDB4MDQKLQotI2RlZmluZSBFTkFCTEVfTEVEX01BU0sJCQkgIDB4MTcKLSNkZWZpbmUgRElTQUJMRV9MRURfQklUCQkJICAweDA4Ci0KLSNkZWZpbmUgUkVTRVRfRlBHQV9NQVNLCQkJICAweDBmCi0jZGVmaW5lIEVOQUJMRV9GUEdBX0JJVAkJCSAgMHgxMAotCi0KLSNkZWZpbmUgRlBHQV9EQ0xLX0FERFJFU1MgICAgICAgICAgIDB4QTNDMDAwMDAKLQotI2RlZmluZSBGUEdBX0RBVEEgICAgICAgIDB4MDEJLyogICBXICovCi0jZGVmaW5lIEZQR0FfQ09ORkRPTkUgICAgMHgwMgkvKiBSICAgKi8KLSNkZWZpbmUgRlBHQV9OT1RfU1RBVFVTICAweDA0CS8qIFIgICAqLwotI2RlZmluZSBGUEdBX0lOSVRET05FICAgIDB4MDgJLyogUiAgICovCi0KLSNkZWZpbmUgRlBHQV9USU1FT1VUICAgICAxMDAwMDAKLQotCi0vKiBJbnRlcnJ1cHRzIGZvciB0aGUgb3ZlcmRyaXZlLiBOb3RlIHRoYXQgdGhlc2UgbnVtYmVycyBoYXZlIAotICogbm90aGluZyB0byBkbyB3aXRoIHRoZSBhY3R1YWwgSVJRIG51bWJlcnMgdGhleSBhcHBlYXIgb24sIAotICogdGhpcyBpcyBhbGwgcHJvZ3JhbW1hYmxlLiBUaGlzIGlzIHNpbXBseSB0aGUgcG9zaXRpb24gaW4gdGhlIAotICogSU5UX0NUIHJlZ2lzdGVyLgotICovCi0KLSNkZWZpbmUgT1ZFUkRSSVZFX1BDSV9JTlRBICAgICAgICAgICAgICAwCi0jZGVmaW5lIE9WRVJEUklWRV9QQ0lfSU5UQiAgICAgICAgICAgICAgMQotI2RlZmluZSBPVkVSRFJJVkVfUENJX0lOVEMgICAgICAgICAgICAgIDIKLSNkZWZpbmUgT1ZFUkRSSVZFX1BDSV9JTlREICAgICAgICAgICAgICAzCi0jZGVmaW5lIE9WRVJEUklWRV9HQUxJTEVPX0lOVCAgICAgICAgICAgNAotI2RlZmluZSBPVkVSRFJJVkVfR0FMSUxFT19MT0NBTF9JTlQgICAgIDUKLSNkZWZpbmUgT1ZFUkRSSVZFX0FVRElPX0lOVCAgICAgICAgICAgICA2Ci0jZGVmaW5lIE9WRVJEUklWRV9LRVlCT0FSRF9JTlQgICAgICAgICAgNwotCi0vKiBXaGljaCBMaW51eCBJUlEgc2hvdWxkIHdlIGFzc2lnbiB0byBlYWNoIGludGVycnVwdCBzb3VyY2U/ICovCi0jZGVmaW5lIE9WRVJEUklWRV9QQ0lfSVJRMSAgICAgICAgICAgICAgMgotI2lmZGVmIENPTkZJR19IQUNLRURfTkUySwotI2RlZmluZSBPVkVSRFJJVkVfUENJX0lSUTIgICAgICAgICAgICAgIDcKLSNlbHNlCi0jZGVmaW5lIE9WRVJEUklWRV9QQ0lfSVJRMiAgICAgICAgICAgICAgMgotI3VuZGVmIE9WRVJEUklWRV9QQ0lfSU5UQiAKLSNkZWZpbmUgT1ZFUkRSSVZFX1BDSV9JTlRCIE9WRVJEUklWRV9QQ0lfSU5UQQotCi0jZW5kaWYKLQotLyogUHV0IHRoZSBFU1Mgc29sbyBhdWRpbyBjaGlwIG9uIElSUSA0ICovCi0jZGVmaW5lIE9WRVJEUklWRV9FU1NfSVJRICAgICAgICAgICAgICAgNAotCi0vKiBXaGVyZSB0aGUgbWVtb3J5IGJlaGluZCB0aGUgUENJIGJ1cyBhcHBlYXJzICovCi0jZGVmaW5lIFBDSV9EUkFNX0JBU0UgICAweGI3MDAwMDAwCi0jZGVmaW5lIFBDSV9EUkFNX1NJWkUgKDE2KjEwMjQqMTAyNCkKLSNkZWZpbmUgUENJX0RSQU1fRklOSVNIIChQQ0lfRFJBTV9CQVNFK1BDSV9EUkFNX1NJWkUtMSkKLQotLyogV2hlcmUgdGhlIElPIHJlZ2lvbiBhcHBlYXJzIGluIHRoZSBtZW1vcnkgKi8KLSNkZWZpbmUgUENJX0dUSU9fQkFTRSAgIDB4YjgwMDAwMDAKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wYWdlLmggYi9pbmNsdWRlL2FzbS1zaC9wYWdlLmgKaW5kZXggNmY3ZWI4YS4uY2E4YjI2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvcGFnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3BhZ2UuaApAQCAtMTYsNyArMTYsMTMgQEAKIAogLyogUEFHRV9TSElGVCBkZXRlcm1pbmVzIHRoZSBwYWdlIHNpemUgKi8KICNkZWZpbmUgUEFHRV9TSElGVAkxMgorCisjaWZkZWYgX19BU1NFTUJMWV9fCisjZGVmaW5lIFBBR0VfU0laRQkoMSA8PCBQQUdFX1NISUZUKQorI2Vsc2UKICNkZWZpbmUgUEFHRV9TSVpFCSgxVUwgPDwgUEFHRV9TSElGVCkKKyNlbmRpZgorCiAjZGVmaW5lIFBBR0VfTUFTSwkofihQQUdFX1NJWkUtMSkpCiAjZGVmaW5lIFBURV9NQVNLCVBBR0VfTUFTSwogCkBAIC0zMCw3ICszNiw2IEBACiAjZGVmaW5lIEhQQUdFX1NJWkUJCSgxVUwgPDwgSFBBR0VfU0hJRlQpCiAjZGVmaW5lIEhQQUdFX01BU0sJCSh+KEhQQUdFX1NJWkUtMSkpCiAjZGVmaW5lIEhVR0VUTEJfUEFHRV9PUkRFUgkoSFBBR0VfU0hJRlQtUEFHRV9TSElGVCkKLSNkZWZpbmUgQVJDSF9IQVNfU0VUQ0xFQVJfSFVHRV9QVEUKICNlbmRpZgogCiAjaWZkZWYgX19LRVJORUxfXwpAQCAtMzksMTAgKzQ0LDE4IEBACiBleHRlcm4gdm9pZCAoKmNsZWFyX3BhZ2UpKHZvaWQgKnRvKTsKIGV4dGVybiB2b2lkICgqY29weV9wYWdlKSh2b2lkICp0bywgdm9pZCAqZnJvbSk7CiAKK2V4dGVybiB1bnNpZ25lZCBsb25nIHNobV9hbGlnbl9tYXNrOworCisjaWZkZWYgQ09ORklHX01NVQogZXh0ZXJuIHZvaWQgY2xlYXJfcGFnZV9zbG93KHZvaWQgKnRvKTsKIGV4dGVybiB2b2lkIGNvcHlfcGFnZV9zbG93KHZvaWQgKnRvLCB2b2lkICpmcm9tKTsKKyNlbHNlCitleHRlcm4gdm9pZCBjbGVhcl9wYWdlX25vbW11KHZvaWQgKnRvKTsKK2V4dGVybiB2b2lkIGNvcHlfcGFnZV9ub21tdSh2b2lkICp0bywgdm9pZCAqZnJvbSk7CisjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX1NINzcwNV9DQUNIRV8zMktCKSAmJiBkZWZpbmVkKENPTkZJR19NTVUpCisjaWYgZGVmaW5lZChDT05GSUdfTU1VKSAmJiAoZGVmaW5lZChDT05GSUdfQ1BVX1NINCkgfHwgXAorCWRlZmluZWQoQ09ORklHX1NINzcwNV9DQUNIRV8zMktCKSkKIHN0cnVjdCBwYWdlOwogZXh0ZXJuIHZvaWQgY2xlYXJfdXNlcl9wYWdlKHZvaWQgKnRvLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHN0cnVjdCBwYWdlICpwZyk7CiBleHRlcm4gdm9pZCBjb3B5X3VzZXJfcGFnZSh2b2lkICp0bywgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgcGFnZSAqcGcpOwpAQCAtNTEsMjkgKzY0LDIwIEBACiAjZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU0gyKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU0gzKSB8fCAhZGVmaW5lZChDT05GSUdfTU1VKQogI2RlZmluZSBjbGVhcl91c2VyX3BhZ2UocGFnZSwgdmFkZHIsIHBnKQljbGVhcl9wYWdlKHBhZ2UpCiAjZGVmaW5lIGNvcHlfdXNlcl9wYWdlKHRvLCBmcm9tLCB2YWRkciwgcGcpCWNvcHlfcGFnZSh0bywgZnJvbSkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpCi1zdHJ1Y3QgcGFnZTsKLWV4dGVybiB2b2lkIGNsZWFyX3VzZXJfcGFnZSh2b2lkICp0bywgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBzdHJ1Y3QgcGFnZSAqcGcpOwotZXh0ZXJuIHZvaWQgY29weV91c2VyX3BhZ2Uodm9pZCAqdG8sIHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IHBhZ2UgKnBnKTsKLWV4dGVybiB2b2lkIF9fY2xlYXJfdXNlcl9wYWdlKHZvaWQgKnRvLCB2b2lkICpvcmlnX3RvKTsKLWV4dGVybiB2b2lkIF9fY29weV91c2VyX3BhZ2Uodm9pZCAqdG8sIHZvaWQgKmZyb20sIHZvaWQgKm9yaWdfdG8pOwogI2VuZGlmCiAKIC8qCiAgKiBUaGVzZSBhcmUgdXNlZCB0byBtYWtlIHVzZSBvZiBDIHR5cGUtY2hlY2tpbmcuLgogICovCiB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcHRlOyB9IHB0ZV90OwotdHlwZWRlZiBzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIHBtZDsgfSBwbWRfdDsKIHR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwZ2Q7IH0gcGdkX3Q7CiB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcGdwcm90OyB9IHBncHJvdF90OwogCiAjZGVmaW5lIHB0ZV92YWwoeCkJKCh4KS5wdGUpCi0jZGVmaW5lIHBtZF92YWwoeCkJKCh4KS5wbWQpCiAjZGVmaW5lIHBnZF92YWwoeCkJKCh4KS5wZ2QpCiAjZGVmaW5lIHBncHJvdF92YWwoeCkJKCh4KS5wZ3Byb3QpCiAKICNkZWZpbmUgX19wdGUoeCkgKChwdGVfdCkgeyAoeCkgfSApCi0jZGVmaW5lIF9fcG1kKHgpICgocG1kX3QpIHsgKHgpIH0gKQogI2RlZmluZSBfX3BnZCh4KSAoKHBnZF90KSB7ICh4KSB9ICkKICNkZWZpbmUgX19wZ3Byb3QoeCkJKChwZ3Byb3RfdCkgeyAoeCkgfSApCiAKQEAgLTkzLDcgKzk3LDcgQEAKICNkZWZpbmUgX19NRU1PUllfU1RBUlQJCUNPTkZJR19NRU1PUllfU1RBUlQKICNkZWZpbmUgX19NRU1PUllfU0laRQkJQ09ORklHX01FTU9SWV9TSVpFCiAKLSNkZWZpbmUgUEFHRV9PRkZTRVQJCSgweDgwMDAwMDAwVUwpCisjZGVmaW5lIFBBR0VfT0ZGU0VUCQlDT05GSUdfUEFHRV9PRkZTRVQKICNkZWZpbmUgX19wYSh4KQkJCSgodW5zaWduZWQgbG9uZykoeCktUEFHRV9PRkZTRVQpCiAjZGVmaW5lIF9fdmEoeCkJCQkoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKHgpK1BBR0VfT0ZGU0VUKSkKIApAQCAtMTE1LDUgKzExOSwxMCBAQAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oPgogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BhZ2UuaD4KIAorLyogdkRTTyBzdXBwb3J0ICovCisjaWZkZWYgQ09ORklHX1ZTWVNDQUxMCisjZGVmaW5lIF9fSEFWRV9BUkNIX0dBVEVfQVJFQQorI2VuZGlmCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19BU01fU0hfUEFHRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wY2kuaCBiL2luY2x1ZGUvYXNtLXNoL3BjaS5oCmluZGV4IDBhNTIzYzguLjZjY2M5NDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3BjaS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3BjaS5oCkBAIC0zMiw2ICszMiwzNCBAQAogI2RlZmluZSBQQ0lCSU9TX01JTl9JTwkJYm9hcmRfcGNpX2NoYW5uZWxzLT5pb19yZXNvdXJjZS0+c3RhcnQKICNkZWZpbmUgUENJQklPU19NSU5fTUVNCQlib2FyZF9wY2lfY2hhbm5lbHMtPm1lbV9yZXNvdXJjZS0+c3RhcnQKIAorLyoKKyAqIEkvTyByb3V0aW5lIGhlbHBlcnMKKyAqLworI2lmZGVmIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODAKKyNkZWZpbmUgUENJX0lPX0FSRUEJCTB4RkU0MDAwMDAKKyNkZWZpbmUgUENJX0lPX1NJWkUJCTB4MDA0MDAwMDAKKyNlbHNlCisjZGVmaW5lIFBDSV9JT19BUkVBCQkweEZFMjQwMDAwCisjZGVmaW5lIFBDSV9JT19TSVpFCQkwWDAwMDQwMDAwCisjZW5kaWYKKworI2RlZmluZSBQQ0lfTUVNX1NJWkUJCTB4MDEwMDAwMDAKKworI2RlZmluZSBTSDRfUENJSU9CUl9NQVNLCTB4RkZGQzAwMDAKKyNkZWZpbmUgcGNpX2lvYWRkcihhZGRyKQkoUENJX0lPX0FSRUEgKyAoYWRkciAmIH5TSDRfUENJSU9CUl9NQVNLKSkKKworI2lmIGRlZmluZWQoQ09ORklHX1BDSSkKKyNkZWZpbmUgaXNfcGNpX2lvYWRkcihwb3J0KQkJXAorCSgoKHBvcnQpID49IFBDSUJJT1NfTUlOX0lPKSAmJglcCisJICgocG9ydCkgPCAoUENJQklPU19NSU5fSU8gKyBQQ0lfSU9fU0laRSkpKQorI2RlZmluZSBpc19wY2lfbWVtYWRkcihwb3J0KQkJXAorCSgoKHBvcnQpID49IFBDSUJJT1NfTUlOX01FTSkgJiYJXAorCSAoKHBvcnQpIDwgKFBDSUJJT1NfTUlOX01FTSArIFBDSV9NRU1fU0laRSkpKQorI2Vsc2UKKyNkZWZpbmUgaXNfcGNpX2lvYWRkcihwb3J0KQkoMCkKKyNkZWZpbmUgaXNfcGNpX21lbWFkZHIocG9ydCkJKDApCisjZW5kaWYKKwogc3RydWN0IHBjaV9kZXY7CiAKIGV4dGVybiB2b2lkIHBjaWJpb3Nfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKQEAgLTg3LDE1ICsxMTUsNiBAQAogICovCiAjZGVmaW5lIHBjaV9kYWNfZG1hX3N1cHBvcnRlZChwY2lfZGV2LCBtYXNrKSAoMCkKIAotLyogVGhlc2UgbWFjcm9zIHNob3VsZCBiZSB1c2VkIGFmdGVyIGEgcGNpX21hcF9zZyBjYWxsIGhhcyBiZWVuIGRvbmUKLSAqIHRvIGdldCBidXMgYWRkcmVzc2VzIG9mIGVhY2ggb2YgdGhlIFNHIGVudHJpZXMgYW5kIHRoZWlyIGxlbmd0aHMuCi0gKiBZb3Ugc2hvdWxkIG9ubHkgd29yayB3aXRoIHRoZSBudW1iZXIgb2Ygc2cgZW50cmllcyBwY2lfbWFwX3NnCi0gKiByZXR1cm5zLCBvciBhbHRlcm5hdGl2ZWx5IHN0b3Agb24gdGhlIGZpcnN0IHNnX2RtYV9sZW4oc2cpIHdoaWNoCi0gKiBpcyAwLgotICovCi0jZGVmaW5lIHNnX2RtYV9hZGRyZXNzKHNnKQkodmlydF90b19idXMoKHNnKS0+ZG1hX2FkZHJlc3MpKQotI2RlZmluZSBzZ19kbWFfbGVuKHNnKQkJKChzZyktPmxlbmd0aCkKLQogI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyBpbmxpbmUgdm9pZCBwY2lfZG1hX2J1cnN0X2FkdmljZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkJZW51bSBwY2lfZG1hX2J1cnN0X3N0cmF0ZWd5ICpzdHJhdCwKQEAgLTEwNywxMSArMTI2LDEyIEBACiAjZW5kaWYKIAogLyogQm9hcmQtc3BlY2lmaWMgZml4dXAgcm91dGluZXMuICovCi1leHRlcm4gdm9pZCBwY2liaW9zX2ZpeHVwKHZvaWQpOwotZXh0ZXJuIHZvaWQgcGNpYmlvc19maXh1cF9pcnFzKHZvaWQpOwordm9pZCBwY2liaW9zX2ZpeHVwKHZvaWQpOworaW50IHBjaWJpb3NfaW5pdF9wbGF0Zm9ybSh2b2lkKTsKK2ludCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKTsKIAogI2lmZGVmIENPTkZJR19QQ0lfQVVUTwotZXh0ZXJuIGludCBwY2lhdXRvX2Fzc2lnbl9yZXNvdXJjZXMoaW50IGJ1c25vLCBzdHJ1Y3QgcGNpX2NoYW5uZWwgKmhvc2UpOworaW50IHBjaWF1dG9fYXNzaWduX3Jlc291cmNlcyhpbnQgYnVzbm8sIHN0cnVjdCBwY2lfY2hhbm5lbCAqaG9zZSk7CiAjZW5kaWYKIAogc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3NfYWRkX3BsYXRmb3JtX2VudHJpZXMoc3RydWN0IHBjaV9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3BnYWxsb2MuaCBiL2luY2x1ZGUvYXNtLXNoL3BnYWxsb2MuaAppbmRleCBmNGYyMzNmLi5lODQxNDY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9wZ2FsbG9jLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvcGdhbGxvYy5oCkBAIC0xLDE1ICsxLDYgQEAKICNpZm5kZWYgX19BU01fU0hfUEdBTExPQ19ICiAjZGVmaW5lIF9fQVNNX1NIX1BHQUxMT0NfSAogCi0jaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotCi0jZGVmaW5lIHBnZF9xdWlja2xpc3QgKCh1bnNpZ25lZCBsb25nICopMCkKLSNkZWZpbmUgcG1kX3F1aWNrbGlzdCAoKHVuc2lnbmVkIGxvbmcgKikwKQotI2RlZmluZSBwdGVfcXVpY2tsaXN0ICgodW5zaWduZWQgbG9uZyAqKTApCi0jZGVmaW5lIHBndGFibGVfY2FjaGVfc2l6ZSAwTAotCiAjZGVmaW5lIHBtZF9wb3B1bGF0ZV9rZXJuZWwobW0sIHBtZCwgcHRlKSBcCiAJCXNldF9wbWQocG1kLCBfX3BtZChfUEFHRV9UQUJMRSArIF9fcGEocHRlKSkpCiAKQEAgLTI0LDM4ICsxNSwyNCBAQAogICovCiBzdGF0aWMgaW5saW5lIHBnZF90ICpwZ2RfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JdW5zaWduZWQgaW50IHBnZF9zaXplID0gKFVTRVJfUFRSU19QRVJfUEdEICogc2l6ZW9mKHBnZF90KSk7Ci0JcGdkX3QgKnBnZCA9IChwZ2RfdCAqKWttYWxsb2MocGdkX3NpemUsIEdGUF9LRVJORUwpOwotCi0JaWYgKHBnZCkKLQkJbWVtc2V0KHBnZCwgMCwgcGdkX3NpemUpOwotCi0JcmV0dXJuIHBnZDsKKwlyZXR1cm4gKHBnZF90ICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9SRVBFQVQgfCBfX0dGUF9aRVJPKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHBnZF9mcmVlKHBnZF90ICpwZ2QpCiB7Ci0Ja2ZyZWUocGdkKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGdkKTsKIH0KIAogc3RhdGljIGlubGluZSBwdGVfdCAqcHRlX2FsbG9jX29uZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogewotCXB0ZV90ICpwdGU7Ci0KLQlwdGUgPSAocHRlX3QgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwgfCBfX0dGUF9SRVBFQVQgfCBfX0dGUF9aRVJPKTsKLQotCXJldHVybiBwdGU7CisJcmV0dXJuIChwdGVfdCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfUkVQRUFUIHwgX19HRlBfWkVSTyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJCSB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7Ci0Jc3RydWN0IHBhZ2UgKnB0ZTsKLQotICAgCXB0ZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUx8X19HRlBfUkVQRUFUfF9fR0ZQX1pFUk8sIDApOwotCi0JcmV0dXJuIHB0ZTsKKwlyZXR1cm4gYWxsb2NfcGFnZShHRlBfS0VSTkVMIHwgX19HRlBfUkVQRUFUIHwgX19HRlBfWkVSTyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdGVfZnJlZV9rZXJuZWwocHRlX3QgKnB0ZSkKQEAgLTc1LDE0ICs1Miw4IEBACiAgKiBpbnNpZGUgdGhlIHBnZCwgc28gaGFzIG5vIGV4dHJhIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggaXQuCiAgKi8KIAotI2RlZmluZSBwbWRfYWxsb2Nfb25lKG1tLCBhZGRyKQkJKHsgQlVHKCk7ICgocG1kX3QgKikyKTsgfSkKICNkZWZpbmUgcG1kX2ZyZWUoeCkJCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIF9fcG1kX2ZyZWVfdGxiKHRsYix4KQkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBwZ2RfcG9wdWxhdGUobW0sIHBtZCwgcHRlKQlCVUcoKQogI2RlZmluZSBjaGVja19wZ3RfY2FjaGUoKQkJZG8geyB9IHdoaWxlICgwKQogCi0jaWZkZWYgQ09ORklHX0NQVV9TSDQKLSNkZWZpbmUgUEdfbWFwcGVkCQkJUEdfYXJjaF8xCi0jZW5kaWYKLQogI2VuZGlmIC8qIF9fQVNNX1NIX1BHQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tc2gvcGd0YWJsZS5oCmluZGV4IDQwZDQxYTcuLjJjODY4MmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wZ3RhYmxlLmgKQEAgLTEsNDIgKzEsNDIgQEAKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGZ1bmN0aW9ucyBhbmQgZGVmaW5lcyBuZWNlc3NhcnkgdG8gbW9kaWZ5IGFuZAorICogdXNlIHRoZSBTdXBlckggcGFnZSB0YWJsZSB0cmVlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBOaWliZSBZdXRha2EKKyAqIENvcHlyaWdodCAoQykgMjAwMiAtIDIwMDUgUGF1bCBNdW5kdAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwKKyAqIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcworICogYXJjaGl2ZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCiAjaWZuZGVmIF9fQVNNX1NIX1BHVEFCTEVfSAogI2RlZmluZSBfX0FTTV9TSF9QR1RBQkxFX0gKIAotI2luY2x1ZGUgPGFzbS1nZW5lcmljLzRsZXZlbC1maXh1cC5oPgorI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BndGFibGUtbm9wbWQuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgogCi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk5IE5paWJlIFl1dGFrYQotICogQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzLCAyMDA0IFBhdWwgTXVuZHQKLSAqLworI2RlZmluZSBQVFJTX1BFUl9QR0QJCTEwMjQKIAotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLTJsZXZlbC5oPgotCi0vKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmdW5jdGlvbnMgYW5kIGRlZmluZXMgbmVjZXNzYXJ5IHRvIG1vZGlmeSBhbmQgdXNlCi0gKiB0aGUgU3VwZXJIIHBhZ2UgdGFibGUgdHJlZS4KLSAqLwogI2lmbmRlZiBfX0FTU0VNQkxZX18KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgogI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KLSNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAKIGV4dGVybiBwZ2RfdCBzd2FwcGVyX3BnX2RpcltQVFJTX1BFUl9QR0RdOwogZXh0ZXJuIHZvaWQgcGFnaW5nX2luaXQodm9pZCk7CiAKIC8qCi0gKiBCYXNpY2FsbHkgd2UgaGF2ZSB0aGUgc2FtZSB0d28tbGV2ZWwgKHdoaWNoIGlzIHRoZSBsb2dpY2FsIHRocmVlIGxldmVsCi0gKiBMaW51eCBwYWdlIHRhYmxlIGxheW91dCBmb2xkZWQpIHBhZ2UgdGFibGVzIGFzIHRoZSBpMzg2LgotICovCi0KLS8qCiAgKiBaRVJPX1BBR0UgaXMgYSBnbG9iYWwgc2hhcmVkIHBhZ2UgdGhhdCBpcyBhbHdheXMgemVybzogdXNlZAogICogZm9yIHplcm8tbWFwcGVkIG1lbW9yeSBhcmVhcyBldGMuLgogICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBlbXB0eV96ZXJvX3BhZ2VbMTAyNF07CitleHRlcm4gdW5zaWduZWQgbG9uZyBlbXB0eV96ZXJvX3BhZ2VbUEFHRV9TSVpFIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsKICNkZWZpbmUgWkVST19QQUdFKHZhZGRyKSAodmlydF90b19wYWdlKGVtcHR5X3plcm9fcGFnZSkpCiAKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKKy8qIHRyYWRpdGlvbmFsIHR3by1sZXZlbCBwYWdpbmcgc3RydWN0dXJlICovCisjZGVmaW5lIFBHRElSX1NISUZUCTIyCisjZGVmaW5lIFBUUlNfUEVSX1BNRAkxCisjZGVmaW5lIFBUUlNfUEVSX1BURQkxMDI0CiAjZGVmaW5lIFBNRF9TSVpFCSgxVUwgPDwgUE1EX1NISUZUKQogI2RlZmluZSBQTURfTUFTSwkofihQTURfU0laRS0xKSkKICNkZWZpbmUgUEdESVJfU0laRQkoMVVMIDw8IFBHRElSX1NISUZUKQpAQCAtNDcsNyArNDcsNiBAQAogCiAjZGVmaW5lIFBURV9QSFlTX01BU0sJMHgxZmZmZjAwMAogCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwogLyoKICAqIEZpcnN0IDFNQiBtYXAgaXMgdXNlZCBieSBmaXhlZCBwdXJwb3NlLgogICogQ3VycmVudGx5IG9ubHkgNC1lbnR5ICgxNmtCKSBpcyB1c2VkIChzZWUgYXJjaC9zaC9tbS9jYWNoZS5jKQpAQCAtNTUsMjAgKzU0LDQxIEBACiAjZGVmaW5lIFZNQUxMT0NfU1RBUlQJKFAzU0VHKzB4MDAxMDAwMDApCiAjZGVmaW5lIFZNQUxMT0NfRU5ECShGSVhBRERSX1NUQVJULTIqUEFHRV9TSVpFKQogCi0jZGVmaW5lCV9QQUdFX1dUCTB4MDAxICAvKiBXVC1iaXQgb24gU0gtNCwgMCBvbiBTSC0zICovCi0jZGVmaW5lIF9QQUdFX0hXX1NIQVJFRAkweDAwMiAgLyogU0gtYml0ICA6IHBhZ2UgaXMgc2hhcmVkIGFtb25nIHByb2Nlc3NlcyAqLwotI2RlZmluZSBfUEFHRV9ESVJUWQkweDAwNCAgLyogRC1iaXQgICA6IHBhZ2UgY2hhbmdlZCAqLwotI2RlZmluZSBfUEFHRV9DQUNIQUJMRQkweDAwOCAgLyogQy1iaXQgICA6IGNhY2hhYmxlICovCi0jZGVmaW5lIF9QQUdFX1NaMAkweDAxMCAgLyogU1owLWJpdCA6IFNpemUgb2YgcGFnZSAqLwotI2RlZmluZSBfUEFHRV9SVwkweDAyMCAgLyogUFIwLWJpdCA6IHdyaXRlIGFjY2VzcyBhbGxvd2VkICovCi0jZGVmaW5lIF9QQUdFX1VTRVIJMHgwNDAgIC8qIFBSMS1iaXQgOiB1c2VyIHNwYWNlIGFjY2VzcyBhbGxvd2VkICovCi0jZGVmaW5lIF9QQUdFX1NaMQkweDA4MCAgLyogU1oxLWJpdCA6IFNpemUgb2YgcGFnZSAob24gU0gtNCkgKi8KLSNkZWZpbmUgX1BBR0VfUFJFU0VOVAkweDEwMCAgLyogVi1iaXQgICA6IHBhZ2UgaXMgdmFsaWQgKi8KLSNkZWZpbmUgX1BBR0VfUFJPVE5PTkUJMHgyMDAgIC8qIHNvZnR3YXJlOiBpZiBub3QgcHJlc2VudCAgKi8KLSNkZWZpbmUgX1BBR0VfQUNDRVNTRUQgCTB4NDAwICAvKiBzb2Z0d2FyZTogcGFnZSByZWZlcmVuY2VkICovCi0jZGVmaW5lIF9QQUdFX1UwX1NIQVJFRCAweDgwMCAgLyogc29mdHdhcmU6IHBhZ2UgaXMgc2hhcmVkIGluIHVzZXIgc3BhY2UgKi8KLQotI2RlZmluZQlfUEFHRV9GSUxFCV9QQUdFX1dUICAvKiBzb2Z0d2FyZTogcGFnZWNhY2hlIG9yIHN3YXA/ICovCisvKgorICogTGludXggUFRFTCBlbmNvZGluZy4KKyAqCisgKiBIYXJkd2FyZSBhbmQgc29mdHdhcmUgYml0IGRlZmluaXRpb25zIGZvciB0aGUgUFRFTCB2YWx1ZToKKyAqCisgKiAtIEJpdHMgMCBhbmQgNyBhcmUgcmVzZXJ2ZWQgb24gU0gtMyAoX1BBR0VfV1QgYW5kIF9QQUdFX1NaMSBvbiBTSC00KS4KKyAqCisgKiAtIEJpdCAxIGlzIHRoZSBTSC1iaXQsIGJ1dCBpcyB1bnVzZWQgb24gU0gtMyBkdWUgdG8gYW4gTU1VIGJ1ZyAodGhlCisgKiAgIGhhcmR3YXJlIFBURUwgdmFsdWUgY2FuJ3QgaGF2ZSB0aGUgU0gtYml0IHNldCB3aGVuIE1NVUNSLklYIGlzIHNldCwKKyAqICAgd2hpY2ggaXMgdGhlIGRlZmF1bHQgaW4gY3B1LXNoMy9tbXVfY29udGV4dC5oOk1NVV9DT05UUk9MX0lOSVQpLgorICoKKyAqICAgSW4gb3JkZXIgdG8ga2VlcCB0aGlzIHJlbGF0aXZlbHkgY2xlYW4sIGRvIG5vdCB1c2UgdGhlc2UgZm9yIGRlZmluaW5nCisgKiAgIFNILTMgc3BlY2lmaWMgZmxhZ3MgdW50aWwgYWxsIG9mIHRoZSBvdGhlciB1bnVzZWQgYml0cyBoYXZlIGJlZW4KKyAqICAgZXhoYXVzdGVkLgorICoKKyAqIC0gQml0IDkgaXMgcmVzZXJ2ZWQgYnkgZXZlcnlvbmUgYW5kIHVzZWQgYnkgX1BBR0VfUFJPVE5PTkUuCisgKgorICogLSBCaXRzIDEwIGFuZCAxMSBhcmUgbG93IGJpdHMgb2YgdGhlIFBQTiB0aGF0IGFyZSByZXNlcnZlZCBvbiA+PSA0SyBwYWdlcy4KKyAqICAgQml0IDEwIGlzIHVzZWQgZm9yIF9QQUdFX0FDQ0VTU0VELCBiaXQgMTEgcmVtYWlucyB1bnVzZWQuCisgKgorICogLSBCaXRzIDMxLCAzMCwgYW5kIDI5IHJlbWFpbiB1bnVzZWQgYnkgZXZlcnlvbmUgYW5kIGNhbiBiZSB1c2VkIGZvciBmdXR1cmUKKyAqICAgc29mdHdhcmUgZmxhZ3MsIGFsdGhvdWdoIGNhcmUgbXVzdCBiZSB0YWtlbiB0byB1cGRhdGUgX1BBR0VfQ0xFQVJfRkxBR1MuCisgKi8KKyNkZWZpbmUJX1BBR0VfV1QJMHgwMDEJCS8qIFdULWJpdCBvbiBTSC00LCAwIG9uIFNILTMgKi8KKyNkZWZpbmUgX1BBR0VfSFdfU0hBUkVECTB4MDAyCQkvKiBTSC1iaXQgIDogc2hhcmVkIGFtb25nIHByb2Nlc3NlcyAqLworI2RlZmluZSBfUEFHRV9ESVJUWQkweDAwNAkJLyogRC1iaXQgICA6IHBhZ2UgY2hhbmdlZCAqLworI2RlZmluZSBfUEFHRV9DQUNIQUJMRQkweDAwOAkJLyogQy1iaXQgICA6IGNhY2hhYmxlICovCisjZGVmaW5lIF9QQUdFX1NaMAkweDAxMAkJLyogU1owLWJpdCA6IFNpemUgb2YgcGFnZSAqLworI2RlZmluZSBfUEFHRV9SVwkweDAyMAkJLyogUFIwLWJpdCA6IHdyaXRlIGFjY2VzcyBhbGxvd2VkICovCisjZGVmaW5lIF9QQUdFX1VTRVIJMHgwNDAJCS8qIFBSMS1iaXQgOiB1c2VyIHNwYWNlIGFjY2VzcyBhbGxvd2VkICovCisjZGVmaW5lIF9QQUdFX1NaMQkweDA4MAkJLyogU1oxLWJpdCA6IFNpemUgb2YgcGFnZSAob24gU0gtNCkgKi8KKyNkZWZpbmUgX1BBR0VfUFJFU0VOVAkweDEwMAkJLyogVi1iaXQgICA6IHBhZ2UgaXMgdmFsaWQgKi8KKyNkZWZpbmUgX1BBR0VfUFJPVE5PTkUJMHgyMDAJCS8qIHNvZnR3YXJlOiBpZiBub3QgcHJlc2VudCAgKi8KKyNkZWZpbmUgX1BBR0VfQUNDRVNTRUQJMHg0MDAJCS8qIHNvZnR3YXJlOiBwYWdlIHJlZmVyZW5jZWQgKi8KKyNkZWZpbmUgX1BBR0VfRklMRQlfUEFHRV9XVAkvKiBzb2Z0d2FyZTogcGFnZWNhY2hlIG9yIHN3YXA/ICovCiAKIC8qIHNvZnR3YXJlOiBtb3ZlcyB0byBQVEVBLlRDIChUaW1pbmcgQ29udHJvbCkgKi8KICNkZWZpbmUgX1BBR0VfUENDX0FSRUE1CTB4MDAwMDAwMDAJLyogdXNlIEJTQyByZWdpc3RlcnMgZm9yIGFyZWE1ICovCkBAIC04MywyMyArMTAzLDE3IEBACiAjZGVmaW5lIF9QQUdFX1BDQ19BVFI4CTB4NjAwMDAwMDAJLyogQXR0cmlidXRlIE1lbW9yeSBzcGFjZSwgOCBiaXQgYnVzICovCiAjZGVmaW5lIF9QQUdFX1BDQ19BVFIxNgkweDYwMDAwMDAxCS8qIEF0dHJpYnV0ZSBNZW1vcnkgc3BhY2UsIDYgYml0IGJ1cyAqLwogCi0KLS8qIE1hc2sgd2hpY2ggZHJvcCBzb2Z0d2FyZSBmbGFncwotICogV2UgYWxzbyBkcm9wIFdUIGJpdCBzaW5jZSBpdCBpcyB1c2VkIGZvciBfUEFHRV9GSUxFCi0gKiBiaXQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbi4KLSAqLwotI2RlZmluZSBfUEFHRV9DTEVBUl9GTEFHUwkoX1BBR0VfV1QgfCBfUEFHRV9QUk9UTk9ORSB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfVTBfU0hBUkVEKQotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NIMykKLS8qCi0gKiBNTVUgb24gU0gtMyBoYXMgYnVnIG9uIFNILWJpdDogV2UgY2FuJ3QgdXNlIGl0IGlmIE1NVUNSLklYPTEuCi0gKiBXb3JrIGFyb3VuZDogSnVzdCBkcm9wIFNILWJpdC4KLSAqLwotI2RlZmluZSBfUEFHRV9GTEFHU19IQVJEV0FSRV9NQVNLCSgweDFmZmZmZmZmICYgfihfUEFHRV9DTEVBUl9GTEFHUyB8IF9QQUdFX0hXX1NIQVJFRCkpCisvKiBNYXNrIHdoaWNoIGRyb3BzIHVudXNlZCBiaXRzIGZyb20gdGhlIFBURUwgdmFsdWUgKi8KKyNpZmRlZiBDT05GSUdfQ1BVX1NIMworI2RlZmluZSBfUEFHRV9DTEVBUl9GTEFHUwkoX1BBR0VfUFJPVE5PTkUgfCBfUEFHRV9BQ0NFU1NFRHwgXAorCQkJCSBfUEFHRV9GSUxFCXwgX1BBR0VfU1oxCXwgXAorCQkJCSBfUEFHRV9IV19TSEFSRUQpCiAjZWxzZQotI2RlZmluZSBfUEFHRV9GTEFHU19IQVJEV0FSRV9NQVNLCSgweDFmZmZmZmZmICYgfihfUEFHRV9DTEVBUl9GTEFHUykpCisjZGVmaW5lIF9QQUdFX0NMRUFSX0ZMQUdTCShfUEFHRV9QUk9UTk9ORSB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfRklMRSkKICNlbmRpZgogCisjZGVmaW5lIF9QQUdFX0ZMQUdTX0hBUkRXQVJFX01BU0sJKDB4MWZmZmZmZmYgJiB+KF9QQUdFX0NMRUFSX0ZMQUdTKSkKKwogLyogSGFyZHdhcmUgZmxhZ3M6IFNaMD0xICg0ay1ieXRlKSAqLwogI2RlZmluZSBfUEFHRV9GTEFHU19IQVJECV9QQUdFX1NaMAogCkBAIC0xMDksMTUgKzEyMywxNSBAQAogI2RlZmluZSBfUEFHRV9TWkhVR0UJKF9QQUdFX1NaMCB8IF9QQUdFX1NaMSkKICNlbmRpZgogCi0jZGVmaW5lIF9QQUdFX1NIQVJFRAlfUEFHRV9VMF9TSEFSRUQKLQogI2RlZmluZSBfUEFHRV9UQUJMRQkoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXIHwgX1BBR0VfVVNFUiB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfRElSVFkpCiAjZGVmaW5lIF9LRVJOUEdfVEFCTEUJKF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9SVyB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfRElSVFkpCi0jZGVmaW5lIF9QQUdFX0NIR19NQVNLCShQVEVfTUFTSyB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfQ0FDSEFCTEUgfCBfUEFHRV9ESVJUWSB8IF9QQUdFX1NIQVJFRCkKKyNkZWZpbmUgX1BBR0VfQ0hHX01BU0sJKFBURV9NQVNLIHwgX1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9DQUNIQUJMRSB8IF9QQUdFX0RJUlRZKQorCisjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiAjaWZkZWYgQ09ORklHX01NVQogI2RlZmluZSBQQUdFX05PTkUJX19wZ3Byb3QoX1BBR0VfUFJPVE5PTkUgfCBfUEFHRV9DQUNIQUJMRSB8X1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9GTEFHU19IQVJEKQotI2RlZmluZSBQQUdFX1NIQVJFRAlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlcgfCBfUEFHRV9VU0VSIHwgX1BBR0VfQ0FDSEFCTEUgfF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfU0hBUkVEIHwgX1BBR0VfRkxBR1NfSEFSRCkKKyNkZWZpbmUgUEFHRV9TSEFSRUQJX19wZ3Byb3QoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1JXIHwgX1BBR0VfVVNFUiB8IF9QQUdFX0NBQ0hBQkxFIHxfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0ZMQUdTX0hBUkQpCiAjZGVmaW5lIFBBR0VfQ09QWQlfX3BncHJvdChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfVVNFUiB8IF9QQUdFX0NBQ0hBQkxFIHwgX1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9GTEFHU19IQVJEKQogI2RlZmluZSBQQUdFX1JFQURPTkxZCV9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9VU0VSIHwgX1BBR0VfQ0FDSEFCTEUgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0ZMQUdTX0hBUkQpCiAjZGVmaW5lIFBBR0VfS0VSTkVMCV9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9SVyB8IF9QQUdFX0NBQ0hBQkxFIHwgX1BBR0VfRElSVFkgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0hXX1NIQVJFRCB8IF9QQUdFX0ZMQUdTX0hBUkQpCkBAIC0xMzcsMTIgKzE1MSwxMyBAQAogI2RlZmluZSBQQUdFX0tFUk5FTF9QQ0MJCV9fcGdwcm90KDApCiAjZW5kaWYKIAorI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCiAvKgogICogQXMgaTM4NiBhbmQgTUlQUywgU3VwZXJIIGNhbid0IGRvIHBhZ2UgcHJvdGVjdGlvbiBmb3IgZXhlY3V0ZSwgYW5kCiAgKiBjb25zaWRlcnMgdGhhdCB0aGUgc2FtZSBhcyBhIHJlYWQuICBBbHNvLCB3cml0ZSBwZXJtaXNzaW9ucyBpbXBseQotICogcmVhZCBwZXJtaXNzaW9ucy4gVGhpcyBpcyB0aGUgY2xvc2VzdCB3ZSBjYW4gZ2V0Li4gIAorICogcmVhZCBwZXJtaXNzaW9ucy4gVGhpcyBpcyB0aGUgY2xvc2VzdCB3ZSBjYW4gZ2V0Li4KICAqLwotCiAjZGVmaW5lIF9fUDAwMAlQQUdFX05PTkUKICNkZWZpbmUgX19QMDAxCVBBR0VfUkVBRE9OTFkKICNkZWZpbmUgX19QMDEwCVBBR0VfQ09QWQpAQCAtMTYxLDYgKzE3NiwyNiBAQAogI2RlZmluZSBfX1MxMTAJUEFHRV9TSEFSRUQKICNkZWZpbmUgX19TMTExCVBBR0VfU0hBUkVECiAKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKy8qCisgKiBDZXJ0YWluIGFyY2hpdGVjdHVyZXMgbmVlZCB0byBkbyBzcGVjaWFsIHRoaW5ncyB3aGVuIFBURXMKKyAqIHdpdGhpbiBhIHBhZ2UgdGFibGUgYXJlIGRpcmVjdGx5IG1vZGlmaWVkLiAgVGh1cywgdGhlIGZvbGxvd2luZworICogaG9vayBpcyBtYWRlIGF2YWlsYWJsZS4KKyAqLworI2RlZmluZSBzZXRfcHRlKHB0ZXB0ciwgcHRldmFsKSAoKihwdGVwdHIpID0gcHRldmFsKQorI2RlZmluZSBzZXRfcHRlX2F0KG1tLGFkZHIscHRlcCxwdGV2YWwpIHNldF9wdGUocHRlcCxwdGV2YWwpCisKKy8qCisgKiAocG1kcyBhcmUgZm9sZGVkIGludG8gcGdkcyBzbyB0aGlzIGRvZXNuJ3QgZ2V0IGFjdHVhbGx5IGNhbGxlZCwKKyAqIGJ1dCB0aGUgZGVmaW5lIGlzIG5lZWRlZCBmb3IgYSBnZW5lcmljIGlubGluZSBmdW5jdGlvbi4pCisgKi8KKyNkZWZpbmUgc2V0X3BtZChwbWRwdHIsIHBtZHZhbCkgKCoocG1kcHRyKSA9IHBtZHZhbCkKKworI2RlZmluZSBwdGVfcGZuKHgpCQkoKHVuc2lnbmVkIGxvbmcpKCgoeCkucHRlID4+IFBBR0VfU0hJRlQpKSkKKyNkZWZpbmUgcGZuX3B0ZShwZm4sIHByb3QpCV9fcHRlKCgocGZuKSA8PCBQQUdFX1NISUZUKSB8IHBncHJvdF92YWwocHJvdCkpCisjZGVmaW5lIHBmbl9wbWQocGZuLCBwcm90KQlfX3BtZCgoKHBmbikgPDwgUEFHRV9TSElGVCkgfCBwZ3Byb3RfdmFsKHByb3QpKQorCiAjZGVmaW5lIHB0ZV9ub25lKHgpCSghcHRlX3ZhbCh4KSkKICNkZWZpbmUgcHRlX3ByZXNlbnQoeCkJKHB0ZV92YWwoeCkgJiAoX1BBR0VfUFJFU0VOVCB8IF9QQUdFX1BST1ROT05FKSkKICNkZWZpbmUgcHRlX2NsZWFyKG1tLGFkZHIseHApCWRvIHsgc2V0X3B0ZV9hdChtbSwgYWRkciwgeHAsIF9fcHRlKDApKTsgfSB3aGlsZSAoMCkKQEAgLTE3MSw3ICsyMDYsNyBAQAogI2RlZmluZQlwbWRfYmFkKHgpCSgocG1kX3ZhbCh4KSAmICh+UEFHRV9NQVNLICYgfl9QQUdFX1VTRVIpKSAhPSBfS0VSTlBHX1RBQkxFKQogCiAjZGVmaW5lIHBhZ2VzX3RvX21iKHgpCSgoeCkgPj4gKDIwLVBBR0VfU0hJRlQpKQotI2RlZmluZSBwdGVfcGFnZSh4KSAJcGh5c190b19wYWdlKHB0ZV92YWwoeCkmUFRFX1BIWVNfTUFTSykKKyNkZWZpbmUgcHRlX3BhZ2UoeCkJcGh5c190b19wYWdlKHB0ZV92YWwoeCkmUFRFX1BIWVNfTUFTSykKIAogLyoKICAqIFRoZSBmb2xsb3dpbmcgb25seSB3b3JrIGlmIHB0ZV9wcmVzZW50KCkgaXMgdHJ1ZS4KQEAgLTI0OCw2ICsyODMsMTEgQEAKICNkZWZpbmUgcHRlX3VubWFwKHB0ZSkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgcHRlX3VubWFwX25lc3RlZChwdGUpCWRvIHsgfSB3aGlsZSAoMCkKIAorI2RlZmluZSBwdGVfRVJST1IoZSkgXAorCXByaW50aygiJXM6JWQ6IGJhZCBwdGUgJTA4bHguXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sIHB0ZV92YWwoZSkpCisjZGVmaW5lIHBnZF9FUlJPUihlKSBcCisJcHJpbnRrKCIlczolZDogYmFkIHBnZCAlMDhseC5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgcGdkX3ZhbChlKSkKKwogc3RydWN0IHZtX2FyZWFfc3RydWN0OwogZXh0ZXJuIHZvaWQgdXBkYXRlX21tdV9jYWNoZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEsCiAJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgcHRlKTsKQEAgLTI3Miw4ICszMTIsNiBAQAogCiB0eXBlZGVmIHB0ZV90ICpwdGVfYWRkcl90OwogCi0jZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwotCiAjZGVmaW5lIGtlcm5fYWRkcl92YWxpZChhZGRyKQkoMSkKIAogI2RlZmluZSBpb19yZW1hcF9wZm5fcmFuZ2Uodm1hLCB2YWRkciwgcGZuLCBzaXplLCBwcm90KQkJXApAQCAtMzAxLDUgKzMzOSw1IEBACiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZ3RhYmxlLmg+CiAKKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAjZW5kaWYgLyogX19BU01fU0hfUEFHRV9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3BtLmggYi9pbmNsdWRlL2FzbS1zaC9wbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZmRiZDYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9wbS5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiAoYykgQW5kcml5IFNrdWx5c2ggPGFza3VseXNoQGdtYWlsLmNvbT4KKyAqCisgKi8KKyNpZm5kZWYgX19BU01fU0hfUE1fSAorI2RlZmluZSBfX0FTTV9TSF9QTV9ICisKK2V4dGVybiB1OCB3YWtldXBfc3RhcnQ7CitleHRlcm4gdTggd2FrZXVwX2VuZDsKKwordm9pZCBwbV9lbnRlcih2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3IuaCBiL2luY2x1ZGUvYXNtLXNoL3Byb2Nlc3Nvci5oCmluZGV4IGVlYjBmNDguLjQ3NDc3MzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3Byb2Nlc3Nvci5oCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9jcHUtZmVhdHVyZXMuaD4KIAogLyoKICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgbWFjcm8gdGhhdCByZXR1cm5zIGN1cnJlbnQKQEAgLTM4LDI3ICszOSwzMCBAQAogCUNQVV9TSDc2MDQsCiAKIAkvKiBTSC0zIHR5cGVzICovCi0JQ1BVX1NINzcwNSwgQ1BVX1NINzcwNywgIENQVV9TSDc3MDgsIENQVV9TSDc3MDhTLCBDUFVfU0g3NzA4UiwKLQlDUFVfU0g3NzA5LCBDUFVfU0g3NzA5QSwgQ1BVX1NINzcyOSwgQ1BVX1NINzMwMCwKKwlDUFVfU0g3NzA1LCBDUFVfU0g3NzA2LCBDUFVfU0g3NzA3LAorCUNQVV9TSDc3MDgsIENQVV9TSDc3MDhTLCBDUFVfU0g3NzA4UiwKKwlDUFVfU0g3NzA5LCBDUFVfU0g3NzA5QSwgQ1BVX1NINzcxMCwKKwlDUFVfU0g3NzI5LCBDUFVfU0g3MzAwLAogCiAJLyogU0gtNCB0eXBlcyAqLwogCUNQVV9TSDc3NTAsIENQVV9TSDc3NTBTLCBDUFVfU0g3NzUwUiwgQ1BVX1NINzc1MSwgQ1BVX1NINzc1MVIsCiAJQ1BVX1NINzc2MCwgQ1BVX1NUNDBSQSwgQ1BVX1NUNDBHWDEsIENQVV9TSDRfMjAyLCBDUFVfU0g0XzUwMSwKLQlDUFVfU0g3MzE4MCwgQ1BVX1NINzc3MCwgQ1BVX1NINzc4MCwgQ1BVX1NINzc4MSwKKwlDUFVfU0g3MzE4MCwgQ1BVX1NINzM0MywgQ1BVX1NINzc3MCwgQ1BVX1NINzc4MCwgQ1BVX1NINzc4MSwKIAogCS8qIFVua25vd24gc3VidHlwZSAqLwogCUNQVV9TSF9OT05FCiB9OwogCiBzdHJ1Y3Qgc2hfY3B1aW5mbyB7Ci0JZW51bSBjcHVfdHlwZSB0eXBlOworCXVuc2lnbmVkIGludCB0eXBlOwogCXVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5OwogCi0Jc3RydWN0IGNhY2hlX2luZm8gaWNhY2hlOwotCXN0cnVjdCBjYWNoZV9pbmZvIGRjYWNoZTsKKwlzdHJ1Y3QgY2FjaGVfaW5mbyBpY2FjaGU7CS8qIFByaW1hcnkgSS1jYWNoZSAqLworCXN0cnVjdCBjYWNoZV9pbmZvIGRjYWNoZTsJLyogUHJpbWFyeSBELWNhY2hlICovCisJc3RydWN0IGNhY2hlX2luZm8gc2NhY2hlOwkvKiBTZWNvbmRhcnkgY2FjaGUgKi8KIAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci19OworfSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZChTTVBfQ0FDSEVfQllURVMpKSk7CiAKIGV4dGVybiBzdHJ1Y3Qgc2hfY3B1aW5mbyBib290X2NwdV9kYXRhOwogCkBAIC0xMjUsMTcgKzEyOSw2IEBACiAJc3RydWN0IHNoX2ZwdV9zb2Z0X3N0cnVjdCBzb2Z0OwogfTsKIAotLyoKLSAqIFByb2Nlc3NvciBmbGFncwotICovCi0KLSNkZWZpbmUgQ1BVX0hBU19GUFUJCTB4MDAwMQkvKiBIYXJkd2FyZSBGUFUgc3VwcG9ydCAqLwotI2RlZmluZSBDUFVfSEFTX1AyX0ZMVVNIX0JVRwkweDAwMDIJLyogTmVlZCB0byBmbHVzaCB0aGUgY2FjaGUgaW4gUDIgYXJlYSAqLwotI2RlZmluZSBDUFVfSEFTX01NVV9QQUdFX0FTU09DCTB4MDAwNAkvKiBTSDM6IFRMQiB3YXkgc2VsZWN0aW9uIGJpdCBzdXBwb3J0ICovCi0jZGVmaW5lIENQVV9IQVNfRFNQCQkweDAwMDgJLyogU0gtRFNQOiBEU1Agc3VwcG9ydCAqLwotI2RlZmluZSBDUFVfSEFTX1BFUkZfQ09VTlRFUgkweDAwMTAJLyogSGFyZHdhcmUgcGVyZm9ybWFuY2UgY291bnRlcnMgKi8KLSNkZWZpbmUgQ1BVX0hBU19QVEVBCQkweDAwMjAJLyogUFRFQSByZWdpc3RlciAqLwotCiBzdHJ1Y3QgdGhyZWFkX3N0cnVjdCB7CiAJdW5zaWduZWQgbG9uZyBzcDsKIAl1bnNpZ25lZCBsb25nIHBjOwpAQCAtMTQ5LDYgKzE0MiwxMCBAQAogCXVuaW9uIHNoX2ZwdV91bmlvbiBmcHU7CiB9OwogCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgbG9uZyBzZWc7Cit9IG1tX3NlZ21lbnRfdDsKKwogLyogQ291bnQgb2YgYWN0aXZlIHRhc2tzIHdpdGggVUJDIHNldHRpbmdzICovCiBleHRlcm4gaW50IHViY191c2VyY250OwogCkBAIC0yNjYsNSArMjYzLDI0IEBACiAjZGVmaW5lIGNwdV9zbGVlcCgpCV9fYXNtX18gX192b2xhdGlsZV9fICgic2xlZXAiIDogOiA6ICJtZW1vcnkiKQogI2RlZmluZSBjcHVfcmVsYXgoKQliYXJyaWVyKCkKIAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDJBKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU0gzKSB8fCBcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NINCkKKyNkZWZpbmUgUFJFRkVUQ0hfU1RSSURFCQlMMV9DQUNIRV9CWVRFUworI2RlZmluZSBBUkNIX0hBU19QUkVGRVRDSAorI2RlZmluZSBBUkNIX0hBU19QUkVGRVRDSFcKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmVmZXRjaCh2b2lkICp4KQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgicHJlZiBAJTBcblx0IiA6IDogInIiICh4KSA6ICJtZW1vcnkiKTsKK30KKworI2RlZmluZSBwcmVmZXRjaHcoeCkJcHJlZmV0Y2goeCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1ZTWVNDQUxMCitleHRlcm4gaW50IHZzeXNjYWxsX2luaXQodm9pZCk7CisjZWxzZQorI2RlZmluZSB2c3lzY2FsbF9pbml0KCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19BU01fU0hfUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3I3NzgwcnAvaWRlLmggYi9pbmNsdWRlL2FzbS1zaC9yNzc4MHJwL2lkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZWQ3OGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9yNzc4MHJwL2lkZS5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfX0FTTV9TSF9SNzc4MFJQX0lERV9ICisjZGVmaW5lIF9fQVNNX1NIX1I3NzgwUlBfSURFX0gKKworLyogTm90aGluZyB0byBzZWUgaGVyZS4uICovCisjaW5jbHVkZSA8YXNtL21hY2gvcjc3ODBycC5oPgorCisjZW5kaWYgLyogX19BU01fU0hfUjc3ODBSUF9JREVfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9yNzc4MHJwL3I3NzgwcnAuaCBiL2luY2x1ZGUvYXNtLXNoL3I3NzgwcnAvcjc3ODBycC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NWQ5ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9yNzc4MHJwL3I3NzgwcnAuaApAQCAtMCwwICsxLDE3NyBAQAorI2lmbmRlZiBfX0FTTV9TSF9SRU5FU0FTX1I3NzgwUlBfSAorI2RlZmluZSBfX0FTTV9TSF9SRU5FU0FTX1I3NzgwUlBfSAorCisvKgorICogbGludXgvaW5jbHVkZS9hc20tc2gvcjc3ODBycC5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwICBBdG9tIENyZWF0ZSBFbmdpbmVlcmluZyBDby4sIEx0ZC4KKyAqCisgKiBSZW5lc2FzIFNvbHV0aW9ucyBIaWdobGFuZGVyIFI3NzgwUlAgc3VwcG9ydAorICovCisKKy8qIEJveCBzcGVjaWZpYyBhZGRyZXNzZXMuICAqLworI2lmIGRlZmluZWQoQ09ORklHX1NIX1I3NzgwTVApCisjZGVmaW5lIFBBX0JDUiAgICAgICAgICAweGE0MDAwMDAwICAgICAgLyogRlBHQSAqLworI2RlZmluZSBQQV9JUkxNU0sgICAgICAgKFBBX0JDUisweDAwMDApIC8qIEludGVycnVwdCBNYXNrIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfSVJMTU9OICAgICAgIChQQV9CQ1IrMHgwMDAyKSAvKiBJbnRlcnJ1cHQgU3RhdHVzIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfSVJMUFJJMSAgICAgIChQQV9CQ1IrMHgwMDA0KSAvKiBJbnRlcnJ1cHQgUHJpb3J0eSAxICovCisjZGVmaW5lIFBBX0lSTFBSSTIgICAgICAoUEFfQkNSKzB4MDAwNikgLyogSW50ZXJydXB0IFByaW9ydHkgMiAqLworI2RlZmluZSBQQV9JUkxQUkkzICAgICAgKFBBX0JDUisweDAwMDgpIC8qIEludGVycnVwdCBQcmlvcnR5IDMgKi8KKyNkZWZpbmUgUEFfSVJMUFJJNCAgICAgIChQQV9CQ1IrMHgwMDBhKSAvKiBJbnRlcnJ1cHQgUHJpb3J0eSA0ICovCisjZGVmaW5lIFBBX1JTVENUTCAgICAgICAoUEFfQkNSKzB4MDAwYykgLyogUmVzZXQgQ29udHJvbCAqLworI2RlZmluZSBQQV9QQ0lCRCAgICAgICAgKFBBX0JDUisweDAwMGUpIC8qIFBDSSBCb2FyZCBkZXRlY3QgY29udHJvbCAqLworI2RlZmluZSBQQV9QQ0lDRCAgICAgICAgKFBBX0JDUisweDAwMTApIC8qIFBDSSBDb25lY3RvciBkZXRlY3QgY29udHJvbCAqLworI2RlZmluZSBQQV9FWFRHSU8gICAgICAgKFBBX0JDUisweDAwMTYpIC8qIEV4dGVuc2lvbiBHUElPIENvbnRyb2wgKi8KKyNkZWZpbmUgUEFfSVZEUk1PTiAgICAgIChQQV9CQ1IrMHgwMDE4KSAvKiBpVkRSIE1vbml0ZXIgY29udHJvbCAqLworI2RlZmluZSBQQV9JVkRSQ1RMICAgICAgKFBBX0JDUisweDAwMWEpIC8qIGlWRFIgY29udHJvbCAqLworI2RlZmluZSBQQV9PQkxFRCAgICAgICAgKFBBX0JDUisweDAwMWMpIC8qIE9uIEJvYXJkIExFRCBjb250cm9sICovCisjZGVmaW5lIFBBX09CU1cgICAgICAgICAoUEFfQkNSKzB4MDAxZSkgLyogT24gQm9hcmQgU3dpdGNoIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfQVVESU9TRUwgICAgIChQQV9CQ1IrMHgwMDIwKSAvKiBTb3VuZCBJbnRlcmZhY2UgU2VsZWN0IGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfRVhUUExSICAgICAgIChQQV9CQ1IrMHgwMDFlKSAvKiBFeHRlbnRpb24gUGluIFBvbGFyaXR5IGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfVFBDVEwgICAgICAgIChQQV9CQ1IrMHgwMTAwKSAvKiBUb3VjaCBQYW5lbCBBY2Nlc3MgY29udHJvbCAqLworI2RlZmluZSBQQV9UUERDS0NUTCAgICAgKFBBX0JDUisweDAxMDIpIC8qIFRvdWNoIFBhbmVsIEFjY2VzcyBkYXRhIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfVFBDVExDTFIgICAgIChQQV9CQ1IrMHgwMTA0KSAvKiBUb3VjaCBQYW5lbCBBY2Nlc3MgY29udHJvbCAqLworI2RlZmluZSBQQV9UUFhQT1MgICAgICAgKFBBX0JDUisweDAxMDYpIC8qIFRvdWNoIFBhbmVsIFggcG9zaXRpb24gY29udHJvbCAqLworI2RlZmluZSBQQV9UUFlQT1MgICAgICAgKFBBX0JDUisweDAxMDgpIC8qIFRvdWNoIFBhbmVsIFkgcG9zaXRpb24gY29udHJvbCAqLworI2RlZmluZSBQQV9EQlNXICAgICAgICAgKFBBX0JDUisweDAyMDApIC8qIERlYnVnIEJvYXJkIFN3aXRjaCBjb250cm9sICovCisjZGVmaW5lIFBBX0NGQ1RMICAgICAgICAoUEFfQkNSKzB4MDMwMCkgLyogQ0YgVGltaW5nIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfQ0ZQT1cgICAgICAgIChQQV9CQ1IrMHgwMzAyKSAvKiBDRiBQb3dlciBjb250cm9sICovCisjZGVmaW5lIFBBX0NGQ0RJTlRDTFIgICAoUEFfQkNSKzB4MDMwNCkgLyogQ0YgSW5zZXJ0IEludGVycnVwdCBjbGVhciAqLworI2RlZmluZSBQQV9TQ1NNUjAgICAgICAgKFBBX0JDUisweDA0MDApIC8qIFNDSUYwIFNlcmlhbCBtb2RlIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NCUlIwICAgICAgIChQQV9CQ1IrMHgwNDA0KSAvKiBTQ0lGMCBCaXQgcmF0ZSBjb250cm9sICovCisjZGVmaW5lIFBBX1NDU0NSMCAgICAgICAoUEFfQkNSKzB4MDQwOCkgLyogU0NJRjAgU2VyaWFsIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NGVERSMCAgICAgIChQQV9CQ1IrMHgwNDBjKSAvKiBTQ0lGMCBTZW5kIEZJRk8gY29udHJvbCAqLworI2RlZmluZSBQQV9TQ0ZTUjAgICAgICAgKFBBX0JDUisweDA0MTApIC8qIFNDSUYwIFNlcmlhbCBzdGF0dXMgY29udHJvbCAqLworI2RlZmluZSBQQV9TQ0ZSRFIwICAgICAgKFBBX0JDUisweDA0MTQpIC8qIFNDSUYwIFJlY2VpdmUgRklGTyBjb250cm9sICovCisjZGVmaW5lIFBBX1NDRkNSMCAgICAgICAoUEFfQkNSKzB4MDQxOCkgLyogU0NJRjAgRklGTyBjb250cm9sICovCisjZGVmaW5lIFBBX1NDVEZEUjAgICAgICAoUEFfQkNSKzB4MDQxYykgLyogU0NJRjAgU2VuZCBGSUZPIGRhdGEgY29udHJvbCAqLworI2RlZmluZSBQQV9TQ1JGRFIwICAgICAgKFBBX0JDUisweDA0MjApIC8qIFNDSUYwIFJlY2VpdmUgRklGTyBkYXRhIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NTUFRSMCAgICAgIChQQV9CQ1IrMHgwNDI0KSAvKiBTQ0lGMCBTZXJpYWwgUG9ydCBjb250cm9sICovCisjZGVmaW5lIFBBX1NDTFNSMCAgICAgICAoUEFfQkNSKzB4MDQyOCkgLyogU0NJRjAgTGluZSBTdGF0dXMgY29udHJvbCAqLworI2RlZmluZSBQQV9TQ1JFUjAgICAgICAgKFBBX0JDUisweDA0MmMpIC8qIFNDSUYwIFNlcmlhbCBFcnJvciBjb250cm9sICovCisjZGVmaW5lIFBBX1NDU01SMSAgICAgICAoUEFfQkNSKzB4MDUwMCkgLyogU0NJRjEgU2VyaWFsIG1vZGUgY29udHJvbCAqLworI2RlZmluZSBQQV9TQ0JSUjEgICAgICAgKFBBX0JDUisweDA1MDQpIC8qIFNDSUYxIEJpdCByYXRlIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NTQ1IxICAgICAgIChQQV9CQ1IrMHgwNTA4KSAvKiBTQ0lGMSBTZXJpYWwgY29udHJvbCAqLworI2RlZmluZSBQQV9TQ0ZURFIxICAgICAgKFBBX0JDUisweDA1MGMpIC8qIFNDSUYxIFNlbmQgRklGTyBjb250cm9sICovCisjZGVmaW5lIFBBX1NDRlNSMSAgICAgICAoUEFfQkNSKzB4MDUxMCkgLyogU0NJRjEgU2VyaWFsIHN0YXR1cyBjb250cm9sICovCisjZGVmaW5lIFBBX1NDRlJEUjEgICAgICAoUEFfQkNSKzB4MDUxNCkgLyogU0NJRjEgUmVjZWl2ZSBGSUZPIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NGQ1IxICAgICAgIChQQV9CQ1IrMHgwNTE4KSAvKiBTQ0lGMSBGSUZPIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NURkRSMSAgICAgIChQQV9CQ1IrMHgwNTFjKSAvKiBTQ0lGMSBTZW5kIEZJRk8gZGF0YSBjb250cm9sICovCisjZGVmaW5lIFBBX1NDUkZEUjEgICAgICAoUEFfQkNSKzB4MDUyMCkgLyogU0NJRjEgUmVjZWl2ZSBGSUZPIGRhdGEgY29udHJvbCAqLworI2RlZmluZSBQQV9TQ1NQVFIxICAgICAgKFBBX0JDUisweDA1MjQpIC8qIFNDSUYxIFNlcmlhbCBQb3J0IGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NMU1IxICAgICAgIChQQV9CQ1IrMHgwNTI4KSAvKiBTQ0lGMSBMaW5lIFN0YXR1cyBjb250cm9sICovCisjZGVmaW5lIFBBX1NDUkVSMSAgICAgICAoUEFfQkNSKzB4MDUyYykgLyogU0NJRjEgU2VyaWFsIEVycm9yIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfSUNDUiAgICAgICAgIChQQV9CQ1IrMHgwNjAwKSAvKiBTZXJpYWwgY29udHJvbCAqLworI2RlZmluZSBQQV9TQVIgICAgICAgICAgKFBBX0JDUisweDA2MDIpIC8qIFNlcmlhbCBTbGF2ZSBjb250cm9sICovCisjZGVmaW5lIFBBX01EUiAgICAgICAgICAoUEFfQkNSKzB4MDYwNCkgLyogU2VyaWFsIE1vZGUgY29udHJvbCAqLworI2RlZmluZSBQQV9BRFIxICAgICAgICAgKFBBX0JDUisweDA2MDYpIC8qIFNlcmlhbCBBZGRyZXNzMSBjb250cm9sICovCisjZGVmaW5lIFBBX0RBUjEgICAgICAgICAoUEFfQkNSKzB4MDY0NikgLyogU2VyaWFsIERhdGExIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfVkVSUkVHICAgICAgIChQQV9CQ1IrMHgwNzAwKSAvKiBGUEdBIFZlcnNpb24gUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEFfUE9GRiAgICAgICAgIChQQV9CQ1IrMHgwODAwKSAvKiBTeXN0ZW0gUG93ZXIgT2ZmIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfUE1SICAgICAgICAgIChQQV9CQ1IrMHgwOTAwKSAvKiAgKi8KKworI2RlZmluZSBQQV9BWDg4Nzk2TCAgICAgMHhhNDEwMDQwMCAgICAgIC8qIEFYODg3OTZMIEFyZWEgKi8KKyNkZWZpbmUgUEFfU0MxNjAyQlNMQiAgIDB4YTYwMDAwMDAgICAgICAvKiBTQzE2MDJCU0xCIEFyZWEgKi8KKyNkZWZpbmUgUEFfQVJFQTVfSU8gICAgIDB4YjQwMDAwMDAgICAgICAvKiBBcmVhIDUgSU8gTWVtb3J5ICovCisjZGVmaW5lIFBBX0FSRUE2X0lPICAgICAweGI4MDAwMDAwICAgICAgLyogQXJlYSA2IElPIE1lbW9yeSAqLworI2RlZmluZSBQQV9JREVfT0ZGU0VUICAgMHgxZjAgICAgICAgICAgIC8qIENGIElERSBPZmZzZXQgKi8KKyNkZWZpbmUgQVg4ODc5NkxfSU9fQkFTRSAgICAgICAgMHgxMDAwICAvKiBBWDg4Nzk2TCBJTyBCYXNlIEFkZHJlc3MgKi8KKworI2RlZmluZSBJUkxDTlRSMSAgICAgICAgKFBBX0JDUiArIDApICAgIC8qIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyMSAqLworCisjZGVmaW5lIElSUV9QQ0lTTE9UMSAgICA2NSAgICAgICAgICAgICAgLyogUENJIFNsb3QgIzEgSVJRICovCisjZGVmaW5lIElSUV9QQ0lTTE9UMiAgICA2NiAgICAgICAgICAgICAgLyogUENJIFNsb3QgIzIgSVJRICovCisjZGVmaW5lIElSUV9QQ0lTTE9UMyAgICA2NyAgICAgICAgICAgICAgLyogUENJIFNsb3QgIzMgSVJRICovCisjZGVmaW5lIElSUV9QQ0lTTE9UNCAgICA2OCAgICAgICAgICAgICAgLyogUENJIFNsb3QgIzQgSVJRICovCisjZGVmaW5lIElSUV9DRkNBUkQgICAgICAxICAgICAgICAgICAgICAgLyogQ0YgQ2FyZCBJUlEgKi8KKy8vICNkZWZpbmUgSVJRX0NGSU5TVCAgIDAgICAgICAgICAgICAgICAvKiBDRiBDYXJkIEluc2VydCBJUlEgKi8KKyNkZWZpbmUgSVJRX1RQICAgICAgICAgIDIgICAgICAgICAgICAgICAvKiBUb3VjaCBQYW5lbCBJUlEgKi8KKyNkZWZpbmUgSVJRX1NDSTEgICAgICAgIDMgICAgICAgICAgICAgICAvKiBTQ0kxIElSUSAqLworI2RlZmluZSBJUlFfU0NJMCAgICAgICAgNCAgICAgICAgICAgICAgIC8qIFNDSTAgSVJRICovCisjZGVmaW5lIElSUV8yU0VSSUFMICAgICA1ICAgICAgICAgICAgICAgLyogU2VyaWFsIElSUSAqLworI2RlZmluZSBJUlFfUlRDICAgICAgICAgNiAgICAgICAgICAgICAgIC8qIFJUQyBBIC8gQiBJUlEgKi8KKyNkZWZpbmUgSVJRX0VYVEVOVElPTjYgIDcgICAgICAgICAgICAgICAvKiBFWFQ2biBJUlEgKi8KKyNkZWZpbmUgSVJRX0VYVEVOVElPTjUgIDggICAgICAgICAgICAgICAvKiBFWFQ1biBJUlEgKi8KKyNkZWZpbmUgSVJRX0VYVEVOVElPTjQgIDkgICAgICAgICAgICAgICAvKiBFWFQ0biBJUlEgKi8KKyNkZWZpbmUgSVJRX0VYVEVOVElPTjIgIDEwICAgICAgICAgICAgICAvKiBFWFQybiBJUlEgKi8KKyNkZWZpbmUgSVJRX0VYVEVOVElPTjEgIDExICAgICAgICAgICAgICAvKiBFWFQxbiBJUlEgKi8KKyNkZWZpbmUgSVJRX09ORVRIICAgICAgIDEzICAgICAgICAgICAgICAvKiBPbiBib2FyZCBFdGhlcm5ldCBJUlEgKi8KKyNkZWZpbmUgSVJRX1BTVyAgICAgICAgIDE0ICAgICAgICAgICAgICAvKiBQdXNoIFN3aXRjaCBJUlEgKi8KKworI2Vsc2UgLyogUjc3ODBSUCAqLworCisjZGVmaW5lIFBBX0JDUgkJMHhhNTAwMDAwMAkvKiBGUEdBICovCisjZGVmaW5lCVBBX0lSTE1TSwkoUEFfQkNSKzB4MDAwMCkJLyogSW50ZXJydXB0IE1hc2sgY29udHJvbCAqLworI2RlZmluZSBQQV9JUkxNT04JKFBBX0JDUisweDAwMDIpCS8qIEludGVycnVwdCBTdGF0dXMgY29udHJvbCAqLworI2RlZmluZQlQQV9TRFBPVwkoUEFfQkNSKzB4MDAwNCkJLyogU0QgUG93ZXIgY29udHJvbCAqLworI2RlZmluZQlQQV9SU1RDVEwJKFBBX0JDUisweDAwMDYpCS8qIERldmljZSBSZXNldCBjb250cm9sICovCisjZGVmaW5lCVBBX1BDSUJECShQQV9CQ1IrMHgwMDA4KQkvKiBQQ0kgQm9hcmQgZGV0ZWN0IGNvbnRyb2wgKi8KKyNkZWZpbmUJUEFfUENJQ0QJKFBBX0JDUisweDAwMGEpCS8qIFBDSSBDb25lY3RvciBkZXRlY3QgY29udHJvbCAqLworI2RlZmluZQlQQV9aSUdJTzEJKFBBX0JDUisweDAwMGMpCS8qIFppZ2JlZSBJTyBjb250cm9sIDEgKi8KKyNkZWZpbmUJUEFfWklHSU8yCShQQV9CQ1IrMHgwMDBlKQkvKiBaaWdiZWUgSU8gY29udHJvbCAyICovCisjZGVmaW5lCVBBX1pJR0lPMwkoUEFfQkNSKzB4MDAxMCkJLyogWmlnYmVlIElPIGNvbnRyb2wgMyAqLworI2RlZmluZQlQQV9aSUdJTzQJKFBBX0JDUisweDAwMTIpCS8qIFppZ2JlZSBJTyBjb250cm9sIDQgKi8KKyNkZWZpbmUJUEFfSVZEUk1PTgkoUEFfQkNSKzB4MDAxNCkJLyogaVZEUiBNb25pdGVyIGNvbnRyb2wgKi8KKyNkZWZpbmUJUEFfSVZEUkNUTAkoUEFfQkNSKzB4MDAxNikJLyogaVZEUiBjb250cm9sICovCisjZGVmaW5lIFBBX09CTEVECShQQV9CQ1IrMHgwMDE4KQkvKiBPbiBCb2FyZCBMRUQgY29udHJvbCAqLworI2RlZmluZSBQQV9PQlNXCQkoUEFfQkNSKzB4MDAxYSkJLyogT24gQm9hcmQgU3dpdGNoIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfQVVESU9TRUwJKFBBX0JDUisweDAwMWMpCS8qIFNvdW5kIEludGVyZmFjZSBTZWxlY3QgY29udHJvbCAqLworI2RlZmluZSBQQV9FWFRQTFIJKFBBX0JDUisweDAwMWUpCS8qIEV4dGVudGlvbiBQaW4gUG9sYXJpdHkgY29udHJvbCAqLworI2RlZmluZSBQQV9UUENUTAkoUEFfQkNSKzB4MDEwMCkJLyogVG91Y2ggUGFuZWwgQWNjZXNzIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfVFBEQ0tDVEwJKFBBX0JDUisweDAxMDIpCS8qIFRvdWNoIFBhbmVsIEFjY2VzcyBkYXRhIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfVFBDVExDTFIJKFBBX0JDUisweDAxMDQpCS8qIFRvdWNoIFBhbmVsIEFjY2VzcyBjb250cm9sICovCisjZGVmaW5lIFBBX1RQWFBPUwkoUEFfQkNSKzB4MDEwNikJLyogVG91Y2ggUGFuZWwgWCBwb3NpdGlvbiBjb250cm9sICovCisjZGVmaW5lIFBBX1RQWVBPUwkoUEFfQkNSKzB4MDEwOCkJLyogVG91Y2ggUGFuZWwgWSBwb3NpdGlvbiBjb250cm9sICovCisjZGVmaW5lIFBBX0RCREVUCShQQV9CQ1IrMHgwMjAwKQkvKiBEZWJ1ZyBCb2FyZCBkZXRlY3QgY29udHJvbCAqLworI2RlZmluZSBQQV9EQkRJU1BDVEwJKFBBX0JDUisweDAyMDIpCS8qIERlYnVnIEJvYXJkIERvdCB0aW1pbmcgY29udHJvbCAqLworI2RlZmluZSBQQV9EQlNXCQkoUEFfQkNSKzB4MDIwNCkJLyogRGVidWcgQm9hcmQgU3dpdGNoIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfQ0ZDVEwJKFBBX0JDUisweDAzMDApCS8qIENGIFRpbWluZyBjb250cm9sICovCisjZGVmaW5lIFBBX0NGUE9XCShQQV9CQ1IrMHgwMzAyKQkvKiBDRiBQb3dlciBjb250cm9sICovCisjZGVmaW5lIFBBX0NGQ0RJTlRDTFIJKFBBX0JDUisweDAzMDQpCS8qIENGIEluc2VydCBJbnRlcnJ1cHQgY2xlYXIgKi8KKyNkZWZpbmUgUEFfU0NTTVIJKFBBX0JDUisweDA0MDApCS8qIFNDSUYgU2VyaWFsIG1vZGUgY29udHJvbCAqLworI2RlZmluZSBQQV9TQ0JSUgkoUEFfQkNSKzB4MDQwMikJLyogU0NJRiBCaXQgcmF0ZSBjb250cm9sICovCisjZGVmaW5lIFBBX1NDU0NSCShQQV9CQ1IrMHgwNDA0KQkvKiBTQ0lGIFNlcmlhbCBjb250cm9sICovCisjZGVmaW5lIFBBX1NDRkRUUgkoUEFfQkNSKzB4MDQwNikJLyogU0NJRiBTZW5kIEZJRk8gY29udHJvbCAqLworI2RlZmluZSBQQV9TQ0ZTUgkoUEFfQkNSKzB4MDQwOCkJLyogU0NJRiBTZXJpYWwgc3RhdHVzIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfU0NGUkRSCShQQV9CQ1IrMHgwNDBhKQkvKiBTQ0lGIFJlY2VpdmUgRklGTyBjb250cm9sICovCisjZGVmaW5lIFBBX1NDRkNSCShQQV9CQ1IrMHgwNDBjKQkvKiBTQ0lGIEZJRk8gY29udHJvbCAqLworI2RlZmluZSBQQV9TQ0ZEUgkoUEFfQkNSKzB4MDQwZSkJLyogU0NJRiBGSUZPIGRhdGEgY29udHJvbCAqLworI2RlZmluZSBQQV9TQ0xTUgkoUEFfQkNSKzB4MDQxMikJLyogU0NJRiBMaW5lIFN0YXR1cyBjb250cm9sICovCisjZGVmaW5lIFBBX0lDQ1IJCShQQV9CQ1IrMHgwNTAwKQkvKiBTZXJpYWwgY29udHJvbCAqLworI2RlZmluZSBQQV9TQVIJCShQQV9CQ1IrMHgwNTAyKQkvKiBTZXJpYWwgU2xhdmUgY29udHJvbCAqLworI2RlZmluZSBQQV9NRFIJCShQQV9CQ1IrMHgwNTA0KQkvKiBTZXJpYWwgTW9kZSBjb250cm9sICovCisjZGVmaW5lIFBBX0FEUjEJCShQQV9CQ1IrMHgwNTA2KQkvKiBTZXJpYWwgQWRkcmVzczEgY29udHJvbCAqLworI2RlZmluZSBQQV9EQVIxCQkoUEFfQkNSKzB4MDU0NikJLyogU2VyaWFsIERhdGExIGNvbnRyb2wgKi8KKyNkZWZpbmUgUEFfVkVSUkVHCShQQV9CQ1IrMHgwNjAwKQkvKiBGUEdBIFZlcnNpb24gUmVnaXN0ZXIgKi8KKworI2RlZmluZSBQQV9BWDg4Nzk2TAkweGE1ODAwNDAwCS8qIEFYODg3OTZMIEFyZWEgKi8KKyNkZWZpbmUgUEFfU0MxNjAyQlNMQgkweGE2MDAwMDAwCS8qIFNDMTYwMkJTTEIgQXJlYSAqLworI2RlZmluZSBQQV9BUkVBNV9JTwkweGI0MDAwMDAwCS8qIEFyZWEgNSBJTyBNZW1vcnkgKi8KKyNkZWZpbmUgUEFfQVJFQTZfSU8JMHhiODAwMDAwMAkvKiBBcmVhIDYgSU8gTWVtb3J5ICovCisjZGVmaW5lIFBBX0lERV9PRkZTRVQJMHgxZjAJCS8qIENGIElERSBPZmZzZXQgKi8KKyNkZWZpbmUgQVg4ODc5NkxfSU9fQkFTRQkweDEwMDAJLyogQVg4ODc5NkwgSU8gQmFzZSBBZGRyZXNzICovCisKKyNkZWZpbmUgSVJMQ05UUjEJKFBBX0JDUiArIDApCS8qIEludGVycnVwdCBDb250cm9sIFJlZ2lzdGVyMSAqLworCisjZGVmaW5lIElSUV9QQ0lTTE9UMQkwCQkvKiBQQ0kgU2xvdCAjMSBJUlEgKi8KKyNkZWZpbmUgSVJRX1BDSVNMT1QyCTEJCS8qIFBDSSBTbG90ICMyIElSUSAqLworI2RlZmluZSBJUlFfUENJU0xPVDMJMgkJLyogUENJIFNsb3QgIzMgSVJRICovCisjZGVmaW5lIElSUV9QQ0lTTE9UNAkzCQkvKiBQQ0kgU2xvdCAjNCBJUlEgKi8KKyNkZWZpbmUgSVJRX0NGQ0FSRAk0CQkvKiBDRiBDYXJkIElSUSAqLworI2RlZmluZSBJUlFfQ0ZJTlNUCTUJCS8qIENGIENhcmQgSW5zZXJ0IElSUSAqLworI2RlZmluZSBJUlFfTTY2NTk2CTYJCS8qIE02NjU5NiBJUlEgKi8KKyNkZWZpbmUgSVJRX1NEQ0FSRAk3CQkvKiBTRCBDYXJkIElSUSAqLworI2RlZmluZSBJUlFfVFVDSFBBTkVMCTgJCS8qIFRvdWNoIFBhbmVsIElSUSAqLworI2RlZmluZSBJUlFfU0NJCQk5CQkvKiBTQ0kgSVJRICovCisjZGVmaW5lIElSUV8yU0VSSUFMCTEwCQkvKiBTZXJpYWwgSVJRICovCisjZGVmaW5lCUlSUV9FWFRFTlRJT04JMTEJCS8qIEVYVG4gSVJRICovCisjZGVmaW5lIElSUV9PTkVUSAkxMgkJLyogT24gYm9hcmQgRXRoZXJuZXQgSVJRICovCisjZGVmaW5lIElSUV9QU1cJCTEzCQkvKiBQdXNoIFN3aXRjaCBJUlEgKi8KKyNkZWZpbmUgSVJRX1pJR0JFRQkxNAkJLyogWmlnZ2JlZSBJTyBJUlEgKi8KKworI2VuZGlmICAvKiBDT05GSUdfU0hfUjc3ODBNUCAqLworCisjZGVmaW5lIF9fSU9fUFJFRklYCXI3NzgwcnAKKyNpbmNsdWRlIDxhc20vaW9fZ2VuZXJpYy5oPgorCisjZW5kaWYgIC8qIF9fQVNNX1NIX1JFTkVTQVNfUjc3ODBSUCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcnRjLmggYi9pbmNsdWRlL2FzbS1zaC9ydGMuaAppbmRleCBjZWE5Y2RmLi45MWFhY2M5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9ydGMuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9ydGMuaApAQCAtMSwyOSArMSw4IEBACiAjaWZuZGVmIF9BU01fUlRDX0gKICNkZWZpbmUgX0FTTV9SVENfSAotI2lmZGVmIF9fS0VSTkVMX18KIAotI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0jaW5jbHVkZSA8YXNtL2NwdS9ydGMuaD4KLQotZXh0ZXJuIHZvaWQgc2hfcnRjX2dldHRpbWVvZmRheShzdHJ1Y3QgdGltZXNwZWMgKnRzKTsKLWV4dGVybiBpbnQgc2hfcnRjX3NldHRpbWVvZmRheShjb25zdCB0aW1lX3Qgc2Vjcyk7CiBleHRlcm4gdm9pZCAoKmJvYXJkX3RpbWVfaW5pdCkodm9pZCk7Ci1leHRlcm4gdm9pZCAoKnJ0Y19nZXRfdGltZSkoc3RydWN0IHRpbWVzcGVjICopOwotZXh0ZXJuIGludCAoKnJ0Y19zZXRfdGltZSkoY29uc3QgdGltZV90KTsKK2V4dGVybiB2b2lkICgqcnRjX3NoX2dldF90aW1lKShzdHJ1Y3QgdGltZXNwZWMgKik7CitleHRlcm4gaW50ICgqcnRjX3NoX3NldF90aW1lKShjb25zdCB0aW1lX3QpOwogCi0vKiBSQ1IxIEJpdHMgKi8KLSNkZWZpbmUgUkNSMV9DRgkJMHg4MAkvKiBDYXJyeSBGbGFnICAgICAgICAgICAgICovCi0jZGVmaW5lIFJDUjFfQ0lFCTB4MTAJLyogQ2FycnkgSW50ZXJydXB0IEVuYWJsZSAqLwotI2RlZmluZSBSQ1IxX0FJRQkweDA4CS8qIEFsYXJtIEludGVycnVwdCBFbmFibGUgKi8KLSNkZWZpbmUgUkNSMV9BRgkJMHgwMQkvKiBBbGFybSBGbGFnICAgICAgICAgICAgICovCi0KLS8qIFJDUjIgQml0cyAqLwotI2RlZmluZSBSQ1IyX1BFRgkweDgwCS8qIFBFcmlvZGljIGludGVycnVwdCBGbGFnICovCi0jZGVmaW5lIFJDUjJfUEVTTUFTSwkweDcwCS8qIFBlcmlvZGljIGludGVycnVwdCBTZXQgICovCi0jZGVmaW5lIFJDUjJfUlRDRU4JMHgwOAkvKiBFTmFibGUgUlRDICAgICAgICAgICAgICAqLwotI2RlZmluZSBSQ1IyX0FESgkweDA0CS8qIEFESnVzdG1lbnQgKDMwLXNlY29uZCkgICovCi0jZGVmaW5lIFJDUjJfUkVTRVQJMHgwMgkvKiBSZXNldCBiaXQgICAgICAgICAgICAgICAqLwotI2RlZmluZSBSQ1IyX1NUQVJUCTB4MDEJLyogU3RhcnQgYml0ICAgICAgICAgICAgICAgKi8KLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfQVNNX1JUQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9ydHM3NzUxcjJkL3J0czc3NTFyMmQuaCBiL2luY2x1ZGUvYXNtLXNoL3J0czc3NTFyMmQvcnRzNzc1MXIyZC5oCmluZGV4IDRlMDliYTUuLmIxMTJhZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3J0czc3NTFyMmQvcnRzNzc1MXIyZC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3J0czc3NTFyMmQvcnRzNzc1MXIyZC5oCkBAIC00MSw4ICs0MSw2IEBACiAKICNkZWZpbmUgUEFfQVg4ODc5NkwJMHhhYTAwMDQwMAkvKiBBWDg4Nzk2TCBBcmVhICovCiAjZGVmaW5lIFBBX1ZPWUFHRVIJMHhhYjAwMDAwMAkvKiBWT1lBR0VSIEdYIEFyZWEgKi8KLSNkZWZpbmUgUEFfQVJFQTVfSU8JMHhiNDAwMDAwMAkvKiBBcmVhIDUgSU8gTWVtb3J5ICovCi0jZGVmaW5lIFBBX0FSRUE2X0lPCTB4YjgwMDAwMDAJLyogQXJlYSA2IElPIE1lbW9yeSAqLwogI2RlZmluZSBQQV9JREVfT0ZGU0VUCTB4MWYwCQkvKiBDRiBJREUgT2Zmc2V0ICovCiAjZGVmaW5lIEFYODg3OTZMX0lPX0JBU0UJMHgxMDAwCS8qIEFYODg3OTZMIElPIEJhc2UgQWRkcmVzcyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zY2F0dGVybGlzdC5oIGIvaW5jbHVkZS9hc20tc2gvc2NhdHRlcmxpc3QuaAppbmRleCA3YjkxZGYxLi5kMTllN2NkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zY2F0dGVybGlzdC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NjYXR0ZXJsaXN0LmgKQEAgLTEwLDQgKzEwLDEzIEBACiAKICNkZWZpbmUgSVNBX0RNQV9USFJFU0hPTEQgKDB4MWZmZmZmZmYpCiAKKy8qIFRoZXNlIG1hY3JvcyBzaG91bGQgYmUgdXNlZCBhZnRlciBhIHBjaV9tYXBfc2cgY2FsbCBoYXMgYmVlbiBkb25lCisgKiB0byBnZXQgYnVzIGFkZHJlc3NlcyBvZiBlYWNoIG9mIHRoZSBTRyBlbnRyaWVzIGFuZCB0aGVpciBsZW5ndGhzLgorICogWW91IHNob3VsZCBvbmx5IHdvcmsgd2l0aCB0aGUgbnVtYmVyIG9mIHNnIGVudHJpZXMgcGNpX21hcF9zZworICogcmV0dXJucywgb3IgYWx0ZXJuYXRpdmVseSBzdG9wIG9uIHRoZSBmaXJzdCBzZ19kbWFfbGVuKHNnKSB3aGljaAorICogaXMgMC4KKyAqLworI2RlZmluZSBzZ19kbWFfYWRkcmVzcyhzZykJKChzZyktPmRtYV9hZGRyZXNzKQorI2RlZmluZSBzZ19kbWFfbGVuKHNnKQkJKChzZyktPmxlbmd0aCkKKwogI2VuZGlmIC8qICEoX19BU01fU0hfU0NBVFRFUkxJU1RfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NjaS5oIGIvaW5jbHVkZS9hc20tc2gvc2NpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlNzM2NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NjaS5oCkBAIC0wLDAgKzEsMzQgQEAKKyNpZm5kZWYgX19BU01fU0hfU0NJX0gKKyNkZWZpbmUgX19BU01fU0hfU0NJX0gKKworI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisKKy8qCisgKiBHZW5lcmljIGhlYWRlciBmb3IgU3VwZXJIIFNDSShGKQorICoKKyAqIERvIG5vdCBwbGFjZSBTSC1zcGVjaWZpYyBwYXJ0cyBpbiBoZXJlLCBzaDY0IGFuZCBoODMwMCBkZXBlbmQgb24gdGhpcyB0b28uCisgKi8KKworLyogT2Zmc2V0cyBpbnRvIHRoZSBzY2lfcG9ydC0+aXJxcyBhcnJheSAqLworZW51bSB7CisJU0NJeF9FUklfSVJRLAorCVNDSXhfUlhJX0lSUSwKKwlTQ0l4X1RYSV9JUlEsCisJU0NJeF9CUklfSVJRLAorCVNDSXhfTlJfSVJRUywKK307CisKKy8qCisgKiBQbGF0Zm9ybSBkZXZpY2Ugc3BlY2lmaWMgcGxhdGZvcm1fZGF0YSBzdHJ1Y3QKKyAqLworc3RydWN0IHBsYXRfc2NpX3BvcnQgeworCXZvaWQgX19pb21lbQkqbWVtYmFzZTsJCS8qIGlvIGNvb2tpZSAqLworCXVuc2lnbmVkIGxvbmcJbWFwYmFzZTsJCS8qIHJlc291cmNlIGJhc2UgKi8KKwl1bnNpZ25lZCBpbnQJaXJxc1tTQ0l4X05SX0lSUVNdOwkvKiBFUkksIFJYSSwgVFhJLCBCUkkgKi8KKwl1bnNpZ25lZCBpbnQJdHlwZTsJCQkvKiBTQ0kgLyBTQ0lGIC8gSVJEQSAqLworCXVwZl90CQlmbGFnczsJCQkvKiBVUEZfKiBmbGFncyAqLworfTsKKworaW50IGVhcmx5X3NjaV9zZXR1cChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKKworI2VuZGlmIC8qIF9fQVNNX1NIX1NDSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zZS9zZS5oIGIvaW5jbHVkZS9hc20tc2gvc2UuaApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1zaC9zZS9zZS5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1zaC9zZS5oCmluZGV4IDc5MWM1ZGEuLmExODMyMTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3NlL3NlLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc2UuaApAQCAtNzQsNCArNzQsNyBAQAogI2RlZmluZSBJUlFfU1ROSUMJMTAKICNlbmRpZgogCisjZGVmaW5lIF9fSU9fUFJFRklYCXNlCisjaW5jbHVkZSA8YXNtL2lvX2dlbmVyaWMuaD4KKwogI2VuZGlmICAvKiBfX0FTTV9TSF9ISVRBQ0hJX1NFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NlL2lvLmggYi9pbmNsdWRlL2FzbS1zaC9zZS9pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWViODZjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL3NlL2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tc2gvaW9fc2UuaAotICoKLSAqIENvcHlyaWdodCAyMDAwIFN0dWFydCBNZW5lZnkgKHN0dWFydC5tZW5lZnlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBJTyBmdW5jdGlvbnMgZm9yIGFuIEhpdGFjaGkgU29sdXRpb25FbmdpbmUKLSAqLwotCi0jaWZuZGVmIF9BU01fU0hfSU9fU0VfSAotI2RlZmluZSBfQVNNX1NIX0lPX1NFX0gKLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc2VfaW5iKHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdW5zaWduZWQgc2hvcnQgc2VfaW53KHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdW5zaWduZWQgaW50IHNlX2lubCh1bnNpZ25lZCBsb25nIHBvcnQpOwotCi1leHRlcm4gdm9pZCBzZV9vdXRiKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdm9pZCBzZV9vdXR3KHVuc2lnbmVkIHNob3J0IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHZvaWQgc2Vfb3V0bCh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIHNlX2luYl9wKHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdm9pZCBzZV9vdXRiX3AodW5zaWduZWQgY2hhciB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KTsKLQotZXh0ZXJuIHZvaWQgc2VfaW5zYih1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgc2VfaW5zdyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgc2VfaW5zbCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgc2Vfb3V0c2IodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIHNlX291dHN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBzZV9vdXRzbCh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBzZV9pc2FfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKLQotI2VuZGlmIC8qIF9BU01fU0hfSU9fU0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc2U3MzAwL3NlNzMwMC5oIGIvaW5jbHVkZS9hc20tc2gvc2U3MzAwLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tc2gvc2U3MzAwL3NlNzMwMC5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1zaC9zZTczMDAuaAppbmRleCAzZWMxZGVkLi40ZTI0ZWRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zZTczMDAvc2U3MzAwLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc2U3MzAwLmgKQEAgLTU4LDQgKzU4LDcgQEAKICNkZWZpbmUgUEFfTENEMQkJMHhiODAwMDAwMAogI2RlZmluZSBQQV9MQ0QyCQkweGI4ODAwMDAwCiAKKyNkZWZpbmUgX19JT19QUkVGSVgJc2g3MzAwc2UKKyNpbmNsdWRlIDxhc20vaW9fZ2VuZXJpYy5oPgorCiAjZW5kaWYgIC8qIF9fQVNNX1NIX0hJVEFDSElfU0U3MzAwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NlNzMwMC9pby5oIGIvaW5jbHVkZS9hc20tc2gvc2U3MzAwL2lvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY4NTUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvc2U3MzAwL2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tc2gvc2U3MzAwL2lvLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgVGFrYXNoaSBLdXN1ZGEgPGt1c3VkYS10YWthc2hpQGhpdGFjaGktdWwuY28uanA+Ci0gKiBJTyBmdW5jdGlvbnMgZm9yIFNILU1vYmlsZShTSDczMDApIFNvbHV0aW9uRW5naW5lCi0gKi8KLQotI2lmbmRlZiBfQVNNX1NIX0lPXzczMDBTRV9ICi0jZGVmaW5lIF9BU01fU0hfSU9fNzMwMFNFX0gKLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc2g3MzAwc2VfaW5iKHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdW5zaWduZWQgc2hvcnQgc2g3MzAwc2VfaW53KHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdW5zaWduZWQgaW50IHNoNzMwMHNlX2lubCh1bnNpZ25lZCBsb25nIHBvcnQpOwotCi1leHRlcm4gdm9pZCBzaDczMDBzZV9vdXRiKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdm9pZCBzaDczMDBzZV9vdXR3KHVuc2lnbmVkIHNob3J0IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHZvaWQgc2g3MzAwc2Vfb3V0bCh1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIHNoNzMwMHNlX2luYl9wKHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdm9pZCBzaDczMDBzZV9vdXRiX3AodW5zaWduZWQgY2hhciB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KTsKLQotZXh0ZXJuIHZvaWQgc2g3MzAwc2VfaW5zYih1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgc2g3MzAwc2VfaW5zdyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgc2g3MzAwc2VfaW5zbCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgc2g3MzAwc2Vfb3V0c2IodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIHNoNzMwMHNlX291dHN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBzaDczMDBzZV9vdXRzbCh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotCi0jZW5kaWYgLyogX0FTTV9TSF9JT183MzAwU0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc2U3MzE4MC9zZTczMTgwLmggYi9pbmNsdWRlL2FzbS1zaC9zZTczMTgwLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tc2gvc2U3MzE4MC9zZTczMTgwLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLXNoL3NlNzMxODAuaAppbmRleCBmNWI5M2UzLi4zYTRhY2IzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zZTczMTgwL3NlNzMxODAuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9zZTczMTgwLmgKQEAgLTU5LDQgKzU5LDcgQEAKICNkZWZpbmUgUEFfTENEMQkJMHhiODAwMDAwMAogI2RlZmluZSBQQV9MQ0QyCQkweGI4ODAwMDAwCiAKKyNkZWZpbmUgX19JT19QUkVGSVgJc2g3MzE4MHNlCisjaW5jbHVkZSA8YXNtL2lvX2dlbmVyaWMuaD4KKwogI2VuZGlmICAvKiBfX0FTTV9TSF9ISVRBQ0hJX1NFNzMxODBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc2U3MzE4MC9pby5oIGIvaW5jbHVkZS9hc20tc2gvc2U3MzE4MC9pby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWNiMWI5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLXNoL3NlNzMxODAvaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS1zaC9zZTczMTgwL2lvLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgVGFrYXNoaSBLdXN1ZGEgPGt1c3VkYS10YWthc2hpQGhpdGFjaGktdWwuY28uanA+Ci0gKiBCYXNlZCBvbiBpbmNsdWRlL2FzbS1zaC9zZTczMDAvaW8uaAotICoKLSAqIElPIGZ1bmN0aW9ucyBmb3IgU0gtTW9iaWxlMyhTSDczMTgwKSBTb2x1dGlvbkVuZ2luZQotICoKLSAqLwotCi0jaWZuZGVmIF9BU01fU0hfSU9fNzMxODBTRV9ICi0jZGVmaW5lIF9BU01fU0hfSU9fNzMxODBTRV9ICi0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIHNoNzMxODBzZV9pbmIodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBzaDczMTgwc2VfaW53KHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdW5zaWduZWQgaW50IHNoNzMxODBzZV9pbmwodW5zaWduZWQgbG9uZyBwb3J0KTsKLQotZXh0ZXJuIHZvaWQgc2g3MzE4MHNlX291dGIodW5zaWduZWQgY2hhciB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB2b2lkIHNoNzMxODBzZV9vdXR3KHVuc2lnbmVkIHNob3J0IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHZvaWQgc2g3MzE4MHNlX291dGwodW5zaWduZWQgaW50IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotCi1leHRlcm4gdW5zaWduZWQgY2hhciBzaDczMTgwc2VfaW5iX3AodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB2b2lkIHNoNzMxODBzZV9vdXRiX3AodW5zaWduZWQgY2hhciB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KTsKLQotZXh0ZXJuIHZvaWQgc2g3MzE4MHNlX2luc2IodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIHNoNzMxODBzZV9pbnN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBzaDczMTgwc2VfaW5zbCh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgc2g3MzE4MHNlX291dHNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBzaDczMTgwc2Vfb3V0c3codW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIHNoNzMxODBzZV9vdXRzbCh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotCi0jZW5kaWYgLyogX0FTTV9TSF9JT183MzE4MFNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NlNzMxODAvc2U3MzE4MC5oIGIvaW5jbHVkZS9hc20tc2gvc2U3MzQzLmgKc2ltaWxhcml0eSBpbmRleCA2NyUKY29weSBmcm9tIGluY2x1ZGUvYXNtLXNoL3NlNzMxODAvc2U3MzE4MC5oCmNvcHkgdG8gaW5jbHVkZS9hc20tc2gvc2U3MzQzLmgKaW5kZXggZjViOTNlMy4uZTc5MTRhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc2U3MzE4MC9zZTczMTgwLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc2U3MzQzLmgKQEAgLTEsMTIgKzEsMTIgQEAKLSNpZm5kZWYgX19BU01fU0hfSElUQUNISV9TRTczMTgwX0gKLSNkZWZpbmUgX19BU01fU0hfSElUQUNISV9TRTczMTgwX0gKKyNpZm5kZWYgX19BU01fU0hfSElUQUNISV9TRTczNDNfSAorI2RlZmluZSBfX0FTTV9TSF9ISVRBQ0hJX1NFNzM0M19ICiAKIC8qCi0gKiBpbmNsdWRlL2FzbS1zaC9zZS9zZTczMTgwLmgKKyAqIGluY2x1ZGUvYXNtLXNoL3NlL3NlNzM0My5oCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDAzIFRha2FzaGkgS3VzdWRhIDxrdXN1ZGEtdGFrYXNoaUBoaXRhY2hpLXVsLmNvLmpwPgogICoKLSAqIFNILU1vYmlsZSBTb2x1dGlvbkVuZ2luZSA3MzE4MCBzdXBwb3J0CisgKiBTSC1Nb2JpbGUgU29sdXRpb25FbmdpbmUgNzM0MyBzdXBwb3J0CiAgKi8KIAogLyogQm94IHNwZWNpZmljIGFkZHJlc3Nlcy4gICovCkBAIC00OSw5ICs0OSw5IEBACiAjZGVmaW5lIFBBX0xFRAkJMHhiMEMwMDAwMAkvKiBMRUQgKi8KICNkZWZpbmUgTEVEX1NISUZUICAgICAgIDAKICNkZWZpbmUgUEFfRElQU1cJMHhiMDkwMDAwMAkvKiBEaXAgc3dpdGNoIDMxICovCi0jZGVmaW5lIFBBX0VQTERfTU9ERVNFVAkweGIwYTAwMDAwCS8qIEZQR0EgTW9kZSBzZXQgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgUEFfRVBMRF9TVDEJMHhiMGE4MDAwMAkvKiBGUEdBIEludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIxICovCi0jZGVmaW5lIFBBX0VQTERfU1QyCTB4YjBhYzAwMDAJLyogRlBHQSBJbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyMiAqLworI2RlZmluZSBQQV9DUExEX01PREVTRVQJMHhiMTQwMDAwNAkvKiBDUExEIE1vZGUgc2V0IHJlZ2lzdGVyICovCisjZGVmaW5lIFBBX0NQTERfU1QJMHhiMTQwMDAwOAkvKiBDUExEIEludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUEFfQ1BMRF9JTVNLCTB4YjE0MDAwMGEJLyogQ1BMRCBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLwogLyogQXJlYSA1ICovCiAjZGVmaW5lIFBBX0VYVDUJCTB4MTQwMDAwMDAKICNkZWZpbmUgUEFfRVhUNV9TSVpFCTB4MDQwMDAwMDAKQEAgLTU5LDQgKzU5LDI0IEBACiAjZGVmaW5lIFBBX0xDRDEJCTB4YjgwMDAwMDAKICNkZWZpbmUgUEFfTENEMgkJMHhiODgwMDAwMAogCi0jZW5kaWYgIC8qIF9fQVNNX1NIX0hJVEFDSElfU0U3MzE4MF9IICovCisjZGVmaW5lIF9fSU9fUFJFRklYCXNoNzM0M3NlCisjaW5jbHVkZSA8YXNtL2lvX2dlbmVyaWMuaD4KKworLyogRXh0ZXJuYWwgTXVsdGlwbGV4ZWQgaW50ZXJydXB0cyAqLworI2RlZmluZSBQQ19JUlEwCQlPRkZDSElQX0lSUV9CQVNFCisjZGVmaW5lIFBDX0lSUTEJCShQQ19JUlEwICsgMSkKKyNkZWZpbmUgUENfSVJRMgkJKFBDX0lSUTEgKyAxKQorI2RlZmluZSBQQ19JUlEzCQkoUENfSVJRMiArIDEpCisKKyNkZWZpbmUgRVhUX0lSUTAJKFBDX0lSUTMgKyAxKQorI2RlZmluZSBFWFRfSVJRMQkoRVhUX0lSUTAgKyAxKQorI2RlZmluZSBFWFRfSVJRMgkoRVhUX0lSUTEgKyAxKQorI2RlZmluZSBFWFRfSVJRMwkoRVhUX0lSUTIgKyAxKQorCisjZGVmaW5lIFVTQl9JUlEwCShFWFRfSVJRMyArIDEpCisjZGVmaW5lIFVTQl9JUlExCShVU0JfSVJRMCArIDEpCisKKyNkZWZpbmUgVUFSVF9JUlEwCShVU0JfSVJRMSArIDEpCisjZGVmaW5lIFVBUlRfSVJRMQkoVUFSVF9JUlEwICsgMSkKKworI2VuZGlmICAvKiBfX0FTTV9TSF9ISVRBQ0hJX1NFNzM0M19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zZTc3NTEvc2U3NzUxLmggYi9pbmNsdWRlL2FzbS1zaC9zZTc3NTEuaApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBpbmNsdWRlL2FzbS1zaC9zZTc3NTEvc2U3NzUxLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLXNoL3NlNzc1MS5oCmluZGV4IDczOGUyMmIuLjg4Y2QzNzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3NlNzc1MS9zZTc3NTEuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9zZTc3NTEuaApAQCAtNjUsNCArNjUsNyBAQAogCiAjZGVmaW5lIElSUV83OUM5NzMJMTMKIAorI2RlZmluZSBfX0lPX1BSRUZJWAlzaDc3NTFzZQorI2luY2x1ZGUgPGFzbS9pb19nZW5lcmljLmg+CisKICNlbmRpZiAgLyogX19BU01fU0hfSElUQUNISV83NzUxU0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc2U3NzUxL2lvLmggYi9pbmNsdWRlL2FzbS1zaC9zZTc3NTEvaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkOGY1Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zZTc3NTEvaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2FzbS1zaC9pb183NzUxc2UuaAotICoKLSAqIE1vZGlmaWVkIHZlcnNpb24gb2YgaW9fc2UuaCBmb3IgdGhlIDc3NTFzZS1zcGVjaWZpYyBmdW5jdGlvbnMuCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIElPIGZ1bmN0aW9ucyBmb3IgYW4gSGl0YWNoaSBTb2x1dGlvbkVuZ2luZQotICovCi0KLSNpZm5kZWYgX0FTTV9TSF9JT183NzUxU0VfSAotI2RlZmluZSBfQVNNX1NIX0lPXzc3NTFTRV9ICi0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIHNoNzc1MXNlX2luYih1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IHNoNzc1MXNlX2ludyh1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBzaDc3NTFzZV9pbmwodW5zaWduZWQgbG9uZyBwb3J0KTsKLQotZXh0ZXJuIHZvaWQgc2g3NzUxc2Vfb3V0Yih1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHZvaWQgc2g3NzUxc2Vfb3V0dyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB2b2lkIHNoNzc1MXNlX291dGwodW5zaWduZWQgaW50IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotCi1leHRlcm4gdW5zaWduZWQgY2hhciBzaDc3NTFzZV9pbmJfcCh1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHZvaWQgc2g3NzUxc2Vfb3V0Yl9wKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci0KLWV4dGVybiB2b2lkIHNoNzc1MXNlX2luc2IodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIHNoNzc1MXNlX2luc3codW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIHNoNzc1MXNlX2luc2wodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIHNoNzc1MXNlX291dHNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBzaDc3NTFzZV9vdXRzdyh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgc2g3NzUxc2Vfb3V0c2wodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc2g3NzUxc2VfcmVhZGIodW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBzaDc3NTFzZV9yZWFkdyh1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBzaDc3NTFzZV9yZWFkbCh1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHZvaWQgc2g3NzUxc2Vfd3JpdGViKHVuc2lnbmVkIGNoYXIgYiwgdW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB2b2lkIHNoNzc1MXNlX3dyaXRldyh1bnNpZ25lZCBzaG9ydCBiLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotZXh0ZXJuIHZvaWQgc2g3NzUxc2Vfd3JpdGVsKHVuc2lnbmVkIGludCBiLCB1bnNpZ25lZCBsb25nIGFkZHIpOwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBzaDc3NTFzZV9pc2FfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKLQotI2VuZGlmIC8qIF9BU01fU0hfSU9fNzc1MVNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NldHVwLmggYi9pbmNsdWRlL2FzbS1zaC9zZXR1cC5oCmluZGV4IGQxOWRlN2MuLjM0Y2E4YTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3NldHVwLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc2V0dXAuaApAQCAtNCw1ICs0LDcgQEAKIAogI2RlZmluZSBDT01NQU5EX0xJTkVfU0laRSAyNTYKIAoraW50IHNldHVwX2Vhcmx5X3ByaW50ayhjaGFyICopOworCiAjZW5kaWYgLyogX1NIX1NFVFVQX0ggKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zZnAtbWFjaGluZS5oIGIvaW5jbHVkZS9hc20tc2gvc2ZwLW1hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTYzOTlhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tc2gvc2ZwLW1hY2hpbmUuaApAQCAtMCwwICsxLDg2IEBACisvKiBNYWNoaW5lLWRlcGVuZGVudCBzb2Z0d2FyZSBmbG9hdGluZy1wb2ludCBkZWZpbml0aW9ucy4KKyAgIFN1cGVySCBrZXJuZWwgdmVyc2lvbi4KKyAgIENvcHlyaWdodCAoQykgMTk5NywxOTk4LDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKyAgIENvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIChydGhAY3lnbnVzLmNvbSksCisJCSAgSmFrdWIgSmVsaW5layAoampAdWx0cmEubGludXguY3opLAorCQkgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkgYW5kCisJCSAgUGV0ZXIgTWF5ZGVsbCAocG1heWRlbGxAY2hpYXJrLmdyZWVuZW5kLm9yZy51aykuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYKKyAgIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisjaWZuZGVmIF9TRlBfTUFDSElORV9ICisjZGVmaW5lIF9TRlBfTUFDSElORV9ICisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2RlZmluZSBfRlBfV19UWVBFX1NJWkUJCTMyCisjZGVmaW5lIF9GUF9XX1RZUEUJCXVuc2lnbmVkIGxvbmcKKyNkZWZpbmUgX0ZQX1dTX1RZUEUJCXNpZ25lZCBsb25nCisjZGVmaW5lIF9GUF9JX1RZUEUJCWxvbmcKKworI2RlZmluZSBfRlBfTVVMX01FQVRfUyhSLFgsWSkJCQkJCVwKKyAgX0ZQX01VTF9NRUFUXzFfd2lkZShfRlBfV0ZSQUNCSVRTX1MsUixYLFksdW11bF9wcG1tKQorI2RlZmluZSBfRlBfTVVMX01FQVRfRChSLFgsWSkJCQkJCVwKKyAgX0ZQX01VTF9NRUFUXzJfd2lkZShfRlBfV0ZSQUNCSVRTX0QsUixYLFksdW11bF9wcG1tKQorI2RlZmluZSBfRlBfTVVMX01FQVRfUShSLFgsWSkJCQkJCVwKKyAgX0ZQX01VTF9NRUFUXzRfd2lkZShfRlBfV0ZSQUNCSVRTX1EsUixYLFksdW11bF9wcG1tKQorCisjZGVmaW5lIF9GUF9ESVZfTUVBVF9TKFIsWCxZKQlfRlBfRElWX01FQVRfMV91ZGl2KFMsUixYLFkpCisjZGVmaW5lIF9GUF9ESVZfTUVBVF9EKFIsWCxZKQlfRlBfRElWX01FQVRfMl91ZGl2KEQsUixYLFkpCisjZGVmaW5lIF9GUF9ESVZfTUVBVF9RKFIsWCxZKQlfRlBfRElWX01FQVRfNF91ZGl2KFEsUixYLFkpCisKKyNkZWZpbmUgX0ZQX05BTkZSQUNfUwkJKChfRlBfUU5BTkJJVF9TIDw8IDEpIC0gMSkKKyNkZWZpbmUgX0ZQX05BTkZSQUNfRAkJKChfRlBfUU5BTkJJVF9EIDw8IDEpIC0gMSksIC0xCisjZGVmaW5lIF9GUF9OQU5GUkFDX1EJCSgoX0ZQX1FOQU5CSVRfUSA8PCAxKSAtIDEpLCAtMSwgLTEsIC0xCisjZGVmaW5lIF9GUF9OQU5TSUdOX1MJCTAKKyNkZWZpbmUgX0ZQX05BTlNJR05fRAkJMAorI2RlZmluZSBfRlBfTkFOU0lHTl9RCQkwCisKKyNkZWZpbmUgX0ZQX0tFRVBOQU5GUkFDUCAxCisKKy8qCisgKiBJZiBvbmUgTmFOIGlzIHNpZ25hbGluZyBhbmQgdGhlIG90aGVyIGlzIG5vdCwKKyAqIHdlIGNob29zZSB0aGF0IG9uZSwgb3RoZXJ3aXNlIHdlIGNob29zZSBYLgorICovCisjZGVmaW5lIF9GUF9DSE9PU0VOQU4oZnMsIHdjLCBSLCBYLCBZLCBPUCkgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKF9GUF9GUkFDX0hJR0hfUkFXXyMjZnMoWCkgJiBfRlBfUU5BTkJJVF8jI2ZzKSAgICAgICAgICBcCisgICAgICAgICYmICEoX0ZQX0ZSQUNfSElHSF9SQVdfIyNmcyhZKSAmIF9GUF9RTkFOQklUXyMjZnMpKSAgICAgXAorICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUiMjX3MgPSBZIyNfczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9GUF9GUkFDX0NPUFlfIyN3YyhSLFkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSIyNfcyA9IFgjI19zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX0ZQX0ZSQUNfQ09QWV8jI3djKFIsWCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFIjI19jID0gRlBfQ0xTX05BTjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLy8jZGVmaW5lIEZQX1JPVU5ETU9ERQkJRlBTQ1JfUk0KKyNkZWZpbmUgRlBfREVOT1JNX1pFUk8JCTEvKkZQU0NSX0ROKi8KKworLyogRXhjZXB0aW9uIGZsYWdzLiAqLworI2RlZmluZSBGUF9FWF9JTlZBTElECQkoMTw8NCkKKyNkZWZpbmUgRlBfRVhfRElWWkVSTwkJKDE8PDMpCisjZGVmaW5lIEZQX0VYX09WRVJGTE9XCQkoMTw8MikKKyNkZWZpbmUgRlBfRVhfVU5ERVJGTE9XCQkoMTw8MSkKKyNkZWZpbmUgRlBfRVhfSU5FWEFDVAkJKDE8PDApCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zaDAzL2lvLmggYi9pbmNsdWRlL2FzbS1zaC9zaDAzL2lvLmgKaW5kZXggMjU3OTJlOS4uZGYzYjE4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc2gwMy9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NoMDMvaW8uaApAQCAtMzMsMTQgKzMzLDYgQEAKICNkZWZpbmUgSVJMM19JUFJfUE9TCTAKICNkZWZpbmUgSVJMM19QUklPUklUWQk0CiAKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2gwM19pc2FfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKLQotZXh0ZXJuIHZvaWQgc2V0dXBfc2gwMyh2b2lkKTsKLWV4dGVybiB2b2lkIGluaXRfc2gwM19JUlEodm9pZCk7Ci1leHRlcm4gdm9pZCBoZWFydGJlYXRfc2gwMyh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgc2gwM19ydGNfZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0dik7Ci1leHRlcm4gaW50IHNoMDNfcnRjX3NldHRpbWVvZmRheShjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdHYpOwordm9pZCBoZWFydGJlYXRfc2gwMyh2b2lkKTsKIAogI2VuZGlmIC8qIF9BU01fU0hfSU9fU0gwM19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zaDIwMDAvc2gyMDAwLmggYi9pbmNsdWRlL2FzbS1zaC9zaDIwMDAvc2gyMDAwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNTQ3MzIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvc2gyMDAwL3NoMjAwMC5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaWZuZGVmIF9fQVNNX1NIX1NIMjAwMF9TSDIwMDBfSAotI2RlZmluZSBfX0FTTV9TSF9TSDIwMDBfU0gyMDAwX0gKLQotLyogYXJjaC9zaC9ib2FyZHMvc2gyMDAwL3NldHVwLmMgKi8KLWV4dGVybiBpbnQgc2V0dXBfc2gyMDAwKHZvaWQpOwotCi0jZW5kaWYgLyogX19BU01fU0hfU0gyMDAwX1NIMjAwMF9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NobWluL3NobWluLmggYi9pbmNsdWRlL2FzbS1zaC9zaG1pbi9zaG1pbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YmExMzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zaC9zaG1pbi9zaG1pbi5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfX0FTTV9TSF9TSE1JTl9ICisjZGVmaW5lIF9fQVNNX1NIX1NITUlOX0gKKworI2RlZmluZSBTSE1JTl9JT19CQVNFIDB4YjAwMDAwMDBVTAorCisjZGVmaW5lIFNITUlOX05FX0lSUSBJUlEyX0lSUQorI2RlZmluZSBTSE1JTl9ORV9CQVNFIDB4MzAwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc2htcGFyYW0uaCBiL2luY2x1ZGUvYXNtLXNoL3NobXBhcmFtLmgKaW5kZXggMGE5NTYwNC4uYmExNzU4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc2htcGFyYW0uaAorKysgYi9pbmNsdWRlL2FzbS1zaC9zaG1wYXJhbS5oCkBAIC0xLDggKzEsMjIgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1zaC9zaG1wYXJhbS5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IE5paWJlIFl1dGFrYQorICogQ29weXJpZ2h0IChDKSAyMDA2IFBhdWwgTXVuZHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLwogI2lmbmRlZiBfX0FTTV9TSF9TSE1QQVJBTV9ICiAjZGVmaW5lIF9fQVNNX1NIX1NITVBBUkFNX0gKLSNpZmRlZiBfX0tFUk5FTF9fCiAKLSNpbmNsdWRlIDxhc20vY3B1L3NobXBhcmFtLmg+CisvKgorICogU0gtNCBhbmQgU0gtMyA3NzA1IGhhdmUgYW4gYWxpYXNpbmcgZGNhY2hlLiBCdW1wIHRoaXMgdXAgdG8gYSBzZW5zaWJsZSB2YWx1ZQorICogZm9yIGV2ZXJ5b25lLCBhbmQgd29yayBvdXQgdGhlIHNwZWNpZmljcyBmcm9tIHRoZSBwcm9iZWQgY2FjaGUgZGVzY3JpcHRvci4KKyAqLworI2RlZmluZQlTSE1MQkEJMHg0MDAwCQkgLyogYXR0YWNoIGFkZHIgYSBtdWx0aXBsZSBvZiB0aGlzICovCiAKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisjZGVmaW5lIF9fQVJDSF9GT1JDRV9TSE1MQkEKKwogI2VuZGlmIC8qIF9fQVNNX1NIX1NITVBBUkFNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NlL3NtYzM3YzkzeC5oIGIvaW5jbHVkZS9hc20tc2gvc21jMzdjOTN4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXNoL3NlL3NtYzM3YzkzeC5oCnJlbmFtZSB0byBpbmNsdWRlL2FzbS1zaC9zbWMzN2M5M3guaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvc21wLmggYi9pbmNsdWRlL2FzbS1zaC9zbXAuaAppbmRleCBmNTdjNGZlLi43MWVjZGRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zbXAuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9zbXAuaApAQCAtMTksMTEgKzE5LDYgQEAKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KIAotZXh0ZXJuIGNwdW1hc2tfdCBjcHVfb25saW5lX21hcDsKLWV4dGVybiBjcHVtYXNrX3QgY3B1X3Bvc3NpYmxlX21hcDsKLQotI2RlZmluZSBjcHVfb25saW5lKGNwdSkJCWNwdV9pc3NldChjcHUsIGNwdV9vbmxpbmVfbWFwKQotCiAjZGVmaW5lIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkJKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+Y3B1KQogCiAvKiBJJ3ZlIG5vIGlkZWEgd2hhdCB0aGUgcmVhbCBtZWFuaW5nIG9mIHRoaXMgaXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3NuYXBnZWFyL2lvLmggYi9pbmNsdWRlL2FzbS1zaC9zbmFwZ2Vhci5oCnNpbWlsYXJpdHkgaW5kZXggNjIlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXNoL3NuYXBnZWFyL2lvLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLXNoL3NuYXBnZWFyLmgKaW5kZXggYmZhOTdhYy4uNmI1ZTRkZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvc25hcGdlYXIvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1zaC9zbmFwZ2Vhci5oCkBAIC00MCwyMSArNDAsOCBAQAogI2RlZmluZSBJUkwzX1BSSU9SSVRZCTQKICNlbmRpZgogCi1leHRlcm4gdW5zaWduZWQgY2hhciBzbmFwZ2Vhcl9pbmIodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBzbmFwZ2Vhcl9pbncodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgc25hcGdlYXJfaW5sKHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci0KLWV4dGVybiB2b2lkIHNuYXBnZWFyX291dGIodW5zaWduZWQgY2hhciB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB2b2lkIHNuYXBnZWFyX291dHcodW5zaWduZWQgc2hvcnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdm9pZCBzbmFwZ2Vhcl9vdXRsKHVuc2lnbmVkIGludCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KTsKLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc25hcGdlYXJfaW5iX3AodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB2b2lkIHNuYXBnZWFyX291dGJfcCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotCi1leHRlcm4gdm9pZCBzbmFwZ2Vhcl9pbnNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBzbmFwZ2Vhcl9vdXRzbCh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBzbmFwZ2Vhcl9pc2FfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKKyNkZWZpbmUgX19JT19QUkVGSVgJc25hcGdlYXIKKyNpbmNsdWRlIDxhc20vaW9fZ2VuZXJpYy5oPgogCiAjaWZkZWYgQ09ORklHX1NIX1NFQ1VSRUVER0U1NDEwCiAvKgpAQCAtNzksMTQgKzY2LDE0IEBACiAgKiBEMTIgICAgICAgIC0gICAgICAgICAgICAgICAgICAgICAgUlRTIFJFU0VUCiAgKi8KIAotICNkZWZpbmUgU0VDVVJFRURHRV9JT1BPUlRfQUREUiAoKHZvbGF0aWxlIHNob3J0ICopIDB4YjAwMDAwMDApCi0gZXh0ZXJuIHVuc2lnbmVkIHNob3J0IHNlY3VyZWVkZ2U1NDEwX2lvcG9ydDsKKyNkZWZpbmUgU0VDVVJFRURHRV9JT1BPUlRfQUREUiAoKHZvbGF0aWxlIHNob3J0ICopIDB4YjAwMDAwMDApCitleHRlcm4gdW5zaWduZWQgc2hvcnQgc2VjdXJlZWRnZTU0MTBfaW9wb3J0OwogCi0gI2RlZmluZSBTRUNVUkVFREdFX1dSSVRFX0lPUE9SVCh2YWwsIG1hc2spICgqU0VDVVJFRURHRV9JT1BPUlRfQUREUiA9IFwKLQkJIChzZWN1cmVlZGdlNTQxMF9pb3BvcnQgPSBcCi0JCSAJCSgoc2VjdXJlZWRnZTU0MTBfaW9wb3J0ICYgfihtYXNrKSkgfCAoKHZhbCkgJiAobWFzaykpKSkpCi0gI2RlZmluZSBTRUNVUkVFREdFX1JFQURfSU9QT1JUKCkgXAotIAkJICgoKlNFQ1VSRUVER0VfSU9QT1JUX0FERFImMHgwODE3KSB8IChzZWN1cmVlZGdlNTQxMF9pb3BvcnQmfjB4MDgxNykpCisjZGVmaW5lIFNFQ1VSRUVER0VfV1JJVEVfSU9QT1JUKHZhbCwgbWFzaykgKCpTRUNVUkVFREdFX0lPUE9SVF9BRERSID0gXAorCSAoc2VjdXJlZWRnZTU0MTBfaW9wb3J0ID0gXAorCQkJKChzZWN1cmVlZGdlNTQxMF9pb3BvcnQgJiB+KG1hc2spKSB8ICgodmFsKSAmIChtYXNrKSkpKSkKKyNkZWZpbmUgU0VDVVJFRURHRV9SRUFEX0lPUE9SVCgpIFwKKwkgKCgqU0VDVVJFRURHRV9JT1BPUlRfQUREUiYweDA4MTcpIHwgKHNlY3VyZWVkZ2U1NDEwX2lvcG9ydCZ+MHgwODE3KSkKICNlbmRpZgogCiAjZW5kaWYgLyogX0FTTV9TSF9JT19TTkFQR0VBUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zeXN0ZW0uaCBiL2luY2x1ZGUvYXNtLXNoL3N5c3RlbS5oCmluZGV4IGFkMzVhZDQuLjZjMWY4ZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3N5c3RlbS5oCkBAIC02LDYgKzYsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDAyIFBhdWwgTXVuZHQKICAqLwogCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKIC8qCiAgKglzd2l0Y2hfdG8oKSBzaG91bGQgc3dpdGNoIHRhc2tzIHRvIHRhc2sgbnIgbiwgZmlyc3QKQEAgLTY2LDEzICs2NywyMCBAQAogewogfQogCi0jZGVmaW5lIG5vcCgpIF9fYXNtX18gX192b2xhdGlsZV9fICgibm9wIikKKyNpZmRlZiBDT05GSUdfQ1BVX1NINEEKKyNkZWZpbmUgX19pY2JpKCkJCQlcCit7CQkJCQlcCisJdW5zaWduZWQgbG9uZyBfX2FkZHI7CQlcCisJX19hZGRyID0gMHhhODAwMDAwMDsJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCVwKKwkJImljYmkgICAlMFxuXHQiCQlcCisJCTogLyogbm8gb3V0cHV0ICovCVwKKwkJOiAibSIgKF9fbShfX2FkZHIpKSk7CVwKK30KKyNlbmRpZgogCi0KLSNkZWZpbmUgeGNoZyhwdHIseCkgKChfX3R5cGVvZl9fKCoocHRyKSkpX194Y2hnKCh1bnNpZ25lZCBsb25nKSh4KSwocHRyKSxzaXplb2YoKihwdHIpKSkpCi0KLXN0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGxvbmcgdGFzKHZvbGF0aWxlIGludCAqbSkKLXsgLyogI2RlZmluZSB0YXMocHRyKSAoeGNoZygocHRyKSwxKSkgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0YXModm9sYXRpbGUgaW50ICptKQorewogCXVuc2lnbmVkIGxvbmcgcmV0dmFsOwogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJ0YXMuYglAJTFcblx0IgpAQCAtODEsMTIgKzg5LDMzIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotZXh0ZXJuIHZvaWQgX194Y2hnX2NhbGxlZF93aXRoX2JhZF9wb2ludGVyKHZvaWQpOwotCi0jZGVmaW5lIG1iKCkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCIiOiA6IDoibWVtb3J5IikKLSNkZWZpbmUgcm1iKCkJbWIoKQotI2RlZmluZSB3bWIoKQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiI6IDogOiJtZW1vcnkiKQorLyoKKyAqIEEgYnJpZWYgbm90ZSBvbiBjdHJsX2JhcnJpZXIoKSwgdGhlIGNvbnRyb2wgcmVnaXN0ZXIgd3JpdGUgYmFycmllci4KKyAqCisgKiBMZWdhY3kgU0ggY29yZXMgdHlwaWNhbGx5IHJlcXVpcmUgYSBzZXF1ZW5jZSBvZiA4IG5vcHMgYWZ0ZXIKKyAqIG1vZGlmaWNhdGlvbiBvZiBhIGNvbnRyb2wgcmVnaXN0ZXIgaW4gb3JkZXIgZm9yIHRoZSBjaGFuZ2VzIHRvIHRha2UKKyAqIGVmZmVjdC4gT24gbmV3ZXIgY29yZXMgKGxpa2UgdGhlIHNoNGEgYW5kIHNoNSkgdGhpcyBpcyBhY2NvbXBsaXNoZWQKKyAqIHdpdGggaWNiaS4KKyAqCisgKiBBbHNvIG5vdGUgdGhhdCBvbiBzaDRhIGluIHRoZSBpY2JpIGNhc2Ugd2UgY2FuIGZvcmVnbyBhIHN5bmNvIGZvciB0aGUKKyAqIHdyaXRlIGJhcnJpZXIsIGFzIGl0J3Mgbm90IG5lY2Vzc2FyeSBmb3IgY29udHJvbCByZWdpc3RlcnMuCisgKgorICogSGlzdG9yaWNhbGx5IHdlIGhhdmUgb25seSBkb25lIHRoaXMgdHlwZSBvZiBiYXJyaWVyIGZvciB0aGUgTU1VQ1IsIGJ1dAorICogaXQncyBhbHNvIG5lY2Vzc2FyeSBmb3IgdGhlIENDUiwgc28gd2UgbWFrZSBpdCBnZW5lcmljIGhlcmUgaW5zdGVhZC4KKyAqLworI2lmZGVmIENPTkZJR19DUFVfU0g0QQorI2RlZmluZSBtYigpCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmNvIjogOiA6Im1lbW9yeSIpCisjZGVmaW5lIHJtYigpCQltYigpCisjZGVmaW5lIHdtYigpCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN5bmNvIjogOiA6Im1lbW9yeSIpCisjZGVmaW5lIGN0cmxfYmFycmllcigpCV9faWNiaSgpCiAjZGVmaW5lIHJlYWRfYmFycmllcl9kZXBlbmRzKCkJZG8geyB9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBtYigpCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiI6IDogOiJtZW1vcnkiKQorI2RlZmluZSBybWIoKQkJbWIoKQorI2RlZmluZSB3bWIoKQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCIiOiA6IDoibWVtb3J5IikKKyNkZWZpbmUgY3RybF9iYXJyaWVyKCkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJub3A7bm9wO25vcDtub3A7bm9wO25vcDtub3A7bm9wIikKKyNkZWZpbmUgcmVhZF9iYXJyaWVyX2RlcGVuZHMoKQlkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NNUAogI2RlZmluZSBzbXBfbWIoKQltYigpCkBAIC0xMDMsNyArMTMyLDggQEAKICNkZWZpbmUgc2V0X21iKHZhciwgdmFsdWUpIGRvIHsgeGNoZygmdmFyLCB2YWx1ZSk7IH0gd2hpbGUgKDApCiAKIC8qIEludGVycnVwdCBDb250cm9sICovCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkIGxvY2FsX2lycV9lbmFibGUodm9pZCkKKyNpZmRlZiBDT05GSUdfQ1BVX0hBU19TUl9SQgorc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX2lycV9lbmFibGUodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIF9fZHVtbXkwLCBfX2R1bW15MTsKIApAQCAtMTE2LDggKzE0NiwyMiBAQAogCQkJICAgICA6ICIxIiAofjB4MDAwMDAwZjApCiAJCQkgICAgIDogIm1lbW9yeSIpOwogfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2NhbF9pcnFfZW5hYmxlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBfX2R1bW15MCwgX19kdW1teTE7CiAKLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgbG9jYWxfaXJxX2Rpc2FibGUodm9pZCkKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCSJzdGMJc3IsICUwXG5cdCIKKwkJImFuZAklMSwgJTBcblx0IgorCQkibGRjCSUwLCBzclxuXHQiCisJCTogIj0mciIgKF9fZHVtbXkwKSwgIj1yIiAoX19kdW1teTEpCisJCTogIjEiICh+MHgwMDAwMDBmMCkKKwkJOiAibWVtb3J5Iik7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGxvY2FsX2lycV9kaXNhYmxlKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBfX2R1bW15OwogCV9fYXNtX18gX192b2xhdGlsZV9fKCJzdGMJc3IsICUwXG5cdCIKQEAgLTEyOCw2ICsxNzIsMzEgQEAKIAkJCSAgICAgOiAibWVtb3J5Iik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfYmxfYml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBfX2R1bW15MCwgX19kdW1teTE7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0YwlzciwgJTBcblx0IgorCQkJICAgICAib3IJJTIsICUwXG5cdCIKKwkJCSAgICAgImFuZAklMywgJTBcblx0IgorCQkJICAgICAibGRjCSUwLCBzciIKKwkJCSAgICAgOiAiPSZyIiAoX19kdW1teTApLCAiPXIiIChfX2R1bW15MSkKKwkJCSAgICAgOiAiciIgKDB4MTAwMDAwMDApLCAiciIgKDB4ZmZmZmZmMGYpCisJCQkgICAgIDogIm1lbW9yeSIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfYmxfYml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBfX2R1bW15MCwgX19kdW1teTE7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInN0YwlzciwgJTBcblx0IgorCQkJICAgICAiYW5kCSUyLCAlMFxuXHQiCisJCQkgICAgICJsZGMJJTAsIHNyIgorCQkJICAgICA6ICI9JnIiIChfX2R1bW15MCksICI9ciIgKF9fZHVtbXkxKQorCQkJICAgICA6ICIxIiAofjB4MTAwMDAwMDApCisJCQkgICAgIDogIm1lbW9yeSIpOworfQorCiAjZGVmaW5lIGxvY2FsX3NhdmVfZmxhZ3MoeCkgXAogCV9fYXNtX18oInN0YyBzciwgJTA7IGFuZCAjMHhmMCwgJTAiIDogIj0meiIgKHgpIDovKiovOiAibWVtb3J5IiApCiAKQEAgLTEzOCw3ICsyMDcsNyBAQAogCShmbGFncyAhPSAwKTsJCQlcCiB9KQogCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIGxvY2FsX2lycV9zYXZlKHZvaWQpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9jYWxfaXJxX3NhdmUodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzLCBfX2R1bW15OwogCkBAIC0xNTQsMzUgKzIyMyw5IEBACiAJcmV0dXJuIGZsYWdzOwogfQogCi0jaWZkZWYgREVCVUdfQ0xJX1NUSQotc3RhdGljIF9faW5saW5lX18gdm9pZCAgbG9jYWxfaXJxX3Jlc3RvcmUodW5zaWduZWQgbG9uZyB4KQotewotCWlmICgoeCAmIDB4MDAwMDAwZjApICE9IDB4MDAwMDAwZjApCi0JCWxvY2FsX2lycV9lbmFibGUoKTsKLQllbHNlIHsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJbG9jYWxfc2F2ZV9mbGFncyhmbGFncyk7Ci0KLQkJaWYgKGZsYWdzID09IDApIHsKLQkJCWV4dGVybiB2b2lkIGR1bXBfc3RhY2sodm9pZCk7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkJVRyFcbiIpOwotCQkJZHVtcF9zdGFjaygpOwotCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJfQotCX0KLX0KLSNlbHNlCi0jZGVmaW5lIGxvY2FsX2lycV9yZXN0b3JlKHgpIGRvIHsgCQkJXAorI2RlZmluZSBsb2NhbF9pcnFfcmVzdG9yZSh4KSBkbyB7CQkJXAogCWlmICgoeCAmIDB4MDAwMDAwZjApICE9IDB4MDAwMDAwZjApCQlcCi0JCWxvY2FsX2lycV9lbmFibGUoKTsJCQkJXAotfSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jZGVmaW5lIHJlYWxseV9yZXN0b3JlX2ZsYWdzKHgpIGRvIHsgCQkJXAotCWlmICgoeCAmIDB4MDAwMDAwZjApICE9IDB4MDAwMDAwZjApCQlcCi0JCWxvY2FsX2lycV9lbmFibGUoKTsJCQkJXAotCWVsc2UJCQkJCQlcCi0JCWxvY2FsX2lycV9kaXNhYmxlKCk7CQkJCVwKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOwkJCVwKIH0gd2hpbGUgKDApCiAKIC8qCkBAIC0yMTAsOCArMjUzLDggQEAKICNkZWZpbmUgYmFja190b19QMSgpCQkJCQlcCiBkbyB7CQkJCQkJCVwKIAl1bnNpZ25lZCBsb25nIF9fZHVtbXk7CQkJCVwKKwljdHJsX2JhcnJpZXIoKTsJCQkJCVwKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJXAotCQkibm9wO25vcDtub3A7bm9wO25vcDtub3A7bm9wXG5cdCIJXAogCQkibW92LmwJMWYsICUwXG5cdCIJCQlcCiAJCSJqbXAJQCUwXG5cdCIJCQlcCiAJCSIgbm9wXG5cdCIJCQkJXApAQCAtMjI0LDcgKzI2Nyw3IEBACiAvKiBGb3Igc3BpbmxvY2tzIGV0YyAqLwogI2RlZmluZSBsb2NhbF9pcnFfc2F2ZSh4KQl4ID0gbG9jYWxfaXJxX3NhdmUoKQogCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIHhjaGdfdTMyKHZvbGF0aWxlIGludCAqIG0sIHVuc2lnbmVkIGxvbmcgdmFsKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHhjaGdfdTMyKHZvbGF0aWxlIHUzMiAqbSwgdW5zaWduZWQgbG9uZyB2YWwpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgcmV0dmFsOwogCkBAIC0yMzUsNyArMjc4LDcgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIHhjaGdfdTgodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqIG0sIHVuc2lnbmVkIGxvbmcgdmFsKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHhjaGdfdTgodm9sYXRpbGUgdTggKm0sIHVuc2lnbmVkIGxvbmcgdmFsKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHJldHZhbDsKIApAQCAtMjQ2LDIwICsyODksNzAgQEAKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nIF9feGNoZyh1bnNpZ25lZCBsb25nIHgsIHZvbGF0aWxlIHZvaWQgKiBwdHIsIGludCBzaXplKQorZXh0ZXJuIHZvaWQgX194Y2hnX2NhbGxlZF93aXRoX2JhZF9wb2ludGVyKHZvaWQpOworCisjZGVmaW5lIF9feGNoZyhwdHIsIHgsIHNpemUpCQkJCVwKKyh7CQkJCQkJCVwKKwl1bnNpZ25lZCBsb25nIF9feGNoZ19fcmVzOwkJCVwKKwl2b2xhdGlsZSB2b2lkICpfX3hjaGdfcHRyID0gKHB0cik7CQlcCisJc3dpdGNoIChzaXplKSB7CQkJCQlcCisJY2FzZSA0OgkJCQkJCVwKKwkJX194Y2hnX19yZXMgPSB4Y2hnX3UzMihfX3hjaGdfcHRyLCB4KTsJXAorCQlicmVhazsJCQkJCVwKKwljYXNlIDE6CQkJCQkJXAorCQlfX3hjaGdfX3JlcyA9IHhjaGdfdTgoX194Y2hnX3B0ciwgeCk7CVwKKwkJYnJlYWs7CQkJCQlcCisJZGVmYXVsdDoJCQkJCVwKKwkJX194Y2hnX2NhbGxlZF93aXRoX2JhZF9wb2ludGVyKCk7CVwKKwkJX194Y2hnX19yZXMgPSB4OwkJCVwKKwkJYnJlYWs7CQkJCQlcCisJfQkJCQkJCVwKKwkJCQkJCQlcCisJX194Y2hnX19yZXM7CQkJCQlcCit9KQorCisjZGVmaW5lIHhjaGcocHRyLHgpCVwKKwkoKF9fdHlwZW9mX18oKihwdHIpKSlfX3hjaGcoKHB0ciksKHVuc2lnbmVkIGxvbmcpKHgpLCBzaXplb2YoKihwdHIpKSkpCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NtcHhjaGdfdTMyKHZvbGF0aWxlIGludCAqIG0sIHVuc2lnbmVkIGxvbmcgb2xkLAorCXVuc2lnbmVkIGxvbmcgbmV3KQoreworCV9fdTMyIHJldHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXJldHZhbCA9ICptOworCWlmIChyZXR2YWwgPT0gb2xkKQorCQkqbSA9IG5ldzsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7ICAgICAgIC8qIGltcGxpZXMgbWVtb3J5IGJhcnJpZXIgICovCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGV4aXN0LCBzbyB5b3UnbGwgZ2V0IGEgbGlua2VyIGVycm9yCisgKiBpZiBzb21ldGhpbmcgdHJpZXMgdG8gZG8gYW4gaW52YWxpZCBjbXB4Y2hnKCkuICovCitleHRlcm4gdm9pZCBfX2NtcHhjaGdfY2FsbGVkX3dpdGhfYmFkX3BvaW50ZXIodm9pZCk7CisKKyNkZWZpbmUgX19IQVZFX0FSQ0hfQ01QWENIRyAxCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NtcHhjaGcodm9sYXRpbGUgdm9pZCAqIHB0ciwgdW5zaWduZWQgbG9uZyBvbGQsCisJCXVuc2lnbmVkIGxvbmcgbmV3LCBpbnQgc2l6ZSkKIHsKIAlzd2l0Y2ggKHNpemUpIHsKIAljYXNlIDQ6Ci0JCXJldHVybiB4Y2hnX3UzMihwdHIsIHgpOwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXJldHVybiB4Y2hnX3U4KHB0ciwgeCk7Ci0JCWJyZWFrOworCQlyZXR1cm4gX19jbXB4Y2hnX3UzMihwdHIsIG9sZCwgbmV3KTsKIAl9Ci0JX194Y2hnX2NhbGxlZF93aXRoX2JhZF9wb2ludGVyKCk7Ci0JcmV0dXJuIHg7CisJX19jbXB4Y2hnX2NhbGxlZF93aXRoX2JhZF9wb2ludGVyKCk7CisJcmV0dXJuIG9sZDsKIH0KIAorI2RlZmluZSBjbXB4Y2hnKHB0cixvLG4pCQkJCQkJIFwKKyAgKHsJCQkJCQkJCQkgXAorICAgICBfX3R5cGVvZl9fKCoocHRyKSkgX29fID0gKG8pOwkJCQkJIFwKKyAgICAgX190eXBlb2ZfXygqKHB0cikpIF9uXyA9IChuKTsJCQkJCSBcCisgICAgIChfX3R5cGVvZl9fKCoocHRyKSkpIF9fY21weGNoZygocHRyKSwgKHVuc2lnbmVkIGxvbmcpX29fLAkJIFwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcpX25fLCBzaXplb2YoKihwdHIpKSk7IFwKKyAgfSkKKwogLyogWFhYCiAgKiBkaXNhYmxlIGhsdCBkdXJpbmcgY2VydGFpbiBjcml0aWNhbCBpL28gb3BlcmF0aW9ucwogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zeXN0ZW1oL2lvLmggYi9pbmNsdWRlL2FzbS1zaC9zeXN0ZW1oL2lvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNzg0OWIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvc3lzdGVtaC9pby5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIGluY2x1ZGUvYXNtLXNoL3N5c3RlbWgvaW8uaAotICoKLSAqIFN0dXBpZCBJL08gZGVmaW5pdGlvbnMgZm9yIFN5c3RlbUgsIGNsb25lZCBmcm9tIFNFNzc1MS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgIFBhdWwgTXVuZHQKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2lmbmRlZiBfX0FTTV9TSF9TWVNURU1IX0lPX0gKLSNkZWZpbmUgX19BU01fU0hfU1lTVEVNSF9JT19ICi0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIHNoNzc1MXN5c3RlbWhfaW5iKHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdW5zaWduZWQgc2hvcnQgc2g3NzUxc3lzdGVtaF9pbncodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgc2g3NzUxc3lzdGVtaF9pbmwodW5zaWduZWQgbG9uZyBwb3J0KTsKLQotZXh0ZXJuIHZvaWQgc2g3NzUxc3lzdGVtaF9vdXRiKHVuc2lnbmVkIGNoYXIgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdm9pZCBzaDc3NTFzeXN0ZW1oX291dHcodW5zaWduZWQgc2hvcnQgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdm9pZCBzaDc3NTFzeXN0ZW1oX291dGwodW5zaWduZWQgaW50IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotCi1leHRlcm4gdW5zaWduZWQgY2hhciBzaDc3NTFzeXN0ZW1oX2luYl9wKHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdm9pZCBzaDc3NTFzeXN0ZW1oX291dGJfcCh1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotCi1leHRlcm4gdm9pZCBzaDc3NTFzeXN0ZW1oX2luc2IodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKLWV4dGVybiB2b2lkIHNoNzc1MXN5c3RlbWhfaW5zdyh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpOwotZXh0ZXJuIHZvaWQgc2g3NzUxc3lzdGVtaF9pbnNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBzaDc3NTFzeXN0ZW1oX291dHNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBzaDc3NTFzeXN0ZW1oX291dHN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBzaDc3NTFzeXN0ZW1oX291dHNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci0KLWV4dGVybiB1bnNpZ25lZCBjaGFyIHNoNzc1MXN5c3RlbWhfcmVhZGIodW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB1bnNpZ25lZCBzaG9ydCBzaDc3NTFzeXN0ZW1oX3JlYWR3KHVuc2lnbmVkIGxvbmcgYWRkcik7Ci1leHRlcm4gdW5zaWduZWQgaW50IHNoNzc1MXN5c3RlbWhfcmVhZGwodW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB2b2lkIHNoNzc1MXN5c3RlbWhfd3JpdGViKHVuc2lnbmVkIGNoYXIgYiwgdW5zaWduZWQgbG9uZyBhZGRyKTsKLWV4dGVybiB2b2lkIHNoNzc1MXN5c3RlbWhfd3JpdGV3KHVuc2lnbmVkIHNob3J0IGIsIHVuc2lnbmVkIGxvbmcgYWRkcik7Ci1leHRlcm4gdm9pZCBzaDc3NTFzeXN0ZW1oX3dyaXRlbCh1bnNpZ25lZCBpbnQgYiwgdW5zaWduZWQgbG9uZyBhZGRyKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2g3NzUxc3lzdGVtaF9pc2FfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKLQotI2VuZGlmIC8qIF9fQVNNX1NIX1NZU1RFTUhfSU9fSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zeXN0ZW1oLzc3NTFzeXN0ZW1oLmggYi9pbmNsdWRlL2FzbS1zaC9zeXN0ZW1oNzc1MS5oCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGluY2x1ZGUvYXNtLXNoL3N5c3RlbWgvNzc1MXN5c3RlbWguaApyZW5hbWUgdG8gaW5jbHVkZS9hc20tc2gvc3lzdGVtaDc3NTEuaAppbmRleCA0MTcwNTMxLi5iMTQzYmIyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9zeXN0ZW1oLzc3NTFzeXN0ZW1oLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvc3lzdGVtaDc3NTEuaApAQCAtNjUsNCArNjUsNyBAQAogCiAjZGVmaW5lIElSUV83OUM5NzMJMTMKIAorI2RlZmluZSBfX0lPX1BSRUZJWAlzaDc3NTFzeXN0ZW1oCisjaW5jbHVkZSA8YXNtL2lvX2dlbmVyaWMuaD4KKwogI2VuZGlmICAvKiBfX0FTTV9TSF9TWVNURU1IXzc3NTFTWVNURU1IX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3RocmVhZF9pbmZvLmggYi9pbmNsdWRlL2FzbS1zaC90aHJlYWRfaW5mby5oCmluZGV4IDczNDUzNTAuLjNlYmMzZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvdGhyZWFkX2luZm8uaApAQCAtOSw4ICs5LDggQEAKICAqICBDb3B5cmlnaHQgKEMpIDIwMDIgIERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCiAgKiAgLSBJbmNvcnBvcmF0aW5nIHN1Z2dlc3Rpb25zIG1hZGUgYnkgTGludXMgVG9ydmFsZHMgYW5kIERhdmUgTWlsbGVyCiAgKi8KLQogI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTIxLDcgKzIxLDEwIEBACiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KIAlfX3UzMgkJCWNwdTsKIAlpbnQJCQlwcmVlbXB0X2NvdW50OyAvKiAwID0+IHByZWVtcHRhYmxlLCA8MCA9PiBCVUcgKi8KKwltbV9zZWdtZW50X3QJCWFkZHJfbGltaXQ7CS8qIHRocmVhZCBhZGRyZXNzIHNwYWNlICovCiAJc3RydWN0IHJlc3RhcnRfYmxvY2sJcmVzdGFydF9ibG9jazsKKwl1bnNpZ25lZCBsb25nCQlwcmV2aW91c19zcDsJLyogc3Agb2YgcHJldmlvdXMgc3RhY2sgaW4gY2FzZQorCQkJCQkJICAgb2YgbmVzdGVkIElSUSBzdGFja3MgKi8KIAlfX3U4CQkJc3VwZXJ2aXNvcl9zdGFja1swXTsKIH07CiAKQEAgLTI5LDYgKzMyLDEzIEBACiAKICNkZWZpbmUgUFJFRU1QVF9BQ1RJVkUJCTB4MTAwMDAwMDAKIAorI2lmZGVmIENPTkZJR180S1NUQUNLUworI2RlZmluZSBUSFJFQURfU0laRQkJKFBBR0VfU0laRSkKKyNlbHNlCisjZGVmaW5lIFRIUkVBRF9TSVpFCQkoUEFHRV9TSVpFICogMikKKyNlbmRpZgorI2RlZmluZSBTVEFDS19XQVJOCQkoVEhSRUFEX1NJWkUgLyA4KQorCiAvKgogICogbWFjcm9zL2Z1bmN0aW9ucyBmb3IgZ2FpbmluZyBhY2Nlc3MgdG8gdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKICAqLwpAQCAtNDAsNiArNTAsNyBAQAogCS5mbGFncwkJPSAwLAkJCVwKIAkuY3B1CQk9IDAsCQkJXAogCS5wcmVlbXB0X2NvdW50CT0gMSwJCQlcCisJLmFkZHJfbGltaXQJPSBLRVJORUxfRFMsCQlcCiAJLnJlc3RhcnRfYmxvY2sJPSB7CQkJXAogCQkuZm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGwsCVwKIAl9LAkJCQkJXApAQCAtNDgsMjQgKzU5LDQyIEBACiAjZGVmaW5lIGluaXRfdGhyZWFkX2luZm8JKGluaXRfdGhyZWFkX3VuaW9uLnRocmVhZF9pbmZvKQogI2RlZmluZSBpbml0X3N0YWNrCQkoaW5pdF90aHJlYWRfdW5pb24uc3RhY2spCiAKKy8qIGhvdyB0byBnZXQgdGhlIGN1cnJlbnQgc3RhY2sgcG9pbnRlciBmcm9tIEMgKi8KK3JlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgY3VycmVudF9zdGFja19wb2ludGVyIGFzbSgicjE1IikgX19hdHRyaWJ1dGVfdXNlZF9fOworCiAvKiBob3cgdG8gZ2V0IHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0IGZyb20gQyAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgdGhyZWFkX2luZm8gKmN1cnJlbnRfdGhyZWFkX2luZm8odm9pZCkKIHsKIAlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRpOworI2lmZGVmIENPTkZJR19DUFVfSEFTX1NSX1JCCiAJX19hc21fXygic3RjCXI3X2JhbmssICUwIiA6ICI9ciIgKHRpKSk7CisjZWxzZQorCXVuc2lnbmVkIGxvbmcgX19kdW1teTsKKworCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJIm1vdglyMTUsICUwXG5cdCIKKwkJImFuZAklMSwgJTBcblx0IgorCQk6ICI9JnIiICh0aSksICI9ciIgKF9fZHVtbXkpCisJCTogIjEiICh+KFRIUkVBRF9TSVpFIC0gMSkpCisJCTogIm1lbW9yeSIpOworI2VuZGlmCisKIAlyZXR1cm4gdGk7CiB9CiAKIC8qIHRocmVhZCBpbmZvcm1hdGlvbiBhbGxvY2F0aW9uICovCi0jZGVmaW5lIFRIUkVBRF9TSVpFICgyKlBBR0VfU0laRSkKLSNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odGkpICgoc3RydWN0IHRocmVhZF9pbmZvICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwxKSkKLSNkZWZpbmUgZnJlZV90aHJlYWRfaW5mbyh0aSkgZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgKHRpKSwgMSkKKyNpZmRlZiBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UKKyNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm8odGkpCWt6YWxsb2MoVEhSRUFEX1NJWkUsIEdGUF9LRVJORUwpCisjZWxzZQorI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0aSkJa21hbGxvYyhUSFJFQURfU0laRSwgR0ZQX0tFUk5FTCkKKyNlbmRpZgorI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKHRpKQlrZnJlZSh0aSkKIAogI2Vsc2UgLyogIV9fQVNTRU1CTFlfXyAqLwogCiAvKiBob3cgdG8gZ2V0IHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0IGZyb20gQVNNICovCiAjZGVmaW5lIEdFVF9USFJFQURfSU5GTyhyZWcpIFwKLQlzdGMJcjdfYmFuaywgcmVnCisJc3RjICAgICByN19iYW5rLCByZWcKIAogI2VuZGlmCiAKQEAgLTc5LDE4ICsxMDgsMTggQEAKICNkZWZpbmUgVElGX05PVElGWV9SRVNVTUUJMQkvKiByZXN1bXB0aW9uIG5vdGlmaWNhdGlvbiByZXF1ZXN0ZWQgKi8KICNkZWZpbmUgVElGX1NJR1BFTkRJTkcJCTIJLyogc2lnbmFsIHBlbmRpbmcgKi8KICNkZWZpbmUgVElGX05FRURfUkVTQ0hFRAkzCS8qIHJlc2NoZWR1bGluZyBuZWNlc3NhcnkgKi8KKyNkZWZpbmUgVElGX1JFU1RPUkVfU0lHTUFTSwk0CS8qIHJlc3RvcmUgc2lnbmFsIG1hc2sgaW4gZG9fc2lnbmFsKCkgKi8KICNkZWZpbmUgVElGX1VTRURGUFUJCTE2CS8qIEZQVSB3YXMgdXNlZCBieSB0aGlzIHRhc2sgdGhpcyBxdWFudHVtIChTTVApICovCiAjZGVmaW5lIFRJRl9QT0xMSU5HX05SRkxBRwkxNwkvKiB0cnVlIGlmIHBvbGxfaWRsZSgpIGlzIHBvbGxpbmcgVElGX05FRURfUkVTQ0hFRCAqLwogI2RlZmluZSBUSUZfTUVNRElFCQkxOAotI2RlZmluZSBUSUZfVVNFUlNQQUNFCQkzMQkvKiB0cnVlIGlmIEZTIHNldHMgdXNlcnNwYWNlICovCiAKICNkZWZpbmUgX1RJRl9TWVNDQUxMX1RSQUNFCSgxPDxUSUZfU1lTQ0FMTF9UUkFDRSkKICNkZWZpbmUgX1RJRl9OT1RJRllfUkVTVU1FCSgxPDxUSUZfTk9USUZZX1JFU1VNRSkKICNkZWZpbmUgX1RJRl9TSUdQRU5ESU5HCQkoMTw8VElGX1NJR1BFTkRJTkcpCiAjZGVmaW5lIF9USUZfTkVFRF9SRVNDSEVECSgxPDxUSUZfTkVFRF9SRVNDSEVEKQorI2RlZmluZSBfVElGX1JFU1RPUkVfU0lHTUFTSwkoMTw8VElGX1JFU1RPUkVfU0lHTUFTSykKICNkZWZpbmUgX1RJRl9VU0VERlBVCQkoMTw8VElGX1VTRURGUFUpCiAjZGVmaW5lIF9USUZfUE9MTElOR19OUkZMQUcJKDE8PFRJRl9QT0xMSU5HX05SRkxBRykKLSNkZWZpbmUgX1RJRl9VU0VSU1BBQ0UJCSgxPDxUSUZfVVNFUlNQQUNFKQogCiAjZGVmaW5lIF9USUZfV09SS19NQVNLCQkweDAwMDAwMEZFCS8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gKi8KICNkZWZpbmUgX1RJRl9BTExXT1JLX01BU0sJMHgwMDAwMDBGRgkvKiB3b3JrIHRvIGRvIG9uIGFueSByZXR1cm4gdG8gdS1zcGFjZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvdGltZXIuaCBiL2luY2x1ZGUvYXNtLXNoL3RpbWVyLmgKaW5kZXggZGQ2NTc5Yy4uYzdhYjI4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdGltZXIuaAorKysgYi9pbmNsdWRlL2FzbS1zaC90aW1lci5oCkBAIC02LDYgKzYsOCBAQAogCiBzdHJ1Y3Qgc3lzX3RpbWVyX29wcyB7CiAJaW50ICgqaW5pdCkodm9pZCk7CisJaW50ICgqc3RhcnQpKHZvaWQpOworCWludCAoKnN0b3ApKHZvaWQpOwogCXVuc2lnbmVkIGxvbmcgKCpnZXRfb2Zmc2V0KSh2b2lkKTsKIAl1bnNpZ25lZCBsb25nICgqZ2V0X2ZyZXF1ZW5jeSkodm9pZCk7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvdGl0YW4uaCBiL2luY2x1ZGUvYXNtLXNoL3RpdGFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwYTRmNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNoL3RpdGFuLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIFBsYXRmb3JtIGRlZmludGlvbnMgZm9yIFRpdGFuCisgKi8KKworI2lmbmRlZiBfQVNNX1NIX1RJVEFOX1RJVEFOX0gKKyNkZWZpbmUgX0FTTV9TSF9USVRBTl9USVRBTl9ICisKKyNkZWZpbmUgX19JT19QUkVGSVggdGl0YW4KKyNpbmNsdWRlIDxhc20vaW9fZ2VuZXJpYy5oPgorCisvKiBJUlEgYXNzaWdubWVudHMgKi8KKyNkZWZpbmUgVElUQU5fSVJRX1dBTgkJMgkvKiBldGgwIChXQU4pICovCisjZGVmaW5lIFRJVEFOX0lSUV9MQU4JCTUJLyogZXRoMSAoTEFOKSAqLworI2RlZmluZSBUSVRBTl9JUlFfTVBDSUEJCTgJLyogbVBDSSBBICovCisjZGVmaW5lIFRJVEFOX0lSUV9NUENJQgkJMTEJLyogbVBDSSBCICovCisjZGVmaW5lIFRJVEFOX0lSUV9VU0IJCTExCS8qIFVTQiAqLworCisvKgorICogVGhlIGV4dGVybmFsIGludGVycnVwdCBsaW5lcywgdGhlc2UgdGFrZSB1cCBpbnRzIDAgLSAxNSBpbmNsdXNpdmUKKyAqIGRlcGVuZGluZyBvbiB0aGUgcHJpb3JpdHkgZm9yIHRoZSBpbnRlcnJ1cHQuICBJbiBmYWN0IHRoZSBwcmlvcml0eQorICogaXMgdGhlIGludGVycnVwdCA6LSkKKyAqLworI2RlZmluZSBJUkwwX0lSUQkwCisjZGVmaW5lIElSTDBfSVBSX0FERFIJSU5UQ19JUFJECisjZGVmaW5lIElSTDBfSVBSX1BPUwkzCisjZGVmaW5lIElSTDBfUFJJT1JJVFkJOAorCisjZGVmaW5lIElSTDFfSVJRCTEKKyNkZWZpbmUgSVJMMV9JUFJfQUREUglJTlRDX0lQUkQKKyNkZWZpbmUgSVJMMV9JUFJfUE9TCTIKKyNkZWZpbmUgSVJMMV9QUklPUklUWQk4CisKKyNkZWZpbmUgSVJMMl9JUlEJMgorI2RlZmluZSBJUkwyX0lQUl9BRERSCUlOVENfSVBSRAorI2RlZmluZSBJUkwyX0lQUl9QT1MJMQorI2RlZmluZSBJUkwyX1BSSU9SSVRZCTgKKworI2RlZmluZSBJUkwzX0lSUQkzCisjZGVmaW5lIElSTDNfSVBSX0FERFIJSU5UQ19JUFJECisjZGVmaW5lIElSTDNfSVBSX1BPUwkwCisjZGVmaW5lIElSTDNfUFJJT1JJVFkJOAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLXNoL3VhY2Nlc3MuaAppbmRleCAyY2IwMTg2MWUuLjVjNDllZDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1zaC91YWNjZXNzLmgKQEAgLTE2LDIxICsxNiw5IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCi0vKgotICogTk9URTogTWFjcm8vZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBkZXBlbmRzIG9uIHRocmVhZHNfaW5mby5oIGltcGxlbWVudGF0aW9uLgotICogQXNzdW1lczoKLSAqIFRJX0ZMQUdTID09IDgKLSAqIFRJRl9VU0VSU1BBQ0UgPT0gMzEKLSAqIFVTRVJfQUREUl9MSU1JVCA9PSAweDgwMDAwMDAwCi0gKi8KLQogI2RlZmluZSBWRVJJRllfUkVBRCAgICAwCiAjZGVmaW5lIFZFUklGWV9XUklURSAgIDEKIAotdHlwZWRlZiBzdHJ1Y3QgewotCXVuc2lnbmVkIGludCBpc191c2VyX3NwYWNlOwotfSBtbV9zZWdtZW50X3Q7Ci0KIC8qCiAgKiBUaGUgZnMgdmFsdWUgZGV0ZXJtaW5lcyB3aGV0aGVyIGFyZ3VtZW50IHZhbGlkaXR5IGNoZWNraW5nIHNob3VsZCBiZQogICogcGVyZm9ybWVkIG9yIG5vdC4gIElmIGdldF9mcygpID09IFVTRVJfRFMsIGNoZWNraW5nIGlzIHBlcmZvcm1lZCwgd2l0aApAQCAtNDAsMTYgKzI4LDE4IEBACiAgKi8KIAogI2RlZmluZSBNQUtFX01NX1NFRyhzKQkoKG1tX3NlZ21lbnRfdCkgeyAocykgfSkKLSNkZWZpbmUgc2VnbWVudF9lcShhLGIpCSgoYSkuaXNfdXNlcl9zcGFjZSA9PSAoYikuaXNfdXNlcl9zcGFjZSkKIAotI2RlZmluZSBVU0VSX0FERFJfTElNSVQJMHg4MDAwMDAwMAorI2RlZmluZSBLRVJORUxfRFMJTUFLRV9NTV9TRUcoMHhGRkZGRkZGRlVMKQorI2RlZmluZSBVU0VSX0RTCQlNQUtFX01NX1NFRyhQQUdFX09GRlNFVCkKIAotI2RlZmluZSBLRVJORUxfRFMJTUFLRV9NTV9TRUcoMCkKLSNkZWZpbmUgVVNFUl9EUwkJTUFLRV9NTV9TRUcoMSkKKyNkZWZpbmUgc2VnbWVudF9lcShhLGIpCSgoYSkuc2VnID09IChiKS5zZWcpCiAKICNkZWZpbmUgZ2V0X2RzKCkJKEtFUk5FTF9EUykKIAogI2lmICFkZWZpbmVkKENPTkZJR19NTVUpCisvKiBOT01NVSBpcyBhbHdheXMgdHJ1ZSAqLworI2RlZmluZSBfX2FkZHJfb2soYWRkcikgKDEpCisKIHN0YXRpYyBpbmxpbmUgbW1fc2VnbWVudF90IGdldF9mcyh2b2lkKQogewogCXJldHVybiBVU0VSX0RTOwpAQCAtNzYsMzEgKzY2LDExIEBACiAJcmV0dXJuICgoYWRkciA+PSBtZW1vcnlfc3RhcnQpICYmICgoYWRkciArIHNpemUpIDwgbWVtb3J5X2VuZCkpOwogfQogI2Vsc2UgLyogQ09ORklHX01NVSAqLwotc3RhdGljIGlubGluZSBtbV9zZWdtZW50X3QgZ2V0X2ZzKHZvaWQpCi17Ci0JcmV0dXJuIE1BS0VfTU1fU0VHKHRlc3RfdGhyZWFkX2ZsYWcoVElGX1VTRVJTUEFDRSkpOwotfQorI2RlZmluZSBfX2FkZHJfb2soYWRkcikgXAorCSgodW5zaWduZWQgbG9uZykoYWRkcikgPCAoY3VycmVudF90aHJlYWRfaW5mbygpLT5hZGRyX2xpbWl0LnNlZykpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZnMobW1fc2VnbWVudF90IHMpCi17Ci0JdW5zaWduZWQgbG9uZyB0aSwgZmxhZzsKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKLQkJInN0YwlyN19iYW5rLCAlMFxuXHQiCi0JCSJtb3YubAlAKDgsJTApLCAlMVxuXHQiCi0JCSJzaGFsCSUxXG5cdCIKLQkJImNtcC9wbAklMlxuXHQiCi0JCSJyb3RjcgklMVxuXHQiCi0JCSJtb3YubAklMSwgQCg4LCUwKSIKLQkJOiAiPSZyIiAodGkpLCAiPSZyIiAoZmxhZykKLQkJOiAiciIgKHMuaXNfdXNlcl9zcGFjZSkKLQkJOiAidCIpOwotLyoqKioKLQlpZiAocy5pc191c2VyX3NwYWNlKQotCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1VTRVJTUEFDRSk7Ci0JZWxzZQotCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfVVNFUlNQQUNFKTsKLSoqKiovCi19CisjZGVmaW5lIGdldF9mcygpCShjdXJyZW50X3RocmVhZF9pbmZvKCktPmFkZHJfbGltaXQpCisjZGVmaW5lIHNldF9mcyh4KQkoY3VycmVudF90aHJlYWRfaW5mbygpLT5hZGRyX2xpbWl0ID0gKHgpKQogCiAvKgogICogX19hY2Nlc3Nfb2s6IENoZWNrIGlmIGFkZHJlc3Mgd2l0aCBzaXplIGlzIE9LIG9yIG5vdC4KQEAgLTEwOCw3ICs3OCw3IEBACiAgKiBXZSBkbyB0aHJlZSBjaGVja3M6CiAgKiAoMSkgaXMgaXQgdXNlciBzcGFjZT8gCiAgKiAoMikgYWRkciArIHNpemUgLS0+IGNhcnJ5PwotICogKDMpIGFkZHIgKyBzaXplID49IDB4ODAwMDAwMDAgIChVU0VSX0FERFJfTElNSVQpCisgKiAoMykgYWRkciArIHNpemUgPj0gMHg4MDAwMDAwMCAgKFBBR0VfT0ZGU0VUKQogICoKICAqICgxKSAoMikgKDMpIHwgUkVTVUxUCiAgKiAgMCAgIDAgICAwICB8ICBvawpAQCAtMjAxLDYgKzE3MSw3IEBACiAJX19ndV9lcnI7CQkJCQkJXAogfSkKIAorI2lmZGVmIENPTkZJR19NTVUKICNkZWZpbmUgX19nZXRfdXNlcl9jaGVjayh4LHB0cixzaXplKQkJCQlcCiAoewkJCQkJCQkJXAogCWxvbmcgX19ndV9lcnIsIF9fZ3VfdmFsOwkJCQlcCkBAIC0yOTAsNiArMjYxLDE4IEBACiAJOiAiciIgKGFkZHIpCQkJCVwKIAk6ICJ0Iik7CQkJCQlcCiB9KQorI2Vsc2UgLyogQ09ORklHX01NVSAqLworI2RlZmluZSBfX2dldF91c2VyX2NoZWNrKHgscHRyLHNpemUpCQkJCQlcCisoewkJCQkJCQkJCVwKKwlsb25nIF9fZ3VfZXJyLCBfX2d1X3ZhbDsJCQkJCVwKKwlpZiAoX19hY2Nlc3Nfb2soKHVuc2lnbmVkIGxvbmcpKHB0ciksIChzaXplKSkpIHsJCVwKKwkJX19nZXRfdXNlcl9zaXplKF9fZ3VfdmFsLCAocHRyKSwgKHNpemUpLCBfX2d1X2Vycik7CVwKKwkJKHgpID0gKF9fdHlwZW9mX18oKihwdHIpKSlfX2d1X3ZhbDsJCQlcCisJfSBlbHNlCQkJCQkJCQlcCisJCV9fZ3VfZXJyID0gLUVGQVVMVDsJCQkJCVwKKwlfX2d1X2VycjsJCQkJCQkJXAorfSkKKyNlbmRpZgogCiAjZGVmaW5lIF9fZ2V0X3VzZXJfYXNtKHgsIGFkZHIsIGVyciwgaW5zbikgXAogKHsgXApAQCAtNTQxLDcgKzUyNCw3IEBACiAJCSIzOlxuXHQiCiAJCSJtb3YubAk0ZiwgJTFcblx0IgogCQkiam1wCUAlMVxuXHQiCi0JCSIgbW92CSU1LCAlMFxuIgorCQkiIG1vdgkjMCwgJTBcbiIKIAkJIi5iYWxpZ24gNFxuIgogCQkiNDoJLmxvbmcgMmJcbiIKIAkJIi5wcmV2aW91c1xuIgpAQCAtNTUwLDI2ICs1MzMsMjAgQEAKIAkJIgkubG9uZyAxYiwzYlxuIgogCQkiLnByZXZpb3VzIgogCQk6ICI9eiIgKHJlcyksICI9JnIiIChfX2R1bW15KQotCQk6ICIwIiAoMCksICJyIiAoX19zKSwgInIiIChfX24pLCAiaSIgKC1FRkFVTFQpCisJCTogIjAiICgwKSwgInIiIChfX3MpLCAiciIgKF9fbikKIAkJOiAidCIpOwogCXJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBfX2lubGluZV9fIGxvbmcgc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzLCBsb25nIG4pCiB7Ci0JaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHMsIG4pKQorCWlmICghX19hZGRyX29rKHMpKQogCQlyZXR1cm4gMDsKIAllbHNlCiAJCXJldHVybiBfX3N0cm5sZW5fdXNlcihzLCBuKTsKIH0KIAotc3RhdGljIF9faW5saW5lX18gbG9uZyBzdHJsZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqcykKLXsKLQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgcywgMCkpCi0JCXJldHVybiAwOwotCWVsc2UKLQkJcmV0dXJuIF9fc3Rybmxlbl91c2VyKHMsIH4wVUwgPj4gMSk7Ci19CisjZGVmaW5lIHN0cmxlbl91c2VyKHN0cikJc3Rybmxlbl91c2VyKHN0ciwgfjBVTCA+PiAxKQogCiAvKgogICogVGhlIGV4Y2VwdGlvbiB0YWJsZSBjb25zaXN0cyBvZiBwYWlycyBvZiBhZGRyZXNzZXM6IHRoZSBmaXJzdCBpcyB0aGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tc2gvdW5pc3RkLmgKaW5kZXggNzZiNTQzMC4uNWQ1ZTlmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvdW5pc3RkLmgKQEAgLTI5MiwyNSArMjkyLDUxIEBACiAjZGVmaW5lIF9fTlJfbXFfZ2V0c2V0YXR0ciAgICAgIChfX05SX21xX29wZW4rNSkKICNkZWZpbmUgX19OUl9rZXhlY19sb2FkCQkyODMKICNkZWZpbmUgX19OUl93YWl0aWQJCTI4NAotI2RlZmluZSBfX05SX2FkZF9rZXkJCTI4NQotI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5CTI4NgotI2RlZmluZSBfX05SX2tleWN0bAkJMjg3Ci0jZGVmaW5lIF9fTlJfaW9wcmlvX3NldAkJMjg4Ci0jZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJMjg5Ci0jZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0CTI5MAotI2RlZmluZSBfX05SX2lub3RpZnlfYWRkX3dhdGNoCTI5MQotI2RlZmluZSBfX05SX2lub3RpZnlfcm1fd2F0Y2gJMjkyCisvKiAjZGVmaW5lIF9fTlJfc3lzX3NldGFsdHJvb3QJMjg1ICovCisjZGVmaW5lIF9fTlJfYWRkX2tleQkJMjg2CisjZGVmaW5lIF9fTlJfcmVxdWVzdF9rZXkJMjg3CisjZGVmaW5lIF9fTlJfa2V5Y3RsCQkyODgKKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0CQkyODkKKyNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0CQkyOTAKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQJMjkxCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9hZGRfd2F0Y2gJMjkyCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9ybV93YXRjaAkyOTMKKyNkZWZpbmUgX19OUl9taWdyYXRlX3BhZ2VzCTI5NAorI2RlZmluZSBfX05SX29wZW5hdAkJMjk1CisjZGVmaW5lIF9fTlJfbWtkaXJhdAkJMjk2CisjZGVmaW5lIF9fTlJfbWtub2RhdAkJMjk3CisjZGVmaW5lIF9fTlJfZmNob3duYXQJCTI5OAorI2RlZmluZSBfX05SX2Z1dGltZXNhdAkJMjk5CisjZGVmaW5lIF9fTlJfbmV3ZnN0YXRhdAkJMzAwCisjZGVmaW5lIF9fTlJfdW5saW5rYXQJCTMwMQorI2RlZmluZSBfX05SX3JlbmFtZWF0CQkzMDIKKyNkZWZpbmUgX19OUl9saW5rYXQJCTMwMworI2RlZmluZSBfX05SX3N5bWxpbmthdAkJMzA0CisjZGVmaW5lIF9fTlJfcmVhZGxpbmthdAkJMzA1CisjZGVmaW5lIF9fTlJfZmNobW9kYXQJCTMwNgorI2RlZmluZSBfX05SX2ZhY2Nlc3NhdAkJMzA3CisjZGVmaW5lIF9fTlJfcHNlbGVjdDYJCTMwOAorI2RlZmluZSBfX05SX3Bwb2xsCQkzMDkKKyNkZWZpbmUgX19OUl91bnNoYXJlCQkzMTAKKyNkZWZpbmUgX19OUl9zZXRfcm9idXN0X2xpc3QJMzExCisjZGVmaW5lIF9fTlJfZ2V0X3JvYnVzdF9saXN0CTMxMgorI2RlZmluZSBfX05SX3NwbGljZQkJMzEzCisjZGVmaW5lIF9fTlJfc3luY19maWxlX3JhbmdlCTMxNAorI2RlZmluZSBfX05SX3RlZQkJMzE1CisjZGVmaW5lIF9fTlJfdm1zcGxpY2UJCTMxNgogCi0KLSNkZWZpbmUgTlJfc3lzY2FsbHMgMjkzCisjZGVmaW5lIE5SX3N5c2NhbGxzIDMxNwogCiAjaWZkZWYgX19LRVJORUxfXwogCi0vKiB1c2VyLXZpc2libGUgZXJyb3IgbnVtYmVycyBhcmUgaW4gdGhlIHJhbmdlIC0xIC0gLTEyNDogc2VlIDxhc20tc2gvZXJybm8uaD4gKi8KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworLyogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC1NQVhfRVJSTk86CisgKiBzZWUgPGFzbS1zaC9lcnJuby5oPiAqLwogCiAjZGVmaW5lIF9fc3lzY2FsbF9yZXR1cm4odHlwZSwgcmVzKSBcCiBkbyB7IFwKLQlpZiAoKHVuc2lnbmVkIGxvbmcpKHJlcykgPj0gKHVuc2lnbmVkIGxvbmcpKC0xMjQpKSB7IFwKKwlpZiAoKHVuc2lnbmVkIGxvbmcpKHJlcykgPj0gKHVuc2lnbmVkIGxvbmcpKC1NQVhfRVJSTk8pKSB7IFwKIAkvKiBBdm9pZCB1c2luZyAicmVzIiB3aGljaCBpcyBkZWNsYXJlZCB0byBiZSBpbiByZWdpc3RlciByMDsgXAogCSAgIGVycm5vIG1pZ2h0IGV4cGFuZCB0byBhIGZ1bmN0aW9uIGNhbGwgYW5kIGNsb2JiZXIgaXQuICAqLyBcCiAJCWludCBfX2VyciA9IC0ocmVzKTsgXApAQCAtNDQ0LDYgKzQ3MCw3IEBACiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdQRU5ESU5HCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdQUk9DTUFTSwogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfUlRfU0lHQUNUSU9OCisjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdTVVNQRU5ECiAKICNpZmRlZiBfX0tFUk5FTF9TWVNDQUxMU19fCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3J0czc3NTFyMmQvdm95YWdlcmd4X3JlZy5oIGIvaW5jbHVkZS9hc20tc2gvdm95YWdlcmd4LmgKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20tc2gvcnRzNzc1MXIyZC92b3lhZ2VyZ3hfcmVnLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLXNoL3ZveWFnZXJneC5oCmluZGV4IGYwMzFiNWQuLjk5YjA4MDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3J0czc3NTFyMmQvdm95YWdlcmd4X3JlZy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3ZveWFnZXJneC5oCkBAIC0xLDUgKzEsNSBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIHZveWFnZXJneF9yZWcuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiB2b3lhZ2VyZ3guaAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC93YXRjaGRvZy5oIGIvaW5jbHVkZS9hc20tc2gvd2F0Y2hkb2cuaAppbmRleCAwOWNhNDE5Li5kMTllYTYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC93YXRjaGRvZy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3dhdGNoZG9nLmgKQEAgLTYyLDcgKzYyLDYgQEAKIAogLyoqCiAgKiAJc2hfd2R0X3JlYWRfY250IC0gUmVhZCBmcm9tIENvdW50ZXIKLSAqCiAgKiAJUmVhZHMgYmFjayB0aGUgV1RDTlQgdmFsdWUuCiAgKi8KIHN0YXRpYyBpbmxpbmUgX191OCBzaF93ZHRfcmVhZF9jbnQodm9pZCkKQEAgLTcyLDcgKzcxLDYgQEAKIAogLyoqCiAgKglzaF93ZHRfd3JpdGVfY250IC0gV3JpdGUgdG8gQ291bnRlcgotICoKICAqCUB2YWw6IFZhbHVlIHRvIHdyaXRlCiAgKgogICoJV3JpdGVzIHRoZSBnaXZlbiB2YWx1ZSBAdmFsIHRvIHRoZSBsb3dlciBieXRlIG9mIHRoZSB0aW1lciBjb3VudGVyLgpAQCAtOTUsNyArOTMsNiBAQAogCiAvKioKICAqIAlzaF93ZHRfd3JpdGVfY3NyIC0gV3JpdGUgdG8gQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIKLSAqCiAgKiAJQHZhbDogVmFsdWUgdG8gd3JpdGUKICAqCiAgKiAJV3JpdGVzIHRoZSBnaXZlbiB2YWx1ZSBAdmFsIHRvIHRoZSBsb3dlciBieXRlIG9mIHRoZSBjb250cm9sL3N0YXR1cwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2g2NC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXNoNjQvdW5pc3RkLmgKaW5kZXggOWExNTkwZi4uYzExMzU2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2g2NC91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1zaDY0L3VuaXN0ZC5oCkBAIC0zNDcsOCArMzQ3LDEwIEBACiAjaWZkZWYgX19LRVJORUxfXyAKIAogI2RlZmluZSBOUl9zeXNjYWxscyAzMjEKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAotLyogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC0xMjU6IHNlZSA8YXNtLXNoNjQvZXJybm8uaD4gKi8KKy8qIHVzZXItdmlzaWJsZSBlcnJvciBudW1iZXJzIGFyZSBpbiB0aGUgcmFuZ2UgLTEgLSAtTUFYX0VSUk5POgorICogc2VlIDxhc20tc2g2NC9lcnJuby5oPiAqLwogCiAjZGVmaW5lIF9fc3lzY2FsbF9yZXR1cm4odHlwZSwgcmVzKSBcCiBkbyB7IFwKQEAgLTM1OCw3ICszNjAsNyBAQAogCSoqICAgICAgIGxpZmUgZWFzaWVyIGluIHRoZSBzeXN0ZW0gY2FsbCBlcGlsb2d1ZSAoc2VlIGVudHJ5LlMpICAgICAgXAogCSovCQkJCQkJCQkgICAgXAogICAgICAgICByZWdpc3RlciB1bnNpZ25lZCBsb25nIF9fc3IyIF9fYXNtX18gKCJyMiIpID0gcmVzOwkJICAgIFwKLQlpZiAoKHVuc2lnbmVkIGxvbmcpKHJlcykgPj0gKHVuc2lnbmVkIGxvbmcpKC0xMjUpKSB7IFwKKwlpZiAoKHVuc2lnbmVkIGxvbmcpKHJlcykgPj0gKHVuc2lnbmVkIGxvbmcpKC1NQVhfRVJSTk8pKSB7CSAgICBcCiAJCWVycm5vID0gLShyZXMpOwkJCQkJCSAgICBcCiAJCV9fc3IyID0gLTE7IAkJCQkJCSAgICBcCiAJfSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9hbHRlcm5hdGl2ZS1hc20uaSBiL2luY2x1ZGUvYXNtLXVtL2FsdGVybmF0aXZlLWFzbS5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZTlmYWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS11bS9hbHRlcm5hdGl2ZS1hc20uaQpAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX19VTV9BTFRFUk5BVElWRV9BU01fSQorI2RlZmluZSBfX1VNX0FMVEVSTkFUSVZFX0FTTV9JCisKKyNpbmNsdWRlICJhc20vYXJjaC9hbHRlcm5hdGl2ZS1hc20uaSIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9mcmFtZS5pIGIvaW5jbHVkZS9hc20tdW0vZnJhbWUuaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQ1ZGNhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20tdW0vZnJhbWUuaQpAQCAtMCwwICsxLDYgQEAKKyNpZm5kZWYgX19VTV9GUkFNRV9JCisjZGVmaW5lIF9fVU1fRlJBTUVfSQorCisjaW5jbHVkZSAiYXNtL2FyY2gvZnJhbWUuaSIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9wcm9jZXNzb3ItZ2VuZXJpYy5oIGIvaW5jbHVkZS9hc20tdW0vcHJvY2Vzc29yLWdlbmVyaWMuaAppbmRleCBhZmE0ZmUxLi5kOTliYmRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS11bS9wcm9jZXNzb3ItZ2VuZXJpYy5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL3Byb2Nlc3Nvci1nZW5lcmljLmgKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlICJhc20vcHRyYWNlLmgiCiAjaW5jbHVkZSAiY2hvb3NlLW1vZGUuaCIKICNpbmNsdWRlICJyZWdpc3RlcnMuaCIKKyNpbmNsdWRlICJzeXNkZXAvYXJjaHNldGptcC5oIgogCiBzdHJ1Y3QgbW1fc3RydWN0OwogCkBAIC00Myw4ICs0NCw3IEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTU9ERV9TS0FTCiAJCXN0cnVjdCB7Ci0JCQl2b2lkICpzd2l0Y2hfYnVmOwotCQkJdm9pZCAqZm9ya19idWY7CisJCQlqbXBfYnVmIHN3aXRjaF9idWY7CiAJCQlpbnQgbW1fY291bnQ7CiAJCX0gc2thczsKICNlbmRpZgpAQCAtMTM4LDcgKzEzOCw3IEBACiAKICNpZmRlZiBDT05GSUdfTU9ERV9TS0FTCiAjZGVmaW5lIEtTVEtfUkVHKHRzaywgcmVnKSBcCi0JZ2V0X3RocmVhZF9yZWcocmVnLCB0c2stPnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZikKKwlnZXRfdGhyZWFkX3JlZyhyZWcsICZ0c2stPnRocmVhZC5tb2RlLnNrYXMuc3dpdGNoX2J1ZikKICNlbHNlCiAjZGVmaW5lIEtTVEtfUkVHKHRzaywgcmVnKSAoMHhiYWRiYWJlKQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS11bS9wdHJhY2UteDg2XzY0LmggYi9pbmNsdWRlL2FzbS11bS9wdHJhY2UteDg2XzY0LmgKaW5kZXggMjA3NDQ4My4uMDNiNGFmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tdW0vcHRyYWNlLXg4Nl82NC5oCisrKyBiL2luY2x1ZGUvYXNtLXVtL3B0cmFjZS14ODZfNjQuaApAQCAtMTYsMTIgKzE2LDE1IEBACiAKICNkZWZpbmUgSE9TVF9BVURJVF9BUkNIIEFVRElUX0FSQ0hfWDg2XzY0CiAKKy8qIEFsc28gZGVmaW5lZCBpbiBzeXNkZXAvcHRyYWNlLmgsIHNvIG1heSBhbHJlYWR5IGJlIGRlZmluZWQuICovCisjaWZuZGVmIEZTX0JBU0UKICNkZWZpbmUgRlNfQkFTRSAoMjEgKiBzaXplb2YodW5zaWduZWQgbG9uZykpCiAjZGVmaW5lIEdTX0JBU0UgKDIyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQogI2RlZmluZSBEUyAoMjMgKiBzaXplb2YodW5zaWduZWQgbG9uZykpCiAjZGVmaW5lIEVTICgyNCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkKICNkZWZpbmUgRlMgKDI1ICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQogI2RlZmluZSBHUyAoMjYgKiBzaXplb2YodW5zaWduZWQgbG9uZykpCisjZW5kaWYKIAogI2RlZmluZSBQVF9SRUdTX1JCWChyKSBVUFRfUkJYKCYociktPnJlZ3MpCiAjZGVmaW5lIFBUX1JFR1NfUkNYKHIpIFVQVF9SQ1goJihyKS0+cmVncykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXY4NTAvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS12ODUwL3VuaXN0ZC5oCmluZGV4IGJjYjQ0YmYuLjU1MmI3YzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXY4NTAvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tdjg1MC91bmlzdGQuaApAQCAtMjM4LDEyICsyMzgsMTMgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxhc20vY2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykJCQkJCSAgICAgIFwKICAgZG8gewkJCQkJCQkJCSAgICAgIFwKLQkgIC8qIHVzZXItdmlzaWJsZSBlcnJvciBudW1iZXJzIGFyZSBpbiB0aGUgcmFuZ2UgLTEgLSAtMTI0OgkgICAgICBcCisJICAvKiB1c2VyLXZpc2libGUgZXJyb3IgbnVtYmVycyBhcmUgaW4gdGhlIHJhbmdlIC0xIC0gLU1BWF9FUlJOTzogICAgICBcCiAJICAgICBzZWUgPGFzbS12ODUwL2Vycm5vLmg+ICovCQkJCQkgICAgICBcCi0JICBpZiAoX19idWlsdGluX2V4cGVjdCAoKHVuc2lnbmVkIGxvbmcpKHJlcykgPj0gKHVuc2lnbmVkIGxvbmcpKC0xMjUpLCAwKSkgeyBcCisJICBpZiAoX19idWlsdGluX2V4cGVjdCAoKHVuc2lnbmVkIGxvbmcpKHJlcykgPj0gKHVuc2lnbmVkIGxvbmcpKC1NQVhfRVJSTk8pLCAwKSkgeyBcCiAJCSAgZXJybm8gPSAtKHJlcyk7CQkJCQkgICAgICBcCiAJCSAgcmVzID0gLTE7CQkJCQkJICAgICAgXAogCSAgfQkJCQkJCQkJICAgICAgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hY3BpLmgKaW5kZXggMmM5NWEzMS4uZWQ1OWFhNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvYWNwaS5oCkBAIC0xNTUsOCArMTU1LDYgQEAKIAogI2VuZGlmIC8qQ09ORklHX0FDUElfU0xFRVAqLwogCi0jZGVmaW5lIGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCBib290X2NwdV9pZAotCiBleHRlcm4gaW50IGFjcGlfZGlzYWJsZWQ7CiBleHRlcm4gaW50IGFjcGlfcGNpX2Rpc2FibGVkOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvYWx0ZXJuYXRpdmUtYXNtLmkgYi9pbmNsdWRlL2FzbS14ODZfNjQvYWx0ZXJuYXRpdmUtYXNtLmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwNDFmNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hbHRlcm5hdGl2ZS1hc20uaQpAQCAtMCwwICsxLDE0IEBACisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfU01QCisJLm1hY3JvIExPQ0tfUFJFRklYCisxOglsb2NrCisJLnNlY3Rpb24gLnNtcF9sb2NrcywiYSIKKwkuYWxpZ24gOAorCS5xdWFkIDFiCisJLnByZXZpb3VzCisJLmVuZG0KKyNlbHNlCisJLm1hY3JvIExPQ0tfUFJFRklYCisJLmVuZG0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2FwaWMuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hcGljLmgKaW5kZXggOWM5NmEwYS4uOWU2NmQzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvYXBpYy5oCkBAIC0xNyw2ICsxNyw4IEBACiAKIGV4dGVybiBpbnQgYXBpY192ZXJib3NpdHk7CiBleHRlcm4gaW50IGFwaWNfcnVuc19tYWluX3RpbWVyOworZXh0ZXJuIGludCBpb2FwaWNfZm9yY2U7CitleHRlcm4gaW50IGFwaWNfbWFwcGVkOwogCiAvKgogICogRGVmaW5lIHRoZSBkZWZhdWx0IGxldmVsIG9mIG91dHB1dCB0byBiZSB2ZXJ5IGxpdHRsZQpAQCAtMjksOCArMzEsNiBAQAogCQkJcHJpbnRrKHMsICMjYSk7ICAgIFwKIAl9IHdoaWxlICgwKQogCi0jaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCi0KIHN0cnVjdCBwdF9yZWdzOwogCiAvKgpAQCAtOTUsMTcgKzk1LDEyIEBACiAjZGVmaW5lIEs4X0FQSUNfRVhUX0lOVF9NU0dfRVhUIDB4NwogI2RlZmluZSBLOF9BUElDX0VYVF9MVlRfRU5UUllfVEhSRVNIT0xEICAgIDAKIAotZXh0ZXJuIGludCBkaXNhYmxlX3RpbWVyX3Bpbl8xOwotCi0KIHZvaWQgc21wX3NlbmRfdGltZXJfYnJvYWRjYXN0X2lwaSh2b2lkKTsKIHZvaWQgc3dpdGNoX0FQSUNfdGltZXJfdG9faXBpKHZvaWQgKmNwdW1hc2spOwogdm9pZCBzd2l0Y2hfaXBpX3RvX0FQSUNfdGltZXIodm9pZCAqY3B1bWFzayk7CiAKICNkZWZpbmUgQVJDSF9BUElDVElNRVJfU1RPUFNfT05fQzMJMQogCi0jZW5kaWYgLyogQ09ORklHX1g4Nl9MT0NBTF9BUElDICovCi0KIGV4dGVybiB1bnNpZ25lZCBib290X2NwdV9pZDsKIAogI2VuZGlmIC8qIF9fQVNNX0FQSUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2JpdG9wcy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2JpdG9wcy5oCmluZGV4IGY3YmE1N2IuLjViNTM1ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9iaXRvcHMuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvYml0b3BzLmgKQEAgLTM5OSw2ICszOTksOCBAQAogCXJldHVybiByKzE7CiB9CiAKKyNkZWZpbmUgQVJDSF9IQVNfRkFTVF9NVUxUSVBMSUVSIDEKKwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9od2VpZ2h0Lmg+CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvY2FsZ2FyeS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2NhbGdhcnkuaAppbmRleCA0ZTM5MTk1Li42YjkzZjVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvY2FsZ2FyeS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9jYWxnYXJ5LmgKQEAgLTI0LDcgKzI0LDYgQEAKICNpZm5kZWYgX0FTTV9YODZfNjRfQ0FMR0FSWV9ICiAjZGVmaW5lIF9BU01fWDg2XzY0X0NBTEdBUllfSAogCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgpAQCAtMzQsMTIgKzMzLDEyIEBACiAJdW5zaWduZWQgbG9uZyAgaXRfYmFzZTsgICAgICAvKiBtYXBwZWQgYWRkcmVzcyBvZiB0Y2UgdGFibGUgKi8KIAl1bnNpZ25lZCBsb25nICBpdF9oaW50OyAgICAgIC8qIEhpbnQgZm9yIG5leHQgYWxsb2MgKi8KIAl1bnNpZ25lZCBsb25nICppdF9tYXA7ICAgICAgIC8qIEEgc2ltcGxlIGFsbG9jYXRpb24gYml0bWFwIGZvciBub3cgKi8KKwl2b2lkIF9faW9tZW0gICpiYmFyOyAgICAgICAgIC8qIEJyaWRnZSBCQVIgKi8KKwl1NjQJICAgICAgIHRhcl92YWw7ICAgICAgLyogVGFibGUgQWRkcmVzcyBSZWdpc3RlciAqLworCXN0cnVjdCB0aW1lcl9saXN0IHdhdGNoZG9nX3RpbWVyOwogCXNwaW5sb2NrX3QgICAgIGl0X2xvY2s7ICAgICAgLyogUHJvdGVjdHMgaXRfbWFwICovCiAJdW5zaWduZWQgaW50ICAgaXRfc2l6ZTsgICAgICAvKiBTaXplIG9mIGlvbW11IHRhYmxlIGluIGVudHJpZXMgKi8KIAl1bnNpZ25lZCBjaGFyICBpdF9idXNubzsgICAgIC8qIEJ1cyBudW1iZXIgdGhpcyB0YWJsZSBiZWxvbmdzIHRvICovCi0Jdm9pZCBfX2lvbWVtICAqYmJhcjsKLQl1NjQJICAgICAgIHRhcl92YWw7Ci0Jc3RydWN0IHRpbWVyX2xpc3Qgd2F0Y2hkb2dfdGltZXI7CiB9OwogCiAjZGVmaW5lIFRDRV9UQUJMRV9TSVpFX1VOU1BFQ0lGSUVECX4wCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvZHdhcmYyLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvZHdhcmYyLmgKaW5kZXggMDc0NGRiNy4uZWVkYzA4NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2R3YXJmMi5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9kd2FyZjIuaApAQCAtMTMsNyArMTMsNyBAQAogICAgYXdheSBmb3Igb2xkZXIgdmVyc2lvbi4gCiAgKi8KIAotI2lmZGVmIENPTkZJR19VTldJTkRfSU5GTworI2lmZGVmIENPTkZJR19BU19DRkkKIAogI2RlZmluZSBDRklfU1RBUlRQUk9DIC5jZmlfc3RhcnRwcm9jCiAjZGVmaW5lIENGSV9FTkRQUk9DIC5jZmlfZW5kcHJvYwpAQCAtMjgsNiArMjgsMTEgQEAKICNkZWZpbmUgQ0ZJX1JFTUVNQkVSX1NUQVRFIC5jZmlfcmVtZW1iZXJfc3RhdGUKICNkZWZpbmUgQ0ZJX1JFU1RPUkVfU1RBVEUgLmNmaV9yZXN0b3JlX3N0YXRlCiAjZGVmaW5lIENGSV9VTkRFRklORUQgLmNmaV91bmRlZmluZWQKKyNpZmRlZiBDT05GSUdfQVNfQ0ZJX1NJR05BTF9GUkFNRQorI2RlZmluZSBDRklfU0lHTkFMX0ZSQU1FIC5jZmlfc2lnbmFsX2ZyYW1lCisjZWxzZQorI2RlZmluZSBDRklfU0lHTkFMX0ZSQU1FCisjZW5kaWYKIAogI2Vsc2UKIApAQCAtNDUsNiArNTAsNyBAQAogI2RlZmluZSBDRklfUkVNRU1CRVJfU1RBVEUJIwogI2RlZmluZSBDRklfUkVTVE9SRV9TVEFURQkjCiAjZGVmaW5lIENGSV9VTkRFRklORUQJIworI2RlZmluZSBDRklfU0lHTkFMX0ZSQU1FCSMKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9lODIwLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvZTgyMC5oCmluZGV4IGY2NTY3NDguLmZhMjA4NjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9lODIwLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2U4MjAuaApAQCAtMTksMTMgKzE5LDkgQEAKIAogI2RlZmluZSBFODIwX1JBTQkxCiAjZGVmaW5lIEU4MjBfUkVTRVJWRUQJMgotI2RlZmluZSBFODIwX0FDUEkJMyAvKiB1c2FibGUgYXMgUkFNIG9uY2UgQUNQSSB0YWJsZXMgaGF2ZSBiZWVuIHJlYWQgKi8KKyNkZWZpbmUgRTgyMF9BQ1BJCTMKICNkZWZpbmUgRTgyMF9OVlMJNAogCi0jZGVmaW5lIEhJR0hfTUVNT1JZCSgxMDI0KjEwMjQpCi0KLSNkZWZpbmUgTE9XTUVNU0laRSgpCSgweDlmMDAwKQotCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogc3RydWN0IGU4MjBlbnRyeSB7CiAJdTY0IGFkZHI7CS8qIHN0YXJ0IG9mIG1lbW9yeSBzZWdtZW50ICovCkBAIC01MSwxMyArNDcsMTEgQEAKIGV4dGVybiBpbnQgZTgyMF9hbnlfbWFwcGVkKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCB1bnNpZ25lZCB0eXBlKTsKIGV4dGVybiBpbnQgZTgyMF9hbGxfbWFwcGVkKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCB1bnNpZ25lZCB0eXBlKTsKIAotZXh0ZXJuIHZvaWQgZTgyMF9ib290bWVtX2ZyZWUocGdfZGF0YV90ICpwZ2RhdCwgdW5zaWduZWQgbG9uZyBzdGFydCx1bnNpZ25lZCBsb25nIGVuZCk7CiBleHRlcm4gdm9pZCBlODIwX3NldHVwX2dhcCh2b2lkKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGU4MjBfaG9sZV9zaXplKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIGVuZF9wZm4pOworZXh0ZXJuIHZvaWQgZTgyMF9yZWdpc3Rlcl9hY3RpdmVfcmVnaW9ucyhpbnQgbmlkLAorCQkJCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pOwogCi1leHRlcm4gdm9pZCBfX2luaXQgcGFyc2VfbWVtb3B0KGNoYXIgKnAsIGNoYXIgKiplbmQpOwotZXh0ZXJuIHZvaWQgX19pbml0IHBhcnNlX21lbW1hcG9wdChjaGFyICpwLCBjaGFyICoqZW5kKTsKK2V4dGVybiB2b2lkIGZpbmlzaF9lODIwX3BhcnNpbmcodm9pZCk7CiAKIGV4dGVybiBzdHJ1Y3QgZTgyMG1hcCBlODIwOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvZml4bWFwLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvZml4bWFwLmgKaW5kZXggMGI0ZmZiZC4uMWI2MjBkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2ZpeG1hcC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9maXhtYXAuaApAQCAtMzcsMTMgKzM3LDkgQEAKIAlWU1lTQ0FMTF9GSVJTVF9QQUdFID0gVlNZU0NBTExfTEFTVF9QQUdFICsgKChWU1lTQ0FMTF9FTkQtVlNZU0NBTExfU1RBUlQpID4+IFBBR0VfU0hJRlQpIC0gMSwKIAlWU1lTQ0FMTF9IUEVULAogCUZJWF9IUEVUX0JBU0UsCi0jaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAJRklYX0FQSUNfQkFTRSwJLyogbG9jYWwgKENQVSkgQVBJQykgLS0gcmVxdWlyZWQgZm9yIFNNUCBvciBub3QgKi8KLSNlbmRpZgotI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogCUZJWF9JT19BUElDX0JBU0VfMCwKIAlGSVhfSU9fQVBJQ19CQVNFX0VORCA9IEZJWF9JT19BUElDX0JBU0VfMCArIE1BWF9JT19BUElDUy0xLAotI2VuZGlmCiAJX19lbmRfb2ZfZml4ZWRfYWRkcmVzc2VzCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvZ2VuYXBpYy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2dlbmFwaWMuaAppbmRleCA1MGIzOGU3Li44MWU3MTQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvZ2VuYXBpYy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9nZW5hcGljLmgKQEAgLTE2LDcgKzE2LDYgQEAKIAljaGFyICpuYW1lOwogCXUzMiBpbnRfZGVsaXZlcnlfbW9kZTsKIAl1MzIgaW50X2Rlc3RfbW9kZTsKLQl1MzIgaW50X2RlbGl2ZXJ5X2Rlc3Q7CS8qIGZvciBxdWljayBJUElzICovCiAJaW50ICgqYXBpY19pZF9yZWdpc3RlcmVkKSh2b2lkKTsKIAljcHVtYXNrX3QgKCp0YXJnZXRfY3B1cykodm9pZCk7CiAJdm9pZCAoKmluaXRfYXBpY19sZHIpKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2kzODcuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pMzg3LmgKaW5kZXggY2JhOGEzYi4uMDIxN2I3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2kzODcuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvaTM4Ny5oCkBAIC0yNCw2ICsyNCw3IEBACiBleHRlcm4gdm9pZCBteGNzcl9mZWF0dXJlX21hc2tfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIGluaXRfZnB1KHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpOwogZXh0ZXJuIGludCBzYXZlX2kzODcoc3RydWN0IF9mcHN0YXRlIF9fdXNlciAqYnVmKTsKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgbWF0aF9zdGF0ZV9yZXN0b3JlKHZvaWQpOwogCiAvKgogICogRlBVIGxhenkgc3RhdGUgc2F2ZSBoYW5kbGluZy4uLgpAQCAtMzEsNyArMzIsOSBAQAogCiAjZGVmaW5lIHVubGF6eV9mcHUodHNrKSBkbyB7IFwKIAlpZiAodGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJiBUU19VU0VERlBVKSBcCi0JCXNhdmVfaW5pdF9mcHUodHNrKTsgXAorCQlzYXZlX2luaXRfZnB1KHRzayk7IAkJCVwKKwllbHNlCQkJCQkJXAorCQl0c2stPmZwdV9jb3VudGVyID0gMDsJCQlcCiB9IHdoaWxlICgwKQogCiAvKiBJZ25vcmUgZGVsYXllZCBleGNlcHRpb25zIGZyb20gdXNlciBzcGFjZSAqLwpAQCAtMTM0LDggKzEzNyw4IEBACiAjZWxzZQogCQkgICAgIDogW2Z4XSAiY2RhU0RiIiAoZngpLCAiMCIgKDApKTsKICNlbmRpZgotCWlmICh1bmxpa2VseShlcnIpKQotCQlfX2NsZWFyX3VzZXIoZngsIHNpemVvZihzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0KSk7CisJaWYgKHVubGlrZWx5KGVycikgJiYgX19jbGVhcl91c2VyKGZ4LCBzaXplb2Yoc3RydWN0IGkzODdfZnhzYXZlX3N0cnVjdCkpKQorCQllcnIgPSAtRUZBVUxUOwogCS8qIE5vIG5lZWQgdG8gY2xlYXIgaGVyZSBiZWNhdXNlIHRoZSBjYWxsZXIgY2xlYXJzIFVTRURfTUFUSCAqLwogCXJldHVybiBlcnI7CiB9IApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2ludGVsX2FyY2hfcGVyZm1vbi5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2ludGVsX2FyY2hfcGVyZm1vbi5oCmluZGV4IDU5YzM5NjQuLjg2MzMzMzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9pbnRlbF9hcmNoX3BlcmZtb24uaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvaW50ZWxfYXJjaF9wZXJmbW9uLmgKQEAgLTE0LDYgKzE0LDE4IEBACiAKICNkZWZpbmUgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1NFTAkoMHgzYykKICNkZWZpbmUgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1VNQVNLCSgweDAwIDw8IDgpCi0jZGVmaW5lIEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19QUkVTRU5UICgxIDw8IDApCisjZGVmaW5lIEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19JTkRFWCAoMCkKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1BSRVNFTlQgXAorCQkJCSgxIDw8IChBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfSU5ERVgpKQorCit1bmlvbiBjcHVpZDEwX2VheCB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IHZlcnNpb25faWQ6ODsKKwkJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczo4OworCQl1bnNpZ25lZCBpbnQgYml0X3dpZHRoOjg7CisJCXVuc2lnbmVkIGludCBtYXNrX2xlbmd0aDo4OworCX0gc3BsaXQ7CisJdW5zaWduZWQgaW50IGZ1bGw7Cit9OwogCiAjZW5kaWYJLyogWDg2XzY0X0lOVEVMX0FSQ0hfUEVSRk1PTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaW9fYXBpYy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2lvX2FwaWMuaAppbmRleCBmYjdhMDkwLi41ZDFiNWM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvaW9fYXBpYy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9pb19hcGljLmgKQEAgLTEwLDggKzEwLDYgQEAKICAqIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCBJbmdvIE1vbG5hcgogICovCiAKLSNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKLQogI2lmZGVmIENPTkZJR19QQ0lfTVNJCiBzdGF0aWMgaW5saW5lIGludCB1c2VfcGNpX3ZlY3Rvcih2b2lkKQl7cmV0dXJuIDE7fQogc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfZWRnZV9pb2FwaWNfdmVjdG9yKHVuc2lnbmVkIGludCB2ZWN0b3IpIHsgfQpAQCAtMjA5LDEwICsyMDcsNiBAQAogCiBleHRlcm4gaW50IHNpc19hcGljX2J1ZzsgLyogZHVtbXkgKi8gCiAKLSNlbHNlICAvKiAhQ09ORklHX1g4Nl9JT19BUElDICovCi0jZGVmaW5lIGlvX2FwaWNfYXNzaWduX3BjaV9pcnFzIDAKLSNlbmRpZgotCiBleHRlcm4gaW50IGFzc2lnbl9pcnFfdmVjdG9yKGludCBpcnEpOwogCiB2b2lkIGVuYWJsZV9OTUlfdGhyb3VnaF9MVlQwICh2b2lkICogZHVtbXkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2lycS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2lycS5oCmluZGV4IDlkYjVhMWIuLjQzNDY5ZDhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2lycS5oCkBAIC00NCw5ICs0NCw3IEBACiAJcmV0dXJuICgoaXJxID09IDIpID8gOSA6IGlycSk7CiB9CiAKLSNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKICNkZWZpbmUgQVJDSF9IQVNfTk1JX1dBVENIRE9HCQkvKiBTZWUgaW5jbHVkZS9saW51eC9ubWkuaCAqLwotI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQva2V4ZWMuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9rZXhlYy5oCmluZGV4IGM1NjRiYWUuLjVmYWI5NTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9rZXhlYy5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9rZXhlYy5oCkBAIC0xLDYgKzEsMjcgQEAKICNpZm5kZWYgX1g4Nl82NF9LRVhFQ19ICiAjZGVmaW5lIF9YODZfNjRfS0VYRUNfSAogCisjZGVmaW5lIFBBX0NPTlRST0xfUEFHRSAgMAorI2RlZmluZSBWQV9DT05UUk9MX1BBR0UgIDEKKyNkZWZpbmUgUEFfUEdEICAgICAgICAgICAyCisjZGVmaW5lIFZBX1BHRCAgICAgICAgICAgMworI2RlZmluZSBQQV9QVURfMCAgICAgICAgIDQKKyNkZWZpbmUgVkFfUFVEXzAgICAgICAgICA1CisjZGVmaW5lIFBBX1BNRF8wICAgICAgICAgNgorI2RlZmluZSBWQV9QTURfMCAgICAgICAgIDcKKyNkZWZpbmUgUEFfUFRFXzAgICAgICAgICA4CisjZGVmaW5lIFZBX1BURV8wICAgICAgICAgOQorI2RlZmluZSBQQV9QVURfMSAgICAgICAgIDEwCisjZGVmaW5lIFZBX1BVRF8xICAgICAgICAgMTEKKyNkZWZpbmUgUEFfUE1EXzEgICAgICAgICAxMgorI2RlZmluZSBWQV9QTURfMSAgICAgICAgIDEzCisjZGVmaW5lIFBBX1BURV8xICAgICAgICAgMTQKKyNkZWZpbmUgVkFfUFRFXzEgICAgICAgICAxNQorI2RlZmluZSBQQV9UQUJMRV9QQUdFICAgIDE2CisjZGVmaW5lIFBBR0VTX05SICAgICAgICAgMTcKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKwogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTY0LDQgKzg1LDEyIEBACiAJCW5ld3JlZ3MtPnJpcCA9ICh1bnNpZ25lZCBsb25nKWN1cnJlbnRfdGV4dF9hZGRyKCk7CiAJfQogfQorCitOT1JFVF9UWVBFIHZvaWQKK3JlbG9jYXRlX2tlcm5lbCh1bnNpZ25lZCBsb25nIGluZGlyZWN0aW9uX3BhZ2UsCisJCXVuc2lnbmVkIGxvbmcgcGFnZV9saXN0LAorCQl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHJlc3MpIEFUVFJJQl9OT1JFVDsKKworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCiAjZW5kaWYgLyogX1g4Nl82NF9LRVhFQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvbGlua2FnZS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2xpbmthZ2UuaAppbmRleCAyOTFjMmQwLi5iNWYzOWQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvbGlua2FnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9saW5rYWdlLmgKQEAgLTEsNiArMSw2IEBACiAjaWZuZGVmIF9fQVNNX0xJTktBR0VfSAogI2RlZmluZSBfX0FTTV9MSU5LQUdFX0gKIAotLyogTm90aGluZyB0byBzZWUgaGVyZS4uLiAqLworI2RlZmluZSBfX0FMSUdOIC5wMmFsaWduIDQsLDE1CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L21hY2hfYXBpYy5oIGIvaW5jbHVkZS9hc20teDg2XzY0L21hY2hfYXBpYy5oCmluZGV4IDBhY2VhNDQuLmQzMzQyMjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9tYWNoX2FwaWMuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvbWFjaF9hcGljLmgKQEAgLTE2LDcgKzE2LDYgQEAKIAogI2RlZmluZSBJTlRfREVMSVZFUllfTU9ERSAoZ2VuYXBpYy0+aW50X2RlbGl2ZXJ5X21vZGUpCiAjZGVmaW5lIElOVF9ERVNUX01PREUgKGdlbmFwaWMtPmludF9kZXN0X21vZGUpCi0jZGVmaW5lIElOVF9ERUxJVkVSWV9ERVNUIChnZW5hcGljLT5pbnRfZGVsaXZlcnlfZGVzdCkKICNkZWZpbmUgVEFSR0VUX0NQVVMJICAoZ2VuYXBpYy0+dGFyZ2V0X2NwdXMoKSkKICNkZWZpbmUgYXBpY19pZF9yZWdpc3RlcmVkIChnZW5hcGljLT5hcGljX2lkX3JlZ2lzdGVyZWQpCiAjZGVmaW5lIGluaXRfYXBpY19sZHIgKGdlbmFwaWMtPmluaXRfYXBpY19sZHIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvbWNlLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvbWNlLmgKaW5kZXggZDEzNjg3ZC4uNWExMTE0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L21jZS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9tY2UuaApAQCAtOTksNiArOTksOCBAQAogfQogI2VuZGlmCiAKK3ZvaWQgbWNlX2xvZ190aGVybV90aHJvdF9ldmVudCh1bnNpZ25lZCBpbnQgY3B1LCBfX3U2NCBzdGF0dXMpOworCiBleHRlcm4gYXRvbWljX3QgbWNlX2VudHJ5OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9tbXguaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9tbXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZiNzFkYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvbW14LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jaWZuZGVmIF9BU01fTU1YX0gKLSNkZWZpbmUgX0FTTV9NTVhfSAotCi0vKgotICoJTU1YIDNEbm93ISBoZWxwZXIgb3BlcmF0aW9ucwotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotIAotZXh0ZXJuIHZvaWQgKl9tbXhfbWVtY3B5KHZvaWQgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBzaXplX3Qgc2l6ZSk7Ci1leHRlcm4gdm9pZCBtbXhfY2xlYXJfcGFnZSh2b2lkICpwYWdlKTsKLWV4dGVybiB2b2lkIG1teF9jb3B5X3BhZ2Uodm9pZCAqdG8sIHZvaWQgKmZyb20pOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9tcHNwZWMuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9tcHNwZWMuaAppbmRleCAxNGZjM2RkLi4wMTdmZGRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvbXBzcGVjLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L21wc3BlYy5oCkBAIC0xNTksMTMgKzE1OSw3IEBACiAjZGVmaW5lIE1BWF9NUF9CVVNTRVMgMjU2CiAvKiBFYWNoIFBDSSBzbG90IG1heSBiZSBhIGNvbWJvIGNhcmQgd2l0aCBpdHMgb3duIGJ1cy4gIDQgSVJRIHBpbnMgcGVyIHNsb3QuICovCiAjZGVmaW5lIE1BWF9JUlFfU09VUkNFUyAoTUFYX01QX0JVU1NFUyAqIDQpCi1lbnVtIG1wX2J1c3R5cGUgewotCU1QX0JVU19JU0EgPSAxLAotCU1QX0JVU19FSVNBLAotCU1QX0JVU19QQ0ksCi0JTVBfQlVTX01DQQotfTsKLWV4dGVybiB1bnNpZ25lZCBjaGFyIG1wX2J1c19pZF90b190eXBlIFtNQVhfTVBfQlVTU0VTXTsKK2V4dGVybiBERUNMQVJFX0JJVE1BUChtcF9idXNfbm90X3BjaSwgTUFYX01QX0JVU1NFUyk7CiBleHRlcm4gaW50IG1wX2J1c19pZF90b19wY2lfYnVzIFtNQVhfTVBfQlVTU0VTXTsKIAogZXh0ZXJuIHVuc2lnbmVkIGludCBib290X2NwdV9waHlzaWNhbF9hcGljaWQ7CkBAIC0xNzgsMTggKzE3MiwxNSBAQAogZXh0ZXJuIHN0cnVjdCBtcGNfY29uZmlnX2ludHNyYyBtcF9pcnFzIFtNQVhfSVJRX1NPVVJDRVNdOwogZXh0ZXJuIGludCBtcGNfZGVmYXVsdF90eXBlOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbXBfbGFwaWNfYWRkcjsKLWV4dGVybiBpbnQgcGljX21vZGU7CiAKICNpZmRlZiBDT05GSUdfQUNQSQogZXh0ZXJuIHZvaWQgbXBfcmVnaXN0ZXJfbGFwaWMgKHU4IGlkLCB1OCBlbmFibGVkKTsKIGV4dGVybiB2b2lkIG1wX3JlZ2lzdGVyX2xhcGljX2FkZHJlc3MgKHU2NCBhZGRyZXNzKTsKIAotI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogZXh0ZXJuIHZvaWQgbXBfcmVnaXN0ZXJfaW9hcGljICh1OCBpZCwgdTMyIGFkZHJlc3MsIHUzMiBnc2lfYmFzZSk7CiBleHRlcm4gdm9pZCBtcF9vdmVycmlkZV9sZWdhY3lfaXJxICh1OCBidXNfaXJxLCB1OCBwb2xhcml0eSwgdTggdHJpZ2dlciwgdTMyIGdzaSk7CiBleHRlcm4gdm9pZCBtcF9jb25maWdfYWNwaV9sZWdhY3lfaXJxcyAodm9pZCk7CiBleHRlcm4gaW50IG1wX3JlZ2lzdGVyX2dzaSAodTMyIGdzaSwgaW50IHRyaWdnZXJpbmcsIGludCBwb2xhcml0eSk7Ci0jZW5kaWYgLypDT05GSUdfWDg2X0lPX0FQSUMqLwogI2VuZGlmCiAKIGV4dGVybiBpbnQgdXNpbmdfYXBpY190aW1lcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9tc3IuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9tc3IuaAppbmRleCAxMGY4YjUxLi4zN2UxOTQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvbXNyLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L21zci5oCkBAIC02NiwxNCArNjYsMjUgQEAKICNkZWZpbmUgcmR0c2NsKGxvdykgXAogICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInJkdHNjIiA6ICI9YSIgKGxvdykgOiA6ICJlZHgiKQogCisjZGVmaW5lIHJkdHNjcChsb3csaGlnaCxhdXgpIFwKKyAgICAgYXNtIHZvbGF0aWxlICgiLmJ5dGUgMHgwZiwweDAxLDB4ZjkiIDogIj1hIiAobG93KSwgIj1kIiAoaGlnaCksICI9YyIgKGF1eCkpCisKICNkZWZpbmUgcmR0c2NsbCh2YWwpIGRvIHsgXAogICAgICB1bnNpZ25lZCBpbnQgX19hLF9fZDsgXAogICAgICBhc20gdm9sYXRpbGUoInJkdHNjIiA6ICI9YSIgKF9fYSksICI9ZCIgKF9fZCkpOyBcCiAgICAgICh2YWwpID0gKCh1bnNpZ25lZCBsb25nKV9fYSkgfCAoKCh1bnNpZ25lZCBsb25nKV9fZCk8PDMyKTsgXAogfSB3aGlsZSgwKQogCisjZGVmaW5lIHJkdHNjcGxsKHZhbCwgYXV4KSBkbyB7IFwKKyAgICAgdW5zaWduZWQgbG9uZyBfX2EsIF9fZDsgXAorICAgICBhc20gdm9sYXRpbGUgKCIuYnl0ZSAweDBmLDB4MDEsMHhmOSIgOiAiPWEiIChfX2EpLCAiPWQiIChfX2QpLCAiPWMiIChhdXgpKTsgXAorICAgICAodmFsKSA9IChfX2QgPDwgMzIpIHwgX19hOyBcCit9IHdoaWxlICgwKQorCiAjZGVmaW5lIHdyaXRlX3RzYyh2YWwxLHZhbDIpIHdybXNyKDB4MTAsIHZhbDEsIHZhbDIpCiAKKyNkZWZpbmUgd3JpdGVfcmR0c2NwX2F1eCh2YWwpIHdybXNyKDB4YzAwMDAxMDMsIHZhbCwgMCkKKwogI2RlZmluZSByZHBtYyhjb3VudGVyLGxvdyxoaWdoKSBcCiAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJyZHBtYyIgXAogCQkJICA6ICI9YSIgKGxvdyksICI9ZCIgKGhpZ2gpIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9tdXRleC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L211dGV4LmgKaW5kZXggMDZmYWI2ZC4uMTYzOTZiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L211dGV4LmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L211dGV4LmgKQEAgLTI1LDEzICsyNSw5IEBACiAJCQkJCQkJCQlcCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQkJXAogCQlMT0NLX1BSRUZJWCAiICAgZGVjbCAoJSVyZGkpCVxuIgkJCVwKLQkJCSIgICBqcyAyZgkJXG4iCQkJXAotCQkJIjE6CQkJXG4iCQkJXAotCQkJCQkJCQkJXAotCQlMT0NLX1NFQ1RJT05fU1RBUlQoIiIpCQkJCQlcCi0JCQkiMjogY2FsbCAiI2ZhaWxfZm4iCVxuIgkJCVwKLQkJCSIgICBqbXAgMWIJCVxuIgkJCVwKLQkJTE9DS19TRUNUSU9OX0VORAkJCQkJXAorCQkJIiAgIGpucyAxZgkJXG4iCQkJXAorCQkJIiAgIGNhbGwgIiNmYWlsX2ZuIglcbiIJCQlcCisJCQkiMToiCQkJCQkJXAogCQkJCQkJCQkJXAogCQk6Ij1EIiAoZHVtbXkpCQkJCQkJXAogCQk6ICJEIiAodikJCQkJCQlcCkBAIC03NSwxMyArNzEsOSBAQAogCQkJCQkJCQkJXAogCV9fYXNtX18gX192b2xhdGlsZV9fKAkJCQkJCVwKIAkJTE9DS19QUkVGSVggIiAgIGluY2wgKCUlcmRpKQlcbiIJCQlcCi0JCQkiICAgamxlIDJmCQlcbiIJCQlcCi0JCQkiMToJCQlcbiIJCQlcCi0JCQkJCQkJCQlcCi0JCUxPQ0tfU0VDVElPTl9TVEFSVCgiIikJCQkJCVwKLQkJCSIyOiBjYWxsICIjZmFpbF9mbiIJXG4iCQkJXAotCQkJIiAgIGptcCAxYgkJXG4iCQkJXAotCQlMT0NLX1NFQ1RJT05fRU5ECQkJCQlcCisJCQkiICAgamcgMWYJCVxuIgkJCVwKKwkJCSIgICBjYWxsICIjZmFpbF9mbiIJXG4iCQkJXAorCQkJIjE6CQkJICAiCQkJXAogCQkJCQkJCQkJXAogCQk6Ij1EIiAoZHVtbXkpCQkJCQkJXAogCQk6ICJEIiAodikJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvbm1pLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvbm1pLmgKaW5kZXggZWZiNDVjOC4uY2JmMjY2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L25taS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9ubWkuaApAQCAtNywyNCArNywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAgCi1zdHJ1Y3QgcHRfcmVnczsKLQotdHlwZWRlZiBpbnQgKCpubWlfY2FsbGJhY2tfdCkoc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBpbnQgY3B1KTsKLQogLyoqCi0gKiBzZXRfbm1pX2NhbGxiYWNrCisgKiBkb19ubWlfY2FsbGJhY2sKICAqCi0gKiBTZXQgYSBoYW5kbGVyIGZvciBhbiBOTUkuIE9ubHkgb25lIGhhbmRsZXIgbWF5IGJlCi0gKiBzZXQuIFJldHVybiAxIGlmIHRoZSBOTUkgd2FzIGhhbmRsZWQuCisgKiBDaGVjayB0byBzZWUgaWYgYSBjYWxsYmFjayBleGlzdHMgYW5kIGV4ZWN1dGUgaXQuICBSZXR1cm4gMQorICogaWYgdGhlIGhhbmRsZXIgZXhpc3RzIGFuZCB3YXMgaGFuZGxlZCBzdWNjZXNzZnVsbHkuCiAgKi8KLXZvaWQgc2V0X25taV9jYWxsYmFjayhubWlfY2FsbGJhY2tfdCBjYWxsYmFjayk7Ci0KLS8qKgotICogdW5zZXRfbm1pX2NhbGxiYWNrCi0gKgotICogUmVtb3ZlIHRoZSBoYW5kbGVyIHByZXZpb3VzbHkgc2V0LgotICovCi12b2lkIHVuc2V0X25taV9jYWxsYmFjayh2b2lkKTsKK2ludCBkb19ubWlfY2FsbGJhY2soc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCBjcHUpOwogCiAjaWZkZWYgQ09ORklHX1BNCiAgCkBAIC00OCwyNSArMzcsMzIgQEAKICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KICAKIGV4dGVybiB2b2lkIGRlZmF1bHRfZG9fbm1pKHN0cnVjdCBwdF9yZWdzICopOwotZXh0ZXJuIHZvaWQgZGllX25taShjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiB2b2lkIGRpZV9ubWkoY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IGRvX3BhbmljKTsKIAogI2RlZmluZSBnZXRfbm1pX3JlYXNvbigpIGluYigweDYxKQogCiBleHRlcm4gaW50IHBhbmljX29uX3RpbWVvdXQ7CiBleHRlcm4gaW50IHVua25vd25fbm1pX3BhbmljOworZXh0ZXJuIGludCBubWlfd2F0Y2hkb2dfZW5hYmxlZDsKIAogZXh0ZXJuIGludCBjaGVja19ubWlfd2F0Y2hkb2codm9pZCk7Ci0gCi1leHRlcm4gdm9pZCBzZXR1cF9hcGljX25taV93YXRjaGRvZyAodm9pZCk7Ci1leHRlcm4gaW50IHJlc2VydmVfbGFwaWNfbm1pKHZvaWQpOwotZXh0ZXJuIHZvaWQgcmVsZWFzZV9sYXBpY19ubWkodm9pZCk7CitleHRlcm4gaW50IGF2YWlsX3RvX3Jlc3J2X3BlcmZjdHJfbm1pX2JpdCh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCBhdmFpbF90b19yZXNydl9wZXJmY3RyX25taSh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIGludCByZXNlcnZlX3BlcmZjdHJfbm1pKHVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZCByZWxlYXNlX3BlcmZjdHJfbm1pKHVuc2lnbmVkIGludCk7CitleHRlcm4gaW50IHJlc2VydmVfZXZudHNlbF9ubWkodW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIHJlbGVhc2VfZXZudHNlbF9ubWkodW5zaWduZWQgaW50KTsKKworZXh0ZXJuIHZvaWQgc2V0dXBfYXBpY19ubWlfd2F0Y2hkb2cgKHZvaWQgKik7CitleHRlcm4gdm9pZCBzdG9wX2FwaWNfbm1pX3dhdGNoZG9nICh2b2lkICopOwogZXh0ZXJuIHZvaWQgZGlzYWJsZV90aW1lcl9ubWlfd2F0Y2hkb2codm9pZCk7CiBleHRlcm4gdm9pZCBlbmFibGVfdGltZXJfbm1pX3dhdGNoZG9nKHZvaWQpOwotZXh0ZXJuIHZvaWQgbm1pX3dhdGNoZG9nX3RpY2sgKHN0cnVjdCBwdF9yZWdzICogcmVncywgdW5zaWduZWQgcmVhc29uKTsKK2V4dGVybiBpbnQgbm1pX3dhdGNoZG9nX3RpY2sgKHN0cnVjdCBwdF9yZWdzICogcmVncywgdW5zaWduZWQgcmVhc29uKTsKIAogZXh0ZXJuIHZvaWQgbm1pX3dhdGNoZG9nX2RlZmF1bHQodm9pZCk7CiBleHRlcm4gaW50IHNldHVwX25taV93YXRjaGRvZyhjaGFyICopOwogCitleHRlcm4gYXRvbWljX3Qgbm1pX2FjdGl2ZTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgbm1pX3dhdGNoZG9nOwogI2RlZmluZSBOTUlfREVGQVVMVAktMQogI2RlZmluZSBOTUlfTk9ORQkwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcGNpLWRpcmVjdC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3BjaS1kaXJlY3QuaAppbmRleCAwMzZiNmNhLi5lYmE5Y2I0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcGNpLWRpcmVjdC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wY2ktZGlyZWN0LmgKQEAgLTIsNDcgKzIsMTUgQEAKICNkZWZpbmUgQVNNX1BDSV9ESVJFQ1RfSCAxCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgogCiAvKiBEaXJlY3QgUENJIGFjY2Vzcy4gVGhpcyBpcyB1c2VkIGZvciBQQ0kgYWNjZXNzZXMgaW4gZWFybHkgYm9vdCBiZWZvcmUKICAgIHRoZSBQQ0kgc3Vic3lzdGVtIHdvcmtzLiAqLyAKIAotI2RlZmluZSBQRHByaW50ayh4Li4uKQorZXh0ZXJuIHUzMiByZWFkX3BjaV9jb25maWcodTggYnVzLCB1OCBzbG90LCB1OCBmdW5jLCB1OCBvZmZzZXQpOworZXh0ZXJuIHU4IHJlYWRfcGNpX2NvbmZpZ19ieXRlKHU4IGJ1cywgdTggc2xvdCwgdTggZnVuYywgdTggb2Zmc2V0KTsKK2V4dGVybiB1MTYgcmVhZF9wY2lfY29uZmlnXzE2KHU4IGJ1cywgdTggc2xvdCwgdTggZnVuYywgdTggb2Zmc2V0KTsKK2V4dGVybiB2b2lkIHdyaXRlX3BjaV9jb25maWcodTggYnVzLCB1OCBzbG90LCB1OCBmdW5jLCB1OCBvZmZzZXQsIHUzMiB2YWwpOwogCi1zdGF0aWMgaW5saW5lIHUzMiByZWFkX3BjaV9jb25maWcodTggYnVzLCB1OCBzbG90LCB1OCBmdW5jLCB1OCBvZmZzZXQpCi17Ci0JdTMyIHY7IAotCW91dGwoMHg4MDAwMDAwMCB8IChidXM8PDE2KSB8IChzbG90PDwxMSkgfCAoZnVuYzw8OCkgfCBvZmZzZXQsIDB4Y2Y4KTsKLQl2ID0gaW5sKDB4Y2ZjKTsgCi0JaWYgKHYgIT0gMHhmZmZmZmZmZikKLQkJUERwcmludGsoIiV4IHJlYWRpbmcgNCBmcm9tICV4OiAleFxuIiwgc2xvdCwgb2Zmc2V0LCB2KTsKLQlyZXR1cm4gdjsKLX0KLQotc3RhdGljIGlubGluZSB1OCByZWFkX3BjaV9jb25maWdfYnl0ZSh1OCBidXMsIHU4IHNsb3QsIHU4IGZ1bmMsIHU4IG9mZnNldCkKLXsKLQl1OCB2OyAKLQlvdXRsKDB4ODAwMDAwMDAgfCAoYnVzPDwxNikgfCAoc2xvdDw8MTEpIHwgKGZ1bmM8PDgpIHwgb2Zmc2V0LCAweGNmOCk7Ci0JdiA9IGluYigweGNmYyArIChvZmZzZXQmMykpOyAKLQlQRHByaW50aygiJXggcmVhZGluZyAxIGZyb20gJXg6ICV4XG4iLCBzbG90LCBvZmZzZXQsIHYpOwotCXJldHVybiB2OwotfQotCi1zdGF0aWMgaW5saW5lIHUxNiByZWFkX3BjaV9jb25maWdfMTYodTggYnVzLCB1OCBzbG90LCB1OCBmdW5jLCB1OCBvZmZzZXQpCi17Ci0JdTE2IHY7IAotCW91dGwoMHg4MDAwMDAwMCB8IChidXM8PDE2KSB8IChzbG90PDwxMSkgfCAoZnVuYzw8OCkgfCBvZmZzZXQsIDB4Y2Y4KTsKLQl2ID0gaW53KDB4Y2ZjICsgKG9mZnNldCYyKSk7IAotCVBEcHJpbnRrKCIleCByZWFkaW5nIDIgZnJvbSAleDogJXhcbiIsIHNsb3QsIG9mZnNldCwgdik7Ci0JcmV0dXJuIHY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9wY2lfY29uZmlnKHU4IGJ1cywgdTggc2xvdCwgdTggZnVuYywgdTggb2Zmc2V0LAotCQkJCSAgICB1MzIgdmFsKQotewotCVBEcHJpbnRrKCIleCB3cml0aW5nIHRvICV4OiAleFxuIiwgc2xvdCwgb2Zmc2V0LCB2YWwpOyAKLQlvdXRsKDB4ODAwMDAwMDAgfCAoYnVzPDwxNikgfCAoc2xvdDw8MTEpIHwgKGZ1bmM8PDgpIHwgb2Zmc2V0LCAweGNmOCk7Ci0Jb3V0bCh2YWwsIDB4Y2ZjKTsgCi19CitleHRlcm4gaW50IGVhcmx5X3BjaV9hbGxvd2VkKHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wZGEuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wZGEuaAppbmRleCBiNDdjM2RmLi4xNDk5NmQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcGRhLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3BkYS5oCkBAIC05LDIwICs5LDI0IEBACiAKIC8qIFBlciBwcm9jZXNzb3IgZGF0YXN0cnVjdHVyZS4gJWdzIHBvaW50cyB0byBpdCB3aGlsZSB0aGUga2VybmVsIHJ1bnMgKi8gCiBzdHJ1Y3QgeDg2NjRfcGRhIHsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBjdXJyZW50OwkvKiBDdXJyZW50IHByb2Nlc3MgKi8KLQl1bnNpZ25lZCBsb25nIGRhdGFfb2Zmc2V0OwkvKiBQZXIgY3B1IGRhdGEgb2Zmc2V0IGZyb20gbGlua2VyIGFkZHJlc3MgKi8KLQl1bnNpZ25lZCBsb25nIGtlcm5lbHN0YWNrOyAgLyogdG9wIG9mIGtlcm5lbCBzdGFjayBmb3IgY3VycmVudCAqLyAKLQl1bnNpZ25lZCBsb25nIG9sZHJzcDsgCSAgICAvKiB1c2VyIHJzcCBmb3Igc3lzdGVtIGNhbGwgKi8KLSNpZiBERUJVR19TVEtTWiA+IEVYQ0VQVElPTl9TVEtTWgotCXVuc2lnbmVkIGxvbmcgZGVidWdzdGFjazsgICAvKiAjREIvI0JQIHN0YWNrLiAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcGN1cnJlbnQ7CS8qIDAgIEN1cnJlbnQgcHJvY2VzcyAqLworCXVuc2lnbmVkIGxvbmcgZGF0YV9vZmZzZXQ7CS8qIDggUGVyIGNwdSBkYXRhIG9mZnNldCBmcm9tIGxpbmtlcgorCQkJCQkgICBhZGRyZXNzICovCisJdW5zaWduZWQgbG9uZyBrZXJuZWxzdGFjazsgIC8qIDE2IHRvcCBvZiBrZXJuZWwgc3RhY2sgZm9yIGN1cnJlbnQgKi8KKwl1bnNpZ25lZCBsb25nIG9sZHJzcDsgCSAgICAvKiAyNCB1c2VyIHJzcCBmb3Igc3lzdGVtIGNhbGwgKi8KKyAgICAgICAgaW50IGlycWNvdW50OwkJICAgIC8qIDMyIElycSBuZXN0aW5nIGNvdW50ZXIuIFN0YXJ0cyB3aXRoIC0xICovCisJaW50IGNwdW51bWJlcjsJCSAgICAvKiAzNiBMb2dpY2FsIENQVSBudW1iZXIgKi8KKyNpZmRlZiBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IKKwl1bnNpZ25lZCBsb25nIHN0YWNrX2NhbmFyeTsJLyogNDAgc3RhY2sgY2FuYXJ5IHZhbHVlICovCisJCQkJCS8qIGdjYy1BQkk6IHRoaXMgY2FuYXJ5IE1VU1QgYmUgYXQKKwkJCQkJICAgb2Zmc2V0IDQwISEhICovCiAjZW5kaWYKLSAgICAgICAgaW50IGlycWNvdW50OwkJICAgIC8qIElycSBuZXN0aW5nIGNvdW50ZXIuIFN0YXJ0cyB3aXRoIC0xICovICAJCi0JaW50IGNwdW51bWJlcjsJCSAgICAvKiBMb2dpY2FsIENQVSBudW1iZXIgKi8KLQljaGFyICppcnFzdGFja3B0cjsJLyogdG9wIG9mIGlycXN0YWNrICovCisJY2hhciAqaXJxc3RhY2twdHI7CiAJaW50IG5vZGVudW1iZXI7CQkgICAgLyogbnVtYmVyIG9mIGN1cnJlbnQgbm9kZSAqLwogCXVuc2lnbmVkIGludCBfX3NvZnRpcnFfcGVuZGluZzsKIAl1bnNpZ25lZCBpbnQgX19ubWlfY291bnQ7CS8qIG51bWJlciBvZiBOTUkgb24gdGhpcyBDUFVzICovCi0JaW50IG1tdV9zdGF0ZTsgICAgIAorCXNob3J0IG1tdV9zdGF0ZTsKKwlzaG9ydCBpc2lkbGU7CiAJc3RydWN0IG1tX3N0cnVjdCAqYWN0aXZlX21tOwogCXVuc2lnbmVkIGFwaWNfdGltZXJfaXJxczsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKQEAgLTM2LDQ0ICs0MCw2OSBAQAogICogVGhlcmUgaXMgbm8gZmFzdCB3YXkgdG8gZ2V0IHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIFBEQSwgYWxsIHRoZSBhY2Nlc3NlcwogICogaGF2ZSB0byBtZW50aW9uICVmcy8lZ3MuICBTbyBpdCBuZWVkcyB0byBiZSBkb25lIHRoaXMgVG9ydmFsZGlhbiB3YXkuCiAgKi8gCi0jZGVmaW5lIHNpemVvZl9maWVsZCh0eXBlLGZpZWxkKSAgKHNpemVvZigoKHR5cGUgKikwKS0+ZmllbGQpKQotI2RlZmluZSB0eXBlb2ZfZmllbGQodHlwZSxmaWVsZCkgIHR5cGVvZigoKHR5cGUgKikwKS0+ZmllbGQpCitleHRlcm4gdm9pZCBfX2JhZF9wZGFfZmllbGQodm9pZCkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKIAotZXh0ZXJuIHZvaWQgX19iYWRfcGRhX2ZpZWxkKHZvaWQpOworLyoKKyAqIHByb3h5X3BkYSBkb2Vzbid0IGFjdHVhbGx5IGV4aXN0LCBidXQgdGVsbCBnY2MgaXQgaXMgYWNjZXNzZWQgZm9yCisgKiBhbGwgUERBIGFjY2Vzc2VzIHNvIGl0IGdldHMgcmVhZC93cml0ZSBkZXBlbmRlbmNpZXMgcmlnaHQuCisgKi8KK2V4dGVybiBzdHJ1Y3QgeDg2NjRfcGRhIF9wcm94eV9wZGE7CiAKICNkZWZpbmUgcGRhX29mZnNldChmaWVsZCkgb2Zmc2V0b2Yoc3RydWN0IHg4NjY0X3BkYSwgZmllbGQpCiAKLSNkZWZpbmUgcGRhX3RvX29wKG9wLGZpZWxkLHZhbCkgZG8geyBcCi0JdHlwZWRlZiB0eXBlb2ZfZmllbGQoc3RydWN0IHg4NjY0X3BkYSwgZmllbGQpIFRfXzsgXAotICAgICAgIHN3aXRjaCAoc2l6ZW9mX2ZpZWxkKHN0cnVjdCB4ODY2NF9wZGEsIGZpZWxkKSkgeyAJCVwKLWNhc2UgMjogXAotYXNtIHZvbGF0aWxlKG9wICJ3ICUwLCUlZ3M6JVAxIjo6InJpIiAoKFRfXyl2YWwpLCJpIihwZGFfb2Zmc2V0KGZpZWxkKSk6Im1lbW9yeSIpOyBicmVhazsgXAotY2FzZSA0OiBcCi1hc20gdm9sYXRpbGUob3AgImwgJTAsJSVnczolUDEiOjoicmkiICgoVF9fKXZhbCksImkiKHBkYV9vZmZzZXQoZmllbGQpKToibWVtb3J5Iik7IGJyZWFrOyBcCi1jYXNlIDg6IFwKLWFzbSB2b2xhdGlsZShvcCAicSAlMCwlJWdzOiVQMSI6OiJyaSIgKChUX18pdmFsKSwiaSIocGRhX29mZnNldChmaWVsZCkpOiJtZW1vcnkiKTsgYnJlYWs7IFwKLSAgICAgICBkZWZhdWx0OiBfX2JhZF9wZGFfZmllbGQoKTsgCQkJCQlcCi0gICAgICAgfSBcCisjZGVmaW5lIHBkYV90b19vcChvcCxmaWVsZCx2YWwpIGRvIHsJCVwKKwl0eXBlZGVmIHR5cGVvZihfcHJveHlfcGRhLmZpZWxkKSBUX187CVwKKwlpZiAoMCkgeyBUX18gdG1wX187IHRtcF9fID0gKHZhbCk7IH0JLyogdHlwZSBjaGVja2luZyAqLyBcCisJc3dpdGNoIChzaXplb2YoX3Byb3h5X3BkYS5maWVsZCkpIHsJXAorCWNhc2UgMjoJCQkJCVwKKwkJYXNtKG9wICJ3ICUxLCUlZ3M6JWMyIiA6IAlcCisJCSAgICAiK20iIChfcHJveHlfcGRhLmZpZWxkKSA6CVwKKwkJICAgICJyaSIgKChUX18pdmFsKSwJCVwKKwkJICAgICJpIihwZGFfb2Zmc2V0KGZpZWxkKSkpOyAJXAorIAkJYnJlYWs7CQkJCVwKKwljYXNlIDQ6CQkJCQlcCisJCWFzbShvcCAibCAlMSwlJWdzOiVjMiIgOiAJXAorCQkgICAgIittIiAoX3Byb3h5X3BkYS5maWVsZCkgOglcCisJCSAgICAicmkiICgoVF9fKXZhbCksCQlcCisJCSAgICAiaSIgKHBkYV9vZmZzZXQoZmllbGQpKSk7IAlcCisJCWJyZWFrOwkJCQlcCisJY2FzZSA4OgkJCQkJXAorCQlhc20ob3AgInEgJTEsJSVnczolYzIiOiAJXAorCQkgICAgIittIiAoX3Byb3h5X3BkYS5maWVsZCkgOglcCisJCSAgICAicmkiICgoVF9fKXZhbCksCQlcCisJCSAgICAiaSIocGRhX29mZnNldChmaWVsZCkpKTsgCVwKKwkJYnJlYWs7CQkJCVwKKyAgICAgICBkZWZhdWx0OiAJCQkJXAorCQlfX2JhZF9wZGFfZmllbGQoKTsJCVwKKyAgICAgICB9CQkJCQlcCiAgICAgICAgfSB3aGlsZSAoMCkKIAotLyogCi0gKiBBSzogUERBIHJlYWQgYWNjZXNzZXMgc2hvdWxkIGJlIG5laXRoZXIgdm9sYXRpbGUgbm9yIGhhdmUgYW4gbWVtb3J5IGNsb2JiZXIuCi0gKiBVbmZvcnR1bmF0ZWx5IHJlbW92aW5nIHRoZW0gY2F1c2VzIGFsbCBoZWxsIHRvIGJyZWFrIGxvc2UgY3VycmVudGx5LgotICovCi0jZGVmaW5lIHBkYV9mcm9tX29wKG9wLGZpZWxkKSAoeyBcCi0gICAgICAgdHlwZW9mX2ZpZWxkKHN0cnVjdCB4ODY2NF9wZGEsIGZpZWxkKSByZXRfXzsgXAotICAgICAgIHN3aXRjaCAoc2l6ZW9mX2ZpZWxkKHN0cnVjdCB4ODY2NF9wZGEsIGZpZWxkKSkgeyAJCVwKLWNhc2UgMjogXAotYXNtIHZvbGF0aWxlKG9wICJ3ICUlZ3M6JVAxLCUwIjoiPXIiIChyZXRfXyk6ImkiKHBkYV9vZmZzZXQoZmllbGQpKToibWVtb3J5Iik7IGJyZWFrO1wKLWNhc2UgNDogXAotYXNtIHZvbGF0aWxlKG9wICJsICUlZ3M6JVAxLCUwIjoiPXIiIChyZXRfXyk6ImkiKHBkYV9vZmZzZXQoZmllbGQpKToibWVtb3J5Iik7IGJyZWFrO1wKLWNhc2UgODogXAotYXNtIHZvbGF0aWxlKG9wICJxICUlZ3M6JVAxLCUwIjoiPXIiIChyZXRfXyk6ImkiKHBkYV9vZmZzZXQoZmllbGQpKToibWVtb3J5Iik7IGJyZWFrO1wKLSAgICAgICBkZWZhdWx0OiBfX2JhZF9wZGFfZmllbGQoKTsgCQkJCQlcCi0gICAgICAgfSBcCisjZGVmaW5lIHBkYV9mcm9tX29wKG9wLGZpZWxkKSAoewkJXAorCXR5cGVvZihfcHJveHlfcGRhLmZpZWxkKSByZXRfXzsJCVwKKwlzd2l0Y2ggKHNpemVvZihfcHJveHlfcGRhLmZpZWxkKSkgewlcCisgICAgICAgCWNhc2UgMjoJCQkJCVwKKwkJYXNtKG9wICJ3ICUlZ3M6JWMxLCUwIiA6IAlcCisJCSAgICAiPXIiIChyZXRfXykgOgkJXAorCQkgICAgImkiIChwZGFfb2Zmc2V0KGZpZWxkKSksIAlcCisJCSAgICAibSIgKF9wcm94eV9wZGEuZmllbGQpKTsgCVwKKwkJIGJyZWFrOwkJCQlcCisJY2FzZSA0OgkJCQkJXAorCQlhc20ob3AgImwgJSVnczolYzEsJTAiOgkJXAorCQkgICAgIj1yIiAocmV0X18pOgkJXAorCQkgICAgImkiIChwZGFfb2Zmc2V0KGZpZWxkKSksIAlcCisJCSAgICAibSIgKF9wcm94eV9wZGEuZmllbGQpKTsgCVwKKwkJIGJyZWFrOwkJCQlcCisgICAgICAgY2FzZSA4OgkJCQkJXAorCQlhc20ob3AgInEgJSVnczolYzEsJTAiOgkJXAorCQkgICAgIj1yIiAocmV0X18pIDoJCVwKKwkJICAgICJpIiAocGRhX29mZnNldChmaWVsZCkpLCAJXAorCQkgICAgIm0iIChfcHJveHlfcGRhLmZpZWxkKSk7IAlcCisJCSBicmVhazsJCQkJXAorICAgICAgIGRlZmF1bHQ6IAkJCQlcCisJCV9fYmFkX3BkYV9maWVsZCgpOwkJXAorICAgICAgIH0JCQkJCVwKICAgICAgICByZXRfXzsgfSkKIAotCiAjZGVmaW5lIHJlYWRfcGRhKGZpZWxkKSBwZGFfZnJvbV9vcCgibW92IixmaWVsZCkKICNkZWZpbmUgd3JpdGVfcGRhKGZpZWxkLHZhbCkgcGRhX3RvX29wKCJtb3YiLGZpZWxkLHZhbCkKICNkZWZpbmUgYWRkX3BkYShmaWVsZCx2YWwpIHBkYV90b19vcCgiYWRkIixmaWVsZCx2YWwpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcGVyY3B1LmggYi9pbmNsdWRlL2FzbS14ODZfNjQvcGVyY3B1LmgKaW5kZXggYmZmYjJmOC4uMjg1NzU2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3BlcmNwdS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wZXJjcHUuaApAQCAtMTEsNiArMTEsMTYgQEAKIAogI2luY2x1ZGUgPGFzbS9wZGEuaD4KIAorI2lmZGVmIENPTkZJR19NT0RVTEVTCisjIGRlZmluZSBQRVJDUFVfTU9EVUxFX1JFU0VSVkUgODE5MgorI2Vsc2UKKyMgZGVmaW5lIFBFUkNQVV9NT0RVTEVfUkVTRVJWRSAwCisjZW5kaWYKKworI2RlZmluZSBQRVJDUFVfRU5PVUdIX1JPT00gXAorCShBTElHTihfX3Blcl9jcHVfZW5kIC0gX19wZXJfY3B1X3N0YXJ0LCBTTVBfQ0FDSEVfQllURVMpICsgXAorCSBQRVJDUFVfTU9EVUxFX1JFU0VSVkUpCisKICNkZWZpbmUgX19wZXJfY3B1X29mZnNldChjcHUpIChjcHVfcGRhKGNwdSktPmRhdGFfb2Zmc2V0KQogI2RlZmluZSBfX215X2NwdV9vZmZzZXQoKSByZWFkX3BkYShkYXRhX29mZnNldCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wZ3RhYmxlLmgKaW5kZXggNTFlYmEyMy4uNjg5OWU3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcGd0YWJsZS5oCkBAIC0yMSwxMiArMjEsOSBAQAogCiAjZGVmaW5lIHN3YXBwZXJfcGdfZGlyIGluaXRfbGV2ZWw0X3BndAogCi1leHRlcm4gaW50IG5vbnhfc2V0dXAoY2hhciAqc3RyKTsKIGV4dGVybiB2b2lkIHBhZ2luZ19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgY2xlYXJfa2VybmVsX21hcHBpbmcodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOwogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBwZ2tlcm5fbWFzazsKLQogLyoKICAqIFpFUk9fUEFHRSBpcyBhIGdsb2JhbCBzaGFyZWQgcGFnZSB0aGF0IGlzIGFsd2F5cyB6ZXJvOiB1c2VkCiAgKiBmb3IgemVyby1tYXBwZWQgbWVtb3J5IGFyZWFzIGV0Yy4uCkBAIC0yNjUsNyArMjYyLDcgQEAKICNkZWZpbmUgX19MQVJHRV9QVEUgKF9QQUdFX1BTRXxfUEFHRV9QUkVTRU5UKQogc3RhdGljIGlubGluZSBpbnQgcHRlX3VzZXIocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3JlYWQocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsgfQotc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfVVNFUjsgfQorc3RhdGljIGlubGluZSBpbnQgcHRlX2V4ZWMocHRlX3QgcHRlKQkJeyByZXR1cm4gIShwdGVfdmFsKHB0ZSkgJiBfUEFHRV9OWCk7IH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0ZV9kaXJ0eShwdGVfdCBwdGUpCQl7IHJldHVybiBwdGVfdmFsKHB0ZSkgJiBfUEFHRV9ESVJUWTsgfQogc3RhdGljIGlubGluZSBpbnQgcHRlX3lvdW5nKHB0ZV90IHB0ZSkJCXsgcmV0dXJuIHB0ZV92YWwocHRlKSAmIF9QQUdFX0FDQ0VTU0VEOyB9CiBzdGF0aWMgaW5saW5lIGludCBwdGVfd3JpdGUocHRlX3QgcHRlKQkJeyByZXR1cm4gcHRlX3ZhbChwdGUpICYgX1BBR0VfUlc7IH0KQEAgLTI3OCwxMSArMjc1LDEyIEBACiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfQUNDRVNTRUQpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfd3Jwcm90ZWN0KHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSAmIH5fUEFHRV9SVykpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3JlYWQocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfVVNFUikpOyByZXR1cm4gcHRlOyB9Ci1zdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfVVNFUikpOyByZXR1cm4gcHRlOyB9CitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta2V4ZWMocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX05YKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQl7IHNldF9wdGUoJnB0ZSwgX19wdGUocHRlX3ZhbChwdGUpIHwgX1BBR0VfRElSVFkpKTsgcmV0dXJuIHB0ZTsgfQogc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWt5b3VuZyhwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9BQ0NFU1NFRCkpOyByZXR1cm4gcHRlOyB9CiBzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta3dyaXRlKHB0ZV90IHB0ZSkJeyBzZXRfcHRlKCZwdGUsIF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX1JXKSk7IHJldHVybiBwdGU7IH0KIHN0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21raHVnZShwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgfCBfUEFHRV9QU0UpKTsgcmV0dXJuIHB0ZTsgfQorc3RhdGljIGlubGluZSBwdGVfdCBwdGVfY2xyaHVnZShwdGVfdCBwdGUpCXsgc2V0X3B0ZSgmcHRlLCBfX3B0ZShwdGVfdmFsKHB0ZSkgJiB+X1BBR0VfUFNFKSk7IHJldHVybiBwdGU7IH0KIAogc3RydWN0IHZtX2FyZWFfc3RydWN0OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oCmluZGV4IDAzOGZlMWY0Li5jMjhmYzJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcHJvdG8uaApAQCAtMjQsOCArMjQsNiBAQAogI2RlZmluZSBtdHJyX2JwX2luaXQoKSBkbyB7fSB3aGlsZSAoMCkKICNlbmRpZgogZXh0ZXJuIHZvaWQgaW5pdF9tZW1vcnlfbWFwcGluZyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7Ci1leHRlcm4gdm9pZCBzaXplX3pvbmVzKHVuc2lnbmVkIGxvbmcgKnosIHVuc2lnbmVkIGxvbmcgKmgsCi0JCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKTsKIAogZXh0ZXJuIHZvaWQgc3lzdGVtX2NhbGwodm9pZCk7IAogZXh0ZXJuIGludCBrZXJuZWxfc3lzY2FsbCh2b2lkKTsKQEAgLTUxLDEwICs0OSw4IEBACiBleHRlcm4gaW50IHN5c2N0bF92c3lzY2FsbDsKIGV4dGVybiBpbnQgbm9ocGV0OwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdnh0aW1lX2h6OworZXh0ZXJuIHZvaWQgdGltZV9pbml0X2d0b2Qodm9pZCk7CiAKLWV4dGVybiBpbnQgbnVtYV9zZXR1cChjaGFyICpvcHQpOwotCi1leHRlcm4gaW50IHNldHVwX2Vhcmx5X3ByaW50ayhjaGFyICopOyAKIGV4dGVybiB2b2lkIGVhcmx5X3ByaW50ayhjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwxLDIpKSk7CiAKIGV4dGVybiB2b2lkIGVhcmx5X2lkZW50aWZ5X2NwdShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwpAQCAtOTEsNyArODcsNyBAQAogCiBleHRlcm4gdm9pZCBzZXR1cF9ub2RlX2Jvb3RtZW0oaW50IG5vZGVpZCwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwogCi1leHRlcm4gdm9pZCBjaGVja19pb2FwaWModm9pZCk7CitleHRlcm4gdm9pZCBlYXJseV9xdWlya3Modm9pZCk7CiBleHRlcm4gdm9pZCBjaGVja19lZmVyKHZvaWQpOwogCiBleHRlcm4gaW50IHVuaGFuZGxlZF9zaWduYWwoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBzaWcpOwpAQCAtMTAzLDEzICs5OSw3IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyB0YWJsZV9zdGFydCwgdGFibGVfZW5kOwogCiBleHRlcm4gaW50IGV4Y2VwdGlvbl90cmFjZTsKLWV4dGVybiBpbnQgdXNpbmdfYXBpY190aW1lcjsKLWV4dGVybiBpbnQgZGlzYWJsZV9hcGljOwogZXh0ZXJuIHVuc2lnbmVkIGNwdV9raHo7Ci1leHRlcm4gaW50IGlvYXBpY19mb3JjZTsKLWV4dGVybiBpbnQgc2tpcF9pb2FwaWNfc2V0dXA7Ci1leHRlcm4gaW50IGFjcGlfaHQ7Ci1leHRlcm4gaW50IGFjcGlfZGlzYWJsZWQ7CiAKIGV4dGVybiB2b2lkIG5vX2lvbW11X2luaXQodm9pZCk7CiBleHRlcm4gaW50IGZvcmNlX2lvbW11LCBub19pb21tdTsKQEAgLTEzMSw3ICsxMjEsOCBAQAogCiBleHRlcm4gaW50IHJlYm9vdF9mb3JjZTsKIGV4dGVybiBpbnQgbm90c2Nfc2V0dXAoY2hhciAqKTsKLWV4dGVybiBpbnQgc2V0dXBfYWRkaXRpb25hbF9jcHVzKGNoYXIgKik7CisKK2V4dGVybiBpbnQgZ3NpX2lycV9zaGFyaW5nKGludCBnc2kpOwogCiBleHRlcm4gdm9pZCBzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICogcmVncyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9yd2xvY2suaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9yd2xvY2suaAppbmRleCBkZWEwZTk0Li43MmFlZWJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvcndsb2NrLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3J3bG9jay5oCkBAIC0xOCw2OSArMTgsOSBAQAogI2lmbmRlZiBfQVNNX1g4Nl82NF9SV0xPQ0tfSAogI2RlZmluZSBfQVNNX1g4Nl82NF9SV0xPQ0tfSAogCi0jaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+Ci0KICNkZWZpbmUgUldfTE9DS19CSUFTCQkgMHgwMTAwMDAwMAotI2RlZmluZSBSV19MT0NLX0JJQVNfU1RSCSIweDAxMDAwMDAwIgorI2RlZmluZSBSV19MT0NLX0JJQVNfU1RSCSAiMHgwMTAwMDAwMCIKIAotI2RlZmluZSBfX2J1aWxkX3JlYWRfbG9ja19wdHIocncsIGhlbHBlcikgICBcCi0JYXNtIHZvbGF0aWxlKExPQ0tfUFJFRklYICJzdWJsICQxLCglMClcblx0IiBcCi0JCSAgICAgImpzIDJmXG4iIFwKLQkJICAgICAiMTpcbiIgXAotCQkgICAgTE9DS19TRUNUSU9OX1NUQVJUKCIiKSBcCi0JCSAgICAgIjI6XHRjYWxsICIgaGVscGVyICJcblx0IiBcCi0JCSAgICAgImptcCAxYlxuIiBcCi0JCSAgICBMT0NLX1NFQ1RJT05fRU5EIFwKLQkJICAgICA6OiJhIiAocncpIDogIm1lbW9yeSIpCi0KLSNkZWZpbmUgX19idWlsZF9yZWFkX2xvY2tfY29uc3QocncsIGhlbHBlcikgICBcCi0JYXNtIHZvbGF0aWxlKExPQ0tfUFJFRklYICJzdWJsICQxLCUwXG5cdCIgXAotCQkgICAgICJqcyAyZlxuIiBcCi0JCSAgICAgIjE6XG4iIFwKLQkJICAgIExPQ0tfU0VDVElPTl9TVEFSVCgiIikgXAotCQkgICAgICIyOlx0cHVzaHEgJSVyYXhcblx0IiBcCi0JCSAgICAgImxlYXEgJTAsJSVyYXhcblx0IiBcCi0JCSAgICAgImNhbGwgIiBoZWxwZXIgIlxuXHQiIFwKLQkJICAgICAicG9wcSAlJXJheFxuXHQiIFwKLQkJICAgICAiam1wIDFiXG4iIFwKLQkJICAgIExPQ0tfU0VDVElPTl9FTkQgXAotCQkgICAgIDoiPW0iICgqKCh2b2xhdGlsZSBpbnQgKilydykpOjoibWVtb3J5IikKLQotI2RlZmluZSBfX2J1aWxkX3JlYWRfbG9jayhydywgaGVscGVyKQlkbyB7IFwKLQkJCQkJCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChydykpIFwKLQkJCQkJCQlfX2J1aWxkX3JlYWRfbG9ja19jb25zdChydywgaGVscGVyKTsgXAotCQkJCQkJZWxzZSBcCi0JCQkJCQkJX19idWlsZF9yZWFkX2xvY2tfcHRyKHJ3LCBoZWxwZXIpOyBcCi0JCQkJCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgX19idWlsZF93cml0ZV9sb2NrX3B0cihydywgaGVscGVyKSBcCi0JYXNtIHZvbGF0aWxlKExPQ0tfUFJFRklYICJzdWJsICQiIFJXX0xPQ0tfQklBU19TVFIgIiwoJTApXG5cdCIgXAotCQkgICAgICJqbnogMmZcbiIgXAotCQkgICAgICIxOlxuIiBcCi0JCSAgICAgTE9DS19TRUNUSU9OX1NUQVJUKCIiKSBcCi0JCSAgICAgIjI6XHRjYWxsICIgaGVscGVyICJcblx0IiBcCi0JCSAgICAgImptcCAxYlxuIiBcCi0JCSAgICAgTE9DS19TRUNUSU9OX0VORCBcCi0JCSAgICAgOjoiYSIgKHJ3KSA6ICJtZW1vcnkiKQotCi0jZGVmaW5lIF9fYnVpbGRfd3JpdGVfbG9ja19jb25zdChydywgaGVscGVyKSBcCi0JYXNtIHZvbGF0aWxlKExPQ0tfUFJFRklYICJzdWJsICQiIFJXX0xPQ0tfQklBU19TVFIgIiwlMFxuXHQiIFwKLQkJICAgICAiam56IDJmXG4iIFwKLQkJICAgICAiMTpcbiIgXAotCQkgICAgTE9DS19TRUNUSU9OX1NUQVJUKCIiKSBcCi0JCSAgICAgIjI6XHRwdXNocSAlJXJheFxuXHQiIFwKLQkJICAgICAibGVhcSAlMCwlJXJheFxuXHQiIFwKLQkJICAgICAiY2FsbCAiIGhlbHBlciAiXG5cdCIgXAotCQkgICAgICJwb3BxICUlcmF4XG5cdCIgXAotCQkgICAgICJqbXAgMWJcbiIgXAotCQkgICAgTE9DS19TRUNUSU9OX0VORCBcCi0JCSAgICAgOiI9bSIgKCooKHZvbGF0aWxlIGxvbmcgKilydykpOjoibWVtb3J5IikKLQotI2RlZmluZSBfX2J1aWxkX3dyaXRlX2xvY2socncsIGhlbHBlcikJZG8geyBcCi0JCQkJCQlpZiAoX19idWlsdGluX2NvbnN0YW50X3AocncpKSBcCi0JCQkJCQkJX19idWlsZF93cml0ZV9sb2NrX2NvbnN0KHJ3LCBoZWxwZXIpOyBcCi0JCQkJCQllbHNlIFwKLQkJCQkJCQlfX2J1aWxkX3dyaXRlX2xvY2tfcHRyKHJ3LCBoZWxwZXIpOyBcCi0JCQkJCX0gd2hpbGUgKDApCisvKiBBY3R1YWwgY29kZSBpcyBpbiBhc20vc3BpbmxvY2suaCBvciBpbiBhcmNoL3g4Nl82NC9saWIvcndsb2NrLlMgKi8KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvc2VnbWVudC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3NlZ21lbnQuaAppbmRleCBkNGJlZDMzLi4zMzRkZGNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvc2VnbWVudC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zZWdtZW50LmgKQEAgLTIwLDE1ICsyMCwxNiBAQAogI2RlZmluZSBfX1VTRVJfQ1MgICAgIDB4MzMgICAvKiA2KjgrMyAqLyAKICNkZWZpbmUgX19VU0VSMzJfRFMJX19VU0VSX0RTIAogCi0jZGVmaW5lIEdEVF9FTlRSWV9UTFMgMQogI2RlZmluZSBHRFRfRU5UUllfVFNTIDgJLyogbmVlZHMgdHdvIGVudHJpZXMgKi8KICNkZWZpbmUgR0RUX0VOVFJZX0xEVCAxMCAvKiBuZWVkcyB0d28gZW50cmllcyAqLwogI2RlZmluZSBHRFRfRU5UUllfVExTX01JTiAxMgogI2RlZmluZSBHRFRfRU5UUllfVExTX01BWCAxNAotLyogMTUgZnJlZSAqLwogCiAjZGVmaW5lIEdEVF9FTlRSWV9UTFNfRU5UUklFUyAzCiAKKyNkZWZpbmUgR0RUX0VOVFJZX1BFUl9DUFUgMTUJLyogQWJ1c2VkIHRvIGxvYWQgcGVyIENQVSBkYXRhIGZyb20gbGltaXQgKi8KKyNkZWZpbmUgX19QRVJfQ1BVX1NFRwkoR0RUX0VOVFJZX1BFUl9DUFUgKiA4ICsgMykKKwogLyogVExTIGluZGV4ZXMgZm9yIDY0Yml0IC0gaGFyZGNvZGVkIGluIGFyY2hfcHJjdGwgKi8KICNkZWZpbmUgRlNfVExTIDAJCiAjZGVmaW5lIEdTX1RMUyAxCQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3NlbWFwaG9yZS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3NlbWFwaG9yZS5oCmluZGV4IDA2NGRmMDguLjEwN2JkOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zZW1hcGhvcmUuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvc2VtYXBob3JlLmgKQEAgLTEwNywxMiArMTA3LDkgQEAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJIiMgYXRvbWljIGRvd24gb3BlcmF0aW9uXG5cdCIKIAkJTE9DS19QUkVGSVggImRlY2wgJTBcblx0IiAgICAgLyogLS1zZW0tPmNvdW50ICovCi0JCSJqcyAyZlxuIgotCQkiMTpcbiIKLQkJTE9DS19TRUNUSU9OX1NUQVJUKCIiKQotCQkiMjpcdGNhbGwgX19kb3duX2ZhaWxlZFxuXHQiCi0JCSJqbXAgMWJcbiIKLQkJTE9DS19TRUNUSU9OX0VORAorCQkiam5zIDFmXG5cdCIKKwkJImNhbGwgX19kb3duX2ZhaWxlZFxuIgorCQkiMToiCiAJCToiPW0iIChzZW0tPmNvdW50KQogCQk6IkQiIChzZW0pCiAJCToibWVtb3J5Iik7CkBAIC0xMzAsMTQgKzEyNywxMSBAQAogCiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSIjIGF0b21pYyBpbnRlcnJ1cHRpYmxlIGRvd24gb3BlcmF0aW9uXG5cdCIKKwkJInhvcmwgJTAsJTBcblx0IgogCQlMT0NLX1BSRUZJWCAiZGVjbCAlMVxuXHQiICAgICAvKiAtLXNlbS0+Y291bnQgKi8KLQkJImpzIDJmXG5cdCIKLQkJInhvcmwgJTAsJTBcbiIKLQkJIjE6XG4iCi0JCUxPQ0tfU0VDVElPTl9TVEFSVCgiIikKLQkJIjI6XHRjYWxsIF9fZG93bl9mYWlsZWRfaW50ZXJydXB0aWJsZVxuXHQiCi0JCSJqbXAgMWJcbiIKLQkJTE9DS19TRUNUSU9OX0VORAorCQkiam5zIDJmXG5cdCIKKwkJImNhbGwgX19kb3duX2ZhaWxlZF9pbnRlcnJ1cHRpYmxlXG4iCisJCSIyOlxuIgogCQk6Ij1hIiAocmVzdWx0KSwgIj1tIiAoc2VtLT5jb3VudCkKIAkJOiJEIiAoc2VtKQogCQk6Im1lbW9yeSIpOwpAQCAtMTU0LDE0ICsxNDgsMTEgQEAKIAogCV9fYXNtX18gX192b2xhdGlsZV9fKAogCQkiIyBhdG9taWMgaW50ZXJydXB0aWJsZSBkb3duIG9wZXJhdGlvblxuXHQiCisJCSJ4b3JsICUwLCUwXG5cdCIKIAkJTE9DS19QUkVGSVggImRlY2wgJTFcblx0IiAgICAgLyogLS1zZW0tPmNvdW50ICovCi0JCSJqcyAyZlxuXHQiCi0JCSJ4b3JsICUwLCUwXG4iCi0JCSIxOlxuIgotCQlMT0NLX1NFQ1RJT05fU1RBUlQoIiIpCi0JCSIyOlx0Y2FsbCBfX2Rvd25fZmFpbGVkX3RyeWxvY2tcblx0IgotCQkiam1wIDFiXG4iCi0JCUxPQ0tfU0VDVElPTl9FTkQKKwkJImpucyAyZlxuXHQiCisJCSJjYWxsIF9fZG93bl9mYWlsZWRfdHJ5bG9ja1xuXHQiCisJCSIyOlxuIgogCQk6Ij1hIiAocmVzdWx0KSwgIj1tIiAoc2VtLT5jb3VudCkKIAkJOiJEIiAoc2VtKQogCQk6Im1lbW9yeSIsImNjIik7CkBAIC0xNzksMTIgKzE3MCw5IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCiAJCSIjIGF0b21pYyB1cCBvcGVyYXRpb25cblx0IgogCQlMT0NLX1BSRUZJWCAiaW5jbCAlMFxuXHQiICAgICAvKiArK3NlbS0+Y291bnQgKi8KLQkJImpsZSAyZlxuIgotCQkiMTpcbiIKLQkJTE9DS19TRUNUSU9OX1NUQVJUKCIiKQotCQkiMjpcdGNhbGwgX191cF93YWtldXBcblx0IgotCQkiam1wIDFiXG4iCi0JCUxPQ0tfU0VDVElPTl9FTkQKKwkJImpnIDFmXG5cdCIKKwkJImNhbGwgX191cF93YWtldXBcbiIKKwkJIjE6IgogCQk6Ij1tIiAoc2VtLT5jb3VudCkKIAkJOiJEIiAoc2VtKQogCQk6Im1lbW9yeSIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3NpZ25hbC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3NpZ25hbC5oCmluZGV4IDNlZGUyYTYuLjQ1ODFmOTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zaWduYWwuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvc2lnbmFsLmgKQEAgLTI0LDEwICsyNCw2IEBACiB9IHNpZ3NldF90OwogCiAKLXN0cnVjdCBwdF9yZWdzOyAKLWFzbWxpbmthZ2UgaW50IGRvX3NpZ25hbChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc2lnc2V0X3QgKm9sZHNldCk7Ci0KLQogI2Vsc2UKIC8qIEhlcmUgd2UgbXVzdCBjYXRlciB0byBsaWJjcyB0aGF0IHBva2UgYWJvdXQgaW4ga2VybmVsIGhlYWRlcnMuICAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvc21wLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvc21wLmgKaW5kZXggY2U5N2Y2NS4uZDZiN2MwNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3NtcC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zbXAuaApAQCAtNCwyNyArNCwxOCBAQAogLyoKICAqIFdlIG5lZWQgdGhlIEFQSUMgZGVmaW5pdGlvbnMgYXV0b21hdGljYWxseSBhcyBwYXJ0IG9mICdzbXAuaCcKICAqLwotI2lmbmRlZiBfX0FTU0VNQkxZX18KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogZXh0ZXJuIGludCBkaXNhYmxlX2FwaWM7Ci0jZW5kaWYKIAotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotI2lmbmRlZiBfX0FTU0VNQkxZX18KICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CiAjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgotI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwogI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxhc20vYXBpYy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgotI2VuZGlmCi0jZW5kaWYKIAogI2lmZGVmIENPTkZJR19TTVAKLSNpZm5kZWYgQVNTRU1CTFkKIAogI2luY2x1ZGUgPGFzbS9wZGEuaD4KIApAQCAtNDIsNyArMzMsNiBAQAogIAogZXh0ZXJuIHZvaWQgc21wX2FsbG9jX21lbW9yeSh2b2lkKTsKIGV4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHNtcF9pbnZhbGlkYXRlX25lZWRlZDsKLWV4dGVybiBpbnQgcGljX21vZGU7CiBleHRlcm4gdm9pZCBsb2NrX2lwaV9jYWxsX2xvY2sodm9pZCk7CiBleHRlcm4gdm9pZCB1bmxvY2tfaXBpX2NhbGxfbG9jayh2b2lkKTsKIGV4dGVybiBpbnQgc21wX251bV9zaWJsaW5nczsKQEAgLTc0LDIwICs2NCwxNiBAQAogCXJldHVybiBHRVRfQVBJQ19JRCgqKHVuc2lnbmVkIGludCAqKShBUElDX0JBU0UrQVBJQ19JRCkpOwogfQogCi1leHRlcm4gaW50IHNhZmVfc21wX3Byb2Nlc3Nvcl9pZCh2b2lkKTsKIGV4dGVybiBpbnQgX19jcHVfZGlzYWJsZSh2b2lkKTsKIGV4dGVybiB2b2lkIF9fY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KTsKIGV4dGVybiB2b2lkIHByZWZpbGxfcG9zc2libGVfbWFwKHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIG51bV9wcm9jZXNzb3JzOwogZXh0ZXJuIHVuc2lnbmVkIGRpc2FibGVkX2NwdXM7CiAKLSNlbmRpZiAvKiAhQVNTRU1CTFkgKi8KLQogI2RlZmluZSBOT19QUk9DX0lECQkweEZGCQkvKiBObyBwcm9jZXNzb3IgbWFnaWMgbWFya2VyICovCiAKICNlbmRpZgogCi0jaWZuZGVmIEFTU0VNQkxZCiAvKgogICogU29tZSBsb3dsZXZlbCBmdW5jdGlvbnMgbWlnaHQgd2FudCB0byBrbm93IGFib3V0CiAgKiB0aGUgcmVhbCBBUElDIElEIDwtPiBDUFUgIyBtYXBwaW5nLgpAQCAtMTA5LDExICs5NSw4IEBACiAJCXJldHVybiBCQURfQVBJQ0lEOwogfQogCi0jZW5kaWYgLyogIUFTU0VNQkxZICovCi0KICNpZm5kZWYgQ09ORklHX1NNUAogI2RlZmluZSBzdGFja19zbXBfcHJvY2Vzc29yX2lkKCkgMAotI2RlZmluZSBzYWZlX3NtcF9wcm9jZXNzb3JfaWQoKSAwCiAjZGVmaW5lIGNwdV9sb2dpY2FsX21hcCh4KSAoeCkKICNlbHNlCiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CkBAIC0xMjUsMTkgKzEwOCwyMyBAQAogfSkKICNlbmRpZgogCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwogc3RhdGljIF9faW5saW5lIGludCBsb2dpY2FsX3NtcF9wcm9jZXNzb3JfaWQodm9pZCkKIHsKIAkvKiB3ZSBkb24ndCB3YW50IHRvIG1hcmsgdGhpcyBhY2Nlc3Mgdm9sYXRpbGUgLSBiYWQgY29kZSBnZW5lcmF0aW9uICovCiAJcmV0dXJuIEdFVF9BUElDX0xPR0lDQUxfSUQoKih1bnNpZ25lZCBsb25nICopKEFQSUNfQkFTRStBUElDX0xEUikpOwogfQotI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU01QCiAjZGVmaW5lIGNwdV9waHlzaWNhbF9pZChjcHUpCQl4ODZfY3B1X3RvX2FwaWNpZFtjcHVdCiAjZWxzZQogI2RlZmluZSBjcHVfcGh5c2ljYWxfaWQoY3B1KQkJYm9vdF9jcHVfaWQKLSNlbmRpZgotCitzdGF0aWMgaW5saW5lIGludCBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoaW50IGNwdWlkLCB2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pLAorCQkJCXZvaWQgKmluZm8sIGludCByZXRyeSwgaW50IHdhaXQpCit7CisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGhlcmU/ICovCisJZnVuYyhpbmZvKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiAhQ09ORklHX1NNUCAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9zcGlubG9jay5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrLmgKaW5kZXggMjQ4YTc5Zi4uM2RhZjViMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3NwaW5sb2NrLmgKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9yd2xvY2suaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KIAogLyoKICAqIFlvdXIgYmFzaWMgU01QIHNwaW5sb2NrcywgYWxsb3dpbmcgb25seSBhIHNpbmdsZSBDUFUgYW55d2hlcmUKQEAgLTE2LDMxICsxNywyMyBAQAogICogKHRoZSB0eXBlIGRlZmluaXRpb25zIGFyZSBpbiBhc20vc3BpbmxvY2tfdHlwZXMuaCkKICAqLwogCi0jZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKHgpIFwKLQkJKCoodm9sYXRpbGUgc2lnbmVkIGludCAqKSgmKHgpLT5zbG9jaykgPD0gMCkKLQotI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfc3RyaW5nIFwKLQkiXG4xOlx0IiBcCi0JTE9DS19QUkVGSVggIiA7IGRlY2wgJTBcblx0IiBcCi0JImpzIDJmXG4iIFwKLQlMT0NLX1NFQ1RJT05fU1RBUlQoIiIpIFwKLQkiMjpcdCIgXAotCSJyZXA7bm9wXG5cdCIgXAotCSJjbXBsICQwLCUwXG5cdCIgXAotCSJqbGUgMmJcblx0IiBcCi0JImptcCAxYlxuIiBcCi0JTE9DS19TRUNUSU9OX0VORAotCi0jZGVmaW5lIF9fcmF3X3NwaW5fbG9ja19zdHJpbmdfdXAgXAotCSJcblx0ZGVjbCAlMCIKLQotI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja19zdHJpbmcgXAotCSJtb3ZsICQxLCUwIiBcCi0JCToiPW0iIChsb2NrLT5zbG9jaykgOiA6ICJtZW1vcnkiCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19zcGluX2lzX2xvY2tlZChyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlyZXR1cm4gKih2b2xhdGlsZSBzaWduZWQgaW50ICopKCYobG9jayktPnNsb2NrKSA8PSAwOworfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl9sb2NrKHJhd19zcGlubG9ja190ICpsb2NrKQogewotCWFzbSB2b2xhdGlsZShfX3Jhd19zcGluX2xvY2tfc3RyaW5nIDogIj1tIiAobG9jay0+c2xvY2spIDogOiAibWVtb3J5Iik7CisJYXNtIHZvbGF0aWxlKAorCQkiXG4xOlx0IgorCQlMT0NLX1BSRUZJWCAiIDsgZGVjbCAlMFxuXHQiCisJCSJqbnMgMmZcbiIKKwkJIjM6XG4iCisJCSJyZXA7bm9wXG5cdCIKKwkJImNtcGwgJDAsJTBcblx0IgorCQkiamxlIDNiXG5cdCIKKwkJImptcCAxYlxuIgorCQkiMjpcdCIgOiAiPW0iIChsb2NrLT5zbG9jaykgOiA6ICJtZW1vcnkiKTsKIH0KIAogI2RlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpIF9fcmF3X3NwaW5fbG9jayhsb2NrKQpAQCAtNDksNyArNDIsNyBAQAogewogCWludCBvbGR2YWw7CiAKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwlhc20gdm9sYXRpbGUoCiAJCSJ4Y2hnbCAlMCwlMSIKIAkJOiI9cSIgKG9sZHZhbCksICI9bSIgKGxvY2stPnNsb2NrKQogCQk6IjAiICgwKSA6ICJtZW1vcnkiKTsKQEAgLTU5LDEzICs1MiwxNCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2socmF3X3NwaW5sb2NrX3QgKmxvY2spCiB7Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18oCi0JCV9fcmF3X3NwaW5fdW5sb2NrX3N0cmluZwotCSk7CisJYXNtIHZvbGF0aWxlKCJtb3ZsICQxLCUwIiA6Ij1tIiAobG9jay0+c2xvY2spIDo6ICJtZW1vcnkiKTsKIH0KIAotI2RlZmluZSBfX3Jhd19zcGluX3VubG9ja193YWl0KGxvY2spIFwKLQlkbyB7IHdoaWxlIChfX3Jhd19zcGluX2lzX2xvY2tlZChsb2NrKSkgY3B1X3JlbGF4KCk7IH0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfc3Bpbl91bmxvY2tfd2FpdChyYXdfc3BpbmxvY2tfdCAqbG9jaykKK3sKKwl3aGlsZSAoX19yYXdfc3Bpbl9pc19sb2NrZWQobG9jaykpCisJCWNwdV9yZWxheCgpOworfQogCiAvKgogICogUmVhZC13cml0ZSBzcGlubG9ja3MsIGFsbG93aW5nIG11bHRpcGxlIHJlYWRlcnMKQEAgLTc5LDI2ICs3MywzNCBAQAogICoKICAqIE9uIHg4Niwgd2UgaW1wbGVtZW50IHJlYWQtd3JpdGUgbG9ja3MgYXMgYSAzMi1iaXQgY291bnRlcgogICogd2l0aCB0aGUgaGlnaCBiaXQgKHNpZ24pIGJlaW5nIHRoZSAiY29udGVuZGVkIiBiaXQuCi0gKgotICogVGhlIGlubGluZSBhc3NlbWJseSBpcyBub24tb2J2aW91cy4gVGhpbmsgYWJvdXQgaXQuCi0gKgotICogQ2hhbmdlZCB0byB1c2UgdGhlIHNhbWUgdGVjaG5pcXVlIGFzIHJ3IHNlbWFwaG9yZXMuICBTZWUKLSAqIHNlbWFwaG9yZS5oIGZvciBkZXRhaWxzLiAgLWJlbgotICoKLSAqIHRoZSBoZWxwZXJzIGFyZSBpbiBhcmNoL2kzODYva2VybmVsL3NlbWFwaG9yZS5jCiAgKi8KIAotI2RlZmluZSBfX3Jhd19yZWFkX2Nhbl9sb2NrKHgpCQkoKGludCkoeCktPmxvY2sgPiAwKQotI2RlZmluZSBfX3Jhd193cml0ZV9jYW5fbG9jayh4KQkJKCh4KS0+bG9jayA9PSBSV19MT0NLX0JJQVMpCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd19yZWFkX2Nhbl9sb2NrKHJhd19yd2xvY2tfdCAqbG9jaykKK3sKKwlyZXR1cm4gKGludCkobG9jayktPmxvY2sgPiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3Jhd193cml0ZV9jYW5fbG9jayhyYXdfcndsb2NrX3QgKmxvY2spCit7CisJcmV0dXJuIChsb2NrKS0+bG9jayA9PSBSV19MT0NLX0JJQVM7Cit9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jhd19yZWFkX2xvY2socmF3X3J3bG9ja190ICpydykKIHsKLQlfX2J1aWxkX3JlYWRfbG9jayhydywgIl9fcmVhZF9sb2NrX2ZhaWxlZCIpOworCWFzbSB2b2xhdGlsZShMT0NLX1BSRUZJWCAic3VibCAkMSwoJTApXG5cdCIKKwkJICAgICAiam5zIDFmXG4iCisJCSAgICAgImNhbGwgX19yZWFkX2xvY2tfZmFpbGVkXG4iCisJCSAgICAgIjE6XG4iCisJCSAgICAgOjoiRCIgKHJ3KSwgImkiIChSV19MT0NLX0JJQVMpIDogIm1lbW9yeSIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19yYXdfd3JpdGVfbG9jayhyYXdfcndsb2NrX3QgKnJ3KQogewotCV9fYnVpbGRfd3JpdGVfbG9jayhydywgIl9fd3JpdGVfbG9ja19mYWlsZWQiKTsKKwlhc20gdm9sYXRpbGUoTE9DS19QUkVGSVggInN1YmwgJTEsKCUwKVxuXHQiCisJCSAgICAgImp6IDFmXG4iCisJCSAgICAgIlx0Y2FsbCBfX3dyaXRlX2xvY2tfZmFpbGVkXG5cdCIKKwkJICAgICAiMTpcbiIKKwkJICAgICA6OiJEIiAocncpLCAiaSIgKFJXX0xPQ0tfQklBUykgOiAibWVtb3J5Iik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IF9fcmF3X3JlYWRfdHJ5bG9jayhyYXdfcndsb2NrX3QgKmxvY2spCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvc3RhY2t0cmFjZS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3N0YWNrdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWI5Nzk5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3N0YWNrdHJhY2UuaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIF9BU01fU1RBQ0tUUkFDRV9ICisjZGVmaW5lIF9BU01fU1RBQ0tUUkFDRV9IIDEKKworLyogR2VuZXJpYyBzdGFjayB0cmFjZXIgd2l0aCBjYWxsYmFja3MgKi8KKworc3RydWN0IHN0YWNrdHJhY2Vfb3BzIHsKKwl2b2lkICgqd2FybmluZykodm9pZCAqZGF0YSwgY2hhciAqbXNnKTsKKwkvKiBtc2cgbXVzdCBjb250YWluICVzIGZvciB0aGUgc3ltYm9sICovCisJdm9pZCAoKndhcm5pbmdfc3ltYm9sKSh2b2lkICpkYXRhLCBjaGFyICptc2csIHVuc2lnbmVkIGxvbmcgc3ltYm9sKTsKKwl2b2lkICgqYWRkcmVzcykodm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKKwkvKiBPbiBuZWdhdGl2ZSByZXR1cm4gc3RvcCBkdW1waW5nICovCisJaW50ICgqc3RhY2spKHZvaWQgKmRhdGEsIGNoYXIgKm5hbWUpOworfTsKKwordm9pZCBkdW1wX3RyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyAqc3RhY2ssCisJCXN0cnVjdCBzdGFja3RyYWNlX29wcyAqb3BzLCB2b2lkICpkYXRhKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvc3lzdGVtLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvc3lzdGVtLmgKaW5kZXggNmJmMTcwYi4uYmQzNzZiYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3N5c3RlbS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9zeXN0ZW0uaApAQCAtMTQsMTIgKzE0LDEzIEBACiAjZGVmaW5lIF9fUkVTVE9SRShyZWcsb2Zmc2V0KSAibW92cSAoMTQtIiAjb2Zmc2V0ICIpKjgoJSVyc3ApLCUlIiAjcmVnICJcblx0IgogCiAvKiBmcmFtZSBwb2ludGVyIG11c3QgYmUgbGFzdCBmb3IgZ2V0X3djaGFuICovCi0jZGVmaW5lIFNBVkVfQ09OVEVYVCAgICAicHVzaHEgJSVyYnAgOyBtb3ZxICUlcnNpLCUlcmJwXG5cdCIKLSNkZWZpbmUgUkVTVE9SRV9DT05URVhUICJtb3ZxICUlcmJwLCUlcnNpIDsgcG9wcSAlJXJicFxuXHQiCisjZGVmaW5lIFNBVkVfQ09OVEVYVCAgICAicHVzaGYgOyBwdXNocSAlJXJicCA7IG1vdnEgJSVyc2ksJSVyYnBcblx0IgorI2RlZmluZSBSRVNUT1JFX0NPTlRFWFQgIm1vdnEgJSVyYnAsJSVyc2kgOyBwb3BxICUlcmJwIDsgcG9wZlx0IgogCiAjZGVmaW5lIF9fRVhUUkFfQ0xPQkJFUiAgXAogCSwicmN4IiwicmJ4IiwicmR4IiwicjgiLCJyOSIsInIxMCIsInIxMSIsInIxMiIsInIxMyIsInIxNCIsInIxNSIKIAorLyogU2F2ZSByZXN0b3JlIGZsYWdzIHRvIGNsZWFyIGhhbmRsZSBsZWFraW5nIE5UICovCiAjZGVmaW5lIHN3aXRjaF90byhwcmV2LG5leHQsbGFzdCkgXAogCWFzbSB2b2xhdGlsZShTQVZFX0NPTlRFWFQJCQkJCQkgICAgXAogCQkgICAgICJtb3ZxICUlcnNwLCVQW3RocmVhZHJzcF0oJVtwcmV2XSlcblx0IiAvKiBzYXZlIFJTUCAqLwkgIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC90Y2UuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC90Y2UuaAppbmRleCA1M2U5YTY4Li5kYmIwNDdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdGNlLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3RjZS5oCkBAIC0yNCw3ICsyNCw2IEBACiAjaWZuZGVmIF9BU01fWDg2XzY0X1RDRV9ICiAjZGVmaW5lIF9BU01fWDg2XzY0X1RDRV9ICiAKLWV4dGVybiB2b2lkKiB0Y2VfdGFibGVfa3ZhW107CiBleHRlcm4gdW5zaWduZWQgaW50IHNwZWNpZmllZF90YWJsZV9zaXplOwogc3RydWN0IGlvbW11X3RhYmxlOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvdGhlcm1fdGhyb3QuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC90aGVybV90aHJvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYWMwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdGhlcm1fdGhyb3QuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8YXNtLWkzODYvdGhlcm1fdGhyb3QuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3RocmVhZF9pbmZvLmgKaW5kZXggMjAyOWIwMC4uNzg3YTA4MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3RocmVhZF9pbmZvLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3RocmVhZF9pbmZvLmgKQEAgLTExNCwxMSArMTE0LDE0IEBACiAjZGVmaW5lIFRJRl9JUkVUCQk1CS8qIGZvcmNlIElSRVQgKi8KICNkZWZpbmUgVElGX1NZU0NBTExfQVVESVQJNwkvKiBzeXNjYWxsIGF1ZGl0aW5nIGFjdGl2ZSAqLwogI2RlZmluZSBUSUZfU0VDQ09NUAkJOAkvKiBzZWN1cmUgY29tcHV0aW5nICovCisjZGVmaW5lIFRJRl9SRVNUT1JFX1NJR01BU0sJOQkvKiByZXN0b3JlIHNpZ25hbCBtYXNrIGluIGRvX3NpZ25hbCAqLwogLyogMTYgZnJlZSAqLwogI2RlZmluZSBUSUZfSUEzMgkJMTcJLyogMzJiaXQgcHJvY2VzcyAqLyAKICNkZWZpbmUgVElGX0ZPUksJCTE4CS8qIHJldF9mcm9tX2ZvcmsgKi8KICNkZWZpbmUgVElGX0FCSV9QRU5ESU5HCQkxOQogI2RlZmluZSBUSUZfTUVNRElFCQkyMAorI2RlZmluZSBUSUZfREVCVUcJCTIxCS8qIHVzZXMgZGVidWcgcmVnaXN0ZXJzICovCisjZGVmaW5lIFRJRl9JT19CSVRNQVAJCTIyCS8qIHVzZXMgSS9PIGJpdG1hcCAqLwogCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMTw8VElGX1NZU0NBTExfVFJBQ0UpCiAjZGVmaW5lIF9USUZfTk9USUZZX1JFU1VNRQkoMTw8VElGX05PVElGWV9SRVNVTUUpCkBAIC0xMjgsOSArMTMxLDEyIEBACiAjZGVmaW5lIF9USUZfSVJFVAkJKDE8PFRJRl9JUkVUKQogI2RlZmluZSBfVElGX1NZU0NBTExfQVVESVQJKDE8PFRJRl9TWVNDQUxMX0FVRElUKQogI2RlZmluZSBfVElGX1NFQ0NPTVAJCSgxPDxUSUZfU0VDQ09NUCkKKyNkZWZpbmUgX1RJRl9SRVNUT1JFX1NJR01BU0sJKDE8PFRJRl9SRVNUT1JFX1NJR01BU0spCiAjZGVmaW5lIF9USUZfSUEzMgkJKDE8PFRJRl9JQTMyKQogI2RlZmluZSBfVElGX0ZPUksJCSgxPDxUSUZfRk9SSykKICNkZWZpbmUgX1RJRl9BQklfUEVORElORwkoMTw8VElGX0FCSV9QRU5ESU5HKQorI2RlZmluZSBfVElGX0RFQlVHCQkoMTw8VElGX0RFQlVHKQorI2RlZmluZSBfVElGX0lPX0JJVE1BUAkJKDE8PFRJRl9JT19CSVRNQVApCiAKIC8qIHdvcmsgdG8gZG8gb24gaW50ZXJydXB0L2V4Y2VwdGlvbiByZXR1cm4gKi8KICNkZWZpbmUgX1RJRl9XT1JLX01BU0sgXApAQCAtMTM4LDYgKzE0NCw5IEBACiAvKiB3b3JrIHRvIGRvIG9uIGFueSByZXR1cm4gdG8gdXNlciBzcGFjZSAqLwogI2RlZmluZSBfVElGX0FMTFdPUktfTUFTSyAoMHgwMDAwRkZGRiAmIH5fVElGX1NFQ0NPTVApCiAKKy8qIGZsYWdzIHRvIGNoZWNrIGluIF9fc3dpdGNoX3RvKCkgKi8KKyNkZWZpbmUgX1RJRl9XT1JLX0NUWFNXIChfVElGX0RFQlVHfF9USUZfSU9fQklUTUFQKQorCiAjZGVmaW5lIFBSRUVNUFRfQUNUSVZFICAgICAweDEwMDAwMDAwCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvdGxiZmx1c2guaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC90bGJmbHVzaC5oCmluZGV4IGQxNmQ1YjYuLjk4M2JkMjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC90bGJmbHVzaC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC90bGJmbHVzaC5oCkBAIC00LDQ0ICs0LDQ0IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAKLSNkZWZpbmUgX19mbHVzaF90bGIoKQkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQl1bnNpZ25lZCBsb25nIHRtcHJlZzsJCQkJCVwKLQkJCQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCi0JCQkibW92cSAlJWNyMywgJTA7ICAjIGZsdXNoIFRMQiBcbiIJCVwKLQkJCSJtb3ZxICUwLCAlJWNyMzsgICAgICAgICAgICAgIFxuIgkJXAotCQkJOiAiPXIiICh0bXByZWcpCQkJCQlcCi0JCQk6OiAibWVtb3J5Iik7CQkJCQlcCi0JfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBnZXRfY3IzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjcjM7CisJYXNtIHZvbGF0aWxlKCJtb3YgJSVjcjMsJTAiIDogIj1yIiAoY3IzKSk7CisJcmV0dXJuIGNyMzsKK30KIAotLyoKLSAqIEdsb2JhbCBwYWdlcyBoYXZlIHRvIGJlIGZsdXNoZWQgYSBiaXQgZGlmZmVyZW50bHkuIE5vdCBhIHJlYWwKLSAqIHBlcmZvcm1hbmNlIHByb2JsZW0gYmVjYXVzZSB0aGlzIGRvZXMgbm90IGhhcHBlbiBvZnRlbi4KLSAqLwotI2RlZmluZSBfX2ZsdXNoX3RsYl9nbG9iYWwoKQkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCXVuc2lnbmVkIGxvbmcgdG1wcmVnLCBjcjQsIGNyNF9vcmlnOwkJCVwKLQkJCQkJCQkJCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCi0JCQkibW92cSAlJWNyNCwgJTI7ICAjIHR1cm4gb2ZmIFBHRSAgICAgXG4iCVwKLQkJCSJtb3ZxICUyLCAlMTsgICAgICAgICAgICAgICAgICAgICAgICBcbiIJXAotCQkJImFuZHEgJTMsICUxOyAgICAgICAgICAgICAgICAgICAgICAgIFxuIglcCi0JCQkibW92cSAlMSwgJSVjcjQ7ICAgICAgICAgICAgICAgICAgICAgXG4iCVwKLQkJCSJtb3ZxICUlY3IzLCAlMDsgICMgZmx1c2ggVExCICAgICAgICBcbiIJXAotCQkJIm1vdnEgJTAsICUlY3IzOyAgICAgICAgICAgICAgICAgICAgIFxuIglcCi0JCQkibW92cSAlMiwgJSVjcjQ7ICAjIHR1cm4gUEdFIGJhY2sgb24gXG4iCVwKLQkJCTogIj0mciIgKHRtcHJlZyksICI9JnIiIChjcjQpLCAiPSZyIiAoY3I0X29yaWcpCVwKLQkJCTogImkiICh+WDg2X0NSNF9QR0UpCQkJCVwKLQkJCTogIm1lbW9yeSIpOwkJCQkJXAotCX0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NyMyh1bnNpZ25lZCBsb25nIGNyMykKK3sKKwlhc20gdm9sYXRpbGUoIm1vdiAlMCwlJWNyMyIgOjogInIiIChjcjMpIDogIm1lbW9yeSIpOworfQogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBwZ2tlcm5fbWFzazsKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ZsdXNoX3RsYih2b2lkKQoreworCXNldF9jcjMoZ2V0X2NyMygpKTsKK30KIAotI2RlZmluZSBfX2ZsdXNoX3RsYl9hbGwoKSBfX2ZsdXNoX3RsYl9nbG9iYWwoKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9jcjQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNyNDsKKwlhc20gdm9sYXRpbGUoIm1vdiAlJWNyNCwlMCIgOiAiPXIiIChjcjQpKTsKKwlyZXR1cm4gY3I0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NyNCh1bnNpZ25lZCBsb25nIGNyNCkKK3sKKwlhc20gdm9sYXRpbGUoIm1vdiAlMCwlJWNyNCIgOjogInIiIChjcjQpIDogIm1lbW9yeSIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19mbHVzaF90bGJfYWxsKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjcjQgPSBnZXRfY3I0KCk7CisJc2V0X2NyNChjcjQgJiB+WDg2X0NSNF9QR0UpOwkvKiBjbGVhciBQR0UgKi8KKwlzZXRfY3I0KGNyNCk7CQkJLyogd3JpdGUgb2xkIFBHRSBhZ2FpbiBhbmQgZmx1c2ggVExCcyAqLworfQogCiAjZGVmaW5lIF9fZmx1c2hfdGxiX29uZShhZGRyKSBcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oImludmxwZyAlMCI6IDoibSIgKCooY2hhciAqKSBhZGRyKSkKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygiaW52bHBnICglMCkiIDo6ICJyIiAoYWRkcikgOiAibWVtb3J5IikKIAogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC91YWNjZXNzLmgKaW5kZXggMWUxZmEwMC4uZTg1NjU3MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvdWFjY2Vzcy5oCkBAIC04NCw3ICs4NCw3IEBACiAgKi8KIAogI2RlZmluZSBfX2dldF91c2VyX3goc2l6ZSxyZXQseCxwdHIpIFwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2FsbCBfX2dldF91c2VyXyIgI3NpemUgXAorCWFzbSB2b2xhdGlsZSgiY2FsbCBfX2dldF91c2VyXyIgI3NpemUgXAogCQk6Ij1hIiAocmV0KSwiPWQiICh4KSBcCiAJCToiYyIgKHB0cikgXAogCQk6InI4IikKQEAgLTEwMSw3ICsxMDEsNyBAQAogCWNhc2UgODogIF9fZ2V0X3VzZXJfeCg4LF9fcmV0X2d1LF9fdmFsX2d1LHB0cik7IGJyZWFrOwkJXAogCWRlZmF1bHQ6IF9fZ2V0X3VzZXJfYmFkKCk7IGJyZWFrOwkJCQlcCiAJfQkJCQkJCQkJXAotCSh4KSA9IChfX3R5cGVvZl9fKCoocHRyKSkpX192YWxfZ3U7CQkJCVwKKwkoeCkgPSAodHlwZW9mKCoocHRyKSkpX192YWxfZ3U7CQkJCVwKIAlfX3JldF9ndTsJCQkJCQkJXAogfSkKIApAQCAtMTEyLDcgKzExMiw3IEBACiBleHRlcm4gdm9pZCBfX3B1dF91c2VyX2JhZCh2b2lkKTsKIAogI2RlZmluZSBfX3B1dF91c2VyX3goc2l6ZSxyZXQseCxwdHIpCQkJCQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oImNhbGwgX19wdXRfdXNlcl8iICNzaXplCQkJXAorCWFzbSB2b2xhdGlsZSgiY2FsbCBfX3B1dF91c2VyXyIgI3NpemUJCQlcCiAJCToiPWEiIChyZXQpCQkJCQkJXAogCQk6ImMiIChwdHIpLCJkIiAoeCkJCQkJCVwKIAkJOiJyOCIpCkBAIC0xMzksNyArMTM5LDcgQEAKICNkZWZpbmUgX19wdXRfdXNlcl9jaGVjayh4LHB0cixzaXplKQkJCVwKICh7CQkJCQkJCVwKIAlpbnQgX19wdV9lcnI7CQkJCQlcCi0JX190eXBlb2ZfXygqKHB0cikpIF9fdXNlciAqX19wdV9hZGRyID0gKHB0cik7CVwKKwl0eXBlb2YoKihwdHIpKSBfX3VzZXIgKl9fcHVfYWRkciA9IChwdHIpOwlcCiAJc3dpdGNoIChzaXplKSB7IAkJCQlcCiAJY2FzZSAxOiBfX3B1dF91c2VyX3goMSxfX3B1X2Vycix4LF9fcHVfYWRkcik7IGJyZWFrOwlcCiAJY2FzZSAyOiBfX3B1dF91c2VyX3goMixfX3B1X2Vycix4LF9fcHVfYWRkcik7IGJyZWFrOwlcCkBAIC0xNzMsNyArMTczLDcgQEAKICAqIGFsaWFzaW5nIGlzc3Vlcy4KICAqLwogI2RlZmluZSBfX3B1dF91c2VyX2FzbSh4LCBhZGRyLCBlcnIsIGl0eXBlLCBydHlwZSwgbHR5cGUsIGVycm5vKQlcCi0JX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCisJYXNtIHZvbGF0aWxlKAkJCQkJXAogCQkiMToJbW92Iml0eXBlIiAlInJ0eXBlIjEsJTJcbiIJCVwKIAkJIjI6XG4iCQkJCQkJXAogCQkiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJCVwKQEAgLTE5Myw3ICsxOTMsNyBAQAogCWludCBfX2d1X2VycjsJCQkJCQlcCiAJdW5zaWduZWQgbG9uZyBfX2d1X3ZhbDsJCQkJCVwKIAlfX2dldF91c2VyX3NpemUoX19ndV92YWwsKHB0ciksKHNpemUpLF9fZ3VfZXJyKTsJXAotCSh4KSA9IChfX3R5cGVvZl9fKCoocHRyKSkpX19ndV92YWw7CQkJXAorCSh4KSA9ICh0eXBlb2YoKihwdHIpKSlfX2d1X3ZhbDsJCQlcCiAJX19ndV9lcnI7CQkJCQkJXAogfSkKIApAQCAtMjE3LDcgKzIxNyw3IEBACiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIF9fZ2V0X3VzZXJfYXNtKHgsIGFkZHIsIGVyciwgaXR5cGUsIHJ0eXBlLCBsdHlwZSwgZXJybm8pCVwKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKKwlhc20gdm9sYXRpbGUoCQkJCQlcCiAJCSIxOgltb3YiaXR5cGUiICUyLCUicnR5cGUiMVxuIgkJXAogCQkiMjpcbiIJCQkJCQlcCiAJCSIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJXApAQCAtMjM3LDE1ICsyMzcsMjAgQEAKICAqLwogCiAvKiBIYW5kbGVzIGV4Y2VwdGlvbnMgaW4gYm90aCB0byBhbmQgZnJvbSwgYnV0IGRvZXNuJ3QgZG8gYWNjZXNzX29rICovCi1leHRlcm4gdW5zaWduZWQgbG9uZyBjb3B5X3VzZXJfZ2VuZXJpYyh2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbGVuKTsgCitfX211c3RfY2hlY2sgdW5zaWduZWQgbG9uZworY29weV91c2VyX2dlbmVyaWModm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxlbik7CiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGNvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxlbik7IAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsZW4pOyAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGNvcHlfaW5fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsZW4pOyAKK19fbXVzdF9jaGVjayB1bnNpZ25lZCBsb25nCitjb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsZW4pOworX19tdXN0X2NoZWNrIHVuc2lnbmVkIGxvbmcKK2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbGVuKTsKK19fbXVzdF9jaGVjayB1bnNpZ25lZCBsb25nCitjb3B5X2luX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbGVuKTsKIAotc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX19jb3B5X2Zyb21fdXNlcih2b2lkICpkc3QsIGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHVuc2lnbmVkIHNpemUpCitzdGF0aWMgX19hbHdheXNfaW5saW5lIF9fbXVzdF9jaGVjaworaW50IF9fY29weV9mcm9tX3VzZXIodm9pZCAqZHN0LCBjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB1bnNpZ25lZCBzaXplKQogeyAKLSAgICAgICBpbnQgcmV0ID0gMDsKKwlpbnQgcmV0ID0gMDsKIAlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKQogCQlyZXR1cm4gY29weV91c2VyX2dlbmVyaWMoZHN0LChfX2ZvcmNlIHZvaWQgKilzcmMsc2l6ZSk7CiAJc3dpdGNoIChzaXplKSB7IApAQCAtMjcyLDkgKzI3NywxMCBAQAogCX0KIH0JCiAKLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fY29weV90b191c2VyKHZvaWQgX191c2VyICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgdW5zaWduZWQgc2l6ZSkKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgX19tdXN0X2NoZWNrCitpbnQgX19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBzaXplKQogeyAKLSAgICAgICBpbnQgcmV0ID0gMDsKKwlpbnQgcmV0ID0gMDsKIAlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKQogCQlyZXR1cm4gY29weV91c2VyX2dlbmVyaWMoKF9fZm9yY2Ugdm9pZCAqKWRzdCxzcmMsc2l6ZSk7CiAJc3dpdGNoIChzaXplKSB7IApAQCAtMzAzLDEwICszMDksMTAgQEAKIAl9CiB9CQogCi0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IF9fY29weV9pbl91c2VyKHZvaWQgX191c2VyICpkc3QsIGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHVuc2lnbmVkIHNpemUpCitzdGF0aWMgX19hbHdheXNfaW5saW5lIF9fbXVzdF9jaGVjaworaW50IF9fY29weV9pbl91c2VyKHZvaWQgX191c2VyICpkc3QsIGNvbnN0IHZvaWQgX191c2VyICpzcmMsIHVuc2lnbmVkIHNpemUpCiB7IAotICAgICAgIGludCByZXQgPSAwOworCWludCByZXQgPSAwOwogCWlmICghX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpCiAJCXJldHVybiBjb3B5X3VzZXJfZ2VuZXJpYygoX19mb3JjZSB2b2lkICopZHN0LChfX2ZvcmNlIHZvaWQgKilzcmMsc2l6ZSk7CiAJc3dpdGNoIChzaXplKSB7IApAQCAtMzQ0LDE1ICszNTAsMTcgQEAKIAl9CiB9CQogCi1sb25nIHN0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgbG9uZyBjb3VudCk7Ci1sb25nIF9fc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KTsKLWxvbmcgc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzdHIsIGxvbmcgbik7Ci1sb25nIF9fc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzdHIsIGxvbmcgbik7Ci1sb25nIHN0cmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzdHIpOwotdW5zaWduZWQgbG9uZyBjbGVhcl91c2VyKHZvaWQgX191c2VyICptZW0sIHVuc2lnbmVkIGxvbmcgbGVuKTsKLXVuc2lnbmVkIGxvbmcgX19jbGVhcl91c2VyKHZvaWQgX191c2VyICptZW0sIHVuc2lnbmVkIGxvbmcgbGVuKTsKK19fbXVzdF9jaGVjayBsb25nIAorc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KTsKK19fbXVzdF9jaGVjayBsb25nIAorX19zdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgY291bnQpOworX19tdXN0X2NoZWNrIGxvbmcgc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzdHIsIGxvbmcgbik7CitfX211c3RfY2hlY2sgbG9uZyBfX3N0cm5sZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3RyLCBsb25nIG4pOworX19tdXN0X2NoZWNrIGxvbmcgc3RybGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnN0cik7CitfX211c3RfY2hlY2sgdW5zaWduZWQgbG9uZyBjbGVhcl91c2VyKHZvaWQgX191c2VyICptZW0sIHVuc2lnbmVkIGxvbmcgbGVuKTsKK19fbXVzdF9jaGVjayB1bnNpZ25lZCBsb25nIF9fY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqbWVtLCB1bnNpZ25lZCBsb25nIGxlbik7CiAKLSNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWMgX19jb3B5X3RvX3VzZXIKLSNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyBfX2NvcHlfZnJvbV91c2VyCitfX211c3RfY2hlY2sgbG9uZyBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdW5zaWduZWQgc2l6ZSk7CisjZGVmaW5lIF9fY29weV90b191c2VyX2luYXRvbWljIGNvcHlfdXNlcl9nZW5lcmljCiAKICNlbmRpZiAvKiBfX1g4Nl82NF9VQUNDRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC91bmlzdGQuaAppbmRleCA4MGZkNDhlLi42MTM3MTQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3VuaXN0ZC5oCkBAIC02MDAsOSArNjAwLDkgQEAKICNkZWZpbmUgX19OUl9mYWNjZXNzYXQJCTI2OQogX19TWVNDQUxMKF9fTlJfZmFjY2Vzc2F0LCBzeXNfZmFjY2Vzc2F0KQogI2RlZmluZSBfX05SX3BzZWxlY3Q2CQkyNzAKLV9fU1lTQ0FMTChfX05SX3BzZWxlY3Q2LCBzeXNfbmlfc3lzY2FsbCkJLyogZm9yIG5vdyAqLworX19TWVNDQUxMKF9fTlJfcHNlbGVjdDYsIHN5c19wc2VsZWN0NikKICNkZWZpbmUgX19OUl9wcG9sbAkJMjcxCi1fX1NZU0NBTEwoX19OUl9wcG9sbCwJc3lzX25pX3N5c2NhbGwpCQkvKiBmb3Igbm93ICovCitfX1NZU0NBTEwoX19OUl9wcG9sbCwJc3lzX3Bwb2xsKQogI2RlZmluZSBfX05SX3Vuc2hhcmUJCTI3MgogX19TWVNDQUxMKF9fTlJfdW5zaGFyZSwJc3lzX3Vuc2hhcmUpCiAjZGVmaW5lIF9fTlJfc2V0X3JvYnVzdF9saXN0CTI3MwpAQCAtNjIzLDE2ICs2MjMsMTcgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNkZWZpbmUgX19OUl9zeXNjYWxsX21heCBfX05SX21vdmVfcGFnZXMKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogI2lmbmRlZiBfX05PX1NUVUJTCiAKLS8qIHVzZXItdmlzaWJsZSBlcnJvciBudW1iZXJzIGFyZSBpbiB0aGUgcmFuZ2UgLTEgLSAtNDA5NSAqLworLyogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC1NQVhfRVJSTk8gKi8KIAogI2RlZmluZSBfX3N5c2NhbGxfY2xvYmJlciAicjExIiwicmN4IiwibWVtb3J5IiAKIAogI2RlZmluZSBfX3N5c2NhbGxfcmV0dXJuKHR5cGUsIHJlcykgXAogZG8geyBcCi0JaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtMTI3KSkgeyBcCisJaWYgKCh1bnNpZ25lZCBsb25nKShyZXMpID49ICh1bnNpZ25lZCBsb25nKSgtTUFYX0VSUk5PKSkgeyBcCiAJCWVycm5vID0gLShyZXMpOyBcCiAJCXJlcyA9IC0xOyBcCiAJfSBcCkBAIC02NTgsNiArNjU5LDcgQEAKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BFTkRJTkcKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1NJR1BST0NNQVNLCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdBQ1RJT04KKyNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1JUX1NJR1NVU1BFTkQKICNkZWZpbmUgX19BUkNIX1dBTlRfU1lTX1RJTUUKICNkZWZpbmUgX19BUkNIX1dBTlRfQ09NUEFUX1NZU19USU1FCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC91bndpbmQuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC91bndpbmQuaAppbmRleCAxZjZlOWJmLi4yZTdmZjEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdW53aW5kLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3Vud2luZC5oCkBAIC0xOCw2ICsxOCw3IEBACiB7CiAJc3RydWN0IHB0X3JlZ3MgcmVnczsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJdW5zaWduZWQgY2FsbF9mcmFtZToxOwogfTsKIAogI2RlZmluZSBVTldfUEMoZnJhbWUpICAgICAgICAoZnJhbWUpLT5yZWdzLnJpcApAQCAtNTcsNiArNTgsMTAgQEAKIAlQVFJFR1NfSU5GTyhyMTUpLCBcCiAJUFRSRUdTX0lORk8ocmlwKQogCisjZGVmaW5lIFVOV19ERUZBVUxUX1JBKHJhSXRlbSwgZGF0YUFsaWduKSBcCisJKChyYUl0ZW0pLndoZXJlID09IE1lbW9yeSAmJiBcCisJICEoKHJhSXRlbSkudmFsdWUgKiAoZGF0YUFsaWduKSArIDgpKQorCiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF91bndfaW5pdF9mcmFtZV9pbmZvKHN0cnVjdCB1bndpbmRfZnJhbWVfaW5mbyAqaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb25zdCovIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtOTQsOCArOTksOCBAQAogCiAjZWxzZQogCi0jZGVmaW5lIFVOV19QQyhmcmFtZSkgKCh2b2lkKShmcmFtZSksIDApCi0jZGVmaW5lIFVOV19TUChmcmFtZSkgKCh2b2lkKShmcmFtZSksIDApCisjZGVmaW5lIFVOV19QQyhmcmFtZSkgKCh2b2lkKShmcmFtZSksIDBVTCkKKyNkZWZpbmUgVU5XX1NQKGZyYW1lKSAoKHZvaWQpKGZyYW1lKSwgMFVMKQogCiBzdGF0aWMgaW5saW5lIGludCBhcmNoX3Vud191c2VyX21vZGUoY29uc3Qgdm9pZCAqaW5mbykKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC92c3lzY2FsbC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3ZzeXNjYWxsLmgKaW5kZXggMTQ2YjI0NC4uMjI4MWU5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3ZzeXNjYWxsLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3ZzeXNjYWxsLmgKQEAgLTQsNiArNCw3IEBACiBlbnVtIHZzeXNjYWxsX251bSB7CiAJX19OUl92Z2V0dGltZW9mZGF5LAogCV9fTlJfdnRpbWUsCisJX19OUl92Z2V0Y3B1LAogfTsKIAogI2RlZmluZSBWU1lTQ0FMTF9TVEFSVCAoLTEwVUwgPDwgMjApCkBAIC0xNSw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgogCiAjZGVmaW5lIF9fc2VjdGlvbl92eHRpbWUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCwgX19zZWN0aW9uX18gKCIudnh0aW1lIiksIGFsaWduZWQoMTYpKSkKKyNkZWZpbmUgX19zZWN0aW9uX3ZnZXRjcHVfbW9kZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkLCBfX3NlY3Rpb25fXyAoIi52Z2V0Y3B1X21vZGUiKSwgYWxpZ25lZCgxNikpKQogI2RlZmluZSBfX3NlY3Rpb25fd2FsbF9qaWZmaWVzIF9fYXR0cmlidXRlX18gKCh1bnVzZWQsIF9fc2VjdGlvbl9fICgiLndhbGxfamlmZmllcyIpLCBhbGlnbmVkKDE2KSkpCiAjZGVmaW5lIF9fc2VjdGlvbl9qaWZmaWVzIF9fYXR0cmlidXRlX18gKCh1bnVzZWQsIF9fc2VjdGlvbl9fICgiLmppZmZpZXMiKSwgYWxpZ25lZCgxNikpKQogI2RlZmluZSBfX3NlY3Rpb25fc3lzX3R6IF9fYXR0cmlidXRlX18gKCh1bnVzZWQsIF9fc2VjdGlvbl9fICgiLnN5c190eiIpLCBhbGlnbmVkKDE2KSkpCkBAIC0yNiw2ICsyOCw5IEBACiAjZGVmaW5lIFZYVElNRV9IUEVUCTIKICNkZWZpbmUgVlhUSU1FX1BNVE1SCTMKIAorI2RlZmluZSBWR0VUQ1BVX1JEVFNDUAkxCisjZGVmaW5lIFZHRVRDUFVfTFNMCTIKKwogc3RydWN0IHZ4dGltZV9kYXRhIHsKIAlsb25nIGhwZXRfYWRkcmVzczsJLyogSFBFVCBiYXNlIGFkZHJlc3MgKi8KIAlpbnQgbGFzdDsKQEAgLTQwLDYgKzQ1LDcgQEAKIAogLyogdnN5c2NhbGwgc3BhY2UgKHJlYWRvbmx5KSAqLwogZXh0ZXJuIHN0cnVjdCB2eHRpbWVfZGF0YSBfX3Z4dGltZTsKK2V4dGVybiBpbnQgX192Z2V0Y3B1X21vZGU7CiBleHRlcm4gc3RydWN0IHRpbWVzcGVjIF9feHRpbWU7CiBleHRlcm4gdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBfX2ppZmZpZXM7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX3dhbGxfamlmZmllczsKQEAgLTQ4LDYgKzU0LDcgQEAKIAogLyoga2VybmVsIHNwYWNlICh3cml0ZWFibGUpICovCiBleHRlcm4gc3RydWN0IHZ4dGltZV9kYXRhIHZ4dGltZTsKK2V4dGVybiBpbnQgdmdldGNwdV9tb2RlOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgd2FsbF9qaWZmaWVzOwogZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CiBleHRlcm4gaW50IHN5c2N0bF92c3lzY2FsbDsKQEAgLTU1LDYgKzYyLDggQEAKIAogZXh0ZXJuIGludCBzeXNjdGxfdnN5c2NhbGw7CiAKK2V4dGVybiB2b2lkIHZzeXNjYWxsX3NldF9jcHUoaW50IGNwdSk7CisKICNkZWZpbmUgQVJDSF9IQVZFX1hUSU1FX0xPQ0sgMQogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hZXIuaCBiL2luY2x1ZGUvbGludXgvYWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAyZTE3OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvYWVyLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBJbnRlbCBDb3JwLgorICogICAgIFRvbSBMb25nIE5ndXllbiAodG9tLmwubmd1eWVuQGludGVsLmNvbSkKKyAqICAgICBaaGFuZyBZYW5taW4gKHlhbm1pbi56aGFuZ0BpbnRlbC5jb20pCisgKi8KKworI2lmbmRlZiBfQUVSX0hfCisjZGVmaW5lIF9BRVJfSF8KKworI2lmIGRlZmluZWQoQ09ORklHX1BDSUVBRVIpCisvKiBwY2ktZSBwb3J0IGRyaXZlciBuZWVkcyB0aGlzIGZ1bmN0aW9uIHRvIGVuYWJsZSBhZXIgKi8KK2V4dGVybiBpbnQgcGNpX2VuYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK2V4dGVybiBpbnQgcGNpX2ZpbmRfYWVyX2NhcGFiaWxpdHkoc3RydWN0IHBjaV9kZXYgKmRldik7CitleHRlcm4gaW50IHBjaV9kaXNhYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworZXh0ZXJuIGludCBwY2lfY2xlYW51cF9hZXJfdW5jb3JyZWN0X2Vycm9yX3N0YXR1cyhzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKKyNlbHNlCisjZGVmaW5lIHBjaV9lbmFibGVfcGNpZV9lcnJvcl9yZXBvcnRpbmcoZGV2KQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBwY2lfZmluZF9hZXJfY2FwYWJpbGl0eShkZXYpCQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBwY2lfZGlzYWJsZV9wY2llX2Vycm9yX3JlcG9ydGluZyhkZXYpCQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHBjaV9jbGVhbnVwX2Flcl91bmNvcnJlY3RfZXJyb3Jfc3RhdHVzKGRldikJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNlbmRpZiAvL19BRVJfSF8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jZGV2LmggYi9pbmNsdWRlL2xpbnV4L2NkZXYuaAppbmRleCAyMjE2NjM4Li5lZTVmNTNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NkZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NkZXYuaApAQCAtMjMsNSArMjMsNyBAQAogCiB2b2lkIGNkX2ZvcmdldChzdHJ1Y3QgaW5vZGUgKik7CiAKK2V4dGVybiBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyBkaXJlY3RseV9tYXBwYWJsZV9jZGV2X2JkaTsKKwogI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaCBiL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaAppbmRleCA5YjRmMTEwLi4wNjBiOTYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21waWxlci5oCkBAIC05OSw2ICs5OSwxMSBAQAogI2RlZmluZSBfX211c3RfY2hlY2sKICNlbmRpZgogCisjaWZuZGVmIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSworI3VuZGVmIF9fbXVzdF9jaGVjaworI2RlZmluZSBfX211c3RfY2hlY2sKKyNlbmRpZgorCiAvKgogICogQWxsb3cgdXMgdG8gYXZvaWQgJ2RlZmluZWQgYnV0IG5vdCB1c2VkJyB3YXJuaW5ncyBvbiBmdW5jdGlvbnMgYW5kIGRhdGEsCiAgKiBhcyB3ZWxsIGFzIGZvcmNlIHRoZW0gdG8gYmUgZW1pdHRlZCB0byB0aGUgYXNzZW1ibHkgZmlsZS4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCmluZGV4IDFlNWYzMGQuLjY2MmU2YTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9kZXZpY2UuaApAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9rbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KQEAgLTUxLDE0ICs1MiwxNyBAQAogCWludAkJKCpwcm9iZSkoc3RydWN0IGRldmljZSAqIGRldik7CiAJaW50CQkoKnJlbW92ZSkoc3RydWN0IGRldmljZSAqIGRldik7CiAJdm9pZAkJKCpzaHV0ZG93bikoc3RydWN0IGRldmljZSAqIGRldik7Ci0JaW50CQkoKnN1c3BlbmQpKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7Ci0JaW50CQkoKnJlc3VtZSkoc3RydWN0IGRldmljZSAqIGRldik7CisKKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgZGV2aWNlICogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCWludCAoKnN1c3BlbmRfbGF0ZSkoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQgKCpyZXN1bWVfZWFybHkpKHN0cnVjdCBkZXZpY2UgKiBkZXYpOworCWludCAoKnJlc3VtZSkoc3RydWN0IGRldmljZSAqIGRldik7CiB9OwogCi1leHRlcm4gaW50IGJ1c19yZWdpc3RlcihzdHJ1Y3QgYnVzX3R5cGUgKiBidXMpOworZXh0ZXJuIGludCBfX211c3RfY2hlY2sgYnVzX3JlZ2lzdGVyKHN0cnVjdCBidXNfdHlwZSAqIGJ1cyk7CiBleHRlcm4gdm9pZCBidXNfdW5yZWdpc3RlcihzdHJ1Y3QgYnVzX3R5cGUgKiBidXMpOwogCi1leHRlcm4gdm9pZCBidXNfcmVzY2FuX2RldmljZXMoc3RydWN0IGJ1c190eXBlICogYnVzKTsKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIGJ1c19yZXNjYW5fZGV2aWNlcyhzdHJ1Y3QgYnVzX3R5cGUgKiBidXMpOwogCiAvKiBpdGVyYXRvciBoZWxwZXJzIGZvciBidXNlcyAqLwogCkBAIC02Nyw5ICs3MSw5IEBACiBzdHJ1Y3QgZGV2aWNlICogYnVzX2ZpbmRfZGV2aWNlKHN0cnVjdCBidXNfdHlwZSAqYnVzLCBzdHJ1Y3QgZGV2aWNlICpzdGFydCwKIAkJCQl2b2lkICpkYXRhLCBpbnQgKCptYXRjaCkoc3RydWN0IGRldmljZSAqLCB2b2lkICopKTsKIAotaW50IGJ1c19mb3JfZWFjaF9kcnYoc3RydWN0IGJ1c190eXBlICogYnVzLCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIHN0YXJ0LCAKLQkJICAgICB2b2lkICogZGF0YSwgaW50ICgqZm4pKHN0cnVjdCBkZXZpY2VfZHJpdmVyICosIHZvaWQgKikpOwotCitpbnQgX19tdXN0X2NoZWNrIGJ1c19mb3JfZWFjaF9kcnYoc3RydWN0IGJ1c190eXBlICpidXMsCisJCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpzdGFydCwgdm9pZCAqZGF0YSwKKwkJaW50ICgqZm4pKHN0cnVjdCBkZXZpY2VfZHJpdmVyICosIHZvaWQgKikpOwogCiAvKiBkcml2ZXJmcyBpbnRlcmZhY2UgZm9yIGV4cG9ydGluZyBidXMgYXR0cmlidXRlcyAqLwogCkBAIC04Miw3ICs4Niw4IEBACiAjZGVmaW5lIEJVU19BVFRSKF9uYW1lLF9tb2RlLF9zaG93LF9zdG9yZSkJXAogc3RydWN0IGJ1c19hdHRyaWJ1dGUgYnVzX2F0dHJfIyNfbmFtZSA9IF9fQVRUUihfbmFtZSxfbW9kZSxfc2hvdyxfc3RvcmUpCiAKLWV4dGVybiBpbnQgYnVzX2NyZWF0ZV9maWxlKHN0cnVjdCBidXNfdHlwZSAqLCBzdHJ1Y3QgYnVzX2F0dHJpYnV0ZSAqKTsKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIGJ1c19jcmVhdGVfZmlsZShzdHJ1Y3QgYnVzX3R5cGUgKiwKKwkJCQkJc3RydWN0IGJ1c19hdHRyaWJ1dGUgKik7CiBleHRlcm4gdm9pZCBidXNfcmVtb3ZlX2ZpbGUoc3RydWN0IGJ1c190eXBlICosIHN0cnVjdCBidXNfYXR0cmlidXRlICopOwogCiBzdHJ1Y3QgZGV2aWNlX2RyaXZlciB7CkBAIC0xMDEsMTYgKzEwNiwxOCBAQAogCXZvaWQJKCpzaHV0ZG93bikJKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwogCWludAkoKnN1c3BlbmQpCShzdHJ1Y3QgZGV2aWNlICogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwogCWludAkoKnJlc3VtZSkJKHN0cnVjdCBkZXZpY2UgKiBkZXYpOworCisJdW5zaWduZWQgaW50IG11bHRpdGhyZWFkX3Byb2JlOjE7CiB9OwogCiAKLWV4dGVybiBpbnQgZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICogZHJ2KTsKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIGRyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydik7CiBleHRlcm4gdm9pZCBkcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydik7CiAKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGdldF9kcml2ZXIoc3RydWN0IGRldmljZV9kcml2ZXIgKiBkcnYpOwogZXh0ZXJuIHZvaWQgcHV0X2RyaXZlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydik7CiBleHRlcm4gc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlcl9maW5kKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBidXNfdHlwZSAqYnVzKTsKLQorZXh0ZXJuIGludCBkcml2ZXJfcHJvYmVfZG9uZSh2b2lkKTsKIAogLyogZHJpdmVyZnMgaW50ZXJmYWNlIGZvciBleHBvcnRpbmcgZHJpdmVyIGF0dHJpYnV0ZXMgKi8KIApAQCAtMTIzLDE2ICsxMzAsMTcgQEAKICNkZWZpbmUgRFJJVkVSX0FUVFIoX25hbWUsX21vZGUsX3Nob3csX3N0b3JlKQlcCiBzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSBkcml2ZXJfYXR0cl8jI19uYW1lID0gX19BVFRSKF9uYW1lLF9tb2RlLF9zaG93LF9zdG9yZSkKIAotZXh0ZXJuIGludCBkcml2ZXJfY3JlYXRlX2ZpbGUoc3RydWN0IGRldmljZV9kcml2ZXIgKiwgc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgKik7CitleHRlcm4gaW50IF9fbXVzdF9jaGVjayBkcml2ZXJfY3JlYXRlX2ZpbGUoc3RydWN0IGRldmljZV9kcml2ZXIgKiwKKwkJCQkJc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgKik7CiBleHRlcm4gdm9pZCBkcml2ZXJfcmVtb3ZlX2ZpbGUoc3RydWN0IGRldmljZV9kcml2ZXIgKiwgc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgKik7CiAKLWV4dGVybiBpbnQgZHJpdmVyX2Zvcl9lYWNoX2RldmljZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydiwgc3RydWN0IGRldmljZSAqIHN0YXJ0LAotCQkJCSAgdm9pZCAqIGRhdGEsIGludCAoKmZuKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpOworZXh0ZXJuIGludCBfX211c3RfY2hlY2sgZHJpdmVyX2Zvcl9lYWNoX2RldmljZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydiwKKwkJc3RydWN0IGRldmljZSAqc3RhcnQsIHZvaWQgKmRhdGEsCisJCWludCAoKmZuKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpOwogc3RydWN0IGRldmljZSAqIGRyaXZlcl9maW5kX2RldmljZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LAogCQkJCSAgIHN0cnVjdCBkZXZpY2UgKnN0YXJ0LCB2b2lkICpkYXRhLAogCQkJCSAgIGludCAoKm1hdGNoKShzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKikpOwogCi0KIC8qCiAgKiBkZXZpY2UgY2xhc3NlcwogICovCkBAIC0xNDYsMTcgKzE1NCwyNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQJaW50ZXJmYWNlczsKIAlzdHJ1Y3Qgc2VtYXBob3JlCXNlbTsJLyogbG9ja3MgYm90aCB0aGUgY2hpbGRyZW4gYW5kIGludGVyZmFjZXMgbGlzdHMgKi8KIAorCXN0cnVjdCBrb2JqZWN0CQkqdmlydHVhbF9kaXI7CisKIAlzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlCQkqIGNsYXNzX2F0dHJzOwogCXN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlCSogY2xhc3NfZGV2X2F0dHJzOworCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCQkqIGRldl9hdHRyczsKIAogCWludAkoKnVldmVudCkoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2LCBjaGFyICoqZW52cCwKIAkJCSAgIGludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpOworCWludAkoKmRldl91ZXZlbnQpKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsIGludCBudW1fZW52cCwKKwkJCQljaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSk7CiAKIAl2b2lkCSgqcmVsZWFzZSkoc3RydWN0IGNsYXNzX2RldmljZSAqZGV2KTsKIAl2b2lkCSgqY2xhc3NfcmVsZWFzZSkoc3RydWN0IGNsYXNzICpjbGFzcyk7CisJdm9pZAkoKmRldl9yZWxlYXNlKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisJaW50CSgqc3VzcGVuZCkoc3RydWN0IGRldmljZSAqLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCWludAkoKnJlc3VtZSkoc3RydWN0IGRldmljZSAqKTsKIH07CiAKLWV4dGVybiBpbnQgY2xhc3NfcmVnaXN0ZXIoc3RydWN0IGNsYXNzICopOworZXh0ZXJuIGludCBfX211c3RfY2hlY2sgY2xhc3NfcmVnaXN0ZXIoc3RydWN0IGNsYXNzICopOwogZXh0ZXJuIHZvaWQgY2xhc3NfdW5yZWdpc3RlcihzdHJ1Y3QgY2xhc3MgKik7CiAKIApAQCAtMTY5LDcgKzE4Niw4IEBACiAjZGVmaW5lIENMQVNTX0FUVFIoX25hbWUsX21vZGUsX3Nob3csX3N0b3JlKQkJCVwKIHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgY2xhc3NfYXR0cl8jI19uYW1lID0gX19BVFRSKF9uYW1lLF9tb2RlLF9zaG93LF9zdG9yZSkgCiAKLWV4dGVybiBpbnQgY2xhc3NfY3JlYXRlX2ZpbGUoc3RydWN0IGNsYXNzICosIGNvbnN0IHN0cnVjdCBjbGFzc19hdHRyaWJ1dGUgKik7CitleHRlcm4gaW50IF9fbXVzdF9jaGVjayBjbGFzc19jcmVhdGVfZmlsZShzdHJ1Y3QgY2xhc3MgKiwKKwkJCQkJY29uc3Qgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZSAqKTsKIGV4dGVybiB2b2lkIGNsYXNzX3JlbW92ZV9maWxlKHN0cnVjdCBjbGFzcyAqLCBjb25zdCBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICopOwogCiBzdHJ1Y3QgY2xhc3NfZGV2aWNlX2F0dHJpYnV0ZSB7CkBAIC0xODIsNyArMjAwLDcgQEAKIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlIGNsYXNzX2RldmljZV9hdHRyXyMjX25hbWUgPSAJXAogCV9fQVRUUihfbmFtZSxfbW9kZSxfc2hvdyxfc3RvcmUpCiAKLWV4dGVybiBpbnQgY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKHN0cnVjdCBjbGFzc19kZXZpY2UgKiwKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIGNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICosCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICopOwogCiAvKioKQEAgLTI0MiwxMCArMjYwLDEwIEBACiB9CiAKIAotZXh0ZXJuIGludCBjbGFzc19kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGNsYXNzX2RldmljZSAqKTsKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIGNsYXNzX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgY2xhc3NfZGV2aWNlICopOwogZXh0ZXJuIHZvaWQgY2xhc3NfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGNsYXNzX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIGNsYXNzX2RldmljZV9pbml0aWFsaXplKHN0cnVjdCBjbGFzc19kZXZpY2UgKik7Ci1leHRlcm4gaW50IGNsYXNzX2RldmljZV9hZGQoc3RydWN0IGNsYXNzX2RldmljZSAqKTsKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIGNsYXNzX2RldmljZV9hZGQoc3RydWN0IGNsYXNzX2RldmljZSAqKTsKIGV4dGVybiB2b2lkIGNsYXNzX2RldmljZV9kZWwoc3RydWN0IGNsYXNzX2RldmljZSAqKTsKIAogZXh0ZXJuIGludCBjbGFzc19kZXZpY2VfcmVuYW1lKHN0cnVjdCBjbGFzc19kZXZpY2UgKiwgY2hhciAqKTsKQEAgLTI1NSw3ICsyNzMsNyBAQAogCiBleHRlcm4gdm9pZCBjbGFzc19kZXZpY2VfcmVtb3ZlX2ZpbGUoc3RydWN0IGNsYXNzX2RldmljZSAqLCAKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICopOwotZXh0ZXJuIGludCBjbGFzc19kZXZpY2VfY3JlYXRlX2Jpbl9maWxlKHN0cnVjdCBjbGFzc19kZXZpY2UgKiwKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIGNsYXNzX2RldmljZV9jcmVhdGVfYmluX2ZpbGUoc3RydWN0IGNsYXNzX2RldmljZSAqLAogCQkJCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqKTsKIGV4dGVybiB2b2lkIGNsYXNzX2RldmljZV9yZW1vdmVfYmluX2ZpbGUoc3RydWN0IGNsYXNzX2RldmljZSAqLAogCQkJCQkgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKik7CkBAIC0yNjYsMjIgKzI4NCwyMyBAQAogCiAJaW50ICgqYWRkKQkoc3RydWN0IGNsYXNzX2RldmljZSAqLCBzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICopOwogCXZvaWQgKCpyZW1vdmUpCShzdHJ1Y3QgY2xhc3NfZGV2aWNlICosIHN0cnVjdCBjbGFzc19pbnRlcmZhY2UgKik7CisJaW50ICgqYWRkX2RldikJCShzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBjbGFzc19pbnRlcmZhY2UgKik7CisJdm9pZCAoKnJlbW92ZV9kZXYpCShzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBjbGFzc19pbnRlcmZhY2UgKik7CiB9OwogCi1leHRlcm4gaW50IGNsYXNzX2ludGVyZmFjZV9yZWdpc3RlcihzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICopOworZXh0ZXJuIGludCBfX211c3RfY2hlY2sgY2xhc3NfaW50ZXJmYWNlX3JlZ2lzdGVyKHN0cnVjdCBjbGFzc19pbnRlcmZhY2UgKik7CiBleHRlcm4gdm9pZCBjbGFzc19pbnRlcmZhY2VfdW5yZWdpc3RlcihzdHJ1Y3QgY2xhc3NfaW50ZXJmYWNlICopOwogCi1leHRlcm4gc3RydWN0IGNsYXNzICpjbGFzc19jcmVhdGUoc3RydWN0IG1vZHVsZSAqb3duZXIsIGNoYXIgKm5hbWUpOworZXh0ZXJuIHN0cnVjdCBjbGFzcyAqY2xhc3NfY3JlYXRlKHN0cnVjdCBtb2R1bGUgKm93bmVyLCBjb25zdCBjaGFyICpuYW1lKTsKIGV4dGVybiB2b2lkIGNsYXNzX2Rlc3Ryb3koc3RydWN0IGNsYXNzICpjbHMpOwogZXh0ZXJuIHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZV9jcmVhdGUoc3RydWN0IGNsYXNzICpjbHMsCiAJCQkJCQlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpwYXJlbnQsCiAJCQkJCQlkZXZfdCBkZXZ0LAogCQkJCQkJc3RydWN0IGRldmljZSAqZGV2aWNlLAotCQkJCQkJY2hhciAqZm10LCAuLi4pCisJCQkJCQljb25zdCBjaGFyICpmbXQsIC4uLikKIAkJCQkJX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50Ziw1LDYpKSk7CiBleHRlcm4gdm9pZCBjbGFzc19kZXZpY2VfZGVzdHJveShzdHJ1Y3QgY2xhc3MgKmNscywgZGV2X3QgZGV2dCk7CiAKLQogLyogaW50ZXJmYWNlIGZvciBleHBvcnRpbmcgZGV2aWNlIGF0dHJpYnV0ZXMgKi8KIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHsKIAlzdHJ1Y3QgYXR0cmlidXRlCWF0dHI7CkBAIC0yOTQsOCArMzEzLDEzIEBACiAjZGVmaW5lIERFVklDRV9BVFRSKF9uYW1lLF9tb2RlLF9zaG93LF9zdG9yZSkgXAogc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfIyNfbmFtZSA9IF9fQVRUUihfbmFtZSxfbW9kZSxfc2hvdyxfc3RvcmUpCiAKLWV4dGVybiBpbnQgZGV2aWNlX2NyZWF0ZV9maWxlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKiBlbnRyeSk7CitleHRlcm4gaW50IF9fbXVzdF9jaGVjayBkZXZpY2VfY3JlYXRlX2ZpbGUoc3RydWN0IGRldmljZSAqZGV2aWNlLAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqIGVudHJ5KTsKIGV4dGVybiB2b2lkIGRldmljZV9yZW1vdmVfZmlsZShzdHJ1Y3QgZGV2aWNlICogZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqIGF0dHIpOworZXh0ZXJuIGludCBfX211c3RfY2hlY2sgZGV2aWNlX2NyZWF0ZV9iaW5fZmlsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0cik7CitleHRlcm4gdm9pZCBkZXZpY2VfcmVtb3ZlX2Jpbl9maWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0cik7CiBzdHJ1Y3QgZGV2aWNlIHsKIAlzdHJ1Y3Qga2xpc3QJCWtsaXN0X2NoaWxkcmVuOwogCXN0cnVjdCBrbGlzdF9ub2RlCWtub2RlX3BhcmVudDsJCS8qIG5vZGUgaW4gc2libGluZyBsaXN0ICovCkBAIC0zMDUsNiArMzI5LDcgQEAKIAogCXN0cnVjdCBrb2JqZWN0IGtvYmo7CiAJY2hhcglidXNfaWRbQlVTX0lEX1NJWkVdOwkvKiBwb3NpdGlvbiBvbiBwYXJlbnQgYnVzICovCisJdW5zaWduZWQJCWlzX3JlZ2lzdGVyZWQ6MTsKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSB1ZXZlbnRfYXR0cjsKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2dF9hdHRyOwogCkBAIC0zMzgsNiArMzYzLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7CiAJc3RydWN0IGNsYXNzCQkqY2xhc3M7CQkvKiBvcHRpb25hbCovCiAJZGV2X3QJCQlkZXZ0OwkJLyogZGV2X3QsIGNyZWF0ZXMgdGhlIHN5c2ZzICJkZXYiICovCisJc3RydWN0IGF0dHJpYnV0ZV9ncm91cAkqKmdyb3VwczsJLyogb3B0aW9uYWwgZ3JvdXBzICovCiAKIAl2b2lkCSgqcmVsZWFzZSkoc3RydWN0IGRldmljZSAqIGRldik7CiB9OwpAQCAtMzU2LDM4ICszODIsNDEgQEAKIAogc3RhdGljIGlubGluZSBpbnQgZGV2aWNlX2lzX3JlZ2lzdGVyZWQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiBrbGlzdF9ub2RlX2F0dGFjaGVkKCZkZXYtPmtub2RlX2J1cyk7CisJcmV0dXJuIGRldi0+aXNfcmVnaXN0ZXJlZDsKIH0KIAogLyoKICAqIEhpZ2ggbGV2ZWwgcm91dGluZXMgZm9yIHVzZSBieSB0aGUgYnVzIGRyaXZlcnMKICAqLwotZXh0ZXJuIGludCBkZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqIGRldik7CitleHRlcm4gaW50IF9fbXVzdF9jaGVjayBkZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqIGRldik7CiBleHRlcm4gdm9pZCBkZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICogZGV2KTsKIGV4dGVybiB2b2lkIGRldmljZV9pbml0aWFsaXplKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwotZXh0ZXJuIGludCBkZXZpY2VfYWRkKHN0cnVjdCBkZXZpY2UgKiBkZXYpOworZXh0ZXJuIGludCBfX211c3RfY2hlY2sgZGV2aWNlX2FkZChzdHJ1Y3QgZGV2aWNlICogZGV2KTsKIGV4dGVybiB2b2lkIGRldmljZV9kZWwoc3RydWN0IGRldmljZSAqIGRldik7Ci1leHRlcm4gaW50IGRldmljZV9mb3JfZWFjaF9jaGlsZChzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKiwKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIGRldmljZV9mb3JfZWFjaF9jaGlsZChzdHJ1Y3QgZGV2aWNlICosIHZvaWQgKiwKIAkJICAgICBpbnQgKCpmbikoc3RydWN0IGRldmljZSAqLCB2b2lkICopKTsKK2V4dGVybiBpbnQgZGV2aWNlX3JlbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKm5ld19uYW1lKTsKIAogLyoKICAqIE1hbnVhbCBiaW5kaW5nIG9mIGEgZGV2aWNlIHRvIGRyaXZlci4gU2VlIGRyaXZlcnMvYmFzZS9idXMuYwogICogZm9yIGluZm9ybWF0aW9uIG9uIHVzZS4KICAqLwotZXh0ZXJuIHZvaWQgZGV2aWNlX2JpbmRfZHJpdmVyKHN0cnVjdCBkZXZpY2UgKiBkZXYpOworZXh0ZXJuIGludCBfX211c3RfY2hlY2sgZGV2aWNlX2JpbmRfZHJpdmVyKHN0cnVjdCBkZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBkZXZpY2VfcmVsZWFzZV9kcml2ZXIoc3RydWN0IGRldmljZSAqIGRldik7Ci1leHRlcm4gaW50ICBkZXZpY2VfYXR0YWNoKHN0cnVjdCBkZXZpY2UgKiBkZXYpOwotZXh0ZXJuIHZvaWQgZHJpdmVyX2F0dGFjaChzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqIGRydik7Ci1leHRlcm4gdm9pZCBkZXZpY2VfcmVwcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCAgX19tdXN0X2NoZWNrIGRldmljZV9hdHRhY2goc3RydWN0IGRldmljZSAqIGRldik7CitleHRlcm4gaW50IF9fbXVzdF9jaGVjayBkcml2ZXJfYXR0YWNoKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpOworZXh0ZXJuIGludCBfX211c3RfY2hlY2sgZGV2aWNlX3JlcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTsKIAogLyoKICAqIEVhc3kgZnVuY3Rpb25zIGZvciBkeW5hbWljYWxseSBjcmVhdGluZyBkZXZpY2VzIG9uIHRoZSBmbHkKICAqLwogZXh0ZXJuIHN0cnVjdCBkZXZpY2UgKmRldmljZV9jcmVhdGUoc3RydWN0IGNsYXNzICpjbHMsIHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKLQkJCQkgICAgZGV2X3QgZGV2dCwgY2hhciAqZm10LCAuLi4pCisJCQkJICAgIGRldl90IGRldnQsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQogCQkJCSAgICBfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLDQsNSkpKTsKIGV4dGVybiB2b2lkIGRldmljZV9kZXN0cm95KHN0cnVjdCBjbGFzcyAqY2xzLCBkZXZfdCBkZXZ0KTsKIAorZXh0ZXJuIGludCB2aXJ0dWFsX2RldmljZV9wYXJlbnQoc3RydWN0IGRldmljZSAqZGV2KTsKKwogLyoKICAqIFBsYXRmb3JtICJmaXh1cCIgZnVuY3Rpb25zIC0gYWxsb3cgdGhlIHBsYXRmb3JtIHRvIGhhdmUgdGhlaXIgc2F5CiAgKiBhYm91dCBkZXZpY2VzIGFuZCBhY3Rpb25zIHRoYXQgdGhlIGdlbmVyYWwgZGV2aWNlIGxheWVyIGRvZXNuJ3QKQEAgLTQxMiw3ICs0NDEsNyBAQAogCiAKIC8qIGRyaXZlcnMvYmFzZS9maXJtd2FyZS5jICovCi1leHRlcm4gaW50IGZpcm13YXJlX3JlZ2lzdGVyKHN0cnVjdCBzdWJzeXN0ZW0gKik7CitleHRlcm4gaW50IF9fbXVzdF9jaGVjayBmaXJtd2FyZV9yZWdpc3RlcihzdHJ1Y3Qgc3Vic3lzdGVtICopOwogZXh0ZXJuIHZvaWQgZmlybXdhcmVfdW5yZWdpc3RlcihzdHJ1Y3Qgc3Vic3lzdGVtICopOwogCiAvKiBkZWJ1Z2dpbmcgYW5kIHRyb3VibGVzaG9vdGluZy9kaWFnbm9zdGljIGhlbHBlcnMuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VkZC5oIGIvaW5jbHVkZS9saW51eC9lZGQuaAppbmRleCAxNjI1MTJiLi5iMmIzZTY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VkZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZWRkLmgKQEAgLTUyLDYgKzUyLDcgQEAKICNkZWZpbmUgRUREX0NMX0VRVUFMUyAgIDB4M2Q2NDY0NjUgICAgIC8qICJlZGQ9IiAqLwogI2RlZmluZSBFRERfQ0xfT0ZGICAgICAgMHg2NjZmICAgICAgICAgLyogIm9mIiBmb3Igb2ZmICAqLwogI2RlZmluZSBFRERfQ0xfU0tJUCAgICAgMHg2YjczICAgICAgICAgLyogInNrIiBmb3Igc2tpcG1iciAqLworI2RlZmluZSBFRERfQ0xfT04gICAgICAgMHg2ZTZmCSAgICAgICAvKiAib24iIGZvciBvbiAqLwogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Vpc2EuaCBiL2luY2x1ZGUvbGludXgvZWlzYS5oCmluZGV4IDQwNzkyNDIuLjFmZjdjMTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZWlzYS5oCisrKyBiL2luY2x1ZGUvbGludXgvZWlzYS5oCkBAIC0zLDggKzMsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAKLSNkZWZpbmUgRUlTQV9TSUdfTEVOICAgOAogI2RlZmluZSBFSVNBX01BWF9TTE9UUyA4CiAKICNkZWZpbmUgRUlTQV9NQVhfUkVTT1VSQ0VTIDQKQEAgLTI3LDEyICsyNyw2IEBACiAjZGVmaW5lIEVJU0FfQ09ORklHX0VOQUJMRUQgICAgICAgICAxCiAjZGVmaW5lIEVJU0FfQ09ORklHX0ZPUkNFRCAgICAgICAgICAyCiAKLS8qIFRoZSBFSVNBIHNpZ25hdHVyZSwgaW4gQVNDSUkgZm9ybSwgbnVsbCB0ZXJtaW5hdGVkICovCi1zdHJ1Y3QgZWlzYV9kZXZpY2VfaWQgewotCWNoYXIgICAgICAgICAgc2lnW0VJU0FfU0lHX0xFTl07Ci0JdW5zaWduZWQgbG9uZyBkcml2ZXJfZGF0YTsKLX07Ci0KIC8qIFRoZXJlIGlzIG5vdCBtdWNoIHdlIGNhbiBzYXkgYWJvdXQgYW4gRUlTQSBkZXZpY2UsIGFwYXJ0IGZyb20KICAqIHNpZ25hdHVyZSwgc2xvdCBudW1iZXIsIGFuZCBiYXNlIGFkZHJlc3MuIGRtYV9tYXNrIGlzIHNldCBieQogICogZGVmYXVsdCB0byBwYXJlbnQgZGV2aWNlIG1hc2suLiovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Vyci5oIGIvaW5jbHVkZS9saW51eC9lcnIuaAppbmRleCBjZDNiMzY3Li4xYWIxZDQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Vyci5oCisrKyBiL2luY2x1ZGUvbGludXgvZXJyLmgKQEAgLTE1LDYgKzE1LDggQEAKICAqLwogI2RlZmluZSBNQVhfRVJSTk8JNDA5NQogCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCiAjZGVmaW5lIElTX0VSUl9WQUxVRSh4KSB1bmxpa2VseSgoeCkgPj0gKHVuc2lnbmVkIGxvbmcpLU1BWF9FUlJOTykKIAogc3RhdGljIGlubGluZSB2b2lkICpFUlJfUFRSKGxvbmcgZXJyb3IpCkBAIC0zMiw0ICszNCw2IEBACiAJcmV0dXJuIElTX0VSUl9WQUxVRSgodW5zaWduZWQgbG9uZylwdHIpOwogfQogCisjZW5kaWYKKwogI2VuZGlmIC8qIF9MSU5VWF9FUlJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAppbmRleCAwZWVkOTE4Li5jYzA4ZjU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnMuaApAQCAtNDYwLDcgKzQ2MCw3IEBACiAJICovCiAJX191OAlzX3ByZWFsbG9jX2Jsb2NrczsJLyogTnIgb2YgYmxvY2tzIHRvIHRyeSB0byBwcmVhbGxvY2F0ZSovCiAJX191OAlzX3ByZWFsbG9jX2Rpcl9ibG9ja3M7CS8qIE5yIHRvIHByZWFsbG9jYXRlIGZvciBkaXJzICovCi0JX191MTYJc19yZXNlcnZlZF9nZHRfYmxvY2tzOwkvKiBQZXIgZ3JvdXAgZGVzYyBmb3Igb25saW5lIGdyb3d0aCAqLworCV9fbGUxNglzX3Jlc2VydmVkX2dkdF9ibG9ja3M7CS8qIFBlciBncm91cCBkZXNjIGZvciBvbmxpbmUgZ3Jvd3RoICovCiAJLyoKIAkgKiBKb3VybmFsaW5nIHN1cHBvcnQgdmFsaWQgaWYgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCBzZXQuCiAJICovCkBAIC00NzMsNyArNDczLDcgQEAKIAlfX3U4CXNfcmVzZXJ2ZWRfY2hhcl9wYWQ7CiAJX191MTYJc19yZXNlcnZlZF93b3JkX3BhZDsKIAlfX2xlMzIJc19kZWZhdWx0X21vdW50X29wdHM7Ci0JX19sZTMyCXNfZmlyc3RfbWV0YV9iZzsgCS8qIEZpcnN0IG1ldGFibG9jayBibG9jayBncm91cCAqLworCV9fbGUzMglzX2ZpcnN0X21ldGFfYmc7CS8qIEZpcnN0IG1ldGFibG9jayBibG9jayBncm91cCAqLwogCV9fdTMyCXNfcmVzZXJ2ZWRbMTkwXTsJLyogUGFkZGluZyB0byB0aGUgZW5kIG9mIHRoZSBibG9jayAqLwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9leHQzX2ZzX2kuaCBiL2luY2x1ZGUvbGludXgvZXh0M19mc19pLmgKaW5kZXggMmYxOGI5NS4uNDM5NWU1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2ZzX2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnNfaS5oCkBAIC0zNSw3ICszNSw3IEBACiB9OwogCiBzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlIHsKLQlzdHJ1Y3QgcmJfbm9kZQkgCXJzdl9ub2RlOworCXN0cnVjdCByYl9ub2RlCQlyc3Zfbm9kZTsKIAlfX3UzMgkJCXJzdl9nb2FsX3NpemU7CiAJX191MzIJCQlyc3ZfYWxsb2NfaGl0OwogCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93CXJzdl93aW5kb3c7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V4dDNfamJkLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfamJkLmgKaW5kZXggYzgzMDdjMC4uY2UwZTYxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2piZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZXh0M19qYmQuaApAQCAtMjMsNyArMjMsNyBAQAogCiAvKiBEZWZpbmUgdGhlIG51bWJlciBvZiBibG9ja3Mgd2UgbmVlZCB0byBhY2NvdW50IHRvIGEgdHJhbnNhY3Rpb24gdG8KICAqIG1vZGlmeSBvbmUgYmxvY2sgb2YgZGF0YS4KLSAqIAorICoKICAqIFdlIG1heSBoYXZlIHRvIHRvdWNoIG9uZSBpbm9kZSwgb25lIGJpdG1hcCBidWZmZXIsIHVwIHRvIHRocmVlCiAgKiBpbmRpcmVjdGlvbiBibG9ja3MsIHRoZSBncm91cCBhbmQgc3VwZXJibG9jayBzdW1tYXJpZXMsIGFuZCB0aGUgZGF0YQogICogYmxvY2sgdG8gY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uLiAgKi8KQEAgLTg4LDE2ICs4OCwxNiBAQAogI2VuZGlmCiAKIGludAotZXh0M19tYXJrX2lsb2NfZGlydHkoaGFuZGxlX3QgKmhhbmRsZSwgCitleHQzX21hcmtfaWxvY19kaXJ0eShoYW5kbGVfdCAqaGFuZGxlLAogCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCSAgICAgc3RydWN0IGV4dDNfaWxvYyAqaWxvYyk7CiAKLS8qIAorLyoKICAqIE9uIHN1Y2Nlc3MsIFdlIGVuZCB1cCB3aXRoIGFuIG91dHN0YW5kaW5nIHJlZmVyZW5jZSBjb3VudCBhZ2FpbnN0Ci0gKiBpbG9jLT5iaC4gIFRoaXMgX211c3RfIGJlIGNsZWFuZWQgdXAgbGF0ZXIuIAorICogaWxvYy0+YmguICBUaGlzIF9tdXN0XyBiZSBjbGVhbmVkIHVwIGxhdGVyLgogICovCiAKLWludCBleHQzX3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgCitpbnQgZXh0M19yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQlzdHJ1Y3QgZXh0M19pbG9jICppbG9jKTsKIAogaW50IGV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnMuaCBiL2luY2x1ZGUvbGludXgvZnMuaAppbmRleCAxZDNlNjAxLi44Zjc0ZGZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9mcy5oCkBAIC01MTIsNyArNTEyLDYgQEAKIAlzdHJ1Y3QgdGltZXNwZWMJCWlfbXRpbWU7CiAJc3RydWN0IHRpbWVzcGVjCQlpX2N0aW1lOwogCXVuc2lnbmVkIGludAkJaV9ibGtiaXRzOwotCXVuc2lnbmVkIGxvbmcJCWlfYmxrc2l6ZTsKIAl1bnNpZ25lZCBsb25nCQlpX3ZlcnNpb247CiAJYmxrY250X3QJCWlfYmxvY2tzOwogCXVuc2lnbmVkIHNob3J0ICAgICAgICAgIGlfYnl0ZXM7CkBAIC01MjgsMTEgKzUyNywxMiBAQAogI2lmZGVmIENPTkZJR19RVU9UQQogCXN0cnVjdCBkcXVvdAkJKmlfZHF1b3RbTUFYUVVPVEFTXTsKICNlbmRpZgotCS8qIFRoZXNlIHRocmVlIHNob3VsZCBwcm9iYWJseSBiZSBhIHVuaW9uICovCiAJc3RydWN0IGxpc3RfaGVhZAlpX2RldmljZXM7Ci0Jc3RydWN0IHBpcGVfaW5vZGVfaW5mbwkqaV9waXBlOwotCXN0cnVjdCBibG9ja19kZXZpY2UJKmlfYmRldjsKLQlzdHJ1Y3QgY2RldgkJKmlfY2RldjsKKwl1bmlvbiB7CisJCXN0cnVjdCBwaXBlX2lub2RlX2luZm8JKmlfcGlwZTsKKwkJc3RydWN0IGJsb2NrX2RldmljZQkqaV9iZGV2OworCQlzdHJ1Y3QgY2RldgkJKmlfY2RldjsKKwl9OwogCWludAkJCWlfY2luZGV4OwogCiAJX191MzIJCQlpX2dlbmVyYXRpb247CkBAIC01NTQsOSArNTU0LDcgQEAKIAogCWF0b21pY190CQlpX3dyaXRlY291bnQ7CiAJdm9pZAkJCSppX3NlY3VyaXR5OwotCXVuaW9uIHsKLQkJdm9pZAkJKmdlbmVyaWNfaXA7Ci0JfSB1OworCXZvaWQJCQkqaV9wcml2YXRlOyAvKiBmcyBvciBkZXZpY2UgcHJpdmF0ZSBwb2ludGVyICovCiAjaWZkZWYgX19ORUVEX0lfU0laRV9PUkRFUkVECiAJc2VxY291bnRfdAkJaV9zaXplX3NlcWNvdW50OwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dldGNwdS5oIGIvaW5jbHVkZS9saW51eC9nZXRjcHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzFlZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9nZXRjcHUuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9MSU5VWF9HRVRDUFVfSAorI2RlZmluZSBfTElOVVhfR0VUQ1BVX0ggMQorCisvKiBDYWNoZSBmb3IgZ2V0Y3B1KCkgdG8gc3BlZWQgaXQgdXAuIFJlc3VsdHMgbWlnaHQgYmUgdXB0byBhIGppZmZpZQorICAgb3V0IG9mIGRhdGUsIGJ1dCB3aWxsIGJlIGZhc3Rlci4KKyAgIFVzZXIgcHJvZ3JhbXMgc2hvdWxkIG5vdCByZWZlciB0byB0aGUgY29udGVudHMgb2YgdGhpcyBzdHJ1Y3R1cmUuCisgICBJdCBpcyBvbmx5IGEgY2FjaGUgZm9yIHZnZXRjcHUoKS4gSXQgbWlnaHQgY2hhbmdlIGluIGZ1dHVyZSBrZXJuZWxzLgorICAgVGhlIHVzZXIgcHJvZ3JhbSBtdXN0IHN0b3JlIHRoaXMgaW5mb3JtYXRpb24gcGVyIHRocmVhZCAoX190aHJlYWQpCisgICBJZiB5b3Ugd2FudCAxMDAlIGFjY3VyYXRlIGluZm9ybWF0aW9uIHBhc3MgTlVMTCBpbnN0ZWFkLiAqLworc3RydWN0IGdldGNwdV9jYWNoZSB7CisJdW5zaWduZWQgbG9uZyB0MDsKKwl1bnNpZ25lZCBsb25nIHQxOworCXVuc2lnbmVkIGxvbmcgcmVzWzRdOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dmcC5oIGIvaW5jbHVkZS9saW51eC9nZnAuaAppbmRleCA4YjM0YWFiLi5iZjJiNmJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dmcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKQEAgLTY3LDcgKzY3LDEyIEBACiAjZGVmaW5lIEdGUF9ISUdIVVNFUgkoX19HRlBfV0FJVCB8IF9fR0ZQX0lPIHwgX19HRlBfRlMgfCBfX0dGUF9IQVJEV0FMTCB8IFwKIAkJCSBfX0dGUF9ISUdITUVNKQogCisjaWZkZWYgQ09ORklHX05VTUEKICNkZWZpbmUgR0ZQX1RISVNOT0RFCShfX0dGUF9USElTTk9ERSB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVUUlkpCisjZWxzZQorI2RlZmluZSBHRlBfVEhJU05PREUJMAorI2VuZGlmCisKIAogLyogRmxhZyAtIGluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgd2lsbCBiZSBzdWl0YWJsZSBmb3IgRE1BLiAgSWdub3JlZCBvbiBzb21lCiAgICBwbGF0Zm9ybXMsIHVzZWQgYXMgYXBwcm9wcmlhdGUgb24gb3RoZXJzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy1hbGdvLWJpdC5oIGIvaW5jbHVkZS9saW51eC9pMmMtYWxnby1iaXQuaAppbmRleCBjMGU3ZmFiLi5jOGY4ZGYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy1hbGdvLWJpdC5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLWFsZ28tYml0LmgKQEAgLTQwLDcgKzQwLDYgQEAKIAkvKiBsb2NhbCBzZXR0aW5ncyAqLwogCWludCB1ZGVsYXk7CQkvKiBoYWxmLWNsb2NrLWN5Y2xlIHRpbWUgaW4gbWljcm9zZWNzICovCiAJCQkJLyogaS5lLiBjbG9jayBpcyAoNTAwIC8gdWRlbGF5KSBLSHogKi8KLQlpbnQgbWRlbGF5OwkJLyogaW4gbWlsbGlzZWNzLCB1bnVzZWQgKi8KIAlpbnQgdGltZW91dDsJCS8qIGluIGppZmZpZXMgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjLWFsZ28tcGNmLmggYi9pbmNsdWRlL2xpbnV4L2kyYy1hbGdvLXBjZi5oCmluZGV4IDE4YjBhZGYuLjk5MDhmM2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjLWFsZ28tcGNmLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMtYWxnby1wY2YuaApAQCAtMzUsNyArMzUsNiBAQAogCiAJLyogbG9jYWwgc2V0dGluZ3MgKi8KIAlpbnQgdWRlbGF5OwotCWludCBtZGVsYXk7CiAJaW50IHRpbWVvdXQ7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy1hbGdvLXNpYnl0ZS5oIGIvaW5jbHVkZS9saW51eC9pMmMtYWxnby1zaWJ5dGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5MTRkZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy1hbGdvLXNpYnl0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyLDIwMDMgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKLSAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0jaWZuZGVmIEkyQ19BTEdPX1NJQllURV9ICi0jZGVmaW5lIEkyQ19BTEdPX1NJQllURV9IIDEKLQotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotCi1zdHJ1Y3QgaTJjX2FsZ29fc2lieXRlX2RhdGEgewotCXZvaWQgKmRhdGE7CQkvKiBwcml2YXRlIGRhdGEgKi8KLSAgICAgICAgaW50ICAgYnVzOwkJLyogd2hpY2ggYnVzICovCi0gICAgICAgIHZvaWQgKnJlZ19iYXNlOwkJLyogQ1NSIGJhc2UgKi8KLX07Ci0KLWludCBpMmNfc2lieXRlX2FkZF9idXMoc3RydWN0IGkyY19hZGFwdGVyICosIGludCBzcGVlZCk7Ci1pbnQgaTJjX3NpYnl0ZV9kZWxfYnVzKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKLQotI2VuZGlmIC8qIEkyQ19BTEdPX1NJQllURV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy5oIGIvaW5jbHVkZS9saW51eC9pMmMuaAppbmRleCBlYjA2MjhhLi45YjVkMDQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLmgKQEAgLTY0LDE0ICs2NCw2IEBACiAgKi8KIGV4dGVybiBpbnQgaTJjX3RyYW5zZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pOwogCi0vKgotICogU29tZSBhZGFwdGVyIHR5cGVzIChpLmUuIFBDRiA4NTg0IGJhc2VkIG9uZXMpIG1heSBzdXBwb3J0IHNsYXZlIGJlaGF2aXVvci4gCi0gKiBUaGlzIGlzIG5vdCB0ZXN0ZWQvaW1wbGVtZW50ZWQgeWV0IGFuZCB3aWxsIGNoYW5nZSBpbiB0aGUgZnV0dXJlLgotICovCi1leHRlcm4gaW50IGkyY19zbGF2ZV9zZW5kKHN0cnVjdCBpMmNfY2xpZW50ICosY2hhciosaW50KTsKLWV4dGVybiBpbnQgaTJjX3NsYXZlX3JlY3Yoc3RydWN0IGkyY19jbGllbnQgKixjaGFyKixpbnQpOwotCi0KIAogLyogVGhpcyBpcyB0aGUgdmVyeSBnZW5lcmFsaXplZCBTTUJ1cyBhY2Nlc3Mgcm91dGluZS4gWW91IHByb2JhYmx5IGRvIG5vdAogICAgd2FudCB0byB1c2UgdGhpcywgdGhvdWdoOyBvbmUgb2YgdGhlIGZ1bmN0aW9ucyBiZWxvdyBtYXkgYmUgbXVjaCBlYXNpZXIsCkBAIC0yMDEsMTAgKzE5Myw2IEBACiAJICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCiAJICAgICAgICAgICAgICAgICAgIHU4IGNvbW1hbmQsIGludCBzaXplLCB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEpOwogCi0JLyogLS0tIHRoZXNlIG9wdGlvbmFsL2Z1dHVyZSB1c2UgZm9yIHNvbWUgYWRhcHRlciB0eXBlcy4qLwotCWludCAoKnNsYXZlX3NlbmQpKHN0cnVjdCBpMmNfYWRhcHRlciAqLGNoYXIqLGludCk7Ci0JaW50ICgqc2xhdmVfcmVjdikoc3RydWN0IGkyY19hZGFwdGVyICosY2hhciosaW50KTsKLQogCS8qIC0tLSBpb2N0bCBsaWtlIGNhbGwgdG8gc2V0IGRpdi4gcGFyYW1ldGVycy4gKi8KIAlpbnQgKCphbGdvX2NvbnRyb2wpKHN0cnVjdCBpMmNfYWRhcHRlciAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogCkBAIC0yMjAsNyArMjA4LDcgQEAKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAl1bnNpZ25lZCBpbnQgaWQ7CiAJdW5zaWduZWQgaW50IGNsYXNzOwotCXN0cnVjdCBpMmNfYWxnb3JpdGhtICphbGdvOy8qIHRoZSBhbGdvcml0aG0gdG8gYWNjZXNzIHRoZSBidXMJKi8KKwljb25zdCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSAqYWxnbzsgLyogdGhlIGFsZ29yaXRobSB0byBhY2Nlc3MgdGhlIGJ1cyAqLwogCXZvaWQgKmFsZ29fZGF0YTsKIAogCS8qIC0tLSBhZG1pbmlzdHJhdGlvbiBzdHVmZi4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdC5oIGIvaW5jbHVkZS9saW51eC9pbml0LmgKaW5kZXggNjY2Nzc4NS4uZTkyYjE0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbml0LmgKKysrIGIvaW5jbHVkZS9saW51eC9pbml0LmgKQEAgLTY4LDYgKzY4LDcgQEAKIAogLyogRGVmaW5lZCBpbiBpbml0L21haW4uYyAqLwogZXh0ZXJuIGNoYXIgc2F2ZWRfY29tbWFuZF9saW5lW107CitleHRlcm4gdW5zaWduZWQgaW50IHJlc2V0X2RldmljZXM7CiAKIC8qIHVzZWQgYnkgaW5pdC9tYWluLmMgKi8KIGV4dGVybiB2b2lkIHNldHVwX2FyY2goY2hhciAqKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2piZC5oIGIvaW5jbHVkZS9saW51eC9qYmQuaAppbmRleCBhMDRjMTU0Li5hNmQ5ZGFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2piZC5oCisrKyBiL2luY2x1ZGUvbGludXgvamJkLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogbGludXgvaW5jbHVkZS9saW51eC9qYmQuaAotICogCisgKgogICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPgogICoKICAqIENvcHlyaWdodCAxOTk4LTIwMDAgUmVkIEhhdCwgSW5jIC0tLSBBbGwgUmlnaHRzIFJlc2VydmVkCkBAIC02NCw3ICs2NCw3IEBACiAJCWlmICgobikgPD0gam91cm5hbF9lbmFibGVfZGVidWcpIHsJCQlcCiAJCQlwcmludGsgKEtFUk5fREVCVUcgIiglcywgJWQpOiAlczogIiwJCVwKIAkJCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7CVwKLQkJICAJcHJpbnRrIChmLCAjIyBhKTsJCQkJXAorCQkJcHJpbnRrIChmLCAjIyBhKTsJCQkJXAogCQl9CQkJCQkJCVwKIAl9IHdoaWxlICgwKQogI2Vsc2UKQEAgLTk3LDggKzk3LDggQEAKICAqIG51bWJlciBvZiBvdXRzdGFuZGluZyBidWZmZXJzIHBvc3NpYmxlIGF0IGFueSB0aW1lLiAgV2hlbiB0aGUKICAqIG9wZXJhdGlvbiBjb21wbGV0ZXMsIGFueSBidWZmZXIgY3JlZGl0cyBub3QgdXNlZCBhcmUgY3JlZGl0ZWQgYmFjayB0bwogICogdGhlIHRyYW5zYWN0aW9uLCBzbyB0aGF0IGF0IGFsbCB0aW1lcyB3ZSBrbm93IGhvdyBtYW55IGJ1ZmZlcnMgdGhlCi0gKiBvdXRzdGFuZGluZyB1cGRhdGVzIG9uIGEgdHJhbnNhY3Rpb24gbWlnaHQgcG9zc2libHkgdG91Y2guIAotICogCisgKiBvdXRzdGFuZGluZyB1cGRhdGVzIG9uIGEgdHJhbnNhY3Rpb24gbWlnaHQgcG9zc2libHkgdG91Y2guCisgKgogICogVGhpcyBpcyBhbiBvcGFxdWUgZGF0YXR5cGUuCiAgKiovCiB0eXBlZGVmIHN0cnVjdCBoYW5kbGVfcwkJaGFuZGxlX3Q7CS8qIEF0b21pYyBvcGVyYXRpb24gdHlwZSAqLwpAQCAtMTA4LDcgKzEwOCw3IEBACiAgKiB0eXBlZGVmIGpvdXJuYWxfdCAtIFRoZSBqb3VybmFsX3QgbWFpbnRhaW5zIGFsbCBvZiB0aGUgam91cm5hbGluZyBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgYSBzaW5nbGUgZmlsZXN5c3RlbS4KICAqCiAgKiBqb3VybmFsX3QgaXMgbGlua2VkIHRvIGZyb20gdGhlIGZzIHN1cGVyYmxvY2sgc3RydWN0dXJlLgotICogCisgKgogICogV2UgdXNlIHRoZSBqb3VybmFsX3QgdG8ga2VlcCB0cmFjayBvZiBhbGwgb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb24KICAqIGFjdGl2aXR5IG9uIHRoZSBmaWxlc3lzdGVtLCBhbmQgdG8gbWFuYWdlIHRoZSBzdGF0ZSBvZiB0aGUgbG9nCiAgKiB3cml0aW5nIHByb2Nlc3MuCkBAIC0xMjgsNyArMTI4LDcgQEAKICAqIE9uLWRpc2sgc3RydWN0dXJlcwogICovCiAKLS8qIAorLyoKICAqIERlc2NyaXB0b3IgYmxvY2sgdHlwZXM6CiAgKi8KIApAQCAtMTQ5LDggKzE0OSw4IEBACiB9IGpvdXJuYWxfaGVhZGVyX3Q7CiAKIAotLyogCi0gKiBUaGUgYmxvY2sgdGFnOiB1c2VkIHRvIGRlc2NyaWJlIGEgc2luZ2xlIGJ1ZmZlciBpbiB0aGUgam91cm5hbCAKKy8qCisgKiBUaGUgYmxvY2sgdGFnOiB1c2VkIHRvIGRlc2NyaWJlIGEgc2luZ2xlIGJ1ZmZlciBpbiB0aGUgam91cm5hbAogICovCiB0eXBlZGVmIHN0cnVjdCBqb3VybmFsX2Jsb2NrX3RhZ19zCiB7CkBAIC0xNTgsOSArMTU4LDkgQEAKIAlfX2JlMzIJCXRfZmxhZ3M7CS8qIFNlZSBiZWxvdyAqLwogfSBqb3VybmFsX2Jsb2NrX3RhZ190OwogCi0vKiAKKy8qCiAgKiBUaGUgcmV2b2tlIGRlc2NyaXB0b3I6IHVzZWQgb24gZGlzayB0byBkZXNjcmliZSBhIHNlcmllcyBvZiBibG9ja3MgdG8KLSAqIGJlIHJldm9rZWQgZnJvbSB0aGUgbG9nIAorICogYmUgcmV2b2tlZCBmcm9tIHRoZSBsb2cKICAqLwogdHlwZWRlZiBzdHJ1Y3Qgam91cm5hbF9yZXZva2VfaGVhZGVyX3MKIHsKQEAgLTIwMSw5ICsyMDEsOSBAQAogCiAvKiAweDAwMjQgKi8KIAkvKiBSZW1haW5pbmcgZmllbGRzIGFyZSBvbmx5IHZhbGlkIGluIGEgdmVyc2lvbi0yIHN1cGVyYmxvY2sgKi8KLQlfX2JlMzIJc19mZWF0dXJlX2NvbXBhdDsgCS8qIGNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KLQlfX2JlMzIJc19mZWF0dXJlX2luY29tcGF0OyAJLyogaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCi0JX19iZTMyCXNfZmVhdHVyZV9yb19jb21wYXQ7IAkvKiByZWFkb25seS1jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJX19iZTMyCXNfZmVhdHVyZV9jb21wYXQ7CS8qIGNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwlfX2JlMzIJc19mZWF0dXJlX2luY29tcGF0OwkvKiBpbmNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwlfX2JlMzIJc19mZWF0dXJlX3JvX2NvbXBhdDsJLyogcmVhZG9ubHktY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLwogLyogMHgwMDMwICovCiAJX191OAlzX3V1aWRbMTZdOwkJLyogMTI4LWJpdCB1dWlkIGZvciBqb3VybmFsICovCiAKQEAgLTM3NCwxMCArMzc0LDEwIEBACiAgKiovCiAKIC8qIERvY2Jvb2sgY2FuJ3QgeWV0IGNvcGUgd2l0aCB0aGUgYml0IGZpZWxkcywgYnV0IHdpbGwgbGVhdmUgdGhlIGRvY3VtZW50YXRpb24KLSAqIGluIHNvIGl0IGNhbiBiZSBmaXhlZCBsYXRlci4gCisgKiBpbiBzbyBpdCBjYW4gYmUgZml4ZWQgbGF0ZXIuCiAgKi8KIAotc3RydWN0IGhhbmRsZV9zIAorc3RydWN0IGhhbmRsZV9zCiB7CiAJLyogV2hpY2ggY29tcG91bmQgdHJhbnNhY3Rpb24gaXMgdGhpcyB1cGRhdGUgYSBwYXJ0IG9mPyAqLwogCXRyYW5zYWN0aW9uX3QJCSpoX3RyYW5zYWN0aW9uOwpAQCAtNDM1LDcgKzQzNSw3IEBACiAgKgogICovCiAKLXN0cnVjdCB0cmFuc2FjdGlvbl9zIAorc3RydWN0IHRyYW5zYWN0aW9uX3MKIHsKIAkvKiBQb2ludGVyIHRvIHRoZSBqb3VybmFsIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBbbm8gbG9ja2luZ10gKi8KIAlqb3VybmFsX3QJCSp0X2pvdXJuYWw7CkBAIC00NTUsNyArNDU1LDcgQEAKIAkJVF9SVU5ET1dOLAogCQlUX0ZMVVNILAogCQlUX0NPTU1JVCwKLQkJVF9GSU5JU0hFRCAKKwkJVF9GSU5JU0hFRAogCX0JCQl0X3N0YXRlOwogCiAJLyoKQEAgLTU2OSw3ICs1NjksNyBAQAogICogICAgIGpvdXJuYWxfdC4KICAqIEBqX2ZsYWdzOiAgR2VuZXJhbCBqb3VybmFsaW5nIHN0YXRlIGZsYWdzCiAgKiBAal9lcnJubzogIElzIHRoZXJlIGFuIG91dHN0YW5kaW5nIHVuY2xlYXJlZCBlcnJvciBvbiB0aGUgam91cm5hbCAoZnJvbSBhCi0gKiAgICAgcHJpb3IgYWJvcnQpPyAKKyAqICAgICBwcmlvciBhYm9ydCk/CiAgKiBAal9zYl9idWZmZXI6IEZpcnN0IHBhcnQgb2Ygc3VwZXJibG9jayBidWZmZXIKICAqIEBqX3N1cGVyYmxvY2s6IFNlY29uZCBwYXJ0IG9mIHN1cGVyYmxvY2sgYnVmZmVyCiAgKiBAal9mb3JtYXRfdmVyc2lvbjogVmVyc2lvbiBvZiB0aGUgc3VwZXJibG9jayBmb3JtYXQKQEAgLTU4Myw3ICs1ODMsNyBAQAogICogQGpfd2FpdF90cmFuc2FjdGlvbl9sb2NrZWQ6IFdhaXQgcXVldWUgZm9yIHdhaXRpbmcgZm9yIGEgbG9ja2VkIHRyYW5zYWN0aW9uCiAgKiAgdG8gc3RhcnQgY29tbWl0dGluZywgb3IgZm9yIGEgYmFycmllciBsb2NrIHRvIGJlIHJlbGVhc2VkCiAgKiBAal93YWl0X2xvZ3NwYWNlOiBXYWl0IHF1ZXVlIGZvciB3YWl0aW5nIGZvciBjaGVja3BvaW50aW5nIHRvIGNvbXBsZXRlCi0gKiBAal93YWl0X2RvbmVfY29tbWl0OiBXYWl0IHF1ZXVlIGZvciB3YWl0aW5nIGZvciBjb21taXQgdG8gY29tcGxldGUgCisgKiBAal93YWl0X2RvbmVfY29tbWl0OiBXYWl0IHF1ZXVlIGZvciB3YWl0aW5nIGZvciBjb21taXQgdG8gY29tcGxldGUKICAqIEBqX3dhaXRfY2hlY2twb2ludDogIFdhaXQgcXVldWUgdG8gdHJpZ2dlciBjaGVja3BvaW50aW5nCiAgKiBAal93YWl0X2NvbW1pdDogV2FpdCBxdWV1ZSB0byB0cmlnZ2VyIGNvbW1pdAogICogQGpfd2FpdF91cGRhdGVzOiBXYWl0IHF1ZXVlIHRvIHdhaXQgZm9yIHVwZGF0ZXMgdG8gY29tcGxldGUKQEAgLTU5Miw3ICs1OTIsNyBAQAogICogQGpfdGFpbDogSm91cm5hbCB0YWlsIC0gaWRlbnRpZmllcyB0aGUgb2xkZXN0IHN0aWxsLXVzZWQgYmxvY2sgaW4gdGhlCiAgKiAgam91cm5hbC4KICAqIEBqX2ZyZWU6IEpvdXJuYWwgZnJlZSAtIGhvdyBtYW55IGZyZWUgYmxvY2tzIGFyZSB0aGVyZSBpbiB0aGUgam91cm5hbD8KLSAqIEBqX2ZpcnN0OiBUaGUgYmxvY2sgbnVtYmVyIG9mIHRoZSBmaXJzdCB1c2FibGUgYmxvY2sgCisgKiBAal9maXJzdDogVGhlIGJsb2NrIG51bWJlciBvZiB0aGUgZmlyc3QgdXNhYmxlIGJsb2NrCiAgKiBAal9sYXN0OiBUaGUgYmxvY2sgbnVtYmVyIG9uZSBiZXlvbmQgdGhlIGxhc3QgdXNhYmxlIGJsb2NrCiAgKiBAal9kZXY6IERldmljZSB3aGVyZSB3ZSBzdG9yZSB0aGUgam91cm5hbAogICogQGpfYmxvY2tzaXplOiBibG9ja3NpemUgZm9yIHRoZSBsb2NhdGlvbiB3aGVyZSB3ZSBzdG9yZSB0aGUgam91cm5hbC4KQEAgLTYwNCwxMiArNjA0LDEyIEBACiAgKiBAal9saXN0X2xvY2s6IFByb3RlY3RzIHRoZSBidWZmZXIgbGlzdHMgYW5kIGludGVybmFsIGJ1ZmZlciBzdGF0ZS4KICAqIEBqX2lub2RlOiBPcHRpb25hbCBpbm9kZSB3aGVyZSB3ZSBzdG9yZSB0aGUgam91cm5hbC4gIElmIHByZXNlbnQsIGFsbCBqb3VybmFsCiAgKiAgICAgYmxvY2sgbnVtYmVycyBhcmUgbWFwcGVkIGludG8gdGhpcyBpbm9kZSB2aWEgYm1hcCgpLgotICogQGpfdGFpbF9zZXF1ZW5jZTogIFNlcXVlbmNlIG51bWJlciBvZiB0aGUgb2xkZXN0IHRyYW5zYWN0aW9uIGluIHRoZSBsb2cgCisgKiBAal90YWlsX3NlcXVlbmNlOiAgU2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gaW4gdGhlIGxvZwogICogQGpfdHJhbnNhY3Rpb25fc2VxdWVuY2U6IFNlcXVlbmNlIG51bWJlciBvZiB0aGUgbmV4dCB0cmFuc2FjdGlvbiB0byBncmFudAogICogQGpfY29tbWl0X3NlcXVlbmNlOiBTZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG1vc3QgcmVjZW50bHkgY29tbWl0dGVkCiAgKiAgdHJhbnNhY3Rpb24KICAqIEBqX2NvbW1pdF9yZXF1ZXN0OiBTZXF1ZW5jZSBudW1iZXIgb2YgdGhlIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uIHdhbnRpbmcKLSAqICAgICBjb21taXQgCisgKiAgICAgY29tbWl0CiAgKiBAal91dWlkOiBVdWlkIG9mIGNsaWVudCBvYmplY3QuCiAgKiBAal90YXNrOiBQb2ludGVyIHRvIHRoZSBjdXJyZW50IGNvbW1pdCB0aHJlYWQgZm9yIHRoaXMgam91cm5hbAogICogQGpfbWF4X3RyYW5zYWN0aW9uX2J1ZmZlcnM6ICBNYXhpbXVtIG51bWJlciBvZiBtZXRhZGF0YSBidWZmZXJzIHRvIGFsbG93IGluIGEKQEAgLTY5OSw3ICs2OTksNyBAQAogCXdhaXRfcXVldWVfaGVhZF90CWpfd2FpdF91cGRhdGVzOwogCiAJLyogU2VtYXBob3JlIGZvciBsb2NraW5nIGFnYWluc3QgY29uY3VycmVudCBjaGVja3BvaW50cyAqLwotCXN0cnVjdCBtdXRleAkgCWpfY2hlY2twb2ludF9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXgJCWpfY2hlY2twb2ludF9tdXRleDsKIAogCS8qCiAJICogSm91cm5hbCBoZWFkOiBpZGVudGlmaWVzIHRoZSBmaXJzdCB1bnVzZWQgYmxvY2sgaW4gdGhlIGpvdXJuYWwuCkBAIC03MzIsNyArNzMyLDcgQEAKIAkgKi8KIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlCSpqX2RldjsKIAlpbnQJCQlqX2Jsb2Nrc2l6ZTsKLQl1bnNpZ25lZCBpbnQJCWpfYmxrX29mZnNldDsKKwl1bnNpZ25lZCBsb25nCQlqX2Jsa19vZmZzZXQ7CiAKIAkvKgogCSAqIERldmljZSB3aGljaCBob2xkcyB0aGUgY2xpZW50IGZzLiAgRm9yIGludGVybmFsIGpvdXJuYWwgdGhpcyB3aWxsIGJlCkBAIC04MjMsOCArODIzLDggQEAKIAl2b2lkICpqX3ByaXZhdGU7CiB9OwogCi0vKiAKLSAqIEpvdXJuYWwgZmxhZyBkZWZpbml0aW9ucyAKKy8qCisgKiBKb3VybmFsIGZsYWcgZGVmaW5pdGlvbnMKICAqLwogI2RlZmluZSBKRlNfVU5NT1VOVAkweDAwMQkvKiBKb3VybmFsIHRocmVhZCBpcyBiZWluZyBkZXN0cm95ZWQgKi8KICNkZWZpbmUgSkZTX0FCT1JUCTB4MDAyCS8qIEpvdXJuYWxpbmcgaGFzIGJlZW4gYWJvcnRlZCBmb3IgZXJyb3JzLiAqLwpAQCAtODMzLDcgKzgzMyw3IEBACiAjZGVmaW5lIEpGU19MT0FERUQJMHgwMTAJLyogVGhlIGpvdXJuYWwgc3VwZXJibG9jayBoYXMgYmVlbiBsb2FkZWQgKi8KICNkZWZpbmUgSkZTX0JBUlJJRVIJMHgwMjAJLyogVXNlIElERSBiYXJyaWVycyAqLwogCi0vKiAKKy8qCiAgKiBGdW5jdGlvbiBkZWNsYXJhdGlvbnMgZm9yIHRoZSBqb3VybmFsaW5nIHRyYW5zYWN0aW9uIGFuZCBidWZmZXIKICAqIG1hbmFnZW1lbnQKICAqLwpAQCAtODYyLDExICs4NjIsMTEgQEAKIHZvaWQgX19qb3VybmFsX2luc2VydF9jaGVja3BvaW50KHN0cnVjdCBqb3VybmFsX2hlYWQgKiwgdHJhbnNhY3Rpb25fdCAqKTsKIAogLyogQnVmZmVyIElPICovCi1leHRlcm4gaW50IAorZXh0ZXJuIGludAogam91cm5hbF93cml0ZV9tZXRhZGF0YV9idWZmZXIodHJhbnNhY3Rpb25fdAkgICp0cmFuc2FjdGlvbiwKIAkJCSAgICAgIHN0cnVjdCBqb3VybmFsX2hlYWQgICpqaF9pbiwKIAkJCSAgICAgIHN0cnVjdCBqb3VybmFsX2hlYWQgKipqaF9vdXQsCi0JCQkgICAgICBpbnQJCSAgIGJsb2NrbnIpOworCQkJICAgICAgdW5zaWduZWQgbG9uZwkgICBibG9ja25yKTsKIAogLyogVHJhbnNhY3Rpb24gbG9ja2luZyAqLwogZXh0ZXJuIHZvaWQJCV9fd2FpdF9vbl9qb3VybmFsIChqb3VybmFsX3QgKik7CkBAIC04OTAsNyArODkwLDcgQEAKIC8qIFRoZSBqb3VybmFsaW5nIGNvZGUgdXNlciBpbnRlcmZhY2U6CiAgKgogICogQ3JlYXRlIGFuZCBkZXN0cm95IGhhbmRsZXMKLSAqIFJlZ2lzdGVyIGJ1ZmZlciBtb2RpZmljYXRpb25zIGFnYWluc3QgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uIAorICogUmVnaXN0ZXIgYnVmZmVyIG1vZGlmaWNhdGlvbnMgYWdhaW5zdCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KICAqLwogCiBleHRlcm4gaGFuZGxlX3QgKmpvdXJuYWxfc3RhcnQoam91cm5hbF90ICosIGludCBuYmxvY2tzKTsKQEAgLTkxNywxMSArOTE3LDExIEBACiAJCQkJaW50IHN0YXJ0LCBpbnQgbGVuLCBpbnQgYnNpemUpOwogZXh0ZXJuIGpvdXJuYWxfdCAqIGpvdXJuYWxfaW5pdF9pbm9kZSAoc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGludAkgICBqb3VybmFsX3VwZGF0ZV9mb3JtYXQgKGpvdXJuYWxfdCAqKTsKLWV4dGVybiBpbnQJICAgam91cm5hbF9jaGVja191c2VkX2ZlYXR1cmVzIAorZXh0ZXJuIGludAkgICBqb3VybmFsX2NoZWNrX3VzZWRfZmVhdHVyZXMKIAkJICAgKGpvdXJuYWxfdCAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKLWV4dGVybiBpbnQJICAgam91cm5hbF9jaGVja19hdmFpbGFibGVfZmVhdHVyZXMgCitleHRlcm4gaW50CSAgIGpvdXJuYWxfY2hlY2tfYXZhaWxhYmxlX2ZlYXR1cmVzCiAJCSAgIChqb3VybmFsX3QgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7Ci1leHRlcm4gaW50CSAgIGpvdXJuYWxfc2V0X2ZlYXR1cmVzIAorZXh0ZXJuIGludAkgICBqb3VybmFsX3NldF9mZWF0dXJlcwogCQkgICAoam91cm5hbF90ICosIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGludAkgICBqb3VybmFsX2NyZWF0ZSAgICAgKGpvdXJuYWxfdCAqKTsKIGV4dGVybiBpbnQJICAgam91cm5hbF9sb2FkICAgICAgIChqb3VybmFsX3QgKmpvdXJuYWwpOwpAQCAtMTAxNSw3ICsxMDE1LDcgQEAKICAqIGJpdCwgd2hlbiBzZXQsIGluZGljYXRlcyB0aGF0IHdlIGhhdmUgaGFkIGEgZmF0YWwgZXJyb3Igc29tZXdoZXJlLAogICogZWl0aGVyIGluc2lkZSB0aGUgam91cm5hbGluZyBsYXllciBvciBpbmRpY2F0ZWQgdG8gdXMgYnkgdGhlIGNsaWVudAogICogKGVnLiBleHQzKSwgYW5kIHRoYXQgd2UgYW5kIHNob3VsZCBub3QgY29tbWl0IGFueSBmdXJ0aGVyCi0gKiB0cmFuc2FjdGlvbnMuICAKKyAqIHRyYW5zYWN0aW9ucy4KICAqLwogCiBzdGF0aWMgaW5saW5lIGludCBpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbF90ICpqb3VybmFsKQpAQCAtMTA4Miw3ICsxMDgyLDcgQEAKICNkZWZpbmUgQkpfUmVzZXJ2ZWQJNwkvKiBCdWZmZXIgaXMgcmVzZXJ2ZWQgZm9yIGFjY2VzcyBieSBqb3VybmFsICovCiAjZGVmaW5lIEJKX0xvY2tlZAk4CS8qIExvY2tlZCBmb3IgSS9PIGR1cmluZyBjb21taXQgKi8KICNkZWZpbmUgQkpfVHlwZXMJOQotIAorCiBleHRlcm4gaW50IGpiZF9ibG9ja3NfcGVyX3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSk7CiAKICNpZmRlZiBfX0tFUk5FTF9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaCBiL2luY2x1ZGUvbGludXgvamlmZmllcy5oCmluZGV4IDMyOWViY2YuLmM4ZDVmMjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamlmZmllcy5oCisrKyBiL2luY2x1ZGUvbGludXgvamlmZmllcy5oCkBAIC0xMTUsNiArMTE1LDIxIEBACiAJICgobG9uZykoYSkgLSAobG9uZykoYikgPj0gMCkpCiAjZGVmaW5lIHRpbWVfYmVmb3JlX2VxKGEsYikJdGltZV9hZnRlcl9lcShiLGEpCiAKKy8qIFNhbWUgYXMgYWJvdmUsIGJ1dCBkb2VzIHNvIHdpdGggcGxhdGZvcm0gaW5kZXBlbmRlbnQgNjRiaXQgdHlwZXMuCisgKiBUaGVzZSBtdXN0IGJlIHVzZWQgd2hlbiB1dGlsaXppbmcgamlmZmllc182NCAoaS5lLiByZXR1cm4gdmFsdWUgb2YKKyAqIGdldF9qaWZmaWVzXzY0KCkgKi8KKyNkZWZpbmUgdGltZV9hZnRlcjY0KGEsYikJXAorCSh0eXBlY2hlY2soX191NjQsIGEpICYmCVwKKwkgdHlwZWNoZWNrKF9fdTY0LCBiKSAmJiBcCisJICgoX19zNjQpKGIpIC0gKF9fczY0KShhKSA8IDApKQorI2RlZmluZSB0aW1lX2JlZm9yZTY0KGEsYikJdGltZV9hZnRlcjY0KGIsYSkKKworI2RlZmluZSB0aW1lX2FmdGVyX2VxNjQoYSxiKQlcCisJKHR5cGVjaGVjayhfX3U2NCwgYSkgJiYgXAorCSB0eXBlY2hlY2soX191NjQsIGIpICYmIFwKKwkgKChfX3M2NCkoYSkgLSAoX19zNjQpKGIpID49IDApKQorI2RlZmluZSB0aW1lX2JlZm9yZV9lcTY0KGEsYikJdGltZV9hZnRlcl9lcTY0KGIsYSkKKwogLyoKICAqIEhhdmUgdGhlIDMyIGJpdCBqaWZmaWVzIHZhbHVlIHdyYXAgNSBtaW51dGVzIGFmdGVyIGJvb3QKICAqIHNvIGppZmZpZXMgd3JhcCBidWdzIHNob3cgdXAgZWFybGllci4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva2VybmVsLmggYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCmluZGV4IGU0NGEzN2UuLjRkMDA5ODhkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCisrKyBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKQEAgLTE4Nyw2ICsxODcsNyBAQAogZXh0ZXJuIGludCBvb3BzX2luX3Byb2dyZXNzOwkJLyogSWYgc2V0LCBhbiBvb3BzLCBwYW5pYygpLCBCVUcoKSBvciBkaWUoKSBpcyBpbiBwcm9ncmVzcyAqLwogZXh0ZXJuIGludCBwYW5pY190aW1lb3V0OwogZXh0ZXJuIGludCBwYW5pY19vbl9vb3BzOworZXh0ZXJuIGludCBwYW5pY19vbl91bnJlY292ZXJlZF9ubWk7CiBleHRlcm4gaW50IHRhaW50ZWQ7CiBleHRlcm4gY29uc3QgY2hhciAqcHJpbnRfdGFpbnRlZCh2b2lkKTsKIGV4dGVybiB2b2lkIGFkZF90YWludCh1bnNpZ25lZCk7CkBAIC0zNDksNCArMzUwLDExIEBACiAvKiBUcmFwIHBhc3RlcnMgb2YgX19GVU5DVElPTl9fIGF0IGNvbXBpbGUtdGltZSAqLwogI2RlZmluZSBfX0ZVTkNUSU9OX18gKF9fZnVuY19fKQogCisvKiBUaGlzIGhlbHBzIHVzIHRvIGF2b2lkICNpZmRlZiBDT05GSUdfTlVNQSAqLworI2lmZGVmIENPTkZJR19OVU1BCisjZGVmaW5lIE5VTUFfQlVJTEQgMQorI2Vsc2UKKyNkZWZpbmUgTlVNQV9CVUlMRCAwCisjZW5kaWYKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tvYmplY3QuaCBiL2luY2x1ZGUvbGludXgva29iamVjdC5oCmluZGV4IDJkMjI5MzIuLmJjZDljZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva29iamVjdC5oCisrKyBiL2luY2x1ZGUvbGludXgva29iamVjdC5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CkBAIC03MSwxMiArNzIsMTIgQEAKIGV4dGVybiB2b2lkIGtvYmplY3RfaW5pdChzdHJ1Y3Qga29iamVjdCAqKTsKIGV4dGVybiB2b2lkIGtvYmplY3RfY2xlYW51cChzdHJ1Y3Qga29iamVjdCAqKTsKIAotZXh0ZXJuIGludCBrb2JqZWN0X2FkZChzdHJ1Y3Qga29iamVjdCAqKTsKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrIGtvYmplY3RfYWRkKHN0cnVjdCBrb2JqZWN0ICopOwogZXh0ZXJuIHZvaWQga29iamVjdF9kZWwoc3RydWN0IGtvYmplY3QgKik7CiAKLWV4dGVybiBpbnQga29iamVjdF9yZW5hbWUoc3RydWN0IGtvYmplY3QgKiwgY29uc3QgY2hhciAqbmV3X25hbWUpOworZXh0ZXJuIGludCBfX211c3RfY2hlY2sga29iamVjdF9yZW5hbWUoc3RydWN0IGtvYmplY3QgKiwgY29uc3QgY2hhciAqbmV3X25hbWUpOwogCi1leHRlcm4gaW50IGtvYmplY3RfcmVnaXN0ZXIoc3RydWN0IGtvYmplY3QgKik7CitleHRlcm4gaW50IF9fbXVzdF9jaGVjayBrb2JqZWN0X3JlZ2lzdGVyKHN0cnVjdCBrb2JqZWN0ICopOwogZXh0ZXJuIHZvaWQga29iamVjdF91bnJlZ2lzdGVyKHN0cnVjdCBrb2JqZWN0ICopOwogCiBleHRlcm4gc3RydWN0IGtvYmplY3QgKiBrb2JqZWN0X2dldChzdHJ1Y3Qga29iamVjdCAqKTsKQEAgLTEyOCw4ICsxMjksOCBAQAogCiAKIGV4dGVybiB2b2lkIGtzZXRfaW5pdChzdHJ1Y3Qga3NldCAqIGspOwotZXh0ZXJuIGludCBrc2V0X2FkZChzdHJ1Y3Qga3NldCAqIGspOwotZXh0ZXJuIGludCBrc2V0X3JlZ2lzdGVyKHN0cnVjdCBrc2V0ICogayk7CitleHRlcm4gaW50IF9fbXVzdF9jaGVjayBrc2V0X2FkZChzdHJ1Y3Qga3NldCAqIGspOworZXh0ZXJuIGludCBfX211c3RfY2hlY2sga3NldF9yZWdpc3RlcihzdHJ1Y3Qga3NldCAqIGspOwogZXh0ZXJuIHZvaWQga3NldF91bnJlZ2lzdGVyKHN0cnVjdCBrc2V0ICogayk7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGtzZXQgKiB0b19rc2V0KHN0cnVjdCBrb2JqZWN0ICoga29iaikKQEAgLTIzOSw3ICsyNDAsNyBAQAogCShvYmopLT5zdWJzeXMua3NldC5rb2JqLmtzZXQgPSAmKF9zdWJzeXMpLmtzZXQKIAogZXh0ZXJuIHZvaWQgc3Vic3lzdGVtX2luaXQoc3RydWN0IHN1YnN5c3RlbSAqKTsKLWV4dGVybiBpbnQgc3Vic3lzdGVtX3JlZ2lzdGVyKHN0cnVjdCBzdWJzeXN0ZW0gKik7CitleHRlcm4gaW50IF9fbXVzdF9jaGVjayBzdWJzeXN0ZW1fcmVnaXN0ZXIoc3RydWN0IHN1YnN5c3RlbSAqKTsKIGV4dGVybiB2b2lkIHN1YnN5c3RlbV91bnJlZ2lzdGVyKHN0cnVjdCBzdWJzeXN0ZW0gKik7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHN1YnN5c3RlbSAqIHN1YnN5c19nZXQoc3RydWN0IHN1YnN5c3RlbSAqIHMpCkBAIC0yNTgsNyArMjU5LDggQEAKIAlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBzdWJzeXN0ZW0gKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOyAKIH07CiAKLWV4dGVybiBpbnQgc3Vic3lzX2NyZWF0ZV9maWxlKHN0cnVjdCBzdWJzeXN0ZW0gKiAsIHN0cnVjdCBzdWJzeXNfYXR0cmlidXRlICopOworZXh0ZXJuIGludCBfX211c3RfY2hlY2sgc3Vic3lzX2NyZWF0ZV9maWxlKHN0cnVjdCBzdWJzeXN0ZW0gKiAsCisJCQkJCXN0cnVjdCBzdWJzeXNfYXR0cmlidXRlICopOwogCiAjaWYgZGVmaW5lZChDT05GSUdfSE9UUExVRykKIHZvaWQga29iamVjdF91ZXZlbnQoc3RydWN0IGtvYmplY3QgKmtvYmosIGVudW0ga29iamVjdF9hY3Rpb24gYWN0aW9uKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGlua2FnZS5oIGIvaW5jbHVkZS9saW51eC9saW5rYWdlLmgKaW5kZXggOTMyMDIxZi4uNmM5ODczZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9saW5rYWdlLmgKKysrIGIvaW5jbHVkZS9saW51eC9saW5rYWdlLmgKQEAgLTM1LDkgKzM1LDEzIEBACiAjZW5kaWYKIAogI2RlZmluZSBLUFJPQkVfRU5UUlkobmFtZSkgXAotICAuc2VjdGlvbiAua3Byb2Jlcy50ZXh0LCAiYXgiOyBcCisgIC5wdXNoc2VjdGlvbiAua3Byb2Jlcy50ZXh0LCAiYXgiOyBcCiAgIEVOVFJZKG5hbWUpCiAKKyNkZWZpbmUgS1BST0JFX0VORChuYW1lKSBcCisgIEVORChuYW1lKTsJCSBcCisgIC5wb3BzZWN0aW9uCisKICNpZm5kZWYgRU5ECiAjZGVmaW5lIEVORChuYW1lKSBcCiAgIC5zaXplIG5hbWUsIC4tbmFtZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IDg1NmYwZWUuLjdiNzAzYjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnX2xvY2tzLmg+CiAjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9tbV90eXBlcy5oPgogCiBzdHJ1Y3QgbWVtcG9saWN5Owogc3RydWN0IGFub25fdm1hOwpAQCAtMTk4LDYgKzE5OSw3IEBACiAJdm9pZCAoKm9wZW4pKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIGFyZWEpOwogCXZvaWQgKCpjbG9zZSkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICogYXJlYSk7CiAJc3RydWN0IHBhZ2UgKiAoKm5vcGFnZSkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICogYXJlYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgKnR5cGUpOworCXVuc2lnbmVkIGxvbmcgKCpub3Bmbikoc3RydWN0IHZtX2FyZWFfc3RydWN0ICogYXJlYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKIAlpbnQgKCpwb3B1bGF0ZSkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICogYXJlYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGxlbiwgcGdwcm90X3QgcHJvdCwgdW5zaWduZWQgbG9uZyBwZ29mZiwgaW50IG5vbmJsb2NrKTsKIAogCS8qIG5vdGlmaWNhdGlvbiB0aGF0IGEgcHJldmlvdXNseSByZWFkLW9ubHkgcGFnZSBpcyBhYm91dCB0byBiZWNvbWUKQEAgLTIxNSw2MiArMjE3LDYgQEAKIHN0cnVjdCBtbXVfZ2F0aGVyOwogc3RydWN0IGlub2RlOwogCi0vKgotICogRWFjaCBwaHlzaWNhbCBwYWdlIGluIHRoZSBzeXN0ZW0gaGFzIGEgc3RydWN0IHBhZ2UgYXNzb2NpYXRlZCB3aXRoCi0gKiBpdCB0byBrZWVwIHRyYWNrIG9mIHdoYXRldmVyIGl0IGlzIHdlIGFyZSB1c2luZyB0aGUgcGFnZSBmb3IgYXQgdGhlCi0gKiBtb21lbnQuIE5vdGUgdGhhdCB3ZSBoYXZlIG5vIHdheSB0byB0cmFjayB3aGljaCB0YXNrcyBhcmUgdXNpbmcKLSAqIGEgcGFnZSwgdGhvdWdoIGlmIGl0IGlzIGEgcGFnZWNhY2hlIHBhZ2UsIHJtYXAgc3RydWN0dXJlcyBjYW4gdGVsbCB1cwotICogd2hvIGlzIG1hcHBpbmcgaXQuCi0gKi8KLXN0cnVjdCBwYWdlIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogQXRvbWljIGZsYWdzLCBzb21lIHBvc3NpYmx5Ci0JCQkJCSAqIHVwZGF0ZWQgYXN5bmNocm9ub3VzbHkgKi8KLQlhdG9taWNfdCBfY291bnQ7CQkvKiBVc2FnZSBjb3VudCwgc2VlIGJlbG93LiAqLwotCWF0b21pY190IF9tYXBjb3VudDsJCS8qIENvdW50IG9mIHB0ZXMgbWFwcGVkIGluIG1tcywKLQkJCQkJICogdG8gc2hvdyB3aGVuIHBhZ2UgaXMgbWFwcGVkCi0JCQkJCSAqICYgbGltaXQgcmV2ZXJzZSBtYXAgc2VhcmNoZXMuCi0JCQkJCSAqLwotCXVuaW9uIHsKLQkgICAgc3RydWN0IHsKLQkJdW5zaWduZWQgbG9uZyBwcml2YXRlOwkJLyogTWFwcGluZy1wcml2YXRlIG9wYXF1ZSBkYXRhOgotCQkJCQkgCSAqIHVzdWFsbHkgdXNlZCBmb3IgYnVmZmVyX2hlYWRzCi0JCQkJCQkgKiBpZiBQYWdlUHJpdmF0ZSBzZXQ7IHVzZWQgZm9yCi0JCQkJCQkgKiBzd3BfZW50cnlfdCBpZiBQYWdlU3dhcENhY2hlOwotCQkJCQkJICogaW5kaWNhdGVzIG9yZGVyIGluIHRoZSBidWRkeQotCQkJCQkJICogc3lzdGVtIGlmIFBHX2J1ZGR5IGlzIHNldC4KLQkJCQkJCSAqLwotCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsJLyogSWYgbG93IGJpdCBjbGVhciwgcG9pbnRzIHRvCi0JCQkJCQkgKiBpbm9kZSBhZGRyZXNzX3NwYWNlLCBvciBOVUxMLgotCQkJCQkJICogSWYgcGFnZSBtYXBwZWQgYXMgYW5vbnltb3VzCi0JCQkJCQkgKiBtZW1vcnksIGxvdyBiaXQgaXMgc2V0LCBhbmQKLQkJCQkJCSAqIGl0IHBvaW50cyB0byBhbm9uX3ZtYSBvYmplY3Q6Ci0JCQkJCQkgKiBzZWUgUEFHRV9NQVBQSU5HX0FOT04gYmVsb3cuCi0JCQkJCQkgKi8KLQkgICAgfTsKLSNpZiBOUl9DUFVTID49IENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUwotCSAgICBzcGlubG9ja190IHB0bDsKLSNlbmRpZgotCX07Ci0JcGdvZmZfdCBpbmRleDsJCQkvKiBPdXIgb2Zmc2V0IHdpdGhpbiBtYXBwaW5nLiAqLwotCXN0cnVjdCBsaXN0X2hlYWQgbHJ1OwkJLyogUGFnZW91dCBsaXN0LCBlZy4gYWN0aXZlX2xpc3QKLQkJCQkJICogcHJvdGVjdGVkIGJ5IHpvbmUtPmxydV9sb2NrICEKLQkJCQkJICovCi0JLyoKLQkgKiBPbiBtYWNoaW5lcyB3aGVyZSBhbGwgUkFNIGlzIG1hcHBlZCBpbnRvIGtlcm5lbCBhZGRyZXNzIHNwYWNlLAotCSAqIHdlIGNhbiBzaW1wbHkgY2FsY3VsYXRlIHRoZSB2aXJ0dWFsIGFkZHJlc3MuIE9uIG1hY2hpbmVzIHdpdGgKLQkgKiBoaWdobWVtIHNvbWUgbWVtb3J5IGlzIG1hcHBlZCBpbnRvIGtlcm5lbCB2aXJ0dWFsIG1lbW9yeQotCSAqIGR5bmFtaWNhbGx5LCBzbyB3ZSBuZWVkIGEgcGxhY2UgdG8gc3RvcmUgdGhhdCBhZGRyZXNzLgotCSAqIE5vdGUgdGhhdCB0aGlzIGZpZWxkIGNvdWxkIGJlIDE2IGJpdHMgb24geDg2IC4uLiA7KQotCSAqCi0JICogQXJjaGl0ZWN0dXJlcyB3aXRoIHNsb3cgbXVsdGlwbGljYXRpb24gY2FuIGRlZmluZQotCSAqIFdBTlRfUEFHRV9WSVJUVUFMIGluIGFzbS9wYWdlLmgKLQkgKi8KLSNpZiBkZWZpbmVkKFdBTlRfUEFHRV9WSVJUVUFMKQotCXZvaWQgKnZpcnR1YWw7CQkJLyogS2VybmVsIHZpcnR1YWwgYWRkcmVzcyAoTlVMTCBpZgotCQkJCQkgICBub3Qga21hcHBlZCwgaWUuIGhpZ2htZW0pICovCi0jZW5kaWYgLyogV0FOVF9QQUdFX1ZJUlRVQUwgKi8KLX07Ci0KICNkZWZpbmUgcGFnZV9wcml2YXRlKHBhZ2UpCQkoKHBhZ2UpLT5wcml2YXRlKQogI2RlZmluZSBzZXRfcGFnZV9wcml2YXRlKHBhZ2UsIHYpCSgocGFnZSktPnByaXZhdGUgPSAodikpCiAKQEAgLTUwMSw3ICs0NDcsMTEgQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHpvbmVfdG9fbmlkKHN0cnVjdCB6b25lICp6b25lKQogewotCXJldHVybiB6b25lLT56b25lX3BnZGF0LT5ub2RlX2lkOworI2lmZGVmIENPTkZJR19OVU1BCisJcmV0dXJuIHpvbmUtPm5vZGU7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwYWdlX3RvX25pZChzdHJ1Y3QgcGFnZSAqcGFnZSkKQEAgLTU0NiwxMSArNDk2LDYgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L3Ztc3RhdC5oPgogCi0jaWZuZGVmIENPTkZJR19ESVNDT05USUdNRU0KLS8qIFRoZSBhcnJheSBvZiBzdHJ1Y3QgcGFnZXMgLSBmb3IgZGlzY29udGlnbWVtIHVzZSBwZ2RhdC0+bG1lbV9tYXAgKi8KLWV4dGVybiBzdHJ1Y3QgcGFnZSAqbWVtX21hcDsKLSNlbmRpZgotCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgKmxvd21lbV9wYWdlX2FkZHJlc3Moc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJcmV0dXJuIF9fdmEocGFnZV90b19wZm4ocGFnZSkgPDwgUEFHRV9TSElGVCk7CkBAIC02NTAsNiArNTk1LDEyIEBACiAjZGVmaW5lIE5PUEFHRV9PT00JKChzdHJ1Y3QgcGFnZSAqKSAoLTEpKQogCiAvKgorICogRXJyb3IgcmV0dXJuIHZhbHVlcyBmb3IgdGhlICpfbm9wZm4gZnVuY3Rpb25zCisgKi8KKyNkZWZpbmUgTk9QRk5fU0lHQlVTCSgodW5zaWduZWQgbG9uZykgLTEpCisjZGVmaW5lIE5PUEZOX09PTQkoKHVuc2lnbmVkIGxvbmcpIC0yKQorCisvKgogICogRGlmZmVyZW50IGtpbmRzIG9mIGZhdWx0cywgYXMgcmV0dXJuZWQgYnkgaGFuZGxlX21tX2ZhdWx0KCkuCiAgKiBVc2VkIHRvIGRlY2lkZSB3aGV0aGVyIGEgcHJvY2VzcyBnZXRzIGRlbGl2ZXJlZCBTSUdCVVMgb3IKICAqIGp1c3QgZ2V0cyBtYWpvci9taW5vciBmYXVsdCBjb3VudGVycyBidW1wZWQgdXAuCkBAIC05MzcsNiArODg4LDU2IEBACiBleHRlcm4gdm9pZCBmcmVlX2FyZWFfaW5pdF9ub2RlKGludCBuaWQsIHBnX2RhdGFfdCAqcGdkYXQsCiAJdW5zaWduZWQgbG9uZyAqIHpvbmVzX3NpemUsIHVuc2lnbmVkIGxvbmcgem9uZV9zdGFydF9wZm4sIAogCXVuc2lnbmVkIGxvbmcgKnpob2xlc19zaXplKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAKKy8qCisgKiBXaXRoIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUCBzZXQsIGFuIGFyY2hpdGVjdHVyZSBtYXkgaW5pdGlhbGlzZSBpdHMKKyAqIHpvbmVzLCBhbGxvY2F0ZSB0aGUgYmFja2luZyBtZW1fbWFwIGFuZCBhY2NvdW50IGZvciBtZW1vcnkgaG9sZXMgaW4gYSBtb3JlCisgKiBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgbWFubmVyLiBUaGlzIGlzIGEgc3Vic3RpdHV0ZSBmb3IgY3JlYXRpbmcgdGhlCisgKiB6b25lX3NpemVzW10gYW5kIHpob2xlc19zaXplW10gYXJyYXlzIGFuZCBwYXNzaW5nIHRoZW0gdG8KKyAqIGZyZWVfYXJlYV9pbml0X25vZGUoKQorICoKKyAqIEFuIGFyY2hpdGVjdHVyZSBpcyBleHBlY3RlZCB0byByZWdpc3RlciByYW5nZSBvZiBwYWdlIGZyYW1lcyBiYWNrZWQgYnkKKyAqIHBoeXNpY2FsIG1lbW9yeSB3aXRoIGFkZF9hY3RpdmVfcmFuZ2UoKSBiZWZvcmUgY2FsbGluZworICogZnJlZV9hcmVhX2luaXRfbm9kZXMoKSBwYXNzaW5nIGluIHRoZSBQRk4gZWFjaCB6b25lIGVuZHMgYXQuIEF0IGEgYmFzaWMKKyAqIHVzYWdlLCBhbiBhcmNoaXRlY3R1cmUgaXMgZXhwZWN0ZWQgdG8gZG8gc29tZXRoaW5nIGxpa2UKKyAqCisgKiB1bnNpZ25lZCBsb25nIG1heF96b25lX3BmbnNbTUFYX05SX1pPTkVTXSA9IHttYXhfZG1hLCBtYXhfbm9ybWFsX3BmbiwKKyAqIAkJCQkJCQkgbWF4X2hpZ2htZW1fcGZufTsKKyAqIGZvcl9lYWNoX3ZhbGlkX3BoeXNpY2FsX3BhZ2VfcmFuZ2UoKQorICogCWFkZF9hY3RpdmVfcmFuZ2Uobm9kZV9pZCwgc3RhcnRfcGZuLCBlbmRfcGZuKQorICogZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7CisgKgorICogSWYgdGhlIGFyY2hpdGVjdHVyZSBndWFyYW50ZWVzIHRoYXQgdGhlcmUgYXJlIG5vIGhvbGVzIGluIHRoZSByYW5nZXMKKyAqIHJlZ2lzdGVyZWQgd2l0aCBhZGRfYWN0aXZlX3JhbmdlKCksIGZyZWVfYm9vdG1lbV9hY3RpdmVfcmVnaW9ucygpCisgKiB3aWxsIGNhbGwgZnJlZV9ib290bWVtX25vZGUoKSBmb3IgZWFjaCByZWdpc3RlcmVkIHBoeXNpY2FsIHBhZ2UgcmFuZ2UuCisgKiBTaW1pbGFybHkgc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMoKSBjYWxscworICogbWVtb3J5X3ByZXNlbnQoKSBmb3IgZWFjaCByYW5nZSB3aGVuIFNQQVJTRU1FTSBpcyBlbmFibGVkLgorICoKKyAqIFNlZSBtbS9wYWdlX2FsbG9jLmMgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZWFjaCBmdW5jdGlvbiBleHBvc2VkIGJ5CisgKiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAKKyAqLworZXh0ZXJuIHZvaWQgZnJlZV9hcmVhX2luaXRfbm9kZXModW5zaWduZWQgbG9uZyAqbWF4X3pvbmVfcGZuKTsKK2V4dGVybiB2b2lkIGFkZF9hY3RpdmVfcmFuZ2UodW5zaWduZWQgaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCisJCQkJCXVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7CitleHRlcm4gdm9pZCBzaHJpbmtfYWN0aXZlX3JhbmdlKHVuc2lnbmVkIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgb2xkX2VuZF9wZm4sCisJCQkJCQl1bnNpZ25lZCBsb25nIG5ld19lbmRfcGZuKTsKK2V4dGVybiB2b2lkIHB1c2hfbm9kZV9ib3VuZGFyaWVzKHVuc2lnbmVkIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAorCQkJCQl1bnNpZ25lZCBsb25nIGVuZF9wZm4pOworZXh0ZXJuIHZvaWQgcmVtb3ZlX2FsbF9hY3RpdmVfcmFuZ2VzKHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYWJzZW50X3BhZ2VzX2luX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAorCQkJCQkJdW5zaWduZWQgbG9uZyBlbmRfcGZuKTsKK2V4dGVybiB2b2lkIGdldF9wZm5fcmFuZ2VfZm9yX25pZCh1bnNpZ25lZCBpbnQgbmlkLAorCQkJdW5zaWduZWQgbG9uZyAqc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nICplbmRfcGZuKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGZpbmRfbWluX3Bmbl93aXRoX2FjdGl2ZV9yZWdpb25zKHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZmluZF9tYXhfcGZuX3dpdGhfYWN0aXZlX3JlZ2lvbnModm9pZCk7CitleHRlcm4gdm9pZCBmcmVlX2Jvb3RtZW1fd2l0aF9hY3RpdmVfcmVnaW9ucyhpbnQgbmlkLAorCQkJCQkJdW5zaWduZWQgbG9uZyBtYXhfbG93X3Bmbik7CitleHRlcm4gdm9pZCBzcGFyc2VfbWVtb3J5X3ByZXNlbnRfd2l0aF9hY3RpdmVfcmVnaW9ucyhpbnQgbmlkKTsKKyNpZm5kZWYgQ09ORklHX0hBVkVfQVJDSF9FQVJMWV9QRk5fVE9fTklECitleHRlcm4gaW50IGVhcmx5X3Bmbl90b19uaWQodW5zaWduZWQgbG9uZyBwZm4pOworI2VuZGlmIC8qIENPTkZJR19IQVZFX0FSQ0hfRUFSTFlfUEZOX1RPX05JRCAqLworI2VuZGlmIC8qIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUCAqLworZXh0ZXJuIHZvaWQgc2V0X2RtYV9yZXNlcnZlKHVuc2lnbmVkIGxvbmcgbmV3X2RtYV9yZXNlcnZlKTsKIGV4dGVybiB2b2lkIG1lbW1hcF9pbml0X3pvbmUodW5zaWduZWQgbG9uZywgaW50LCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiB2b2lkIHNldHVwX3Blcl96b25lX3BhZ2VzX21pbih2b2lkKTsKIGV4dGVybiB2b2lkIG1lbV9pbml0KHZvaWQpOwpAQCAtMTEzMCw3ICsxMTMxLDcgQEAKIGV4dGVybiBpbnQgcmFuZG9taXplX3ZhX3NwYWNlOwogI2VuZGlmCiAKLWNvbnN0IGNoYXIgKmFyY2hfdm1hX25hbWUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworX19hdHRyaWJ1dGVfXygod2VhaykpIGNvbnN0IGNoYXIgKmFyY2hfdm1hX25hbWUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9MSU5VWF9NTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4NTJmZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaApAQCAtMCwwICsxLDY3IEBACisjaWZuZGVmIF9MSU5VWF9NTV9UWVBFU19ICisjZGVmaW5lIF9MSU5VWF9NTV9UWVBFU19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworc3RydWN0IGFkZHJlc3Nfc3BhY2U7CisKKy8qCisgKiBFYWNoIHBoeXNpY2FsIHBhZ2UgaW4gdGhlIHN5c3RlbSBoYXMgYSBzdHJ1Y3QgcGFnZSBhc3NvY2lhdGVkIHdpdGgKKyAqIGl0IHRvIGtlZXAgdHJhY2sgb2Ygd2hhdGV2ZXIgaXQgaXMgd2UgYXJlIHVzaW5nIHRoZSBwYWdlIGZvciBhdCB0aGUKKyAqIG1vbWVudC4gTm90ZSB0aGF0IHdlIGhhdmUgbm8gd2F5IHRvIHRyYWNrIHdoaWNoIHRhc2tzIGFyZSB1c2luZworICogYSBwYWdlLCB0aG91Z2ggaWYgaXQgaXMgYSBwYWdlY2FjaGUgcGFnZSwgcm1hcCBzdHJ1Y3R1cmVzIGNhbiB0ZWxsIHVzCisgKiB3aG8gaXMgbWFwcGluZyBpdC4KKyAqLworc3RydWN0IHBhZ2UgeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkvKiBBdG9taWMgZmxhZ3MsIHNvbWUgcG9zc2libHkKKwkJCQkJICogdXBkYXRlZCBhc3luY2hyb25vdXNseSAqLworCWF0b21pY190IF9jb3VudDsJCS8qIFVzYWdlIGNvdW50LCBzZWUgYmVsb3cuICovCisJYXRvbWljX3QgX21hcGNvdW50OwkJLyogQ291bnQgb2YgcHRlcyBtYXBwZWQgaW4gbW1zLAorCQkJCQkgKiB0byBzaG93IHdoZW4gcGFnZSBpcyBtYXBwZWQKKwkJCQkJICogJiBsaW1pdCByZXZlcnNlIG1hcCBzZWFyY2hlcy4KKwkJCQkJICovCisJdW5pb24geworCSAgICBzdHJ1Y3QgeworCQl1bnNpZ25lZCBsb25nIHByaXZhdGU7CQkvKiBNYXBwaW5nLXByaXZhdGUgb3BhcXVlIGRhdGE6CisJCQkJCSAJICogdXN1YWxseSB1c2VkIGZvciBidWZmZXJfaGVhZHMKKwkJCQkJCSAqIGlmIFBhZ2VQcml2YXRlIHNldDsgdXNlZCBmb3IKKwkJCQkJCSAqIHN3cF9lbnRyeV90IGlmIFBhZ2VTd2FwQ2FjaGU7CisJCQkJCQkgKiBpbmRpY2F0ZXMgb3JkZXIgaW4gdGhlIGJ1ZGR5CisJCQkJCQkgKiBzeXN0ZW0gaWYgUEdfYnVkZHkgaXMgc2V0LgorCQkJCQkJICovCisJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOwkvKiBJZiBsb3cgYml0IGNsZWFyLCBwb2ludHMgdG8KKwkJCQkJCSAqIGlub2RlIGFkZHJlc3Nfc3BhY2UsIG9yIE5VTEwuCisJCQkJCQkgKiBJZiBwYWdlIG1hcHBlZCBhcyBhbm9ueW1vdXMKKwkJCQkJCSAqIG1lbW9yeSwgbG93IGJpdCBpcyBzZXQsIGFuZAorCQkJCQkJICogaXQgcG9pbnRzIHRvIGFub25fdm1hIG9iamVjdDoKKwkJCQkJCSAqIHNlZSBQQUdFX01BUFBJTkdfQU5PTiBiZWxvdy4KKwkJCQkJCSAqLworCSAgICB9OworI2lmIE5SX0NQVVMgPj0gQ09ORklHX1NQTElUX1BUTE9DS19DUFVTCisJICAgIHNwaW5sb2NrX3QgcHRsOworI2VuZGlmCisJfTsKKwlwZ29mZl90IGluZGV4OwkJCS8qIE91ciBvZmZzZXQgd2l0aGluIG1hcHBpbmcuICovCisJc3RydWN0IGxpc3RfaGVhZCBscnU7CQkvKiBQYWdlb3V0IGxpc3QsIGVnLiBhY3RpdmVfbGlzdAorCQkJCQkgKiBwcm90ZWN0ZWQgYnkgem9uZS0+bHJ1X2xvY2sgIQorCQkJCQkgKi8KKwkvKgorCSAqIE9uIG1hY2hpbmVzIHdoZXJlIGFsbCBSQU0gaXMgbWFwcGVkIGludG8ga2VybmVsIGFkZHJlc3Mgc3BhY2UsCisJICogd2UgY2FuIHNpbXBseSBjYWxjdWxhdGUgdGhlIHZpcnR1YWwgYWRkcmVzcy4gT24gbWFjaGluZXMgd2l0aAorCSAqIGhpZ2htZW0gc29tZSBtZW1vcnkgaXMgbWFwcGVkIGludG8ga2VybmVsIHZpcnR1YWwgbWVtb3J5CisJICogZHluYW1pY2FsbHksIHNvIHdlIG5lZWQgYSBwbGFjZSB0byBzdG9yZSB0aGF0IGFkZHJlc3MuCisJICogTm90ZSB0aGF0IHRoaXMgZmllbGQgY291bGQgYmUgMTYgYml0cyBvbiB4ODYgLi4uIDspCisJICoKKwkgKiBBcmNoaXRlY3R1cmVzIHdpdGggc2xvdyBtdWx0aXBsaWNhdGlvbiBjYW4gZGVmaW5lCisJICogV0FOVF9QQUdFX1ZJUlRVQUwgaW4gYXNtL3BhZ2UuaAorCSAqLworI2lmIGRlZmluZWQoV0FOVF9QQUdFX1ZJUlRVQUwpCisJdm9pZCAqdmlydHVhbDsJCQkvKiBLZXJuZWwgdmlydHVhbCBhZGRyZXNzIChOVUxMIGlmCisJCQkJCSAgIG5vdCBrbWFwcGVkLCBpZS4gaGlnaG1lbSkgKi8KKyNlbmRpZiAvKiBXQU5UX1BBR0VfVklSVFVBTCAqLworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9NTV9UWVBFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaAppbmRleCAzNjkzZjFhLi41OTg1NWI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKQEAgLTU4LDYgKzU4LDcgQEAKIAlOUl9XUklURUJBQ0ssCiAJTlJfVU5TVEFCTEVfTkZTLAkvKiBORlMgdW5zdGFibGUgcGFnZXMgKi8KIAlOUl9CT1VOQ0UsCisJTlJfVk1TQ0FOX1dSSVRFLAogI2lmZGVmIENPTkZJR19OVU1BCiAJTlVNQV9ISVQsCQkvKiBhbGxvY2F0ZWQgaW4gaW50ZW5kZWQgbm9kZSAqLwogCU5VTUFfTUlTUywJCS8qIGFsbG9jYXRlZCBpbiBub24gaW50ZW5kZWQgbm9kZSAqLwpAQCAtMTY3LDYgKzE2OCw3IEBACiAJdW5zaWduZWQgbG9uZwkJbG93bWVtX3Jlc2VydmVbTUFYX05SX1pPTkVTXTsKIAogI2lmZGVmIENPTkZJR19OVU1BCisJaW50IG5vZGU7CiAJLyoKIAkgKiB6b25lIHJlY2xhaW0gYmVjb21lcyBhY3RpdmUgaWYgbW9yZSB1bm1hcHBlZCBwYWdlcyBleGlzdC4KIAkgKi8KQEAgLTMwNSw2ICszMDcsMTggQEAKIAlzdHJ1Y3Qgem9uZSAqem9uZXNbTUFYX05VTU5PREVTICogTUFYX05SX1pPTkVTICsgMV07IC8vIE5VTEwgZGVsaW1pdGVkCiB9OwogCisjaWZkZWYgQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQCitzdHJ1Y3Qgbm9kZV9hY3RpdmVfcmVnaW9uIHsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbjsKKwl1bnNpZ25lZCBsb25nIGVuZF9wZm47CisJaW50IG5pZDsKK307CisjZW5kaWYgLyogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQICovCisKKyNpZm5kZWYgQ09ORklHX0RJU0NPTlRJR01FTQorLyogVGhlIGFycmF5IG9mIHN0cnVjdCBwYWdlcyAtIGZvciBkaXNjb250aWdtZW0gdXNlIHBnZGF0LT5sbWVtX21hcCAqLworZXh0ZXJuIHN0cnVjdCBwYWdlICptZW1fbWFwOworI2VuZGlmCiAKIC8qCiAgKiBUaGUgcGdfZGF0YV90IHN0cnVjdHVyZSBpcyB1c2VkIGluIG1hY2hpbmVzIHdpdGggQ09ORklHX0RJU0NPTlRJR01FTQpAQCAtNTE4LDcgKzUzMiw4IEBACiAKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR19IQVZFX0FSQ0hfRUFSTFlfUEZOX1RPX05JRAorI2lmICFkZWZpbmVkKENPTkZJR19IQVZFX0FSQ0hfRUFSTFlfUEZOX1RPX05JRCkgJiYgXAorCSFkZWZpbmVkKENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUCkKICNkZWZpbmUgZWFybHlfcGZuX3RvX25pZChuaWQpICAoMFVMKQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmggYi9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oCmluZGV4IGY3Y2EwYjAuLmUwYzM5M2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaApAQCAtMzA4LDQgKzMwOCwxNiBAQAogCWtlcm5lbF91bG9uZ190IGRyaXZlcl9pbmZvOwogfTsKIAorLyogRUlTQSAqLworCisjZGVmaW5lIEVJU0FfU0lHX0xFTiAgIDgKKworLyogVGhlIEVJU0Egc2lnbmF0dXJlLCBpbiBBU0NJSSBmb3JtLCBudWxsIHRlcm1pbmF0ZWQgKi8KK3N0cnVjdCBlaXNhX2RldmljZV9pZCB7CisJY2hhciAgICAgICAgICBzaWdbRUlTQV9TSUdfTEVOXTsKKwlrZXJuZWxfdWxvbmdfdCBkcml2ZXJfZGF0YTsKK307CisKKyNkZWZpbmUgRUlTQV9ERVZJQ0VfTU9EQUxJQVNfRk1UICJlaXNhOnMlcyIKKwogI2VuZGlmIC8qIExJTlVYX01PRF9ERVZJQ0VUQUJMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc19mcy5oIGIvaW5jbHVkZS9saW51eC9uZnNfZnMuaAppbmRleCAzNmY1YmNmLi45OGM5YjlmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc19mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKQEAgLTMxNSwxMCArMzE1LDYgQEAKIGV4dGVybiBzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqZ2V0X25mc19vcGVuX2NvbnRleHQoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCk7CiBleHRlcm4gdm9pZCBwdXRfbmZzX29wZW5fY29udGV4dChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4KTsKIGV4dGVybiBzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqbmZzX2ZpbmRfb3Blbl9jb250ZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgaW50IG1vZGUpOwotZXh0ZXJuIHN0cnVjdCB2ZnNtb3VudCAqbmZzX2RvX3N1Ym1vdW50KGNvbnN0IHN0cnVjdCB2ZnNtb3VudCAqbW50X3BhcmVudCwKLQkJCQkJY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCQkJCQlzdHJ1Y3QgbmZzX2ZoICpmaCwKLQkJCQkJc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpOwogCiAvKiBsaW51eC9uZXQvaXB2NC9pcGNvbmZpZy5jOiB0cmltcyBpcCBhZGRyIG9mZiBmcm9udCBvZiBuYW1lLCB0b28uICovCiBleHRlcm4gdTMyIHJvb3RfbmZzX3BhcnNlX2FkZHIoY2hhciAqbmFtZSk7IC8qX19pbml0Ki8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzZC9uZnNmaC5oIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2ZoLmgKaW5kZXggZjllZGNkMi4uMzFhM2NiNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNkL25mc2ZoLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNkL25mc2ZoLmgKQEAgLTI2OSwxNCArMjY5LDggQEAKIAlmaHAtPmZoX3Bvc3RfdWlkCT0gaW5vZGUtPmlfdWlkOwogCWZocC0+ZmhfcG9zdF9naWQJPSBpbm9kZS0+aV9naWQ7CiAJZmhwLT5maF9wb3N0X3NpemUgICAgICAgPSBpbm9kZS0+aV9zaXplOwotCWlmIChpbm9kZS0+aV9ibGtzaXplKSB7Ci0JCWZocC0+ZmhfcG9zdF9ibGtzaXplICAgID0gaW5vZGUtPmlfYmxrc2l6ZTsKLQkJZmhwLT5maF9wb3N0X2Jsb2NrcyAgICAgPSBpbm9kZS0+aV9ibG9ja3M7Ci0JfSBlbHNlIHsKLQkJZmhwLT5maF9wb3N0X2Jsa3NpemUgICAgPSBCTE9DS19TSVpFOwotCQkvKiBob3cgbXVjaCBkbyB3ZSBjYXJlIGZvciBhY2N1cmFjeSB3aXRoIE1pbml4RlM/ICovCi0JCWZocC0+ZmhfcG9zdF9ibG9ja3MgICAgID0gKGlub2RlLT5pX3NpemUrNTExKSA+PiA5OwotCX0KKwlmaHAtPmZoX3Bvc3RfYmxrc2l6ZSAgICA9IEJMT0NLX1NJWkU7CisJZmhwLT5maF9wb3N0X2Jsb2NrcyAgICAgPSBpbm9kZS0+aV9ibG9ja3M7CiAJZmhwLT5maF9wb3N0X3JkZXZbMF0gICAgPSBodG9ubCgodTMyKWltYWpvcihpbm9kZSkpOwogCWZocC0+ZmhfcG9zdF9yZGV2WzFdICAgID0gaHRvbmwoKHUzMilpbWlub3IoaW5vZGUpKTsKIAlmaHAtPmZoX3Bvc3RfYXRpbWUgICAgICA9IGlub2RlLT5pX2F0aW1lOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggODU2NWI4MS4uNWMzYTQxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC00OSw2ICs0OSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCkBAIC0zNDYsNiArMzQ3LDggQEAKIAlpbnQgICgqcHJvYmUpICAoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKTsJLyogTmV3IGRldmljZSBpbnNlcnRlZCAqLwogCXZvaWQgKCpyZW1vdmUpIChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsJLyogRGV2aWNlIHJlbW92ZWQgKE5VTEwgaWYgbm90IGEgaG90LXBsdWcgY2FwYWJsZSBkcml2ZXIpICovCiAJaW50ICAoKnN1c3BlbmQpIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwkvKiBEZXZpY2Ugc3VzcGVuZGVkICovCisJaW50ICAoKnN1c3BlbmRfbGF0ZSkgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJaW50ICAoKnJlc3VtZV9lYXJseSkgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogCWludCAgKCpyZXN1bWUpIChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsJICAgICAgICAgICAgICAgIC8qIERldmljZSB3b2tlbiB1cCAqLwogCWludCAgKCplbmFibGVfd2FrZSkgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBjaV9wb3dlcl90IHN0YXRlLCBpbnQgZW5hYmxlKTsgICAvKiBFbmFibGUgd2FrZSBldmVudCAqLwogCXZvaWQgKCpzaHV0ZG93bikgKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwpAQCAtMzUzLDYgKzM1Niw4IEBACiAJc3RydWN0IHBjaV9lcnJvcl9oYW5kbGVycyAqZXJyX2hhbmRsZXI7CiAJc3RydWN0IGRldmljZV9kcml2ZXIJZHJpdmVyOwogCXN0cnVjdCBwY2lfZHluaWRzIGR5bmlkczsKKworCWludCBtdWx0aXRocmVhZF9wcm9iZTsKIH07CiAKICNkZWZpbmUJdG9fcGNpX2RyaXZlcihkcnYpIGNvbnRhaW5lcl9vZihkcnYsc3RydWN0IHBjaV9kcml2ZXIsIGRyaXZlcikKQEAgLTQwMSw3ICs0MDYsNyBAQAogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgcGNpX2RldmljZXM7CS8qIGxpc3Qgb2YgYWxsIGRldmljZXMgKi8KIAogdm9pZCBwY2liaW9zX2ZpeHVwX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqKTsKLWludCBwY2liaW9zX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKiwgaW50IG1hc2spOworaW50IF9fbXVzdF9jaGVjayBwY2liaW9zX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKiwgaW50IG1hc2spOwogY2hhciAqcGNpYmlvc19zZXR1cCAoY2hhciAqc3RyKTsKIAogLyogVXNlZCBvbmx5IHdoZW4gZHJpdmVycy9wY2kvc2V0dXAuYyBpcyB1c2VkICovCkBAIC00MjgsNyArNDMzLDcgQEAKIHN0cnVjdCBwY2lfZGV2ICogcGNpX3NjYW5fc2luZ2xlX2RldmljZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBpbnQgZGV2Zm4pOwogdm9pZCBwY2lfZGV2aWNlX2FkZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKIHVuc2lnbmVkIGludCBwY2lfc2Nhbl9jaGlsZF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cyk7Ci12b2lkIHBjaV9idXNfYWRkX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK2ludCBfX211c3RfY2hlY2sgcGNpX2J1c19hZGRfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogdm9pZCBwY2lfcmVhZF9icmlkZ2VfYmFzZXMoc3RydWN0IHBjaV9idXMgKmNoaWxkKTsKIHN0cnVjdCByZXNvdXJjZSAqcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKIGludCBwY2lfZ2V0X2ludGVycnVwdF9waW4oc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHBjaV9kZXYgKipicmlkZ2UpOwpAQCAtNDM2LDYgKzQ0MSw3IEBACiBleHRlcm4gdm9pZCBwY2lfZGV2X3B1dChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiB2b2lkIHBjaV9yZW1vdmVfYnVzKHN0cnVjdCBwY2lfYnVzICpiKTsKIGV4dGVybiB2b2lkIHBjaV9yZW1vdmVfYnVzX2RldmljZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK2V4dGVybiB2b2lkIHBjaV9zdG9wX2J1c19kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldik7CiB2b2lkIHBjaV9zZXR1cF9jYXJkYnVzKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCiAvKiBHZW5lcmljIFBDSSBmdW5jdGlvbnMgZXhwb3J0ZWQgdG8gY2FyZCBkcml2ZXJzICovCkBAIC00ODgsMTkgKzQ5NCwxOSBAQAogCXJldHVybiBwY2lfYnVzX3dyaXRlX2NvbmZpZ19kd29yZCAoZGV2LT5idXMsIGRldi0+ZGV2Zm4sIHdoZXJlLCB2YWwpOwogfQogCi1pbnQgcGNpX2VuYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldik7Ci1pbnQgcGNpX2VuYWJsZV9kZXZpY2VfYmFycyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgbWFzayk7CitpbnQgX19tdXN0X2NoZWNrIHBjaV9lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworaW50IF9fbXVzdF9jaGVjayBwY2lfZW5hYmxlX2RldmljZV9iYXJzKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBtYXNrKTsKIHZvaWQgcGNpX2Rpc2FibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogdm9pZCBwY2lfc2V0X21hc3RlcihzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKICNkZWZpbmUgSEFWRV9QQ0lfU0VUX01XSQotaW50IHBjaV9zZXRfbXdpKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworaW50IF9fbXVzdF9jaGVjayBwY2lfc2V0X213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIHZvaWQgcGNpX2NsZWFyX213aShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIHZvaWQgcGNpX2ludHgoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGVuYWJsZSk7CiBpbnQgcGNpX3NldF9kbWFfbWFzayhzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1NjQgbWFzayk7CiBpbnQgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU2NCBtYXNrKTsKIHZvaWQgcGNpX3VwZGF0ZV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgaW50IHJlc25vKTsKLWludCBwY2lfYXNzaWduX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpKTsKLWludCBwY2lfYXNzaWduX3Jlc291cmNlX2ZpeGVkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpKTsKK2ludCBfX211c3RfY2hlY2sgcGNpX2Fzc2lnbl9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgaSk7CitpbnQgX19tdXN0X2NoZWNrIHBjaV9hc3NpZ25fcmVzb3VyY2VfZml4ZWQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGkpOwogdm9pZCBwY2lfcmVzdG9yZV9iYXJzKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwogCiAvKiBST00gY29udHJvbCByZWxhdGVkIHJvdXRpbmVzICovCkBAIC01MjYsMjMgKzUzMiwyNCBAQAogdm9pZCBwY2lfZml4dXBfaXJxcyh1OCAoKikoc3RydWN0IHBjaV9kZXYgKiwgdTggKiksCiAJCSAgICBpbnQgKCopKHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCkpOwogI2RlZmluZSBIQVZFX1BDSV9SRVFfUkVHSU9OUwkyCi1pbnQgcGNpX3JlcXVlc3RfcmVnaW9ucyhzdHJ1Y3QgcGNpX2RldiAqLCBjb25zdCBjaGFyICopOworaW50IF9fbXVzdF9jaGVjayBwY2lfcmVxdWVzdF9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICosIGNvbnN0IGNoYXIgKik7CiB2b2lkIHBjaV9yZWxlYXNlX3JlZ2lvbnMoc3RydWN0IHBjaV9kZXYgKik7Ci1pbnQgcGNpX3JlcXVlc3RfcmVnaW9uKHN0cnVjdCBwY2lfZGV2ICosIGludCwgY29uc3QgY2hhciAqKTsKK2ludCBfX211c3RfY2hlY2sgcGNpX3JlcXVlc3RfcmVnaW9uKHN0cnVjdCBwY2lfZGV2ICosIGludCwgY29uc3QgY2hhciAqKTsKIHZvaWQgcGNpX3JlbGVhc2VfcmVnaW9uKHN0cnVjdCBwY2lfZGV2ICosIGludCk7CiAKIC8qIGRyaXZlcnMvcGNpL2J1cy5jICovCi1pbnQgcGNpX2J1c19hbGxvY19yZXNvdXJjZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywKLQkJCSAgIHJlc291cmNlX3NpemVfdCBzaXplLCByZXNvdXJjZV9zaXplX3QgYWxpZ24sCi0JCQkgICByZXNvdXJjZV9zaXplX3QgbWluLCB1bnNpZ25lZCBpbnQgdHlwZV9tYXNrLAotCQkJICAgdm9pZCAoKmFsaWduZikodm9pZCAqLCBzdHJ1Y3QgcmVzb3VyY2UgKiwKLQkJCQkJICByZXNvdXJjZV9zaXplX3QsIHJlc291cmNlX3NpemVfdCksCi0JCQkgICB2b2lkICphbGlnbmZfZGF0YSk7CitpbnQgX19tdXN0X2NoZWNrIHBjaV9idXNfYWxsb2NfcmVzb3VyY2Uoc3RydWN0IHBjaV9idXMgKmJ1cywKKwkJCXN0cnVjdCByZXNvdXJjZSAqcmVzLCByZXNvdXJjZV9zaXplX3Qgc2l6ZSwKKwkJCXJlc291cmNlX3NpemVfdCBhbGlnbiwgcmVzb3VyY2Vfc2l6ZV90IG1pbiwKKwkJCXVuc2lnbmVkIGludCB0eXBlX21hc2ssCisJCQl2b2lkICgqYWxpZ25mKSh2b2lkICosIHN0cnVjdCByZXNvdXJjZSAqLAorCQkJCXJlc291cmNlX3NpemVfdCwgcmVzb3VyY2Vfc2l6ZV90KSwKKwkJCXZvaWQgKmFsaWduZl9kYXRhKTsKIHZvaWQgcGNpX2VuYWJsZV9icmlkZ2VzKHN0cnVjdCBwY2lfYnVzICpidXMpOwogCiAvKiBQcm9wZXIgcHJvYmluZyBzdXBwb3J0aW5nIGhvdC1wbHVnZ2FibGUgZGV2aWNlcyAqLwotaW50IF9fcGNpX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgcGNpX2RyaXZlciAqLCBzdHJ1Y3QgbW9kdWxlICopOwotc3RhdGljIGlubGluZSBpbnQgcGNpX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgcGNpX2RyaXZlciAqZHJpdmVyKQoraW50IF9fbXVzdF9jaGVjayBfX3BjaV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHBjaV9kcml2ZXIgKiwgc3RydWN0IG1vZHVsZSAqKTsKK3N0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBwY2lfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBwY2lfZHJpdmVyICpkcml2ZXIpCiB7CiAJcmV0dXJuIF9fcGNpX3JlZ2lzdGVyX2RyaXZlcihkcml2ZXIsIFRISVNfTU9EVUxFKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggNmExZTA5OC4uYWIwMzJjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTE0MTEsNiArMTQxMSw3IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfTEUJICAweDAwMDkKICNkZWZpbmUgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19HQ05CX0xFIDB4MDAxNwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0VQQgkgIDB4MDEwMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX0hUMjAwMF9QQ0lFCTB4MDEzMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NFUlZFUldPUktTX09TQjQJICAweDAyMDAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1CSAgMHgwMjAxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0VSVkVSV09SS1NfQ1NCNiAgICAweDAyMDMKQEAgLTE0ODIsOSArMTQ4Myw2IEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFSVkVMTF9HVDY0MjYwCTB4NjQzMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BUlZFTExfTVY2NDM2MAkweDY0NjAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9NQVJWRUxMX01WNjQ0NjAJMHg2NDgwCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUFSVkVMTF9HVDk2MTAwCTB4OTY1MgotI2RlZmluZSBQQ0lfREVWSUNFX0lEX01BUlZFTExfR1Q5NjEwMEEJMHg5NjUzCi0KIAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1YzCQkweDExYjAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9WM19WOTYwCQkweDAwMDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaCBiL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaAppbmRleCA5NjkzMGNiLi43ZDBlMjZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCkBAIC0xOTYsNyArMTk2LDcgQEAKICNkZWZpbmUgIFBDSV9DQVBfSURfTVNJCQkweDA1CS8qIE1lc3NhZ2UgU2lnbmFsbGVkIEludGVycnVwdHMgKi8KICNkZWZpbmUgIFBDSV9DQVBfSURfQ0hTV1AJMHgwNgkvKiBDb21wYWN0UENJIEhvdFN3YXAgKi8KICNkZWZpbmUgIFBDSV9DQVBfSURfUENJWAkweDA3CS8qIFBDSS1YICovCi0jZGVmaW5lICBQQ0lfQ0FQX0lEX0hUX0lSUUNPTkYJMHgwOAkvKiBIeXBlclRyYW5zcG9ydCBJUlEgQ29uZmlndXJhdGlvbiAqLworI2RlZmluZSAgUENJX0NBUF9JRF9IVAkJMHgwOAkvKiBIeXBlclRyYW5zcG9ydCAqLwogI2RlZmluZSAgUENJX0NBUF9JRF9WTkRSCTB4MDkJLyogVmVuZG9yIHNwZWNpZmljIGNhcGFiaWxpdHkgKi8KICNkZWZpbmUgIFBDSV9DQVBfSURfU0hQQyAJMHgwQwkvKiBQQ0kgU3RhbmRhcmQgSG90LVBsdWcgQ29udHJvbGxlciAqLwogI2RlZmluZSAgUENJX0NBUF9JRF9FWFAgCTB4MTAJLyogUENJIEV4cHJlc3MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpZXBvcnRfaWYuaCBiL2luY2x1ZGUvbGludXgvcGNpZXBvcnRfaWYuaAppbmRleCBiNDRlMDFhLi42Y2Q5MWUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaWVwb3J0X2lmLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2llcG9ydF9pZi5oCkBAIC02Miw2ICs2MiwxMiBAQAogCWludCAoKnN1c3BlbmQpIChzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKIAlpbnQgKCpyZXN1bWUpIChzdHJ1Y3QgcGNpZV9kZXZpY2UgKmRldik7CiAKKwkvKiBTZXJ2aWNlIEVycm9yIFJlY292ZXJ5IEhhbmRsZXIgKi8KKwlzdHJ1Y3QgcGNpX2Vycm9yX2hhbmRsZXJzICplcnJfaGFuZGxlcjsKKworCS8qIExpbmsgUmVzZXQgQ2FwYWJpbGl0eSAtIEFFUiBzZXJ2aWNlIGRyaXZlciBzcGVjaWZpYyAqLworCXBjaV9lcnNfcmVzdWx0X3QgKCpyZXNldF9saW5rKSAoc3RydWN0IHBjaV9kZXYgKmRldik7CisKIAljb25zdCBzdHJ1Y3QgcGNpZV9wb3J0X3NlcnZpY2VfaWQgKmlkX3RhYmxlOwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BpZC5oIGIvaW5jbHVkZS9saW51eC9waWQuaAppbmRleCAyOTk2MGIwLi45M2RhN2UyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BpZC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGlkLmgKQEAgLTc2LDYgKzc2LDggQEAKIAkJCQllbnVtIHBpZF90eXBlIHR5cGUsIGludCBucikpOwogCiBleHRlcm4gdm9pZCBGQVNUQ0FMTChkZXRhY2hfcGlkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgZW51bSBwaWRfdHlwZSkpOworZXh0ZXJuIHZvaWQgRkFTVENBTEwodHJhbnNmZXJfcGlkKHN0cnVjdCB0YXNrX3N0cnVjdCAqb2xkLAorCQkJCSAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXcsIGVudW0gcGlkX3R5cGUpKTsKIAogLyoKICAqIGxvb2sgdXAgYSBQSUQgaW4gdGhlIGhhc2ggdGFibGUuIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHRhc2tsaXN0X2xvY2sKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCmluZGV4IDc4MjA5MGMuLjI5Y2Q2ZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaApAQCAtNDksNiArNDksOCBAQAogCWludCAoKnJlbW92ZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKTsKIAl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKik7CiAJaW50ICgqc3VzcGVuZCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCWludCAoKnN1c3BlbmRfbGF0ZSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCWludCAoKnJlc3VtZV9lYXJseSkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqKTsKIAlpbnQgKCpyZXN1bWUpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKik7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG0uaCBiL2luY2x1ZGUvbGludXgvcG0uaAppbmRleCA2NThjMWI5Li42YjI3ZTA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbS5oCkBAIC0xNDIsMjkgKzE0Miw2MSBAQAogfSBwbV9tZXNzYWdlX3Q7CiAKIC8qCi0gKiBUaGVyZSBhcmUgNCBpbXBvcnRhbnQgc3RhdGVzIGRyaXZlciBjYW4gYmUgaW46Ci0gKiBPTiAgICAgLS0gZHJpdmVyIGlzIHdvcmtpbmcKLSAqIEZSRUVaRSAtLSBzdG9wIG9wZXJhdGlvbnMgYW5kIGFwcGx5IHdoYXRldmVyIHBvbGljeSBpcyBhcHBsaWNhYmxlIHRvIGEKLSAqICAgICAgICAgICBzdXNwZW5kZWQgZHJpdmVyIG9mIHRoYXQgY2xhc3MsIGZyZWV6ZSBxdWV1ZXMgZm9yIGJsb2NrIGxpa2UgSURFCi0gKiAgICAgICAgICAgZG9lcywgZHJvcCBwYWNrZXRzIGZvciBldGhlcm5ldCwgZXRjLi4uIHN0b3AgRE1BIGVuZ2luZSB0b28gZXRjLi4uCi0gKiAgICAgICAgICAgc28gYSBjb25zaXN0ZW50IGltYWdlIGNhbiBiZSBzYXZlZDsgYnV0IGRvIG5vdCBwb3dlciBhbnkgaGFyZHdhcmUKLSAqICAgICAgICAgICBkb3duLgotICogU1VTUEVORCAtIGxpa2UgRlJFRVpFLCBidXQgaGFyZHdhcmUgaXMgZG9pbmcgYXMgbXVjaCBwb3dlcnNhdmluZyBhcwotICogICAgICAgICAgIHBvc3NpYmxlLiBSb3VnaGx5IHBjaSBEMy4KKyAqIFNldmVyYWwgZHJpdmVyIHBvd2VyIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBleHRlcm5hbGx5IHZpc2libGUsIGFmZmVjdGluZworICogdGhlIHN0YXRlIG9mIHBlbmRpbmcgSS9PIHF1ZXVlcyBhbmQgKGZvciBkcml2ZXJzIHRoYXQgdG91Y2ggaGFyZHdhcmUpCisgKiBpbnRlcnJ1cHRzLCB3YWtldXBzLCBETUEsIGFuZCBvdGhlciBoYXJkd2FyZSBzdGF0ZS4gIFRoZXJlIG1heSBhbHNvIGJlCisgKiBpbnRlcm5hbCB0cmFuc2l0aW9ucyB0byB2YXJpb3VzIGxvdyBwb3dlciBtb2Rlcywgd2hpY2ggYXJlIHRyYW5zcGFyZW50CisgKiB0byB0aGUgcmVzdCBvZiB0aGUgZHJpdmVyIHN0YWNrIChzdWNoIGFzIGEgZHJpdmVyIHRoYXQncyBPTiBnYXRpbmcgb2ZmCisgKiBjbG9ja3Mgd2hpY2ggYXJlIG5vdCBpbiBhY3RpdmUgdXNlKS4KICAqCi0gKiBVbmZvcnR1bmF0ZWx5LCBjdXJyZW50IGRyaXZlcnMgb25seSByZWNvZ25pemUgbnVtZXJpYyB2YWx1ZXMgMCAoT04pIGFuZCAzCi0gKiAoU1VTUEVORCkuICBXZSdsbCBuZWVkIHRvIGZpeCB0aGUgZHJpdmVycy4gU28geWVzLCBwdXR0aW5nIDMgdG8gYWxsIGRpZmZlcmVudAotICogZGVmaW5lcyBpcyBpbnRlbnRpb25hbCwgYW5kIHdpbGwgZ28gYXdheSBhcyBzb29uIGFzIGRyaXZlcnMgYXJlIGZpeGVkLiAgQWxzbwotICogbm90ZSB0aGF0IHR5cGVkZWYgaXMgbmVjY2Vzc2FyeSwgd2UnbGwgcHJvYmFibHkgd2FudCB0byBzd2l0Y2ggdG8KLSAqICAgdHlwZWRlZiBzdHJ1Y3QgcG1fbWVzc2FnZV90IHsgaW50IGV2ZW50OyBpbnQgZmxhZ3M7IH0gcG1fbWVzc2FnZV90Ci0gKiBvciBzb21ldGhpbmcgc2ltaWxhciBzb29uLgorICogT25lIHRyYW5zaXRpb24gaXMgdHJpZ2dlcmVkIGJ5IHJlc3VtZSgpLCBhZnRlciBhIHN1c3BlbmQoKSBjYWxsOyB0aGUKKyAqIG1lc3NhZ2UgaXMgaW1wbGljaXQ6CisgKgorICogT04JCURyaXZlciBzdGFydHMgd29ya2luZyBhZ2FpbiwgcmVzcG9uZGluZyB0byBoYXJkd2FyZSBldmVudHMKKyAqIAkJYW5kIHNvZnR3YXJlIHJlcXVlc3RzLiAgVGhlIGhhcmR3YXJlIG1heSBoYXZlIGdvbmUgdGhyb3VnaAorICogCQlhIHBvd2VyLW9mZiByZXNldCwgb3IgaXQgbWF5IGhhdmUgbWFpbnRhaW5lZCBzdGF0ZSBmcm9tIHRoZQorICogCQlwcmV2aW91cyBzdXNwZW5kKCkgd2hpY2ggdGhlIGRyaXZlciB3aWxsIHJlbHkgb24gd2hpbGUKKyAqIAkJcmVzdW1pbmcuICBPbiBtb3N0IHBsYXRmb3JtcywgdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbgorICogCQlhdmFpbGFiaWxpdHkgb2YgcmVzb3VyY2VzIGxpa2UgY2xvY2tzIGR1cmluZyByZXN1bWUoKS4KKyAqCisgKiBPdGhlciB0cmFuc2l0aW9ucyBhcmUgdHJpZ2dlcmVkIGJ5IG1lc3NhZ2VzIHNlbnQgdXNpbmcgc3VzcGVuZCgpLiAgQWxsCisgKiB0aGVzZSB0cmFuc2l0aW9ucyBxdWllc2NlIHRoZSBkcml2ZXIsIHNvIHRoYXQgSS9PIHF1ZXVlcyBhcmUgaW5hY3RpdmUuCisgKiBUaGF0IGNvbW1vbmx5IGVudGFpbHMgdHVybmluZyBvZmYgSVJRcyBhbmQgRE1BOyB0aGVyZSBtYXkgYmUgcnVsZXMKKyAqIGFib3V0IGhvdyB0byBxdWllc2NlIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZSBidXMgb3IgdGhlIGRldmljZSdzIHR5cGUuCisgKiAoRm9yIGV4YW1wbGUsIG5ldHdvcmsgZHJpdmVycyBtYXJrIHRoZSBsaW5rIHN0YXRlLikgIE90aGVyIGRldGFpbHMgbWF5CisgKiBkaWZmZXIgYWNjb3JkaW5nIHRvIHRoZSBtZXNzYWdlOgorICoKKyAqIFNVU1BFTkQJUXVpZXNjZSwgZW50ZXIgYSBsb3cgcG93ZXIgZGV2aWNlIHN0YXRlIGFwcHJvcHJpYXRlIGZvcgorICogCQl0aGUgdXBjb21pbmcgc3lzdGVtIHN0YXRlIChzdWNoIGFzIFBDSV9EM2hvdCksIGFuZCBlbmFibGUKKyAqIAkJd2FrZXVwIGV2ZW50cyBhcyBhcHByb3ByaWF0ZS4KKyAqCisgKiBGUkVFWkUJUXVpZXNjZSBvcGVyYXRpb25zIHNvIHRoYXQgYSBjb25zaXN0ZW50IGltYWdlIGNhbiBiZSBzYXZlZDsKKyAqIAkJYnV0IGRvIE5PVCBvdGhlcndpc2UgZW50ZXIgYSBsb3cgcG93ZXIgZGV2aWNlIHN0YXRlLCBhbmQgZG8KKyAqIAkJTk9UIGVtaXQgc3lzdGVtIHdha2V1cCBldmVudHMuCisgKgorICogUFJFVEhBVwlRdWllc2NlIGFzIGlmIGZvciBGUkVFWkU7IGFkZGl0aW9uYWxseSwgcHJlcGFyZSBmb3IgcmVzdG9yaW5nCisgKiAJCXRoZSBzeXN0ZW0gZnJvbSBhIHNuYXBzaG90IHRha2VuIGFmdGVyIGFuIGVhcmxpZXIgRlJFRVpFLgorICogCQlTb21lIGRyaXZlcnMgd2lsbCBuZWVkIHRvIHJlc2V0IHRoZWlyIGhhcmR3YXJlIHN0YXRlIGluc3RlYWQKKyAqIAkJb2YgcHJlc2VydmluZyBpdCwgdG8gZW5zdXJlIHRoYXQgaXQncyBuZXZlciBtaXN0YWtlbiBmb3IgdGhlCisgKiAJCXN0YXRlIHdoaWNoIHRoYXQgZWFybGllciBzbmFwc2hvdCBoYWQgc2V0IHVwLgorICoKKyAqIEEgbWluaW1hbGx5IHBvd2VyLWF3YXJlIGRyaXZlciB0cmVhdHMgYWxsIG1lc3NhZ2VzIGFzIFNVU1BFTkQsIGZ1bGx5CisgKiByZWluaXRpYWxpemVzIGl0cyBkZXZpY2UgZHVyaW5nIHJlc3VtZSgpIC0tIHdoZXRoZXIgb3Igbm90IGl0IHdhcyByZXNldAorICogZHVyaW5nIHRoZSBzdXNwZW5kL3Jlc3VtZSBjeWNsZSAtLSBhbmQgY2FuJ3QgaXNzdWUgd2FrZXVwIGV2ZW50cy4KKyAqCisgKiBNb3JlIHBvd2VyLWF3YXJlIGRyaXZlcnMgbWF5IGFsc28gdXNlIGxvdyBwb3dlciBzdGF0ZXMgYXQgcnVudGltZSBhcworICogd2VsbCBhcyBkdXJpbmcgc3lzdGVtIHNsZWVwIHN0YXRlcyBsaWtlIFBNX1NVU1BFTkRfU1RBTkRCWS4gIFRoZXkgbWF5CisgKiBiZSBhYmxlIHRvIHVzZSB3YWtldXAgZXZlbnRzIHRvIGV4aXQgZnJvbSBydW50aW1lIGxvdy1wb3dlciBzdGF0ZXMsCisgKiBvciBmcm9tIHN5c3RlbSBsb3ctcG93ZXIgc3RhdGVzIHN1Y2ggYXMgc3RhbmRieSBvciBzdXNwZW5kLXRvLVJBTS4KICAqLwogCiAjZGVmaW5lIFBNX0VWRU5UX09OIDAKICNkZWZpbmUgUE1fRVZFTlRfRlJFRVpFIDEKICNkZWZpbmUgUE1fRVZFTlRfU1VTUEVORCAyCisjZGVmaW5lIFBNX0VWRU5UX1BSRVRIQVcgMwogCiAjZGVmaW5lIFBNU0dfRlJFRVpFCSgoc3RydWN0IHBtX21lc3NhZ2UpeyAuZXZlbnQgPSBQTV9FVkVOVF9GUkVFWkUsIH0pCisjZGVmaW5lIFBNU0dfUFJFVEhBVwkoKHN0cnVjdCBwbV9tZXNzYWdlKXsgLmV2ZW50ID0gUE1fRVZFTlRfUFJFVEhBVywgfSkKICNkZWZpbmUgUE1TR19TVVNQRU5ECSgoc3RydWN0IHBtX21lc3NhZ2UpeyAuZXZlbnQgPSBQTV9FVkVOVF9TVVNQRU5ELCB9KQogI2RlZmluZSBQTVNHX09OCQkoKHN0cnVjdCBwbV9tZXNzYWdlKXsgLmV2ZW50ID0gUE1fRVZFTlRfT04sIH0pCiAKQEAgLTE5MCw2ICsyMjIsNyBAQAogZXh0ZXJuIHN1c3BlbmRfZGlza19tZXRob2RfdCBwbV9kaXNrX21vZGU7CiAKIGV4dGVybiBpbnQgZGV2aWNlX3N1c3BlbmQocG1fbWVzc2FnZV90IHN0YXRlKTsKK2V4dGVybiBpbnQgZGV2aWNlX3ByZXBhcmVfc3VzcGVuZChwbV9tZXNzYWdlX3Qgc3RhdGUpOwogCiAjZGVmaW5lIGRldmljZV9zZXRfd2FrZXVwX2VuYWJsZShkZXYsdmFsKSBcCiAJKChkZXYpLT5wb3dlci5zaG91bGRfd2FrZXVwID0gISEodmFsKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHJvY19mcy5oIGIvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKaW5kZXggMzQzNWNhMy4uNTdmNzBiYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcm9jX2ZzLmgKQEAgLTI2OCw3ICsyNjgsOSBAQAogc3RydWN0IHByb2NfbWFwc19wcml2YXRlIHsKIAlzdHJ1Y3QgcGlkICpwaWQ7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworI2lmZGVmIENPTkZJR19NTVUKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnRhaWxfdm1hOworI2VuZGlmCiB9OwogCiAjZW5kaWYgLyogX0xJTlVYX1BST0NfRlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IDM0ZWQwZDkuLjlkNGFhN2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTgxOSw2ICs4MTksMTEgQEAKIAl1bnNpZ25lZCBkaWRfZXhlYzoxOwogCXBpZF90IHBpZDsKIAlwaWRfdCB0Z2lkOworCisjaWZkZWYgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SCisJLyogQ2FuYXJ5IHZhbHVlIGZvciB0aGUgLWZzdGFjay1wcm90ZWN0b3IgZ2NjIGZlYXR1cmUgKi8KKwl1bnNpZ25lZCBsb25nIHN0YWNrX2NhbmFyeTsKKyNlbmRpZgogCS8qIAogCSAqIHBvaW50ZXJzIHRvIChvcmlnaW5hbCkgcGFyZW50IHByb2Nlc3MsIHlvdW5nZXN0IGNoaWxkLCB5b3VuZ2VyIHNpYmxpbmcsCiAJICogb2xkZXIgc2libGluZywgcmVzcGVjdGl2ZWx5LiAgKHAtPmZhdGhlciBjYW4gYmUgcmVwbGFjZWQgd2l0aCAKQEAgLTg2NSw2ICs4NzAsMTUgQEAKIAlzdHJ1Y3Qga2V5ICp0aHJlYWRfa2V5cmluZzsJLyoga2V5cmluZyBwcml2YXRlIHRvIHRoaXMgdGhyZWFkICovCiAJdW5zaWduZWQgY2hhciBqaXRfa2V5cmluZzsJLyogZGVmYXVsdCBrZXlyaW5nIHRvIGF0dGFjaCByZXF1ZXN0ZWQga2V5cyB0byAqLwogI2VuZGlmCisJLyoKKwkgKiBmcHVfY291bnRlciBjb250YWlucyB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGNvbnRleHQgc3dpdGNoZXMKKwkgKiB0aGF0IHRoZSBGUFUgaXMgdXNlZC4gSWYgdGhpcyBpcyBvdmVyIGEgdGhyZXNob2xkLCB0aGUgbGF6eSBmcHUKKwkgKiBzYXZpbmcgYmVjb21lcyB1bmxhenkgdG8gc2F2ZSB0aGUgdHJhcC4gVGhpcyBpcyBhbiB1bnNpZ25lZCBjaGFyCisJICogc28gdGhhdCBhZnRlciAyNTYgdGltZXMgdGhlIGNvdW50ZXIgd3JhcHMgYW5kIHRoZSBiZWhhdmlvciB0dXJucworCSAqIGxhenkgYWdhaW47IHRoaXMgdG8gZGVhbCB3aXRoIGJ1cnN0eSBhcHBzIHRoYXQgb25seSB1c2UgRlBVIGZvcgorCSAqIGEgc2hvcnQgdGltZQorCSAqLworCXVuc2lnbmVkIGNoYXIgZnB1X2NvdW50ZXI7CiAJaW50IG9vbWtpbGxhZGo7IC8qIE9PTSBraWxsIHNjb3JlIGFkanVzdG1lbnQgKGJpdCBzaGlmdCkuICovCiAJY2hhciBjb21tW1RBU0tfQ09NTV9MRU5dOyAvKiBleGVjdXRhYmxlIG5hbWUgZXhjbHVkaW5nIHBhdGgKIAkJCQkgICAgIC0gYWNjZXNzIHdpdGggW2dzXWV0X3Rhc2tfY29tbSAod2hpY2ggbG9jawpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbGFiLmggYi9pbmNsdWRlL2xpbnV4L3NsYWIuaAppbmRleCA2NmQ2ZWI3Li5hOTZmZDkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsYWIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsYWIuaApAQCAtNjAsNyArNjAsNyBAQAogZXh0ZXJuIGttZW1fY2FjaGVfdCAqa21lbV9jYWNoZV9jcmVhdGUoY29uc3QgY2hhciAqLCBzaXplX3QsIHNpemVfdCwgdW5zaWduZWQgbG9uZywKIAkJCQkgICAgICAgdm9pZCAoKikodm9pZCAqLCBrbWVtX2NhY2hlX3QgKiwgdW5zaWduZWQgbG9uZyksCiAJCQkJICAgICAgIHZvaWQgKCopKHZvaWQgKiwga21lbV9jYWNoZV90ICosIHVuc2lnbmVkIGxvbmcpKTsKLWV4dGVybiBpbnQga21lbV9jYWNoZV9kZXN0cm95KGttZW1fY2FjaGVfdCAqKTsKK2V4dGVybiB2b2lkIGttZW1fY2FjaGVfZGVzdHJveShrbWVtX2NhY2hlX3QgKik7CiBleHRlcm4gaW50IGttZW1fY2FjaGVfc2hyaW5rKGttZW1fY2FjaGVfdCAqKTsKIGV4dGVybiB2b2lkICprbWVtX2NhY2hlX2FsbG9jKGttZW1fY2FjaGVfdCAqLCBnZnBfdCk7CiBleHRlcm4gdm9pZCAqa21lbV9jYWNoZV96YWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKiwgZ2ZwX3QpOwpAQCAtMjQ5LDcgKzI0OSw3IEBACiAJdW5zaWduZWQgbG9uZywKIAl2b2lkICgqKSh2b2lkICosIHN0cnVjdCBrbWVtX2NhY2hlICosIHVuc2lnbmVkIGxvbmcpLAogCXZvaWQgKCopKHZvaWQgKiwgc3RydWN0IGttZW1fY2FjaGUgKiwgdW5zaWduZWQgbG9uZykpOwotaW50IGttZW1fY2FjaGVfZGVzdHJveShzdHJ1Y3Qga21lbV9jYWNoZSAqYyk7Cit2b2lkIGttZW1fY2FjaGVfZGVzdHJveShzdHJ1Y3Qga21lbV9jYWNoZSAqYyk7CiB2b2lkICprbWVtX2NhY2hlX2FsbG9jKHN0cnVjdCBrbWVtX2NhY2hlICpjLCBnZnBfdCBmbGFncyk7CiB2b2lkICprbWVtX2NhY2hlX3phbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7CiB2b2lkIGttZW1fY2FjaGVfZnJlZShzdHJ1Y3Qga21lbV9jYWNoZSAqYywgdm9pZCAqYik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NtYi5oIGIvaW5jbHVkZS9saW51eC9zbWIuaAppbmRleCA2ZGYzYjE1Li5mMDk4ZGZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NtYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc21iLmgKQEAgLTg5LDcgKzg5LDYgQEAKIAlzdHJ1Y3QgdGltZXNwZWMJZl9hdGltZTsKIAlzdHJ1Y3QgdGltZXNwZWMgZl9tdGltZTsKIAlzdHJ1Y3QgdGltZXNwZWMgZl9jdGltZTsKLQl1bnNpZ25lZCBsb25nCWZfYmxrc2l6ZTsKIAl1bnNpZ25lZCBsb25nCWZfYmxvY2tzOwogCWludAkJZl91bml4OwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3RhY2t0cmFjZS5oIGIvaW5jbHVkZS9saW51eC9zdGFja3RyYWNlLmgKaW5kZXggOWNjODFlNS4uNTBlMmIwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdGFja3RyYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdGFja3RyYWNlLmgKQEAgLTUsMTUgKzUsMTYgQEAKIHN0cnVjdCBzdGFja190cmFjZSB7CiAJdW5zaWduZWQgaW50IG5yX2VudHJpZXMsIG1heF9lbnRyaWVzOwogCXVuc2lnbmVkIGxvbmcgKmVudHJpZXM7CisJaW50IHNraXA7CS8qIGlucHV0IGFyZ3VtZW50OiBIb3cgbWFueSBlbnRyaWVzIHRvIHNraXAgKi8KKwlpbnQgYWxsX2NvbnRleHRzOyAvKiBpbnB1dCBhcmd1bWVudDogaWYgdHJ1ZSBkbyB0aGFuIG9uZSBzdGFjayAqLwogfTsKIAogZXh0ZXJuIHZvaWQgc2F2ZV9zdGFja190cmFjZShzdHJ1Y3Qgc3RhY2tfdHJhY2UgKnRyYWNlLAotCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBhbGxfY29udGV4dHMsCi0JCQkgICAgIHVuc2lnbmVkIGludCBza2lwKTsKKwkJCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKIAogZXh0ZXJuIHZvaWQgcHJpbnRfc3RhY2tfdHJhY2Uoc3RydWN0IHN0YWNrX3RyYWNlICp0cmFjZSwgaW50IHNwYWNlcyk7CiAjZWxzZQotIyBkZWZpbmUgc2F2ZV9zdGFja190cmFjZSh0cmFjZSwgdGFzaywgYWxsLCBza2lwKQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSBzYXZlX3N0YWNrX3RyYWNlKHRyYWNlLCB0YXNrKQkJCWRvIHsgfSB3aGlsZSAoMCkKICMgZGVmaW5lIHByaW50X3N0YWNrX3RyYWNlKHRyYWNlKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmggYi9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKaW5kZXggMDA4ZjA0Yy4uM2YwZjcxNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaApAQCAtNTMsNiArNTMsNyBAQAogc3RydWN0IGNvbXBhdF9zdGF0Owogc3RydWN0IGNvbXBhdF90aW1ldmFsOwogc3RydWN0IHJvYnVzdF9saXN0X2hlYWQ7CitzdHJ1Y3QgZ2V0Y3B1X2NhY2hlOwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9haW9fYWJpLmg+CkBAIC01OTYsNSArNTk3LDYgQEAKIAkJCQkgICAgc2l6ZV90IF9fdXNlciAqbGVuX3B0cik7CiBhc21saW5rYWdlIGxvbmcgc3lzX3NldF9yb2J1c3RfbGlzdChzdHJ1Y3Qgcm9idXN0X2xpc3RfaGVhZCBfX3VzZXIgKmhlYWQsCiAJCQkJICAgIHNpemVfdCBsZW4pOworYXNtbGlua2FnZSBsb25nIHN5c19nZXRjcHUodW5zaWduZWQgKmNwdSwgdW5zaWduZWQgKm5vZGUsIHN0cnVjdCBnZXRjcHVfY2FjaGUgKmNhY2hlKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaAppbmRleCBlY2E1NTU3Li4xYjI0YmQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKQEAgLTE1MCw2ICsxNTAsOCBAQAogCUtFUk5fSUE2NF9VTkFMSUdORUQ9NzIsIC8qIGludDogaWE2NCB1bmFsaWduZWQgdXNlcmxhbmQgdHJhcCBlbmFibGUgKi8KIAlLRVJOX0NPTVBBVF9MT0c9NzMsCS8qIGludDogcHJpbnQgY29tcGF0IGxheWVyICBtZXNzYWdlcyAqLwogCUtFUk5fTUFYX0xPQ0tfREVQVEg9NzQsCisJS0VSTl9OTUlfV0FUQ0hET0c9NzUsIC8qIGludDogZW5hYmxlL2Rpc2FibGUgbm1pIHdhdGNoZG9nICovCisJS0VSTl9QQU5JQ19PTl9OTUk9NzYsIC8qIGludDogd2hldGhlciB3ZSB3aWxsIHBhbmljIG9uIGFuIHVucmVjb3ZlcmVkICovCiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzZnMuaCBiL2luY2x1ZGUvbGludXgvc3lzZnMuaAppbmRleCAxZWE1ZDNjLi42ZDVjNDNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNmcy5oCkBAIC0xMCw2ICsxMCw3IEBACiAjaWZuZGVmIF9TWVNGU19IXwogI2RlZmluZSBfU1lTRlNfSF8KIAorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCiBzdHJ1Y3Qga29iamVjdDsKQEAgLTg2LDQwICs4Nyw0NCBAQAogCiAjaWZkZWYgQ09ORklHX1NZU0ZTCiAKLWV4dGVybiBpbnQKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrCiBzeXNmc19jcmVhdGVfZGlyKHN0cnVjdCBrb2JqZWN0ICopOwogCiBleHRlcm4gdm9pZAogc3lzZnNfcmVtb3ZlX2RpcihzdHJ1Y3Qga29iamVjdCAqKTsKIAotZXh0ZXJuIGludAorZXh0ZXJuIGludCBfX211c3RfY2hlY2sKIHN5c2ZzX3JlbmFtZV9kaXIoc3RydWN0IGtvYmplY3QgKiwgY29uc3QgY2hhciAqbmV3X25hbWUpOwogCi1leHRlcm4gaW50CitleHRlcm4gaW50IF9fbXVzdF9jaGVjawogc3lzZnNfY3JlYXRlX2ZpbGUoc3RydWN0IGtvYmplY3QgKiwgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqKTsKIAotZXh0ZXJuIGludAorZXh0ZXJuIGludCBfX211c3RfY2hlY2sKIHN5c2ZzX3VwZGF0ZV9maWxlKHN0cnVjdCBrb2JqZWN0ICosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKik7CiAKLWV4dGVybiBpbnQKK2V4dGVybiBpbnQgX19tdXN0X2NoZWNrCiBzeXNmc19jaG1vZF9maWxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBtb2RlX3QgbW9kZSk7CiAKIGV4dGVybiB2b2lkCiBzeXNmc19yZW1vdmVfZmlsZShzdHJ1Y3Qga29iamVjdCAqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICopOwogCi1leHRlcm4gaW50CitleHRlcm4gaW50IF9fbXVzdF9jaGVjawogc3lzZnNfY3JlYXRlX2xpbmsoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBzdHJ1Y3Qga29iamVjdCAqIHRhcmdldCwgY29uc3QgY2hhciAqIG5hbWUpOwogCiBleHRlcm4gdm9pZAogc3lzZnNfcmVtb3ZlX2xpbmsoc3RydWN0IGtvYmplY3QgKiwgY29uc3QgY2hhciAqIG5hbWUpOwogCi1pbnQgc3lzZnNfY3JlYXRlX2Jpbl9maWxlKHN0cnVjdCBrb2JqZWN0ICoga29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKiBhdHRyKTsKLWludCBzeXNmc19yZW1vdmVfYmluX2ZpbGUoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqIGF0dHIpOworaW50IF9fbXVzdF9jaGVjayBzeXNmc19jcmVhdGVfYmluX2ZpbGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyKTsKK3ZvaWQgc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0cik7CiAKLWludCBzeXNmc19jcmVhdGVfZ3JvdXAoc3RydWN0IGtvYmplY3QgKiwgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKTsKK2ludCBfX211c3RfY2hlY2sgc3lzZnNfY3JlYXRlX2dyb3VwKHN0cnVjdCBrb2JqZWN0ICosCisJCQkJCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKik7CiB2b2lkIHN5c2ZzX3JlbW92ZV9ncm91cChzdHJ1Y3Qga29iamVjdCAqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICopOwogdm9pZCBzeXNmc19ub3RpZnkoc3RydWN0IGtvYmplY3QgKiBrLCBjaGFyICpkaXIsIGNoYXIgKmF0dHIpOwogCitleHRlcm4gaW50IF9fbXVzdF9jaGVjayBzeXNmc19pbml0KHZvaWQpOworCiAjZWxzZSAvKiBDT05GSUdfU1lTRlMgKi8KIAogc3RhdGljIGlubGluZSBpbnQgc3lzZnNfY3JlYXRlX2RpcihzdHJ1Y3Qga29iamVjdCAqIGspCkBAIC0xOTEsNiArMTk2LDExIEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBzeXNmc19pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfU1lTRlMgKi8KIAogI2VuZGlmIC8qIF9TWVNGU19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91YWNjZXNzLmggYi9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaAppbmRleCAzOTFlN2VkLi5hNDhkN2YxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaApAQCAtMTksNCArMTksMjYgQEAKIAogI2VuZGlmCQkvKiBBUkNIX0hBU19OT0NBQ0hFX1VBQ0NFU1MgKi8KIAorLyoqCisgKiBwcm9iZV9rZXJuZWxfYWRkcmVzcygpOiBzYWZlbHkgYXR0ZW1wdCB0byByZWFkIGZyb20gYSBsb2NhdGlvbgorICogQGFkZHI6IGFkZHJlc3MgdG8gcmVhZCBmcm9tIC0gaXRzIHR5cGUgaXMgdHlwZSB0eXBlb2YocmV0dmFsKSoKKyAqIEByZXR2YWw6IHJlYWQgaW50byB0aGlzIHZhcmlhYmxlCisgKgorICogU2FmZWx5IHJlYWQgZnJvbSBhZGRyZXNzIEBhZGRyIGludG8gdmFyaWFibGUgQHJldnRhbC4gIElmIGEga2VybmVsIGZhdWx0CisgKiBoYXBwZW5zLCBoYW5kbGUgdGhhdCBhbmQgcmV0dXJuIC1FRkFVTFQuCisgKiBXZSBlbnN1cmUgdGhhdCB0aGUgX19nZXRfdXNlcigpIGlzIGV4ZWN1dGVkIGluIGF0b21pYyBjb250ZXh0IHNvIHRoYXQKKyAqIGRvX3BhZ2VfZmF1bHQoKSBkb2Vzbid0IGF0dGVtcHQgdG8gdGFrZSBtbWFwX3NlbS4gIFRoaXMgbWFrZXMKKyAqIHByb2JlX2tlcm5lbF9hZGRyZXNzKCkgc3VpdGFibGUgZm9yIHVzZSB3aXRoaW4gcmVnaW9ucyB3aGVyZSB0aGUgY2FsbGVyCisgKiBhbHJlYWR5IGhvbGRzIG1tYXBfc2VtLCBvciBvdGhlciBsb2NrcyB3aGljaCBuZXN0IGluc2lkZSBtbWFwX3NlbS4KKyAqLworI2RlZmluZSBwcm9iZV9rZXJuZWxfYWRkcmVzcyhhZGRyLCByZXR2YWwpCQlcCisJKHsJCQkJCQlcCisJCWxvbmcgcmV0OwkJCQlcCisJCQkJCQkJXAorCQlpbmNfcHJlZW1wdF9jb3VudCgpOwkJCVwKKwkJcmV0ID0gX19nZXRfdXNlcihyZXR2YWwsIGFkZHIpOwkJXAorCQlkZWNfcHJlZW1wdF9jb3VudCgpOwkJCVwKKwkJcmV0OwkJCQkJXAorCX0pCisKICNlbmRpZgkJLyogX19MSU5VWF9VQUNDRVNTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IuaCBiL2luY2x1ZGUvbGludXgvdXNiLmgKaW5kZXggZDJiZDBjOC4uMGRhMTViMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi5oCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4JCS8qIGZvciBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICovCiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgkvKiBmb3Igc3RydWN0IGNvbXBsZXRpb24gKi8KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgkvKiBmb3IgY3VycmVudCAmJiBzY2hlZHVsZV90aW1lb3V0ICovCisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4JLyogZm9yIHN0cnVjdCBtdXRleCAqLwogCiBzdHJ1Y3QgdXNiX2RldmljZTsKIHN0cnVjdCB1c2JfZHJpdmVyOwpAQCAtMTAyLDggKzEwMywxMyBAQAogICoJbnVtYmVyIGZyb20gdGhlIFVTQiBjb3JlIGJ5IGNhbGxpbmcgdXNiX3JlZ2lzdGVyX2RldigpLgogICogQGNvbmRpdGlvbjogYmluZGluZyBzdGF0ZSBvZiB0aGUgaW50ZXJmYWNlOiBub3QgYm91bmQsIGJpbmRpbmcKICAqCShpbiBwcm9iZSgpKSwgYm91bmQgdG8gYSBkcml2ZXIsIG9yIHVuYmluZGluZyAoaW4gZGlzY29ubmVjdCgpKQorICogQGlzX2FjdGl2ZTogZmxhZyBzZXQgd2hlbiB0aGUgaW50ZXJmYWNlIGlzIGJvdW5kIGFuZCBub3Qgc3VzcGVuZGVkLgorICogQG5lZWRzX3JlbW90ZV93YWtldXA6IGZsYWcgc2V0IHdoZW4gdGhlIGRyaXZlciByZXF1aXJlcyByZW1vdGUtd2FrZXVwCisgKgljYXBhYmlsaXR5IGR1cmluZyBhdXRvc3VzcGVuZC4KICAqIEBkZXY6IGRyaXZlciBtb2RlbCdzIHZpZXcgb2YgdGhpcyBkZXZpY2UKICAqIEBjbGFzc19kZXY6IGRyaXZlciBtb2RlbCdzIGNsYXNzIHZpZXcgb2YgdGhpcyBkZXZpY2UuCisgKiBAcG1fdXNhZ2VfY250OiBQTSB1c2FnZSBjb3VudGVyIGZvciB0aGlzIGludGVyZmFjZTsgYXV0b3N1c3BlbmQgaXMgbm90CisgKglhbGxvd2VkIHVubGVzcyB0aGUgY291bnRlciBpcyAwLgogICoKICAqIFVTQiBkZXZpY2UgZHJpdmVycyBhdHRhY2ggdG8gaW50ZXJmYWNlcyBvbiBhIHBoeXNpY2FsIGRldmljZS4gIEVhY2gKICAqIGludGVyZmFjZSBlbmNhcHN1bGF0ZXMgYSBzaW5nbGUgaGlnaCBsZXZlbCBmdW5jdGlvbiwgc3VjaCBhcyBmZWVkaW5nCkBAIC0xNDIsOCArMTQ4LDEyIEBACiAJaW50IG1pbm9yOwkJCS8qIG1pbm9yIG51bWJlciB0aGlzIGludGVyZmFjZSBpcwogCQkJCQkgKiBib3VuZCB0byAqLwogCWVudW0gdXNiX2ludGVyZmFjZV9jb25kaXRpb24gY29uZGl0aW9uOwkJLyogc3RhdGUgb2YgYmluZGluZyAqLworCXVuc2lnbmVkIGlzX2FjdGl2ZToxOwkJLyogdGhlIGludGVyZmFjZSBpcyBub3Qgc3VzcGVuZGVkICovCisJdW5zaWduZWQgbmVlZHNfcmVtb3RlX3dha2V1cDoxOwkvKiBkcml2ZXIgcmVxdWlyZXMgcmVtb3RlIHdha2V1cCAqLworCiAJc3RydWN0IGRldmljZSBkZXY7CQkvKiBpbnRlcmZhY2Ugc3BlY2lmaWMgZGV2aWNlIGluZm8gKi8KIAlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CisJaW50IHBtX3VzYWdlX2NudDsJCS8qIHVzYWdlIGNvdW50ZXIgZm9yIGF1dG9zdXNwZW5kICovCiB9OwogI2RlZmluZQl0b191c2JfaW50ZXJmYWNlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSwgZGV2KQogI2RlZmluZQlpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpIFwKQEAgLTI1NCw4ICsyNjQsNiBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdHJ1Y3QgdXNiX29wZXJhdGlvbnM7Ci0KIC8qIFVTQiBkZXZpY2UgbnVtYmVyIGFsbG9jYXRpb24gYml0bWFwICovCiBzdHJ1Y3QgdXNiX2Rldm1hcCB7CiAJdW5zaWduZWQgbG9uZyBkZXZpY2VtYXBbMTI4IC8gKDgqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKV07CkBAIC0yNjgsNiArMjc2LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlICpjb250cm9sbGVyOwkvKiBob3N0L21hc3RlciBzaWRlIGhhcmR3YXJlICovCiAJaW50IGJ1c251bTsJCQkvKiBCdXMgbnVtYmVyIChpbiBvcmRlciBvZiByZWcpICovCiAJY2hhciAqYnVzX25hbWU7CQkJLyogc3RhYmxlIGlkIChQQ0kgc2xvdF9uYW1lIGV0YykgKi8KKwl1OCB1c2VzX2RtYTsJCQkvKiBEb2VzIHRoZSBob3N0IGNvbnRyb2xsZXIgdXNlIERNQT8gKi8KIAl1OCBvdGdfcG9ydDsJCQkvKiAwLCBvciBudW1iZXIgb2YgT1RHL0hOUCBwb3J0ICovCiAJdW5zaWduZWQgaXNfYl9ob3N0OjE7CQkvKiB0cnVlIGR1cmluZyBzb21lIEhOUCByb2xlc3dpdGNoZXMgKi8KIAl1bnNpZ25lZCBiX2hucF9lbmFibGU6MTsJLyogT1RHOiBkaWQgQS1Ib3N0IGVuYWJsZSBITlA/ICovCkBAIC0yNzYsMTAgKzI4NSw4IEBACiAJCQkJCSAqIHJvdW5kLXJvYmluIGFsbG9jYXRpb24gKi8KIAogCXN0cnVjdCB1c2JfZGV2bWFwIGRldm1hcDsJLyogZGV2aWNlIGFkZHJlc3MgYWxsb2NhdGlvbiBtYXAgKi8KLQlzdHJ1Y3QgdXNiX29wZXJhdGlvbnMgKm9wOwkvKiBPcGVyYXRpb25zIChzcGVjaWZpYyB0byB0aGUgSEMpICovCiAJc3RydWN0IHVzYl9kZXZpY2UgKnJvb3RfaHViOwkvKiBSb290IGh1YiAqLwogCXN0cnVjdCBsaXN0X2hlYWQgYnVzX2xpc3Q7CS8qIGxpc3Qgb2YgYnVzc2VzICovCi0Jdm9pZCAqaGNwcml2OyAgICAgICAgICAgICAgICAgICAvKiBIb3N0IENvbnRyb2xsZXIgcHJpdmF0ZSBkYXRhICovCiAKIAlpbnQgYmFuZHdpZHRoX2FsbG9jYXRlZDsJLyogb24gdGhpcyBidXM6IGhvdyBtdWNoIG9mIHRoZSB0aW1lCiAJCQkJCSAqIHJlc2VydmVkIGZvciBwZXJpb2RpYyAoaW50ci9pc28pCkBAIC0yOTQsOCArMzAxLDYgQEAKIAlzdHJ1Y3QgZGVudHJ5ICp1c2Jmc19kZW50cnk7CS8qIHVzYmZzIGRlbnRyeSBlbnRyeSBmb3IgdGhlIGJ1cyAqLwogCiAJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OwkvKiBjbGFzcyBkZXZpY2UgZm9yIHRoaXMgYnVzICovCi0Jc3RydWN0IGtyZWYga3JlZjsJCS8qIHJlZmVyZW5jZSBjb3VudGluZyBmb3IgdGhpcyBidXMgKi8KLQl2b2lkICgqcmVsZWFzZSkoc3RydWN0IHVzYl9idXMgKmJ1cyk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19VU0JfTU9OKQogCXN0cnVjdCBtb25fYnVzICptb25fYnVzOwkvKiBub24tbnVsbCB3aGVuIGFzc29jaWF0ZWQgKi8KQEAgLTM1MCw2ICszNTUsNyBAQAogCiAJdW5zaWduZWQgc2hvcnQgYnVzX21BOwkJLyogQ3VycmVudCBhdmFpbGFibGUgZnJvbSB0aGUgYnVzICovCiAJdTggcG9ydG51bTsJCQkvKiBQYXJlbnQgcG9ydCBudW1iZXIgKG9yaWdpbiAxKSAqLworCXU4IGxldmVsOwkJCS8qIE51bWJlciBvZiBVU0IgaHViIGFuY2VzdG9ycyAqLwogCiAJaW50IGhhdmVfbGFuZ2lkOwkJLyogd2hldGhlciBzdHJpbmdfbGFuZ2lkIGlzIHZhbGlkICovCiAJaW50IHN0cmluZ19sYW5naWQ7CQkvKiBsYW5ndWFnZSBJRCBmb3Igc3RyaW5ncyAqLwpAQCAtMzczLDYgKzM3OSwxNSBAQAogCiAJaW50IG1heGNoaWxkOwkJCS8qIE51bWJlciBvZiBwb3J0cyBpZiBodWIgKi8KIAlzdHJ1Y3QgdXNiX2RldmljZSAqY2hpbGRyZW5bVVNCX01BWENISUxEUkVOXTsKKworI2lmZGVmIENPTkZJR19QTQorCXN0cnVjdCB3b3JrX3N0cnVjdCBhdXRvc3VzcGVuZDsJLyogZm9yIGRlbGF5ZWQgYXV0b3N1c3BlbmRzICovCisJc3RydWN0IG11dGV4IHBtX211dGV4OwkJLyogcHJvdGVjdHMgUE0gb3BlcmF0aW9ucyAqLworCWludCBwbV91c2FnZV9jbnQ7CQkvKiB1c2FnZSBjb3VudGVyIGZvciBhdXRvc3VzcGVuZCAqLworCisJdW5zaWduZWQgYXV0b19wbToxOwkJLyogYXV0b3N1c3BlbmQvcmVzdW1lIGluIHByb2dyZXNzICovCisJdW5zaWduZWQgZG9fcmVtb3RlX3dha2V1cDoxOwkvKiByZW1vdGUgd2FrZXVwIHNob3VsZCBiZSBlbmFibGVkICovCisjZW5kaWYKIH07CiAjZGVmaW5lCXRvX3VzYl9kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCB1c2JfZGV2aWNlLCBkZXYpCiAKQEAgLTM4NCw3ICszOTksNyBAQAogI2RlZmluZSB1c2JfdW5sb2NrX2RldmljZSh1ZGV2KQkJdXAoJih1ZGV2KS0+ZGV2LnNlbSkKICNkZWZpbmUgdXNiX3RyeWxvY2tfZGV2aWNlKHVkZXYpCWRvd25fdHJ5bG9jaygmKHVkZXYpLT5kZXYuc2VtKQogZXh0ZXJuIGludCB1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LAotCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpOworCQkJCSAgICAgY29uc3Qgc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKTsKIAogLyogVVNCIHBvcnQgcmVzZXQgZm9yIGRldmljZSByZWluaXRpYWxpemF0aW9uICovCiBleHRlcm4gaW50IHVzYl9yZXNldF9kZXZpY2Uoc3RydWN0IHVzYl9kZXZpY2UgKmRldik7CkBAIC0zOTMsNiArNDA4LDE3IEBACiAKIGV4dGVybiBzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2ZpbmRfZGV2aWNlKHUxNiB2ZW5kb3JfaWQsIHUxNiBwcm9kdWN0X2lkKTsKIAorLyogVVNCIGF1dG9zdXNwZW5kIGFuZCBhdXRvcmVzdW1lICovCisjaWZkZWYgQ09ORklHX1VTQl9TVVNQRU5ECitleHRlcm4gaW50IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50Zik7CitleHRlcm4gdm9pZCB1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2Uoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpOworCisjZWxzZQorI2RlZmluZSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoaW50ZikJCTAKKyNkZWZpbmUgdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGludGYpCQlkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qIGZvciBkcml2ZXJzIHVzaW5nIGlzbyBlbmRwb2ludHMgKi8KQEAgLTQyMywxMCArNDQ5LDEwIEBACiAKIGV4dGVybiBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdXNiX2ZpbmRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfZHJpdmVyICpkcnYsCiAJCWludCBtaW5vcik7Ci1leHRlcm4gc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVzYl9pZm51bV90b19pZihzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LAorZXh0ZXJuIHN0cnVjdCB1c2JfaW50ZXJmYWNlICp1c2JfaWZudW1fdG9faWYoY29uc3Qgc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKIAkJdW5zaWduZWQgaWZudW0pOwogZXh0ZXJuIHN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UgKnVzYl9hbHRudW1fdG9fYWx0c2V0dGluZygKLQkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIHVuc2lnbmVkIGludCBhbHRudW0pOworCQljb25zdCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgdW5zaWduZWQgaW50IGFsdG51bSk7CiAKIAogLyoqCkBAIC00NjQsNiArNDkwLDIwIEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKK2V4dGVybiBpbnQgdXNiX2VuZHBvaW50X2Rpcl9pbihjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCk7CitleHRlcm4gaW50IHVzYl9lbmRwb2ludF9kaXJfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKTsKK2V4dGVybiBpbnQgdXNiX2VuZHBvaW50X3hmZXJfYnVsayhjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCk7CitleHRlcm4gaW50IHVzYl9lbmRwb2ludF94ZmVyX2ludChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCk7CitleHRlcm4gaW50IHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpOworZXh0ZXJuIGludCB1c2JfZW5kcG9pbnRfaXNfYnVsa19pbihjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCk7CitleHRlcm4gaW50IHVzYl9lbmRwb2ludF9pc19idWxrX291dChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCk7CitleHRlcm4gaW50IHVzYl9lbmRwb2ludF9pc19pbnRfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpOworZXh0ZXJuIGludCB1c2JfZW5kcG9pbnRfaXNfaW50X291dChjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwZCk7CitleHRlcm4gaW50IHVzYl9lbmRwb2ludF9pc19pc29jX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKTsKK2V4dGVybiBpbnQgdXNiX2VuZHBvaW50X2lzX2lzb2Nfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwogI2RlZmluZSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSBcCiAJCShVU0JfREVWSUNFX0lEX01BVENIX1ZFTkRPUiB8IFVTQl9ERVZJQ0VfSURfTUFUQ0hfUFJPRFVDVCkKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZfUkFOR0UgXApAQCAtNTQwLDcgKzU4MCwxNyBAQAogfTsKIAogLyoqCi0gKiBzdHJ1Y3QgdXNiX2RyaXZlciAtIGlkZW50aWZpZXMgVVNCIGRyaXZlciB0byB1c2Jjb3JlCisgKiBzdHJ1Y3QgdXNiZHJ2X3dyYXAgLSB3cmFwcGVyIGZvciBkcml2ZXItbW9kZWwgc3RydWN0dXJlCisgKiBAZHJpdmVyOiBUaGUgZHJpdmVyLW1vZGVsIGNvcmUgZHJpdmVyIHN0cnVjdHVyZS4KKyAqIEBmb3JfZGV2aWNlczogTm9uLXplcm8gZm9yIGRldmljZSBkcml2ZXJzLCAwIGZvciBpbnRlcmZhY2UgZHJpdmVycy4KKyAqLworc3RydWN0IHVzYmRydl93cmFwIHsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7CisJaW50IGZvcl9kZXZpY2VzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdXNiX2RyaXZlciAtIGlkZW50aWZpZXMgVVNCIGludGVyZmFjZSBkcml2ZXIgdG8gdXNiY29yZQogICogQG5hbWU6IFRoZSBkcml2ZXIgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFtb25nIFVTQiBkcml2ZXJzLAogICoJYW5kIHNob3VsZCBub3JtYWxseSBiZSB0aGUgc2FtZSBhcyB0aGUgbW9kdWxlIG5hbWUuCiAgKiBAcHJvYmU6IENhbGxlZCB0byBzZWUgaWYgdGhlIGRyaXZlciBpcyB3aWxsaW5nIHRvIG1hbmFnZSBhIHBhcnRpY3VsYXIKQEAgLTU2NywxMiArNjE3LDE0IEBACiAgKglvciB5b3VyIGRyaXZlcidzIHByb2JlIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgZ2V0IGNhbGxlZC4KICAqIEBkeW5pZHM6IHVzZWQgaW50ZXJuYWxseSB0byBob2xkIHRoZSBsaXN0IG9mIGR5bmFtaWNhbGx5IGFkZGVkIGRldmljZQogICoJaWRzIGZvciB0aGlzIGRyaXZlci4KLSAqIEBkcml2ZXI6IHRoZSBkcml2ZXIgbW9kZWwgY29yZSBkcml2ZXIgc3RydWN0dXJlLgorICogQGRydndyYXA6IERyaXZlci1tb2RlbCBjb3JlIHN0cnVjdHVyZSB3cmFwcGVyLgogICogQG5vX2R5bmFtaWNfaWQ6IGlmIHNldCB0byAxLCB0aGUgVVNCIGNvcmUgd2lsbCBub3QgYWxsb3cgZHluYW1pYyBpZHMgdG8gYmUKICAqCWFkZGVkIHRvIHRoaXMgZHJpdmVyIGJ5IHByZXZlbnRpbmcgdGhlIHN5c2ZzIGZpbGUgZnJvbSBiZWluZyBjcmVhdGVkLgorICogQHN1cHBvcnRzX2F1dG9zdXNwZW5kOiBpZiBzZXQgdG8gMCwgdGhlIFVTQiBjb3JlIHdpbGwgbm90IGFsbG93IGF1dG9zdXNwZW5kCisgKglmb3IgaW50ZXJmYWNlcyBib3VuZCB0byB0aGlzIGRyaXZlci4KICAqCi0gKiBVU0IgZHJpdmVycyBtdXN0IHByb3ZpZGUgYSBuYW1lLCBwcm9iZSgpIGFuZCBkaXNjb25uZWN0KCkgbWV0aG9kcywKLSAqIGFuZCBhbiBpZF90YWJsZS4gIE90aGVyIGRyaXZlciBmaWVsZHMgYXJlIG9wdGlvbmFsLgorICogVVNCIGludGVyZmFjZSBkcml2ZXJzIG11c3QgcHJvdmlkZSBhIG5hbWUsIHByb2JlKCkgYW5kIGRpc2Nvbm5lY3QoKQorICogbWV0aG9kcywgYW5kIGFuIGlkX3RhYmxlLiAgT3RoZXIgZHJpdmVyIGZpZWxkcyBhcmUgb3B0aW9uYWwuCiAgKgogICogVGhlIGlkX3RhYmxlIGlzIHVzZWQgaW4gaG90cGx1Z2dpbmcuICBJdCBob2xkcyBhIHNldCBvZiBkZXNjcmlwdG9ycywKICAqIGFuZCBzcGVjaWFsaXplZCBkYXRhIG1heSBiZSBhc3NvY2lhdGVkIHdpdGggZWFjaCBlbnRyeS4gIFRoYXQgdGFibGUKQEAgLTYwNiwxMCArNjU4LDQ0IEBACiAJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkX3RhYmxlOwogCiAJc3RydWN0IHVzYl9keW5pZHMgZHluaWRzOwotCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKKwlzdHJ1Y3QgdXNiZHJ2X3dyYXAgZHJ2d3JhcDsKIAl1bnNpZ25lZCBpbnQgbm9fZHluYW1pY19pZDoxOworCXVuc2lnbmVkIGludCBzdXBwb3J0c19hdXRvc3VzcGVuZDoxOwogfTsKLSNkZWZpbmUJdG9fdXNiX2RyaXZlcihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHVzYl9kcml2ZXIsIGRyaXZlcikKKyNkZWZpbmUJdG9fdXNiX2RyaXZlcihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHVzYl9kcml2ZXIsIGRydndyYXAuZHJpdmVyKQorCisvKioKKyAqIHN0cnVjdCB1c2JfZGV2aWNlX2RyaXZlciAtIGlkZW50aWZpZXMgVVNCIGRldmljZSBkcml2ZXIgdG8gdXNiY29yZQorICogQG5hbWU6IFRoZSBkcml2ZXIgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFtb25nIFVTQiBkcml2ZXJzLAorICoJYW5kIHNob3VsZCBub3JtYWxseSBiZSB0aGUgc2FtZSBhcyB0aGUgbW9kdWxlIG5hbWUuCisgKiBAcHJvYmU6IENhbGxlZCB0byBzZWUgaWYgdGhlIGRyaXZlciBpcyB3aWxsaW5nIHRvIG1hbmFnZSBhIHBhcnRpY3VsYXIKKyAqCWRldmljZS4gIElmIGl0IGlzLCBwcm9iZSByZXR1cm5zIHplcm8gYW5kIHVzZXMgZGV2X3NldF9kcnZkYXRhKCkKKyAqCXRvIGFzc29jaWF0ZSBkcml2ZXItc3BlY2lmaWMgZGF0YSB3aXRoIHRoZSBkZXZpY2UuICBJZiB1bndpbGxpbmcKKyAqCXRvIG1hbmFnZSB0aGUgZGV2aWNlLCByZXR1cm4gYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZS4KKyAqIEBkaXNjb25uZWN0OiBDYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGlzIG5vIGxvbmdlciBhY2Nlc3NpYmxlLCB1c3VhbGx5CisgKgliZWNhdXNlIGl0IGhhcyBiZWVuIChvciBpcyBiZWluZykgZGlzY29ubmVjdGVkIG9yIHRoZSBkcml2ZXIncworICoJbW9kdWxlIGlzIGJlaW5nIHVubG9hZGVkLgorICogQHN1c3BlbmQ6IENhbGxlZCB3aGVuIHRoZSBkZXZpY2UgaXMgZ29pbmcgdG8gYmUgc3VzcGVuZGVkIGJ5IHRoZSBzeXN0ZW0uCisgKiBAcmVzdW1lOiBDYWxsZWQgd2hlbiB0aGUgZGV2aWNlIGlzIGJlaW5nIHJlc3VtZWQgYnkgdGhlIHN5c3RlbS4KKyAqIEBkcnZ3cmFwOiBEcml2ZXItbW9kZWwgY29yZSBzdHJ1Y3R1cmUgd3JhcHBlci4KKyAqIEBzdXBwb3J0c19hdXRvc3VzcGVuZDogaWYgc2V0IHRvIDAsIHRoZSBVU0IgY29yZSB3aWxsIG5vdCBhbGxvdyBhdXRvc3VzcGVuZAorICoJZm9yIGRldmljZXMgYm91bmQgdG8gdGhpcyBkcml2ZXIuCisgKgorICogVVNCIGRyaXZlcnMgbXVzdCBwcm92aWRlIGFsbCB0aGUgZmllbGRzIGxpc3RlZCBhYm92ZSBleGNlcHQgZHJ2d3JhcC4KKyAqLworc3RydWN0IHVzYl9kZXZpY2VfZHJpdmVyIHsKKwljb25zdCBjaGFyICpuYW1lOworCisJaW50ICgqcHJvYmUpIChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldik7CisJdm9pZCAoKmRpc2Nvbm5lY3QpIChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldik7CisKKwlpbnQgKCpzdXNwZW5kKSAoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIHBtX21lc3NhZ2VfdCBtZXNzYWdlKTsKKwlpbnQgKCpyZXN1bWUpIChzdHJ1Y3QgdXNiX2RldmljZSAqdWRldik7CisJc3RydWN0IHVzYmRydl93cmFwIGRydndyYXA7CisJdW5zaWduZWQgaW50IHN1cHBvcnRzX2F1dG9zdXNwZW5kOjE7Cit9OworI2RlZmluZQl0b191c2JfZGV2aWNlX2RyaXZlcihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHVzYl9kZXZpY2VfZHJpdmVyLCBcCisJCWRydndyYXAuZHJpdmVyKQogCiBleHRlcm4gc3RydWN0IGJ1c190eXBlIHVzYl9idXNfdHlwZTsKIApAQCAtNjMzLDEzICs3MTksMTcgQEAKICAqIHVzZSB0aGVzZSBpbiBtb2R1bGVfaW5pdCgpL21vZHVsZV9leGl0KCkKICAqIGFuZCBkb24ndCBmb3JnZXQgTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIC4uLikKICAqLwotaW50IHVzYl9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHVzYl9kcml2ZXIgKiwgc3RydWN0IG1vZHVsZSAqKTsKK2V4dGVybiBpbnQgdXNiX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgdXNiX2RyaXZlciAqLCBzdHJ1Y3QgbW9kdWxlICopOwogc3RhdGljIGlubGluZSBpbnQgdXNiX3JlZ2lzdGVyKHN0cnVjdCB1c2JfZHJpdmVyICpkcml2ZXIpCiB7CiAJcmV0dXJuIHVzYl9yZWdpc3Rlcl9kcml2ZXIoZHJpdmVyLCBUSElTX01PRFVMRSk7CiB9CiBleHRlcm4gdm9pZCB1c2JfZGVyZWdpc3RlcihzdHJ1Y3QgdXNiX2RyaXZlciAqKTsKIAorZXh0ZXJuIGludCB1c2JfcmVnaXN0ZXJfZGV2aWNlX2RyaXZlcihzdHJ1Y3QgdXNiX2RldmljZV9kcml2ZXIgKiwKKwkJCXN0cnVjdCBtb2R1bGUgKik7CitleHRlcm4gdm9pZCB1c2JfZGVyZWdpc3Rlcl9kZXZpY2VfZHJpdmVyKHN0cnVjdCB1c2JfZGV2aWNlX2RyaXZlciAqKTsKKwogZXh0ZXJuIGludCB1c2JfcmVnaXN0ZXJfZGV2KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLAogCQkJICAgIHN0cnVjdCB1c2JfY2xhc3NfZHJpdmVyICpjbGFzc19kcml2ZXIpOwogZXh0ZXJuIHZvaWQgdXNiX2RlcmVnaXN0ZXJfZGV2KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLApAQCAtODg1LDcgKzk3NSw3IEBACiAgKiBAc2V0dXBfcGFja2V0OiBwb2ludGVyIHRvIHRoZSBzZXR1cF9wYWNrZXQgYnVmZmVyCiAgKiBAdHJhbnNmZXJfYnVmZmVyOiBwb2ludGVyIHRvIHRoZSB0cmFuc2ZlciBidWZmZXIKICAqIEBidWZmZXJfbGVuZ3RoOiBsZW5ndGggb2YgdGhlIHRyYW5zZmVyIGJ1ZmZlcgotICogQGNvbXBsZXRlOiBwb2ludGVyIHRvIHRoZSB1c2JfY29tcGxldGVfdCBmdW5jdGlvbgorICogQGNvbXBsZXRlX2ZuOiBwb2ludGVyIHRvIHRoZSB1c2JfY29tcGxldGVfdCBmdW5jdGlvbgogICogQGNvbnRleHQ6IHdoYXQgdG8gc2V0IHRoZSB1cmIgY29udGV4dCB0by4KICAqCiAgKiBJbml0aWFsaXplcyBhIGNvbnRyb2wgdXJiIHdpdGggdGhlIHByb3BlciBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gc3VibWl0CkBAIC04OTcsNyArOTg3LDcgQEAKIAkJCQkJIHVuc2lnbmVkIGNoYXIgKnNldHVwX3BhY2tldCwKIAkJCQkJIHZvaWQgKnRyYW5zZmVyX2J1ZmZlciwKIAkJCQkJIGludCBidWZmZXJfbGVuZ3RoLAotCQkJCQkgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsCisJCQkJCSB1c2JfY29tcGxldGVfdCBjb21wbGV0ZV9mbiwKIAkJCQkJIHZvaWQgKmNvbnRleHQpCiB7CiAJc3Bpbl9sb2NrX2luaXQoJnVyYi0+bG9jayk7CkBAIC05MDYsNyArOTk2LDcgQEAKIAl1cmItPnNldHVwX3BhY2tldCA9IHNldHVwX3BhY2tldDsKIAl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHRyYW5zZmVyX2J1ZmZlcjsKIAl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBidWZmZXJfbGVuZ3RoOwotCXVyYi0+Y29tcGxldGUgPSBjb21wbGV0ZTsKKwl1cmItPmNvbXBsZXRlID0gY29tcGxldGVfZm47CiAJdXJiLT5jb250ZXh0ID0gY29udGV4dDsKIH0KIApAQCAtOTE3LDcgKzEwMDcsNyBAQAogICogQHBpcGU6IHRoZSBlbmRwb2ludCBwaXBlCiAgKiBAdHJhbnNmZXJfYnVmZmVyOiBwb2ludGVyIHRvIHRoZSB0cmFuc2ZlciBidWZmZXIKICAqIEBidWZmZXJfbGVuZ3RoOiBsZW5ndGggb2YgdGhlIHRyYW5zZmVyIGJ1ZmZlcgotICogQGNvbXBsZXRlOiBwb2ludGVyIHRvIHRoZSB1c2JfY29tcGxldGVfdCBmdW5jdGlvbgorICogQGNvbXBsZXRlX2ZuOiBwb2ludGVyIHRvIHRoZSB1c2JfY29tcGxldGVfdCBmdW5jdGlvbgogICogQGNvbnRleHQ6IHdoYXQgdG8gc2V0IHRoZSB1cmIgY29udGV4dCB0by4KICAqCiAgKiBJbml0aWFsaXplcyBhIGJ1bGsgdXJiIHdpdGggdGhlIHByb3BlciBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gc3VibWl0IGl0CkBAIC05MjgsNyArMTAxOCw3IEBACiAJCQkJICAgICAgdW5zaWduZWQgaW50IHBpcGUsCiAJCQkJICAgICAgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLAogCQkJCSAgICAgIGludCBidWZmZXJfbGVuZ3RoLAotCQkJCSAgICAgIHVzYl9jb21wbGV0ZV90IGNvbXBsZXRlLAorCQkJCSAgICAgIHVzYl9jb21wbGV0ZV90IGNvbXBsZXRlX2ZuLAogCQkJCSAgICAgIHZvaWQgKmNvbnRleHQpCiB7CiAJc3Bpbl9sb2NrX2luaXQoJnVyYi0+bG9jayk7CkBAIC05MzYsNyArMTAyNiw3IEBACiAJdXJiLT5waXBlID0gcGlwZTsKIAl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHRyYW5zZmVyX2J1ZmZlcjsKIAl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBidWZmZXJfbGVuZ3RoOwotCXVyYi0+Y29tcGxldGUgPSBjb21wbGV0ZTsKKwl1cmItPmNvbXBsZXRlID0gY29tcGxldGVfZm47CiAJdXJiLT5jb250ZXh0ID0gY29udGV4dDsKIH0KIApAQCAtOTQ3LDcgKzEwMzcsNyBAQAogICogQHBpcGU6IHRoZSBlbmRwb2ludCBwaXBlCiAgKiBAdHJhbnNmZXJfYnVmZmVyOiBwb2ludGVyIHRvIHRoZSB0cmFuc2ZlciBidWZmZXIKICAqIEBidWZmZXJfbGVuZ3RoOiBsZW5ndGggb2YgdGhlIHRyYW5zZmVyIGJ1ZmZlcgotICogQGNvbXBsZXRlOiBwb2ludGVyIHRvIHRoZSB1c2JfY29tcGxldGVfdCBmdW5jdGlvbgorICogQGNvbXBsZXRlX2ZuOiBwb2ludGVyIHRvIHRoZSB1c2JfY29tcGxldGVfdCBmdW5jdGlvbgogICogQGNvbnRleHQ6IHdoYXQgdG8gc2V0IHRoZSB1cmIgY29udGV4dCB0by4KICAqIEBpbnRlcnZhbDogd2hhdCB0byBzZXQgdGhlIHVyYiBpbnRlcnZhbCB0bywgZW5jb2RlZCBsaWtlCiAgKgl0aGUgZW5kcG9pbnQgZGVzY3JpcHRvcidzIGJJbnRlcnZhbCB2YWx1ZS4KQEAgLTk2Myw3ICsxMDUzLDcgQEAKIAkJCQkgICAgIHVuc2lnbmVkIGludCBwaXBlLAogCQkJCSAgICAgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLAogCQkJCSAgICAgaW50IGJ1ZmZlcl9sZW5ndGgsCi0JCQkJICAgICB1c2JfY29tcGxldGVfdCBjb21wbGV0ZSwKKwkJCQkgICAgIHVzYl9jb21wbGV0ZV90IGNvbXBsZXRlX2ZuLAogCQkJCSAgICAgdm9pZCAqY29udGV4dCwKIAkJCQkgICAgIGludCBpbnRlcnZhbCkKIHsKQEAgLTk3Miw3ICsxMDYyLDcgQEAKIAl1cmItPnBpcGUgPSBwaXBlOwogCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdHJhbnNmZXJfYnVmZmVyOwogCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IGJ1ZmZlcl9sZW5ndGg7Ci0JdXJiLT5jb21wbGV0ZSA9IGNvbXBsZXRlOworCXVyYi0+Y29tcGxldGUgPSBjb21wbGV0ZV9mbjsKIAl1cmItPmNvbnRleHQgPSBjb250ZXh0OwogCWlmIChkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQogCQl1cmItPmludGVydmFsID0gMSA8PCAoaW50ZXJ2YWwgLSAxKTsKQEAgLTk5MCw3ICsxMDgwLDYgQEAKIGV4dGVybiBpbnQgdXNiX3VubGlua191cmIoc3RydWN0IHVyYiAqdXJiKTsKIGV4dGVybiB2b2lkIHVzYl9raWxsX3VyYihzdHJ1Y3QgdXJiICp1cmIpOwogCi0jZGVmaW5lIEhBVkVfVVNCX0JVRkZFUlMKIHZvaWQgKnVzYl9idWZmZXJfYWxsb2MgKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAogCWdmcF90IG1lbV9mbGFncywgZG1hX2FkZHJfdCAqZG1hKTsKIHZvaWQgdXNiX2J1ZmZlcl9mcmVlIChzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKQEAgLTEwMDMsMTQgKzEwOTIsMTQgQEAKICNlbmRpZgogCiBzdHJ1Y3Qgc2NhdHRlcmxpc3Q7Ci1pbnQgdXNiX2J1ZmZlcl9tYXBfc2cgKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHBpcGUsCi0JCXN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cyk7CitpbnQgdXNiX2J1ZmZlcl9tYXBfc2coY29uc3Qgc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgcGlwZSwKKwkJICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzKTsKICNpZiAwCi12b2lkIHVzYl9idWZmZXJfZG1hc3luY19zZyAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgcGlwZSwKLQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5faHdfZW50cyk7Cit2b2lkIHVzYl9idWZmZXJfZG1hc3luY19zZyhjb25zdCBzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBwaXBlLAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5faHdfZW50cyk7CiAjZW5kaWYKLXZvaWQgdXNiX2J1ZmZlcl91bm1hcF9zZyAoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgcGlwZSwKLQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5faHdfZW50cyk7Cit2b2lkIHVzYl9idWZmZXJfdW5tYXBfc2coY29uc3Qgc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdW5zaWduZWQgcGlwZSwKKwkJCSBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbl9od19lbnRzKTsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgogICogICAgICAgICAgICAgICAgICAgICAgICAgU1lOQ0hST05PVVMgQ0FMTCBTVVBQT1JUICAgICAgICAgICAgICAgICAgKgpAQCAtMTAzOCw2ICsxMTI3LDkgQEAKIGV4dGVybiBpbnQgdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb24oc3RydWN0IHVzYl9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IHVzYl9zZXRfaW50ZXJmYWNlKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIGludCBpZm51bSwgaW50IGFsdGVybmF0ZSk7CiAKKy8qIHRoaXMgcmVxdWVzdCBpc24ndCByZWFsbHkgc3luY2hyb25vdXMsIGJ1dCBpdCBiZWxvbmdzIHdpdGggdGhlIG90aGVycyAqLworZXh0ZXJuIGludCB1c2JfZHJpdmVyX3NldF9jb25maWd1cmF0aW9uKHN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2LCBpbnQgY29uZmlnKTsKKwogLyoKICAqIHRpbWVvdXRzLCBpbiBtaWxsaXNlY29uZHMsIHVzZWQgZm9yIHNlbmRpbmcvcmVjZWl2aW5nIGNvbnRyb2wgbWVzc2FnZXMKICAqIHRoZXkgdHlwaWNhbGx5IGNvbXBsZXRlIHdpdGhpbiBhIGZldyBmcmFtZXMgKG1zZWMpIGFmdGVyIHRoZXkncmUgaXNzdWVkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9hdWRpby5oIGIvaW5jbHVkZS9saW51eC91c2IvYXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQyMzU5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC91c2IvYXVkaW8uaApAQCAtMCwwICsxLDUzIEBACisvKgorICogPGxpbnV4L3VzYi9hdWRpby5oPiAtLSBVU0IgQXVkaW8gZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRodW10cm9uaWNzIFB0eSBMdGQuCisgKiBEZXZlbG9wZWQgZm9yIFRodW10cm9uaWNzIGJ5IEdyZXkgSW5ub3ZhdGlvbgorICogQmVuIFdpbGxpYW1zb24gPGJlbi53aWxsaWFtc29uQGdyZXlpbm5vdmF0aW9uLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaG9sZHMgVVNCIGNvbnN0YW50cyBhbmQgc3RydWN0dXJlcyBkZWZpbmVkCisgKiBieSB0aGUgVVNCIERldmljZSBDbGFzcyBEZWZpbml0aW9uIGZvciBBdWRpbyBEZXZpY2VzLgorICogQ29tbWVudHMgYmVsb3cgcmVmZXJlbmNlIHJlbGV2YW50IHNlY3Rpb25zIG9mIHRoYXQgZG9jdW1lbnQ6CisgKgorICogaHR0cDovL3d3dy51c2Iub3JnL2RldmVsb3BlcnMvZGV2Y2xhc3NfZG9jcy9hdWRpbzEwLnBkZgorICovCisKKyNpZm5kZWYgX19MSU5VWF9VU0JfQVVESU9fSAorI2RlZmluZSBfX0xJTlVYX1VTQl9BVURJT19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBBLjIgQXVkaW8gSW50ZXJmYWNlIFN1YmNsYXNzIENvZGVzICovCisjZGVmaW5lIFVTQl9TVUJDTEFTU19BVURJT0NPTlRST0wJMHgwMQorI2RlZmluZSBVU0JfU1VCQ0xBU1NfQVVESU9TVFJFQU1JTkcJMHgwMgorI2RlZmluZSBVU0JfU1VCQ0xBU1NfTUlESVNUUkVBTUlORwkweDAzCisKKy8qIDQuMy4yICBDbGFzcy1TcGVjaWZpYyBBQyBJbnRlcmZhY2UgRGVzY3JpcHRvciAqLworc3RydWN0IHVzYl9hY19oZWFkZXJfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsJCQkvLyA4K24KKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkvLyBVU0JfRFRfQ1NfSU5URVJGQUNFCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkvLyBVU0JfTVNfSEVBREVSCisJX19sZTE2IGJjZEFEQzsJCQkvLyAweDAxMDAKKwlfX2xlMTYgd1RvdGFsTGVuZ3RoOwkJLy8gaW5jbHVkZXMgVW5pdCBhbmQgVGVybWluYWwgZGVzYy4KKwlfX3U4ICBiSW5Db2xsZWN0aW9uOwkJLy8gbgorCV9fdTggIGJhSW50ZXJmYWNlTnJbXTsJCS8vIFtuXQorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVVNCX0RUX0FDX0hFQURFUl9TSVpFKG4pCSg4KyhuKSkKKworLyogQXMgYWJvdmUsIGJ1dCBtb3JlIHVzZWZ1bCBmb3IgZGVmaW5pbmcgeW91ciBvd24gZGVzY3JpcHRvcnM6ICovCisjZGVmaW5lIERFQ0xBUkVfVVNCX0FDX0hFQURFUl9ERVNDUklQVE9SKG4pIAkJCVwKK3N0cnVjdCB1c2JfYWNfaGVhZGVyX2Rlc2NyaXB0b3JfIyNuIHsJCQkJXAorCV9fdTggIGJMZW5ndGg7CQkJCQkJXAorCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclN1YnR5cGU7CQkJCVwKKwlfX2xlMTYgYmNkQURDOwkJCQkJCVwKKwlfX2xlMTYgd1RvdGFsTGVuZ3RoOwkJCQkJXAorCV9fdTggIGJJbkNvbGxlY3Rpb247CQkJCQlcCisJX191OCAgYmFJbnRlcmZhY2VOcltuXTsJCQkJCVwKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvbWlkaS5oIGIvaW5jbHVkZS9saW51eC91c2IvbWlkaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYTk3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9taWRpLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiA8bGludXgvdXNiL21pZGkuaD4gLS0gVVNCIE1JREkgZGVmaW5pdGlvbnMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFRodW10cm9uaWNzIFB0eSBMdGQuCisgKiBEZXZlbG9wZWQgZm9yIFRodW10cm9uaWNzIGJ5IEdyZXkgSW5ub3ZhdGlvbgorICogQmVuIFdpbGxpYW1zb24gPGJlbi53aWxsaWFtc29uQGdyZXlpbm5vdmF0aW9uLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgaG9sZHMgVVNCIGNvbnN0YW50cyBhbmQgc3RydWN0dXJlcyBkZWZpbmVkCisgKiBieSB0aGUgVVNCIERldmljZSBDbGFzcyBEZWZpbml0aW9uIGZvciBNSURJIERldmljZXMuCisgKiBDb21tZW50cyBiZWxvdyByZWZlcmVuY2UgcmVsZXZhbnQgc2VjdGlvbnMgb2YgdGhhdCBkb2N1bWVudDoKKyAqCisgKiBodHRwOi8vd3d3LnVzYi5vcmcvZGV2ZWxvcGVycy9kZXZjbGFzc19kb2NzL21pZGkxMC5wZGYKKyAqLworCisjaWZuZGVmIF9fTElOVVhfVVNCX01JRElfSAorI2RlZmluZSBfX0xJTlVYX1VTQl9NSURJX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKy8qIEEuMSAgTVMgQ2xhc3MtU3BlY2lmaWMgSW50ZXJmYWNlIERlc2NyaXB0b3IgU3VidHlwZXMgKi8KKyNkZWZpbmUgVVNCX01TX0hFQURFUgkJMHgwMQorI2RlZmluZSBVU0JfTVNfTUlESV9JTl9KQUNLCTB4MDIKKyNkZWZpbmUgVVNCX01TX01JRElfT1VUX0pBQ0sJMHgwMworI2RlZmluZSBVU0JfTVNfRUxFTUVOVAkJMHgwNAorCisvKiBBLjIgIE1TIENsYXNzLVNwZWNpZmljIEVuZHBvaW50IERlc2NyaXB0b3IgU3VidHlwZXMgKi8KKyNkZWZpbmUgVVNCX01TX0dFTkVSQUwJCTB4MDEKKworLyogQS4zICBNUyBNSURJIElOIGFuZCBPVVQgSmFjayBUeXBlcyAqLworI2RlZmluZSBVU0JfTVNfRU1CRURERUQJCTB4MDEKKyNkZWZpbmUgVVNCX01TX0VYVEVSTkFMCQkweDAyCisKKy8qIDYuMS4yLjEgIENsYXNzLVNwZWNpZmljIE1TIEludGVyZmFjZSBIZWFkZXIgRGVzY3JpcHRvciAqLworc3RydWN0IHVzYl9tc19oZWFkZXJfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOworCV9fbGUxNiBiY2RNU0M7CisJX19sZTE2IHdUb3RhbExlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisjZGVmaW5lIFVTQl9EVF9NU19IRUFERVJfU0laRQk3CisKKy8qIDYuMS4yLjIgIE1JREkgSU4gSmFjayBEZXNjcmlwdG9yICovCitzdHJ1Y3QgdXNiX21pZGlfaW5famFja19kZXNjcmlwdG9yIHsKKwlfX3U4ICBiTGVuZ3RoOworCV9fdTggIGJEZXNjcmlwdG9yVHlwZTsJCS8vIFVTQl9EVF9DU19JTlRFUkZBQ0UKKwlfX3U4ICBiRGVzY3JpcHRvclN1YnR5cGU7CS8vIFVTQl9NU19NSURJX0lOX0pBQ0sKKwlfX3U4ICBiSmFja1R5cGU7CQkvLyBVU0JfTVNfRU1CRURERUQvRVhURVJOQUwKKwlfX3U4ICBiSmFja0lEOworCV9fdTggIGlKYWNrOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVVNCX0RUX01JRElfSU5fU0laRQk2CisKK3N0cnVjdCB1c2JfbWlkaV9zb3VyY2VfcGluIHsKKwlfX3U4ICBiYVNvdXJjZUlEOworCV9fdTggIGJhU291cmNlUGluOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIDYuMS4yLjMgIE1JREkgT1VUIEphY2sgRGVzY3JpcHRvciAqLworc3RydWN0IHVzYl9taWRpX291dF9qYWNrX2Rlc2NyaXB0b3IgeworCV9fdTggIGJMZW5ndGg7CisJX191OCAgYkRlc2NyaXB0b3JUeXBlOwkJLy8gVVNCX0RUX0NTX0lOVEVSRkFDRQorCV9fdTggIGJEZXNjcmlwdG9yU3VidHlwZTsJLy8gVVNCX01TX01JRElfT1VUX0pBQ0sKKwlfX3U4ICBiSmFja1R5cGU7CQkvLyBVU0JfTVNfRU1CRURERUQvRVhURVJOQUwKKwlfX3U4ICBiSmFja0lEOworCV9fdTggIGJOcklucHV0UGluczsJCS8vIHAKKwlzdHJ1Y3QgdXNiX21pZGlfc291cmNlX3BpbiBwaW5zW107IC8vIFtwXQorCS8qX191OCAgaUphY2s7ICAtLSBvbW1pdHRlZCBkdWUgdG8gdmFyaWFibGUtc2l6ZWQgcGluc1tdICovCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBVU0JfRFRfTUlESV9PVVRfU0laRShwKQkoNyArIDIgKiAocCkpCisKKy8qIEFzIGFib3ZlLCBidXQgbW9yZSB1c2VmdWwgZm9yIGRlZmluaW5nIHlvdXIgb3duIGRlc2NyaXB0b3JzOiAqLworI2RlZmluZSBERUNMQVJFX1VTQl9NSURJX09VVF9KQUNLX0RFU0NSSVBUT1IocCkJCQlcCitzdHJ1Y3QgdXNiX21pZGlfb3V0X2phY2tfZGVzY3JpcHRvcl8jI3AgewkJCVwKKwlfX3U4ICBiTGVuZ3RoOwkJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCQlcCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkJCQlcCisJX191OCAgYkphY2tUeXBlOwkJCQkJXAorCV9fdTggIGJKYWNrSUQ7CQkJCQkJXAorCV9fdTggIGJOcklucHV0UGluczsJCQkJCVwKKwlzdHJ1Y3QgdXNiX21pZGlfc291cmNlX3BpbiBwaW5zW3BdOwkJCVwKKwlfX3U4ICBpSmFjazsJCQkJCQlcCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisvKiA2LjIuMiAgQ2xhc3MtU3BlY2lmaWMgTVMgQnVsayBEYXRhIEVuZHBvaW50IERlc2NyaXB0b3IgKi8KK3N0cnVjdCB1c2JfbXNfZW5kcG9pbnRfZGVzY3JpcHRvciB7CisJX191OCAgYkxlbmd0aDsJCQkvLyA0K24KKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkvLyBVU0JfRFRfQ1NfRU5EUE9JTlQKKwlfX3U4ICBiRGVzY3JpcHRvclN1YnR5cGU7CS8vIFVTQl9NU19HRU5FUkFMCisJX191OCAgYk51bUVtYk1JRElKYWNrOwkJLy8gbgorCV9fdTggIGJhQXNzb2NKYWNrSURbXTsJCS8vIFtuXQorfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgVVNCX0RUX01TX0VORFBPSU5UX1NJWkUobikJKDQgKyAobikpCisKKy8qIEFzIGFib3ZlLCBidXQgbW9yZSB1c2VmdWwgZm9yIGRlZmluaW5nIHlvdXIgb3duIGRlc2NyaXB0b3JzOiAqLworI2RlZmluZSBERUNMQVJFX1VTQl9NU19FTkRQT0lOVF9ERVNDUklQVE9SKG4pCQkJXAorc3RydWN0IHVzYl9tc19lbmRwb2ludF9kZXNjcmlwdG9yXyMjbiB7CQkJCVwKKwlfX3U4ICBiTGVuZ3RoOwkJCQkJCVwKKwlfX3U4ICBiRGVzY3JpcHRvclR5cGU7CQkJCQlcCisJX191OCAgYkRlc2NyaXB0b3JTdWJ0eXBlOwkJCQlcCisJX191OCAgYk51bUVtYk1JRElKYWNrOwkJCQkJXAorCV9fdTggIGJhQXNzb2NKYWNrSURbbl07CQkJCQlcCit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiX290Zy5oIGIvaW5jbHVkZS9saW51eC91c2Ivb3RnLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gaW5jbHVkZS9saW51eC91c2Jfb3RnLmgKcmVuYW1lIHRvIGluY2x1ZGUvbGludXgvdXNiL290Zy5oCmluZGV4IGY4MjdmNmUuLjk4OTdmN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiX290Zy5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL290Zy5oCkBAIC0xLDQgKzEsNCBAQAotLy8gaW5jbHVkZS9saW51eC91c2Jfb3RnLmggCisvLyBpbmNsdWRlL2xpbnV4L3VzYi9vdGcuaAogCiAvKgogICogVGhlc2UgQVBJcyBtYXkgYmUgdXNlZCBiZXR3ZWVuIFVTQiBjb250cm9sbGVycy4gIFVTQiBkZXZpY2UgZHJpdmVycwpAQCAtNTIsNyArNTIsNyBAQAogCXUxNgkJCXBvcnRfY2hhbmdlOwogCiAJLyogYmluZC91bmJpbmQgdGhlIGhvc3QgY29udHJvbGxlciAqLwotCWludCAJKCpzZXRfaG9zdCkoc3RydWN0IG90Z190cmFuc2NlaXZlciAqb3RnLAorCWludAkoKnNldF9ob3N0KShzdHJ1Y3Qgb3RnX3RyYW5zY2VpdmVyICpvdGcsCiAJCQkJc3RydWN0IHVzYl9idXMgKmhvc3QpOwogCiAJLyogYmluZC91bmJpbmQgdGhlIHBlcmlwaGVyYWwgY29udHJvbGxlciAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaCBiL2luY2x1ZGUvbGludXgvdXNiX3VzdWFsLmgKaW5kZXggZTdmYzVmZS4uMmFlNzZmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2JfdXN1YWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYl91c3VhbC5oCkBAIC0xMDgsNiArMTA4LDkgQEAKICNpZmRlZiBDT05GSUdfVVNCX1NUT1JBR0VfQUxBVURBCiAjZGVmaW5lIFVTX1BSX0FMQVVEQSAgICAweGY0CQkvKiBBbGF1ZGEgY2hpcHNldHMgKi8KICNlbmRpZgorI2lmZGVmIENPTkZJR19VU0JfU1RPUkFHRV9LQVJNQQorI2RlZmluZSBVU19QUl9LQVJNQSAgICAgMHhmNQkJLyogUmlvIEthcm1hICovCisjZW5kaWYKIAogI2RlZmluZSBVU19QUl9ERVZJQ0UJMHhmZgkJLyogVXNlIGRldmljZSdzIHZhbHVlICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdmVybWFnaWMuaCBiL2luY2x1ZGUvbGludXgvdmVybWFnaWMuaAppbmRleCA0NjkxOWY5Li40ZDA5MDllIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Zlcm1hZ2ljLmgKKysrIGIvaW5jbHVkZS9saW51eC92ZXJtYWdpYy5oCkBAIC0yNCw1ICsyNCw1IEBACiAjZGVmaW5lIFZFUk1BR0lDX1NUUklORyAJCQkJCQlcCiAJVVRTX1JFTEVBU0UgIiAiCQkJCQkJCVwKIAlNT0RVTEVfVkVSTUFHSUNfU01QIE1PRFVMRV9WRVJNQUdJQ19QUkVFTVBUIAkJCVwKLQlNT0RVTEVfVkVSTUFHSUNfTU9EVUxFX1VOTE9BRCBNT0RVTEVfQVJDSF9WRVJNQUdJQyAJCVwKLQkiZ2NjLSIgX19zdHJpbmdpZnkoX19HTlVDX18pICIuIiBfX3N0cmluZ2lmeShfX0dOVUNfTUlOT1JfXykKKwlNT0RVTEVfVkVSTUFHSUNfTU9EVUxFX1VOTE9BRCBNT0RVTEVfQVJDSF9WRVJNQUdJQworCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaCBiL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oCmluZGV4IGRlZTg4YzZiLi5jZTVmMTQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaApAQCAtNjIsNyArNjIsNiBAQAogZXh0ZXJuIHN0cnVjdCB2bV9zdHJ1Y3QgKmdldF92bV9hcmVhX25vZGUodW5zaWduZWQgbG9uZyBzaXplLAogCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgbm9kZSk7CiBleHRlcm4gc3RydWN0IHZtX3N0cnVjdCAqcmVtb3ZlX3ZtX2FyZWEodm9pZCAqYWRkcik7Ci1leHRlcm4gc3RydWN0IHZtX3N0cnVjdCAqX19yZW1vdmVfdm1fYXJlYSh2b2lkICphZGRyKTsKIGV4dGVybiBpbnQgbWFwX3ZtX2FyZWEoc3RydWN0IHZtX3N0cnVjdCAqYXJlYSwgcGdwcm90X3QgcHJvdCwKIAkJCXN0cnVjdCBwYWdlICoqKnBhZ2VzKTsKIGV4dGVybiB2b2lkIHVubWFwX3ZtX2FyZWEoc3RydWN0IHZtX3N0cnVjdCAqYXJlYSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItZGV2LmggYi9pbmNsdWRlL21lZGlhL3Y0bDItZGV2LmgKaW5kZXggODEwNDYyZi4uYmI0OTViNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLWRldi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1kZXYuaApAQCAtMzQxLDcgKzM0MSw3IEBACiBleHRlcm4gc3RydWN0IHZpZGVvX2RldmljZSogdmlkZW9fZGV2ZGF0YShzdHJ1Y3QgZmlsZSopOwogCiAjZGVmaW5lIHRvX3ZpZGVvX2RldmljZShjZCkgY29udGFpbmVyX29mKGNkLCBzdHJ1Y3QgdmlkZW9fZGV2aWNlLCBjbGFzc19kZXYpCi1zdGF0aWMgaW5saW5lIGludAorc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrCiB2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkLAogCQkJIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICphdHRyKQogewpkaWZmIC0tZ2l0IGEvaW5pdC9LY29uZmlnIGIvaW5pdC9LY29uZmlnCmluZGV4IDlhNzY1NmYuLjQzODEwMDYgMTAwNjQ0Ci0tLSBhL2luaXQvS2NvbmZpZworKysgYi9pbml0L0tjb25maWcKQEAgLTI3MywyMSArMjczLDI0IEBACiAJICBUaGlzIGVuYWJsZXMgdGhlIGxlZ2FjeSAxNi1iaXQgVUlEIHN5c2NhbGwgd3JhcHBlcnMuCiAKIGNvbmZpZyBTWVNDVEwKLQlib29sICJTeXNjdGwgc3VwcG9ydCIgaWYgRU1CRURERUQKLQlkZWZhdWx0IHkKLQktLS1oZWxwLS0tCi0JICBUaGUgc3lzY3RsIGludGVyZmFjZSBwcm92aWRlcyBhIG1lYW5zIG9mIGR5bmFtaWNhbGx5IGNoYW5naW5nCi0JICBjZXJ0YWluIGtlcm5lbCBwYXJhbWV0ZXJzIGFuZCB2YXJpYWJsZXMgb24gdGhlIGZseSB3aXRob3V0IHJlcXVpcmluZwotCSAgYSByZWNvbXBpbGUgb2YgdGhlIGtlcm5lbCBvciByZWJvb3Qgb2YgdGhlIHN5c3RlbS4gIFRoZSBwcmltYXJ5Ci0JICBpbnRlcmZhY2UgY29uc2lzdHMgb2YgYSBzeXN0ZW0gY2FsbCwgYnV0IGlmIHlvdSBzYXkgWSB0byAiL3Byb2MKLQkgIGZpbGUgc3lzdGVtIHN1cHBvcnQiLCBhIHRyZWUgb2YgbW9kaWZpYWJsZSBzeXNjdGwgZW50cmllcyB3aWxsIGJlCi0JICBnZW5lcmF0ZWQgYmVuZWF0aCB0aGUgL3Byb2Mvc3lzIGRpcmVjdG9yeS4gVGhleSBhcmUgZXhwbGFpbmVkIGluIHRoZQotCSAgZmlsZXMgaW4gPGZpbGU6RG9jdW1lbnRhdGlvbi9zeXNjdGwvPi4gIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzCi0JICBvcHRpb24gd2lsbCBlbmxhcmdlIHRoZSBrZXJuZWwgYnkgYXQgbGVhc3QgOCBLQi4KKwlib29sCiAKLQkgIEFzIGl0IGlzIGdlbmVyYWxseSBhIGdvb2QgdGhpbmcsIHlvdSBzaG91bGQgc2F5IFkgaGVyZSB1bmxlc3MKLQkgIGJ1aWxkaW5nIGEga2VybmVsIGZvciBpbnN0YWxsL3Jlc2N1ZSBkaXNrcyBvciB5b3VyIHN5c3RlbSBpcyB2ZXJ5Ci0JICBsaW1pdGVkIGluIG1lbW9yeS4KK2NvbmZpZyBTWVNDVExfU1lTQ0FMTAorCWJvb2wgIlN5c2N0bCBzeXNjYWxsIHN1cHBvcnQiCisJZGVmYXVsdCBuCisJc2VsZWN0IFNZU0NUTAorCS0tLWhlbHAtLS0KKwkgIEVuYWJsZSB0aGUgZGVwcmVjYXRlZCBzeXNjdGwgc3lzdGVtIGNhbGwuICBzeXNfc3lzY3RsIHVzZXMKKwkgIGJpbmFyeSBwYXRocyB0aGF0IGhhdmUgYmVlbiBmb3VuZCB0byBiZSBhIG1ham9yIHBhaW4gdG8gbWFpbnRhaW4KKwkgIGFuZCB1c2UuICBUaGUgaW50ZXJmYWNlIGluIC9wcm9jL3N5cyBpcyBub3cgdGhlIHByaW1hcnkgYW5kIHdoYXQKKwkgIGV2ZXJ5b25lIHVzZXMuCisKKwkgIE5vdGhpbmcgaGFzIGJlZW4gdXNpbmcgdGhlIGJpbmFyeSBzeXNjdGwgaW50ZXJmYWNlIGZvciBzb21lIHRpbWUKKwkgIHRpbWUgbm93IHNvIG5vdGhpbmcgc2hvdWxkIGJyZWFrIGlmIHlvdSBkaXNhYmxlIHN5c2N0bCBzeXNjYWxsCisJICBzdXBwb3J0LCBhbmQgeW91IGtlcm5lbCB3aWxsIGdldCBtYXJnaW5hbGx5IHNtYWxsZXIuCisKKwkgIFVubGVzcyB5b3UgaGF2ZSBhbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhlIHN5c19zeXNjYWxsIGludGVyZmFjZQorIAkgIHlvdSBzaG91bGQgcHJvYmFibHkgc2F5IE4gaGVyZS4KIAogY29uZmlnIEtBTExTWU1TCiAJIGJvb2wgIkxvYWQgYWxsIHN5bWJvbHMgZm9yIGRlYnVnZ2luZy9ra3N5bW9vcHMiIGlmIEVNQkVEREVECmRpZmYgLS1naXQgYS9pbml0L2RvX21vdW50cy5jIGIvaW5pdC9kb19tb3VudHMuYwppbmRleCA5NGFlZWM3Li5iMjkwYWFkIDEwMDY0NAotLS0gYS9pbml0L2RvX21vdW50cy5jCisrKyBiL2luaXQvZG9fbW91bnRzLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfZnNfc2IuaD4KQEAgLTQwMyw2ICs0MDQsMTAgQEAKIAkJc3NsZWVwKHJvb3RfZGVsYXkpOwogCX0KIAorCS8qIHdhaXQgZm9yIHRoZSBrbm93biBkZXZpY2VzIHRvIGNvbXBsZXRlIHRoZWlyIHByb2JpbmcgKi8KKwl3aGlsZSAoZHJpdmVyX3Byb2JlX2RvbmUoKSAhPSAwKQorCQltc2xlZXAoMTAwKTsKKwogCW1kX3J1bl9zZXR1cCgpOwogCiAJaWYgKHNhdmVkX3Jvb3RfbmFtZVswXSkgewpkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYwppbmRleCA4NjUxYTcyLi4wNzY2ZTY5IDEwMDY0NAotLS0gYS9pbml0L21haW4uYworKysgYi9pbml0L21haW4uYwpAQCAtMTI4LDYgKzEyOCwxOCBAQAogc3RhdGljIHVuc2lnbmVkIGludCBtYXhfY3B1cyA9IE5SX0NQVVM7CiAKIC8qCisgKiBJZiBzZXQsIHRoaXMgaXMgYW4gaW5kaWNhdGlvbiB0byB0aGUgZHJpdmVycyB0aGF0IHJlc2V0IHRoZSB1bmRlcmx5aW5nCisgKiBkZXZpY2UgYmVmb3JlIGdvaW5nIGFoZWFkIHdpdGggdGhlIGluaXRpYWxpemF0aW9uIG90aGVyd2lzZSBkcml2ZXIgbWlnaHQKKyAqIHJlbHkgb24gdGhlIEJJT1MgYW5kIHNraXAgdGhlIHJlc2V0IG9wZXJhdGlvbi4KKyAqCisgKiBUaGlzIGlzIHVzZWZ1bCBpZiBrZXJuZWwgaXMgYm9vdGluZyBpbiBhbiB1bnJlbGlhYmxlIGVudmlyb25tZW50LgorICogRm9yIGV4LiBrZHVtcCBzaXR1YWl0b24gd2hlcmUgcHJldmlvdXMga2VybmVsIGhhcyBjcmFzaGVkLCBCSU9TIGhhcyBiZWVuCisgKiBza2lwcGVkIGFuZCBkZXZpY2VzIHdpbGwgYmUgaW4gdW5rbm93biBzdGF0ZS4KKyAqLwordW5zaWduZWQgaW50IHJlc2V0X2RldmljZXM7CitFWFBPUlRfU1lNQk9MKHJlc2V0X2RldmljZXMpOworCisvKgogICogU2V0dXAgcm91dGluZSBmb3IgY29udHJvbGxpbmcgU01QIGFjdGl2YXRpb24KICAqCiAgKiBDb21tYW5kLWxpbmUgb3B0aW9uIG9mICJub3NtcCIgb3IgIm1heGNwdXM9MCIgd2lsbCBkaXNhYmxlIFNNUApAQCAtMTUzLDYgKzE2NSwxNCBAQAogCiBfX3NldHVwKCJtYXhjcHVzPSIsIG1heGNwdXMpOwogCitzdGF0aWMgaW50IF9faW5pdCBzZXRfcmVzZXRfZGV2aWNlcyhjaGFyICpzdHIpCit7CisJcmVzZXRfZGV2aWNlcyA9IDE7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInJlc2V0X2RldmljZXMiLCBzZXRfcmVzZXRfZGV2aWNlcyk7CisKIHN0YXRpYyBjaGFyICogYXJndl9pbml0W01BWF9JTklUX0FSR1MrMl0gPSB7ICJpbml0IiwgTlVMTCwgfTsKIGNoYXIgKiBlbnZwX2luaXRbTUFYX0lOSVRfRU5WUysyXSA9IHsgIkhPTUU9LyIsICJURVJNPWxpbnV4IiwgTlVMTCwgfTsKIHN0YXRpYyBjb25zdCBjaGFyICpwYW5pY19sYXRlciwgKnBhbmljX3BhcmFtOwpAQCAtMTYyLDE2ICsxODIsMTkgQEAKIHN0YXRpYyBpbnQgX19pbml0IG9ic29sZXRlX2NoZWNrc2V0dXAoY2hhciAqbGluZSkKIHsKIAlzdHJ1Y3Qgb2JzX2tlcm5lbF9wYXJhbSAqcDsKKwlpbnQgaGFkX2Vhcmx5X3BhcmFtID0gMDsKIAogCXAgPSBfX3NldHVwX3N0YXJ0OwogCWRvIHsKIAkJaW50IG4gPSBzdHJsZW4ocC0+c3RyKTsKIAkJaWYgKCFzdHJuY21wKGxpbmUsIHAtPnN0ciwgbikpIHsKIAkJCWlmIChwLT5lYXJseSkgewotCQkJCS8qIEFscmVhZHkgZG9uZSBpbiBwYXJzZV9lYXJseV9wYXJhbT8gIChOZWVkcwotCQkJCSAqIGV4YWN0IG1hdGNoIG9uIHBhcmFtIHBhcnQpICovCisJCQkJLyogQWxyZWFkeSBkb25lIGluIHBhcnNlX2Vhcmx5X3BhcmFtPworCQkJCSAqIChOZWVkcyBleGFjdCBtYXRjaCBvbiBwYXJhbSBwYXJ0KS4KKwkJCQkgKiBLZWVwIGl0ZXJhdGluZywgYXMgd2UgY2FuIGhhdmUgZWFybHkKKwkJCQkgKiBwYXJhbXMgYW5kIF9fc2V0dXBzIG9mIHNhbWUgbmFtZXMgOCggKi8KIAkJCQlpZiAobGluZVtuXSA9PSAnXDAnIHx8IGxpbmVbbl0gPT0gJz0nKQotCQkJCQlyZXR1cm4gMTsKKwkJCQkJaGFkX2Vhcmx5X3BhcmFtID0gMTsKIAkJCX0gZWxzZSBpZiAoIXAtPnNldHVwX2Z1bmMpIHsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQYXJhbWV0ZXIgJXMgaXMgb2Jzb2xldGUsIgogCQkJCSAgICAgICAiIGlnbm9yZWRcbiIsIHAtPnN0cik7CkBAIC0xODEsNyArMjA0LDggQEAKIAkJfQogCQlwKys7CiAJfSB3aGlsZSAocCA8IF9fc2V0dXBfZW5kKTsKLQlyZXR1cm4gMDsKKworCXJldHVybiBoYWRfZWFybHlfcGFyYW07CiB9CiAKIC8qCkBAIC00NjQsNiArNDg4LDcgQEAKIAkgKiBOZWVkIHRvIHJ1biBhcyBlYXJseSBhcyBwb3NzaWJsZSwgdG8gaW5pdGlhbGl6ZSB0aGUKIAkgKiBsb2NrZGVwIGhhc2g6CiAJICovCisJdW53aW5kX2luaXQoKTsKIAlsb2NrZGVwX2luaXQoKTsKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CkBAIC01MDIsNyArNTI3LDYgQEAKIAkJICAgX19zdG9wX19fcGFyYW0gLSBfX3N0YXJ0X19fcGFyYW0sCiAJCSAgICZ1bmtub3duX2Jvb3RvcHRpb24pOwogCXNvcnRfbWFpbl9leHRhYmxlKCk7Ci0JdW53aW5kX2luaXQoKTsKIAl0cmFwX2luaXQoKTsKIAlyY3VfaW5pdCgpOwogCWluaXRfSVJRKCk7CmRpZmYgLS1naXQgYS9pcGMvbXF1ZXVlLmMgYi9pcGMvbXF1ZXVlLmMKaW5kZXggMDJlNmY2Ny4uODQwZjhhNiAxMDA2NDQKLS0tIGEvaXBjL21xdWV1ZS5jCisrKyBiL2lwYy9tcXVldWUuYwpAQCAtMTE1LDcgKzExNSw2IEBACiAJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKIAkJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7Ci0JCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CiAJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9hdGltZSA9CiAJCQkJQ1VSUkVOVF9USU1FOwpAQCAtMTI3NSwxMCArMTI3NCw3IEBACiBvdXRfc3lzY3RsOgogCWlmIChtcV9zeXNjdGxfdGFibGUpCiAJCXVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKG1xX3N5c2N0bF90YWJsZSk7Ci0JaWYgKGttZW1fY2FjaGVfZGVzdHJveShtcXVldWVfaW5vZGVfY2FjaGVwKSkgewotCQlwcmludGsoS0VSTl9JTkZPCi0JCQkibXF1ZXVlX2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7Ci0JfQorCWttZW1fY2FjaGVfZGVzdHJveShtcXVldWVfaW5vZGVfY2FjaGVwKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHVzZXQuYyBiL2tlcm5lbC9jcHVzZXQuYwppbmRleCBjZmY0MTUxLi4xYjMyYzJjIDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1c2V0LmMKKysrIGIva2VybmVsL2NwdXNldC5jCkBAIC0yODksNyArMjg5LDYgQEAKIAkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOwogCQlpbm9kZS0+aV9naWQgPSBjdXJyZW50LT5mc2dpZDsKLQkJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJmNwdXNldF9iYWNraW5nX2Rldl9pbmZvOwpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggZjliMDE0ZS4uYTBkYWQ4NCAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC00NSw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvY25fcHJvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5YWNjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3Rhc2tzdGF0c19rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CkBAIC0xNzUsNiArMTc2LDEwIEBACiAJdHNrLT50aHJlYWRfaW5mbyA9IHRpOwogCXNldHVwX3RocmVhZF9zdGFjayh0c2ssIG9yaWcpOwogCisjaWZkZWYgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SCisJdHNrLT5zdGFja19jYW5hcnkgPSBnZXRfcmFuZG9tX2ludCgpOworI2VuZGlmCisKIAkvKiBPbmUgZm9yIHVzLCBvbmUgZm9yIHdob2V2ZXIgZG9lcyB0aGUgInJlbGVhc2VfdGFzaygpIiAodXN1YWxseSBwYXJlbnQpICovCiAJYXRvbWljX3NldCgmdHNrLT51c2FnZSwyKTsKIAlhdG9taWNfc2V0KCZ0c2stPmZzX2V4Y2wsIDApOwpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tkZXAuYyBiL2tlcm5lbC9sb2NrZGVwLmMKaW5kZXggOWJhZDE3OC4uYzA4OGU1NSAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tkZXAuYworKysgYi9rZXJuZWwvbG9ja2RlcC5jCkBAIC0yMjQsNyArMjI0LDE0IEBACiAJdHJhY2UtPm1heF9lbnRyaWVzID0gTUFYX1NUQUNLX1RSQUNFX0VOVFJJRVMgLSBucl9zdGFja190cmFjZV9lbnRyaWVzOwogCXRyYWNlLT5lbnRyaWVzID0gc3RhY2tfdHJhY2UgKyBucl9zdGFja190cmFjZV9lbnRyaWVzOwogCi0Jc2F2ZV9zdGFja190cmFjZSh0cmFjZSwgTlVMTCwgMCwgMyk7CisJdHJhY2UtPnNraXAgPSAzOworCXRyYWNlLT5hbGxfY29udGV4dHMgPSAwOworCisJLyogTWFrZSBzdXJlIHRvIG5vdCByZWN1cnNlIGluIGNhc2UgdGhlIHRoZSB1bndpbmRlciBuZWVkcyB0byB0YWsKK2UJICAgbG9ja3MuICovCisJbG9ja2RlcF9vZmYoKTsKKwlzYXZlX3N0YWNrX3RyYWNlKHRyYWNlLCBOVUxMKTsKKwlsb2NrZGVwX29uKCk7CiAKIAl0cmFjZS0+bWF4X2VudHJpZXMgPSB0cmFjZS0+bnJfZW50cmllczsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3BhbmljLmMgYi9rZXJuZWwvcGFuaWMuYwppbmRleCA4MDEwYjliLi42Y2ViNjY0IDEwMDY0NAotLS0gYS9rZXJuZWwvcGFuaWMuYworKysgYi9rZXJuZWwvcGFuaWMuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnX2xvY2tzLmg+CiAKIGludCBwYW5pY19vbl9vb3BzOworaW50IHBhbmljX29uX3VucmVjb3ZlcmVkX25taTsKIGludCB0YWludGVkOwogc3RhdGljIGludCBwYXVzZV9vbl9vb3BzOwogc3RhdGljIGludCBwYXVzZV9vbl9vb3BzX2ZsYWc7CkBAIC0yNzAsMyArMjcxLDE1IEBACiB7CiAJZG9fb29wc19lbnRlcl9leGl0KCk7CiB9CisKKyNpZmRlZiBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IKKy8qCisgKiBDYWxsZWQgd2hlbiBnY2MncyAtZnN0YWNrLXByb3RlY3RvciBmZWF0dXJlIGlzIHVzZWQsIGFuZAorICogZ2NjIGRldGVjdHMgY29ycnVwdGlvbiBvZiB0aGUgb24tc3RhY2sgY2FuYXJ5IHZhbHVlCisgKi8KK3ZvaWQgX19zdGFja19jaGtfZmFpbCh2b2lkKQoreworCXBhbmljKCJzdGFjay1wcm90ZWN0b3I6IEtlcm5lbCBzdGFjayBpcyBjb3JydXB0ZWQiKTsKK30KK0VYUE9SVF9TWU1CT0woX19zdGFja19jaGtfZmFpbCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9waWQuYyBiL2tlcm5lbC9waWQuYwppbmRleCA5M2UyMTJmLi44Mzg3ZThjIDEwMDY0NAotLS0gYS9rZXJuZWwvcGlkLmMKKysrIGIva2VybmVsL3BpZC5jCkBAIC0yMjMsOSArMjIzLDYgQEAKIAlzdHJ1Y3QgcGlkX2xpbmsgKmxpbms7CiAJc3RydWN0IHBpZCAqcGlkOwogCi0JV0FSTl9PTighdGFzay0+cGlkKTsgLyogdG8gYmUgcmVtb3ZlZCBzb29uICovCi0JV0FSTl9PTighbnIpOyAvKiB0byBiZSByZW1vdmVkIHNvb24gKi8KLQogCWxpbmsgPSAmdGFzay0+cGlkc1t0eXBlXTsKIAlsaW5rLT5waWQgPSBwaWQgPSBmaW5kX3BpZChucik7CiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZsaW5rLT5ub2RlLCAmcGlkLT50YXNrc1t0eXBlXSk7CkBAIC0yNTIsNiArMjQ5LDE1IEBACiAJZnJlZV9waWQocGlkKTsKIH0KIAorLyogdHJhbnNmZXJfcGlkIGlzIGFuIG9wdGltaXphdGlvbiBvZiBhdHRhY2hfcGlkKG5ldyksIGRldGFjaF9waWQob2xkKSAqLwordm9pZCBmYXN0Y2FsbCB0cmFuc2Zlcl9waWQoc3RydWN0IHRhc2tfc3RydWN0ICpvbGQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3LAorCQkJICAgZW51bSBwaWRfdHlwZSB0eXBlKQoreworCW5ldy0+cGlkc1t0eXBlXS5waWQgPSBvbGQtPnBpZHNbdHlwZV0ucGlkOworCWhsaXN0X3JlcGxhY2VfcmN1KCZvbGQtPnBpZHNbdHlwZV0ubm9kZSwgJm5ldy0+cGlkc1t0eXBlXS5ub2RlKTsKKwlvbGQtPnBpZHNbdHlwZV0ucGlkID0gTlVMTDsKK30KKwogc3RydWN0IHRhc2tfc3RydWN0ICogZmFzdGNhbGwgcGlkX3Rhc2soc3RydWN0IHBpZCAqcGlkLCBlbnVtIHBpZF90eXBlIHR5cGUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpyZXN1bHQgPSBOVUxMOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL0tjb25maWcgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZwppbmRleCA0YjZlMmYxLi44MjUwNjhjIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvS2NvbmZpZworKysgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZwpAQCAtNjQsNiArNjQsMTcgQEAKIAlDQVVUSU9OOiB0aGlzIG9wdGlvbiB3aWxsIGNhdXNlIHlvdXIgbWFjaGluZSdzIHJlYWwtdGltZSBjbG9jayB0byBiZQogCXNldCB0byBhbiBpbnZhbGlkIHRpbWUgYWZ0ZXIgYSByZXN1bWUuCiAKK2NvbmZpZyBQTV9TWVNGU19ERVBSRUNBVEVECisJYm9vbCAiRHJpdmVyIG1vZGVsIC9zeXMvZGV2aWNlcy8uLi4vcG93ZXIvc3RhdGUgZmlsZXMgKERFUFJFQ0FURUQpIgorCWRlcGVuZHMgb24gUE0gJiYgU1lTRlMKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGUgZHJpdmVyIG1vZGVsIHN0YXJ0ZWQgb3V0IHdpdGggYSBzeXNmcyBmaWxlIGludGVuZGVkIHRvIHByb3ZpZGUKKwkgIGEgdXNlcnNwYWNlIGhvb2sgZm9yIGRldmljZSBwb3dlciBtYW5hZ2VtZW50LiAgVGhpcyBmZWF0dXJlIGhhcyBuZXZlcgorCSAgd29ya2VkIHZlcnkgd2VsbCwgZXhjZXB0IGZvciBsaW1pdGVkIHRlc3RpbmcgcHVycG9zZXMsIGFuZCBzbyBpdCB3aWxsCisJICBiZSByZW1vdmVkLiAgIEl0J3Mgbm90IGNsZWFyIHRoYXQgYSBnZW5lcmljIG1lY2hhbmlzbSBjb3VsZCByZWFsbHkKKwkgIGhhbmRsZSB0aGUgd2lkZSB2YXJpYWJpbGl0eSBvZiBkZXZpY2UgcG93ZXIgc3RhdGVzOyBhbnkgcmVwbGFjZW1lbnRzCisJICBhcmUgbGlrZWx5IHRvIGJlIGJ1cyBvciBkcml2ZXIgc3BlY2lmaWMuCiAKIGNvbmZpZyBTT0ZUV0FSRV9TVVNQRU5ECiAJYm9vbCAiU29mdHdhcmUgU3VzcGVuZCIKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9kaXNrLmMgYi9rZXJuZWwvcG93ZXIvZGlzay5jCmluZGV4IDdjN2I5YjYuLmQ3MjIzNDkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9kaXNrLmMKKysrIGIva2VybmVsL3Bvd2VyL2Rpc2suYwpAQCAtMTAzLDcgKzEwMyw3IEBACiB9CiAKIC8qKgotICoJcG1fc3VzcGVuZF9kaXNrIC0gVGhlIGdyYW5wYXBweSBvZiBwb3dlciBtYW5hZ2VtZW50LgorICoJcG1fc3VzcGVuZF9kaXNrIC0gVGhlIGdyYW5wYXBweSBvZiBoaWJlcm5hdGlvbiBwb3dlciBtYW5hZ2VtZW50LgogICoKICAqCUlmIHdlJ3JlIGdvaW5nIHRocm91Z2ggdGhlIGZpcm13YXJlLCB0aGVuIGdldCBpdCBvdmVyIHdpdGggcXVpY2tseS4KICAqCkBAIC0yMTIsNyArMjEyLDcgQEAKIAogCXByX2RlYnVnKCJQTTogUHJlcGFyaW5nIGRldmljZXMgZm9yIHJlc3RvcmUuXG4iKTsKIAotCWlmICgoZXJyb3IgPSBkZXZpY2Vfc3VzcGVuZChQTVNHX0ZSRUVaRSkpKSB7CisJaWYgKChlcnJvciA9IGRldmljZV9zdXNwZW5kKFBNU0dfUFJFVEhBVykpKSB7CiAJCXByaW50aygiU29tZSBkZXZpY2VzIGZhaWxlZCB0byBzdXNwZW5kXG4iKTsKIAkJc3dzdXNwX2ZyZWUoKTsKIAkJZ290byBUaGF3OwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3N3c3VzcC5jIGIva2VybmVsL3Bvd2VyL3N3c3VzcC5jCmluZGV4IDhlZjY3N2UuLjBiNjY2NTkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zd3N1c3AuYworKysgYi9rZXJuZWwvcG93ZXIvc3dzdXNwLmMKQEAgLTI0Nyw2ICsyNDcsOSBAQAogCXJlc3RvcmVfcHJvY2Vzc29yX3N0YXRlKCk7CiBSZXN0b3JlX2hpZ2htZW06CiAJcmVzdG9yZV9oaWdobWVtKCk7CisJLyogTk9URTogIGRldmljZV9wb3dlcl91cCgpIGlzIGp1c3QgYSByZXN1bWUoKSBmb3IgZGV2aWNlcworCSAqIHRoYXQgc3VzcGVuZGVkIHdpdGggaXJxcyBvZmYgLi4uIG5vIG92ZXJhbGwgcG93ZXJ1cC4KKwkgKi8KIAlkZXZpY2VfcG93ZXJfdXAoKTsKIEVuYWJsZV9pcnFzOgogCWxvY2FsX2lycV9lbmFibGUoKTsKQEAgLTI1Niw4ICsyNTksMTIgQEAKIGludCBzd3N1c3BfcmVzdW1lKHZvaWQpCiB7CiAJaW50IGVycm9yOworCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlpZiAoZGV2aWNlX3Bvd2VyX2Rvd24oUE1TR19GUkVFWkUpKQorCS8qIE5PVEU6ICBkZXZpY2VfcG93ZXJfZG93bigpIGlzIGp1c3QgYSBzdXNwZW5kKCkgd2l0aCBpcnFzIG9mZjsKKwkgKiBpdCBoYXMgbm8gc3BlY2lhbCAicG93ZXIgdGhpbmdzIGRvd24iIHNlbWFudGljcworCSAqLworCWlmIChkZXZpY2VfcG93ZXJfZG93bihQTVNHX1BSRVRIQVcpKQogCQlwcmludGsoS0VSTl9FUlIgIlNvbWUgZGV2aWNlcyBmYWlsZWQgdG8gcG93ZXIgZG93biwgdmVyeSBiYWRcbiIpOwogCS8qIFdlJ2xsIGlnbm9yZSBzYXZlZCBzdGF0ZSwgYnV0IHRoaXMgZ2V0cyBwcmVlbXB0IGNvdW50IChldGMpIHJpZ2h0ICovCiAJc2F2ZV9wcm9jZXNzb3Jfc3RhdGUoKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci91c2VyLmMgYi9rZXJuZWwvcG93ZXIvdXNlci5jCmluZGV4IDJlNDQ5OWYuLjcyODI1YzggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci91c2VyLmMKKysrIGIva2VybmVsL3Bvd2VyL3VzZXIuYwpAQCAtMTk2LDcgKzE5Niw3IEBACiAJCXNuYXBzaG90X2ZyZWVfdW51c2VkX21lbW9yeSgmZGF0YS0+aGFuZGxlKTsKIAkJZG93bigmcG1fc2VtKTsKIAkJcG1fcHJlcGFyZV9jb25zb2xlKCk7Ci0JCWVycm9yID0gZGV2aWNlX3N1c3BlbmQoUE1TR19GUkVFWkUpOworCQllcnJvciA9IGRldmljZV9zdXNwZW5kKFBNU0dfUFJFVEhBVyk7CiAJCWlmICghZXJyb3IpIHsKIAkJCWVycm9yID0gc3dzdXNwX3Jlc3VtZSgpOwogCQkJZGV2aWNlX3Jlc3VtZSgpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3B0cmFjZS5jIGIva2VybmVsL3B0cmFjZS5jCmluZGV4IDlhMTExZjcuLjhhYWQwMzMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wdHJhY2UuYworKysgYi9rZXJuZWwvcHRyYWNlLmMKQEAgLTI0MSw2MCArMjQxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIEFjY2VzcyBhbm90aGVyIHByb2Nlc3MnIGFkZHJlc3Mgc3BhY2UuCi0gKiBTb3VyY2UvdGFyZ2V0IGJ1ZmZlciBtdXN0IGJlIGtlcm5lbCBzcGFjZSwgCi0gKiBEbyBub3Qgd2FsayB0aGUgcGFnZSB0YWJsZSBkaXJlY3RseSwgdXNlIGdldF91c2VyX3BhZ2VzCi0gKi8KLQotaW50IGFjY2Vzc19wcm9jZXNzX3ZtKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nIGFkZHIsIHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IHdyaXRlKQotewotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwotCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXZvaWQgKm9sZF9idWYgPSBidWY7Ci0KLQltbSA9IGdldF90YXNrX21tKHRzayk7Ci0JaWYgKCFtbSkKLQkJcmV0dXJuIDA7Ci0KLQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JLyogaWdub3JlIGVycm9ycywganVzdCBjaGVjayBob3cgbXVjaCB3YXMgc3VjZXNzZnVsbHkgdHJhbnNmZXJlZCAqLwotCXdoaWxlIChsZW4pIHsKLQkJaW50IGJ5dGVzLCByZXQsIG9mZnNldDsKLQkJdm9pZCAqbWFkZHI7Ci0KLQkJcmV0ID0gZ2V0X3VzZXJfcGFnZXModHNrLCBtbSwgYWRkciwgMSwKLQkJCQl3cml0ZSwgMSwgJnBhZ2UsICZ2bWEpOwotCQlpZiAocmV0IDw9IDApCi0JCQlicmVhazsKLQotCQlieXRlcyA9IGxlbjsKLQkJb2Zmc2V0ID0gYWRkciAmIChQQUdFX1NJWkUtMSk7Ci0JCWlmIChieXRlcyA+IFBBR0VfU0laRS1vZmZzZXQpCi0JCQlieXRlcyA9IFBBR0VfU0laRS1vZmZzZXQ7Ci0KLQkJbWFkZHIgPSBrbWFwKHBhZ2UpOwotCQlpZiAod3JpdGUpIHsKLQkJCWNvcHlfdG9fdXNlcl9wYWdlKHZtYSwgcGFnZSwgYWRkciwKLQkJCQkJICBtYWRkciArIG9mZnNldCwgYnVmLCBieXRlcyk7Ci0JCQlzZXRfcGFnZV9kaXJ0eV9sb2NrKHBhZ2UpOwotCQl9IGVsc2UgewotCQkJY29weV9mcm9tX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsCi0JCQkJCSAgICBidWYsIG1hZGRyICsgb2Zmc2V0LCBieXRlcyk7Ci0JCX0KLQkJa3VubWFwKHBhZ2UpOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCWxlbiAtPSBieXRlczsKLQkJYnVmICs9IGJ5dGVzOwotCQlhZGRyICs9IGJ5dGVzOwotCX0KLQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCW1tcHV0KG1tKTsKLQkKLQlyZXR1cm4gYnVmIC0gb2xkX2J1ZjsKLX0KLQogaW50IHB0cmFjZV9yZWFkZGF0YShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBzcmMsIGNoYXIgX191c2VyICpkc3QsIGludCBsZW4pCiB7CiAJaW50IGNvcGllZCA9IDA7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmVsYXkuYyBiL2tlcm5lbC9yZWxheS5jCmluZGV4IDMzMzQ1ZTcuLjg1Nzg2ZmYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yZWxheS5jCisrKyBiL2tlcm5lbC9yZWxheS5jCkBAIC02NjksNyArNjY5LDcgQEAKICAqLwogc3RhdGljIGludCByZWxheV9maWxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0Jc3RydWN0IHJjaGFuX2J1ZiAqYnVmID0gaW5vZGUtPnUuZ2VuZXJpY19pcDsKKwlzdHJ1Y3QgcmNoYW5fYnVmICpidWYgPSBpbm9kZS0+aV9wcml2YXRlOwogCWtyZWZfZ2V0KCZidWYtPmtyZWYpOwogCWZpbHAtPnByaXZhdGVfZGF0YSA9IGJ1ZjsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc291cmNlLmMgYi9rZXJuZWwvcmVzb3VyY2UuYwppbmRleCA0NjI4NjQzLi45ZGIzOGExIDEwMDY0NAotLS0gYS9rZXJuZWwvcmVzb3VyY2UuYworKysgYi9rZXJuZWwvcmVzb3VyY2UuYwpAQCAtMzQ0LDEyICszNDQsMTEgQEAKICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVCVVNZIGlmIHRoZSByZXNvdXJjZSBjYW4ndCBiZSBpbnNlcnRlZC4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgb2YgcmVxdWVzdF9yZXNvdXJjZSB3aGVuIG5vIGNvbmZsaWN0CisgKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gcmVxdWVzdF9yZXNvdXJjZSB3aGVuIG5vIGNvbmZsaWN0CiAgKiBoYXBwZW5zLiBJZiBhIGNvbmZsaWN0IGhhcHBlbnMsIGFuZCB0aGUgY29uZmxpY3RpbmcgcmVzb3VyY2VzCiAgKiBlbnRpcmVseSBmaXQgd2l0aGluIHRoZSByYW5nZSBvZiB0aGUgbmV3IHJlc291cmNlLCB0aGVuIHRoZSBuZXcKLSAqIHJlc291cmNlIGlzIGluc2VydGVkIGFuZCB0aGUgY29uZmxpY3RpbmcgcmVzb3VyY2VzIGJlY29tZSBjaGlsZHMgb2YKLSAqIHRoZSBuZXcgcmVzb3VyY2UuICBPdGhlcndpc2UgdGhlIG5ldyByZXNvdXJjZSBiZWNvbWVzIHRoZSBjaGlsZCBvZgotICogdGhlIGNvbmZsaWN0aW5nIHJlc291cmNlCisgKiByZXNvdXJjZSBpcyBpbnNlcnRlZCBhbmQgdGhlIGNvbmZsaWN0aW5nIHJlc291cmNlcyBiZWNvbWUgY2hpbGRyZW4gb2YKKyAqIHRoZSBuZXcgcmVzb3VyY2UuCiAgKi8KIGludCBpbnNlcnRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpwYXJlbnQsIHN0cnVjdCByZXNvdXJjZSAqbmV3KQogewpAQCAtMzU3LDIwICszNTYsMjEgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKmZpcnN0LCAqbmV4dDsKIAogCXdyaXRlX2xvY2soJnJlc291cmNlX2xvY2spOwotIGJlZ2luOgotIAlyZXN1bHQgPSAwOwotCWZpcnN0ID0gX19yZXF1ZXN0X3Jlc291cmNlKHBhcmVudCwgbmV3KTsKLQlpZiAoIWZpcnN0KQotCQlnb3RvIG91dDsKIAotCXJlc3VsdCA9IC1FQlVTWTsKLQlpZiAoZmlyc3QgPT0gcGFyZW50KQotCQlnb3RvIG91dDsKKwlmb3IgKDs7IHBhcmVudCA9IGZpcnN0KSB7CisJIAlyZXN1bHQgPSAwOworCQlmaXJzdCA9IF9fcmVxdWVzdF9yZXNvdXJjZShwYXJlbnQsIG5ldyk7CisJCWlmICghZmlyc3QpCisJCQlnb3RvIG91dDsKIAotCS8qIFJlc291cmNlIGZ1bGx5IGNvbnRhaW5lZCBieSB0aGUgY2xhc2hpbmcgcmVzb3VyY2U/IFJlY3Vyc2UgaW50byBpdCAqLwotCWlmIChmaXJzdC0+c3RhcnQgPD0gbmV3LT5zdGFydCAmJiBmaXJzdC0+ZW5kID49IG5ldy0+ZW5kKSB7Ci0JCXBhcmVudCA9IGZpcnN0OwotCQlnb3RvIGJlZ2luOworCQlyZXN1bHQgPSAtRUJVU1k7CisJCWlmIChmaXJzdCA9PSBwYXJlbnQpCisJCQlnb3RvIG91dDsKKworCQlpZiAoKGZpcnN0LT5zdGFydCA+IG5ldy0+c3RhcnQpIHx8IChmaXJzdC0+ZW5kIDwgbmV3LT5lbmQpKQorCQkJYnJlYWs7CisJCWlmICgoZmlyc3QtPnN0YXJ0ID09IG5ldy0+c3RhcnQpICYmIChmaXJzdC0+ZW5kID09IG5ldy0+ZW5kKSkKKwkJCWJyZWFrOwogCX0KIAogCWZvciAobmV4dCA9IGZpcnN0OyA7IG5leHQgPSBuZXh0LT5zaWJsaW5nKSB7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2lnbmFsLmMgYi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYmZkYjU2ODYuLjA1ODUzYTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zaWduYWwuYworKysgYi9rZXJuZWwvc2lnbmFsLmMKQEAgLTI1NzcsNiArMjU3NywxMSBAQAogfQogI2VuZGlmIC8qIF9fQVJDSF9XQU5UX1NZU19SVF9TSUdTVVNQRU5EICovCiAKK19fYXR0cmlidXRlX18oKHdlYWspKSBjb25zdCBjaGFyICphcmNoX3ZtYV9uYW1lKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXJldHVybiBOVUxMOworfQorCiB2b2lkIF9faW5pdCBzaWduYWxzX2luaXQodm9pZCkKIHsKIAlzaWdxdWV1ZV9jYWNoZXAgPQpkaWZmIC0tZ2l0IGEva2VybmVsL3NwaW5sb2NrLmMgYi9rZXJuZWwvc3BpbmxvY2suYwppbmRleCBmYjUyNGIwLi45NjQ0YTQxIDEwMDY0NAotLS0gYS9rZXJuZWwvc3BpbmxvY2suYworKysgYi9rZXJuZWwvc3BpbmxvY2suYwpAQCAtNyw2ICs3LDExIEBACiAgKgogICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzcGlubG9jay9yd2xvY2sgaW1wbGVtZW50YXRpb25zIGZvciB0aGUKICAqIFNNUCBhbmQgdGhlIERFQlVHX1NQSU5MT0NLIGNhc2VzLiAoVVAtbm9uZGVidWcgaW5saW5lcyB0aGVtKQorICoKKyAqIE5vdGUgdGhhdCBzb21lIGFyY2hpdGVjdHVyZXMgaGF2ZSBzcGVjaWFsIGtub3dsZWRnZSBhYm91dCB0aGUKKyAqIHN0YWNrIGZyYW1lcyBvZiB0aGVzZSBmdW5jdGlvbnMgaW4gdGhlaXIgcHJvZmlsZV9wYy4gSWYgeW91CisgKiBjaGFuZ2UgYW55dGhpbmcgc2lnbmlmaWNhbnQgaGVyZSB0aGF0IGNvdWxkIGNoYW5nZSB0aGUgc3RhY2sKKyAqIGZyYW1lIGNvbnRhY3QgdGhlIGFyY2hpdGVjdHVyZSBtYWludGFpbmVycy4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgpkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IGUyMzZmOTguLjNmODk0NzcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC90dHkuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9jbl9wcm9jLmg+CisjaW5jbHVkZSA8bGludXgvZ2V0Y3B1Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgpAQCAtMjA2MiwzICsyMDYzLDMzIEBACiAJfQogCXJldHVybiBlcnJvcjsKIH0KKworYXNtbGlua2FnZSBsb25nIHN5c19nZXRjcHUodW5zaWduZWQgX191c2VyICpjcHVwLCB1bnNpZ25lZCBfX3VzZXIgKm5vZGVwLAorCSAgIAkJICAgc3RydWN0IGdldGNwdV9jYWNoZSBfX3VzZXIgKmNhY2hlKQoreworCWludCBlcnIgPSAwOworCWludCBjcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworCWlmIChjcHVwKQorCQllcnIgfD0gcHV0X3VzZXIoY3B1LCBjcHVwKTsKKwlpZiAobm9kZXApCisJCWVyciB8PSBwdXRfdXNlcihjcHVfdG9fbm9kZShjcHUpLCBub2RlcCk7CisJaWYgKGNhY2hlKSB7CisJCS8qCisJCSAqIFRoZSBjYWNoZSBpcyBub3QgbmVlZGVkIGZvciB0aGlzIGltcGxlbWVudGF0aW9uLAorCQkgKiBidXQgbWFrZSBzdXJlIHVzZXIgcHJvZ3JhbXMgcGFzcyBzb21ldGhpbmcKKwkJICogdmFsaWQuIHZzeXNjYWxsIGltcGxlbWVudGF0aW9ucyBjYW4gaW5zdGVhZCBtYWtlCisJCSAqIGdvb2QgdXNlIG9mIHRoZSBjYWNoZS4gT25seSB1c2UgdDAgYW5kIHQxIGJlY2F1c2UKKwkJICogdGhlc2UgYXJlIGF2YWlsYWJsZSBpbiBib3RoIDMyYml0IGFuZCA2NGJpdCBBQkkgKG5vCisJCSAqIG5lZWQgZm9yIGEgY29tcGF0X2dldGNwdSkuIDMyYml0IGhhcyBlbm91Z2gKKwkJICogcGFkZGluZworCQkgKi8KKwkJdW5zaWduZWQgbG9uZyB0MCwgdDE7CisJCWdldF91c2VyKHQwLCAmY2FjaGUtPnQwKTsKKwkJZ2V0X3VzZXIodDEsICZjYWNoZS0+dDEpOworCQl0MCsrOworCQl0MSsrOworCQlwdXRfdXNlcih0MCwgJmNhY2hlLT50MCk7CisJCXB1dF91c2VyKHQxLCAmY2FjaGUtPnQxKTsKKwl9CisJcmV0dXJuIGVyciA/IC1FRkFVTFQgOiAwOworfQpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IGZkNDNjM2UuLjhiZmE3ZDEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGwuYworKysgYi9rZXJuZWwvc3lzY3RsLmMKQEAgLTc2LDggKzc2LDkgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKSAmJiBkZWZpbmVkKENPTkZJR19YODYpCiBpbnQgdW5rbm93bl9ubWlfcGFuaWM7Ci1leHRlcm4gaW50IHByb2NfdW5rbm93bl9ubWlfcGFuaWMoY3RsX3RhYmxlICosIGludCwgc3RydWN0IGZpbGUgKiwKLQkJCQkgIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CitpbnQgbm1pX3dhdGNoZG9nX2VuYWJsZWQ7CitleHRlcm4gaW50IHByb2Nfbm1pX2VuYWJsZWQoc3RydWN0IGN0bF90YWJsZSAqLCBpbnQgLCBzdHJ1Y3QgZmlsZSAqLAorCQkJdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKICNlbmRpZgogCiAvKiB0aGlzIGlzIG5lZWRlZCBmb3IgdGhlIHByb2NfZG9pbnR2ZWNfbWlubWF4IGZvciBbZnNfXW92ZXJmbG93IFVJRCBhbmQgR0lEICovCkBAIC0xMzYsOCArMTM3LDExIEBACiBleHRlcm4gaW50IG1heF9sb2NrX2RlcHRoOwogI2VuZGlmCiAKLXN0YXRpYyBpbnQgcGFyc2VfdGFibGUoaW50IF9fdXNlciAqLCBpbnQsIHZvaWQgX191c2VyICosIHNpemVfdCBfX3VzZXIgKiwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90LAotCQkgICAgICAgY3RsX3RhYmxlICosIHZvaWQgKiopOworI2lmZGVmIENPTkZJR19TWVNDVExfU1lTQ0FMTAorc3RhdGljIGludCBwYXJzZV90YWJsZShpbnQgX191c2VyICosIGludCwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90IF9fdXNlciAqLAorCQl2b2lkIF9fdXNlciAqLCBzaXplX3QsIGN0bF90YWJsZSAqLCB2b2lkICoqKTsKKyNlbmRpZgorCiBzdGF0aWMgaW50IHByb2NfZG91dHNzdHJpbmcoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcyk7CiAKQEAgLTE2NCw3ICsxNjgsNyBAQAogCiAvKiAvcHJvYyBkZWNsYXJhdGlvbnM6ICovCiAKLSNpZmRlZiBDT05GSUdfUFJPQ19GUworI2lmZGVmIENPTkZJR19QUk9DX1NZU0NUTAogCiBzdGF0aWMgc3NpemVfdCBwcm9jX3JlYWRzeXMoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CiBzdGF0aWMgc3NpemVfdCBwcm9jX3dyaXRlc3lzKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwpAQCAtNjI4LDExICs2MzIsMjcgQEAKIAkJLmRhdGEgICAgICAgICAgID0gJnVua25vd25fbm1pX3BhbmljLAogCQkubWF4bGVuICAgICAgICAgPSBzaXplb2YgKGludCksCiAJCS5tb2RlICAgICAgICAgICA9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIgICA9ICZwcm9jX3Vua25vd25fbm1pX3BhbmljLAorCQkucHJvY19oYW5kbGVyICAgPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lICAgICAgID0gS0VSTl9OTUlfV0FUQ0hET0csCisJCS5wcm9jbmFtZSAgICAgICA9ICJubWlfd2F0Y2hkb2ciLAorCQkuZGF0YSAgICAgICAgICAgPSAmbm1pX3dhdGNoZG9nX2VuYWJsZWQsCisJCS5tYXhsZW4gICAgICAgICA9IHNpemVvZiAoaW50KSwKKwkJLm1vZGUgICAgICAgICAgID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciAgID0gJnByb2Nfbm1pX2VuYWJsZWQsCiAJfSwKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX1g4NikKIAl7CisJCS5jdGxfbmFtZQk9IEtFUk5fUEFOSUNfT05fTk1JLAorCQkucHJvY25hbWUJPSAicGFuaWNfb25fdW5yZWNvdmVyZWRfbm1pIiwKKwkJLmRhdGEJCT0gJnBhbmljX29uX3VucmVjb3ZlcmVkX25taSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJewogCQkuY3RsX25hbWUJPSBLRVJOX0JPT1RMT0FERVJfVFlQRSwKIAkJLnByb2NuYW1lCT0gImJvb3Rsb2FkZXJfdHlwZSIsCiAJCS5kYXRhCQk9ICZib290bG9hZGVyX3R5cGUsCkBAIC0xMTQ5LDEyICsxMTY5LDEzIEBACiAKIHZvaWQgX19pbml0IHN5c2N0bF9pbml0KHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKKyNpZmRlZiBDT05GSUdfUFJPQ19TWVNDVEwKIAlyZWdpc3Rlcl9wcm9jX3RhYmxlKHJvb3RfdGFibGUsIHByb2Nfc3lzX3Jvb3QsICZyb290X3RhYmxlX2hlYWRlcik7CiAJaW5pdF9pcnFfcHJvYygpOwogI2VuZGlmCiB9CiAKKyNpZmRlZiBDT05GSUdfU1lTQ1RMX1NZU0NBTEwKIGludCBkb19zeXNjdGwoaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sIHZvaWQgX191c2VyICpvbGR2YWwsIHNpemVfdCBfX3VzZXIgKm9sZGxlbnAsCiAJICAgICAgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4pCiB7CkBAIC0xMjA4LDYgKzEyMjksNyBAQAogCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gZXJyb3I7CiB9CisjZW5kaWYgLyogQ09ORklHX1NZU0NUTF9TWVNDQUxMICovCiAKIC8qCiAgKiBjdGxfcGVybSBkb2VzIE5PVCBncmFudCB0aGUgc3VwZXJ1c2VyIGFsbCByaWdodHMgYXV0b21hdGljYWxseSwgYmVjYXVzZQpAQCAtMTIzNCw2ICsxMjU2LDcgQEAKIAlyZXR1cm4gdGVzdF9wZXJtKHRhYmxlLT5tb2RlLCBvcCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfU1lTQ1RMX1NZU0NBTEwKIHN0YXRpYyBpbnQgcGFyc2VfdGFibGUoaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCiAJCSAgICAgICB2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAogCQkgICAgICAgdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwKQEAgLTEzMjMsNiArMTM0Niw3IEBACiAJfQogCXJldHVybiAwOwogfQorI2VuZGlmIC8qIENPTkZJR19TWVNDVExfU1lTQ0FMTCAqLwogCiAvKioKICAqIHJlZ2lzdGVyX3N5c2N0bF90YWJsZSAtIHJlZ2lzdGVyIGEgc3lzY3RsIGhpZXJhcmNoeQpAQCAtMTQxMCw3ICsxNDM0LDcgQEAKIAllbHNlCiAJCWxpc3RfYWRkX3RhaWwoJnRtcC0+Y3RsX2VudHJ5LCAmcm9vdF90YWJsZV9oZWFkZXIuY3RsX2VudHJ5KTsKIAlzcGluX3VubG9jaygmc3lzY3RsX2xvY2spOwotI2lmZGVmIENPTkZJR19QUk9DX0ZTCisjaWZkZWYgQ09ORklHX1BST0NfU1lTQ1RMCiAJcmVnaXN0ZXJfcHJvY190YWJsZSh0YWJsZSwgcHJvY19zeXNfcm9vdCwgdG1wKTsKICNlbmRpZgogCXJldHVybiB0bXA7CkBAIC0xNDI4LDE4ICsxNDUyLDMxIEBACiAJbWlnaHRfc2xlZXAoKTsKIAlzcGluX2xvY2soJnN5c2N0bF9sb2NrKTsKIAlzdGFydF91bnJlZ2lzdGVyaW5nKGhlYWRlcik7Ci0jaWZkZWYgQ09ORklHX1BST0NfRlMKKyNpZmRlZiBDT05GSUdfUFJPQ19TWVNDVEwKIAl1bnJlZ2lzdGVyX3Byb2NfdGFibGUoaGVhZGVyLT5jdGxfdGFibGUsIHByb2Nfc3lzX3Jvb3QpOwogI2VuZGlmCiAJc3Bpbl91bmxvY2soJnN5c2N0bF9sb2NrKTsKIAlrZnJlZShoZWFkZXIpOwogfQogCisjZWxzZSAvKiAhQ09ORklHX1NZU0NUTCAqLworc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKiByZWdpc3Rlcl9zeXNjdGxfdGFibGUoY3RsX3RhYmxlICogdGFibGUsCisJCQkJCQlpbnQgaW5zZXJ0X2F0X2hlYWQpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKiB0YWJsZSkKK3sKK30KKworI2VuZGlmIC8qIENPTkZJR19TWVNDVEwgKi8KKwogLyoKICAqIC9wcm9jL3N5cyBzdXBwb3J0CiAgKi8KIAotI2lmZGVmIENPTkZJR19QUk9DX0ZTCisjaWZkZWYgQ09ORklHX1BST0NfU1lTQ1RMCiAKIC8qIFNjYW4gdGhlIHN5c2N0bCBlbnRyaWVzIGluIHRhYmxlIGFuZCBhZGQgdGhlbSBhbGwgaW50byAvcHJvYyAqLwogc3RhdGljIHZvaWQgcmVnaXN0ZXJfcHJvY190YWJsZShjdGxfdGFibGUgKiB0YWJsZSwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyb290LCB2b2lkICpzZXQpCkBAIC0yMzAxLDYgKzIzMzgsNyBAQAogI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCiAKIAorI2lmZGVmIENPTkZJR19TWVNDVExfU1lTQ0FMTAogLyoKICAqIEdlbmVyYWwgc3lzY3RsIHN1cHBvcnQgcm91dGluZXMgCiAgKi8KQEAgLTI0NDMsMTEgKzI0ODEsMTkgQEAKIAlyZXR1cm4gMTsKIH0KIAotI2Vsc2UgLyogQ09ORklHX1NZU0NUTCAqLworI2Vsc2UgLyogQ09ORklHX1NZU0NUTF9TWVNDQUxMICovCiAKIAogYXNtbGlua2FnZSBsb25nIHN5c19zeXNjdGwoc3RydWN0IF9fc3lzY3RsX2FyZ3MgX191c2VyICphcmdzKQogeworCXN0YXRpYyBpbnQgbXNnX2NvdW50OworCisJaWYgKG1zZ19jb3VudCA8IDUpIHsKKwkJbXNnX2NvdW50Kys7CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSJ3YXJuaW5nOiBwcm9jZXNzIGAlcycgdXNlZCB0aGUgcmVtb3ZlZCBzeXNjdGwgIgorCQkJInN5c3RlbSBjYWxsXG4iLCBjdXJyZW50LT5jb21tKTsKKwl9CiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKQEAgLTI0NzksNzMgKzI1MjUsNyBAQAogCXJldHVybiAtRU5PU1lTOwogfQogCi1pbnQgcHJvY19kb3N0cmluZyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQotewotCXJldHVybiAtRU5PU1lTOwotfQotCi1pbnQgcHJvY19kb2ludHZlYyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQotewotCXJldHVybiAtRU5PU1lTOwotfQotCi1pbnQgcHJvY19kb2ludHZlY19ic2V0KGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotaW50IHByb2NfZG9pbnR2ZWNfbWlubWF4KGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotaW50IHByb2NfZG9pbnR2ZWNfamlmZmllcyhjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkJICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotaW50IHByb2NfZG9pbnR2ZWNfdXNlcmh6X2ppZmZpZXMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCSAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLWludCBwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMoY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCSAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLWludCBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotaW50IHByb2NfZG91bG9uZ3ZlY19tc19qaWZmaWVzX21pbm1heChjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkJICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKLQkJCQkgICAgICBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKLXsKLSAgICByZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKiByZWdpc3Rlcl9zeXNjdGxfdGFibGUoY3RsX3RhYmxlICogdGFibGUsIAotCQkJCQkJaW50IGluc2VydF9hdF9oZWFkKQotewotCXJldHVybiBOVUxMOwotfQotCi12b2lkIHVucmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICogdGFibGUpCi17Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCisjZW5kaWYgLyogQ09ORklHX1NZU0NUTF9TWVNDQUxMICovCiAKIC8qCiAgKiBObyBzZW5zZSBwdXR0aW5nIHRoaXMgYWZ0ZXIgZWFjaCBzeW1ib2wgZGVmaW5pdGlvbiwgdHdpY2UsCmRpZmYgLS1naXQgYS9rZXJuZWwvdW53aW5kLmMgYi9rZXJuZWwvdW53aW5kLmMKaW5kZXggZjY5YzgwNC4uMzQzMDQ3NSAxMDA2NDQKLS0tIGEva2VybmVsL3Vud2luZC5jCisrKyBiL2tlcm5lbC91bndpbmQuYwpAQCAtNjAzLDYgKzYwMyw3IEBACiAjZGVmaW5lIEZSQU1FX1JFRyhyLCB0KSAoKCh0ICopZnJhbWUpW3JlZ19pbmZvW3JdLm9mZnNdKQogCWNvbnN0IHUzMiAqZmRlID0gTlVMTCwgKmNpZSA9IE5VTEw7CiAJY29uc3QgdTggKnB0ciA9IE5VTEwsICplbmQgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgcGMgPSBVTldfUEMoZnJhbWUpIC0gZnJhbWUtPmNhbGxfZnJhbWU7CiAJdW5zaWduZWQgbG9uZyBzdGFydExvYyA9IDAsIGVuZExvYyA9IDAsIGNmYTsKIAl1bnNpZ25lZCBpOwogCXNpZ25lZCBwdHJUeXBlID0gLTE7CkBAIC02MTIsNyArNjEzLDcgQEAKIAogCWlmIChVTldfUEMoZnJhbWUpID09IDApCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICgodGFibGUgPSBmaW5kX3RhYmxlKFVOV19QQyhmcmFtZSkpKSAhPSBOVUxMCisJaWYgKCh0YWJsZSA9IGZpbmRfdGFibGUocGMpKSAhPSBOVUxMCiAJICAgICYmICEodGFibGUtPnNpemUgJiAoc2l6ZW9mKCpmZGUpIC0gMSkpKSB7CiAJCXVuc2lnbmVkIGxvbmcgdGFibGVTaXplID0gdGFibGUtPnNpemU7CiAKQEAgLTY0Nyw3ICs2NDgsNyBAQAogCQkJICAgICAgICAgICAgICAgICAgICAgICAgcHRyVHlwZSAmIERXX0VIX1BFX2luZGlyZWN0CiAJCQkgICAgICAgICAgICAgICAgICAgICAgICA/IHB0clR5cGUKIAkJCSAgICAgICAgICAgICAgICAgICAgICAgIDogcHRyVHlwZSAmIChEV19FSF9QRV9GT1JNfERXX0VIX1BFX3NpZ25lZCkpOwotCQkJaWYgKFVOV19QQyhmcmFtZSkgPj0gc3RhcnRMb2MgJiYgVU5XX1BDKGZyYW1lKSA8IGVuZExvYykKKwkJCWlmIChwYyA+PSBzdGFydExvYyAmJiBwYyA8IGVuZExvYykKIAkJCQlicmVhazsKIAkJCWNpZSA9IE5VTEw7CiAJCX0KQEAgLTY1NywxNiArNjU4LDI4IEBACiAJCXN0YXRlLmNpZUVuZCA9IHB0cjsgLyoga2VlcCBoZXJlIHRlbXBvcmFyaWx5ICovCiAJCXB0ciA9IChjb25zdCB1OCAqKShjaWUgKyAyKTsKIAkJZW5kID0gKGNvbnN0IHU4ICopKGNpZSArIDEpICsgKmNpZTsKKwkJZnJhbWUtPmNhbGxfZnJhbWUgPSAxOwogCQlpZiAoKHN0YXRlLnZlcnNpb24gPSAqcHRyKSAhPSAxKQogCQkJY2llID0gTlVMTDsgLyogdW5zdXBwb3J0ZWQgdmVyc2lvbiAqLwogCQllbHNlIGlmICgqKytwdHIpIHsKIAkJCS8qIGNoZWNrIGlmIGF1Z21lbnRhdGlvbiBzaXplIGlzIGZpcnN0IChhbmQgdGh1cyBwcmVzZW50KSAqLwogCQkJaWYgKCpwdHIgPT0gJ3onKSB7Ci0JCQkJLyogY2hlY2sgZm9yIGlnbm9yYWJsZSAob3IgYWxyZWFkeSBoYW5kbGVkKQotCQkJCSAqIG51bC10ZXJtaW5hdGVkIGF1Z21lbnRhdGlvbiBzdHJpbmcgKi8KLQkJCQl3aGlsZSAoKytwdHIgPCBlbmQgJiYgKnB0cikKLQkJCQkJaWYgKHN0cmNocigiTFBSIiwgKnB0cikgPT0gTlVMTCkKKwkJCQl3aGlsZSAoKytwdHIgPCBlbmQgJiYgKnB0cikgeworCQkJCQlzd2l0Y2goKnB0cikgeworCQkJCQkvKiBjaGVjayBmb3IgaWdub3JhYmxlIChvciBhbHJlYWR5IGhhbmRsZWQpCisJCQkJCSAqIG51bC10ZXJtaW5hdGVkIGF1Z21lbnRhdGlvbiBzdHJpbmcgKi8KKwkJCQkJY2FzZSAnTCc6CisJCQkJCWNhc2UgJ1AnOgorCQkJCQljYXNlICdSJzoKKwkJCQkJCWNvbnRpbnVlOworCQkJCQljYXNlICdTJzoKKwkJCQkJCWZyYW1lLT5jYWxsX2ZyYW1lID0gMDsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlkZWZhdWx0OgogCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQogCQkJfQogCQkJaWYgKHB0ciA+PSBlbmQgfHwgKnB0cikKIAkJCQljaWUgPSBOVUxMOwpAQCAtNzU1LDcgKzc2OCw3IEBACiAJc3RhdGUub3JnID0gc3RhcnRMb2M7CiAJbWVtY3B5KCZzdGF0ZS5jZmEsICZiYWRDRkEsIHNpemVvZihzdGF0ZS5jZmEpKTsKIAkvKiBwcm9jZXNzIGluc3RydWN0aW9ucyAqLwotCWlmICghcHJvY2Vzc0NGSShwdHIsIGVuZCwgVU5XX1BDKGZyYW1lKSwgcHRyVHlwZSwgJnN0YXRlKQorCWlmICghcHJvY2Vzc0NGSShwdHIsIGVuZCwgcGMsIHB0clR5cGUsICZzdGF0ZSkKIAkgICB8fCBzdGF0ZS5sb2MgPiBlbmRMb2MKIAkgICB8fCBzdGF0ZS5yZWdzW3JldEFkZHJSZWddLndoZXJlID09IE5vd2hlcmUKIAkgICB8fCBzdGF0ZS5jZmEucmVnID49IEFSUkFZX1NJWkUocmVnX2luZm8pCkBAIC03NjMsNiArNzc2LDExIEBACiAJICAgfHwgc3RhdGUuY2ZhLm9mZnMgJSBzaXplb2YodW5zaWduZWQgbG9uZykpCiAJCXJldHVybiAtRUlPOwogCS8qIHVwZGF0ZSBmcmFtZSAqLworI2lmbmRlZiBDT05GSUdfQVNfQ0ZJX1NJR05BTF9GUkFNRQorCWlmKGZyYW1lLT5jYWxsX2ZyYW1lCisJICAgJiYgIVVOV19ERUZBVUxUX1JBKHN0YXRlLnJlZ3NbcmV0QWRkclJlZ10sIHN0YXRlLmRhdGFBbGlnbikpCisJCWZyYW1lLT5jYWxsX2ZyYW1lID0gMDsKKyNlbmRpZgogCWNmYSA9IEZSQU1FX1JFRyhzdGF0ZS5jZmEucmVnLCB1bnNpZ25lZCBsb25nKSArIHN0YXRlLmNmYS5vZmZzOwogCXN0YXJ0TG9jID0gbWluKCh1bnNpZ25lZCBsb25nKVVOV19TUChmcmFtZSksIGNmYSk7CiAJZW5kTG9jID0gbWF4KCh1bnNpZ25lZCBsb25nKVVOV19TUChmcmFtZSksIGNmYSk7CkBAIC04NjYsNiArODg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29uc3QqLyBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlpbmZvLT50YXNrID0gdHNrOworCWluZm8tPmNhbGxfZnJhbWUgPSAwOwogCWFyY2hfdW53X2luaXRfZnJhbWVfaW5mbyhpbmZvLCByZWdzKTsKIAogCXJldHVybiAwOwpAQCAtODc5LDYgKzg5OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAlpbmZvLT50YXNrID0gdHNrOworCWluZm8tPmNhbGxfZnJhbWUgPSAwOwogCWFyY2hfdW53X2luaXRfYmxvY2tlZChpbmZvKTsKIAogCXJldHVybiAwOwpAQCAtODk0LDYgKzkxNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcpCiB7CiAJaW5mby0+dGFzayA9IGN1cnJlbnQ7CisJaW5mby0+Y2FsbF9mcmFtZSA9IDA7CiAKIAlyZXR1cm4gYXJjaF91bndpbmRfaW5pdF9ydW5uaW5nKGluZm8sIGNhbGxiYWNrLCBhcmcpOwogfQpkaWZmIC0tZ2l0IGEvbGliL0tjb25maWcuZGVidWcgYi9saWIvS2NvbmZpZy5kZWJ1ZwppbmRleCAzZjIxY2M3Li5iMGY1Y2E3IDEwMDY0NAotLS0gYS9saWIvS2NvbmZpZy5kZWJ1ZworKysgYi9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtOCw2ICs4LDEzIEBACiAJICBvcGVyYXRpb25zLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGlkZW50aWZ5aW5nIGxvbmcgZGVsYXlzCiAJICBpbiBrZXJuZWwgc3RhcnR1cC4KIAorY29uZmlnIEVOQUJMRV9NVVNUX0NIRUNLCisJYm9vbCAiRW5hYmxlIF9fbXVzdF9jaGVjayBsb2dpYyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBFbmFibGUgdGhlIF9fbXVzdF9jaGVjayBsb2dpYyBpbiB0aGUga2VybmVsIGJ1aWxkLiAgRGlzYWJsZSB0aGlzIHRvCisJICBzdXBwcmVzcyB0aGUgIndhcm5pbmc6IGlnbm9yaW5nIHJldHVybiB2YWx1ZSBvZiAnZm9vJywgZGVjbGFyZWQgd2l0aAorCSAgYXR0cmlidXRlIHdhcm5fdW51c2VkX3Jlc3VsdCIgbWVzc2FnZXMuCiAKIGNvbmZpZyBNQUdJQ19TWVNSUQogCWJvb2wgIk1hZ2ljIFN5c1JxIGtleSIKQEAgLTIxOCw3ICsyMjUsNyBAQAogCWJvb2wKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBUUkFDRV9JUlFGTEFHU19TVVBQT1JUICYmIFNUQUNLVFJBQ0VfU1VQUE9SVCAmJiBMT0NLREVQX1NVUFBPUlQKIAlzZWxlY3QgU1RBQ0tUUkFDRQotCXNlbGVjdCBGUkFNRV9QT0lOVEVSCisJc2VsZWN0IEZSQU1FX1BPSU5URVIgaWYgIVg4NgogCXNlbGVjdCBLQUxMU1lNUwogCXNlbGVjdCBLQUxMU1lNU19BTEwKIApAQCAtMjc3LDcgKzI4NCw3IEBACiBjb25maWcgREVCVUdfQlVHVkVSQk9TRQogCWJvb2wgIlZlcmJvc2UgQlVHKCkgcmVwb3J0aW5nIChhZGRzIDcwSykiIGlmIERFQlVHX0tFUk5FTCAmJiBFTUJFRERFRAogCWRlcGVuZHMgb24gQlVHCi0JZGVwZW5kcyBvbiBBUk0gfHwgQVJNMjYgfHwgQVZSMzIgfHwgTTMyUiB8fCBNNjhLIHx8IFNQQVJDMzIgfHwgU1BBUkM2NCB8fCBYODZfMzIgfHwgRlJWCisJZGVwZW5kcyBvbiBBUk0gfHwgQVJNMjYgfHwgQVZSMzIgfHwgTTMyUiB8fCBNNjhLIHx8IFNQQVJDMzIgfHwgU1BBUkM2NCB8fCBYODZfMzIgfHwgRlJWIHx8IFNVUEVSSAogCWRlZmF1bHQgIUVNQkVEREVECiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBtYWtlIEJVRygpIHBhbmljcyBvdXRwdXQgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIKQEAgLTMxNSw3ICszMjIsNyBAQAogCiBjb25maWcgRlJBTUVfUE9JTlRFUgogCWJvb2wgIkNvbXBpbGUgdGhlIGtlcm5lbCB3aXRoIGZyYW1lIHBvaW50ZXJzIgotCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIChYODYgfHwgQ1JJUyB8fCBNNjhLIHx8IE02OEtOT01NVSB8fCBGUlYgfHwgVU1MIHx8IFMzOTAgfHwgQVZSMzIpCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgKFg4NiB8fCBDUklTIHx8IE02OEsgfHwgTTY4S05PTU1VIHx8IEZSViB8fCBVTUwgfHwgUzM5MCB8fCBBVlIzMiB8fCBTVVBFUkgpCiAJZGVmYXVsdCB5IGlmIERFQlVHX0lORk8gJiYgVU1MCiAJaGVscAogCSAgSWYgeW91IHNheSBZIGhlcmUgdGhlIHJlc3VsdGluZyBrZXJuZWwgaW1hZ2Ugd2lsbCBiZSBzbGlnaHRseSBsYXJnZXIKZGlmZiAtLWdpdCBhL2xpYi9od2VpZ2h0LmMgYi9saWIvaHdlaWdodC5jCmluZGV4IDQzODI1NzYuLjM2MDU1NmEgMTAwNjQ0Ci0tLSBhL2xpYi9od2VpZ2h0LmMKKysrIGIvbGliL2h3ZWlnaHQuYwpAQCAtMSw1ICsxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiAKIC8qKgogICogaHdlaWdodE4gLSByZXR1cm5zIHRoZSBoYW1taW5nIHdlaWdodCBvZiBhIE4tYml0IHdvcmQKQEAgLTQwLDE0ICs0MSwxOSBAQAogI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKIAlyZXR1cm4gaHdlaWdodDMyKCh1bnNpZ25lZCBpbnQpKHcgPj4gMzIpKSArIGh3ZWlnaHQzMigodW5zaWduZWQgaW50KXcpOwogI2VsaWYgQklUU19QRVJfTE9ORyA9PSA2NAorI2lmZGVmIEFSQ0hfSEFTX0ZBU1RfTVVMVElQTElFUgorCXcgLT0gKHcgPj4gMSkgJiAweDU1NTU1NTU1NTU1NTU1NTV1bDsKKwl3ID0gICh3ICYgMHgzMzMzMzMzMzMzMzMzMzMzdWwpICsgKCh3ID4+IDIpICYgMHgzMzMzMzMzMzMzMzMzMzMzdWwpOworCXcgPSAgKHcgKyAodyA+PiA0KSkgJiAweDBmMGYwZjBmMGYwZjBmMGZ1bDsKKwlyZXR1cm4gKHcgKiAweDAxMDEwMTAxMDEwMTAxMDF1bCkgPj4gNTY7CisjZWxzZQogCV9fdTY0IHJlcyA9IHcgLSAoKHcgPj4gMSkgJiAweDU1NTU1NTU1NTU1NTU1NTV1bCk7CiAJcmVzID0gKHJlcyAmIDB4MzMzMzMzMzMzMzMzMzMzM3VsKSArICgocmVzID4+IDIpICYgMHgzMzMzMzMzMzMzMzMzMzMzdWwpOwogCXJlcyA9IChyZXMgKyAocmVzID4+IDQpKSAmIDB4MEYwRjBGMEYwRjBGMEYwRnVsOwogCXJlcyA9IHJlcyArIChyZXMgPj4gOCk7CiAJcmVzID0gcmVzICsgKHJlcyA+PiAxNik7CiAJcmV0dXJuIChyZXMgKyAocmVzID4+IDMyKSkgJiAweDAwMDAwMDAwMDAwMDAwRkZ1bDsKLSNlbHNlCi0jZXJyb3IgQklUU19QRVJfTE9ORyBub3QgZGVmaW5lZAorI2VuZGlmCiAjZW5kaWYKIH0KIEVYUE9SVF9TWU1CT0woaHdlaWdodDY0KTsKZGlmZiAtLWdpdCBhL2xpYi9rbGlzdC5jIGIvbGliL2tsaXN0LmMKaW5kZXggOWM5NGYwYi4uMTIwYmQxNyAxMDA2NDQKLS0tIGEvbGliL2tsaXN0LmMKKysrIGIvbGliL2tsaXN0LmMKQEAgLTEyMywxMiArMTIzLDEwIEBACiBzdGF0aWMgdm9pZCBrbGlzdF9yZWxlYXNlKHN0cnVjdCBrcmVmICoga3JlZikKIHsKIAlzdHJ1Y3Qga2xpc3Rfbm9kZSAqIG4gPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGtsaXN0X25vZGUsIG5fcmVmKTsKLQl2b2lkICgqcHV0KShzdHJ1Y3Qga2xpc3Rfbm9kZSAqKSA9IG4tPm5fa2xpc3QtPnB1dDsKKwogCWxpc3RfZGVsKCZuLT5uX25vZGUpOwogCWNvbXBsZXRlKCZuLT5uX3JlbW92ZWQpOwogCW4tPm5fa2xpc3QgPSBOVUxMOwotCWlmIChwdXQpCi0JCXB1dChuKTsKIH0KIAogc3RhdGljIGludCBrbGlzdF9kZWNfYW5kX2RlbChzdHJ1Y3Qga2xpc3Rfbm9kZSAqIG4pCkBAIC0xNDUsMTAgKzE0MywxNCBAQAogdm9pZCBrbGlzdF9kZWwoc3RydWN0IGtsaXN0X25vZGUgKiBuKQogewogCXN0cnVjdCBrbGlzdCAqIGsgPSBuLT5uX2tsaXN0OworCXZvaWQgKCpwdXQpKHN0cnVjdCBrbGlzdF9ub2RlICopID0gay0+cHV0OwogCiAJc3Bpbl9sb2NrKCZrLT5rX2xvY2spOwotCWtsaXN0X2RlY19hbmRfZGVsKG4pOworCWlmICgha2xpc3RfZGVjX2FuZF9kZWwobikpCisJCXB1dCA9IE5VTEw7CiAJc3Bpbl91bmxvY2soJmstPmtfbG9jayk7CisJaWYgKHB1dCkKKwkJcHV0KG4pOwogfQogCiBFWFBPUlRfU1lNQk9MX0dQTChrbGlzdF9kZWwpOwpAQCAtMTYxLDEwICsxNjMsNyBAQAogCiB2b2lkIGtsaXN0X3JlbW92ZShzdHJ1Y3Qga2xpc3Rfbm9kZSAqIG4pCiB7Ci0Jc3RydWN0IGtsaXN0ICogayA9IG4tPm5fa2xpc3Q7Ci0Jc3Bpbl9sb2NrKCZrLT5rX2xvY2spOwotCWtsaXN0X2RlY19hbmRfZGVsKG4pOwotCXNwaW5fdW5sb2NrKCZrLT5rX2xvY2spOworCWtsaXN0X2RlbChuKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZuLT5uX3JlbW92ZWQpOwogfQogCkBAIC0yNjAsMTIgKzI1OSwxNSBAQAogc3RydWN0IGtsaXN0X25vZGUgKiBrbGlzdF9uZXh0KHN0cnVjdCBrbGlzdF9pdGVyICogaSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICogbmV4dDsKKwlzdHJ1Y3Qga2xpc3Rfbm9kZSAqIGxub2RlID0gaS0+aV9jdXI7CiAJc3RydWN0IGtsaXN0X25vZGUgKiBrbm9kZSA9IE5VTEw7CisJdm9pZCAoKnB1dCkoc3RydWN0IGtsaXN0X25vZGUgKikgPSBpLT5pX2tsaXN0LT5wdXQ7CiAKIAlzcGluX2xvY2soJmktPmlfa2xpc3QtPmtfbG9jayk7Ci0JaWYgKGktPmlfY3VyKSB7Ci0JCW5leHQgPSBpLT5pX2N1ci0+bl9ub2RlLm5leHQ7Ci0JCWtsaXN0X2RlY19hbmRfZGVsKGktPmlfY3VyKTsKKwlpZiAobG5vZGUpIHsKKwkJbmV4dCA9IGxub2RlLT5uX25vZGUubmV4dDsKKwkJaWYgKCFrbGlzdF9kZWNfYW5kX2RlbChsbm9kZSkpCisJCQlwdXQgPSBOVUxMOwogCX0gZWxzZQogCQluZXh0ID0gaS0+aV9oZWFkLT5uZXh0OwogCkBAIC0yNzUsNiArMjc3LDggQEAKIAl9CiAJaS0+aV9jdXIgPSBrbm9kZTsKIAlzcGluX3VubG9jaygmaS0+aV9rbGlzdC0+a19sb2NrKTsKKwlpZiAocHV0ICYmIGxub2RlKQorCQlwdXQobG5vZGUpOwogCXJldHVybiBrbm9kZTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliL2tvYmplY3QuYyBiL2xpYi9rb2JqZWN0LmMKaW5kZXggOGU3YzcxOS4uMTY5OWViOSAxMDA2NDQKLS0tIGEvbGliL2tvYmplY3QuYworKysgYi9saWIva29iamVjdC5jCkBAIC00MDcsNiArNDA3LDcgQEAKIHN0cnVjdCBrb2JqZWN0ICprb2JqZWN0X2FkZF9kaXIoc3RydWN0IGtvYmplY3QgKnBhcmVudCwgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3Qga29iamVjdCAqazsKKwlpbnQgcmV0OwogCiAJaWYgKCFwYXJlbnQpCiAJCXJldHVybiBOVUxMOwpAQCAtNDE4LDcgKzQxOSwxMyBAQAogCWstPnBhcmVudCA9IHBhcmVudDsKIAlrLT5rdHlwZSA9ICZkaXJfa3R5cGU7CiAJa29iamVjdF9zZXRfbmFtZShrLCBuYW1lKTsKLQlrb2JqZWN0X3JlZ2lzdGVyKGspOworCXJldCA9IGtvYmplY3RfcmVnaXN0ZXIoayk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAia29iamVjdF9hZGRfZGlyOiAiCisJCQkia29iamVjdF9yZWdpc3RlciBlcnJvcjogJWRcbiIsIHJldCk7CisJCWtvYmplY3RfZGVsKGspOworCQlyZXR1cm4gTlVMTDsKKwl9CiAKIAlyZXR1cm4gazsKIH0KZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggOTJhM2ViZC4uNjAxMTU5YSAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVtb3J5LmMKQEAgLTIyNTYsNiArMjI1Niw1NCBAQAogfQogCiAvKgorICogZG9fbm9fcGZuKCkgdHJpZXMgdG8gY3JlYXRlIGEgbmV3IHBhZ2UgbWFwcGluZyBmb3IgYSBwYWdlIHdpdGhvdXQKKyAqIGEgc3RydWN0X3BhZ2UgYmFja2luZyBpdAorICoKKyAqIEFzIHRoaXMgaXMgY2FsbGVkIG9ubHkgZm9yIHBhZ2VzIHRoYXQgZG8gbm90IGN1cnJlbnRseSBleGlzdCwgd2UKKyAqIGRvIG5vdCBuZWVkIHRvIGZsdXNoIG9sZCB2aXJ0dWFsIGNhY2hlcyBvciB0aGUgVExCLgorICoKKyAqIFdlIGVudGVyIHdpdGggbm9uLWV4Y2x1c2l2ZSBtbWFwX3NlbSAodG8gZXhjbHVkZSB2bWEgY2hhbmdlcywKKyAqIGJ1dCBhbGxvdyBjb25jdXJyZW50IGZhdWx0cyksIGFuZCBwdGUgbWFwcGVkIGJ1dCBub3QgeWV0IGxvY2tlZC4KKyAqIFdlIHJldHVybiB3aXRoIG1tYXBfc2VtIHN0aWxsIGhlbGQsIGJ1dCBwdGUgdW5tYXBwZWQgYW5kIHVubG9ja2VkLgorICoKKyAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIC0+bm9wZm4gaGFuZGxlciBhbHdheXMgcmV0dXJucyB0aGUgc2FtZSBwZm4KKyAqIGZvciBhIGdpdmVuIHZpcnR1YWwgbWFwcGluZy4KKyAqCisgKiBNYXJrIHRoaXMgYG5vaW5saW5lJyB0byBwcmV2ZW50IGl0IGZyb20gYmxvYXRpbmcgdGhlIG1haW4gcGFnZWZhdWx0IGNvZGUuCisgKi8KK3N0YXRpYyBub2lubGluZSBpbnQgZG9fbm9fcGZuKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwYWdlX3RhYmxlLCBwbWRfdCAqcG1kLAorCQkgICAgIGludCB3cml0ZV9hY2Nlc3MpCit7CisJc3BpbmxvY2tfdCAqcHRsOworCXB0ZV90IGVudHJ5OworCXVuc2lnbmVkIGxvbmcgcGZuOworCWludCByZXQgPSBWTV9GQVVMVF9NSU5PUjsKKworCXB0ZV91bm1hcChwYWdlX3RhYmxlKTsKKwlCVUdfT04oISh2bWEtPnZtX2ZsYWdzICYgVk1fUEZOTUFQKSk7CisJQlVHX09OKGlzX2Nvd19tYXBwaW5nKHZtYS0+dm1fZmxhZ3MpKTsKKworCXBmbiA9IHZtYS0+dm1fb3BzLT5ub3Bmbih2bWEsIGFkZHJlc3MgJiBQQUdFX01BU0spOworCWlmIChwZm4gPT0gTk9QRk5fT09NKQorCQlyZXR1cm4gVk1fRkFVTFRfT09NOworCWlmIChwZm4gPT0gTk9QRk5fU0lHQlVTKQorCQlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOworCisJcGFnZV90YWJsZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkcmVzcywgJnB0bCk7CisKKwkvKiBPbmx5IGdvIHRocm91Z2ggaWYgd2UgZGlkbid0IHJhY2Ugd2l0aCBhbnlib2R5IGVsc2UuLi4gKi8KKwlpZiAocHRlX25vbmUoKnBhZ2VfdGFibGUpKSB7CisJCWVudHJ5ID0gcGZuX3B0ZShwZm4sIHZtYS0+dm1fcGFnZV9wcm90KTsKKwkJaWYgKHdyaXRlX2FjY2VzcykKKwkJCWVudHJ5ID0gbWF5YmVfbWt3cml0ZShwdGVfbWtkaXJ0eShlbnRyeSksIHZtYSk7CisJCXNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHBhZ2VfdGFibGUsIGVudHJ5KTsKKwl9CisJcHRlX3VubWFwX3VubG9jayhwYWdlX3RhYmxlLCBwdGwpOworCXJldHVybiByZXQ7Cit9CisKKy8qCiAgKiBGYXVsdCBvZiBhIHByZXZpb3VzbHkgZXhpc3RpbmcgbmFtZWQgbWFwcGluZy4gUmVwb3B1bGF0ZSB0aGUgcHRlCiAgKiBmcm9tIHRoZSBlbmNvZGVkIGZpbGVfcHRlIGlmIHBvc3NpYmxlLiBUaGlzIGVuYWJsZXMgc3dhcHBhYmxlCiAgKiBub25saW5lYXIgdm1hcy4KQEAgLTIzMTcsMTEgKzIzNjUsMTcgQEAKIAlvbGRfZW50cnkgPSBlbnRyeSA9ICpwdGU7CiAJaWYgKCFwdGVfcHJlc2VudChlbnRyeSkpIHsKIAkJaWYgKHB0ZV9ub25lKGVudHJ5KSkgewotCQkJaWYgKCF2bWEtPnZtX29wcyB8fCAhdm1hLT52bV9vcHMtPm5vcGFnZSkKLQkJCQlyZXR1cm4gZG9fYW5vbnltb3VzX3BhZ2UobW0sIHZtYSwgYWRkcmVzcywKLQkJCQkJcHRlLCBwbWQsIHdyaXRlX2FjY2Vzcyk7Ci0JCQlyZXR1cm4gZG9fbm9fcGFnZShtbSwgdm1hLCBhZGRyZXNzLAotCQkJCQlwdGUsIHBtZCwgd3JpdGVfYWNjZXNzKTsKKwkJCWlmICh2bWEtPnZtX29wcykgeworCQkJCWlmICh2bWEtPnZtX29wcy0+bm9wYWdlKQorCQkJCQlyZXR1cm4gZG9fbm9fcGFnZShtbSwgdm1hLCBhZGRyZXNzLAorCQkJCQkJCSAgcHRlLCBwbWQsCisJCQkJCQkJICB3cml0ZV9hY2Nlc3MpOworCQkJCWlmICh1bmxpa2VseSh2bWEtPnZtX29wcy0+bm9wZm4pKQorCQkJCQlyZXR1cm4gZG9fbm9fcGZuKG1tLCB2bWEsIGFkZHJlc3MsIHB0ZSwKKwkJCQkJCQkgcG1kLCB3cml0ZV9hY2Nlc3MpOworCQkJfQorCQkJcmV0dXJuIGRvX2Fub255bW91c19wYWdlKG1tLCB2bWEsIGFkZHJlc3MsCisJCQkJCQkgcHRlLCBwbWQsIHdyaXRlX2FjY2Vzcyk7CiAJCX0KIAkJaWYgKHB0ZV9maWxlKGVudHJ5KSkKIAkJCXJldHVybiBkb19maWxlX3BhZ2UobW0sIHZtYSwgYWRkcmVzcywKQEAgLTI1NTAsMyArMjYwNCw1NiBAQAogfQogCiAjZW5kaWYJLyogX19IQVZFX0FSQ0hfR0FURV9BUkVBICovCisKKy8qCisgKiBBY2Nlc3MgYW5vdGhlciBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlLgorICogU291cmNlL3RhcmdldCBidWZmZXIgbXVzdCBiZSBrZXJuZWwgc3BhY2UsCisgKiBEbyBub3Qgd2FsayB0aGUgcGFnZSB0YWJsZSBkaXJlY3RseSwgdXNlIGdldF91c2VyX3BhZ2VzCisgKi8KK2ludCBhY2Nlc3NfcHJvY2Vzc192bShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBhZGRyLCB2b2lkICpidWYsIGludCBsZW4sIGludCB3cml0ZSkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl2b2lkICpvbGRfYnVmID0gYnVmOworCisJbW0gPSBnZXRfdGFza19tbSh0c2spOworCWlmICghbW0pCisJCXJldHVybiAwOworCisJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCS8qIGlnbm9yZSBlcnJvcnMsIGp1c3QgY2hlY2sgaG93IG11Y2ggd2FzIHN1Y2Vzc2Z1bGx5IHRyYW5zZmVyZWQgKi8KKwl3aGlsZSAobGVuKSB7CisJCWludCBieXRlcywgcmV0LCBvZmZzZXQ7CisJCXZvaWQgKm1hZGRyOworCisJCXJldCA9IGdldF91c2VyX3BhZ2VzKHRzaywgbW0sIGFkZHIsIDEsCisJCQkJd3JpdGUsIDEsICZwYWdlLCAmdm1hKTsKKwkJaWYgKHJldCA8PSAwKQorCQkJYnJlYWs7CisKKwkJYnl0ZXMgPSBsZW47CisJCW9mZnNldCA9IGFkZHIgJiAoUEFHRV9TSVpFLTEpOworCQlpZiAoYnl0ZXMgPiBQQUdFX1NJWkUtb2Zmc2V0KQorCQkJYnl0ZXMgPSBQQUdFX1NJWkUtb2Zmc2V0OworCisJCW1hZGRyID0ga21hcChwYWdlKTsKKwkJaWYgKHdyaXRlKSB7CisJCQljb3B5X3RvX3VzZXJfcGFnZSh2bWEsIHBhZ2UsIGFkZHIsCisJCQkJCSAgbWFkZHIgKyBvZmZzZXQsIGJ1ZiwgYnl0ZXMpOworCQkJc2V0X3BhZ2VfZGlydHlfbG9jayhwYWdlKTsKKwkJfSBlbHNlIHsKKwkJCWNvcHlfZnJvbV91c2VyX3BhZ2Uodm1hLCBwYWdlLCBhZGRyLAorCQkJCQkgICAgYnVmLCBtYWRkciArIG9mZnNldCwgYnl0ZXMpOworCQl9CisJCWt1bm1hcChwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQlsZW4gLT0gYnl0ZXM7CisJCWJ1ZiArPSBieXRlczsKKwkJYWRkciArPSBieXRlczsKKwl9CisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwltbXB1dChtbSk7CisKKwlyZXR1cm4gYnVmIC0gb2xkX2J1ZjsKK30KZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmMKaW5kZXggMzhmODk2NS4uY2YxOGYwOSAxMDA2NDQKLS0tIGEvbW0vbWVtcG9saWN5LmMKKysrIGIvbW0vbWVtcG9saWN5LmMKQEAgLTExMzYsNyArMTEzNiw5IEBACiAgKi8KIHVuc2lnbmVkIHNsYWJfbm9kZShzdHJ1Y3QgbWVtcG9saWN5ICpwb2xpY3kpCiB7Ci0Jc3dpdGNoIChwb2xpY3ktPnBvbGljeSkgeworCWludCBwb2wgPSBwb2xpY3kgPyBwb2xpY3ktPnBvbGljeSA6IE1QT0xfREVGQVVMVDsKKworCXN3aXRjaCAocG9sKSB7CiAJY2FzZSBNUE9MX0lOVEVSTEVBVkU6CiAJCXJldHVybiBpbnRlcmxlYXZlX25vZGVzKHBvbGljeSk7CiAKZGlmZiAtLWdpdCBhL21tL25vbW11LmMgYi9tbS9ub21tdS5jCmluZGV4IGQ5OWRlYTMuLjU2NDU0MDYgMTAwNjQ0Ci0tLSBhL21tL25vbW11LmMKKysrIGIvbW0vbm9tbXUuYwpAQCAtMTIyLDI2ICsxMjIsNTAgQEAKIH0KIAogLyoKLSAqIFRoZSBub21tdSBkb2RneSB2ZXJzaW9uIDotKQorICogZ2V0IGEgbGlzdCBvZiBwYWdlcyBpbiBhbiBhZGRyZXNzIHJhbmdlIGJlbG9uZ2luZyB0byB0aGUgc3BlY2lmaWVkIHByb2Nlc3MKKyAqIGFuZCBpbmRpY2F0ZSB0aGUgVk1BIHRoYXQgY292ZXJzIGVhY2ggcGFnZQorICogLSB0aGlzIGlzIHBvdGVudGlhbGx5IGRvZGd5IGFzIHdlIG1heSBlbmQgaW5jcmVtZW50aW5nIHRoZSBwYWdlIGNvdW50IG9mIGEKKyAqICAgc2xhYiBwYWdlIG9yIGEgc2Vjb25kYXJ5IHBhZ2UgZnJvbSBhIGNvbXBvdW5kIHBhZ2UKKyAqIC0gZG9uJ3QgcGVybWl0IGFjY2VzcyB0byBWTUFzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCwgc3VjaCBhcyBJL08gbWFwcGluZ3MKICAqLwogaW50IGdldF91c2VyX3BhZ2VzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAl1bnNpZ25lZCBsb25nIHN0YXJ0LCBpbnQgbGVuLCBpbnQgd3JpdGUsIGludCBmb3JjZSwKIAlzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKip2bWFzKQogeworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXVuc2lnbmVkIGxvbmcgdm1fZmxhZ3M7CiAJaW50IGk7Ci0Jc3RhdGljIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCBkdW1teV92bWE7CisKKwkvKiBjYWxjdWxhdGUgcmVxdWlyZWQgcmVhZCBvciB3cml0ZSBwZXJtaXNzaW9ucy4KKwkgKiAtIGlmICdmb3JjZScgaXMgc2V0LCB3ZSBvbmx5IHJlcXVpcmUgdGhlICJNQVkiIGZsYWdzLgorCSAqLworCXZtX2ZsYWdzICA9IHdyaXRlID8gKFZNX1dSSVRFIHwgVk1fTUFZV1JJVEUpIDogKFZNX1JFQUQgfCBWTV9NQVlSRUFEKTsKKwl2bV9mbGFncyAmPSBmb3JjZSA/IChWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUpIDogKFZNX1JFQUQgfCBWTV9XUklURSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJdm1hID0gZmluZF92bWEobW0sIHN0YXJ0KTsKKwkJaWYgKCF2bWEpCisJCQlnb3RvIGZpbmlzaF9vcl9mYXVsdDsKKworCQkvKiBwcm90ZWN0IHdoYXQgd2UgY2FuLCBpbmNsdWRpbmcgY2hhcmRldnMgKi8KKwkJaWYgKHZtYS0+dm1fZmxhZ3MgJiAoVk1fSU8gfCBWTV9QRk5NQVApIHx8CisJCSAgICAhKHZtX2ZsYWdzICYgdm1hLT52bV9mbGFncykpCisJCQlnb3RvIGZpbmlzaF9vcl9mYXVsdDsKKwogCQlpZiAocGFnZXMpIHsKIAkJCXBhZ2VzW2ldID0gdmlydF90b19wYWdlKHN0YXJ0KTsKIAkJCWlmIChwYWdlc1tpXSkKIAkJCQlwYWdlX2NhY2hlX2dldChwYWdlc1tpXSk7CiAJCX0KIAkJaWYgKHZtYXMpCi0JCQl2bWFzW2ldID0gJmR1bW15X3ZtYTsKKwkJCXZtYXNbaV0gPSB2bWE7CiAJCXN0YXJ0ICs9IFBBR0VfU0laRTsKIAl9Ci0JcmV0dXJuKGkpOworCisJcmV0dXJuIGk7CisKK2ZpbmlzaF9vcl9mYXVsdDoKKwlyZXR1cm4gaSA/IDogLUVGQVVMVDsKIH0KIAogRVhQT1JUX1NZTUJPTChnZXRfdXNlcl9wYWdlcyk7CkBAIC0yODYsNiArMzEwLDc3IEBACiB9CiAjZW5kaWYgLyogREVCVUcgKi8KIAorLyoKKyAqIGFkZCBhIFZNQSBpbnRvIGEgcHJvY2VzcydzIG1tX3N0cnVjdCBpbiB0aGUgYXBwcm9wcmlhdGUgcGxhY2UgaW4gdGhlIGxpc3QKKyAqIC0gc2hvdWxkIGJlIGNhbGxlZCB3aXRoIG1tLT5tbWFwX3NlbSBoZWxkIHdyaXRlbG9ja2VkCisgKi8KK3N0YXRpYyB2b2lkIGFkZF92bWFfdG9fbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB2bV9saXN0X3N0cnVjdCAqdm1sKQoreworCXN0cnVjdCB2bV9saXN0X3N0cnVjdCAqKnBwdjsKKworCWZvciAocHB2ID0gJmN1cnJlbnQtPm1tLT5jb250ZXh0LnZtbGlzdDsgKnBwdjsgcHB2ID0gJigqcHB2KS0+bmV4dCkKKwkJaWYgKCgqcHB2KS0+dm1hLT52bV9zdGFydCA+IHZtbC0+dm1hLT52bV9zdGFydCkKKwkJCWJyZWFrOworCisJdm1sLT5uZXh0ID0gKnBwdjsKKwkqcHB2ID0gdm1sOworfQorCisvKgorICogbG9vayB1cCB0aGUgZmlyc3QgVk1BIGluIHdoaWNoIGFkZHIgcmVzaWRlcywgTlVMTCBpZiBub25lCisgKiAtIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBtbS0+bW1hcF9zZW0gYXQgbGVhc3QgaGVsZCByZWFkbG9ja2VkCisgKi8KK3N0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZmluZF92bWEoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QgKmxvb3AsICp2bWw7CisKKwkvKiBzZWFyY2ggdGhlIHZtX3N0YXJ0IG9yZGVyZWQgbGlzdCAqLworCXZtbCA9IE5VTEw7CisJZm9yIChsb29wID0gbW0tPmNvbnRleHQudm1saXN0OyBsb29wOyBsb29wID0gbG9vcC0+bmV4dCkgeworCQlpZiAobG9vcC0+dm1hLT52bV9zdGFydCA+IGFkZHIpCisJCQlicmVhazsKKwkJdm1sID0gbG9vcDsKKwl9CisKKwlpZiAodm1sICYmIHZtbC0+dm1hLT52bV9lbmQgPiBhZGRyKQorCQlyZXR1cm4gdm1sLT52bWE7CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woZmluZF92bWEpOworCisvKgorICogZmluZCBhIFZNQQorICogLSB3ZSBkb24ndCBleHRlbmQgc3RhY2sgVk1BcyB1bmRlciBOT01NVSBjb25kaXRpb25zCisgKi8KK3N0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZmluZF9leHRlbmRfdm1hKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJcmV0dXJuIGZpbmRfdm1hKG1tLCBhZGRyKTsKK30KKworLyoKKyAqIGxvb2sgdXAgdGhlIGZpcnN0IFZNQSBleGFjdGx5IHRoYXQgZXhhY3RseSBtYXRjaGVzIGFkZHIKKyAqIC0gc2hvdWxkIGJlIGNhbGxlZCB3aXRoIG1tLT5tbWFwX3NlbSBhdCBsZWFzdCBoZWxkIHJlYWRsb2NrZWQKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmZpbmRfdm1hX2V4YWN0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QgKnZtbDsKKworCS8qIHNlYXJjaCB0aGUgdm1fc3RhcnQgb3JkZXJlZCBsaXN0ICovCisJZm9yICh2bWwgPSBtbS0+Y29udGV4dC52bWxpc3Q7IHZtbDsgdm1sID0gdm1sLT5uZXh0KSB7CisJCWlmICh2bWwtPnZtYS0+dm1fc3RhcnQgPT0gYWRkcikKKwkJCXJldHVybiB2bWwtPnZtYTsKKwkJaWYgKHZtbC0+dm1hLT52bV9zdGFydCA+IGFkZHIpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIGZpbmQgYSBWTUEgaW4gdGhlIGdsb2JhbCB0cmVlCisgKi8KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpmaW5kX25vbW11X3ZtYSh1bnNpZ25lZCBsb25nIHN0YXJ0KQogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwpAQCAtMzA1LDYgKzQwMCw5IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKKy8qCisgKiBhZGQgYSBWTUEgaW4gdGhlIGdsb2JhbCB0cmVlCisgKi8KIHN0YXRpYyB2b2lkIGFkZF9ub21tdV92bWEoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICpwdm1hOwpAQCAtMzUxLDYgKzQ0OSw5IEBACiAJcmJfaW5zZXJ0X2NvbG9yKCZ2bWEtPnZtX3JiLCAmbm9tbXVfdm1hX3RyZWUpOwogfQogCisvKgorICogZGVsZXRlIGEgVk1BIGZyb20gdGhlIGdsb2JhbCBsaXN0CisgKi8KIHN0YXRpYyB2b2lkIGRlbGV0ZV9ub21tdV92bWEoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CkBAIC04MjgsOCArOTI5LDcgQEAKIAlyZWFsYWxsb2MgKz0ga29ianNpemUodm1sKTsKIAlhc2tlZGFsbG9jICs9IHNpemVvZigqdm1sKTsKIAotCXZtbC0+bmV4dCA9IGN1cnJlbnQtPm1tLT5jb250ZXh0LnZtbGlzdDsKLQljdXJyZW50LT5tbS0+Y29udGV4dC52bWxpc3QgPSB2bWw7CisJYWRkX3ZtYV90b19tbShjdXJyZW50LT5tbSwgdm1sKTsKIAogCXVwX3dyaXRlKCZub21tdV92bWFfc2VtKTsKIApAQCAtOTA4LDYgKzEwMDgsMTEgQEAKIAl9CiB9CiAKKy8qCisgKiByZWxlYXNlIGEgbWFwcGluZworICogLSB1bmRlciBOT01NVSBjb25kaXRpb25zIHRoZSBwYXJhbWV0ZXJzIG11c3QgbWF0Y2ggZXhhY3RseSB0byB0aGUgbWFwcGluZyB0bworICogICBiZSByZW1vdmVkCisgKi8KIGludCBkb19tdW5tYXAoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QgKnZtbCwgKipwYXJlbnQ7CkBAIC05MTcsMTAgKzEwMjIsMTMgQEAKIAlwcmludGsoImRvX211bm1hcDpcbiIpOwogI2VuZGlmCiAKLQlmb3IgKHBhcmVudCA9ICZtbS0+Y29udGV4dC52bWxpc3Q7ICpwYXJlbnQ7IHBhcmVudCA9ICYoKnBhcmVudCktPm5leHQpCisJZm9yIChwYXJlbnQgPSAmbW0tPmNvbnRleHQudm1saXN0OyAqcGFyZW50OyBwYXJlbnQgPSAmKCpwYXJlbnQpLT5uZXh0KSB7CisJCWlmICgoKnBhcmVudCktPnZtYS0+dm1fc3RhcnQgPiBhZGRyKQorCQkJYnJlYWs7CiAJCWlmICgoKnBhcmVudCktPnZtYS0+dm1fc3RhcnQgPT0gYWRkciAmJgogCQkgICAgKChsZW4gPT0gMCkgfHwgKCgqcGFyZW50KS0+dm1hLT52bV9lbmQgPT0gZW5kKSkpCiAJCQlnb3RvIGZvdW5kOworCX0KIAogCXByaW50aygibXVubWFwIG9mIG5vbi1tbWFwZWQgbWVtb3J5IGJ5IHByb2Nlc3MgJWQgKCVzKTogJXBcbiIsCiAJICAgICAgIGN1cnJlbnQtPnBpZCwgY3VycmVudC0+Y29tbSwgKHZvaWQgKikgYWRkcik7CkBAIC05NDYsNyArMTA1NCwyMCBAQAogCXJldHVybiAwOwogfQogCi0vKiBSZWxlYXNlIGFsbCBtbWFwcy4gKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfbXVubWFwKHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90IGxlbikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisKKwlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCXJldCA9IGRvX211bm1hcChtbSwgYWRkciwgbGVuKTsKKwl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmVsZWFzZSBhbGwgbWFwcGluZ3MKKyAqLwogdm9pZCBleGl0X21tYXAoc3RydWN0IG1tX3N0cnVjdCAqIG1tKQogewogCXN0cnVjdCB2bV9saXN0X3N0cnVjdCAqdG1wOwpAQCAtOTczLDM3ICsxMDk0LDI2IEBACiAJfQogfQogCi1hc21saW5rYWdlIGxvbmcgc3lzX211bm1hcCh1bnNpZ25lZCBsb25nIGFkZHIsIHNpemVfdCBsZW4pCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOwotCi0JZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKLQlyZXQgPSBkb19tdW5tYXAobW0sIGFkZHIsIGxlbik7Ci0JdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0JcmV0dXJuIHJldDsKLX0KLQogdW5zaWduZWQgbG9uZyBkb19icmsodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbikKIHsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAogLyoKLSAqIEV4cGFuZCAob3Igc2hyaW5rKSBhbiBleGlzdGluZyBtYXBwaW5nLCBwb3RlbnRpYWxseSBtb3ZpbmcgaXQgYXQgdGhlCi0gKiBzYW1lIHRpbWUgKGNvbnRyb2xsZWQgYnkgdGhlIE1SRU1BUF9NQVlNT1ZFIGZsYWcgYW5kIGF2YWlsYWJsZSBWTSBzcGFjZSkKKyAqIGV4cGFuZCAob3Igc2hyaW5rKSBhbiBleGlzdGluZyBtYXBwaW5nLCBwb3RlbnRpYWxseSBtb3ZpbmcgaXQgYXQgdGhlIHNhbWUKKyAqIHRpbWUgKGNvbnRyb2xsZWQgYnkgdGhlIE1SRU1BUF9NQVlNT1ZFIGZsYWcgYW5kIGF2YWlsYWJsZSBWTSBzcGFjZSkKICAqCi0gKiBNUkVNQVBfRklYRUQgb3B0aW9uIGFkZGVkIDUtRGVjLTE5OTkgYnkgQmVuamFtaW4gTGFIYWlzZQotICogVGhpcyBvcHRpb24gaW1wbGllcyBNUkVNQVBfTUFZTU9WRS4KKyAqIHVuZGVyIE5PTU1VIGNvbmRpdGlvbnMsIHdlIG9ubHkgcGVybWl0IGNoYW5naW5nIGEgbWFwcGluZydzIHNpemUsIGFuZCBvbmx5CisgKiBhcyBsb25nIGFzIGl0IHN0YXlzIHdpdGhpbiB0aGUgaG9sZSBhbGxvY2F0ZWQgYnkgdGhlIGttYWxsb2MoKSBjYWxsIGluCisgKiBkb19tbWFwX3Bnb2ZmKCkgYW5kIHRoZSBibG9jayBpcyBub3Qgc2hhcmVhYmxlCiAgKgotICogb24gdUNsaW51eCwgd2Ugb25seSBwZXJtaXQgY2hhbmdpbmcgYSBtYXBwaW5nJ3Mgc2l6ZSwgYW5kIG9ubHkgYXMgbG9uZyBhcyBpdCBzdGF5cyB3aXRoaW4gdGhlCi0gKiBob2xlIGFsbG9jYXRlZCBieSB0aGUga21hbGxvYygpIGNhbGwgaW4gZG9fbW1hcF9wZ29mZigpIGFuZCB0aGUgYmxvY2sgaXMgbm90IHNoYXJlYWJsZQorICogTVJFTUFQX0ZJWEVEIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgTk9NTVUgY29uZGl0aW9ucwogICovCiB1bnNpZ25lZCBsb25nIGRvX21yZW1hcCh1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQl1bnNpZ25lZCBsb25nIG9sZF9sZW4sIHVuc2lnbmVkIGxvbmcgbmV3X2xlbiwKIAkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbmV3X2FkZHIpCiB7Ci0Jc3RydWN0IHZtX2xpc3Rfc3RydWN0ICp2bWwgPSBOVUxMOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwogCiAJLyogaW5zYW5pdHkgY2hlY2tzIGZpcnN0ICovCiAJaWYgKG5ld19sZW4gPT0gMCkKQEAgLTEwMTIsNTggKzExMjIsNDYgQEAKIAlpZiAoZmxhZ3MgJiBNUkVNQVBfRklYRUQgJiYgbmV3X2FkZHIgIT0gYWRkcikKIAkJcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtRUlOVkFMOwogCi0JZm9yICh2bWwgPSBjdXJyZW50LT5tbS0+Y29udGV4dC52bWxpc3Q7IHZtbDsgdm1sID0gdm1sLT5uZXh0KQotCQlpZiAodm1sLT52bWEtPnZtX3N0YXJ0ID09IGFkZHIpCi0JCQlnb3RvIGZvdW5kOworCXZtYSA9IGZpbmRfdm1hX2V4YWN0KGN1cnJlbnQtPm1tLCBhZGRyKTsKKwlpZiAoIXZtYSkKKwkJcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtRUlOVkFMOwogCi0JcmV0dXJuICh1bnNpZ25lZCBsb25nKSAtRUlOVkFMOwotCi0gZm91bmQ6Ci0JaWYgKHZtbC0+dm1hLT52bV9lbmQgIT0gdm1sLT52bWEtPnZtX3N0YXJ0ICsgb2xkX2xlbikKKwlpZiAodm1hLT52bV9lbmQgIT0gdm1hLT52bV9zdGFydCArIG9sZF9sZW4pCiAJCXJldHVybiAodW5zaWduZWQgbG9uZykgLUVGQVVMVDsKIAotCWlmICh2bWwtPnZtYS0+dm1fZmxhZ3MgJiBWTV9NQVlTSEFSRSkKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKQogCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC1FUEVSTTsKIAogCWlmIChuZXdfbGVuID4ga29ianNpemUoKHZvaWQgKikgYWRkcikpCiAJCXJldHVybiAodW5zaWduZWQgbG9uZykgLUVOT01FTTsKIAogCS8qIGFsbCBjaGVja3MgY29tcGxldGUgLSBkbyBpdCAqLwotCXZtbC0+dm1hLT52bV9lbmQgPSB2bWwtPnZtYS0+dm1fc3RhcnQgKyBuZXdfbGVuOworCXZtYS0+dm1fZW5kID0gdm1hLT52bV9zdGFydCArIG5ld19sZW47CiAKIAlhc2tlZGFsbG9jIC09IG9sZF9sZW47CiAJYXNrZWRhbGxvYyArPSBuZXdfbGVuOwogCi0JcmV0dXJuIHZtbC0+dm1hLT52bV9zdGFydDsKKwlyZXR1cm4gdm1hLT52bV9zdGFydDsKIH0KIAotLyoKLSAqIExvb2sgdXAgdGhlIGZpcnN0IFZNQSB3aGljaCBzYXRpc2ZpZXMgIGFkZHIgPCB2bV9lbmQsICBOVUxMIGlmIG5vbmUKLSAqLwotc3RydWN0IHZtX2FyZWFfc3RydWN0ICpmaW5kX3ZtYShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQorYXNtbGlua2FnZSB1bnNpZ25lZCBsb25nIHN5c19tcmVtYXAodW5zaWduZWQgbG9uZyBhZGRyLAorCXVuc2lnbmVkIGxvbmcgb2xkX2xlbiwgdW5zaWduZWQgbG9uZyBuZXdfbGVuLAorCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgbmV3X2FkZHIpCiB7Ci0Jc3RydWN0IHZtX2xpc3Rfc3RydWN0ICp2bWw7CisJdW5zaWduZWQgbG9uZyByZXQ7CiAKLQlmb3IgKHZtbCA9IG1tLT5jb250ZXh0LnZtbGlzdDsgdm1sOyB2bWwgPSB2bWwtPm5leHQpCi0JCWlmIChhZGRyID49IHZtbC0+dm1hLT52bV9zdGFydCAmJiBhZGRyIDwgdm1sLT52bWEtPnZtX2VuZCkKLQkJCXJldHVybiB2bWwtPnZtYTsKLQotCXJldHVybiBOVUxMOworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJcmV0ID0gZG9fbXJlbWFwKGFkZHIsIG9sZF9sZW4sIG5ld19sZW4sIGZsYWdzLCBuZXdfYWRkcik7CisJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIHJldDsKIH0KIAotRVhQT1JUX1NZTUJPTChmaW5kX3ZtYSk7Ci0KIHN0cnVjdCBwYWdlICpmb2xsb3dfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQkJdW5zaWduZWQgaW50IGZvbGxfZmxhZ3MpCiB7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZmluZF9leHRlbmRfdm1hKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KIGludCByZW1hcF9wZm5fcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgZnJvbSwKIAkJdW5zaWduZWQgbG9uZyB0bywgdW5zaWduZWQgbG9uZyBzaXplLCBwZ3Byb3RfdCBwcm90KQogewpAQCAtMTIwNiwzICsxMzA0LDQ0IEBACiAJQlVHKCk7CiAJcmV0dXJuIE5VTEw7CiB9CisKKy8qCisgKiBBY2Nlc3MgYW5vdGhlciBwcm9jZXNzJyBhZGRyZXNzIHNwYWNlLgorICogLSBzb3VyY2UvdGFyZ2V0IGJ1ZmZlciBtdXN0IGJlIGtlcm5lbCBzcGFjZQorICovCitpbnQgYWNjZXNzX3Byb2Nlc3Nfdm0oc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgYWRkciwgdm9pZCAqYnVmLCBpbnQgbGVuLCBpbnQgd3JpdGUpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisKKwlpZiAoYWRkciArIGxlbiA8IGFkZHIpCisJCXJldHVybiAwOworCisJbW0gPSBnZXRfdGFza19tbSh0c2spOworCWlmICghbW0pCisJCXJldHVybiAwOworCisJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCisJLyogdGhlIGFjY2VzcyBtdXN0IHN0YXJ0IHdpdGhpbiBvbmUgb2YgdGhlIHRhcmdldCBwcm9jZXNzJ3MgbWFwcGluZ3MgKi8KKwl2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7CisJaWYgKHZtYSkgeworCQkvKiBkb24ndCBvdmVycnVuIHRoaXMgbWFwcGluZyAqLworCQlpZiAoYWRkciArIGxlbiA+PSB2bWEtPnZtX2VuZCkKKwkJCWxlbiA9IHZtYS0+dm1fZW5kIC0gYWRkcjsKKworCQkvKiBvbmx5IHJlYWQgb3Igd3JpdGUgbWFwcGluZ3Mgd2hlcmUgaXQgaXMgcGVybWl0dGVkICovCisJCWlmICh3cml0ZSAmJiB2bWEtPnZtX2ZsYWdzICYgVk1fTUFZV1JJVEUpCisJCQlsZW4gLT0gY29weV90b191c2VyKCh2b2lkICopIGFkZHIsIGJ1ZiwgbGVuKTsKKwkJZWxzZSBpZiAoIXdyaXRlICYmIHZtYS0+dm1fZmxhZ3MgJiBWTV9NQVlSRUFEKQorCQkJbGVuIC09IGNvcHlfZnJvbV91c2VyKGJ1ZiwgKHZvaWQgKikgYWRkciwgbGVuKTsKKwkJZWxzZQorCQkJbGVuID0gMDsKKwl9IGVsc2UgeworCQlsZW4gPSAwOworCX0KKworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJbW1wdXQobW0pOworCXJldHVybiBsZW47Cit9CmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmMgYi9tbS9wYWdlX2FsbG9jLmMKaW5kZXggOTgxMGYwYS4uNGY1OWQ5MCAxMDA2NDQKLS0tIGEvbW0vcGFnZV9hbGxvYy5jCisrKyBiL21tL3BhZ2VfYWxsb2MuYwpAQCAtMzcsNiArMzcsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9zdG9wX21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGZuLmg+CiAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KQEAgLTEwMiw2ICsxMDQsMzggQEAKIAogdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIG5yX2tlcm5lbF9wYWdlczsKIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBucl9hbGxfcGFnZXM7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIGRtYV9yZXNlcnZlOworCisjaWZkZWYgQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQCisgIC8qCisgICAqIE1BWF9BQ1RJVkVfUkVHSU9OUyBkZXRlcm1pbmVzIHRoZSBtYXhtaW11bSBudW1iZXIgb2YgZGlzdGluY3QKKyAgICogcmFuZ2VzIG9mIG1lbW9yeSAoUkFNKSB0aGF0IG1heSBiZSByZWdpc3RlcmVkIHdpdGggYWRkX2FjdGl2ZV9yYW5nZSgpLgorICAgKiBSYW5nZXMgcGFzc2VkIHRvIGFkZF9hY3RpdmVfcmFuZ2UoKSB3aWxsIGJlIG1lcmdlZCBpZiBwb3NzaWJsZQorICAgKiBzbyB0aGUgbnVtYmVyIG9mIHRpbWVzIGFkZF9hY3RpdmVfcmFuZ2UoKSBjYW4gYmUgY2FsbGVkIGlzCisgICAqIHJlbGF0ZWQgdG8gdGhlIG51bWJlciBvZiBub2RlcyBhbmQgdGhlIG51bWJlciBvZiBob2xlcworICAgKi8KKyAgI2lmZGVmIENPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlMKKyAgICAvKiBBbGxvdyBhbiBhcmNoaXRlY3R1cmUgdG8gc2V0IE1BWF9BQ1RJVkVfUkVHSU9OUyB0byBzYXZlIG1lbW9yeSAqLworICAgICNkZWZpbmUgTUFYX0FDVElWRV9SRUdJT05TIENPTkZJR19NQVhfQUNUSVZFX1JFR0lPTlMKKyAgI2Vsc2UKKyAgICAjaWYgTUFYX05VTU5PREVTID49IDMyCisgICAgICAvKiBJZiB0aGVyZSBjYW4gYmUgbWFueSBub2RlcywgYWxsb3cgdXAgdG8gNTAgaG9sZXMgcGVyIG5vZGUgKi8KKyAgICAgICNkZWZpbmUgTUFYX0FDVElWRV9SRUdJT05TIChNQVhfTlVNTk9ERVMqNTApCisgICAgI2Vsc2UKKyAgICAgIC8qIEJ5IGRlZmF1bHQsIGFsbG93IHVwIHRvIDI1NiBkaXN0aW5jdCByZWdpb25zICovCisgICAgICAjZGVmaW5lIE1BWF9BQ1RJVkVfUkVHSU9OUyAyNTYKKyAgICAjZW5kaWYKKyAgI2VuZGlmCisKKyAgc3RydWN0IG5vZGVfYWN0aXZlX3JlZ2lvbiBfX2luaXRkYXRhIGVhcmx5X25vZGVfbWFwW01BWF9BQ1RJVkVfUkVHSU9OU107CisgIGludCBfX2luaXRkYXRhIG5yX25vZGVtYXBfZW50cmllczsKKyAgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIGFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW01BWF9OUl9aT05FU107CisgIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5bTUFYX05SX1pPTkVTXTsKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfUkVTRVJWRQorICB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgbm9kZV9ib3VuZGFyeV9zdGFydF9wZm5bTUFYX05VTU5PREVTXTsKKyAgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIG5vZGVfYm91bmRhcnlfZW5kX3BmbltNQVhfTlVNTk9ERVNdOworI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUExVR19SRVNFUlZFICovCisjZW5kaWYgLyogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQICovCiAKICNpZmRlZiBDT05GSUdfREVCVUdfVk0KIHN0YXRpYyBpbnQgcGFnZV9vdXRzaWRlX3pvbmVfYm91bmRhcmllcyhzdHJ1Y3Qgem9uZSAqem9uZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCkBAIC05MDgsNyArOTQyLDcgQEAKIAkgKi8KIAlkbyB7CiAJCXpvbmUgPSAqejsKLQkJaWYgKHVubGlrZWx5KChnZnBfbWFzayAmIF9fR0ZQX1RISVNOT0RFKSAmJgorCQlpZiAodW5saWtlbHkoTlVNQV9CVUlMRCAmJiAoZ2ZwX21hc2sgJiBfX0dGUF9USElTTk9ERSkgJiYKIAkJCXpvbmUtPnpvbmVfcGdkYXQgIT0gem9uZWxpc3QtPnpvbmVzWzBdLT56b25lX3BnZGF0KSkKIAkJCQlicmVhazsKIAkJaWYgKChhbGxvY19mbGFncyAmIEFMTE9DX0NQVVNFVCkgJiYKQEAgLTEyMjIsMTQgKzEyNTYsMTIgQEAKIHsKIAlyZXR1cm4gbnJfZnJlZV96b25lX3BhZ2VzKGdmcF96b25lKEdGUF9ISUdIVVNFUikpOwogfQotI2lmZGVmIENPTkZJR19OVU1BCi1zdGF0aWMgdm9pZCBzaG93X25vZGUoc3RydWN0IHpvbmUgKnpvbmUpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaG93X25vZGUoc3RydWN0IHpvbmUgKnpvbmUpCiB7Ci0JcHJpbnRrKCJOb2RlICVsZCAiLCB6b25lX3RvX25pZCh6b25lKSk7CisJaWYgKE5VTUFfQlVJTEQpCisJCXByaW50aygiTm9kZSAlbGQgIiwgem9uZV90b19uaWQoem9uZSkpOwogfQotI2Vsc2UKLSNkZWZpbmUgc2hvd19ub2RlKHpvbmUpCWRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgogCiB2b2lkIHNpX21lbWluZm8oc3RydWN0IHN5c2luZm8gKnZhbCkKIHsKQEAgLTEyNzEsMzQgKzEzMDMsMzAgQEAKICAqLwogdm9pZCBzaG93X2ZyZWVfYXJlYXModm9pZCkKIHsKLQlpbnQgY3B1LCB0ZW1wZXJhdHVyZTsKKwlpbnQgY3B1OwogCXVuc2lnbmVkIGxvbmcgYWN0aXZlOwogCXVuc2lnbmVkIGxvbmcgaW5hY3RpdmU7CiAJdW5zaWduZWQgbG9uZyBmcmVlOwogCXN0cnVjdCB6b25lICp6b25lOwogCiAJZm9yX2VhY2hfem9uZSh6b25lKSB7Ci0JCXNob3dfbm9kZSh6b25lKTsKLQkJcHJpbnRrKCIlcyBwZXItY3B1OiIsIHpvbmUtPm5hbWUpOwotCi0JCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpIHsKLQkJCXByaW50aygiIGVtcHR5XG4iKTsKKwkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKIAkJCWNvbnRpbnVlOwotCQl9IGVsc2UKLQkJCXByaW50aygiXG4iKTsKKworCQlzaG93X25vZGUoem9uZSk7CisJCXByaW50aygiJXMgcGVyLWNwdTpcbiIsIHpvbmUtPm5hbWUpOwogCiAJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCQlzdHJ1Y3QgcGVyX2NwdV9wYWdlc2V0ICpwYWdlc2V0OwogCiAJCQlwYWdlc2V0ID0gem9uZV9wY3Aoem9uZSwgY3B1KTsKIAotCQkJZm9yICh0ZW1wZXJhdHVyZSA9IDA7IHRlbXBlcmF0dXJlIDwgMjsgdGVtcGVyYXR1cmUrKykKLQkJCQlwcmludGsoImNwdSAlZCAlczogaGlnaCAlZCwgYmF0Y2ggJWQgdXNlZDolZFxuIiwKLQkJCQkJY3B1LAotCQkJCQl0ZW1wZXJhdHVyZSA/ICJjb2xkIiA6ICJob3QiLAotCQkJCQlwYWdlc2V0LT5wY3BbdGVtcGVyYXR1cmVdLmhpZ2gsCi0JCQkJCXBhZ2VzZXQtPnBjcFt0ZW1wZXJhdHVyZV0uYmF0Y2gsCi0JCQkJCXBhZ2VzZXQtPnBjcFt0ZW1wZXJhdHVyZV0uY291bnQpOworCQkJcHJpbnRrKCJDUFUgJTRkOiBIb3Q6IGhpOiU1ZCwgYnRjaDolNGQgdXNkOiU0ZCAgICIKKwkJCSAgICAgICAiQ29sZDogaGk6JTVkLCBidGNoOiU0ZCB1c2Q6JTRkXG4iLAorCQkJICAgICAgIGNwdSwgcGFnZXNldC0+cGNwWzBdLmhpZ2gsCisJCQkgICAgICAgcGFnZXNldC0+cGNwWzBdLmJhdGNoLCBwYWdlc2V0LT5wY3BbMF0uY291bnQsCisJCQkgICAgICAgcGFnZXNldC0+cGNwWzFdLmhpZ2gsIHBhZ2VzZXQtPnBjcFsxXS5iYXRjaCwKKwkJCSAgICAgICBwYWdlc2V0LT5wY3BbMV0uY291bnQpOwogCQl9CiAJfQogCkBAIC0xMzIwLDYgKzEzNDgsOSBAQAogCWZvcl9lYWNoX3pvbmUoem9uZSkgewogCQlpbnQgaTsKIAorCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQorCQkJY29udGludWU7CisKIAkJc2hvd19ub2RlKHpvbmUpOwogCQlwcmludGsoIiVzIgogCQkJIiBmcmVlOiVsdWtCIgpAQCAtMTM1MiwxMiArMTM4MywxMSBAQAogCWZvcl9lYWNoX3pvbmUoem9uZSkgewogIAkJdW5zaWduZWQgbG9uZyBucltNQVhfT1JERVJdLCBmbGFncywgb3JkZXIsIHRvdGFsID0gMDsKIAorCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQorCQkJY29udGludWU7CisKIAkJc2hvd19ub2RlKHpvbmUpOwogCQlwcmludGsoIiVzOiAiLCB6b25lLT5uYW1lKTsKLQkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkgewotCQkJcHJpbnRrKCJlbXB0eVxuIik7Ci0JCQljb250aW51ZTsKLQkJfQogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ6b25lLT5sb2NrLCBmbGFncyk7CiAJCWZvciAob3JkZXIgPSAwOyBvcmRlciA8IE1BWF9PUkRFUjsgb3JkZXIrKykgewpAQCAtMTU2MSw3ICsxNTkxLDcgQEAKIHZvaWQgX19tZW1pbml0IGJ1aWxkX2FsbF96b25lbGlzdHModm9pZCkKIHsKIAlpZiAoc3lzdGVtX3N0YXRlID09IFNZU1RFTV9CT09USU5HKSB7Ci0JCV9fYnVpbGRfYWxsX3pvbmVsaXN0cygwKTsKKwkJX19idWlsZF9hbGxfem9uZWxpc3RzKE5VTEwpOwogCQljcHVzZXRfaW5pdF9jdXJyZW50X21lbXNfYWxsb3dlZCgpOwogCX0gZWxzZSB7CiAJCS8qIHdlIGhhdmUgdG8gc3RvcCBhbGwgY3B1cyB0byBndWFyYW5udGVlIHRoZXJlIGlzIG5vIHVzZXIKQEAgLTE2NDIsMjUgKzE2NzIsNiBAQAogCiAjZGVmaW5lIExPTkdfQUxJR04oeCkgKCgoeCkrKHNpemVvZihsb25nKSktMSkmfigoc2l6ZW9mKGxvbmcpKS0xKSkKIAotc3RhdGljIHZvaWQgX19pbml0IGNhbGN1bGF0ZV96b25lX3RvdGFscGFnZXMoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCwKLQkJdW5zaWduZWQgbG9uZyAqem9uZXNfc2l6ZSwgdW5zaWduZWQgbG9uZyAqemhvbGVzX3NpemUpCi17Ci0JdW5zaWduZWQgbG9uZyByZWFsdG90YWxwYWdlcywgdG90YWxwYWdlcyA9IDA7Ci0JZW51bSB6b25lX3R5cGUgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykKLQkJdG90YWxwYWdlcyArPSB6b25lc19zaXplW2ldOwotCXBnZGF0LT5ub2RlX3NwYW5uZWRfcGFnZXMgPSB0b3RhbHBhZ2VzOwotCi0JcmVhbHRvdGFscGFnZXMgPSB0b3RhbHBhZ2VzOwotCWlmICh6aG9sZXNfc2l6ZSkKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKQotCQkJcmVhbHRvdGFscGFnZXMgLT0gemhvbGVzX3NpemVbaV07Ci0JcGdkYXQtPm5vZGVfcHJlc2VudF9wYWdlcyA9IHJlYWx0b3RhbHBhZ2VzOwotCXByaW50ayhLRVJOX0RFQlVHICJPbiBub2RlICVkIHRvdGFscGFnZXM6ICVsdVxuIiwgcGdkYXQtPm5vZGVfaWQsIHJlYWx0b3RhbHBhZ2VzKTsKLX0KLQotCiAvKgogICogSW5pdGlhbGx5IGFsbCBwYWdlcyBhcmUgcmVzZXJ2ZWQgLSBmcmVlIG9uZXMgYXJlIGZyZWVkCiAgKiB1cCBieSBmcmVlX2FsbF9ib290bWVtKCkgb25jZSB0aGUgZWFybHkgYm9vdCBwcm9jZXNzIGlzCkBAIC0xODE4LDYgKzE4MjksOSBAQAogCiAJZm9yX2VhY2hfem9uZSh6b25lKSB7CiAKKwkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKKwkJCWNvbnRpbnVlOworCiAJCXpvbmVfcGNwKHpvbmUsIGNwdSkgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBwZXJfY3B1X3BhZ2VzZXQpLAogCQkJCQkgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoY3B1KSk7CiAJCWlmICghem9uZV9wY3Aoem9uZSwgY3B1KSkKQEAgLTE5NzcsNiArMTk5MSwzNjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUAorLyoKKyAqIEJhc2ljIGl0ZXJhdG9yIHN1cHBvcnQuIFJldHVybiB0aGUgZmlyc3QgcmFuZ2Ugb2YgUEZOcyBmb3IgYSBub2RlCisgKiBOb3RlOiBuaWQgPT0gTUFYX05VTU5PREVTIHJldHVybnMgZmlyc3QgcmVnaW9uIHJlZ2FyZGxlc3Mgb2Ygbm9kZQorICovCitzdGF0aWMgaW50IF9faW5pdCBmaXJzdF9hY3RpdmVfcmVnaW9uX2luZGV4X2luX25pZChpbnQgbmlkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX25vZGVtYXBfZW50cmllczsgaSsrKQorCQlpZiAobmlkID09IE1BWF9OVU1OT0RFUyB8fCBlYXJseV9ub2RlX21hcFtpXS5uaWQgPT0gbmlkKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBCYXNpYyBpdGVyYXRvciBzdXBwb3J0LiBSZXR1cm4gdGhlIG5leHQgYWN0aXZlIHJhbmdlIG9mIFBGTnMgZm9yIGEgbm9kZQorICogTm90ZTogbmlkID09IE1BWF9OVU1OT0RFUyByZXR1cm5zIG5leHQgcmVnaW9uIHJlZ2FyZGxlcyBvZiBub2RlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG5leHRfYWN0aXZlX3JlZ2lvbl9pbmRleF9pbl9uaWQoaW50IGluZGV4LCBpbnQgbmlkKQoreworCWZvciAoaW5kZXggPSBpbmRleCArIDE7IGluZGV4IDwgbnJfbm9kZW1hcF9lbnRyaWVzOyBpbmRleCsrKQorCQlpZiAobmlkID09IE1BWF9OVU1OT0RFUyB8fCBlYXJseV9ub2RlX21hcFtpbmRleF0ubmlkID09IG5pZCkKKwkJCXJldHVybiBpbmRleDsKKworCXJldHVybiAtMTsKK30KKworI2lmbmRlZiBDT05GSUdfSEFWRV9BUkNIX0VBUkxZX1BGTl9UT19OSUQKKy8qCisgKiBSZXF1aXJlZCBieSBTUEFSU0VNRU0uIEdpdmVuIGEgUEZOLCByZXR1cm4gd2hhdCBub2RlIHRoZSBQRk4gaXMgb24uCisgKiBBcmNoaXRlY3R1cmVzIG1heSBpbXBsZW1lbnQgdGhlaXIgb3duIHZlcnNpb24gYnV0IGlmIGFkZF9hY3RpdmVfcmFuZ2UoKQorICogd2FzIHVzZWQgYW5kIHRoZXJlIGFyZSBubyBzcGVjaWFsIHJlcXVpcmVtZW50cywgdGhpcyBpcyBhIGNvbnZlbmllbnQKKyAqIGFsdGVybmF0aXZlCisgKi8KK2ludCBfX2luaXQgZWFybHlfcGZuX3RvX25pZCh1bnNpZ25lZCBsb25nIHBmbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9ub2RlbWFwX2VudHJpZXM7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiA9IGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbjsKKwkJdW5zaWduZWQgbG9uZyBlbmRfcGZuID0gZWFybHlfbm9kZV9tYXBbaV0uZW5kX3BmbjsKKworCQlpZiAoc3RhcnRfcGZuIDw9IHBmbiAmJiBwZm4gPCBlbmRfcGZuKQorCQkJcmV0dXJuIGVhcmx5X25vZGVfbWFwW2ldLm5pZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfSEFWRV9BUkNIX0VBUkxZX1BGTl9UT19OSUQgKi8KKworLyogQmFzaWMgaXRlcmF0b3Igc3VwcG9ydCB0byB3YWxrIGVhcmx5X25vZGVfbWFwW10gKi8KKyNkZWZpbmUgZm9yX2VhY2hfYWN0aXZlX3JhbmdlX2luZGV4X2luX25pZChpLCBuaWQpIFwKKwlmb3IgKGkgPSBmaXJzdF9hY3RpdmVfcmVnaW9uX2luZGV4X2luX25pZChuaWQpOyBpICE9IC0xOyBcCisJCQkJaSA9IG5leHRfYWN0aXZlX3JlZ2lvbl9pbmRleF9pbl9uaWQoaSwgbmlkKSkKKworLyoqCisgKiBmcmVlX2Jvb3RtZW1fd2l0aF9hY3RpdmVfcmVnaW9ucyAtIENhbGwgZnJlZV9ib290bWVtX25vZGUgZm9yIGVhY2ggYWN0aXZlIHJhbmdlCisgKiBAbmlkOiBUaGUgbm9kZSB0byBmcmVlIG1lbW9yeSBvbi4gSWYgTUFYX05VTU5PREVTLCBhbGwgbm9kZXMgYXJlIGZyZWVkCisgKiBAbWF4X2xvd19wZm46IFRoZSBoaWdoZXN0IFBGTiB0aGF0IHRpbGwgYmUgcGFzc2VkIHRvIGZyZWVfYm9vdG1lbV9ub2RlCisgKgorICogSWYgYW4gYXJjaGl0ZWN0dXJlIGd1YXJhbnRlZXMgdGhhdCBhbGwgcmFuZ2VzIHJlZ2lzdGVyZWQgd2l0aAorICogYWRkX2FjdGl2ZV9yYW5nZXMoKSBjb250YWluIG5vIGhvbGVzIGFuZCBtYXkgYmUgZnJlZWQsIHRoaXMKKyAqIHRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgaW5zdGVhZCBvZiBjYWxsaW5nIGZyZWVfYm9vdG1lbSgpIG1hbnVhbGx5LgorICovCit2b2lkIF9faW5pdCBmcmVlX2Jvb3RtZW1fd2l0aF9hY3RpdmVfcmVnaW9ucyhpbnQgbmlkLAorCQkJCQkJdW5zaWduZWQgbG9uZyBtYXhfbG93X3BmbikKK3sKKwlpbnQgaTsKKworCWZvcl9lYWNoX2FjdGl2ZV9yYW5nZV9pbmRleF9pbl9uaWQoaSwgbmlkKSB7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZV9wYWdlcyA9IDA7CisJCXVuc2lnbmVkIGxvbmcgZW5kX3BmbiA9IGVhcmx5X25vZGVfbWFwW2ldLmVuZF9wZm47CisKKwkJaWYgKGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiA+PSBtYXhfbG93X3BmbikKKwkJCWNvbnRpbnVlOworCisJCWlmIChlbmRfcGZuID4gbWF4X2xvd19wZm4pCisJCQllbmRfcGZuID0gbWF4X2xvd19wZm47CisKKwkJc2l6ZV9wYWdlcyA9IGVuZF9wZm4gLSBlYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm47CisJCWZyZWVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShlYXJseV9ub2RlX21hcFtpXS5uaWQpLAorCQkJCVBGTl9QSFlTKGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiksCisJCQkJc2l6ZV9wYWdlcyA8PCBQQUdFX1NISUZUKTsKKwl9Cit9CisKKy8qKgorICogc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMgLSBDYWxsIG1lbW9yeV9wcmVzZW50IGZvciBlYWNoIGFjdGl2ZSByYW5nZQorICogQG5pZDogVGhlIG5vZGUgdG8gY2FsbCBtZW1vcnlfcHJlc2VudCBmb3IuIElmIE1BWF9OVU1OT0RFUywgYWxsIG5vZGVzIHdpbGwgYmUgdXNlZAorICoKKyAqIElmIGFuIGFyY2hpdGVjdHVyZSBndWFyYW50ZWVzIHRoYXQgYWxsIHJhbmdlcyByZWdpc3RlcmVkIHdpdGgKKyAqIGFkZF9hY3RpdmVfcmFuZ2VzKCkgY29udGFpbiBubyBob2xlcyBhbmQgbWF5IGJlIGZyZWVkLCB0aGlzCisgKiB0aGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIGluc3RlYWQgb2YgY2FsbGluZyBtZW1vcnlfcHJlc2VudCgpIG1hbnVhbGx5LgorICovCit2b2lkIF9faW5pdCBzcGFyc2VfbWVtb3J5X3ByZXNlbnRfd2l0aF9hY3RpdmVfcmVnaW9ucyhpbnQgbmlkKQoreworCWludCBpOworCisJZm9yX2VhY2hfYWN0aXZlX3JhbmdlX2luZGV4X2luX25pZChpLCBuaWQpCisJCW1lbW9yeV9wcmVzZW50KGVhcmx5X25vZGVfbWFwW2ldLm5pZCwKKwkJCQllYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm4sCisJCQkJZWFybHlfbm9kZV9tYXBbaV0uZW5kX3Bmbik7Cit9CisKKy8qKgorICogcHVzaF9ub2RlX2JvdW5kYXJpZXMgLSBQdXNoIG5vZGUgYm91bmRhcmllcyB0byBhdCBsZWFzdCB0aGUgcmVxdWVzdGVkIGJvdW5kYXJ5CisgKiBAbmlkOiBUaGUgbmlkIG9mIHRoZSBub2RlIHRvIHB1c2ggdGhlIGJvdW5kYXJ5IGZvcgorICogQHN0YXJ0X3BmbjogVGhlIHN0YXJ0IHBmbiBvZiB0aGUgbm9kZQorICogQGVuZF9wZm46IFRoZSBlbmQgcGZuIG9mIHRoZSBub2RlCisgKgorICogSW4gcmVzZXJ2ZS1iYXNlZCBob3QtYWRkLCBtZW1fbWFwIGlzIGFsbG9jYXRlZCB0aGF0IGlzIHVudXNlZCB1bnRpbCBob3RhZGQKKyAqIHRpbWUuIFNwZWNpZmljYWxseSwgb24geDg2XzY0LCBTUkFUIHdpbGwgcmVwb3J0IHJhbmdlcyB0aGF0IGNhbiBwb3RlbnRpYWxseQorICogYmUgaG90cGx1Z2dlZCBldmVuIHRob3VnaCBubyBwaHlzaWNhbCBtZW1vcnkgZXhpc3RzLiBUaGlzIGZ1bmN0aW9uIGFsbG93cworICogYW4gYXJjaCB0byBwdXNoIG91dCB0aGUgbm9kZSBib3VuZGFyaWVzIHNvIG1lbV9tYXAgaXMgYWxsb2NhdGVkIHRoYXQgY2FuCisgKiBiZSB1c2VkIGxhdGVyLgorICovCisjaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHX1JFU0VSVkUKK3ZvaWQgX19pbml0IHB1c2hfbm9kZV9ib3VuZGFyaWVzKHVuc2lnbmVkIGludCBuaWQsCisJCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIkVudGVyaW5nIHB1c2hfbm9kZV9ib3VuZGFyaWVzKCV1LCAlbHUsICVsdSlcbiIsCisJCQluaWQsIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CisKKwkvKiBJbml0aWFsaXNlIHRoZSBib3VuZGFyeSBmb3IgdGhpcyBub2RlIGlmIG5lY2Vzc2FyeSAqLworCWlmIChub2RlX2JvdW5kYXJ5X2VuZF9wZm5bbmlkXSA9PSAwKQorCQlub2RlX2JvdW5kYXJ5X3N0YXJ0X3BmbltuaWRdID0gLTFVTDsKKworCS8qIFVwZGF0ZSB0aGUgYm91bmRhcmllcyAqLworCWlmIChub2RlX2JvdW5kYXJ5X3N0YXJ0X3BmbltuaWRdID4gc3RhcnRfcGZuKQorCQlub2RlX2JvdW5kYXJ5X3N0YXJ0X3BmbltuaWRdID0gc3RhcnRfcGZuOworCWlmIChub2RlX2JvdW5kYXJ5X2VuZF9wZm5bbmlkXSA8IGVuZF9wZm4pCisJCW5vZGVfYm91bmRhcnlfZW5kX3BmbltuaWRdID0gZW5kX3BmbjsKK30KKworLyogSWYgbmVjZXNzYXJ5LCBwdXNoIHRoZSBub2RlIGJvdW5kYXJ5IG91dCBmb3IgcmVzZXJ2ZSBob3RhZGQgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBhY2NvdW50X25vZGVfYm91bmRhcnkodW5zaWduZWQgaW50IG5pZCwKKwkJdW5zaWduZWQgbG9uZyAqc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nICplbmRfcGZuKQoreworCXByaW50ayhLRVJOX0RFQlVHICJFbnRlcmluZyBhY2NvdW50X25vZGVfYm91bmRhcnkoJXUsICVsdSwgJWx1KVxuIiwKKwkJCW5pZCwgKnN0YXJ0X3BmbiwgKmVuZF9wZm4pOworCisJLyogUmV0dXJuIGlmIGJvdW5kYXJ5IGluZm9ybWF0aW9uIGhhcyBub3QgYmVlbiBwcm92aWRlZCAqLworCWlmIChub2RlX2JvdW5kYXJ5X2VuZF9wZm5bbmlkXSA9PSAwKQorCQlyZXR1cm47CisKKwkvKiBDaGVjayB0aGUgYm91bmRhcmllcyBhbmQgdXBkYXRlIGlmIG5lY2Vzc2FyeSAqLworCWlmIChub2RlX2JvdW5kYXJ5X3N0YXJ0X3BmbltuaWRdIDwgKnN0YXJ0X3BmbikKKwkJKnN0YXJ0X3BmbiA9IG5vZGVfYm91bmRhcnlfc3RhcnRfcGZuW25pZF07CisJaWYgKG5vZGVfYm91bmRhcnlfZW5kX3BmbltuaWRdID4gKmVuZF9wZm4pCisJCSplbmRfcGZuID0gbm9kZV9ib3VuZGFyeV9lbmRfcGZuW25pZF07Cit9CisjZWxzZQordm9pZCBfX2luaXQgcHVzaF9ub2RlX2JvdW5kYXJpZXModW5zaWduZWQgaW50IG5pZCwKKwkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbikge30KKworc3RhdGljIHZvaWQgX19pbml0IGFjY291bnRfbm9kZV9ib3VuZGFyeSh1bnNpZ25lZCBpbnQgbmlkLAorCQl1bnNpZ25lZCBsb25nICpzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgKmVuZF9wZm4pIHt9CisjZW5kaWYKKworCisvKioKKyAqIGdldF9wZm5fcmFuZ2VfZm9yX25pZCAtIFJldHVybiB0aGUgc3RhcnQgYW5kIGVuZCBwYWdlIGZyYW1lcyBmb3IgYSBub2RlCisgKiBAbmlkOiBUaGUgbmlkIHRvIHJldHVybiB0aGUgcmFuZ2UgZm9yLiBJZiBNQVhfTlVNTk9ERVMsIHRoZSBtaW4gYW5kIG1heCBQRk4gYXJlIHJldHVybmVkCisgKiBAc3RhcnRfcGZuOiBQYXNzZWQgYnkgcmVmZXJlbmNlLiBPbiByZXR1cm4sIGl0IHdpbGwgaGF2ZSB0aGUgbm9kZSBzdGFydF9wZm4KKyAqIEBlbmRfcGZuOiBQYXNzZWQgYnkgcmVmZXJlbmNlLiBPbiByZXR1cm4sIGl0IHdpbGwgaGF2ZSB0aGUgbm9kZSBlbmRfcGZuCisgKgorICogSXQgcmV0dXJucyB0aGUgc3RhcnQgYW5kIGVuZCBwYWdlIGZyYW1lIG9mIGEgbm9kZSBiYXNlZCBvbiBpbmZvcm1hdGlvbgorICogcHJvdmlkZWQgYnkgYW4gYXJjaCBjYWxsaW5nIGFkZF9hY3RpdmVfcmFuZ2UoKS4gSWYgY2FsbGVkIGZvciBhIG5vZGUKKyAqIHdpdGggbm8gYXZhaWxhYmxlIG1lbW9yeSwgYSB3YXJuaW5nIGlzIHByaW50ZWQgYW5kIHRoZSBzdGFydCBhbmQgZW5kCisgKiBQRk5zIHdpbGwgYmUgMAorICovCit2b2lkIF9faW5pdCBnZXRfcGZuX3JhbmdlX2Zvcl9uaWQodW5zaWduZWQgaW50IG5pZCwKKwkJCXVuc2lnbmVkIGxvbmcgKnN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyAqZW5kX3BmbikKK3sKKwlpbnQgaTsKKwkqc3RhcnRfcGZuID0gLTFVTDsKKwkqZW5kX3BmbiA9IDA7CisKKwlmb3JfZWFjaF9hY3RpdmVfcmFuZ2VfaW5kZXhfaW5fbmlkKGksIG5pZCkgeworCQkqc3RhcnRfcGZuID0gbWluKCpzdGFydF9wZm4sIGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3Bmbik7CisJCSplbmRfcGZuID0gbWF4KCplbmRfcGZuLCBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuKTsKKwl9CisKKwlpZiAoKnN0YXJ0X3BmbiA9PSAtMVVMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5vZGUgJXUgYWN0aXZlIHdpdGggbm8gbWVtb3J5XG4iLCBuaWQpOworCQkqc3RhcnRfcGZuID0gMDsKKwl9CisKKwkvKiBQdXNoIHRoZSBub2RlIGJvdW5kYXJpZXMgb3V0IGlmIHJlcXVlc3RlZCAqLworCWFjY291bnRfbm9kZV9ib3VuZGFyeShuaWQsIHN0YXJ0X3BmbiwgZW5kX3Bmbik7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyBhIHpvbmUgc3BhbnMgaW4gYSBub2RlLCBpbmNsdWRpbmcgaG9sZXMKKyAqIHByZXNlbnRfcGFnZXMgPSB6b25lX3NwYW5uZWRfcGFnZXNfaW5fbm9kZSgpIC0gem9uZV9hYnNlbnRfcGFnZXNfaW5fbm9kZSgpCisgKi8KK3Vuc2lnbmVkIGxvbmcgX19pbml0IHpvbmVfc3Bhbm5lZF9wYWdlc19pbl9ub2RlKGludCBuaWQsCisJCQkJCXVuc2lnbmVkIGxvbmcgem9uZV90eXBlLAorCQkJCQl1bnNpZ25lZCBsb25nICppZ25vcmVkKQoreworCXVuc2lnbmVkIGxvbmcgbm9kZV9zdGFydF9wZm4sIG5vZGVfZW5kX3BmbjsKKwl1bnNpZ25lZCBsb25nIHpvbmVfc3RhcnRfcGZuLCB6b25lX2VuZF9wZm47CisKKwkvKiBHZXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIG5vZGUgYW5kIHpvbmUgKi8KKwlnZXRfcGZuX3JhbmdlX2Zvcl9uaWQobmlkLCAmbm9kZV9zdGFydF9wZm4sICZub2RlX2VuZF9wZm4pOworCXpvbmVfc3RhcnRfcGZuID0gYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5bem9uZV90eXBlXTsKKwl6b25lX2VuZF9wZm4gPSBhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5bem9uZV90eXBlXTsKKworCS8qIENoZWNrIHRoYXQgdGhpcyBub2RlIGhhcyBwYWdlcyB3aXRoaW4gdGhlIHpvbmUncyByZXF1aXJlZCByYW5nZSAqLworCWlmICh6b25lX2VuZF9wZm4gPCBub2RlX3N0YXJ0X3BmbiB8fCB6b25lX3N0YXJ0X3BmbiA+IG5vZGVfZW5kX3BmbikKKwkJcmV0dXJuIDA7CisKKwkvKiBNb3ZlIHRoZSB6b25lIGJvdW5kYXJpZXMgaW5zaWRlIHRoZSBub2RlIGlmIG5lY2Vzc2FyeSAqLworCXpvbmVfZW5kX3BmbiA9IG1pbih6b25lX2VuZF9wZm4sIG5vZGVfZW5kX3Bmbik7CisJem9uZV9zdGFydF9wZm4gPSBtYXgoem9uZV9zdGFydF9wZm4sIG5vZGVfc3RhcnRfcGZuKTsKKworCS8qIFJldHVybiB0aGUgc3Bhbm5lZCBwYWdlcyAqLworCXJldHVybiB6b25lX2VuZF9wZm4gLSB6b25lX3N0YXJ0X3BmbjsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGhvbGVzIGluIGEgcmFuZ2Ugb24gYSBub2RlLiBJZiBuaWQgaXMgTUFYX05VTU5PREVTLAorICogdGhlbiBhbGwgaG9sZXMgaW4gdGhlIHJlcXVlc3RlZCByYW5nZSB3aWxsIGJlIGFjY291bnRlZCBmb3IKKyAqLwordW5zaWduZWQgbG9uZyBfX2luaXQgX19hYnNlbnRfcGFnZXNfaW5fcmFuZ2UoaW50IG5pZCwKKwkJCQl1bnNpZ25lZCBsb25nIHJhbmdlX3N0YXJ0X3BmbiwKKwkJCQl1bnNpZ25lZCBsb25nIHJhbmdlX2VuZF9wZm4pCit7CisJaW50IGkgPSAwOworCXVuc2lnbmVkIGxvbmcgcHJldl9lbmRfcGZuID0gMCwgaG9sZV9wYWdlcyA9IDA7CisJdW5zaWduZWQgbG9uZyBzdGFydF9wZm47CisKKwkvKiBGaW5kIHRoZSBlbmRfcGZuIG9mIHRoZSBmaXJzdCBhY3RpdmUgcmFuZ2Ugb2YgcGZucyBpbiB0aGUgbm9kZSAqLworCWkgPSBmaXJzdF9hY3RpdmVfcmVnaW9uX2luZGV4X2luX25pZChuaWQpOworCWlmIChpID09IC0xKQorCQlyZXR1cm4gMDsKKworCS8qIEFjY291bnQgZm9yIHJhbmdlcyBiZWZvcmUgcGh5c2ljYWwgbWVtb3J5IG9uIHRoaXMgbm9kZSAqLworCWlmIChlYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm4gPiByYW5nZV9zdGFydF9wZm4pCisJCWhvbGVfcGFnZXMgPSBlYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm4gLSByYW5nZV9zdGFydF9wZm47CisKKwlwcmV2X2VuZF9wZm4gPSBlYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm47CisKKwkvKiBGaW5kIGFsbCBob2xlcyBmb3IgdGhlIHpvbmUgd2l0aGluIHRoZSBub2RlICovCisJZm9yICg7IGkgIT0gLTE7IGkgPSBuZXh0X2FjdGl2ZV9yZWdpb25faW5kZXhfaW5fbmlkKGksIG5pZCkpIHsKKworCQkvKiBObyBuZWVkIHRvIGNvbnRpbnVlIGlmIHByZXZfZW5kX3BmbiBpcyBvdXRzaWRlIHRoZSB6b25lICovCisJCWlmIChwcmV2X2VuZF9wZm4gPj0gcmFuZ2VfZW5kX3BmbikKKwkJCWJyZWFrOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgZW5kIG9mIHRoZSB6b25lIGlzIG5vdCB3aXRoaW4gdGhlIGhvbGUgKi8KKwkJc3RhcnRfcGZuID0gbWluKGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiwgcmFuZ2VfZW5kX3Bmbik7CisJCXByZXZfZW5kX3BmbiA9IG1heChwcmV2X2VuZF9wZm4sIHJhbmdlX3N0YXJ0X3Bmbik7CisKKwkJLyogVXBkYXRlIHRoZSBob2xlIHNpemUgY291bmQgYW5kIG1vdmUgb24gKi8KKwkJaWYgKHN0YXJ0X3BmbiA+IHJhbmdlX3N0YXJ0X3BmbikgeworCQkJQlVHX09OKHByZXZfZW5kX3BmbiA+IHN0YXJ0X3Bmbik7CisJCQlob2xlX3BhZ2VzICs9IHN0YXJ0X3BmbiAtIHByZXZfZW5kX3BmbjsKKwkJfQorCQlwcmV2X2VuZF9wZm4gPSBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuOworCX0KKworCS8qIEFjY291bnQgZm9yIHJhbmdlcyBwYXN0IHBoeXNpY2FsIG1lbW9yeSBvbiB0aGlzIG5vZGUgKi8KKwlpZiAocmFuZ2VfZW5kX3BmbiA+IHByZXZfZW5kX3BmbikKKwkJaG9sZV9wYWdlcyA9IHJhbmdlX2VuZF9wZm4gLQorCQkJCW1heChyYW5nZV9zdGFydF9wZm4sIHByZXZfZW5kX3Bmbik7CisKKwlyZXR1cm4gaG9sZV9wYWdlczsKK30KKworLyoqCisgKiBhYnNlbnRfcGFnZXNfaW5fcmFuZ2UgLSBSZXR1cm4gbnVtYmVyIG9mIHBhZ2UgZnJhbWVzIGluIGhvbGVzIHdpdGhpbiBhIHJhbmdlCisgKiBAc3RhcnRfcGZuOiBUaGUgc3RhcnQgUEZOIHRvIHN0YXJ0IHNlYXJjaGluZyBmb3IgaG9sZXMKKyAqIEBlbmRfcGZuOiBUaGUgZW5kIFBGTiB0byBzdG9wIHNlYXJjaGluZyBmb3IgaG9sZXMKKyAqCisgKiBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFnZXMgZnJhbWVzIGluIG1lbW9yeSBob2xlcyB3aXRoaW4gYSByYW5nZQorICovCit1bnNpZ25lZCBsb25nIF9faW5pdCBhYnNlbnRfcGFnZXNfaW5fcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCisJCQkJCQkJdW5zaWduZWQgbG9uZyBlbmRfcGZuKQoreworCXJldHVybiBfX2Fic2VudF9wYWdlc19pbl9yYW5nZShNQVhfTlVNTk9ERVMsIHN0YXJ0X3BmbiwgZW5kX3Bmbik7Cit9CisKKy8qIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhZ2UgZnJhbWVzIGluIGhvbGVzIGluIGEgem9uZSBvbiBhIG5vZGUgKi8KK3Vuc2lnbmVkIGxvbmcgX19pbml0IHpvbmVfYWJzZW50X3BhZ2VzX2luX25vZGUoaW50IG5pZCwKKwkJCQkJdW5zaWduZWQgbG9uZyB6b25lX3R5cGUsCisJCQkJCXVuc2lnbmVkIGxvbmcgKmlnbm9yZWQpCit7CisJdW5zaWduZWQgbG9uZyBub2RlX3N0YXJ0X3Bmbiwgbm9kZV9lbmRfcGZuOworCXVuc2lnbmVkIGxvbmcgem9uZV9zdGFydF9wZm4sIHpvbmVfZW5kX3BmbjsKKworCWdldF9wZm5fcmFuZ2VfZm9yX25pZChuaWQsICZub2RlX3N0YXJ0X3BmbiwgJm5vZGVfZW5kX3Bmbik7CisJem9uZV9zdGFydF9wZm4gPSBtYXgoYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5bem9uZV90eXBlXSwKKwkJCQkJCQlub2RlX3N0YXJ0X3Bmbik7CisJem9uZV9lbmRfcGZuID0gbWluKGFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3Bmblt6b25lX3R5cGVdLAorCQkJCQkJCW5vZGVfZW5kX3Bmbik7CisKKwlyZXR1cm4gX19hYnNlbnRfcGFnZXNfaW5fcmFuZ2UobmlkLCB6b25lX3N0YXJ0X3Bmbiwgem9uZV9lbmRfcGZuKTsKK30KKworLyogUmV0dXJuIHRoZSB6b25lIGluZGV4IGEgUEZOIGlzIGluICovCitpbnQgbWVtbWFwX3pvbmVfaWR4KHN0cnVjdCBwYWdlICpsbWVtX21hcCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHBoeXNfYWRkciA9IHZpcnRfdG9fcGh5cyhsbWVtX21hcCk7CisJdW5zaWduZWQgbG9uZyBwZm4gPSBwaHlzX2FkZHIgPj4gUEFHRV9TSElGVDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykKKwkJaWYgKHBmbiA8IGFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3BmbltpXSkKKwkJCWJyZWFrOworCisJcmV0dXJuIGk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHpvbmVfc3Bhbm5lZF9wYWdlc19pbl9ub2RlKGludCBuaWQsCisJCQkJCXVuc2lnbmVkIGxvbmcgem9uZV90eXBlLAorCQkJCQl1bnNpZ25lZCBsb25nICp6b25lc19zaXplKQoreworCXJldHVybiB6b25lc19zaXplW3pvbmVfdHlwZV07Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB6b25lX2Fic2VudF9wYWdlc19pbl9ub2RlKGludCBuaWQsCisJCQkJCQl1bnNpZ25lZCBsb25nIHpvbmVfdHlwZSwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgKnpob2xlc19zaXplKQoreworCWlmICghemhvbGVzX3NpemUpCisJCXJldHVybiAwOworCisJcmV0dXJuIHpob2xlc19zaXplW3pvbmVfdHlwZV07Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1lbW1hcF96b25lX2lkeChzdHJ1Y3QgcGFnZSAqbG1lbV9tYXApCit7CisJcmV0dXJuIE1BWF9OUl9aT05FUzsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBfX2luaXQgY2FsY3VsYXRlX25vZGVfdG90YWxwYWdlcyhzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LAorCQl1bnNpZ25lZCBsb25nICp6b25lc19zaXplLCB1bnNpZ25lZCBsb25nICp6aG9sZXNfc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlYWx0b3RhbHBhZ2VzLCB0b3RhbHBhZ2VzID0gMDsKKwllbnVtIHpvbmVfdHlwZSBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKQorCQl0b3RhbHBhZ2VzICs9IHpvbmVfc3Bhbm5lZF9wYWdlc19pbl9ub2RlKHBnZGF0LT5ub2RlX2lkLCBpLAorCQkJCQkJCQl6b25lc19zaXplKTsKKwlwZ2RhdC0+bm9kZV9zcGFubmVkX3BhZ2VzID0gdG90YWxwYWdlczsKKworCXJlYWx0b3RhbHBhZ2VzID0gdG90YWxwYWdlczsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05SX1pPTkVTOyBpKyspCisJCXJlYWx0b3RhbHBhZ2VzIC09CisJCQl6b25lX2Fic2VudF9wYWdlc19pbl9ub2RlKHBnZGF0LT5ub2RlX2lkLCBpLAorCQkJCQkJCQl6aG9sZXNfc2l6ZSk7CisJcGdkYXQtPm5vZGVfcHJlc2VudF9wYWdlcyA9IHJlYWx0b3RhbHBhZ2VzOworCXByaW50ayhLRVJOX0RFQlVHICJPbiBub2RlICVkIHRvdGFscGFnZXM6ICVsdVxuIiwgcGdkYXQtPm5vZGVfaWQsCisJCQkJCQkJcmVhbHRvdGFscGFnZXMpOworfQorCiAvKgogICogU2V0IHVwIHRoZSB6b25lIGRhdGEgc3RydWN0dXJlczoKICAqICAgLSBtYXJrIGFsbCBwYWdlcyByZXNlcnZlZApAQCAtMTk5OCwxMSArMjM3MiwzNCBAQAogCQogCWZvciAoaiA9IDA7IGogPCBNQVhfTlJfWk9ORVM7IGorKykgewogCQlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgajsKLQkJdW5zaWduZWQgbG9uZyBzaXplLCByZWFsc2l6ZTsKKwkJdW5zaWduZWQgbG9uZyBzaXplLCByZWFsc2l6ZSwgbWVtbWFwX3BhZ2VzOwogCi0JCXJlYWxzaXplID0gc2l6ZSA9IHpvbmVzX3NpemVbal07Ci0JCWlmICh6aG9sZXNfc2l6ZSkKLQkJCXJlYWxzaXplIC09IHpob2xlc19zaXplW2pdOworCQlzaXplID0gem9uZV9zcGFubmVkX3BhZ2VzX2luX25vZGUobmlkLCBqLCB6b25lc19zaXplKTsKKwkJcmVhbHNpemUgPSBzaXplIC0gem9uZV9hYnNlbnRfcGFnZXNfaW5fbm9kZShuaWQsIGosCisJCQkJCQkJCXpob2xlc19zaXplKTsKKworCQkvKgorCQkgKiBBZGp1c3QgcmVhbHNpemUgc28gdGhhdCBpdCBhY2NvdW50cyBmb3IgaG93IG11Y2ggbWVtb3J5CisJCSAqIGlzIHVzZWQgYnkgdGhpcyB6b25lIGZvciBtZW1tYXAuIFRoaXMgYWZmZWN0cyB0aGUgd2F0ZXJtYXJrCisJCSAqIGFuZCBwZXItY3B1IGluaXRpYWxpc2F0aW9ucworCQkgKi8KKwkJbWVtbWFwX3BhZ2VzID0gKHNpemUgKiBzaXplb2Yoc3RydWN0IHBhZ2UpKSA+PiBQQUdFX1NISUZUOworCQlpZiAocmVhbHNpemUgPj0gbWVtbWFwX3BhZ2VzKSB7CisJCQlyZWFsc2l6ZSAtPSBtZW1tYXBfcGFnZXM7CisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSIgICVzIHpvbmU6ICVsdSBwYWdlcyB1c2VkIGZvciBtZW1tYXBcbiIsCisJCQkJem9uZV9uYW1lc1tqXSwgbWVtbWFwX3BhZ2VzKTsKKwkJfSBlbHNlCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJIiAgJXMgem9uZTogJWx1IHBhZ2VzIGV4Y2VlZHMgcmVhbHNpemUgJWx1XG4iLAorCQkJCXpvbmVfbmFtZXNbal0sIG1lbW1hcF9wYWdlcywgcmVhbHNpemUpOworCisJCS8qIEFjY291bnQgZm9yIHJlc2VydmVkIERNQSBwYWdlcyAqLworCQlpZiAoaiA9PSBaT05FX0RNQSAmJiByZWFsc2l6ZSA+IGRtYV9yZXNlcnZlKSB7CisJCQlyZWFsc2l6ZSAtPSBkbWFfcmVzZXJ2ZTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIgIERNQSB6b25lOiAlbHUgcGFnZXMgcmVzZXJ2ZWRcbiIsCisJCQkJCQkJCWRtYV9yZXNlcnZlKTsKKwkJfQogCiAJCWlmICghaXNfaGlnaG1lbV9pZHgoaikpCiAJCQlucl9rZXJuZWxfcGFnZXMgKz0gcmVhbHNpemU7CkBAIC0yMDExLDYgKzI0MDgsNyBAQAogCQl6b25lLT5zcGFubmVkX3BhZ2VzID0gc2l6ZTsKIAkJem9uZS0+cHJlc2VudF9wYWdlcyA9IHJlYWxzaXplOwogI2lmZGVmIENPTkZJR19OVU1BCisJCXpvbmUtPm5vZGUgPSBuaWQ7CiAJCXpvbmUtPm1pbl91bm1hcHBlZF9wYWdlcyA9IChyZWFsc2l6ZSpzeXNjdGxfbWluX3VubWFwcGVkX3JhdGlvKQogCQkJCQkJLyAxMDA7CiAJCXpvbmUtPm1pbl9zbGFiX3BhZ2VzID0gKHJlYWxzaXplICogc3lzY3RsX21pbl9zbGFiX3JhdGlvKSAvIDEwMDsKQEAgLTIwNzMsOCArMjQ3MSwxMyBAQAogCS8qCiAJICogV2l0aCBubyBESVNDT05USUcsIHRoZSBnbG9iYWwgbWVtX21hcCBpcyBqdXN0IHNldCBhcyBub2RlIDAncwogCSAqLwotCWlmIChwZ2RhdCA9PSBOT0RFX0RBVEEoMCkpCisJaWYgKHBnZGF0ID09IE5PREVfREFUQSgwKSkgewogCQltZW1fbWFwID0gTk9ERV9EQVRBKDApLT5ub2RlX21lbV9tYXA7CisjaWZkZWYgQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQCisJCWlmIChwYWdlX3RvX3BmbihtZW1fbWFwKSAhPSBwZ2RhdC0+bm9kZV9zdGFydF9wZm4pCisJCQltZW1fbWFwIC09IHBnZGF0LT5ub2RlX3N0YXJ0X3BmbjsKKyNlbmRpZiAvKiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAgKi8KKwl9CiAjZW5kaWYKICNlbmRpZiAvKiBDT05GSUdfRkxBVF9OT0RFX01FTV9NQVAgKi8KIH0KQEAgLTIwODUsMTMgKzI0ODgsMjU1IEBACiB7CiAJcGdkYXQtPm5vZGVfaWQgPSBuaWQ7CiAJcGdkYXQtPm5vZGVfc3RhcnRfcGZuID0gbm9kZV9zdGFydF9wZm47Ci0JY2FsY3VsYXRlX3pvbmVfdG90YWxwYWdlcyhwZ2RhdCwgem9uZXNfc2l6ZSwgemhvbGVzX3NpemUpOworCWNhbGN1bGF0ZV9ub2RlX3RvdGFscGFnZXMocGdkYXQsIHpvbmVzX3NpemUsIHpob2xlc19zaXplKTsKIAogCWFsbG9jX25vZGVfbWVtX21hcChwZ2RhdCk7CiAKIAlmcmVlX2FyZWFfaW5pdF9jb3JlKHBnZGF0LCB6b25lc19zaXplLCB6aG9sZXNfc2l6ZSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAKKy8qKgorICogYWRkX2FjdGl2ZV9yYW5nZSAtIFJlZ2lzdGVyIGEgcmFuZ2Ugb2YgUEZOcyBiYWNrZWQgYnkgcGh5c2ljYWwgbWVtb3J5CisgKiBAbmlkOiBUaGUgbm9kZSBJRCB0aGUgcmFuZ2UgcmVzaWRlcyBvbgorICogQHN0YXJ0X3BmbjogVGhlIHN0YXJ0IFBGTiBvZiB0aGUgYXZhaWxhYmxlIHBoeXNpY2FsIG1lbW9yeQorICogQGVuZF9wZm46IFRoZSBlbmQgUEZOIG9mIHRoZSBhdmFpbGFibGUgcGh5c2ljYWwgbWVtb3J5CisgKgorICogVGhlc2UgcmFuZ2VzIGFyZSBzdG9yZWQgaW4gYW4gZWFybHlfbm9kZV9tYXBbXSBhbmQgbGF0ZXIgdXNlZCBieQorICogZnJlZV9hcmVhX2luaXRfbm9kZXMoKSB0byBjYWxjdWxhdGUgem9uZSBzaXplcyBhbmQgaG9sZXMuIElmIHRoZQorICogcmFuZ2Ugc3BhbnMgYSBtZW1vcnkgaG9sZSwgaXQgaXMgdXAgdG8gdGhlIGFyY2hpdGVjdHVyZSB0byBlbnN1cmUKKyAqIHRoZSBtZW1vcnkgaXMgbm90IGZyZWVkIGJ5IHRoZSBib290bWVtIGFsbG9jYXRvci4gSWYgcG9zc2libGUKKyAqIHRoZSByYW5nZSBiZWluZyByZWdpc3RlcmVkIHdpbGwgYmUgbWVyZ2VkIHdpdGggZXhpc3RpbmcgcmFuZ2VzLgorICovCit2b2lkIF9faW5pdCBhZGRfYWN0aXZlX3JhbmdlKHVuc2lnbmVkIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAorCQkJCQkJdW5zaWduZWQgbG9uZyBlbmRfcGZuKQoreworCWludCBpOworCisJcHJpbnRrKEtFUk5fREVCVUcgIkVudGVyaW5nIGFkZF9hY3RpdmVfcmFuZ2UoJWQsICVsdSwgJWx1KSAiCisJCQkgICIlZCBlbnRyaWVzIG9mICVkIHVzZWRcbiIsCisJCQkgIG5pZCwgc3RhcnRfcGZuLCBlbmRfcGZuLAorCQkJICBucl9ub2RlbWFwX2VudHJpZXMsIE1BWF9BQ1RJVkVfUkVHSU9OUyk7CisKKwkvKiBNZXJnZSB3aXRoIGV4aXN0aW5nIGFjdGl2ZSByZWdpb25zIGlmIHBvc3NpYmxlICovCisJZm9yIChpID0gMDsgaSA8IG5yX25vZGVtYXBfZW50cmllczsgaSsrKSB7CisJCWlmIChlYXJseV9ub2RlX21hcFtpXS5uaWQgIT0gbmlkKQorCQkJY29udGludWU7CisKKwkJLyogU2tpcCBpZiBhbiBleGlzdGluZyByZWdpb24gY292ZXJzIHRoaXMgbmV3IG9uZSAqLworCQlpZiAoc3RhcnRfcGZuID49IGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiAmJgorCQkJCWVuZF9wZm4gPD0gZWFybHlfbm9kZV9tYXBbaV0uZW5kX3BmbikKKwkJCXJldHVybjsKKworCQkvKiBNZXJnZSBmb3J3YXJkIGlmIHN1aXRhYmxlICovCisJCWlmIChzdGFydF9wZm4gPD0gZWFybHlfbm9kZV9tYXBbaV0uZW5kX3BmbiAmJgorCQkJCWVuZF9wZm4gPiBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuKSB7CisJCQllYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuID0gZW5kX3BmbjsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIE1lcmdlIGJhY2t3YXJkIGlmIHN1aXRhYmxlICovCisJCWlmIChzdGFydF9wZm4gPCBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuICYmCisJCQkJZW5kX3BmbiA+PSBlYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm4pIHsKKwkJCWVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiA9IHN0YXJ0X3BmbjsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIENoZWNrIHRoYXQgZWFybHlfbm9kZV9tYXAgaXMgbGFyZ2UgZW5vdWdoICovCisJaWYgKGkgPj0gTUFYX0FDVElWRV9SRUdJT05TKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIk1vcmUgdGhhbiAlZCBtZW1vcnkgcmVnaW9ucywgdHJ1bmNhdGluZ1xuIiwKKwkJCQkJCQlNQVhfQUNUSVZFX1JFR0lPTlMpOworCQlyZXR1cm47CisJfQorCisJZWFybHlfbm9kZV9tYXBbaV0ubmlkID0gbmlkOworCWVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiA9IHN0YXJ0X3BmbjsKKwllYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuID0gZW5kX3BmbjsKKwlucl9ub2RlbWFwX2VudHJpZXMgPSBpICsgMTsKK30KKworLyoqCisgKiBzaHJpbmtfYWN0aXZlX3JhbmdlIC0gU2hyaW5rIGFuIGV4aXN0aW5nIHJlZ2lzdGVyZWQgcmFuZ2Ugb2YgUEZOcworICogQG5pZDogVGhlIG5vZGUgaWQgdGhlIHJhbmdlIGlzIG9uIHRoYXQgc2hvdWxkIGJlIHNocnVuaworICogQG9sZF9lbmRfcGZuOiBUaGUgb2xkIGVuZCBQRk4gb2YgdGhlIHJhbmdlCisgKiBAbmV3X2VuZF9wZm46IFRoZSBuZXcgUEZOIG9mIHRoZSByYW5nZQorICoKKyAqIGkzODYgd2l0aCBOVU1BIHVzZSBhbGxvY19yZW1hcCgpIHRvIHN0b3JlIGEgbm9kZV9tZW1fbWFwIG9uIGEgbG9jYWwgbm9kZS4KKyAqIFRoZSBtYXAgaXMga2VwdCBhdCB0aGUgZW5kIHBoeXNpY2FsIHBhZ2UgcmFuZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVuCisgKiByZWdpc3RlcmVkIHdpdGggYWRkX2FjdGl2ZV9yYW5nZSgpLiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBhbiBhcmNoIHRvIHNocmluaworICogYW4gZXhpc3RpbmcgcmVnaXN0ZXJlZCByYW5nZS4KKyAqLwordm9pZCBfX2luaXQgc2hyaW5rX2FjdGl2ZV9yYW5nZSh1bnNpZ25lZCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIG9sZF9lbmRfcGZuLAorCQkJCQkJdW5zaWduZWQgbG9uZyBuZXdfZW5kX3BmbikKK3sKKwlpbnQgaTsKKworCS8qIEZpbmQgdGhlIG9sZCBhY3RpdmUgcmVnaW9uIGVuZCBhbmQgc2hyaW5rICovCisJZm9yX2VhY2hfYWN0aXZlX3JhbmdlX2luZGV4X2luX25pZChpLCBuaWQpCisJCWlmIChlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuID09IG9sZF9lbmRfcGZuKSB7CisJCQllYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuID0gbmV3X2VuZF9wZm47CisJCQlicmVhazsKKwkJfQorfQorCisvKioKKyAqIHJlbW92ZV9hbGxfYWN0aXZlX3JhbmdlcyAtIFJlbW92ZSBhbGwgY3VycmVudGx5IHJlZ2lzdGVyZWQgcmVnaW9ucworICogRHVyaW5nIGRpc2NvdmVyeSwgaXQgbWF5IGJlIGZvdW5kIHRoYXQgYSB0YWJsZSBsaWtlIFNSQVQgaXMgaW52YWxpZAorICogYW5kIGFuIGFsdGVybmF0aXZlIGRpc2NvdmVyeSBtZXRob2QgbXVzdCBiZSB1c2VkLiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMKKyAqIGFsbCBjdXJyZW50bHkgcmVnaXN0ZXJlZCByZWdpb25zLgorICovCit2b2lkIF9faW5pdCByZW1vdmVfYWxsX2FjdGl2ZV9yYW5nZXMoKQoreworCW1lbXNldChlYXJseV9ub2RlX21hcCwgMCwgc2l6ZW9mKGVhcmx5X25vZGVfbWFwKSk7CisJbnJfbm9kZW1hcF9lbnRyaWVzID0gMDsKKyNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfUkVTRVJWRQorCW1lbXNldChub2RlX2JvdW5kYXJ5X3N0YXJ0X3BmbiwgMCwgc2l6ZW9mKG5vZGVfYm91bmRhcnlfc3RhcnRfcGZuKSk7CisJbWVtc2V0KG5vZGVfYm91bmRhcnlfZW5kX3BmbiwgMCwgc2l6ZW9mKG5vZGVfYm91bmRhcnlfZW5kX3BmbikpOworI2VuZGlmIC8qIENPTkZJR19NRU1PUllfSE9UUExVR19SRVNFUlZFICovCit9CisKKy8qIENvbXBhcmUgdHdvIGFjdGl2ZSBub2RlX2FjdGl2ZV9yZWdpb25zICovCitzdGF0aWMgaW50IF9faW5pdCBjbXBfbm9kZV9hY3RpdmVfcmVnaW9uKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJc3RydWN0IG5vZGVfYWN0aXZlX3JlZ2lvbiAqYXJhbmdlID0gKHN0cnVjdCBub2RlX2FjdGl2ZV9yZWdpb24gKilhOworCXN0cnVjdCBub2RlX2FjdGl2ZV9yZWdpb24gKmJyYW5nZSA9IChzdHJ1Y3Qgbm9kZV9hY3RpdmVfcmVnaW9uICopYjsKKworCS8qIERvbmUgdGhpcyB3YXkgdG8gYXZvaWQgb3ZlcmZsb3dzICovCisJaWYgKGFyYW5nZS0+c3RhcnRfcGZuID4gYnJhbmdlLT5zdGFydF9wZm4pCisJCXJldHVybiAxOworCWlmIChhcmFuZ2UtPnN0YXJ0X3BmbiA8IGJyYW5nZS0+c3RhcnRfcGZuKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworLyogc29ydCB0aGUgbm9kZV9tYXAgYnkgc3RhcnRfcGZuICovCitzdGF0aWMgdm9pZCBfX2luaXQgc29ydF9ub2RlX21hcCh2b2lkKQoreworCXNvcnQoZWFybHlfbm9kZV9tYXAsIChzaXplX3QpbnJfbm9kZW1hcF9lbnRyaWVzLAorCQkJc2l6ZW9mKHN0cnVjdCBub2RlX2FjdGl2ZV9yZWdpb24pLAorCQkJY21wX25vZGVfYWN0aXZlX3JlZ2lvbiwgTlVMTCk7Cit9CisKKy8qIEZpbmQgdGhlIGxvd2VzdCBwZm4gZm9yIGEgbm9kZS4gVGhpcyBkZXBlbmRzIG9uIGEgc29ydGVkIGVhcmx5X25vZGVfbWFwICovCit1bnNpZ25lZCBsb25nIF9faW5pdCBmaW5kX21pbl9wZm5fZm9yX25vZGUodW5zaWduZWQgbG9uZyBuaWQpCit7CisJaW50IGk7CisKKwkvKiBBc3N1bWluZyBhIHNvcnRlZCBtYXAsIHRoZSBmaXJzdCByYW5nZSBmb3VuZCBoYXMgdGhlIHN0YXJ0aW5nIHBmbiAqLworCWZvcl9lYWNoX2FjdGl2ZV9yYW5nZV9pbmRleF9pbl9uaWQoaSwgbmlkKQorCQlyZXR1cm4gZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuOworCisJcHJpbnRrKEtFUk5fV0FSTklORyAiQ291bGQgbm90IGZpbmQgc3RhcnRfcGZuIGZvciBub2RlICVsdVxuIiwgbmlkKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmaW5kX21pbl9wZm5fd2l0aF9hY3RpdmVfcmVnaW9ucyAtIEZpbmQgdGhlIG1pbmltdW0gUEZOIHJlZ2lzdGVyZWQKKyAqCisgKiBJdCByZXR1cm5zIHRoZSBtaW5pbXVtIFBGTiBiYXNlZCBvbiBpbmZvcm1hdGlvbiBwcm92aWRlZCB2aWEKKyAqIGFkZF9hY3RpdmVfcmFuZ2UoKQorICovCit1bnNpZ25lZCBsb25nIF9faW5pdCBmaW5kX21pbl9wZm5fd2l0aF9hY3RpdmVfcmVnaW9ucyh2b2lkKQoreworCXJldHVybiBmaW5kX21pbl9wZm5fZm9yX25vZGUoTUFYX05VTU5PREVTKTsKK30KKworLyoqCisgKiBmaW5kX21heF9wZm5fd2l0aF9hY3RpdmVfcmVnaW9ucyAtIEZpbmQgdGhlIG1heGltdW0gUEZOIHJlZ2lzdGVyZWQKKyAqCisgKiBJdCByZXR1cm5zIHRoZSBtYXhpbXVtIFBGTiBiYXNlZCBvbiBpbmZvcm1hdGlvbiBwcm92aWRlZCB2aWEKKyAqIGFkZF9hY3RpdmVfcmFuZ2UoKQorICovCit1bnNpZ25lZCBsb25nIF9faW5pdCBmaW5kX21heF9wZm5fd2l0aF9hY3RpdmVfcmVnaW9ucyh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbWF4X3BmbiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfbm9kZW1hcF9lbnRyaWVzOyBpKyspCisJCW1heF9wZm4gPSBtYXgobWF4X3BmbiwgZWFybHlfbm9kZV9tYXBbaV0uZW5kX3Bmbik7CisKKwlyZXR1cm4gbWF4X3BmbjsKK30KKworLyoqCisgKiBmcmVlX2FyZWFfaW5pdF9ub2RlcyAtIEluaXRpYWxpc2UgYWxsIHBnX2RhdGFfdCBhbmQgem9uZSBkYXRhCisgKiBAYXJjaF9tYXhfZG1hX3BmbjogVGhlIG1heGltdW0gUEZOIHVzYWJsZSBmb3IgWk9ORV9ETUEKKyAqIEBhcmNoX21heF9kbWEzMl9wZm46IFRoZSBtYXhpbXVtIFBGTiB1c2FibGUgZm9yIFpPTkVfRE1BMzIKKyAqIEBhcmNoX21heF9sb3dfcGZuOiBUaGUgbWF4aW11bSBQRk4gdXNhYmxlIGZvciBaT05FX05PUk1BTAorICogQGFyY2hfbWF4X2hpZ2hfcGZuOiBUaGUgbWF4aW11bSBQRk4gdXNhYmxlIGZvciBaT05FX0hJR0hNRU0KKyAqCisgKiBUaGlzIHdpbGwgY2FsbCBmcmVlX2FyZWFfaW5pdF9ub2RlKCkgZm9yIGVhY2ggYWN0aXZlIG5vZGUgaW4gdGhlIHN5c3RlbS4KKyAqIFVzaW5nIHRoZSBwYWdlIHJhbmdlcyBwcm92aWRlZCBieSBhZGRfYWN0aXZlX3JhbmdlKCksIHRoZSBzaXplIG9mIGVhY2gKKyAqIHpvbmUgaW4gZWFjaCBub2RlIGFuZCB0aGVpciBob2xlcyBpcyBjYWxjdWxhdGVkLiBJZiB0aGUgbWF4aW11bSBQRk4KKyAqIGJldHdlZW4gdHdvIGFkamFjZW50IHpvbmVzIG1hdGNoLCBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHpvbmUgaXMgZW1wdHkuCisgKiBGb3IgZXhhbXBsZSwgaWYgYXJjaF9tYXhfZG1hX3BmbiA9PSBhcmNoX21heF9kbWEzMl9wZm4sIGl0IGlzIGFzc3VtZWQKKyAqIHRoYXQgYXJjaF9tYXhfZG1hMzJfcGZuIGhhcyBubyBwYWdlcy4gSXQgaXMgYWxzbyBhc3N1bWVkIHRoYXQgYSB6b25lCisgKiBzdGFydHMgd2hlcmUgdGhlIHByZXZpb3VzIG9uZSBlbmRlZC4gRm9yIGV4YW1wbGUsIFpPTkVfRE1BMzIgc3RhcnRzCisgKiBhdCBhcmNoX21heF9kbWFfcGZuLgorICovCit2b2lkIF9faW5pdCBmcmVlX2FyZWFfaW5pdF9ub2Rlcyh1bnNpZ25lZCBsb25nICptYXhfem9uZV9wZm4pCit7CisJdW5zaWduZWQgbG9uZyBuaWQ7CisJZW51bSB6b25lX3R5cGUgaTsKKworCS8qIFJlY29yZCB3aGVyZSB0aGUgem9uZSBib3VuZGFyaWVzIGFyZSAqLworCW1lbXNldChhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbiwgMCwKKwkJCQlzaXplb2YoYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm4pKTsKKwltZW1zZXQoYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuLCAwLAorCQkJCXNpemVvZihhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm4pKTsKKwlhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmblswXSA9IGZpbmRfbWluX3Bmbl93aXRoX2FjdGl2ZV9yZWdpb25zKCk7CisJYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuWzBdID0gbWF4X3pvbmVfcGZuWzBdOworCWZvciAoaSA9IDE7IGkgPCBNQVhfTlJfWk9ORVM7IGkrKykgeworCQlhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbltpXSA9CisJCQlhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5baS0xXTsKKwkJYXJjaF96b25lX2hpZ2hlc3RfcG9zc2libGVfcGZuW2ldID0KKwkJCW1heChtYXhfem9uZV9wZm5baV0sIGFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW2ldKTsKKwl9CisKKwkvKiBSZWdpb25zIGluIHRoZSBlYXJseV9ub2RlX21hcCBjYW4gYmUgaW4gYW55IG9yZGVyICovCisJc29ydF9ub2RlX21hcCgpOworCisJLyogUHJpbnQgb3V0IHRoZSB6b25lIHJhbmdlcyAqLworCXByaW50aygiWm9uZSBQRk4gcmFuZ2VzOlxuIik7CisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9aT05FUzsgaSsrKQorCQlwcmludGsoIiAgJS04cyAlOGx1IC0+ICU4bHVcbiIsCisJCQkJem9uZV9uYW1lc1tpXSwKKwkJCQlhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbltpXSwKKwkJCQlhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5baV0pOworCisJLyogUHJpbnQgb3V0IHRoZSBlYXJseV9ub2RlX21hcFtdICovCisJcHJpbnRrKCJlYXJseV9ub2RlX21hcFslZF0gYWN0aXZlIFBGTiByYW5nZXNcbiIsIG5yX25vZGVtYXBfZW50cmllcyk7CisJZm9yIChpID0gMDsgaSA8IG5yX25vZGVtYXBfZW50cmllczsgaSsrKQorCQlwcmludGsoIiAgJTNkOiAlOGx1IC0+ICU4bHVcbiIsIGVhcmx5X25vZGVfbWFwW2ldLm5pZCwKKwkJCQkJCWVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiwKKwkJCQkJCWVhcmx5X25vZGVfbWFwW2ldLmVuZF9wZm4pOworCisJLyogSW5pdGlhbGlzZSBldmVyeSBub2RlICovCisJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKSB7CisJCXBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKKwkJZnJlZV9hcmVhX2luaXRfbm9kZShuaWQsIHBnZGF0LCBOVUxMLAorCQkJCWZpbmRfbWluX3Bmbl9mb3Jfbm9kZShuaWQpLCBOVUxMKTsKKwl9Cit9CisjZW5kaWYgLyogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQICovCisKKy8qKgorICogc2V0X2RtYV9yZXNlcnZlIC0gQWNjb3VudCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBpbiBaT05FX0RNQQorICogQG5ld19kbWFfcmVzZXJ2ZSAtIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8gbWFyayByZXNlcnZlZAorICoKKyAqIFRoZSBwZXItY3B1IGJhdGNoc2l6ZSBhbmQgem9uZSB3YXRlcm1hcmtzIGFyZSBkZXRlcm1pbmVkIGJ5IHByZXNlbnRfcGFnZXMuCisgKiBJbiB0aGUgRE1BIHpvbmUsIGEgc2lnbmlmaWNhbnQgcGVyY2VudGFnZSBtYXkgYmUgY29uc3VtZWQgYnkga2VybmVsIGltYWdlCisgKiBhbmQgb3RoZXIgdW5mcmVlYWJsZSBhbGxvY2F0aW9ucyB3aGljaCBjYW4gc2tldyB0aGUgd2F0ZXJtYXJrcyBiYWRseS4gVGhpcworICogZnVuY3Rpb24gbWF5IG9wdGlvbmFsbHkgYmUgdXNlZCB0byBhY2NvdW50IGZvciB1bmZyZWVhYmxlIHBhZ2VzIGluCisgKiBaT05FX0RNQS4gVGhlIGVmZmVjdCB3aWxsIGJlIGxvd2VyIHdhdGVybWFya3MgYW5kIHNtYWxsZXIgcGVyLWNwdSBiYXRjaHNpemUKKyAqLwordm9pZCBfX2luaXQgc2V0X2RtYV9yZXNlcnZlKHVuc2lnbmVkIGxvbmcgbmV3X2RtYV9yZXNlcnZlKQoreworCWRtYV9yZXNlcnZlID0gbmV3X2RtYV9yZXNlcnZlOworfQorCiAjaWZuZGVmIENPTkZJR19ORUVEX01VTFRJUExFX05PREVTCiBzdGF0aWMgYm9vdG1lbV9kYXRhX3QgY29udGlnX2Jvb3RtZW1fZGF0YTsKIHN0cnVjdCBwZ2xpc3RfZGF0YSBjb250aWdfcGFnZV9kYXRhID0geyAuYmRhdGEgPSAmY29udGlnX2Jvb3RtZW1fZGF0YSB9OwpkaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmMKaW5kZXggODYzMWJlNC4uZWRhOTA3YyAxMDA2NDQKLS0tIGEvbW0vc2htZW0uYworKysgYi9tbS9zaG1lbS5jCkBAIC0xMzUxLDcgKzEzNTEsNiBAQAogCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CiAJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOwotCQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCQlpbm9kZS0+aV9ibG9ja3MgPSAwOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZzaG1lbV9hb3BzOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJnNobWVtX2JhY2tpbmdfZGV2X2luZm87CkBAIC0yMTU3LDggKzIxNTYsNyBAQAogCiBzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKIHsKLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KHNobWVtX2lub2RlX2NhY2hlcCkpCi0JCXByaW50ayhLRVJOX0lORk8gInNobWVtX2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7CisJa21lbV9jYWNoZV9kZXN0cm95KHNobWVtX2lub2RlX2NhY2hlcCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHNobWVtX2FvcHMgPSB7CmRpZmYgLS1naXQgYS9tbS9zbGFiLmMgYi9tbS9zbGFiLmMKaW5kZXggN2E0OGViMS4uNzkyYmZlMyAxMDA2NDQKLS0tIGEvbW0vc2xhYi5jCisrKyBiL21tL3NsYWIuYwpAQCAtOTcyLDcgKzk3MiwzOSBAQAogCXJldHVybiBucjsKIH0KIAotI2lmZGVmIENPTkZJR19OVU1BCisjaWZuZGVmIENPTkZJR19OVU1BCisKKyNkZWZpbmUgZHJhaW5fYWxpZW5fY2FjaGUoY2FjaGVwLCBhbGllbikgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSByZWFwX2FsaWVuKGNhY2hlcCwgbDMpIGRvIHsgfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYXJyYXlfY2FjaGUgKiphbGxvY19hbGllbl9jYWNoZShpbnQgbm9kZSwgaW50IGxpbWl0KQoreworCXJldHVybiAoc3RydWN0IGFycmF5X2NhY2hlICoqKUJBRF9BTElFTl9NQUdJQzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfYWxpZW5fY2FjaGUoc3RydWN0IGFycmF5X2NhY2hlICoqYWNfcHRyKQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBjYWNoZV9mcmVlX2FsaWVuKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIHZvaWQgKm9ianApCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqYWx0ZXJuYXRlX25vZGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKKwkJZ2ZwX3QgZmxhZ3MpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqX19jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCisJCSBnZnBfdCBmbGFncywgaW50IG5vZGVpZCkKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworI2Vsc2UJLyogQ09ORklHX05VTUEgKi8KKwogc3RhdGljIHZvaWQgKl9fY2FjaGVfYWxsb2Nfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCwgaW50KTsKIHN0YXRpYyB2b2lkICphbHRlcm5hdGVfbm9kZV9hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqLCBnZnBfdCk7CiAKQEAgLTExMDEsMjYgKzExMzMsNiBAQAogCX0KIAlyZXR1cm4gMTsKIH0KLQotI2Vsc2UKLQotI2RlZmluZSBkcmFpbl9hbGllbl9jYWNoZShjYWNoZXAsIGFsaWVuKSBkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHJlYXBfYWxpZW4oY2FjaGVwLCBsMykgZG8geyB9IHdoaWxlICgwKQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBhcnJheV9jYWNoZSAqKmFsbG9jX2FsaWVuX2NhY2hlKGludCBub2RlLCBpbnQgbGltaXQpCi17Ci0JcmV0dXJuIChzdHJ1Y3QgYXJyYXlfY2FjaGUgKiopQkFEX0FMSUVOX01BR0lDOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9hbGllbl9jYWNoZShzdHJ1Y3QgYXJyYXlfY2FjaGUgKiphY19wdHIpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNhY2hlX2ZyZWVfYWxpZW4oc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgdm9pZCAqb2JqcCkKLXsKLQlyZXR1cm4gMDsKLX0KLQogI2VuZGlmCiAKIHN0YXRpYyBpbnQgX19jcHVpbml0IGNwdXVwX2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLApAQCAtMTU2NCw3ICsxNTc2LDEzIEBACiAJICovCiAJZmxhZ3MgfD0gX19HRlBfQ09NUDsKICNlbmRpZgotCWZsYWdzIHw9IGNhY2hlcC0+Z2ZwZmxhZ3M7CisKKwkvKgorCSAqIFVuZGVyIE5VTUEgd2Ugd2FudCBtZW1vcnkgb24gdGhlIGluZGljYXRlZCBub2RlLiBXZSB3aWxsIGhhbmRsZQorCSAqIHRoZSBuZWVkZWQgZmFsbGJhY2sgb3Vyc2VsdmVzIHNpbmNlIHdlIHdhbnQgdG8gc2VydmUgZnJvbSBvdXIKKwkgKiBwZXIgbm9kZSBvYmplY3QgbGlzdHMgZmlyc3QgZm9yIG90aGVyIG5vZGVzLgorCSAqLworCWZsYWdzIHw9IGNhY2hlcC0+Z2ZwZmxhZ3MgfCBHRlBfVEhJU05PREU7CiAKIAlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShub2RlaWQsIGZsYWdzLCBjYWNoZXAtPmdmcG9yZGVyKTsKIAlpZiAoIXBhZ2UpCkBAIC0yNDQyLDcgKzI0NjAsNiBAQAogICogQGNhY2hlcDogdGhlIGNhY2hlIHRvIGRlc3Ryb3kKICAqCiAgKiBSZW1vdmUgYSBzdHJ1Y3Qga21lbV9jYWNoZSBvYmplY3QgZnJvbSB0aGUgc2xhYiBjYWNoZS4KLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgogICoKICAqIEl0IGlzIGV4cGVjdGVkIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYnkgYSBtb2R1bGUgd2hlbiBpdCBpcwogICogdW5sb2FkZWQuICBUaGlzIHdpbGwgcmVtb3ZlIHRoZSBjYWNoZSBjb21wbGV0ZWx5LCBhbmQgYXZvaWQgYSBkdXBsaWNhdGUKQEAgLTI0NTQsNyArMjQ3MSw3IEBACiAgKiBUaGUgY2FsbGVyIG11c3QgZ3VhcmFudGVlIHRoYXQgbm9vbmUgd2lsbCBhbGxvY2F0ZSBtZW1vcnkgZnJvbSB0aGUgY2FjaGUKICAqIGR1cmluZyB0aGUga21lbV9jYWNoZV9kZXN0cm95KCkuCiAgKi8KLWludCBrbWVtX2NhY2hlX2Rlc3Ryb3koc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCkKK3ZvaWQga21lbV9jYWNoZV9kZXN0cm95KHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXApCiB7CiAJQlVHX09OKCFjYWNoZXAgfHwgaW5faW50ZXJydXB0KCkpOwogCkBAIC0yNDc1LDcgKzI0OTIsNyBAQAogCQlsaXN0X2FkZCgmY2FjaGVwLT5uZXh0LCAmY2FjaGVfY2hhaW4pOwogCQltdXRleF91bmxvY2soJmNhY2hlX2NoYWluX211dGV4KTsKIAkJdW5sb2NrX2NwdV9ob3RwbHVnKCk7Ci0JCXJldHVybiAxOworCQlyZXR1cm47CiAJfQogCiAJaWYgKHVubGlrZWx5KGNhY2hlcC0+ZmxhZ3MgJiBTTEFCX0RFU1RST1lfQllfUkNVKSkKQEAgLTI0ODMsNyArMjUwMCw2IEBACiAKIAlfX2ttZW1fY2FjaGVfZGVzdHJveShjYWNoZXApOwogCXVubG9ja19jcHVfaG90cGx1ZygpOwotCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2Rlc3Ryb3kpOwogCkBAIC0zMDMwLDE0ICszMDQ2LDYgQEAKIAl2b2lkICpvYmpwOwogCXN0cnVjdCBhcnJheV9jYWNoZSAqYWM7CiAKLSNpZmRlZiBDT05GSUdfTlVNQQotCWlmICh1bmxpa2VseShjdXJyZW50LT5mbGFncyAmIChQRl9TUFJFQURfU0xBQiB8IFBGX01FTVBPTElDWSkpKSB7Ci0JCW9ianAgPSBhbHRlcm5hdGVfbm9kZV9hbGxvYyhjYWNoZXAsIGZsYWdzKTsKLQkJaWYgKG9ianAgIT0gTlVMTCkKLQkJCXJldHVybiBvYmpwOwotCX0KLSNlbmRpZgotCiAJY2hlY2tfaXJxX29mZigpOwogCWFjID0gY3B1X2NhY2hlX2dldChjYWNoZXApOwogCWlmIChsaWtlbHkoYWMtPmF2YWlsKSkgewpAQCAtMzA1NSwxMiArMzA2MywyNCBAQAogCQkJCQkJZ2ZwX3QgZmxhZ3MsIHZvaWQgKmNhbGxlcikKIHsKIAl1bnNpZ25lZCBsb25nIHNhdmVfZmxhZ3M7Ci0Jdm9pZCAqb2JqcDsKKwl2b2lkICpvYmpwID0gTlVMTDsKIAogCWNhY2hlX2FsbG9jX2RlYnVnY2hlY2tfYmVmb3JlKGNhY2hlcCwgZmxhZ3MpOwogCiAJbG9jYWxfaXJxX3NhdmUoc2F2ZV9mbGFncyk7Ci0Jb2JqcCA9IF9fX19jYWNoZV9hbGxvYyhjYWNoZXAsIGZsYWdzKTsKKworCWlmICh1bmxpa2VseShOVU1BX0JVSUxEICYmCisJCQljdXJyZW50LT5mbGFncyAmIChQRl9TUFJFQURfU0xBQiB8IFBGX01FTVBPTElDWSkpKQorCQlvYmpwID0gYWx0ZXJuYXRlX25vZGVfYWxsb2MoY2FjaGVwLCBmbGFncyk7CisKKwlpZiAoIW9ianApCisJCW9ianAgPSBfX19fY2FjaGVfYWxsb2MoY2FjaGVwLCBmbGFncyk7CisJLyoKKwkgKiBXZSBtYXkganVzdCBoYXZlIHJ1biBvdXQgb2YgbWVtb3J5IG9uIHRoZSBsb2NhbCBub2RlLgorCSAqIF9fY2FjaGVfYWxsb2Nfbm9kZSgpIGtub3dzIGhvdyB0byBsb2NhdGUgbWVtb3J5IG9uIG90aGVyIG5vZGVzCisJICovCisgCWlmIChOVU1BX0JVSUxEICYmICFvYmpwKQorIAkJb2JqcCA9IF9fY2FjaGVfYWxsb2Nfbm9kZShjYWNoZXAsIGZsYWdzLCBudW1hX25vZGVfaWQoKSk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoc2F2ZV9mbGFncyk7CiAJb2JqcCA9IGNhY2hlX2FsbG9jX2RlYnVnY2hlY2tfYWZ0ZXIoY2FjaGVwLCBmbGFncywgb2JqcCwKIAkJCQkJICAgIGNhbGxlcik7CkBAIC0zMDc5LDcgKzMwOTksNyBAQAogewogCWludCBuaWRfYWxsb2MsIG5pZF9oZXJlOwogCi0JaWYgKGluX2ludGVycnVwdCgpKQorCWlmIChpbl9pbnRlcnJ1cHQoKSB8fCAoZmxhZ3MgJiBfX0dGUF9USElTTk9ERSkpCiAJCXJldHVybiBOVUxMOwogCW5pZF9hbGxvYyA9IG5pZF9oZXJlID0gbnVtYV9ub2RlX2lkKCk7CiAJaWYgKGNwdXNldF9kb19zbGFiX21lbV9zcHJlYWQoKSAmJiAoY2FjaGVwLT5mbGFncyAmIFNMQUJfTUVNX1NQUkVBRCkpCkBAIC0zMDkyLDYgKzMxMTIsMjggQEAKIH0KIAogLyoKKyAqIEZhbGxiYWNrIGZ1bmN0aW9uIGlmIHRoZXJlIHdhcyBubyBtZW1vcnkgYXZhaWxhYmxlIGFuZCBubyBvYmplY3RzIG9uIGEKKyAqIGNlcnRhaW4gbm9kZSBhbmQgd2UgYXJlIGFsbG93ZWQgdG8gZmFsbCBiYWNrLiBXZSBtaW1pY2sgdGhlIGJlaGF2aW9yIG9mCisgKiB0aGUgcGFnZSBhbGxvY2F0b3IuIFdlIGZhbGwgYmFjayBhY2NvcmRpbmcgdG8gYSB6b25lbGlzdCBkZXRlcm1pbmVkIGJ5CisgKiB0aGUgcG9saWN5IGxheWVyIHdoaWxlIG9iZXlpbmcgY3B1c2V0IGNvbnN0cmFpbnRzLgorICovCit2b2lkICpmYWxsYmFja19hbGxvYyhzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUsIGdmcF90IGZsYWdzKQoreworCXN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QgPSAmTk9ERV9EQVRBKHNsYWJfbm9kZShjdXJyZW50LT5tZW1wb2xpY3kpKQorCQkJCQktPm5vZGVfem9uZWxpc3RzW2dmcF96b25lKGZsYWdzKV07CisJc3RydWN0IHpvbmUgKip6OworCXZvaWQgKm9iaiA9IE5VTEw7CisKKwlmb3IgKHogPSB6b25lbGlzdC0+em9uZXM7ICp6ICYmICFvYmo7IHorKykKKwkJaWYgKHpvbmVfaWR4KCp6KSA8PSBaT05FX05PUk1BTCAmJgorCQkJCWNwdXNldF96b25lX2FsbG93ZWQoKnosIGZsYWdzKSkKKwkJCW9iaiA9IF9fY2FjaGVfYWxsb2Nfbm9kZShjYWNoZSwKKwkJCQkJZmxhZ3MgfCBfX0dGUF9USElTTk9ERSwKKwkJCQkJem9uZV90b19uaWQoKnopKTsKKwlyZXR1cm4gb2JqOworfQorCisvKgogICogQSBpbnRlcmZhY2UgdG8gZW5hYmxlIHNsYWIgY3JlYXRpb24gb24gbm9kZWlkCiAgKi8KIHN0YXRpYyB2b2lkICpfX2NhY2hlX2FsbG9jX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgZ2ZwX3QgZmxhZ3MsCkBAIC0zMTQ0LDExICszMTg2LDE1IEBACiBtdXN0X2dyb3c6CiAJc3Bpbl91bmxvY2soJmwzLT5saXN0X2xvY2spOwogCXggPSBjYWNoZV9ncm93KGNhY2hlcCwgZmxhZ3MsIG5vZGVpZCk7CisJaWYgKHgpCisJCWdvdG8gcmV0cnk7CiAKLQlpZiAoIXgpCi0JCXJldHVybiBOVUxMOworCWlmICghKGZsYWdzICYgX19HRlBfVEhJU05PREUpKQorCQkvKiBVbmFibGUgdG8gZ3JvdyB0aGUgY2FjaGUuIEZhbGwgYmFjayB0byBvdGhlciBub2Rlcy4gKi8KKwkJcmV0dXJuIGZhbGxiYWNrX2FsbG9jKGNhY2hlcCwgZmxhZ3MpOwogCi0JZ290byByZXRyeTsKKwlyZXR1cm4gTlVMTDsKKwogZG9uZToKIAlyZXR1cm4gb2JqOwogfQpkaWZmIC0tZ2l0IGEvbW0vc2xvYi5jIGIvbW0vc2xvYi5jCmluZGV4IDIwMTg4NjIuLjU0MjM5NDEgMTAwNjQ0Ci0tLSBhL21tL3Nsb2IuYworKysgYi9tbS9zbG9iLmMKQEAgLTI3MCwxMCArMjcwLDkgQEAKIH0KIEVYUE9SVF9TWU1CT0woa21lbV9jYWNoZV9jcmVhdGUpOwogCi1pbnQga21lbV9jYWNoZV9kZXN0cm95KHN0cnVjdCBrbWVtX2NhY2hlICpjKQordm9pZCBrbWVtX2NhY2hlX2Rlc3Ryb3koc3RydWN0IGttZW1fY2FjaGUgKmMpCiB7CiAJc2xvYl9mcmVlKGMsIHNpemVvZihzdHJ1Y3Qga21lbV9jYWNoZSkpOwotCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChrbWVtX2NhY2hlX2Rlc3Ryb3kpOwogCmRpZmYgLS1naXQgYS9tbS90cnVuY2F0ZS5jIGIvbW0vdHJ1bmNhdGUuYwppbmRleCBjNmFiNTVlLi5hNjU0OTI4IDEwMDY0NAotLS0gYS9tbS90cnVuY2F0ZS5jCisrKyBiL21tL3RydW5jYXRlLmMKQEAgLTksNiArOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgpAQCAtNTIsMzYgKzUzLDI2IEBACiAvKgogICogVGhpcyBpcyBmb3IgaW52YWxpZGF0ZV9pbm9kZV9wYWdlcygpLiAgVGhhdCBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGF0CiAgKiBhbnkgdGltZSwgYW5kIGlzIG5vdCBzdXBwb3NlZCB0byB0aHJvdyBhd2F5IGRpcnR5IHBhZ2VzLiAgQnV0IHBhZ2VzIGNhbgotICogYmUgbWFya2VkIGRpcnR5IGF0IGFueSB0aW1lIHRvby4gIFNvIHdlIHJlLWNoZWNrIHRoZSBkaXJ0aW5lc3MgaW5zaWRlCi0gKiAtPnRyZWVfbG9jay4gIFRoYXQgcHJvdmlkZXMgZXhjbHVzaW9uIGFnYWluc3QgdGhlIF9fc2V0X3BhZ2VfZGlydHkKLSAqIGZ1bmN0aW9ucy4KKyAqIGJlIG1hcmtlZCBkaXJ0eSBhdCBhbnkgdGltZSB0b28sIHNvIHVzZSByZW1vdmVfbWFwcGluZyB3aGljaCBzYWZlbHkKKyAqIGRpc2NhcmRzIGNsZWFuLCB1bnVzZWQgcGFnZXMuCiAgKgogICogUmV0dXJucyBub24temVybyBpZiB0aGUgcGFnZSB3YXMgc3VjY2Vzc2Z1bGx5IGludmFsaWRhdGVkLgogICovCiBzdGF0aWMgaW50CiBpbnZhbGlkYXRlX2NvbXBsZXRlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBwYWdlICpwYWdlKQogeworCWludCByZXQ7CisKIAlpZiAocGFnZS0+bWFwcGluZyAhPSBtYXBwaW5nKQogCQlyZXR1cm4gMDsKIAogCWlmIChQYWdlUHJpdmF0ZShwYWdlKSAmJiAhdHJ5X3RvX3JlbGVhc2VfcGFnZShwYWdlLCAwKSkKIAkJcmV0dXJuIDA7CiAKLQl3cml0ZV9sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKLQlpZiAoUGFnZURpcnR5KHBhZ2UpKQotCQlnb3RvIGZhaWxlZDsKLQlpZiAocGFnZV9jb3VudChwYWdlKSAhPSAyKQkvKiBjYWxsZXIncyByZWYgKyBwYWdlY2FjaGUgcmVmICovCi0JCWdvdG8gZmFpbGVkOwotCi0JQlVHX09OKFBhZ2VQcml2YXRlKHBhZ2UpKTsKLQlfX3JlbW92ZV9mcm9tX3BhZ2VfY2FjaGUocGFnZSk7Ci0Jd3JpdGVfdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwlyZXQgPSByZW1vdmVfbWFwcGluZyhtYXBwaW5nLCBwYWdlKTsKIAlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKLQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CS8qIHBhZ2VjYWNoZSByZWYgKi8KLQlyZXR1cm4gMTsKLWZhaWxlZDoKLQl3cml0ZV91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCXJldHVybiAwOworCisJcmV0dXJuIHJldDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9tbS92bWFsbG9jLmMgYi9tbS92bWFsbG9jLmMKaW5kZXggOWFhZDhiMC4uMWFjMTkxYyAxMDA2NDQKLS0tIGEvbW0vdm1hbGxvYy5jCisrKyBiL21tL3ZtYWxsb2MuYwpAQCAtMjQxLDcgKzI0MSw2IEBACiAKIC8qKgogICoJZ2V0X3ZtX2FyZWEgIC0gIHJlc2VydmUgYSBjb250aW5nb3VzIGtlcm5lbCB2aXJ0dWFsIGFyZWEKLSAqCiAgKglAc2l6ZToJCXNpemUgb2YgdGhlIGFyZWEKICAqCUBmbGFnczoJCSVWTV9JT1JFTUFQIGZvciBJL08gbWFwcGluZ3Mgb3IgVk1fQUxMT0MKICAqCkBAIC0yNzMsNyArMjcyLDcgQEAKIH0KIAogLyogQ2FsbGVyIG11c3QgaG9sZCB2bWxpc3RfbG9jayAqLwotc3RydWN0IHZtX3N0cnVjdCAqX19yZW1vdmVfdm1fYXJlYSh2b2lkICphZGRyKQorc3RhdGljIHN0cnVjdCB2bV9zdHJ1Y3QgKl9fcmVtb3ZlX3ZtX2FyZWEodm9pZCAqYWRkcikKIHsKIAlzdHJ1Y3Qgdm1fc3RydWN0ICoqcCwgKnRtcDsKIApAQCAtMjk2LDcgKzI5NSw2IEBACiAKIC8qKgogICoJcmVtb3ZlX3ZtX2FyZWEgIC0gIGZpbmQgYW5kIHJlbW92ZSBhIGNvbnRpbmdvdXMga2VybmVsIHZpcnR1YWwgYXJlYQotICoKICAqCUBhZGRyOgkJYmFzZSBhZGRyZXNzCiAgKgogICoJU2VhcmNoIGZvciB0aGUga2VybmVsIFZNIGFyZWEgc3RhcnRpbmcgYXQgQGFkZHIsIGFuZCByZW1vdmUgaXQuCkBAIC0zNTUsNyArMzUzLDYgQEAKIAogLyoqCiAgKgl2ZnJlZSAgLSAgcmVsZWFzZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHZtYWxsb2MoKQotICoKICAqCUBhZGRyOgkJbWVtb3J5IGJhc2UgYWRkcmVzcwogICoKICAqCUZyZWUgdGhlIHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSBhcmVhIHN0YXJ0aW5nIGF0IEBhZGRyLCBhcwpAQCAtMzczLDcgKzM3MCw2IEBACiAKIC8qKgogICoJdnVubWFwICAtICByZWxlYXNlIHZpcnR1YWwgbWFwcGluZyBvYnRhaW5lZCBieSB2bWFwKCkKLSAqCiAgKglAYWRkcjoJCW1lbW9yeSBiYXNlIGFkZHJlc3MKICAqCiAgKglGcmVlIHRoZSB2aXJ0dWFsbHkgY29udGlndW91cyBtZW1vcnkgYXJlYSBzdGFydGluZyBhdCBAYWRkciwKQEAgLTM5MCw3ICszODYsNiBAQAogCiAvKioKICAqCXZtYXAgIC0gIG1hcCBhbiBhcnJheSBvZiBwYWdlcyBpbnRvIHZpcnR1YWxseSBjb250aWd1b3VzIHNwYWNlCi0gKgogICoJQHBhZ2VzOgkJYXJyYXkgb2YgcGFnZSBwb2ludGVycwogICoJQGNvdW50OgkJbnVtYmVyIG9mIHBhZ2VzIHRvIG1hcAogICoJQGZsYWdzOgkJdm1fYXJlYS0+ZmxhZ3MKQEAgLTQ3MSw3ICs0NjYsNiBAQAogCiAvKioKICAqCV9fdm1hbGxvY19ub2RlICAtICBhbGxvY2F0ZSB2aXJ0dWFsbHkgY29udGlndW91cyBtZW1vcnkKLSAqCiAgKglAc2l6ZToJCWFsbG9jYXRpb24gc2l6ZQogICoJQGdmcF9tYXNrOglmbGFncyBmb3IgdGhlIHBhZ2UgbGV2ZWwgYWxsb2NhdG9yCiAgKglAcHJvdDoJCXByb3RlY3Rpb24gbWFzayBmb3IgdGhlIGFsbG9jYXRlZCBwYWdlcwpAQCAtNTA1LDkgKzQ5OSw3IEBACiAKIC8qKgogICoJdm1hbGxvYyAgLSAgYWxsb2NhdGUgdmlydHVhbGx5IGNvbnRpZ3VvdXMgbWVtb3J5Ci0gKgogICoJQHNpemU6CQlhbGxvY2F0aW9uIHNpemUKLSAqCiAgKglBbGxvY2F0ZSBlbm91Z2ggcGFnZXMgdG8gY292ZXIgQHNpemUgZnJvbSB0aGUgcGFnZSBsZXZlbAogICoJYWxsb2NhdG9yIGFuZCBtYXAgdGhlbSBpbnRvIGNvbnRpZ3VvdXMga2VybmVsIHZpcnR1YWwgc3BhY2UuCiAgKgpAQCAtNTIxLDExICs1MTMsMTEgQEAKIEVYUE9SVF9TWU1CT0wodm1hbGxvYyk7CiAKIC8qKgotICoJdm1hbGxvY191c2VyICAtICBhbGxvY2F0ZSB2aXJ0dWFsbHkgY29udGlndW91cyBtZW1vcnkgd2hpY2ggaGFzCi0gKgkJCSAgIGJlZW4gemVyb2VkIHNvIGl0IGNhbiBiZSBtYXBwZWQgdG8gdXNlcnNwYWNlIHdpdGhvdXQKLSAqCQkJICAgbGVha2luZyBkYXRhLgorICogdm1hbGxvY191c2VyIC0gYWxsb2NhdGUgemVyb2VkIHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSBmb3IgdXNlcnNwYWNlCisgKiBAc2l6ZTogYWxsb2NhdGlvbiBzaXplCiAgKgotICoJQHNpemU6CQlhbGxvY2F0aW9uIHNpemUKKyAqIFRoZSByZXN1bHRpbmcgbWVtb3J5IGFyZWEgaXMgemVyb2VkIHNvIGl0IGNhbiBiZSBtYXBwZWQgdG8gdXNlcnNwYWNlCisgKiB3aXRob3V0IGxlYWtpbmcgZGF0YS4KICAqLwogdm9pZCAqdm1hbGxvY191c2VyKHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKQEAgLTU0NCw3ICs1MzYsNiBAQAogCiAvKioKICAqCXZtYWxsb2Nfbm9kZSAgLSAgYWxsb2NhdGUgbWVtb3J5IG9uIGEgc3BlY2lmaWMgbm9kZQotICoKICAqCUBzaXplOgkJYWxsb2NhdGlvbiBzaXplCiAgKglAbm9kZToJCW51bWEgbm9kZQogICoKQEAgLTU2Niw3ICs1NTcsNiBAQAogCiAvKioKICAqCXZtYWxsb2NfZXhlYyAgLSAgYWxsb2NhdGUgdmlydHVhbGx5IGNvbnRpZ3VvdXMsIGV4ZWN1dGFibGUgbWVtb3J5Ci0gKgogICoJQHNpemU6CQlhbGxvY2F0aW9uIHNpemUKICAqCiAgKglLZXJuZWwtaW50ZXJuYWwgZnVuY3Rpb24gdG8gYWxsb2NhdGUgZW5vdWdoIHBhZ2VzIHRvIGNvdmVyIEBzaXplCkBAIC01ODQsNyArNTc0LDYgQEAKIAogLyoqCiAgKgl2bWFsbG9jXzMyICAtICBhbGxvY2F0ZSB2aXJ0dWFsbHkgY29udGlndW91cyBtZW1vcnkgKDMyYml0IGFkZHJlc3NhYmxlKQotICoKICAqCUBzaXplOgkJYWxsb2NhdGlvbiBzaXplCiAgKgogICoJQWxsb2NhdGUgZW5vdWdoIDMyYml0IFBBIGFkZHJlc3NhYmxlIHBhZ2VzIHRvIGNvdmVyIEBzaXplIGZyb20gdGhlCkBAIC01OTcsMTEgKzU4NiwxMSBAQAogRVhQT1JUX1NZTUJPTCh2bWFsbG9jXzMyKTsKIAogLyoqCi0gKgl2bWFsbG9jXzMyX3VzZXIgIC0gIGFsbG9jYXRlIHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSAoMzJiaXQKLSAqCQkJICAgICAgYWRkcmVzc2FibGUpIHdoaWNoIGlzIHplcm9lZCBzbyBpdCBjYW4gYmUKLSAqCQkJICAgICAgbWFwcGVkIHRvIHVzZXJzcGFjZSB3aXRob3V0IGxlYWtpbmcgZGF0YS4KLSAqCisgKiB2bWFsbG9jXzMyX3VzZXIgLSBhbGxvY2F0ZSB6ZXJvZWQgdmlydHVhbGx5IGNvbnRpZ3VvdXMgMzJiaXQgbWVtb3J5CiAgKglAc2l6ZToJCWFsbG9jYXRpb24gc2l6ZQorICoKKyAqIFRoZSByZXN1bHRpbmcgbWVtb3J5IGFyZWEgaXMgMzJiaXQgYWRkcmVzc2FibGUgYW5kIHplcm9lZCBzbyBpdCBjYW4gYmUKKyAqIG1hcHBlZCB0byB1c2Vyc3BhY2Ugd2l0aG91dCBsZWFraW5nIGRhdGEuCiAgKi8KIHZvaWQgKnZtYWxsb2NfMzJfdXNlcih1bnNpZ25lZCBsb25nIHNpemUpCiB7CkBAIC02OTUsNyArNjg0LDYgQEAKIAogLyoqCiAgKglyZW1hcF92bWFsbG9jX3JhbmdlICAtICBtYXAgdm1hbGxvYyBwYWdlcyB0byB1c2Vyc3BhY2UKLSAqCiAgKglAdm1hOgkJdm1hIHRvIGNvdmVyIChtYXAgZnVsbCByYW5nZSBvZiB2bWEpCiAgKglAYWRkcjoJCXZtYWxsb2MgbWVtb3J5CiAgKglAcGdvZmY6CQludW1iZXIgb2YgcGFnZXMgaW50byBhZGRyIGJlZm9yZSBmaXJzdCBwYWdlIHRvIG1hcApkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92bXNjYW4uYwppbmRleCA4Nzc3OWRkLi5lY2E3MDMxIDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3Ztc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KQEAgLTM3MCw3ICszNzEsNyBAQAogCQkJLyogc3luY2hyb25vdXMgd3JpdGUgb3IgYnJva2VuIGFfb3BzPyAqLwogCQkJQ2xlYXJQYWdlUmVjbGFpbShwYWdlKTsKIAkJfQotCisJCWluY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfVk1TQ0FOX1dSSVRFKTsKIAkJcmV0dXJuIFBBR0VfU1VDQ0VTUzsKIAl9CiAKQEAgLTM4MywxMSArMzg0LDMwIEBACiAJQlVHX09OKG1hcHBpbmcgIT0gcGFnZV9tYXBwaW5nKHBhZ2UpKTsKIAogCXdyaXRlX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwotCiAJLyoKLQkgKiBUaGUgbm9uLXJhY3kgY2hlY2sgZm9yIGJ1c3kgcGFnZS4gIEl0IGlzIGNyaXRpY2FsIHRvIGNoZWNrCi0JICogUGFnZURpcnR5IF9hZnRlcl8gbWFraW5nIHN1cmUgdGhhdCB0aGUgcGFnZSBpcyBmcmVlYWJsZSBhbmQKLQkgKiBub3QgaW4gdXNlIGJ5IGFueWJvZHkuIAkocGFnZWNhY2hlICsgdXMgPT0gMikKKwkgKiBUaGUgbm9uIHJhY3kgY2hlY2sgZm9yIGEgYnVzeSBwYWdlLgorCSAqCisJICogTXVzdCBiZSBjYXJlZnVsIHdpdGggdGhlIG9yZGVyIG9mIHRoZSB0ZXN0cy4gV2hlbiBzb21lb25lIGhhcworCSAqIGEgcmVmIHRvIHRoZSBwYWdlLCBpdCBtYXkgYmUgcG9zc2libGUgdGhhdCB0aGV5IGRpcnR5IGl0IHRoZW4KKwkgKiBkcm9wIHRoZSByZWZlcmVuY2UuIFNvIGlmIFBhZ2VEaXJ0eSBpcyB0ZXN0ZWQgYmVmb3JlIHBhZ2VfY291bnQKKwkgKiBoZXJlLCB0aGVuIHRoZSBmb2xsb3dpbmcgcmFjZSBtYXkgb2NjdXI6CisJICoKKwkgKiBnZXRfdXNlcl9wYWdlcygmcGFnZSk7CisJICogW3VzZXIgbWFwcGluZyBnb2VzIGF3YXldCisJICogd3JpdGVfdG8ocGFnZSk7CisJICoJCQkJIVBhZ2VEaXJ0eShwYWdlKSAgICBbZ29vZF0KKwkgKiBTZXRQYWdlRGlydHkocGFnZSk7CisJICogcHV0X3BhZ2UocGFnZSk7CisJICoJCQkJIXBhZ2VfY291bnQocGFnZSkgICBbZ29vZCwgZGlzY2FyZCBpdF0KKwkgKgorCSAqIFtvb3BzLCBvdXIgd3JpdGVfdG8gZGF0YSBpcyBsb3N0XQorCSAqCisJICogUmV2ZXJzaW5nIHRoZSBvcmRlciBvZiB0aGUgdGVzdHMgZW5zdXJlcyBzdWNoIGEgc2l0dWF0aW9uIGNhbm5vdAorCSAqIGVzY2FwZSB1bm5vdGljZWQuIFRoZSBzbXBfcm1iIGlzIG5lZWRlZCB0byBlbnN1cmUgdGhlIHBhZ2UtPmZsYWdzCisJICogbG9hZCBpcyBub3Qgc2F0aXNmaWVkIGJlZm9yZSB0aGF0IG9mIHBhZ2UtPl9jb3VudC4KKwkgKgorCSAqIE5vdGUgdGhhdCBpZiBTZXRQYWdlRGlydHkgaXMgYWx3YXlzIHBlcmZvcm1lZCB2aWEgc2V0X3BhZ2VfZGlydHksCisJICogYW5kIHRodXMgdW5kZXIgdHJlZV9sb2NrLCB0aGVuIHRoaXMgb3JkZXJpbmcgaXMgbm90IHJlcXVpcmVkLgogCSAqLwogCWlmICh1bmxpa2VseShwYWdlX2NvdW50KHBhZ2UpICE9IDIpKQogCQlnb3RvIGNhbm5vdF9mcmVlOwpkaWZmIC0tZ2l0IGEvbW0vdm1zdGF0LmMgYi9tbS92bXN0YXQuYwppbmRleCA0OTBkOGMxLi5hMmI2YTlmIDEwMDY0NAotLS0gYS9tbS92bXN0YXQuYworKysgYi9tbS92bXN0YXQuYwpAQCAtMzcxLDcgKzM3MSw3IEBACiAJCV9faW5jX3pvbmVfc3RhdGUoeiwgTlVNQV9NSVNTKTsKIAkJX19pbmNfem9uZV9zdGF0ZSh6b25lbGlzdC0+em9uZXNbMF0sIE5VTUFfRk9SRUlHTik7CiAJfQotCWlmICh6LT56b25lX3BnZGF0ID09IE5PREVfREFUQShudW1hX25vZGVfaWQoKSkpCisJaWYgKHotPm5vZGUgPT0gbnVtYV9ub2RlX2lkKCkpCiAJCV9faW5jX3pvbmVfc3RhdGUoeiwgTlVNQV9MT0NBTCk7CiAJZWxzZQogCQlfX2luY196b25lX3N0YXRlKHosIE5VTUFfT1RIRVIpOwpAQCAtNDY1LDYgKzQ2NSw3IEBACiAJIm5yX3dyaXRlYmFjayIsCiAJIm5yX3Vuc3RhYmxlIiwKIAkibnJfYm91bmNlIiwKKwkibnJfdm1zY2FuX3dyaXRlIiwKIAogI2lmZGVmIENPTkZJR19OVU1BCiAJIm51bWFfaGl0IiwKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvcnBjX3BpcGUuYyBiL25ldC9zdW5ycGMvcnBjX3BpcGUuYwppbmRleCBkZmE1MDRmLi43MDBjNmUwIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY19waXBlLmMKKysrIGIvbmV0L3N1bnJwYy9ycGNfcGlwZS5jCkBAIC00ODgsNyArNDg4LDYgQEAKIAkJcmV0dXJuIE5VTEw7CiAJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJaW5vZGUtPmlfdWlkID0gaW5vZGUtPmlfZ2lkID0gMDsKLQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOwogCWlub2RlLT5pX2Jsb2NrcyA9IDA7CiAJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCXN3aXRjaChtb2RlICYgU19JRk1UKSB7CkBAIC04NTgsNyArODU3LDYgQEAKIAogdm9pZCB1bnJlZ2lzdGVyX3JwY19waXBlZnModm9pZCkKIHsKLQlpZiAoa21lbV9jYWNoZV9kZXN0cm95KHJwY19pbm9kZV9jYWNoZXApKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJSUEM6IHVuYWJsZSB0byBmcmVlIGlub2RlIGNhY2hlXG4iKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kocnBjX2lub2RlX2NhY2hlcCk7CiAJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZycGNfcGlwZV9mc190eXBlKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc2NoZWQuYyBiL25ldC9zdW5ycGMvc2NoZWQuYwppbmRleCA2MzkwNDYxLi5hMWFiNGVlIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3NjaGVkLmMKKysrIGIvbmV0L3N1bnJwYy9zY2hlZC5jCkBAIC0xMDU5LDEwICsxMDU5LDEwIEBACiAJCW1lbXBvb2xfZGVzdHJveShycGNfYnVmZmVyX21lbXBvb2wpOwogCWlmIChycGNfdGFza19tZW1wb29sKQogCQltZW1wb29sX2Rlc3Ryb3kocnBjX3Rhc2tfbWVtcG9vbCk7Ci0JaWYgKHJwY190YXNrX3NsYWJwICYmIGttZW1fY2FjaGVfZGVzdHJveShycGNfdGFza19zbGFicCkpCi0JCXByaW50ayhLRVJOX0lORk8gInJwY190YXNrOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7Ci0JaWYgKHJwY19idWZmZXJfc2xhYnAgJiYga21lbV9jYWNoZV9kZXN0cm95KHJwY19idWZmZXJfc2xhYnApKQotCQlwcmludGsoS0VSTl9JTkZPICJycGNfYnVmZmVyczogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworCWlmIChycGNfdGFza19zbGFicCkKKwkJa21lbV9jYWNoZV9kZXN0cm95KHJwY190YXNrX3NsYWJwKTsKKwlpZiAocnBjX2J1ZmZlcl9zbGFicCkKKwkJa21lbV9jYWNoZV9kZXN0cm95KHJwY19idWZmZXJfc2xhYnApOwogfQogCiBpbnQKZGlmZiAtLWdpdCBhL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUgYi9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCmluZGV4IDNkNTIzODkuLjRmNWZmMTkgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKKysrIGIvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQpAQCAtNjMsNiArNjMsMTMgQEAKIAkgICAgIC14YXNzZW1ibGVyIC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIGVjaG8gIiQoMSkiOyBcCiAJICAgICBlbHNlIGVjaG8gIiQoMikiOyBmaSA7KQogCisjIGFzLWluc3RyCisjIFVzYWdlOiBjZmxhZ3MteSArPSAkKGNhbGwgYXMtaW5zdHIsIGluc3RyLCBvcHRpb24xLCBvcHRpb24yKQorCithcy1pbnN0ciA9ICQoc2hlbGwgaWYgZWNobyAtZSAiJCgxKSIgfCAkKEFTKSA+L2Rldi9udWxsIDI+JjEgLVcgLVogLW8gYXN0ZXN0JCQkJC5vdXQgOyBcCisJCSAgIHRoZW4gZWNobyAiJCgyKSI7IGVsc2UgZWNobyAiJCgzKSI7IGZpOyBcCisJICAgICAgICAgICBybSAtZiBhc3Rlc3QkJCQkLm91dCkKKwogIyBjYy1vcHRpb24KICMgVXNhZ2U6IGNmbGFncy15ICs9ICQoY2FsbCBjYy1vcHRpb24sIC1tYXJjaD13aW5jaGlwLWM2LCAtbWFyY2g9aTU4NikKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nY2MteDg2XzY0LWhhcy1zdGFjay1wcm90ZWN0b3Iuc2ggYi9zY3JpcHRzL2djYy14ODZfNjQtaGFzLXN0YWNrLXByb3RlY3Rvci5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjVjMGExCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nY2MteDg2XzY0LWhhcy1zdGFjay1wcm90ZWN0b3Iuc2gKQEAgLTAsMCArMSw2IEBACisjIS9iaW4vc2gKKworZWNobyAiaW50IGZvbyh2b2lkKSB7IGNoYXIgWFsyMDBdOyByZXR1cm4gMzsgfSIgfCAkMSAtUyAteGMgLWMgLU8wIC1tY21vZGVsPWtlcm5lbCAtZnN0YWNrLXByb3RlY3RvciAtIC1vIC0gMj4gL2Rldi9udWxsIHwgZ3JlcCAtcSAiJWdzIgoraWYgWyAiJD8iIC1lcSAiMCIgXSA7IHRoZW4KKwllY2hvICQyCitmaQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jIGIvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCmluZGV4IGRlNzZkYTguLmY2MWM5Y2MgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYworKysgYi9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKQEAgLTQ0NCw2ICs0NDQsMTQgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGludCBkb19laXNhX2VudHJ5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgZWlzYV9kZXZpY2VfaWQgKmVpc2EsCisJCWNoYXIgKmFsaWFzKQoreworCWlmIChlaXNhLT5zaWdbMF0pCisJCXNwcmludGYoYWxpYXMsIEVJU0FfREVWSUNFX01PREFMSUFTX0ZNVCAiKiIsIGVpc2EtPnNpZyk7CisJcmV0dXJuIDE7Cit9CisKIC8qIElnbm9yZSBhbnkgcHJlZml4LCBlZy4gdjg1MCBwcmVwZW5kcyBfICovCiBzdGF0aWMgaW5saW5lIGludCBzeW1faXMoY29uc3QgY2hhciAqc3ltYm9sLCBjb25zdCBjaGFyICpuYW1lKQogewpAQCAtNTQ3LDYgKzU1NSwxMCBAQAogCQlkb190YWJsZShzeW12YWwsIHN5bS0+c3Rfc2l6ZSwKIAkJCSBzaXplb2Yoc3RydWN0IGlucHV0X2RldmljZV9pZCksICJpbnB1dCIsCiAJCQkgZG9faW5wdXRfZW50cnksIG1vZCk7CisJZWxzZSBpZiAoc3ltX2lzKHN5bW5hbWUsICJfX21vZF9laXNhX2RldmljZV90YWJsZSIpKQorCQlkb190YWJsZShzeW12YWwsIHN5bS0+c3Rfc2l6ZSwKKwkJCSBzaXplb2Yoc3RydWN0IGVpc2FfZGV2aWNlX2lkKSwgImVpc2EiLAorCQkJIGRvX2Vpc2FfZW50cnksIG1vZCk7CiB9CiAKIC8qIE5vdyBhZGQgb3V0IGJ1ZmZlcmVkIGluZm9ybWF0aW9uIHRvIHRoZSBnZW5lcmF0ZWQgQyBzb3VyY2UgKi8KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2lub2RlLmMgYi9zZWN1cml0eS9pbm9kZS5jCmluZGV4IDQ3ZWI2MzQuLjQ5ZWU1MTUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2lub2RlLmMKKysrIGIvc2VjdXJpdHkvaW5vZGUuYwpAQCAtNDQsOCArNDQsOCBAQAogCiBzdGF0aWMgaW50IGRlZmF1bHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlpZiAoaW5vZGUtPnUuZ2VuZXJpY19pcCkKLQkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPnUuZ2VuZXJpY19pcDsKKwlpZiAoaW5vZGUtPmlfcHJpdmF0ZSkKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKIAogCXJldHVybiAwOwogfQpAQCAtNjQsNyArNjQsNiBAQAogCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJaW5vZGUtPmlfdWlkID0gMDsKIAkJaW5vZGUtPmlfZ2lkID0gMDsKLQkJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAkJaW5vZGUtPmlfYmxvY2tzID0gMDsKIAkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKQEAgLTE5NCw3ICsxOTMsNyBAQAogICogICAgICAgICAgZGlyZWN0b3J5IGRlbnRyeSBpZiBzZXQuICBJZiB0aGlzIHBhcmFtYXRlciBpcyBOVUxMLCB0aGVuIHRoZQogICogICAgICAgICAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIHNlY3VyaXR5ZnMgZmlsZXN5c3RlbS4KICAqIEBkYXRhOiBhIHBvaW50ZXIgdG8gc29tZXRoaW5nIHRoYXQgdGhlIGNhbGxlciB3aWxsIHdhbnQgdG8gZ2V0IHRvIGxhdGVyCi0gKiAgICAgICAgb24uICBUaGUgaW5vZGUudS5nZW5lcmljX2lwIHBvaW50ZXIgd2lsbCBwb2ludCB0byB0aGlzIHZhbHVlIG9uCisgKiAgICAgICAgb24uICBUaGUgaW5vZGUuaV9wcml2YXRlIHBvaW50ZXIgd2lsbCBwb2ludCB0byB0aGlzIHZhbHVlIG9uCiAgKiAgICAgICAgdGhlIG9wZW4oKSBjYWxsLgogICogQGZvcHM6IGEgcG9pbnRlciB0byBhIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IKICAqICAgICAgICB0aGlzIGZpbGUuCkBAIC0yNDAsNyArMjM5LDcgQEAKIAkJaWYgKGZvcHMpCiAJCQlkZW50cnktPmRfaW5vZGUtPmlfZm9wID0gZm9wczsKIAkJaWYgKGRhdGEpCi0JCQlkZW50cnktPmRfaW5vZGUtPnUuZ2VuZXJpY19pcCA9IGRhdGE7CisJCQlkZW50cnktPmRfaW5vZGUtPmlfcHJpdmF0ZSA9IGRhdGE7CiAJfQogZXhpdDoKIAlyZXR1cm4gZGVudHJ5OwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYyBiL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKaW5kZXggMDA1MzRjMy4uYmFiN2IzOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCkBAIC03NzEsNyArNzcxLDYgQEAKIAlpZiAocmV0KSB7CiAJCXJldC0+aV9tb2RlID0gbW9kZTsKIAkJcmV0LT5pX3VpZCA9IHJldC0+aV9naWQgPSAwOwotCQlyZXQtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAkJcmV0LT5pX2Jsb2NrcyA9IDA7CiAJCXJldC0+aV9hdGltZSA9IHJldC0+aV9tdGltZSA9IHJldC0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc2hfZGFjX2F1ZGlvLmMgYi9zb3VuZC9vc3Mvc2hfZGFjX2F1ZGlvLmMKaW5kZXggN2IxNjhkOC4uODNmZjhhNyAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3NoX2RhY19hdWRpby5jCisrKyBiL3NvdW5kL29zcy9zaF9kYWNfYXVkaW8uYwpAQCAtMSwzICsxLDE0IEBACisvKgorICogc291bmQvb3NzL3NoX2RhY19hdWRpby5jCisgKgorICogU0ggREFDIGJhc2VkIHNvdW5kIDooCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNCwyMDA1ICBBbmRyaXkgU2t1bHlzaAorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC02LDE4ICsxNywxNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc291bmQuaD4KICNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQorI2luY2x1ZGUgPGFzbS9jbG9jay5oPgogI2luY2x1ZGUgPGFzbS9jcHUvZGFjLmg+Ci0KLSNpZmRlZiBNQUNIX0hQNjAwCisjaW5jbHVkZSA8YXNtL2NwdS90aW1lci5oPgorI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL2hwNnh4L2hwNnh4Lmg+Ci0jaW5jbHVkZSA8YXNtL2hkNjQ0NjEvaGQ2NDQ2MS5oPgotI2VuZGlmCisjaW5jbHVkZSA8YXNtL2hkNjQ0NjEuaD4KIAogI2RlZmluZSBNT0ROQU1FICJzaF9kYWNfYXVkaW8iCiAKQEAgLTI2LDExICszNiw2IEBACiAjZGVmaW5lIFRNVTFfVENSX0lOSVQJMHgwMDIwCS8qIENsb2NrLzQsIHJpc2luZyBlZGdlOyBpbnRlcnJ1cHQgb24gKi8KICNkZWZpbmUgVE1VMV9UU1RSX0lOSVQgIDB4MDIJLyogQml0IHRvIHR1cm4gb24gVE1VMSAqLwogCi0jZGVmaW5lIFRNVV9UU1RSCTB4ZmZmZmZlOTIKLSNkZWZpbmUgVE1VMV9UQ09SCTB4ZmZmZmZlYTAKLSNkZWZpbmUgVE1VMV9UQ05UCTB4ZmZmZmZlYTQKLSNkZWZpbmUgVE1VMV9UQ1IJMHhmZmZmZmVhOAotCiAjZGVmaW5lIEJVRkZFUl9TSVpFIDQ4MDAwCiAKIHN0YXRpYyBpbnQgcmF0ZTsKQEAgLTcxLDM0ICs3NiwzNyBAQAogCiBzdGF0aWMgdm9pZCBkYWNfYXVkaW9fc3RhcnQodm9pZCkKIHsKLSNpZmRlZiBNQUNIX0hQNjAwCi0JdTE2IHY7Ci0JdiA9IGludyhIRDY0NDYxX0dQQURSKTsKLQl2ICY9IH5IRDY0NDYxX0dQQURSX1NQRUFLRVI7Ci0Jb3V0dyh2LCBIRDY0NDYxX0dQQURSKTsKLSNlbmRpZgorCWlmIChtYWNoX2lzX2hwNnh4KCkpIHsKKwkJdTE2IHYgPSBpbncoSEQ2NDQ2MV9HUEFEUik7CisJCXYgJj0gfkhENjQ0NjFfR1BBRFJfU1BFQUtFUjsKKwkJb3V0dyh2LCBIRDY0NDYxX0dQQURSKTsKKwl9CisKIAlzaF9kYWNfZW5hYmxlKENPTkZJR19TT1VORF9TSF9EQUNfQVVESU9fQ0hBTk5FTCk7CiAJY3RybF9vdXR3KFRNVTFfVENSX0lOSVQsIFRNVTFfVENSKTsKIH0KIHN0YXRpYyB2b2lkIGRhY19hdWRpb19zdG9wKHZvaWQpCiB7Ci0jaWZkZWYgTUFDSF9IUDYwMAotCXUxNiB2OwotI2VuZGlmCiAJZGFjX2F1ZGlvX3N0b3BfdGltZXIoKTsKLSNpZmRlZiBNQUNIX0hQNjAwCi0JdiA9IGludyhIRDY0NDYxX0dQQURSKTsKLQl2IHw9IEhENjQ0NjFfR1BBRFJfU1BFQUtFUjsKLQlvdXR3KHYsIEhENjQ0NjFfR1BBRFIpOwotI2VuZGlmCisKKwlpZiAobWFjaF9pc19ocDZ4eCgpKSB7CisJCXUxNiB2ID0gaW53KEhENjQ0NjFfR1BBRFIpOworCQl2IHw9IEhENjQ0NjFfR1BBRFJfU1BFQUtFUjsKKwkJb3V0dyh2LCBIRDY0NDYxX0dQQURSKTsKKwl9CisKKyAJc2hfZGFjX291dHB1dCgwLCBDT05GSUdfU09VTkRfU0hfREFDX0FVRElPX0NIQU5ORUwpOwogCXNoX2RhY19kaXNhYmxlKENPTkZJR19TT1VORF9TSF9EQUNfQVVESU9fQ0hBTk5FTCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRhY19hdWRpb19zZXRfcmF0ZSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWw7CisgCXN0cnVjdCBjbGsgKmNsazsKIAotCWludGVydmFsID0gKGN1cnJlbnRfY3B1X2RhdGEubW9kdWxlX2Nsb2NrIC8gNCkgLyByYXRlOworIAljbGsgPSBjbGtfZ2V0KCJtb2R1bGVfY2xrIik7CisgCWludGVydmFsID0gKGNsa19nZXRfcmF0ZShjbGspIC8gNCkgLyByYXRlOworIAljbGtfcHV0KGNsayk7CiAJY3RybF9vdXRsKGludGVydmFsLCBUTVUxX1RDT1IpOwogCWN0cmxfb3V0bChpbnRlcnZhbCwgVE1VMV9UQ05UKTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi91c2JtaWRpLmMgYi9zb3VuZC91c2IvdXNibWlkaS5jCmluZGV4IDUxMDViNmIuLmFiZTI5ZGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JtaWRpLmMKKysrIGIvc291bmQvdXNiL3VzYm1pZGkuYwpAQCAtMTgxLDkgKzE4MSw5IEBACiAJY2FzZSAtRU5PREVWOgogCQlyZXR1cm4gLUVOT0RFVjsKIAkvKiBlcnJvcnMgdGhhdCBtaWdodCBvY2N1ciBkdXJpbmcgdW5wbHVnZ2luZyAqLwotCWNhc2UgLUVQUk9UTzogICAgLyogRUhDSSAqLwotCWNhc2UgLUVUSU1FRE9VVDogLyogT0hDSSAqLwotCWNhc2UgLUVJTFNFUTogICAgLyogVUhDSSAqLworCWNhc2UgLUVQUk9UTzoKKwljYXNlIC1FVElNRToKKwljYXNlIC1FSUxTRVE6CiAJCXJldHVybiAtRUlPOwogCWRlZmF1bHQ6CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgInVyYiBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7Cg==